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