More Reorganization

This commit is contained in:
Kyler 2024-02-25 20:48:49 -07:00
parent 16ebe02c56
commit 2b9d5cc21c
13 changed files with 210 additions and 89 deletions

View File

@ -1,7 +1,7 @@
# Kyler Olsen
# Feb 2024
from . import emulator, assembler, compiler
from . import assembler, emulator, compiler
__all__ = [
'emulator',

6
pytd12dk/__main__.py Normal file
View File

@ -0,0 +1,6 @@
# Kyler Olsen
# Feb 2024
if __name__ == '__main__':
from .main import main
main()

View File

@ -0,0 +1,8 @@
# Kyler Olsen
# Feb 2024
from .assembler import Program
__all__ = [
'Program',
]

View File

@ -0,0 +1,6 @@
# Kyler Olsen
# Feb 2024
if __name__ == '__main__':
from .main import main
main()

View File

@ -420,41 +420,3 @@ def immediate(line: str, line_number: int) -> Instruction | Immediate:
else:
raise AssemblerError(
f"Invalid number of arguments on line {line_number}: {args[0]}")
def main(argv: Sequence[str] | None = None):
import argparse
parser = argparse.ArgumentParser(
description='ytd 12-bit Computer Linker and Assembler',
)
parser.add_argument('input_file', type=argparse.FileType('r'))
parser.add_argument('-o', '--output_file', type=argparse.FileType('wb'))
parser.add_argument('-l', '--labels_file', type=argparse.FileType('w'))
parser.add_argument('-x', '--hex_file', type=argparse.FileType('w'))
args = parser.parse_args(argv)
program = Program(args.input_file.read())
try: assert len(bytes(program)) <= INSTRUCTIONS_COUNT * 1.5
except AssertionError:
print(
hex(int(len(bytes(program)) / 1.5)),
'>',
hex(INSTRUCTIONS_COUNT),
':',
hex(int(len(bytes(program)) / 1.5) - INSTRUCTIONS_COUNT),
)
raise
if args.output_file:
args.output_file.write(bytes(program))
if args.labels_file:
for label, location in program.labels().items():
args.labels_file.write(f"{hex(location)}, {label}\n")
if args.hex_file:
args.hex_file.write(program.hex_str())
if __name__ == '__main__':
main()

View File

@ -0,0 +1,51 @@
# Kyler Olsen
# Feb 2024
from typing import Sequence
import argparse
from .assembler import Program, INSTRUCTIONS_COUNT
def assemble(args: argparse.Namespace):
program = Program(args.input_file.read())
try: assert len(bytes(program)) <= INSTRUCTIONS_COUNT * 1.5
except AssertionError:
print(
hex(int(len(bytes(program)) / 1.5)),
'>',
hex(INSTRUCTIONS_COUNT),
':',
hex(int(len(bytes(program)) / 1.5) - INSTRUCTIONS_COUNT),
)
raise
if args.output_file:
args.output_file.write(bytes(program))
if args.labels_file:
for label, location in program.labels().items():
args.labels_file.write(f"{hex(location)}, {label}\n")
if args.hex_file:
args.hex_file.write(program.hex_str())
def parser(parser: argparse.ArgumentParser):
parser.add_argument('input_file', type=argparse.FileType('r'))
parser.add_argument('-o', '--output_file', type=argparse.FileType('wb'))
parser.add_argument('-l', '--labels_file', type=argparse.FileType('w'))
parser.add_argument('-x', '--hex_file', type=argparse.FileType('w'))
parser.set_defaults(func=assemble)
def main(argv: Sequence[str] | None = None):
parser = argparse.ArgumentParser(
description='ytd 12-bit Computer Linker and Assembler',
)
args = parser.parse_args(argv)
args.func(args)
if __name__ == '__main__':
main()

View File

@ -0,0 +1,8 @@
# Kyler Olsen
# Feb 2024
from . import compiler
__all__ = [
'compiler',
]

View File

@ -0,0 +1,6 @@
# Kyler Olsen
# Feb 2024
if __name__ == '__main__':
from .main import main
main()

23
pytd12dk/compiler/main.py Normal file
View File

@ -0,0 +1,23 @@
# Kyler Olsen
# Feb 2024
from typing import Sequence
import argparse
def compile(args: argparse.Namespace):
pass
def parser(parser: argparse.ArgumentParser):
parser.set_defaults(func=compile)
def main(argv: Sequence[str] | None = None):
parser = argparse.ArgumentParser(
description='ytd 12-bit Computer Compiler',
)
args = parser.parse_args(argv)
args.func(args)
if __name__ == '__main__':
main()

View File

@ -1,55 +1,6 @@
# Kyler Olsen
# Feb 2024
from typing import Sequence
from .emulator import Computer, Memory
from .devices import tty
def main(argv: Sequence[str] | None = None):
import argparse
from time import sleep
machines = {
'tty': lambda rom: Computer(Memory(rom, [tty(0x7FD, 0x7FF)]))
}
parser = argparse.ArgumentParser(
description='ytd 12-bit Computer Emulator',
)
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)
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...")
if __name__ == '__main__':
from .main import main
main()

68
pytd12dk/emulator/main.py Normal file
View File

@ -0,0 +1,68 @@
# 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',
)
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()

32
pytd12dk/main.py Normal file
View File

@ -0,0 +1,32 @@
# Kyler Olsen
# Feb 2024
from typing import Sequence
import argparse
from .emulator.main import parser as emulator_parser
from .compiler.main import parser as compiler_parser
from .assembler.main import parser as assembler_parser
def main(argv: Sequence[str] | None = None):
parser = argparse.ArgumentParser(
description='ytd 12-bit Development Kit',
)
subparsers = parser.add_subparsers()
parser_emulator = subparsers.add_parser('em', help='Emulator help')
emulator_parser(parser_emulator)
parser_compiler = subparsers.add_parser('cm', help='Compiler help')
compiler_parser(parser_compiler)
parser_assembler = subparsers.add_parser('am', help='Assembler help')
assembler_parser(parser_assembler)
args = parser.parse_args(argv)
args.func(args)
if __name__ == '__main__':
main()