tc-ucode-generator/decoder_generator.py

87 lines
2.9 KiB
Python

import enum
import sys
import re
import pprint
from z80shortcuts import *
from quadrants.mq0 import instructions as instructions_main_0
from quadrants.mq1 import instructions as instructions_main_1
from quadrants.mq2 import instructions as instructions_main_2
from quadrants.mq3 import instructions as instructions_main_3
from quadrants.cb import instructions as instructions_cb
from quadrants.ed import instructions as instructions_ed
instructions = [None] * 256
# ========== Main Quadrant 0
for i, x in enumerate(instructions_main_0):
if x == None: continue
instructions[i] = x
# ========== Main Quadrant 1
for i, x in enumerate(instructions_main_1):
if x == None: continue
instructions[i] = x
# ========== Main Quadrant 2
for i, x in enumerate(instructions_main_2):
if x == None: continue
instructions[i] = x
# ======== Main Quadrant 3
for i, x in enumerate(instructions_main_3):
if x == None: continue
instructions[i] = x
# =====================================
if __name__ == "__main__":
if len(sys.argv) < 2: exit()
if sys.argv[1] == "-l":
ins_set = instructions
if len(sys.argv) >= 3 and sys.argv[2] == "CB":
ins_set = instructions_cb
if len(sys.argv) >= 3 and sys.argv[2] == "ED":
ins_set = instructions_ed
for i, x in enumerate(ins_set):
if x == None: continue
print(f"0x{i:02X}", x['name'])
if len(x['subins']) > 0:
if len(x['subins']) > 32: print("TOO BIG")
for y in x['subins']:
print(end="")
#print(f"0b{y:064b}", y, f"0x{y:016X}")
elif sys.argv[1] == "-g":
ins_set = instructions
filename = "decoderout_main.rom"
if len(sys.argv) >= 3 and sys.argv[2] == "CB":
ins_set = instructions_cb
filename = "decoderout_CB.rom"
if len(sys.argv) >= 3 and sys.argv[2] == "ED":
ins_set = instructions_ed
filename = "decoderout_ED.rom"
instruction_subins_in_printable_order = [b'\x00'] *256 *32 *8
for x, instruction in enumerate(ins_set):
if instruction == None: continue
subins_template_list = [b'\x00'] *8 *32
for i, subin in enumerate(instruction['subins']):
subin_bytes_hex = re.findall(r'..', f"{subin:016X}")
subin_bytes_hex.reverse()
for j, by in enumerate(subin_bytes_hex):
subins_template_list[i*8+j] = bytes.fromhex(by)
for i, by in enumerate(subins_template_list):
#print(by)
instruction_subins_in_printable_order[(x*8*32)+i] = by
#print(instruction_subins_in_printable_order)
with open(filename, 'wb+') as out_file:
for x in instruction_subins_in_printable_order:
out_file.write(x)