Skip to content

Commit 10f087b

Browse files
committed
Maintenance on ATI Rage code
1 parent 392f6cd commit 10f087b

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

devices/video/atirage.cpp

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,32 @@ uint32_t ATIRage::read_reg(uint32_t reg_offset, uint32_t size) {
263263
}
264264
break;
265265
case ATI_GUI_STAT:
266-
result = this->cmd_fifo_size << 16; // HACK: tell the guest the command FIFO is empty
266+
result = uint64_t(this->cmd_fifo_size << 16); // HACK: tell the guest the command FIFO is empty
267+
break;
268+
case ATI_DP_BKGD_CLR:
269+
case ATI_DP_FRGD_CLR:
270+
uint32_t pix_fmt = extract_bits<uint32_t>(
271+
this->regs[ATI_CRTC_GEN_CNTL], ATI_CRTC_PIX_WIDTH, ATI_CRTC_PIX_WIDTH_size);
272+
273+
switch (pix_fmt) {
274+
case 1:
275+
result = result & 0x1;
276+
break;
277+
case 2:
278+
result = result & 0xFF;
279+
break;
280+
case 3:
281+
case 4:
282+
result = result & 0xFFFF;
283+
break;
284+
case 5:
285+
result = result & 0xFFFFFF;
286+
break;
287+
case 6:
288+
break;
289+
default:
290+
LOG_F(ERROR, "Incorrect bit depth");
291+
}
267292
break;
268293
}
269294

@@ -534,6 +559,28 @@ void ATIRage::write_reg(uint32_t reg_offset, uint32_t value, uint32_t size) {
534559
new_value = (old_value & bits_read_only) | (new_value & ~bits_read_only);
535560
break;
536561
}
562+
case ATI_DST_WIDTH:
563+
new_value = value & 0x7FFF;
564+
this->regs[ATI_DST_BRES_LNTH] = new_value;
565+
break;
566+
case ATI_DST_HEIGHT:
567+
new_value = value & 0x7FFF;
568+
this->regs[ATI_DST_BRES_LNTH] = new_value;
569+
break;
570+
case ATI_DST_BRES_ERR:
571+
new_value = value & 0x3FFFF;
572+
if (new_value > -1) {
573+
new_value += this->regs[ATI_DST_BRES_INC];
574+
} else {
575+
new_value += this->regs[ATI_DST_BRES_DEC];
576+
}
577+
break;
578+
case ATI_DST_BRES_INC:
579+
new_value = value & 0x3FFFF;
580+
break;
581+
case ATI_DST_BRES_DEC:
582+
new_value = -(value & 0x3FFFF);
583+
break;
537584
default:
538585
new_value = value;
539586
break;
@@ -577,7 +624,7 @@ uint32_t ATIRage::read(uint32_t rgn_start, uint32_t offset, int size)
577624
return read_mem(&this->vram_ptr[offset], size);
578625
}
579626
if (offset >= BE_FB_OFFSET) { // big-endian VRAM region
580-
return read_mem(&this->vram_ptr[offset - BE_FB_OFFSET], size);
627+
return read_mem(&this->vram_ptr[uint64_t(offset) - BE_FB_OFFSET], size);
581628
}
582629
//if (!bit_set(this->regs[ATI_BUS_CNTL], ATI_BUS_APER_REG_DIS)) {
583630
if (offset >= MM_REGS_0_OFF) { // memory-mapped registers, block 0
@@ -651,7 +698,7 @@ void ATIRage::write(uint32_t rgn_start, uint32_t offset, uint32_t value, int siz
651698
this->name.c_str(), offset, SIZE_ARG(size), size * 2, value);
652699
}
653700

654-
float ATIRage::calc_pll_freq(int scale, int fb_div) {
701+
float ATIRage::calc_pll_freq(int scale, int fb_div) const {
655702
return (ATI_XTAL * scale * fb_div) / this->plls[PLL_REF_DIV];
656703
}
657704

devices/video/atirage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class ATIRage : public PCIDevice, public VideoCtrlBase {
7676
bool io_access_allowed(uint32_t offset);
7777
uint32_t read_reg(uint32_t reg_offset, uint32_t size);
7878
void write_reg(uint32_t reg_addr, uint32_t value, uint32_t size);
79-
float calc_pll_freq(int scale, int fb_div);
79+
float calc_pll_freq(int scale, int fb_div) const;
8080
void verbose_pixel_format(int crtc_index);
8181
void crtc_update();
8282
void draw_hw_cursor(uint8_t *dst_buf, int dst_pitch);

0 commit comments

Comments
 (0)