瀏覽代碼

forth: Forth-ify "/MOD"

pull/95/head
Virgil Dupras 4 年之前
父節點
當前提交
52e6eaafc7
共有 4 個檔案被更改,包括 76 行新增36 行删除
  1. 二進制
      emul/forth/z80c.bin
  2. +1
    -32
      forth/forth.asm
  3. +49
    -4
      forth/z80a.fs
  4. +26
    -0
      forth/z80c.fs

二進制
emul/forth/z80c.bin 查看文件


+ 1
- 32
forth/forth.asm 查看文件

@@ -1405,44 +1405,13 @@ MULT:
jp next


; Borrowed from http://wikiti.brandonw.net/
; Divides AC by DE and places the quotient in AC and the remainder in HL
.db "/MOD"
.fill 3
.dw $-MULT
.db 0
DIVMOD:
.dw nativeWord
pop de
pop bc
call chkPS
ld a, b ; AC
ld b, 16
ld hl, 0
.loop:
scf
rl c
rla
adc hl, hl
sbc hl, de
jr nc, .skip
add hl, de
dec c
.skip:
djnz .loop
ld b, a
push hl ; REM
push bc
jp next


; It might look peculiar to have specific words for "0" and "1", but although
; it slightly beefs ups the ASM part of the binary, this one-byte-save-per-use
; really adds up when we compare total size.

.db "0"
.fill 6
.dw $-DIVMOD
.dw $-MULT
.db 0
ZERO:
.dw nativeWord


+ 49
- 4
forth/z80a.fs 查看文件

@@ -29,8 +29,13 @@

( -- )
: OP1 CREATE C, DOES> C@ A, ;
0xc9 OP1 RET,
0x76 OP1 HALT,
0xc9 OP1 RET,
0x17 OP1 RLA,
0x07 OP1 RLCA,
0x1f OP1 RRA,
0x0f OP1 RRCA,
0x37 OP1 SCF,

( r -- )
: OP1r
@@ -42,6 +47,7 @@
OR A,
;
0x04 OP1r INCr,
0x05 OP1r DECr,
0x46 OP1r LDr(HL),

( r -- )
@@ -68,7 +74,7 @@
0xc5 OP1qq PUSHqq,
0xc1 OP1qq POPqq,
0x03 OP1qq INCss,
0x09 OP1qq ADHLss,
0x09 OP1qq ADDHLss,

( rd rr )
: OP1rr
@@ -115,6 +121,22 @@
0x80 OP2br RESbr,
0x40 OP2br BITbr,

( bitwise rotation ops have a similar sig )
( r -- )
: OProt
CREATE C,
DOES>
0xcb A,
C@ ( r op )
OR A,
;
0x10 OProt RLr,
0x00 OProt RLCr,
0x18 OProt RRr,
0x08 OProt RRCr,
0x20 OProt SLAr,
0x38 OProt SRLr,

( cell contains both bytes. MSB is spit as-is, LSB is ORed with r )
( r -- )
: OP2r
@@ -128,6 +150,18 @@
0xed41 OP2r OUT(C)r,
0xed40 OP2r INr(C),

( ss -- )
: OP2ss
CREATE C,
DOES>
0xed A,
C@ SWAP ( op ss )
16 * ( op ss<< 4 )
OR A,
;
0x4a OP2ss ADCHLss,
0x42 OP2ss SBCHLss,

( dd nn -- )
: OP3ddnn
CREATE C,
@@ -138,7 +172,7 @@
OR A,
SPLITB A, A,
;
0x01 OP2ddnn LDddnn,
0x01 OP3ddnn LDddnn,

( nn -- )
: OP3nn
@@ -150,8 +184,19 @@
0xcd OP3nn CALLnn,
0xc3 OP3nn JPnn,

: OPJR
CREATE C,
DOES>
C@ A, 2 - A,
;
0x18 OPJR JRe,
0x38 OPJR JRCe,
0x30 OPJR JRNCe,
0x28 OPJR JRZe,
0x20 OPJR JRNZe,
0x10 OPJR DJNZe,

( Specials )
: JRe, 0x18 A, 2 - A, ;
: JPNEXT, ROUTINE N [LITN] JPnn, ;

: CODE


+ 26
- 0
forth/z80c.fs 查看文件

@@ -110,6 +110,32 @@ CODE XOR
HL PUSHqq,
;CODE

( Borrowed from http://wikiti.brandonw.net/ )
( Divides AC by DE and places the quotient in AC and the
remainder in HL )
CODE /MOD
DE POPqq,
BC POPqq,
chkPS,
A B LDrr,
B 16 LDrn,
HL 0 LDddnn,
( loop )
SCF,
C RLr,
RLA,
HL ADCHLss,
DE SBCHLss,
4 JRNCe, ( skip )
DE ADDHLss,
C DECr,
( skip )
0 12 - DJNZe, ( loop )
B A LDrr,
HL PUSHqq,
BC PUSHqq,
;CODE

CODE C!
HL POPqq,
DE POPqq,


Loading…
取消
儲存