OSDN Git Service

raz
[fast-forth/master.git] / MSP430-FORTH / UTILITY.f
1 \ UTILITY.f
2 \ must be preprocessed with yourtarget.pat file, for PSTACK,CONTEXT,INI_THREAD
3
4 \ REGISTERS USAGE
5 \ R4 to R7 must be saved before use and restored after
6 \ scratch registers Y to S are free for use
7 \ under interrupt, IP is free for use
8
9 \ PUSHM order : PSP,TOS, IP,  S,  T,  W,  X,  Y, R7, R6, R5, R4
10 \ example : PUSHM IP,Y
11 \
12 \ POPM  order :  R4, R5, R6, R7,  Y,  X,  W,  T,  S, IP,TOS,PSP
13 \ example : POPM Y,IP
14
15 \ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
16 \ ASSEMBLER conditionnal usage before GOTO ?GOTO     : S< S>= U< U>= 0= 0<> <0 
17
18 \ FORTH conditionnal usage after IF UNTIL WHILE : 0= 0< = < > U<
19
20
21 \ WIPE        ; remove all previous apps,
22 RST_STATE   ; preserve all previous apps,
23 \ NOECHO      ; if an error occurs, comment this line before new download to find it.
24     \
25
26
27 CODE ?          \ adr --            display the content of adr
28     MOV @TOS,TOS
29     MOV #U.,PC  \ goto U.
30 ENDCODE
31     \
32
33 CODE SP@        \ -- SP
34     SUB #2,PSP
35     MOV TOS,0(PSP)
36     MOV PSP,TOS
37     MOV @IP+,PC
38 ENDCODE
39
40 : .S                \ --            print <number> of cells and stack contents if not empty
41 $3C EMIT           \ --            char "<"
42 DEPTH .
43 8 EMIT              \               backspace
44 $3E EMIT SPACE     \               char ">"
45 SP@  PSTACK OVER OVER U<    \
46 IF  2 -
47     DO I @ U.
48     -2 +LOOP
49 ELSE
50     DROP DROP
51 THEN
52 ;
53     \
54
55 : WORDS                             \ --            list all words in all dicts in CONTEXT.
56
57 \ vvvvvvvv   may be skipped    vvvvvvvv
58 BASE @                              \ -- BASE
59 #10 BASE !
60 CR ."    "
61 INI_THREAD @ DUP
62 1 = IF DROP ." monothread"
63     ELSE . ." threads"
64     THEN ."  vocabularies"
65 BASE !                              \ --
66 \ ^^^^^^^^   may be skipped    ^^^^^^^^
67
68 CONTEXT                             \ -- CONTEXT
69 BEGIN                               \                                       search dictionnary
70     DUP 
71     2 + SWAP                        \ -- CONTEXT+2 CONTEXT
72     @ ?DUP                          \ -- CONTEXT+2 (VOC_BODY VOC_BODY or 0)
73 WHILE                               \ -- CONTEXT+2 VOC_BODY                  dictionnary found
74 CR ."    "                          \
75 \   MOVE all threads of VOC_BODY in PAD
76     DUP PAD INI_THREAD @ DUP +      \ -- CONTEXT+2 VOC_BODY  VOC_BODY PAD THREAD*2
77     MOVE                            \         char MOVE
78
79     BEGIN                           \ -- CONTEXT+2 VOC_BODY
80         0 DUP                       \ -- CONTEXT+2 VOC_BODY ptr MAX
81 \   select the MAX of NFA in threads
82         INI_THREAD @ DUP + 0 DO     \         ptr = threads*2
83         DUP I PAD + @               \ -- CONTEXT+2 VOC_BODY ptr MAX MAX NFAx
84         U< IF 
85             DROP DROP I DUP PAD + @ \ -- CONTEXT+2 VOC_BODY ptr MAX          if MAX U< NFAx replace adr and MAX
86         THEN                        \ 
87         2 +LOOP                     \ -- CONTEXT+2 VOC_BODY ptr MAX
88         ?DUP                        \ -- CONTEXT+2 VOC_BODY ptr MAX          max NFA = 0 ? end of vocabulary ?
89     WHILE                           \ -- CONTEXT+2 VOC_BODY ptr MAX
90 \   replace it by its LFA
91         DUP                         \ -- CONTEXT+2 VOC_BODY ptr MAX MAX
92         2 - @                       \ -- CONTEXT+2 VOC_BODY ptr MAX [LFA]
93         ROT                         \ -- CONTEXT+2 VOC_BODY MAX [LFA] ptr
94         PAD +                       \ -- CONTEXT+2 VOC_BODY MAX [LFA] thread
95         !                           \ -- CONTEXT+2 VOC_BODY MAX
96 \   type it in 16 chars format
97                 DUP                 \ -- CONTEXT+2 VOC_BODY MAX MAX
98             COUNT $7F AND TYPE      \ -- CONTEXT+2 VOC_BODY MAX
99                 C@ $0F AND          \ -- 
100                 $10 SWAP - SPACES   \ -- CONTEXT+2 VOC_BODY 
101 \   search next MAX of NFA 
102     REPEAT
103                                     \ -- CONTEXT+2 VOC_BODY 0
104     DROP DROP                       \ -- CONTEXT+2
105     CR         
106 \   repeat for each CONTEXT vocabulary
107
108 REPEAT                              \ -- 0
109 DROP                                \ --
110 ;
111     \
112
113 CODE MAX    \    n1 n2 -- n3       signed maximum
114             CMP     @PSP,TOS    \ n2-n1
115             S<      ?GOTO FW1   \ n2<n1
116 BW1         ADD     #2,PSP
117             MOV     @IP+,PC
118 ENDCODE
119     \
120
121 CODE MIN    \    n1 n2 -- n3       signed minimum
122             CMP     @PSP,TOS     \ n2-n1
123             S<      ?GOTO BW1    \ n2<n1
124 FW1         MOV     @PSP+,TOS
125             MOV     @IP+,PC
126 ENDCODE
127     \
128
129 : U.R                       \ u n --           display u unsigned in n width (n >= 2)
130   >R  <# 0 # #S #>  
131   R> OVER - 0 MAX SPACES TYPE
132 ;
133     \
134
135 : DUMP                      \ adr n  --   dump memory
136   BASE @ >R $10 BASE !
137   SWAP $FFF0 AND SWAP
138   OVER + SWAP
139   DO  CR                    \ generate line
140     I 7 U.R SPACE           \ generate address
141       I $10 + I            \ display 16 bytes
142       DO I C@ 3 U.R LOOP  
143       SPACE SPACE
144       I $10 + I            \ display 16 chars
145       DO I C@ $7E MIN BL MAX EMIT LOOP
146   $10 +LOOP
147   R> BASE !
148 ;
149
150     \ 
151
152 ECHO
153             ; added : ? SP@ .S WORDS U.R MAX MIN DUMP 
154             ;    v--- use backspaces before hit "CR" if you want decrease level of app protection
155 PWR_HERE RST_HERE