From 0219258ee9975abb5db4561c77fb971e801d0dbf Mon Sep 17 00:00:00 2001 From: Godzil Date: Mon, 2 Sep 2019 16:02:03 +0100 Subject: [PATCH] Now build on x64 platform, still need lots of rework... --- .gitignore | 2 + Makefile | 7 + oswan/Makefile | 10 +- oswan/source/2xSaI.cpp | 2 +- oswan/source/SDLptc.h | 2 +- oswan/source/audio.cpp | 41 +- oswan/source/filters/filter_partA.h | 9 +- oswan/source/filters/filter_partB.h | 8 +- oswan/source/filters/filter_partC.h | 2 +- oswan/source/filters/filter_partD.h | 2 +- oswan/source/filters/filter_partE.h | 4 +- oswan/source/gpu.cpp | 244 +++-- oswan/source/gpu.cpp.orig | 1580 --------------------------- oswan/source/io.cpp | 22 +- oswan/source/memory.cpp | 12 +- oswan/source/nec/nec.cpp | 23 +- oswan/source/nec/nec.h | 22 +- oswan/source/ws.cpp | 3 +- seal-hack/include/audio.h | 17 +- seal-hack/lib/SDL/libaudio.a | Bin 216424 -> 0 bytes seal-hack/src/Makefile | 6 +- seal-hack/src/audio.h | 12 +- seal-hack/src/mixdrv.c | 15 +- seal-hack/src/modeng.c | 1 + seal-hack/src/modfile.c | 6 +- seal-hack/src/mp | Bin 83520 -> 0 bytes seal-hack/src/mp.c | 5 +- seal-hack/src/mtmfile.c | 6 +- seal-hack/src/s3mfile.c | 2 +- seal-hack/src/sdldrv.c | 7 +- seal-hack/src/xmfile.c | 9 +- 31 files changed, 310 insertions(+), 1771 deletions(-) create mode 100644 Makefile delete mode 100644 oswan/source/gpu.cpp.orig delete mode 100644 seal-hack/lib/SDL/libaudio.a delete mode 100755 seal-hack/src/mp diff --git a/.gitignore b/.gitignore index 3e94626..d46afd3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,11 @@ .DS_Store *.bak +*.a *.o *.bin *.wsc *~ +seal-hack/src/mp testserial wonderswan *.orig diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f7d40b6 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +all: + make -C seal-hack + make -C oswan + +clean: + make -C seal-hack clean + make -C oswan clean diff --git a/oswan/Makefile b/oswan/Makefile index 3d718e4..365cd60 100644 --- a/oswan/Makefile +++ b/oswan/Makefile @@ -16,12 +16,14 @@ OBJS = $(wonderswan_CXX_SRCS:.cpp=.o) all: wonderswan -CXX = clang++ -CXXFLAGS = -g -O2 `sdl-config --cflags` -arch i386 -OPTIONS = -D_REENTRANT -I. -I../seal-hack/include +CXX = g++ +CXXFLAGS = -g -O2 `sdl-config --cflags` -Wall -Werror -std=c++98 -Wno-write-strings +#-arch i386 +OPTIONS = -D_REENTRANT -I. -I../seal-hack/src/ LIBRARY_PATH = -L../seal-hack/lib/SDL -LIBS = -g $(LIBRARY_PATH) `sdl-config --libs` -arch i386 +LIBS = -g $(LIBRARY_PATH) `sdl-config --libs` +#-arch i386 ALLCFLAGS = $(CFLAGS) $(CEXTRA) $(OPTIONS) $(ALLFLAGS) ALLCXXFLAGS=$(CXXFLAGS) $(CXXEXTRA) $(OPTIONS) $(ALLFLAGS) diff --git a/oswan/source/2xSaI.cpp b/oswan/source/2xSaI.cpp index 006b254..eafef77 100644 --- a/oswan/source/2xSaI.cpp +++ b/oswan/source/2xSaI.cpp @@ -299,7 +299,7 @@ void SuperEagle (u8 *srcPtr, u32 srcPitch, u8 *deltaPtr, { u8 *dP; u16 *bP; - u16 *xP; + //u16 *xP; u32 inc_bP; { diff --git a/oswan/source/SDLptc.h b/oswan/source/SDLptc.h index d432a84..5233b7c 100644 --- a/oswan/source/SDLptc.h +++ b/oswan/source/SDLptc.h @@ -102,7 +102,7 @@ public: nupdates = 0; is_console = 1; } - ~Surface() { + virtual ~Surface() { if ( ! is_console ) { SDL_FreeSurface(surface); } diff --git a/oswan/source/audio.cpp b/oswan/source/audio.cpp index a55af2c..8c73276 100644 --- a/oswan/source/audio.cpp +++ b/oswan/source/audio.cpp @@ -12,8 +12,8 @@ //////////////////////////////////////////////////////////////////////////////// // alternate the commenting of the following defines to get audio port tracing -#define dbgprintf // -//#define dbgprintf printf +#define dbgprintf(...) +//#define dbgprintf(...) printf(...) #include #include @@ -234,11 +234,13 @@ void ws_audio_port_write(Uint32 port, Uint8 value) ws_audio_set_channel_frequency(3,i); break; case 0x88: - dbgprintf("0x88 <- 0x%2x\n", value); fflush(stdout); + dbgprintf("0x88 <- 0x%2x\n", value); + // fflush(stdout); ws_audio_set_channel_pan(0,(value&0xF0)>>4,value&0x0F); break; case 0x89: - dbgprintf("0x89 <- 0x%2x\n", value); fflush(stdout); + dbgprintf("0x89 <- 0x%2x\n", value); + // fflush(stdout); ws_audio_set_channel_pan(1,(value&0xF0)>>4,value&0x0F); break; case 0x8A: @@ -256,7 +258,8 @@ void ws_audio_port_write(Uint32 port, Uint8 value) SwpTime=(((unsigned int)value)+1)<<5; break; case 0x8E: - dbgprintf("0x8E <- 0x%2x = %d %d %d %d %d %d %d %d \n", value, value & 0x80 ? 1 : 0, value & 0x40 ? 1 : 0, value & 0x20 ? 1 : 0, value & 0x10 ? 1 : 0, value & 8 ? 1 : 0, value & 4 ? 1 : 0, value & 2 ? 1 : 0, value & 1), fflush(stdout); /* ctl */ + dbgprintf("0x8E <- 0x%2x = %d %d %d %d %d %d %d %d \n", value, value & 0x80 ? 1 : 0, value & 0x40 ? 1 : 0, value & 0x20 ? 1 : 0, value & 0x10 ? 1 : 0, value & 8 ? 1 : 0, value & 4 ? 1 : 0, value & 2 ? 1 : 0, value & 1); + //fflush(stdout); /* ctl */ if (value & 0x10) { ws_audio_set_channel_pdata(5,value&0x07); @@ -269,7 +272,8 @@ void ws_audio_port_write(Uint32 port, Uint8 value) WaveMap=((unsigned int)value)<<6; break; case 0x90: - dbgprintf("0x90 <- 0x%2x = %d %d %d %d %d %d %d %d \n", value, value & 0x80 ? 1 : 0, value & 0x40 ? 1 : 0, value & 0x20 ? 1 : 0, value & 0x10 ? 1 : 0, value & 8 ? 1 : 0, value & 4 ? 1 : 0, value & 2 ? 1 : 0, value & 1), fflush(stdout); /* ctl */ + dbgprintf("0x90 <- 0x%2x = %d %d %d %d %d %d %d %d \n", value, value & 0x80 ? 1 : 0, value & 0x40 ? 1 : 0, value & 0x20 ? 1 : 0, value & 0x10 ? 1 : 0, value & 8 ? 1 : 0, value & 4 ? 1 : 0, value & 2 ? 1 : 0, value & 1); + //fflush(stdout); /* ctl */ if (value&0x01) { @@ -515,9 +519,10 @@ int ws_audio_seal_init(void) AGetAudioDevCaps(nDevId, &caps); fprintf(log_get(),"audio: %2d. %s\n", nDevId, caps.szProductName); } + /* open audio device */ //info.nDeviceId = AUDIO_DEVICE_MAPPER; - info.nDeviceId = 1; + info.nDeviceId = 0; info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO; // | AUDIO_MIXER_BASS; info.nSampleRate = 44100; if ((rc = AOpenAudio(&info)) != AUDIO_ERROR_NONE) @@ -664,7 +669,7 @@ void ws_audio_seal_done(void) ADestroyAudioData(&ws_audio_sweep_wave); // release pcm channels - for (i=0;i<6;i++) + for (i=0;i<4;i++) ADestroyAudioVoice(ws_audio_pcm_voice[i]); // release noise channel @@ -1091,9 +1096,9 @@ void ws_audio_set_pcm(int Data) //////////////////////////////////////////////////////////////////////////////// void ws_audio_flash_pcm(void) { - int result; - void *ptr1,*ptr2; - DWORD len1,len2; + //int result; + //void *ptr1,*ptr2; + DWORD len1; //,len2; const DWORD WrPos[16]= { @@ -1104,6 +1109,10 @@ void ws_audio_flash_pcm(void) }; len1=BUFSIZEP; + + if (ws_audio_noise_wave.lpData == NULL) + return; + memcpy(&ws_audio_noise_wave.lpData[WrPos[PcmWrPos]], PDataP, len1); AWriteAudioData(&ws_audio_noise_wave, 0, ws_audio_noise_wave.dwLength); @@ -1317,11 +1326,11 @@ void ws_audio_readState(int fp) //////////////////////////////////////////////////////////////////////////////// void ws_audio_writeState(int fp) { - long lpdwPosition; - long lpdwFrequency; - unsigned int lpnVolume; - unsigned int lpnPanning; - int lpnStatus; + int32_t lpdwPosition; + int32_t lpdwFrequency; + uint16_t lpnVolume; + uint16_t lpnPanning; + int8_t lpnStatus; write(fp,&PCMPos,sizeof(DWORD)); write(fp,&TickZ,sizeof(DWORD)); diff --git a/oswan/source/filters/filter_partA.h b/oswan/source/filters/filter_partA.h index 1dc04f5..659879e 100644 --- a/oswan/source/filters/filter_partA.h +++ b/oswan/source/filters/filter_partA.h @@ -1,8 +1,9 @@ - Sint32 startTime, endTime, totalFrames; - Uint32 nNormalLast=0; - Sint32 nNormalFrac=0; - Sint32 nTime=0,nCount=0; int i=0; + //Sint32 startTime, endTime, totalFrames; + //Uint32 nNormalLast=0; + //Sint32 nNormalFrac=0; + //Sint32 nTime=0, + Sint32 nCount=0; int i=0; double dTime = 0.0, dNormalLast = 0.0, dTemp; Sint32 surfacePitch; diff --git a/oswan/source/filters/filter_partB.h b/oswan/source/filters/filter_partB.h index 51860c0..4936663 100644 --- a/oswan/source/filters/filter_partB.h +++ b/oswan/source/filters/filter_partB.h @@ -8,10 +8,10 @@ console.option("windowed output"); console.option("fixed window"); console.option("center window"); - totalFrames=0; - startTime=clock(); - nNormalLast=0;// Last value of timeGetTime() - nNormalFrac=0; // Extra fraction we did + //totalFrames=0; + //startTime=clock(); + //nNormalLast=0;// Last value of timeGetTime() + //nNormalFrac=0; // Extra fraction we did //nNormalLast=timeGetTime(); // hopefully, we only care about time delta, not time of day... //nNormalLast = SDL_GetTicks(); diff --git a/oswan/source/filters/filter_partC.h b/oswan/source/filters/filter_partC.h index 830bb79..4026006 100644 --- a/oswan/source/filters/filter_partC.h +++ b/oswan/source/filters/filter_partC.h @@ -47,7 +47,7 @@ strcpy(old_rom_path,ws_rom_path); //gui_open(); #ifndef GUI_OPEN_WARNED -#warning XXX something ought to take place here... +//#warning XXX something ought to take place here... #define GUI_OPEN_WARNED #endif app_terminate = 1; diff --git a/oswan/source/filters/filter_partD.h b/oswan/source/filters/filter_partD.h index a89be85..793ac9d 100644 --- a/oswan/source/filters/filter_partD.h +++ b/oswan/source/filters/filter_partD.h @@ -6,5 +6,5 @@ while (!ws_executeLine(backbuffer,0)); while (!ws_executeLine(backbuffer,1)); - totalFrames++; + //totalFrames++; diff --git a/oswan/source/filters/filter_partE.h b/oswan/source/filters/filter_partE.h index 0d5a91b..2b27c2c 100644 --- a/oswan/source/filters/filter_partE.h +++ b/oswan/source/filters/filter_partE.h @@ -1,4 +1,4 @@ - endTime=clock(); - float fps=totalFrames/(((float)(endTime-startTime))/(float)CLOCKS_PER_SEC); + //endTime=clock(); + //float fps=totalFrames/(((float)(endTime-startTime))/(float)CLOCKS_PER_SEC); console.close(); delete surface; diff --git a/oswan/source/gpu.cpp b/oswan/source/gpu.cpp index 3880558..ee19bec 100644 --- a/oswan/source/gpu.cpp +++ b/oswan/source/gpu.cpp @@ -759,14 +759,22 @@ void ws_gpu_renderScanline(int16 *framebuffer) uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); int16 *wsc_paletteAlias=&wsc_palette[((tileInfo>>9)&0x0f)<<4]; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; } // render the last clipped tile @@ -835,25 +843,41 @@ void ws_gpu_renderScanline(int16 *framebuffer) if ((tileInfo>>9)&0x04) { - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; } else { - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; } } @@ -937,9 +961,9 @@ void ws_gpu_renderScanline(int16 *framebuffer) if (ws_ioRam[0x00]&0x02) { int ws_fgWindow_x0=ws_ioRam[0x08]; - int ws_fgWindow_y0=ws_ioRam[0x09]; + //int ws_fgWindow_y0=ws_ioRam[0x09]; int ws_fgWindow_x1=ws_ioRam[0x0a]; - int ws_fgWindow_y1=ws_ioRam[0x0b]; + //int ws_fgWindow_y1=ws_ioRam[0x0b]; int ws_fgScroll_x=ws_ioRam[0x12]; int ws_fgScroll_y=ws_ioRam[0x13]; @@ -998,14 +1022,22 @@ void ws_gpu_renderScanline(int16 *framebuffer) int16 *wsc_paletteAlias=&wsc_palette[((tileInfo>>9)&0x0f)<<4]; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; } // render the last clipped tile @@ -1073,25 +1105,41 @@ void ws_gpu_renderScanline(int16 *framebuffer) if ((tileInfo>>9)&0x04) { - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; } else { - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; + *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; } } @@ -1170,14 +1218,22 @@ void ws_gpu_renderScanline(int16 *framebuffer) - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; } // render the last clipped tile @@ -1235,14 +1291,22 @@ void ws_gpu_renderScanline(int16 *framebuffer) int16 *ws_paletteAlias=&ws_palette[((tileInfo>>9)&0x0f)<<2]; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; } // render the last clipped tile @@ -1309,14 +1373,22 @@ void ws_gpu_renderScanline(int16 *framebuffer) - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; + scanlinePtr++; ws_tileRow++; column++; } // render the last clipped tile @@ -1372,14 +1444,22 @@ void ws_gpu_renderScanline(int16 *framebuffer) uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); int16 *ws_paletteAlias=&ws_palette[((tileInfo>>9)&0x0f)<<2]; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; + if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; + scanlinePtr++; ws_tileRow++; column++; } // render the last clipped tile diff --git a/oswan/source/gpu.cpp.orig b/oswan/source/gpu.cpp.orig deleted file mode 100644 index 41c2360..0000000 --- a/oswan/source/gpu.cpp.orig +++ /dev/null @@ -1,1580 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// GPU -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// 7.04.2002: Fixed sprites order -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// - -//#define STATISTICS - -#include -#include -#include -#include -#include -#include -#include "log.h" -#include "rom.h" -#include "./nec/nec.h" -#include "io.h" -#include "gpu.h" - -#ifdef STATISTICS - #include "ticker.h" -#endif -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -extern uint8 *internalRam; - -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -#ifdef STATISTICS - long ws_4_shades_tiles_cache_update_time=0; - long ws_4_colors_tiles_cache_update_time=0; - long ws_16_colors_packed_tiles_cache_update_time=0; - long ws_16_colors_layered_tiles_cache_update_time=0; - - long ws_4_shades_tiles_cache_update_number=0; - long ws_4_colors_tiles_cache_update_number=0; - long ws_16_colors_packed_tiles_cache_update_number=0; - long ws_16_colors_layered_tiles_cache_update_number=0; - - long ws_background_color_rendering_time=0; - long ws_background_rendering_time=0; - long ws_foreground_rendering_time=0; - long ws_priority_0_sprites_rendering_time=0; - long ws_priority_1_sprites_rendering_time=0; -#endif -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -#define RGB555(R,G,B) ((((int)(R))<<10)|(((int)(G))<<5)|((int)(B))) - -uint8 ws_gpu_operatingInColor; -uint8 ws_videoMode; -uint8 ws_gpu_scanline=0; -int16 ws_palette[16*4]; -int8 ws_paletteColors[8]; -int16 wsc_palette[16*16]; -int16 ws_shades[16]; -int ws_gpu_forceColorSystemBool=0; -int ws_gpu_forceMonoSystemBool=0; - - - -// white -#define SHADE_COLOR_RED 1.00 -#define SHADE_COLOR_GREEN 1.00 -#define SHADE_COLOR_BLUE 1.00 - -int16 ws_colour_scheme_default[16]={ - RGB555(SHADE_COLOR_RED*30,SHADE_COLOR_GREEN*30,SHADE_COLOR_BLUE*30), - RGB555(SHADE_COLOR_RED*28,SHADE_COLOR_GREEN*28,SHADE_COLOR_BLUE*28), - RGB555(SHADE_COLOR_RED*26,SHADE_COLOR_GREEN*26,SHADE_COLOR_BLUE*26), - RGB555(SHADE_COLOR_RED*24,SHADE_COLOR_GREEN*24,SHADE_COLOR_BLUE*24), - RGB555(SHADE_COLOR_RED*22,SHADE_COLOR_GREEN*22,SHADE_COLOR_BLUE*22), - RGB555(SHADE_COLOR_RED*20,SHADE_COLOR_GREEN*20,SHADE_COLOR_BLUE*20), - RGB555(SHADE_COLOR_RED*18,SHADE_COLOR_GREEN*18,SHADE_COLOR_BLUE*18), - RGB555(SHADE_COLOR_RED*16,SHADE_COLOR_GREEN*16,SHADE_COLOR_BLUE*16), - RGB555(SHADE_COLOR_RED*14,SHADE_COLOR_GREEN*14,SHADE_COLOR_BLUE*14), - RGB555(SHADE_COLOR_RED*12,SHADE_COLOR_GREEN*12,SHADE_COLOR_BLUE*12), - RGB555(SHADE_COLOR_RED*10,SHADE_COLOR_GREEN*10,SHADE_COLOR_BLUE*10), - RGB555(SHADE_COLOR_RED*8,SHADE_COLOR_GREEN*8,SHADE_COLOR_BLUE*8), - RGB555(SHADE_COLOR_RED*6,SHADE_COLOR_GREEN*6,SHADE_COLOR_BLUE*6), - RGB555(SHADE_COLOR_RED*4,SHADE_COLOR_GREEN*4,SHADE_COLOR_BLUE*4), - RGB555(SHADE_COLOR_RED*2,SHADE_COLOR_GREEN*2,SHADE_COLOR_BLUE*2), - RGB555(SHADE_COLOR_RED*0,SHADE_COLOR_GREEN*0,SHADE_COLOR_BLUE*0) - }; -// green -#undef SHADE_COLOR_RED -#undef SHADE_COLOR_GREEN -#undef SHADE_COLOR_BLUE -#define SHADE_COLOR_RED 0.20 -#define SHADE_COLOR_GREEN 0.90 -#define SHADE_COLOR_BLUE 0.20 - -int16 ws_colour_scheme_green[16]={ - RGB555(SHADE_COLOR_RED*30,SHADE_COLOR_GREEN*30,SHADE_COLOR_BLUE*30), - RGB555(SHADE_COLOR_RED*28,SHADE_COLOR_GREEN*28,SHADE_COLOR_BLUE*28), - RGB555(SHADE_COLOR_RED*26,SHADE_COLOR_GREEN*26,SHADE_COLOR_BLUE*26), - RGB555(SHADE_COLOR_RED*24,SHADE_COLOR_GREEN*24,SHADE_COLOR_BLUE*24), - RGB555(SHADE_COLOR_RED*22,SHADE_COLOR_GREEN*22,SHADE_COLOR_BLUE*22), - RGB555(SHADE_COLOR_RED*20,SHADE_COLOR_GREEN*20,SHADE_COLOR_BLUE*20), - RGB555(SHADE_COLOR_RED*18,SHADE_COLOR_GREEN*18,SHADE_COLOR_BLUE*18), - RGB555(SHADE_COLOR_RED*16,SHADE_COLOR_GREEN*16,SHADE_COLOR_BLUE*16), - RGB555(SHADE_COLOR_RED*14,SHADE_COLOR_GREEN*14,SHADE_COLOR_BLUE*14), - RGB555(SHADE_COLOR_RED*12,SHADE_COLOR_GREEN*12,SHADE_COLOR_BLUE*12), - RGB555(SHADE_COLOR_RED*10,SHADE_COLOR_GREEN*10,SHADE_COLOR_BLUE*10), - RGB555(SHADE_COLOR_RED*8,SHADE_COLOR_GREEN*8,SHADE_COLOR_BLUE*8), - RGB555(SHADE_COLOR_RED*6,SHADE_COLOR_GREEN*6,SHADE_COLOR_BLUE*6), - RGB555(SHADE_COLOR_RED*4,SHADE_COLOR_GREEN*4,SHADE_COLOR_BLUE*4), - RGB555(SHADE_COLOR_RED*2,SHADE_COLOR_GREEN*2,SHADE_COLOR_BLUE*2), - RGB555(SHADE_COLOR_RED*0,SHADE_COLOR_GREEN*0,SHADE_COLOR_BLUE*0) - }; -// amber -#undef SHADE_COLOR_RED -#undef SHADE_COLOR_GREEN -#undef SHADE_COLOR_BLUE -#define SHADE_COLOR_RED 1.00 -#define SHADE_COLOR_GREEN 0.61 -#define SHADE_COLOR_BLUE 0.00 - -int16 ws_colour_scheme_amber[16]={ - RGB555(SHADE_COLOR_RED*30,SHADE_COLOR_GREEN*30,SHADE_COLOR_BLUE*30), - RGB555(SHADE_COLOR_RED*28,SHADE_COLOR_GREEN*28,SHADE_COLOR_BLUE*28), - RGB555(SHADE_COLOR_RED*26,SHADE_COLOR_GREEN*26,SHADE_COLOR_BLUE*26), - RGB555(SHADE_COLOR_RED*24,SHADE_COLOR_GREEN*24,SHADE_COLOR_BLUE*24), - RGB555(SHADE_COLOR_RED*22,SHADE_COLOR_GREEN*22,SHADE_COLOR_BLUE*22), - RGB555(SHADE_COLOR_RED*20,SHADE_COLOR_GREEN*20,SHADE_COLOR_BLUE*20), - RGB555(SHADE_COLOR_RED*18,SHADE_COLOR_GREEN*18,SHADE_COLOR_BLUE*18), - RGB555(SHADE_COLOR_RED*16,SHADE_COLOR_GREEN*16,SHADE_COLOR_BLUE*16), - RGB555(SHADE_COLOR_RED*14,SHADE_COLOR_GREEN*14,SHADE_COLOR_BLUE*14), - RGB555(SHADE_COLOR_RED*12,SHADE_COLOR_GREEN*12,SHADE_COLOR_BLUE*12), - RGB555(SHADE_COLOR_RED*10,SHADE_COLOR_GREEN*10,SHADE_COLOR_BLUE*10), - RGB555(SHADE_COLOR_RED*8,SHADE_COLOR_GREEN*8,SHADE_COLOR_BLUE*8), - RGB555(SHADE_COLOR_RED*6,SHADE_COLOR_GREEN*6,SHADE_COLOR_BLUE*6), - RGB555(SHADE_COLOR_RED*4,SHADE_COLOR_GREEN*4,SHADE_COLOR_BLUE*4), - RGB555(SHADE_COLOR_RED*2,SHADE_COLOR_GREEN*2,SHADE_COLOR_BLUE*2), - RGB555(SHADE_COLOR_RED*0,SHADE_COLOR_GREEN*0,SHADE_COLOR_BLUE*0) - }; - -uint8 *ws_tile_cache; -uint8 *ws_hflipped_tile_cache; - -uint8 *wsc_tile_cache; -uint8 *wsc_hflipped_tile_cache; - -uint8 *ws_modified_tile; -uint8 *wsc_modified_tile; - -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_set_colour_scheme(int scheme) -{ - switch (scheme) - { - case COLOUR_SCHEME_DEFAULT: memcpy(ws_shades,ws_colour_scheme_default,16*sizeof(int16)); break; - case COLOUR_SCHEME_AMBER : memcpy(ws_shades,ws_colour_scheme_amber,16*sizeof(int16)); break; - case COLOUR_SCHEME_GREEN : memcpy(ws_shades,ws_colour_scheme_green,16*sizeof(int16)); break; - } -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_forceColorSystem(void) -{ - ws_gpu_forceColorSystemBool=1; - ws_gpu_forceMonoSystemBool=0; - ws_gpu_operatingInColor=1; -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_forceMonoSystem(void) -{ - ws_gpu_forceColorSystemBool=0; - ws_gpu_forceMonoSystemBool=1; - ws_gpu_operatingInColor=0; -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_init(void) -{ - ws_tile_cache = (uint8*)malloc(512*8*8); - wsc_tile_cache = (uint8*)malloc(1024*8*8); - - ws_hflipped_tile_cache = (uint8*)malloc(512*8*8); - wsc_hflipped_tile_cache = (uint8*)malloc(1024*8*8); - - ws_modified_tile = (uint8*)malloc(512); - wsc_modified_tile = (uint8*)malloc(1024); - - memset(ws_tile_cache,0x00,512*8*8); - memset(wsc_tile_cache,0x00,1024*8*8); - - memset(ws_hflipped_tile_cache,0x00,512*8*8); - memset(wsc_hflipped_tile_cache,0x00,1024*8*8); - - memset(ws_modified_tile,0x01,512); - memset(wsc_modified_tile,0x01,1024); - - ws_gpu_forceColorSystemBool=0; - ws_gpu_forceMonoSystemBool=0; -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_done(void) -{ - free(ws_tile_cache); - free(wsc_tile_cache); - free(ws_hflipped_tile_cache); - free(wsc_hflipped_tile_cache); - free(ws_modified_tile); - free(wsc_modified_tile); -#ifdef STATISTICS - printf("Statistics:\n"); - printf("\tcache:\n"); - if (ws_4_shades_tiles_cache_update_number) - printf("\t\t4 shades tiles update time : %i\n",ws_4_shades_tiles_cache_update_time/ws_4_shades_tiles_cache_update_number); - if (ws_4_colors_tiles_cache_update_number) - printf("\t\t4 colors tiles update time : %i\n",ws_4_colors_tiles_cache_update_time/ws_4_colors_tiles_cache_update_number); - if (ws_16_colors_packed_tiles_cache_update_number) - printf("\t\t16 colors packed tiles update time : %i\n",ws_16_colors_packed_tiles_cache_update_time/ws_16_colors_packed_tiles_cache_update_number); - if (ws_16_colors_layered_tiles_cache_update_number) - printf("\t\t16 colors layered tiles update time: %i\n",ws_16_colors_layered_tiles_cache_update_time/ws_16_colors_layered_tiles_cache_update_number); - - printf("\tscanline rendering:\n"); - long total= ws_background_color_rendering_time+ws_background_rendering_time+ - ws_foreground_rendering_time+ws_priority_0_sprites_rendering_time+ - ws_priority_1_sprites_rendering_time; - printf("\t\tbackground color : %4i (%3i %%)\n",ws_background_color_rendering_time,(ws_background_color_rendering_time*100)/total); - printf("\t\tbackground : %4i (%3i %%)\n",ws_background_rendering_time,(ws_background_rendering_time*100)/total); - printf("\t\tforeground : %4i (%3i %%)\n",ws_foreground_rendering_time,(ws_foreground_rendering_time*100)/total); - printf("\t\tpriority 0 sprites : %4i (%3i %%)\n",ws_priority_0_sprites_rendering_time,(ws_priority_0_sprites_rendering_time*100)/total); - printf("\t\tpriority 1 sprites : %4i (%3i %%)\n",ws_priority_1_sprites_rendering_time,(ws_priority_1_sprites_rendering_time*100)/total); -#endif -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_changeVideoMode(uint8 value) -{ - if (ws_videoMode!=(value>>5)) - { - ws_videoMode=value>>5; - if (ws_videoMode==4) - ws_videoMode=2; - - // mark all tiles dirty - memset(wsc_modified_tile,0x01,1024); - memset(ws_modified_tile,0x01,512); - } -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_reset(void) -{ - memset(wsc_modified_tile,0x01,1024); - memset(ws_modified_tile,0x01,512); - ws_gpu_scanline=0; - ws_gpu_changeVideoMode(2); -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_clearCache(void) -{ - memset(wsc_modified_tile,0x01,1024); - memset(ws_modified_tile,0x01,512); -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -uint8 *ws_tileCache_getTileRow(uint32 tileIndex, uint32 line, - uint32 vFlip, uint32 hFlip, uint32 bank) -{ - if (ws_gpu_operatingInColor) - { - if (bank) - tileIndex+=512; - - // need to update tile cache ? - // 4 colors tiles - if ((ws_videoMode==2)&&(ws_modified_tile[tileIndex])) - { -#ifdef STATISTICS - ws_4_colors_tiles_cache_update_time+=-ticker(); -#endif - uint8 *tileInCachePtr = &wsc_tile_cache[tileIndex<<6]; - uint8 *hflippedTileInCachePtr = &wsc_hflipped_tile_cache[tileIndex<<6]; - uint16 *tileInRamPtr = (uint16*)&internalRam[0x2000+(tileIndex<<4)]; - uint16 tileLine; - - for (int line=0;line<8;line++) - { - tileLine=*tileInRamPtr++; - - tileInCachePtr[0]=((tileLine&0x80)>>7)|((tileLine&0x8000)>>14); - hflippedTileInCachePtr[7]=tileInCachePtr[0]; - tileInCachePtr[1]=((tileLine&0x40)>>6)|((tileLine&0x4000)>>13); - hflippedTileInCachePtr[6]=tileInCachePtr[1]; - tileInCachePtr[2]=((tileLine&0x20)>>5)|((tileLine&0x2000)>>12); - hflippedTileInCachePtr[5]=tileInCachePtr[2]; - tileInCachePtr[3]=((tileLine&0x10)>>4)|((tileLine&0x1000)>>11); - hflippedTileInCachePtr[4]=tileInCachePtr[3]; - tileInCachePtr[4]=((tileLine&0x08)>>3)|((tileLine&0x0800)>>10); - hflippedTileInCachePtr[3]=tileInCachePtr[4]; - tileInCachePtr[5]=((tileLine&0x04)>>2)|((tileLine&0x0400)>>9); - hflippedTileInCachePtr[2]=tileInCachePtr[5]; - tileInCachePtr[6]=((tileLine&0x02)>>1)|((tileLine&0x0200)>>8); - hflippedTileInCachePtr[1]=tileInCachePtr[6]; - tileInCachePtr[7]=((tileLine&0x01)>>0)|((tileLine&0x0100)>>7); - hflippedTileInCachePtr[0]=tileInCachePtr[7]; - - tileInCachePtr+=8; - hflippedTileInCachePtr+=8; - } - ws_modified_tile[tileIndex]=0; -#ifdef STATISTICS - ws_4_colors_tiles_cache_update_time+=ticker(); - ws_4_colors_tiles_cache_update_number++; -#endif - } - else - if (wsc_modified_tile[tileIndex]) - { - // 16 colors by tile layered mode - if (ws_videoMode==6) - { -#ifdef STATISTICS - ws_16_colors_layered_tiles_cache_update_time+=-ticker(); -#endif - uint8 *tileInCachePtr = &wsc_tile_cache[tileIndex<<6]; - uint8 *hflippedTileInCachePtr = &wsc_hflipped_tile_cache[tileIndex<<6]; - uint32 *tileInRamPtr = (uint32*)&internalRam[0x4000+(tileIndex<<5)]; - uint32 tileLine; - - for (int line=0;line<8;line++) - { - tileLine=*tileInRamPtr++; - - tileInCachePtr[0]=((tileLine&0x00000080)>>7)|((tileLine&0x00008000)>>14)| - ((tileLine&0x00800000)>>21)|((tileLine&0x80000000)>>28); - hflippedTileInCachePtr[7]=tileInCachePtr[0]; - - tileInCachePtr[1]=((tileLine&0x00000040)>>6)|((tileLine&0x00004000)>>13)| - ((tileLine&0x00400000)>>20)|((tileLine&0x40000000)>>27); - hflippedTileInCachePtr[6]=tileInCachePtr[1]; - - tileInCachePtr[2]=((tileLine&0x00000020)>>5)|((tileLine&0x00002000)>>12)| - ((tileLine&0x00200000)>>19)|((tileLine&0x20000000)>>26); - hflippedTileInCachePtr[5]=tileInCachePtr[2]; - - tileInCachePtr[3]=((tileLine&0x00000010)>>4)|((tileLine&0x00001000)>>11)| - ((tileLine&0x00100000)>>18)|((tileLine&0x10000000)>>25); - hflippedTileInCachePtr[4]=tileInCachePtr[3]; - - tileInCachePtr[4]=((tileLine&0x00000008)>>3)|((tileLine&0x00000800)>>10)| - ((tileLine&0x00080000)>>17)|((tileLine&0x08000000)>>24); - hflippedTileInCachePtr[3]=tileInCachePtr[4]; - - tileInCachePtr[5]=((tileLine&0x00000004)>>2)|((tileLine&0x00000400)>>9)| - ((tileLine&0x00040000)>>16)|((tileLine&0x04000000)>>23); - hflippedTileInCachePtr[2]=tileInCachePtr[5]; - - tileInCachePtr[6]=((tileLine&0x00000002)>>1)|((tileLine&0x00000200)>>8)| - ((tileLine&0x00020000)>>15)|((tileLine&0x02000000)>>22); - hflippedTileInCachePtr[1]=tileInCachePtr[6]; - - tileInCachePtr[7]=((tileLine&0x00000001)>>0)|((tileLine&0x00000100)>>7)| - ((tileLine&0x00010000)>>14)|((tileLine&0x01000000)>>21); - hflippedTileInCachePtr[0]=tileInCachePtr[7]; - - tileInCachePtr+=8; - hflippedTileInCachePtr+=8; - } -#ifdef STATISTICS - ws_16_colors_layered_tiles_cache_update_time+=ticker(); - ws_16_colors_layered_tiles_cache_update_number++; -#endif - } - else - // 16 colors by tile packed mode - if (ws_videoMode==7) - { -#ifdef STATISTICS - ws_16_colors_packed_tiles_cache_update_time+=-ticker(); -#endif - uint8 *tileInCachePtr = &wsc_tile_cache[tileIndex<<6]; - uint8 *hflippedTileInCachePtr = &wsc_hflipped_tile_cache[tileIndex<<6]; - uint32 *tileInRamPtr = (uint32*)&internalRam[0x4000+(tileIndex<<5)]; - uint32 tileLine; - - for (int line=0;line<8;line++) - { - tileLine=*tileInRamPtr++; - - tileInCachePtr[0]=(tileLine>>4)&0x0f; - hflippedTileInCachePtr[7]=tileInCachePtr[0]; - tileInCachePtr[1]=(tileLine>>0)&0x0f; - hflippedTileInCachePtr[6]=tileInCachePtr[1]; - tileInCachePtr[2]=(tileLine>>12)&0x0f; - hflippedTileInCachePtr[5]=tileInCachePtr[2]; - tileInCachePtr[3]=(tileLine>>8)&0x0f; - hflippedTileInCachePtr[4]=tileInCachePtr[3]; - tileInCachePtr[4]=(tileLine>>20)&0x0f; - hflippedTileInCachePtr[3]=tileInCachePtr[4]; - tileInCachePtr[5]=(tileLine>>16)&0x0f; - hflippedTileInCachePtr[2]=tileInCachePtr[5]; - tileInCachePtr[6]=(tileLine>>28)&0x0f; - hflippedTileInCachePtr[1]=tileInCachePtr[6]; - tileInCachePtr[7]=(tileLine>>24)&0x0f; - hflippedTileInCachePtr[0]=tileInCachePtr[7]; - - tileInCachePtr+=8; - hflippedTileInCachePtr+=8; - - } -#ifdef STATISTICS - ws_16_colors_packed_tiles_cache_update_time+=ticker(); - ws_16_colors_packed_tiles_cache_update_number++; -#endif - } - else - { - // unknown mode - } - // tile cache updated - wsc_modified_tile[tileIndex]=0; - } - if (vFlip) - line=7-line; - if (hFlip) - return(&wsc_hflipped_tile_cache[(tileIndex<<6)+(line<<3)]); - else - return(&wsc_tile_cache[(tileIndex<<6)+(line<<3)]); - - } - else - { - // need to update tile cache ? - if (ws_modified_tile[tileIndex]) - { -#ifdef STATISTICS - ws_4_shades_tiles_cache_update_time+=-ticker(); -#endif - uint8 *tileInCachePtr = &ws_tile_cache[tileIndex<<6]; - uint8 *hflippedTileInCachePtr = &ws_hflipped_tile_cache[(tileIndex<<6)+7]; - uint32 *tileInRamPtr = (uint32*)&internalRam[0x2000+(tileIndex<<4)]; - uint32 tileLine; - - for (int line=0;line<4;line++) - { - tileLine=*tileInRamPtr++; - - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x80)>>7)|((tileLine&0x8000)>>14); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x40)>>6)|((tileLine&0x4000)>>13); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x20)>>5)|((tileLine&0x2000)>>12); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x10)>>4)|((tileLine&0x1000)>>11); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x08)>>3)|((tileLine&0x0800)>>10); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x04)>>2)|((tileLine&0x0400)>>9); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x02)>>1)|((tileLine&0x0200)>>8); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x01)>>0)|((tileLine&0x0100)>>7); - hflippedTileInCachePtr+=16; - tileLine>>=16; - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x80)>>7)|((tileLine&0x8000)>>14); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x40)>>6)|((tileLine&0x4000)>>13); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x20)>>5)|((tileLine&0x2000)>>12); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x10)>>4)|((tileLine&0x1000)>>11); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x08)>>3)|((tileLine&0x0800)>>10); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x04)>>2)|((tileLine&0x0400)>>9); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x02)>>1)|((tileLine&0x0200)>>8); - *hflippedTileInCachePtr--=*tileInCachePtr++=((tileLine&0x01)>>0)|((tileLine&0x0100)>>7); - hflippedTileInCachePtr+=16; - } - // tile cache updated - ws_modified_tile[tileIndex]=0; -#ifdef STATISTICS - ws_4_shades_tiles_cache_update_time+=ticker(); - ws_4_shades_tiles_cache_update_number++; -#endif - } - if (vFlip) - line=7-line; - if (hFlip) - return(&ws_hflipped_tile_cache[(tileIndex<<6)+(line<<3)]); - else - return(&ws_tile_cache[(tileIndex<<6)+(line<<3)]); - } - return(NULL); -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_drawClippedSpriteLine(int16 *framebuffer, uint16 scanline, - uint32 x, uint32 y, uint32 tileIndex, uint32 paletteIndex, - uint32 vFlip, uint32 hFlip, - uint32 clip_x0, uint32 clip_y0, uint32 clip_x1, uint32 clip_y1) -{ - - if ((scanline(y+7))) - return; - if ((x+7=clip_x1)) - return; - if ((y+7=clip_y1)) - return; - - uint8 *ws_tileRow=ws_tileCache_getTileRow(tileIndex,(scanline-y)&0x07,hFlip,vFlip, 0); - uint16 nbPixels=8; - if (xclip_x1) - nbPixels=(clip_x1-x); - framebuffer+=x; - - if (ws_gpu_operatingInColor) - { - int16 *wsc_paletteAlias=&wsc_palette[paletteIndex<<4]; - while (nbPixels) - { - if (*ws_tileRow) *framebuffer=wsc_paletteAlias[*ws_tileRow]; - framebuffer++; ws_tileRow++; - nbPixels--; - } - } - else - { - int16 *ws_paletteAlias=&ws_palette[paletteIndex<<2]; - if (paletteIndex&0x04) - { - while (nbPixels) - { - if (*ws_tileRow) *framebuffer=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - framebuffer++; ws_tileRow++; - nbPixels--; - } - } - else - { - while (nbPixels) - { - *framebuffer=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - framebuffer++; ws_tileRow++; - nbPixels--; - } - } - } -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_renderScanline(int16 *framebuffer) -{ - - if (ws_gpu_scanline>143) - return; -#ifdef STATISTICS - long startTime=ticker(); -#endif - framebuffer+=(224*ws_gpu_scanline); - - // fill with background color - int16 backgroundColor; - if (ws_gpu_operatingInColor) - backgroundColor=wsc_palette[ws_ioRam[0x01]]; - else - backgroundColor=ws_shades[ws_paletteColors[ws_palette[((ws_ioRam[0x01]&0xf0)>>2)+(ws_ioRam[0x01]&0x03)]]]; - - for (int i=0;i<224;i++) - framebuffer[i]=backgroundColor; -#ifdef STATISTICS - ws_background_color_rendering_time=ticker(); -#endif - // render background layer - if (ws_ioRam[0x00]&0x01) - { - int ws_bgScroll_x=ws_ioRam[0x10]; - int ws_bgScroll_y=ws_ioRam[0x11]; - - // seek to the first tile - ws_bgScroll_y=(ws_bgScroll_y+ws_gpu_scanline)&0xff; - - // note: byte ordering assumptions! - int ws_currentTile=(ws_bgScroll_x>>3); - uint16 *ws_bgScrollRamBase=(uint16*)(internalRam+(((uint32)ws_ioRam[0x07]&0x0f)<<11)+ - ((ws_bgScroll_y&0xfff8)<<3)); - - int lineInTile = ws_bgScroll_y&0x07; - int columnInTile = ws_bgScroll_x&0x07; - - int16 *scanlinePtr=framebuffer; - - if (ws_gpu_operatingInColor) - { - // render the first clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_bgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *wsc_paletteAlias=&wsc_palette[((tileInfo>>9)&0x0f)<<4]; - ws_tileRow+=columnInTile; - for (int i=columnInTile;i<8;i++) - { - if (*ws_tileRow) - *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; - scanlinePtr++; - ws_tileRow++; - } - } - - // render the tiles between them - int nbTiles=28; - if (columnInTile) - nbTiles=27; - - for (int i=0;i>9)&0x0f)<<4]; - - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - } - - // render the last clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_bgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *wsc_paletteAlias=&wsc_palette[((tileInfo>>9)&0x0f)<<4]; - - - for (int i=0;i>9)&0x0f)<<2]; - ws_tileRow+=columnInTile; - - if ((tileInfo>>9)&0x04) - { - for (int i=columnInTile;i<8;i++) - { - if (*ws_tileRow) - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - scanlinePtr++; - ws_tileRow++; - } - } - else - { - for (int i=columnInTile;i<8;i++) - { - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - scanlinePtr++; - ws_tileRow++; - } - } - } - int nbTiles=28; - if (columnInTile) - nbTiles=27; - - for (int i=0;i>9)&0x0f)<<2]; - - if ((tileInfo>>9)&0x04) - { - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - } - else - { - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - } - - } - - // render the last clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_bgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *ws_paletteAlias=&ws_palette[((tileInfo>>9)&0x0f)<<2]; - - - if ((tileInfo>>9)&0x04) - { - for (int i=0;iws_ioRam[0x05];i--) - { - uint32 spr=*ws_sprRamBase--; - - if (!(spr&0x2000)) - { - // sprite window on ? - if ((ws_ioRam[0x00]&0x08)&&(spr&0x1000)&&(ws_sprWindow_x0!=ws_sprWindow_x1)) - { - ws_drawClippedSpriteLine(framebuffer,ws_gpu_scanline,(spr&0xff000000)>>24, (spr&0x00ff0000)>>16, - spr&0x1ff,8+((spr&0xe00)>>9),spr&0x4000,spr&0x8000, - ws_sprWindow_x0,ws_sprWindow_y0,ws_sprWindow_x1,ws_sprWindow_y1); - } - else - { - ws_drawClippedSpriteLine(framebuffer,ws_gpu_scanline,(spr&0xff000000)>>24, (spr&0x00ff0000)>>16, - spr&0x1ff,8+((spr&0xe00)>>9),spr&0x4000,spr&0x8000, - 0,0,224,144); - } - } - } - } -#ifdef STATISTICS - ws_priority_0_sprites_rendering_time=ticker(); -#endif - // render foreground layer - if (ws_ioRam[0x00]&0x02) - { - int ws_fgWindow_x0=ws_ioRam[0x08]; - int ws_fgWindow_y0=ws_ioRam[0x09]; - int ws_fgWindow_x1=ws_ioRam[0x0a]; - int ws_fgWindow_y1=ws_ioRam[0x0b]; - int ws_fgScroll_x=ws_ioRam[0x12]; - int ws_fgScroll_y=ws_ioRam[0x13]; - - int windowMode=ws_ioRam[0x00]&0x30; - - // seek to the first tile - ws_fgScroll_y=(ws_fgScroll_y+ws_gpu_scanline)&0xff; - - // note: byte ordering assumptions! - int ws_currentTile=(ws_fgScroll_x>>3); - uint16 *ws_fgScrollRamBase=(uint16*)(internalRam+(((uint32)ws_ioRam[0x07]&0xf0)<<7)+ - ((ws_fgScroll_y&0xfff8)<<3)); - - int lineInTile = ws_fgScroll_y&0x07; - int columnInTile = ws_fgScroll_x&0x07; - - int16 *scanlinePtr=framebuffer; - - - // window disabled - if (!windowMode) - { - if (ws_gpu_operatingInColor) - { - // render the first clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *wsc_paletteAlias=&wsc_palette[((tileInfo>>9)&0x0f)<<4]; - - ws_tileRow+=columnInTile; - - for (int i=columnInTile;i<8;i++) - { - if (*ws_tileRow) - *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; - scanlinePtr++; - ws_tileRow++; - } - } - - // render the tiles between them - int nbTiles=28; - if (columnInTile) - nbTiles=27; - - for (int i=0;i>9)&0x0f)<<4]; - - - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; - } - - // render the last clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *wsc_paletteAlias=&wsc_palette[((tileInfo>>9)&0x0f)<<4]; - - - for (int i=0;i>9)&0x0f)<<2]; - ws_tileRow+=columnInTile; - if ((tileInfo>>9)&0x04) - { - for (int i=columnInTile;i<8;i++) - { - if (*ws_tileRow) - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - scanlinePtr++; - ws_tileRow++; - } - } - else - { - for (int i=columnInTile;i<8;i++) - { - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - scanlinePtr++; - ws_tileRow++; - } - } - } - int nbTiles=28; - if (columnInTile) - nbTiles=27; - - for (int i=0;i>9)&0x0f)<<2]; - - if ((tileInfo>>9)&0x04) - { - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - if (*ws_tileRow) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - } - else - { - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; - } - } - - // render the last clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *ws_paletteAlias=&ws_palette[((tileInfo>>9)&0x0f)<<2]; - - - if ((tileInfo>>9)&0x04) - { - for (int i=0;i>9)&0x0f)<<4]; - - ws_tileRow+=columnInTile; - - for (int i=columnInTile;i<8;i++) - { - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) - *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; - column++; - scanlinePtr++; - ws_tileRow++; - } - } - - // render the tiles between them - int nbTiles=28; - if (columnInTile) - nbTiles=27; - - for (int i=0;i>9)&0x0f)<<4]; - - - - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - } - - // render the last clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *wsc_paletteAlias=&wsc_palette[((tileInfo>>9)&0x0f)<<4]; - - - for (int i=0;i=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) - *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; - column++; - scanlinePtr++; - ws_tileRow++; - } - } - } - else - { - // render the first clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - - int16 *ws_paletteAlias=&ws_palette[((tileInfo>>9)&0x0f)<<2]; - ws_tileRow+=columnInTile; - - for (int i=columnInTile;i<8;i++) - { - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - column++; - scanlinePtr++; - ws_tileRow++; - } - } - int nbTiles=28; - if (columnInTile) - nbTiles=27; - - for (int i=0;i>9)&0x0f)<<2]; - - - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&(column>=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - } - - // render the last clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *ws_paletteAlias=&ws_palette[((tileInfo>>9)&0x0f)<<2]; - - - for (int i=0;i=ws_fgWindow_x0)&&(column<=ws_fgWindow_x1)) - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - column++; - scanlinePtr++; - ws_tileRow++; - } - } - } - } - else - // foreground layer displayed only outside the window - if (windowMode==0x30) - { - int column=0; - if (ws_gpu_operatingInColor) - { - // render the first clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *wsc_paletteAlias=&wsc_palette[((tileInfo>>9)&0x0f)<<4]; - - ws_tileRow+=columnInTile; - - for (int i=columnInTile;i<8;i++) - { - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) - *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; - column++; - scanlinePtr++; - ws_tileRow++; - } - } - - // render the tiles between them - int nbTiles=28; - if (columnInTile) - nbTiles=27; - - for (int i=0;i>9)&0x0f)<<4]; - - - - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; scanlinePtr++; ws_tileRow++; column++; - } - - // render the last clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *wsc_paletteAlias=&wsc_palette[((tileInfo>>9)&0x0f)<<4]; - - - for (int i=0;iws_fgWindow_x1))) - *scanlinePtr=wsc_paletteAlias[*ws_tileRow]; - column++; - scanlinePtr++; - ws_tileRow++; - } - } - } - else - { - // render the first clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - - int16 *ws_paletteAlias=&ws_palette[((tileInfo>>9)&0x0f)<<2]; - ws_tileRow+=columnInTile; - - for (int i=columnInTile;i<8;i++) - { - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - column++; - scanlinePtr++; - ws_tileRow++; - } - } - int nbTiles=28; - if (columnInTile) - nbTiles=27; - - for (int i=0;i>9)&0x0f)<<2]; - - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - if ((*ws_tileRow)&&((columnws_fgWindow_x1))) *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; scanlinePtr++; ws_tileRow++; column++; - } - - // render the last clipped tile - if (columnInTile) - { - uint16 tileInfo=ws_fgScrollRamBase[ws_currentTile&0x1f]; - ws_currentTile++; - uint8 *ws_tileRow=ws_tileCache_getTileRow( tileInfo&0x1ff, lineInTile, - tileInfo&0x8000, tileInfo&0x4000, tileInfo&0x2000); - int16 *ws_paletteAlias=&ws_palette[((tileInfo>>9)&0x0f)<<2]; - - - for (int i=0;iws_fgWindow_x1))) - *scanlinePtr=ws_shades[ws_paletteColors[ws_paletteAlias[*ws_tileRow]]]; - column++; - scanlinePtr++; - ws_tileRow++; - } - } - } - } - else - { - // unknown - } - } -#ifdef STATISTICS - ws_foreground_rendering_time=ticker(); -#endif - // render sprites - if (ws_ioRam[0x00]&0x04) - { - int ws_sprWindow_x0=ws_ioRam[0x0c]; - int ws_sprWindow_y0=ws_ioRam[0x0d]; - int ws_sprWindow_x1=ws_ioRam[0x0e]; - int ws_sprWindow_y1=ws_ioRam[0x0f]; - uint32 *ws_sprRamBase=(uint32*)(internalRam+(((uint32)ws_ioRam[0x04])<<9)); - - // seek to first sprite - ws_sprRamBase+=ws_ioRam[0x06]-1; - - for (int i=ws_ioRam[0x06];i>ws_ioRam[0x05];i--) - { - uint32 spr=*ws_sprRamBase--; - - if (spr&0x2000) - { - // sprite window on ? - if ((ws_ioRam[0x00]&0x08)&&(spr&0x1000)&&(ws_sprWindow_x0!=ws_sprWindow_x1)) - { - ws_drawClippedSpriteLine(framebuffer,ws_gpu_scanline,(spr&0xff000000)>>24, (spr&0x00ff0000)>>16, - spr&0x1ff,8+((spr&0xe00)>>9),spr&0x4000,spr&0x8000, - ws_sprWindow_x0,ws_sprWindow_y0,ws_sprWindow_x1,ws_sprWindow_y1); - } - else - { - ws_drawClippedSpriteLine(framebuffer,ws_gpu_scanline,(spr&0xff000000)>>24, (spr&0x00ff0000)>>16, - spr&0x1ff,8+((spr&0xe00)>>9),spr&0x4000,spr&0x8000, - 0,0,224,144); - } - } - } - } -#ifdef STATISTICS - ws_priority_1_sprites_rendering_time=ticker(); - - ws_priority_1_sprites_rendering_time-=ws_foreground_rendering_time; - ws_foreground_rendering_time-=ws_priority_0_sprites_rendering_time; - ws_priority_0_sprites_rendering_time-=ws_background_rendering_time; - ws_background_rendering_time-=ws_background_color_rendering_time; - ws_background_color_rendering_time-=startTime; -#endif -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -void ws_gpu_write_byte(DWORD offset, BYTE value) -{ - // ws 4 color tiles - if ((offset>=0x2000)&&(offset<0x4000)) - { - if (internalRam[offset]!=value) - ws_modified_tile[(offset&0x1fff)>>4]=1; - // update the ram - internalRam[offset]=value; - } - if (ws_gpu_operatingInColor) - { - // wsc 16 color tiles bank 0 - if ((offset>=0x4000)&&(offset<0x8000)) - { - if (internalRam[offset]!=value) - wsc_modified_tile[(offset&0x3fff)>>5]=1; - } - else - // wsc 16 color tiles bank 1 - if ((offset>=0x8000)&&(offset<0xC000)) - { - if (internalRam[offset]!=value) - wsc_modified_tile[512+((offset&0x3fff)>>5)]=1; - } - - // update the ram - internalRam[offset]=value; - // palette ram - if (offset>=0xfe00) - { - // RGB444 format - uint16 color=(internalRam[(offset&0xfffe)+1]); - color<<=8; - color|=(internalRam[(offset&0xfffe)]); - - wsc_palette[(offset&0x1ff)>>1]=RGB555(((color>>8)&0x0f)<<1,((color>>4)&0x0f)<<1,(color&0x0f)<<1); - } - } - else - if (offset<0x4000) - internalRam[offset]=value; -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -unsigned int ws_gpu_unknownPort; -void ws_gpu_port_write(DWORD port,BYTE value) -{ - ws_gpu_unknownPort=0; - switch (port) - { - case 0x60: ws_gpu_changeVideoMode(value); - return; - case 0x1C: ws_paletteColors[0]=value&0xf; - ws_paletteColors[1]=(value>>4)&0xf; - return; - case 0x1D: ws_paletteColors[2]=value&0xf; - ws_paletteColors[3]=(value>>4)&0xf; - return; - case 0x1E: ws_paletteColors[4]=value&0xf; - ws_paletteColors[5]=(value>>4)&0xf; - return; - case 0x1F: ws_paletteColors[6]=value&0xf; - ws_paletteColors[7]=(value>>4)&0xf; - return; - default: ws_gpu_unknownPort=1; - } - if ((port>=0x20)&&(port<=0x3f)) - { - ws_gpu_unknownPort=0; - port-=0x20; - int paletteIndex=port>>1; - if (port&0x01) - { - ws_palette[(paletteIndex<<2)+2]=value&0x7; - ws_palette[(paletteIndex<<2)+3]=(value>>4)&0x7; - } - else - { - ws_palette[(paletteIndex<<2)+0]=value&0x7; - ws_palette[(paletteIndex<<2)+1]=(value>>4)&0x7; - } - } -} -//////////////////////////////////////////////////////////////////////////////// -// -//////////////////////////////////////////////////////////////////////////////// -// -// -// -// -// -// -// -//////////////////////////////////////////////////////////////////////////////// -BYTE ws_gpu_port_read(BYTE port) -{ - if (port==0xa0) - { - if (ws_gpu_forceColorSystemBool) - return ws_ioRam[0xa0]|2; - else - if (ws_gpu_forceMonoSystemBool) - return ws_ioRam[0xa0]&(~0x02); - else - { - if (ws_gpu_operatingInColor) - return ws_ioRam[0xa0]|2; - else - return ws_ioRam[0xa0]&(~0x02); - } - } - return(ws_ioRam[port]); -} diff --git a/oswan/source/io.cpp b/oswan/source/io.cpp index 9136b14..1f17e10 100644 --- a/oswan/source/io.cpp +++ b/oswan/source/io.cpp @@ -65,7 +65,7 @@ void ws_io_reset(void) ws_key_button_2=0; int i; for (i=0;i<0x100;i++) - ws_ioRam[i]=initialIoValue[i]; + ws_ioRam[i]= initialIoValue[i]; for (i=0;i<0xc9;i++) cpu_writeport(i,initialIoValue[i]); @@ -162,8 +162,11 @@ void set_baudrate(int speed) { cfsetospeed(&options, B38400); } - +#if 0 options.c_cflag &= ~CNEW_RTSCTS; +#else + options.c_cflag &= ~CRTSCTS; +#endif options.c_cflag |= (CLOCAL | CREAD); options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); @@ -254,9 +257,9 @@ void write_serial(unsigned char value) BYTE cpu_readport(BYTE port) { int w1,w2; - BYTE retVal; + BYTE retVal = 0; - if (port >= 0xBA) && (port <= 0xBE) + if ((port >= 0xBA) && (port <= 0xBE)) { printf("Reading IEEP %02X\n", port); } @@ -453,7 +456,8 @@ BYTE cpu_readport(BYTE port) goto exit; default: - if (port > 0xD0) printf("ReadIO %02X <= %02X\n", port, retVal); + if (port > 0xD0) + printf("ReadIO %02X <= %02X\n", port, retVal); break; } @@ -475,11 +479,11 @@ exit: //////////////////////////////////////////////////////////////////////////////// void cpu_writeport(DWORD port,BYTE value) { - unsigned short F0dbg = 0; - int w1,w2; + //unsigned short F0dbg = 0; + int w1; //,w2; int unknown_io_port=0; - if (port >= 0xBA) && (port <= 0xBE) + if ((port >= 0xBA) && (port <= 0xBE)) { printf("Writing IEEP %02X <= %02X\n", port, value); } @@ -696,6 +700,8 @@ void cpu_writeport(DWORD port,BYTE value) case 0xF1: printf("%d\n", (signed short)((value << 8) | ws_ioRam[0xF0])); break; case 0xF2: printf("%c", value); fflush(stdout); break; + case 0xB7: break; /* Somwthing to write there, but what? */ + default: unknown_io_port=1; } diff --git a/oswan/source/memory.cpp b/oswan/source/memory.cpp index 2be5f32..8755cb0 100644 --- a/oswan/source/memory.cpp +++ b/oswan/source/memory.cpp @@ -74,9 +74,9 @@ void dump_memory() fp = fopen("memorydump.bin", "wb"); fwrite(internalRam, 1, 0x10000, fp); /* page 1 */ - fwrite(&(ws_staticRam[sramAddressMask]), 1, 0x10000, fp); + fwrite(&(ws_staticRam[0 & sramAddressMask]), 1, 0x10000, fp); fwrite(&(ws_rom[((ws_ioRam[IO_ROM_BANK_BASE_SELECTOR+2]&((romSize>>16)-1))<<16)]), 1, 0x10000, fp); - fwrite(&(ws_rom[((ws_ioRam[IO_ROM_BANK_BASE_SELECTOR+3]&((romSize>>16)-1))<<16)]), 1, 0x10000, fp); + fwrite(&(ws_rom[((ws_ioRam[IO_ROM_BANK_BASE_SELECTOR+3]&((romSize>>16)-1))<<16)]), 1, 0x10000, fp); for(i = 4; i < 0x10; i++) { int romBank=(256-(((ws_ioRam[IO_ROM_BANK_BASE_SELECTOR]&0xf)<<4)|(i&0xf))); @@ -274,7 +274,7 @@ uint16 memory_getRomCrc(void) void ws_sram_load(char *path) { FILE *f; - size_t read; + //size_t read; f = fopen(path, "r"); if (NULL == f) @@ -283,7 +283,7 @@ void ws_sram_load(char *path) return; } - read = fread(ws_staticRam, 1, 0x8000, f); + /*read = */fread(ws_staticRam, 1, 0x8000, f); //fprintf(log_get(), "read 0x%x (of 0x%x?) bytes of save ram from %s\n", read, ws_rom_sramSize(ws_rom, romSize), path); fclose(f); } @@ -291,7 +291,7 @@ void ws_sram_load(char *path) void ws_sram_save(char *path) { FILE *f; - size_t wrote; + //size_t wrote; f = fopen(path, "wb"); if (NULL == f) @@ -300,7 +300,7 @@ void ws_sram_save(char *path) return; } - wrote = fwrite(ws_staticRam, 1, 0x8000, f); + /*wrote = */fwrite(ws_staticRam, 1, 0x8000, f); fflush(f); //fprintf(log_get(), "wrote 0x%x bytes of save ram to %s\n", wrote, path); fclose(f); diff --git a/oswan/source/nec/nec.cpp b/oswan/source/nec/nec.cpp index 8d8babe..a56787e 100644 --- a/oswan/source/nec/nec.cpp +++ b/oswan/source/nec/nec.cpp @@ -132,11 +132,11 @@ void nec_int(DWORD wektor) } } -static void nec_interrupt(unsigned int_num, /*BOOLEAN*/ int md_flag) +static void nec_interrupt(uint32_t int_num, /*BOOLEAN*/ int md_flag) { UINT32 dest_seg, dest_off; - if (int_num == -1) + if (int_num == UINT32_MAX) return; i_pushf(); @@ -303,7 +303,7 @@ OP( 0x5e, i_pop_si ) { POP(I.regs.w[IX]); CLK(1); } OP( 0x5f, i_pop_di ) { POP(I.regs.w[IY]); CLK(1); } OP( 0x60, i_pusha ) { - unsigned tmp=I.regs.w[SP]; + uint32_t tmp=I.regs.w[SP]; PUSH(I.regs.w[AW]); PUSH(I.regs.w[CW]); PUSH(I.regs.w[DW]); @@ -315,7 +315,7 @@ OP( 0x60, i_pusha ) { CLK(9); } OP( 0x61, i_popa ) { - unsigned tmp; + uint32_t tmp; POP(I.regs.w[IY]); POP(I.regs.w[IX]); POP(I.regs.w[BP]); @@ -324,6 +324,7 @@ OP( 0x61, i_popa ) { POP(I.regs.w[DW]); POP(I.regs.w[CW]); POP(I.regs.w[AW]); + (void)tmp; // We need to uppop something and need tmp CLK(8); } OP( 0x62, i_chkind ) { @@ -560,7 +561,7 @@ OP( 0xbf, i_mov_did16 ) { I.regs.b[IYL] = FETCH; I.regs.b[IYH] = FETCH; CLK(1); OP( 0xc0, i_rotshft_bd8 ) { UINT32 src, dst; UINT8 c; - GetModRM; src = (unsigned)GetRMByte(ModRM); dst=src; + GetModRM; src = (uint32_t)GetRMByte(ModRM); dst=src; c=FETCH; c&=0x1f; CLKM(5,3); @@ -578,7 +579,7 @@ OP( 0xc0, i_rotshft_bd8 ) { OP( 0xc1, i_rotshft_wd8 ) { UINT32 src, dst; UINT8 c; - GetModRM; src = (unsigned)GetRMWord(ModRM); dst=src; + GetModRM; src = (uint32_t)GetRMWord(ModRM); dst=src; c=FETCH; c&=0x1f; CLKM(5,3); @@ -693,11 +694,11 @@ OP( 0xd3, i_rotshft_wcl ) { } } -OP( 0xd4, i_aam ) { UINT32 mult=FETCH; mult=0; I.regs.b[AH] = I.regs.b[AL] / 10; I.regs.b[AL] %= 10; SetSZPF_Word(I.regs.w[AW]); CLK(17); } -OP( 0xd5, i_aad ) { UINT32 mult=FETCH; mult=0; I.regs.b[AL] = I.regs.b[AH] * 10 + I.regs.b[AL]; I.regs.b[AH] = 0; SetSZPF_Byte(I.regs.b[AL]); CLK(6); } +OP( 0xd4, i_aam ) { /*UINT32 mult=FETCH; mult=0;*/ I.regs.b[AH] = I.regs.b[AL] / 10; I.regs.b[AL] %= 10; SetSZPF_Word(I.regs.w[AW]); CLK(17); } +OP( 0xd5, i_aad ) { /*UINT32 mult=FETCH; mult=0;*/ I.regs.b[AL] = I.regs.b[AH] * 10 + I.regs.b[AL]; I.regs.b[AH] = 0; SetSZPF_Byte(I.regs.b[AL]); CLK(6); } OP( 0xd6, i_setalc ) { I.regs.b[AL] = (CF)?0xff:0x00; CLK(3); } /* nop at V30MZ? */ OP( 0xd7, i_trans ) { UINT32 dest = (I.regs.w[BW]+I.regs.b[AL])&0xffff; I.regs.b[AL] = GetMemB(DS, dest); CLK(5); } -OP( 0xd8, i_fpo ) { GetModRM; CLK(3); } /* nop at V30MZ? */ +OP( 0xd8, i_fpo ) { /*GetModRM;*/ CLK(3); } /* nop at V30MZ? */ OP( 0xe0, i_loopne ) { INT8 disp = (INT8)FETCH; I.regs.w[CW]--; if (!ZF && I.regs.w[CW]) { I.ip = (WORD)(I.ip+disp); CLK(6); } else CLK(3); } OP( 0xe1, i_loope ) { INT8 disp = (INT8)FETCH; I.regs.w[CW]--; if ( ZF && I.regs.w[CW]) { I.ip = (WORD)(I.ip+disp); CLK(6); } else CLK(3); } @@ -852,7 +853,7 @@ static void i_invalid(void) /*****************************************************************************/ -unsigned nec_get_reg(int regnum) +uint32_t nec_get_reg(int regnum) { switch( regnum ) { @@ -880,7 +881,7 @@ unsigned nec_get_reg(int regnum) void nec_set_irq_line(int irqline, int state); -void nec_set_reg(int regnum, unsigned val) +void nec_set_reg(int regnum, uint32_t val) { switch( regnum ) { diff --git a/oswan/source/nec/nec.h b/oswan/source/nec/nec.h index f81e6f4..5ab8ef6 100644 --- a/oswan/source/nec/nec.h +++ b/oswan/source/nec/nec.h @@ -23,7 +23,7 @@ typedef struct UINT16 ip; INT32 SignVal; - UINT32 AuxVal, OverVal, ZeroVal, CarryVal, ParityVal; /* 0 or non-0 valued flags */ + INT32 AuxVal, OverVal, ZeroVal, CarryVal, ParityVal; /* 0 or non-0 valued flags */ UINT8 TF, IF, DF, MF; /* 0 or 1 valued flags */ /* OB[19.07.99] added Mode Flag V30 */ UINT32 int_vector; UINT32 pending_irq; @@ -172,8 +172,8 @@ typedef struct #define IncWordReg(Reg) \ - unsigned tmp = (unsigned)I.regs.w[Reg]; \ - unsigned tmp1 = tmp+1; \ + uint16_t tmp = (uint16_t)I.regs.w[Reg]; \ + uint16_t tmp1 = tmp+1; \ I.OverVal = (tmp == 0x7fff); \ SetAF(tmp1,tmp,1); \ SetSZPF_Word(tmp1); \ @@ -182,8 +182,8 @@ typedef struct #define DecWordReg(Reg) \ - unsigned tmp = (unsigned)I.regs.w[Reg]; \ - unsigned tmp1 = tmp-1; \ + uint16_t tmp = (uint16_t)I.regs.w[Reg]; \ + uint16_t tmp1 = tmp-1; \ I.OverVal = (tmp == 0x8000); \ SetAF(tmp1,tmp,1); \ SetSZPF_Word(tmp1); \ @@ -317,8 +317,8 @@ typedef struct #define ADD4S { \ int i,v1,v2,result; \ int count = (I.regs.b[CL]+1)/2; \ - unsigned di = I.regs.w[IY]; \ - unsigned si = I.regs.w[IX]; \ + uint16_t di = I.regs.w[IY]; \ + uint16_t si = I.regs.w[IX]; \ I.ZeroVal = I.CarryVal = 0; \ for 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

