Subversion Repositories Kolibri OS

Rev

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
   ;=============================================================