mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-04 22:32:05 +03:00
2946 lines
48 KiB
NASM
2946 lines
48 KiB
NASM
|
;******************************************************************************
|
|||
|
; project name: TINYPAD
|
|||
|
; compiler: flat assembler 1.60
|
|||
|
; memory to compile: 2 Mbytes +
|
|||
|
; version: 3.78a
|
|||
|
; last update: 13/05/2005
|
|||
|
; maintained by: Ivan Poddubny, Mike Semenyako (aka mike.dld)
|
|||
|
; e-mail: ivan-yar@bk.ru, mike.dld@tut.by
|
|||
|
;******************************************************************************
|
|||
|
; HISTORY:
|
|||
|
; 3.79 (just some ideas for further releases)
|
|||
|
; optimize drawing (reduce flickering)
|
|||
|
; optimize memory usage (allocate only needed amount, not static 3 Mbytes)
|
|||
|
; improve keyboard handling (use 66th function)
|
|||
|
; introduce real selection capabilities (including block selection)
|
|||
|
; and of course other small speed and size optimizations ;)
|
|||
|
; 3.78a (mike.dld)
|
|||
|
; fixed termination while typing in x positions higher than (line_length+10)
|
|||
|
; improved drawing on small heights
|
|||
|
; don't draw window while its height equals 0
|
|||
|
; 3.78 (mike.dld)
|
|||
|
; now lines may be of ANY length;
|
|||
|
; optimized memory usage (less memory for internal file representation)
|
|||
|
; after loading file, it's internal size equals to its real size
|
|||
|
; plus 14 bytes for each line (4 bytes for line length
|
|||
|
; and 10 spaced to the end - to reduce data relocations)
|
|||
|
; completely rewritten keyboard handling;
|
|||
|
; added horizontal scrollbar;
|
|||
|
; all line feed formats are supported: WIN(CRLF),*NIX(LF),MAC(CR);
|
|||
|
; etc.
|
|||
|
; 3.77 (mike.dld)
|
|||
|
; changed save_string to collapse SPACEs into TABs;
|
|||
|
; rewrote drawfile from scratch (speed++)
|
|||
|
; through some drawing improvements still needed
|
|||
|
; (some checkups to reduce flickering);
|
|||
|
; writepos (size--);
|
|||
|
; fixed drawing window while height < 100px, and for non-asm files;
|
|||
|
; several small fixes; speed/size optimizations
|
|||
|
; 3.76 (mike.dld)
|
|||
|
; changed loadfile/loadhdfile to expand TABs into SPACEs;
|
|||
|
; changed TAB,ENTER,DELETE,BSPACE keys behaviour (rewritten from scratch);
|
|||
|
; vertical scrollbar;
|
|||
|
; extra window resizing capabilities (added a couple of constants);
|
|||
|
; completely new text cursor management & moving text cursor with mouse;
|
|||
|
; improved search function, moving cursor to beginning of text found;
|
|||
|
; adjustable max line width (change LINE_WIDTH & recompile) // (obsolete)
|
|||
|
; 3.75a
|
|||
|
; fixed converting char to upper case in read_string
|
|||
|
; 3.75
|
|||
|
; rewrote save_file from scratch; bugfix in loadfile;
|
|||
|
; 3.74
|
|||
|
; optimisation
|
|||
|
; 3.73
|
|||
|
; completly new load_file function
|
|||
|
; 3.72
|
|||
|
; speed++
|
|||
|
; 3.71
|
|||
|
; error beep
|
|||
|
; 3.6,3.7:
|
|||
|
; many bugs fixed
|
|||
|
; simple toolbar
|
|||
|
; compile, run applications from TINYPAD, all fasm output is in debug board
|
|||
|
; TAB button
|
|||
|
; auto-indent
|
|||
|
; Ctrl+L - insert comment string
|
|||
|
;******************************************************************************
|
|||
|
; Memory 0x300000:
|
|||
|
; stack 0x00eff0 - <20><><EFBFBD><EFBFBD>
|
|||
|
; stack for help 0x00fff0 -
|
|||
|
; load position 0x010000 + <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>㧪<EFBFBD> 䠩<><E4A0A9>
|
|||
|
; screen comp 0x078000 + ᮤ<>ন<EFBFBD><E0A6A8><EFBFBD> <20><>࠭<EFBFBD> (obsolete)
|
|||
|
; edit area 0x080000 + <20><><EFBFBD>㬥<EFBFBD><E3ACA5>
|
|||
|
; copy/paste area 0x2f0000 + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD>/<2F><>⠢<EFBFBD><E2A0A2>
|
|||
|
;******************************************************************************
|
|||
|
|
|||
|
include 'lang.inc'
|
|||
|
include 'macros.inc' ; useful stuff
|
|||
|
purge mov ; SPEED
|
|||
|
|
|||
|
macro mov op1,op2 {
|
|||
|
if (op1 in __regs) & (op2 eq -1)
|
|||
|
or op1,-1
|
|||
|
else
|
|||
|
mov op1,op2
|
|||
|
end if
|
|||
|
}
|
|||
|
|
|||
|
header '01',1,@CODE,TINYPAD_END,0x300000,0xeff0,@PARAMS,0
|
|||
|
|
|||
|
ASEPC = '-'
|
|||
|
RBTNW = rstr.size*6/3
|
|||
|
LBTNW = lstr.size*6/2
|
|||
|
ABTNH = 16
|
|||
|
ATOPH = 24
|
|||
|
OLEFT = 5+1
|
|||
|
SCRLW = 16
|
|||
|
ATABW = 8
|
|||
|
PATHL = 260
|
|||
|
|
|||
|
AMINS = 8
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
section @CODE ;///////////////////////////////////////////////////////////////
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
; INITIALIZING
|
|||
|
|
|||
|
cld
|
|||
|
mov esi,s_example
|
|||
|
mov edi,s_fname
|
|||
|
mov ecx,s_example.size
|
|||
|
mov [s_fname.size],ecx
|
|||
|
rep movsb
|
|||
|
mov esi,s_still
|
|||
|
mov edi,s_search
|
|||
|
mov ecx,s_still.size
|
|||
|
mov [s_search.size],ecx
|
|||
|
rep movsb
|
|||
|
cmp byte[@PARAMS],0
|
|||
|
jz no_params
|
|||
|
|
|||
|
; parameters are at @PARAMS
|
|||
|
mov esi,@PARAMS
|
|||
|
mov edi,s_fname
|
|||
|
mov ecx,PATHL
|
|||
|
rep movsb
|
|||
|
mov edi,s_fname
|
|||
|
mov ecx,PATHL
|
|||
|
xor al,al
|
|||
|
repne scasb
|
|||
|
sub edi,s_fname+1
|
|||
|
mov [s_fname.size],edi
|
|||
|
|
|||
|
no_params:
|
|||
|
mcall 40,00100111b
|
|||
|
jmp do_load_file
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
; MAIN LOOP
|
|||
|
still:
|
|||
|
call writepos ; write current position & number of strings
|
|||
|
|
|||
|
.skip_write:
|
|||
|
mcall 10;23,50; wait here until event
|
|||
|
dec eax ; redraw ?
|
|||
|
jz red
|
|||
|
dec eax ; key ?
|
|||
|
jz key
|
|||
|
dec eax ; button ?
|
|||
|
jz button
|
|||
|
sub eax,3 ; mouse ?
|
|||
|
jz mouse
|
|||
|
|
|||
|
;d
|
|||
|
|
|||
|
jmp still.skip_write
|
|||
|
;******************************************************************************
|
|||
|
|
|||
|
mouse:
|
|||
|
mcall 9,p_info,-1
|
|||
|
cmp ax,[p_info.window_stack_position]
|
|||
|
jne still
|
|||
|
|
|||
|
mcall 37,2
|
|||
|
test al,1
|
|||
|
jz .capture_off
|
|||
|
|
|||
|
mcall 37,1
|
|||
|
mov ebx,eax
|
|||
|
and ebx,0x0000FFFF
|
|||
|
shr eax,16
|
|||
|
|
|||
|
mov ecx,[top_ofs]
|
|||
|
inc ecx
|
|||
|
pushd OLEFT ecx [p_info.x_size] ecx
|
|||
|
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
|
|||
|
sub [__rc+0x8],SCRLW+5+3
|
|||
|
imul ecx,[slines],10
|
|||
|
dec ecx
|
|||
|
add [__rc+0xC],ecx
|
|||
|
mov ecx,__rc
|
|||
|
call pt_in_rect
|
|||
|
jnc .check_vscroll
|
|||
|
sub eax,OLEFT
|
|||
|
sub ebx,[__rc+0x4]
|
|||
|
push eax
|
|||
|
mov eax,ebx
|
|||
|
xor edx,edx
|
|||
|
mov ecx,10
|
|||
|
div ecx
|
|||
|
@@: add eax,[top_line]
|
|||
|
mov ebx,eax
|
|||
|
pop eax
|
|||
|
xor edx,edx
|
|||
|
mov ecx,6
|
|||
|
div ecx
|
|||
|
@@: add eax,[left_col]
|
|||
|
|
|||
|
cmp eax,[columns]
|
|||
|
jb @f
|
|||
|
mov eax,[columns]
|
|||
|
@@: cmp ebx,[lines]
|
|||
|
jb @f
|
|||
|
mov ebx,[lines]
|
|||
|
dec ebx
|
|||
|
@@:
|
|||
|
cmp [posx],eax
|
|||
|
jne .change_cur_pos
|
|||
|
cmp [posy],ebx
|
|||
|
je still.skip_write
|
|||
|
|
|||
|
.change_cur_pos:
|
|||
|
mov [posx],eax
|
|||
|
mov eax,[posy]
|
|||
|
pushd ebx
|
|||
|
popd [posy]
|
|||
|
cmp eax,ebx
|
|||
|
je @f
|
|||
|
push ebx
|
|||
|
mov ebx,eax
|
|||
|
call drawfile.ex
|
|||
|
pop eax
|
|||
|
@@: mov ebx,eax
|
|||
|
call drawfile.ex
|
|||
|
jmp still
|
|||
|
|
|||
|
.check_vscroll:
|
|||
|
mov ecx,[p_info.x_size]
|
|||
|
sub ecx,SCRLW+5-2
|
|||
|
pushd ecx [top_ofs] ecx [bot_ofs]
|
|||
|
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
|
|||
|
add [__rc+0x8],SCRLW-2
|
|||
|
add [__rc+0x4],SCRLW+1
|
|||
|
sub [__rc+0xC],SCRLW*2+3
|
|||
|
mov ecx,__rc
|
|||
|
call pt_in_rect
|
|||
|
jnc .check_hscroll
|
|||
|
|
|||
|
sub ebx,[__rc+0x4]
|
|||
|
cmp [vscrl_capt],0
|
|||
|
jge .vcaptured
|
|||
|
mov eax,[vscrl_top]
|
|||
|
cmp ebx,eax
|
|||
|
jb .center_vcapture
|
|||
|
add eax,[vscrl_size]
|
|||
|
cmp ebx,eax
|
|||
|
jae .center_vcapture
|
|||
|
mov eax,ebx
|
|||
|
sub eax,[vscrl_top]
|
|||
|
dec eax
|
|||
|
mov [vscrl_capt],eax
|
|||
|
dec ebx
|
|||
|
jmp .vcaptured
|
|||
|
.center_vcapture:
|
|||
|
mov eax,[vscrl_size]
|
|||
|
shr eax,1
|
|||
|
mov [vscrl_capt],eax
|
|||
|
.vcaptured:
|
|||
|
sub ebx,[vscrl_capt]
|
|||
|
jns @f
|
|||
|
xor ebx,ebx
|
|||
|
@@:
|
|||
|
mov [vscrl_top],ebx
|
|||
|
mov eax,[lines]
|
|||
|
sub eax,[slines]
|
|||
|
mul ebx
|
|||
|
mov ebx,[bot_ofs]
|
|||
|
sub ebx,[top_ofs]
|
|||
|
sub ebx,SCRLW*3+2+2 ;**
|
|||
|
sub ebx,[vscrl_size]
|
|||
|
div ebx
|
|||
|
cmp eax,[top_line]
|
|||
|
je still.skip_write
|
|||
|
mov [top_line],eax
|
|||
|
call check_bottom_right
|
|||
|
call drawfile
|
|||
|
jmp still.skip_write
|
|||
|
|
|||
|
.check_hscroll:
|
|||
|
pushd (OLEFT+SCRLW+1) [bot_ofs] [p_info.x_size] [bot_ofs]
|
|||
|
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
|
|||
|
add [__rc+0x8],-SCRLW*2-10-1
|
|||
|
add [__rc+0x4],-SCRLW
|
|||
|
add [__rc+0xC],-2
|
|||
|
mov ecx,__rc
|
|||
|
call pt_in_rect
|
|||
|
jnc .capture_off
|
|||
|
|
|||
|
mov ebx,eax
|
|||
|
sub ebx,[__rc+0x0]
|
|||
|
cmp [hscrl_capt],0
|
|||
|
jge .hcaptured
|
|||
|
mov eax,[hscrl_top]
|
|||
|
cmp ebx,eax
|
|||
|
jb .center_hcapture
|
|||
|
add eax,[hscrl_size]
|
|||
|
cmp ebx,eax
|
|||
|
jae .center_hcapture
|
|||
|
mov eax,ebx
|
|||
|
sub eax,[hscrl_top]
|
|||
|
dec eax
|
|||
|
mov [hscrl_capt],eax
|
|||
|
dec ebx
|
|||
|
jmp .hcaptured
|
|||
|
.center_hcapture:
|
|||
|
mov eax,[hscrl_size]
|
|||
|
shr eax,1
|
|||
|
mov [hscrl_capt],eax
|
|||
|
.hcaptured:
|
|||
|
sub ebx,[hscrl_capt]
|
|||
|
jns @f
|
|||
|
xor ebx,ebx
|
|||
|
@@:
|
|||
|
mov [hscrl_top],ebx
|
|||
|
mov eax,[columns]
|
|||
|
sub eax,[scolumns]
|
|||
|
mul ebx
|
|||
|
mov ebx,[p_info.x_size]
|
|||
|
sub ebx,SCRLW*3+10+2 ;**
|
|||
|
sub ebx,[hscrl_size]
|
|||
|
div ebx
|
|||
|
cmp eax,[left_col]
|
|||
|
je still.skip_write
|
|||
|
mov [left_col],eax
|
|||
|
call check_bottom_right
|
|||
|
call drawfile
|
|||
|
jmp still.skip_write
|
|||
|
|
|||
|
.capture_off:
|
|||
|
or [vscrl_capt],-1
|
|||
|
or [hscrl_capt],-1
|
|||
|
jmp still.skip_write
|
|||
|
|
|||
|
func pt_in_rect
|
|||
|
cmp eax,[ecx+0x0]
|
|||
|
jl @f
|
|||
|
cmp ebx,[ecx+0x4]
|
|||
|
jl @f
|
|||
|
cmp eax,[ecx+0x8]
|
|||
|
jg @f
|
|||
|
cmp ebx,[ecx+0xC]
|
|||
|
jg @f
|
|||
|
stc
|
|||
|
ret
|
|||
|
@@: clc
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
func check_bottom_right
|
|||
|
push eax
|
|||
|
mov eax,[top_line]
|
|||
|
add eax,[slines]
|
|||
|
cmp eax,[lines]
|
|||
|
jbe .lp1
|
|||
|
mov eax,[lines]
|
|||
|
sub eax,[slines]
|
|||
|
jns @f
|
|||
|
xor eax,eax
|
|||
|
@@: mov [top_line],eax
|
|||
|
.lp1: mov eax,[left_col]
|
|||
|
add eax,[scolumns]
|
|||
|
cmp eax,[columns]
|
|||
|
jbe .exit
|
|||
|
mov eax,[columns]
|
|||
|
sub eax,[scolumns]
|
|||
|
jns @f
|
|||
|
xor eax,eax
|
|||
|
@@: mov [left_col],eax
|
|||
|
.exit:
|
|||
|
pop eax
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
; *********************************
|
|||
|
; * BUTTON HANDLER *
|
|||
|
; *********************************
|
|||
|
|
|||
|
button:
|
|||
|
|
|||
|
mcall 17
|
|||
|
shr eax,8
|
|||
|
|
|||
|
cmp eax,'UP'
|
|||
|
jne not_up
|
|||
|
dec [top_line]
|
|||
|
jns check_inv_all.skip_check
|
|||
|
mov [top_line],0
|
|||
|
jmp still.skip_write
|
|||
|
not_up:
|
|||
|
|
|||
|
cmp eax,'DN'
|
|||
|
jne not_down
|
|||
|
inc [top_line]
|
|||
|
mov eax,[lines]
|
|||
|
sub eax,[slines]
|
|||
|
cmp eax,[top_line]
|
|||
|
jae check_inv_all.skip_check
|
|||
|
dec eax
|
|||
|
mov [top_line],eax
|
|||
|
jmp still.skip_write
|
|||
|
not_down:
|
|||
|
|
|||
|
cmp eax,'LT'
|
|||
|
jne not_left
|
|||
|
dec [left_col]
|
|||
|
jns check_inv_all.skip_check
|
|||
|
mov [left_col],0
|
|||
|
jmp still.skip_write
|
|||
|
not_left:
|
|||
|
|
|||
|
cmp eax,'RT'
|
|||
|
jne not_right
|
|||
|
inc [left_col]
|
|||
|
mov eax,[columns]
|
|||
|
sub eax,[scolumns]
|
|||
|
cmp eax,[left_col]
|
|||
|
jae check_inv_all.skip_check
|
|||
|
dec eax
|
|||
|
mov [left_col],eax
|
|||
|
jmp still.skip_write
|
|||
|
not_right:
|
|||
|
|
|||
|
; SEARCH {
|
|||
|
search:
|
|||
|
cmp al,50
|
|||
|
jne no_search
|
|||
|
|
|||
|
.skip_check:
|
|||
|
|
|||
|
cld
|
|||
|
mov ecx,[posy]
|
|||
|
mov edx,ecx
|
|||
|
call get_line_offset
|
|||
|
cmp dword[esi],0
|
|||
|
je still
|
|||
|
call get_real_length
|
|||
|
add esi,4
|
|||
|
or eax,eax
|
|||
|
jz .end_line.2
|
|||
|
mov ecx,eax
|
|||
|
sub ecx,[posx]
|
|||
|
push esi
|
|||
|
add esi,[posx]
|
|||
|
dec ecx
|
|||
|
inc esi
|
|||
|
jmp @f
|
|||
|
|
|||
|
.next_line:
|
|||
|
push esi
|
|||
|
@@:
|
|||
|
sub ecx,[s_search.size]
|
|||
|
inc ecx
|
|||
|
|
|||
|
.next_char:
|
|||
|
dec ecx
|
|||
|
js .end_line
|
|||
|
xor edi,edi
|
|||
|
|
|||
|
.next_ok:
|
|||
|
movzx eax,byte[edi+esi]
|
|||
|
movzx ebx,byte[edi+s_search]
|
|||
|
|
|||
|
cmp al,$61
|
|||
|
jb @f
|
|||
|
add al,[eax+add_table-$61]
|
|||
|
@@: cmp bl,$61
|
|||
|
jb @f
|
|||
|
add bl,[ebx+add_table-$61]
|
|||
|
@@:
|
|||
|
|
|||
|
cmp al,bl
|
|||
|
je @f
|
|||
|
|
|||
|
inc esi
|
|||
|
jmp .next_char
|
|||
|
@@:
|
|||
|
inc edi
|
|||
|
cmp edi,[s_search.size]
|
|||
|
jne .next_ok
|
|||
|
|
|||
|
.found:
|
|||
|
add esp,4
|
|||
|
mov [posy],edx
|
|||
|
mov ecx,edx
|
|||
|
lea eax,[esi-4]
|
|||
|
call get_line_offset
|
|||
|
sub eax,esi
|
|||
|
mov [posx],eax
|
|||
|
jmp check_inv_all
|
|||
|
|
|||
|
.end_line:
|
|||
|
pop esi
|
|||
|
.end_line.2:
|
|||
|
add esi,[esi-4]
|
|||
|
inc edx
|
|||
|
call get_real_length
|
|||
|
mov ecx,eax
|
|||
|
lodsd
|
|||
|
or eax,eax
|
|||
|
jnz .next_line
|
|||
|
jmp still
|
|||
|
|
|||
|
; SEARCH }
|
|||
|
|
|||
|
no_search:
|
|||
|
|
|||
|
; TOOLBAR {
|
|||
|
cmp eax,10000
|
|||
|
jb no_toolbar
|
|||
|
|
|||
|
add eax,-10000
|
|||
|
jnz @f
|
|||
|
mov bl,0;[run_outfile],0
|
|||
|
call start_fasm
|
|||
|
jmp still
|
|||
|
@@: dec eax
|
|||
|
jnz @f
|
|||
|
mov bl,1;[run_outfile],1
|
|||
|
call start_fasm
|
|||
|
jmp still
|
|||
|
@@: dec eax
|
|||
|
jnz @f
|
|||
|
call open_debug_board
|
|||
|
jmp still
|
|||
|
@@: dec eax
|
|||
|
jnz still
|
|||
|
call open_sysfuncs_txt
|
|||
|
jmp still
|
|||
|
; TOOLBAR }
|
|||
|
|
|||
|
no_toolbar:
|
|||
|
|
|||
|
cmp al,4
|
|||
|
jne noid4
|
|||
|
|
|||
|
; LOAD_FILE {
|
|||
|
do_load_file:
|
|||
|
cmp [s_fname],'/'
|
|||
|
jne @f
|
|||
|
call loadhdfile
|
|||
|
jmp .restorecursor
|
|||
|
@@: call loadfile
|
|||
|
|
|||
|
.restorecursor:
|
|||
|
xor eax,eax
|
|||
|
mov [top_line],eax
|
|||
|
mov [posx],eax
|
|||
|
mov [posy],eax
|
|||
|
|
|||
|
; enable color syntax for ASM and INC files:
|
|||
|
mov [asm_mode],al
|
|||
|
|
|||
|
mov eax,[s_fname.size]
|
|||
|
add eax,s_fname
|
|||
|
mov byte[eax],0
|
|||
|
cmp dword[eax-3],'ASM'
|
|||
|
jne @f
|
|||
|
inc [asm_mode]
|
|||
|
jmp .nocol
|
|||
|
@@: cmp dword[eax-3],'INC'
|
|||
|
jne .nocol
|
|||
|
inc [asm_mode]
|
|||
|
.nocol:
|
|||
|
|
|||
|
; if the header is the same as previous,
|
|||
|
; just redraw the text area
|
|||
|
; else redraw the window
|
|||
|
|
|||
|
mov ecx, [s_fname.size]
|
|||
|
add ecx, 10 ; strlen(" - TINYPAD");
|
|||
|
cmp ecx, [s_title.size]
|
|||
|
jne @f
|
|||
|
add ecx, -10
|
|||
|
mov esi, s_fname ; strcmp(s_fname,header);
|
|||
|
mov edi, s_title
|
|||
|
rep cmpsb
|
|||
|
jne @f
|
|||
|
call drawfile
|
|||
|
jmp still
|
|||
|
@@:
|
|||
|
|
|||
|
; set window title:
|
|||
|
mov esi,s_fname
|
|||
|
mov edi,s_title
|
|||
|
mov ecx,[s_fname.size]
|
|||
|
lea eax,[ecx+10]
|
|||
|
mov [s_title.size],eax
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
|
|||
|
mov dword[edi],' - '
|
|||
|
add edi,3
|
|||
|
mov esi,htext
|
|||
|
mov ecx,htext.size
|
|||
|
rep movsb
|
|||
|
|
|||
|
call drawwindow
|
|||
|
jmp still
|
|||
|
; LOAD_FILE }
|
|||
|
|
|||
|
noid4:
|
|||
|
|
|||
|
cmp al, 2
|
|||
|
jz yessave
|
|||
|
|
|||
|
dec al ; close if butid == 1
|
|||
|
jnz nosave
|
|||
|
; EXIT:
|
|||
|
mov [main_closed],1
|
|||
|
mcall -1
|
|||
|
|
|||
|
; SAVE_FILE {
|
|||
|
yessave:
|
|||
|
call save_file
|
|||
|
jmp still
|
|||
|
; SAVE_FILE }
|
|||
|
|
|||
|
nosave:
|
|||
|
inc al
|
|||
|
call read_string
|
|||
|
jmp still
|
|||
|
|
|||
|
;**********************************
|
|||
|
;* REDRAW HANDLER *
|
|||
|
;**********************************
|
|||
|
|
|||
|
func red
|
|||
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᮢ<EFBFBD><E1AEA2> <20><><EFBFBD><EFBFBD>
|
|||
|
call drawwindow
|
|||
|
jmp check_inv_all.skip_check
|
|||
|
endf
|
|||
|
|
|||
|
;**********************************
|
|||
|
;* KEY HANDLER *
|
|||
|
;**********************************
|
|||
|
|
|||
|
key:
|
|||
|
mcall 2 ; GET KEY
|
|||
|
cmp al,1
|
|||
|
je still
|
|||
|
|
|||
|
shr eax,8
|
|||
|
|
|||
|
; HELP_WND {
|
|||
|
cmp al,0xD2;210 ; Ctrl + F1
|
|||
|
jne no_help_text
|
|||
|
|
|||
|
mcall 51,1,help_thread_start,0xfff0
|
|||
|
jmp still
|
|||
|
; HELP_WND }
|
|||
|
|
|||
|
no_help_text:
|
|||
|
; LOAD_FILE {
|
|||
|
cmp al,211 ; Ctrl + F2
|
|||
|
je do_load_file
|
|||
|
; LOAD_FILE }
|
|||
|
|
|||
|
; SEARCH {
|
|||
|
cmp al,212 ; Ctrl + F3
|
|||
|
je search.skip_check
|
|||
|
; SEARCH }
|
|||
|
|
|||
|
; SAVE_FILE {
|
|||
|
cmp al,213 ; Ctrl + F4
|
|||
|
je yessave
|
|||
|
; SAVE_FILE }
|
|||
|
|
|||
|
; ENTER_FILENAME {
|
|||
|
cmp al,214 ; Ctrl + F5
|
|||
|
jne @f
|
|||
|
mov al,5
|
|||
|
call read_string
|
|||
|
jmp still
|
|||
|
@@:
|
|||
|
; ENTER_FILENAME }
|
|||
|
|
|||
|
; ENTER_SEARCH {
|
|||
|
cmp al,215 ; Ctrl + F6
|
|||
|
jne @f
|
|||
|
mov al,51
|
|||
|
call read_string
|
|||
|
jmp still
|
|||
|
@@:
|
|||
|
; ENTER_SEARCH }
|
|||
|
|
|||
|
; CHANGE_LANG_LAYOUT {
|
|||
|
cmp al,217 ; Ctrl + F8
|
|||
|
jne @f
|
|||
|
call layout
|
|||
|
jmp still
|
|||
|
@@:
|
|||
|
; CHANGE_LANG_LAYOUT }
|
|||
|
|
|||
|
; 3 times english -> <20><><EFBFBD>᪨<EFBFBD>
|
|||
|
; 2 times <20><><EFBFBD>᪨<EFBFBD> -> english
|
|||
|
|
|||
|
; COPY START {
|
|||
|
cmp al,19
|
|||
|
jne no_copy_start
|
|||
|
push [posy]
|
|||
|
pop [copy_start]
|
|||
|
jmp still
|
|||
|
; COPY START }
|
|||
|
|
|||
|
no_copy_start:
|
|||
|
|
|||
|
; COPY END {
|
|||
|
cmp al,5
|
|||
|
jne no_copy_end
|
|||
|
mov eax,[posy]
|
|||
|
cmp eax,[copy_start]
|
|||
|
jae @f
|
|||
|
xchg eax,[copy_start]
|
|||
|
@@: sub eax,[copy_start]
|
|||
|
inc eax
|
|||
|
mov [copy_count],eax
|
|||
|
|
|||
|
mov ecx,[copy_start]
|
|||
|
call get_line_offset
|
|||
|
push esi
|
|||
|
mov ecx,eax
|
|||
|
@@: lodsd
|
|||
|
add esi,eax
|
|||
|
loop @b
|
|||
|
mov ecx,esi
|
|||
|
pop esi
|
|||
|
sub ecx,esi
|
|||
|
mov [copy_size],ecx
|
|||
|
|
|||
|
mov edi,0x2f0000
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
jmp still
|
|||
|
; COPY END }
|
|||
|
|
|||
|
no_copy_end:
|
|||
|
|
|||
|
; PASTE {
|
|||
|
cmp al,16
|
|||
|
jne no_copy_paste
|
|||
|
mov ebx,[copy_count]
|
|||
|
or ebx,ebx
|
|||
|
jz still
|
|||
|
add [lines],ebx
|
|||
|
|
|||
|
mov ecx,[posy]
|
|||
|
call get_line_offset
|
|||
|
mov ebx,esi
|
|||
|
mov edi,0x2E0000
|
|||
|
mov esi,edi
|
|||
|
mov ecx,[copy_size]
|
|||
|
sub esi,ecx
|
|||
|
lea ecx,[esi+4]
|
|||
|
sub ecx,ebx
|
|||
|
std
|
|||
|
rep movsb
|
|||
|
mov edi,ebx
|
|||
|
mov esi,0x2F0000
|
|||
|
mov ecx,[copy_size]
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
|
|||
|
jmp check_inv_all
|
|||
|
; PASTE }
|
|||
|
|
|||
|
no_copy_paste:
|
|||
|
|
|||
|
; INSERT_SEPARATOR {
|
|||
|
cmp al,0x0C ; Ctrl+L
|
|||
|
jne no_insert_separator
|
|||
|
|
|||
|
mov ecx,[posy]
|
|||
|
call get_line_offset
|
|||
|
mov ebx,esi
|
|||
|
|
|||
|
mov ecx,[lines]
|
|||
|
call get_line_offset
|
|||
|
lea edi,[esi+90+4]
|
|||
|
lea ecx,[esi+4]
|
|||
|
sub ecx,ebx
|
|||
|
std
|
|||
|
rep movsb
|
|||
|
|
|||
|
lea edi,[ebx+5]
|
|||
|
mov dword[ebx],90
|
|||
|
mov al,ASEPC
|
|||
|
mov ecx,79
|
|||
|
cld
|
|||
|
rep stosb
|
|||
|
mov al,' '
|
|||
|
mov ecx,10
|
|||
|
rep stosb
|
|||
|
mov byte[ebx+4],';'
|
|||
|
|
|||
|
inc [lines]
|
|||
|
inc [posy]
|
|||
|
|
|||
|
jmp check_inv_all
|
|||
|
; INSERT_SEPARATOR }
|
|||
|
|
|||
|
no_insert_separator:
|
|||
|
|
|||
|
; DEL_LINE {
|
|||
|
cmp al,4
|
|||
|
jne no_delete_line
|
|||
|
|
|||
|
mov eax,[posy]
|
|||
|
inc eax
|
|||
|
cmp eax,[lines]
|
|||
|
jge still
|
|||
|
|
|||
|
mov ecx,[posy]
|
|||
|
call get_line_offset
|
|||
|
mov edi,esi
|
|||
|
lodsd
|
|||
|
add esi,eax
|
|||
|
|
|||
|
dec [lines]
|
|||
|
mov ecx,0x2e0000
|
|||
|
sub ecx,esi
|
|||
|
shr ecx,2 ;// fixed (was 4)
|
|||
|
cld
|
|||
|
rep movsd
|
|||
|
jmp check_inv_all
|
|||
|
; DEL_LINE }
|
|||
|
|
|||
|
no_delete_line:
|
|||
|
|
|||
|
; ENTER {
|
|||
|
cmp al,13
|
|||
|
jnz noenter
|
|||
|
|
|||
|
mov ecx,[posy]
|
|||
|
call get_line_offset
|
|||
|
|
|||
|
mov ebx,[posx]
|
|||
|
cmp ebx,[esi]
|
|||
|
jb @f
|
|||
|
mov ebx,[esi]
|
|||
|
dec ebx
|
|||
|
jns @f
|
|||
|
xor ebx,ebx
|
|||
|
@@:
|
|||
|
|
|||
|
cld
|
|||
|
|
|||
|
mov edi,0x10000
|
|||
|
mov ebp,esi
|
|||
|
mov ecx,ebx
|
|||
|
inc ecx
|
|||
|
@@: dec ecx
|
|||
|
jz @f
|
|||
|
cmp byte[esi+ecx+4-1],' '
|
|||
|
je @b
|
|||
|
@@: lea eax,[ecx+10]
|
|||
|
stosd
|
|||
|
jecxz @f
|
|||
|
push esi
|
|||
|
add esi,4
|
|||
|
rep movsb
|
|||
|
pop esi
|
|||
|
@@: mov al,' '
|
|||
|
mov ecx,10
|
|||
|
rep stosb
|
|||
|
|
|||
|
mov ecx,[esi]
|
|||
|
sub ecx,ebx;[posx]
|
|||
|
add esi,ebx;[posx]
|
|||
|
add esi,4
|
|||
|
inc ecx
|
|||
|
@@: dec ecx
|
|||
|
jz @f
|
|||
|
cmp byte[esi+ecx-1],' '
|
|||
|
je @b
|
|||
|
@@: jz .lp1
|
|||
|
@@: cmp byte[esi],' '
|
|||
|
jne .lp1
|
|||
|
inc esi
|
|||
|
loop @b
|
|||
|
.lp1: push edi ecx
|
|||
|
mov ecx,[ebp]
|
|||
|
lea edi,[ebp+4]
|
|||
|
mov al,' '
|
|||
|
repe scasb
|
|||
|
mov eax,ecx
|
|||
|
pop ecx edi
|
|||
|
je .lp2
|
|||
|
neg eax
|
|||
|
add eax,[ebp]
|
|||
|
dec eax
|
|||
|
jmp @f
|
|||
|
.lp2: xor eax,eax
|
|||
|
@@: mov edx,edi
|
|||
|
add edi,4
|
|||
|
mov [posx],eax
|
|||
|
jecxz @f
|
|||
|
push ecx
|
|||
|
mov ecx,eax
|
|||
|
mov al,' '
|
|||
|
rep stosb
|
|||
|
pop ecx
|
|||
|
@@: jecxz @f
|
|||
|
rep movsb
|
|||
|
@@: mov ecx,10
|
|||
|
mov al,' '
|
|||
|
rep stosb
|
|||
|
|
|||
|
lea eax,[edi-4]
|
|||
|
sub eax,edx
|
|||
|
mov [edx],eax
|
|||
|
|
|||
|
lea ecx,[edi-0x10000]
|
|||
|
|
|||
|
push ecx
|
|||
|
mov edi,0x2E0000
|
|||
|
lea esi,[edi+4]
|
|||
|
sub esi,ecx
|
|||
|
add esi,[ebp]
|
|||
|
lea ecx,[esi-4]
|
|||
|
sub ecx,ebp
|
|||
|
std
|
|||
|
cmp esi,edi
|
|||
|
jb @f
|
|||
|
je .lp3
|
|||
|
lea esi,[ebp+4]
|
|||
|
mov eax,[esp]
|
|||
|
lea edi,[esi+eax-4]
|
|||
|
add esi,[ebp]
|
|||
|
mov ecx,0x2E0000
|
|||
|
sub ecx,esi
|
|||
|
cld
|
|||
|
@@: rep movsb
|
|||
|
.lp3: pop ecx
|
|||
|
mov esi,0x10000
|
|||
|
mov edi,ebp
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
|
|||
|
inc [posy]
|
|||
|
inc [lines]
|
|||
|
|
|||
|
jmp check_inv_all
|
|||
|
; ENTER }
|
|||
|
|
|||
|
noenter:
|
|||
|
|
|||
|
; UP {
|
|||
|
cmp al,130+48
|
|||
|
jnz noup
|
|||
|
|
|||
|
mov eax,[posy]
|
|||
|
dec eax
|
|||
|
jns @f
|
|||
|
xor eax,eax
|
|||
|
@@: mov ecx,[top_line]
|
|||
|
cmp eax,ecx
|
|||
|
jae @f
|
|||
|
dec ecx
|
|||
|
jns @f
|
|||
|
xor ecx,ecx
|
|||
|
@@: jmp check_inv_all.skip_init
|
|||
|
; UP }
|
|||
|
|
|||
|
noup:
|
|||
|
|
|||
|
; DOWN {
|
|||
|
cmp al,129+48
|
|||
|
jnz nodown
|
|||
|
|
|||
|
mov eax,[posy]
|
|||
|
inc eax
|
|||
|
cmp eax,[lines]
|
|||
|
jb @f
|
|||
|
dec eax
|
|||
|
@@: mov ecx,[top_line]
|
|||
|
mov edx,eax
|
|||
|
sub edx,ecx
|
|||
|
cmp edx,[slines]
|
|||
|
jb @f
|
|||
|
inc ecx
|
|||
|
@@: jmp check_inv_all.skip_init
|
|||
|
; DOWN }
|
|||
|
|
|||
|
nodown:
|
|||
|
|
|||
|
; LEFT {
|
|||
|
cmp al,128+48
|
|||
|
jnz noleft
|
|||
|
mov eax,[posx]
|
|||
|
dec eax
|
|||
|
jns @f
|
|||
|
inc eax
|
|||
|
@@: mov [posx],eax
|
|||
|
jmp check_inv_all
|
|||
|
; LEFT }
|
|||
|
|
|||
|
noleft:
|
|||
|
|
|||
|
; RIGHT {
|
|||
|
cmp al,131+48
|
|||
|
jnz noright
|
|||
|
mov eax,[posx]
|
|||
|
inc eax
|
|||
|
cmp eax,[columns]
|
|||
|
jbe @f
|
|||
|
dec eax
|
|||
|
@@: mov [posx],eax
|
|||
|
jmp check_inv_all
|
|||
|
; RIGHT }
|
|||
|
|
|||
|
noright:
|
|||
|
|
|||
|
; PAGE_UP {
|
|||
|
page_up:
|
|||
|
cmp al,136+48
|
|||
|
jnz nopu
|
|||
|
mov edx,[slines]
|
|||
|
dec edx
|
|||
|
mov eax,[posy]
|
|||
|
mov ecx,[top_line]
|
|||
|
sub eax,edx
|
|||
|
jns @f
|
|||
|
xor eax,eax
|
|||
|
@@: sub ecx,edx
|
|||
|
jns @f
|
|||
|
xor ecx,ecx
|
|||
|
@@: jmp check_inv_all.skip_init
|
|||
|
; PAGE_UP }
|
|||
|
|
|||
|
nopu:
|
|||
|
|
|||
|
; PAGE_DOWN {
|
|||
|
page_down:
|
|||
|
cmp al,135+48
|
|||
|
jnz nopd
|
|||
|
mov edx,[slines]
|
|||
|
dec edx
|
|||
|
mov eax,[posy]
|
|||
|
mov ecx,[top_line]
|
|||
|
add eax,edx
|
|||
|
add ecx,edx
|
|||
|
cmp eax,[lines]
|
|||
|
jb @f
|
|||
|
mov eax,[lines]
|
|||
|
dec eax
|
|||
|
@@: jmp check_inv_all.skip_init
|
|||
|
; PAGE_DOWN }
|
|||
|
|
|||
|
nopd:
|
|||
|
|
|||
|
; HOME {
|
|||
|
cmp al,132+48
|
|||
|
jnz nohome
|
|||
|
mov [posx],0
|
|||
|
jmp check_inv_all
|
|||
|
; HOME }
|
|||
|
|
|||
|
nohome:
|
|||
|
|
|||
|
; END {
|
|||
|
end_key:
|
|||
|
cmp al,133+48
|
|||
|
jnz noend
|
|||
|
|
|||
|
mov ecx,[posy]
|
|||
|
call get_line_offset
|
|||
|
call get_real_length
|
|||
|
mov [posx],eax
|
|||
|
jmp check_inv_all
|
|||
|
; END }
|
|||
|
|
|||
|
noend:
|
|||
|
|
|||
|
; GO_START {
|
|||
|
cmp al,251 ; Ctrl + [
|
|||
|
jnz no_go_to_start
|
|||
|
xor eax,eax
|
|||
|
mov [top_line],eax
|
|||
|
mov [posy],eax
|
|||
|
jmp check_inv_all.skip_check
|
|||
|
; GO_START }
|
|||
|
|
|||
|
no_go_to_start:
|
|||
|
|
|||
|
; GO_END {
|
|||
|
cmp al,253 ; Ctrl + ]
|
|||
|
jnz no_go_to_end
|
|||
|
mov eax,[lines] ; eax = lines in the file
|
|||
|
mov [posy],eax
|
|||
|
sub eax,[slines] ; eax -= lines on the screen
|
|||
|
jns @f
|
|||
|
xor eax,eax
|
|||
|
@@: mov [top_line],eax
|
|||
|
dec [posy]
|
|||
|
jmp check_inv_all.skip_check
|
|||
|
; GO_END }
|
|||
|
|
|||
|
no_go_to_end:
|
|||
|
|
|||
|
; DELETE {
|
|||
|
__key_delete:
|
|||
|
cmp al,134+48
|
|||
|
jne nodel
|
|||
|
|
|||
|
mov ecx,[posy]
|
|||
|
call get_line_offset
|
|||
|
lea ebx,[esi+4]
|
|||
|
mov ebp,esi
|
|||
|
|
|||
|
call get_real_length
|
|||
|
or eax,eax
|
|||
|
je .line_up
|
|||
|
|
|||
|
mov ecx,[posx]
|
|||
|
cmp ecx,eax
|
|||
|
jae .line_up
|
|||
|
lea edi,[ebx+ecx]
|
|||
|
neg ecx
|
|||
|
add ecx,[ebp]
|
|||
|
repe scasb
|
|||
|
je .line_up
|
|||
|
|
|||
|
mov edi,ebx
|
|||
|
mov ecx,[posx]
|
|||
|
add edi,ecx
|
|||
|
lea esi,[edi+1]
|
|||
|
neg ecx
|
|||
|
add ecx,[ebp]
|
|||
|
dec ecx
|
|||
|
rep movsb
|
|||
|
mov byte[edi],' '
|
|||
|
|
|||
|
jmp check_inv_all
|
|||
|
|
|||
|
.line_up:
|
|||
|
mov eax,[lines]
|
|||
|
dec eax
|
|||
|
cmp eax,[posy]
|
|||
|
je still;.ok
|
|||
|
mov edi,0x10004
|
|||
|
mov esi,ebx
|
|||
|
mov ecx,[posx]
|
|||
|
rep movsb
|
|||
|
mov ecx,[posx]
|
|||
|
mov [0x10000],ecx
|
|||
|
cmp ecx,[ebp]
|
|||
|
jbe @f
|
|||
|
sub ecx,[ebp]
|
|||
|
sub edi,ecx
|
|||
|
mov al,' '
|
|||
|
rep stosb
|
|||
|
@@: lea esi,[ebx+4]
|
|||
|
add esi,[ebp]
|
|||
|
mov ecx,[esi-4]
|
|||
|
add [0x10000],ecx
|
|||
|
rep movsb
|
|||
|
|
|||
|
lea ecx,[edi-0x10000]
|
|||
|
|
|||
|
mov esi,0x10000
|
|||
|
call get_real_length
|
|||
|
cmp eax,[columns]
|
|||
|
jbe @f
|
|||
|
mov [columns],eax
|
|||
|
@@:
|
|||
|
|
|||
|
push ecx
|
|||
|
mov edi,0x2E0000
|
|||
|
lea esi,[edi+8]
|
|||
|
sub esi,ecx
|
|||
|
add esi,[ebp]
|
|||
|
lea eax,[ebp+4]
|
|||
|
add eax,[ebp]
|
|||
|
add esi,[eax]
|
|||
|
lea ecx,[esi-4]
|
|||
|
sub ecx,ebp
|
|||
|
std
|
|||
|
cmp esi,edi
|
|||
|
jb @f
|
|||
|
jz .lp1
|
|||
|
mov edi,ebp
|
|||
|
add edi,[esp]
|
|||
|
lea esi,[ebp+8]
|
|||
|
add esi,[esi-8]
|
|||
|
add esi,[esi-4]
|
|||
|
mov ecx,0x2E0000
|
|||
|
sub ecx,esi
|
|||
|
cld
|
|||
|
@@: rep movsb
|
|||
|
.lp1: pop ecx
|
|||
|
mov esi,0x10000
|
|||
|
mov edi,ebp
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
|
|||
|
.ok.dec.lines:
|
|||
|
dec [lines]
|
|||
|
mov eax,[lines]
|
|||
|
cmp [posy],eax
|
|||
|
jb check_inv_all
|
|||
|
dec eax
|
|||
|
mov [posy],eax
|
|||
|
jmp check_inv_all
|
|||
|
; DELETE }
|
|||
|
|
|||
|
nodel:
|
|||
|
|
|||
|
; INSERT {
|
|||
|
cmp al,137+48
|
|||
|
jnz noins
|
|||
|
;// ... toggle insert/overwrite mode here ...
|
|||
|
jmp still;check_inv_str
|
|||
|
; INSERT }
|
|||
|
|
|||
|
noins:
|
|||
|
|
|||
|
; BACKSPACE {
|
|||
|
cmp al,8
|
|||
|
jnz nobs
|
|||
|
|
|||
|
mov eax,[posx]
|
|||
|
dec eax
|
|||
|
js .line_up
|
|||
|
|
|||
|
dec [posx]
|
|||
|
mov ecx,[posy]
|
|||
|
call get_line_offset
|
|||
|
|
|||
|
mov ebx,eax
|
|||
|
call get_real_length
|
|||
|
cmp eax,[posx]
|
|||
|
jb check_inv_all
|
|||
|
|
|||
|
lea edi,[esi+4+ebx]
|
|||
|
mov ecx,ebx
|
|||
|
neg ecx
|
|||
|
add ecx,[esi]
|
|||
|
dec ecx
|
|||
|
lea esi,[edi+1]
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
mov byte[edi],' '
|
|||
|
|
|||
|
jmp check_inv_str
|
|||
|
|
|||
|
.line_up:
|
|||
|
cmp [posy],0
|
|||
|
je still
|
|||
|
mov ecx,[posy]
|
|||
|
dec ecx
|
|||
|
call get_line_offset
|
|||
|
mov ebp,esi
|
|||
|
lea ebx,[esi+4]
|
|||
|
mov ecx,[ebp]
|
|||
|
@@: cmp byte[ebx+ecx-1],' '
|
|||
|
jne @f
|
|||
|
dec ecx
|
|||
|
jg @b
|
|||
|
@@: mov [posx],ecx
|
|||
|
dec [posy]
|
|||
|
cld
|
|||
|
jmp __key_delete.line_up
|
|||
|
; BACKSPACE }
|
|||
|
|
|||
|
nobs:
|
|||
|
|
|||
|
; TAB {
|
|||
|
__key_tab:
|
|||
|
cmp eax,9 ; Tab
|
|||
|
jne notab
|
|||
|
|
|||
|
mov eax,[posx]
|
|||
|
|
|||
|
mov ecx,eax
|
|||
|
add eax,ATABW
|
|||
|
and eax,not(ATABW-1)
|
|||
|
push eax ' '
|
|||
|
sub eax,ecx
|
|||
|
.direct:
|
|||
|
mov ecx,[posy]
|
|||
|
call get_line_offset
|
|||
|
|
|||
|
xchg eax,ecx
|
|||
|
|
|||
|
call get_real_length
|
|||
|
cmp eax,[posx]
|
|||
|
jae @f
|
|||
|
mov eax,[posx]
|
|||
|
@@: mov edx,[esi]
|
|||
|
sub edx,eax
|
|||
|
cmp ecx,edx
|
|||
|
jl @f
|
|||
|
pushad; esi ecx eax
|
|||
|
mov ecx,0x2E0000-10+1
|
|||
|
lea eax,[esi+4]
|
|||
|
add eax,[esi]
|
|||
|
sub ecx,eax
|
|||
|
mov edi,0x2E0000
|
|||
|
mov esi,0x2E0000-10
|
|||
|
std
|
|||
|
rep movsb
|
|||
|
mov ecx,10
|
|||
|
mov al,' '
|
|||
|
rep stosb
|
|||
|
popad; eax ecx esi
|
|||
|
add dword[esi],10
|
|||
|
jmp @b
|
|||
|
@@: lea ebx,[esi+4]
|
|||
|
push ecx
|
|||
|
lea edi,[ebx-1]
|
|||
|
add edi,[esi]
|
|||
|
mov esi,edi
|
|||
|
sub esi,ecx
|
|||
|
lea ecx,[esi+1]
|
|||
|
sub ecx,ebx
|
|||
|
sub ecx,[posx]
|
|||
|
std
|
|||
|
rep movsb
|
|||
|
.ok: pop ecx
|
|||
|
pop eax
|
|||
|
rep stosb
|
|||
|
|
|||
|
cld
|
|||
|
|
|||
|
pop [posx]
|
|||
|
|
|||
|
lea esi,[ebx-4]
|
|||
|
call get_real_length
|
|||
|
cmp eax,[posx]
|
|||
|
jae @f
|
|||
|
mov eax,[posx]
|
|||
|
@@: cmp eax,[columns]
|
|||
|
jbe @f
|
|||
|
mov [columns],eax
|
|||
|
@@:
|
|||
|
jmp check_inv_all
|
|||
|
; TAB }
|
|||
|
|
|||
|
notab:
|
|||
|
|
|||
|
; ADD_KEY {
|
|||
|
push [posx] eax
|
|||
|
inc dword[esp+4]
|
|||
|
mov eax,1
|
|||
|
jmp __key_tab.direct
|
|||
|
; ADD_KEY }
|
|||
|
|
|||
|
check_inv_str = check_inv_all
|
|||
|
@^
|
|||
|
func check_inv_str
|
|||
|
mov eax,[posy]
|
|||
|
mov ecx,[top_line]
|
|||
|
.skip_init:
|
|||
|
call check_cur_vis
|
|||
|
mov [posy],eax
|
|||
|
mov [top_line],ecx
|
|||
|
.skip_check:
|
|||
|
; call invalidate_string
|
|||
|
call drawfile
|
|||
|
jmp still
|
|||
|
endf
|
|||
|
^@
|
|||
|
func check_inv_all
|
|||
|
mov eax,[posy]
|
|||
|
mov ecx,[top_line]
|
|||
|
.skip_init:
|
|||
|
call check_cur_vis
|
|||
|
mov [posy],eax
|
|||
|
mov [top_line],ecx
|
|||
|
.skip_check:
|
|||
|
; call clear_screen
|
|||
|
call drawfile
|
|||
|
jmp still
|
|||
|
endf
|
|||
|
|
|||
|
func check_cur_vis
|
|||
|
cmp eax,ecx
|
|||
|
jb .low
|
|||
|
mov edx,ecx
|
|||
|
add edx,[slines]
|
|||
|
cmp edx,[lines]
|
|||
|
jbe @f
|
|||
|
mov edx,[lines]
|
|||
|
@@: cmp eax,edx
|
|||
|
jb @f
|
|||
|
lea ecx,[eax+1]
|
|||
|
sub ecx,[slines]
|
|||
|
jns @f
|
|||
|
xor ecx,ecx
|
|||
|
jmp @f
|
|||
|
.low: mov ecx,eax
|
|||
|
@@:
|
|||
|
mov edx,ecx
|
|||
|
add edx,[slines]
|
|||
|
cmp edx,[lines]
|
|||
|
jbe @f
|
|||
|
mov ecx,[lines]
|
|||
|
sub ecx,[slines]
|
|||
|
jns @f
|
|||
|
xor ecx,ecx
|
|||
|
@@:;mov [top_line],eax
|
|||
|
|
|||
|
pushad
|
|||
|
mov eax,[posx]
|
|||
|
mov ebx,[left_col]
|
|||
|
mov ecx,ebx
|
|||
|
add ecx,[scolumns]
|
|||
|
cmp eax,ebx
|
|||
|
jb .lp1
|
|||
|
cmp eax,ecx
|
|||
|
jb .exit.2
|
|||
|
lea ebx,[eax]
|
|||
|
sub ebx,[scolumns]
|
|||
|
jmp @f
|
|||
|
.lp1: mov ebx,eax
|
|||
|
@@: mov [left_col],ebx
|
|||
|
.exit.2:
|
|||
|
mov [posx],eax
|
|||
|
popad
|
|||
|
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
func get_real_length
|
|||
|
mov eax,[esi]
|
|||
|
@@: cmp byte[esi+eax+4-1],' '
|
|||
|
jne @f
|
|||
|
dec eax
|
|||
|
jnz @b
|
|||
|
@@: ret
|
|||
|
endf
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
|
|||
|
;----------------------------------------------------------------------------
|
|||
|
func start_fasm ;////////////////////////////////////////////////////////////
|
|||
|
;----------------------------------------------------------------------------
|
|||
|
; BL = run after compile
|
|||
|
;----------------------------------------------------------------------------
|
|||
|
cmp [asm_mode],0
|
|||
|
jne @f
|
|||
|
ret
|
|||
|
@@: mov esi,s_fname
|
|||
|
mov edi,fasm_parameters
|
|||
|
|
|||
|
cmp byte[esi],'/'
|
|||
|
je .yes_systree
|
|||
|
|
|||
|
mov ecx,[s_fname.size]
|
|||
|
rep movsb
|
|||
|
|
|||
|
mov al,','
|
|||
|
stosb
|
|||
|
|
|||
|
mov ecx,[s_fname.size]
|
|||
|
add ecx,-4
|
|||
|
mov esi,s_fname
|
|||
|
rep movsb
|
|||
|
|
|||
|
mov al,','
|
|||
|
stosb
|
|||
|
|
|||
|
mov dword[edi],'/RD/'
|
|||
|
mov word[edi+4],'1/'
|
|||
|
add edi,6
|
|||
|
|
|||
|
mov al,0
|
|||
|
stosb
|
|||
|
|
|||
|
jmp .run
|
|||
|
|
|||
|
.yes_systree:
|
|||
|
add esi,[s_fname.size]
|
|||
|
dec esi
|
|||
|
|
|||
|
xor ecx,ecx
|
|||
|
mov al,'/'
|
|||
|
@@: cmp [esi],al
|
|||
|
je @f
|
|||
|
dec esi
|
|||
|
inc ecx
|
|||
|
jmp @b
|
|||
|
@@: inc esi
|
|||
|
|
|||
|
push esi esi ecx
|
|||
|
|
|||
|
rep movsb
|
|||
|
|
|||
|
mov al,','
|
|||
|
stosb
|
|||
|
|
|||
|
pop ecx esi
|
|||
|
|
|||
|
add ecx,-4
|
|||
|
rep movsb
|
|||
|
|
|||
|
mov al,','
|
|||
|
stosb
|
|||
|
|
|||
|
pop ecx
|
|||
|
sub ecx,s_fname
|
|||
|
mov esi,s_fname
|
|||
|
|
|||
|
rep movsb
|
|||
|
|
|||
|
mov al,0
|
|||
|
stosb
|
|||
|
|
|||
|
.run:
|
|||
|
cmp bl,0 ; run outfile ?
|
|||
|
je @f
|
|||
|
mov dword[edi-1],',run'
|
|||
|
mov byte[edi+3],0
|
|||
|
@@: mcall 19,fasm_filename,fasm_parameters
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
func open_debug_board
|
|||
|
mcall 19,debug_filename,0
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
func open_sysfuncs_txt
|
|||
|
mcall 19,tinypad_filename,sysfuncs_filename
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
func layout
|
|||
|
; ᬥ<><E1ACA5><EFBFBD><EFBFBD> <20><>᪫<EFBFBD><E1AAAB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
mcall 19,setup,param_setup
|
|||
|
mcall 5,eax
|
|||
|
; call activate_me
|
|||
|
; ret
|
|||
|
;endf
|
|||
|
|
|||
|
;func activate_me
|
|||
|
mcall 9,p_info,-1
|
|||
|
inc eax
|
|||
|
inc eax
|
|||
|
mov ecx,eax
|
|||
|
mov edi,[p_info.PID]
|
|||
|
mov ebx,p_info
|
|||
|
@@: dec ecx
|
|||
|
jz @f ; counter=0 => not found? => return
|
|||
|
mcall 9
|
|||
|
cmp edi,[p_info.PID]
|
|||
|
jne @b
|
|||
|
mcall 18,3
|
|||
|
mcall 5,eax
|
|||
|
@@: ret
|
|||
|
endf
|
|||
|
|
|||
|
; *******************************************************************
|
|||
|
; ************************** DRAW WINDOW **************************
|
|||
|
; *******************************************************************
|
|||
|
|
|||
|
func drawwindow
|
|||
|
|
|||
|
mcall 48,3,sc,sizeof.system_colors
|
|||
|
|
|||
|
mcall 12,1
|
|||
|
|
|||
|
push [color_tbl+4*5]
|
|||
|
pop [sc.work]
|
|||
|
|
|||
|
mov edx,[sc.work]
|
|||
|
add edx,0x03000000
|
|||
|
mov esi,[sc.grab]
|
|||
|
or esi,0x80000000
|
|||
|
mcall 0,<100,6*80+6+OLEFT+SCRLW>,<75,402>,,,[sc.frame]
|
|||
|
|
|||
|
mcall 48,4
|
|||
|
mov [skinh],eax
|
|||
|
push eax
|
|||
|
|
|||
|
mcall 9,p_info,-1
|
|||
|
pop eax
|
|||
|
cmp [p_info.y_size],0
|
|||
|
je .exit.2
|
|||
|
|
|||
|
mov [top_ofs],eax
|
|||
|
dec [top_ofs]
|
|||
|
cmp [asm_mode],0
|
|||
|
je @f
|
|||
|
add [top_ofs],ATOPH+1
|
|||
|
@@:
|
|||
|
; header string
|
|||
|
mov ebx,eax
|
|||
|
shr ebx,1
|
|||
|
adc ebx,1+0x000A0000-4
|
|||
|
mcall 4,,[sc.grab_text],s_title,[s_title.size]
|
|||
|
|
|||
|
mov eax,[p_info.x_size]
|
|||
|
sub eax,5*2+SCRLW+2
|
|||
|
cdq
|
|||
|
mov ebx,6
|
|||
|
div ebx
|
|||
|
mov [scolumns],eax
|
|||
|
|
|||
|
mov eax,[p_info.y_size] ; calculate buttons position
|
|||
|
add eax,-5-ABTNH*3-2-2
|
|||
|
mov [bot_ofs],eax
|
|||
|
|
|||
|
; mov eax,[procinfo.y_size]
|
|||
|
mov [do_not_draw],1 ; do_not_draw = true
|
|||
|
|
|||
|
mov ebx,eax
|
|||
|
sub ebx,[skinh]
|
|||
|
sub ebx,ATOPH+SCRLW*3+AMINS+5
|
|||
|
js .no_draw
|
|||
|
|
|||
|
; cmp eax,100
|
|||
|
; jb .no_draw ; do not draw text & buttons if height < 100
|
|||
|
|
|||
|
mov [do_not_draw],0 ; do_not_draw = false
|
|||
|
sub eax,SCRLW+2+2
|
|||
|
sub eax,[top_ofs]
|
|||
|
cdq
|
|||
|
mov ebx,10
|
|||
|
div ebx
|
|||
|
mov [slines],eax
|
|||
|
|
|||
|
mov ebx,[p_info.x_size]
|
|||
|
add ebx,5*65536-5
|
|||
|
mov ecx,[top_ofs-2]
|
|||
|
mov cx,word[top_ofs]
|
|||
|
mcall 38,,,[sc.work_text]
|
|||
|
mov ecx,[bot_ofs-2]
|
|||
|
mov cx,word[bot_ofs]
|
|||
|
sub ecx,0x00010001
|
|||
|
push ecx
|
|||
|
mcall
|
|||
|
add ecx,(ABTNH+2)*65536+ABTNH+2
|
|||
|
mcall
|
|||
|
add ecx,(ABTNH+2)*65536+ABTNH+2
|
|||
|
mcall
|
|||
|
pop ecx
|
|||
|
add cx,(ABTNH+2)*3
|
|||
|
mov ebx,[p_info.x_size]
|
|||
|
sub ebx,RBTNW+5+1
|
|||
|
push bx
|
|||
|
shl ebx,16
|
|||
|
pop bx
|
|||
|
mcall
|
|||
|
mov ebx,(5+LBTNW+1)*65536+(5+LBTNW+1)
|
|||
|
add ecx,(ABTNH+2)*65536
|
|||
|
mcall
|
|||
|
|
|||
|
inc [top_ofs]
|
|||
|
|
|||
|
mov ebx,5*65536
|
|||
|
mov bx,word[p_info.x_size]
|
|||
|
sub bx,9
|
|||
|
push bx
|
|||
|
sub bx,RBTNW+2
|
|||
|
mov ecx,[bot_ofs-2]
|
|||
|
mov cx,ABTNH+1
|
|||
|
mcall 13,,,[sc.work_graph] ; BAR STRIPE
|
|||
|
|
|||
|
pop bx
|
|||
|
cmp [asm_mode],0
|
|||
|
je .skip_top_btns
|
|||
|
mov ecx,[skinh-2]
|
|||
|
mov cx,ATOPH
|
|||
|
mcall ; UPPER BAR
|
|||
|
|
|||
|
mov eax,8
|
|||
|
mov ebx,6*65536+52
|
|||
|
mov ecx,[skinh]
|
|||
|
inc ecx
|
|||
|
shl ecx,16
|
|||
|
add ecx,ATOPH-3
|
|||
|
mov edx,10000
|
|||
|
mov esi,[sc.work_button]
|
|||
|
@@:
|
|||
|
mcall ; TOOLBAR BUTTONS
|
|||
|
add ebx,54*65536
|
|||
|
inc edx
|
|||
|
cmp edx,10004
|
|||
|
jb @b
|
|||
|
|
|||
|
.skip_top_btns:
|
|||
|
mov ebx,5*65536+LBTNW
|
|||
|
mov ecx,[bot_ofs]
|
|||
|
shl ecx,16
|
|||
|
add ecx,(ABTNH+2)*65536+ABTNH
|
|||
|
mcall 8,,,5,[sc.work_button] ; FILE BUTTON
|
|||
|
|
|||
|
add ecx,(ABTNH+2)*65536
|
|||
|
mcall ,,,51 ; STRING BUTTON
|
|||
|
|
|||
|
push ebx ecx
|
|||
|
|
|||
|
mov ebx,[p_info.x_size]
|
|||
|
shl ebx,16
|
|||
|
add ebx,(-5-RBTNW)*65536+RBTNW
|
|||
|
mov ecx,[bot_ofs]
|
|||
|
shl ecx,16
|
|||
|
add ecx,ABTNH
|
|||
|
mov edx,2
|
|||
|
mcall ,,,2 ; SAVE BUTTON
|
|||
|
|
|||
|
add ecx,(ABTNH+2)*65536
|
|||
|
mcall ,,,4 ; FILE BUTTON
|
|||
|
|
|||
|
add ecx,(ABTNH+2)*65536
|
|||
|
mcall ,,,50 ; SEARCH BUTTON
|
|||
|
|
|||
|
shr ecx,16
|
|||
|
mov bx,cx
|
|||
|
add ebx,-ABTNH-2-ABTNH/2-2-3
|
|||
|
mcall 4,,[sc.work_button_text],rstr,rstr.size/3
|
|||
|
add ebx,ABTNH+2
|
|||
|
add edx,rstr.size/3
|
|||
|
mcall
|
|||
|
add ebx,ABTNH+2
|
|||
|
add edx,rstr.size/3
|
|||
|
mcall
|
|||
|
|
|||
|
pop edi ebx
|
|||
|
shr edi,16
|
|||
|
mov bx,di
|
|||
|
add ebx,-1-ABTNH/2-2-2
|
|||
|
mcall ,,,lstr,lstr.size/2
|
|||
|
add ebx,ABTNH+2
|
|||
|
add edx,lstr.size/2
|
|||
|
mcall
|
|||
|
|
|||
|
cmp [asm_mode],0
|
|||
|
je @f
|
|||
|
mov ebx,[skinh]
|
|||
|
add ebx,0x000C0000+ATOPH/2-4
|
|||
|
mcall ,,,toolbar_btn_text,toolbar_btn_text.size
|
|||
|
@@:
|
|||
|
mov eax,[bot_ofs]
|
|||
|
add eax,ABTNH+2
|
|||
|
mov [ya],eax
|
|||
|
mov [addr],s_fname
|
|||
|
call print_text
|
|||
|
|
|||
|
add eax,ABTNH+2
|
|||
|
mov [ya],eax
|
|||
|
mov [addr],s_search
|
|||
|
call print_text
|
|||
|
jmp .exit
|
|||
|
|
|||
|
.no_draw:
|
|||
|
mov ebx,[skinh]
|
|||
|
mov [top_ofs],ebx
|
|||
|
mov eax,[p_info.y_size]
|
|||
|
add eax,-3
|
|||
|
mov [bot_ofs],eax
|
|||
|
sub eax,ebx
|
|||
|
push eax
|
|||
|
add eax,-2-SCRLW
|
|||
|
cdq
|
|||
|
mov ebx,10
|
|||
|
idiv ebx
|
|||
|
mov [slines],eax
|
|||
|
pop eax
|
|||
|
|
|||
|
mov ebx,[p_info.y_size]
|
|||
|
sub ebx,[skinh]
|
|||
|
sub ebx,SCRLW*3++AMINS+7
|
|||
|
jns @f
|
|||
|
|
|||
|
inc [do_not_draw]
|
|||
|
|
|||
|
add eax,-2
|
|||
|
cdq
|
|||
|
mov ebx,10
|
|||
|
idiv ebx
|
|||
|
mov [slines],eax
|
|||
|
|
|||
|
mov eax,[p_info.x_size]
|
|||
|
sub eax,5*2
|
|||
|
cdq
|
|||
|
mov ebx,6
|
|||
|
idiv ebx
|
|||
|
mov [scolumns],eax
|
|||
|
@@:
|
|||
|
|
|||
|
.exit:
|
|||
|
call drawfile
|
|||
|
.exit.2:
|
|||
|
mcall 12,2
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
;--------------------------------------------
|
|||
|
func get_line_offset
|
|||
|
;--------------------------------------------
|
|||
|
; Input:
|
|||
|
; ECX = line number
|
|||
|
; Output:
|
|||
|
; ESI = line data offset
|
|||
|
;--------------------------------------------
|
|||
|
push eax
|
|||
|
mov esi,0x80000
|
|||
|
jecxz .exit
|
|||
|
@@: lodsd
|
|||
|
add esi,eax
|
|||
|
loop @b
|
|||
|
.exit:
|
|||
|
pop eax
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
; **********************************
|
|||
|
; *********** DRAWFILE ***********
|
|||
|
; **********************************
|
|||
|
|
|||
|
;---------------------------------------------------
|
|||
|
func drawfile.ex
|
|||
|
;---------------------------------------------------
|
|||
|
; Input:
|
|||
|
; EAX = start line
|
|||
|
; EBX = end line
|
|||
|
;---------------------------------------------------
|
|||
|
cmp [p_info.y_size],0
|
|||
|
jne @f
|
|||
|
ret
|
|||
|
@@:
|
|||
|
call check_bottom_right
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
cmp [slines],0
|
|||
|
jle drawfile.exit
|
|||
|
|
|||
|
cmp eax,ebx
|
|||
|
jae @f
|
|||
|
xchg eax,ebx
|
|||
|
@@: cmp eax,[top_line]
|
|||
|
jae @f
|
|||
|
mov eax,[top_line]
|
|||
|
@@: mov ecx,[top_line]
|
|||
|
add ecx,[slines]
|
|||
|
cmp ebx,ecx
|
|||
|
jb @f
|
|||
|
dec ecx
|
|||
|
mov ebx,ecx
|
|||
|
@@: cmp eax,ebx
|
|||
|
ja drawfile.exit
|
|||
|
|
|||
|
mov ecx,eax
|
|||
|
call get_line_offset
|
|||
|
|
|||
|
.start:
|
|||
|
mov ecx,ebx
|
|||
|
sub ecx,eax
|
|||
|
|
|||
|
mov ebx,[top_ofs]
|
|||
|
add ebx,OLEFT*65536+1
|
|||
|
sub eax,[top_line]
|
|||
|
imul eax,10
|
|||
|
add ebx,eax
|
|||
|
|
|||
|
imul ebp,[left_col],6*65536
|
|||
|
|
|||
|
jmp drawfile.next_line
|
|||
|
endf
|
|||
|
|
|||
|
func drawfile
|
|||
|
cmp [p_info.y_size],0
|
|||
|
jne @f
|
|||
|
ret
|
|||
|
@@:
|
|||
|
call check_bottom_right
|
|||
|
|
|||
|
pushad
|
|||
|
|
|||
|
mov ebx,[top_ofs]
|
|||
|
add ebx,OLEFT*65536+1
|
|||
|
|
|||
|
mov ecx,[top_line]
|
|||
|
call get_line_offset
|
|||
|
|
|||
|
.start:
|
|||
|
mov ecx,[slines]
|
|||
|
or ecx,ecx
|
|||
|
jle .exit
|
|||
|
|
|||
|
imul ebp,[left_col],6*65536
|
|||
|
|
|||
|
.next_line:
|
|||
|
|
|||
|
push ecx ebx
|
|||
|
|
|||
|
mov ecx,ebx
|
|||
|
shl ecx,16
|
|||
|
mov cl,10
|
|||
|
mov ebx,[p_info.x_size]
|
|||
|
add ebx,(OLEFT-1)*65536-10-SCRLW ; <OLEFT-1,LINE_WIDTH*6+2>
|
|||
|
mcall 13,,,[color_tbl+4*5]
|
|||
|
|
|||
|
xor ecx,ecx
|
|||
|
lodsd
|
|||
|
mov [cur_line_len],eax
|
|||
|
|
|||
|
or eax,eax
|
|||
|
ja .next_block
|
|||
|
add esp,4*2
|
|||
|
jmp .draw_cursor
|
|||
|
|
|||
|
.next_block:
|
|||
|
|
|||
|
push esi
|
|||
|
push ecx
|
|||
|
call get_next_part
|
|||
|
pop ebx
|
|||
|
push ecx
|
|||
|
mov ecx,eax
|
|||
|
|
|||
|
push esi ebx
|
|||
|
mov eax,ebx
|
|||
|
sub ebx,[left_col]
|
|||
|
cmp ebx,[scolumns]
|
|||
|
jge @f
|
|||
|
add ebx,esi
|
|||
|
jle @f
|
|||
|
mov ebx,[esp+8+4*2] ;// 4*2=esi+ebx
|
|||
|
sub eax,[left_col]
|
|||
|
jge .qqq
|
|||
|
sub edx,eax
|
|||
|
add esi,eax
|
|||
|
mov eax,OLEFT*65536
|
|||
|
jmp .qqq2
|
|||
|
.qqq:
|
|||
|
inc eax
|
|||
|
imul eax,6*65536
|
|||
|
.qqq2:
|
|||
|
and ebx,0x0000FFFF
|
|||
|
add ebx,eax
|
|||
|
|
|||
|
mov eax,[esp]
|
|||
|
add eax,[esp+4];esi
|
|||
|
sub eax,[left_col]
|
|||
|
sub eax,[scolumns]
|
|||
|
jle .qweqwe
|
|||
|
sub esi,eax
|
|||
|
.qweqwe:
|
|||
|
|
|||
|
mcall 4;[esp+8]
|
|||
|
@@:
|
|||
|
pop eax eax ; ebx esi
|
|||
|
imul eax,6
|
|||
|
add [esp+10],ax
|
|||
|
pop ecx esi
|
|||
|
cmp ecx,[cur_line_len];LINE_WIDTH
|
|||
|
jl .next_block
|
|||
|
|
|||
|
pop ebx ecx
|
|||
|
and ebx,0x0000FFFF
|
|||
|
add ebx,OLEFT*65536+10
|
|||
|
add esi,[cur_line_len];LINE_WIDTH
|
|||
|
dec ecx
|
|||
|
jg .next_line
|
|||
|
|
|||
|
;--------------------------------------------------------------------------
|
|||
|
.draw_cursor:
|
|||
|
mov eax,[posy]
|
|||
|
sub eax,[top_line]
|
|||
|
js @f
|
|||
|
mov ecx,[slines]
|
|||
|
sub ecx,eax
|
|||
|
jle @f
|
|||
|
imul eax,10
|
|||
|
add eax,[top_ofs]
|
|||
|
inc eax
|
|||
|
shl eax,16
|
|||
|
add eax,10-1
|
|||
|
mov ecx,eax
|
|||
|
mov ebx,[posx]
|
|||
|
sub ebx,[left_col]
|
|||
|
js @f
|
|||
|
cmp ebx,[scolumns]
|
|||
|
ja @f
|
|||
|
imul ebx,6
|
|||
|
add ebx,OLEFT-1
|
|||
|
shl ebx,16
|
|||
|
inc ebx
|
|||
|
inc ebx
|
|||
|
mov edx,[color_tbl+4*5]
|
|||
|
not edx
|
|||
|
and edx,0x00FFFFFF
|
|||
|
mcall 13
|
|||
|
@@:
|
|||
|
;--------------------------------------------------------------------------
|
|||
|
cmp [do_not_draw],2
|
|||
|
je .exit
|
|||
|
|
|||
|
mov ebx,[p_info.x_size]
|
|||
|
shl ebx,16
|
|||
|
add ebx,(-SCRLW-5+2)*65536+SCRLW-2
|
|||
|
mov ecx,[top_ofs-2]
|
|||
|
mov cx,SCRLW-1
|
|||
|
mcall 8,,,'UP',[sc.work_button]
|
|||
|
pushad
|
|||
|
push 0x18
|
|||
|
shr ecx,16
|
|||
|
mov bx,cx
|
|||
|
add ebx,(SCRLW/2-3)*65536+SCRLW/2-4
|
|||
|
mcall 4,,[sc.work_button_text],esp,1
|
|||
|
add esp,4
|
|||
|
popad
|
|||
|
mov ecx,[bot_ofs]
|
|||
|
shl ecx,16
|
|||
|
add ecx,(-SCRLW*2-1)*65536+SCRLW-1
|
|||
|
mcall ,,,'DN'
|
|||
|
pushad
|
|||
|
push 0x19
|
|||
|
shr ecx,16
|
|||
|
mov bx,cx
|
|||
|
add ebx,(SCRLW/2-3)*65536+SCRLW/2-4
|
|||
|
mcall 4,,[sc.work_button_text],esp,1
|
|||
|
add esp,4
|
|||
|
popad
|
|||
|
sub ebx,1*65536-2
|
|||
|
|
|||
|
push ebx
|
|||
|
mov eax,[lines]
|
|||
|
mov ebx,[slines]
|
|||
|
mov ecx,[top_line]
|
|||
|
mov edx,[bot_ofs]
|
|||
|
sub edx,[top_ofs]
|
|||
|
add edx,-(SCRLW*3+2)
|
|||
|
call get_scroll_vars
|
|||
|
mov [vscrl_top],eax
|
|||
|
mov [vscrl_size],ebx
|
|||
|
pop ebx
|
|||
|
|
|||
|
mov ecx,eax
|
|||
|
add ecx,[top_ofs]
|
|||
|
shl ecx,16
|
|||
|
mov cx,word[vscrl_size]
|
|||
|
add ecx,(SCRLW+1)*65536
|
|||
|
mcall 13,,,[sc.work_button]
|
|||
|
mov ecx,[top_ofs-2]
|
|||
|
mov cx,word[vscrl_top]
|
|||
|
add ecx,(SCRLW+1)*65536
|
|||
|
mov edx,[color_tbl+4*5]
|
|||
|
or cx,cx
|
|||
|
jle @f
|
|||
|
mcall
|
|||
|
@@:
|
|||
|
mov ecx,[top_ofs]
|
|||
|
add ecx,[vscrl_top]
|
|||
|
add ecx,[vscrl_size]
|
|||
|
add ecx,SCRLW+1
|
|||
|
mov di,cx
|
|||
|
shl ecx,16
|
|||
|
mov cx,word[bot_ofs]
|
|||
|
sub cx,di
|
|||
|
sub cx,(SCRLW+1)*2
|
|||
|
jle @f
|
|||
|
mcall
|
|||
|
@@:
|
|||
|
;-------------------------------
|
|||
|
@^
|
|||
|
pushad
|
|||
|
mov eax,ebx
|
|||
|
shr eax,16
|
|||
|
mov bx,ax
|
|||
|
add ebx,0x00010001
|
|||
|
mov ecx,[top_ofs]
|
|||
|
add ecx,[vscrl_top]
|
|||
|
add ecx,SCRLW+1
|
|||
|
mov eax,ecx
|
|||
|
shl ecx,16
|
|||
|
add eax,[vscrl_size]
|
|||
|
dec eax
|
|||
|
add ecx,eax
|
|||
|
mov edx,[sc.work_button]
|
|||
|
add edx,0x00202020
|
|||
|
mcall 38
|
|||
|
add ebx,(SCRLW-2)*65536+(SCRLW-2)
|
|||
|
mov edx,[sc.work_button]
|
|||
|
sub edx,0x00202020
|
|||
|
mcall 38
|
|||
|
sub ebx,(SCRLW-2)*65536
|
|||
|
mov ax,cx
|
|||
|
shl ecx,16
|
|||
|
mov cx,ax
|
|||
|
mcall 38
|
|||
|
mov eax,[vscrl_size-2]
|
|||
|
mov ax,word[vscrl_size]
|
|||
|
sub eax,0x00010001
|
|||
|
sub ecx,eax
|
|||
|
mov edx,[sc.work_button]
|
|||
|
add edx,0x00202020
|
|||
|
mcall 38
|
|||
|
popad
|
|||
|
^@
|
|||
|
;-------------------------------
|
|||
|
mov eax,ebx
|
|||
|
shr eax,16
|
|||
|
add bx,ax
|
|||
|
mov ecx,[top_ofs-2]
|
|||
|
mov cx,word[top_ofs]
|
|||
|
add ecx,SCRLW*65536+SCRLW
|
|||
|
mcall 38,,,[sc.work_text]
|
|||
|
mov ecx,[bot_ofs-2]
|
|||
|
mov cx,word[bot_ofs]
|
|||
|
sub ecx,(SCRLW*2+2)*65536+(SCRLW*2+2)
|
|||
|
mcall
|
|||
|
rol ebx,16
|
|||
|
push bx
|
|||
|
rol ebx,16
|
|||
|
pop bx
|
|||
|
mov ecx,[top_ofs-2]
|
|||
|
mov cx,word[bot_ofs]
|
|||
|
add ecx,-2
|
|||
|
mcall
|
|||
|
;--------------------------------------------------------------------------
|
|||
|
mov ebx,5*65536+SCRLW-1
|
|||
|
mov ecx,[bot_ofs]
|
|||
|
shl ecx,16
|
|||
|
add ecx,(-SCRLW)*65536+SCRLW-2
|
|||
|
mcall 8,,,'LT',[sc.work_button]
|
|||
|
pushad
|
|||
|
push 0x1B
|
|||
|
shr ecx,16
|
|||
|
mov bx,cx
|
|||
|
add ebx,(SCRLW/2-3)*65536+SCRLW/2-4
|
|||
|
mcall 4,,[sc.work_button_text],esp,1
|
|||
|
add esp,4
|
|||
|
popad
|
|||
|
mov ebx,[p_info.x_size]
|
|||
|
shl ebx,16
|
|||
|
add ebx,(-SCRLW*2-5)*65536+SCRLW
|
|||
|
mcall ,,,'RT'
|
|||
|
pushad
|
|||
|
push 0x1A
|
|||
|
shr ecx,16
|
|||
|
mov bx,cx
|
|||
|
add ebx,(SCRLW/2-2)*65536+SCRLW/2-4
|
|||
|
mcall 4,,[sc.work_button_text],esp,1
|
|||
|
add esp,4
|
|||
|
popad
|
|||
|
inc ecx
|
|||
|
|
|||
|
push ecx
|
|||
|
mov eax,[columns]
|
|||
|
mov ebx,[scolumns]
|
|||
|
mov ecx,[left_col]
|
|||
|
mov edx,[p_info.x_size]
|
|||
|
add edx,-(SCRLW*3+10)
|
|||
|
call get_scroll_vars
|
|||
|
mov [hscrl_top],eax
|
|||
|
mov [hscrl_size],ebx
|
|||
|
pop ecx
|
|||
|
|
|||
|
mov ebx,eax
|
|||
|
add ebx,OLEFT+SCRLW
|
|||
|
shl ebx,16
|
|||
|
mov bx,word[hscrl_size]
|
|||
|
mcall 13,,,[sc.work_button]
|
|||
|
mov ebx,(OLEFT+SCRLW)*65536
|
|||
|
mov bx,word[hscrl_top]
|
|||
|
mcall ,,,[color_tbl+4*5]
|
|||
|
mov ebx,OLEFT+SCRLW-1
|
|||
|
add ebx,[hscrl_top]
|
|||
|
add ebx,[hscrl_size]
|
|||
|
mov di,bx
|
|||
|
shl ebx,16
|
|||
|
mov bx,word[p_info.x_size]
|
|||
|
sub bx,di
|
|||
|
sub bx,SCRLW*2+6
|
|||
|
jle @f
|
|||
|
mcall
|
|||
|
@@:
|
|||
|
mov eax,ebx
|
|||
|
shr eax,16
|
|||
|
add bx,ax
|
|||
|
mov ecx,[bot_ofs-2]
|
|||
|
mov cx,word[bot_ofs]
|
|||
|
sub ecx,SCRLW*65536+2
|
|||
|
mcall 38,<OLEFT+SCRLW-1,OLEFT+SCRLW-1>,,[sc.work_text]
|
|||
|
mov ebx,[p_info.x_size-2]
|
|||
|
mov bx,word[p_info.x_size]
|
|||
|
sub ebx,(SCRLW*2+6)*65536+(SCRLW*2+6)
|
|||
|
mcall
|
|||
|
mov ebx,[p_info.x_size]
|
|||
|
add ebx,5*65536-5
|
|||
|
mov ecx,[bot_ofs-2]
|
|||
|
mov cx,word[bot_ofs]
|
|||
|
sub ecx,(SCRLW+1)*65536+(SCRLW+1)
|
|||
|
mcall
|
|||
|
;--------------------------------------------------------------------------
|
|||
|
|
|||
|
.exit:
|
|||
|
popad
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
;--------------------------------------------
|
|||
|
func get_scroll_vars
|
|||
|
;--------------------------------------------
|
|||
|
; Input:
|
|||
|
; EAX = maximum data size (units)
|
|||
|
; EBX = visible data size (units)
|
|||
|
; ECX = current data position (units)
|
|||
|
; EDX = scrolling area size (pixels)
|
|||
|
; Output:
|
|||
|
; EAX = srcoller offset (pixels)
|
|||
|
; EBX = scroller size (pixels)
|
|||
|
;--------------------------------------------
|
|||
|
push eax ebx ecx edx
|
|||
|
; sub eax,ebx
|
|||
|
mov esi,eax
|
|||
|
mov eax,edx
|
|||
|
mul ebx
|
|||
|
idiv esi
|
|||
|
cmp eax,[esp]
|
|||
|
jae .null
|
|||
|
cmp eax,AMINS
|
|||
|
jae @f
|
|||
|
neg eax
|
|||
|
add eax,AMINS
|
|||
|
sub [esp],eax
|
|||
|
mov eax,AMINS
|
|||
|
@@: mov [esp+8],eax ; scroller size
|
|||
|
mov eax,[esp]
|
|||
|
mul ecx
|
|||
|
idiv esi
|
|||
|
mov [esp+12],eax ; scroller offset
|
|||
|
add eax,[esp+8]
|
|||
|
cmp eax,[esp]
|
|||
|
jbe @f
|
|||
|
dec dword[esp+12]
|
|||
|
@@:
|
|||
|
pop edx ecx ebx eax
|
|||
|
ret
|
|||
|
.null:
|
|||
|
mov dword[esp+8],0
|
|||
|
mov dword[esp+12],0
|
|||
|
jmp @b
|
|||
|
endf
|
|||
|
|
|||
|
;--------------------------------------------
|
|||
|
func get_next_part
|
|||
|
;--------------------------------------------
|
|||
|
; Input:
|
|||
|
; ECX = current letter
|
|||
|
; ESI = string
|
|||
|
; Output:
|
|||
|
; ECX = color
|
|||
|
; EDX = string
|
|||
|
; ESI = length
|
|||
|
;--------------------------------------------
|
|||
|
cmp [asm_mode],0
|
|||
|
je .plain.text
|
|||
|
xor ebx,ebx
|
|||
|
mov edx,ecx
|
|||
|
add esi,ecx
|
|||
|
mov edi,symbols
|
|||
|
mov al,[esi]
|
|||
|
cmp al,';'
|
|||
|
je .comment
|
|||
|
mov ecx,symbols.size
|
|||
|
repne scasb
|
|||
|
je .symbol
|
|||
|
cmp al,'$'
|
|||
|
jne @f
|
|||
|
mov edi,symbols
|
|||
|
mov al,[esi+1]
|
|||
|
mov ecx,symbols.size
|
|||
|
repne scasb
|
|||
|
je .not_symbol
|
|||
|
jmp .number
|
|||
|
@@: cmp al,'0'
|
|||
|
jb @f
|
|||
|
cmp al,'9'
|
|||
|
jbe .number
|
|||
|
@@: cmp al,"'"
|
|||
|
je .string
|
|||
|
cmp al,'"'
|
|||
|
je .string
|
|||
|
.not_symbol:
|
|||
|
inc ebx
|
|||
|
inc edx
|
|||
|
cmp edx,[cur_line_len];LINE_WIDTH
|
|||
|
jge @f
|
|||
|
mov edi,symbols
|
|||
|
mov al,[esi+ebx]
|
|||
|
cmp al,';'
|
|||
|
je @f
|
|||
|
mov ecx,symbols.size
|
|||
|
repne scasb
|
|||
|
jne .not_symbol
|
|||
|
@@: mov ecx,edx
|
|||
|
mov edx,esi
|
|||
|
mov esi,ebx
|
|||
|
mov eax,[color_tbl+4*0]
|
|||
|
ret
|
|||
|
.symbol:
|
|||
|
inc ebx
|
|||
|
inc edx
|
|||
|
cmp edx,[cur_line_len];LINE_WIDTH
|
|||
|
jge @f
|
|||
|
mov edi,symbols
|
|||
|
mov al,[esi+ebx]
|
|||
|
mov ecx,symbols.size
|
|||
|
repne scasb
|
|||
|
je .symbol
|
|||
|
@@: mov ecx,edx
|
|||
|
mov edx,esi
|
|||
|
mov esi,ebx
|
|||
|
mov eax,[color_tbl+4*4]
|
|||
|
ret
|
|||
|
.comment:
|
|||
|
neg edx
|
|||
|
add edx,[cur_line_len];LINE_WIDTH
|
|||
|
xchg edx,esi
|
|||
|
mov ecx,[cur_line_len];LINE_WIDTH
|
|||
|
mov eax,[color_tbl+4*3]
|
|||
|
ret
|
|||
|
.number:
|
|||
|
inc ebx
|
|||
|
inc edx
|
|||
|
cmp edx,[cur_line_len];LINE_WIDTH
|
|||
|
jge @f
|
|||
|
mov edi,symbols
|
|||
|
mov al,[esi+ebx]
|
|||
|
cmp al,';'
|
|||
|
je @f
|
|||
|
mov ecx,symbols.size
|
|||
|
repne scasb
|
|||
|
jne .number
|
|||
|
@@: mov ecx,edx
|
|||
|
mov edx,esi
|
|||
|
mov esi,ebx
|
|||
|
mov eax,[color_tbl+4*1]
|
|||
|
ret
|
|||
|
.string:
|
|||
|
inc ebx
|
|||
|
inc edx
|
|||
|
cmp edx,[cur_line_len];LINE_WIDTH
|
|||
|
jge @f
|
|||
|
cmp [esi+ebx],al
|
|||
|
jne .string
|
|||
|
inc ebx
|
|||
|
inc edx
|
|||
|
@@:
|
|||
|
mov ecx,edx
|
|||
|
mov edx,esi
|
|||
|
mov esi,ebx
|
|||
|
mov eax,[color_tbl+4*2]
|
|||
|
ret
|
|||
|
.plain.text:
|
|||
|
mov edx,[cur_line_len];LINE_WIDTH
|
|||
|
xchg edx,esi
|
|||
|
mov ecx,[cur_line_len];LINE_WIDTH
|
|||
|
mov eax,[color_tbl+4*0]
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
; ********************************************
|
|||
|
; **************** SAVEFILE ****************
|
|||
|
; ********************************************
|
|||
|
func save_file
|
|||
|
mov esi,0x80000 ; 0x70000 = 448 Kbytes (maximum)
|
|||
|
mov edi,0x10000
|
|||
|
|
|||
|
.new_string:
|
|||
|
call save_string
|
|||
|
cmp dword[esi],0
|
|||
|
jne .new_string
|
|||
|
sub edi,0x10000+2 ; minus last CRLF
|
|||
|
;! mov [filelen],edi
|
|||
|
cmp byte[s_fname],'/'
|
|||
|
je .systree_save
|
|||
|
mcall 33,s_fname,0x10000,edi,0;[filelen],0
|
|||
|
test eax,eax
|
|||
|
je .exit
|
|||
|
call file_not_found
|
|||
|
jmp .exit
|
|||
|
|
|||
|
.systree_save:
|
|||
|
;! mov eax,[filelen]
|
|||
|
mov [f_info+8],edi ;! eax
|
|||
|
mov [f_info+0],1
|
|||
|
mov esi,s_fname
|
|||
|
mov edi,f_info.path
|
|||
|
mov ecx,PATHL
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
mcall 58,f_info
|
|||
|
|
|||
|
.exit:
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
func save_string
|
|||
|
lodsd
|
|||
|
mov ecx,eax
|
|||
|
|
|||
|
@@: cmp byte[esi+ecx-1],' '
|
|||
|
jne @f
|
|||
|
loop @b
|
|||
|
@@: jecxz .endcopy
|
|||
|
xor edx,edx
|
|||
|
mov ebx,edx
|
|||
|
mov ah,dl
|
|||
|
|
|||
|
.next_char:
|
|||
|
mov al,[esi+ebx]
|
|||
|
inc ebx
|
|||
|
test ah,00000001b
|
|||
|
jnz .char
|
|||
|
cmp al,'"'
|
|||
|
jne @f
|
|||
|
xor ah,00000100b
|
|||
|
jmp .char
|
|||
|
@@: cmp al,"'"
|
|||
|
jne @f
|
|||
|
xor ah,00000010b
|
|||
|
jmp .char
|
|||
|
@@: test ah,00000110b
|
|||
|
jnz .char
|
|||
|
cmp al,';'
|
|||
|
jne @f
|
|||
|
test ah,00000001b
|
|||
|
jnz .char
|
|||
|
xor ah,00000001b
|
|||
|
jmp .char
|
|||
|
@@: cmp al,' '
|
|||
|
jne .char
|
|||
|
inc edx
|
|||
|
test ebx,ATABW-1
|
|||
|
jnz @f
|
|||
|
dec edx
|
|||
|
jle .put
|
|||
|
mov al,9
|
|||
|
xor edx,edx
|
|||
|
jmp .put
|
|||
|
.char:
|
|||
|
or edx,edx
|
|||
|
jz .put
|
|||
|
push ecx eax
|
|||
|
mov ecx,edx
|
|||
|
mov al,' '
|
|||
|
rep stosb
|
|||
|
pop eax ecx
|
|||
|
xor edx,edx
|
|||
|
.put:
|
|||
|
stosb
|
|||
|
@@: loop .next_char
|
|||
|
|
|||
|
.endcopy:
|
|||
|
mov eax,0x0A0D
|
|||
|
stosw
|
|||
|
add esi,[esi-4]
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
; ********************************************
|
|||
|
; **************** LOADFILE ****************
|
|||
|
; ********************************************
|
|||
|
|
|||
|
func loadhdfile
|
|||
|
mov [f_info+0],0
|
|||
|
mov [f_info+8],300000/512
|
|||
|
mov esi,s_fname
|
|||
|
mov edi,f_info.path;pathfile_read
|
|||
|
mov ecx,PATHL
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
mcall 58,f_info ; fileinfo_read
|
|||
|
xchg eax,ebx
|
|||
|
inc eax
|
|||
|
test ebx,ebx
|
|||
|
je file_found
|
|||
|
cmp ebx,6 ;// ATV driver fix (6 instead of 5)
|
|||
|
je file_found
|
|||
|
call file_not_found
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
func loadfile
|
|||
|
mcall 6,s_fname,0,16800,0x10000 ; 6 = open file
|
|||
|
inc eax ; eax = -1 -> file not found
|
|||
|
jnz file_found
|
|||
|
call file_not_found
|
|||
|
ret
|
|||
|
|
|||
|
file_found:
|
|||
|
dec eax
|
|||
|
mov [filesize],eax
|
|||
|
mov [lines],1
|
|||
|
mov [columns],0
|
|||
|
mov esi,0x10000
|
|||
|
mov edi,0x80000
|
|||
|
mov edx,eax
|
|||
|
|
|||
|
.next_line:
|
|||
|
mov ebx,edi
|
|||
|
add edi,4
|
|||
|
.next_char:
|
|||
|
or edx,edx
|
|||
|
jle .exit
|
|||
|
lodsb
|
|||
|
dec edx
|
|||
|
cmp al,13
|
|||
|
je .CR
|
|||
|
cmp al,10
|
|||
|
je .LF
|
|||
|
cmp al,9
|
|||
|
je .TB
|
|||
|
cmp al,0
|
|||
|
je .exit
|
|||
|
stosb
|
|||
|
jmp .next_char
|
|||
|
|
|||
|
.exit:
|
|||
|
mov ecx,10
|
|||
|
mov al,' '
|
|||
|
rep stosb
|
|||
|
lea eax,[edi-4]
|
|||
|
sub eax,ebx
|
|||
|
mov [ebx],eax
|
|||
|
mov dword[ebx+eax+4],0
|
|||
|
sub eax,10
|
|||
|
jnz @f
|
|||
|
inc eax
|
|||
|
@@: cmp eax,[columns]
|
|||
|
jbe @f
|
|||
|
mov [columns],eax
|
|||
|
@@: ret
|
|||
|
|
|||
|
.CR: cmp byte[esi],10
|
|||
|
jne .LF
|
|||
|
lodsb
|
|||
|
dec edx
|
|||
|
.LF: mov ecx,10
|
|||
|
mov al,' '
|
|||
|
rep stosb
|
|||
|
lea eax,[edi-4]
|
|||
|
sub eax,ebx
|
|||
|
mov [ebx],eax
|
|||
|
inc [lines]
|
|||
|
add eax,-10
|
|||
|
cmp eax,[columns]
|
|||
|
jbe .next_line
|
|||
|
mov [columns],eax
|
|||
|
jmp .next_line
|
|||
|
|
|||
|
.TB: lea eax,[edi-4]
|
|||
|
sub eax,ebx
|
|||
|
mov ecx,eax
|
|||
|
add ecx,ATABW
|
|||
|
and ecx,not(ATABW-1)
|
|||
|
sub ecx,eax
|
|||
|
mov al,' '
|
|||
|
rep stosb
|
|||
|
jmp .next_char
|
|||
|
|
|||
|
file_not_found:
|
|||
|
mcall 55,eax,error_beep ; beep
|
|||
|
mov [lines],1 ; open empty document
|
|||
|
mov [columns],1
|
|||
|
xor eax,eax
|
|||
|
mov [top_line],eax
|
|||
|
mov [posx],eax
|
|||
|
mov [posy],eax
|
|||
|
mov edi,0x80000+4
|
|||
|
mov ecx,10
|
|||
|
mov [edi-4],ecx
|
|||
|
mov [edi+10],eax
|
|||
|
mov al,' '
|
|||
|
cld
|
|||
|
rep stosb
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
; *****************************
|
|||
|
; ****** WRITE POSITION ******
|
|||
|
; *****************************
|
|||
|
|
|||
|
func writepos
|
|||
|
cmp [do_not_draw],1 ; return if drawing is not permitted
|
|||
|
jae .exit
|
|||
|
pusha
|
|||
|
mov eax,[posx]
|
|||
|
inc eax
|
|||
|
mov ebx,5
|
|||
|
mov ecx,10
|
|||
|
mov edi,htext2.pos1
|
|||
|
cld
|
|||
|
call uint2strz
|
|||
|
mov eax,[posy]
|
|||
|
inc eax
|
|||
|
mov ebx,5
|
|||
|
mov edi,htext2.pos2
|
|||
|
call uint2strz
|
|||
|
mov eax,[lines] ; number of lines
|
|||
|
mov ebx,5
|
|||
|
mov edi,htext2.pos3
|
|||
|
call uint2strz
|
|||
|
mov ebx,5*65536+htext2.size*6
|
|||
|
mov ecx,[bot_ofs]
|
|||
|
shl ecx,16
|
|||
|
add ecx,ABTNH
|
|||
|
mcall 13,,,[sc.work_graph] ; draw bar
|
|||
|
mov ebx,12*65536
|
|||
|
mov bx,word[bot_ofs]
|
|||
|
add ebx,(ABTNH+2)/2-4
|
|||
|
mcall 4,,[sc.work_button_text],htext2,htext2.size ; write position
|
|||
|
popa
|
|||
|
|
|||
|
.exit:
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
func uint2strz ;//////////////////////////////////////////////////////////////
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
dec ebx
|
|||
|
jz @f
|
|||
|
xor edx,edx
|
|||
|
div ecx
|
|||
|
push edx
|
|||
|
call uint2strz
|
|||
|
pop eax
|
|||
|
@@: cmp al,10
|
|||
|
sbb al,$69
|
|||
|
das
|
|||
|
stosb
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
; ****************************
|
|||
|
; ******* READ STRING ********
|
|||
|
; ****************************
|
|||
|
|
|||
|
func read_string
|
|||
|
cmp al,5
|
|||
|
jz .f1
|
|||
|
cmp al,51
|
|||
|
jz .f2
|
|||
|
ret
|
|||
|
|
|||
|
.f1: mov [addr],s_fname
|
|||
|
mov eax,[bot_ofs]
|
|||
|
add eax,ABTNH+2
|
|||
|
mov [ya],eax
|
|||
|
push 0 ; case insensitive
|
|||
|
jmp .rk
|
|||
|
.f2: mov [addr],s_search
|
|||
|
mov eax,[bot_ofs]
|
|||
|
add eax,(ABTNH+2)*2
|
|||
|
mov [ya],eax
|
|||
|
push 1 ; case sensitive
|
|||
|
.rk:
|
|||
|
mov edi,[addr]
|
|||
|
mov ecx,PATHL
|
|||
|
sub ecx,[edi-4]
|
|||
|
add edi,[edi-4]
|
|||
|
mov al,$1C
|
|||
|
cld
|
|||
|
rep stosb
|
|||
|
|
|||
|
mov edi,[addr]
|
|||
|
mov eax,[edi-4]
|
|||
|
mov [temp],eax
|
|||
|
add edi,eax
|
|||
|
call print_text
|
|||
|
mcall 40,00000111b
|
|||
|
|
|||
|
.waitev:
|
|||
|
|
|||
|
mcall 10
|
|||
|
cmp eax,2
|
|||
|
jne .read_done
|
|||
|
mcall ;2
|
|||
|
shr eax,8
|
|||
|
cmp al,13
|
|||
|
je .read_done
|
|||
|
cmp al,8
|
|||
|
jne .nobs
|
|||
|
cmp edi,[addr]
|
|||
|
je .waitev
|
|||
|
dec [temp]
|
|||
|
mov eax,[addr]
|
|||
|
dec dword[eax-4]
|
|||
|
sub edi,1
|
|||
|
mov byte[edi],$1C
|
|||
|
call print_text
|
|||
|
jmp .waitev
|
|||
|
.nobs:
|
|||
|
movzx ebx,al
|
|||
|
sub ebx,$20
|
|||
|
jle .waitev
|
|||
|
cmp byte[esp],0
|
|||
|
jne .keyok
|
|||
|
sub ebx,$40
|
|||
|
jl .keyok
|
|||
|
add al,[ebx+add_table]
|
|||
|
.keyok:
|
|||
|
mov ecx,[addr]
|
|||
|
add ecx,PATHL
|
|||
|
cmp edi,ecx
|
|||
|
jae .waitev
|
|||
|
mov [edi],al
|
|||
|
inc [temp]
|
|||
|
mov eax,[addr]
|
|||
|
inc dword[eax-4]
|
|||
|
|
|||
|
call print_text
|
|||
|
inc edi
|
|||
|
jmp .waitev
|
|||
|
|
|||
|
.read_done:
|
|||
|
add esp,4
|
|||
|
mov ecx,PATHL
|
|||
|
sub ecx,[temp]
|
|||
|
mov edi,[addr]
|
|||
|
add edi,[temp]
|
|||
|
mov al,' '
|
|||
|
cld
|
|||
|
rep stosb
|
|||
|
mov [temp],987
|
|||
|
call print_text
|
|||
|
mcall 40,00100111b
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
func print_text
|
|||
|
pusha
|
|||
|
mov ebx,(LBTNW+5+2)*65536
|
|||
|
mov bx,word[p_info.x_size]
|
|||
|
sub bx,LBTNW+RBTNW+10+3
|
|||
|
mov ecx,[ya-2]
|
|||
|
mov cx,ABTNH+1
|
|||
|
mcall 13,,,[sc.work]
|
|||
|
mov ebx,(LBTNW+5+2+4)*65536+ABTNH/2-3
|
|||
|
add ebx,[ya]
|
|||
|
mov eax,[p_info.x_size]
|
|||
|
sub eax,LBTNW+RBTNW+10+8
|
|||
|
push eax
|
|||
|
cdq
|
|||
|
mov ecx,6
|
|||
|
div ecx
|
|||
|
cmp eax,PATHL
|
|||
|
jbe @f
|
|||
|
mov eax,PATHL
|
|||
|
@@: mov esi,eax
|
|||
|
mcall 4,,[color_tbl+0],[addr]
|
|||
|
|
|||
|
mov eax,[ya]
|
|||
|
mov ebx,eax
|
|||
|
add eax,ABTNH/2-6
|
|||
|
shl eax,16
|
|||
|
add eax,ebx
|
|||
|
add eax,ABTNH/2-6+11
|
|||
|
mov ecx,eax
|
|||
|
imul eax,[temp],6
|
|||
|
pop ebx
|
|||
|
cmp eax,ebx
|
|||
|
jae @f
|
|||
|
add eax,LBTNW+5+2+4
|
|||
|
mov ebx,eax
|
|||
|
shl eax,16
|
|||
|
add ebx,eax
|
|||
|
mcall 38,,,[color_tbl+0]
|
|||
|
|
|||
|
@@: popa
|
|||
|
ret
|
|||
|
endf
|
|||
|
|
|||
|
include 'helpwnd.asm'
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
section @DATA ;///////////////////////////////////////////////////////////////
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
|
|||
|
addr dd s_fname ; address of input string
|
|||
|
temp dd 0xabc ; used in read_string
|
|||
|
vscrl_capt dd -1
|
|||
|
hscrl_capt dd -1
|
|||
|
|
|||
|
label color_tbl dword
|
|||
|
dd 0x00000000 ;0x00FFFF00 ; text
|
|||
|
dd 0x00009000 ;0x0000FF00 ; numbers
|
|||
|
dd 0x00A00000 ;0x0000FFFF ; strings
|
|||
|
dd 0x00909090 ;0x00C0C0C0 ; comments
|
|||
|
dd 0x003030f0 ;0x00FFFFFF ; symbols
|
|||
|
dd 0x00E0E0E0 ;0x00000080 ; background
|
|||
|
|
|||
|
add_table:
|
|||
|
; times $61 db -$00
|
|||
|
times $1A db -$20
|
|||
|
times $25 db -$00
|
|||
|
times $10 db -$20
|
|||
|
times $30 db -$00
|
|||
|
times $10 db -$50
|
|||
|
times $04 db -$00,-$01
|
|||
|
times $08 db -$00
|
|||
|
|
|||
|
error_beep db 0xA0,0x30,0
|
|||
|
|
|||
|
sz s_example,'README.TXT'
|
|||
|
sz s_still ,'still'
|
|||
|
|
|||
|
;sz param_setup,<'LANG',0> ; parameter for SETUP
|
|||
|
param_setup db 'LANG',0
|
|||
|
|
|||
|
sz fasm_filename ,'FASM '
|
|||
|
sz debug_filename ,'BOARD '
|
|||
|
sz tinypad_filename,'TINYPAD '
|
|||
|
sz setup ,'SETUP ' ; to change keyboard layout
|
|||
|
|
|||
|
lsz sysfuncs_filename,\
|
|||
|
ru,<'SYSFUNCR.TXT',0>,\
|
|||
|
en,<'SYSFUNCS.TXT',0>
|
|||
|
|
|||
|
sz htext,'TINYPAD'
|
|||
|
sz toolbar_btn_text,'COMPILE RUN BOARD SYSFUNC'
|
|||
|
|
|||
|
lsz lstr,\
|
|||
|
ru,<' <20><><EFBFBD><EFBFBD> > ',' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> > '>,\
|
|||
|
en,<' FILE > ',' STRING > '>
|
|||
|
lsz rstr,\
|
|||
|
ru,<' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ',' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ',' <20><><EFBFBD><EFBFBD><EFBFBD> '>,\
|
|||
|
en,<' SAVE ' ,' LOAD ' ,' SEARCH ' >
|
|||
|
|
|||
|
lsz htext2,\
|
|||
|
ru,'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 00000:00000 <20><><EFBFBD><EFBFBD><EFBFBD> 00000 <20><><EFBFBD><EFBFBD><EFBFBD>',\
|
|||
|
en,'POSITION 00000:00000 LENGTH 00000 LINES'
|
|||
|
if lang eq ru
|
|||
|
htext2.pos1 = htext2+8
|
|||
|
htext2.pos2 = htext2+14
|
|||
|
htext2.pos3 = htext2+28
|
|||
|
else
|
|||
|
htext2.pos1 = htext2+9
|
|||
|
htext2.pos2 = htext2+15
|
|||
|
htext2.pos3 = htext2+30
|
|||
|
end if
|
|||
|
|
|||
|
lszc help_text,b,\
|
|||
|
ru,'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:',\
|
|||
|
ru,' ',\
|
|||
|
ru,' CTRL+F1 : <20><><EFBFBD> <20><><EFBFBD><EFBFBD>',\
|
|||
|
ru,' CTRL+S : <20><>ࢠ<EFBFBD> <20><>ப<EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD>',\
|
|||
|
ru,' CTRL+E : <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> <20><>ப<EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD>',\
|
|||
|
ru,' CTRL+P : <20><>⠢<EFBFBD><E2A0A2><EFBFBD> <20><><EFBFBD>࠭<EFBFBD><E0A0AD><EFBFBD> <20><> ⥪<><E2A5AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',\
|
|||
|
ru,' CTRL+D : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ப<EFBFBD>',\
|
|||
|
ru,' CTRL+L : <20><>⠢<EFBFBD><E2A0A2><EFBFBD> <20><>ப<EFBFBD>-ࠧ<><E0A0A7><EFBFBD><EFBFBD>⥫<EFBFBD>',\
|
|||
|
ru,' CTRL+[ : <20><>३<EFBFBD><E0A5A9> <20> <20><>砫<EFBFBD> 䠩<><E4A0A9>',\
|
|||
|
ru,' CTRL+] : <20><>३<EFBFBD><E0A5A9> <20> <20><><EFBFBD><EFBFBD><EFBFBD> 䠩<><E4A0A9>',\
|
|||
|
ru,' CTRL+F2 : <20><><EFBFBD><EFBFBD>㧨<EFBFBD><E3A7A8> 䠩<>',\
|
|||
|
ru,' CTRL+F3 : <20><><EFBFBD><EFBFBD><EFBFBD>',\
|
|||
|
ru,' CTRL+F4 : <20><><EFBFBD>࠭<EFBFBD><E0A0AD><EFBFBD> 䠩<>',\
|
|||
|
ru,' CTRL+F5 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> 䠩<><E4A0A9>',\
|
|||
|
ru,' CTRL+F6 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ப<EFBFBD> <20><><EFBFBD> <20><><EFBFBD>᪠',\
|
|||
|
ru,' CTRL+F8 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>᪫<EFBFBD><E1AAAB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',\
|
|||
|
ru,'',\
|
|||
|
en,'COMMANDS:',\
|
|||
|
en,' ',\
|
|||
|
en,' CTRL+F1 : SHOW THIS WINDOW',\
|
|||
|
en,' CTRL+S : SELECT FIRST STRING TO COPY',\
|
|||
|
en,' CTRL+E : SELECT LAST STRING TO COPY',\
|
|||
|
en,' CTRL+P : PASTE SELECTED TO CURRENT POSITION',\
|
|||
|
en,' CTRL+D : DELETE CURRENT LINE',\
|
|||
|
en,' CTRL+L : INSERT SEPARATOR LINE',\
|
|||
|
en,' CTRL+[ : GO TO THE BEGINNING OF FILE',\
|
|||
|
en,' CTRL+] : GO TO THE END OF FILE',\
|
|||
|
en,' CTRL+F2 : LOAD FILE',\
|
|||
|
en,' CTRL+F3 : SEARCH',\
|
|||
|
en,' CTRL+F4 : SAVE FILE',\
|
|||
|
en,' CTRL+F5 : ENTER FILENAME',\
|
|||
|
en,' CTRL+F6 : ENTER SEARCH STRING',\
|
|||
|
en,' CTRL+F8 : CHANGE KEYBOARD LAYOUT',\
|
|||
|
en,''
|
|||
|
|
|||
|
lsz help_title,\
|
|||
|
ru,'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',\
|
|||
|
en,'TINYPAD HELP'
|
|||
|
|
|||
|
sz symbols,'#&*\:/<>|{}()[]=+-, '; %.'
|
|||
|
|
|||
|
align 4
|
|||
|
label f_info dword
|
|||
|
dd ?
|
|||
|
dd 0
|
|||
|
dd ?
|
|||
|
dd 0x10000
|
|||
|
dd 0x70000
|
|||
|
.path:
|
|||
|
times PATHL+1 db ?
|
|||
|
|
|||
|
TINYPAD_END: ; end of file
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
section @UDATA ;//////////////////////////////////////////////////////////////
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
|
|||
|
posx dd ? ; global X position (text cursor)
|
|||
|
posy dd ? ; global Y position (text cursor)
|
|||
|
lines dd ? ; number of lines in file
|
|||
|
slines dd ? ; number of lines on the screen
|
|||
|
columns dd ? ; number of columns in file
|
|||
|
scolumns dd ? ; number of columns on the screen
|
|||
|
top_ofs dd ? ; height occupied by top buttons
|
|||
|
bot_ofs dd ? ; height occupied by bottom buttons
|
|||
|
top_line dd ? ; topmost visible line on screen
|
|||
|
left_col dd ? ; leftmost visible char on line
|
|||
|
vscrl_top dd ?
|
|||
|
vscrl_size dd ?
|
|||
|
hscrl_top dd ?
|
|||
|
hscrl_size dd ?
|
|||
|
skinh dd ? ; skin height
|
|||
|
__rc dd ?,?,?,?
|
|||
|
;filelen dd ? ; file size (on save) ???
|
|||
|
filesize dd ? ; file size (on load) ???
|
|||
|
ya dd ? ; for read_string
|
|||
|
copy_start dd ? ; first line for copying (Ctrl+S)
|
|||
|
copy_count dd ? ; number of lines for copying (Ctrl+E)
|
|||
|
copy_size dd ? ; size of data to copy
|
|||
|
s_title.size dd ? ; caption length
|
|||
|
|
|||
|
cur_line_len dd ?
|
|||
|
|
|||
|
asm_mode db ? ; ASM highlight?
|
|||
|
do_not_draw db ? ; draw top and bottom buttons?
|
|||
|
main_closed db ? ; main window closed? (to close help window)
|
|||
|
|
|||
|
align 4
|
|||
|
s_fname.size dd ?
|
|||
|
s_fname rb PATHL+1
|
|||
|
align 4
|
|||
|
s_search.size dd ?
|
|||
|
s_search rb PATHL+1
|
|||
|
|
|||
|
s_title rb 256 ; window caption
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
section @PARAMS ;/////////////////////////////////////////////////////////////
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
|
|||
|
fasm_parameters:
|
|||
|
|
|||
|
p_info process_information
|
|||
|
sc system_colors
|