065b8d32b2
git-svn-id: svn://kolibrios.org@31 a494cfbc-eb01-0410-851d-a64ba20cac60
609 lines
12 KiB
NASM
609 lines
12 KiB
NASM
; RTF READER FOR MENUET v1.
|
||
; Written in pure assembler by Ivushkin Andrey aka Willow
|
||
;
|
||
;---------------------------------------------------------------------
|
||
M64 equ 64*1024
|
||
N_A equ 0x412f4e
|
||
RTFSIZE equ M64
|
||
RTFSTACKSIZE equ M64
|
||
BGIFONTSIZE equ 120*1024
|
||
ESPSIZE equ M64
|
||
LMARGIN equ 20
|
||
CHARW equ 6
|
||
CHARH equ 11
|
||
WINW equ 600
|
||
WINH equ 450
|
||
WIN_COLOR equ 0x3f0f0f0
|
||
DEFCOLOR equ 0x303030
|
||
;RENDER equ PIX
|
||
;RENDER equ BGI
|
||
RENDER equ FREE
|
||
|
||
BGIFONT_PATH equ '/rd/1/'
|
||
FONT_NAME equ 'LITT'
|
||
TOP =35
|
||
MODE equ RTF
|
||
INVALHEX equ 0
|
||
RTF_COLORLESS equ 1
|
||
RTF_ALIGNLESS equ 2
|
||
RTF_NO1STLINE equ 4
|
||
RTF_OPENING equ 8
|
||
RTF_HELP equ 16
|
||
RTF_VALID equ 32
|
||
RTF_BLIND equ 64
|
||
RTF_TOEOF equ 128
|
||
RTF_BOTTOM equ 256
|
||
STEPBYSTEP equ 10
|
||
DEBUG_BLOCK equ 10
|
||
SHOWALIGN equ 10
|
||
GUTTER equ 10
|
||
BENCH equ 0;1
|
||
syms equ 12
|
||
|
||
use32 ; ¢ª«îç¨âì 32-¡¨âë© à¥¦¨¬ áᥬ¡«¥à
|
||
org 0x0 ; ¤à¥á æ¨ï á ã«ï
|
||
|
||
db 'MENUET01' ; 8-¡ ©âë© ¨¤¥â¨ä¨ª â®à MenuetOS
|
||
dd 0x01 ; ¢¥àá¨ï § £®«®¢ª (¢á¥£¤ 1)
|
||
dd START ; ¤à¥á ¯¥à¢®© ª®¬ ¤ë
|
||
dd I_END0 ; à §¬¥à ¯à®£à ¬¬ë
|
||
dd esp_end ; ª®«¨ç¥á⢮ ¯ ¬ïâ¨
|
||
dd sys_mem ; ¤à¥á ¢¥àè¨ë áâíª
|
||
dd fname_buf ; ¤à¥á ¡ãä¥à ¤«ï ¯ à ¬¥â஢ (¥ ¨á¯®«ì§ã¥âáï)
|
||
dd 0x0 ; § १¥à¢¨à®¢ ®
|
||
|
||
include 'lang.inc'
|
||
include 'macros.inc' ; ¬ ªà®áë ®¡«¥£ç îâ ¦¨§ì áᥬ¡«¥à騪®¢!
|
||
include 'debug.inc'
|
||
if ~ RENDER eq PIX
|
||
TOP=TOP+4
|
||
include 'bgifont.inc'
|
||
end if
|
||
include 'rtf_lite.inc'
|
||
include 'ascl.inc'
|
||
;---------------------------------------------------------------------
|
||
;--- <20>€—€‹Ž <20><>Žƒ<C5BD>€ŒŒ› ----------------------------------------------
|
||
;---------------------------------------------------------------------
|
||
help_file:
|
||
file 'reader.rtf'
|
||
help_end:
|
||
|
||
START:
|
||
mov [pitch],2
|
||
if ~ RENDER eq PIX
|
||
mov edx,FONT_NAME
|
||
mov edi,save_limit
|
||
BGIfont_Prepare
|
||
end if
|
||
start2:
|
||
cmp byte[fname_buf],0
|
||
je load_file;top_red
|
||
jmp noactivate
|
||
prep_load:
|
||
; mcall 18,3,dword[prcinfo+30]
|
||
noactivate:
|
||
; and ebp,not RTF_OPENING
|
||
; and ebp,not RTF_HELP
|
||
|
||
; and [mode],not RTF_OPENING
|
||
and [mode],not (RTF_HELP+RTF_OPENING)
|
||
mov ecx,16
|
||
mov edi,fileinfo.name
|
||
mov esi,fname_buf
|
||
rep movsd
|
||
load_file:
|
||
xor eax,eax
|
||
mov ebx,fileinfo
|
||
mov [ebx+4],eax
|
||
inc eax
|
||
mov [fileinfo.size],eax
|
||
mcall 58
|
||
dpd ebx
|
||
and [wSave],0
|
||
mov [HClick],-100
|
||
load_help:
|
||
test eax,eax
|
||
jz .sizok
|
||
cmp eax,5
|
||
je .sizok
|
||
.nosizok:
|
||
mov dword[fileinfo.name],N_A
|
||
.sizok:
|
||
mov eax,ebx
|
||
and eax,RTFSIZE-1
|
||
add eax,I_END
|
||
mov [tail],eax
|
||
shr ebx,16
|
||
; dpd ebx
|
||
mov [max_block],ebx
|
||
xor eax,eax
|
||
mov ecx,256
|
||
mov edi,fileinfo.name
|
||
repne scasb
|
||
sub edi,fileinfo.name+1
|
||
mov [fname_size],edi
|
||
top_red:
|
||
mov [top],TOP
|
||
red: ; ¯¥à¥à¨á®¢ âì ®ª®
|
||
|
||
call draw_window ; ¢ë§ë¢ ¥¬ ¯à®æ¥¤ãàã ®âà¨á®¢ª¨ ®ª
|
||
|
||
;---------------------------------------------------------------------
|
||
;--- –ˆŠ‹ Ž<><C5BD>€<EFBFBD>Ž’Šˆ ‘Ž<E28098>›’ˆ‰ ----------------------------------------
|
||
;---------------------------------------------------------------------
|
||
|
||
still:
|
||
mcall 10 ; äãªæ¨ï 10 - ¦¤ âì ᮡëâ¨ï
|
||
|
||
cmp eax,1 ; ¯¥à¥à¨á®¢ âì ®ª® ?
|
||
je red ; ¥á«¨ ¤ - ¬¥âªã red
|
||
cmp eax,3 ; ¦ â ª®¯ª ?
|
||
je button ; ¥á«¨ ¤ - button
|
||
cmp eax,2 ; ¦ â ª« ¢¨è ?
|
||
je key ; ¥á«¨ ¤ - key
|
||
|
||
jmp still ; ¥á«¨ ¤à㣮¥ ᮡë⨥ - ¢ ç «® 横«
|
||
|
||
|
||
;---------------------------------------------------------------------
|
||
|
||
|
||
key: ; ¦ â ª« ¢¨è ª« ¢¨ âãà¥
|
||
mcall 2 ; äãªæ¨ï 2 - áç¨â âì ª®¤ ᨬ¢®« (¢ ah)
|
||
cmp ah,104 ; HELP
|
||
jne .nohelp
|
||
.help:
|
||
xor [mode],RTF_HELP
|
||
test [mode],RTF_HELP
|
||
jz load_file
|
||
mov ecx,help_end-help_file
|
||
mov [block_end],ecx
|
||
add [block_end],I_END
|
||
mov [tail],ecx
|
||
add [tail],I_END
|
||
mov esi,help_file
|
||
mov edi,I_END
|
||
rep movsb
|
||
; or [mode],RTF_HELP
|
||
xor eax,eax
|
||
mov [max_block],eax
|
||
jmp top_red
|
||
.nohelp:
|
||
; test [mode],RTF_HELP
|
||
; jz .nohelp2
|
||
; and [mode],not RTF_HELP
|
||
; cmp dword[fileinfo.name],N_A
|
||
; je still
|
||
; jmp prep_load
|
||
.nohelp2:
|
||
cmp ah,114 ; R - redraw
|
||
je red
|
||
cmp ah,99 ; C - color
|
||
jne .nocolor
|
||
.color:
|
||
xor [mode],RTF_COLORLESS
|
||
jmp red
|
||
.nocolor:
|
||
cmp ah,97 ; A - alignment
|
||
jne .noalign
|
||
.alignment:
|
||
xor [mode],RTF_ALIGNLESS
|
||
jmp red
|
||
.noalign:
|
||
cmp ah,44 ; < - pitch dec
|
||
jne .nopd
|
||
.decp:
|
||
dec [pitch]
|
||
jmp red
|
||
.nopd:
|
||
cmp ah,46 ; < - pitch inc
|
||
jne .nopi
|
||
.incp:
|
||
inc [pitch]
|
||
jmp red
|
||
.nopi:
|
||
cmp ah,180 ; Home
|
||
je top_red
|
||
mov ebx,dword[prcinfo+46]
|
||
sub ebx,TOP+15
|
||
cmp ah,183 ;PgDn
|
||
jne .nopgdn
|
||
sub [top],bx
|
||
jmp red
|
||
.nopgdn:
|
||
cmp ah,177 ;arrDn
|
||
jne .noardn
|
||
sub [top],CHARH
|
||
jmp red
|
||
.noardn:
|
||
mov cx,[top]
|
||
cmp ah,184 ;PgUp
|
||
jne .nopgup
|
||
add [top],bx
|
||
cmp [top],TOP
|
||
jl red
|
||
mov [top],TOP
|
||
cmp cx,[top]
|
||
je still
|
||
jmp red
|
||
.nopgup:
|
||
cmp ah,178 ;arrUp
|
||
jne .noarup
|
||
add [top],CHARH
|
||
cmp [top],TOP
|
||
jl red
|
||
mov [top],TOP
|
||
cmp cx,[top]
|
||
je still
|
||
jmp red
|
||
.noarup:
|
||
if RENDER eq FREE
|
||
cmp ah,56 ;zoom+
|
||
jne .noplus
|
||
.zplus:
|
||
fld [FreeFontscale]
|
||
fmul [Zoomscale]
|
||
.zoom:
|
||
fstp [FreeFontscale]
|
||
jmp red
|
||
.noplus:
|
||
cmp ah,54 ;zoom-
|
||
jne .nominus
|
||
.zminus:
|
||
fld [FreeFontscale]
|
||
fdiv [Zoomscale]
|
||
jmp .zoom
|
||
.nominus:
|
||
end if
|
||
cmp ah,108 ; L - load
|
||
jne stilld
|
||
.file_open:
|
||
or [mode],RTF_OPENING
|
||
opendialog draw_window, prep_load, st_1, fname_buf
|
||
st_1:
|
||
and [mode],not RTF_OPENING
|
||
jmp still;red
|
||
stilld:
|
||
jmp still
|
||
|
||
;---------------------------------------------------------------------
|
||
|
||
button:
|
||
mcall 17 ; 17 - ¯®«ãç¨âì ¨¤¥â¨ä¨ª â®à ¦ ⮩ ª®¯ª¨
|
||
cmp ah,2
|
||
je key.help
|
||
cmp ah,3
|
||
je key.color
|
||
cmp ah,4
|
||
je key.alignment
|
||
cmp ah,5
|
||
je key.file_open
|
||
cmp ah,6
|
||
je key.incp
|
||
cmp ah,7
|
||
je key.decp
|
||
if RENDER eq FREE
|
||
cmp ah,8
|
||
je key.zminus
|
||
cmp ah,9
|
||
je key.zplus
|
||
end if
|
||
cmp ah, 1 ; ¥á«¨ <20>… ¦ â ª®¯ª á ®¬¥à®¬ 1,
|
||
jne .noexit ; ¢¥àãâìáï
|
||
|
||
.exit:
|
||
mcall -1 ; ¨ ç¥ ª®¥æ ¯à®£à ¬¬ë
|
||
.noexit:
|
||
cmp ah,20
|
||
jne still
|
||
mcall 37,1
|
||
and eax,0xffff
|
||
cmp eax,[HClick]
|
||
je still
|
||
mov [HClick],eax
|
||
sub eax,25
|
||
mul [HDoc]
|
||
mov ebx,dword[prcinfo+46]
|
||
sub ebx,25
|
||
div ebx
|
||
dpd eax
|
||
mov [top],TOP
|
||
sub [top],ax
|
||
dps 'B'
|
||
jmp red;still
|
||
;---------------------------------------------------------------------
|
||
;--- Ž<><C5BD>…„…‹…<E280B9>ˆ… ˆ Ž’<C5BD>ˆ‘Ž‚Š€ ŽŠ<C5BD>€ ----------------------------------
|
||
;---------------------------------------------------------------------
|
||
|
||
draw_window:
|
||
|
||
mcall 12, 1 ; äãªæ¨ï 12: á®®¡é¨âì Ž‘ ®¡ ®âà¨á®¢ª¥ ®ª
|
||
; 1 - ç¨ ¥¬ à¨á®¢ âì
|
||
mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x805080D0, 0x005080D0
|
||
mcall 9,procinfo,-1
|
||
mov eax,[procinfo.x_size]
|
||
cmp eax,1
|
||
ja .temp12345
|
||
ret
|
||
.temp12345:
|
||
|
||
mcall 4, <8,8>, 0x10DDEEFF, header, headersize-header
|
||
mov esi,ecx
|
||
mcall 47,0x30000,isymImplemented,<114,8>
|
||
add edx,36 shl 16
|
||
mcall ,,isymMax
|
||
add edx,40 shl 16
|
||
mov esi,0x104e00e7;0x10f27840
|
||
cmp dword[fileinfo.name],N_A
|
||
jne .noNA
|
||
mov esi,0x10ff0000
|
||
.noNA:
|
||
mcall 4,edx,esi,fileinfo.name,[fname_size]
|
||
mov edi,prcinfo
|
||
mcall 9,edi,-1
|
||
and [mode],not RTF_TOEOF
|
||
mov ebx,[edi+42]
|
||
cmp ebx,[wSave]
|
||
je .nochg
|
||
.chg:
|
||
mov [wSave],ebx
|
||
or [mode],RTF_TOEOF
|
||
and [HDoc],0
|
||
and [line_count],0
|
||
mov [HClick],-100
|
||
.nochg:
|
||
sub ebx,60
|
||
shl ebx,16
|
||
mov bx,12
|
||
mov ecx,5 shl 16+12
|
||
mov esi,0xb810e7
|
||
mov edx,2
|
||
BTN_SPACE equ 14 shl 16
|
||
mcall 8 ;2
|
||
sub ebx,BTN_SPACE
|
||
inc edx
|
||
mcall 8,,,,0x459a ;3
|
||
sub ebx,BTN_SPACE
|
||
inc edx
|
||
mcall ,,,,0x107a30 ;4
|
||
sub ebx,BTN_SPACE
|
||
inc edx
|
||
mcall ,,,,0xcc0000 ;5
|
||
sub ebx,BTN_SPACE
|
||
inc edx
|
||
mcall ,,,,0x575f8c ;6
|
||
sub ebx,BTN_SPACE
|
||
inc edx
|
||
mcall ,,,,0x575f8c ;7
|
||
if RENDER eq FREE
|
||
sub ebx,BTN_SPACE
|
||
inc edx
|
||
mcall ,,,,0x6a73d0 ;8
|
||
sub ebx,BTN_SPACE
|
||
inc edx
|
||
mcall ,,,,0xd048c8 ;9
|
||
end if
|
||
shr ecx,16
|
||
mov bx,cx
|
||
add ebx,3 shl 16+3
|
||
mcall 4,,0x10ddeeff,btn_text,btn_end-btn_text
|
||
sub dword[prcinfo+42],LMARGIN
|
||
sub dword[prcinfo+46],CHARH
|
||
if GUTTER eq 1
|
||
mov ebx,LMARGIN shl 16+20
|
||
mov ecx,20
|
||
mov eax,4
|
||
mov edx,arrow
|
||
mov esi,1
|
||
.loop1:
|
||
push ecx
|
||
mcall ,,0xff0000
|
||
pop ecx
|
||
add ebx,50 shl 16
|
||
loop .loop1
|
||
end if
|
||
mov ebx,dword[prcinfo+42]
|
||
shl ebx,16
|
||
add ebx,7 shl 16+7
|
||
mov ecx,dword[prcinfo+46]
|
||
add ecx,25 shl 16-25
|
||
mov edx,20+1 shl 29
|
||
mcall 8
|
||
mov ecx,[HClick]
|
||
shl ecx,16
|
||
add ecx,6-3 shl 16
|
||
mcall 13,,,0xe26830
|
||
if MODE eq RTF
|
||
test [mode],RTF_OPENING
|
||
jne .ex
|
||
and [mode],not (RTF_BOTTOM);+RTF_TOEOF)
|
||
mov [colorptr],colortbl
|
||
mov eax,DEFCOLOR
|
||
mov edi,colortbl
|
||
mov ecx,16
|
||
rep stosd
|
||
xor eax,eax
|
||
mov [cGroup],eax
|
||
mov edi,Chp
|
||
mov ecx,SIZE_save
|
||
rep stosb
|
||
mov ax,[top]
|
||
mov word[Free+6],10
|
||
mov word[Free+4],ax
|
||
mov esi,I_END
|
||
call RtfParse
|
||
dpd eax
|
||
dps 'Lines='
|
||
mov eax,[line_count]
|
||
dpd eax
|
||
newline
|
||
; movzx eax,word[Free+4]
|
||
; dpd eax
|
||
mov eax,dword[prcinfo+42]
|
||
mov edx,WIN_COLOR
|
||
call draw_progress
|
||
if BENCH eq 1
|
||
mcall 26,9
|
||
sub eax,[bench]
|
||
dps <13,10,'Bench='>
|
||
dpd eax
|
||
end if
|
||
else
|
||
mov [char],0
|
||
mov ebx,10 shl 16+TOP
|
||
mov ecx,16
|
||
.l0:
|
||
push ecx
|
||
mov ecx,16
|
||
.l1:
|
||
push ecx
|
||
if RENDER eq BGI
|
||
mov edx,char
|
||
mov ecx,0x48000000
|
||
mov esi,1
|
||
BGIfont_Outtext
|
||
else
|
||
mcall 4,,0x10000000,char,1
|
||
end if
|
||
pop ecx
|
||
inc [char]
|
||
add ebx,(CHARW+3) shl 16
|
||
loop .l1
|
||
pop ecx
|
||
add ebx,CHARH+2
|
||
and ebx,0x0000ffff
|
||
add ebx,10 shl 16
|
||
loop .l0
|
||
end if
|
||
.ex:
|
||
mcall 12, 2 ; äãªæ¨ï 12: á®®¡é¨âì Ž‘ ®¡ ®âà¨á®¢ª¥ ®ª
|
||
; 2, § ª®ç¨«¨ à¨á®¢ âì
|
||
ret ; ¢ë室¨¬ ¨§ ¯à®æ¥¤ãàë
|
||
|
||
if GUTTER eq 1
|
||
arrow db 0x19
|
||
end if
|
||
;---------------------------------------------------------------------
|
||
;--- „€<E2809E><E282AC>›… <20><>Žƒ<C5BD>€ŒŒ› ----------------------------------------------
|
||
;---------------------------------------------------------------------
|
||
|
||
; ¨â¥àä¥©á ¯à®£à ¬¬ë ¬®£®ï§ëçë©
|
||
; ‚ë ¬®¦¥â¥ § ¤ âì ï§ëª ¢ MACROS.INC (lang fix ï§ëª)
|
||
procinfo process_information
|
||
header:
|
||
db 'RTF READER v1. ( ):'
|
||
headersize:
|
||
btn_text:
|
||
if RENDER eq FREE
|
||
db '+ - '
|
||
end if
|
||
db '< > L A C H'
|
||
btn_end:
|
||
|
||
fileinfo:
|
||
dd 0
|
||
.block:
|
||
dd 0
|
||
.size dd 1
|
||
dd I_END
|
||
dd sys_mem
|
||
.name:
|
||
; db '//'
|
||
; db ' /HD/1/RTF/texts/FASM.TXT',0
|
||
; db '/HD/1/RTF/TEST2.RTF',0
|
||
; db '/HD/1/RTF/texts/index_ru.RTF',0
|
||
; db '/HD/1/RTF/texts/stas.RTF',0
|
||
; db '/HD/1/RTF/texts/zed.RTF',0
|
||
; db '/HD/1/RTF/PRACT.RTF',0
|
||
; db '/HD/1/RTF/SETUP2.RTF',0
|
||
; db '/HD/1/RTF/texts/TC_RU.RTF',0
|
||
; db '/HD/1/RTF/texts/WORD.RTF',0
|
||
; db '/HD/1/RTF/texts/WORD97.RTF',0
|
||
; db '/HD/1/RTF/texts/MASTAPP.RTF',0
|
||
; db '/HD/1/RTF/texts/1c_tor77.RTF',0
|
||
; db '/HD/1/RTF/texts/RELATION.RTF',0
|
||
; db '/HD/1/RTF/texts/PLANETS.RTF',0
|
||
; db '/HD/1/RTF/texts/LOTRRUS.RTF',0
|
||
db '/HD/1/RTF/texts/RULEBOOK.RTF',0
|
||
; db '/HD/1/RTF/texts/RULEBK2.RTF',0
|
||
; db '/HD/1/RTF/texts/GLEB.RTF',0
|
||
; db '/HD/1/RTF/texts/DWG13_14.RTF',0
|
||
; db '/HD/1/RTF/texts/LK.RTF',0
|
||
|
||
; db '/HD/1/RTF/texts/JUSTIFY.RTF',0
|
||
rb 256-($-.name)
|
||
;---------------------------------------------------------------------
|
||
;blind db ?
|
||
if RENDER eq PIX
|
||
; rd 2
|
||
Free rd 9
|
||
else
|
||
if RENDER eq BGI
|
||
FreeFontscale dd 0.07
|
||
else
|
||
Zoomscale dd 1.15
|
||
FreeFontscale dd 0.04
|
||
end if
|
||
Free BGIfree FONT_NAME,0,0,1.0,1.0,char,1,0x44000000,0
|
||
end if
|
||
I_END0:
|
||
if BENCH eq 1
|
||
bench dd ?
|
||
end if
|
||
tail dd ?
|
||
cGroup dd ?
|
||
Chp:
|
||
CHP
|
||
Pap:
|
||
PAP
|
||
Sep:
|
||
SEP
|
||
Dop:
|
||
DOP
|
||
rds db ?
|
||
ris db ?
|
||
cbBin dd ?
|
||
lParam dd ?
|
||
fSkipDestIfUnk db ?
|
||
mode dd ?
|
||
curheight dw ?
|
||
maxheight dw ?
|
||
RetroBlock dd ?
|
||
RetroSave:
|
||
SAVE
|
||
prcinfo rb 1024
|
||
RetroPtr dd ?
|
||
colorptr dd ?
|
||
colortbl rd 16
|
||
ct_end:
|
||
fname_size dd ?
|
||
max_block dd ?
|
||
cur_block dd ?
|
||
HDoc dd ?
|
||
HClick dd ?
|
||
top dw ?
|
||
line_count dd ?
|
||
par_count dd ?
|
||
char db ?
|
||
pitch db ?
|
||
wSave dd ?
|
||
RetroXY dd ?
|
||
RetroGroup dd ?
|
||
|
||
save_stack:
|
||
rb RTFSTACKSIZE
|
||
save_limit:
|
||
rb BGIFONTSIZE
|
||
fname_buf rd 16
|
||
|
||
listptr dd ?
|
||
szKeyword rb 31
|
||
szParameter rb 21
|
||
block_end dd ?
|
||
I_END: ; ¬¥âª ª®æ ¯à®£à ¬¬ë
|
||
rb RTFSIZE
|
||
esp1:
|
||
rb ESPSIZE
|
||
sys_mem:
|
||
rb ESPSIZE
|
||
esp_end: |