Subversion Repositories Kolibri OS

Rev

Rev 529 | Rev 1399 | 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'
1195 diamond 24
TOP =55
31 halyavin 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
485 heavyiron 312
    mcall 4, <8,8>, 0x10DDEEFF, title, titlesize-title
31 halyavin 313
    mov  esi,ecx
314
    mcall 47,0x30000,isymImplemented,<114,8>
315
    add  edx,36 shl 16
316
    mcall ,,isymMax
317
    add  edx,40 shl 16
318
    mov  esi,0x104e00e7;0x10f27840
319
    cmp  dword[fileinfo.name],N_A
320
    jne  .noNA
321
    mov  esi,0x10ff0000
322
  .noNA:
323
    mcall 4,edx,esi,fileinfo.name,[fname_size]
324
    mov  edi,prcinfo
325
    mcall 9,edi,-1
326
    and  [mode],not RTF_TOEOF
327
    mov  ebx,[edi+42]
328
    cmp  ebx,[wSave]
134 diamond 329
    je   .nochg
31 halyavin 330
  .chg:
331
    mov  [wSave],ebx
134 diamond 332
    or   [mode],RTF_TOEOF
31 halyavin 333
    and  [HDoc],0
334
    and  [line_count],0
335
    mov  [HClick],-100
336
  .nochg:
1195 diamond 337
 
338
 
339
mcall 13,<5,dword[prcinfo+42]>,<21,21>,0x8000459a
340
 
341
mcall 8,7*65536+39,23*65536+16,5,0x459a           ;load
342
mcall 8,46*65536+57,23*65536+16,4,0x459a ;align
343
mcall 8,103*65536+44,23*65536+16,3,0x459a   ;color
344
mcall 8,147*65536+37,23*65536+16,2,0x459a        ;help
345
 
346
mcall 8,184*65536+44,23*65536+16,7,0x459a ;prev
347
mcall 8,229*65536+46,23*65536+16,6,0x459a      ;next
348
 
349
if RENDER eq FREE
350
mcall 8,276*65536+44,23*65536+16,9,0x459a ;zoom+
351
mcall 8,320*65536+44,23*65536+16,8,0x459a ;zoom-
352
end if
353
 
354
 
355
 
356
 
357
;    sub  ebx,60
358
;    shl  ebx,16
359
;    mov  bx,12
360
;    mov  ecx,5 shl 16+12
361
;    mov  esi,0xb810e7
362
;    mov  edx,2
363
; BTN_SPACE equ 14 shl 16
364
;    mcall 8             ;2
365
;    sub  ebx,BTN_SPACE
366
;    inc  edx
367
;    mcall 8,,,,0x459a    ;3
368
;    sub  ebx,BTN_SPACE
369
;    inc  edx
370
;    mcall ,,,,0x107a30  ;4
371
;    sub  ebx,BTN_SPACE
372
;    inc  edx
373
;    mcall ,,,,0xcc0000  ;5
374
;    sub  ebx,BTN_SPACE
375
;    inc  edx
376
;    mcall ,,,,0x575f8c  ;6
377
;    sub  ebx,BTN_SPACE
378
;    inc  edx
379
;    mcall ,,,,0x575f8c  ;7
380
;  if RENDER eq FREE
381
;    sub  ebx,BTN_SPACE
382
;    inc  edx
383
;    mcall ,,,,0x6a73d0  ;8
384
;    sub  ebx,BTN_SPACE
385
;    inc  edx
386
;    mcall ,,,,0xd048c8  ;9
387
;  end if
388
;text
389
;    shr  ecx,16
390
;    mov  bx,cx
391
;    add  ebx,3 shl 16+3
392
    mcall 4,10*65536+27,0x10ddeeff,btn_text,btn_end-btn_text
393
 
31 halyavin 394
    sub  dword[prcinfo+42],LMARGIN
395
    sub  dword[prcinfo+46],CHARH
396
 if GUTTER eq 1
397
    mov  ebx,LMARGIN shl 16+20
398
    mov  ecx,20
399
    mov  eax,4
