diff options
author | Alec Murphy <alec@checksum.fail> | 2017-06-11 17:49:18 -0400 |
---|---|---|
committer | Alec Murphy <alec@checksum.fail> | 2017-06-11 17:49:18 -0400 |
commit | c22dff0c7ab2e4e9a4fe4815afb743e54aca46e8 (patch) | |
tree | e04ebb30b16f1d335fdc7c82262d62e1ca2cdd2e | |
parent | af4fd815d988ae403b5d4632e4d91feaa94c5b09 (diff) |
Fixes #3
-rw-r--r-- | Cartridge.HC | 4 | ||||
-rw-r--r-- | Data.HC | 1 | ||||
-rw-r--r-- | LCD.HC | 9 | ||||
-rw-r--r-- | LCDController.HC | 3 | ||||
-rw-r--r-- | Load.HC | 175 | ||||
-rw-r--r-- | README.md | 7 |
6 files changed, 174 insertions, 25 deletions
diff --git a/Cartridge.HC b/Cartridge.HC index e6ed17a..d621af3 100644 --- a/Cartridge.HC +++ b/Cartridge.HC @@ -52,7 +52,7 @@ U0 initCart() { break; case 0x10: cMBC3 = TRUE; - cTIMER = TRUE; + cTIMER = TRUE; cBATT = TRUE; cSRAM = TRUE; break; @@ -109,4 +109,4 @@ U0 initCart() { PressAKey; break; }; -}
\ No newline at end of file +}
\ No newline at end of file @@ -146,3 +146,4 @@ I64 ffxxDump[256] = { 0xD0, 0x7A, 0x00, 0x9E, 0x04, 0x5F, 0x41, 0x2F, 0x1D, 0x77, 0x36, 0x75, 0x81, 0xAA, 0x70, 0x3A, 0x98, 0xD1, 0x71, 0x02, 0x4D, 0x01, 0xC1, 0xFF, 0x0D, 0x00, 0xD3, 0x05, 0xF9, 0x00, 0x0B, 0x00 }; +
\ No newline at end of file @@ -64,11 +64,18 @@ U0 FreeLCD() DCDel(win); DCDel(sp0); DCDel(sp1); - odc=NULL; + odc=NULL; } U0 DrawIt(CTask *,CDC *dc) { + if (DisplayMsgTicks) + { + lcd->color=BLACK; + GrRect(lcd,0,8*17,160,8); + lcd->color=LTRED; + GrPrint(lcd,0,8*17,DisplayMsg); + }; I64 xpos=0; I64 ypos=0; I64 xctr=0; diff --git a/LCDController.HC b/LCDController.HC index 502efb1..58816b8 100644 --- a/LCDController.HC +++ b/LCDController.HC @@ -16,7 +16,7 @@ U0 notifyScanline() renderBG_ScanLine; //renderWIN_ScanLine; -} +} U0 scanLineMode0() { @@ -150,3 +150,4 @@ U0 scanLine(I64 line) } } } +
\ No newline at end of file @@ -10,7 +10,16 @@ I64 obp03,obp02,obp01,obp00; I64 obp13,obp12,obp11,obp10; I64 jp_state[8]; +I64 kLoad=0; +I64 kReset=0; +I64 kSave=0; + I64 LCDScale=1; +I64 DisplayMsgTicks=0; +U8 DisplayMsg[32]; +StrCpy(DisplayMsg,""); + +U8 StateFile[512]; U0 SetPal(U8 p, I64 *c0, I64 *c1, I64 *c2, I64 *c3) { @@ -567,7 +576,7 @@ U0 memoryWrite(I64 address, I64 data) } else { //MBC1WriteType //MBC1 mode setting: - MBC1Mode = ((data & 0x1) == 0x1); + MBC1Mode = ((data & 0x1) == 0x1); } } else if (cMBC2) { if (address < 0x1000) { @@ -861,6 +870,99 @@ U0 memoryWrite(I64 address, I64 data) } } +U0 initEmulator() +{ + programCounter = 0x100; + stackPointer = 0xFFFE; + IME = TRUE; + LCDTicks = 15; + DIVTicks = 14; + registerA = 0x1; + registerB = 0; + registerC = 0x13; + registerD = 0; + registerE = 0xD8; + FZero = TRUE; + FSubtract = FALSE; + FHalfCarry = TRUE; + FCarry = TRUE; + registersHL = 0x014D; +} + +U0 saveState() +{ + U8 *statebuf=CAlloc(2048*1024); + I64 *cpustate=CAlloc(21*sizeof(I64)); + U8 *cpubuf=cpustate; + U8 *mem=&memory; + U8 *mbc=&MBCRam; + cpustate[0]=programCounter; + cpustate[1]=stackPointer; + cpustate[2]=LCDTicks; + cpustate[3]=DIVTicks; + cpustate[4]=registerA; + cpustate[5]=registerB; + cpustate[6]=registerC; + cpustate[7]=registerD; + cpustate[8]=registerE; + cpustate[9]=registersHL; + cpustate[10]=currMBCRAMBank; + cpustate[11]=currMBCRAMBankPosition; + cpustate[12]=ROMBank1offs; + cpustate[13]=currentROMBank; + cpustate[14]=MBC1Mode; + cpustate[15]=MBCRAMBanksEnabled; + cpustate[16]=IME; + cpustate[17]=FZero; + cpustate[18]=FSubtract; + cpustate[19]=FHalfCarry; + cpustate[20]=FCarry; + MemCpy(statebuf,cpubuf,(21*sizeof(I64))); + MemCpy(statebuf+(21*sizeof(I64)),mem,sizeof(memory)); + MemCpy(statebuf+(21*sizeof(I64))+sizeof(memory),mbc,sizeof(MBCRam)); + FileWrite(StateFile,statebuf,(2048*1024)); + Free(cpustate); + Free(statebuf); + cpubuf=0; +} + +U0 loadState() +{ + I64 toBool; + U8 *buf=FileRead(StateFile); + MemCpy(&programCounter,buf+(8*0),8); + MemCpy(&stackPointer,buf+(8*1),8); + MemCpy(&LCDTicks,buf+(8*2),8); + MemCpy(&DIVTicks,buf+(8*3),8); + MemCpy(®isterA,buf+(8*4),8); + MemCpy(®isterB,buf+(8*5),8); + MemCpy(®isterC,buf+(8*6),8); + MemCpy(®isterD,buf+(8*7),8); + MemCpy(®isterE,buf+(8*8),8); + MemCpy(®istersHL,buf+(8*9),8); + MemCpy(&currMBCRAMBank,buf+(8*10),8); + MemCpy(&currMBCRAMBankPosition,buf+(8*11),8); + MemCpy(&ROMBank1offs,buf+(8*12),8); + MemCpy(¤tROMBank,buf+(8*13),8); + MemCpy(&toBool,buf+(8*14),8); + MBC1Mode=toBool; + MemCpy(&toBool,buf+(8*15),8); + MBCRAMBanksEnabled=toBool; + MemCpy(&toBool,buf+(8*16),8); + IME=toBool; + MemCpy(&toBool,buf+(8*17),8); + FZero=toBool; + MemCpy(&toBool,buf+(8*18),8); + FSubtract=toBool; + MemCpy(&toBool,buf+(8*19),8); + FHalfCarry=toBool; + MemCpy(&toBool,buf+(8*20),8); + FCarry=toBool; + MemCpy(&memory,buf+(21*sizeof(I64)),sizeof(memory)); + MemCpy(&MBCRam,buf+(21*sizeof(I64))+sizeof(memory),sizeof(MBCRam)); + Free(buf); +} + U0 runInterrupt() { bitShift = 0; @@ -900,6 +1002,10 @@ U0 updateCore() I64 timedTicks = CPUTicks / multiplier; // LCD Timing LCDTicks += timedTicks; //LCD timing + // Display Message Timer + if (DisplayMsgTicks>0) { DisplayMsgTicks++; }; + if (DisplayMsgTicks>1000000) { DisplayMsgTicks=0; }; + scanLine(actualScanLine); //Scan Line and STAT Mode Control //Audio Timing audioTicks += timedTicks; //Not the same as the LCD timing (Cannot be altered by display on/off changes!!!). @@ -986,6 +1092,48 @@ U0 executeIteration() //Keyboard switch(sc) { + case 0x13: + kReset=0; + break; + case 0x13 + 0x80: + if(!kReset) { + kReset=1; + StrCpy(DisplayMsg,"Reset"); + DisplayMsgTicks=1; + initEmulator; + }; + break; + + case 0x08: + kSave=0; + break; + case 0x08 + 0x80: + if(!kSave) { + kSave=1; + StrCpy(DisplayMsg,"State Saved"); + DisplayMsgTicks=1; + saveState; + }; + break; + + case 0x06: + kLoad=0; + break; + case 0x06 + 0x80: + if(!kLoad) { + kLoad=1; + if (FileFind(StateFile)) { + StrCpy(DisplayMsg,"State Loaded"); + DisplayMsgTicks=1; + initEmulator; + loadState; + } else { + StrCpy(DisplayMsg,"No State Found"); + DisplayMsgTicks=1; + }; + }; + break; + case 0x02 + 0x80: LCDScale=1; Fs->win_left =0x1F; @@ -1100,25 +1248,6 @@ U0 runEmulator() } } -U0 initEmulator() -{ - programCounter = 0x100; - stackPointer = 0xFFFE; - IME = TRUE; - LCDTicks = 15; - DIVTicks = 14; - registerA = 0x1; - registerB = 0; - registerC = 0x13; - registerD = 0; - registerE = 0xD8; - FZero = TRUE; - FSubtract = FALSE; - FHalfCarry = TRUE; - FCarry = TRUE; - registersHL = 0x014D; -} - U0 initLCD() { } @@ -1163,6 +1292,8 @@ U0 start() SetPal(memory[0xFF48],&obp00,&obp01,&obp02,&obp03); // OBP1 Palette $$FF49 SetPal(memory[0xFF49],&obp10,&obp11,&obp12,&obp13); + StrCpy(DisplayMsg,"ROM Loaded"); + DisplayMsgTicks=1; runEmulator; //Start the emulation. FreeLCD; Free(ROM); @@ -1175,5 +1306,7 @@ U0 start() U0 Run(U8 *rom_file) { ROM=FileRead(rom_file,&ROMSize); - start; + StrCpy(StateFile,rom_file); + StrCpy(StateFile+StrLen(StateFile)-3,".STA.Z"); + start; } @@ -24,3 +24,10 @@ Start: `ENTER` Exit: `ESC` Keys `1-3` toggle 1x/2x/3x video scaling. + +Reset: `R` + +Load State: `5` + +Save State: `7` + |