Subversion Repositories Kolibri OS

Rev

Rev 109 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
;   RTF READER FOR MENUET v1.
2
;   Written in pure assembler by Ivushkin Andrey aka Willow
3
;
4
;---------------------------------------------------------------------
5
M64 equ 64*1024
6
N_A equ 0x412f4e
7
RTFSIZE equ M64
8
RTFSTACKSIZE equ M64
9
BGIFONTSIZE equ 120*1024
10
ESPSIZE equ M64
11
LMARGIN equ 20
12
CHARW equ 6
13
CHARH equ 11
14
WINW  equ 600
15
WINH  equ 450
16
WIN_COLOR equ 0x3f0f0f0
17
DEFCOLOR equ 0x303030
18
;RENDER equ PIX
19
;RENDER equ BGI
20
RENDER equ FREE
21
 
22
BGIFONT_PATH equ '/rd/1/'
23
FONT_NAME equ 'LITT'
24
TOP =35
25
MODE equ RTF
26
INVALHEX equ 0
27
RTF_COLORLESS equ 1
28
RTF_ALIGNLESS equ 2
29
RTF_NO1STLINE equ 4
30
RTF_OPENING   equ 8
31
RTF_HELP      equ 16
32
RTF_VALID     equ 32
33
RTF_BLIND     equ 64
34
RTF_TOEOF     equ 128
35
RTF_BOTTOM    equ 256
36
STEPBYSTEP equ 10
37
DEBUG_BLOCK equ 10
38
SHOWALIGN equ 10
39
GUTTER equ 10
40
BENCH  equ 0;1
41
syms equ 12
42
 
43
  use32 	     ; включить 32-битный режим ассемблера
44
  org	 0x0	     ; адресация с нуля
45
 
46
  db	 'MENUET01'  ; 8-байтный идентификатор MenuetOS
47
  dd	 0x01	     ; версия заголовка (всегда 1)
48
  dd	 START	     ; адрес первой команды
49
  dd	 I_END0      ; размер программы
50
  dd	 esp_end     ; количество памяти
51
  dd	 sys_mem     ; адрес вершины стэка
52
  dd	 fname_buf   ; адрес буфера для параметров (не используется)
53
  dd	 0x0	     ; зарезервировано
54
 
55
include 'lang.inc'
56
include 'macros.inc' ; макросы облегчают жизнь ассемблерщиков!
57
include 'debug.inc'
58
if ~ RENDER eq PIX
59
  TOP=TOP+4
60
  include 'bgifont.inc'
61
end if
62
include 'rtf_lite.inc'
63
include 'ascl.inc'
64
;---------------------------------------------------------------------
65
;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
66
;---------------------------------------------------------------------
67
help_file:
68
file  'reader.rtf'
69
help_end:
70
 
71
START:
72
    mov  [pitch],2
73
  if ~ RENDER eq PIX
74
    mov  edx,FONT_NAME
75
    mov  edi,save_limit
76
    BGIfont_Prepare
77
  end if
78
 start2:
79
    cmp  byte[fname_buf],0
80
    je	 load_file;top_red
81
    jmp  noactivate
82
 prep_load:
83
;    mcall 18,3,dword[prcinfo+30]
84
 noactivate:
85
;    and  ebp,not RTF_OPENING
86
;    and  ebp,not RTF_HELP
87
 
88
;    and  [mode],not RTF_OPENING
89
    and  [mode],not (RTF_HELP+RTF_OPENING)
90
    mov  ecx,16
91
    mov  edi,fileinfo.name
92
    mov  esi,fname_buf
93
    rep  movsd
94
 load_file:
95
    xor  eax,eax
96
    mov  ebx,fileinfo
97
    mov  [ebx+4],eax
98
    inc  eax
99
    mov  [fileinfo.size],eax
100
    mcall 58
101
    dpd  ebx
102
    and  [wSave],0
103
    mov  [HClick],-100
104
 load_help:
105
    test eax,eax
106
    jz	 .sizok
107
    cmp  eax,5
108
    je	 .sizok
109
  .nosizok:
110
    mov  dword[fileinfo.name],N_A
111
  .sizok:
112
    mov  eax,ebx
113
    and  eax,RTFSIZE-1
114
    add  eax,I_END
