X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fblitter.cpp;h=935e84b900ef690c59902d2fcf6aac4bdf0ead31;hb=725caa0f8bb826a73edef366906ccb41a3197819;hp=34c4aaac81d8ad479372d10a1b2ceae6d2307040;hpb=21010310cfb50e9bd58f55ebecbf26b990c785bd;p=virtualjaguar diff --git a/src/blitter.cpp b/src/blitter.cpp index 34c4aaa..935e84b 100644 --- a/src/blitter.cpp +++ b/src/blitter.cpp @@ -1,20 +1,38 @@ // // Blitter core // -// by James L. Hammons +// by James Hammons +// (C) 2010 Underground Software +// +// JLH = James Hammons +// +// Who When What +// --- ---------- ------------------------------------------------------------- +// JLH 01/16/2010 Created this log ;-) +// + // // I owe a debt of gratitude to Curt Vendel and to John Mathieson--to Curt // for supplying the Oberon ASIC nets and to John for making them available // to Curt. ;-) Without that excellent documentation which shows *exactly* // what's going on inside the TOM chip, we'd all still be guessing as to how // the wily blitter and other pieces of the Jaguar puzzle actually work. +// Now how about those JERRY ASIC nets gentlemen...? [We have those now!] ;-) // -#include "jaguar.h" #include "blitter.h" +#include +#include +#include +#include "jaguar.h" +#include "log.h" +//#include "memory.h" + // Various conditional compilation goodies... +//#define LOG_BLITS + //#define USE_ORIGINAL_BLITTER //#define USE_MIDSUMMER_BLITTER #define USE_MIDSUMMER_BLITTER_MKII @@ -26,60 +44,62 @@ extern int jaguar_active_memory_dumps; // Local global variables int start_logging = 0; -uint8 blitter_working = 0; +uint8_t blitter_working = 0; +bool startConciseBlitLogging = false; +bool logBlit = false; // Blitter register RAM (most of it is hidden from the user) -static uint8 blitter_ram[0x100]; +static uint8_t blitter_ram[0x100]; // Other crapola bool specialLog = false; extern int effect_start; extern int blit_start_log; -void BlitterMidsummer(uint32 cmd); +void BlitterMidsummer(uint32_t cmd); void BlitterMidsummer2(void); -#define REG(A) (((uint32)blitter_ram[(A)] << 24) | ((uint32)blitter_ram[(A)+1] << 16) \ - | ((uint32)blitter_ram[(A)+2] << 8) | (uint32)blitter_ram[(A)+3]) +#define REG(A) (((uint32_t)blitter_ram[(A)] << 24) | ((uint32_t)blitter_ram[(A)+1] << 16) \ + | ((uint32_t)blitter_ram[(A)+2] << 8) | (uint32_t)blitter_ram[(A)+3]) #define WREG(A,D) (blitter_ram[(A)] = ((D)>>24)&0xFF, blitter_ram[(A)+1] = ((D)>>16)&0xFF, \ blitter_ram[(A)+2] = ((D)>>8)&0xFF, blitter_ram[(A)+3] = (D)&0xFF) // Blitter registers (offsets from F02200) -#define A1_BASE ((UINT32)0x00) -#define A1_FLAGS ((UINT32)0x04) -#define A1_CLIP ((UINT32)0x08) // Height and width values for clipping -#define A1_PIXEL ((UINT32)0x0C) // Integer part of the pixel (Y.i and X.i) -#define A1_STEP ((UINT32)0x10) // Integer part of the step -#define A1_FSTEP ((UINT32)0x14) // Fractional part of the step -#define A1_FPIXEL ((UINT32)0x18) // Fractional part of the pixel (Y.f and X.f) -#define A1_INC ((UINT32)0x1C) // Integer part of the increment -#define A1_FINC ((UINT32)0x20) // Fractional part of the increment -#define A2_BASE ((UINT32)0x24) -#define A2_FLAGS ((UINT32)0x28) -#define A2_MASK ((UINT32)0x2C) // Modulo values for x and y (M.y and M.x) -#define A2_PIXEL ((UINT32)0x30) // Integer part of the pixel (no fractional part for A2) -#define A2_STEP ((UINT32)0x34) // Integer part of the step (no fractional part for A2) -#define COMMAND ((UINT32)0x38) -#define PIXLINECOUNTER ((UINT32)0x3C) // Inner & outer loop values -#define SRCDATA ((UINT32)0x40) -#define DSTDATA ((UINT32)0x48) -#define DSTZ ((UINT32)0x50) -#define SRCZINT ((UINT32)0x58) -#define SRCZFRAC ((UINT32)0x60) -#define PATTERNDATA ((UINT32)0x68) -#define INTENSITYINC ((UINT32)0x70) -#define ZINC ((UINT32)0x74) -#define COLLISIONCTRL ((UINT32)0x78) -#define PHRASEINT0 ((UINT32)0x7C) -#define PHRASEINT1 ((UINT32)0x80) -#define PHRASEINT2 ((UINT32)0x84) -#define PHRASEINT3 ((UINT32)0x88) -#define PHRASEZ0 ((UINT32)0x8C) -#define PHRASEZ1 ((UINT32)0x90) -#define PHRASEZ2 ((UINT32)0x94) -#define PHRASEZ3 ((UINT32)0x98) +#define A1_BASE ((uint32_t)0x00) +#define A1_FLAGS ((uint32_t)0x04) +#define A1_CLIP ((uint32_t)0x08) // Height and width values for clipping +#define A1_PIXEL ((uint32_t)0x0C) // Integer part of the pixel (Y.i and X.i) +#define A1_STEP ((uint32_t)0x10) // Integer part of the step +#define A1_FSTEP ((uint32_t)0x14) // Fractional part of the step +#define A1_FPIXEL ((uint32_t)0x18) // Fractional part of the pixel (Y.f and X.f) +#define A1_INC ((uint32_t)0x1C) // Integer part of the increment +#define A1_FINC ((uint32_t)0x20) // Fractional part of the increment +#define A2_BASE ((uint32_t)0x24) +#define A2_FLAGS ((uint32_t)0x28) +#define A2_MASK ((uint32_t)0x2C) // Modulo values for x and y (M.y and M.x) +#define A2_PIXEL ((uint32_t)0x30) // Integer part of the pixel (no fractional part for A2) +#define A2_STEP ((uint32_t)0x34) // Integer part of the step (no fractional part for A2) +#define COMMAND ((uint32_t)0x38) +#define PIXLINECOUNTER ((uint32_t)0x3C) // Inner & outer loop values +#define SRCDATA ((uint32_t)0x40) +#define DSTDATA ((uint32_t)0x48) +#define DSTZ ((uint32_t)0x50) +#define SRCZINT ((uint32_t)0x58) +#define SRCZFRAC ((uint32_t)0x60) +#define PATTERNDATA ((uint32_t)0x68) +#define INTENSITYINC ((uint32_t)0x70) +#define ZINC ((uint32_t)0x74) +#define COLLISIONCTRL ((uint32_t)0x78) +#define PHRASEINT0 ((uint32_t)0x7C) +#define PHRASEINT1 ((uint32_t)0x80) +#define PHRASEINT2 ((uint32_t)0x84) +#define PHRASEINT3 ((uint32_t)0x88) +#define PHRASEZ0 ((uint32_t)0x8C) +#define PHRASEZ1 ((uint32_t)0x90) +#define PHRASEZ2 ((uint32_t)0x94) +#define PHRASEZ3 ((uint32_t)0x98) // Blitter command bits @@ -142,34 +162,34 @@ void BlitterMidsummer2(void); //Put 'em back, once we fix the problem!!! [KO] // 1 bpp pixel read #define PIXEL_SHIFT_1(a) (((~a##_x) >> 16) & 7) -#define PIXEL_OFFSET_1(a) (((((UINT32)a##_y >> 16) * a##_width / 8) + (((UINT32)a##_x >> 19) & ~7)) * (1 + a##_pitch) + (((UINT32)a##_x >> 19) & 7)) +#define PIXEL_OFFSET_1(a) (((((uint32_t)a##_y >> 16) * a##_width / 8) + (((uint32_t)a##_x >> 19) & ~7)) * (1 + a##_pitch) + (((uint32_t)a##_x >> 19) & 7)) #define READ_PIXEL_1(a) ((JaguarReadByte(a##_addr+PIXEL_OFFSET_1(a), BLITTER) >> PIXEL_SHIFT_1(a)) & 0x01) //#define READ_PIXEL_1(a) ((JaguarReadByte(a##_addr+PIXEL_OFFSET_1(a)) >> PIXEL_SHIFT_1(a)) & 0x01) // 2 bpp pixel read #define PIXEL_SHIFT_2(a) (((~a##_x) >> 15) & 6) -#define PIXEL_OFFSET_2(a) (((((UINT32)a##_y >> 16) * a##_width / 4) + (((UINT32)a##_x >> 18) & ~7)) * (1 + a##_pitch) + (((UINT32)a##_x >> 18) & 7)) +#define PIXEL_OFFSET_2(a) (((((uint32_t)a##_y >> 16) * a##_width / 4) + (((uint32_t)a##_x >> 18) & ~7)) * (1 + a##_pitch) + (((uint32_t)a##_x >> 18) & 7)) #define READ_PIXEL_2(a) ((JaguarReadByte(a##_addr+PIXEL_OFFSET_2(a), BLITTER) >> PIXEL_SHIFT_2(a)) & 0x03) //#define READ_PIXEL_2(a) ((JaguarReadByte(a##_addr+PIXEL_OFFSET_2(a)) >> PIXEL_SHIFT_2(a)) & 0x03) // 4 bpp pixel read #define PIXEL_SHIFT_4(a) (((~a##_x) >> 14) & 4) -#define PIXEL_OFFSET_4(a) (((((UINT32)a##_y >> 16) * (a##_width/2)) + (((UINT32)a##_x >> 17) & ~7)) * (1 + a##_pitch) + (((UINT32)a##_x >> 17) & 7)) +#define PIXEL_OFFSET_4(a) (((((uint32_t)a##_y >> 16) * (a##_width/2)) + (((uint32_t)a##_x >> 17) & ~7)) * (1 + a##_pitch) + (((uint32_t)a##_x >> 17) & 7)) #define READ_PIXEL_4(a) ((JaguarReadByte(a##_addr+PIXEL_OFFSET_4(a), BLITTER) >> PIXEL_SHIFT_4(a)) & 0x0f) //#define READ_PIXEL_4(a) ((JaguarReadByte(a##_addr+PIXEL_OFFSET_4(a)) >> PIXEL_SHIFT_4(a)) & 0x0f) // 8 bpp pixel read -#define PIXEL_OFFSET_8(a) (((((UINT32)a##_y >> 16) * a##_width) + (((UINT32)a##_x >> 16) & ~7)) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 7)) +#define PIXEL_OFFSET_8(a) (((((uint32_t)a##_y >> 16) * a##_width) + (((uint32_t)a##_x >> 16) & ~7)) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 7)) #define READ_PIXEL_8(a) (JaguarReadByte(a##_addr+PIXEL_OFFSET_8(a), BLITTER)) //#define READ_PIXEL_8(a) (JaguarReadByte(a##_addr+PIXEL_OFFSET_8(a))) // 16 bpp pixel read -#define PIXEL_OFFSET_16(a) (((((UINT32)a##_y >> 16) * a##_width) + (((UINT32)a##_x >> 16) & ~3)) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 3)) +#define PIXEL_OFFSET_16(a) (((((uint32_t)a##_y >> 16) * a##_width) + (((uint32_t)a##_x >> 16) & ~3)) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 3)) #define READ_PIXEL_16(a) (JaguarReadWord(a##_addr+(PIXEL_OFFSET_16(a)<<1), BLITTER)) //#define READ_PIXEL_16(a) (JaguarReadWord(a##_addr+(PIXEL_OFFSET_16(a)<<1))) // 32 bpp pixel read -#define PIXEL_OFFSET_32(a) (((((UINT32)a##_y >> 16) * a##_width) + (((UINT32)a##_x >> 16) & ~1)) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 1)) +#define PIXEL_OFFSET_32(a) (((((uint32_t)a##_y >> 16) * a##_width) + (((uint32_t)a##_x >> 16) & ~1)) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 1)) #define READ_PIXEL_32(a) (JaguarReadLong(a##_addr+(PIXEL_OFFSET_32(a)<<2), BLITTER)) //#define READ_PIXEL_32(a) (JaguarReadLong(a##_addr+(PIXEL_OFFSET_32(a)<<2))) @@ -195,25 +215,25 @@ void BlitterMidsummer2(void); //#define WRITE_ZDATA_16(a,d) { JaguarWriteWord(a##_addr+(ZDATA_OFFSET_16(a)<<1), d); } // z data write -#define WRITE_ZDATA(a,f,d) WRITE_ZDATA_16(a,d); +#define WRITE_ZDATA(a,f,d) WRITE_ZDATA_16(a,d); // 1 bpp r data read -#define READ_RDATA_1(r,a,p) ((p) ? ((REG(r+(((UINT32)a##_x >> 19) & 0x04))) >> (((UINT32)a##_x >> 16) & 0x1F)) & 0x0001 : (REG(r) & 0x0001)) +#define READ_RDATA_1(r,a,p) ((p) ? ((REG(r+(((uint32_t)a##_x >> 19) & 0x04))) >> (((uint32_t)a##_x >> 16) & 0x1F)) & 0x0001 : (REG(r) & 0x0001)) // 2 bpp r data read -#define READ_RDATA_2(r,a,p) ((p) ? ((REG(r+(((UINT32)a##_x >> 18) & 0x04))) >> (((UINT32)a##_x >> 15) & 0x3E)) & 0x0003 : (REG(r) & 0x0003)) +#define READ_RDATA_2(r,a,p) ((p) ? ((REG(r+(((uint32_t)a##_x >> 18) & 0x04))) >> (((uint32_t)a##_x >> 15) & 0x3E)) & 0x0003 : (REG(r) & 0x0003)) // 4 bpp r data read -#define READ_RDATA_4(r,a,p) ((p) ? ((REG(r+(((UINT32)a##_x >> 17) & 0x04))) >> (((UINT32)a##_x >> 14) & 0x28)) & 0x000F : (REG(r) & 0x000F)) +#define READ_RDATA_4(r,a,p) ((p) ? ((REG(r+(((uint32_t)a##_x >> 17) & 0x04))) >> (((uint32_t)a##_x >> 14) & 0x28)) & 0x000F : (REG(r) & 0x000F)) // 8 bpp r data read -#define READ_RDATA_8(r,a,p) ((p) ? ((REG(r+(((UINT32)a##_x >> 16) & 0x04))) >> (((UINT32)a##_x >> 13) & 0x18)) & 0x00FF : (REG(r) & 0x00FF)) +#define READ_RDATA_8(r,a,p) ((p) ? ((REG(r+(((uint32_t)a##_x >> 16) & 0x04))) >> (((uint32_t)a##_x >> 13) & 0x18)) & 0x00FF : (REG(r) & 0x00FF)) // 16 bpp r data read -#define READ_RDATA_16(r,a,p) ((p) ? ((REG(r+(((UINT32)a##_x >> 15) & 0x04))) >> (((UINT32)a##_x >> 12) & 0x10)) & 0xFFFF : (REG(r) & 0xFFFF)) +#define READ_RDATA_16(r,a,p) ((p) ? ((REG(r+(((uint32_t)a##_x >> 15) & 0x04))) >> (((uint32_t)a##_x >> 12) & 0x10)) & 0xFFFF : (REG(r) & 0xFFFF)) // 32 bpp r data read -#define READ_RDATA_32(r,a,p) ((p) ? REG(r+(((UINT32)a##_x >> 14) & 0x04)) : REG(r)) +#define READ_RDATA_32(r,a,p) ((p) ? REG(r+(((uint32_t)a##_x >> 14) & 0x04)) : REG(r)) // register data read #define READ_RDATA(r,a,f,p) (\ @@ -246,8 +266,8 @@ void BlitterMidsummer2(void); //#define WRITE_PIXEL_16(a,d) { JaguarWriteWord(a##_addr+(PIXEL_OFFSET_16(a)<<1), d); if (specialLog) WriteLog("Pixel write address: %08X\n", a##_addr+(PIXEL_OFFSET_16(a)<<1)); } // 32 bpp pixel write -#define WRITE_PIXEL_32(a,d) { JaguarWriteLong(a##_addr+(PIXEL_OFFSET_32(a)<<2), d, BLITTER); } -//#define WRITE_PIXEL_32(a,d) { JaguarWriteLong(a##_addr+(PIXEL_OFFSET_32(a)<<2), d); } +#define WRITE_PIXEL_32(a,d) { JaguarWriteLong(a##_addr+(PIXEL_OFFSET_32(a)<<2), d, BLITTER); } +//#define WRITE_PIXEL_32(a,d) { JaguarWriteLong(a##_addr+(PIXEL_OFFSET_32(a)<<2), d); } // pixel write #define WRITE_PIXEL(a,f,d) {\ @@ -267,8 +287,8 @@ void BlitterMidsummer2(void); // as a floating point bit pattern being followed by a number of zeroes. So, e.g., 001101 translates to // 1.01 (the "1." being implied) x (2 ^ 3) or 1010 -> 10 in base 10 (i.e., 1.01 with the decimal place // being shifted to the right 3 places). -/*static uint32 blitter_scanline_width[48] = -{ +/*static uint32_t blitter_scanline_width[48] = +{ 0, 0, 0, 0, // Note: This would really translate to 1, 1, 1, 1 2, 0, 0, 0, 4, 0, 6, 0, @@ -283,62 +303,62 @@ void BlitterMidsummer2(void); 2048, 2560, 3072, 3584 };//*/ -//static uint8 * tom_ram_8; -//static uint8 * paletteRam; -static uint8 src; -static uint8 dst; -static uint8 misc; -static uint8 a1ctl; -static uint8 mode; -static uint8 ity; -static uint8 zop; -static uint8 op; -static uint8 ctrl; -static uint32 a1_addr; -static uint32 a2_addr; -static int32 a1_zoffs; -static int32 a2_zoffs; -static uint32 xadd_a1_control; -static uint32 xadd_a2_control; -static int32 a1_pitch; -static int32 a2_pitch; -static uint32 n_pixels; -static uint32 n_lines; -static int32 a1_x; -static int32 a1_y; -static int32 a1_width; -static int32 a2_x; -static int32 a2_y; -static int32 a2_width; -static int32 a2_mask_x; -static int32 a2_mask_y; -static int32 a1_xadd; -static int32 a1_yadd; -static int32 a2_xadd; -static int32 a2_yadd; -static uint8 a1_phrase_mode; -static uint8 a2_phrase_mode; -static int32 a1_step_x = 0; -static int32 a1_step_y = 0; -static int32 a2_step_x = 0; -static int32 a2_step_y = 0; -static uint32 outer_loop; -static uint32 inner_loop; -static uint32 a2_psize; -static uint32 a1_psize; -static uint32 gouraud_add; -//static uint32 gouraud_data; -//static uint16 gint[4]; -//static uint16 gfrac[4]; -//static uint8 gcolour[4]; +//static uint8_t * tom_ram_8; +//static uint8_t * paletteRam; +static uint8_t src; +static uint8_t dst; +static uint8_t misc; +static uint8_t a1ctl; +static uint8_t mode; +static uint8_t ity; +static uint8_t zop; +static uint8_t op; +static uint8_t ctrl; +static uint32_t a1_addr; +static uint32_t a2_addr; +static int32_t a1_zoffs; +static int32_t a2_zoffs; +static uint32_t xadd_a1_control; +static uint32_t xadd_a2_control; +static int32_t a1_pitch; +static int32_t a2_pitch; +static uint32_t n_pixels; +static uint32_t n_lines; +static int32_t a1_x; +static int32_t a1_y; +static int32_t a1_width; +static int32_t a2_x; +static int32_t a2_y; +static int32_t a2_width; +static int32_t a2_mask_x; +static int32_t a2_mask_y; +static int32_t a1_xadd; +static int32_t a1_yadd; +static int32_t a2_xadd; +static int32_t a2_yadd; +static uint8_t a1_phrase_mode; +static uint8_t a2_phrase_mode; +static int32_t a1_step_x = 0; +static int32_t a1_step_y = 0; +static int32_t a2_step_x = 0; +static int32_t a2_step_y = 0; +static uint32_t outer_loop; +static uint32_t inner_loop; +static uint32_t a2_psize; +static uint32_t a1_psize; +static uint32_t gouraud_add; +//static uint32_t gouraud_data; +//static uint16_t gint[4]; +//static uint16_t gfrac[4]; +//static uint8_t gcolour[4]; static int gd_i[4]; static int gd_c[4]; static int gd_ia, gd_ca; static int colour_index = 0; -static int32 zadd; -static uint32 z_i[4]; +static int32_t zadd; +static uint32_t z_i[4]; -static int32 a1_clip_x, a1_clip_y; +static int32_t a1_clip_x, a1_clip_y; // In the spirit of "get it right first, *then* optimize" I've taken the liberty // of removing all the unnecessary code caching. If it turns out to be a good way @@ -347,11 +367,11 @@ static int32 a1_clip_x, a1_clip_y; // // Generic blit handler // -void blitter_generic(uint32 cmd) +void blitter_generic(uint32_t cmd) { /* Blit! (0018FA70 <- 008DDC40) count: 2 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: 1401060C] - CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN + CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN A1 step values: -2 (X), 1 (Y) A2 step values: -1 (X), 1 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 1 phrases, depth: 8bpp, z-off: 0, width: 320 (21), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -363,9 +383,9 @@ Blit! (0018FA70 <- 008DDC40) count: 2 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: /*if (cmd == 0x1401060C && blit_start_log) specialLog = true;//*/ //Testing only! -//uint32 logGo = ((cmd == 0x01800E01 && REG(A1_BASE) == 0x898000) ? 1 : 0); - uint32 srcdata, srczdata, dstdata, dstzdata, writedata, inhibit; - uint32 bppSrc = (DSTA2 ? 1 << ((REG(A1_FLAGS) >> 3) & 0x07) : 1 << ((REG(A2_FLAGS) >> 3) & 0x07)); +//uint32_t logGo = ((cmd == 0x01800E01 && REG(A1_BASE) == 0x898000) ? 1 : 0); + uint32_t srcdata, srczdata, dstdata, dstzdata, writedata, inhibit; + uint32_t bppSrc = (DSTA2 ? 1 << ((REG(A1_FLAGS) >> 3) & 0x07) : 1 << ((REG(A2_FLAGS) >> 3) & 0x07)); if (specialLog) { @@ -386,7 +406,7 @@ if (specialLog) { WriteLog(" A1_X/Y = %08X/%08X, A2_X/Y = %08X/%08X\n", a1_x, a1_y, a2_x, a2_y); } - uint32 a1_start = a1_x, a2_start = a2_x, bitPos = 0; + uint32_t a1_start = a1_x, a2_start = a2_x, bitPos = 0; //Kludge for Hover Strike... //I wonder if this kludge is in conjunction with the SRCENX down below... @@ -427,7 +447,7 @@ if (specialLog) srczdata = READ_RDATA(SRCZINT, a2, REG(A2_FLAGS), a2_phrase_mode); } - // load dst data and Z + // load dst data and Z if (DSTEN) { dstdata = READ_PIXEL(a1, REG(A1_FLAGS)); @@ -453,14 +473,14 @@ if (specialLog) inhibit = 1; }//*/ - if (GOURZ) + if (GOURZ) srczdata = z_i[colour_index] >> 16; // apply z comparator if (Z_OP_INF && srczdata < dstzdata) inhibit = 1; if (Z_OP_EQU && srczdata == dstzdata) inhibit = 1; if (Z_OP_SUP && srczdata > dstzdata) inhibit = 1; - + // apply data comparator // Note: DCOMPEN only works in 8/16 bpp modes! !!! FIX !!! // Does BCOMPEN only work in 1 bpp mode??? @@ -479,7 +499,7 @@ if (specialLog) //and *then* we can do the bit stepping from there the way it's *supposed* to be done... !!! FIX !!! //[DONE] { - uint32 pixShift = (~bitPos) & (bppSrc - 1); + uint32_t pixShift = (~bitPos) & (bppSrc - 1); srcdata = (srcdata >> pixShift) & 0x01; bitPos++; @@ -490,7 +510,7 @@ if (specialLog) Interesting (Hover Strike--large letter): Blit! (0018FA70 <- 008DDC40) count: 2 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: 1401060C] - CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN + CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN A1 step values: -2 (X), 1 (Y) A2 step values: -1 (X), 1 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 1 phrases, depth: 8bpp, z-off: 0, width: 320 (21), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -498,7 +518,7 @@ Blit! (0018FA70 <- 008DDC40) count: 2 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: A1 x/y: 100/12, A2 x/y: 106/0 Pattern: 000000F300000000 Blit! (0018FA70 <- 008DDC40) count: 8 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: 1401060C] - CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN + CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN A1 step values: -8 (X), 1 (Y) A2 step values: -1 (X), 1 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 1 phrases, depth: 8bpp, z-off: 0, width: 320 (21), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -506,7 +526,7 @@ Blit! (0018FA70 <- 008DDC40) count: 8 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: A1 x/y: 102/12, A2 x/y: 107/0 Pattern: 000000F300000000 Blit! (0018FA70 <- 008DDC40) count: 1 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: 1401060C] - CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN + CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN A1 step values: -1 (X), 1 (Y) A2 step values: -1 (X), 1 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 1 phrases, depth: 8bpp, z-off: 0, width: 320 (21), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -514,7 +534,7 @@ Blit! (0018FA70 <- 008DDC40) count: 1 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: A1 x/y: 118/12, A2 x/y: 70/0 Pattern: 000000F300000000 Blit! (0018FA70 <- 008DDC40) count: 8 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: 1401060C] - CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN + CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN A1 step values: -8 (X), 1 (Y) A2 step values: -1 (X), 1 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 1 phrases, depth: 8bpp, z-off: 0, width: 320 (21), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -522,7 +542,7 @@ Blit! (0018FA70 <- 008DDC40) count: 8 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: A1 x/y: 119/12, A2 x/y: 71/0 Pattern: 000000F300000000 Blit! (0018FA70 <- 008DDC40) count: 1 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: 1401060C] - CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN + CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN A1 step values: -1 (X), 1 (Y) A2 step values: -1 (X), 1 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 1 phrases, depth: 8bpp, z-off: 0, width: 320 (21), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -530,7 +550,7 @@ Blit! (0018FA70 <- 008DDC40) count: 1 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: A1 x/y: 127/12, A2 x/y: 66/0 Pattern: 000000F300000000 Blit! (0018FA70 <- 008DDC40) count: 8 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: 1401060C] - CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN + CMD -> src: SRCENX dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: BCOMPEN BKGWREN A1 step values: -8 (X), 1 (Y) A2 step values: -1 (X), 1 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 1 phrases, depth: 8bpp, z-off: 0, width: 320 (21), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -545,7 +565,7 @@ Blit! (0018FA70 <- 008DDC40) count: 8 x 13, A1/2_FLAGS: 00014218/00013C18 [cmd: // compare source pixel with pattern pixel /* Blit! (000B8250 <- 0012C3A0) count: 16 x 1, A1/2_FLAGS: 00014420/00012000 [cmd: 05810001] - CMD -> src: SRCEN dst: misc: a1ctl: mode: ity: PATDSEL z-op: op: LFU_REPLACE ctrl: BCOMPEN + CMD -> src: SRCEN dst: misc: a1ctl: mode: ity: PATDSEL z-op: op: LFU_REPLACE ctrl: BCOMPEN A1 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 384 (22), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD A2 -> pitch: 1 phrases, depth: 1bpp, z-off: 0, width: 16 (10), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD x/y: 0/20 @@ -560,7 +580,7 @@ Blit! (000B8250 <- 0012C3A0) count: 16 x 1, A1/2_FLAGS: 00014420/00012000 [cmd: /* if (srcdata == READ_RDATA(PATTERNDATA, a2, REG(A2_FLAGS), a2_phrase_mode)) // if (srcdata != READ_RDATA(PATTERNDATA, a2, REG(A2_FLAGS), a2_phrase_mode)) inhibit = 1;//*/ -/* uint32 A2bpp = 1 << ((REG(A2_FLAGS) >> 3) & 0x07); +/* uint32_t A2bpp = 1 << ((REG(A2_FLAGS) >> 3) & 0x07); if (A2bpp == 1 || A2bpp == 16 || A2bpp == 8) inhibit = (srcdata == 0 ? 1: 0); // inhibit = !srcdata; @@ -592,12 +612,12 @@ Blit! (000B8250 <- 0012C3A0) count: 16 x 1, A1/2_FLAGS: 00014420/00012000 [cmd: // compute the write data and store if (!inhibit) - { + { // Houston, we have a problem... // Look here, at PATDSEL and GOURD. If both are active (as they are on the BIOS intro), then there's // a conflict! E.g.: //Blit! (00100000 <- 000095D0) count: 3 x 1, A1/2_FLAGS: 00014220/00004020 [cmd: 00011008] -// CMD -> src: dst: DSTEN misc: a1ctl: mode: GOURD ity: PATDSEL z-op: op: LFU_CLEAR ctrl: +// CMD -> src: dst: DSTEN misc: a1ctl: mode: GOURD ity: PATDSEL z-op: op: LFU_CLEAR ctrl: // A1 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 320 (21), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD // A2 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 256 (20), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD // A1 x/y: 90/171, A2 x/y: 808/0 Pattern: 776D770077007700 @@ -630,7 +650,7 @@ Blit! (000B8250 <- 0012C3A0) count: 16 x 1, A1/2_FLAGS: 00014420/00012000 [cmd: Hover Strike ADDDSEL blit: Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cmd: 00020208] - CMD -> src: dst: DSTEN misc: a1ctl: UPDA1 mode: ity: ADDDSEL z-op: op: LFU_CLEAR ctrl: + CMD -> src: dst: DSTEN misc: a1ctl: UPDA1 mode: ity: ADDDSEL z-op: op: LFU_CLEAR ctrl: A1 step values: -320 (X), 1 (Y) A1 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD A2 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 256 (20), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD @@ -641,16 +661,16 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm if (!TOPBEN) { //This is correct now, but slow... - int16 s = (srcdata & 0xFF) | (srcdata & 0x80 ? 0xFF00 : 0x0000), + int16_t s = (srcdata & 0xFF) | (srcdata & 0x80 ? 0xFF00 : 0x0000), d = dstdata & 0xFF; - int16 sum = s + d; + int16_t sum = s + d; if (sum < 0) writedata = 0x00; else if (sum > 0xFF) writedata = 0xFF; else - writedata = (uint32)sum; + writedata = (uint32_t)sum; } //This doesn't seem right... Looks like it would muck up the low byte... !!! FIX !!! @@ -675,10 +695,10 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm //According to JTRM, this is part of the four things the blitter does with the write data (the other //three being PATDSEL, ADDDSEL, and LFU (default). I'm not sure which gets precedence, this or PATDSEL //(see above blit example)... - if (GOURD) + if (GOURD) writedata = ((gd_c[colour_index]) << 8) | (gd_i[colour_index] >> 16); - if (SRCSHADE) + if (SRCSHADE) { int intensity = srcdata & 0xFF; int ia = gd_ia >> 16; @@ -704,8 +724,8 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm { /*if (((REG(A1_FLAGS) >> 3) & 0x07) == 5) { - uint32 offset = a1_addr+(PIXEL_OFFSET_32(a1)<<2); -// (((((UINT32)a##_y >> 16) * a##_width) + (((UINT32)a##_x >> 16) & ~1)) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 1)) + uint32_t offset = a1_addr+(PIXEL_OFFSET_32(a1)<<2); +// (((((uint32_t)a##_y >> 16) * a##_width) + (((uint32_t)a##_x >> 16) & ~1)) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 1)) if ((offset >= 0x1FF020 && offset <= 0x1FF03F) || (offset >= 0x1FF820 && offset <= 0x1FF83F)) WriteLog("32bpp pixel write: A1 Phrase mode --> "); }//*/ @@ -733,7 +753,7 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm srczdata = READ_RDATA(SRCZINT, a1, REG(A1_FLAGS), a1_phrase_mode); } - // load dst data and Z + // load dst data and Z if (DSTEN) { dstdata = READ_PIXEL(a2, REG(A2_FLAGS)); @@ -749,14 +769,14 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm dstzdata = READ_RDATA(DSTZ, a2, REG(A2_FLAGS), a2_phrase_mode); } - if (GOURZ) + if (GOURZ) srczdata = z_i[colour_index] >> 16; // apply z comparator if (Z_OP_INF && srczdata < dstzdata) inhibit = 1; if (Z_OP_EQU && srczdata == dstzdata) inhibit = 1; if (Z_OP_SUP && srczdata > dstzdata) inhibit = 1; - + // apply data comparator //NOTE: The bit comparator (BCOMPEN) is NOT the same at the data comparator! if (DCOMPEN | BCOMPEN) @@ -774,7 +794,7 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm // AvP: This is causing blocks to be written instead of bit patterns... // Works now... // NOTE: We really should separate out the BCOMPEN & DCOMPEN stuff! -/* uint32 A1bpp = 1 << ((REG(A1_FLAGS) >> 3) & 0x07); +/* uint32_t A1bpp = 1 << ((REG(A1_FLAGS) >> 3) & 0x07); if (A1bpp == 1 || A1bpp == 16 || A1bpp == 8) inhibit = (srcdata == 0 ? 1: 0); else @@ -795,7 +815,7 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm // if (a1_phrase_mode || a2_phrase_mode) // inhibit = !inhibit; } - + if (CLIPA1) { inhibit |= (((a1_x >> 16) < a1_clip_x && (a1_x >> 16) >= 0 @@ -804,7 +824,7 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm // compute the write data and store if (!inhibit) - { + { if (PATDSEL) { // use pattern data for write data @@ -833,10 +853,10 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm writedata |= srcdata & dstdata; } - if (GOURD) + if (GOURD) writedata = ((gd_c[colour_index]) << 8) | (gd_i[colour_index] >> 16); - if (SRCSHADE) + if (SRCSHADE) { int intensity = srcdata & 0xFF; int ia = gd_ia >> 16; @@ -860,8 +880,8 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm { /*if (logGo) { - uint32 offset = a2_addr+(PIXEL_OFFSET_16(a2)<<1); -// (((((UINT32)a##_y >> 16) * a##_width) + (((UINT32)a##_x >> 16) & ~1)) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 1)) + uint32_t offset = a2_addr+(PIXEL_OFFSET_16(a2)<<1); +// (((((uint32_t)a##_y >> 16) * a##_width) + (((uint32_t)a##_x >> 16) & ~1)) * (1 + a##_pitch) + (((uint32_t)a##_x >> 16) & 1)) WriteLog("[%08X:%04X] ", offset, writedata); }//*/ // write to the destination @@ -905,13 +925,13 @@ Blit! (00098D90 <- 0081DDC0) count: 320 x 287, A1/2_FLAGS: 00004220/00004020 [cm gd_i[colour_index] += gd_ia; //Hmm, this doesn't seem to do anything... //But it is correct according to the JTRM...! -if ((int32)gd_i[colour_index] < 0) +if ((int32_t)gd_i[colour_index] < 0) gd_i[colour_index] = 0; if (gd_i[colour_index] > 0x00FFFFFF) gd_i[colour_index] = 0x00FFFFFF;//*/ gd_c[colour_index] += gd_ca; -if ((int32)gd_c[colour_index] < 0) +if ((int32_t)gd_c[colour_index] < 0) gd_c[colour_index] = 0; if (gd_c[colour_index] > 0x000000FF) gd_c[colour_index] = 0x000000FF;//*/ @@ -940,7 +960,7 @@ Below fixes it, but then borks: ; O Blit! (00110000 <- 0010B2A8) count: 12 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: 09800609] - CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN + CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN A1 step values: -15 (X), 1 (Y) A2 step values: -4 (X), 0 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD @@ -971,17 +991,17 @@ Lesse, with pre-add we'd have: { // Bump the pointer to the next phrase boundary // Even though it works, this is crappy... Clean it up! - uint32 size = 64 / a1_psize; + uint32_t size = 64 / a1_psize; // Crappy kludge... ('aligning' source to destination) if (a2_phrase_mode && DSTA2) { - uint32 extra = (a2_start >> 16) % size; + uint32_t extra = (a2_start >> 16) % size; a1_x += extra << 16; } - uint32 newx = (a1_x >> 16) / size; - uint32 newxrem = (a1_x >> 16) % size; + uint32_t newx = (a1_x >> 16) / size; + uint32_t newxrem = (a1_x >> 16) % size; a1_x &= 0x0000FFFF; a1_x |= (((newx + (newxrem == 0 ? 0 : 1)) * size) & 0xFFFF) << 16; }//*/ @@ -989,16 +1009,16 @@ Lesse, with pre-add we'd have: { // Bump the pointer to the next phrase boundary // Even though it works, this is crappy... Clean it up! - uint32 size = 64 / a1_psize; + uint32_t size = 64 / a1_psize; // Crappy kludge... ('aligning' source to destination) if (a2_phrase_mode && DSTA2) { - uint32 extra = (a2_start >> 16) % size; + uint32_t extra = (a2_start >> 16) % size; a1_x += extra << 16; } - uint32 pixelSize = (size - 1) << 16; + uint32_t pixelSize = (size - 1) << 16; a1_x = (a1_x + pixelSize) & ~pixelSize; } @@ -1006,18 +1026,18 @@ Lesse, with pre-add we'd have: { // Bump the pointer to the next phrase boundary // Even though it works, this is crappy... Clean it up! - uint32 size = 64 / a2_psize; + uint32_t size = 64 / a2_psize; // Crappy kludge... ('aligning' source to destination) // Prolly should do this for A1 channel as well... [DONE] if (a1_phrase_mode && !DSTA2) { - uint32 extra = (a1_start >> 16) % size; + uint32_t extra = (a1_start >> 16) % size; a2_x += extra << 16; } - uint32 newx = (a2_x >> 16) / size; - uint32 newxrem = (a2_x >> 16) % size; + uint32_t newx = (a2_x >> 16) / size; + uint32_t newxrem = (a2_x >> 16) % size; a2_x &= 0x0000FFFF; a2_x |= (((newx + (newxrem == 0 ? 0 : 1)) * size) & 0xFFFF) << 16; }//*/ @@ -1025,17 +1045,17 @@ Lesse, with pre-add we'd have: { // Bump the pointer to the next phrase boundary // Even though it works, this is crappy... Clean it up! - uint32 size = 64 / a2_psize; + uint32_t size = 64 / a2_psize; // Crappy kludge... ('aligning' source to destination) // Prolly should do this for A1 channel as well... [DONE] if (a1_phrase_mode && !DSTA2) { - uint32 extra = (a1_start >> 16) % size; + uint32_t extra = (a1_start >> 16) % size; a2_x += extra << 16; } - uint32 pixelSize = (size - 1) << 16; + uint32_t pixelSize = (size - 1) << 16; a2_x = (a2_x + pixelSize) & ~pixelSize; } @@ -1048,15 +1068,15 @@ Lesse, with pre-add we'd have: a2_y += a2_step_y;//*/ #endif } - - // write values back to registers + + // write values back to registers WREG(A1_PIXEL, (a1_y & 0xFFFF0000) | ((a1_x >> 16) & 0xFFFF)); WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xFFFF)); WREG(A2_PIXEL, (a2_y & 0xFFFF0000) | ((a2_x >> 16) & 0xFFFF)); specialLog = false; } -void blitter_blit(uint32 cmd) +void blitter_blit(uint32_t cmd) { //Apparently this is doing *something*, just not sure exactly what... /*if (cmd == 0x41802E01) @@ -1066,7 +1086,7 @@ void blitter_blit(uint32 cmd) WriteLog("Is: %08X\n", cmd); }//*/ - uint32 pitchValue[4] = { 0, 1, 3, 2 }; + uint32_t pitchValue[4] = { 0, 1, 3, 2 }; colour_index = 0; src = cmd & 0x07; dst = (cmd >> 3) & 0x07; @@ -1085,7 +1105,7 @@ void blitter_blit(uint32 cmd) a1_zoffs = (REG(A1_FLAGS) >> 6) & 7; a2_zoffs = (REG(A2_FLAGS) >> 6) & 7; - + xadd_a1_control = (REG(A1_FLAGS) >> 16) & 0x03; xadd_a2_control = (REG(A2_FLAGS) >> 16) & 0x03; @@ -1107,7 +1127,7 @@ void blitter_blit(uint32 cmd) // a1_width = blitter_scanline_width[((REG(A1_FLAGS) & 0x00007E00) >> 9)]; // According to JTRM, this must give a *whole number* of phrases in the current // pixel size (this means the lookup above is WRONG)... !!! FIX !!! - UINT32 m = (REG(A1_FLAGS) >> 9) & 0x03, e = (REG(A1_FLAGS) >> 11) & 0x0F; + uint32_t m = (REG(A1_FLAGS) >> 9) & 0x03, e = (REG(A1_FLAGS) >> 11) & 0x0F; a1_width = ((0x04 | m) << e) >> 2;//*/ a2_x = (REG(A2_PIXEL) & 0x0000FFFF) << 16; @@ -1154,7 +1174,7 @@ void blitter_blit(uint32 cmd) // add pixelsize (1) to X a1_xadd = 1 << 16; break; - case XADD0: + case XADD0: // add zero (for those nice vertical lines) a1_xadd = 0; break; @@ -1170,7 +1190,7 @@ void blitter_blit(uint32 cmd) // A1 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 128 (1C), addctl: XADDINC YADD1 XSIGNADD YSIGNADD // A2 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 320 (21), addctl: XADD0 YADD1 XSIGNADD YSIGNADD //if (YADD1_A1 && YADD1_A2 && xadd_a2_control == XADD0 && xadd_a1_control == XADDINC)// && -// UINT32 a1f = REG(A1_FLAGS), a2f = REG(A2_FLAGS); +// uint32_t a1f = REG(A1_FLAGS), a2f = REG(A2_FLAGS); //Ok, so this ISN'T it... Prolly the XADDPHR code above that's doing it... //if (REG(A1_FLAGS) == 0x00073820 && REG(A2_FLAGS) == 0x00064220 && cmd == 0x41802801) // A1 x/y: 14368/7, A2 x/y: 150/36 @@ -1198,7 +1218,7 @@ void blitter_blit(uint32 cmd) // add pixelsize (1) to X a2_xadd = 1 << 16; break; - case XADD0: + case XADD0: // add zero (for those nice vertical lines) a2_xadd = 0; break; @@ -1260,23 +1280,23 @@ WriteLog("BLIT: Asked to use invalid bit combo (XADDINC) for A2...\n"); if (GOURD || GOURZ || SRCSHADE) { gd_c[0] = blitter_ram[PATTERNDATA + 6]; - gd_i[0] = ((uint32)blitter_ram[PATTERNDATA + 7] << 16) - | ((uint32)blitter_ram[SRCDATA + 6] << 8) | blitter_ram[SRCDATA + 7]; + gd_i[0] = ((uint32_t)blitter_ram[PATTERNDATA + 7] << 16) + | ((uint32_t)blitter_ram[SRCDATA + 6] << 8) | blitter_ram[SRCDATA + 7]; gd_c[1] = blitter_ram[PATTERNDATA + 4]; - gd_i[1] = ((uint32)blitter_ram[PATTERNDATA + 5] << 16) - | ((uint32)blitter_ram[SRCDATA + 4] << 8) | blitter_ram[SRCDATA + 5]; + gd_i[1] = ((uint32_t)blitter_ram[PATTERNDATA + 5] << 16) + | ((uint32_t)blitter_ram[SRCDATA + 4] << 8) | blitter_ram[SRCDATA + 5]; gd_c[2] = blitter_ram[PATTERNDATA + 2]; - gd_i[2] = ((uint32)blitter_ram[PATTERNDATA + 3] << 16) - | ((uint32)blitter_ram[SRCDATA + 2] << 8) | blitter_ram[SRCDATA + 3]; + gd_i[2] = ((uint32_t)blitter_ram[PATTERNDATA + 3] << 16) + | ((uint32_t)blitter_ram[SRCDATA + 2] << 8) | blitter_ram[SRCDATA + 3]; gd_c[3] = blitter_ram[PATTERNDATA + 0]; - gd_i[3] = ((uint32)blitter_ram[PATTERNDATA + 1] << 16) - | ((uint32)blitter_ram[SRCDATA + 0] << 8) | blitter_ram[SRCDATA + 1]; + gd_i[3] = ((uint32_t)blitter_ram[PATTERNDATA + 1] << 16) + | ((uint32_t)blitter_ram[SRCDATA + 0] << 8) | blitter_ram[SRCDATA + 1]; gouraud_add = REG(INTENSITYINC); - + gd_ia = gouraud_add & 0x00FFFFFF; if (gd_ia & 0x00800000) gd_ia = 0xFF000000 | gd_ia; @@ -1346,7 +1366,7 @@ WriteLog("BLIT: Asked to use invalid bit combo (XADDINC) for A2...\n"); WriteLog(" GOURZ = %i\n",GOURZ); WriteLog(" GOURD = %i\n",GOURD); WriteLog(" SRCSHADE= %i\n",SRCSHADE); - } + } #endif //NOTE: Pitch is ignored! @@ -1356,24 +1376,24 @@ WriteLog("BLIT: Asked to use invalid bit combo (XADDINC) for A2...\n"); //Black is short by 3, pink is short by 1... /* Blit! (00110000 <- 000BF010) count: 9 x 31, A1/2_FLAGS: 000042E2/00010020 [cmd: 00010200] - CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: + CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD A2 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 1 (00), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD A1 x/y: 262/124, A2 x/y: 128/0 Blit! (00110000 <- 000BF010) count: 5 x 38, A1/2_FLAGS: 000042E2/00010020 [cmd: 00010200] - CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: + CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD A2 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 1 (00), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD A1 x/y: 264/117, A2 x/y: 407/0 Blit! (00110000 <- 000BF010) count: 9 x 23, A1/2_FLAGS: 000042E2/00010020 [cmd: 00010200] - CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: + CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: A1 step values: -10 (X), 1 (Y) A1 -> pitch: 4(2) phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD A2 -> pitch: 1(0) phrases, depth: 16bpp, z-off: 0, width: 1 (00), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD A1 x/y: 262/132, A2 x/y: 129/0 Blit! (00110000 <- 000BF010) count: 5 x 27, A1/2_FLAGS: 000042E2/00010020 [cmd: 00010200] - CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: + CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: A1 step values: -8 (X), 1 (Y) A1 -> pitch: 4(2) phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD A2 -> pitch: 1(0) phrases, depth: 16bpp, z-off: 0, width: 1 (00), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -1392,7 +1412,7 @@ Fixed! Now for more: ; This looks like the ship icon in the upper left corner... Blit! (00110000 <- 0010B2A8) count: 11 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: 09800609] - CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN + CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN A1 step values: -12 (X), 1 (Y) A2 step values: 0 (X), 0 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD @@ -1409,7 +1429,7 @@ Actually, if you look at the A1 step values, there IS a discrepancy! ; D Blit! (00110000 <- 0010B2A8) count: 12 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: 09800609] - CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN + CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN A1 step values: -14 (X), 1 (Y) A2 step values: -4 (X), 0 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD @@ -1420,7 +1440,7 @@ Blit! (00110000 <- 0010B2A8) count: 12 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: ; E Blit! (00110000 <- 0010B2A8) count: 12 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: 09800609] - CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN + CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN A1 step values: -13 (X), 1 (Y) A2 step values: -4 (X), 0 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD @@ -1430,7 +1450,7 @@ Blit! (00110000 <- 0010B2A8) count: 12 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: ; M Blit! (00110000 <- 0010B2A8) count: 12 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: 09800609] - CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN + CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN A1 step values: -12 (X), 1 (Y) A2 step values: 0 (X), 0 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD @@ -1440,7 +1460,7 @@ Blit! (00110000 <- 0010B2A8) count: 12 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: ; O Blit! (00110000 <- 0010B2A8) count: 12 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: 09800609] - CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN + CMD -> src: SRCEN dst: DSTEN misc: a1ctl: UPDA1 UPDA2 mode: ity: z-op: op: LFU_REPLACE ctrl: DCOMPEN A1 step values: -15 (X), 1 (Y) A2 step values: -4 (X), 0 (Y) [mask (unused): 00000000 - FFFFFFFF/FFFFFFFF] A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD @@ -1451,21 +1471,21 @@ Blit! (00110000 <- 0010B2A8) count: 12 x 12, A1/2_FLAGS: 000042E2/00000020 [cmd: //extern int op_start_log; if (blit_start_log) { - char * ctrlStr[4] = { "XADDPHR\0", "XADDPIX\0", "XADD0\0", "XADDINC\0" }; - char * bppStr[8] = { "1bpp\0", "2bpp\0", "4bpp\0", "8bpp\0", "16bpp\0", "32bpp\0", "???\0", "!!!\0" }; - char * opStr[16] = { "LFU_CLEAR", "LFU_NSAND", "LFU_NSAD", "LFU_NOTS", "LFU_SAND", "LFU_NOTD", "LFU_N_SXORD", "LFU_NSORND", + const char * ctrlStr[4] = { "XADDPHR\0", "XADDPIX\0", "XADD0\0", "XADDINC\0" }; + const char * bppStr[8] = { "1bpp\0", "2bpp\0", "4bpp\0", "8bpp\0", "16bpp\0", "32bpp\0", "???\0", "!!!\0" }; + const char * opStr[16] = { "LFU_CLEAR", "LFU_NSAND", "LFU_NSAD", "LFU_NOTS", "LFU_SAND", "LFU_NOTD", "LFU_N_SXORD", "LFU_NSORND", "LFU_SAD", "LFU_XOR", "LFU_D", "LFU_NSORD", "LFU_REPLACE", "LFU_SORND", "LFU_SORD", "LFU_ONE" }; - uint32 /*src = cmd & 0x07, dst = (cmd >> 3) & 0x07, misc = (cmd >> 6) & 0x03, + uint32_t /*src = cmd & 0x07, dst = (cmd >> 3) & 0x07, misc = (cmd >> 6) & 0x03, a1ctl = (cmd >> 8) & 0x07,*/ mode = (cmd >> 11) & 0x07/*, ity = (cmd >> 14) & 0x0F, zop = (cmd >> 18) & 0x07, op = (cmd >> 21) & 0x0F, ctrl = (cmd >> 25) & 0x3F*/; - UINT32 a1f = REG(A1_FLAGS), a2f = REG(A2_FLAGS); - uint32 p1 = a1f & 0x07, p2 = a2f & 0x07, + uint32_t a1f = REG(A1_FLAGS), a2f = REG(A2_FLAGS); + uint32_t p1 = a1f & 0x07, p2 = a2f & 0x07, d1 = (a1f >> 3) & 0x07, d2 = (a2f >> 3) & 0x07, zo1 = (a1f >> 6) & 0x07, zo2 = (a2f >> 6) & 0x07, w1 = (a1f >> 9) & 0x3F, w2 = (a2f >> 9) & 0x3F, ac1 = (a1f >> 16) & 0x1F, ac2 = (a2f >> 16) & 0x1F; - UINT32 iw1 = ((0x04 | (w1 & 0x03)) << ((w1 & 0x3C) >> 2)) >> 2; - UINT32 iw2 = ((0x04 | (w2 & 0x03)) << ((w2 & 0x3C) >> 2)) >> 2; + uint32_t iw1 = ((0x04 | (w1 & 0x03)) << ((w1 & 0x3C) >> 2)) >> 2; + uint32_t iw2 = ((0x04 | (w2 & 0x03)) << ((w2 & 0x3C) >> 2)) >> 2; WriteLog("Blit! (%08X %s %08X) count: %d x %d, A1/2_FLAGS: %08X/%08X [cmd: %08X]\n", a1_addr, (mode&0x01 ? "->" : "<-"), a2_addr, n_pixels, n_lines, a1f, a2f, cmd); // WriteLog(" CMD -> src: %d, dst: %d, misc: %d, a1ctl: %d, mode: %d, ity: %1X, z-op: %d, op: %1X, ctrl: %02X\n", src, dst, misc, a1ctl, mode, ity, zop, op, ctrl); @@ -1519,32 +1539,43 @@ if (blit_start_log) ********************** STUFF CUT ABOVE THIS LINE! ****************************** *******************************************************************************/ -void blitter_init(void) + +void BlitterInit(void) { - blitter_reset(); + BlitterReset(); } -void blitter_reset(void) + +void BlitterReset(void) { memset(blitter_ram, 0x00, 0xA0); } -void blitter_done(void) + +void BlitterDone(void) { WriteLog("BLIT: Done.\n"); } -uint8 BlitterReadByte(uint32 offset, uint32 who/*=UNKNOWN*/) + +uint8_t BlitterReadByte(uint32_t offset, uint32_t who/*=UNKNOWN*/) { offset &= 0xFF; // status register //This isn't cycle accurate--how to fix? !!! FIX !!! //Probably have to do some multi-threaded implementation or at least a reentrant safe implementation... +//Real hardware returns $00000805, just like the JTRM says. + if (offset == (0x38 + 0)) + return 0x00; + if (offset == (0x38 + 1)) + return 0x00; + if (offset == (0x38 + 2)) + return 0x08; if (offset == (0x38 + 3)) - return 0x01; // always idle + return 0x05; // always idle/never stopped (collision detection ignored!) -// CHECK HERE ONCE THIS FIX HAS BEEN TESTED: [ ] +// CHECK HERE ONCE THIS FIX HAS BEEN TESTED: [X] //Fix for AvP: if (offset >= 0x04 && offset <= 0x07) //This is it. I wonder if it just ignores the lower three bits? @@ -1557,19 +1588,22 @@ uint8 BlitterReadByte(uint32 offset, uint32 who/*=UNKNOWN*/) return blitter_ram[offset]; } + //Crappy! -uint16 BlitterReadWord(uint32 offset, uint32 who/*=UNKNOWN*/) +uint16_t BlitterReadWord(uint32_t offset, uint32_t who/*=UNKNOWN*/) { - return ((uint16)BlitterReadByte(offset, who) << 8) | (uint16)BlitterReadByte(offset+1, who); + return ((uint16_t)BlitterReadByte(offset, who) << 8) | (uint16_t)BlitterReadByte(offset+1, who); } + //Crappy! -uint32 BlitterReadLong(uint32 offset, uint32 who/*=UNKNOWN*/) +uint32_t BlitterReadLong(uint32_t offset, uint32_t who/*=UNKNOWN*/) { return (BlitterReadWord(offset, who) << 16) | BlitterReadWord(offset+2, who); } -void BlitterWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/) + +void BlitterWriteByte(uint32_t offset, uint8_t data, uint32_t who/*=UNKNOWN*/) { /*if (offset & 0xFF == 0x7B) WriteLog("--> Wrote to B_STOP: value -> %02X\n", data);*/ @@ -1596,12 +1630,12 @@ void BlitterWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/) case 0x81: blitter_ram[PATTERNDATA + 5] = data; break; case 0x82: blitter_ram[SRCDATA + 4] = data; break; case 0x83: blitter_ram[SRCDATA + 5] = data; break; - + case 0x84: break; case 0x85: blitter_ram[PATTERNDATA + 3] = data; break; case 0x86: blitter_ram[SRCDATA + 2] = data; break; case 0x87: blitter_ram[SRCDATA + 3] = data; break; - + case 0x88: break; case 0x89: blitter_ram[PATTERNDATA + 1] = data; break; case 0x8A: blitter_ram[SRCDATA + 0] = data; break; @@ -1618,12 +1652,12 @@ void BlitterWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/) case 0x91: blitter_ram[SRCZINT + 5] = data; break; case 0x92: blitter_ram[SRCZFRAC + 4] = data; break; case 0x93: blitter_ram[SRCZFRAC + 5] = data; break; - + case 0x94: blitter_ram[SRCZINT + 2] = data; break; case 0x95: blitter_ram[SRCZINT + 3] = data; break; case 0x96: blitter_ram[SRCZFRAC + 2] = data; break; case 0x97: blitter_ram[SRCZFRAC + 3] = data; break; - + case 0x98: blitter_ram[SRCZINT + 0] = data; break; case 0x99: blitter_ram[SRCZINT + 1] = data; break; case 0x9A: blitter_ram[SRCZFRAC + 0] = data; break; @@ -1655,7 +1689,8 @@ void BlitterWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/) blitter_ram[offset] = data; } -void BlitterWriteWord(uint32 offset, uint16 data, uint32 who/*=UNKNOWN*/) + +void BlitterWriteWord(uint32_t offset, uint16_t data, uint32_t who/*=UNKNOWN*/) { /*if (((offset & 0xFF) >= PATTERNDATA) && ((offset & 0xFF) < PATTERNDATA + 8)) { @@ -1702,7 +1737,8 @@ if (blit_start_log) } //F02278,9,A,B -void BlitterWriteLong(uint32 offset, uint32 data, uint32 who/*=UNKNOWN*/) + +void BlitterWriteLong(uint32_t offset, uint32_t data, uint32_t who/*=UNKNOWN*/) { /*if (((offset & 0xFF) >= PATTERNDATA) && ((offset & 0xFF) < PATTERNDATA + 8)) { @@ -1722,15 +1758,16 @@ doGPUDis = true; BlitterWriteWord(offset + 2, data & 0xFFFF, who); } + void LogBlit(void) { - char * opStr[16] = { "LFU_CLEAR", "LFU_NSAND", "LFU_NSAD", "LFU_NOTS", "LFU_SAND", "LFU_NOTD", "LFU_N_SXORD", "LFU_NSORND", + const char * opStr[16] = { "LFU_CLEAR", "LFU_NSAND", "LFU_NSAD", "LFU_NOTS", "LFU_SAND", "LFU_NOTD", "LFU_N_SXORD", "LFU_NSORND", "LFU_SAD", "LFU_XOR", "LFU_D", "LFU_NSORD", "LFU_REPLACE", "LFU_SORND", "LFU_SORD", "LFU_ONE" }; - uint32 cmd = GET32(blitter_ram, 0x38); - UINT32 m = (REG(A1_FLAGS) >> 9) & 0x03, e = (REG(A1_FLAGS) >> 11) & 0x0F; - UINT32 a1_width = ((0x04 | m) << e) >> 2; + uint32_t cmd = GET32(blitter_ram, 0x38); + uint32_t m = (REG(A1_FLAGS) >> 9) & 0x03, e = (REG(A1_FLAGS) >> 11) & 0x0F; + uint32_t a1_width = ((0x04 | m) << e) >> 2; m = (REG(A2_FLAGS) >> 9) & 0x03, e = (REG(A2_FLAGS) >> 11) & 0x0F; - UINT32 a2_width = ((0x04 | m) << e) >> 2; + uint32_t a2_width = ((0x04 | m) << e) >> 2; WriteLog("Blit!\n"); WriteLog(" COMMAND = %08X\n", cmd); @@ -1759,11 +1796,11 @@ void LogBlit(void) REG(A1_FLAGS) & 0x00003, (REG(A1_FLAGS) & 0x00038) >> 3, (REG(A1_FLAGS) & 0x001C0) >> 6, a1_width, (REG(A1_FLAGS) & 0x30000) >> 16); WriteLog(" a1_clip = %u, %u (%08X)\n", GET16(blitter_ram, A1_CLIP + 2), GET16(blitter_ram, A1_CLIP + 0), GET32(blitter_ram, A1_CLIP)); - WriteLog(" a1_pixel = %d, %d (%08X)\n", (int16)GET16(blitter_ram, A1_PIXEL + 2), (int16)GET16(blitter_ram, A1_PIXEL + 0), GET32(blitter_ram, A1_PIXEL)); - WriteLog(" a1_step = %d, %d (%08X)\n", (int16)GET16(blitter_ram, A1_STEP + 2), (int16)GET16(blitter_ram, A1_STEP + 0), GET32(blitter_ram, A1_STEP)); + WriteLog(" a1_pixel = %d, %d (%08X)\n", (int16_t)GET16(blitter_ram, A1_PIXEL + 2), (int16_t)GET16(blitter_ram, A1_PIXEL + 0), GET32(blitter_ram, A1_PIXEL)); + WriteLog(" a1_step = %d, %d (%08X)\n", (int16_t)GET16(blitter_ram, A1_STEP + 2), (int16_t)GET16(blitter_ram, A1_STEP + 0), GET32(blitter_ram, A1_STEP)); WriteLog(" a1_fstep = %u, %u (%08X)\n", GET16(blitter_ram, A1_FSTEP + 2), GET16(blitter_ram, A1_FSTEP + 0), GET32(blitter_ram, A1_FSTEP)); WriteLog(" a1_fpixel= %u, %u (%08X)\n", GET16(blitter_ram, A1_FPIXEL + 2), GET16(blitter_ram, A1_FPIXEL + 0), GET32(blitter_ram, A1_FPIXEL)); - WriteLog(" a1_inc = %d, %d (%08X)\n", (int16)GET16(blitter_ram, A1_INC + 2), (int16)GET16(blitter_ram, A1_INC + 0), GET32(blitter_ram, A1_INC)); + WriteLog(" a1_inc = %d, %d (%08X)\n", (int16_t)GET16(blitter_ram, A1_INC + 2), (int16_t)GET16(blitter_ram, A1_INC + 0), GET32(blitter_ram, A1_INC)); WriteLog(" a1_finc = %u, %u (%08X)\n", GET16(blitter_ram, A1_FINC + 2), GET16(blitter_ram, A1_FINC + 0), GET32(blitter_ram, A1_FINC)); WriteLog(" a2_base = %08X\n", REG(A2_BASE)); @@ -1792,8 +1829,8 @@ void LogBlit(void) REG(A2_FLAGS) & 0x00003, (REG(A2_FLAGS) & 0x00038) >> 3, (REG(A2_FLAGS) & 0x001C0) >> 6, a2_width, (REG(A2_FLAGS) & 0x30000) >> 16); WriteLog(" a2_mask = %u, %u (%08X)\n", GET16(blitter_ram, A2_MASK + 2), GET16(blitter_ram, A2_MASK + 0), GET32(blitter_ram, A2_MASK)); - WriteLog(" a2_pixel = %d, %d (%08X)\n", (int16)GET16(blitter_ram, A2_PIXEL + 2), (int16)GET16(blitter_ram, A2_PIXEL + 0), GET32(blitter_ram, A2_PIXEL)); - WriteLog(" a2_step = %d, %d (%08X)\n", (int16)GET16(blitter_ram, A2_STEP + 2), (int16)GET16(blitter_ram, A2_STEP + 0), GET32(blitter_ram, A2_STEP)); + WriteLog(" a2_pixel = %d, %d (%08X)\n", (int16_t)GET16(blitter_ram, A2_PIXEL + 2), (int16_t)GET16(blitter_ram, A2_PIXEL + 0), GET32(blitter_ram, A2_PIXEL)); + WriteLog(" a2_step = %d, %d (%08X)\n", (int16_t)GET16(blitter_ram, A2_STEP + 2), (int16_t)GET16(blitter_ram, A2_STEP + 0), GET32(blitter_ram, A2_STEP)); WriteLog(" count = %d x %d\n", GET16(blitter_ram, PIXLINECOUNTER + 2), GET16(blitter_ram, PIXLINECOUNTER)); @@ -1809,9 +1846,9 @@ void LogBlit(void) WriteLog(" UPDA2 = %s\n", (UPDA2 ? "1" : "0")); WriteLog(" DSTA2 = %s\n", (DSTA2 ? "1" : "0")); WriteLog(" ZOP = %s %s %s\n", (Z_OP_INF ? "<" : ""), (Z_OP_EQU ? "=" : ""), (Z_OP_SUP ? ">" : "")); - WriteLog("--LFUFUNC = %s\n", opStr[(cmd >> 21) & 0x0F]); + WriteLog("+-LFUFUNC = %s\n", opStr[(cmd >> 21) & 0x0F]); WriteLog("| PATDSEL = %s (PD=%08X%08X)\n", (PATDSEL ? "1" : "0"), REG(PATTERNDATA), REG(PATTERNDATA + 4)); - WriteLog("--ADDDSEL = %s\n", (ADDDSEL ? "1" : "0")); + WriteLog("+-ADDDSEL = %s\n", (ADDDSEL ? "1" : "0")); WriteLog(" CMPDST = %s\n", (CMPDST ? "1" : "0")); WriteLog(" BCOMPEN = %s\n", (BCOMPEN ? "1" : "0")); WriteLog(" DCOMPEN = %s\n", (DCOMPEN ? "1" : "0")); @@ -1836,17 +1873,20 @@ void LogBlit(void) #define TXTEXT (false) #define POLYGON (false) -void BlitterMidsummer(uint32 cmd) +void BlitterMidsummer(uint32_t cmd) { -uint32 outer_loop, inner_loop, a1_addr, a2_addr; -int32 a1_x, a1_y, a2_x, a2_y, a1_width, a2_width; -uint8 a1_phrase_mode, a2_phrase_mode; +#ifdef LOG_BLITS + LogBlit(); +#endif +uint32_t outer_loop, inner_loop, a1_addr, a2_addr; +int32_t a1_x, a1_y, a2_x, a2_y, a1_width, a2_width; +uint8_t a1_phrase_mode, a2_phrase_mode; a1_addr = REG(A1_BASE) & 0xFFFFFFF8; a2_addr = REG(A2_BASE) & 0xFFFFFFF8; a1_x = (REG(A1_PIXEL) << 16) | (REG(A1_FPIXEL) & 0xFFFF); a1_y = (REG(A1_PIXEL) & 0xFFFF0000) | (REG(A1_FPIXEL) >> 16); - UINT32 m = (REG(A1_FLAGS) >> 9) & 0x03, e = (REG(A1_FLAGS) >> 11) & 0x0F; + uint32_t m = (REG(A1_FLAGS) >> 9) & 0x03, e = (REG(A1_FLAGS) >> 11) & 0x0F; a1_width = ((0x04 | m) << e) >> 2;//*/ a2_x = (REG(A2_PIXEL) & 0x0000FFFF) << 16; a2_y = (REG(A2_PIXEL) & 0xFFFF0000); @@ -1875,14 +1915,14 @@ if (cmd != 0x00010200 && cmd != 0x01800001 && cmd != 0x01800005 LogBlit(); }//*/ - uint64 srcData = GET64(blitter_ram, SRCDATA), srcXtraData, + uint64_t srcData = GET64(blitter_ram, SRCDATA), srcXtraData, dstData = GET64(blitter_ram, DSTDATA), writeData; - uint32 srcAddr, dstAddr; - uint8 bitCount, a1PixelSize, a2PixelSize; + uint32_t srcAddr, dstAddr; + uint8_t bitCount, a1PixelSize, a2PixelSize; // JTRM says phrase mode only works for 8BPP or higher, so let's try this... - uint32 phraseOffset[8] = { 8, 8, 8, 8, 4, 2, 0, 0 }; - uint8 pixelShift[8] = { 3, 2, 1, 0, 1, 2, 0, 0 }; + uint32_t phraseOffset[8] = { 8, 8, 8, 8, 4, 2, 0, 0 }; + uint8_t pixelShift[8] = { 3, 2, 1, 0, 1, 2, 0, 0 }; a1PixelSize = (blitter_ram[A1_FLAGS + 3] >> 3) & 0x07; a2PixelSize = (blitter_ram[A2_FLAGS + 3] >> 3) & 0x07; @@ -2009,7 +2049,7 @@ sread: // Source data read //pointing at. Likewise, the pixel (if in BPP 1, 2 & 4, chopped) otherwise. It probably still //transfers an entire phrase even in pixel mode. //Odd thought: Does it expand, e.g., 1 BPP pixels into 32 BPP internally? Hmm... -//No. +//No. /* a1_addr = REG(A1_BASE) & 0xFFFFFFF8; a2_addr = REG(A2_BASE) & 0xFFFFFFF8; @@ -2030,7 +2070,7 @@ sread: // Source data read a1_width = ((0x04 | m) << e) >> 2; a2_width = ((0x04 | m) << e) >> 2; - // write values back to registers + // write values back to registers WREG(A1_PIXEL, (a1_y & 0xFFFF0000) | ((a1_x >> 16) & 0xFFFF)); WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xFFFF)); WREG(A2_PIXEL, (a2_y & 0xFFFF0000) | ((a2_x >> 16) & 0xFFFF)); @@ -2049,10 +2089,10 @@ sread: // Source data read } else*/ { -// uint32 pixAddr = ((DSTA2 ? a1_x : a2_x) >> 16) +// uint32_t pixAddr = ((DSTA2 ? a1_x : a2_x) >> 16) // + (((DSTA2 ? a1_y : a2_y) >> 16) * (DSTA2 ? a1_width : a2_width)); - int32 pixAddr = (int16)((DSTA2 ? a1_x : a2_x) >> 16) - + ((int16)((DSTA2 ? a1_y : a2_y) >> 16) * (DSTA2 ? a1_width : a2_width)); + int32_t pixAddr = (int16_t)((DSTA2 ? a1_x : a2_x) >> 16) + + ((int16_t)((DSTA2 ? a1_y : a2_y) >> 16) * (DSTA2 ? a1_width : a2_width)); if ((DSTA2 ? a1PixelSize : a2PixelSize) < 3) pixAddr >>= pixelShift[(DSTA2 ? a1PixelSize : a2PixelSize)]; @@ -2066,8 +2106,8 @@ sread: // Source data read if ((DSTA2 ? a1_phrase_mode : a2_phrase_mode) == 1) { - srcData = ((uint64)JaguarReadLong(srcAddr, BLITTER) << 32) - | (uint64)JaguarReadLong(srcAddr + 4, BLITTER); + srcData = ((uint64_t)JaguarReadLong(srcAddr, BLITTER) << 32) + | (uint64_t)JaguarReadLong(srcAddr + 4, BLITTER); } else { @@ -2088,7 +2128,7 @@ sread: // Source data read #ifdef LOG_BLITTER_MEMORY_ACCESSES if (logBlit) - WriteLog("BLITTER: srcAddr=%08X, srcData=%08X %08X\n", srcAddr, (uint32)(srcData >> 32), (uint32)(srcData & 0xFFFFFFFF)); + WriteLog("BLITTER: srcAddr=%08X, srcData=%08X %08X\n", srcAddr, (uint32_t)(srcData >> 32), (uint32_t)(srcData & 0xFFFFFFFF)); #endif if (SRCENZ) @@ -2130,10 +2170,10 @@ if STEP dstAddr = (DSTA2 ? a2_addr : a1_addr); { -// uint32 pixAddr = ((DSTA2 ? a2_x : a1_x) >> 16) +// uint32_t pixAddr = ((DSTA2 ? a2_x : a1_x) >> 16) // + (((DSTA2 ? a2_y : a1_y) >> 16) * (DSTA2 ? a2_width : a1_width)); - int32 pixAddr = (int16)((DSTA2 ? a2_x : a1_x) >> 16) - + ((int16)((DSTA2 ? a2_y : a1_y) >> 16) * (DSTA2 ? a2_width : a1_width)); + int32_t pixAddr = (int16_t)((DSTA2 ? a2_x : a1_x) >> 16) + + ((int16_t)((DSTA2 ? a2_y : a1_y) >> 16) * (DSTA2 ? a2_width : a1_width)); if ((DSTA2 ? a2PixelSize : a1PixelSize) < 3) pixAddr >>= pixelShift[(DSTA2 ? a2PixelSize : a1PixelSize)]; @@ -2147,8 +2187,8 @@ if STEP if ((DSTA2 ? a2_phrase_mode : a1_phrase_mode) == 1) { - dstData = ((uint64)JaguarReadLong(srcAddr, BLITTER) << 32) - | (uint64)JaguarReadLong(srcAddr + 4, BLITTER); + dstData = ((uint64_t)JaguarReadLong(srcAddr, BLITTER) << 32) + | (uint64_t)JaguarReadLong(srcAddr + 4, BLITTER); } else { @@ -2169,7 +2209,7 @@ if STEP #ifdef LOG_BLITTER_MEMORY_ACCESSES if (logBlit) - WriteLog("BLITTER (dread): dstAddr=%08X, dstData=%08X %08X\n", dstAddr, (uint32)(dstData >> 32), (uint32)(dstData & 0xFFFFFFFF)); + WriteLog("BLITTER (dread): dstAddr=%08X, dstData=%08X %08X\n", dstAddr, (uint32_t)(dstData >> 32), (uint32_t)(dstData & 0xFFFFFFFF)); #endif if (DSTENZ) @@ -2238,14 +2278,14 @@ Blit! if (CLIPA1) { - uint16 x = a1_x >> 16, y = a1_y >> 16; + uint16_t x = a1_x >> 16, y = a1_y >> 16; if (x >= GET16(blitter_ram, A1_CLIP + 2) || y >= GET16(blitter_ram, A1_CLIP)) goto inhibitWrite; } // Figure out what gets written... - + if (PATDSEL) { writeData = GET64(blitter_ram, PATTERNDATA); @@ -2268,7 +2308,7 @@ Blit! else // LFUFUNC is the default... { writeData = 0; - + if (LFU_NAN) writeData |= ~srcData & ~dstData; if (LFU_NA) @@ -2294,10 +2334,10 @@ Blit! { /* dstAddr += ((DSTA2 ? a2_x : a1_x) >> 16) + (((DSTA2 ? a2_y : a1_y) >> 16) * (DSTA2 ? a2_width : a1_width));*/ -// uint32 pixAddr = ((DSTA2 ? a2_x : a1_x) >> 16) +// uint32_t pixAddr = ((DSTA2 ? a2_x : a1_x) >> 16) // + (((DSTA2 ? a2_y : a1_y) >> 16) * (DSTA2 ? a2_width : a1_width)); - int32 pixAddr = (int16)((DSTA2 ? a2_x : a1_x) >> 16) - + ((int16)((DSTA2 ? a2_y : a1_y) >> 16) * (DSTA2 ? a2_width : a1_width)); + int32_t pixAddr = (int16_t)((DSTA2 ? a2_x : a1_x) >> 16) + + ((int16_t)((DSTA2 ? a2_y : a1_y) >> 16) * (DSTA2 ? a2_width : a1_width)); if ((DSTA2 ? a2PixelSize : a1PixelSize) < 3) pixAddr >>= pixelShift[(DSTA2 ? a2PixelSize : a1PixelSize)]; @@ -2333,7 +2373,7 @@ Blit! #ifdef LOG_BLITTER_MEMORY_ACCESSES if (logBlit) - WriteLog("BLITTER: dstAddr=%08X, writeData=%08X %08X\n", dstAddr, (uint32)(writeData >> 32), (uint32)(writeData & 0xFFFFFFFF)); + WriteLog("BLITTER: dstAddr=%08X, writeData=%08X %08X\n", dstAddr, (uint32_t)(writeData >> 32), (uint32_t)(writeData & 0xFFFFFFFF)); #endif inhibitWrite://Should this go here? or on the other side of the X/Y incrementing? @@ -2370,7 +2410,7 @@ inhibitWrite://Should this go here? or on the other side of the X/Y incrementing a2_x += (blitter_ram[A2_FLAGS + 1] & 0x08 ? -1 << 16 : 1 << 16); /* else if ((blitter_ram[A2_FLAGS + 1] & 0x03) == 2) a2_x += 0 << 16; */ - + if (blitter_ram[A2_FLAGS + 1] & 0x04) a2_y += (blitter_ram[A2_FLAGS + 1] & 0x10 ? -1 << 16 : 1 << 16); @@ -2475,18 +2515,18 @@ a1fupdate A1 step fraction is added to A1 pointer fraction goto a1update */ /* -#define A1_PIXEL ((UINT32)0x0C) // Integer part of the pixel (Y.i and X.i) -#define A1_STEP ((UINT32)0x10) // Integer part of the step -#define A1_FSTEP ((UINT32)0x14) // Fractional part of the step -#define A1_FPIXEL ((UINT32)0x18) // Fractional part of the pixel (Y.f and X.f) +#define A1_PIXEL ((uint32_t)0x0C) // Integer part of the pixel (Y.i and X.i) +#define A1_STEP ((uint32_t)0x10) // Integer part of the step +#define A1_FSTEP ((uint32_t)0x14) // Fractional part of the step +#define A1_FPIXEL ((uint32_t)0x18) // Fractional part of the pixel (Y.f and X.f) */ // This is all kinda murky. All we have are the Midsummer docs to give us any guidance, // and it's incomplete or filled with errors (like above). Aarrrgggghhhhh! //This isn't right. Is it? I don't think the fractional parts are signed... -// a1_x += (int32)((int16)GET16(blitter_ram, A1_FSTEP + 2)); -// a1_y += (int32)((int16)GET16(blitter_ram, A1_FSTEP + 0)); +// a1_x += (int32_t)((int16_t)GET16(blitter_ram, A1_FSTEP + 2)); +// a1_y += (int32_t)((int16_t)GET16(blitter_ram, A1_FSTEP + 0)); a1_x += GET16(blitter_ram, A1_FSTEP + 2); a1_y += GET16(blitter_ram, A1_FSTEP + 0); @@ -2510,8 +2550,8 @@ else if UPDA2 goto a2update else if DATINIT goto init_if else restart inner */ - a1_x += (int32)(GET16(blitter_ram, A1_STEP + 2) << 16); - a1_y += (int32)(GET16(blitter_ram, A1_STEP + 0) << 16); + a1_x += (int32_t)(GET16(blitter_ram, A1_STEP + 2) << 16); + a1_y += (int32_t)(GET16(blitter_ram, A1_STEP + 0) << 16); //kill this, for now... @@ -2554,8 +2594,8 @@ a2update A2 step is added to the A2 pointer if DATINIT goto init_if else restart inner */ - a2_x += (int32)(GET16(blitter_ram, A2_STEP + 2) << 16); - a2_y += (int32)(GET16(blitter_ram, A2_STEP + 0) << 16); + a2_x += (int32_t)(GET16(blitter_ram, A2_STEP + 2) << 16); + a2_y += (int32_t)(GET16(blitter_ram, A2_STEP + 0) << 16); if (DATINIT) @@ -2625,50 +2665,54 @@ blitter_done: #ifdef USE_MIDSUMMER_BLITTER_MKII -void ADDRGEN(uint32 &, uint32 &, bool, bool, - uint16, uint16, uint32, uint8, uint8, uint8, uint8, - uint16, uint16, uint32, uint8, uint8, uint8, uint8); -void ADDARRAY(uint16 * addq, uint8 daddasel, uint8 daddbsel, uint8 daddmode, - uint64 dstd, uint32 iinc, uint8 initcin[], uint64 initinc, uint16 initpix, - uint32 istep, uint64 patd, uint64 srcd, uint64 srcz1, uint64 srcz2, - uint32 zinc, uint32 zstep); -void ADD16SAT(uint16 &r, uint8 &co, uint16 a, uint16 b, uint8 cin, bool sat, bool eightbit, bool hicinh); -void ADDAMUX(int16 &adda_x, int16 &adda_y, uint8 addasel, int16 a1_step_x, int16 a1_step_y, - int16 a1_stepf_x, int16 a1_stepf_y, int16 a2_step_x, int16 a2_step_y, - int16 a1_inc_x, int16 a1_inc_y, int16 a1_incf_x, int16 a1_incf_y, uint8 adda_xconst, +void ADDRGEN(uint32_t &, uint32_t &, bool, bool, + uint16_t, uint16_t, uint32_t, uint8_t, uint8_t, uint8_t, uint8_t, + uint16_t, uint16_t, uint32_t, uint8_t, uint8_t, uint8_t, uint8_t); +void ADDARRAY(uint16_t * addq, uint8_t daddasel, uint8_t daddbsel, uint8_t daddmode, + uint64_t dstd, uint32_t iinc, uint8_t initcin[], uint64_t initinc, uint16_t initpix, + uint32_t istep, uint64_t patd, uint64_t srcd, uint64_t srcz1, uint64_t srcz2, + uint32_t zinc, uint32_t zstep); +void ADD16SAT(uint16_t &r, uint8_t &co, uint16_t a, uint16_t b, uint8_t cin, bool sat, bool eightbit, bool hicinh); +void ADDAMUX(int16_t &adda_x, int16_t &adda_y, uint8_t addasel, int16_t a1_step_x, int16_t a1_step_y, + int16_t a1_stepf_x, int16_t a1_stepf_y, int16_t a2_step_x, int16_t a2_step_y, + int16_t a1_inc_x, int16_t a1_inc_y, int16_t a1_incf_x, int16_t a1_incf_y, uint8_t adda_xconst, bool adda_yconst, bool addareg, bool suba_x, bool suba_y); -void ADDBMUX(int16 &addb_x, int16 &addb_y, uint8 addbsel, int16 a1_x, int16 a1_y, - int16 a2_x, int16 a2_y, int16 a1_frac_x, int16 a1_frac_y); -void DATAMUX(int16 &data_x, int16 &data_y, uint32 gpu_din, int16 addq_x, int16 addq_y, bool addqsel); -void ADDRADD(int16 &addq_x, int16 &addq_y, bool a1fracldi, - uint16 adda_x, uint16 adda_y, uint16 addb_x, uint16 addb_y, uint8 modx, bool suba_x, bool suba_y); -void DATA(uint64 &wdata, uint8 &dcomp, uint8 &zcomp, bool &nowrite, - bool big_pix, bool cmpdst, uint8 daddasel, uint8 daddbsel, uint8 daddmode, bool daddq_sel, uint8 data_sel, - uint8 dbinh, uint8 dend, uint8 dstart, uint64 dstd, uint32 iinc, uint8 lfu_func, uint64 &patd, bool patdadd, - bool phrase_mode, uint64 srcd, bool srcdread, bool srczread, bool srcz2add, uint8 zmode, - bool bcompen, bool bkgwren, bool dcompen, uint8 icount, uint8 pixsize); -void COMP_CTRL(uint8 &dbinh, bool &nowrite, - bool bcompen, bool big_pix, bool bkgwren, uint8 dcomp, bool dcompen, uint8 icount, - uint8 pixsize, bool phrase_mode, uint8 srcd, uint8 zcomp); +void ADDBMUX(int16_t &addb_x, int16_t &addb_y, uint8_t addbsel, int16_t a1_x, int16_t a1_y, + int16_t a2_x, int16_t a2_y, int16_t a1_frac_x, int16_t a1_frac_y); +void DATAMUX(int16_t &data_x, int16_t &data_y, uint32_t gpu_din, int16_t addq_x, int16_t addq_y, bool addqsel); +void ADDRADD(int16_t &addq_x, int16_t &addq_y, bool a1fracldi, + uint16_t adda_x, uint16_t adda_y, uint16_t addb_x, uint16_t addb_y, uint8_t modx, bool suba_x, bool suba_y); +void DATA(uint64_t &wdata, uint8_t &dcomp, uint8_t &zcomp, bool &nowrite, + bool big_pix, bool cmpdst, uint8_t daddasel, uint8_t daddbsel, uint8_t daddmode, bool daddq_sel, uint8_t data_sel, + uint8_t dbinh, uint8_t dend, uint8_t dstart, uint64_t dstd, uint32_t iinc, uint8_t lfu_func, uint64_t &patd, bool patdadd, + bool phrase_mode, uint64_t srcd, bool srcdread, bool srczread, bool srcz2add, uint8_t zmode, + bool bcompen, bool bkgwren, bool dcompen, uint8_t icount, uint8_t pixsize, + uint64_t &srcz, uint64_t dstz, uint32_t zinc); +void COMP_CTRL(uint8_t &dbinh, bool &nowrite, + bool bcompen, bool big_pix, bool bkgwren, uint8_t dcomp, bool dcompen, uint8_t icount, + uint8_t pixsize, bool phrase_mode, uint8_t srcd, uint8_t zcomp); #define VERBOSE_BLITTER_LOGGING -bool logBlit = false; void BlitterMidsummer2(void) { +#ifdef LOG_BLITS + LogBlit(); +#endif + if (startConciseBlitLogging) + LogBlit(); + // Here's what the specs say the state machine does. Note that this can probably be // greatly simplified (also, it's different from what John has in his Oberon docs): //Will remove stuff that isn't in Jaguar I once fully described (stuff like texture won't //be described here at all)... - uint32 cmd = GET32(blitter_ram, COMMAND); + uint32_t cmd = GET32(blitter_ram, COMMAND); -// $01800005 has SRCENX, may have to investigate further... -// $00011008 has GOURD & DSTEN. -// $41802F41 has SRCSHADE, CLIPA1 -/*logBlit = false; +#if 0 +logBlit = false; if ( cmd != 0x00010200 && // PATDSEL - cmd != 0x01800001 + cmd != 0x01800001 // SRCEN LFUFUNC=C && cmd != 0x01800005 //Boot ROM ATARI letters: && cmd != 0x00011008 // DSTEN GOURD PATDSEL @@ -2683,7 +2727,7 @@ if ( //Static pic on title screen: && cmd != 0x01800601 // SRCEN UPDA1 UPDA2 LFUFUNC=C //Turning letters on Cybermorph intro screen: - && cmd != 0x09800F41 // SRCEN CLIP_A1 UPDA1 UPDA1F UPDA2 DSTA2 LFUFUNC=C DCOMPEN +// && cmd != 0x09800F41 // SRCEN CLIP_A1 UPDA1 UPDA1F UPDA2 DSTA2 LFUFUNC=C DCOMPEN && cmd != 0x00113078 // DSTEN DSTENZ DSTWRZ CLIP_A1 GOURD GOURZ PATDSEL ZMODE=4 && cmd != 0x09900F39 // SRCEN DSTEN DSTENZ DSTWRZ UPDA1 UPDA1F UPDA2 DSTA2 ZMODE=4 LFUFUNC=C DCOMPEN && cmd != 0x09800209 // SRCEN DSTEN UPDA1 LFUFUNC=C DCOMPEN @@ -2692,16 +2736,33 @@ if ( && cmd != 0x00010000 // PATDSEL //Hover Strike text: && cmd != 0x1401060C // SRCENX DSTEN UPDA1 UPDA2 PATDSEL BCOMPEN BKGWREN +//Hover Strike 3D stuff + && cmd != 0x01902839 // SRCEN DSTEN DSTENZ DSTWRZ DSTA2 GOURZ ZMODE=4 LFUFUNC=C +//Hover Strike darkening on intro to play (briefing) screen + && cmd != 0x00020208 // DSTEN UPDA1 ADDDSEL //Trevor McFur stuff: && cmd != 0x05810601 // SRCEN UPDA1 UPDA2 PATDSEL BCOMPEN && cmd != 0x01800201 // SRCEN UPDA1 LFUFUNC=C //T2K: && cmd != 0x00011000 // GOURD PATDSEL && cmd != 0x00011040 // CLIP_A1 GOURD PATDSEL +//Checkered flag: + && cmd != 0x01800000 // LFUFUNC=C + && cmd != 0x01800401 // + && cmd != 0x01800040 // + && cmd != 0x00020008 // +// && cmd != 0x09800F41 // SRCEN CLIP_A1 UPDA1 UPDA1F UPDA2 DSTA2 LFUFUNC=C DCOMPEN ) logBlit = true;//*/ +#else +logBlit = true; +#endif if (blit_start_log == 0) // Wait for the signal... logBlit = false;//*/ +//temp, for testing... +/*if (cmd != 0x49820609) + logBlit = false;//*/ + /* Some T2K unique blits: logBlit = F, cmd = 00010200 * @@ -2709,6 +2770,17 @@ logBlit = F, cmd = 00011000 logBlit = F, cmd = 00011040 logBlit = F, cmd = 01800005 * logBlit = F, cmd = 09800741 * + +Hover Strike mission selection screen: +Blit! (CMD = 01902839) // SRCEN DSTEN DSTENZ DSTWRZ DSTA2 GOURZ ZMODE=4 LFUFUNC=C + +Checkered Flag blits in the screw up zone: +Blit! (CMD = 01800001) // SRCEN LFUFUNC=C +Blit! (CMD = 01800000) // LFUFUNC=C +Blit! (CMD = 00010000) // PATDSEL + +Wolfenstein 3D in the fuckup zone: +Blit! (CMD = 01800000) // LFUFUNC=C */ //printf("logBlit = %s, cmd = %08X\n", (logBlit ? "T" : "F"), cmd); @@ -2744,7 +2816,7 @@ if (cmd == 0x00011040 patdsel = (PATDSEL), adddsel = (ADDDSEL), cmpdst = (CMPDST), bcompen = (BCOMPEN), dcompen = (DCOMPEN), bkgwren = (BKGWREN), srcshade = (SRCSHADE); - uint8 zmode = (cmd & 0x01C0000) >> 18, lfufunc = (cmd & 0x1E00000) >> 21; + uint8_t zmode = (cmd & 0x01C0000) >> 18, lfufunc = (cmd & 0x1E00000) >> 21; //Missing: BUSHI //Where to find various lines: // clip_a1 -> inner @@ -2760,28 +2832,27 @@ if (cmd == 0x00011040 #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -char zfs[512], lfus[512]; -zfs[0] = lfus[0] = 0; -if (dstwrz || dstenz || gourz) - sprintf(zfs, " ZMODE=%X", zmode); -if (!(patdsel || adddsel)) - sprintf(lfus, " LFUFUNC=%X", lfufunc); -printf("\nBlit! (CMD = %08X)\nFlags:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", cmd, - (srcen ? " SRCEN" : ""), (srcenx ? " SRCENX" : ""), (srcenz ? " SRCENZ" : ""), - (dsten ? " DSTEN" : ""), (dstenz ? " DSTENZ" : ""), (dstwrz ? " DSTWRZ" : ""), - (clip_a1 ? " CLIP_A1" : ""), (upda1 ? " UPDA1" : ""), (upda1f ? " UPDA1F" : ""), - (upda2 ? " UPDA2" : ""), (dsta2 ? " DSTA2" : ""), (gourd ? " GOURD" : ""), - (gourz ? " GOURZ" : ""), (topben ? " TOPBEN" : ""), (topnen ? " TOPNEN" : ""), - (patdsel ? " PATDSEL" : ""), (adddsel ? " ADDDSEL" : ""), zfs, lfus, (cmpdst ? " CMPDST" : ""), - (bcompen ? " BCOMPEN" : ""), (dcompen ? " DCOMPEN" : ""), (bkgwren ? " BKGWREN" : ""), - (srcshade ? " SRCSHADE" : "")); -printf(" count = %d x %d\n", GET16(blitter_ram, PIXLINECOUNTER + 2), GET16(blitter_ram, PIXLINECOUNTER)); -fflush(stdout); + char zfs[512], lfus[512]; + zfs[0] = lfus[0] = 0; + if (dstwrz || dstenz || gourz) + sprintf(zfs, " ZMODE=%X", zmode); + if (!(patdsel || adddsel)) + sprintf(lfus, " LFUFUNC=%X", lfufunc); + WriteLog("\nBlit! (CMD = %08X)\nFlags:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", cmd, + (srcen ? " SRCEN" : ""), (srcenx ? " SRCENX" : ""), (srcenz ? " SRCENZ" : ""), + (dsten ? " DSTEN" : ""), (dstenz ? " DSTENZ" : ""), (dstwrz ? " DSTWRZ" : ""), + (clip_a1 ? " CLIP_A1" : ""), (upda1 ? " UPDA1" : ""), (upda1f ? " UPDA1F" : ""), + (upda2 ? " UPDA2" : ""), (dsta2 ? " DSTA2" : ""), (gourd ? " GOURD" : ""), + (gourz ? " GOURZ" : ""), (topben ? " TOPBEN" : ""), (topnen ? " TOPNEN" : ""), + (patdsel ? " PATDSEL" : ""), (adddsel ? " ADDDSEL" : ""), zfs, lfus, (cmpdst ? " CMPDST" : ""), + (bcompen ? " BCOMPEN" : ""), (dcompen ? " DCOMPEN" : ""), (bkgwren ? " BKGWREN" : ""), + (srcshade ? " SRCSHADE" : "")); + WriteLog(" count = %d x %d\n", GET16(blitter_ram, PIXLINECOUNTER + 2), GET16(blitter_ram, PIXLINECOUNTER)); } #endif // Lines that don't exist in Jaguar I (and will never be asserted) - + bool polygon = false, datinit = false, a1_stepld = false, a2_stepld = false, ext_int = false; bool istepadd = false, istepfadd = false, finneradd = false, inneradd = false; bool zstepfadd = false, zstepadd = false; @@ -2801,57 +2872,57 @@ fflush(stdout); // Various registers set up by user - uint16 ocount = GET16(blitter_ram, PIXLINECOUNTER); - uint8 a1_pitch = blitter_ram[A1_FLAGS + 3] & 0x03; - uint8 a2_pitch = blitter_ram[A2_FLAGS + 3] & 0x03; - uint8 a1_pixsize = (blitter_ram[A1_FLAGS + 3] & 0x38) >> 3; - uint8 a2_pixsize = (blitter_ram[A2_FLAGS + 3] & 0x38) >> 3; - uint8 a1_zoffset = (GET16(blitter_ram, A1_FLAGS + 2) >> 6) & 0x07; - uint8 a2_zoffset = (GET16(blitter_ram, A2_FLAGS + 2) >> 6) & 0x07; - uint8 a1_width = (blitter_ram[A1_FLAGS + 2] >> 1) & 0x3F; - uint8 a2_width = (blitter_ram[A2_FLAGS + 2] >> 1) & 0x3F; + uint16_t ocount = GET16(blitter_ram, PIXLINECOUNTER); + uint8_t a1_pitch = blitter_ram[A1_FLAGS + 3] & 0x03; + uint8_t a2_pitch = blitter_ram[A2_FLAGS + 3] & 0x03; + uint8_t a1_pixsize = (blitter_ram[A1_FLAGS + 3] & 0x38) >> 3; + uint8_t a2_pixsize = (blitter_ram[A2_FLAGS + 3] & 0x38) >> 3; + uint8_t a1_zoffset = (GET16(blitter_ram, A1_FLAGS + 2) >> 6) & 0x07; + uint8_t a2_zoffset = (GET16(blitter_ram, A2_FLAGS + 2) >> 6) & 0x07; + uint8_t a1_width = (blitter_ram[A1_FLAGS + 2] >> 1) & 0x3F; + uint8_t a2_width = (blitter_ram[A2_FLAGS + 2] >> 1) & 0x3F; bool a2_mask = blitter_ram[A2_FLAGS + 2] & 0x80; - uint8 a1addx = blitter_ram[A1_FLAGS + 1] & 0x03, a2addx = blitter_ram[A2_FLAGS + 1] & 0x03; + uint8_t a1addx = blitter_ram[A1_FLAGS + 1] & 0x03, a2addx = blitter_ram[A2_FLAGS + 1] & 0x03; bool a1addy = blitter_ram[A1_FLAGS + 1] & 0x04, a2addy = blitter_ram[A2_FLAGS + 1] & 0x04; bool a1xsign = blitter_ram[A1_FLAGS + 1] & 0x08, a2xsign = blitter_ram[A2_FLAGS + 1] & 0x08; bool a1ysign = blitter_ram[A1_FLAGS + 1] & 0x10, a2ysign = blitter_ram[A2_FLAGS + 1] & 0x10; - uint32 a1_base = GET32(blitter_ram, A1_BASE) & 0xFFFFFFF8; // Phrase aligned by ignoring bottom 3 bits - uint32 a2_base = GET32(blitter_ram, A2_BASE) & 0xFFFFFFF8; - - uint16 a1_win_x = GET16(blitter_ram, A1_CLIP + 2) & 0x7FFF; - uint16 a1_win_y = GET16(blitter_ram, A1_CLIP + 0) & 0x7FFF; - int16 a1_x = (int16)GET16(blitter_ram, A1_PIXEL + 2); - int16 a1_y = (int16)GET16(blitter_ram, A1_PIXEL + 0); - int16 a1_step_x = (int16)GET16(blitter_ram, A1_STEP + 2); - int16 a1_step_y = (int16)GET16(blitter_ram, A1_STEP + 0); - uint16 a1_stepf_x = GET16(blitter_ram, A1_FSTEP + 2); - uint16 a1_stepf_y = GET16(blitter_ram, A1_FSTEP + 0); - uint16 a1_frac_x = GET16(blitter_ram, A1_FPIXEL + 2); - uint16 a1_frac_y = GET16(blitter_ram, A1_FPIXEL + 0); - int16 a1_inc_x = (int16)GET16(blitter_ram, A1_INC + 2); - int16 a1_inc_y = (int16)GET16(blitter_ram, A1_INC + 0); - uint16 a1_incf_x = GET16(blitter_ram, A1_FINC + 2); - uint16 a1_incf_y = GET16(blitter_ram, A1_FINC + 0); - - int16 a2_x = (int16)GET16(blitter_ram, A2_PIXEL + 2); - int16 a2_y = (int16)GET16(blitter_ram, A2_PIXEL + 0); - uint16 a2_mask_x = GET16(blitter_ram, A2_MASK + 2); - uint16 a2_mask_y = GET16(blitter_ram, A2_MASK + 0); - int16 a2_step_x = (int16)GET16(blitter_ram, A2_STEP + 2); - int16 a2_step_y = (int16)GET16(blitter_ram, A2_STEP + 0); - - uint64 srcd1 = GET64(blitter_ram, SRCDATA); - uint64 srcd2 = 0; - uint64 dstd = GET64(blitter_ram, DSTDATA); - uint64 patd = GET64(blitter_ram, PATTERNDATA); - uint32 iinc = GET32(blitter_ram, INTENSITYINC); - uint64 srcz1 = GET64(blitter_ram, SRCZINT); - uint64 srcz2 = GET64(blitter_ram, SRCZFRAC); - uint64 dstz = GET64(blitter_ram, DSTZ); - uint32 zinc = GET32(blitter_ram, ZINC); - uint32 collision = GET32(blitter_ram, COLLISIONCTRL);// 0=RESUME, 1=ABORT, 2=STOPEN - - uint8 pixsize = (dsta2 ? a2_pixsize : a1_pixsize); // From ACONTROL + uint32_t a1_base = GET32(blitter_ram, A1_BASE) & 0xFFFFFFF8; // Phrase aligned by ignoring bottom 3 bits + uint32_t a2_base = GET32(blitter_ram, A2_BASE) & 0xFFFFFFF8; + + uint16_t a1_win_x = GET16(blitter_ram, A1_CLIP + 2) & 0x7FFF; + uint16_t a1_win_y = GET16(blitter_ram, A1_CLIP + 0) & 0x7FFF; + int16_t a1_x = (int16_t)GET16(blitter_ram, A1_PIXEL + 2); + int16_t a1_y = (int16_t)GET16(blitter_ram, A1_PIXEL + 0); + int16_t a1_step_x = (int16_t)GET16(blitter_ram, A1_STEP + 2); + int16_t a1_step_y = (int16_t)GET16(blitter_ram, A1_STEP + 0); + uint16_t a1_stepf_x = GET16(blitter_ram, A1_FSTEP + 2); + uint16_t a1_stepf_y = GET16(blitter_ram, A1_FSTEP + 0); + uint16_t a1_frac_x = GET16(blitter_ram, A1_FPIXEL + 2); + uint16_t a1_frac_y = GET16(blitter_ram, A1_FPIXEL + 0); + int16_t a1_inc_x = (int16_t)GET16(blitter_ram, A1_INC + 2); + int16_t a1_inc_y = (int16_t)GET16(blitter_ram, A1_INC + 0); + uint16_t a1_incf_x = GET16(blitter_ram, A1_FINC + 2); + uint16_t a1_incf_y = GET16(blitter_ram, A1_FINC + 0); + + int16_t a2_x = (int16_t)GET16(blitter_ram, A2_PIXEL + 2); + int16_t a2_y = (int16_t)GET16(blitter_ram, A2_PIXEL + 0); + uint16_t a2_mask_x = GET16(blitter_ram, A2_MASK + 2); + uint16_t a2_mask_y = GET16(blitter_ram, A2_MASK + 0); + int16_t a2_step_x = (int16_t)GET16(blitter_ram, A2_STEP + 2); + int16_t a2_step_y = (int16_t)GET16(blitter_ram, A2_STEP + 0); + + uint64_t srcd1 = GET64(blitter_ram, SRCDATA); + uint64_t srcd2 = 0; + uint64_t dstd = GET64(blitter_ram, DSTDATA); + uint64_t patd = GET64(blitter_ram, PATTERNDATA); + uint32_t iinc = GET32(blitter_ram, INTENSITYINC); + uint64_t srcz1 = GET64(blitter_ram, SRCZINT); + uint64_t srcz2 = GET64(blitter_ram, SRCZFRAC); + uint64_t dstz = GET64(blitter_ram, DSTZ); + uint32_t zinc = GET32(blitter_ram, ZINC); + uint32_t collision = GET32(blitter_ram, COLLISIONCTRL);// 0=RESUME, 1=ABORT, 2=STOPEN + + uint8_t pixsize = (dsta2 ? a2_pixsize : a1_pixsize); // From ACONTROL //Testing Trevor McFur--I *think* it's the circle on the lower RHS of the screen... /*logBlit = false; @@ -2906,7 +2977,7 @@ if ((cmd == 0x00010200) && (GET16(blitter_ram, PIXLINECOUNTER + 2) == 9)) ; Pink altimeter bar Blit! (00110000 <- 000BF010) count: 9 x 23, A1/2_FLAGS: 000042E2/00010020 [cmd: 00010200] - CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: + CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: A1 step values: -10 (X), 1 (Y) A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD A2 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 1 (00), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -2917,7 +2988,7 @@ Blit! (00110000 <- 000BF010) count: 9 x 23, A1/2_FLAGS: 000042E2/00010020 [cmd: ; Black altimeter bar Blit! (00110000 <- 000BF010) count: 5 x 29, A1/2_FLAGS: 000042E2/00010020 [cmd: 00010200] - CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: + CMD -> src: dst: misc: a1ctl: UPDA1 mode: ity: PATDSEL z-op: op: LFU_CLEAR ctrl: A1 step values: -8 (X), 1 (Y) A1 -> pitch: 4 phrases, depth: 16bpp, z-off: 3, width: 320 (21), addctl: XADDPHR YADD0 XSIGNADD YSIGNADD A2 -> pitch: 1 phrases, depth: 16bpp, z-off: 0, width: 1 (00), addctl: XADDPIX YADD0 XSIGNADD YSIGNADD @@ -2961,70 +3032,66 @@ Flags: UPDA1 PATDSEL */ // Bugs in Jaguar I - + a2addy = a1addy; // A2 channel Y add bit is tied to A1's //if (logBlit && (ocount > 20)) logBlit = false; #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" a1_base = %08X, a2_base = %08X\n", a1_base, a2_base); -printf(" a1_x = %04X, a1_y = %04X, a1_frac_x = %04X, a1_frac_y = %04X, a2_x = %04X, a2_y = %04X\n", (uint16)a1_x, (uint16)a1_y, a1_frac_x, a1_frac_y, (uint16)a2_x, (uint16)a2_y); -printf(" a1_step_x = %04X, a1_step_y = %04X, a1_stepf_x = %04X, a1_stepf_y = %04X, a2_step_x = %04X, a2_step_y = %04X\n", (uint16)a1_step_x, (uint16)a1_step_y, a1_stepf_x, a1_stepf_y, (uint16)a2_step_x, (uint16)a2_step_y); -printf(" a1_inc_x = %04X, a1_inc_y = %04X, a1_incf_x = %04X, a1_incf_y = %04X\n", (uint16)a1_inc_x, (uint16)a1_inc_y, a1_incf_x, a1_incf_y); -printf(" a1_win_x = %04X, a1_win_y = %04X, a2_mask_x = %04X, a2_mask_y = %04X\n", a1_win_x, a1_win_y, a2_mask_x, a2_mask_y); -char x_add_str[4][4] = { "phr", "1", "0", "inc" }; -printf(" a2_mask=%s a1add=%s%s/%s%s a2add=%s%s/%s%s\n", (a2_mask ? "T" : "F"), (a1xsign ? "-" : "+"), x_add_str[a1addx], - (a1ysign ? "-" : "+"), (a1addy ? "1" : "0"), (a2xsign ? "-" : "+"), x_add_str[a2addx], - (a2ysign ? "-" : "+"), (a2addy ? "1" : "0")); -printf(" a1_pixsize = %u, a2_pixsize = %u\n", a1_pixsize, a2_pixsize); -printf(" srcd=%08X%08X dstd=%08X%08X patd=%08X%08X iinc=%08X\n", - (uint32)(srcd1 >> 32), (uint32)(srcd1 & 0xFFFFFFFF), - (uint32)(dstd >> 32), (uint32)(dstd & 0xFFFFFFFF), - (uint32)(patd >> 32), (uint32)(patd & 0xFFFFFFFF), iinc); -printf(" srcz1=%08X%08X srcz2=%08X%08X dstz=%08X%08X zinc=%08X, coll=%X\n", - (uint32)(srcz1 >> 32), (uint32)(srcz1 & 0xFFFFFFFF), - (uint32)(srcz2 >> 32), (uint32)(srcz2 & 0xFFFFFFFF), - (uint32)(dstz >> 32), (uint32)(dstz & 0xFFFFFFFF), zinc, collision); + WriteLog(" a1_base = %08X, a2_base = %08X\n", a1_base, a2_base); + WriteLog(" a1_x = %04X, a1_y = %04X, a1_frac_x = %04X, a1_frac_y = %04X, a2_x = %04X, a2_y = %04X\n", (uint16_t)a1_x, (uint16_t)a1_y, a1_frac_x, a1_frac_y, (uint16_t)a2_x, (uint16_t)a2_y); + WriteLog(" a1_step_x = %04X, a1_step_y = %04X, a1_stepf_x = %04X, a1_stepf_y = %04X, a2_step_x = %04X, a2_step_y = %04X\n", (uint16_t)a1_step_x, (uint16_t)a1_step_y, a1_stepf_x, a1_stepf_y, (uint16_t)a2_step_x, (uint16_t)a2_step_y); + WriteLog(" a1_inc_x = %04X, a1_inc_y = %04X, a1_incf_x = %04X, a1_incf_y = %04X\n", (uint16_t)a1_inc_x, (uint16_t)a1_inc_y, a1_incf_x, a1_incf_y); + WriteLog(" a1_win_x = %04X, a1_win_y = %04X, a2_mask_x = %04X, a2_mask_y = %04X\n", a1_win_x, a1_win_y, a2_mask_x, a2_mask_y); + char x_add_str[4][4] = { "phr", "1", "0", "inc" }; + WriteLog(" a2_mask=%s a1add=%s%s/%s%s a2add=%s%s/%s%s\n", (a2_mask ? "T" : "F"), (a1xsign ? "-" : "+"), x_add_str[a1addx], + (a1ysign ? "-" : "+"), (a1addy ? "1" : "0"), (a2xsign ? "-" : "+"), x_add_str[a2addx], + (a2ysign ? "-" : "+"), (a2addy ? "1" : "0")); + WriteLog(" a1_pixsize = %u, a2_pixsize = %u\n", a1_pixsize, a2_pixsize); + WriteLog(" srcd=%08X%08X dstd=%08X%08X patd=%08X%08X iinc=%08X\n", + (uint32_t)(srcd1 >> 32), (uint32_t)(srcd1 & 0xFFFFFFFF), + (uint32_t)(dstd >> 32), (uint32_t)(dstd & 0xFFFFFFFF), + (uint32_t)(patd >> 32), (uint32_t)(patd & 0xFFFFFFFF), iinc); + WriteLog(" srcz1=%08X%08X srcz2=%08X%08X dstz=%08X%08X zinc=%08X, coll=%X\n", + (uint32_t)(srcz1 >> 32), (uint32_t)(srcz1 & 0xFFFFFFFF), + (uint32_t)(srcz2 >> 32), (uint32_t)(srcz2 & 0xFFFFFFFF), + (uint32_t)(dstz >> 32), (uint32_t)(dstz & 0xFFFFFFFF), zinc, collision); } -#endif +#endif // Various state lines set up by user bool phrase_mode = ((!dsta2 && a1addx == 0) || (dsta2 && a2addx == 0) ? true : false); // From ACONTROL #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Phrase mode is %s\n", (phrase_mode ? "ON" : "off")); -fflush(stdout); -} + WriteLog(" Phrase mode is %s\n", (phrase_mode ? "ON" : "off")); #endif //logBlit = false; // Stopgap vars to simulate various lines - uint16 a1FracCInX = 0, a1FracCInY = 0; + uint16_t a1FracCInX = 0, a1FracCInY = 0; while (true) { // IDLE - + if ((idle && !go) || (inner && outer0 && indone)) { #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Entering IDLE state...\n"); -fflush(stdout); -} + WriteLog(" Entering IDLE state...\n"); #endif idlei = true; - return; +//Instead of a return, let's try breaking out of the loop... +break; +// return; } else idlei = false; - + // INNER LOOP ACTIVE /* Entering DWRITE state... (icount=0000, inc=4) @@ -3035,7 +3102,7 @@ fflush(stdout); Now: [in=F a1f=F a1=F zf=F z=F a2=F iif=F iii=F izf=F izi=F] */ - + if ((idle && go && !datinit) || (inner && !indone) || (inner && indone && !outer0 && !upda1f && !upda1 && notgzandp && !upda2 && !datinit) @@ -3049,9 +3116,9 @@ Now: } else inneri = false; - + // A1 FRACTION UPDATE - + if (inner && indone && !outer0 && upda1f) { a1fupdatei = true; @@ -3098,9 +3165,9 @@ Now: } else a2updatei = false; - + // INITIALIZE INTENSITY FRACTION - + if ((zupdate && !upda2 && datinit) || (a1update && !upda2 && datinit && notgzandp) || (inner && indone && !outer0 && !upda1f && !upda1 && notgzandp && !upda2 && datinit) @@ -3111,34 +3178,34 @@ Now: } else init_ifi = false; - + // INITIALIZE INTENSITY INTEGER - + if (init_if) { init_iii = true; } else init_iii = false; - + // INITIALIZE Z FRACTION - + if (init_ii && gourz) { init_zfi = true; } else init_zfi = false; - + // INITIALIZE Z INTEGER - + if (init_zf) { init_zii = true; } else init_zii = false; - + // Here we move the fooi into their foo counterparts in order to simulate the moving // of data into the various FDSYNCs... Each time we loop we simulate one clock cycle... @@ -3156,13 +3223,11 @@ Now: // * denotes states that will never assert for Jaguar I #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" [in=%c a1f=%c a1=%c zf=%c z=%c a2=%c iif=%c iii=%c izf=%c izi=%c]\n", - (inner ? 'T' : 'F'), (a1fupdate ? 'T' : 'F'), (a1update ? 'T' : 'F'), (zfupdate ? 'T' : 'F'), - (zupdate ? 'T' : 'F'), (a2update ? 'T' : 'F'), (init_if ? 'T' : 'F'), (init_ii ? 'T' : 'F'), - (init_zf ? 'T' : 'F'), (init_zi ? 'T' : 'F')); -fflush(stdout); -} + WriteLog(" [in=%c a1f=%c a1=%c zf=%c z=%c a2=%c iif=%c iii=%c izf=%c izi=%c]\n", + (inner ? 'T' : 'F'), (a1fupdate ? 'T' : 'F'), (a1update ? 'T' : 'F'), + (zfupdate ? 'T' : 'F'), (zupdate ? 'T' : 'F'), (a2update ? 'T' : 'F'), + (init_if ? 'T' : 'F'), (init_ii ? 'T' : 'F'), (init_zf ? 'T' : 'F'), + (init_zi ? 'T' : 'F')); #endif // Now, depending on how we want to handle things, we could either put the implementation @@ -3175,12 +3240,9 @@ fflush(stdout); indone = false; #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Entering INNER state...\n"); -fflush(stdout); -} + WriteLog(" Entering INNER state...\n"); #endif - uint16 icount = GET16(blitter_ram, PIXLINECOUNTER + 2); + uint16_t icount = GET16(blitter_ram, PIXLINECOUNTER + 2); bool idle_inner = true, step = true, sreadx = false, szreadx = false, sread = false, szread = false, dread = false, dzread = false, dwrite = false, dzwrite = false; bool inner0 = false; @@ -3191,7 +3253,7 @@ fflush(stdout); bool textext = false, txtread = false; //other stuff -uint8 srcshift = 0; +uint8_t srcshift = 0; bool sshftld = true; // D flipflop (D -> Q): instart -> sshftld //NOTE: sshftld probably is only asserted at the beginning of the inner loop. !!! FIX !!! /* @@ -3233,10 +3295,7 @@ Flags: SRCEN SRCENX LFUFUNC=C { #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Entering IDLE_INNER state...\n"); -fflush(stdout); -} + WriteLog(" Entering IDLE_INNER state...\n"); #endif idle_inneri = true; break; @@ -3376,7 +3435,7 @@ sshftld = idle_inner; bool dsta_addi = (dwritei && !dstwrz) || dzwritei; bool gensrc = sreadxi || szreadxi || sreadi || szreadi; - bool gendst = dreadi || szreadi || dwritei || dzwritei; + bool gendst = dreadi || dzreadi || dwritei || dzwritei; bool gena2i = (gensrc && !dsta2) || (gendst && dsta2); bool zaddr = szreadx || szread || dzread || dzwrite; @@ -3414,7 +3473,7 @@ bit 0 = /a2update . ( a1fupdate The /a2update term on bits 0 and 1 is redundant. Now look-ahead based */ - uint8 addasel = (a1fupdate || (a1_add && a1addx == 3) ? 0x01 : 0x00); + uint8_t addasel = (a1fupdate || (a1_add && a1addx == 3) ? 0x01 : 0x00); addasel |= (a1_add && a1addx == 3 ? 0x02 : 0x00); addasel |= (a2update ? 0x04 : 0x00); /* Address adder input A X constant selection @@ -3429,7 +3488,7 @@ for A1 similarly for A2 JLH: Also, 11 will likewise set the value to 111 */ - uint8 a1_xconst = 6 - a1_pixsize, a2_xconst = 6 - a2_pixsize; + uint8_t a1_xconst = 6 - a1_pixsize, a2_xconst = 6 - a2_pixsize; if (a1addx == 1) a1_xconst = 0; @@ -3441,7 +3500,7 @@ JLH: Also, 11 will likewise set the value to 111 else if (a2addx & 0x02) a2_xconst = 7; - uint8 adda_xconst = (a2_add ? a2_xconst : a1_xconst); + uint8_t adda_xconst = (a2_add ? a2_xconst : a1_xconst); /* Address adder input A Y constant selection 22 June 94 - This was erroneous, because only the a1addy bit was reflected here. Therefore, the selection has to be controlled by a bug fix bit. @@ -3477,7 +3536,7 @@ Bit 0 = a2update + a2_add + a1update . a1_stepld + a2update . a2_stepld */ - uint8 addbsel = (a2update || a2_add || (a1fupdate && a1_stepld) + uint8_t addbsel = (a2update || a2_add || (a1fupdate && a1_stepld) || (a1update && a1_stepld) || (a2update && a2_stepld) ? 0x01 : 0x00); addbsel |= (a1fupdate || (a1_add && a1addx == 3) || (a1fupdate && a1_stepld) || (a1update && a1_stepld) || (a2update && a2_stepld) ? 0x02 : 0x00); @@ -3493,9 +3552,9 @@ it is being updated by one phrase Masking is enabled for a1 when a1addx[0..1] is 00, and the value is 6 - the pixel size (again!) */ - uint8 maska1 = (a1_add && a1addx == 0 ? 6 - a1_pixsize : 0); - uint8 maska2 = (a2_add && a2addx == 0 ? 6 - a2_pixsize : 0); - uint8 modx = (a2_add ? maska2 : maska1); + uint8_t maska1 = (a1_add && a1addx == 0 ? 6 - a1_pixsize : 0); + uint8_t maska2 = (a2_add && a2addx == 0 ? 6 - a2_pixsize : 0); + uint8_t modx = (a2_add ? maska2 : maska1); /* Generate load strobes for the increment updates */ /*A1pldt := NAN2 (a1pldt, atick[1], a1_add); @@ -3535,7 +3594,7 @@ Bit 1 = dzwrite . gourz . (atick[0] + atick[1]) Bit 2 = (gourd + gourz) . /(init_if + init_ii + init_zf + init_zi) + dwrite . srcshade */ -uint8 daddasel = ((dwrite && gourd) || (dzwrite && gourz) || istepadd || zstepfadd +uint8_t daddasel = ((dwrite && gourd) || (dzwrite && gourz) || istepadd || zstepfadd || init_if || init_ii || init_zf || init_zi ? 0x01 : 0x00); daddasel |= ((dzwrite && gourz) || zstepadd || zstepfadd ? 0x02 : 0x00); daddasel |= (((gourd || gourz) && !(init_if || init_ii || init_zf || init_zi)) @@ -3567,7 +3626,7 @@ Bit 2 = dwrite . gourd . (atick[0] + atick[1]) + istepadd + istepfadd + zstepadd + zstepfadd Bit 3 = istepadd + istepfadd + zstepadd + zstepfadd */ -uint8 daddbsel = ((dwrite && gourd) || (dzwrite && gourz) || (dwrite && srcshade) +uint8_t daddbsel = ((dwrite && gourd) || (dzwrite && gourz) || (dwrite && srcshade) || istepadd || zstepadd || init_if || init_ii || init_zf || init_zi ? 0x01 : 0x00); daddbsel |= ((dzwrite && gourz) || zstepadd || zstepfadd ? 0x02 : 0x00); daddbsel |= ((dwrite && gourd) || (dzwrite && gourz) || (dwrite && srcshade) @@ -3576,14 +3635,14 @@ daddbsel |= (istepadd && istepfadd && zstepadd && zstepfadd ? 0x08 : 0x00); /* Data adder mode control 000 16-bit normal add 001 16-bit saturating add with carry -010 8-bit saturating add with carry, carry into top byte is +010 8-bit saturating add with carry, carry into top byte is inhibited (YCrCb) -011 8-bit saturating add with carry, carry into top byte and +011 8-bit saturating add with carry, carry into top byte and between top nybbles is inhibited (CRY) 100 16-bit normal add with carry 101 16-bit saturating add 110 8-bit saturating add, carry into top byte is inhibited -111 8-bit saturating add, carry into top byte and between top +111 8-bit saturating add, carry into top byte and between top nybbles is inhibited The first five are used for Gouraud calculations, the latter three @@ -3602,7 +3661,7 @@ Bit 0 = dzwrite . gourz . atick[1] + init_ii . /topnen . /topben . /ext_int + init_ii . topnen . topben . /ext_int + init_zi - + Bit 1 = dwrite . gourd . atick[1] . /topben . /ext_int + istepadd . /topben . /ext_int + /gourd . /gourz . /topben @@ -3615,7 +3674,7 @@ Bit 2 = /gourd . /gourz + istepadd . ext_int + init_ii . ext_int */ -uint8 daddmode = ((dzwrite && gourz) || (dwrite && gourd && !topnen && !topben && !ext_int) +uint8_t daddmode = ((dzwrite && gourz) || (dwrite && gourd && !topnen && !topben && !ext_int) || (dwrite && gourd && topnen && topben && !ext_int) || zstepadd || (istepadd && !topnen && !topben && !ext_int) || (istepadd && topnen && topben && !ext_int) || (!gourd && !gourz && !topnen && !topben) @@ -3627,8 +3686,8 @@ daddmode |= ((dwrite && gourd && !topben && !ext_int) || (istepadd && !topben && || (init_ii && !topben && !ext_int) ? 0x02 : 0x00); daddmode |= ((!gourd && !gourz) || shadeadd || (dwrite && gourd && ext_int) || (istepadd && ext_int) || (init_ii && ext_int) ? 0x04 : 0x00); -/* Data add load controls -Pattern fraction (dest data) is loaded on +/* Data add load controls +Pattern fraction (dest data) is loaded on dwrite . gourd . atick[0] + istepfadd . /datinit + init_if @@ -3636,11 +3695,11 @@ Pattern data is loaded on dwrite . gourd . atick[1] + istepadd . /datinit . /datinit + init_ii -Source z1 is loaded on +Source z1 is loaded on dzwrite . gourz . atick[1] + zstepadd . /datinit . /datinit + init_zi -Source z2 is loaded on +Source z2 is loaded on dzwrite . gourz . atick[0] + zstepfadd + init_zf @@ -3667,10 +3726,10 @@ Bit 0 = /patdsel . /adddsel Bit 1 = adddsel + dzwrite1d */ -uint8 data_sel = ((!patdsel && !adddsel) || dzwrite ? 0x01 : 0x00) +uint8_t data_sel = ((!patdsel && !adddsel) || dzwrite ? 0x01 : 0x00) | (adddsel || dzwrite ? 0x02 : 0x00); -uint32 address, pixAddr; +uint32_t address, pixAddr; ADDRGEN(address, pixAddr, gena2i, zaddr, a1_x, a1_y, a1_base, a1_pitch, a1_pixsize, a1_width, a1_zoffset, a2_x, a2_y, a2_base, a2_pitch, a2_pixsize, a2_width, a2_zoffset); @@ -3681,28 +3740,28 @@ if (!justify) /* Generate source alignment shift ------------------------------- -The source alignment shift for data move is the difference between -the source and destination X pointers, multiplied by the pixel -size. Only the low six bits of the pointers are of interest, as -pixel sizes are always a power of 2 and window rows are always -phrase aligned. +The source alignment shift for data move is the difference between +the source and destination X pointers, multiplied by the pixel +size. Only the low six bits of the pointers are of interest, as +pixel sizes are always a power of 2 and window rows are always +phrase aligned. When not in phrase mode, the top 3 bits of the shift value are set to zero (2/26). Source shifting is also used to extract bits for bit-to-byte -expansion in phrase mode. This involves only the bottom three +expansion in phrase mode. This involves only the bottom three bits of the shift value, and is based on the offset within the phrase of the destination X pointer, in pixels. Source shifting is disabled when srcen is not set. */ -uint8 dstxp = (dsta2 ? a2_x : a1_x) & 0x3F; -uint8 srcxp = (dsta2 ? a1_x : a2_x) & 0x3F; -uint8 shftv = ((dstxp - srcxp) << pixsize) & 0x3F; +uint8_t dstxp = (dsta2 ? a2_x : a1_x) & 0x3F; +uint8_t srcxp = (dsta2 ? a1_x : a2_x) & 0x3F; +uint8_t shftv = ((dstxp - srcxp) << pixsize) & 0x3F; /* The phrase mode alignment count is given by the phrase offset of the first pixel, for bit to byte expansion */ -uint8 pobb = 0; +uint8_t pobb = 0; if (pixsize == 3) pobb = dstxp & 0x07; @@ -3712,8 +3771,8 @@ if (pixsize == 5) pobb = dstxp & 0x01; bool pobbsel = phrase_mode && bcompen; -uint8 loshd = (pobbsel ? pobb : shftv) & 0x07; -uint8 shfti = (srcen || pobbsel ? (sshftld ? loshd : srcshift & 0x07) : 0); +uint8_t loshd = (pobbsel ? pobb : shftv) & 0x07; +uint8_t shfti = (srcen || pobbsel ? (sshftld ? loshd : srcshift & 0x07) : 0); /* Enable for high bits is srcen . phrase_mode */ shfti |= (srcen && phrase_mode ? (sshftld ? shftv & 0x38 : srcshift & 0x38) : 0); srcshift = shfti; @@ -3722,35 +3781,36 @@ srcshift = shfti; { #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Entering SREADX state..."); -//printf(" [dstart=%X dend=%X pwidth=%X srcshift=%X]\n", dstart, dend, pwidth, srcshift); -fflush(stdout); -} + WriteLog(" Entering SREADX state..."); #endif -//uint32 srcAddr, pixAddr; +//uint32_t srcAddr, pixAddr; //ADDRGEN(srcAddr, pixAddr, gena2i, zaddr, // a1_x, a1_y, a1_base, a1_pitch, a1_pixsize, a1_width, a1_zoffset, // a2_x, a2_y, a2_base, a2_pitch, a2_pixsize, a2_width, a2_zoffset); -srcd2 = srcd1; -srcd1 = ((uint64)JaguarReadLong(address, BLITTER) << 32) | (uint64)JaguarReadLong(address + 4, BLITTER); + srcd2 = srcd1; + srcd1 = ((uint64_t)JaguarReadLong(address + 0, BLITTER) << 32) + | (uint64_t)JaguarReadLong(address + 4, BLITTER); //Kludge to take pixel size into account... +//Hmm. If we're not in phrase mode, this is most likely NOT going to be used... +//Actually, it would be--because of BCOMPEN expansion, for example... if (!phrase_mode) { - if (pixsize == 5) - srcd1 >>= 32; - else if (pixsize == 4) - srcd1 >>= 48; - else + if (bcompen) srcd1 >>= 56; -} + else + { + if (pixsize == 5) + srcd1 >>= 32; + else if (pixsize == 4) + srcd1 >>= 48; + else + srcd1 >>= 56; + } +}//*/ #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Source extra read address/pix address: %08X/%1X [%08X%08X]\n", address, pixAddr, - (uint32)(srcd1 >> 32), (uint32)(srcd1 & 0xFFFFFFFF)); -fflush(stdout); -} + WriteLog(" Source extra read address/pix address: %08X/%1X [%08X%08X]\n", + address, pixAddr, (uint32_t)(srcd1 >> 32), (uint32_t)(srcd1 & 0xFFFFFFFF)); #endif } @@ -3758,10 +3818,14 @@ fflush(stdout); { #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Entering SZREADX state...\n"); -fflush(stdout); -} + WriteLog(" Entering SZREADX state..."); +#endif + srcz2 = srcz1; + srcz1 = ((uint64_t)JaguarReadLong(address, BLITTER) << 32) | (uint64_t)JaguarReadLong(address + 4, BLITTER); +#ifdef VERBOSE_BLITTER_LOGGING +if (logBlit) + WriteLog(" Src Z extra read address/pix address: %08X/%1X [%08X%08X]\n", address, pixAddr, + (uint32_t)(dstz >> 32), (uint32_t)(dstz & 0xFFFFFFFF)); #endif } @@ -3769,18 +3833,14 @@ fflush(stdout); { #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Entering SREAD state..."); -//printf(" [dstart=%X dend=%X pwidth=%X srcshift=%X]\n", dstart, dend, pwidth, srcshift); -fflush(stdout); -} + WriteLog(" Entering SREAD state..."); #endif -//uint32 srcAddr, pixAddr; +//uint32_t srcAddr, pixAddr; //ADDRGEN(srcAddr, pixAddr, gena2i, zaddr, // a1_x, a1_y, a1_base, a1_pitch, a1_pixsize, a1_width, a1_zoffset, // a2_x, a2_y, a2_base, a2_pitch, a2_pixsize, a2_width, a2_zoffset); srcd2 = srcd1; -srcd1 = ((uint64)JaguarReadLong(address, BLITTER) << 32) | (uint64)JaguarReadLong(address + 4, BLITTER); +srcd1 = ((uint64_t)JaguarReadLong(address, BLITTER) << 32) | (uint64_t)JaguarReadLong(address + 4, BLITTER); //Kludge to take pixel size into account... if (!phrase_mode) { @@ -3799,9 +3859,9 @@ if (!phrase_mode) #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" Source read address/pix address: %08X/%1X [%08X%08X]\n", address, pixAddr, - (uint32)(srcd1 >> 32), (uint32)(srcd1 & 0xFFFFFFFF)); -fflush(stdout); +WriteLog(" Source read address/pix address: %08X/%1X [%08X%08X]\n", address, pixAddr, + (uint32_t)(srcd1 >> 32), (uint32_t)(srcd1 & 0xFFFFFFFF)); +//fflush(stdout); } #endif } @@ -3811,8 +3871,21 @@ fflush(stdout); #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" Entering SZREAD state...\n"); -fflush(stdout); +WriteLog(" Entering SZREAD state..."); +//fflush(stdout); +} +#endif + srcz2 = srcz1; + srcz1 = ((uint64_t)JaguarReadLong(address, BLITTER) << 32) | (uint64_t)JaguarReadLong(address + 4, BLITTER); +//Kludge to take pixel size into account... I believe that it only has to take 16BPP mode into account. Not sure tho. +if (!phrase_mode && pixsize == 4) + srcz1 >>= 48; + +#ifdef VERBOSE_BLITTER_LOGGING +if (logBlit) +{ + WriteLog(" Src Z read address/pix address: %08X/%1X [%08X%08X]\n", address, pixAddr, + (uint32_t)(dstz >> 32), (uint32_t)(dstz & 0xFFFFFFFF)); } #endif } @@ -3821,16 +3894,13 @@ fflush(stdout); { #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Entering DREAD state...\n"); -fflush(stdout); -} + WriteLog(" Entering DREAD state..."); #endif -//uint32 dstAddr, pixAddr; +//uint32_t dstAddr, pixAddr; //ADDRGEN(dstAddr, pixAddr, gena2i, zaddr, // a1_x, a1_y, a1_base, a1_pitch, a1_pixsize, a1_width, a1_zoffset, // a2_x, a2_y, a2_base, a2_pitch, a2_pixsize, a2_width, a2_zoffset); -dstd = ((uint64)JaguarReadLong(address, BLITTER) << 32) | (uint64)JaguarReadLong(address + 4, BLITTER); +dstd = ((uint64_t)JaguarReadLong(address, BLITTER) << 32) | (uint64_t)JaguarReadLong(address + 4, BLITTER); //Kludge to take pixel size into account... if (!phrase_mode) { @@ -3843,11 +3913,8 @@ if (!phrase_mode) } #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Dest read address/pix address: %08X/%1X [%08X%08X]\n", address, pixAddr, - (uint32)(dstd >> 32), (uint32)(dstd & 0xFFFFFFFF)); -fflush(stdout); -} + WriteLog(" Dest read address/pix address: %08X/%1X [%08X%08X]\n", address, + pixAddr, (uint32_t)(dstd >> 32), (uint32_t)(dstd & 0xFFFFFFFF)); #endif } @@ -3856,42 +3923,43 @@ fflush(stdout); // Is Z always 64 bit read? Or sometimes 16 bit (dependent on phrase_mode)? #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ - printf(" Entering DZREAD state..."); - fflush(stdout); -} + WriteLog(" Entering DZREAD state..."); #endif - dstz = ((uint64)JaguarReadLong(address, BLITTER) << 32) | (uint64)JaguarReadLong(address + 4, BLITTER); + dstz = ((uint64_t)JaguarReadLong(address, BLITTER) << 32) | (uint64_t)JaguarReadLong(address + 4, BLITTER); +//Kludge to take pixel size into account... I believe that it only has to take 16BPP mode into account. Not sure tho. +if (!phrase_mode && pixsize == 4) + dstz >>= 48; + #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ - printf(" Dest Z read address/pix address: %08X/%1X [%08X%08X]\n", address, pixAddr, - (uint32)(dstz >> 32), (uint32)(dstz & 0xFFFFFFFF)); - fflush(stdout); -} + WriteLog(" Dest Z read address/pix address: %08X/%1X [%08X%08X]\n", address, + pixAddr, (uint32_t)(dstz >> 32), (uint32_t)(dstz & 0xFFFFFFFF)); #endif } +// These vars should probably go further up in the code... !!! FIX !!! +// We can't preassign these unless they're static... +//uint64_t srcz = 0; // These are assigned to shut up stupid compiler warnings--dwrite is ALWAYS asserted +//bool winhibit = false; +uint64_t srcz; +bool winhibit; //NOTE: SRCSHADE requires GOURZ to be set to work properly--another Jaguar I bug if (dwrite) { #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Entering DWRITE state...\n"); -fflush(stdout); -} + WriteLog(" Entering DWRITE state..."); #endif //Counter is done on the dwrite state...! (We'll do it first, since it affects dstart/dend calculations.) //Here's the voodoo for figuring the correct amount of pixels in phrase mode (or not): - int8 inct = -((dsta2 ? a2_x : a1_x) & 0x07); // From INNER_CNT - uint8 inc = 0; + int8_t inct = -((dsta2 ? a2_x : a1_x) & 0x07); // From INNER_CNT + uint8_t inc = 0; inc = (!phrase_mode || (phrase_mode && (inct & 0x01)) ? 0x01 : 0x00); inc |= (phrase_mode && (((pixsize == 3 || pixsize == 4) && (inct & 0x02)) || pixsize == 5 && !(inct & 0x01)) ? 0x02 : 0x00); inc |= (phrase_mode && ((pixsize == 3 && (inct & 0x04)) || (pixsize == 4 && !(inct & 0x03))) ? 0x04 : 0x00); inc |= (phrase_mode && pixsize == 3 && !(inct & 0x07) ? 0x08 : 0x00); - uint16 oldicount = icount; // Save icount to detect underflow... + uint16_t oldicount = icount; // Save icount to detect underflow... icount -= inc; if (icount == 0 || ((icount & 0x8000) && !(oldicount & 0x8000))) @@ -3902,7 +3970,7 @@ fflush(stdout); //Start & end write mask computations... //********************************************************************************* -uint8 dstart = 0; +uint8_t dstart = 0; if (pixsize == 3) dstart = (dstxp & 0x07) << 3; @@ -3914,12 +3982,12 @@ if (pixsize == 5) dstart = (phrase_mode ? dstart : pixAddr & 0x07); //This is the other Jaguar I bug... Normally, should ALWAYS select a1_x here. -uint16 dstxwr = (dsta2 ? a2_x : a1_x) & 0x7FFE; -uint16 pseq = dstxwr ^ (a1_win_x & 0x7FFE); +uint16_t dstxwr = (dsta2 ? a2_x : a1_x) & 0x7FFE; +uint16_t pseq = dstxwr ^ (a1_win_x & 0x7FFE); pseq = (pixsize == 5 ? pseq : pseq & 0x7FFC); pseq = ((pixsize & 0x06) == 4 ? pseq : pseq & 0x7FF8); bool penden = clip_a1 && (pseq == 0); -uint8 window_mask = 0; +uint8_t window_mask = 0; if (pixsize == 3) window_mask = (a1_win_x & 0x07) << 3; @@ -3955,7 +4023,7 @@ NOTE! This doesn't fix the problem because inner0 is asserted too late to help h /* The mask to be used if within one phrase of the end of the inner loop, similarly */ -uint8 inner_mask = 0; +uint8_t inner_mask = 0; if (pixsize == 3) inner_mask = (icount & 0x07) << 3; @@ -3969,12 +4037,12 @@ if (!inner0) the inner mask, where is all cases 000 means 1000. */ window_mask = (window_mask == 0 ? 0x40 : window_mask); inner_mask = (inner_mask == 0 ? 0x40 : inner_mask); -uint8 emask = (window_mask > inner_mask ? inner_mask : window_mask); +uint8_t emask = (window_mask > inner_mask ? inner_mask : window_mask); /* The mask to be used for the pixel size, to which must be added the bit offset */ -uint8 pma = pixAddr + (1 << pixsize); +uint8_t pma = pixAddr + (1 << pixsize); /* Select the mask */ -uint8 dend = (phrase_mode ? emask : pma); +uint8_t dend = (phrase_mode ? emask : pma); /* The cycle width in phrase mode is normally one phrase. However, at the start and end it may be narrower. The start and end masks @@ -3986,27 +4054,21 @@ are used to generate this. The width is given by: This is only used for writes in phrase mode. Start and end from the address level of the pipeline are used. */ -uint8 pwidth = (((dend | dstart) & 0x07) == 0 ? 0x08 : (dend - dstart) & 0x07); +uint8_t pwidth = (((dend | dstart) & 0x07) == 0 ? 0x08 : (dend - dstart) & 0x07); -//uint32 dstAddr, pixAddr; +//uint32_t dstAddr, pixAddr; //ADDRGEN(dstAddr, pixAddr, gena2i, zaddr, // a1_x, a1_y, a1_base, a1_pitch, a1_pixsize, a1_width, a1_zoffset, // a2_x, a2_y, a2_base, a2_pitch, a2_pixsize, a2_width, a2_zoffset); #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) -{ -printf(" Dest write address/pix address: %08X/%1X", address, pixAddr); -printf(" [dstart=%X dend=%X pwidth=%X srcshift=%X]", dstart, dend, pwidth, srcshift); -fflush(stdout); -printf("[daas=%X dabs=%X dam=%X ds=%X daq=%s]", daddasel, daddbsel, daddmode, data_sel, (daddq_sel ? "T" : "F")); -fflush(stdout); -} + WriteLog(" Dest write address/pix address: %08X/%1X", address, pixAddr); #endif //More testing... This is almost certainly wrong, but how else does this work??? //Seems to kinda work... But still, this doesn't seem to make any sense! if (phrase_mode && !dsten) - dstd = ((uint64)JaguarReadLong(address, BLITTER) << 32) | (uint64)JaguarReadLong(address + 4, BLITTER); + dstd = ((uint64_t)JaguarReadLong(address, BLITTER) << 32) | (uint64_t)JaguarReadLong(address + 4, BLITTER); //Testing only... for now... //This is wrong because the write data is a combination of srcd and dstd--either run @@ -4016,11 +4078,60 @@ if (phrase_mode && !dsten) //Now it does! // srcd2 = xxxx xxxx 0123 4567, srcd = 8901 2345 xxxx xxxx, srcshift = $20 (32) -uint64 srcd = (srcd2 << (64 - srcshift)) | (srcd1 >> srcshift); +uint64_t srcd = (srcd2 << (64 - srcshift)) | (srcd1 >> srcshift); //bleh, ugly ugly ugly if (srcshift == 0) srcd = srcd1; +//NOTE: This only works with pixel sizes less than 8BPP... +//DOUBLE NOTE: Still need to do regression testing to ensure that this doesn't break other stuff... !!! CHECK !!! +if (!phrase_mode && srcshift != 0) + srcd = ((srcd2 & 0xFF) << (8 - srcshift)) | ((srcd1 & 0xFF) >> srcshift); + +//Z DATA() stuff done here... And it has to be done before any Z shifting... +//Note that we need to have phrase mode start/end support here... (Not since we moved it from dzwrite...!) +/* +Here are a couple of Cybermorph blits with Z: +$00113078 // DSTEN DSTENZ DSTWRZ CLIP_A1 GOURD GOURZ PATDSEL ZMODE=4 +$09900F39 // SRCEN DSTEN DSTENZ DSTWRZ UPDA1 UPDA1F UPDA2 DSTA2 ZMODE=4 LFUFUNC=C DCOMPEN + +We're having the same phrase mode overwrite problem we had with the pixels... !!! FIX !!! +Odd. It's equating 0 with 0... Even though ZMODE is $04 (less than)! +*/ +if (gourz) +{ +/* +void ADDARRAY(uint16_t * addq, uint8_t daddasel, uint8_t daddbsel, uint8_t daddmode, + uint64_t dstd, uint32_t iinc, uint8_t initcin[], uint64_t initinc, uint16_t initpix, + uint32_t istep, uint64_t patd, uint64_t srcd, uint64_t srcz1, uint64_t srcz2, + uint32_t zinc, uint32_t zstep) +*/ + uint16_t addq[4]; + uint8_t initcin[4] = { 0, 0, 0, 0 }; + ADDARRAY(addq, 7/*daddasel*/, 6/*daddbsel*/, 0/*daddmode*/, 0, 0, initcin, 0, 0, 0, 0, 0, srcz1, srcz2, zinc, 0); + srcz2 = ((uint64_t)addq[3] << 48) | ((uint64_t)addq[2] << 32) | ((uint64_t)addq[1] << 16) | (uint64_t)addq[0]; + ADDARRAY(addq, 6/*daddasel*/, 7/*daddbsel*/, 1/*daddmode*/, 0, 0, initcin, 0, 0, 0, 0, 0, srcz1, srcz2, zinc, 0); + srcz1 = ((uint64_t)addq[3] << 48) | ((uint64_t)addq[2] << 32) | ((uint64_t)addq[1] << 16) | (uint64_t)addq[0]; + +#if 0//def VERBOSE_BLITTER_LOGGING +if (logBlit) + WriteLog("\n[srcz1=%08X%08X, srcz2=%08X%08X, zinc=%08X", + (uint32_t)(srcz1 >> 32), (uint32_t)(srcz1 & 0xFFFFFFFF), + (uint32_t)(srcz2 >> 32), (uint32_t)(srcz2 & 0xFFFFFFFF), zinc); +#endif +} + +uint8_t zSrcShift = srcshift & 0x30; +srcz = (srcz2 << (64 - zSrcShift)) | (srcz1 >> zSrcShift); +//bleh, ugly ugly ugly +if (zSrcShift == 0) + srcz = srcz1; + +#if 0//def VERBOSE_BLITTER_LOGGING +if (logBlit) + WriteLog(" srcz=%08X%08X]\n", (uint32_t)(srcz >> 32), (uint32_t)(srcz & 0xFFFFFFFF)); +#endif + //When in SRCSHADE mode, it adds the IINC to the read source (from LFU???) //According to following line, it gets LFU mode. But does it feed the source into the LFU //after the add? @@ -4031,10 +4142,10 @@ if (srcshade) //NOTE: This is basically doubling the work done by DATA--since this is what // ADDARRAY is loaded with when srschshade is enabled... !!! FIX !!! // Also note that it doesn't work properly unless GOURZ is set--there's the clue! - uint16 addq[4]; - uint8 initcin[4] = { 0, 0, 0, 0 }; + uint16_t addq[4]; + uint8_t initcin[4] = { 0, 0, 0, 0 }; ADDARRAY(addq, 4/*daddasel*/, 5/*daddbsel*/, 7/*daddmode*/, dstd, iinc, initcin, 0, 0, 0, patd, srcd, 0, 0, 0, 0); - srcd = ((uint64)addq[3] << 48) | ((uint64)addq[2] << 32) | ((uint64)addq[1] << 16) | (uint64)addq[0]; + srcd = ((uint64_t)addq[3] << 48) | ((uint64_t)addq[2] << 32) | ((uint64_t)addq[1] << 16) | (uint64_t)addq[0]; } //Seems to work... Not 100% sure tho. //end try this @@ -4042,26 +4153,28 @@ if (srcshade) //Temporary kludge, to see if the fractional pattern does anything... //This works, BTW //But it seems to mess up in Cybermorph... the shading should be smooth but it isn't... -//Seems the carry out is lost again... !!! FIX !!! +//Seems the carry out is lost again... !!! FIX !!! [DONE--see below] if (patfadd) { - uint16 addq[4]; - uint8 initcin[4] = { 0, 0, 0, 0 }; + uint16_t addq[4]; + uint8_t initcin[4] = { 0, 0, 0, 0 }; ADDARRAY(addq, 4/*daddasel*/, 4/*daddbsel*/, 0/*daddmode*/, dstd, iinc, initcin, 0, 0, 0, patd, srcd, 0, 0, 0, 0); - srcd1 = ((uint64)addq[3] << 48) | ((uint64)addq[2] << 32) | ((uint64)addq[1] << 16) | (uint64)addq[0]; + srcd1 = ((uint64_t)addq[3] << 48) | ((uint64_t)addq[2] << 32) | ((uint64_t)addq[1] << 16) | (uint64_t)addq[0]; } //Note that we still don't take atick[0] & [1] into account here, so this will skip half of the data needed... !!! FIX !!! //Not yet enumerated: dbinh, srcdread, srczread +//Also, should do srcshift on the z value in phrase mode... !!! FIX !!! [DONE] +//As well as add a srcz variable we can set external to this state... !!! FIX !!! [DONE] -bool winhibit;// = false; -uint64 wdata; -uint8 dcomp, zcomp; +uint64_t wdata; +uint8_t dcomp, zcomp; DATA(wdata, dcomp, zcomp, winhibit, true, cmpdst, daddasel, daddbsel, daddmode, daddq_sel, data_sel, 0/*dbinh*/, dend, dstart, dstd, iinc, lfufunc, patd, patdadd, phrase_mode, srcd, false/*srcdread*/, false/*srczread*/, srcz2add, zmode, - bcompen, bkgwren, dcompen, icount & 0x07, pixsize); + bcompen, bkgwren, dcompen, icount & 0x07, pixsize, + srcz, dstz, zinc); /* Seems that the phrase mode writes with DCOMPEN and DSTEN are corrupting inside of DATA: !!! FIX !!! It's fairly random as well. 7CFE -> 7DFE, 7FCA -> 78CA, 7FA4 -> 78A4, 7F88 -> 8F88 @@ -4143,6 +4256,7 @@ A1_outside := OR6 (a1_outside, a1_x{15}, a1xgr, a1xeq, a1_y{15}, a1ygr, a1yeq); */ //NOTE: There seems to be an off-by-one bug here in the clip_a1 section... !!! FIX !!! // Actually, seems to be related to phrase mode writes... +// Or is it? Could be related to non-15-bit compares as above? if (clip_a1 && ((a1_x & 0x8000) || (a1_y & 0x8000) || (a1_x >= a1_win_x) || (a1_y >= a1_win_y))) winhibit = true; @@ -4162,47 +4276,138 @@ if (!winhibit) else JaguarWriteByte(address, wdata & 0x000000FF, BLITTER); } +} #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { - printf(" [%08X%08X]", (uint32)(wdata >> 32), (uint32)(wdata & 0xFFFFFFFF)); - fflush(stdout); + WriteLog(" [%08X%08X]%s", (uint32_t)(wdata >> 32), (uint32_t)(wdata & 0xFFFFFFFF), (winhibit ? "[X]" : "")); + WriteLog(" (icount=%04X, inc=%u)\n", icount, (uint16_t)inc); + WriteLog(" [dstart=%X dend=%X pwidth=%X srcshift=%X]", dstart, dend, pwidth, srcshift); + WriteLog("[daas=%X dabs=%X dam=%X ds=%X daq=%s]\n", daddasel, daddbsel, daddmode, data_sel, (daddq_sel ? "T" : "F")); } #endif -} + } + if (dzwrite) + { +// OK, here's the big insight: When NOT in GOURZ mode, srcz1 & 2 function EXACTLY the same way that +// srcd1 & 2 work--there's an implicit shift from srcz1 to srcz2 whenever srcz1 is read. +// OTHERWISE, srcz1 is the integer for the computed Z and srcz2 is the fractional part. +// Writes to srcz1 & 2 follow the same pattern as the other 64-bit registers--low 32 at the low address, +// high 32 at the high address (little endian!). +// NOTE: GOURZ is still not properly supported. Check patd/patf handling... +// Phrase mode start/end masks are not properly supported either... #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" (icount=%04X, inc=%u)\n", icount, (uint16)inc); -fflush(stdout); + WriteLog(" Entering DZWRITE state..."); + WriteLog(" Dest Z write address/pix address: %08X/%1X [%08X%08X]\n", address, + pixAddr, (uint32_t)(srcz >> 32), (uint32_t)(srcz & 0xFFFFFFFF)); } #endif - } - - if (dzwrite) - { +//This is not correct... !!! FIX !!! +//Should be OK now... We'll see... +//Nope. Having the same starstep write problems in phrase mode as we had with pixels... !!! FIX !!! +//This is not causing the problem in Hover Strike... :-/ +//The problem was with the SREADX not shifting. Still problems with Z comparisons & other text in pregame screen... +if (!winhibit) +{ + if (phrase_mode) + { + JaguarWriteLong(address + 0, srcz >> 32, BLITTER); + JaguarWriteLong(address + 4, srcz & 0xFFFFFFFF, BLITTER); + } + else + { + if (pixsize == 4) + JaguarWriteWord(address, srcz & 0x0000FFFF, BLITTER); + } +}//*/ #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" Entering DZWRITE state...\n"); -fflush(stdout); +// printf(" [%08X%08X]\n", (uint32_t)(srcz >> 32), (uint32_t)(srcz & 0xFFFFFFFF)); +// fflush(stdout); +//printf(" [dstart=%X dend=%X pwidth=%X srcshift=%X]", dstart, dend, pwidth, srcshift); + WriteLog(" [dstart=? dend=? pwidth=? srcshift=%X]", srcshift); + WriteLog("[daas=%X dabs=%X dam=%X ds=%X daq=%s]\n", daddasel, daddbsel, daddmode, data_sel, (daddq_sel ? "T" : "F")); +// fflush(stdout); } #endif } +/* +This is because the address generator was using only 15 bits of the X when it should have +used 16! + +There's a slight problem here: The X pointer isn't wrapping like it should when it hits +the edge of the window... Notice how the X isn't reset at the edge of the window: + +Blit! (CMD = 00010000) +Flags: PATDSEL + count = 160 x 261 + a1_base = 000E8008, a2_base = 0001FA68 + a1_x = 0000, a1_y = 0000, a1_frac_x = 0000, a1_frac_y = 0000, a2_x = 0000, a2_y = 0000 + a1_step_x = 0000, a1_step_y = 0000, a1_stepf_x = 0000, a1_stepf_y = 0000, a2_step_x = 0000, a2_step_y = 0000 + a1_inc_x = 0000, a1_inc_y = 0000, a1_incf_x = 0000, a1_incf_y = 0000 + a1_win_x = 0000, a1_win_y = 0000, a2_mask_x = 0000, a2_mask_y = 0000 + a2_mask=F a1add=+phr/+0 a2add=+phr/+0 + a1_pixsize = 5, a2_pixsize = 5 + srcd=7717771777177717 dstd=0000000000000000 patd=7730773077307730 iinc=00000000 + srcz1=0000000000000000 srcz2=0000000000000000 dstz=0000000000000000 zinc=00000000, coll=0 + Phrase mode is ON + [in=T a1f=F a1=F zf=F z=F a2=F iif=F iii=F izf=F izi=F] + Entering INNER state... + Entering DWRITE state... Dest write address/pix address: 000E8008/0 [7730773077307730] (icount=009E, inc=2) + srcz=0000000000000000][dcomp=AA zcomp=00 dbinh=00] +[srcz=0000000000000000 dstz=0000000000000000 zwdata=0000000000000000 mask=7FFF] + [dstart=0 dend=40 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=0 daq=F] + Entering A1_ADD state [a1_x=0000, a1_y=0000, addasel=0, addbsel=0, modx=1, addareg=F, adda_xconst=1, adda_yconst=0]... + Entering DWRITE state... Dest write address/pix address: 000E8018/0 [7730773077307730] (icount=009C, inc=2) + srcz=0000000000000000][dcomp=AA zcomp=00 dbinh=00] +[srcz=0000000000000000 dstz=0000000000000000 zwdata=0000000000000000 mask=7FFF] + [dstart=0 dend=40 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=0 daq=F] + Entering A1_ADD state [a1_x=0002, a1_y=0000, addasel=0, addbsel=0, modx=1, addareg=F, adda_xconst=1, adda_yconst=0]... + +... + + Entering A1_ADD state [a1_x=009C, a1_y=0000, addasel=0, addbsel=0, modx=1, addareg=F, adda_xconst=1, adda_yconst=0]... + Entering DWRITE state... Dest write address/pix address: 000E84F8/0 [7730773077307730] (icount=0000, inc=2) + srcz=0000000000000000][dcomp=AA zcomp=00 dbinh=00] +[srcz=0000000000000000 dstz=0000000000000000 zwdata=0000000000000000 mask=7FFF] + [dstart=0 dend=40 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=0 daq=F] + Entering A1_ADD state [a1_x=009E, a1_y=0000, addasel=0, addbsel=0, modx=1, addareg=F, adda_xconst=1, adda_yconst=0]... + Entering IDLE_INNER state... + + Leaving INNER state... (ocount=0104) + [in=T a1f=F a1=F zf=F z=F a2=F iif=F iii=F izf=F izi=F] + + Entering INNER state... + Entering DWRITE state... Dest write address/pix address: 000E8508/0 [7730773077307730] (icount=009E, inc=2) + srcz=0000000000000000][dcomp=AA zcomp=00 dbinh=00] +[srcz=0000000000000000 dstz=0000000000000000 zwdata=0000000000000000 mask=7FFF] + [dstart=0 dend=40 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=0 daq=F] + Entering A1_ADD state [a1_x=00A0, a1_y=0000, addasel=0, addbsel=0, modx=1, addareg=F, adda_xconst=1, adda_yconst=0]... + Entering DWRITE state... Dest write address/pix address: 000E8518/0 [7730773077307730] (icount=009C, inc=2) + srcz=0000000000000000][dcomp=AA zcomp=00 dbinh=00] +[srcz=0000000000000000 dstz=0000000000000000 zwdata=0000000000000000 mask=7FFF] + [dstart=0 dend=40 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=0 daq=F] + Entering A1_ADD state [a1_x=00A2, a1_y=0000, addasel=0, addbsel=0, modx=1, addareg=F, adda_xconst=1, adda_yconst=0]... + +*/ + if (a1_add) { #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { //printf(" Entering A1_ADD state [addasel=%X, addbsel=%X, modx=%X, addareg=%s, adda_xconst=%u, adda_yconst=%s]...\n", addasel, addbsel, modx, (addareg ? "T" : "F"), adda_xconst, (adda_yconst ? "1" : "0")); -printf(" Entering A1_ADD state [a1_x=%04X, a1_y=%04X, addasel=%X, addbsel=%X, modx=%X, addareg=%s, adda_xconst=%u, adda_yconst=%s]...\n", a1_x, a1_y, addasel, addbsel, modx, (addareg ? "T" : "F"), adda_xconst, (adda_yconst ? "1" : "0")); -fflush(stdout); +WriteLog(" Entering A1_ADD state [a1_x=%04X, a1_y=%04X, addasel=%X, addbsel=%X, modx=%X, addareg=%s, adda_xconst=%u, adda_yconst=%s]...\n", a1_x, a1_y, addasel, addbsel, modx, (addareg ? "T" : "F"), adda_xconst, (adda_yconst ? "1" : "0")); +//fflush(stdout); } #endif -int16 adda_x, adda_y, addb_x, addb_y, data_x, data_y, addq_x, addq_y; +int16_t adda_x, adda_y, addb_x, addb_y, data_x, data_y, addq_x, addq_y; ADDAMUX(adda_x, adda_y, addasel, a1_step_x, a1_step_y, a1_stepf_x, a1_stepf_y, a2_step_x, a2_step_y, a1_inc_x, a1_inc_y, a1_incf_x, a1_incf_y, adda_xconst, adda_yconst, addareg, suba_x, suba_y); ADDBMUX(addb_x, addb_y, addbsel, a1_x, a1_y, a2_x, a2_y, a1_frac_x, a1_frac_y); @@ -4211,8 +4416,8 @@ ADDRADD(addq_x, addq_y, a1fracldi, adda_x, adda_y, addb_x, addb_y, modx, suba_x, #if 0//def VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" [adda_x=%d, adda_y=%d, addb_x=%d, addb_y=%d, addq_x=%d, addq_y=%d]\n", adda_x, adda_y, addb_x, addb_y, addq_x, addq_y); -fflush(stdout); +WriteLog(" [adda_x=%d, adda_y=%d, addb_x=%d, addb_y=%d, addq_x=%d, addq_y=%d]\n", adda_x, adda_y, addb_x, addb_y, addq_x, addq_y); +//fflush(stdout); } #endif //Now, write to what??? @@ -4245,20 +4450,20 @@ else if (logBlit) { //printf(" Entering A2_ADD state [addasel=%X, addbsel=%X, modx=%X, addareg=%s, adda_xconst=%u, adda_yconst=%s]...\n", addasel, addbsel, modx, (addareg ? "T" : "F"), adda_xconst, (adda_yconst ? "1" : "0")); -printf(" Entering A2_ADD state [a2_x=%04X, a2_y=%04X, addasel=%X, addbsel=%X, modx=%X, addareg=%s, adda_xconst=%u, adda_yconst=%s]...\n", a2_x, a2_y, addasel, addbsel, modx, (addareg ? "T" : "F"), adda_xconst, (adda_yconst ? "1" : "0")); -fflush(stdout); +WriteLog(" Entering A2_ADD state [a2_x=%04X, a2_y=%04X, addasel=%X, addbsel=%X, modx=%X, addareg=%s, adda_xconst=%u, adda_yconst=%s]...\n", a2_x, a2_y, addasel, addbsel, modx, (addareg ? "T" : "F"), adda_xconst, (adda_yconst ? "1" : "0")); +//fflush(stdout); } #endif -//void ADDAMUX(int16 &adda_x, int16 &adda_y, uint8 addasel, int16 a1_step_x, int16 a1_step_y, -// int16 a1_stepf_x, int16 a1_stepf_y, int16 a2_step_x, int16 a2_step_y, -// int16 a1_inc_x, int16 a1_inc_y, int16 a1_incf_x, int16 a1_incf_y, uint8 adda_xconst, +//void ADDAMUX(int16_t &adda_x, int16_t &adda_y, uint8_t addasel, int16_t a1_step_x, int16_t a1_step_y, +// int16_t a1_stepf_x, int16_t a1_stepf_y, int16_t a2_step_x, int16_t a2_step_y, +// int16_t a1_inc_x, int16_t a1_inc_y, int16_t a1_incf_x, int16_t a1_incf_y, uint8_t adda_xconst, // bool adda_yconst, bool addareg, bool suba_x, bool suba_y) -//void ADDBMUX(int16 &addb_x, int16 &addb_y, uint8 addbsel, int16 a1_x, int16 a1_y, -// int16 a2_x, int16 a2_y, int16 a1_frac_x, int16 a1_frac_y) -//void ADDRADD(int16 &addq_x, int16 &addq_y, bool a1fracldi, -// int16 adda_x, int16 adda_y, int16 addb_x, int16 addb_y, uint8 modx, bool suba_x, bool suba_y) -//void DATAMUX(int16 &data_x, int16 &data_y, uint32 gpu_din, int16 addq_x, int16 addq_y, bool addqsel) -int16 adda_x, adda_y, addb_x, addb_y, data_x, data_y, addq_x, addq_y; +//void ADDBMUX(int16_t &addb_x, int16_t &addb_y, uint8_t addbsel, int16_t a1_x, int16_t a1_y, +// int16_t a2_x, int16_t a2_y, int16_t a1_frac_x, int16_t a1_frac_y) +//void ADDRADD(int16_t &addq_x, int16_t &addq_y, bool a1fracldi, +// int16_t adda_x, int16_t adda_y, int16_t addb_x, int16_t addb_y, uint8_t modx, bool suba_x, bool suba_y) +//void DATAMUX(int16_t &data_x, int16_t &data_y, uint32_t gpu_din, int16_t addq_x, int16_t addq_y, bool addqsel) +int16_t adda_x, adda_y, addb_x, addb_y, data_x, data_y, addq_x, addq_y; ADDAMUX(adda_x, adda_y, addasel, a1_step_x, a1_step_y, a1_stepf_x, a1_stepf_y, a2_step_x, a2_step_y, a1_inc_x, a1_inc_y, a1_incf_x, a1_incf_y, adda_xconst, adda_yconst, addareg, suba_x, suba_y); ADDBMUX(addb_x, addb_y, addbsel, a1_x, a1_y, a2_x, a2_y, a1_frac_x, a1_frac_y); @@ -4267,8 +4472,8 @@ ADDRADD(addq_x, addq_y, a1fracldi, adda_x, adda_y, addb_x, addb_y, modx, suba_x, #if 0//def VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" [adda_x=%d, adda_y=%d, addb_x=%d, addb_y=%d, addq_x=%d, addq_y=%d]\n", adda_x, adda_y, addb_x, addb_y, addq_x, addq_y); -fflush(stdout); +WriteLog(" [adda_x=%d, adda_y=%d, addb_x=%d, addb_y=%d, addq_x=%d, addq_y=%d]\n", adda_x, adda_y, addb_x, addb_y, addq_x, addq_y); +//fflush(stdout); } #endif //Now, write to what??? @@ -4334,8 +4539,8 @@ Flags: SRCEN CLIP_A1 UPDA1 UPDA1F UPDA2 DSTA2 GOURZ ZMODE=0 LFUFUNC=C SRCSHADE #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" Leaving INNER state..."); -fflush(stdout); +WriteLog(" Leaving INNER state..."); +//fflush(stdout); } #endif indone = true; @@ -4351,14 +4556,14 @@ cause the inner state to go active */ //Since we don't get here until the inner loop is finished (indone = true) we can get //away with doing it here...! ocount--; - + if (ocount == 0) outer0 = true; #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" (ocount=%04X)\n", ocount); -fflush(stdout); +WriteLog(" (ocount=%04X)\n", ocount); +//fflush(stdout); } #endif } @@ -4368,16 +4573,16 @@ fflush(stdout); #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" Entering A1FUPDATE state...\n"); -fflush(stdout); +WriteLog(" Entering A1FUPDATE state...\n"); +//fflush(stdout); } #endif - uint32 a1_frac_xt = (uint32)a1_frac_x + (uint32)a1_stepf_x; - uint32 a1_frac_yt = (uint32)a1_frac_y + (uint32)a1_stepf_y; + uint32_t a1_frac_xt = (uint32_t)a1_frac_x + (uint32_t)a1_stepf_x; + uint32_t a1_frac_yt = (uint32_t)a1_frac_y + (uint32_t)a1_stepf_y; a1FracCInX = a1_frac_xt >> 16; a1FracCInY = a1_frac_yt >> 16; - a1_frac_x = (uint16)(a1_frac_xt & 0xFFFF); - a1_frac_y = (uint16)(a1_frac_yt & 0xFFFF); + a1_frac_x = (uint16_t)(a1_frac_xt & 0xFFFF); + a1_frac_y = (uint16_t)(a1_frac_yt & 0xFFFF); } if (a1update) @@ -4385,8 +4590,8 @@ fflush(stdout); #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" Entering A1UPDATE state... (%d/%d -> ", a1_x, a1_y); -fflush(stdout); +WriteLog(" Entering A1UPDATE state... (%d/%d -> ", a1_x, a1_y); +//fflush(stdout); } #endif a1_x += a1_step_x + a1FracCInX; @@ -4394,19 +4599,19 @@ fflush(stdout); #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf("%d/%d)\n", a1_x, a1_y); -fflush(stdout); +WriteLog("%d/%d)\n", a1_x, a1_y); +//fflush(stdout); } #endif } - + if (a2update) { #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" Entering A2UPDATE state... (%d/%d -> ", a2_x, a2_y); -fflush(stdout); +WriteLog(" Entering A2UPDATE state... (%d/%d -> ", a2_x, a2_y); +//fflush(stdout); } #endif a2_x += a2_step_x; @@ -4414,129 +4619,94 @@ fflush(stdout); #ifdef VERBOSE_BLITTER_LOGGING if (logBlit) { -printf("%d/%d)\n", a2_x, a2_y); -fflush(stdout); +WriteLog("%d/%d)\n", a2_x, a2_y); +//fflush(stdout); } #endif } } +// We never get here! !!! FIX !!! + +#ifdef VERBOSE_BLITTER_LOGGING +if (logBlit) +{ + WriteLog("Done!\na1_x=%04X a1_y=%04X a1_frac_x=%04X a1_frac_y=%04X a2_x=%04X a2_y%04X\n", + GET16(blitter_ram, A1_PIXEL + 2), + GET16(blitter_ram, A1_PIXEL + 0), + GET16(blitter_ram, A1_FPIXEL + 2), + GET16(blitter_ram, A1_FPIXEL + 0), + GET16(blitter_ram, A2_PIXEL + 2), + GET16(blitter_ram, A2_PIXEL + 0)); +// fflush(stdout); +} +#endif + // Write values back to registers (in real blitter, these are continuously updated) - SET16(blitter_ram, A1_PIXEL + 0, a1_y); SET16(blitter_ram, A1_PIXEL + 2, a1_x); - SET16(blitter_ram, A1_FPIXEL + 0, a1_frac_y); + SET16(blitter_ram, A1_PIXEL + 0, a1_y); SET16(blitter_ram, A1_FPIXEL + 2, a1_frac_x); - SET16(blitter_ram, A2_PIXEL + 0, a2_y); + SET16(blitter_ram, A1_FPIXEL + 0, a1_frac_y); SET16(blitter_ram, A2_PIXEL + 2, a2_x); + SET16(blitter_ram, A2_PIXEL + 0, a2_y); + +#ifdef VERBOSE_BLITTER_LOGGING +if (logBlit) +{ + WriteLog("Writeback!\na1_x=%04X a1_y=%04X a1_frac_x=%04X a1_frac_y=%04X a2_x=%04X a2_y%04X\n", + GET16(blitter_ram, A1_PIXEL + 2), + GET16(blitter_ram, A1_PIXEL + 0), + GET16(blitter_ram, A1_FPIXEL + 2), + GET16(blitter_ram, A1_FPIXEL + 0), + GET16(blitter_ram, A2_PIXEL + 2), + GET16(blitter_ram, A2_PIXEL + 0)); +// fflush(stdout); +} +#endif } /* -The latest that doesn't work properly: - -Blit! (CMD = 09800741) -Flags: SRCEN CLIP_A1 UPDA1 UPDA1F UPDA2 LFUFUNC=C DCOMPEN - count = 15 x 18 - a1_base = 00050000, a2_base = 0083F400 - a1_x = 003D, a1_y = 00AD, a1_frac_x = 8000, a1_frac_y = 0000, a2_x = 0027, a2_y = 00A4 - a1_step_x = FFF1, a1_step_y = 0001, a1_stepf_x = 0000, a1_stepf_y = 0000, a2_step_x = FFF1, a2_step_y = 0001 - a1_inc_x = 0001, a1_inc_y = 0000, a1_incf_x = 0000, a1_incf_y = 0000 - a1_win_x = 0180, a1_win_y = 0118, a2_mask_x = 0000, a2_mask_y = 0000 - a2_mask=F a1add=+inc/+0 a2add=+1/+0 - a1_pixsize = 4, a2_pixsize = 4 - srcd=0000000000000000 dstd=0000000000000000 patd=0000000000000000 iinc=00FFF000 - srcz1=0000000000000000 srcz2=0000000000000000 dstz=0000000000000000 zinc=00000000, col=2 - Phrase mode is off - [in=T a1f=F a1=F zf=F z=F a2=F iif=F iii=F izf=F izi=F] - Entering INNER state... - Entering SREAD state... Source read address/pix address: 00858E4E/0 [0000000000000000] - Entering A2_ADD state [a2_x=0027, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 0007077A/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [0000000000000000] (icount=000E, inc=1) - Entering A1_ADD state [a1_x=003D, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E50/0 [0000000000000000] - Entering A2_ADD state [a2_x=0028, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 0007077C/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [0000000000000000] (icount=000D, inc=1) - Entering A1_ADD state [a1_x=003E, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E52/0 [0000000000000000] - Entering A2_ADD state [a2_x=0029, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 0007077E/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [0000000000000000] (icount=000C, inc=1) - Entering A1_ADD state [a1_x=003F, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E54/0 [000000000000014A] - Entering A2_ADD state [a2_x=002A, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 00070780/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [000000000000014A] (icount=000B, inc=1) - Entering A1_ADD state [a1_x=0040, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E56/0 [000000000000014A] - Entering A2_ADD state [a2_x=002B, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 00070782/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [000000000000014A] (icount=000A, inc=1) - Entering A1_ADD state [a1_x=0041, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E58/0 [000000000000014A] - Entering A2_ADD state [a2_x=002C, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 00070784/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [000000000000014A] (icount=0009, inc=1) - Entering A1_ADD state [a1_x=0042, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E5A/0 [000000000000014A] - Entering A2_ADD state [a2_x=002D, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 00070786/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [000000000000014A] (icount=0008, inc=1) - Entering A1_ADD state [a1_x=0043, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E5C/0 [000000000000014A] - Entering A2_ADD state [a2_x=002E, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 00070788/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [000000000000014A] (icount=0007, inc=1) - Entering A1_ADD state [a1_x=0044, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E5E/0 [000000000000014A] - Entering A2_ADD state [a2_x=002F, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 0007078A/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [000000000000014A] (icount=0006, inc=1) - Entering A1_ADD state [a1_x=0045, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E60/0 [000000000000014A] - Entering A2_ADD state [a2_x=0030, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 0007078C/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [000000000000014A] (icount=0005, inc=1) - Entering A1_ADD state [a1_x=0046, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E62/0 [000000000000014A] - Entering A2_ADD state [a2_x=0031, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 0007078E/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [000000000000014A] (icount=0004, inc=1) - Entering A1_ADD state [a1_x=0047, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E64/0 [000000000000014A] - Entering A2_ADD state [a2_x=0032, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 00070790/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [000000000000014A] (icount=0003, inc=1) - Entering A1_ADD state [a1_x=0048, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E66/0 [0000000000000000] - Entering A2_ADD state [a2_x=0033, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 00070792/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [0000000000000000] (icount=0002, inc=1) - Entering A1_ADD state [a1_x=0049, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E68/0 [0000000000000000] - Entering A2_ADD state [a2_x=0034, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 00070794/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [0000000000000000] (icount=0001, inc=1) - Entering A1_ADD state [a1_x=004A, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering SREAD state... Source read address/pix address: 00858E6A/0 [0000000000000000] - Entering A2_ADD state [a2_x=0035, a2_y=00A4, addasel=0, addbsel=1, modx=0, addareg=F, adda_xconst=0, adda_yconst=0]... - Entering DWRITE state... - Dest write address/pix address: 00070796/0 [dstart=0 dend=10 pwidth=8 srcshift=0][daas=0 dabs=0 dam=7 ds=1 daq=F] [0000000000000000] (icount=0000, inc=1) - Entering A1_ADD state [a1_x=004B, a1_y=00AD, addasel=3, addbsel=2, modx=0, addareg=T, adda_xconst=7, adda_yconst=0]... - Entering IDLE_INNER state... - Leaving INNER state... (ocount=0011) - [in=F a1f=T a1=F zf=F z=F a2=F iif=F iii=F izf=F izi=F] - Entering A1FUPDATE state... - [in=F a1f=F a1=T zf=F z=F a2=F iif=F iii=F izf=F izi=F] - Entering A1UPDATE state... (76/173 -> 61/174) - [in=F a1f=F a1=F zf=F z=F a2=T iif=F iii=F izf=F izi=F] - Entering A2UPDATE state... (54/164 -> 39/165) - [in=T a1f=F a1=F zf=F z=F a2=F iif=F iii=F izf=F izi=F] - Entering INNER state... + int16_t a1_x = (int16_t)GET16(blitter_ram, A1_PIXEL + 2); + int16_t a1_y = (int16_t)GET16(blitter_ram, A1_PIXEL + 0); + uint16_t a1_frac_x = GET16(blitter_ram, A1_FPIXEL + 2); + uint16_t a1_frac_y = GET16(blitter_ram, A1_FPIXEL + 0); + int16_t a2_x = (int16_t)GET16(blitter_ram, A2_PIXEL + 2); + int16_t a2_y = (int16_t)GET16(blitter_ram, A2_PIXEL + 0); + +Seems that the ending a1_x should be written between blits, but it doesn't seem to be... + +Blit! (CMD = 01800000) +Flags: LFUFUNC=C + count = 28672 x 1 + a1_base = 00050000, a2_base = 00070000 + a1_x = 0000, a1_y = 0000, a1_frac_x = 49CD, a1_frac_y = 0000, a2_x = 0033, a2_y = 0001 + a1_step_x = 0000, a1_step_y = 0000, a1_stepf_x = 939A, a1_stepf_y = 0000, a2_step_x = 0000, a2_step_y = 0000 + a1_inc_x = 0000, a1_inc_y = 0000, a1_incf_x = 0000, a1_incf_y = 0000 + a1_win_x = 0100, a1_win_y = 0020, a2_mask_x = 0000, a2_mask_y = 0000 + a2_mask=F a1add=+phr/+0 a2add=+phr/+0 + a1_pixsize = 4, a2_pixsize = 3 + srcd=DEDEDEDEDEDEDEDE dstd=0000000000000000 patd=0000000000000000 iinc=00000000 + srcz1=0000000000000000 srcz2=0000000000000000 dstz=0000000000000000 zinc=00000000, coll=0 + Phrase mode is ON + +Blit! (CMD = 01800000) +Flags: LFUFUNC=C + count = 28672 x 1 + a1_base = 00050000, a2_base = 00070000 + a1_x = 0000, a1_y = 0000, a1_frac_x = 49CD, a1_frac_y = 0000, a2_x = 0033, a2_y = 0001 + a1_step_x = 0000, a1_step_y = 0000, a1_stepf_x = 939A, a1_stepf_y = 0000, a2_step_x = 0000, a2_step_y = 0000 + a1_inc_x = 0000, a1_inc_y = 0000, a1_incf_x = 0000, a1_incf_y = 0000 + a1_win_x = 0100, a1_win_y = 0020, a2_mask_x = 0000, a2_mask_y = 0000 + a2_mask=F a1add=+phr/+0 a2add=+phr/+0 + a1_pixsize = 4, a2_pixsize = 3 + srcd=D6D6D6D6D6D6D6D6 dstd=0000000000000000 patd=0000000000000000 iinc=00000000 + srcz1=0000000000000000 srcz2=0000000000000000 dstz=0000000000000000 zinc=00000000, coll=0 + Phrase mode is ON */ + // Various pieces of the blitter puzzle are teased out here... @@ -4567,42 +4737,43 @@ INT21/ a2_base :IN); */ -void ADDRGEN(uint32 &address, uint32 &pixa, bool gena2, bool zaddr, - uint16 a1_x, uint16 a1_y, uint32 a1_base, uint8 a1_pitch, uint8 a1_pixsize, uint8 a1_width, uint8 a1_zoffset, - uint16 a2_x, uint16 a2_y, uint32 a2_base, uint8 a2_pitch, uint8 a2_pixsize, uint8 a2_width, uint8 a2_zoffset) +void ADDRGEN(uint32_t &address, uint32_t &pixa, bool gena2, bool zaddr, + uint16_t a1_x, uint16_t a1_y, uint32_t a1_base, uint8_t a1_pitch, uint8_t a1_pixsize, uint8_t a1_width, uint8_t a1_zoffset, + uint16_t a2_x, uint16_t a2_y, uint32_t a2_base, uint8_t a2_pitch, uint8_t a2_pixsize, uint8_t a2_width, uint8_t a2_zoffset) { - uint16 x = (gena2 ? a2_x : a1_x) & 0x7FFF; - uint16 y = (gena2 ? a2_y : a1_y) & 0x0FFF; - uint8 width = (gena2 ? a2_width : a1_width); - uint8 pixsize = (gena2 ? a2_pixsize : a1_pixsize); - uint8 pitch = (gena2 ? a2_pitch : a1_pitch); - uint32 base = (gena2 ? a2_base : a1_base) >> 3;//Only upper 21 bits are passed around the bus? Seems like it... - uint8 zoffset = (gena2 ? a2_zoffset : a1_zoffset); +// uint16_t x = (gena2 ? a2_x : a1_x) & 0x7FFF; + uint16_t x = (gena2 ? a2_x : a1_x) & 0xFFFF; // Actually uses all 16 bits to generate address...! + uint16_t y = (gena2 ? a2_y : a1_y) & 0x0FFF; + uint8_t width = (gena2 ? a2_width : a1_width); + uint8_t pixsize = (gena2 ? a2_pixsize : a1_pixsize); + uint8_t pitch = (gena2 ? a2_pitch : a1_pitch); + uint32_t base = (gena2 ? a2_base : a1_base) >> 3;//Only upper 21 bits are passed around the bus? Seems like it... + uint8_t zoffset = (gena2 ? a2_zoffset : a1_zoffset); - uint32 ytm = ((uint32)y << 2) + (width & 0x02 ? (uint32)y << 1 : 0) + (width & 0x01 ? (uint32)y : 0); + uint32_t ytm = ((uint32_t)y << 2) + (width & 0x02 ? (uint32_t)y << 1 : 0) + (width & 0x01 ? (uint32_t)y : 0); - uint32 ya = (ytm << (width >> 2)) >> 2; + uint32_t ya = (ytm << (width >> 2)) >> 2; - uint32 pa = ya + x; + uint32_t pa = ya + x; /*uint32*/ pixa = pa << pixsize; - uint8 pt = ((pitch & 0x01) && !(pitch & 0x02) ? 0x01 : 0x00) + uint8_t pt = ((pitch & 0x01) && !(pitch & 0x02) ? 0x01 : 0x00) | (!(pitch & 0x01) && (pitch & 0x02) ? 0x02 : 0x00); -// uint32 phradr = pixa << pt; - uint32 phradr = (pixa >> 6) << pt; - uint32 shup = (pitch == 0x03 ? (pixa >> 6) : 0); +// uint32_t phradr = pixa << pt; + uint32_t phradr = (pixa >> 6) << pt; + uint32_t shup = (pitch == 0x03 ? (pixa >> 6) : 0); - uint8 za = (zaddr ? zoffset : 0) & 0x03; -// uint32 addr = za + (phradr & 0x07) + (shup << 1) + base; - uint32 addr = za + phradr + (shup << 1) + base; + uint8_t za = (zaddr ? zoffset : 0) & 0x03; +// uint32_t addr = za + (phradr & 0x07) + (shup << 1) + base; + uint32_t addr = za + phradr + (shup << 1) + base; /*uint32*/ address = ((pixa & 0x38) >> 3) | ((addr & 0x1FFFFF) << 3); #if 0//def VERBOSE_BLITTER_LOGGING if (logBlit) { -printf(" [gena2=%s, x=%04X, y=%04X, w=%1X, pxsz=%1X, ptch=%1X, b=%08X, zoff=%1X]\n", (gena2 ? "T" : "F"), x, y, width, pixsize, pitch, base, zoffset); -printf(" [ytm=%X, ya=%X, pa=%X, pixa=%X, pt=%X, phradr=%X, shup=%X, za=%X, addr=%X, address=%X]\n", ytm, ya, pa, pixa, pt, phradr, shup, za, addr, address); -fflush(stdout); +WriteLog(" [gena2=%s, x=%04X, y=%04X, w=%1X, pxsz=%1X, ptch=%1X, b=%08X, zoff=%1X]\n", (gena2 ? "T" : "F"), x, y, width, pixsize, pitch, base, zoffset); +WriteLog(" [ytm=%X, ya=%X, pa=%X, pixa=%X, pt=%X, phradr=%X, shup=%X, za=%X, addr=%X, address=%X]\n", ytm, ya, pa, pixa, pt, phradr, shup, za, addr, address); +//fflush(stdout); } #endif pixa &= 0x07; @@ -4759,6 +4930,7 @@ Dstzread := AN2 (dstzread, dstzpend, read_ack); }*/ + //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// // Here's an important bit: The source data adder logic. Need to track down the inputs!!! // @@ -4789,13 +4961,13 @@ INT32/ zinc INT32/ zstep :IN); */ -void ADDARRAY(uint16 * addq, uint8 daddasel, uint8 daddbsel, uint8 daddmode, - uint64 dstd, uint32 iinc, uint8 initcin[], uint64 initinc, uint16 initpix, - uint32 istep, uint64 patd, uint64 srcd, uint64 srcz1, uint64 srcz2, - uint32 zinc, uint32 zstep) +void ADDARRAY(uint16_t * addq, uint8_t daddasel, uint8_t daddbsel, uint8_t daddmode, + uint64_t dstd, uint32_t iinc, uint8_t initcin[], uint64_t initinc, uint16_t initpix, + uint32_t istep, uint64_t patd, uint64_t srcd, uint64_t srcz1, uint64_t srcz2, + uint32_t zinc, uint32_t zstep) { - uint32 initpix2 = ((uint32)initpix << 16) | initpix; - uint32 addalo[8], addahi[8]; + uint32_t initpix2 = ((uint32_t)initpix << 16) | initpix; + uint32_t addalo[8], addahi[8]; addalo[0] = dstd & 0xFFFFFFFF; addalo[1] = initpix2; addalo[2] = 0; @@ -4812,13 +4984,13 @@ void ADDARRAY(uint16 * addq, uint8 daddasel, uint8 daddbsel, uint8 daddmode, addahi[5] = patd >> 32; addahi[6] = srcz1 >> 32; addahi[7] = srcz2 >> 32; - uint16 adda[4]; + uint16_t adda[4]; adda[0] = addalo[daddasel] & 0xFFFF; adda[1] = addalo[daddasel] >> 16; adda[2] = addahi[daddasel] & 0xFFFF; adda[3] = addahi[daddasel] >> 16; - uint16 wordmux[8]; + uint16_t wordmux[8]; wordmux[0] = iinc & 0xFFFF; wordmux[1] = iinc >> 16; wordmux[2] = zinc & 0xFFFF; @@ -4827,8 +4999,8 @@ void ADDARRAY(uint16 * addq, uint8 daddasel, uint8 daddbsel, uint8 daddmode, wordmux[5] = istep >> 16;; wordmux[6] = zstep & 0xFFFF; wordmux[7] = zstep >> 16;; - uint16 word = wordmux[((daddbsel & 0x08) >> 1) | (daddbsel & 0x03)]; - uint16 addb[4]; + uint16_t word = wordmux[((daddbsel & 0x08) >> 1) | (daddbsel & 0x03)]; + uint16_t addb[4]; bool dbsel2 = daddbsel & 0x04; bool iincsel = (daddbsel & 0x01) && !(daddbsel & 0x04); @@ -4847,10 +5019,10 @@ void ADDARRAY(uint16 * addq, uint8 daddasel, uint8 daddbsel, uint8 daddmode, else addb[0] = addb[1] = addb[2] = addb[3] = 0; - uint8 cinsel = (daddmode >= 1 && daddmode <= 4 ? 1 : 0); + uint8_t cinsel = (daddmode >= 1 && daddmode <= 4 ? 1 : 0); -static uint8 co[4];//These are preserved between calls... - uint8 cin[4]; +static uint8_t co[4];//These are preserved between calls... + uint8_t cin[4]; for(int i=0; i<4; i++) cin[i] = initcin[i] | (co[i] & cinsel); @@ -4864,6 +5036,7 @@ static uint8 co[4];//These are preserved between calls... ADD16SAT(addq[i], co[i], adda[i], addb[i], cin[i], sat, eightbit, hicinh); } + /* DEF ADD16SAT ( INT16/ r // result @@ -4877,17 +5050,17 @@ INT16/ b hicinh :IN); */ -void ADD16SAT(uint16 &r, uint8 &co, uint16 a, uint16 b, uint8 cin, bool sat, bool eightbit, bool hicinh) +void ADD16SAT(uint16_t &r, uint8_t &co, uint16_t a, uint16_t b, uint8_t cin, bool sat, bool eightbit, bool hicinh) { /*if (logBlit) { printf("--> [sat=%s 8b=%s hicinh=%s] %04X + %04X (+ %u) = ", (sat ? "T" : "F"), (eightbit ? "T" : "F"), (hicinh ? "T" : "F"), a, b, cin); fflush(stdout); }*/ - uint8 carry[4]; - uint32 qt = (a & 0xFF) + (b & 0xFF) + cin; + uint8_t carry[4]; + uint32_t qt = (a & 0xFF) + (b & 0xFF) + cin; carry[0] = (qt & 0x0100 ? 1 : 0); - uint16 q = qt & 0x00FF; + uint16_t q = qt & 0x00FF; carry[1] = (carry[0] && !eightbit ? carry[0] : 0); qt = (a & 0x0F00) + (b & 0x0F00) + (carry[1] << 8); carry[2] = (qt & 0x1000 ? 1 : 0); @@ -4897,8 +5070,8 @@ void ADD16SAT(uint16 &r, uint8 &co, uint16 a, uint16 b, uint8 cin, bool sat, boo co = (qt & 0x10000 ? 1 : 0); q |= qt & 0xF000; - uint8 btop = (eightbit ? (b & 0x0080) >> 7 : (b & 0x8000) >> 15); - uint8 ctop = (eightbit ? carry[0] : co); + uint8_t btop = (eightbit ? (b & 0x0080) >> 7 : (b & 0x8000) >> 15); + uint8_t ctop = (eightbit ? carry[0] : co); bool saturate = sat && (btop ^ ctop); bool hisaturate = saturate && !eightbit; @@ -4917,6 +5090,7 @@ void ADD16SAT(uint16 &r, uint8 &co, uint16 a, uint16 b, uint8 cin, bool sat, boo }*/ } + /** ADDAMUX - Address adder input A selection ******************* This module generates the data loaded into the address adder input A. This is @@ -4936,7 +5110,7 @@ addasel[0..2] select the register to add adda_xconst[0..2] generate a power of 2 in the range 1-64 or all zeroes when they are all 1. -addareg selects register value to be added as opposed to constant +addareg selects register value to be added as opposed to constant value. suba_x, suba_y complement the X and Y values @@ -4965,13 +5139,13 @@ INT16/ a1_incf_y suba_x suba_y :IN); */ -void ADDAMUX(int16 &adda_x, int16 &adda_y, uint8 addasel, int16 a1_step_x, int16 a1_step_y, - int16 a1_stepf_x, int16 a1_stepf_y, int16 a2_step_x, int16 a2_step_y, - int16 a1_inc_x, int16 a1_inc_y, int16 a1_incf_x, int16 a1_incf_y, uint8 adda_xconst, +void ADDAMUX(int16_t &adda_x, int16_t &adda_y, uint8_t addasel, int16_t a1_step_x, int16_t a1_step_y, + int16_t a1_stepf_x, int16_t a1_stepf_y, int16_t a2_step_x, int16_t a2_step_y, + int16_t a1_inc_x, int16_t a1_inc_y, int16_t a1_incf_x, int16_t a1_incf_y, uint8_t adda_xconst, bool adda_yconst, bool addareg, bool suba_x, bool suba_y) { -/*INT16/ addac_x, addac_y, addar_x, addar_y, addart_x, addart_y, +/*INT16/ addac_x, addac_y, addar_x, addar_y, addart_x, addart_y, INT16/ addas_x, addas_y, suba_x16, suba_y16 :LOCAL; BEGIN @@ -4987,14 +5161,14 @@ Addart_y := MX4 (addart_y, a1_step_y, a1_stepf_y, a1_inc_y, a1_incf_y, addaselb[ Addar_y := MX2 (addar_y, addart_y, a2_step_y, addaselb[2]);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - int16 xterm[4], yterm[4]; + int16_t xterm[4], yterm[4]; xterm[0] = a1_step_x, xterm[1] = a1_stepf_x, xterm[2] = a1_inc_x, xterm[3] = a1_incf_x; yterm[0] = a1_step_y, yterm[1] = a1_stepf_y, yterm[2] = a1_inc_y, yterm[3] = a1_incf_y; - int16 addar_x = (addasel & 0x04 ? a2_step_x : xterm[addasel & 0x03]); - int16 addar_y = (addasel & 0x04 ? a2_step_y : yterm[addasel & 0x03]); + int16_t addar_x = (addasel & 0x04 ? a2_step_x : xterm[addasel & 0x03]); + int16_t addar_y = (addasel & 0x04 ? a2_step_y : yterm[addasel & 0x03]); ////////////////////////////////////////////////////////////////////////////////////// -/* Generate a constant value - this is a power of 2 in the range +/* Generate a constant value - this is a power of 2 in the range 0-64, or zero. The control bits are adda_xconst[0..2], when they are all 1 the result is 0. Constants for Y can only be 0 or 1 */ @@ -5003,11 +5177,11 @@ Constants for Y can only be 0 or 1 */ Unused[0] := DUMMY (unused[0]); Addac_x := JOIN (addac_x, addac_x[0..6], zero, zero, zero, zero, zero, zero, zero, zero, zero); -Addac_y := JOIN (addac_y, adda_yconst, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, +Addac_y := JOIN (addac_y, adda_yconst, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - int16 addac_x = (adda_xconst == 0x07 ? 0 : 1 << adda_xconst); - int16 addac_y = (adda_yconst ? 0x01 : 0); + int16_t addac_x = (adda_xconst == 0x07 ? 0 : 1 << adda_xconst); + int16_t addac_y = (adda_yconst ? 0x01 : 0); ////////////////////////////////////////////////////////////////////////////////////// /* Select between constant value and register value */ @@ -5015,15 +5189,15 @@ Addac_y := JOIN (addac_y, adda_yconst, zero, zero, zero, zero, zero, zero, zero /*Addas_x := MX2 (addas_x, addac_x, addar_x, addareg); Addas_y := MX2 (addas_y, addac_y, addar_y, addareg);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - int16 addas_x = (addareg ? addar_x : addac_x); - int16 addas_y = (addareg ? addar_y : addac_y); + int16_t addas_x = (addareg ? addar_x : addac_x); + int16_t addas_y = (addareg ? addar_y : addac_y); ////////////////////////////////////////////////////////////////////////////////////// /* Complement these values (complement flag gives adder carry in)*/ -/*Suba_x16 := JOIN (suba_x16, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, +/*Suba_x16 := JOIN (suba_x16, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x, suba_x); -Suba_y16 := JOIN (suba_y16, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, +Suba_y16 := JOIN (suba_y16, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y, suba_y); Adda_x := EO (adda_x, suba_x16, addas_x); Adda_y := EO (adda_y, suba_y16, addas_y);*/ @@ -5035,11 +5209,12 @@ Adda_y := EO (adda_y, suba_y16, addas_y);*/ //END; } + /** ADDBMUX - Address adder input B selection ******************* -This module selects the register to be updated by the address -adder. This can be one of three registers, the A1 and A2 -pointers, or the A1 fractional part. It can also be zero, so that the step +This module selects the register to be updated by the address +adder. This can be one of three registers, the A1 and A2 +pointers, or the A1 fractional part. It can also be zero, so that the step registers load directly into the pointers. */ @@ -5057,18 +5232,18 @@ INT16/ a1_frac_y :IN); INT16/ zero16 :LOCAL; BEGIN*/ -void ADDBMUX(int16 &addb_x, int16 &addb_y, uint8 addbsel, int16 a1_x, int16 a1_y, - int16 a2_x, int16 a2_y, int16 a1_frac_x, int16 a1_frac_y) +void ADDBMUX(int16_t &addb_x, int16_t &addb_y, uint8_t addbsel, int16_t a1_x, int16_t a1_y, + int16_t a2_x, int16_t a2_y, int16_t a1_frac_x, int16_t a1_frac_y) { /*Zero := TIE0 (zero); -Zero16 := JOIN (zero16, zero, zero, zero, zero, zero, zero, zero, +Zero16 := JOIN (zero16, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero, zero); Addbselb[0-1] := BUF8 (addbselb[0-1], addbsel[0-1]); Addb_x := MX4 (addb_x, a1_x, a2_x, a1_frac_x, zero16, addbselb[0..1]); Addb_y := MX4 (addb_y, a1_y, a2_y, a1_frac_y, zero16, addbselb[0..1]);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - int16 xterm[4], yterm[4]; + int16_t xterm[4], yterm[4]; xterm[0] = a1_x, xterm[1] = a2_x, xterm[2] = a1_frac_x, xterm[3] = 0; yterm[0] = a1_y, yterm[1] = a2_y, yterm[2] = a1_frac_y, yterm[3] = 0; addb_x = xterm[addbsel & 0x03]; @@ -5078,6 +5253,7 @@ Addb_y := MX4 (addb_y, a1_y, a2_y, a1_frac_y, zero16, addbselb[0..1]);*/ //END; } + /** DATAMUX - Address local data bus selection ****************** Select between the adder output and the input data bus @@ -5096,7 +5272,7 @@ INT16/ addq_y INT16/ gpu_lo, gpu_hi :LOCAL; BEGIN*/ -void DATAMUX(int16 &data_x, int16 &data_y, uint32 gpu_din, int16 addq_x, int16 addq_y, bool addqsel) +void DATAMUX(int16_t &data_x, int16_t &data_y, uint32_t gpu_din, int16_t addq_x, int16_t addq_y, bool addqsel) { /*Gpu_lo := JOIN (gpu_lo, gpu_din{0..15}); Gpu_hi := JOIN (gpu_hi, gpu_din{16..31}); @@ -5105,23 +5281,24 @@ Addqselb := BUF8 (addqselb, addqsel); Data_x := MX2 (data_x, gpu_lo, addq_x, addqselb); Data_y := MX2 (data_y, gpu_hi, addq_y, addqselb);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - data_x = (addqsel ? addq_x : (int16)(gpu_din & 0xFFFF)); - data_y = (addqsel ? addq_y : (int16)(gpu_din >> 16)); + data_x = (addqsel ? addq_x : (int16_t)(gpu_din & 0xFFFF)); + data_y = (addqsel ? addq_y : (int16_t)(gpu_din >> 16)); ////////////////////////////////////////////////////////////////////////////////////// //END; } + /****************************************************************** addradd 29/11/90 Blitter Address Adder --------------------- -The blitter address adder is a pair of sixteen bit adders, one -each for X and Y. The multiplexing of the input terms is -performed elsewhere, but this adder can also perform modulo -arithmetic to align X-addresses onto phrase boundaries. +The blitter address adder is a pair of sixteen bit adders, one +each for X and Y. The multiplexing of the input terms is +performed elsewhere, but this adder can also perform modulo +arithmetic to align X-addresses onto phrase boundaries. modx[0..2] take values 000 no mask @@ -5147,13 +5324,13 @@ INT16/ addb_y modx[0..2] suba_x suba_y - :IN); + :IN); BEGIN Zero := TIE0 (zero);*/ -void ADDRADD(int16 &addq_x, int16 &addq_y, bool a1fracldi, - uint16 adda_x, uint16 adda_y, uint16 addb_x, uint16 addb_y, uint8 modx, bool suba_x, bool suba_y) +void ADDRADD(int16_t &addq_x, int16_t &addq_y, bool a1fracldi, + uint16_t adda_x, uint16_t adda_y, uint16_t addb_x, uint16_t addb_y, uint8_t modx, bool suba_x, bool suba_y) { /* Perform the addition */ @@ -5173,11 +5350,11 @@ Ci_y := EO (ci_y, cyt[1], suba_y);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// //I'm sure the following will generate a bunch of warnings, but will have to do for now. - static uint16 co_x = 0, co_y = 0; // Carry out has to propogate between function calls... - uint16 ci_x = co_x ^ (suba_x ? 1 : 0); - uint16 ci_y = co_y ^ (suba_y ? 1 : 0); - uint32 addqt_x = adda_x + addb_x + ci_x; - uint32 addqt_y = adda_y + addb_y + ci_y; + static uint16_t co_x = 0, co_y = 0; // Carry out has to propogate between function calls... + uint16_t ci_x = co_x ^ (suba_x ? 1 : 0); + uint16_t ci_y = co_y ^ (suba_y ? 1 : 0); + uint32_t addqt_x = adda_x + addb_x + ci_x; + uint32_t addqt_y = adda_y + addb_y + ci_y; co_x = ((addqt_x & 0x10000) && a1fracldi ? 1 : 0); co_y = ((addqt_y & 0x10000) && a1fracldi ? 1 : 0); ////////////////////////////////////////////////////////////////////////////////////// @@ -5194,7 +5371,7 @@ Addq_x := JOIN (addq_x, addq_x[0..5], addqt_x[6..15]); Addq_y := JOIN (addq_y, addq_y[0..15]);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - int16 mask[8] = { 0xFFFF, 0xFFFE, 0xFFFC, 0xFFF8, 0xFFF0, 0xFFE0, 0xFFC0, 0x0000 }; + int16_t mask[8] = { 0xFFFF, 0xFFFE, 0xFFFC, 0xFFF8, 0xFFF0, 0xFFE0, 0xFFC0, 0x0000 }; addq_x = addqt_x & mask[modx]; addq_y = addqt_y & 0xFFFF; ////////////////////////////////////////////////////////////////////////////////////// @@ -5204,6 +5381,7 @@ Addq_y := JOIN (addq_y, addq_y[0..15]);*/ //END; } + /* DEF DATA ( wdata[0..63] // co-processor write data bus @@ -5211,7 +5389,7 @@ DEF DATA ( dcomp[0..7] // data byte equal flags srcd[0..7] // bits to use for bit to byte expansion zcomp[0..3] // output from Z comparators - :OUT; + :OUT; a1_x[0..1] // low two bits of A1 X pointer big_pix // pixel organisation is big-endian blitter_active // blitter is active @@ -5270,18 +5448,19 @@ INT32/ gpu_din // GPU data bus :IN); */ -void DATA(uint64 &wdata, uint8 &dcomp, uint8 &zcomp, bool &nowrite, - bool big_pix, bool cmpdst, uint8 daddasel, uint8 daddbsel, uint8 daddmode, bool daddq_sel, uint8 data_sel, - uint8 dbinh, uint8 dend, uint8 dstart, uint64 dstd, uint32 iinc, uint8 lfu_func, uint64 &patd, bool patdadd, - bool phrase_mode, uint64 srcd, bool srcdread, bool srczread, bool srcz2add, uint8 zmode, - bool bcompen, bool bkgwren, bool dcompen, uint8 icount, uint8 pixsize) +void DATA(uint64_t &wdata, uint8_t &dcomp, uint8_t &zcomp, bool &nowrite, + bool big_pix, bool cmpdst, uint8_t daddasel, uint8_t daddbsel, uint8_t daddmode, bool daddq_sel, uint8_t data_sel, + uint8_t dbinh, uint8_t dend, uint8_t dstart, uint64_t dstd, uint32_t iinc, uint8_t lfu_func, uint64_t &patd, bool patdadd, + bool phrase_mode, uint64_t srcd, bool srcdread, bool srczread, bool srcz2add, uint8_t zmode, + bool bcompen, bool bkgwren, bool dcompen, uint8_t icount, uint8_t pixsize, + uint64_t &srcz, uint64_t dstz, uint32_t zinc) { /* Stuff we absolutely *need* to have passed in/out: IN: patdadd, dstd, srcd, patd, daddasel, daddbsel, daddmode, iinc, srcz1, srcz2, big_pix, phrase_mode, cmpdst OUT: - changed patd (wdata I guess...) + changed patd (wdata I guess...) (Nope. We pass it back directly now...) */ // Source data registers @@ -5293,13 +5472,13 @@ Srcd[0-7] := JOIN (srcd[0-7], srcdlo{0-7}); Srcd[8-31] := JOIN (srcd[8-31], srcdlo{8-31}); Srcd[32-63] := JOIN (srcd[32-63], srcdhi{0-31});*/ -// Destination data registers +// Destination data registers /*Data_dst := DATA_DST (dstd[0..63], dstz[0..1], clk, dstdld[0..1], dstzld[0..1], load_data[0..1]); Dstdlo := JOIN (dstdlo, dstd[0..31]); Dstdhi := JOIN (dstdhi, dstd[32..63]);*/ -// Pattern and Color data registers +// Pattern and Color data registers // Looks like this is simply another register file for the pattern data registers. No adding or anything funky // going on. Note that patd & patdv will output the same info. @@ -5313,23 +5492,23 @@ Patdhi := JOIN (patdhi, patd[32..63]);*/ // Multiplying data Mixer (NOT IN JAGUAR I) -/*Datamix := DATAMIX (patdo[0..1], clk, colord[0..15], dpipe[1], dstd[0..63], int0dp[8..10], int1dp[8..10], +/*Datamix := DATAMIX (patdo[0..1], clk, colord[0..15], dpipe[1], dstd[0..63], int0dp[8..10], int1dp[8..10], int2dp[8..10], int3dp[8..10], mixsel[0..2], patd[0..63], pdsel[0..1], srcd[0..63], textrgb, txtd[0..63]);*/ // Logic function unit /*Lfu := LFU (lfu[0..1], srcdlo, srcdhi, dstdlo, dstdhi, lfu_func[0..3]);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - uint64 funcmask[2] = { 0, 0xFFFFFFFFFFFFFFFFLL }; - uint64 func0 = funcmask[lfu_func & 0x01]; - uint64 func1 = funcmask[(lfu_func >> 1) & 0x01]; - uint64 func2 = funcmask[(lfu_func >> 2) & 0x01]; - uint64 func3 = funcmask[(lfu_func >> 3) & 0x01]; - uint64 lfu = (~srcd & ~dstd & func0) | (~srcd & dstd & func1) | (srcd & ~dstd & func2) | (srcd & dstd & func3); + uint64_t funcmask[2] = { 0, 0xFFFFFFFFFFFFFFFFLL }; + uint64_t func0 = funcmask[lfu_func & 0x01]; + uint64_t func1 = funcmask[(lfu_func >> 1) & 0x01]; + uint64_t func2 = funcmask[(lfu_func >> 2) & 0x01]; + uint64_t func3 = funcmask[(lfu_func >> 3) & 0x01]; + uint64_t lfu = (~srcd & ~dstd & func0) | (~srcd & dstd & func1) | (srcd & ~dstd & func2) | (srcd & dstd & func3); ////////////////////////////////////////////////////////////////////////////////////// // Increment and Step Registers - + // Does it do anything without the step add lines? Check it! // No. This is pretty much just a register file without the Jaguar II lines... /*Inc_step := INC_STEP (iinc, istep[0..31], zinc, zstep[0..31], clk, ext_int, gpu_din, iincld, iincldx, istepadd, @@ -5342,7 +5521,7 @@ Zstep := JOIN (zstep, zstep[0..31]);*/ /*Datacomp := DATACOMP (dcomp[0..7], cmpdst, dstdlo, dstdhi, patdlo, patdhi, srcdlo, srcdhi);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// dcomp = 0; - uint64 cmpd = patd ^ (cmpdst ? dstd : srcd); + uint64_t cmpd = patd ^ (cmpdst ? dstd : srcd); if ((cmpd & 0x00000000000000FFLL) == 0) dcomp |= 0x01; @@ -5360,29 +5539,69 @@ Zstep := JOIN (zstep, zstep[0..31]);*/ dcomp |= 0x40; if ((cmpd & 0xFF00000000000000LL) == 0) dcomp |= 0x80; +////////////////////////////////////////////////////////////////////////////////////// + +// Zed comparator for Z-buffer operations + +/*Zedcomp := ZEDCOMP (zcomp[0..3], srczp[0..1], dstz[0..1], zmode[0..2]);*/ +////////////////////////////////////// C++ CODE ////////////////////////////////////// +//srczp is srcz pipelined, also it goes through a source shift as well... +/*The shift is basically like so (each piece is 16 bits long): + + 0 1 2 3 4 5 6 + srcz1lolo srcz1lohi srcz1hilo srcz1hihi srcrz2lolo srcz2lohi srcz2hilo + +with srcshift bits 4 & 5 selecting the start position +*/ +//So... basically what we have here is: + zcomp = 0; + + if ((((srcz & 0x000000000000FFFFLL) < (dstz & 0x000000000000FFFFLL)) && (zmode & 0x01)) + || (((srcz & 0x000000000000FFFFLL) == (dstz & 0x000000000000FFFFLL)) && (zmode & 0x02)) + || (((srcz & 0x000000000000FFFFLL) > (dstz & 0x000000000000FFFFLL)) && (zmode & 0x04))) + zcomp |= 0x01; + + if ((((srcz & 0x00000000FFFF0000LL) < (dstz & 0x00000000FFFF0000LL)) && (zmode & 0x01)) + || (((srcz & 0x00000000FFFF0000LL) == (dstz & 0x00000000FFFF0000LL)) && (zmode & 0x02)) + || (((srcz & 0x00000000FFFF0000LL) > (dstz & 0x00000000FFFF0000LL)) && (zmode & 0x04))) + zcomp |= 0x02; + + if ((((srcz & 0x0000FFFF00000000LL) < (dstz & 0x0000FFFF00000000LL)) && (zmode & 0x01)) + || (((srcz & 0x0000FFFF00000000LL) == (dstz & 0x0000FFFF00000000LL)) && (zmode & 0x02)) + || (((srcz & 0x0000FFFF00000000LL) > (dstz & 0x0000FFFF00000000LL)) && (zmode & 0x04))) + zcomp |= 0x04; + + if ((((srcz & 0xFFFF000000000000LL) < (dstz & 0xFFFF000000000000LL)) && (zmode & 0x01)) + || (((srcz & 0xFFFF000000000000LL) == (dstz & 0xFFFF000000000000LL)) && (zmode & 0x02)) + || (((srcz & 0xFFFF000000000000LL) > (dstz & 0xFFFF000000000000LL)) && (zmode & 0x04))) + zcomp |= 0x08; + +//TEMP, TO TEST IF ZCOMP IS THE CULPRIT... +//Nope, this is NOT the problem... +//zcomp=0; // We'll do the comparison/bit/byte inhibits here, since that's they way it happens // in the real thing (dcomp goes out to COMP_CTRL and back into DATA through dbinh)... #if 1 - uint8 dbinht; + uint8_t dbinht; // bool nowrite; COMP_CTRL(dbinht, nowrite, - bcompen, true/*big_pix*/, bkgwren, dcomp, dcompen, icount, pixsize, phrase_mode, srcd & 0xFF, 0);//zcomp); + bcompen, true/*big_pix*/, bkgwren, dcomp, dcompen, icount, pixsize, phrase_mode, srcd & 0xFF, zcomp); dbinh = dbinht; // dbinh = 0x00; #endif -////////////////////////////////////////////////////////////////////////////////////// - -// Zed comparator for Z-buffer operations - -/*Zedcomp := ZEDCOMP (zcomp[0..3], srczp[0..1], dstz[0..1], zmode[0..2]);*/ -////////////////////////////////////// C++ CODE ////////////////////////////////////// +#if 1 +#ifdef VERBOSE_BLITTER_LOGGING +if (logBlit) + WriteLog("\n[dcomp=%02X zcomp=%02X dbinh=%02X]\n", dcomp, zcomp, dbinh); +#endif +#endif ////////////////////////////////////////////////////////////////////////////////////// // 22 Mar 94 // The data initializer - allows all four initial values to be computed from one (NOT IN JAGUAR I) -/*Datinit := DATINIT (initcin[0..3], initinc[0..63], initpix[0..15], a1_x[0..1], big_pix, clk, iinc, init_if, init_ii, +/*Datinit := DATINIT (initcin[0..3], initinc[0..63], initpix[0..15], a1_x[0..1], big_pix, clk, iinc, init_if, init_ii, init_zf, istep[0..31], zinc, zstep[0..31]);*/ // Adder array for Z and intensity increments @@ -5390,21 +5609,21 @@ Zstep := JOIN (zstep, zstep[0..31]);*/ /*Addarray := ADDARRAY (addq[0..3], clk, daddasel[0..2], daddbsel[0..3], daddmode[0..2], dstdlo, dstdhi, iinc, initcin[0..3], initinc[0..63], initpix[0..15], istep, patdv[0..1], srcdlo, srcdhi, srcz1[0..1], srcz2[0..1], reset\, zinc, zstep);*/ -/*void ADDARRAY(uint16 * addq, uint8 daddasel, uint8 daddbsel, uint8 daddmode, - uint64 dstd, uint32 iinc, uint8 initcin[], uint64 initinc, uint16 initpix, - uint32 istep, uint64 patd, uint64 srcd, uint64 srcz1, uint64 srcz2, - uint32 zinc, uint32 zstep)*/ +/*void ADDARRAY(uint16_t * addq, uint8_t daddasel, uint8_t daddbsel, uint8_t daddmode, + uint64_t dstd, uint32_t iinc, uint8_t initcin[], uint64_t initinc, uint16_t initpix, + uint32_t istep, uint64_t patd, uint64_t srcd, uint64_t srcz1, uint64_t srcz2, + uint32_t zinc, uint32_t zstep)*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - uint16 addq[4]; - uint8 initcin[4] = { 0, 0, 0, 0 }; + uint16_t addq[4]; + uint8_t initcin[4] = { 0, 0, 0, 0 }; ADDARRAY(addq, daddasel, daddbsel, daddmode, dstd, iinc, initcin, 0, 0, 0, patd, srcd, 0, 0, 0, 0); //This is normally done asynchronously above (thru local_data) when in patdadd mode... //And now it's passed back to the caller to be persistent between calls...! -//But it's causing some serious fuck-ups in T2K now... !!! FIX !!! +//But it's causing some serious fuck-ups in T2K now... !!! FIX !!! [DONE--???] //Weird! It doesn't anymore...! if (patdadd) - patd = ((uint64)addq[3] << 48) | ((uint64)addq[2] << 32) | ((uint64)addq[1] << 16) | (uint64)addq[0]; + patd = ((uint64_t)addq[3] << 48) | ((uint64_t)addq[2] << 32) | ((uint64_t)addq[1] << 16) | (uint64_t)addq[0]; ////////////////////////////////////////////////////////////////////////////////////// // Local data bus multiplexer @@ -5462,15 +5681,15 @@ Ecoarse := DECL38E (e_coarse\[0..7], dend[3..5], edis\); E_coarse[0] := INV1 (e_coarse[0], e_coarse\[0]); Efine := DECL38E (unused[0], e_fine\[1..7], dend[0..2], e_coarse[0]);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - uint8 decl38e[2][8] = { { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + uint8_t decl38e[2][8] = { { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F } }; - uint8 dech38[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; - uint8 dech38el[2][8] = { { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }, + uint8_t dech38[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; + uint8_t dech38el[2][8] = { { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; int en = (dend & 0x3F ? 1 : 0); - uint8 e_coarse = decl38e[en][(dend & 0x38) >> 3]; // Actually, this is e_coarse inverted... - uint8 e_fine = decl38e[(e_coarse & 0x01) ^ 0x01][dend & 0x07]; + uint8_t e_coarse = decl38e[en][(dend & 0x38) >> 3]; // Actually, this is e_coarse inverted... + uint8_t e_fine = decl38e[(e_coarse & 0x01) ^ 0x01][dend & 0x07]; e_fine &= 0xFE; ////////////////////////////////////////////////////////////////////////////////////// @@ -5478,14 +5697,14 @@ Efine := DECL38E (unused[0], e_fine\[1..7], dend[0..2], e_coarse[0]);*/ Sfen\ := INV1 (sfen\, s_coarse[0]); Sfine := DECH38EL (s_fine[0..7], dstart[0..2], sfen\);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - uint8 s_coarse = dech38[(dstart & 0x38) >> 3]; - uint8 s_fine = dech38el[(s_coarse & 0x01) ^ 0x01][dstart & 0x07]; + uint8_t s_coarse = dech38[(dstart & 0x38) >> 3]; + uint8_t s_fine = dech38el[(s_coarse & 0x01) ^ 0x01][dstart & 0x07]; ////////////////////////////////////////////////////////////////////////////////////// /*Maskt[0] := BUF1 (maskt[0], s_fine[0]); Maskt[1-7] := OAN1P (maskt[1-7], maskt[0-6], s_fine[1-7], e_fine\[1-7]);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - uint16 maskt = s_fine & 0x0001; + uint16_t maskt = s_fine & 0x0001; maskt |= (((maskt & 0x0001) || (s_fine & 0x02)) && (e_fine & 0x02) ? 0x0002 : 0x0000); maskt |= (((maskt & 0x0002) || (s_fine & 0x04)) && (e_fine & 0x04) ? 0x0004 : 0x0000); maskt |= (((maskt & 0x0004) || (s_fine & 0x08)) && (e_fine & 0x08) ? 0x0008 : 0x0000); @@ -5511,7 +5730,7 @@ Maskt[9-14] := OAN1P (maskt[9-14], maskt[8-13], s_coarse[2-7], e_coarse\[2-7]);* ////////////////////////////////////////////////////////////////////////////////////// /* The bit terms are mirrored for big-endian pixels outside phrase -mode. The byte terms are mirrored for big-endian pixels in phrase +mode. The byte terms are mirrored for big-endian pixels in phrase mode. */ /*Mirror_bit := AN2M (mir_bit, phrase_mode\, big_pix); @@ -5536,7 +5755,7 @@ Masku[14] := MX2 (masku[14], maskt[14], maskt[0], mir_byte);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// bool mir_bit = true/*big_pix*/ && !phrase_mode; bool mir_byte = true/*big_pix*/ && phrase_mode; - uint16 masku = maskt; + uint16_t masku = maskt; if (mir_bit) { @@ -5579,8 +5798,8 @@ inhibit terms can override these */ /*Mask[0-7] := AN2 (mask[0-7], masku[0-7], dbinh\[0]); Mask[8-14] := AN2H (mask[8-14], masku[8-14], dbinh\[1-7]);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - uint16 mask = masku & (!(dbinh & 0x01) ? 0xFFFF : 0xFF00); - mask &= ~(((uint16)dbinh & 0x00FE) << 7); + uint16_t mask = masku & (!(dbinh & 0x01) ? 0xFFFF : 0xFF00); + mask &= ~(((uint16_t)dbinh & 0x00FE) << 7); ////////////////////////////////////////////////////////////////////////////////////// /*Addql[0] := JOIN (addql[0], addq[0..1]); @@ -5591,12 +5810,12 @@ Dsel1b[0-1] := BUF8 (dsel1b[0-1], data_sel[1]); Ddatlo := MX4 (ddatlo, patd[0], lfu[0], addql[0], zero32, dsel0b[0], dsel1b[0]); Ddathi := MX4 (ddathi, patd[1], lfu[1], addql[1], zero32, dsel0b[1], dsel1b[1]);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// - uint64 dmux[4]; + uint64_t dmux[4]; dmux[0] = patd; dmux[1] = lfu; - dmux[2] = ((uint64)addq[3] << 48) | ((uint64)addq[2] << 32) | ((uint64)addq[1] << 16) | (uint64)addq[0]; + dmux[2] = ((uint64_t)addq[3] << 48) | ((uint64_t)addq[2] << 32) | ((uint64_t)addq[1] << 16) | (uint64_t)addq[0]; dmux[3] = 0; - uint64 ddat = dmux[data_sel]; + uint64_t ddat = dmux[data_sel]; ////////////////////////////////////////////////////////////////////////////////////// /*Zed_sel := AN2 (zed_sel, data_sel[0..1]); @@ -5622,11 +5841,30 @@ Dat[56-63] := MX4 (dat[56-63], dstdhi{24-31}, ddathi{24-31}, dstzhi{24-31}, srcz /*if (logBlit) { printf("\n[ddat=%08X%08X dstd=%08X%08X wdata=%08X%08X mask=%04X]\n", - (uint32)(ddat >> 32), (uint32)(ddat & 0xFFFFFFFF), - (uint32)(dstd >> 32), (uint32)(dstd & 0xFFFFFFFF), - (uint32)(wdata >> 32), (uint32)(wdata & 0xFFFFFFFF), mask); + (uint32_t)(ddat >> 32), (uint32_t)(ddat & 0xFFFFFFFF), + (uint32_t)(dstd >> 32), (uint32_t)(dstd & 0xFFFFFFFF), + (uint32_t)(wdata >> 32), (uint32_t)(wdata & 0xFFFFFFFF), mask); fflush(stdout); }//*/ +//This is a crappy way of handling this, but it should work for now... + uint64_t zwdata; + zwdata = ((srcz & mask) | (dstz & ~mask)) & 0x00000000000000FFLL; + zwdata |= (mask & 0x0100 ? srcz : dstz) & 0x000000000000FF00LL; + zwdata |= (mask & 0x0200 ? srcz : dstz) & 0x0000000000FF0000LL; + zwdata |= (mask & 0x0400 ? srcz : dstz) & 0x00000000FF000000LL; + zwdata |= (mask & 0x0800 ? srcz : dstz) & 0x000000FF00000000LL; + zwdata |= (mask & 0x1000 ? srcz : dstz) & 0x0000FF0000000000LL; + zwdata |= (mask & 0x2000 ? srcz : dstz) & 0x00FF000000000000LL; + zwdata |= (mask & 0x4000 ? srcz : dstz) & 0xFF00000000000000LL; +if (logBlit) +{ + WriteLog("\n[srcz=%08X%08X dstz=%08X%08X zwdata=%08X%08X mask=%04X]\n", + (uint32_t)(srcz >> 32), (uint32_t)(srcz & 0xFFFFFFFF), + (uint32_t)(dstz >> 32), (uint32_t)(dstz & 0xFFFFFFFF), + (uint32_t)(zwdata >> 32), (uint32_t)(zwdata & 0xFFFFFFFF), mask); +// fflush(stdout); +}//*/ + srcz = zwdata; ////////////////////////////////////////////////////////////////////////////////////// /*Data_enab[0-1] := BUF8 (data_enab[0-1], data_ena); @@ -5638,10 +5876,11 @@ Unused[0] := DUMMY (unused[0]); END;*/ } + /** COMP_CTRL - Comparator output control logic ***************** This block is responsible for taking the comparator outputs and -using them as appropriate to inhibit writes. Two methods are +using them as appropriate to inhibit writes. Two methods are supported for inhibiting write data: - suppression of the inner loop controlled write operation @@ -5654,13 +5893,13 @@ and sixteen bit pixel modes. Writes can be suppressed by data being equal, by the Z comparator conditions being met, or by the bit to pixel expansion scheme. -Pipe-lining issues: the data derived comparator outputs are stable +Pipe-lining issues: the data derived comparator outputs are stable until the next data read, well after the affected write from this operation. However, the inner counter bits can count immediately -before the ack for the last write. Therefore, it is necessary to +before the ack for the last write. Therefore, it is necessary to delay bcompbit select terms by one inner loop pipe-line stage, when generating the select for the data control - the output is -delayed one further tick to give it write data timing (2/34). +delayed one further tick to give it write data timing (2/34). There is also a problem with computed data - the new values are calculated before the write associated with the old value has been @@ -5686,9 +5925,9 @@ pipe-lining the comparator inputs where appropriate. step_inner // inner loop advance zcomp[0..3] // output of word zed comparators :IN);*/ -void COMP_CTRL(uint8 &dbinh, bool &nowrite, - bool bcompen, bool big_pix, bool bkgwren, uint8 dcomp, bool dcompen, uint8 icount, - uint8 pixsize, bool phrase_mode, uint8 srcd, uint8 zcomp) +void COMP_CTRL(uint8_t &dbinh, bool &nowrite, + bool bcompen, bool big_pix, bool bkgwren, uint8_t dcomp, bool dcompen, uint8_t icount, + uint8_t pixsize, bool phrase_mode, uint8_t srcd, uint8_t zcomp) { //BEGIN @@ -5709,33 +5948,33 @@ In phrase mode, the eight bits are used directly, and this mode is only applicable to 8-bit pixel mode (2/34) */ /*Bcompselt[0-2] := EO (bcompselt[0-2], icount[0-2], big_pix); -Bcompbit := MX8 (bcompbit, srcd[7], srcd[6], srcd[5], +Bcompbit := MX8 (bcompbit, srcd[7], srcd[6], srcd[5], srcd[4], srcd[3], srcd[2], srcd[1], srcd[0], bcompselt[0..2]); Bcompbit\ := INV1 (bcompbit\, bcompbit);*/ ////////////////////////////////////// C++ CODE ////////////////////////////////////// #ifdef LOG_COMP_CTRL if (logBlit) { - printf("\n [bcompen=%s dcompen=%s phrase_mode=%s bkgwren=%s dcomp=%02X zcomp=%02X]", (bcompen ? "T" : "F"), (dcompen ? "T" : "F"), (phrase_mode ? "T" : "F"), (bkgwren ? "T" : "F"), dcomp, zcomp); - printf("\n "); - fflush(stdout); + WriteLog("\n [bcompen=%s dcompen=%s phrase_mode=%s bkgwren=%s dcomp=%02X zcomp=%02X]", (bcompen ? "T" : "F"), (dcompen ? "T" : "F"), (phrase_mode ? "T" : "F"), (bkgwren ? "T" : "F"), dcomp, zcomp); + WriteLog("\n "); +// fflush(stdout); } #endif - uint8 bcompselt = (big_pix ? ~icount : icount) & 0x07; - uint8 bitmask[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; + uint8_t bcompselt = (big_pix ? ~icount : icount) & 0x07; + uint8_t bitmask[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; bool bcompbit = srcd & bitmask[bcompselt]; ////////////////////////////////////////////////////////////////////////////////////// /* pipe-line the count */ /*Bcompsel[0-2] := FDSYNC (bcompsel[0-2], bcompselt[0-2], step_inner, clk); -Bcompbt := MX8 (bcompbitpt, srcd[7], srcd[6], srcd[5], +Bcompbt := MX8 (bcompbitpt, srcd[7], srcd[6], srcd[5], srcd[4], srcd[3], srcd[2], srcd[1], srcd[0], bcompsel[0..2]); Bcompbitp := FD1Q (bcompbitp, bcompbitpt, clk); Bcompbitp\ := INV1 (bcompbitp\, bcompbitp);*/ /* For pixel mode, generate the write inhibit signal for all modes on bit inhibit, for 8 and 16 bit modes on comparator inhibit, and -for 16 bit mode on Z inhibit +for 16 bit mode on Z inhibit Nowrite = bcompen . /bcompbit . /phrase_mode + dcompen . dcomp[0] . /phrase_mode . pixsize = 011 @@ -5770,14 +6009,14 @@ Winhibit := NAN4 (winhibit, winht, nowt[1..3]);*/ #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[nw=%s wi=%s]", (nowrite ? "T" : "F"), (winhibit ? "T" : "F")); - fflush(stdout); + WriteLog("[nw=%s wi=%s]", (nowrite ? "T" : "F"), (winhibit ? "T" : "F")); +// fflush(stdout); } #endif ////////////////////////////////////////////////////////////////////////////////////// /* For phrase mode, generate the byte inhibit signals for eight bit -mode 011, or sixteen bit mode 100 +mode 011, or sixteen bit mode 100 dbinh\[0] = pixsize[2] . zcomp[0] + pixsize[2] . dcomp[0] . dcomp[1] . dcompen + /pixsize[2] . dcomp[0] . dcompen @@ -5806,8 +6045,8 @@ Dbinh[0] := ANR1P (dbinh\[0], di0t[4], phrase_mode, winhibit);*/ #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[di0t0_1=%s di0t4=%s]", (di0t0_1 ? "T" : "F"), (di0t4 ? "T" : "F")); - fflush(stdout); + WriteLog("[di0t0_1=%s di0t4=%s]", (di0t0_1 ? "T" : "F"), (di0t4 ? "T" : "F")); +// fflush(stdout); } #endif ////////////////////////////////////////////////////////////////////////////////////// @@ -5824,8 +6063,8 @@ Dbinh[1] := ANR1 (dbinh\[1], di1t[2], phrase_mode, winhibit);*/ #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[di1t2=%s]", (di1t2 ? "T" : "F")); - fflush(stdout); + WriteLog("[di1t2=%s]", (di1t2 ? "T" : "F")); +// fflush(stdout); } #endif ////////////////////////////////////////////////////////////////////////////////////// @@ -5849,8 +6088,8 @@ Dbinh[2] := ANR1 (dbinh\[2], di2t[4], phrase_mode, winhibit);*/ #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[di2t0_1=%s di2t4=%s]", (di2t0_1 ? "T" : "F"), (di2t4 ? "T" : "F")); - fflush(stdout); + WriteLog("[di2t0_1=%s di2t4=%s]", (di2t0_1 ? "T" : "F"), (di2t4 ? "T" : "F")); +// fflush(stdout); } #endif ////////////////////////////////////////////////////////////////////////////////////// @@ -5867,8 +6106,8 @@ Dbinh[3] := ANR1 (dbinh\[3], di3t[2], phrase_mode, winhibit);*/ #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[di3t2=%s]", (di3t2 ? "T" : "F")); - fflush(stdout); + WriteLog("[di3t2=%s]", (di3t2 ? "T" : "F")); +// fflush(stdout); } #endif ////////////////////////////////////////////////////////////////////////////////////// @@ -5889,8 +6128,8 @@ Dbinh[4] := NAN2 (dbinh\[4], di4t[4], phrase_mode);*/ #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[di4t0_1=%s di2t4=%s]", (di4t0_1 ? "T" : "F"), (di4t4 ? "T" : "F")); - fflush(stdout); + WriteLog("[di4t0_1=%s di2t4=%s]", (di4t0_1 ? "T" : "F"), (di4t4 ? "T" : "F")); +// fflush(stdout); } #endif ////////////////////////////////////////////////////////////////////////////////////// @@ -5907,8 +6146,8 @@ Dbinh[5] := NAN2 (dbinh\[5], di5t[2], phrase_mode);*/ #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[di5t2=%s]", (di5t2 ? "T" : "F")); - fflush(stdout); + WriteLog("[di5t2=%s]", (di5t2 ? "T" : "F")); +// fflush(stdout); } #endif ////////////////////////////////////////////////////////////////////////////////////// @@ -5929,8 +6168,8 @@ Dbinh[6] := NAN2 (dbinh\[6], di6t[4], phrase_mode);*/ #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[di6t0_1=%s di6t4=%s]", (di6t0_1 ? "T" : "F"), (di6t4 ? "T" : "F")); - fflush(stdout); + WriteLog("[di6t0_1=%s di6t4=%s]", (di6t0_1 ? "T" : "F"), (di6t4 ? "T" : "F")); +// fflush(stdout); } #endif ////////////////////////////////////////////////////////////////////////////////////// @@ -5947,8 +6186,8 @@ Dbinh[7] := NAN2 (dbinh\[7], di7t[2], phrase_mode);*/ #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[di7t2=%s]", (di7t2 ? "T" : "F")); - fflush(stdout); + WriteLog("[di7t2=%s]", (di7t2 ? "T" : "F")); +// fflush(stdout); } #endif ////////////////////////////////////////////////////////////////////////////////////// @@ -5959,8 +6198,8 @@ dbinh = ~dbinh; #ifdef LOG_COMP_CTRL if (logBlit) { - printf("[dcomp=$%02X dbinh=$%02X]\n ", dcomp, dbinh); - fflush(stdout); + WriteLog("[dcomp=$%02X dbinh=$%02X]\n ", dcomp, dbinh); +// fflush(stdout); } #endif } @@ -5969,4 +6208,9 @@ if (logBlit) ////////////////////////////////////// C++ CODE ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// +// !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! +// !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! +// !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! TESTING !!! + #endif +