From f87bcf5ee46d395d200a38ccc15f2df602d355b8 Mon Sep 17 00:00:00 2001 From: Chris Pressey Date: Tue, 12 Dec 2017 16:41:49 +0000 Subject: [PATCH] Initial work on initialized byte tables. --- src/sixtypical/compiler.py | 4 +- src/sixtypical/emitter.py | 11 +- src/sixtypical/parser.py | 7 +- tests/SixtyPical Compilation.md | 270 ++++++++++++++++++++++++++++++++ tests/SixtyPical Syntax.md | 16 ++ 5 files changed, 304 insertions(+), 4 deletions(-) diff --git a/src/sixtypical/compiler.py b/src/sixtypical/compiler.py index 8a6feed..6032ed3 100644 --- a/src/sixtypical/compiler.py +++ b/src/sixtypical/compiler.py @@ -6,7 +6,7 @@ from sixtypical.model import ( TYPE_BIT, TYPE_BYTE, TYPE_BYTE_TABLE, TYPE_WORD, TYPE_WORD_TABLE, BufferType, PointerType, RoutineType, VectorType, REG_A, REG_X, REG_Y, FLAG_C ) -from sixtypical.emitter import Byte, Word, Label, Offset, LowAddressByte, HighAddressByte +from sixtypical.emitter import Byte, Word, Table, Label, Offset, LowAddressByte, HighAddressByte from sixtypical.gen6502 import ( Immediate, Absolute, AbsoluteX, AbsoluteY, ZeroPage, Indirect, IndirectY, Relative, LDA, LDX, LDY, STA, STX, STY, @@ -78,6 +78,8 @@ class Compiler(object): initial_data = Byte(defn.initial) elif type_ == TYPE_WORD: initial_data = Word(defn.initial) + elif type_ == TYPE_BYTE_TABLE: + initial_data = Table(defn.initial) else: raise NotImplementedError(type_) label.set_length(initial_data.size()) diff --git a/src/sixtypical/emitter.py b/src/sixtypical/emitter.py index ffa899c..112a37b 100644 --- a/src/sixtypical/emitter.py +++ b/src/sixtypical/emitter.py @@ -48,11 +48,20 @@ class Word(Emittable): class Table(Emittable): + def __init__(self, value): + # TODO: range-checking + self.value = value + def size(self): return 256 def serialize(self, addr=None): - return chr(0) * self.size() + bytes = [] + for b in self.value: + bytes.append(chr(ord(b))) + while len(bytes) < self.size(): + bytes.append(chr(0)) + return ''.join(bytes) def __repr__(self): return "%s()" % (self.__class__.__name__) diff --git a/src/sixtypical/parser.py b/src/sixtypical/parser.py index 46468bf..58f81db 100644 --- a/src/sixtypical/parser.py +++ b/src/sixtypical/parser.py @@ -89,8 +89,11 @@ class Parser(object): initial = None if self.scanner.consume(':'): - self.scanner.check_type('integer literal') - initial = int(self.scanner.token) + if type_ == TYPE_BYTE_TABLE and self.scanner.on_type('string literal'): + initial = self.scanner.token + else: + self.scanner.check_type('integer literal') + initial = int(self.scanner.token) self.scanner.scan() addr = None diff --git a/tests/SixtyPical Compilation.md b/tests/SixtyPical Compilation.md index cc80189..3284931 100644 --- a/tests/SixtyPical Compilation.md +++ b/tests/SixtyPical Compilation.md @@ -137,6 +137,276 @@ Word memory locations with explicit address, initial value. = $081A .byte $BB = $081B .byte $0B +Initialized byte table. + + | byte table message : "WHAT?" + | + | routine main + | inputs message + | outputs x, a, z, n + | { + | ld x, 0 + | ld a, message + x + | } + = $080D LDX #$00 + = $080F LDA $0813,X + = $0812 RTS + = $0813 .byte $57 + = $0814 PHA + = $0815 EOR ($54,X) + = $0817 .byte $3F + = $0818 BRK + = $0819 BRK + = $081A BRK + = $081B BRK + = $081C BRK + = $081D BRK + = $081E BRK + = $081F BRK + = $0820 BRK + = $0821 BRK + = $0822 BRK + = $0823 BRK + = $0824 BRK + = $0825 BRK + = $0826 BRK + = $0827 BRK + = $0828 BRK + = $0829 BRK + = $082A BRK + = $082B BRK + = $082C BRK + = $082D BRK + = $082E BRK + = $082F BRK + = $0830 BRK + = $0831 BRK + = $0832 BRK + = $0833 BRK + = $0834 BRK + = $0835 BRK + = $0836 BRK + = $0837 BRK + = $0838 BRK + = $0839 BRK + = $083A BRK + = $083B BRK + = $083C BRK + = $083D BRK + = $083E BRK + = $083F BRK + = $0840 BRK + = $0841 BRK + = $0842 BRK + = $0843 BRK + = $0844 BRK + = $0845 BRK + = $0846 BRK + = $0847 BRK + = $0848 BRK + = $0849 BRK + = $084A BRK + = $084B BRK + = $084C BRK + = $084D BRK + = $084E BRK + = $084F BRK + = $0850 BRK + = $0851 BRK + = $0852 BRK + = $0853 BRK + = $0854 BRK + = $0855 BRK + = $0856 BRK + = $0857 BRK + = $0858 BRK + = $0859 BRK + = $085A BRK + = $085B BRK + = $085C BRK + = $085D BRK + = $085E BRK + = $085F BRK + = $0860 BRK + = $0861 BRK + = $0862 BRK + = $0863 BRK + = $0864 BRK + = $0865 BRK + = $0866 BRK + = $0867 BRK + = $0868 BRK + = $0869 BRK + = $086A BRK + = $086B BRK + = $086C BRK + = $086D BRK + = $086E BRK + = $086F BRK + = $0870 BRK + = $0871 BRK + = $0872 BRK + = $0873 BRK + = $0874 BRK + = $0875 BRK + = $0876 BRK + = $0877 BRK + = $0878 BRK + = $0879 BRK + = $087A BRK + = $087B BRK + = $087C BRK + = $087D BRK + = $087E BRK + = $087F BRK + = $0880 BRK + = $0881 BRK + = $0882 BRK + = $0883 BRK + = $0884 BRK + = $0885 BRK + = $0886 BRK + = $0887 BRK + = $0888 BRK + = $0889 BRK + = $088A BRK + = $088B BRK + = $088C BRK + = $088D BRK + = $088E BRK + = $088F BRK + = $0890 BRK + = $0891 BRK + = $0892 BRK + = $0893 BRK + = $0894 BRK + = $0895 BRK + = $0896 BRK + = $0897 BRK + = $0898 BRK + = $0899 BRK + = $089A BRK + = $089B BRK + = $089C BRK + = $089D BRK + = $089E BRK + = $089F BRK + = $08A0 BRK + = $08A1 BRK + = $08A2 BRK + = $08A3 BRK + = $08A4 BRK + = $08A5 BRK + = $08A6 BRK + = $08A7 BRK + = $08A8 BRK + = $08A9 BRK + = $08AA BRK + = $08AB BRK + = $08AC BRK + = $08AD BRK + = $08AE BRK + = $08AF BRK + = $08B0 BRK + = $08B1 BRK + = $08B2 BRK + = $08B3 BRK + = $08B4 BRK + = $08B5 BRK + = $08B6 BRK + = $08B7 BRK + = $08B8 BRK + = $08B9 BRK + = $08BA BRK + = $08BB BRK + = $08BC BRK + = $08BD BRK + = $08BE BRK + = $08BF BRK + = $08C0 BRK + = $08C1 BRK + = $08C2 BRK + = $08C3 BRK + = $08C4 BRK + = $08C5 BRK + = $08C6 BRK + = $08C7 BRK + = $08C8 BRK + = $08C9 BRK + = $08CA BRK + = $08CB BRK + = $08CC BRK + = $08CD BRK + = $08CE BRK + = $08CF BRK + = $08D0 BRK + = $08D1 BRK + = $08D2 BRK + = $08D3 BRK + = $08D4 BRK + = $08D5 BRK + = $08D6 BRK + = $08D7 BRK + = $08D8 BRK + = $08D9 BRK + = $08DA BRK + = $08DB BRK + = $08DC BRK + = $08DD BRK + = $08DE BRK + = $08DF BRK + = $08E0 BRK + = $08E1 BRK + = $08E2 BRK + = $08E3 BRK + = $08E4 BRK + = $08E5 BRK + = $08E6 BRK + = $08E7 BRK + = $08E8 BRK + = $08E9 BRK + = $08EA BRK + = $08EB BRK + = $08EC BRK + = $08ED BRK + = $08EE BRK + = $08EF BRK + = $08F0 BRK + = $08F1 BRK + = $08F2 BRK + = $08F3 BRK + = $08F4 BRK + = $08F5 BRK + = $08F6 BRK + = $08F7 BRK + = $08F8 BRK + = $08F9 BRK + = $08FA BRK + = $08FB BRK + = $08FC BRK + = $08FD BRK + = $08FE BRK + = $08FF BRK + = $0900 BRK + = $0901 BRK + = $0902 BRK + = $0903 BRK + = $0904 BRK + = $0905 BRK + = $0906 BRK + = $0907 BRK + = $0908 BRK + = $0909 BRK + = $090A BRK + = $090B BRK + = $090C BRK + = $090D BRK + = $090E BRK + = $090F BRK + = $0910 BRK + = $0911 BRK + = $0912 BRK + Some instructions. | byte foo diff --git a/tests/SixtyPical Syntax.md b/tests/SixtyPical Syntax.md index 544bafa..74a1551 100644 --- a/tests/SixtyPical Syntax.md +++ b/tests/SixtyPical Syntax.md @@ -178,6 +178,22 @@ User-defined locations of other types. | } = ok +Initialized byte table. + + | byte table message : "WHAT DO YOU WANT TO DO NEXT?" + | + | routine main { + | } + = ok + +Can't initialize anything but a byte table with a string. + + | word message : "WHAT DO YOU WANT TO DO NEXT?" + | + | routine main { + | } + ? SyntaxError + Can't access an undeclared memory location. | routine main {