O2Hawk: Start disassembly

This commit is contained in:
alyosha-tas 2019-11-10 20:22:38 -05:00
parent 33d53638e9
commit c427d280ba
4 changed files with 225 additions and 269 deletions
BizHawk.Emulation.Cores/CPUs/Intel8048

View File

@ -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));

View File

@ -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

View File

@ -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;
}

View File

@ -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,