mirror of
https://github.com/KrisKennaway/ii-vision.git
synced 2024-12-21 20:29:21 +00:00
Support old-style opcodes that use relative branch addressing, and new
cycle-counted tick opcodes that use absolute addressing. For now switch to the experimental audio-only player.
This commit is contained in:
parent
2f12407d3c
commit
340a3005d8
242
opcodes.py
242
opcodes.py
@ -53,6 +53,39 @@ class OpcodeCommand(enum.Enum):
|
|||||||
TERMINATE = 0xff
|
TERMINATE = 0xff
|
||||||
NOP = 0xfa
|
NOP = 0xfa
|
||||||
ACK = 0xf9
|
ACK = 0xf9
|
||||||
|
TICK_4 = 4
|
||||||
|
TICK_6 = 6
|
||||||
|
TICK_8 = 8
|
||||||
|
TICK_10 = 10
|
||||||
|
TICK_12 = 12
|
||||||
|
TICK_14 = 14
|
||||||
|
TICK_16 = 16
|
||||||
|
TICK_18 = 18
|
||||||
|
TICK_20 = 20
|
||||||
|
TICK_22 = 22
|
||||||
|
TICK_24 = 24
|
||||||
|
TICK_26 = 26
|
||||||
|
TICK_28 = 28
|
||||||
|
TICK_30 = 30
|
||||||
|
TICK_32 = 32
|
||||||
|
TICK_34 = 34
|
||||||
|
TICK_36 = 36
|
||||||
|
TICK_38 = 38
|
||||||
|
TICK_40 = 40
|
||||||
|
TICK_42 = 42
|
||||||
|
TICK_44 = 44
|
||||||
|
TICK_46 = 46
|
||||||
|
TICK_48 = 48
|
||||||
|
TICK_50 = 50
|
||||||
|
TICK_52 = 52
|
||||||
|
TICK_54 = 54
|
||||||
|
TICK_56 = 56
|
||||||
|
TICK_58 = 58
|
||||||
|
TICK_60 = 60
|
||||||
|
TICK_62 = 62
|
||||||
|
TICK_64 = 64
|
||||||
|
TICK_66 = 66
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Opcode:
|
class Opcode:
|
||||||
@ -65,6 +98,9 @@ class Opcode:
|
|||||||
# Offset of last byte in decoder opcode
|
# Offset of last byte in decoder opcode
|
||||||
_END = None # type: int
|
_END = None # type: int
|
||||||
|
|
||||||
|
# Opcode uses relative addressing to branch to next opcode
|
||||||
|
_RELATIVE_BRANCH = False
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "Opcode(%s)" % self.COMMAND.name
|
return "Opcode(%s)" % self.COMMAND.name
|
||||||
|
|
||||||
@ -86,10 +122,14 @@ class Opcode:
|
|||||||
opcode: "Opcode") -> Iterator[int]:
|
opcode: "Opcode") -> Iterator[int]:
|
||||||
# Compute offset from last opcode's terminating BRA instruction to
|
# Compute offset from last opcode's terminating BRA instruction to
|
||||||
# first instruction of this opcode.
|
# first instruction of this opcode.
|
||||||
|
if last_opcode._RELATIVE_BRANCH:
|
||||||
offset = (opcode._START - last_opcode._END - 1) & 0xff
|
offset = (opcode._START - last_opcode._END - 1) & 0xff
|
||||||
|
|
||||||
# print("%s -> %s = %02x" % (last_opcode, opcode, offset))
|
# print("%s -> %s = %02x" % (last_opcode, opcode, offset))
|
||||||
yield offset
|
#yield offset
|
||||||
|
else:
|
||||||
|
yield opcode._START >> 8
|
||||||
|
yield opcode._START & 0xff
|
||||||
|
|
||||||
def emit_data(self) -> Iterator[int]:
|
def emit_data(self) -> Iterator[int]:
|
||||||
return
|
return
|
||||||
@ -110,6 +150,8 @@ class Store(Opcode):
|
|||||||
COMMAND = OpcodeCommand.STORE
|
COMMAND = OpcodeCommand.STORE
|
||||||
_CYCLES = 20
|
_CYCLES = 20
|
||||||
|
|
||||||
|
_RELATIVE_BRANCH = True
|
||||||
|
|
||||||
def __init__(self, offset: int):
|
def __init__(self, offset: int):
|
||||||
if offset < 0 or offset > 255:
|
if offset < 0 or offset > 255:
|
||||||
raise ValueError("Invalid offset: %d" % offset)
|
raise ValueError("Invalid offset: %d" % offset)
|
||||||
@ -137,6 +179,8 @@ class SetContent(Opcode):
|
|||||||
COMMAND = OpcodeCommand.SET_CONTENT
|
COMMAND = OpcodeCommand.SET_CONTENT
|
||||||
_CYCLES = 15
|
_CYCLES = 15
|
||||||
|
|
||||||
|
_RELATIVE_BRANCH = True
|
||||||
|
|
||||||
def __init__(self, content: int):
|
def __init__(self, content: int):
|
||||||
self.content = content
|
self.content = content
|
||||||
|
|
||||||
@ -159,6 +203,8 @@ class SetPage(Opcode):
|
|||||||
COMMAND = OpcodeCommand.SET_PAGE
|
COMMAND = OpcodeCommand.SET_PAGE
|
||||||
_CYCLES = 23
|
_CYCLES = 23
|
||||||
|
|
||||||
|
_RELATIVE_BRANCH = True
|
||||||
|
|
||||||
def __init__(self, page: int):
|
def __init__(self, page: int):
|
||||||
self.page = page
|
self.page = page
|
||||||
|
|
||||||
@ -181,6 +227,8 @@ class RLE(Opcode):
|
|||||||
COMMAND = OpcodeCommand.RLE
|
COMMAND = OpcodeCommand.RLE
|
||||||
_CYCLES = 22
|
_CYCLES = 22
|
||||||
|
|
||||||
|
_RELATIVE_BRANCH = True
|
||||||
|
|
||||||
def __init__(self, start_offset: int, run_length: int):
|
def __init__(self, start_offset: int, run_length: int):
|
||||||
self.start_offset = start_offset
|
self.start_offset = start_offset
|
||||||
self.run_length = run_length
|
self.run_length = run_length
|
||||||
@ -214,6 +262,8 @@ class RLE(Opcode):
|
|||||||
class Tick(Opcode):
|
class Tick(Opcode):
|
||||||
COMMAND = OpcodeCommand.TICK
|
COMMAND = OpcodeCommand.TICK
|
||||||
|
|
||||||
|
_RELATIVE_BRANCH = True
|
||||||
|
|
||||||
def __init__(self, cycles: int):
|
def __init__(self, cycles: int):
|
||||||
self._START -= (cycles - 15) // 2
|
self._START -= (cycles - 15) // 2
|
||||||
self._cycles = cycles
|
self._cycles = cycles
|
||||||
@ -249,12 +299,156 @@ class Ack(Opcode):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
class BaseTick(Opcode):
|
||||||
|
_CYCLES = 73
|
||||||
|
|
||||||
|
def __data_eq__(self, other):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def emit_data(self):
|
||||||
|
yield 0xff # content
|
||||||
|
yield 0x00 # offset 1
|
||||||
|
yield 0x00 # offset 1
|
||||||
|
yield 0x00 # offset 1
|
||||||
|
yield 0x00 # offset 1
|
||||||
|
|
||||||
|
|
||||||
|
class Tick4(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_4
|
||||||
|
|
||||||
|
|
||||||
|
class Tick6(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_6
|
||||||
|
|
||||||
|
|
||||||
|
class Tick8(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_8
|
||||||
|
|
||||||
|
|
||||||
|
class Tick10(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_10
|
||||||
|
|
||||||
|
|
||||||
|
class Tick12(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_12
|
||||||
|
|
||||||
|
|
||||||
|
class Tick14(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_14
|
||||||
|
|
||||||
|
|
||||||
|
class Tick16(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_16
|
||||||
|
|
||||||
|
|
||||||
|
class Tick18(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_18
|
||||||
|
|
||||||
|
|
||||||
|
class Tick20(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_20
|
||||||
|
|
||||||
|
|
||||||
|
class Tick22(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_22
|
||||||
|
|
||||||
|
|
||||||
|
class Tick24(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_24
|
||||||
|
|
||||||
|
|
||||||
|
class Tick26(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_26
|
||||||
|
|
||||||
|
|
||||||
|
class Tick28(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_28
|
||||||
|
|
||||||
|
|
||||||
|
class Tick30(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_30
|
||||||
|
|
||||||
|
|
||||||
|
class Tick32(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_32
|
||||||
|
|
||||||
|
|
||||||
|
class Tick34(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_34
|
||||||
|
|
||||||
|
|
||||||
|
class Tick36(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_36
|
||||||
|
|
||||||
|
|
||||||
|
class Tick38(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_38
|
||||||
|
|
||||||
|
|
||||||
|
class Tick40(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_40
|
||||||
|
|
||||||
|
|
||||||
|
class Tick42(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_42
|
||||||
|
|
||||||
|
|
||||||
|
class Tick44(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_44
|
||||||
|
|
||||||
|
|
||||||
|
class Tick46(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_46
|
||||||
|
|
||||||
|
|
||||||
|
class Tick48(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_48
|
||||||
|
|
||||||
|
|
||||||
|
class Tick50(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_50
|
||||||
|
|
||||||
|
|
||||||
|
class Tick52(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_52
|
||||||
|
|
||||||
|
|
||||||
|
class Tick54(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_54
|
||||||
|
|
||||||
|
|
||||||
|
class Tick56(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_56
|
||||||
|
|
||||||
|
|
||||||
|
class Tick58(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_58
|
||||||
|
|
||||||
|
|
||||||
|
class Tick60(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_60
|
||||||
|
|
||||||
|
|
||||||
|
class Tick62(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_62
|
||||||
|
|
||||||
|
|
||||||
|
class Tick64(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_64
|
||||||
|
|
||||||
|
|
||||||
|
class Tick66(BaseTick):
|
||||||
|
COMMAND = OpcodeCommand.TICK_66
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _ParseSymbolTable():
|
def _ParseSymbolTable():
|
||||||
"""Read symbol table from video player debug file."""
|
"""Read symbol table from video player debug file."""
|
||||||
|
|
||||||
opcode_data = {}
|
opcode_data = {}
|
||||||
for name, data in symbol_table.SymbolTable(
|
for name, data in symbol_table.SymbolTable(
|
||||||
"ethernet/ethernet/ethernet.dbg").parse().items():
|
"audiotest/audiotest/audiotest.dbg").parse().items():
|
||||||
if name.startswith("\"op_"):
|
if name.startswith("\"op_"):
|
||||||
op_name = name[4:-1]
|
op_name = name[4:-1]
|
||||||
start_addr = int(data["val"], 16)
|
start_addr = int(data["val"], 16)
|
||||||
@ -290,14 +484,46 @@ def _FillOpcodeAddresses():
|
|||||||
|
|
||||||
_OPCODE_ADDRS = _ParseSymbolTable()
|
_OPCODE_ADDRS = _ParseSymbolTable()
|
||||||
_OPCODE_CLASSES = {
|
_OPCODE_CLASSES = {
|
||||||
OpcodeCommand.STORE: Store,
|
# OpcodeCommand.STORE: Store,
|
||||||
OpcodeCommand.SET_CONTENT: SetContent,
|
# OpcodeCommand.SET_CONTENT: SetContent,
|
||||||
OpcodeCommand.SET_PAGE: SetPage,
|
# OpcodeCommand.SET_PAGE: SetPage,
|
||||||
OpcodeCommand.RLE: RLE,
|
# OpcodeCommand.RLE: RLE,
|
||||||
OpcodeCommand.TICK: Tick,
|
# OpcodeCommand.TICK: Tick,
|
||||||
OpcodeCommand.TERMINATE: Terminate,
|
# OpcodeCommand.TERMINATE: Terminate,
|
||||||
OpcodeCommand.NOP: Nop,
|
OpcodeCommand.NOP: Nop,
|
||||||
OpcodeCommand.ACK: Ack,
|
OpcodeCommand.ACK: Ack,
|
||||||
|
OpcodeCommand.TICK_4: Tick4,
|
||||||
|
OpcodeCommand.TICK_6: Tick6,
|
||||||
|
OpcodeCommand.TICK_8: Tick8,
|
||||||
|
OpcodeCommand.TICK_10: Tick10,
|
||||||
|
OpcodeCommand.TICK_12: Tick12,
|
||||||
|
OpcodeCommand.TICK_14: Tick14,
|
||||||
|
OpcodeCommand.TICK_16: Tick16,
|
||||||
|
OpcodeCommand.TICK_18: Tick18,
|
||||||
|
OpcodeCommand.TICK_20: Tick20,
|
||||||
|
OpcodeCommand.TICK_22: Tick22,
|
||||||
|
OpcodeCommand.TICK_24: Tick24,
|
||||||
|
OpcodeCommand.TICK_26: Tick26,
|
||||||
|
OpcodeCommand.TICK_28: Tick28,
|
||||||
|
OpcodeCommand.TICK_30: Tick30,
|
||||||
|
OpcodeCommand.TICK_32: Tick32,
|
||||||
|
OpcodeCommand.TICK_34: Tick34,
|
||||||
|
OpcodeCommand.TICK_36: Tick36,
|
||||||
|
OpcodeCommand.TICK_38: Tick38,
|
||||||
|
OpcodeCommand.TICK_40: Tick40,
|
||||||
|
OpcodeCommand.TICK_42: Tick42,
|
||||||
|
OpcodeCommand.TICK_44: Tick44,
|
||||||
|
OpcodeCommand.TICK_46: Tick46,
|
||||||
|
OpcodeCommand.TICK_48: Tick48,
|
||||||
|
OpcodeCommand.TICK_50: Tick50,
|
||||||
|
OpcodeCommand.TICK_52: Tick52,
|
||||||
|
OpcodeCommand.TICK_54: Tick54,
|
||||||
|
OpcodeCommand.TICK_56: Tick56,
|
||||||
|
OpcodeCommand.TICK_58: Tick58,
|
||||||
|
OpcodeCommand.TICK_60: Tick60,
|
||||||
|
OpcodeCommand.TICK_62: Tick62,
|
||||||
|
OpcodeCommand.TICK_64: Tick64,
|
||||||
|
OpcodeCommand.TICK_66: Tick66,
|
||||||
}
|
}
|
||||||
_FillOpcodeAddresses()
|
_FillOpcodeAddresses()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user