--- generator/hdr/mem68k.h 2020/03/04 04:46:28 1.1 +++ generator/hdr/mem68k.h 2020/03/04 04:46:48 1.1.1.2 @@ -14,23 +14,19 @@ typedef struct { void (*store_long)(uint32 addr, uint32 data); } t_mem68k_def; +typedef struct { + unsigned int a; + unsigned int b; + unsigned int c; + unsigned int up; + unsigned int down; + unsigned int left; + unsigned int right; + unsigned int start; +} t_keys; + extern t_mem68k_def mem68k_def[]; -extern unsigned int mem68k_cont1_a; -extern unsigned int mem68k_cont1_b; -extern unsigned int mem68k_cont1_c; -extern unsigned int mem68k_cont1_up; -extern unsigned int mem68k_cont1_down; -extern unsigned int mem68k_cont1_left; -extern unsigned int mem68k_cont1_right; -extern unsigned int mem68k_cont1_start; -extern unsigned int mem68k_cont2_a; -extern unsigned int mem68k_cont2_b; -extern unsigned int mem68k_cont2_c; -extern unsigned int mem68k_cont2_up; -extern unsigned int mem68k_cont2_down; -extern unsigned int mem68k_cont2_left; -extern unsigned int mem68k_cont2_right; -extern unsigned int mem68k_cont2_start; +extern t_keys mem68k_cont[2]; int mem68k_init(void); @@ -46,6 +42,55 @@ extern void (*mem68k_store_long[0x1000]) #define fetchword(addr) mem68k_fetch_word[((addr) & 0xFFFFFF)>>12]((addr) & 0xFFFFFF) #define fetchlong(addr) mem68k_fetch_long[((addr) & 0xFFFFFF)>>12]((addr) & 0xFFFFFF) +/* XXX BUG: these direct routines do not check for over-run of the 64k + cpu68k_ram block - so writing a long at $FFFF corrupts 3 bytes of data - + this is compensated for in the malloc() but is bad nonetheless. */ + +#ifdef DIRECTRAM + +/* chances are a store is to RAM - optimise for this case */ + +static __inline__ void storebyte(uint32 addr, uint8 data) +{ + if ((addr & 0xE00000) == 0xE00000) { + addr&= 0xffff; + *(uint8 *)(cpu68k_ram + addr) = data; + } else { + mem68k_store_byte[((addr) & 0xFFFFFF)>>12]((addr) & 0xFFFFFF,data); + } +} + +static __inline__ void storeword(uint32 addr, uint16 data) +{ + /* in an ideal world we'd check bit 0 of addr, but speed is everything */ + if ((addr & 0xE00000) == 0xE00000) { + addr&= 0xffff; + *(uint16 *)(cpu68k_ram + addr) = LOCENDIAN16(data); + } else { + mem68k_store_word[((addr) & 0xFFFFFF)>>12]((addr) & 0xFFFFFF,data); + } +} + +static __inline__ void storelong(uint32 addr, uint32 data) +{ + /* in an ideal world we'd check bit 0 of addr, but speed is everything */ + if ((addr & 0xE00000) == 0xE00000) { + addr&= 0xffff; +#ifdef ALIGNLONGS + *(uint16 *)(cpu68k_ram + addr) = LOCENDIAN16((uint16)(data >> 16)); + *(uint16 *)(cpu68k_ram + addr + 2) = LOCENDIAN16((uint16)(data)); +#else + *(uint32 *)(cpu68k_ram + addr) = LOCENDIAN32(data); +#endif + } else { + mem68k_store_long[((addr) & 0xFFFFFF)>>12]((addr) & 0xFFFFFF,data); + } +} + +#else + #define storebyte(addr,data) mem68k_store_byte[((addr) & 0xFFFFFF)>>12]((addr) & 0xFFFFFF,data) #define storeword(addr,data) mem68k_store_word[((addr) & 0xFFFFFF)>>12]((addr) & 0xFFFFFF,data) #define storelong(addr,data) mem68k_store_long[((addr) & 0xFFFFFF)>>12]((addr) & 0xFFFFFF,data) + +#endif