1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-02 10:30:55 +11:00

Compare commits

...

3 Commits

Author SHA1 Message Date
Virgil Dupras
cb3e6469b8 forth: make "(parsed)" support negative literals
This limitation was becoming annoying...
2020-03-26 14:47:17 -04:00
Virgil Dupras
40eda1d933 forth: Forth-ify "*" 2020-03-26 14:36:14 -04:00
Virgil Dupras
e82f13acf1 forth: Forth-ify "I", "I'", "J" 2020-03-26 14:11:22 -04:00
4 changed files with 85 additions and 63 deletions

Binary file not shown.

View File

@ -296,6 +296,8 @@ strskip:
parseDecimal:
; First char is special: it has to succeed.
ld a, (hl)
cp '-'
jr z, .negative
; Parse the decimal char at A and extract it's 0-9 numerical value. Put the
; result in A.
; On success, the carry flag is reset. On error, it is set.
@ -349,6 +351,19 @@ parseDecimal:
cp a ; ensure Z
ret
.negative:
inc hl
call parseDecimal
ret nz
push hl ; --> lvl 1
or a ; clear carry
ld hl, 0
sbc hl, de
ex de, hl
pop hl ; <-- lvl 1
xor a ; set Z
ret
; *** Support routines ***
; Find the entry corresponding to word where (HL) points to and sets DE to
; point to that entry.
@ -1313,39 +1328,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
@ -1370,35 +1355,9 @@ MINUS:
push hl
jp next
; ( a b -- c ) A * B
.db "*"
.dw $-MINUS
.db 1
MULT:
.dw nativeWord
pop de
pop bc
call chkPS
; DE * BC -> DE (high) and HL (low)
ld hl, 0
ld a, 0x10
.loop:
add hl, hl
rl e
rl d
jr nc, .noinc
add hl, bc
jr nc, .noinc
inc de
.noinc:
dec a
jr nz, .loop
push hl
jp next
; ( a1 a2 -- b )
.db "SCMP"
.dw $-MULT
.dw $-MINUS
.db 4
SCMP:
.dw nativeWord

View File

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

View File

@ -113,6 +113,27 @@ CODE XOR
HL PUSHqq,
;CODE
CODE *
DE POPqq,
BC POPqq,
chkPS,
( DE * BC -> DE (high) and HL (low) )
HL 0 LDddnn,
A 0x10 LDrn,
( loop )
HL ADDHLss,
E RLr,
D RLr,
6 JRNCe, ( noinc )
BC ADDHLss,
3 JRNCe, ( noinc )
DE INCss,
( noinc )
A DECr,
-12 JRNZe, ( loop )
HL PUSHqq,
;CODE
( Borrowed from http://wikiti.brandonw.net/ )
( Divides AC by DE and places the quotient in AC and the
remainder in HL )
@ -133,7 +154,7 @@ CODE /MOD
DE ADDHLss,
C DECr,
( skip )
0 12 - DJNZe, ( loop )
-12 DJNZe, ( loop )
B A LDrr,
HL PUSHqq,
BC PUSHqq,
@ -168,3 +189,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