1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; UrForth level
1: self
-hosting
32-bit Forth compiler
3 ;; Copyright
(C
) 2020 Ketmar Dark
// Invisible Vector
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 ;; swap bytes of the low word
8 ;; high word is untouched
9 code: BSWAP-WORD ( u -- u )
15 ;; swap all dword bytes
16 code: BSWAP-DWORD ( u -- u )
22 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
23 code: CELLS ( count -- count*4 )
28 code: BYTES->CELLS ( count -- [count+3]/4 )
34 code: +CELLS ( addr count -- addr+count*4 )
41 code: -CELLS ( addr count -- addr-count*4 )
49 code: CELL+ ( count -- count+4 )
54 code: CELL- ( count -- count-4 )
60 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
102 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104 code: NOT ( n -- !n )
112 code: NOTNOT ( n -- !!n )
119 code: BITNOT ( n -- ~n )
124 code: AND ( n0 n1 -- n0&n1 )
131 code: SWAP-AND ( n0 n1 -- n1&n0 )
137 code: ~AND ( n0 n1 -- n0&~n1 )
145 code: SWAP-~AND ( n0 n1 -- n1&~n0 )
152 code: OR ( n0 n1 -- n0|n1 )
158 code: XOR ( n0 n1 -- n0^n1 )
165 code: BIT-SET ( u0 bitnum -- u0|[1<<bitnum] )
172 code: BIT-RESET ( u0 bitnum -- u0&~[1<<bitnum] )
179 code: BIT? ( u0 bitnum -- u0&~[1<<bitnum]<>0 )
188 code: LOGAND ( n0 n1 -- n0&&n1 )
202 code: LOGOR ( n0 n1 -- n0||n1 )
212 code: LSHIFT ( n0 n1 -- n0<<n1 )
216 ;; assume that TOS is in ECX
225 code: RSHIFT ( n0 n1 -- n0>>n1 )
229 ;; assume that TOS is in ECX
238 code: ARSHIFT ( n0 n1 -- n0>>n1 )
242 ;; assume that TOS is in ECX
254 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
255 code: LROTATE ( n0 n1 -- n0 rol n1 )
263 code: RROTATE ( n0 n1 -- n0 ror n1 )
271 code: LROTATE-WORD ( n0 n1 -- n0 rol n1 )
279 code: RROTATE-WORD ( n0 n1 -- n0 ror n1 )
287 code: LROTATE-BYTE ( n0 n1 -- n0 rol n1 )
295 code: RROTATE-BYTE ( n0 n1 -- n0 ror n1 )
304 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
305 code: + ( n0 n1 -- n0+n1 )
311 code: - ( n0 n1 -- n0-n1 )
321 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
322 code: 2* ( n -- n*2 )
327 code: 2/ ( n -- n/2 )
333 code: 2U* ( n -- n*2 )
338 code: 2U/ ( n -- n/2 )
344 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345 code: SGN ( n -- -1/0/1 )
356 code: NCMP ( n0 n1 -- -1/0/1 )
369 code: UCMP ( u0 u1 -- -1/0/1 )
381 code: NEGATE ( n -- -n )
386 code: ABS ( n -- |n| )
395 code: UMIN ( u0 u1 -- umin )
404 code: UMAX ( u0 u1 -- umax )
413 code: MIN ( n0 n1 -- nmin )
422 code: MAX ( n0 n1 -- nmax )
432 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
433 code: C>S ( n-8-bit -- n )
438 code: C>U ( u-8-bit -- u )
443 code: W>S ( n-16-bit -- n )
448 code: W>U ( u-16-bit -- u )
455 code: S>C ( n -- n-8-bit )
472 code: U>C ( u -- u-8-bit )
483 code: S>W ( n -- n-16-bit )
500 code: U>W ( u -- u-16-bit )
510 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
511 ;; 32-bit
integer hash
512 ;; http
://burtleburtle
.net
/bob
/hash
/integer.html
514 code: U32HASH ( u -- u )
547 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
548 ;; 32-bit
integer hash
549 ;; http
://burtleburtle
.net
/bob
/hash
/integer.html
550 code: U32HASH ( u -- u )
551 ;; a
= (a
+0x7ed55d16)+(a
<<12);
556 ;; a
= (a^
0xc761c23c)^
(a
>>19);
561 ;; a
= (a
+0x165667b1)+(a
<<5);
566 ;; a
= (a
+0xd3a2646c)^
(a
<<9);
571 ;; a
= (a
+0xfd7046c5)+(a
<<3);
576 ;; a
= (a^
0xb55a4f09)^
(a
>>16);
584 ;; fold
32-bit hash
to 16-bit hash
585 code: UHASH32->16 ( u32hash -- u16hash )
593 code: UHASH16->8 ( u16hash -- u8hash )
599 code: UHASH32->8 ( u32hash -- u8hash )