X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Ftom.cpp;h=845f1551f37f1b88548a3e796ccc39a977300ee6;hb=83fce768d2c1e0e16691c092ea02d64e2b280fad;hp=92280923fb57fb23576b07b582dd81f454594b6e;hpb=7a936c870f76998bc682b7db307d7732e36fbeac;p=virtualjaguar diff --git a/src/tom.cpp b/src/tom.cpp index 9228092..845f155 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,21 @@ // 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). +//NB: Went back to 330. May shrink more. :-) +//#define LEFT_VISIBLE_HC (208 - 16 - (8 * 4)) +//#define LEFT_VISIBLE_HC (208 - 16 - (3 * 4)) +#define LEFT_VISIBLE_HC (208 - 16 - (1 * 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 +337,11 @@ //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 LEFT_VISIBLE_HC_PAL (208 - 16 - (-1 * 4)) +#define LEFT_VISIBLE_HC_PAL (208 - 16 - (-3 * 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 +563,7 @@ uint32 RGB16ToRGB32[0x10000]; uint32 CRY16ToRGB32[0x10000]; uint32 MIX16ToRGB32[0x10000]; + #warning "This is not endian-safe. !!! FIX !!!" void TOMFillLookupTables(void) { @@ -578,42 +595,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 +646,8 @@ uint16 TOMGetVDB(void) return GET16(tomRam8, VDB); } + +#define LEFT_BG_FIX // // 16 BPP CRY/RGB mixed mode rendering // @@ -635,15 +662,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) { @@ -1255,6 +1389,7 @@ if (offset >= 0xF02000 && offset <= 0xF020FF) return (TOMReadByte(offset, who) << 8) | TOMReadByte(offset + 1, who); } + #define TOM_STRICT_MEMORY_ACCESS // // TOM byte access (write) @@ -1338,6 +1473,7 @@ void TOMWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/) tomRam8[offset & 0x3FFF] = data; } + // // TOM word access (write) // @@ -1370,7 +1506,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)) { @@ -1537,6 +1673,7 @@ if (offset == HEQ) #endif } + int TOMIRQEnabled(int irq) { // This is the correct byte in big endian... D'oh! @@ -1544,6 +1681,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 @@ -1551,6 +1689,7 @@ int TOMIRQEnabled(int irq) void TOMPITCallback(void); + void TOMResetPIT(void) { #ifndef NEW_TIMER_SYSTEM @@ -1573,6 +1712,7 @@ void TOMResetPIT(void) #endif } + // // TOM Programmable Interrupt Timer handler // NOTE: TOM's PIT is only enabled if the prescaler is != 0 @@ -1598,6 +1738,7 @@ void TOMExecPIT(uint32 cycles) } } + void TOMPITCallback(void) { // INT1_RREG |= 0x08; // Set TOM PIT interrupt pending @@ -1610,3 +1751,4 @@ void TOMPITCallback(void) TOMResetPIT(); } +