Rev 4868 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4867 | leency | 1 | ; KolSPForth v12 |
2 | |||
3 | SYSTEM equ EMUL |
||
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 | |||
89 | ;; Main entry points and COLD start data |
||
90 | |||
91 | use32 |
||
92 | |||
93 | org 0x0 |
||
94 | |||
95 | db 'MENUET01' ; 8 byte id |
||
96 | dd 0x01 ; header version |
||
97 | dd ORIG ; start of code |
||
98 | dd I_END ; size of image |
||
99 | MEMS: dd EM ; memory for app |
||
100 | dd SPP ; esp |
||
101 | if SYSTEM eq MEOS |
||
102 | dd FINFO.path |
||
103 | else |
||
104 | dd 0 |
||
105 | end if |
||
106 | dd 0x0 ; I_Param , I_Icon |
||
107 | |||
108 | lang fix ru |
||
109 | include 'MACROS.INC' |
||
110 | include "proc32.inc" |
||
111 | |||
112 | align 4 |
||
113 | proc strncmp stdcall, s1:dword, s2:dword, n:dword |
||
114 | |||
115 | push esi |
||
116 | push edi |
||
117 | mov ecx, [n] |
||
118 | test ecx, ecx ; Max length is zero? |
||
119 | je .done |
||
120 | |||
121 | mov esi, [s1] ; esi = string s1 |
||
122 | mov edi, [s2] ; edi = string s2 |
||
123 | cld |
||
124 | .compare: |
||
125 | cmpsb ; Compare two bytes |
||
126 | jne .done |
||
127 | cmp byte [esi-1], 0 ; End of string? |
||
128 | je .done |
||
129 | dec ecx ; Length limit reached? |
||
130 | jne .compare |
||
131 | .done: |
||
132 | seta al ; al = (s1 > s2) |
||
133 | setb ah ; ah = (s1 < s2) |
||
134 | sub al, ah |
||
135 | movsx eax, al ; eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1 |
||
136 | pop edi |
||
137 | pop esi |
||
138 | ret |
||
139 | endp |
||
140 | |||
141 | align 4 |
||
142 | proc GetPr stdcall, exp:dword, sz_name:dword |
||
143 | mov edx, [exp] |
||
144 | .next: |
||
145 | push edx |
||
146 | stdcall strncmp, edx, [sz_name], 16 |
||
147 | pop edx |
||
148 | test eax, eax |
||
149 | jz .ok |
||
150 | mov edx, [edx-4] |
||
151 | test edx, edx |
||
152 | jnz .next |
||
153 | mov eax,edx |
||
154 | ret |
||
155 | .ok: |
||
156 | mov eax, [edx-8] |
||
157 | ret |
||
158 | endp |
||
159 | |||
160 | AHEADER 0 ,'GETPR',cfa_GETPR |
||
161 | JMP GetPr |
||
162 | |||
163 | |||
164 | ORIG: |
||
165 | |||
166 | MOV EBP,RPP ;initialize RP |
||
167 | CLD ;ESI gets incremented |
||
168 | finit |
||
169 | call draw_window |
||
170 | call calc_lines |
||
171 | XCHG ESP,EBP |
||
172 | CALL amain |
||
173 | BYE: mcall -1 |
||
174 | |||
175 | |||
176 | ULAST: ; DD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
||
177 | |||
178 | |||
179 | draw_cursor: |
||
180 | |||
181 | draw_window: |
||
182 | pusha |
||
183 | mcall 12,1 |
||
184 | mov [fRed],ebx |
||
185 | mcall 0, <0,FW_WIDTH>, <0,FW_HEIGHT>, 0x03000000, 0x805080D0, 0x005080D0 |
||
186 | mcall 4, <8,8>, 0x10DDEEFF, header, header.size |
||
187 | |||
188 | mcall 9,pinfo,-1 |
||
189 | mov eax,[pinfo.x_size] |
||
190 | cdq |
||
191 | sub eax,20 |
||
192 | mov ebx,6 |
||
193 | div ebx |
||
194 | mov [pinfo.x_start],eax |
||
195 | |||
196 | mov eax,[pinfo.y_size] |
||
197 | cdq |
||
198 | sub eax,40 |
||
199 | mov ebx,ROWH |
||
200 | div ebx |
||
201 | |||
202 | mov [pinfo.y_start],eax |
||
203 | call erase_screen |
||
204 | mcall 12, 2 |
||
205 | if ~ SYSTEM eq EMUL |
||
206 | mcall 67,-1,-1,FW_WIDTH,FW_HEIGHT |
||
207 | end if |
||
208 | popa |
||
209 | ret |
||
210 | |||
211 | lsz header,\ |
||
212 | ru,'”®àâ ¤«ï MenuetOS (SPF)',\ |
||
213 | en,'EXAMPLE APPLICATION',\ |
||
214 | fr,"L'exemplaire programme" |
||
215 | |||
216 | erase_screen: |
||
217 | mov ebx,[pinfo.x_size] |
||
218 | add ebx,10 shl 16-20 |
||
219 | mov ecx,[pinfo.y_size] |
||
220 | add ecx,30 shl 16-35 |
||
221 | mcall 13,,,0;xff |
||
222 | ret |
||
223 | |||
224 | |||
225 | AHEADER 0,"CC_LINES",cfa_CC_LINES |
||
226 | calc_lines: |
||
227 | cmp dword[UPP+10*4],0 |
||
228 | je .ex |
||
229 | pusha |
||
230 | mov ebp,os_work |
||
231 | mov al,0xd |
||
232 | mov edi,screen_buf |
||
233 | ; mov esi,[cursor] |
||
234 | ; mov byte[esi],'_' |
||
235 | ; inc [cursor] |
||
236 | .again: |
||
237 | mov [ebp],edi |
||
238 | mov esi,[cursor] |
||
239 | sub esi,edi |
||
240 | mov ecx,[pinfo.x_start] |
||
241 | ; test ecx,ecx |
||
242 | ; jnz .no0 |
||
243 | ; inc ecx |
||
244 | ; .no0: |
||
245 | cmp ecx,esi |
||
246 | jbe .ok |
||
247 | mov ecx,esi |
||
248 | .ok: |
||
249 | repne scasb |
||
250 | jecxz .nocrlf |
||
251 | cmp byte[edi],10 |
||
252 | jne .nocrlf |
||
253 | inc edi |
||
254 | .nocrlf: |
||
255 | mov ecx,edi |
||
256 | sub ecx,[ebp] |
||
257 | add ebp,8 |
||
258 | mov [ebp-4],ecx |
||
259 | cmp edi,[cursor] |
||
260 | jb .again |
||
261 | and dword[ebp],0 |
||
262 | ; dpd esi |
||
263 | mov eax,[pinfo.y_start] |
||
264 | shl eax,3 |
||
265 | sub ebp,eax |
||
266 | cmp ebp,os_work |
||
267 | jae .ok2 |
||
268 | mov ebp,os_work |
||
269 | .ok2: |
||
270 | cmp ebp,[last_ebp] |
||
271 | je .ok3 |
||
272 | mov [last_ebp],ebp |
||
273 | call erase_screen |
||
274 | .ok3: |
||
275 | mov ebx,10 shl 16 +30 |
||
276 | ; ud2 |
||
277 | .newl: |
||
278 | mcall 4,,0xffffff,[ebp],[ebp+4] |
||
279 | add ebp,8 |
||
280 | add ebx,ROWH |
||
281 | cmp dword[ebp],0 |
||
282 | jnz .newl |
||
283 | SUB ebx,ROWH |
||
284 | call set_cur |
||
285 | popa |
||
286 | .ex: |
||
287 | ret |
||
288 | |||
289 | |||
290 | set_cur: |
||
291 | MOV ecx,EBX |
||
292 | shl ecx,16 |
||
293 | add ecx,EBX |
||
294 | MOV EAX,[ebp+4-8] |
||
295 | add EAX,2 |
||
296 | imul EAX,6 |
||
297 | mov EBX,EAX |
||
298 | shl ebx,16 |
||
299 | add EBX,EAX |
||
300 | mov [lastcur],ecx |
||
301 | mov [lastcur+4],ebx |
||
302 | ret |
||
303 | |||
304 | e_calc_lines: |
||
305 | cmp dword[UPP+10*4],0 |
||
306 | je e_.ex |
||
307 | pusha |
||
308 | mov ebp,os_work |
||
309 | mov al,0xd |
||
310 | mov edi,screen_buf |
||
311 | ; mov esi,[cursor] |
||
312 | ; mov byte[esi],'_' |
||
313 | ; inc [cursor] |
||
314 | e_.again: |
||
315 | mov [ebp],edi |
||
316 | mov esi,[cursor] |
||
317 | sub esi,edi |
||
318 | mov ecx,[pinfo.x_start] |
||
319 | ; test ecx,ecx |
||
320 | ; jnz .no0 |
||
321 | ; inc ecx |
||
322 | ; .no0: |
||
323 | cmp ecx,esi |
||
324 | jbe e_.ok |
||
325 | mov ecx,esi |
||
326 | e_.ok: |
||
327 | repne scasb |
||
328 | jecxz e_.nocrlf |
||
329 | cmp byte[edi],10 |
||
330 | jne e_.nocrlf |
||
331 | inc edi |
||
332 | e_.nocrlf: |
||
333 | mov ecx,edi |
||
334 | sub ecx,[ebp] |
||
335 | add ebp,8 |
||
336 | mov [ebp-4],ecx |
||
337 | cmp edi,[cursor] |
||
338 | jb e_.again |
||
339 | and dword[ebp],0 |
||
340 | ; dpd esi |
||
341 | mov eax,[pinfo.y_start] |
||
342 | shl eax,3 |
||
343 | sub ebp,eax |
||
344 | cmp ebp,os_work |
||
345 | jae e_.ok2 |
||
346 | mov ebp,os_work |
||
347 | e_.ok2: |
||
348 | cmp ebp,[last_ebp] |
||
349 | je e_.ok3 |
||
350 | mov [last_ebp],ebp |
||
351 | cmp byte[edi],10 |
||
352 | jne e_.ok3 |
||
353 | |||
354 | call erase_screen |
||
355 | e_.ok3: |
||
356 | mov ebx,10 shl 16+30 |
||
357 | ; ud2 |
||
358 | e_.newl: |
||
359 | ; mcall 4,,0xffffff,[ebp],[ebp+4] |
||
360 | add ebp,8 |
||
361 | add ebx,ROWH |
||
362 | cmp dword[ebp],0 |
||
363 | jnz e_.newl |
||
364 | SUB ebx,ROWH |
||
365 | mcall 4,,0x00ffffff,[ebp-8],[ebp+4-8] |
||
366 | call set_cur |
||
367 | popa |
||
368 | e_.ex: |
||
369 | ret |
||
370 | |||
371 | |||
372 | AHEADER 0,"?KEY",cfa_queKEY |
||
373 | PUSH EDI |
||
374 | XCHG EBP,ESP |
||
375 | PUSH EAX |
||
376 | POP EBX |
||
377 | mov eax,10 |
||
378 | test ebx,ebx |
||
379 | jz QRX0 |
||
380 | inc eax |
||
381 | QRX0: |
||
382 | XOR ECX,ECX ;EBX=0 setup for false flag |
||
383 | mcall |
||
384 | cmp eax,1 |
||
385 | jne QRX_ |
||
386 | call draw_window |
||
387 | call calc_lines |
||
388 | QRX_: |
||
389 | cmp eax,3 |
||
390 | je BYE |
||
391 | cmp eax,2 |
||
392 | jne QRX3 |
||
393 | |||
394 | mcall 2 |
||
395 | QRX1: MOVZX ECX,AH |
||
396 | QRX2: PUSH ECX ;save character |
||
397 | QRX_TRUE: |
||
398 | MOV ECX,TRUEE ;true flag |
||
399 | QRX3: PUSH ECX |
||
400 | POP eax |
||
401 | XCHG EBP,ESP |
||
402 | POP EDI |
||
403 | ret |
||
404 | |||
405 | ; ?RX ( -- c T | F ) |
||
406 | ; Return input character and true, or a false if no input. |
||
407 | |||
408 | |||
409 | AHEADER 0,"EMIT_N",cfa_EMIT_N |
||
410 | |||
411 | PUSH EDI |
||
412 | XCHG EBP,ESP |
||
413 | ;char in AL |
||
414 | CMP AL,0FFH ;0FFH is interpreted as input |
||
415 | JNZ TX2 ;do NOT allow input |
||
416 | MOV AL,32 ;change to blank |
||
417 | TX2: |
||
418 | mov ebx,[cursor] |
||
419 | mov [ebx],AL |
||
420 | inc [cursor] |
||
421 | |||
422 | POP eax |
||
423 | XCHG EBP,ESP |
||
424 | POP EDI |
||
425 | RET |
||
426 | |||
427 | |||
428 | ;; Basic I/O |
||
429 | |||
430 | cfa_AHEADER 0,'CL_CUR',CL_CUR |
||
431 | PUSH EAX |
||
432 | mcall 38,[lastcur+4],[lastcur],0 |
||
433 | POP EAX |
||
434 | RET |
||
435 | |||
436 | cfa_AHEADER 0,'DR_CUR',DR_CUR |
||
437 | PUSH EAX |
||
438 | mcall 38,[lastcur+4],[lastcur],0x00FF00FF |
||
439 | POP EAX |
||
440 | RET |
||
441 | |||
442 | |||
443 | COLOR_ORDER equ MENUETOS |
||
444 | include 'gif_lite.inc' |
||
445 | |||
446 | cfa_AHEADER 0,'READ_GIF',READ_GIF ;( gif_ptr, out_ptr -- result ) |
||
447 | push esi |
||
448 | push edi |
||
449 | push ebp |
||
450 | mov edi, eax |
||
451 | mov esi,[ebp] |
||
452 | mov eax,os_work |
||
453 | call ReadGIF |
||
454 | pop ebp |
||
455 | pop edi |
||
456 | pop esi |
||
457 | add ebp,4 |
||
458 | RET |
||
459 | |||
460 | ;=============================================================== |
||
461 | cursor dd screen_buf |
||
462 | fRed dd 1 |
||
463 | last_ebp dd 0 |
||
464 | |||
465 | include 'amain.asm' |
||
466 | |||
467 | FINFO: |
||
468 | .mode dd 0 |
||
469 | dd 0 |
||
470 | .blk dd 1 |
||
471 | .buf dd 0 |
||
472 | .work dd os_work |
||
473 | .path: |
||
474 | if SYSTEM eq MEOS |
||
475 | ; .path db 0 |
||
476 | ; .path db '/HD/1/FORTH/AUTORUN.DAT',0 |
||
477 | ; db '/RD/1/AUTOLOAD.F' |
||
478 | else |
||
479 | db '/RD/1/AUTOLOAD.F' |
||
480 | ; db '/RD/1/EXAMPLE.F' |
||
481 | ; db '/RD/1/PICTURE.F' |
||
482 | ; db '/RD/1/AUTORUN.DAT' |
||
483 | ; db '/HD/1/FORTH/AUTORUN.DAT' |
||
484 | end if |
||
485 | db 0 |
||
486 | .end_path: |
||
487 | |||
488 | |||
489 | rb 256-($-.path) |
||
490 | |||
491 | |||
492 | lastcur dd 0,0 |
||
493 | |||
494 | I_END: |
||
495 | squote_buf rb 1024 |
||
496 | sys_v rd 6 |
||
497 | screen_buf: |
||
498 | ; sc_end: |
||
499 | rb 4096 |
||
500 | pinfo process_information |
||
501 | os_work rb 16*1024 |
||
502 | |||
503 | CTOP = $ ;next available memory in code dictionary |
||
504 | ;=============================================================8,8>0,FW_HEIGHT>0,FW_WIDTH>>> |