ytd_12-bit_computer/pytd12dk/emulator/main.py

70 lines
2.2 KiB
Python

# Kyler Olsen
# Feb 2024
from typing import Sequence
import argparse
from .emulator import Computer, Memory
from .devices import tty
MACHINES = {
'tty': lambda rom: Computer(Memory(rom, [tty(0x7FD, 0x7FF)]))
}
def emulate(args: argparse.Namespace):
from time import sleep
computer = MACHINES[args.machine](Memory.load_rom_file(args.rom_file))
try:
while computer.active:
if args.verbose:
print(
f"ZR: {hex(0)} \t"
f"PC: {hex(computer.program_counter)} \t"
f"SP: {hex(computer.stack_pointer)} \t"
f"MP: {hex(computer.pointer)}"
)
print(
f"D0: {hex(computer.data_0)} \t"
f"D1: {hex(computer.data_1)} \t"
f"D2: {hex(computer.data_2)} \t"
f"D3: {hex(computer.data_3)}"
)
if args.step:
input("Press enter to step to next instruction...")
computer.step(args.verbose)
if not args.step:
sleep(int(args.clock)/1000)
except KeyboardInterrupt:
print("Keyboard Interrupt: Program Exiting...")
def parser(parser: argparse.ArgumentParser):
parser.add_argument('rom_file', type=argparse.FileType('rb'))
parser.add_argument(
'-m', '--machine', choices=MACHINES.keys(), default='tty')
parser.add_argument('-v', '--verbose', action='store_true')
parser.add_argument('-s', '--step', action='store_true')
parser.add_argument('-c', '--clock', default='100')
parser.set_defaults(func=emulate)
def main(argv: Sequence[str] | None = None):
parser = argparse.ArgumentParser(
description='ytd 12-bit Computer Emulator',
epilog='https://github.com/KylerOlsen/ytd_12-bit_computer',
)
parser.add_argument('rom_file', type=argparse.FileType('rb'))
parser.add_argument(
'-m', '--machine', choices=MACHINES.keys(), default='tty')
parser.add_argument('-v', '--verbose', action='store_true')
parser.add_argument('-s', '--step', action='store_true')
parser.add_argument('-c', '--clock', default='100')
args = parser.parse_args(argv)
args.func(args)
if __name__ == '__main__':
main()