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  }