-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathforth200x.fs
More file actions
106 lines (83 loc) · 2.95 KB
/
forth200x.fs
File metadata and controls
106 lines (83 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
\ forth 200x stuff
: Synonym Header -2 allot bl word find dup 0= IF no.extensions THEN
dup 0> IF immediate THEN
1 and 0= IF restrict THEN A,
$20 last @ dup >r c@ or r> c! reveal ;
\ defer@/defer!/action-of
: defer@ ( xt -- xt ) >body @ ;
: defer! ( xt1 xt2 -- ) >body ! ;
Synonym action-of what's
\ ekey stuff
: ekey ( -- ) key kbshift @ $18 lshift or ;
: ekey? ( -- ) key? ;
$01000000 Constant k-shift-mask
$02000000 Constant k-capslock-mask
$04000000 Constant k-ctrl-mask
$08000000 Constant k-alt-mask
$10000000 Constant k-numlock-mask
$40000000 Constant k-mouse-mask
$80000000 Constant k-fn-mask
: ekey>char ( u -- u false | c true )
dup $C0000000 and 0= over $FFFFFF and $100 < and
dup IF swap $FF and swap THEN ;
: ekey>xchar ( u -- u false | xc true )
dup $C0000000 and 0=
dup IF swap $FFFFFF and swap THEN ;
: ekey>fkey ( u1 -- u2 f )
dup k-fn-mask and 0<>
dup IF
drop [ k-capslock-mask k-numlock-mask or k-fn-mask or
k-mouse-mask or invert ] Literal and
true
THEN ;
: k-fns: ( start n -- ) bounds ?DO I Constant LOOP ;
0 AValue keycode-start
0 AValue keycode-end
: simple-fkey-string ( u -- addr u )
keycode-end BEGIN dup keycode-start > WHILE
2dup name> 4 + @ = IF nip count $1F and EXIT THEN
cell- @ cell+
REPEAT 2drop s" f-unknown" ;
: fkey. ( u -- ) \ gforth fkey-dot
\ Print an fkey as string
dup $FFFFFF and
simple-fkey-string type
dup k-shift-mask and IF ." k-shift-mask or" THEN
dup k-ctrl-mask and IF ." k-ctrl-mask or" THEN
k-alt-mask and IF ." k-alt-mask or" THEN ;
last @ to keycode-start
$FF50 Constant k-home
$FF51 Constant k-left
$FF52 Constant k-up
$FF53 Constant k-right
$FF54 Constant k-down
$FF55 Constant k-prior
$FF56 Constant k-next
$FF57 Constant k-end
$FF63 Constant k-insert
$FFBE 12 k-fns: k-f1 k-f2 k-f3 k-f4 k-f5 k-f6 k-f7 k-f8 k-f9 k-f10 k-f11 k-f12
last @ to keycode-end
\ structures
: begin-structure ( -- here ) $AAAAAAAA Constant lastcfa @ 4 + 0 ;
: end-structure ( here size -- ) swap ! ;
: +field ( n1 n2 "name" -- n3 )
>r >r : r@ postpone Literal postpone + postpone ; macro r> r> + ;
: cfield: \ n1 <"name"> -- n2 ; Exec: addr -- 'addr
\ *G Create a new field within a structure definition of size 1 CHARS.
1 +field ;
: field: \ n1 <"name"> -- n2 ; Exec: addr -- 'addr
\ *G Create a new field within a structure definition of size 1 CELLS.
\ ** The field is ALIGNED.
cell +field ;
: ffield: \ n1 <"name"> -- n2 ; Exec: addr -- 'addr
\ *G Create a new field within a structure definition of size 1 FLOATS.
\ ** The field is FALIGNED.
10 +field ;
: sffield: \ n1 <"name"> -- n2 ; Exec: addr -- 'addr
\ *G Create a new field within a structure definition of size 1 SFLOATS.
\ ** The field is SFALIGNED.
4 +field ;
: dffield: \ n1 <"name"> -- n2 ; Exec: addr -- 'addr
\ *G Create a new field within a structure definition of size 1 DFLOATS.
\ ** The field is DFALIGNED.
8 +field ;