400
    mov  edx,arrow
401
    mov  esi,1
402
  .loop1:
403
    push ecx
404
    mcall ,,0xff0000
405
    pop  ecx
406
    add  ebx,50 shl 16
407
    loop .loop1
408
 end if
409
    mov  ebx,dword[prcinfo+42]
410
    shl  ebx,16
1195 diamond 411
    add  ebx,2 shl 16+13
31 halyavin 412
    mov  ecx,dword[prcinfo+46]
1195 diamond 413
    add  ecx,40 shl 16-35
31 halyavin 414
    mov  edx,20+1 shl 29
415
    mcall 8
416
    mov  ecx,[HClick]
417
    shl  ecx,16
1195 diamond 418
    add  ecx,6-3 shl 16 + 7
31 halyavin 419
    mcall 13,,,0xe26830
420
 if MODE eq RTF
421
    test [mode],RTF_OPENING
422
    jne  .ex
423
    and  [mode],not (RTF_BOTTOM);+RTF_TOEOF)
424
    mov  [colorptr],colortbl
425
    mov  eax,DEFCOLOR
426
    mov  edi,colortbl
427
    mov  ecx,16
428
    rep  stosd
429
    xor  eax,eax
430
    mov  [cGroup],eax
431
    mov  edi,Chp
432
    mov  ecx,SIZE_save
433
    rep  stosb
434
    mov  ax,[top]
435
    mov  word[Free+6],10
436
    mov  word[Free+4],ax
437
    mov  esi,I_END
438
    call RtfParse
439
    dpd  eax
440
    dps  'Lines='
441
    mov  eax,[line_count]
442
    dpd  eax
443
    newline
444
;    movzx  eax,word[Free+4]
445
;    dpd  eax
446
    mov  eax,dword[prcinfo+42]
447
    mov  edx,WIN_COLOR
448
    call draw_progress
449
if BENCH eq 1
450
    mcall 26,9
451
    sub  eax,[bench]
452
    dps  <13,10,'Bench='>
453
    dpd  eax
454
end if
455
 else
456
    mov  [char],0
457
    mov  ebx,10 shl 16+TOP
458
    mov  ecx,16
459
  .l0:
460
    push ecx
461
    mov  ecx,16
462
  .l1:
463
    push ecx
464
  if RENDER eq BGI
465
    mov  edx,char
466
    mov  ecx,0x48000000
467
    mov  esi,1
468
    BGIfont_Outtext
469
  else
470
    mcall 4,,0x10000000,char,1
471
  end if
472
    pop  ecx
473
    inc  [char]
474
    add  ebx,(CHARW+3) shl 16
475
    loop .l1
476
    pop  ecx
477
    add  ebx,CHARH+2
478
    and  ebx,0x0000ffff
479
    add  ebx,10 shl 16
480
    loop .l0
481
 end if
482
 .ex:
134 diamond 483
    mcall 12, 2                    ; функция 12: сообщить ОС об отрисовке окна
484
                                   ; 2, закончили рисовать
485
    ret                            ; выходим из процедуры
31 halyavin 486
 
487
if GUTTER eq 1
488
   arrow db 0x19
489
end if
490
;---------------------------------------------------------------------
491
;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
492
;---------------------------------------------------------------------
493
 
494
; интерфейс программы многоязычный
495
;  Вы можете задать язык в MACROS.INC (lang fix язык)
485 heavyiron 496
 
497
title:
1195 diamond 498
  db 'RTF Reader v1.    (     ):'
485 heavyiron 499
titlesize:
31 halyavin 500
btn_text:
1195 diamond 501
    db 'Load Aligment Color Help     <      >'
502
if RENDER eq FREE
503
    db '    Zoom+ Zoom- '
504
  end if
31 halyavin 505
btn_end:
506
 
139 diamond 507
attrinfo:
508
        dd      5
509
        dd      0
510
        dd      0
511
        dd      0
512
        dd      fileattr
513
        db      0
514
        dd      fileinfo.name
515
 
31 halyavin 516
fileinfo:
517
  dd 0
