1
0
mirror of https://github.com/catseye/SixtyPical.git synced 2024-11-25 23:49:17 +00:00

Break the ground where we need to implement word table read/write.

This commit is contained in:
Chris Pressey 2017-12-08 15:53:18 +00:00
parent aa5e4119da
commit 84ca6c4e96
5 changed files with 48 additions and 6 deletions

View File

@ -6,6 +6,7 @@ History of SixtyPical
* Add word (constant or memory location) to word memory location.
* Add word to pointer (unchecked for now).
* Adding `word table` type (in progress).
* Implementation: `--debug` shows some extra info during analysis.
* Fixed bug where `copy`ing literal word into word storage used wrong endianness.

View File

@ -47,7 +47,7 @@ Compare word (constant or memory location) with memory location or pointer. (Ma
And then write a little demo "game" where you can move a block around the screen with
the joystick.
### `word table` and `vector table` types
### `vector table` type
### `low` and `high` address operators
@ -55,7 +55,7 @@ To turn `word` type into `byte`.
### save registers on stack
This preserves them, so semantically, they can be used even though they
This preserves them, so that, semantically, they can be used later even though they
are trashed inside the block.
### And at some point...

13
eg/word-table.60p Normal file
View File

@ -0,0 +1,13 @@
word one
word table many
routine main
inputs one, many
outputs one, many
trashes a, x, n, z
{
ld x, 0
copy 777, one
copy one, many + x
copy many + x, one
}

View File

@ -2,8 +2,8 @@
from sixtypical.ast import Program, Routine, Block, Instr
from sixtypical.model import (
ConstantRef, LocationRef, IndirectRef, AddressRef,
TYPE_BIT, TYPE_BYTE, TYPE_WORD, BufferType, PointerType, RoutineType, VectorType,
ConstantRef, LocationRef, IndexedRef, IndirectRef, AddressRef,
TYPE_BIT, TYPE_BYTE, TYPE_WORD, TYPE_WORD_TABLE, BufferType, PointerType, RoutineType, VectorType,
REG_A, REG_X, REG_Y, FLAG_C
)
from sixtypical.emitter import Byte, Label, Offset, LowAddressByte, HighAddressByte
@ -169,7 +169,7 @@ class Compiler(object):
raise UnsupportedOpcodeError(instr)
elif isinstance(dest, LocationRef) and src.type == TYPE_WORD and isinstance(dest.type, PointerType):
if isinstance(src, ConstantRef):
dest_label = self.labels[dest.name] # this. is. zero-page.
dest_label = self.labels[dest.name]
self.emitter.emit(LDA(ZeroPage(dest_label)))
self.emitter.emit(ADC(Immediate(Byte(src.low_byte()))))
self.emitter.emit(STA(ZeroPage(dest_label)))
@ -178,7 +178,7 @@ class Compiler(object):
self.emitter.emit(STA(ZeroPage(Offset(dest_label, 1))))
elif isinstance(src, LocationRef):
src_label = self.labels[src.name]
dest_label = self.labels[dest.name] # this. is. zero-page.
dest_label = self.labels[dest.name]
self.emitter.emit(LDA(ZeroPage(dest_label)))
self.emitter.emit(ADC(Absolute(src_label)))
self.emitter.emit(STA(ZeroPage(dest_label)))
@ -345,6 +345,17 @@ class Compiler(object):
self.emitter.emit(STA(ZeroPage(dest_label)))
self.emitter.emit(LDA(Immediate(LowAddressByte(src_label))))
self.emitter.emit(STA(ZeroPage(Offset(dest_label, 1))))
elif isinstance(src, LocationRef) and isinstance(dest, IndexedRef):
if src.type == TYPE_WORD and dest.ref.type == TYPE_WORD_TABLE:
src_label = self.labels[src.name]
dest_label = self.labels[dest.ref.name]
raise NotImplementedError("""\
What we will need to do here, is to have TWO 'labels' per name, one for the high byte table,
and one for the low byte table. Then select AbsoluteX() or AbsoluteY() addressing on those
tables. And use that in the STA() part.""")
else:
raise NotImplementedError
elif not isinstance(src, (ConstantRef, LocationRef)) or not isinstance(dest, LocationRef):
raise NotImplementedError((src, dest))
elif src.type == TYPE_BYTE and dest.type == TYPE_BYTE:

View File

@ -316,6 +316,23 @@ Copy routine to vector, inside an `interrupts off` block.
| }
= 00c078a90d8d0fc0a9c08d10c05860e860
Copy word to word table and back.
| word one
| word table many
|
| routine main
| inputs one, many
| outputs one, many
| trashes a, x, n, z
| {
| ld x, 0
| copy 777, one
| copy one, many + x
| copy many + x, one
| }
= 00c0a200a9009d0dc0bd0dc060....
Indirect call.
| vector foo outputs x trashes z, n