emu.cpp
1 #include <string.h> 2 3 #include "emuapi.h" 4 #include "psram_t.h" 5 #include "iopins.h" 6 7 extern "C" { 8 #include "shared.h" 9 10 #include "defs.h" 11 #include "regs.h" 12 #include "lcd.h" 13 #include "rc.h" 14 #include "cpu.h" 15 #include "mem.h" 16 #include "hw.h" 17 #include "rtc.h" 18 #include "sound.h" 19 20 #include "loader.h" 21 } 22 23 static int rom_offset = 0; 24 25 #ifdef HAS_T41 26 EXTMEM static unsigned char MemPool[8*1024*1024]; 27 28 extern "C" uint8 read_rom(int address) { 29 return (MemPool[address+rom_offset]); 30 } 31 32 extern "C" void write_rom(int address, uint8 val) { 33 MemPool[address]=val; 34 } 35 36 #else 37 38 #ifdef HAS_PSRAM 39 40 #include "psram_t.h" 41 42 PSRAM_T psram = PSRAM_T(PSRAM_CS, PSRAM_MOSI, PSRAM_SCLK, PSRAM_MISO); 43 44 extern "C" uint8 read_rom(int address) { 45 return (psram.psread(address+rom_offset)); 46 } 47 48 extern "C" void write_rom(int address, uint8 val) { 49 psram.pswrite(address,val); 50 } 51 52 #else 53 54 DMAMEM static unsigned char MemPool[490*1024]; 55 56 extern "C" uint8 read_rom(int address) { 57 return (MemPool[address+rom_offset]); 58 } 59 60 extern "C" void write_rom(int address, uint8 val) { 61 MemPool[address]=val; 62 } 63 64 #endif 65 #endif 66 67 void emu_KeyboardOnDown(int keymodifer, int key) { 68 } 69 70 void emu_KeyboardOnUp(int keymodifer, int key) { 71 } 72 73 74 75 76 void gbe_Init(void) 77 { 78 emu_printf("Allocating MEM"); 79 #ifdef HAS_PSRAM 80 psram.begin(); 81 #endif 82 mem_init(); 83 emu_printf("Allocating MEM done"); 84 } 85 86 87 static int hk = 0; 88 static int k = 0; 89 90 91 void gbe_Input(int click) { 92 hk = emu_ReadI2CKeyboard(); 93 k = emu_ReadKeys(); 94 } 95 96 static char buf[0x1000]; 97 extern "C" int loadfile(char * filename); 98 int loadfile(char * filename) 99 { 100 int romsize = emu_FileSize(filename); 101 int pos = 0; 102 int n; 103 int i; 104 if (emu_FileOpen(filename)) { 105 while ( (n = emu_FileRead(buf,sizeof(buf))) ) 106 { 107 for (int i=0; i<n; i++) { 108 write_rom(pos++,buf[i]); 109 } 110 emu_printi(pos); 111 } 112 emu_FileClose(); 113 } 114 115 return(romsize); 116 } 117 118 119 void gbe_Start(char * Cartridge) 120 { 121 emu_printf("load and init"); 122 123 loader_init(Cartridge); 124 125 hw_reset(); 126 lcd_reset(); 127 cpu_reset(); 128 mbc_reset(); 129 #ifdef SOUND_PRESENT 130 #ifdef HAS_SND 131 sound_reset(22050); 132 emu_sndInit(); 133 #endif 134 #endif 135 lcd_begin(); 136 emu_printf("init done"); 137 } 138 139 void gbe_Step(void) 140 { 141 hw.pad = 0; 142 143 if (( k & MASK_JOY1_RIGHT) || ( k & MASK_JOY2_RIGHT)) { 144 hw.pad|=PAD_RIGHT; 145 } 146 if (( k & MASK_JOY1_LEFT) || ( k & MASK_JOY2_LEFT)) { 147 hw.pad|=PAD_LEFT; 148 } 149 if (( k & MASK_JOY1_UP) || ( k & MASK_JOY2_UP)) { 150 hw.pad|=PAD_UP; 151 } 152 if (( k & MASK_JOY1_DOWN) || ( k & MASK_JOY2_DOWN)) { 153 hw.pad|=PAD_DOWN; 154 } 155 if ( k & MASK_JOY2_BTN) { 156 hw.pad|=PAD_A; 157 } 158 159 if (k & MASK_KEY_USER1) { 160 hw.pad|=PAD_B; 161 } 162 163 if (k & MASK_KEY_USER2) hw.pad|=PAD_START; 164 165 if (k & MASK_KEY_USER3) hw.pad|=PAD_SELECT; 166 167 168 // cpu_emulate(2280); 169 cpu_emulate(3120); 170 171 while (R_LY > 0 && R_LY < YRES) 172 cpu_emulate(cpu.lcdc); 173 174 rtc_tick(); 175 //emu_printi(emu_FrameSkip()); 176 177 emu_DrawVsync(); 178 } 179 180 void SND_Process(void *stream, int len) { 181 #ifdef SOUND_PRESENT 182 #ifdef HAS_SND 183 audio_play_sample(stream, 0, len); 184 #endif 185 #endif 186 }