@@ -7,7 +7,7 @@ AVRABIN = zasm/avra | |||||
SHELLAPPS = zasm ed | SHELLAPPS = zasm ed | ||||
SHELLTGTS = ${SHELLAPPS:%=cfsin/%} | SHELLTGTS = ${SHELLAPPS:%=cfsin/%} | ||||
# Those Forth source files are in a particular order | # Those Forth source files are in a particular order | ||||
FORTHSRCS = core.fs str.fs parse.fs readln.fs fmt.fs high.fs | |||||
FORTHSRCS = core.fs str.fs parse.fs readln.fs fmt.fs high.fs z80a.fs | |||||
FORTHSRC_PATHS = ${FORTHSRCS:%=../forth/%} | FORTHSRC_PATHS = ${FORTHSRCS:%=../forth/%} | ||||
CFSIN_CONTENTS = $(SHELLTGTS) cfsin/user.h | CFSIN_CONTENTS = $(SHELLTGTS) cfsin/user.h | ||||
OBJS = emul.o libz80/libz80.o | OBJS = emul.o libz80/libz80.o | ||||
@@ -98,6 +98,7 @@ UNTIL f -- *I* Jump backwards to BEGIN if f is *false*. | |||||
DROP a -- | DROP a -- | ||||
DUP a -- a a | DUP a -- a a | ||||
OVER a b -- a b a | OVER a b -- a b a | ||||
ROT a b c -- b c a | |||||
SWAP a b -- b a | SWAP a b -- b a | ||||
2DUP a b -- a b a b | 2DUP a b -- a b a b | ||||
2OVER a b c d -- a b c d a b | 2OVER a b c d -- a b c d a b | ||||
@@ -1456,9 +1456,25 @@ OVER2: | |||||
push bc ; B | push bc ; B | ||||
jp next | jp next | ||||
; ( a b c -- b c a) | |||||
.db "ROT" | |||||
.fill 4 | |||||
.dw OVER2 | |||||
.db 0 | |||||
ROT: | |||||
.dw nativeWord | |||||
pop hl ; C | |||||
pop de ; B | |||||
pop bc ; A | |||||
call chkPS | |||||
push de ; B | |||||
push hl ; C | |||||
push bc ; A | |||||
jp next | |||||
.db ">R" | .db ">R" | ||||
.fill 5 | .fill 5 | ||||
.dw OVER2 | |||||
.dw ROT | |||||
.db 0 | .db 0 | ||||
P2R: | P2R: | ||||
.dw nativeWord | .dw nativeWord | ||||
@@ -0,0 +1,124 @@ | |||||
( Z80 assembler ) | |||||
( Splits word into msb/lsb, lsb being on TOS ) | |||||
: SPLITB | |||||
DUP 0x100 / | |||||
SWAP 0xff AND | |||||
; | |||||
: A, .X ; | |||||
7 CONSTANT A | |||||
0 CONSTANT B | |||||
1 CONSTANT C | |||||
2 CONSTANT D | |||||
3 CONSTANT E | |||||
4 CONSTANT H | |||||
5 CONSTANT L | |||||
6 CONSTANT (HL) | |||||
0 CONSTANT BC | |||||
1 CONSTANT DE | |||||
2 CONSTANT HL | |||||
3 CONSTANT AF | |||||
3 CONSTANT SP | |||||
( -- ) | |||||
: OP1 CREATE C, DOES> C@ A, ; | |||||
0xc9 OP1 RET, | |||||
0x76 OP1 HALT, | |||||
( r -- ) | |||||
: OP1r | |||||
CREATE C, | |||||
DOES> | |||||
C@ ( r op ) | |||||
SWAP ( op r ) | |||||
8 * ( op r<<3 ) | |||||
OR A, | |||||
; | |||||
0x04 OP1r INCr, | |||||
0x46 OP1r LDr(HL), | |||||
0x70 OP1r LD(HL)r, | |||||
( qq -- also works for ss ) | |||||
: OP1qq | |||||
CREATE C, | |||||
DOES> | |||||
C@ ( qq op ) | |||||
SWAP ( op qq ) | |||||
16 * ( op qq<<4 ) | |||||
OR A, | |||||
; | |||||
0xc5 OP1qq PUSHqq, | |||||
0xc1 OP1qq POPqq, | |||||
0x03 OP1qq INCss, | |||||
0x09 OP1qq ADHLss, | |||||
( rd rr ) | |||||
: OP1rr | |||||
CREATE C, | |||||
DOES> | |||||
C@ ( rd rr op ) | |||||
ROT ( rr op rd ) | |||||
8 * ( rr op rd<<3 ) | |||||
OR OR A, | |||||
; | |||||
0x40 OP1rr LDrr, | |||||
( n -- ) | |||||
: OP2n | |||||
CREATE C, | |||||
DOES> | |||||
C@ A, A, | |||||
; | |||||
0xd3 OP2n OUTAn, | |||||
0xdb OP2n INAn, | |||||
( r n -- ) | |||||
: OP2rn | |||||
CREATE C, | |||||
DOES> | |||||
C@ ( r n op ) | |||||
ROT ( n op r ) | |||||
8 * ( n op r<<3 ) | |||||
OR A, A, | |||||
; | |||||
0x06 OP2rn LDrn, | |||||
( b r -- ) | |||||
: OP2br | |||||
CREATE C, | |||||
DOES> | |||||
0xcb A, | |||||
C@ ( b r op ) | |||||
ROT ( r op b ) | |||||
8 * ( r op b<<3 ) | |||||
OR OR Z, | |||||
; | |||||
0xc0 OP2br SETbr, | |||||
0x80 OP2br RESbr, | |||||
0x40 OP2br BITbr, | |||||
( dd nn -- ) | |||||
: OP3ddnn | |||||
CREATE C, | |||||
DOES> | |||||
C@ ( dd nn op ) | |||||
ROT ( nn op dd ) | |||||
16 * ( nn op dd<<4 ) | |||||
OR A, | |||||
SPLITB A, A, | |||||
; | |||||
0x01 OP2ddnn LDddnn, | |||||
( nn -- ) | |||||
: OP3nn | |||||
CREATE C, | |||||
DOES> | |||||
C@ A, | |||||
SPLITB A, A, | |||||
; | |||||
0xcd OP3nn CALLnn, | |||||
0xc3 OP3nn JPnn, | |||||
( Specials ) | |||||
: JRe, 0x18 A, 2 - A, ; |