Browse Source

forth: begin z80 assembler

pull/95/head
Virgil Dupras 4 years ago
parent
commit
33e47d4938
4 changed files with 143 additions and 2 deletions
  1. +1
    -1
      emul/Makefile
  2. +1
    -0
      forth/dictionary.txt
  3. +17
    -1
      forth/forth.asm
  4. +124
    -0
      forth/z80a.fs

+ 1
- 1
emul/Makefile View File

@@ -7,7 +7,7 @@ AVRABIN = zasm/avra
SHELLAPPS = zasm ed
SHELLTGTS = ${SHELLAPPS:%=cfsin/%}
# 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/%}
CFSIN_CONTENTS = $(SHELLTGTS) cfsin/user.h
OBJS = emul.o libz80/libz80.o


+ 1
- 0
forth/dictionary.txt View File

@@ -98,6 +98,7 @@ UNTIL f -- *I* Jump backwards to BEGIN if f is *false*.
DROP a --
DUP a -- a a
OVER a b -- a b a
ROT a b c -- b c a
SWAP a b -- b a
2DUP a b -- a b a b
2OVER a b c d -- a b c d a b


+ 17
- 1
forth/forth.asm View File

@@ -1456,9 +1456,25 @@ OVER2:
push bc ; B
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"
.fill 5
.dw OVER2
.dw ROT
.db 0
P2R:
.dw nativeWord


+ 124
- 0
forth/z80a.fs View File

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

Loading…
Cancel
Save