103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
"""Generate an ISA test ROM from assembler-verified opcodes.
|
|
|
|
The opcodes below were produced by assembling isa_test.dsp with
|
|
the open21xx toolchain (as219x + ld21) and extracting the int_pm
|
|
section from the resulting ELF. They serve as ground truth for
|
|
validating the radare2 disassembler plugin.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
|
|
|
|
# Verified opcodes from open21xx assembler output.
|
|
# Source: examples/isa_test.dsp -> as219x -> ld21 -> dd
|
|
VERIFIED_OPCODES = [
|
|
# Type 30: NOP
|
|
(0x000000, "NOP"),
|
|
# Type 6: Dreg = Imm16
|
|
(0x412340, "AX0 = 0x1234"),
|
|
(0x456781, "AX1 = 0x5678"),
|
|
(0x4AAAA4, "AY0 = 0xAAAA"),
|
|
(0x440002, "MX0 = 0x4000"),
|
|
(0x420006, "MY0 = 0x2000"),
|
|
# Type 7: Reg1 = Imm16
|
|
(0x501000, "I0 = 0x0100"),
|
|
(0x502001, "I1 = 0x0200"),
|
|
(0x303000, "I4 = 0x0300"),
|
|
(0x500014, "M0 = 1"),
|
|
(0x500015, "M1 = 1"),
|
|
(0x5FFFF7, "M3 = -1"),
|
|
(0x300014, "M4 = 1"),
|
|
(0x500008, "L0 = 0"),
|
|
(0x300008, "L4 = 0"),
|
|
(0x5000AF, "CNTR = 10"),
|
|
# Type 17: Reg = Reg
|
|
(0x0D00A0, "AR = AX0"),
|
|
(0x0D00B1, "SI = AX1"),
|
|
(0x0D00E2, "MR0 = MX0"),
|
|
# Type 9: Compute (ALU)
|
|
(0x22600F, "AR = AX0 + AY0"),
|
|
(0x22E00F, "AR = AX0 - AY0"),
|
|
(0x23800F, "AR = AX0 AND AY0"),
|
|
(0x23A00F, "AR = AX0 OR AY0"),
|
|
(0x23C00F, "AR = AX0 XOR AY0"),
|
|
(0x22780F, "AR = PASS AX0"),
|
|
(0x23380F, "AR = -AX0"),
|
|
(0x23E00F, "AR = ABS AX0"),
|
|
# Type 9: Compute (MAC)
|
|
(0x20800F, "MR = MX0 * MY0 (SS)"),
|
|
# Type 10a: Jump (unconditional, 16-bit addr)
|
|
(0x1C0010, "JUMP _skip1"),
|
|
(0x000000, "NOP"),
|
|
# Type 10: Jump (conditional, 13-bit addr)
|
|
(0x180010, "IF EQ JUMP _skip2"),
|
|
(0x000000, "NOP"),
|
|
# Type 10a: Call + Jump
|
|
(0x1C0024, "CALL _sub1"),
|
|
(0x1C0030, "JUMP _after_sub"),
|
|
(0x000000, "NOP (in sub)"),
|
|
# Type 20: RTS
|
|
(0x0A00F0, "RTS"),
|
|
(0x000000, "NOP (after sub)"),
|
|
# Type 7: CNTR for loop
|
|
(0x30004E, "CNTR = 4"),
|
|
# Type 11: DO UNTIL
|
|
(0x16002E, "DO _loop_end UNTIL CE"),
|
|
(0x000000, "NOP (loop body)"),
|
|
(0x000000, "NOP (loop end)"),
|
|
# Type 15: Shift Immediate
|
|
(0x0F0B04, "SR = LSHIFT SI BY 4 (HI)"),
|
|
(0x0F4BFE, "SR = ASHIFT SI BY -2 (HI)"),
|
|
# Type 18: Mode Control
|
|
(0x0C0800, "DIS AR_SAT"),
|
|
(0x0C0C00, "ENA AR_SAT"),
|
|
# Type 25: Saturate MR
|
|
(0x030000, "SAT MR"),
|
|
# Type 33: Reg3 = short immediate
|
|
(0x100005, "SE = 0"),
|
|
# Type 10a: Infinite loop
|
|
(0x1C0000, "JUMP _halt"),
|
|
]
|
|
|
|
|
|
def main():
|
|
base_dir = os.path.dirname(os.path.abspath(__file__))
|
|
rom_path = os.path.join(base_dir, "test_roms", "isa_test.bin")
|
|
os.makedirs(os.path.dirname(rom_path), exist_ok=True)
|
|
|
|
with open(rom_path, "wb") as f:
|
|
for opcode, _label in VERIFIED_OPCODES:
|
|
f.write(bytes([
|
|
(opcode >> 16) & 0xFF,
|
|
(opcode >> 8) & 0xFF,
|
|
opcode & 0xFF,
|
|
]))
|
|
|
|
print("Generated ISA test ROM with %d instructions at: %s"
|
|
% (len(VERIFIED_OPCODES), rom_path))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|