6;EycA^`inzxr%)`W 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 Q$-|Hpbi<})&?dwE6K210ApigX diff --git a/seal-hack/src/Makefile b/seal-hack/src/Makefile index a9520e6..ebb6dfa 100644 --- a/seal-hack/src/Makefile +++ b/seal-hack/src/Makefile @@ -1,11 +1,11 @@ # Makefile for Linux and SDL wrapper driver... -CC = clang +CC = gcc AR = ar RANLIB = ranlib STRIP = strip -CFLAGS = -g -c -Wall -O2 -D__SDL__ `sdl-config --cflags` -arch i386 -LFLAGS = -L../lib/SDL -laudio `sdl-config --libs` -arch i386 +CFLAGS = -g -c -Wall -O2 -D__SDL__ `sdl-config --cflags` -Wall -Werror +LFLAGS = -L../lib/SDL -laudio `sdl-config --libs` OBJS = audio.o wavfile.o xmfile.o s3mfile.o modfile.o mtmfile.o \ iofile.o modeng.o nondrv.o mixdrv.o sdldrv.o diff --git a/seal-hack/src/audio.h b/seal-hack/src/audio.h index d9031d8..3db96a5 100644 --- a/seal-hack/src/audio.h +++ b/seal-hack/src/audio.h @@ -45,14 +45,14 @@ extern "C" { typedef unsigned long DWORD; #else typedef void VOID; - typedef int8_t CHAR; + typedef char CHAR; typedef int32_t INT; typedef int32_t LONG; typedef int8_t BOOL; typedef uint8_t BYTE; typedef uint16_t WORD; - typedef uint32_t UINT; + typedef uint16_t UINT; typedef uint32_t DWORD; #endif typedef VOID* LPVOID; @@ -64,8 +64,8 @@ extern "C" { typedef WORD* LPWORD; typedef UINT* LPUINT; typedef DWORD* LPDWORD; - typedef CHAR* LPSTR; - typedef DWORD HANDLE; + typedef char* LPSTR; + typedef uintptr_t HANDLE; /* helper macros */ #define LOBYTE(s) ((BYTE)(s)) @@ -215,7 +215,7 @@ extern "C" { /* audio waveform structure */ typedef struct { LPBYTE lpData; /* data pointer */ - DWORD dwHandle; /* waveform handle */ + uintptr_t dwHandle; /* waveform handle */ DWORD dwLength; /* waveform length */ DWORD dwLoopStart; /* loop start point */ DWORD dwLoopEnd; /* loop end point */ @@ -277,7 +277,7 @@ extern "C" { /* audio module structure */ typedef struct { - CHAR szModuleName[32]; /* module name */ + char szModuleName[32]; /* module name */ WORD wFlags; /* module flags */ WORD nOrders; /* number of orders */ WORD nRestart; /* restart position */ diff --git a/seal-hack/src/mixdrv.c b/seal-hack/src/mixdrv.c index 2b2adec..5badd37 100644 --- a/seal-hack/src/mixdrv.c +++ b/seal-hack/src/mixdrv.c @@ -557,11 +557,14 @@ static UINT AIAPI OpenAudio(LPAUDIOINFO lpInfo) Synth.lpMemory = malloc(sizeof(LONG) * 65 * 256 + sizeof(BYTE) * 32 * 256 + 1023); if (Synth.lpMemory != NULL) { - lpVolumeTable = (LPLONG) (((DWORD) Synth.lpMemory + 1023) & ~1023); - lpFilterTable = (LPBYTE) (lpVolumeTable + 65 * 256); - ASetAudioMixerValue(AUDIO_MIXER_MASTER_VOLUME, 96); - ASetAudioCallback(UpdateVoices); - return AUDIO_ERROR_NONE; + uint64_t tmp; + tmp = ((uint64_t)(Synth.lpMemory) + 1023) & ~1023; + lpVolumeTable = (LPLONG)(tmp); + lpFilterTable = (LPBYTE) (lpVolumeTable + 65 * 256); + ASetAudioMixerValue(AUDIO_MIXER_MASTER_VOLUME, 96); + ASetAudioCallback(UpdateVoices); + + return AUDIO_ERROR_NONE; } return AUDIO_ERROR_NOMEMORY; } @@ -659,7 +662,7 @@ static LONG AIAPI GetAudioDataAvail(VOID) static UINT AIAPI CreateAudioData(LPAUDIOWAVE lpWave) { if (lpWave != NULL) { - lpWave->dwHandle = (DWORD) lpWave->lpData; + lpWave->dwHandle = (uintptr_t) lpWave->lpData; return AUDIO_ERROR_NONE; } return AUDIO_ERROR_INVALHANDLE; diff --git a/seal-hack/src/modeng.c b/seal-hack/src/modeng.c index 918d009..4b82b67 100644 --- a/seal-hack/src/modeng.c +++ b/seal-hack/src/modeng.c @@ -14,6 +14,7 @@ #ifdef __GNUC__ #include #endif +#include #include #include #include "audio.h" diff --git a/seal-hack/src/modfile.c b/seal-hack/src/modfile.c index 08dce4d..2960102 100644 --- a/seal-hack/src/modfile.c +++ b/seal-hack/src/modfile.c @@ -217,8 +217,7 @@ UINT AIAPI ALoadModuleMOD(LPSTR lpszFileName, } /* initialize the module structure */ - strncpy(lpModule->szModuleName, Header.aModuleName, - sizeof(Header.aModuleName)); + strncpy(lpModule->szModuleName, Header.aModuleName, sizeof(lpModule->szModuleName)); lpModule->wFlags = AUDIO_MODULE_AMIGA | AUDIO_MODULE_PANNING; lpModule->nOrders = Header.nSongLength; lpModule->nRestart = Header.nRestart; @@ -262,8 +261,7 @@ UINT AIAPI ALoadModuleMOD(LPSTR lpszFileName, lpPatch = lpModule->aPatchTable; for (n = 0; n < lpModule->nPatches; n++, lpPatch++) { memcpy(&Sample, &Header.aSampleTable[n], sizeof(MODSAMPLEHEADER)); - strncpy(lpPatch->szPatchName, Sample.aSampleName, - sizeof(Sample.aSampleName)); + strncpy(lpPatch->szPatchName, Sample.aSampleName, sizeof(lpPatch->szPatchName)); if (Sample.wLength != 0) { if ((lpSample = (LPAUDIOSAMPLE) calloc(1, sizeof(AUDIOSAMPLE))) == NULL) { diff --git a/seal-hack/src/mp b/seal-hack/src/mp deleted file mode 100755 index 7a9f68f85dacc55df93fcd53b16e58538ad3c14a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83520 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 VgTLx48!phFB)_Y%&G%j8e*qszPatchName, lpMTMSample->szSampleName, - sizeof(lpMTMSample->szSampleName)); + strncpy(lpPatch->szPatchName, lpMTMSample->szSampleName, sizeof(lpPatch->szPatchName) - 1); if (lpMTMSample->dwLength) { if ((lpSample = (LPAUDIOSAMPLE) calloc(1, sizeof(AUDIOSAMPLE))) == NULL) return AUDIO_ERROR_NOMEMORY; @@ -203,8 +202,7 @@ UINT AIAPI ALoadModuleMTM(LPSTR lpszFileName, } /* build the local module header structure */ - strncpy(lpModule->szModuleName, Header.szModuleName, - sizeof(Header.szModuleName)); + strncpy(lpModule->szModuleName, Header.szModuleName, sizeof(lpModule->szModuleName)); lpModule->wFlags = AUDIO_MODULE_AMIGA | AUDIO_MODULE_PANNING; lpModule->nOrders = Header.nOrders + 1; lpModule->nRestart = AUDIO_MAX_ORDERS; diff --git a/seal-hack/src/s3mfile.c b/seal-hack/src/s3mfile.c index 36cda9b..07cd22c 100644 --- a/seal-hack/src/s3mfile.c +++ b/seal-hack/src/s3mfile.c @@ -585,7 +585,7 @@ UINT AIAPI ALoadModuleS3M(LPSTR lpszFileName, AIOReadFile(Header.aReserved, sizeof(Header.aReserved)); AIOReadShort(&Header.wSpecial); AIOReadFile(Header.aChannelTable, sizeof(Header.aChannelTable)); - printf("[%lX] vs [%lX]\n", Header.dwSCRM, S3M_SCRM_MAGIC); + printf("[%X] vs [%lX]\n", Header.dwSCRM, S3M_SCRM_MAGIC); if (Header.dwSCRM != S3M_SCRM_MAGIC || Header.nSongLength > S3M_MAX_ORDERS || Header.nPatterns > S3M_MAX_PATTERNS || diff --git a/seal-hack/src/sdldrv.c b/seal-hack/src/sdldrv.c index e1887f6..d0772f5 100644 --- a/seal-hack/src/sdldrv.c +++ b/seal-hack/src/sdldrv.c @@ -74,8 +74,9 @@ static void updatecallback(void *userdata, Uint8 *stream, int len); static UINT AIAPI OpenAudio(LPAUDIOINFO lpInfo) { - int nBitsPerSample, nStereoOn, nSampleRate, nFrags; - + //int nBitsPerSample, nStereoOn, nSampleRate, nFrags; + int nStereoOn; + memset(&Audio, 0, sizeof(Audio)); if (!SDL_WasInit(SDL_INIT_EVERYTHING)) @@ -90,7 +91,7 @@ static UINT AIAPI OpenAudio(LPAUDIOINFO lpInfo) return AUDIO_ERROR_NODEVICE; - nBitsPerSample = lpInfo->wFormat & AUDIO_FORMAT_16BITS ? 16 : 8; + //nBitsPerSample = lpInfo->wFormat & AUDIO_FORMAT_16BITS ? 16 : 8; nStereoOn = lpInfo->wFormat & AUDIO_FORMAT_STEREO ? 1 : 0; /*nSampleRate = lpInfo->nSampleRate;*/ diff --git a/seal-hack/src/xmfile.c b/seal-hack/src/xmfile.c index b25a0ee..5f624aa 100644 --- a/seal-hack/src/xmfile.c +++ b/seal-hack/src/xmfile.c @@ -184,8 +184,7 @@ UINT AIAPI ALoadModuleXM(LPSTR lpszFileName, } /* initialize module structure */ - strncpy(lpModule->szModuleName, Header.aModuleName, - sizeof(Header.aModuleName)); + strncpy(lpModule->szModuleName, Header.aModuleName, sizeof(lpModule->szModuleName)); if (Header.wFlags & XM_MODULE_LINEAR) lpModule->wFlags |= AUDIO_MODULE_LINEAR; lpModule->nOrders = Header.nSongLength; @@ -296,8 +295,7 @@ UINT AIAPI ALoadModuleXM(LPSTR lpszFileName, } /* initialize patch structure */ - strncpy(lpPatch->szPatchName, Patch.aPatchName, - sizeof(Patch.aPatchName)); + strncpy(lpPatch->szPatchName, Patch.aPatchName, sizeof(lpPatch->szPatchName)); for (m = 0; m < AUDIO_MAX_NOTES; m++) { lpPatch->aSampleNumber[m] = Patch.aSampleNumber[m]; if (lpPatch->aSampleNumber[m] >= Patch.nSamples) @@ -365,8 +363,7 @@ UINT AIAPI ALoadModuleXM(LPSTR lpszFileName, AIOReadFile(Sample.aSampleName, sizeof(Sample.aSampleName)); AIOSeekFile(Patch.dwSampleHeaderSize - XM_SAMPLE_HEADER_SIZE, SEEK_CUR); - strncpy(lpSample->szSampleName, Sample.aSampleName, - sizeof(Sample.aSampleName)); + strncpy(lpSample->szSampleName, Sample.aSampleName, sizeof(lpSample->szSampleName)); lpSample->Wave.dwLength = Sample.dwLength; lpSample->Wave.dwLoopStart = Sample.dwLoopStart; lpSample->Wave.dwLoopEnd = Sample.dwLoopStart + Sample.dwLoopLength;