Subversion Repositories Kolibri OS

Rev

Rev 109 | Rev 139 | 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
 
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
 
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:
94
    xor  eax,eax
95
    mov  ebx,fileinfo
96
    mov  [ebx+4],eax
97
    inc  eax
98
    mov  [fileinfo.size],eax
99
    mcall 58
100
    dpd  ebx
101
    and  [wSave],0
102
    mov  [HClick],-100
103
 load_help:
104
    test eax,eax
134 diamond 105
    jz   .sizok
31 halyavin 106
    cmp  eax,5
134 diamond 107
    je   .sizok
31 halyavin 108
  .nosizok:
109
    mov  dword[fileinfo.name],N_A
110
  .sizok:
111
    mov  eax,ebx
112
    and  eax,RTFSIZE-1
113
    add  eax,I_END
114
    mov  [tail],eax
115
    shr  ebx,16
116
;    dpd ebx
117
    mov  [max_block],ebx
118
    xor  eax,eax
119
    mov  ecx,256
120
    mov  edi,fileinfo.name
121
    repne scasb
122
    sub  edi,fileinfo.name+1
123
    mov  [fname_size],edi
124
top_red:
125
    mov  [top],TOP
134 diamond 126
red:                    ; перерисовать окно
31 halyavin 127
 
134 diamond 128
    call draw_window    ; вызываем процедуру отрисовки окна
31 halyavin 129
 
130
;---------------------------------------------------------------------
131
;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
132
;---------------------------------------------------------------------
133
 
134
still:
134 diamond 135
    mcall 10            ; функция 10 - ждать события
31 halyavin 136
 
134 diamond 137
    cmp  eax,1          ; перерисовать окно ?
138
    je   red            ; если да - на метку red
139
    cmp  eax,3          ; нажата кнопка ?
140
    je   button         ; если да - на button
141
    cmp  eax,2          ; нажата клавиша ?
142
    je   key            ; если да - на key
31 halyavin 143
 
134 diamond 144
    jmp  still          ; если другое событие - в начало цикла
31 halyavin 145
 
146
 
147
;---------------------------------------------------------------------
148
 
149
 
134 diamond 150
  key:                  ; нажата клавиша на клавиатуре
151
    mcall 2             ; функция 2 - считать код символа (в ah)
152
    cmp  ah,104         ; HELP
31 halyavin 153
    jne  .nohelp
154
  .help:
155
    xor  [mode],RTF_HELP
156
    test [mode],RTF_HELP
134 diamond 157
    jz   load_file
31 halyavin 158
    mov  ecx,help_end-help_file
159
    mov  [block_end],ecx
160
    add  [block_end],I_END
161
    mov  [tail],ecx
162
    add  [tail],I_END
163
    mov  esi,help_file
164
    mov  edi,I_END
165
    rep  movsb
166
;    or   [mode],RTF_HELP
167
    xor  eax,eax
168
    mov  [max_block],eax
169
    jmp  top_red
170
  .nohelp:
171
;    test [mode],RTF_HELP
172
;    jz   .nohelp2
173
;    and  [mode],not RTF_HELP
174
;    cmp  dword[fileinfo.name],N_A
175
;    je   still
176
;    jmp  prep_load
177
  .nohelp2:
134 diamond 178
    cmp  ah,114         ; R - redraw
179
    je   red
180
    cmp  ah,99          ; C - color
31 halyavin 181
    jne  .nocolor
182
  .color:
183
    xor  [mode],RTF_COLORLESS
184
    jmp  red
185
  .nocolor:
134 diamond 186
    cmp  ah,97          ; A - alignment
31 halyavin 187
    jne  .noalign
188
  .alignment:
189
    xor  [mode],RTF_ALIGNLESS
190
    jmp  red
191
  .noalign:
134 diamond 192
    cmp  ah,44          ; < - pitch dec
31 halyavin 193
    jne  .nopd
194
  .decp:
195
    dec  [pitch]
196
    jmp  red
