Rev 4869 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4869 | Rev 7134 | ||
---|---|---|---|
1 | ; KolSPForth v12 |
1 | ; KolSPForth v12 |
2 | 2 | ||
3 | ;Memory Map |
3 | ;Memory Map |
4 | ; |
4 | ; |
5 | ;0 |
5 | ;0 |
6 | ;0x02C7D ;I_END |
6 | ;0x02C7D ;I_END |
7 | ;0x05430 ;CTOP |
7 | ;0x05430 ;CTOP |
8 | 8 | ||
9 | ;0x3F800 ;Data stack |
9 | ;0x3F800 ;Data stack |
10 | ;0x3FA00 ;return stack |
10 | ;0x3FA00 ;return stack |
11 | ;0x3FC00 ;User |
11 | ;0x3FC00 ;User |
12 | ;0x3FE00 ;TIB |
12 | ;0x3FE00 ;TIB |
13 | ;0x30000 ;FILE BUFF |
13 | ;0x30000 ;FILE BUFF |
14 | ;0x40000 (256K) |
14 | ;0x40000 (256K) |
15 | 15 | ||
16 | ;; Version control |
16 | ;; Version control |
17 | 17 | ||
18 | VER EQU 1 ;major release version |
18 | VER EQU 1 ;major release version |
19 | EXT EQU 0 ;minor extension |
19 | EXT EQU 0 ;minor extension |
20 | 20 | ||
21 | ;; Constants |
21 | ;; Constants |
22 | 22 | ||
23 | TRUEE EQU -1 ;true flag |
23 | TRUEE EQU -1 ;true flag |
24 | 24 | ||
25 | COMPO EQU 040H ;lexicon compile only bit |
25 | COMPO EQU 040H ;lexicon compile only bit |
26 | IMEDD EQU 080H ;lexicon immediate bit |
26 | IMEDD EQU 080H ;lexicon immediate bit |
27 | MASKK EQU 01FH ;lexicon bit mask |
27 | MASKK EQU 01FH ;lexicon bit mask |
28 | 28 | ||
29 | CELLL EQU 4 ;size of a cell |
29 | CELLL EQU 4 ;size of a cell |
30 | BASEE EQU 10 ;default radix |
30 | BASEE EQU 10 ;default radix |
31 | VOCSS EQU 8 ;depth of vocabulary stack |
31 | VOCSS EQU 8 ;depth of vocabulary stack |
32 | 32 | ||
33 | BKSPP EQU 8 ;back space |
33 | BKSPP EQU 8 ;back space |
34 | LF EQU 10 ;line feed |
34 | LF EQU 10 ;line feed |
35 | CRR EQU 13 ;carriage return |
35 | CRR EQU 13 ;carriage return |
36 | ERR EQU 27 ;error escape |
36 | ERR EQU 27 ;error escape |
37 | TIC EQU 39 ;tick |
37 | TIC EQU 39 ;tick |
38 | 38 | ||
39 | CALLL EQU 0E8H ;CALL opcodes |
39 | CALLL EQU 0E8H ;CALL opcodes |
40 | 40 | ||
41 | ROWH EQU 13 |
41 | ROWH EQU 13 |
42 | KEY_DELAY EQU 20 |
42 | KEY_DELAY EQU 20 |
43 | FW_WIDTH equ 500 |
43 | FW_WIDTH equ 500 |
44 | FW_HEIGHT equ 352 |
44 | FW_HEIGHT equ 352 |
45 | 45 | ||
46 | 46 | ||
47 | ;; Memory allocation |
47 | ;; Memory allocation |
48 | 48 | ||
49 | EM EQU 256*1024 ;top of memory |
49 | EM EQU 256*1024 ;top of memory |
50 | FILE_BS EQU 64*1024 ;file buff size |
50 | FILE_BS EQU 64*1024 ;file buff size |
51 | US EQU 128*CELLL ;user area size in cells |
51 | US EQU 128*CELLL ;user area size in cells |
52 | RTS EQU 1024*CELLL ;return stack/TIB size |
52 | RTS EQU 1024*CELLL ;return stack/TIB size |
53 | 53 | ||
54 | FILE_B EQU EM-FILE_BS ;terminal input buffer (TIB) |
54 | FILE_B EQU EM-FILE_BS ;terminal input buffer (TIB) |
55 | TIBB EQU FILE_B-RTS ;terminal input buffer (TIB) |
55 | TIBB EQU FILE_B-RTS ;terminal input buffer (TIB) |
56 | ; UPP EQU TIBB-US ;start of user area (UP0) |
56 | ; UPP EQU TIBB-US ;start of user area (UP0) |
57 | RPP EQU UPP-RTS ;start of return stack (ESP0) |
57 | RPP EQU UPP-RTS ;start of return stack (ESP0) |
58 | SPP EQU RPP-RTS ;start of data stack (EBP0) |
58 | SPP EQU RPP-RTS ;start of data stack (EBP0) |
59 | 59 | ||
60 | LastNFA = 0 |
60 | LastNFA = 0 |
61 | 61 | ||
62 | LastCFA EQU INIT |
62 | LastCFA EQU INIT |
63 | 63 | ||
64 | 64 | ||
65 | 65 | ||
66 | macro AHEADER FLAG,ID,F_CFA { |
66 | macro AHEADER FLAG,ID,F_CFA { |
67 | db FLAG |
67 | db FLAG |
68 | DD F_CFA |
68 | DD F_CFA |
69 | DD LastNFA |
69 | DD LastNFA |
70 | The_Nfa = $ |
70 | The_Nfa = $ |
71 | DB ID,0 |
71 | DB ID,0 |
72 | LastNFA = The_Nfa |
72 | LastNFA = The_Nfa |
73 | F_CFA: |
73 | F_CFA: |
74 | } |
74 | } |
75 | 75 | ||
76 | macro cfa_AHEADER FLAG,ID,F_CFA { |
76 | macro cfa_AHEADER FLAG,ID,F_CFA { |
77 | db FLAG |
77 | db FLAG |
78 | DD cfa_#F_CFA |
78 | DD cfa_#F_CFA |
79 | DD LastNFA |
79 | DD LastNFA |
80 | The_Nfa = $ |
80 | The_Nfa = $ |
81 | DB ID,0 |
81 | DB ID,0 |
82 | LastNFA = The_Nfa |
82 | LastNFA = The_Nfa |
83 | cfa_#F_CFA: |
83 | cfa_#F_CFA: |
84 | } |
84 | } |
85 | 85 | ||
86 | 86 | ||
87 | ;; Main entry points and COLD start data |
87 | ;; Main entry points and COLD start data |
88 | 88 | ||
89 | use32 |
89 | use32 |
90 | format binary as "" |
90 | format binary as "" |
91 | 91 | ||
92 | org 0x0 |
92 | org 0x0 |
93 | 93 | ||
94 | db 'MENUET01' |
94 | db 'MENUET01' |
95 | dd 0x01 |
95 | dd 0x01 |
96 | dd ORIG ; start of code |
96 | dd ORIG ; start of code |
97 | dd I_END ; size of image |
97 | dd I_END ; size of image |
98 | MEMS: dd EM ; memory for app |
98 | MEMS: dd EM ; memory for app |
99 | dd SPP ; esp |
99 | dd SPP ; esp |
100 | dd params |
100 | dd params |
101 | dd cur_dir_path |
101 | dd cur_dir_path |
102 | 102 | ||
103 | lang fix ru |
103 | lang fix ru |
104 | include 'MACROS.INC' |
104 | include 'macros.inc' |
105 | include '..\..\proc32.inc' |
105 | include 'proc32.inc' |
106 | 106 | ||
107 | align 4 |
107 | align 4 |
108 | proc strncmp stdcall, s1:dword, s2:dword, n:dword |
108 | proc strncmp stdcall, s1:dword, s2:dword, n:dword |
109 | 109 | ||
110 | push esi |
110 | push esi |
111 | push edi |
111 | push edi |
112 | mov ecx, [n] |
112 | mov ecx, [n] |
113 | test ecx, ecx ; Max length is zero? |
113 | test ecx, ecx ; Max length is zero? |
114 | je .done |
114 | je .done |
115 | 115 | ||
116 | mov esi, [s1] ; esi = string s1 |
116 | mov esi, [s1] ; esi = string s1 |
117 | mov edi, [s2] ; edi = string s2 |
117 | mov edi, [s2] ; edi = string s2 |
118 | cld |
118 | cld |
119 | .compare: |
119 | .compare: |
120 | cmpsb ; Compare two bytes |
120 | cmpsb ; Compare two bytes |
121 | jne .done |
121 | jne .done |
122 | cmp byte [esi-1], 0 ; End of string? |
122 | cmp byte [esi-1], 0 ; End of string? |
123 | je .done |
123 | je .done |
124 | dec ecx ; Length limit reached? |
124 | dec ecx ; Length limit reached? |
125 | jne .compare |
125 | jne .compare |
126 | .done: |
126 | .done: |
127 | seta al ; al = (s1 > s2) |
127 | seta al ; al = (s1 > s2) |
128 | setb ah ; ah = (s1 < s2) |
128 | setb ah ; ah = (s1 < s2) |
129 | sub al, ah |
129 | sub al, ah |
130 | movsx eax, al ; eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1 |
130 | movsx eax, al ; eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1 |
131 | pop edi |
131 | pop edi |
132 | pop esi |
132 | pop esi |
133 | ret |
133 | ret |
134 | endp |
134 | endp |
135 | 135 | ||
136 | align 4 |
136 | align 4 |
137 | proc GetPr stdcall, exp:dword, sz_name:dword |
137 | proc GetPr stdcall, exp:dword, sz_name:dword |
138 | mov edx, [exp] |
138 | mov edx, [exp] |
139 | .next: |
139 | .next: |
140 | push edx |
140 | push edx |
141 | stdcall strncmp, edx, [sz_name], 16 |
141 | stdcall strncmp, edx, [sz_name], 16 |
142 | pop edx |
142 | pop edx |
143 | test eax, eax |
143 | test eax, eax |
144 | jz .ok |
144 | jz .ok |
145 | mov edx, [edx-4] |
145 | mov edx, [edx-4] |
146 | test edx, edx |
146 | test edx, edx |
147 | jnz .next |
147 | jnz .next |
148 | mov eax,edx |
148 | mov eax,edx |
149 | ret |
149 | ret |
150 | .ok: |
150 | .ok: |
151 | mov eax, [edx-8] |
151 | mov eax, [edx-8] |
152 | ret |
152 | ret |
153 | endp |
153 | endp |
154 | 154 | ||
155 | AHEADER 0 ,'GETPR',cfa_GETPR |
155 | AHEADER 0 ,'GETPR',cfa_GETPR |
156 | JMP GetPr |
156 | JMP GetPr |
157 | 157 | ||
158 | 158 | ||
159 | ORIG: |
159 | ORIG: |
160 | 160 | ||
161 | MOV EBP,RPP ;initialize RP |
161 | MOV EBP,RPP ;initialize RP |
162 | CLD ;ESI gets incremented |
162 | CLD ;ESI gets incremented |
163 | finit |
163 | finit |
164 | call draw_window |
164 | call draw_window |
165 | call calc_lines |
165 | call calc_lines |
166 | XCHG ESP,EBP |
166 | XCHG ESP,EBP |
167 | CALL amain |
167 | CALL amain |
168 | BYE: mcall -1 |
168 | BYE: mcall -1 |
169 | 169 | ||
170 | 170 | ||
171 | ULAST: ; DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
171 | ULAST: ; DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
172 | 172 | ||
173 | 173 | ||
174 | draw_cursor: |
174 | draw_cursor: |
175 | 175 | ||
176 | draw_window: |
176 | draw_window: |
177 | pusha |
177 | pusha |
178 | mcall 12,1 |
178 | mcall 12,1 |
179 | mov [fRed],ebx |
179 | mov [fRed],ebx |
180 | mcall 0, <0,FW_WIDTH>, <0,FW_HEIGHT>, 0x54000000 |
180 | mcall 0, <0,FW_WIDTH>, <0,FW_HEIGHT>, 0x54000000 |
181 | ; mcall 0,,,COL_WINDOW_BG, ,title ; define window |
181 | ; mcall 0,,,COL_WINDOW_BG, ,title ; define window |
182 | mcall 71, 1, header |
182 | mcall 71, 1, header |
183 | 183 | ||
184 | mcall 9,pinfo,-1 |
184 | mcall 9,pinfo,-1 |
185 | mov eax,[pinfo.x_size] |
185 | mov eax,[pinfo.box.width] |
186 | cdq |
186 | cdq |
187 | sub eax,20 |
187 | sub eax,20 |
188 | mov ebx,6 |
188 | mov ebx,6 |
189 | div ebx |
189 | div ebx |
190 | mov [pinfo.x_start],eax |
190 | mov [pinfo.box.left],eax |
191 | 191 | ||
192 | mov eax,[pinfo.y_size] |
192 | mov eax,[pinfo.box.height] |
193 | cdq |
193 | cdq |
194 | sub eax,40 |
194 | sub eax,40 |
195 | mov ebx,ROWH |
195 | mov ebx,ROWH |
196 | div ebx |
196 | div ebx |
197 | 197 | ||
198 | mov [pinfo.y_start],eax |
198 | mov [pinfo.box.top],eax |
199 | call erase_screen |
199 | call erase_screen |
200 | mcall 12, 2 |
200 | mcall 12, 2 |
201 | mcall 67,-1,-1,FW_WIDTH,FW_HEIGHT |
201 | mcall 67,-1,-1,FW_WIDTH,FW_HEIGHT |
202 | popa |
202 | popa |
203 | ret |
203 | ret |
204 | 204 | ||
205 | 205 | ||
206 | macro GetSkinHeight |
206 | macro GetSkinHeight |
207 | { |
207 | { |
208 | mov eax,48 |
208 | mov eax,48 |
209 | mov ebx,4 |
209 | mov ebx,4 |
210 | int 0x40 |
210 | int 0x40 |
211 | } |
211 | } |
212 | 212 | ||
213 | erase_screen: |
213 | erase_screen: |
214 | GetSkinHeight |
214 | GetSkinHeight |
215 | mov ecx,eax |
215 | mov ecx,eax |
216 | shl ecx,16 |
216 | shl ecx,16 |
217 | add ecx,[pinfo.y_size] |
217 | add ecx,[pinfo.box.height] |
218 | sub ecx,eax |
218 | sub ecx,eax |
219 | sub ecx,4 |
219 | sub ecx,4 |
220 | mov ebx,[pinfo.x_size] |
220 | mov ebx,[pinfo.box.width] |
221 | add ebx,5 shl 16 - 9 |
221 | add ebx,5 shl 16 - 9 |
222 | mcall 13,,,0;xff |
222 | mcall 13,,,0;xff |
223 | ret |
223 | ret |
224 | 224 | ||
225 | 225 | ||
226 | AHEADER 0,"CC_LINES",cfa_CC_LINES |
226 | AHEADER 0,"CC_LINES",cfa_CC_LINES |
227 | calc_lines: |
227 | calc_lines: |
228 | cmp dword[UPP+10*4],0 |
228 | cmp dword[UPP+10*4],0 |
229 | je .ex |
229 | je .ex |
230 | pusha |
230 | pusha |
231 | mov ebp,os_work |
231 | mov ebp,os_work |
232 | mov al,0xd |
232 | mov al,0xd |
233 | mov edi,screen_buf |
233 | mov edi,screen_buf |
234 | ; mov esi,[cursor] |
234 | ; mov esi,[cursor] |
235 | ; mov byte[esi],'_' |
235 | ; mov byte[esi],'_' |
236 | ; inc [cursor] |
236 | ; inc [cursor] |
237 | .again: |
237 | .again: |
238 | mov [ebp],edi |
238 | mov [ebp],edi |
239 | mov esi,[cursor] |
239 | mov esi,[cursor] |
240 | sub esi,edi |
240 | sub esi,edi |
241 | mov ecx,[pinfo.x_start] |
241 | mov ecx,[pinfo.box.left] |
242 | ; test ecx,ecx |
242 | ; test ecx,ecx |
243 | ; jnz .no0 |
243 | ; jnz .no0 |
244 | ; inc ecx |
244 | ; inc ecx |
245 | ; .no0: |
245 | ; .no0: |
246 | cmp ecx,esi |
246 | cmp ecx,esi |
247 | jbe .ok |
247 | jbe .ok |
248 | mov ecx,esi |
248 | mov ecx,esi |
249 | .ok: |
249 | .ok: |
250 | repne scasb |
250 | repne scasb |
251 | jecxz .nocrlf |
251 | jecxz .nocrlf |
252 | cmp byte[edi],10 |
252 | cmp byte[edi],10 |
253 | jne .nocrlf |
253 | jne .nocrlf |
254 | inc edi |
254 | inc edi |
255 | .nocrlf: |
255 | .nocrlf: |
256 | mov ecx,edi |
256 | mov ecx,edi |
257 | sub ecx,[ebp] |
257 | sub ecx,[ebp] |
258 | add ebp,8 |
258 | add ebp,8 |
259 | mov [ebp-4],ecx |
259 | mov [ebp-4],ecx |
260 | cmp edi,[cursor] |
260 | cmp edi,[cursor] |
261 | jb .again |
261 | jb .again |
262 | and dword[ebp],0 |
262 | and dword[ebp],0 |
263 | ; dpd esi |
263 | ; dpd esi |
264 | mov eax,[pinfo.y_start] |
264 | mov eax,[pinfo.box.top] |
265 | shl eax,3 |
265 | shl eax,3 |
266 | sub ebp,eax |
266 | sub ebp,eax |
267 | cmp ebp,os_work |
267 | cmp ebp,os_work |
268 | jae .ok2 |
268 | jae .ok2 |
269 | mov ebp,os_work |
269 | mov ebp,os_work |
270 | .ok2: |
270 | .ok2: |
271 | cmp ebp,[last_ebp] |
271 | cmp ebp,[last_ebp] |
272 | je .ok3 |
272 | je .ok3 |
273 | mov [last_ebp],ebp |
273 | mov [last_ebp],ebp |
274 | call erase_screen |
274 | call erase_screen |
275 | .ok3: |
275 | .ok3: |
276 | mov ebx,10 shl 16 +30 |
276 | mov ebx,10 shl 16 +30 |
277 | ; ud2 |
277 | ; ud2 |
278 | .newl: |
278 | .newl: |
279 | mcall 4,,0xffffff,[ebp],[ebp+4] |
279 | mcall 4,,0xffffff,[ebp],[ebp+4] |
280 | add ebp,8 |
280 | add ebp,8 |
281 | add ebx,ROWH |
281 | add ebx,ROWH |
282 | cmp dword[ebp],0 |
282 | cmp dword[ebp],0 |
283 | jnz .newl |
283 | jnz .newl |
284 | SUB ebx,ROWH |
284 | SUB ebx,ROWH |
285 | call set_cur |
285 | call set_cur |
286 | popa |
286 | popa |
287 | .ex: |
287 | .ex: |
288 | ret |
288 | ret |
289 | 289 | ||
290 | 290 | ||
291 | set_cur: |
291 | set_cur: |
292 | MOV ecx,EBX |
292 | MOV ecx,EBX |
293 | shl ecx,16 |
293 | shl ecx,16 |
294 | add ecx,EBX |
294 | add ecx,EBX |
295 | MOV EAX,[ebp+4-8] |
295 | MOV EAX,[ebp+4-8] |
296 | add EAX,2 |
296 | add EAX,2 |
297 | imul EAX,6 |
297 | imul EAX,6 |
298 | mov EBX,EAX |
298 | mov EBX,EAX |
299 | shl ebx,16 |
299 | shl ebx,16 |
300 | add EBX,EAX |
300 | add EBX,EAX |
301 | mov [lastcur],ecx |
301 | mov [lastcur],ecx |
302 | mov [lastcur+4],ebx |
302 | mov [lastcur+4],ebx |
303 | ret |
303 | ret |
304 | 304 | ||
305 | e_calc_lines: |
305 | e_calc_lines: |
306 | cmp dword[UPP+10*4],0 |
306 | cmp dword[UPP+10*4],0 |
307 | je e_.ex |
307 | je e_.ex |
308 | pusha |
308 | pusha |
309 | mov ebp,os_work |
309 | mov ebp,os_work |
310 | mov al,0xd |
310 | mov al,0xd |
311 | mov edi,screen_buf |
311 | mov edi,screen_buf |
312 | ; mov esi,[cursor] |
312 | ; mov esi,[cursor] |
313 | ; mov byte[esi],'_' |
313 | ; mov byte[esi],'_' |
314 | ; inc [cursor] |
314 | ; inc [cursor] |
315 | e_.again: |
315 | e_.again: |
316 | mov [ebp],edi |
316 | mov [ebp],edi |
317 | mov esi,[cursor] |
317 | mov esi,[cursor] |
318 | sub esi,edi |
318 | sub esi,edi |
319 | mov ecx,[pinfo.x_start] |
319 | mov ecx,[pinfo.box.left] |
320 | ; test ecx,ecx |
320 | ; test ecx,ecx |
321 | ; jnz .no0 |
321 | ; jnz .no0 |
322 | ; inc ecx |
322 | ; inc ecx |
323 | ; .no0: |
323 | ; .no0: |
324 | cmp ecx,esi |
324 | cmp ecx,esi |
325 | jbe e_.ok |
325 | jbe e_.ok |
326 | mov ecx,esi |
326 | mov ecx,esi |
327 | e_.ok: |
327 | e_.ok: |
328 | repne scasb |
328 | repne scasb |
329 | jecxz e_.nocrlf |
329 | jecxz e_.nocrlf |
330 | cmp byte[edi],10 |
330 | cmp byte[edi],10 |
331 | jne e_.nocrlf |
331 | jne e_.nocrlf |
332 | inc edi |
332 | inc edi |
333 | e_.nocrlf: |
333 | e_.nocrlf: |
334 | mov ecx,edi |
334 | mov ecx,edi |
335 | sub ecx,[ebp] |
335 | sub ecx,[ebp] |
336 | add ebp,8 |
336 | add ebp,8 |
337 | mov [ebp-4],ecx |
337 | mov [ebp-4],ecx |
338 | cmp edi,[cursor] |
338 | cmp edi,[cursor] |
339 | jb e_.again |
339 | jb e_.again |
340 | and dword[ebp],0 |
340 | and dword[ebp],0 |
341 | ; dpd esi |
341 | ; dpd esi |
342 | mov eax,[pinfo.y_start] |
342 | mov eax,[pinfo.box.top] |
343 | shl eax,3 |
343 | shl eax,3 |
344 | sub ebp,eax |
344 | sub ebp,eax |
345 | cmp ebp,os_work |
345 | cmp ebp,os_work |
346 | jae e_.ok2 |
346 | jae e_.ok2 |
347 | mov ebp,os_work |
347 | mov ebp,os_work |
348 | e_.ok2: |
348 | e_.ok2: |
349 | cmp ebp,[last_ebp] |
349 | cmp ebp,[last_ebp] |
350 | je e_.ok3 |
350 | je e_.ok3 |
351 | mov [last_ebp],ebp |
351 | mov [last_ebp],ebp |
352 | cmp byte[edi],10 |
352 | cmp byte[edi],10 |
353 | jne e_.ok3 |
353 | jne e_.ok3 |
354 | 354 | ||
355 | call erase_screen |
355 | call erase_screen |
356 | e_.ok3: |
356 | e_.ok3: |
357 | mov ebx,10 shl 16+30 |
357 | mov ebx,10 shl 16+30 |
358 | ; ud2 |
358 | ; ud2 |
359 | e_.newl: |
359 | e_.newl: |
360 | ; mcall 4,,0xffffff,[ebp],[ebp+4] |
360 | ; mcall 4,,0xffffff,[ebp],[ebp+4] |
361 | add ebp,8 |
361 | add ebp,8 |
362 | add ebx,ROWH |
362 | add ebx,ROWH |
363 | cmp dword[ebp],0 |
363 | cmp dword[ebp],0 |
364 | jnz e_.newl |
364 | jnz e_.newl |
365 | SUB ebx,ROWH |
365 | SUB ebx,ROWH |
366 | mcall 4,,0x00ffffff,[ebp-8],[ebp+4-8] |
366 | mcall 4,,0x00ffffff,[ebp-8],[ebp+4-8] |
367 | call set_cur |
367 | call set_cur |
368 | popa |
368 | popa |
369 | e_.ex: |
369 | e_.ex: |
370 | ret |
370 | ret |
371 | 371 | ||
372 | 372 | ||
373 | AHEADER 0,"?KEY",cfa_queKEY |
373 | AHEADER 0,"?KEY",cfa_queKEY |
374 | PUSH EDI |
374 | PUSH EDI |
375 | XCHG EBP,ESP |
375 | XCHG EBP,ESP |
376 | PUSH EAX |
376 | PUSH EAX |
377 | POP EBX |
377 | POP EBX |
378 | mov eax,10 |
378 | mov eax,10 |
379 | test ebx,ebx |
379 | test ebx,ebx |
380 | jz QRX0 |
380 | jz QRX0 |
381 | inc eax |
381 | inc eax |
382 | QRX0: |
382 | QRX0: |
383 | XOR ECX,ECX ;EBX=0 setup for false flag |
383 | XOR ECX,ECX ;EBX=0 setup for false flag |
384 | mcall |
384 | mcall |
385 | cmp eax,1 |
385 | cmp eax,1 |
386 | jne QRX_ |
386 | jne QRX_ |
387 | call draw_window |
387 | call draw_window |
388 | call calc_lines |
388 | call calc_lines |
389 | QRX_: |
389 | QRX_: |
390 | cmp eax,3 |
390 | cmp eax,3 |
391 | je BYE |
391 | je BYE |
392 | cmp eax,2 |
392 | cmp eax,2 |
393 | jne QRX3 |
393 | jne QRX3 |
394 | 394 | ||
395 | mcall 2 |
395 | mcall 2 |
396 | QRX1: MOVZX ECX,AH |
396 | QRX1: MOVZX ECX,AH |
397 | QRX2: PUSH ECX ;save character |
397 | QRX2: PUSH ECX ;save character |
398 | QRX_TRUE: |
398 | QRX_TRUE: |
399 | MOV ECX,TRUEE ;true flag |
399 | MOV ECX,TRUEE ;true flag |
400 | QRX3: PUSH ECX |
400 | QRX3: PUSH ECX |
401 | POP eax |
401 | POP eax |
402 | XCHG EBP,ESP |
402 | XCHG EBP,ESP |
403 | POP EDI |
403 | POP EDI |
404 | ret |
404 | ret |
405 | 405 | ||
406 | ; ?RX ( -- c T | F ) |
406 | ; ?RX ( -- c T | F ) |
407 | ; Return input character and true, or a false if no input. |
407 | ; Return input character and true, or a false if no input. |
408 | 408 | ||
409 | 409 | ||
410 | AHEADER 0,"EMIT_N",cfa_EMIT_N |
410 | AHEADER 0,"EMIT_N",cfa_EMIT_N |
411 | 411 | ||
412 | PUSH EDI |
412 | PUSH EDI |
413 | XCHG EBP,ESP |
413 | XCHG EBP,ESP |
414 | ;char in AL |
414 | ;char in AL |
415 | CMP AL,0FFH ;0FFH is interpreted as input |
415 | CMP AL,0FFH ;0FFH is interpreted as input |
416 | JNZ TX2 ;do NOT allow input |
416 | JNZ TX2 ;do NOT allow input |
417 | MOV AL,32 ;change to blank |
417 | MOV AL,32 ;change to blank |
418 | TX2: |
418 | TX2: |
419 | mov ebx,[cursor] |
419 | mov ebx,[cursor] |
420 | mov [ebx],AL |
420 | mov [ebx],AL |
421 | inc [cursor] |
421 | inc [cursor] |
422 | 422 | ||
423 | POP eax |
423 | POP eax |
424 | XCHG EBP,ESP |
424 | XCHG EBP,ESP |
425 | POP EDI |
425 | POP EDI |
426 | RET |
426 | RET |
427 | 427 | ||
428 | 428 | ||
429 | ;; Basic I/O |
429 | ;; Basic I/O |
430 | 430 | ||
431 | cfa_AHEADER 0,'CL_CUR',CL_CUR |
431 | cfa_AHEADER 0,'CL_CUR',CL_CUR |
432 | PUSH EAX |
432 | PUSH EAX |
433 | mcall 38,[lastcur+4],[lastcur],0 |
433 | mcall 38,[lastcur+4],[lastcur],0 |
434 | POP EAX |
434 | POP EAX |
435 | RET |
435 | RET |
436 | 436 | ||
437 | cfa_AHEADER 0,'DR_CUR',DR_CUR |
437 | cfa_AHEADER 0,'DR_CUR',DR_CUR |
438 | PUSH EAX |
438 | PUSH EAX |
439 | mcall 38,[lastcur+4],[lastcur],0x00FF00FF |
439 | mcall 38,[lastcur+4],[lastcur],0x00FF00FF |
440 | POP EAX |
440 | POP EAX |
441 | RET |
441 | RET |
442 | 442 | ||
443 | 443 | ||
444 | COLOR_ORDER equ MENUETOS |
444 | COLOR_ORDER equ MENUETOS |
445 | include 'gif_lite.inc' |
445 | include 'gif_lite.inc' |
446 | 446 | ||
447 | cfa_AHEADER 0,'READ_GIF',READ_GIF ;( gif_ptr, out_ptr -- result ) |
447 | cfa_AHEADER 0,'READ_GIF',READ_GIF ;( gif_ptr, out_ptr -- result ) |
448 | push esi |
448 | push esi |
449 | push edi |
449 | push edi |
450 | push ebp |
450 | push ebp |
451 | mov edi, eax |
451 | mov edi, eax |
452 | mov esi,[ebp] |
452 | mov esi,[ebp] |
453 | mov eax,os_work |
453 | mov eax,os_work |
454 | call ReadGIF |
454 | call ReadGIF |
455 | pop ebp |
455 | pop ebp |
456 | pop edi |
456 | pop edi |
457 | pop esi |
457 | pop esi |
458 | add ebp,4 |
458 | add ebp,4 |
459 | RET |
459 | RET |
460 | 460 | ||
461 | ;=============================================================== |
461 | ;=============================================================== |
462 | cursor dd screen_buf |
462 | cursor dd screen_buf |
463 | fRed dd 1 |
463 | fRed dd 1 |
464 | last_ebp dd 0 |
464 | last_ebp dd 0 |
465 | 465 | ||
466 | include 'amain.asm' |
466 | include 'amain.asm' |
467 | 467 | ||
468 | header db 'Kolibri Forth v12.1',0 |
468 | header db 'Kolibri Forth v12.1',0 |
469 | params: rb 256 |
469 | params: rb 256 |
470 | cur_dir_path: rb 4096 |
470 | cur_dir_path: rb 4096 |
471 | 471 | ||
472 | 472 | ||
473 | FINFO: |
473 | FINFO: |
474 | .mode dd 0 |
474 | .mode dd 0 |
475 | dd 0 |
475 | dd 0 |
476 | .blk dd 1 |
476 | .blk dd 1 |
477 | .buf dd 0 |
477 | .buf dd 0 |
478 | .work dd os_work |
478 | .work dd os_work |
479 | 479 | ||
480 | 480 | ||
481 | lastcur dd 0,0 |
481 | lastcur dd 0,0 |
482 | 482 | ||
483 | I_END: |
483 | I_END: |
484 | squote_buf rb 1024 |
484 | squote_buf rb 1024 |
485 | sys_v rd 6 |
485 | sys_v rd 6 |
486 | screen_buf: |
486 | screen_buf: |
487 | ; sc_end: |
487 | ; sc_end: |
488 | rb 4096 |
488 | rb 4096 |
489 | pinfo process_information |
489 | pinfo process_information |
490 | os_work rb 16*1024 |
490 | os_work rb 16*1024 |
491 | 491 | ||
492 | CTOP = $ ;next available memory in code dictionary |
492 | CTOP = $ ;next available memory in code dictionary |
493 | ;=============================================================0,FW_HEIGHT>0,FW_WIDTH>>> |
493 | ;=============================================================0,FW_HEIGHT>0,FW_WIDTH>>> |