diff --git a/HISTORY.md b/HISTORY.md index 24db63e..4ebbea9 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -10,7 +10,8 @@ History of SixtyPical * When the range of a location is known, `inc` and `dec` on it will usually shift the known instead of invalidating it. * `cmp` instruction can now perform a 16-bit unsigned comparison - of `word` memory locations (at the cost of trashing `a`.) + of `word` memory locations and `word` literals (at the cost of + trashing the `a` register.) * Fixed pathological memory use in the lexical scanner - should be much less inefficient now when parsing large source files. * Reorganized the examples in `eg/rudiments/` to make them diff --git a/src/sixtypical/compiler.py b/src/sixtypical/compiler.py index a2b983d..2675b54 100644 --- a/src/sixtypical/compiler.py +++ b/src/sixtypical/compiler.py @@ -402,6 +402,16 @@ class Compiler(object): self.emitter.emit(CMP(Absolute(Offset(src_label, 1)))) self.emitter.resolve_label(end_label) return + if isinstance(src, ConstantRef) and src.type == TYPE_WORD: + dest_label = self.get_label(dest.name) + self.emitter.emit(LDA(Absolute(dest_label))) + self.emitter.emit(CMP(Immediate(Byte(src.high_byte())))) + end_label = Label('end_label') + self.emitter.emit(BNE(Relative(end_label))) + self.emitter.emit(LDA(Absolute(Offset(dest_label, 1)))) + self.emitter.emit(CMP(Immediate(Byte(src.low_byte())))) + self.emitter.resolve_label(end_label) + return cls = { 'a': CMP, 'x': CPX, diff --git a/tests/SixtyPical Analysis.md b/tests/SixtyPical Analysis.md index 0331e7e..23baa18 100644 --- a/tests/SixtyPical Analysis.md +++ b/tests/SixtyPical Analysis.md @@ -1207,6 +1207,28 @@ Some rudimentary tests for `cmp`. | } ? UnmeaningfulReadError: zb +`cmp` can compare against a literal word. + + | word za + | + | define main routine + | inputs za + | trashes a, z, c, n + | { + | cmp za, 4000 + | } + = ok + + | word za + | + | define main routine + | inputs za + | trashes z, c, n + | { + | cmp za, 4000 + | } + ? ForbiddenWriteError: a + ### and ### Some rudimentary tests for `and`. diff --git a/tests/SixtyPical Compilation.md b/tests/SixtyPical Compilation.md index d61ef30..87e427a 100644 --- a/tests/SixtyPical Compilation.md +++ b/tests/SixtyPical Compilation.md @@ -395,15 +395,21 @@ Compiling 16-bit `cmp`. | trashes a, z, c, n | { | cmp za, zb + | cmp za, 4000 | } = $080D LDA $EA61 - = $0810 CMP $081C + = $0810 CMP $0828 = $0813 BNE $081B = $0815 LDA $EA62 - = $0818 CMP $081D - = $081B RTS - = $081C .byte $BB - = $081D .byte $0B + = $0818 CMP $0829 + = $081B LDA $EA61 + = $081E CMP #$0F + = $0820 BNE $0827 + = $0822 LDA $EA62 + = $0825 CMP #$A0 + = $0827 RTS + = $0828 .byte $BB + = $0829 .byte $0B Compiling `if`.