@@ -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
0 commit comments