1
0
mirror of https://github.com/catseye/SixtyPical.git synced 2024-11-25 07:32:16 +00:00

cmp can compare against a literal word.

This commit is contained in:
Chris Pressey 2018-12-12 09:01:46 +00:00
parent d86612acce
commit 97e6e619ff
4 changed files with 45 additions and 6 deletions

View File

@ -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

View File

@ -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,

View File

@ -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`.

View File

@ -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`.