296 lines
6.2 KiB
C#
296 lines
6.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace BizHawk.Emulation.Common.Components.I8048
|
|
{
|
|
public sealed partial class I8048
|
|
{
|
|
static string[] table =
|
|
{
|
|
"NOP", // 00
|
|
"???", // 01
|
|
"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
|
|
"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
|
|
"XCHD A,@R0", // 30
|
|
"XCHD A,@R1", // 31
|
|
"JPB 1", // 32
|
|
"???", // 33
|
|
"CALL 1", // 34
|
|
"DN", // 35
|
|
"JP T0", // 36
|
|
"COM A", // 37
|
|
"???", // 38
|
|
"OUT P1", // 39
|
|
"OUT P2", // 3a
|
|
"???", // 3b
|
|
"MOV P4,A", // 3c
|
|
"MOV P5,A", // 3d
|
|
"MOV P6,A", // 3e
|
|
"MOV P7,A", // 3f
|
|
"OR A,@R0", // 40
|
|
"OR A,@R1", // 41
|
|
"MOV A,TIM", // 42
|
|
"OR A,i8", // 43
|
|
"JP 2K 2", // 44
|
|
"START CNT", // 45
|
|
"JP NT1", // 46
|
|
"SWP", // 47
|
|
"OR A,R0", // 48
|
|
"OR A,R1", // 49
|
|
"OR A,R2", // 4a
|
|
"OR A,R3", // 4b
|
|
"OR A,R4", // 4c
|
|
"OR A,R5", // 4d
|
|
"OR A,R6", // 4e
|
|
"OR A,R7", // 4f
|
|
"AND A,@R0", // 50
|
|
"AND A,@R1", // 51
|
|
"JPB 2", // 52
|
|
"AND A,i8", // 53
|
|
"CALL 2", // 54
|
|
"START TIM", // 55
|
|
"JP T1", // 56
|
|
"DAA", // 57
|
|
"AND A,R0", // 58
|
|
"AND A,R1", // 59
|
|
"AND A,R2", // 5a
|
|
"AND A,R3", // 5b
|
|
"AND A,R4", // 5c
|
|
"AND A,R5", // 5d
|
|
"AND A,R6", // 5e
|
|
"AND A,R7", // 5f
|
|
"ADD A,@R0", // 60
|
|
"ADD A,@R1", // 61
|
|
"MOV TIM,A", // 62
|
|
"???", // 63
|
|
"JP 2K 3", // 64
|
|
"STOP CNT", // 65
|
|
"???", // 66
|
|
"RRC", // 67
|
|
"ADD A,R0", // 68
|
|
"ADD A,R1", // 69
|
|
"ADD A,R2", // 6a
|
|
"ADD A,R3", // 6b
|
|
"ADD A,R4", // 6c
|
|
"ADD A,R5", // 6d
|
|
"ADD A,R6", // 6e
|
|
"ADD A,R7", // 6f
|
|
"ADC A,@R0", // 70
|
|
"ADC A,@R1", // 71
|
|
"JPB 3", // 72
|
|
"???", // 73
|
|
"CALL 3", // 74
|
|
"ENT0 CLK", // 75
|
|
"JP F1", // 76
|
|
"ROR", // 77
|
|
"ADC A,R0", // 78
|
|
"ADC A,R1", // 79
|
|
"ADC A,R2", // 7a
|
|
"ADC A,R3", // 7b
|
|
"ADC A,R4", // 7c
|
|
"ADC A,R5", // 7d
|
|
"ADC A,R6", // 7e
|
|
"ADC A,R7", // 7f
|
|
"MOVX A,@R0", // 80
|
|
"MOVX A,@R1", // 81
|
|
"???", // 82
|
|
"RET", // 83
|
|
"JP 2K 4", // 84
|
|
"CLR F0", // 85
|
|
"JP !IRQ", // 86
|
|
"???", // 87
|
|
"OR BUS,i8", // 88
|
|
"OR P1,i8", // 89
|
|
"OR P2,i8", // 8a
|
|
"???", // 8b
|
|
"OR P4,A", // 8c
|
|
"OR P5,A", // 8d
|
|
"OR P6,A", // 8e
|
|
"OR P7,A", // 8f
|
|
"MOVX @R0,A", // 90
|
|
"MOVX @R1,A", // 91
|
|
"JPB 4", // 92
|
|
"RETR", // 93
|
|
"CALL 4", // 94
|
|
"COM F0", // 95
|
|
"JP A!=0", // 96
|
|
"CLR C", // 97
|
|
"AND BUS,i8", // 98
|
|
"AND P1,i8", // 99
|
|
"AND P2,i8", // 9a
|
|
"???", // 9b
|
|
"AND P4,A", // 9c
|
|
"AND P5,A", // 9d
|
|
"AND P6,A", // 9e
|
|
"AND P7,A", // 9f
|
|
"MOV @R0,A", // a0
|
|
"MOV @R1,A", // a1
|
|
"???", // a2
|
|
"MOV A,@A", // a3
|
|
"JP 2K 5", // a4
|
|
"CLR F1", // a5
|
|
"???", // a6
|
|
"COM C", // a7
|
|
"MOV R0,A", // a8
|
|
"MOV R1,A", // a9
|
|
"MOV R2,A", // aa
|
|
"MOV R3,A", // ab
|
|
"MOV R4,A", // ac
|
|
"MOV R5,A", // ad
|
|
"MOV R6,A", // ae
|
|
"MOV R7,A", // af
|
|
"???", // b0
|
|
"???", // b1
|
|
"JPB 5", // b2
|
|
"JPP A", // b3
|
|
"CALL 5", // b4
|
|
"COM F1", // b5
|
|
"JP F0", // b6
|
|
"???", // b7
|
|
"MOV R0,i8", // b8
|
|
"MOV R1,i8", // b9
|
|
"MOV R2,i8", // ba
|
|
"MOV R3,i8", // bb
|
|
"MOV R4,i8", // bc
|
|
"MOV R5,i8", // bd
|
|
"MOV R6,i8", // be
|
|
"MOV R7,i8", // bf
|
|
"???", // c0
|
|
"???", // c1
|
|
"???", // c2
|
|
"???", // c3
|
|
"JP 2K 6", // c4
|
|
"SEL RB 0", // c5
|
|
"JP A==0", // c6
|
|
"MOV A,PSW", // c7
|
|
"DEC R0", // c8
|
|
"DEC R1", // c9
|
|
"DEC R2", // ca
|
|
"DEC R3", // cb
|
|
"DEC R4", // cc
|
|
"DEC R5", // cd
|
|
"DEC R6", // ce
|
|
"DEC R7", // cf
|
|
"XOR A,@R0", // d0
|
|
"XOR A,@R1", // d1
|
|
"JPB 6", // d2
|
|
"XOR A,i8", // d3
|
|
"CALL 6", // d4
|
|
"SEL RB 1", // d5
|
|
"???", // d6
|
|
"MOV PSW,A", // d7
|
|
"XOR A,R0", // d8
|
|
"XOR A,R1", // d9
|
|
"XOR A,R2", // da
|
|
"XOR A,R3", // db
|
|
"XOR A,R4", // dc
|
|
"XOR A,R5", // dd
|
|
"XOR A,R6", // de
|
|
"XOR A,R7", // df
|
|
"???", // e0
|
|
"???", // e1
|
|
"???", // e2
|
|
"MOV3 A,@A", // e3
|
|
"JP 2K 7", // e4
|
|
"SEL MB 0", // e5
|
|
"JP NC", // e6
|
|
"ROL", // e7
|
|
"DJNZ R0", // e8
|
|
"DJNZ R1", // e9
|
|
"DJNZ R2", // ea
|
|
"DJNZ R3", // eb
|
|
"DJNZ R4", // ec
|
|
"DJNZ R5", // ed
|
|
"DJNZ R6", // ee
|
|
"DJNZ R7", // ef
|
|
"MOV A,@R0", // f0
|
|
"MOV A,@R1", // f1
|
|
"JPB 7", // f2
|
|
"???", // f3
|
|
"CALL 7", // f4
|
|
"SEL MB 1", // f5
|
|
"JP C", // f6
|
|
"RLC", // f7
|
|
"MOV A,R0", // f8
|
|
"MOV A,R1", // f9
|
|
"MOV A,R2", // fa
|
|
"MOV A,R3", // fb
|
|
"MOV A,R4", // fc
|
|
"MOV A,R5", // fd
|
|
"MOV A,R6", // fe
|
|
"MOV A,R7" // ff
|
|
};
|
|
|
|
public static string Disassemble(ushort addr, Func<ushort, byte> reader, out ushort size)
|
|
{
|
|
ushort origaddr = addr;
|
|
List<byte> bytes = new List<byte>();
|
|
bytes.Add(reader(addr++));
|
|
|
|
string result = table[bytes[0]];
|
|
|
|
if (result.Contains("i8"))
|
|
{
|
|
byte d = reader(addr++);
|
|
bytes.Add(d);
|
|
result = result.Replace("i8", string.Format("#{0:X2}h", d));
|
|
}
|
|
|
|
StringBuilder ret = new StringBuilder();
|
|
ret.Append(string.Format("{0:X4}: ", origaddr));
|
|
foreach (var b in bytes)
|
|
ret.Append(string.Format("{0:X2} ", b));
|
|
while (ret.Length < 22)
|
|
ret.Append(' ');
|
|
ret.Append(result);
|
|
size = (ushort)(addr - origaddr);
|
|
return ret.ToString();
|
|
}
|
|
}
|
|
}
|