diff --git a/BizHawk.Emulation.Cores/CPUs/Intel8048/Disassembler.cs b/BizHawk.Emulation.Cores/CPUs/Intel8048/Disassembler.cs index bd325ae77d..dc21ab5a2f 100644 --- a/BizHawk.Emulation.Cores/CPUs/Intel8048/Disassembler.cs +++ b/BizHawk.Emulation.Cores/CPUs/Intel8048/Disassembler.cs @@ -8,54 +8,54 @@ namespace BizHawk.Emulation.Common.Components.I8048 { static string[] table = { - "NEG DP+i8", // 00 + "NOP", // 00 "???", // 01 - "???", // 02 - "COM DP+i8", // 03 - "LSR DP+i8", // 04 - "???", // 05 - "ROR DP+i8", // 06 - "ASR DP+i8", // 07 - "ASL DP+i8", // 08 - "ROL DP+i8", // 09 - "DEC DP+i8", // 0a + "OUT BUS,A", // 02 + "ADD A,i8", // 03 + "JP R0", // 04 + "EI", // 05 + "???", // 06 + "DEC A", // 07 + "IN A,BUS", // 08 + "IN A,P1", // 09 + "IN A,P2", // 0a "???", // 0b - "INC DP+i8", // 0c - "TST DP+i8", // 0d - "JMP DP+i8", // 0e - "CLR DP+i8", // 0f - "PAGE 2", // 10 - "PAGE 3", // 11 - "NOP", // 12 - "SYNC", // 13 - "???", // 14 - "???", // 15 - "LBRA i16", // 16 - "LBSR i16", // 17 - "???", // 18 - "DAA", // 19 - "ORCC i8", // 1a - "???", // 1b - "ANDCC i8", // 1c - "SEX", // 1d - "EXG i8", // 1e - "TFR i8", // 1f - "BRA i8", // 20 - "BRN i8", // 21 - "BHI i8", // 22 - "BLS i8", // 23 - "BHS i8", // 24 - "BLO i8", // 25 - "BNE i8", // 26 - "BEQ i8", // 27 - "BVC i8", // 28 - "BVS i8", // 29 - "BPL i8", // 2a - "BMI i8", // 2b - "BGE i8", // 2c - "BLT i8", // 2d - "BGT i8", // 2e - "BLE i8", // 2f + "MOV A,P4", // 0c + "MOV A,P5", // 0d + "MOV A,P6", // 0e + "MOV A,P7", // 0f + "INC @R0", // 10 + "INC @R1", // 11 + "JPB 0", // 12 + "ADC A,i8", // 13 + "CALL @R0", // 14 + "DI", // 15 + "JP TF", // 16 + "INC A", // 17 + "INC R0", // 18 + "INC R1", // 19 + "INC R2", // 1a + "INC R3", // 1b + "INC R4", // 1c + "INC R5", // 1d + "INC R6", // 1e + "INC R7", // 1f + "XCH A,@R0", // 20 + "XCH A,@R1", // 21 + "???", // 22 + "MOV A,i8", // 23 + "JP R1", // 24 + "EN", // 25 + "JP !T0", // 26 + "CLR A", // 27 + "XCH A,R0", // 28 + "XCH A,R1", // 29 + "XCH A,R2", // 2a + "XCH A,R3", // 2b + "XCH A,R4", // 2c + "XCH A,R5", // 2d + "XCH A,R6", // 2e + "XCH A,R7", // 2f "LEAX ix16", // 30 "LEAY ix16", // 31 "LEAS ix16", // 32 @@ -288,197 +288,6 @@ namespace BizHawk.Emulation.Common.Components.I8048 bytes.Add(dlo); result = result.Replace("i16", string.Format("#{0:X2}{1:X2}h", dhi, dlo)); } - else if (result.Contains("ex16")) - { - byte dhi = reader(addr++); - byte dlo = reader(addr++); - bytes.Add(dhi); - bytes.Add(dlo); - result = result.Replace("ex16", "(" + string.Format("#{0:X2}{1:X2}h", dhi, dlo) + ")"); - } - else if (result.Contains("ix16")) - { - byte d = reader(addr++); - bytes.Add(d); - - string temp_reg = ""; - - switch ((d >> 5) & 3) - { - case 0: temp_reg = "X"; break; - case 1: temp_reg = "Y"; break; - case 2: temp_reg = "US"; break; - case 3: temp_reg = "SP"; break; - } - - if ((d & 0x80) == 0) - { - short tempdis = (short)(d & 0x1F); - if (tempdis >= 16) - tempdis -= 32; - - result = result.Replace("ix16", temp_reg + " + ea"); - result = result.Replace("ea", string.Format("{0:N}h", tempdis)); - } - else - { - if ((d & 0x10) == 0x10) - { - switch (d & 0xF) - { - case 0x0: - result = result.Replace("ix16", "???"); - break; - case 0x1: - result = result.Replace("ix16","(" + temp_reg + ")++"); - break; - case 0x2: - result = result.Replace("ix16", "???"); - break; - case 0x3: - result = result.Replace("ix16", "--(" + temp_reg + ")"); - break; - case 0x4: - result = result.Replace("ix16", "(" + temp_reg + ")"); - break; - case 0x5: - result = result.Replace("ix16", "(" + temp_reg + " + B)"); - break; - case 0x6: - result = result.Replace("ix16", "(" + temp_reg + " + A)"); - break; - case 0x7: - result = result.Replace("ix16", "???"); - break; - case 0x8: - byte e = reader(addr++); - bytes.Add(e); - result = result.Replace("ix16", "(" + temp_reg + " + ea)"); - result = result.Replace("ea", string.Format("{0:X2}h", e)); - break; - case 0x9: - byte f = reader(addr++); - bytes.Add(f); - byte g = reader(addr++); - bytes.Add(g); - result = result.Replace("ix16", "(" + temp_reg + " + ea)"); - result = result.Replace("ea", string.Format("{0:X2}{1:X2}h", f, g)); - break; - case 0xA: - result = result.Replace("ix16", "???"); - break; - case 0xB: - result = result.Replace("ix16", "(" + temp_reg + " + D)"); - break; - case 0xC: - temp_reg = "PC"; - byte h = reader(addr++); - bytes.Add(h); - result = result.Replace("ix16", "(" + temp_reg + " + ea)"); - result = result.Replace("ea", string.Format("{0:X2}h", h)); - break; - case 0xD: - temp_reg = "PC"; - byte i = reader(addr++); - bytes.Add(i); - byte j = reader(addr++); - bytes.Add(j); - result = result.Replace("ix16", "(" + temp_reg + " + ea)"); - result = result.Replace("ea", string.Format("{0:X2}{1:X2}h", i, j)); - break; - case 0xE: - result = result.Replace("ix16", "???"); - break; - case 0xF: - if (((d >> 5) & 3) == 0) - { - byte k = reader(addr++); - bytes.Add(k); - byte l = reader(addr++); - bytes.Add(l); - result = result.Replace("ix16", "(" + string.Format("{0:X2}{1:X2}h", k, l) + ")"); - } - else - { - result = result.Replace("ix16", "???"); - } - break; - } - } - else - { - switch (d & 0xF) - { - case 0x0: - result = result.Replace("ix16", temp_reg + "+"); - break; - case 0x1: - result = result.Replace("ix16", temp_reg + "++"); - break; - case 0x2: - result = result.Replace("ix16", "-" + temp_reg); - break; - case 0x3: - result = result.Replace("ix16", "--" + temp_reg); - break; - case 0x4: - result = result.Replace("ix16", temp_reg); - break; - case 0x5: - result = result.Replace("ix16", temp_reg + " + B"); - break; - case 0x6: - result = result.Replace("ix16", temp_reg + " + A"); - break; - case 0x7: - result = result.Replace("ix16", "???"); - break; - case 0x8: - byte e = reader(addr++); - bytes.Add(e); - result = result.Replace("ix16", temp_reg + " + ea"); - result = result.Replace("ea", string.Format("{0:X2}h", e)); - break; - case 0x9: - byte f = reader(addr++); - bytes.Add(f); - byte g = reader(addr++); - bytes.Add(g); - result = result.Replace("ix16", temp_reg + " + ea"); - result = result.Replace("ea", string.Format("{0:X2}{1:X2}h", f, g)); - break; - case 0xA: - result = result.Replace("ix16", "???"); - break; - case 0xB: - result = result.Replace("ix16", temp_reg + " + D"); - break; - case 0xC: - temp_reg = "PC"; - byte h = reader(addr++); - bytes.Add(h); - result = result.Replace("ix16", temp_reg + " + ea"); - result = result.Replace("ea", string.Format("{0:X2}h", h)); - break; - case 0xD: - temp_reg = "PC"; - byte i = reader(addr++); - bytes.Add(i); - byte j = reader(addr++); - bytes.Add(j); - result = result.Replace("ix16", temp_reg + " + ea"); - result = result.Replace("ea", string.Format("{0:X2}{1:X2}h", i, j)); - break; - case 0xE: - result = result.Replace("ix16", "???"); - break; - case 0xF: - result = result.Replace("ix16", "???"); - break; - } - } - } - } StringBuilder ret = new StringBuilder(); ret.Append(string.Format("{0:X4}: ", origaddr)); diff --git a/BizHawk.Emulation.Cores/CPUs/Intel8048/Execute.cs b/BizHawk.Emulation.Cores/CPUs/Intel8048/Execute.cs index d039f5ee83..bb3b9c7189 100644 --- a/BizHawk.Emulation.Cores/CPUs/Intel8048/Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/Intel8048/Execute.cs @@ -25,20 +25,20 @@ namespace BizHawk.Emulation.Common.Components.I8048 { case 0x00: OP_IMP(IDLE); break; // NOP case 0x01: ILLEGAL(); break; // ILLEGAL - case 0x02: ILLEGAL(); break; // ILLEGAL + case 0x02: IN_OUT_BUS(OUT); break; // OUT BUS,A case 0x03: OP_A_DIR(ADD8); break; // ADD A,# case 0x04: JP_2k(0); break; // JP 2K 0 case 0x05: OP_IMP(EI); break; // EI case 0x06: ILLEGAL(); break; // ILLEGAL case 0x07: OP_IMP(DECA); break; // DEC A - case 0x08: IN_BUS(IN); break; // IN A,BUS + case 0x08: IN_OUT_BUS(IN); break; // IN A,BUS case 0x09: IN_OUT_A(IN, 1); break; // IN A,1 case 0x0A: IN_OUT_A(IN, 2); break; // IN A,2 case 0x0B: ILLEGAL(); break; // ILLEGAL - case 0x0C: ILLEGAL(); break; // ILLEGAL - case 0x0D: ILLEGAL(); break; // ILLEGAL - case 0x0E: ILLEGAL(); break; // ILLEGAL - case 0x0F: ILLEGAL(); break; // ILLEGAL + case 0x0C: MOV_A_P4(4); break; // MOV A,P4 + case 0x0D: MOV_A_P4(5); break; // MOV A,P5 + case 0x0E: MOV_A_P4(6); break; // MOV A,P6 + case 0x0F: MOV_A_P4(7); break; // MOV A,P7 case 0x10: OP_A_R(INC_RAM, R0); break; // INC #,R0 case 0x11: OP_A_R(INC_RAM, R1); break; // INC #,R1 case 0x12: JPB(0); break; // JPB 0 @@ -47,14 +47,14 @@ namespace BizHawk.Emulation.Common.Components.I8048 case 0x15: OP_IMP(DI); break; // DI case 0x16: JP_COND(TF, RES_TF); break; // JP TF case 0x17: OP_IMP(INCA); break; // INC A - case 0x18: ILLEGAL(); break; // ILLEGAL - case 0x19: ILLEGAL(); break; // ILLEGAL - case 0x1A: ILLEGAL(); break; // ILLEGAL - case 0x1B: ILLEGAL(); break; // ILLEGAL - case 0x1C: ILLEGAL(); break; // ILLEGAL - case 0x1D: ILLEGAL(); break; // ILLEGAL - case 0x1E: ILLEGAL(); break; // ILLEGAL - case 0x1F: ILLEGAL(); break; // ILLEGAL + case 0x18: OP_R_IMP(INC8, R0); break; // INC R0 + case 0x19: OP_R_IMP(INC8, R1); break; // INC R1 + case 0x1A: OP_R_IMP(INC8, R2); break; // INC R2 + case 0x1B: OP_R_IMP(INC8, R3); break; // INC R3 + case 0x1C: OP_R_IMP(INC8, R4); break; // INC R4 + case 0x1D: OP_R_IMP(INC8, R5); break; // INC R5 + case 0x1E: OP_R_IMP(INC8, R6); break; // INC R6 + case 0x1F: OP_R_IMP(INC8, R7); break; // INC R7 case 0x20: OP_A_R(XCH_RAM, R0); break; // XCH A,@R0 case 0x21: OP_A_R(XCH_RAM, R1); break; // XCH A,@R1 case 0x22: ILLEGAL(); break; // ILLEGAL @@ -80,19 +80,19 @@ namespace BizHawk.Emulation.Common.Components.I8048 case 0x36: JP_COND(T0, IDLE); break; // JP T0 case 0x37: OP_IMP(COM); break; // COM A case 0x38: ILLEGAL(); break; // ILLEGAL - case 0x39: ILLEGAL(); break; // ILLEGAL - case 0x3A: ILLEGAL(); break; // ILLEGAL + case 0x39: OUT_P(1); break; // OUT P1,A + case 0x3A: OUT_P(2); break; // OUT P2,A case 0x3B: ILLEGAL(); break; // ILLEGAL - case 0x3C: ILLEGAL(); break; // ILLEGAL - case 0x3D: ILLEGAL(); break; // ILLEGAL - case 0x3E: ILLEGAL(); break; // ILLEGAL - case 0x3F: ILLEGAL(); break; // ILLEGAL + case 0x3C: MOV_P4_A(4); break; // MOV P4,A + case 0x3D: MOV_P4_A(5); break; // MOV P5,A + case 0x3E: MOV_P4_A(6); break; // MOV P6,A + case 0x3F: MOV_P4_A(7); break; // MOV P7,A case 0x40: OP_A_R(OR8RAM, R0); break; // OR A,@R0 case 0x41: OP_A_R(OR8RAM, R1); break; // OR A,@R1 case 0x42: MOV_R(A, TIM); break; // MOV A,TIM case 0x43: OP_A_DIR(OR8); break; // OR A,# case 0x44: JP_2k(2); break; // JP 2K 2 - case 0x45: ILLEGAL(); break; // ILLEGAL + case 0x45: OP_IMP(ST_CNT); break; // START CNT case 0x46: JP_COND(!T1, IDLE); break; // JP NT1 case 0x47: OP_IMP(SWP); break; // SWP case 0x48: OP_A_R(OR8, R0); break; // OR A,R0 @@ -108,7 +108,7 @@ namespace BizHawk.Emulation.Common.Components.I8048 case 0x52: JPB(2); break; // JPB 2 case 0x53: OP_A_DIR(AND8); break; // AND A,# case 0x54: CALL(2); break; // CALL - case 0x55: ILLEGAL(); break; // ILLEGAL + case 0x55: OP_IMP(ST_T); break; // START TIMER case 0x56: JP_COND(T1, IDLE); break; // JP T1 case 0x57: OP_IMP(DA); break; // DA A case 0x58: OP_A_R(AND8, R0); break; // AND A,R0 @@ -124,7 +124,7 @@ namespace BizHawk.Emulation.Common.Components.I8048 case 0x62: MOV_R(TIM, A); break; // MOV TIM,A case 0x63: ILLEGAL(); break; // ILLEGAL case 0x64: JP_2k(3); break; // JP 2K 3 - case 0x65: ILLEGAL(); break; // ILLEGAL + case 0x65: OP_IMP(STP_CNT); break; // STOP CNT case 0x66: ILLEGAL(); break; // ILLEGAL case 0x67: OP_IMP(RRC); break; // RRC case 0x68: OP_A_R(ADD8, R0); break; // ADD A,R0 @@ -151,10 +151,10 @@ namespace BizHawk.Emulation.Common.Components.I8048 case 0x7D: OP_A_R(ADC8, R5); break; // ADC A,R5 case 0x7E: OP_A_R(ADC8, R6); break; // ADC A,R6 case 0x7F: OP_A_R(ADC8, R7); break; // ADC A,R7 - case 0x80: ILLEGAL(); break; // ILLEGAL - case 0x81: ILLEGAL(); break; // ILLEGAL + case 0x80: MOVX_A_R(0); break; // MOVX A,R0 + case 0x81: MOVX_A_R(1); break; // MOVX A,R1 case 0x82: ILLEGAL(); break; // ILLEGAL - case 0x83: ILLEGAL(); break; // ILLEGAL + case 0x83: RET(); break; // RET case 0x84: JP_2k(4); break; // JP 2K 4 case 0x85: OP_IMP(CL0); break; // CLR F0 case 0x86: JP_COND(!IRQPending, IDLE); break; // JP !IRQ @@ -167,10 +167,10 @@ namespace BizHawk.Emulation.Common.Components.I8048 case 0x8D: OP_EXP_A(OR8, P5); break; // OR P5,A case 0x8E: OP_EXP_A(OR8, P6); break; // OR P6,A case 0x8F: OP_EXP_A(OR8, P7); break; // OR P7,A - case 0x90: ILLEGAL(); break; // ILLEGAL - case 0x91: ILLEGAL(); break; // ILLEGAL + case 0x90: MOVX_R_A(0); break; // MOVX R0,A + case 0x91: MOVX_R_A(1); break; // MOVX R1,A case 0x92: JPB(4); break; // JPB 4 - case 0x93: ILLEGAL(); break; // ILLEGAL + case 0x93: RETR(); break; //RETR case 0x94: CALL(4); break; // CALL case 0x95: OP_IMP(CM0); break; // COM F0 case 0x96: JP_COND(Regs[A] != 0, IDLE); break; // JP (A != 0) @@ -186,7 +186,7 @@ namespace BizHawk.Emulation.Common.Components.I8048 case 0xA0: OP_A_R(MOVT_RAM, R0); break; // MOV @R0,A case 0xA1: OP_A_R(MOVT_RAM, R1); break; // MOV @R1,A case 0xA2: ILLEGAL(); break; // ILLEGAL - case 0xA3: ILLEGAL(); break; // ILLEGAL + case 0xA3: MOV_A_A(); break; // MOV A,@A case 0xA4: JP_2k(5); break; // JP 2K 5 case 0xA5: OP_IMP(CL1); break; // CLR F1 case 0xA6: ILLEGAL(); break; // ILLEGAL @@ -250,7 +250,7 @@ namespace BizHawk.Emulation.Common.Components.I8048 case 0xE0: ILLEGAL(); break; // ILLEGAL case 0xE1: ILLEGAL(); break; // ILLEGAL case 0xE2: ILLEGAL(); break; // ILLEGAL - case 0xE3: ILLEGAL(); break; // ILLEGAL + case 0xE3: MOV3_A_A(); break; // MOV3 A,@A case 0xE4: JP_2k(7); break; // JP 2K 7 case 0xE5: OP_IMP(SEL_MB0); break; // SEL MB 0 case 0xE6: JP_COND(!FlagC, IDLE); break; // JP NC diff --git a/BizHawk.Emulation.Cores/CPUs/Intel8048/I8048.cs b/BizHawk.Emulation.Cores/CPUs/Intel8048/I8048.cs index 64c4dcb531..463745bd8e 100644 --- a/BizHawk.Emulation.Cores/CPUs/Intel8048/I8048.cs +++ b/BizHawk.Emulation.Cores/CPUs/Intel8048/I8048.cs @@ -83,6 +83,9 @@ namespace BizHawk.Emulation.Common.Components.I8048 public const ushort MOV_RAM = 77; public const ushort MOVT = 78; public const ushort MOVT_RAM = 79; + public const ushort ST_CNT = 80; + public const ushort STP_CNT = 81; + public const ushort ST_T = 82; public I8048() { @@ -317,6 +320,15 @@ namespace BizHawk.Emulation.Common.Components.I8048 break; case MOVT_RAM: + break; + case ST_CNT: + + break; + case STP_CNT: + + break; + case ST_T: + break; } diff --git a/BizHawk.Emulation.Cores/CPUs/Intel8048/OP_Tables.cs b/BizHawk.Emulation.Cores/CPUs/Intel8048/OP_Tables.cs index 90f17579d1..364663d2ec 100644 --- a/BizHawk.Emulation.Cores/CPUs/Intel8048/OP_Tables.cs +++ b/BizHawk.Emulation.Cores/CPUs/Intel8048/OP_Tables.cs @@ -83,7 +83,7 @@ namespace BizHawk.Emulation.Common.Components.I8048 IRQS = 9; } - public void IN_BUS(ushort oper) + public void IN_OUT_BUS(ushort oper) { PopulateCURINSTR(IDLE, IDLE, @@ -98,6 +98,141 @@ namespace BizHawk.Emulation.Common.Components.I8048 IRQS = 9; } + public void OUT_P(ushort port) + { + PopulateCURINSTR(IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + port, A); + + IRQS = 9; + } + + public void RET() + { + PopulateCURINSTR(IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE); + + IRQS = 9; + } + + public void RETR() + { + PopulateCURINSTR(IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE); + + IRQS = 9; + } + + public void MOV_A_P4(ushort port) + { + PopulateCURINSTR(IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE); + + IRQS = 9; + } + + public void MOV_P4_A(ushort port) + { + PopulateCURINSTR(IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE); + + IRQS = 9; + } + + public void MOV_A_A() + { + PopulateCURINSTR(IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE); + + IRQS = 9; + } + + public void MOV3_A_A() + { + PopulateCURINSTR(IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE); + + IRQS = 9; + } + + public void MOVX_A_R(ushort reg) + { + PopulateCURINSTR(IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE); + + IRQS = 9; + } + + public void MOVX_R_A(ushort reg) + { + PopulateCURINSTR(IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE); + + IRQS = 9; + } + public void OP_A_DIR(ushort oper) { PopulateCURINSTR(IDLE,