Subversion Repositories Kolibri OS

Rev

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