115
    mov  [tail],eax
116
    shr  ebx,16
117
;    dpd ebx
118
    mov  [max_block],ebx
119
    xor  eax,eax
120
    mov  ecx,256
121
    mov  edi,fileinfo.name
122
    repne scasb
123
    sub  edi,fileinfo.name+1
124
    mov  [fname_size],edi
125
top_red:
126
    mov  [top],TOP
127
red:			; перерисовать окно
128
 
129
    call draw_window	; вызываем процедуру отрисовки окна
130
 
131
;---------------------------------------------------------------------
132
;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
133
;---------------------------------------------------------------------
134
 
135
still:
136
    mcall 10		; функция 10 - ждать события
137
 
138
    cmp  eax,1		; перерисовать окно ?
139
    je	 red		; если да - на метку red
140
    cmp  eax,3		; нажата кнопка ?
141
    je	 button 	; если да - на button
142
    cmp  eax,2		; нажата клавиша ?
143
    je	 key		; если да - на key
144
 
145
    jmp  still		; если другое событие - в начало цикла
146
 
147
 
148
;---------------------------------------------------------------------
149
 
150
 
151
  key:			; нажата клавиша на клавиатуре
152
    mcall 2		; функция 2 - считать код символа (в ah)
153
    cmp  ah,104 	; HELP
154
    jne  .nohelp
155
  .help:
156
    xor  [mode],RTF_HELP
157
    test [mode],RTF_HELP
158
    jz	 load_file
159
    mov  ecx,help_end-help_file
160
    mov  [block_end],ecx
161
    add  [block_end],I_END
162
    mov  [tail],ecx
163
    add  [tail],I_END
164
    mov  esi,help_file
165
    mov  edi,I_END
166
    rep  movsb
167
;    or   [mode],RTF_HELP
168
    xor  eax,eax
169
    mov  [max_block],eax
170
    jmp  top_red
171
  .nohelp:
172
;    test [mode],RTF_HELP
173
;    jz   .nohelp2
174
;    and  [mode],not RTF_HELP
175
;    cmp  dword[fileinfo.name],N_A
176
;    je   still
177
;    jmp  prep_load
178
  .nohelp2:
179
    cmp  ah,114 	; R - redraw
180
    je	 red
181
    cmp  ah,99		; C - color
182
    jne  .nocolor
183
  .color:
184
    xor  [mode],RTF_COLORLESS
185
    jmp  red
186
  .nocolor:
187
    cmp  ah,97		; A - alignment
188
    jne  .noalign
189
  .alignment:
190
    xor  [mode],RTF_ALIGNLESS
191
    jmp  red
192
  .noalign:
193
    cmp  ah,44		; < - pitch dec
194
    jne  .nopd
195
  .decp:
196
    dec  [pitch]
197
    jmp  red
198
  .nopd:
199
    cmp  ah,46		; < - pitch inc
200
    jne  .nopi
201
  .incp:
202
    inc  [pitch]
203
    jmp  red
204
  .nopi:
205
    cmp  ah,180 	; Home
206
    je	 top_red
207
    mov  ebx,dword[prcinfo+46]
208
    sub  ebx,TOP+15
209
    cmp  ah,183 ;PgDn
210
    jne  .nopgdn
211
    sub  [top],bx
212
    jmp  red
213
  .nopgdn:
214
    cmp  ah,177 ;arrDn
215
    jne  .noardn
216
    sub  [top],CHARH
217
    jmp  red
218
  .noardn:
219
    mov  cx,[top]
220
    cmp  ah,184 ;PgUp
221
    jne  .nopgup
222
    add  [top],bx
223
    cmp  [top],TOP
224
    jl	 red
225
    mov  [top],TOP
226
    cmp  cx,[top]
227
    je	 still
228
    jmp  red
229
  .nopgup:
230
    cmp  ah,178 ;arrUp
231
    jne  .noarup
232
    add  [top],CHARH
233
    cmp  [top],TOP
234
    jl	 red
235
    mov  [top],TOP
236
    cmp  cx,[top]
237
    je	 still
238
    jmp  red
239
  .noarup:
240
  if  RENDER eq FREE
241
    cmp  ah,56 ;zoom+
242
    jne  .noplus
243
  .zplus:
