70 lines
2.2 KiB
Python
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()
|