wrapemu.cpp
1 #include <string.h> 2 3 #include "emuapi.h" 4 #include "iopins.h" 5 6 extern "C" { 7 #include "shared.h" 8 } 9 10 static int rom_offset = 0; 11 12 13 static unsigned char * MemPool; 14 15 extern "C" uint8 read_rom(int address) { 16 return (MemPool[address+rom_offset]); 17 } 18 19 extern "C" void write_rom(int address, uint8 val) { 20 MemPool[address]=val; 21 } 22 23 24 static int ik; // joypad key 25 static int ihk; // I2C keyboard key 26 static int iusbhk; // USB keyboard key 27 static int prevhk; // previous keyboard key 28 29 void emu_KeyboardOnDown(int keymodifer, int key) { 30 int keyCode = -1; //INV_KEY; 31 if ((key >=0xc0) && (key <=0xdf)) { 32 keyCode = ((key-0xc0) & 0x1f) + 0x7f; 33 } 34 else { 35 keyCode = key & 0x7f; 36 } 37 38 //Serial.println(keyCode); 39 40 if (keyCode != -1) { 41 iusbhk = keyCode; 42 } 43 } 44 45 void emu_KeyboardOnUp(int keymodifer, int key) { 46 iusbhk = 0; 47 } 48 49 50 void sms_Init(void) 51 { 52 emu_printf("Allocating MEM"); 53 MemPool = emu_SMalloc(8*1024*1024); 54 mem_init(); 55 emu_printf("Allocating MEM done"); 56 } 57 58 59 void sms_Input(int click) { 60 ik = emu_GetPad(); 61 ihk = emu_ReadI2CKeyboard(); 62 } 63 64 65 void sms_Start(char * filename) 66 { 67 emu_printf("load and init"); 68 69 int size = emu_FileSize(filename); 70 int pos = 0; 71 int n; 72 int i; 73 char * buf = (char*)cache; 74 75 int f = emu_FileOpen(filename, "r+b"); 76 if (f) { 77 while ( (n = emu_FileRead(buf,CACHE_SIZE,f) ) ) { 78 for (int i=0; i<n; i++) { 79 write_rom(pos++,buf[i]); 80 } 81 emu_printi(pos); 82 //emu_printi(n); 83 } 84 emu_FileClose(f); 85 } 86 87 if((size / 512) & 1) 88 { 89 size -= 512; 90 rom_offset += 512; 91 } 92 93 cart.pages = (size / 0x4000); 94 95 int namelen = strlen(filename); 96 emu_printf(&filename[namelen-4]); 97 if (namelen > 4) { 98 if ( (!strcmp(&filename[namelen-4],".sms")) || (!strcmp(&filename[namelen-4],".SMS")) ) { 99 emu_printf("Master system"); 100 cart.type = TYPE_SMS; 101 } 102 else { 103 emu_printf("Game Gear"); 104 cart.type = TYPE_GG; 105 } 106 } 107 108 #ifdef HAS_SND 109 system_init(22050); 110 #else 111 system_init(0); 112 #endif 113 emu_printf("init done"); 114 } 115 116 void sms_Step(void) 117 { 118 input.pad[0]=0; 119 120 int k = ik; 121 int hk = ihk; 122 if (iusbhk) hk = iusbhk; 123 124 if (( k & MASK_JOY1_RIGHT) || ( k & MASK_JOY2_RIGHT)) { 125 input.pad[0] |= INPUT_RIGHT; 126 } 127 if (( k & MASK_JOY1_LEFT) || ( k & MASK_JOY2_LEFT)) { 128 input.pad[0] |= INPUT_LEFT; 129 } 130 if (( k & MASK_JOY1_UP) || ( k & MASK_JOY2_UP)) { 131 input.pad[0] |= INPUT_UP; 132 } 133 if (( k & MASK_JOY1_DOWN) || ( k & MASK_JOY2_DOWN)) { 134 input.pad[0] |= INPUT_DOWN; 135 } 136 if (( k & MASK_JOY1_BTN) || ( k & MASK_JOY2_BTN)) { 137 input.pad[0] |= INPUT_BUTTON1; 138 } 139 140 if ( (k & MASK_KEY_USER2) || (hk == 'q') ) { 141 input.pad[0] |= INPUT_BUTTON2; 142 } 143 144 if ( (k & MASK_KEY_USER1) || (hk == 'w') ) input.system |= (IS_GG) ? INPUT_START : INPUT_PAUSE; 145 if (hk == 'r') input.system |= INPUT_HARD_RESET; 146 //if (hk == 'e') input.system |= (IS_GG) ? INPUT_HARD_RESET : INPUT_SOFT_RESET; 147 148 prevhk = hk; 149 150 sms_frame(0); 151 //emu_printi(emu_FrameSkip()); 152 153 emu_DrawVsync(); 154 } 155 156 void SND_Process(void *stream, int len) { 157 #ifdef HAS_SND 158 audio_play_sample(stream, 0, len); 159 #endif 160 }