kolibrios-fun/programs/develop/tinypad/trunk/tinypad.asm
heavyiron 630234432f Changed structure of svn repository
git-svn-id: svn://kolibrios.org@109 a494cfbc-eb01-0410-851d-a64ba20cac60
2006-07-28 13:39:16 +00:00

2946 lines
48 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;******************************************************************************
; 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