mirror of
https://github.com/catseye/SixtyPical.git
synced 2024-11-29 18:49:22 +00:00
Indexed access, + x / + y, at least for LDA and STA.
--HG-- rename : eg/screen.60p => eg/screen1.60p
This commit is contained in:
parent
5a5953ca4c
commit
a9bd8a3714
@ -1,6 +1,11 @@
|
|||||||
History of SixtyPical
|
History of SixtyPical
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
|
0.5-PRE
|
||||||
|
-------
|
||||||
|
|
||||||
|
* Added `byte table` type locations and indexed addressing (`+ x`, `+ y`).
|
||||||
|
|
||||||
0.4
|
0.4
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -33,23 +33,22 @@ TODO
|
|||||||
|
|
||||||
For 0.5:
|
For 0.5:
|
||||||
|
|
||||||
* `table` type constructor and indirect addressing.
|
* hexadecimal literals.
|
||||||
|
* source code comments.
|
||||||
|
|
||||||
For 0.6:
|
For 0.6:
|
||||||
|
|
||||||
* hexadecimal literals.
|
* `interrupt` routines.
|
||||||
* source code comments.
|
* `vector` type.
|
||||||
|
|
||||||
For 0.7:
|
For 0.7:
|
||||||
|
|
||||||
* `word` type.
|
* `word` type.
|
||||||
|
* `copy` instruction.
|
||||||
|
* `trash` instruction.
|
||||||
|
|
||||||
For 0.8:
|
For 0.8:
|
||||||
|
|
||||||
* `vector` type.
|
|
||||||
|
|
||||||
For 0.9:
|
|
||||||
|
|
||||||
* add line number (or at least routine name) to error messages.
|
* add line number (or at least routine name) to error messages.
|
||||||
* 6502-mnemonic aliases (`sec`, `clc`)
|
* 6502-mnemonic aliases (`sec`, `clc`)
|
||||||
* other handy aliases (`eq` for `z`, etc.)
|
* other handy aliases (`eq` for `z`, etc.)
|
||||||
|
@ -3,6 +3,6 @@ byte screen @ 1024
|
|||||||
routine main
|
routine main
|
||||||
trashes a, z, n, screen
|
trashes a, z, n, screen
|
||||||
{
|
{
|
||||||
ld a, 100
|
ld a, 83
|
||||||
st a, screen
|
st a, screen
|
||||||
}
|
}
|
12
eg/screen2.60p
Normal file
12
eg/screen2.60p
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
byte table screen @ 1024
|
||||||
|
|
||||||
|
routine main
|
||||||
|
trashes a, x, z, n, screen
|
||||||
|
{
|
||||||
|
ld x, 0
|
||||||
|
ld a, 83
|
||||||
|
repeat {
|
||||||
|
st a, screen + x
|
||||||
|
inc x
|
||||||
|
} until z
|
||||||
|
}
|
@ -8,7 +8,7 @@ from sixtypical.model import (
|
|||||||
)
|
)
|
||||||
from sixtypical.emitter import Label, Byte
|
from sixtypical.emitter import Label, Byte
|
||||||
from sixtypical.gen6502 import (
|
from sixtypical.gen6502 import (
|
||||||
Immediate, Absolute, Relative,
|
Immediate, Absolute, AbsoluteX, AbsoluteY, Relative,
|
||||||
LDA, LDX, LDY, STA, STX, STY,
|
LDA, LDX, LDY, STA, STX, STY,
|
||||||
TAX, TAY, TXA, TYA,
|
TAX, TAY, TXA, TYA,
|
||||||
CLC, SEC, ADC, SBC, ROL, ROR,
|
CLC, SEC, ADC, SBC, ROL, ROR,
|
||||||
@ -81,6 +81,10 @@ class Compiler(object):
|
|||||||
self.emitter.emit(TYA())
|
self.emitter.emit(TYA())
|
||||||
elif isinstance(src, ConstantRef):
|
elif isinstance(src, ConstantRef):
|
||||||
self.emitter.emit(LDA(Immediate(Byte(src.value))))
|
self.emitter.emit(LDA(Immediate(Byte(src.value))))
|
||||||
|
elif instr.index == REG_X:
|
||||||
|
self.emitter.emit(LDA(AbsoluteX(self.labels[src.name])))
|
||||||
|
elif instr.index == REG_Y:
|
||||||
|
self.emitter.emit(LDA(AbsoluteY(self.labels[src.name])))
|
||||||
else:
|
else:
|
||||||
self.emitter.emit(LDA(Absolute(self.labels[src.name])))
|
self.emitter.emit(LDA(Absolute(self.labels[src.name])))
|
||||||
elif dest == REG_X:
|
elif dest == REG_X:
|
||||||
@ -88,6 +92,8 @@ class Compiler(object):
|
|||||||
self.emitter.emit(TAX())
|
self.emitter.emit(TAX())
|
||||||
elif isinstance(src, ConstantRef):
|
elif isinstance(src, ConstantRef):
|
||||||
self.emitter.emit(LDX(Immediate(Byte(src.value))))
|
self.emitter.emit(LDX(Immediate(Byte(src.value))))
|
||||||
|
elif instr.index == REG_Y:
|
||||||
|
self.emitter.emit(LDX(AbsoluteY(self.labels[src.name])))
|
||||||
else:
|
else:
|
||||||
self.emitter.emit(LDX(Absolute(self.labels[src.name])))
|
self.emitter.emit(LDX(Absolute(self.labels[src.name])))
|
||||||
elif dest == REG_Y:
|
elif dest == REG_Y:
|
||||||
@ -95,6 +101,8 @@ class Compiler(object):
|
|||||||
self.emitter.emit(TAY())
|
self.emitter.emit(TAY())
|
||||||
elif isinstance(src, ConstantRef):
|
elif isinstance(src, ConstantRef):
|
||||||
self.emitter.emit(LDY(Immediate(Byte(src.value))))
|
self.emitter.emit(LDY(Immediate(Byte(src.value))))
|
||||||
|
elif instr.index == REG_X:
|
||||||
|
self.emitter.emit(LDY(AbsoluteX(self.labels[src.name])))
|
||||||
else:
|
else:
|
||||||
self.emitter.emit(LDY(Absolute(self.labels[src.name])))
|
self.emitter.emit(LDY(Absolute(self.labels[src.name])))
|
||||||
else:
|
else:
|
||||||
@ -104,14 +112,20 @@ class Compiler(object):
|
|||||||
self.emitter.emit(CLC())
|
self.emitter.emit(CLC())
|
||||||
elif dest == FLAG_C and src == ConstantRef(TYPE_BIT, 1):
|
elif dest == FLAG_C and src == ConstantRef(TYPE_BIT, 1):
|
||||||
self.emitter.emit(SEC())
|
self.emitter.emit(SEC())
|
||||||
elif src == REG_A:
|
|
||||||
self.emitter.emit(STA(Absolute(self.labels[dest.name])))
|
|
||||||
elif src == REG_X:
|
|
||||||
self.emitter.emit(STX(Absolute(self.labels[dest.name])))
|
|
||||||
elif src == REG_Y:
|
|
||||||
self.emitter.emit(STY(Absolute(self.labels[dest.name])))
|
|
||||||
else:
|
else:
|
||||||
|
op_cls = {
|
||||||
|
REG_A: STA,
|
||||||
|
REG_X: STX,
|
||||||
|
REG_Y: STY
|
||||||
|
}.get(src, None)
|
||||||
|
mode_cls = {
|
||||||
|
REG_X: AbsoluteX,
|
||||||
|
REG_Y: AbsoluteY,
|
||||||
|
None: Absolute
|
||||||
|
}.get(instr.index, None)
|
||||||
|
if op_cls is None or mode_cls is None:
|
||||||
raise UnsupportedOpcodeError(instr)
|
raise UnsupportedOpcodeError(instr)
|
||||||
|
self.emitter.emit(op_cls(mode_cls(self.labels[dest.name])))
|
||||||
elif opcode == 'add':
|
elif opcode == 'add':
|
||||||
if dest == REG_A:
|
if dest == REG_A:
|
||||||
if isinstance(src, ConstantRef):
|
if isinstance(src, ConstantRef):
|
||||||
|
@ -252,7 +252,6 @@ Storing to a table, you must use an index, and vice-versa.
|
|||||||
Reading from a table, you must use an index, and vice-versa.
|
Reading from a table, you must use an index, and vice-versa.
|
||||||
|
|
||||||
| byte one
|
| byte one
|
||||||
| byte table many
|
|
||||||
|
|
|
|
||||||
| routine main
|
| routine main
|
||||||
| outputs one
|
| outputs one
|
||||||
@ -265,7 +264,6 @@ Reading from a table, you must use an index, and vice-versa.
|
|||||||
= ok
|
= ok
|
||||||
|
|
||||||
| byte one
|
| byte one
|
||||||
| byte table many
|
|
||||||
|
|
|
|
||||||
| routine main
|
| routine main
|
||||||
| outputs one
|
| outputs one
|
||||||
@ -277,7 +275,6 @@ Reading from a table, you must use an index, and vice-versa.
|
|||||||
| }
|
| }
|
||||||
? TypeMismatchError
|
? TypeMismatchError
|
||||||
|
|
||||||
| byte one
|
|
||||||
| byte table many
|
| byte table many
|
||||||
|
|
|
|
||||||
| routine main
|
| routine main
|
||||||
@ -291,7 +288,6 @@ Reading from a table, you must use an index, and vice-versa.
|
|||||||
| }
|
| }
|
||||||
? TypeMismatchError
|
? TypeMismatchError
|
||||||
|
|
||||||
| byte one
|
|
||||||
| byte table many
|
| byte table many
|
||||||
|
|
|
|
||||||
| routine main
|
| routine main
|
||||||
|
@ -208,3 +208,19 @@ Compiling `repeat forever`.
|
|||||||
| } forever
|
| } forever
|
||||||
| }
|
| }
|
||||||
= 00c0a041c84c02c060
|
= 00c0a041c84c02c060
|
||||||
|
|
||||||
|
Indexed access.
|
||||||
|
|
||||||
|
| byte one
|
||||||
|
| byte table many
|
||||||
|
|
|
||||||
|
| routine main
|
||||||
|
| outputs many
|
||||||
|
| trashes a, x, n, z
|
||||||
|
| {
|
||||||
|
| ld x, 0
|
||||||
|
| ld a, 0
|
||||||
|
| st a, many + x
|
||||||
|
| ld a, many + x
|
||||||
|
| }
|
||||||
|
= 00c0a200a9009d0dc0bd0dc060
|
||||||
|
Loading…
Reference in New Issue
Block a user