Subversion Repositories Kolibri OS

Rev

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