244
    fld  [FreeFontscale]
245
    fmul [Zoomscale]
246
  .zoom:
247
    fstp [FreeFontscale]
248
    jmp  red
249
  .noplus:
250
    cmp  ah,54 ;zoom-
251
    jne  .nominus
252
  .zminus:
253
    fld  [FreeFontscale]
254
    fdiv [Zoomscale]
255
    jmp  .zoom
256
  .nominus:
257
  end if
258
    cmp  ah,108 	; L - load
259
    jne  stilld
260
  .file_open:
261
    or	 [mode],RTF_OPENING
262
    opendialog draw_window, prep_load, st_1, fname_buf
263
  st_1:
264
    and  [mode],not RTF_OPENING
265
    jmp  still;red
266
  stilld:
267
    jmp  still
268
 
269
;---------------------------------------------------------------------
270
 
271
  button:
272
    mcall 17		; 17 - получить идентификатор нажатой кнопки
273
    cmp   ah,2
274
    je	  key.help
275
    cmp   ah,3
276
    je	  key.color
277
    cmp   ah,4
278
    je	  key.alignment
279
    cmp   ah,5
280
    je	  key.file_open
281
    cmp   ah,6
282
    je	  key.incp
283
    cmp   ah,7
284
    je	  key.decp
285
  if RENDER eq FREE
286
    cmp   ah,8
287
    je	  key.zminus
288
    cmp   ah,9
289
    je	  key.zplus
290
  end if
291
    cmp   ah, 1 	; если НЕ нажата кнопка с номером 1,
292
    jne   .noexit	;  вернуться
293
 
294
  .exit:
295
    mcall -1		; иначе конец программы
296
  .noexit:
297
    cmp   ah,20
298
    jne   still
299
    mcall 37,1
300
    and   eax,0xffff
301
    cmp   eax,[HClick]
302
    je	  still
303
    mov   [HClick],eax
304
    sub   eax,25
305
    mul   [HDoc]
306
    mov   ebx,dword[prcinfo+46]
307
    sub   ebx,25
308
    div   ebx
309
    dpd   eax
310
    mov   [top],TOP
311
    sub   [top],ax
312
    dps   'B'
313
    jmp   red;still
314
;---------------------------------------------------------------------
315
;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
316
;---------------------------------------------------------------------
317
 
318
draw_window:
319
 
320
    mcall 12, 1 		   ; функция 12: сообщить ОС об отрисовке окна
321
				   ; 1 - начинаем рисовать
322
    mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x805080D0, 0x005080D0
323
    mcall 9,procinfo,-1
324
    mov   eax,[procinfo.x_size]
325
    cmp   eax,1
326
    ja	  .temp12345
327
    ret
328
  .temp12345:
329
 
330
    mcall 4, <8,8>, 0x10DDEEFF, header, headersize-header
331
    mov  esi,ecx
332
    mcall 47,0x30000,isymImplemented,<114,8>
333
    add  edx,36 shl 16
334
    mcall ,,isymMax
335
    add  edx,40 shl 16
336
    mov  esi,0x104e00e7;0x10f27840
337
    cmp  dword[fileinfo.name],N_A
338
    jne  .noNA
339
    mov  esi,0x10ff0000
340
  .noNA:
341
    mcall 4,edx,esi,fileinfo.name,[fname_size]
342
    mov  edi,prcinfo
343
    mcall 9,edi,-1
344
    and  [mode],not RTF_TOEOF
345
    mov  ebx,[edi+42]
346
    cmp  ebx,[wSave]
347
    je	 .nochg
348
  .chg:
349
    mov  [wSave],ebx
350
    or	 [mode],RTF_TOEOF
351
    and  [HDoc],0
352
    and  [line_count],0
353
    mov  [HClick],-100
354
  .nochg:
355
    sub  ebx,60
356
    shl  ebx,16
357
    mov  bx,12
358
    mov  ecx,5 shl 16+12
359
    mov  esi,0xb810e7
360
    mov  edx,2
361
 BTN_SPACE equ 14 shl 16
362
    mcall 8		;2
363
    sub  ebx,BTN_SPACE
364
    inc  edx
365
    mcall 8,,,,0x459a	 ;3
366
    sub  ebx,BTN_SPACE
367
    inc  edx
368
    mcall ,,,,0x107a30	;4
369
    sub  ebx,BTN_SPACE
370
    inc  edx
371
    mcall ,,,,0xcc0000	;5
372
    sub  ebx,BTN_SPACE
373
    inc  edx
374
    mcall ,,,,0x575f8c	;6
375
    sub  ebx,BTN_SPACE
376
    inc  edx
377
    mcall ,,,,0x575f8c	;7
378
  if RENDER eq FREE
379
    sub  ebx,BTN_SPACE
380
    inc  edx
381
    mcall ,,,,0x6a73d0	;8
382
    sub  ebx,BTN_SPACE
383
    inc  edx
384
    mcall ,,,,0xd048c8	;9
385
  end if
386
    shr  ecx,16
387
    mov  bx,cx
388
    add  ebx,3 shl 16+3
389
    mcall 4,,0x10ddeeff,btn_text,btn_end-btn_text
390
    sub  dword[prcinfo+42],LMARGIN
391
    sub  dword[prcinfo+46],CHARH
392
 if GUTTER eq 1
393
    mov  ebx,LMARGIN shl 16+20
394
    mov  ecx,20
395
    mov  eax,4
396
    mov  edx,arrow
397
    mov  esi,1
398
  .loop1:
399
    push ecx
400
    mcall ,,0xff0000
401
    pop  ecx
402
    add  ebx,50 shl 16
403
    loop .loop1
404
 end if
405
    mov  ebx,dword[prcinfo+42]
406
    shl  ebx,16
407
    add  ebx,7 shl 16+7
408
    mov  ecx,dword[prcinfo+46]
409
    add  ecx,25 shl 16-25
410
    mov  edx,20+1 shl 29
411
    mcall 8
412
    mov  ecx,[HClick]
413
    shl  ecx,16
414
    add  ecx,6-3 shl 16
415
    mcall 13,,,0xe26830
416
 if MODE eq RTF
417
    test [mode],RTF_OPENING
418
    jne  .ex
419
    and  [mode],not (RTF_BOTTOM);+RTF_TOEOF)
420
    mov  [colorptr],colortbl
421
    mov  eax,DEFCOLOR
422
    mov  edi,colortbl
423
    mov  ecx,16
424
    rep  stosd
425
    xor  eax,eax
426
    mov  [cGroup],eax
427
    mov  edi,Chp
428
    mov  ecx,SIZE_save
429
    rep  stosb
430
    mov  ax,[top]
431
    mov  word[Free+6],10
432
    mov  word[Free+4],ax
433
    mov  esi,I_END
434
    call RtfParse
435
    dpd  eax
436
    dps  'Lines='
437
    mov  eax,[line_count]
438
    dpd  eax
439
    newline
440
;    movzx  eax,word[Free+4]
441
;    dpd  eax
442
    mov  eax,dword[prcinfo+42]
443
    mov  edx,WIN_COLOR
444
    call draw_progress
445
if BENCH eq 1
446
    mcall 26,9
447
    sub  eax,[bench]
448
    dps  <13,10,'Bench='>
449
    dpd  eax
450
end if
451
 else
452
    mov  [char],0
453
    mov  ebx,10 shl 16+TOP
454
    mov  ecx,16
455
  .l0:
456
    push ecx
457
    mov  ecx,16
458
  .l1:
459
    push ecx
460
  if RENDER eq BGI
461
    mov  edx,char
462
    mov  ecx,0x48000000
463
    mov  esi,1
464
    BGIfont_Outtext
465
  else
466
    mcall 4,,0x10000000,char,1
467
  end if
468
    pop  ecx
469
    inc  [char]
470
    add  ebx,(CHARW+3) shl 16
471
    loop .l1
472
    pop  ecx
473
    add  ebx,CHARH+2
474
    and  ebx,0x0000ffff
475
    add  ebx,10 shl 16
476
    loop .l0
477
 end if
478
 .ex:
479
    mcall 12, 2 		   ; функция 12: сообщить ОС об отрисовке окна
480
				   ; 2, закончили рисовать
481
    ret 			   ; выходим из процедуры
482
 
483
if GUTTER eq 1
484
   arrow db 0x19