518
.block:
519
  dd 0
139 diamond 520
  dd 0
31 halyavin 521
.size  dd 1
522
  dd I_END
523
.name:
524
;   db '//'
525
;  db ' /HD/1/RTF/texts/FASM.TXT',0
526
;  db '/HD/1/RTF/TEST2.RTF',0
527
;  db '/HD/1/RTF/texts/index_ru.RTF',0
528
;  db '/HD/1/RTF/texts/stas.RTF',0
529
;  db '/HD/1/RTF/texts/zed.RTF',0
530
;  db '/HD/1/RTF/PRACT.RTF',0
531
;  db '/HD/1/RTF/SETUP2.RTF',0
532
;  db '/HD/1/RTF/texts/TC_RU.RTF',0
533
;  db '/HD/1/RTF/texts/WORD.RTF',0
534
;  db '/HD/1/RTF/texts/WORD97.RTF',0
535
;  db '/HD/1/RTF/texts/MASTAPP.RTF',0
536
;  db '/HD/1/RTF/texts/1c_tor77.RTF',0
537
;  db '/HD/1/RTF/texts/RELATION.RTF',0
538
;  db '/HD/1/RTF/texts/PLANETS.RTF',0
539
;  db '/HD/1/RTF/texts/LOTRRUS.RTF',0
1195 diamond 540
;  db '/HD/1/RTF/texts/RULEBOOK.RTF',0
31 halyavin 541
;  db '/HD/1/RTF/texts/RULEBK2.RTF',0
542
;  db '/HD/1/RTF/texts/GLEB.RTF',0
543
;  db '/HD/1/RTF/texts/DWG13_14.RTF',0
544
;  db '/HD/1/RTF/texts/LK.RTF',0
545
 
546
;  db '/HD/1/RTF/texts/JUSTIFY.RTF',0
547
   rb  256-($-.name)
548
;---------------------------------------------------------------------
549
;blind db ?
550
if RENDER eq PIX
551
;  rd 2
552
  Free rd 9
553
else
554
if RENDER eq BGI
555
  FreeFontscale dd 0.07
556
else
557
  Zoomscale dd 1.15
558
  FreeFontscale dd 0.04
559
end if
560
  Free BGIfree FONT_NAME,0,0,1.0,1.0,char,1,0x44000000,0
561
end if
562
I_END0:
134 diamond 563
fname_buf:
564
        rb      1024+16
139 diamond 565
fileattr rd 40/4
31 halyavin 566
if BENCH eq 1
567
  bench dd ?
568
end if
569
tail dd ?
570
cGroup dd ?
571
Chp:
572
  CHP
573
Pap:
574
  PAP
575
Sep:
576
  SEP
577
Dop:
578
  DOP
579
rds db ?
580
ris db ?
581
cbBin dd ?
582
lParam dd ?
583
fSkipDestIfUnk db ?
584
mode dd ?
585
curheight dw ?
586
maxheight dw ?
587
RetroBlock dd ?
588
RetroSave:
589
  SAVE
590
prcinfo rb 1024
591
RetroPtr dd ?
592
colorptr dd ?
593
colortbl rd 16
594
ct_end:
595
fname_size dd ?
596
max_block dd ?
597
cur_block dd ?
598
HDoc dd ?
599
HClick dd ?
600
top dw ?
601
line_count dd ?
602
par_count  dd ?
603
char db ?
604
pitch db ?
605
wSave dd ?
606
RetroXY dd ?
607
RetroGroup dd ?
608
 
609
save_stack:
610
rb RTFSTACKSIZE
611
save_limit:
612
rb BGIFONTSIZE
613
 
614
listptr dd ?
615
szKeyword rb 31
616
szParameter rb 21
617
block_end dd ?
134 diamond 618
I_END:                             ; метка конца программы
485 heavyiron 619
 
620
procinfo process_information
31 halyavin 621
rb RTFSIZE
622
esp1:
623
rb ESPSIZE
624
sys_mem:
625
rb ESPSIZE
134 diamond 626
esp_end: