diff --git a/emul/forth/z80c.bin b/emul/forth/z80c.bin index 326ad7c..f8a2b42 100644 Binary files a/emul/forth/z80c.bin and b/emul/forth/z80c.bin differ diff --git a/forth/forth.asm b/forth/forth.asm index 1e28724..31f53dc 100644 --- a/forth/forth.asm +++ b/forth/forth.asm @@ -1313,39 +1313,9 @@ R2P: push hl jp next - .db "I" - .dw $-R2P - .db 1 -I: - .dw nativeWord - ld l, (ix) - ld h, (ix+1) - push hl - jp next - - .db "I'" - .dw $-I - .db 2 -IPRIME: - .dw nativeWord - ld l, (ix-2) - ld h, (ix-1) - push hl - jp next - - .db "J" - .dw $-IPRIME - .db 1 -J: - .dw nativeWord - ld l, (ix-4) - ld h, (ix-3) - push hl - jp next - ; ( a b -- c ) A + B .db "+" - .dw $-J + .dw $-R2P .db 1 PLUS: .dw nativeWord diff --git a/forth/z80a.fs b/forth/z80a.fs index acaba0e..f581b50 100644 --- a/forth/z80a.fs +++ b/forth/z80a.fs @@ -26,6 +26,12 @@ extra 0xdd / 0xfd and then spit the equivalent of HL ) : IX 0xdd A, HL ; : IY 0xfd A, HL ; +: _ix+- 0xff AND 0xdd A, (HL) ; +: _iy+- 0xff AND 0xfd A, (HL) ; +: IX+ _ix+- ; +: IX- 0 -^ _ix+- ; +: IY+ _iy+- ; +: IY- 0 -^ _iy+- ; ( -- ) : OP1 CREATE C, DOES> C@ A, ; @@ -77,17 +83,35 @@ 0x03 OP1qq INCss, 0x09 OP1qq ADDHLss, -( rd rr ) -: OP1rr - CREATE C, - DOES> +: _1rr C@ ( rd rr op ) ROT ( rr op rd ) 8 * ( rr op rd<<3 ) OR OR A, ; + +( rd rr ) +: OP1rr + CREATE C, + DOES> + _1rr +; 0x40 OP1rr LDrr, +( ixy+- HL rd ) +: LDIXYr, + ( dd/fd has already been spit ) + LDrr, ( ixy+- ) + A, +; + +( rd ixy+- HL ) +: LDrIXY, + ROT ( ixy+- HL rd ) + SWAP ( ixy+- rd HL ) + LDIXYr, +; + ( n -- ) : OP2n CREATE C, diff --git a/forth/z80c.fs b/forth/z80c.fs index d3ebe28..1ed407a 100644 --- a/forth/z80c.fs +++ b/forth/z80c.fs @@ -168,3 +168,21 @@ CODE PC@ L INr(C), HL PUSHqq, ;CODE + +CODE I + L 0 IX+ LDrIXY, + H 1 IX+ LDrIXY, + HL PUSHqq, +;CODE + +CODE I' + L 2 IX- LDrIXY, + H 1 IX- LDrIXY, + HL PUSHqq, +;CODE + +CODE J + L 4 IX- LDrIXY, + H 3 IX- LDrIXY, + HL PUSHqq, +;CODE