485
end if
486
;---------------------------------------------------------------------
487
;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
488
;---------------------------------------------------------------------
489
 
490
; интерфейс программы многоязычный
491
;  Вы можете задать язык в MACROS.INC (lang fix язык)
492
procinfo process_information
493
header:
494
  db 'RTF READER v1.    (     ):'
495
headersize:
496
btn_text:
497
  if RENDER eq FREE
498
    db '+ - '
499
  end if
500
    db '< > L A C H'
501
btn_end:
502
 
503
fileinfo:
504
  dd 0
505
.block:
506
  dd 0
507
.size  dd 1
508
  dd I_END
509
  dd sys_mem
510
.name:
511
;   db '//'
512
;  db ' /HD/1/RTF/texts/FASM.TXT',0
513
;  db '/HD/1/RTF/TEST2.RTF',0
514
;  db '/HD/1/RTF/texts/index_ru.RTF',0
515
;  db '/HD/1/RTF/texts/stas.RTF',0
516
;  db '/HD/1/RTF/texts/zed.RTF',0
517
;  db '/HD/1/RTF/PRACT.RTF',0
518
;  db '/HD/1/RTF/SETUP2.RTF',0
519
;  db '/HD/1/RTF/texts/TC_RU.RTF',0
520
;  db '/HD/1/RTF/texts/WORD.RTF',0
521
;  db '/HD/1/RTF/texts/WORD97.RTF',0
522
;  db '/HD/1/RTF/texts/MASTAPP.RTF',0
523
;  db '/HD/1/RTF/texts/1c_tor77.RTF',0
524
;  db '/HD/1/RTF/texts/RELATION.RTF',0
525
;  db '/HD/1/RTF/texts/PLANETS.RTF',0
526
;  db '/HD/1/RTF/texts/LOTRRUS.RTF',0
527
  db '/HD/1/RTF/texts/RULEBOOK.RTF',0
528
;  db '/HD/1/RTF/texts/RULEBK2.RTF',0
529
;  db '/HD/1/RTF/texts/GLEB.RTF',0
530
;  db '/HD/1/RTF/texts/DWG13_14.RTF',0
531
;  db '/HD/1/RTF/texts/LK.RTF',0
532
 
533
;  db '/HD/1/RTF/texts/JUSTIFY.RTF',0
534
   rb  256-($-.name)
535
;---------------------------------------------------------------------
536
;blind db ?
537
if RENDER eq PIX
538
;  rd 2
539
  Free rd 9
540
else
541
if RENDER eq BGI
542
  FreeFontscale dd 0.07
543
else
544
  Zoomscale dd 1.15
545
  FreeFontscale dd 0.04
546
end if
547
  Free BGIfree FONT_NAME,0,0,1.0,1.0,char,1,0x44000000,0
548
end if
549
I_END0:
550
if BENCH eq 1
551
  bench dd ?
552
end if
553
tail dd ?
554
cGroup dd ?
555
Chp:
556
  CHP
557
Pap:
558
  PAP
559
Sep:
560
  SEP
561
Dop:
562
  DOP
563
rds db ?
564
ris db ?
565
cbBin dd ?
566
lParam dd ?
567
fSkipDestIfUnk db ?
568
mode dd ?
569
curheight dw ?
570
maxheight dw ?
571
RetroBlock dd ?
572
RetroSave:
573
  SAVE
574
prcinfo rb 1024
575
RetroPtr dd ?
576
colorptr dd ?
577
colortbl rd 16
578
ct_end:
579
fname_size dd ?
580
max_block dd ?
581
cur_block dd ?
582
HDoc dd ?
583
HClick dd ?
584
top dw ?
585
line_count dd ?
586
par_count  dd ?
587
char db ?
588
pitch db ?
589
wSave dd ?
590
RetroXY dd ?
591
RetroGroup dd ?
592
 
593
save_stack:
594
rb RTFSTACKSIZE
595
save_limit:
596
rb BGIFONTSIZE
597
fname_buf rd 16
598
 
599
listptr dd ?
600
szKeyword rb 31
601
szParameter rb 21
602
block_end dd ?
603
I_END:				   ; метка конца программы
604
rb RTFSIZE
605
esp1:
606
rb ESPSIZE
607
sys_mem:
608
rb ESPSIZE
609
esp_end: