/ MCUME_teensy41 / teensysms / wrapemu.cpp
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  }