X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ftom.cpp;h=db3f277e1e3d775d38c5a77ff20ded9faf270493;hb=dffa89ebdee4d328a8e166b30fcdf38a3fc54b28;hp=8a7ec27054cfcd0b171c28773134e70bbdde68d2;hpb=ec46f1b3c40cf464d833e360346b4f6f8379b9ae;p=virtualjaguar diff --git a/src/tom.cpp b/src/tom.cpp index 8a7ec27..db3f277 100644 --- a/src/tom.cpp +++ b/src/tom.cpp @@ -3,10 +3,10 @@ // // Originally by David Raingeard (cal2) // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS) -// Cleanups and endian wrongness amelioration by James L. Hammons +// Cleanups and endian wrongness amelioration by James Hammons // (C) 2010 Underground Software // -// JLH = James L. Hammons +// JLH = James Hammons // // Who When What // --- ---------- ------------------------------------------------------------- @@ -263,7 +263,7 @@ #include "gpu.h" #include "jaguar.h" #include "log.h" -#include "m68k.h" +#include "m68000/m68kinterface.h" //#include "memory.h" #include "op.h" #include "settings.h" @@ -314,8 +314,18 @@ // Also note that VC is in *half* lines, i.e. divide by 2 to get the scanline /*#define LEFT_VISIBLE_HC 208 #define RIGHT_VISIBLE_HC 1528//*/ -#define LEFT_VISIBLE_HC 208 -#define RIGHT_VISIBLE_HC 1488 +// These were right for Rayman, but that one is offset on a real TV too. +//#define LEFT_VISIBLE_HC 208 +//#define RIGHT_VISIBLE_HC 1488 +// This is more like a real TV display... +//#define LEFT_VISIBLE_HC (208 - 32) +//#define RIGHT_VISIBLE_HC (1488 - 32) +// Split the difference? (Seems to be OK for the most part...) + +// (-10 +10)*4 is for opening up the display by 16 pixels (may go to 20). Need to change VIRTUAL_SCREEN_WIDTH to match this as well (went from 320 to 340; this is 4 HCs per one of those pixels). +#define LEFT_VISIBLE_HC (208 - 16 - (8 * 4)) +//#define RIGHT_VISIBLE_HC (1488 - 16 + (10 * 4)) +#define RIGHT_VISIBLE_HC (LEFT_VISIBLE_HC + (VIRTUAL_SCREEN_WIDTH * 4)) //#define TOP_VISIBLE_VC 25 //#define BOTTOM_VISIBLE_VC 503 #define TOP_VISIBLE_VC 31 @@ -324,8 +334,9 @@ //Are these PAL horizontals correct? //They seem to be for the most part, but there are some games that seem to be //shifted over to the right from this "window". -#define LEFT_VISIBLE_HC_PAL 208 -#define RIGHT_VISIBLE_HC_PAL 1488 +#define LEFT_VISIBLE_HC_PAL (208 - 16 - (4 * 4)) +//#define RIGHT_VISIBLE_HC_PAL (1488 - 16 + (10 * 4)) +#define RIGHT_VISIBLE_HC_PAL (LEFT_VISIBLE_HC_PAL + (VIRTUAL_SCREEN_WIDTH * 4)) #define TOP_VISIBLE_VC_PAL 67 #define BOTTOM_VISIBLE_VC_PAL 579 @@ -547,6 +558,7 @@ uint32 RGB16ToRGB32[0x10000]; uint32 CRY16ToRGB32[0x10000]; uint32 MIX16ToRGB32[0x10000]; + #warning "This is not endian-safe. !!! FIX !!!" void TOMFillLookupTables(void) { @@ -578,42 +590,50 @@ void TOMFillLookupTables(void) } } + void TOMSetPendingJERRYInt(void) { tom_jerry_int_pending = 1; } + void TOMSetPendingTimerInt(void) { tom_timer_int_pending = 1; } + void TOMSetPendingObjectInt(void) { tom_object_int_pending = 1; } + void TOMSetPendingGPUInt(void) { tom_gpu_int_pending = 1; } + void TOMSetPendingVideoInt(void) { tom_video_int_pending = 1; } + uint8 * TOMGetRamPointer(void) { return tomRam8; } + uint8 TOMGetVideoMode(void) { uint16 vmode = GET16(tomRam8, VMODE); return ((vmode & VARMOD) >> 6) | ((vmode & MODE) >> 1); } + //Used in only one place (and for debug purposes): OBJECTP.CPP #warning "Used in only one place (and for debug purposes): OBJECTP.CPP !!! FIX !!!" uint16 TOMGetVDB(void) @@ -621,6 +641,8 @@ uint16 TOMGetVDB(void) return GET16(tomRam8, VDB); } + +#define LEFT_BG_FIX // // 16 BPP CRY/RGB mixed mode rendering // @@ -635,15 +657,32 @@ void tom_render_16bpp_cry_rgb_mix_scanline(uint32 * backbuffer) //NOTE: May have to check HDB2 as well! // Get start position in HC ticks int16 startPos = GET16(tomRam8, HDB1) - (vjs.hardwareTypeNTSC ? LEFT_VISIBLE_HC : LEFT_VISIBLE_HC_PAL); + // Convert to pixels startPos /= pwidth; + if (startPos < 0) + // This is x2 because current_line_buffer is uint8 & we're in a 16bpp mode current_line_buffer += 2 * -startPos; else //This case doesn't properly handle the "start on the right side of virtual screen" case //Dunno why--looks Ok... -//What *is* for sure wrong is that it doesn't copy the linebuffer's BG pixels... +//What *is* for sure wrong is that it doesn't copy the linebuffer's BG pixels... [FIXED NOW] //This should likely be 4 instead of 2 (?--not sure) +// Actually, there should be NO multiplier, as startPos is expressed in PIXELS +// and so is the backbuffer. +#ifdef LEFT_BG_FIX + { + uint8 g = tomRam8[BORD1], r = tomRam8[BORD1 + 1], b = tomRam8[BORD2 + 1]; + uint32 pixel = 0x000000FF | (r << 24) | (g << 16) | (b << 8); + + for(int16 i=0; i= 0xF02000 && offset <= 0xF020FF) - WriteLog("TOM: Read attempted from GPU register file by %s (unimplemented)!\n", whoName[who]); + WriteLog("TOM: ReadWord attempted from GPU register file by %s (unimplemented)!\n", whoName[who]); if (offset == 0xF000E0) { @@ -1303,6 +1384,7 @@ if (offset >= 0xF02000 && offset <= 0xF020FF) return (TOMReadByte(offset, who) << 8) | TOMReadByte(offset + 1, who); } + #define TOM_STRICT_MEMORY_ACCESS // // TOM byte access (write) @@ -1386,6 +1468,7 @@ void TOMWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/) tomRam8[offset & 0x3FFF] = data; } + // // TOM word access (write) // @@ -1418,7 +1501,7 @@ void TOMWriteWord(uint32 offset, uint16 data, uint32 who/*=UNKNOWN*/) //if (offset == 0xF00000 + MEMCON2) // WriteLog("TOM: Memory Configuration 2 written by %s: %04X\n", whoName[who], data); if (offset >= 0xF02000 && offset <= 0xF020FF) - WriteLog("TOM: Write attempted to GPU register file by %s (unimplemented)!\n", whoName[who]); + WriteLog("TOM: WriteWord attempted to GPU register file by %s (unimplemented)!\n", whoName[who]); if ((offset >= GPU_CONTROL_RAM_BASE) && (offset < GPU_CONTROL_RAM_BASE+0x20)) { @@ -1585,6 +1668,7 @@ if (offset == HEQ) #endif } + int TOMIRQEnabled(int irq) { // This is the correct byte in big endian... D'oh! @@ -1592,6 +1676,7 @@ int TOMIRQEnabled(int irq) return tomRam8[INT1 + 1/*0xE1*/] & (1 << irq); } + // NEW: // TOM Programmable Interrupt Timer handler // NOTE: TOM's PIT is only enabled if the prescaler is != 0 @@ -1599,6 +1684,7 @@ int TOMIRQEnabled(int irq) void TOMPITCallback(void); + void TOMResetPIT(void) { #ifndef NEW_TIMER_SYSTEM @@ -1621,6 +1707,7 @@ void TOMResetPIT(void) #endif } + // // TOM Programmable Interrupt Timer handler // NOTE: TOM's PIT is only enabled if the prescaler is != 0 @@ -1646,6 +1733,7 @@ void TOMExecPIT(uint32 cycles) } } + void TOMPITCallback(void) { // INT1_RREG |= 0x08; // Set TOM PIT interrupt pending @@ -1658,3 +1746,4 @@ void TOMPITCallback(void) TOMResetPIT(); } +