197
  .nopd:
134 diamond 198
    cmp  ah,46          ; < - pitch inc
31 halyavin 199
    jne  .nopi
200
  .incp:
201
    inc  [pitch]
202
    jmp  red
203
  .nopi:
134 diamond 204
    cmp  ah,180         ; Home
205
    je   top_red
31 halyavin 206
    mov  ebx,dword[prcinfo+46]
207
    sub  ebx,TOP+15
208
    cmp  ah,183 ;PgDn
209
    jne  .nopgdn
210
    sub  [top],bx
211
    jmp  red
212
  .nopgdn:
213
    cmp  ah,177 ;arrDn
214
    jne  .noardn
215
    sub  [top],CHARH
216
    jmp  red
217
  .noardn:
218
    mov  cx,[top]
219
    cmp  ah,184 ;PgUp
220
    jne  .nopgup
221
    add  [top],bx
222
    cmp  [top],TOP
134 diamond 223
    jl   red
31 halyavin 224
    mov  [top],TOP
225
    cmp  cx,[top]
134 diamond 226
    je   still
31 halyavin 227
    jmp  red
228
  .nopgup:
229
    cmp  ah,178 ;arrUp
230
    jne  .noarup
231
    add  [top],CHARH
232
    cmp  [top],TOP
134 diamond 233
    jl   red
31 halyavin 234
    mov  [top],TOP
235
    cmp  cx,[top]
134 diamond 236
    je   still
31 halyavin 237
    jmp  red
238
  .noarup:
239
  if  RENDER eq FREE
240
    cmp  ah,56 ;zoom+
241
    jne  .noplus
242
  .zplus:
243
    fld  [FreeFontscale]
244
    fmul [Zoomscale]
245
  .zoom:
246
    fstp [FreeFontscale]
247
    jmp  red
248
  .noplus:
249
    cmp  ah,54 ;zoom-
250
    jne  .nominus
251
  .zminus:
252
    fld  [FreeFontscale]
253
    fdiv [Zoomscale]
254
    jmp  .zoom
255
  .nominus:
256
  end if
134 diamond 257
    cmp  ah,108         ; L - load
31 halyavin 258
    jne  stilld
259
  .file_open:
134 diamond 260
    or   [mode],RTF_OPENING
31 halyavin 261
    opendialog draw_window, prep_load, st_1, fname_buf
262
  st_1:
263
    and  [mode],not RTF_OPENING
264
    jmp  still;red
265
  stilld:
266
    jmp  still
267
 
268
;---------------------------------------------------------------------
269
 
270
  button:
134 diamond 271
    mcall 17            ; 17 - получить идентификатор нажатой кнопки
31 halyavin 272
    cmp   ah,2
134 diamond 273
    je    key.help
31 halyavin 274
    cmp   ah,3
134 diamond 275
    je    key.color
31 halyavin 276
    cmp   ah,4
134 diamond 277
    je    key.alignment
31 halyavin 278
    cmp   ah,5
134 diamond 279
    je    key.file_open
31 halyavin 280
    cmp   ah,6
134 diamond 281
    je    key.incp
31 halyavin 282
    cmp   ah,7
134 diamond 283
    je    key.decp
31 halyavin 284
  if RENDER eq FREE
285
    cmp   ah,8
134 diamond 286
    je    key.zminus
31 halyavin 287
    cmp   ah,9
134 diamond 288
    je    key.zplus
31 halyavin 289
  end if
134 diamond 290
    cmp   ah, 1         ; если НЕ нажата кнопка с номером 1,
291
    jne   .noexit       ;  вернуться
31 halyavin 292
 
293
  .exit:
134 diamond 294
    mcall -1            ; иначе конец программы
31 halyavin 295
  .noexit:
296
    cmp   ah,20
297
    jne   still
298
    mcall 37,1
299
    and   eax,0xffff
300
    cmp   eax,[HClick]
134 diamond 301
    je    still
31 halyavin 302
    mov   [HClick],eax
