version 1.8, 2003/08/17 22:52:33
|
version 1.9, 2003/08/18 19:29:15
|
Line 410 end-code
|
Line 410 end-code
|
: code-address! ( addr xt -- ) >r 3 or $808 @ r> 2! ; |
: code-address! ( addr xt -- ) >r 3 or $808 @ r> 2! ; |
: does-code! ( a_addr xt -- ) >r 5 - $808 @ r> 2! ; |
: does-code! ( a_addr xt -- ) >r 5 - $808 @ r> 2! ; |
: does-handler! ( a_addr -- ) >r $810 2@ r> 2! ; |
: does-handler! ( a_addr -- ) >r $810 2@ r> 2! ; |
|
: finish-code ; |
|
|
: bye 0 execute ; |
: bye 0 execute ; |
: (bye) 0 execute ; |
: (bye) 0 execute ; |
: float+ 8 + ; |
: float+ 8 + ; |
|
|
: sgn ( n -- -1/0/1 ) |
: sgn ( n -- -1/0/1 ) |
dup 0= IF EXIT THEN 0< 2* 1+ ; |
dup 0= IF EXIT THEN 0< 2* 1+ ; |
: -text |
: -text ( c_addr1 u c_addr2 -- n ) |
swap bounds |
swap bounds |
?DO dup c@ I c@ = WHILE 1+ LOOP drop 0 |
?DO dup c@ I c@ = WHILE 1+ LOOP drop 0 |
ELSE c@ I c@ - unloop THEN sgn ; |
ELSE c@ I c@ - unloop THEN sgn ; |
: finish-code ; |
: capscomp ( c_addr1 u c_addr2 -- n ) |
: capscomp ( c_addr1 u c_addr2 -- n ) |
swap bounds |
swap bounds |
?DO dup c@ I c@ <> |
?DO dup c@ I c@ <> |
IF dup c@ toupper I c@ toupper = |
IF dup c@ toupper I c@ toupper = |
ELSE true THEN WHILE 1+ LOOP drop 0 |
ELSE true THEN WHILE 1+ LOOP drop 0 |
ELSE c@ toupper I c@ toupper - unloop THEN sgn ; |
ELSE c@ toupper I c@ toupper - unloop THEN sgn ; |
|
|
|
\ division a/b |
\ division a/b |
\ x:=a, y:=b, r:=est; iterate(x:=x*r, y:=y*r, r:=2-y*r); |
\ x:=a, y:=b, r:=est; iterate(x:=x*r, y:=y*r, r:=2-y*r); |
\ result: x=a/b; y=1; r=1 |
\ result: x=a/b; y=1; r=1 |
|
|
\ Label idiv-table |
Code u/mod ( u1 u2 -- q r ) |
\ idiv-tab: |
drop nop pick 0s0 call $43 +IP ;; |
\ .macro .idiv-table [F] |
pick 1s0 drop nop nop ;; |
\ $100 $80 DO 0 $100 I 2* 1+ um/mod long, drop LOOP |
swap ip! nop nop 0 # ld 1: R1 N+ ;; |
\ .end-macro |
nop nop nop nop ;; |
\ .idiv-table |
.macro .idiv-table [F] |
\ end-code |
$100 $80 DO 0 $100 I 2* 1+ um/mod long, drop LOOP |
\ |
.end-macro |
\ Code um/mod1 ( u -- 1/u ) |
approx: |
\ ;; b -- -- -- -- -- ;; |
.idiv-table |
\ ff1 -$1F # nop nop br 0 :0= div0 |
idiv: |
\ bfu add 0s0 ip@ nop set 2: R2 ;; |
;; a -- b -- |
\ ;; b' -- -- -- -- -- ;; |
nop pick 2s0 ff1 1 # br 1 :0= ;; |
\ lob $0FF ## pick 0s0 pick 0s0 0 # -$108 ## ;; |
ip@ pick 2s0 bfu cm! set 0: R2 ;; |
\ 1 # #, sub #min 1 # ld 0: R2 +s0 #, ;; |
;; a n b' -- |
\ cm! and nop cm! br 2 ?0= by2 |
nop -$1D # lob pick 2s0 0 # -$104 ## ;; |
\ ;; est -- -- b' -- -- ;; |
nop add pick 3s0 drop ld 2: R2 +s0 #, ;; |
\ umul 3s0 pick 0s0 nop umul 0s0 0 # 0 # ;; |
nop cm! nip nop ;; |
\ mulr<@ nop nop -mulr@ ;; |
;; a n b' r -- |
\ drop umul 3s0 nop umul 0s0 ;; |
umul 2s0 pick 0s0 umul nop ;; |
\ mulr<@ cm! nop -mulr@ ;; |
mulr@ 0 # mulr@ -mulr@ ;; first iteration |
\ umul 3s0 drop pick 1s0 drop ;; |
umul 3s0 pick s2 umul 3s0 drop ;; |
\ drop mulr<@ ip! nop 0 # ld 1: R1 N+ ;; |
mulr@ nop nop -mulr<@ ;; second iteration |
\ pick 1s0 drop nop nop ;; |
umul 3s0 nop nop drop ;; |
\ by2: |
nop mulr<@ nop nop ;; final iteration+shift |
\ div0: |
pick 1s0 umul nop nop ;; |
\ -1 # ip! nop nop 0 # ld 1: R1 N+ ;; |
nop -mul@+ nop ret br 1 ?0< ;; |
\ nop nop nop nop ;; |
nop nip nop nop ;; |
\ end-code |
.endif |
|
dec add nop nop ;; |
|
;; q r |
|
|
|
.endif |
|
nop drop drop drop ;; |
|
dec 0 # drop ret ;; |
|
nop ;; |
|
end-code |
|
|
|
: /mod ( d1 n1 -- n2 n3 ) |
|
dup >r dup 0< IF negate >r negate r> THEN |
|
over 0< IF tuck + swap THEN |
|
u/mod |
|
r> 0< IF swap negate swap THEN ; |