More Reorganization
This commit is contained in:
parent
16ebe02c56
commit
2b9d5cc21c
|
@ -1,7 +1,7 @@
|
||||||
# Kyler Olsen
|
# Kyler Olsen
|
||||||
# Feb 2024
|
# Feb 2024
|
||||||
|
|
||||||
from . import emulator, assembler, compiler
|
from . import assembler, emulator, compiler
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'emulator',
|
'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:
|
else:
|
||||||
raise AssemblerError(
|
raise AssemblerError(
|
||||||
f"Invalid number of arguments on line {line_number}: {args[0]}")
|
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
|
# Kyler Olsen
|
||||||
# Feb 2024
|
# 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__':
|
if __name__ == '__main__':
|
||||||
|
from .main import main
|
||||||
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