303
    sub   eax,25
304
    mul   [HDoc]
305
    mov   ebx,dword[prcinfo+46]
306
    sub   ebx,25
307
    div   ebx
308
    dpd   eax
309
    mov   [top],TOP
310
    sub   [top],ax
311
    dps   'B'
312
    jmp   red;still
313
;---------------------------------------------------------------------
314
;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
315
;---------------------------------------------------------------------
316
 
317
draw_window:
318
 
134 diamond 319
    mcall 12, 1                    ; функция 12: сообщить ОС об отрисовке окна
320
                                   ; 1 - начинаем рисовать
321
 
31 halyavin 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
134 diamond 326
    ja      .temp12345
31 halyavin 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]
134 diamond 347
    je   .nochg
31 halyavin 348
  .chg:
349
    mov  [wSave],ebx
134 diamond 350
    or   [mode],RTF_TOEOF
31 halyavin 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
134 diamond 362
    mcall 8             ;2
31 halyavin 363
    sub  ebx,BTN_SPACE
364
    inc  edx
134 diamond 365
    mcall 8,,,,0x459a    ;3
31 halyavin 366
    sub  ebx,BTN_SPACE
367
    inc  edx
134 diamond 368
    mcall ,,,,0x107a30  ;4
31 halyavin 369
    sub  ebx,BTN_SPACE
370
    inc  edx
134 diamond 371
    mcall ,,,,0xcc0000  ;5
31 halyavin 372
    sub  ebx,BTN_SPACE
373
    inc  edx
134 diamond 374
    mcall ,,,,0x575f8c  ;6
31 halyavin 375
    sub  ebx,BTN_SPACE
376
    inc  edx
134 diamond 377
    mcall ,,,,0x575f8c  ;7
31 halyavin 378
  if RENDER eq FREE
379
    sub  ebx,BTN_SPACE
380
    inc  edx
134 diamond 381
    mcall ,,,,0x6a73d0  ;8
31 halyavin 382
    sub  ebx,BTN_SPACE
383
    inc  edx
134 diamond 384
    mcall ,,,,0xd048c8  ;9
31 halyavin 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:
134 diamond 479
    mcall 12, 2                    ; функция 12: сообщить ОС об отрисовке окна
480
                                   ; 2, закончили рисовать
481
    ret                            ; выходим из процедуры
31 halyavin 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:
134 diamond 550
fname_buf:
551
        rb      1024+16
31 halyavin 552
if BENCH eq 1
553
  bench dd ?
554
end if
555
tail dd ?
556
cGroup dd ?
557
Chp:
558
  CHP
559
Pap:
560
  PAP
561
Sep:
562
  SEP
563
Dop:
564
  DOP
565
rds db ?
566
ris db ?
567
cbBin dd ?
568
lParam dd ?
569
fSkipDestIfUnk db ?
570
mode dd ?
571
curheight dw ?
572
maxheight dw ?
573
RetroBlock dd ?
574
RetroSave:
575
  SAVE
576
prcinfo rb 1024
577
RetroPtr dd ?
578
colorptr dd ?
579
colortbl rd 16
580
ct_end:
581
fname_size dd ?
582
max_block dd ?
583
cur_block dd ?
584
HDoc dd ?
585
HClick dd ?
586
top dw ?
587
line_count dd ?
588
par_count  dd ?
589
char db ?
590
pitch db ?
591
wSave dd ?
592
RetroXY dd ?
593
RetroGroup dd ?
594
 
595
save_stack:
596
rb RTFSTACKSIZE
597
save_limit:
598
rb BGIFONTSIZE
599
 
600
listptr dd ?
601
szKeyword rb 31
602
szParameter rb 21
603
block_end dd ?
134 diamond 604
I_END:                             ; метка конца программы
31 halyavin 605
rb RTFSIZE
606
esp1:
607
rb ESPSIZE
608
sys_mem:
609
rb ESPSIZE
134 diamond 610
esp_end: