@@ -263,7 +263,32 @@ uint32_t ATIRage::read_reg(uint32_t reg_offset, uint32_t size) {
263
263
}
264
264
break ;
265
265
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
+ }
267
292
break ;
268
293
}
269
294
@@ -534,6 +559,28 @@ void ATIRage::write_reg(uint32_t reg_offset, uint32_t value, uint32_t size) {
534
559
new_value = (old_value & bits_read_only) | (new_value & ~bits_read_only);
535
560
break ;
536
561
}
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 ;
537
584
default :
538
585
new_value = value;
539
586
break ;
@@ -577,7 +624,7 @@ uint32_t ATIRage::read(uint32_t rgn_start, uint32_t offset, int size)
577
624
return read_mem (&this ->vram_ptr [offset], size);
578
625
}
579
626
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);
581
628
}
582
629
// if (!bit_set(this->regs[ATI_BUS_CNTL], ATI_BUS_APER_REG_DIS)) {
583
630
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
651
698
this ->name .c_str (), offset, SIZE_ARG (size), size * 2 , value);
652
699
}
653
700
654
- float ATIRage::calc_pll_freq (int scale, int fb_div) {
701
+ float ATIRage::calc_pll_freq (int scale, int fb_div) const {
655
702
return (ATI_XTAL * scale * fb_div) / this ->plls [PLL_REF_DIV];
656
703
}
657
704
0 commit comments