More Reorganization
This commit is contained in:
parent
16ebe02c56
commit
2b9d5cc21c
|
@ -1,7 +1,7 @@
|
|||
# Kyler Olsen
|
||||
# Feb 2024
|
||||
|
||||
from . import emulator, assembler, compiler
|
||||
from . import assembler, emulator, compiler
|
||||
|
||||
__all__ = [
|
||||
'emulator',
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
# Kyler Olsen
|
||||
# Feb 2024
|
||||
|
||||
if __name__ == '__main__':
|
||||
from .main import main
|
||||
main()
|
|
@ -0,0 +1,8 @@
|
|||
# Kyler Olsen
|
||||
# Feb 2024
|
||||
|
||||
from .assembler import Program
|
||||
|
||||
__all__ = [
|
||||
'Program',
|
||||
]
|
|
@ -0,0 +1,6 @@
|
|||
# Kyler Olsen
|
||||
# Feb 2024
|
||||
|
||||
if __name__ == '__main__':
|
||||
from .main import main
|
||||
main()
|
|
@ -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()
|
|
@ -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()
|
|
@ -0,0 +1,8 @@
|
|||
# Kyler Olsen
|
||||
# Feb 2024
|
||||
|
||||
from . import compiler
|
||||
|
||||
__all__ = [
|
||||
'compiler',
|
||||
]
|
|
@ -0,0 +1,6 @@
|
|||
# Kyler Olsen
|
||||
# Feb 2024
|
||||
|
||||
if __name__ == '__main__':
|
||||
from .main import main
|
||||
main()
|
|
@ -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()
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
|
@ -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()
|
Loading…
Reference in New Issue