From 31daa78aa0ddfd00e5b35bbc601add79683e4f45 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Mon, 20 Sep 2021 10:24:18 +0200 Subject: [PATCH] Emulator progress: build, link, some startup --- .gitignore | 1 + Makefile | 3 +- cgdoom/cgdoom-ui.c | 2 +- cgdoom/cgdoom-ui.h | 2 +- cgdoom/cgdoom.c | 137 ++++++++++++------------ cgdoom/cgdoom.h | 7 +- cgdoom/doomtype.h | 2 + cgdoom/f_wipe.c | 2 +- cgdoom/os.h | 2 +- cgdoom/p_saveg.c | 2 +- cgdoom/w_wad.c | 2 +- cgdoom/z_zone.c | 2 +- src-cg/platform.h | 6 +- src-sdl2/emul.c | 237 ++++++++++++++++++++++++++++++++++-------- src-sdl2/platform.h | 51 +++++---- src-sdl2/tastatur.bmp | Bin 95198 -> 0 bytes src-sdl2/tastatur.c | 194 ---------------------------------- 17 files changed, 308 insertions(+), 344 deletions(-) delete mode 100644 src-sdl2/tastatur.bmp delete mode 100644 src-sdl2/tastatur.c diff --git a/.gitignore b/.gitignore index 21b0da8..130495a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/CGDoom build-cg/ build-sdl2/ wad/ diff --git a/Makefile b/Makefile index d8a7a88..fc71297 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,8 @@ CG_OBJ := $(SRC:cgdoom/%=build-cg/%.o) $(CG_SRC:src-cg/%=build-cg/%.o) CC ?= gcc SDL2_CFLAGS := $(CFLAGS) -I src-sdl2 -DCG_EMULATOR $(pkg-config sdl2 --cflags) -SDL2_LDFLAGS := $(LDFLAGS) $(pkg-config sdl2 --libs) +SDL2_CFLAGS += -O0 -g +SDL2_LDFLAGS := $(LDFLAGS) $(shell pkg-config sdl2 --libs) SDL2_SRC := $(wildcard src-sdl2/*.c) SDL2_OBJ := $(SRC:cgdoom/%=build-sdl2/%.o) $(SDL2_SRC:src-sdl2/%=build-sdl2/%.o) diff --git a/cgdoom/cgdoom-ui.c b/cgdoom/cgdoom-ui.c index e9db7fd..76a4234 100644 --- a/cgdoom/cgdoom-ui.c +++ b/cgdoom/cgdoom-ui.c @@ -375,7 +375,7 @@ int Layout_Event(Layout *l, int key) return 0; } -int UI_Main(WADFileInfo *wads, int wad_count, int *dev_info, int *use_mmap, +int UI_Main(CGD_WADFileInfo *wads, int wad_count, int *dev_info, int *use_mmap, int *startmap, int *startepisode, int *trustunaligned, int *autostart, int *enabledemos, int *enable2MBline) { diff --git a/cgdoom/cgdoom-ui.h b/cgdoom/cgdoom-ui.h index 9a8289a..0be9ae5 100644 --- a/cgdoom/cgdoom-ui.h +++ b/cgdoom/cgdoom-ui.h @@ -61,7 +61,7 @@ int Layout_Event(Layout *l, int key); /* Larger-scale functions. */ /* Show the program's main screen; returns index of selected WAD file. */ -int UI_Main(WADFileInfo *wads, int wad_count, +int UI_Main(CGD_WADFileInfo *wads, int wad_count, int *dev_info, /* Enable technical detail screens */ int *use_mmap, /* Map file to memory (as opposed to using Bfile) */ int *startmap, /* Warp to this map */ diff --git a/cgdoom/cgdoom.c b/cgdoom/cgdoom.c index 6854f2f..ecf76c0 100644 --- a/cgdoom/cgdoom.c +++ b/cgdoom/cgdoom.c @@ -73,24 +73,9 @@ int strnicmp(const char *s1,const char *s2,int count) // FLASH_END (of which there are 4096) are indexed by their first 4 bytes and // binary searched for matches before anything else. // -// See for Flash traversal parameters. +// See for Flash traversal parameters. /////////////////////////////////////////////////////////////////////////////// -#ifndef CG_EMULATOR - -//The whole sound doesn't fir onto the RAM. -//Reading per partes is not possible as this is synchronnous player (there would be silences when reading). - -/* Fast memcmp() for 512-byte sectors. */ -int CGD_sector_memcmp(const void *fast_ram, const void *rom, size_t _512); - -/* Caching structure to read WAD files by larger chunks than Flash sectors. */ -typedef struct { - int fd; - int size, offset; - char *data; /* of size FLASH_BFILE_UNIT */ -} FileAccessCache; - /* Index of most likely ROM sectors. */ typedef struct { const void *sector; @@ -124,30 +109,6 @@ typedef struct { int miTotalLength; } FileMapping; -/* Find WAD files in the filesystem. */ -int FindWADs(WADFileInfo *files, int max) -{ - uint16_t path[32]; - Bfile_FileInfo info; - - int sd, rc, total=0; - rc = Bfile_FindFirst(u"\\\\fls0\\*.wad", &sd, path, &info); - - while(rc != -16 && total < max) - { - memcpy(files[total].path, u"\\\\fls0\\", 14); - memcpy(files[total].path+7, path, 32*2); - Bfile_NameToStr_ncpy(files[total].name, path, 32); - files[total].size = info.fsize; - total++; - - rc = Bfile_FindNext(sd, path, &info); - } - - Bfile_FindClose(sd); - return total; -} - /* WAD file access method. */ static int gWADmethod = CGDOOM_WAD_MMAP; /* File descriptor to WAD, used in Flash_ReadFile calls. (CGDOOM_WAD_BFILE) */ @@ -173,6 +134,21 @@ struct CGD_Perf CGD_Perf; /* Developer statistics */ struct CGD_Stats CGD_Stats; +#ifndef CG_EMULATOR + +//The whole sound doesn't fir onto the RAM. +//Reading per partes is not possible as this is synchronnous player (there would be silences when reading). + +/* Fast memcmp() for 512-byte sectors. */ +int CGD_sector_memcmp(const void *fast_ram, const void *rom, size_t _512); + +/* Caching structure to read WAD files by larger chunks than Flash sectors. */ +typedef struct { + int fd; + int size, offset; + char *data; /* of size FLASH_BFILE_UNIT */ +} FileAccessCache; + /* Read next sector from file, while caching into a buffer. */ const void *ReadNextSector(FileAccessCache *fc, int *size) { @@ -372,6 +348,30 @@ int FindInFlash(const void **buf, int size, int readpos) return iAvailableLen; } +static int FindZeroedMemory(void *start) +{ + /* Look for zero-longwords every 16 bytes */ + int size = 0; + + /* Limit to 6 MB since the fx-CG 50 doesn't have any more memory and + anything after the RAM is likely to be zero non-writable */ + while(size < CGDOOM_2MBLINEMEMORY_MAX && !*(uint32_t *)(start + size)) + size += 16; + + /* Round down to a multiple of 4096 */ + return size & ~0xfff; +} + +void abort(void){ + int x=0,y=160; + PrintMini(&x,&y,"Abort called",0,0xFFFFFFFF,0,0,0xFFFF,0,1,0); + int key; + for(;;) + GetKey(&key); +} + +#endif /* CG_EMULATOR */ + int Flash_ReadFile(void *buf, int size, int readpos) { if(gWADmethod == CGDOOM_WAD_BFILE) @@ -396,30 +396,30 @@ int Flash_ReadFile(void *buf, int size, int readpos) return iRet; } -static int FindZeroedMemory(void *start) +/* Find WAD files in the filesystem. */ +int FindWADs(CGD_WADFileInfo *files, int max) { - /* Look for zero-longwords every 16 bytes */ - int size = 0; + uint16_t path[32]; + Bfile_FileInfo info; - /* Limit to 6 MB since the fx-CG 50 doesn't have any more memory and - anything after the RAM is likely to be zero non-writable */ - while(size < CGDOOM_2MBLINEMEMORY_MAX && !*(uint32_t *)(start + size)) - size += 16; + int sd, rc, total=0; + rc = Bfile_FindFirst(u"\\\\fls0\\*.wad", &sd, path, &info); - /* Round down to a multiple of 4096 */ - return size & ~0xfff; + while(rc != -16 && total < max) + { + memcpy(files[total].path, u"\\\\fls0\\", 14); + memcpy(files[total].path+7, path, 32*2); + Bfile_NameToStr_ncpy(files[total].name, path, 32); + files[total].size = info.fsize; + total++; + + rc = Bfile_FindNext(sd, path, &info); + } + + Bfile_FindClose(sd); + return total; } -void abort(void){ - int x=0,y=160; - PrintMini(&x,&y,"Abort called",0,0xFFFFFFFF,0,0,0xFFFF,0,1,0); - int key; - for(;;) - GetKey(&key); -} - -#endif /* CG_EMULATOR */ - static void DelayedWriteFile(int i) { CGD_DelayedFileWrite const *dfw = &CGD_DelayedSaves[i]; @@ -484,14 +484,14 @@ int main(void) prof_init(); - WADFileInfo wads[16]; + CGD_WADFileInfo wads[16]; int wad_count = FindWADs(wads, 16); int dev_info = 0; /* Allow the user to use memory past the 2 MB line on known OS versions */ int *enable_2MBline=NULL; - char const *osv = (void *)0x80020020; + char const *osv = GetOSVersion(); if(!strncmp(osv, "03.", 3) && osv[3] <= '6') // 3.60 or earlier enable_2MBline = &CGD_2MBLineMemory; @@ -503,6 +503,13 @@ int main(void) autostart = autostart_; + /* Parameters unavailable on the SDL2 build */ + #ifdef CG_EMULATOR + gWADmethod = CGDOOM_WAD_BFILE; + CGD_TrustUnalignedLumps = 0; + CGD_2MBLineMemory = 0; + #endif + /* Override version detection for single-episode Ultimate Doom WADs */ if (!strcmp(wads[choice].name, "doomu1.wad")) CGD_SingleEpisodeUltimate = 1; @@ -513,8 +520,9 @@ int main(void) if (!strcmp(wads[choice].name, "doomu4.wad")) CGD_SingleEpisodeUltimate = 4; - unsigned tmp=((unsigned)getSecondaryVramAddress()+3)&(~3); - SaveVRAMBuffer = (unsigned char*)tmp; + uintptr_t secondary_vram = ((uintptr_t)GetSecondaryVRAMAddress() | 3) + 1; + SaveVRAMBuffer = (void *)secondary_vram; + /* fx-CG 50 / Graph 90+E: RAM starts at 0x0c000000 in physical memory */ SystemStack = (void *)0xac0f0000; @@ -529,9 +537,6 @@ int main(void) CGD_WADFileName = wad_name; /* Setup access to WAD file */ - #ifdef CG_EMULATOR - gWADmethod = CGDOOM_WAD_BFILE; - #endif if(gWADmethod == CGDOOM_WAD_BFILE) { gWADfd = Bfile_OpenFile_OS(wads[choice].path, 0, 0); diff --git a/cgdoom/cgdoom.h b/cgdoom/cgdoom.h index 6d2a115..319ce89 100644 --- a/cgdoom/cgdoom.h +++ b/cgdoom/cgdoom.h @@ -1,6 +1,7 @@ #ifndef CGDOOM_H #define CGDOOM_H +#include "platform.h" #include "libprof.h" #include @@ -17,7 +18,7 @@ typedef struct char name[32]; uint16_t path[7+32]; int size; -} WADFileInfo; +} CGD_WADFileInfo; /* Description of a file write that has been delated. */ typedef struct @@ -53,6 +54,10 @@ extern int CGD_EnableDemos; extern int CGD_SingleEpisodeUltimate; /* Skip this amount of frames after every rendered frame (default 1) */ extern int CGD_Frameskip; +/* Whether to trust unaligned lumps. If this is set, all non-fragmented lumps + will be accessed from ROM. Otherwise, lumps that are not 4-aligned will be + loaded to the heap even if they are available. (CGDOOM_WAD_MMAP) */ +extern int CGD_TrustUnalignedLumps; // Global variables interfacing with Doom itself. diff --git a/cgdoom/doomtype.h b/cgdoom/doomtype.h index 50b9c4d..c3da828 100644 --- a/cgdoom/doomtype.h +++ b/cgdoom/doomtype.h @@ -28,6 +28,8 @@ #ifndef __BYTEBOOL__ #define __BYTEBOOL__ +#include + // Fixed to use builtin bool type with C++. /*#ifdef __cplusplus typedef bool boolean; diff --git a/cgdoom/f_wipe.c b/cgdoom/f_wipe.c index 773d7e2..50515f2 100644 --- a/cgdoom/f_wipe.c +++ b/cgdoom/f_wipe.c @@ -143,7 +143,7 @@ int wipe_initMelt( int width, int height, int ticks ) /* See wipe_doMelt(). */ short SPU2_read16(short *x) { - if ((int)x & 2) { + if ((uintptr_t)x & 2) { volatile int *z = (int *)(x - 1); return *z & 0xffff; } diff --git a/cgdoom/os.h b/cgdoom/os.h index f6b8bbe..2b12bed 100644 --- a/cgdoom/os.h +++ b/cgdoom/os.h @@ -20,6 +20,6 @@ int strnicmp (const char*s1,const char*s2,int iLen); void I_Error (const char *error, ...); //return ptr to flash -int FindInFlash(const void **buf, int size, int readpos); +int (FindInFlash)(const void **buf, int size, int readpos); //direct read from flash int Flash_ReadFile(void *buf, int size, int readpos); diff --git a/cgdoom/p_saveg.c b/cgdoom/p_saveg.c index be09c60..fb51f7d 100644 --- a/cgdoom/p_saveg.c +++ b/cgdoom/p_saveg.c @@ -36,7 +36,7 @@ byte* save_p; // Pads save_p to a 4-byte boundary // so that the load/save works on SGI&Gecko. -#define PADSAVEP() save_p += (4 - ((int) save_p & 3)) & 3 +#define PADSAVEP() save_p += (4 - ((uintptr_t) save_p & 3)) & 3 diff --git a/cgdoom/w_wad.c b/cgdoom/w_wad.c index 1fec993..f6c1a17 100644 --- a/cgdoom/w_wad.c +++ b/cgdoom/w_wad.c @@ -299,7 +299,7 @@ void * W_ReadLumpWithZ_Malloc(int lump,int tag,int iEnableFlash) } int full = (c == lumpinfo[lump].size); - int aligned = (((uint32_t)lumpcache[lump] & 1) == 0); + int aligned = (((uintptr_t)lumpcache[lump] & 1) == 0); if(CGD_TrustUnalignedLumps) aligned = 1; diff --git a/cgdoom/z_zone.c b/cgdoom/z_zone.c index d2f057e..983638e 100644 --- a/cgdoom/z_zone.c +++ b/cgdoom/z_zone.c @@ -472,7 +472,7 @@ void Z_ChangeTag2(const void* ptr,int tag ) I_Error ("Z_ChangeTag: freed a pointer without ZONEID: %p", ptr); } - if (tag >= PU_PURGELEVEL && (unsigned)block->user < 0x100) + if (tag >= PU_PURGELEVEL && (uintptr_t)block->user < 0x100) { I_Error ("Z_ChangeTag: an owner is required for purgable blocks"); } diff --git a/src-cg/platform.h b/src-cg/platform.h index 574abf9..b89747d 100644 --- a/src-cg/platform.h +++ b/src-cg/platform.h @@ -41,11 +41,6 @@ almost always 4 kiB-aligned, and only occasionally not */ #define FLASH_INDEX_SIZE ((FLASH_END-FLASH_FS_HINT) / 4096) -/* Whether to trust unaligned lumps. If this is set, all non-fragmented lumps - will be accessed from ROM. Otherwise, lumps that are not 4-aligned will be - loaded to the heap even if they are available. */ -extern int CGD_TrustUnalignedLumps; - //--- // Display driver access //--- @@ -96,5 +91,6 @@ extern int CGD_2MBLineMemory; #include #define ASSERT(x) +#define GetOSVersion() ((char *)0x80020020) #endif //#ifndef PLATFORM_H diff --git a/src-sdl2/emul.c b/src-sdl2/emul.c index 3b995ec..942d892 100644 --- a/src-sdl2/emul.c +++ b/src-sdl2/emul.c @@ -1,7 +1,9 @@ #include "cgdoom.h" #include "platform.h" +#include "i_system.h" #include #include +#include SDL_Window *window = NULL; SDL_Surface *VRAM_RGB888 = NULL; @@ -9,6 +11,7 @@ SDL_Surface *VRAM_RGB888 = NULL; /* Rendering system emulation. */ uint16_t _VRAM[WIDTH * HEIGHT]; +uint16_t _VRAM2[WIDTH * HEIGHT]; static void QuitSDL(void) { @@ -46,6 +49,11 @@ uint16_t *GetVRAMAddress(void) return _VRAM; } +uint16_t *GetSecondaryVRAMAddress(void) +{ + return _VRAM2; +} + void Bdisp_PutDisp_DD(void) { if(!window) @@ -87,6 +95,14 @@ void Bdisp_AllClr_VRAM(void) /* Keyboard system emulation. */ +int PRGM_GetKey(void) +{ + // TODO: PRGM_GetKey() + // We don't really need it here, it's only used to delay error messages + // on-calc, and these are printed on terminal + return 0; +} + void GetKey(int *key) { SDL_Event e; @@ -113,27 +129,14 @@ void GetKey(int *key) } } -/* Main function */ -int main(int argc,char *argv[]) +/* Returns the value of a 128 Hz counter */ +int RTC_GetTicks(void) { -} - - -//Returns the RTC-basecount in units of 1/128 s. -int RTC_GetTicks( void ) -{ - return GetTickCount()>> 3;//1000/128 is very near to 1000/125 -} - -//start_value has to be set with RTC_GetTicks. -//duration_in_ms is the duration, which has to elapse since start_value. -//returns 0 if duration_in_ms has not elapsed yet -//returns 1 if duration_in_ms has elapsed - -int RTC_Elapsed_ms( int start_value, int duration_in_ms ) -{ - return (GetTickCount() - duration_in_ms) > (start_value << 3); + struct timespec tp; + clock_gettime(CLOCK_MONOTONIC, &tp); + int msec = (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000); + return (msec * 128) / 1000; } void assert(int iLine,const char *pszFilename,const char *pszAassert) @@ -146,42 +149,190 @@ void assert(int iLine,const char *pszFilename,const char *pszAassert) } } -//files -//int hFile = Bfile_OpenFile_OS(pFileName,0); -int Bfile_OpenFile_OS( const unsigned short*filename, int mode ) +//--- +// Filesystem API emulation +//--- + +#define FILE_TABLE_MAX 16 +static FILE *file_table[FILE_TABLE_MAX] = { NULL }; +static struct { + int pos; + glob_t glob; +} search_table[FILE_TABLE_MAX]; + +void Bfile_NameToStr_ncpy(char *dest, const uint16_t *source, size_t n) { - FILE *f; - char szFileName[1024]; - int i = 0; - filename += 7;//\\fls0\ - while(filename[0]) - { - szFileName[i] = (char)filename[0]; - filename++;i++; + size_t i = 0; + while(i < n && source[i] != 0x0000 && source[i] != 0xffff) { + dest[i] = source[i]; + i++; } - szFileName[i] = 0; - f = fopen(szFileName,"rb"); - return f?(int)f:-1; + for(size_t j = i; j < n; j++) + dest[j] = source[i]; } -int Bfile_SeekFile_OS( int HANDLE, int pos ) +void Bfile_StrToName_ncpy(uint16_t *dest, const char *source, size_t n) { - fseek((FILE*)HANDLE,pos,SEEK_SET); + size_t i = 0; + while(i < n && source[i]) { + dest[i] = source[i]; + i++; + } + while(i < n) + dest[i++] = 0; +} + +int Bfile_DeleteEntry(const uint16_t *filename_u16) +{ + char filename_u8[1024]; + Bfile_NameToStr_ncpy(filename_u8, filename_u16, 1024); + printf("Deleting %s (virtually)", filename_u8); return 0; } -int Bfile_ReadFile_OS( int HANDLE, void *buf, int size, int readpos ) +int Bfile_CreateEntry_OS(const uint16_t *filename_u16, int mode, size_t *size) +{ + char filename_u8[1024]; + Bfile_NameToStr_ncpy(filename_u8, filename_u16, 1024); + + if(mode == BFILE_CREATEMODE_FILE) { + printf("Creating %s with size %zu (virtually)", filename_u8, *size); + } + else if(mode == BFILE_CREATEMODE_FOLDER) { + I_Error("Cannot create folder %s: Not Implemented", filename_u8); + return -1; + } + else { + I_Error("Bfile_CreateEntry_OS(): Invalid mode %d", mode); + return -1; + } + + return 0; +} + +int Bfile_OpenFile_OS(const uint16_t *filename_u16, int mode, int zero) +{ + (void)zero; + char filename_u8[1024]; + Bfile_NameToStr_ncpy(filename_u8, filename_u16, 1024); + + char const *bits; + if(mode == BFILE_READ || mode == BFILE_READ_SHARE) + bits = "rb"; + else if(mode == BFILE_WRITE) + bits = "wb"; + else if(mode == BFILE_READWRITE || mode == BFILE_READWRITE_SHARE) + bits = "w+b"; + else { + I_Error("Bfile_OpenFile_OS(): invalid mode %d for %s", mode, filename_u8); + return -1; + } + + FILE *fp = fopen(filename_u8, bits); + if(!fp) { + I_Error("Bfile_OpenFile_OS(): cannot open %s: %m", filename_u8); + return -1; + } + + /* Find open slot in file table */ + int slot = 0; + while(slot < FILE_TABLE_MAX && file_table[slot] != NULL) + slot++; + if(slot >= FILE_TABLE_MAX) { + I_Error("Bfile_OpenFile_OS(): cannot open %s, table is full", filename_u8); + fclose(fp); + return -1; + } + + file_table[slot] = fp; + return slot; +} + +int Bfile_GetFileSize_OS(int fd) +{ + FILE *fp = file_table[fd]; + long pos = ftell(fp); + fseek(fp, 0, SEEK_END); + long size = ftell(fp); + fseek(fp, pos, SEEK_SET); + return size; +} + +int Bfile_SeekFile_OS(int fd, int pos) +{ + fseek(file_table[fd], pos, SEEK_SET); + return 0; +} + +int Bfile_ReadFile_OS(int fd, void *buf, int size, int readpos) { if(readpos != -1) - { - Bfile_SeekFile_OS(HANDLE, readpos ); - } - //fread ( dest, size elements, count elements, FILE handle ); - return fread(buf,1,size,(FILE*)HANDLE); + Bfile_SeekFile_OS(fd, readpos); + + return fread(buf, 1, size, file_table[fd]); } -int Bfile_CloseFile_OS( int HANDLE ) +int Bfile_WriteFile_OS(int fd, const void *buf, int size) { - fclose((FILE*)HANDLE); + return fwrite(buf, 1, size, file_table[fd]); +} + +int Bfile_CloseFile_OS(int fd) +{ + fclose(file_table[fd]); + file_table[fd] = NULL; + return 0; +} + +int Bfile_FindFirst(const uint16_t *pattern_u16, int *fd, uint16_t *found, + void *fileinfo) +{ + char pattern_u8[1024]; + Bfile_NameToStr_ncpy(pattern_u8, pattern_u16, 1024); + + + int slot = 0; + while(slot < FILE_TABLE_MAX && search_table[slot].pos != 0) + slot++; + if(slot >= FILE_TABLE_MAX) { + I_Error("Bfile_FindFirst(): cannot search %s, table is full", pattern_u8); + *fd = -1; + return -16; + } + + int rc = glob(pattern_u8, 0, NULL, &search_table[slot].glob); + + if(rc == GLOB_NOMATCH) + return -16; + + *fd = slot; + return Bfile_FindNext(slot, found, fileinfo); +} + +int Bfile_FindNext(int fd, uint16_t *found, void *fileinfo0) +{ + int *pos = &search_table[fd].pos; + glob_t *glob = &search_table[fd].glob; + + if(*pos >= glob->gl_pathc) + return -16; + + const char *name = glob->gl_pathv[*pos]; + Bfile_StrToName_ncpy(found, name, strlen(name)); + (*pos)++; + + Bfile_FileInfo *fileinfo = fileinfo0; + fileinfo->fsize = 0; + + return 0; +} + +int Bfile_FindClose(int fd) +{ + if(fd < 0 || fd >= FILE_TABLE_MAX) + return -1; + + search_table[fd].pos = 0; + globfree(&search_table[fd].glob); return 0; } diff --git a/src-sdl2/platform.h b/src-sdl2/platform.h index 977d47a..50a22a3 100644 --- a/src-sdl2/platform.h +++ b/src-sdl2/platform.h @@ -3,57 +3,54 @@ #define PLATFORM_H #include -#include +#include #include #include #include "keyboard.hpp" -#include "../../../include/fxcg/file.h" +//--- +// fx-CG-specific functions not defined on emulator +//--- + +#define CreateFileMapping(...) 0 +#define FindInFlash(...) 0 +#define FindZeroedMemory(...) 0 /* On the emulator all lumps are allocated with malloc(), so there are not pointers-to-flash to account for when freeing. */ #define PTR_TO_FLASH(p) 0 -/* Rendering system emulation. */ +//--- +// Rendering system emulation +//--- void Bdisp_PutDisp_DD(void); void Bdisp_AllClr_VRAM(void); uint16_t *GetVRAMAddress(void); +uint16_t *GetSecondaryVRAMAddress(void); int Bdisp_FrameAndColor(int, int); #define EnableColor(...) #define EnableStatusArea(...) -/* Input system emulation. */ +//--- +// Filesystem API emulation +//--- +#include "../../../include/fxcg/file.h" + +//--- +// Other functions +//--- + +int PRGM_GetKey(void); void GetKey(int *key); -//~ - -void G3A_main( void ); -int Serial_Open( unsigned char *mode ); -int Serial_Close( int mode ); -int Serial_DirectTransmitOneByte( unsigned char byte_to_transmit ); -int Serial_CheckRX(); -unsigned char Serial_Read(); - -#define dbgprint(x) printf(x) -#define dbgprint1(x,y) printf(x,y) - - -int RTC_GetTicks( void ); -int RTC_Elapsed_ms( int start_value, int duration_in_ms ); - -void Sleep(int dwMilliseconds ); - -#define EmulHack_Sleep(x) Sleep(x) +int RTC_GetTicks(void); void assert(int iLine,const char *pszFilename,const char *pszAassert); #define ASSERT(x) if(!(x)){assert(__LINE__,__FILE__,#x);} - -extern const unsigned char *gpcFlashBuffer; - -void InitFlashSimu(const char *filename); +#define GetOSVersion() ("03.60.0000") #endif /* PLATFORM_H */ diff --git a/src-sdl2/tastatur.bmp b/src-sdl2/tastatur.bmp deleted file mode 100644 index 62d3896ab4f3bc6c659fbdb0edc2a7df6e1a6b2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95198 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 Lm<#Z~kCXoo4;uND diff --git a/src-sdl2/tastatur.c b/src-sdl2/tastatur.c deleted file mode 100644 index 87547b0..0000000 --- a/src-sdl2/tastatur.c +++ /dev/null @@ -1,194 +0,0 @@ -#include -#include -#include "keyboard.hpp" - -HBITMAP ghbm; - -BOOL OnCreate(HWND hwnd) -{ - ghbm = (HBITMAP) LoadImage (0, "./tastatur.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); - return TRUE; -} - -BOOL OnDestroy(HWND hwnd) -{ - DeleteObject(ghbm); - PostQuitMessage(0); - return TRUE; -} - -BOOL OnPaint(HWND hwnd) -{ - PAINTSTRUCT ps; - HDC hdc = BeginPaint(hwnd,&ps); - HDC hdcMem = CreateCompatibleDC(NULL); - HBITMAP hbmT = SelectBitmap(hdcMem,ghbm); - BITMAP bm; - GetObject(ghbm,sizeof(bm),&bm); - BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,SRCCOPY); - SelectBitmap(hdcMem,hbmT); - DeleteDC(hdcMem); - EndPaint(hwnd,&ps); - return TRUE; -} - -void HandleButton(int x,int y); -void HandleButtonDown(int x,int y); -void HandleButtonUp(); -LRESULT CALLBACK KeyboardWindowProc( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) -{ - static int x,y; - switch(uMsg) - { - case WM_CREATE:return OnCreate(hwnd); - case WM_DESTROY:return OnDestroy(hwnd); - case WM_PAINT:return OnPaint(hwnd); - case WM_MOUSEMOVE:x = LOWORD(lParam);y = HIWORD(lParam);return TRUE; - case WM_LBUTTONDOWN:HandleButtonDown(x,y);return TRUE; - case WM_LBUTTONUP:HandleButtonUp();return TRUE; - case WM_SIZE:return TRUE; -default:return DefWindowProc(hwnd,uMsg,wParam,lParam); - } - - -} - - -void KeyboardRegisterClass() -{ - WNDCLASS wc = {0,KeyboardWindowProc,0,0, NULL, - LoadIcon(NULL,IDI_APPLICATION), - LoadCursor(NULL,IDC_ARROW), - (HBRUSH)(COLOR_WINDOW+1), - NULL, - "Keyboard" }; - RegisterClass(&wc); -} - - -DWORD __stdcall KeyboardFunc(void *p) -{ - HWND hwnd; - MSG msg; - KeyboardRegisterClass(); - - hwnd = CreateWindowA("Keyboard","Keyboard",WS_OVERLAPPED,500,0,CW_USEDEFAULT,0,HWND_DESKTOP,NULL,NULL,NULL); - - ShowWindow(hwnd,SW_SHOW); - SetWindowPos(hwnd,HWND_TOP,0,0,260+8,362+23+4 ,SWP_NOMOVE); - UpdateWindow(hwnd); - - - while(GetMessage(&msg,0,0,0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return msg.wParam; -} -//////////////////////////////////////////////////////////////////////////////////////////////// -#define L_OFFSET 3 -#define ROWS1_WIDTH 36 -#define ROWS1_GRID 43 -#define ROWS1_COUNT 5 -#define ROWS1_HEIGHT 22 -//const int giRows1[ROWS1_COUNT]={8,47,84,121,158}; -#define ROWS2_WIDTH 44 -#define ROWS2_GRID 52 -#define ROWS2_COUNT 4 -#define ROWS2_HEIGHT 22 -//const int giRows2[ROWS2_COUNT]={199,243,287,331}; -#define ROWS_COUNT (ROWS1_COUNT+ROWS2_COUNT) -#define ROWS_HEIGHT 22 -const int giRows[ROWS1_COUNT+ROWS2_COUNT]={8,47,84,121,158,199,243,287,331}; -//extra arrows -const int giUp[2]={218,50}; -const int giDown[2]={218,93}; -const int giLeft[2]={189,70}; -const int giRight[2]={245,70}; -#define ARROW_HWIDTH (ROWS1_HEIGHT >>1) -#define ARROW_HHEIGHT (ROWS_HEIGHT >>1) -static int IsArrow(const int *pi,int x,int y) -{ - if(x<(pi[0]-ARROW_HWIDTH))return 0; - if(x>(pi[0]+ARROW_HWIDTH))return 0; - if(y<(pi[1]-ARROW_HHEIGHT))return 0; - if(y>(pi[1]+ARROW_HHEIGHT))return 0; - return 1; - -} - -int FindButton(int x,int y) -{ - int i,iRow=-1,iCol; - - if(IsArrow(giUp ,x,y))return KEY_PRGM_UP; - if(IsArrow(giDown ,x,y))return KEY_PRGM_DOWN; - if(IsArrow(giLeft ,x,y))return KEY_PRGM_LEFT; - if(IsArrow(giRight,x,y))return KEY_PRGM_RIGHT; - x -= L_OFFSET; - if(x< 0) return KEY_PRGM_NONE; - for(i=0;i= giRows[i]) && (y <= giRows[i]+ ROWS_HEIGHT)) - { - iRow = i; - break; - } - } - if(iRow == -1)return KEY_PRGM_NONE; - - if(iRow < ROWS1_COUNT) - { - if((x % ROWS1_GRID) > ROWS1_WIDTH)return KEY_PRGM_NONE; - iCol = x / ROWS1_GRID; - } - else - { - if((x % ROWS2_GRID) > ROWS2_WIDTH)return KEY_PRGM_NONE; - iCol = x / ROWS2_GRID; - } - - iRow = 9-iRow; - iCol = 7 - iCol; - i = iRow + 10*iCol; - switch(i) - { - case KEY_PRGM_LEFT: - case KEY_PRGM_RIGHT: - case KEY_PRGM_UP: - case KEY_PRGM_DOWN: - return KEY_PRGM_NONE; - case 34: - i = KEY_PRGM_ACON; - } - - return i; - - - - -} - -KeyHandler(int iKey); -void HandleButton(int x,int y) -{ - int iKey = FindButton(x,y); - if(iKey) - { - KeyHandler(iKey); - } -} - -int iKeyDown = 0; -void HandleButtonDown(int x,int y) -{ - iKeyDown = FindButton(x,y); - -} - -void HandleButtonUp() -{ - iKeyDown = 0; - -}