kolibrios/programs/other/tinypad2/trunk/tinypad2.asm

4094 lines
74 KiB
NASM
Raw Normal View History

; SYSTEM HEADER:
use32
org 0x0
db 'MENUET01' ; identifier
dd 0x01 ; version
dd START ; pointer to start
dd TINYPAD_END ; size of file
dd 0x300f00 ;0x500000; 0x3fff00;0x300000 ; size of memory
dd 0xeff0 ;0x4fffff ;0x3ff000;0xeff0 ; esp
dd I_PARAM ; parameters
dd 0 ; reserved
include 'ascl.inc'
include 'lang.inc'
include 'macros.inc' ; useful stuff
include 'dialogs1.inc'
include 'scroll.inc'
include 'debug.inc'
purge mov ;  SPEED
;******************************************************************************
; INITIALIZING
START:
;debug_print_hex TINYPAD_END
call mask_events
cmp [I_PARAM],byte 0
jz noparams
;//Willow
cmp byte[I_PARAM],'*'
jne .noipc
; convert size from decimal representation to dword
mov esi, I_PARAM+1
xor edx, edx
xor eax, eax
@@:
lodsb
test al, al
jz @f
lea edx, [edx*4+edx]
lea edx, [edx*2+eax]
jmp @b
@@:
add edx,20
mcall 60,1,0x10000-16
mov dword[0x10000+-16+4],8
mcall 40,1000000b
mcall 23,200
; dpd eax
cmp eax,7
jne exit_now
mov esi,0x10000-16
mov byte[esi],1
call mask_events
mov eax,[esi+12]
inc eax
call file_found
jmp do_load_file.restorecursor
.noipc:
;//Willow
; parameters are at I_PARAM
mov esi,I_PARAM
mov edi,filename
mov ecx,50
cld
rep movsb
mov edi,filename
mov ecx,50
xor eax,eax
repne scasb
sub edi,filename
dec edi
mov [filename_len],edi
jmp do_load_file
noparams:
jmp newfile
;******************************************************************************
; MAIN LOOP
still:
call writepos ; write current position & number of strings
call mouse_info
mov eax,10 ; wait here until event
int 0x40
cmp eax,1
je red
cmp eax,2
je key
cmp eax,3
je button
cmp eax,6
je mouse
jmp still
;******************************************************************************
; *********************************
; * MOUSE *
; *********************************
mouse:
mov eax,37 ;mouse click
mov ebx,2
int 0x40
cmp eax,0
je .leave_now
;if exit window is on
cmp [exit_wnd_on],1
jne @f
mov [exit_wnd_on],0
jmp red
;else
@@:
cmp eax,1 ;mouse 1
jne .leave_now
mov eax,37 ;mouse position
mov ebx,1
int 0x40
mov word[mouse_y],ax
shr eax,16
mov word[mouse_x],ax
cmp [mouse_x],7
jb .leave_now ;.leave_now ;if <
cmp [mouse_x],485;487
ja .leave_now ;.leave_now ;if >
cmp [mouse_y],45
jb .leave_now ;.leave_now ;if <
cmp [mouse_y],342 ;345
ja .leave_now ;.leave_now ;if >
call main_cursor_move
.leave_now:
jmp still
; *********************************
; * BUTTON HANDLER *
; *********************************
button:
mov eax,17
int 0x40
;;;;;;;;;;;;;;;exit dialog box check;;;;;;;;;;;;;
cmp ah,49
je save_and_exit
cmp ah,48
je exit_now
cmp ah,47
mov [exit_wnd_on],0
je red
cmp ah,46
jne @f
call save_file
jmp newfile
@@:
cmp ah,45
je newfile
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;MENU CHECK;;;;;;;;;;;;;;;;;;;;;;;
cmp ah,15
jne no_d_w
call draw_window_for_dialogs
jmp still
no_d_w:
cmp ah,97
je draw_win_menu_file
cmp ah,98
je draw_win_menu_code
cmp ah,96
je draw_win_menu_text
cmp ah,95
je goto_string
cmp ah,92
je search_window
cmp ah,94
je red
cmp ah,99
je help_wnd
cmp ah,100
je new_pad_wnd
cmp ah,101
je doyouwannasave
cmp ah,102
jne nosavenow
for_key_save:
savedialog draw_window_for_dialogs,copy_fpath_s,saveerror,mypath
nosavenow:
cmp ah,103
jne noopennow
for_key_open:
opendialog draw_window_for_dialogs,copy_fpath,openerror,mypath
noopennow:
cmp ah,104
je exit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
shr eax,8
cmp al,50
jne no_search
; SEARCH {
search:
cmp [lines],1 ;something like bug fix
je red ;still
xor esi,esi
mov edi,[post]
add edi,80
imul ecx,[lines],80
sub ecx,edi ; ecx (loop counter) = lines*80-(post+80)
news:
push edi
news2:
; 1) LOAD BYTES
mov al,[esi+search_string]
mov bl,[edi+0x80000]
; 2) COMPARE BYTES
cmp al,bl
je yes_char
; 3) LETTER?
cmp al,'A'
jb notequal
cmp al,'z'
ja notequal
; 4) A->a OR a->A
cmp al,'a'
jb @f
add al,-32
jmp compare_bytes
@@:
cmp al,'Z'
ja notequal
add al,32
compare_bytes:
cmp al,bl
jne notequal
yes_char:
inc edi
inc esi
cmp esi,[search_len]
jge sfound
jmp news2
notequal:
pop edi
xor esi,esi
inc edi
loop news
call string_not_found
jmp still
sfound:
mov eax,edi
cdq ; edx = 0;
mov ebx,80
div ebx
;;;;; imul eax,80
; lea eax,[eax+eax*4] ; eax *= 5;
; shl eax,4 ; eax *= 16;
; mov [post],eax
mov [posy],0
;---------------
; mov ebx,80
; div ebx
call goto_pos
call draw_vertical_scroll
jmp still
; SEARCH }
no_search:
; TOOLBAR {
cmp eax,10000
jb no_toolbar
add eax,-10000
jne @f
lbl_compile_file:
mov [run_outfile],0
call start_fasm
jmp still
@@:
dec eax
jnz @f
lbl_run_outfile:
mov [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:
mov [modified],0
call empty_work_space
cmp [filename],'/'
jne @f
call loadhdfile
jmp .restorecursor
@@:
call loadfile1
.restorecursor:
mov edi,0x78000
mov ecx,80*80/4
mov eax,0x01010101
cld
rep stosd
xor eax,eax
mov [post],eax
mov [posx],eax
mov [posy],eax
; enable color syntax for ASM and INC files:
mov [asm_mode], 0
mov eax, [filename_len]
add eax, filename
cmp word [eax-3],'AS'
jne @f
cmp byte [eax-1],'M'
jne @f
mov [asm_mode], 1
jmp .nocol
@@:
cmp word [eax-3],'IN'
jne @f
cmp byte [eax-1],'C'
jne @f
mov [asm_mode], 1
@@:
.nocol:
; if the header is the same as the previous,
; just redraw the text area
; else redraw the window
;------pos00=filename_len
mov eax,[filename_len]
mov [pos00],eax
;-------------------------
mov ecx, [filename_len]
add ecx, 10 ; strlen(" - TINYPAD");
cmp ecx, [headlen]
jne @f
add ecx, -10
mov esi, filename ; strcmp(filename,header);
mov edi, header
rep cmpsb
jne @f
call drawfile
call draw_window_for_dialogs ;redraw, because it's needed
cmp [to_return],0
je still
ret
;jmp still
@@:
call set_title
cmp [to_return],0
je still
ret
; jmp still
; LOAD_FILE }
noid4:
cmp al, 2
jz yessave
dec al ; close if butid == 0
jnz nosave
; EXIT:
exit:
cmp [modified],0
je exit_now
mov eax,55 ; beep
mov ebx,eax
mov esi,save_beep1
int 0x40
delay 4
mov eax,55 ; beep
mov ebx,eax
mov esi,save_beep2
int 0x40
;---------"EXIT" dialog box
mov eax,13
mov ebx,150*65536+200
mov ecx,100*65536+70
mov edx,[sc.work_graph] ;0x00dd9438 ;0x00ff7512
int 0x40
mov eax,38
mov ebx,150*65536+350
mov ecx,100*65536+100
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,150*65536+350
mov ecx,170*65536+170
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,150*65536+150
mov ecx,100*65536+170
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,350*65536+350
mov ecx,100*65536+170
mov edx,cl_White
int 0x40
if lang eq ru
putlabel 190,120,'<27><><EFBFBD><EFBFBD><E0A0AD><EFBFBD> <20><><EFBFBD><EFBFBD><E3ACA5>?',cl_White
drawlbut 170,140,30,15,'<27><>',49,[sc.work_button],cl_White
drawlbut 230,140,30,15,'<27><><EFBFBD>',48,[sc.work_button],cl_White
drawlbut 290,140,45,15,'<27><EFBFBD><E2ACA5>',47,[sc.work_button],cl_White
else
putlabel 190,120,'Save the document?',cl_White
drawlbut 170,140,30,15,'Yes',49,[sc.work_button],cl_White
drawlbut 230,140,30,15,'No',48,[sc.work_button],cl_White
drawlbut 290,140,45,15,'Cancel',47,[sc.work_button],cl_White
end if
mov [exit_wnd_on],1
;----------------
jmp still
exit_now:
mov [MainWndClosed], 1
or eax, -1
int 0x40
save_and_exit:
call save_file
jmp exit_now
; mov [MainWndClosed], 1
; or eax, -1
; int 0x40
; SAVE_FILE {
yessave:
call clear_screen
call drawwindow
call save_file
; call clear_screen
; call drawwindow
mov [modified],0
jmp still
; SAVE_FILE }
nosave:
inc al
call read_string
jmp still
;**********************************
;* REDRAW HANDLER *
;**********************************
red:
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1AEA2> <20><><EFBFBD><EFBFBD>
call clear_screen
call drawwindow
jmp still
;**********************************
;* KEY HANDLER *
;**********************************
key:
mov eax, 2 ; GET KEY
int 0x40
cmp [exit_wnd_on],1 ;exit window is ON?
jne no_exit_wnd ; no - goto other checks
; cmp eax,13 ;enter - save n exit
; je save_and_exit
; cmp eax,173 ;ctrl+enter - exit
; je exit_now
mov [exit_wnd_on],0 ;other keys - cancel
; call draw_window_for_dialogs
jmp red ;redraw and still
no_exit_wnd:
shr eax, 8
; HELP_TEXT {
cmp al, 210 ; Ctrl + F1
jne no_help_text
help_wnd:
call clear_screen
call drawwindow
mov eax, 51
mov ebx, 1
mov ecx, help_thread_start
mov edx, 0xfff0
int 0x40
jmp still
help_thread_start:
call draw_help_wnd
still_hw:
cmp [MainWndClosed], 1
je exit_hw
mov eax, 10
int 0x40
cmp eax, 1
je red_hw
cmp eax, 2
je key_hw
cmp eax, 3
je button_hw
jmp still_hw
red_hw:
call draw_help_wnd
jmp still_hw
key_hw:
; mov eax, 2
int 0x40
cmp ah, 27
jne still_hw
button_hw:
mov eax, 17
int 0x40
exit_hw:
or eax, -1
int 0x40
; draw help window
draw_help_wnd:
mov eax, 12
mov ebx, 1
int 0x40
xor eax, eax
mov ebx, 200 shl 16 + 320
mov ecx, 200 shl 16 + 260
mov edx, 0x03e0e0e0 ; work
mov esi, [sc.grab]
or esi, 0x80000000 ; grab
mov edi, [sc.frame] ; frame
int 0x40
mov eax, 4
mov ebx, 8 shl 16 + 8
mov ecx, 0xffffff
mov edx, help_wnd_header
mov esi, hlphead_len
int 0x40
mov eax, 4
mov ebx, 8 shl 16 + 34
xor ecx, ecx
mov esi, 51
mov edx, help_text
.new_help_line:
int 0x40
add ebx, 10
add edx, esi
cmp [edx], byte 'x'
jne .new_help_line
mov eax, 12
mov ebx, 2
int 0x40
ret
; HELP_TEXT }
no_help_text:
; LOAD_FILE {
cmp al, 211 ; Ctrl + F2
je for_key_open ;do_load_file
; LOAD_FILE }
; SEARCH {
cmp al, 212 ; Ctrl + F3
je search
; SEARCH }
; SAVE_FILE {
cmp al, 213 ; Ctrl + F4
je yessave
; SAVE_FILE }
; ENTER_FILENAME {
cmp al, 214 ; Ctrl + F5
jne @f
jmp for_key_save
@@:
; ENTER_FILENAME }
; ENTER_SEARCH {
cmp al, 215 ; Ctrl + F6
jne @f
; mov al, 51
; call read_string
; jmp still
jmp search_window
@@:
; ENTER_SEARCH }
; CHANGE_LAYOUT {
cmp al, 217 ; Ctrl + F8
jne @f
call layout
jmp still
@@:
; CHANGE_LAYOUT }
; COMPILE_FILE {
cmp al, 208
je lbl_compile_file
; COMPILE_FILE }
; RUN_OUTFILE {
cmp al, 209
je lbl_run_outfile
; RUN_OUTFILE }
;run debug board { -----
cmp al,255
jne @f
call open_debug_board
call activate_me
jmp still
;}
@@:
;open sysfuncR { -----
; cmp al,228
; jne @f
; call open_sysfuncs_txt
; jmp still
; @@:
;fast_save_and_open {
cmp al,216
jne @f
call make_fast_so
jmp still
;}
@@:
; 3 times english -> <20><><EFBFBD><EFBFBD>
; 2 times <20><><EFBFBD><EFBFBD> -> english
; COPY START {
cmp al, 19
jne no_copy_start
mov eax, [post]
imul ebx, [posy], 80
add eax, ebx
mov [copy_start], eax
jmp still
; COPY START }
no_copy_start:
; COPY END {
cmp al, 5
jne no_copy_end
cmp [copy_start], 0
je still
mov ecx, [post]
imul ebx, [posy], 80
add ecx, ebx
add ecx, 80
cmp ecx, [copy_count]
jb still
sub ecx, [copy_start]
mov [copy_count], ecx
mov esi, [copy_start]
add esi, 0x80000
mov edi, 0x2f0000
cld
rep movsb
jmp still
; COPY END }
no_copy_end:
; PASTE {
cmp al, 16
jne no_copy_paste
cmp [copy_count], 0
je still
mov eax,[copy_count]
cdq
mov ebx, 80
div ebx
add [lines], eax
mov ecx, 0x2e0000
mov eax, [post]
imul ebx, [posy], 80
add eax, ebx
add eax, 0x80000
sub ecx, eax
mov esi, 0x2e0000
sub esi, [copy_count]
mov edi, 0x2e0000
std
rep movsb
mov esi, 0x2f0000
mov edi, [post]
imul eax, [posy], 80
add edi, eax
add edi, 0x80000
mov ecx, [copy_count]
cld
rep movsb
call clear_screen
call drawfile
call draw_vertical_scroll
mov [modified],1
jmp still
; PASTE }
no_copy_paste:
; INSERT_SEPARATOR {
cmp al,0xc ; Ctrl+L
jne no_insert_separator
imul eax,[posy],80
add eax,[post]
add eax,0x80000
mov ebx,eax
imul eax,[lines],80
add eax,0x80000 ; ⥯<><E2A5AF><EFBFBD><><EFBFBD><EBA2A0> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><><E4A0A9>
mov ecx,eax ; size
sub ecx,ebx
inc ecx
mov esi,eax ; from
mov edi,eax
add edi,80 ; to
std
rep movsb
mov ecx,80/4
mov esi,comment_string
mov edi,ebx
cld
rep movsd
inc [lines]
call clear_screen
call drawfile
;call calc_scroll_size_and_pos
call draw_vertical_scroll
mov [modified],1
jmp still
; INSERT_SEPARATOR }
no_insert_separator:
; DEL_LINE {
cmp al,4
jne no_delete_line
mov eax,[post]
cdq
mov ebx,80
div ebx
add eax,[posy]
inc eax
cmp eax,[lines]
jge still
dec dword [lines]
imul edi,[posy],80
add edi,[post]
add edi,0x80000
mov esi,edi
add esi,80
mov ecx,0x2e0000
sub ecx,esi
shr ecx,4
cld
rep movsd
call clear_screen
call drawfile
;call calc_scroll_size_and_pos
call draw_vertical_scroll
mov [modified],1
jmp still
; DEL_LINE }
no_delete_line:
; ENTER {
cmp al,13
jnz noenter
; lines down
mov eax,[posy]
inc eax
; imul eax,80
lea eax,[eax+eax*4] ; eax *= 5
shl eax,4 ; eax *= 16
add eax,0x80000
add eax,[post]
mov ebx,eax
; ebx = ([posy]+1)*80 + 0x80000 + [post]
; ebx -> first byte of next string
imul eax,[lines],80
add eax,0x80000
mov ecx,eax
; ecx = [lines]*80 + 0x80000
; ecx -> end of the document
cmp ebx,ecx
jz .bug_fixed
@@:
dec ecx
mov dl,[ecx]
mov [ecx+80],dl
cmp ecx,ebx
jnz @b
.bug_fixed:
; save for later
imul eax,[posy],80
add eax,0x80000
add eax,[post]
mov ebx,eax
add eax,[posx]
; eax = 0x80000 + [post] + [posy]*80 + [posx]
push eax
dec ebx
xor ecx,ecx
@@:
cmp ecx,80
je @f
inc ecx
inc ebx
cmp byte [ebx],' '
je @b
@@:
dec ecx
cmp ecx,80-1
jne @f
; mov [posx],0
jmp .lbl
@@:
cmp [posx],ecx
jbe @f
mov [posx],ecx
jmp .lbl
@@:
mov [posx],0
.lbl:
inc [posy]
;clear line
imul eax,[posy],80
add eax,0x80000
add eax,[post]
mov edi,eax
mov eax,' '
mov ecx,80/4
cld
rep stosd
; end of line to next line beginning
imul eax,[posy],80
add eax,0x80000
add eax,[post]
; add eax,[posx]
mov ebx,eax
; ebx -> beginning of this line
pop esi
mov edi,eax
@@:
mov al,[esi]
mov [ebx],al
mov [esi],byte ' '
inc esi
inc ebx
cmp esi,edi
jb @b
inc [lines]
mov ecx,[posy]
cmp ecx,[slines]
jne @f
dec [posy]
add [post],80
@@:
call clear_screen
call drawfile
;call calc_scroll_size_and_pos
call draw_vertical_scroll
mov [modified],1
jmp still
; ENTER }
noenter:
; UP {
cmp al,130+48
jnz noup
mov ecx,[posy]
test ecx,ecx
jnz .up1
mov ecx,[post]
test ecx,ecx
jz still
add ecx,-80
mov [post],ecx
call clear_screen
jmp .finish
.up1:
dec ecx
mov [posy],ecx
.finish:
call drawfile
call draw_vertical_scroll
;call calc_scroll_size_and_pos
jmp still
; UP }
noup:
; DOWN {
cmp al,129+48
jnz nodown
mov ecx,[posy]
mov eax,[slines]
dec eax
cmp ecx,eax
jb .do1 ; goto do1 if [posy] < [slines]-1
mov eax,[lines]
sub eax,[slines]
dec eax
jb still ; goto still if [lines] < [slines]-1
; imul eax,80
lea eax,[eax+eax*4]
shl eax,4
cmp [post],eax
jg still ; goto still if [post] > ([lines]-[slines]-1)*80
add [post],80
call clear_screen
call drawfile
call draw_vertical_scroll
;call calc_scroll_size_and_pos
jmp still
.do1:
pusha
mov eax,[post]
cdq
mov ebx,80
div ebx
add eax,[posy]
inc eax
cmp eax,[lines]
jb .do10
popa
jmp still
.do10:
popa
inc ecx
mov [posy],ecx
call drawfile
call draw_vertical_scroll
;call calc_scroll_size_and_pos
jmp still
; DOWN }
nodown:
; LEFT {
cmp al,128+48
jnz noleft
cmp [posx],0
je still
dec [posx]
call drawfile
jmp still
; LEFT }
noleft:
; RIGHT {
cmp al,131+48
jnz noright
cmp [posx],79
je still
inc [posx]
call drawfile
jmp still
; RIGHT }
noright:
; PAGE_UP {
page_up:
cmp al,136+48
jnz nopu
scrl_up:
mov eax,[slines]
dec eax
; imul eax,80
lea eax,[eax+eax*4]
shl eax,4
mov ecx,[post]
cmp eax,ecx
jbe pu1
mov ecx,eax
pu1:
sub ecx,eax
mov [post],ecx
call clear_screen
call drawfile
call draw_vertical_scroll
;call calc_scroll_size_and_pos
jmp still
; PAGE_UP }
nopu:
; PAGE_DOWN {
page_down:
cmp al,135+48
jnz nopd
scrl_down:
mov eax,[lines]
cmp eax,[slines]
jb still
mov eax,[post] ; eax = offset
cdq
mov ebx,80
div ebx ; eax /= 80
mov ecx,[lines] ; ecx = lines in the file
cmp eax,ecx ; if eax < ecx goto pfok
jnb still
mov eax,[slines] ; eax = lines on the screen
dec eax ; eax--
; imul eax,80 ; eax *= 80
lea eax,[eax+eax*4]
shl eax,4
add [post],eax ; offset += eax
mov eax,[lines] ; eax = lines in the file
sub eax,[slines] ; eax -= lines on the screen
; imul eax,80 ; eax *= 80
lea eax,[eax+eax*4]
shl eax,4
cmp [post],eax
jb @f
mov [post],eax
@@:
call clear_screen
call drawfile
call draw_vertical_scroll
;call calc_scroll_size_and_pos
jmp still
; PAGE_DOWN }
nopd:
; HOME {
cmp al,132+48
jnz nohome
push 0
pop [posx]
call drawfile
jmp still
; HOME }
nohome:
; END {
end_key:
cmp al,133+48
jnz noend
imul eax,[posy],80
add eax,0x80000
add eax,[post]
mov esi,eax
add eax,80+1
@@: dec eax
cmp eax,esi
je @f
cmp byte [eax-1],' '
jbe @b
@@:
sub eax,esi
cmp eax,80-1
jbe @f
dec eax
@@:
mov [posx],eax
call drawfile
jmp still
; END }
noend:
; GO_START {
cmp al,251 ; Ctrl + [
jnz no_go_to_start
push 0
pop [post] ; offset = 0
call clear_screen
call drawfile ; draw file
call draw_vertical_scroll
;call calc_scroll_size_and_pos
jmp still ; go to still
; GO_START }
no_go_to_start:
; GO_END {
cmp al,253 ; Ctrl + ]
jnz no_go_to_end
cmp [lines],30 ;to fix ctrl+] bug
jb @f
mov eax,[lines] ; eax = lines in the file
sub eax,[slines] ; eax -= lines on the screen
; imul eax,80 ; eax *= 80 (length of line)
lea eax,[eax+eax*4]
shl eax,4
mov [post],eax ; offset in the file
call clear_screen
call drawfile ; draw file
call draw_vertical_scroll
@@:
jmp still ; go to still
; GO_END }
no_go_to_end:
; DELETE {
cmp al,134+48
jne nodel
imul eax,[posy],80
add eax,0x80000
add eax,[post]
add eax,[posx]
mov ecx,eax
imul eax,[posy],80
add eax,0x80000+79
add eax,[post]
mov ebx,eax
push ebx
dec ecx
dec ebx
push ecx ebx
push ebx
imul eax,[posy],80
add eax,0x80000
add eax,[post]
mov ecx,eax
xor eax,eax
cdq
pop ebx
dec ecx
@@:
inc ecx
mov dh,[ecx]
cmp dh,33
jb .nok
xor eax,eax
inc eax
.nok:
cmp ecx,ebx
jb @b
pop ebx ecx
@@:
inc ecx
mov dl,[ecx+1]
mov [ecx],dl
cmp ecx,ebx
jb @b
pop ebx
mov [ebx],byte 32
test eax,eax
jz dellinesup
call clear_screen
call drawfile
mov [modified],1
jmp still
dellinesup:
; lines -1
pusha
mov eax,[post]
cdq
mov ebx,80
div ebx
add eax,[posy]
inc eax
cmp eax,[lines]
jb @f
popa
mov [modified],1
jmp still
@@:
popa
dec [lines]
; lines up
mov [posx],dword 0
imul eax,[posy],80
add eax,0x80000-1
add eax,[post]
mov ebx,eax
push ebx
imul eax,[lines],80
add eax,0x80000-1
add eax,[post]
mov ecx,eax
pop ebx
@@:
mov dl,[ebx+80]
mov [ebx],dl
inc ebx
cmp ecx,ebx
jnz @b
call clear_screen
call drawfile
mov [modified],1
jmp still
; DELETE }
nodel:
; INSERT {
cmp al,137+48
jnz noins
imul eax,[posy],80
add eax,0x80000
add eax,[post]
add eax,[posx]
mov ecx,eax
; ecx = [posy]*80+0x80000+[post]+[posx]
imul eax,[posy],80
add eax,0x80000+79
add eax,[post]
mov ebx,eax
; ebx = [posy]*80+0x80000+79+[post]
.movstr:
dec ebx
mov dl,[ebx]
mov [ebx+1],dl
cmp ecx,ebx
jb .movstr
mov [ecx],byte ' '
call invalidate_string
call drawfile
mov [modified],1
jmp still
; INSERT }
noins:
; BACKSPACE {
cmp al,8
jnz nobs
mov ecx,[posx]
test ecx,ecx
jz still
dec ecx
mov [posx],ecx
imul eax,[posy],80
add eax,0x80000
add eax,[post]
add eax,[posx]
mov ebx,eax
push ebx
imul eax,[posy],80
add eax,0x80000+79
add eax,[post]
mov ebx,eax
pop ecx
push ebx
dec ecx
.movleft:
inc ecx
mov dl,[ecx+1]
mov [ecx],dl
cmp ecx,ebx
jb .movleft
pop ebx
mov [ebx],byte ' '
call invalidate_string
call drawfile
mov [modified],1
jmp still
; BACKSPACE }
nobs:
; TAB {
cmp eax,9 ; Tab
jne notab
mov eax,[posx]
cmp eax,80-1
jae still
add eax,5 ; 9 5 3
and eax,11111100b ; ...1000b, ...100b, ...10b
dec eax
mov [posx], eax
call drawfile
mov [modified],1
jmp still
; TAB }
notab:
; ADD_KEY {
push eax ; add key
imul eax,[posy],80
add eax,0x80000
add eax,[post]
add eax,[posx]
mov ecx,eax
push ecx
imul eax,[posy],80
add eax,0x80000+79
add eax,[post]
mov ebx,eax
.movright:
dec ebx
mov al,[ebx]
mov [ebx+1],al
cmp ecx,ebx
jbe .movright
pop ebx
pop eax
mov [ebx],al
mov edx,78
mov ecx,[posx]
cmp edx,ecx
jb noxp
inc ecx
mov [posx],ecx
noxp:
call invalidate_string
call drawfile
mov [modified],1
; call draw_vertical_scroll
jmp still
; ADD_KEY }
;******************************************************************************
start_fasm:
cmp [asm_mode],1
je @f
ret
@@:
mov esi,filename
mov edi,fasm_parameters
cmp byte [esi],'/'
je .yes_systree
mov ecx,[filename_len]
rep movsb
mov al,','
stosb
mov ecx,[filename_len]
add ecx,-4
mov esi,filename
rep movsb
mov al,','
stosb
mov [edi],dword '/RD/'
add edi,4
mov [edi],word '1/'
inc edi
inc edi
mov al,0
stosb
jmp .run
.yes_systree:
add esi,[filename_len]
dec esi
xor ecx,ecx
mov al,'/'
@@:
cmp [esi],al
je @f
dec esi
inc ecx
jmp @b
@@:
inc esi
push esi
push esi
push ecx
rep movsb
mov al,','
stosb
pop ecx
pop esi
add ecx,-4
rep movsb
mov al,','
stosb
pop ecx
sub ecx,filename
mov esi,filename
rep movsb
mov al,0
stosb
.run:
cmp [run_outfile],1
jne @f
dec edi
mov eax,',run'
stosd
mov al,0
stosb
@@:
mov eax,19
mov ebx,fasm_filename
mov ecx,fasm_parameters
int 0x40
ret
open_debug_board:
mov eax,19
mov ebx,debug_filename
xor ecx,ecx
int 0x40
ret
open_sysfuncs_txt:
mov eax,19
mov ebx,tinypad_filename
mov ecx,sysfuncs_filename
int 0x40
ret
empty_work_space:
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
mov eax,' '
mov edi,0x80000
mov ecx,(0x300000-0x90000)/4
cld
rep stosd
mov edi,0x10000
mov ecx,0x60000/4
rep stosd
ret
clear_screen:
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
mov ecx,80*40
mov edi,0x78000
xor eax,eax
@@:
mov [edi],eax
add edi,4
dec ecx
jnz @b
ret
invalidate_string:
imul eax,[posy],80
add eax,0x78000
mov edi,eax
mov al,1
mov ecx,80/4
rep stosd
ret
layout:
; ᬥ<><E1ACA5><EFBFBD><EFBFBD> <20><><EFBFBD><E1AAAB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov eax,19
mov ebx,setup
mov ecx,param_setup
int 0x40
mov eax,5
mov ebx,eax
int 0x40
call activate_me
ret
activate_me:
; 1) get info about me
mov eax,9
mov ebx,procinfo
mov ecx,-1
int 0x40
; eax = number of processes
; save process counter
inc eax
inc eax
mov [proccount],eax
mov eax,[procinfo.PID]
mov [PID],eax
; 2) get my process number
mov eax,9
mov ebx,procinfo
mov ecx,[proccount]
@@:
dec ecx
jz @f ; counter=0 => not found? => return
mov eax,9
int 0x40
mov edx,[procinfo.PID]
cmp edx,[PID]
jne @b
;found: ecx = process_number
mov eax,18
mov ebx,3
int 0x40
mov eax,5
mov ebx,eax
int 0x40
@@:
ret
; *******************************************************************
; ************************** DRAW WINDOW **************************
; *******************************************************************
align 4
drawwindow:
mov eax,12 ; WINDOW DRAW START
mov ebx,1
int 0x40
mov [menu_is_on],0
mov eax,48 ; get system colors
mov ebx,3
mov ecx,sc
mov edx,sizeof.system_colors
int 0x40
mov [sc.work],0xe0e0e0
xor eax,eax ; DEFINE WINDOW
mov ebx,100*65536+506 ; 496
mov ecx,75*65536+400 ;385;400 ; sum < 480 for 640x480
mov edx,[sc.work]
add edx,0x03000000
mov esi,[sc.grab]
or esi,0x80000000
mov edi,[sc.frame]
int 0x40
; header string
mov eax,4
mov ebx,10*65536+8
mov ecx,[sc.grab_text]
mov edx,header
mov esi,[headlen]
int 0x40
mov eax,9 ; get info about me
mov ebx,procinfo
or ecx,-1
int 0x40
mov eax,[procinfo.y_size]
mov [do_not_draw],1 ; do_not_draw = true
cmp eax,100
jb .no_draw ; do not draw text & buttons if height < 100
mov [do_not_draw],0 ; do_not_draw = false
add eax,-(46+47) ; 46 = y offs
cdq
mov ebx,10
div ebx
mov [slines],eax
cmp eax,[posy]
jnb @f
dec eax
mov [posy],eax
@@:
mov eax,[procinfo.y_size] ; calculate buttons position
add eax,-47
mov [dstart],eax
; mov eax,8 ; STRING BUTTON
; mov ebx,5*65536+57
; mov ecx,[dstart]
; add ecx,29
; shl ecx,16
; add ecx,13
; mov edx,51 ;;;;;-----string button ID=51
; mov esi,[sc.work_button]
; int 0x40
; SEARCH BUTTON
; mov ebx,(505-129)*65536+125
; mov edx,50
; mov esi,[sc.work_button]
; int 0x40
; mov eax,4 ; SEARCH TEXT
; mov ebx,[dstart]
; add ebx,7*65536+32
; mov ecx,[sc.work_button_text]
; mov edx,searcht
; mov esi,searchtl-searcht
; int 0x40
mov eax,13 ; BAR STRIPE
mov ebx,5*65536+497
mov ecx,[dstart]
shl ecx,16
add ecx,30 ;15
mov edx,0x00aaaaaa
int 0x40
; mov eax,4 ; FIRST TEXT LINE (POSITION...)
; mov ebx,12*65536
; add ebx,[dstart]
; add ebx,38 ;18
; mov ecx,[sc.work_button_text]
; mov edx,htext2
; mov esi,htextlen2-htext2
; int 0x40
call drawfile
; mov eax,[dstart]
; add eax,31
; mov [ya],eax
; mov [addr],search_string
; call print_text
.no_draw:
call draw_win_menu
call draw_vertical_scroll
mov eax,12 ; WINDOW DRAW END
mov ebx,2
int 0x40
ret
; **********************************
; *********** DRAWFILE ***********
; **********************************
drawfile:
;---------------
cmp [menu_is_on],1
jne .ff
call drawwindow
.ff:
;---------------
mov [next_not_quote],1
mov [next_not_quote2],1
mov eax,[post] ; print from position
pusha
mov edi,[post]
mov [posl],edi
mov ebx,8*65536+46 ; letters (46 = y offs)
xor ecx,ecx
mov edx,0x80000
add edx,eax
mov edi,edx
imul esi,[slines],80
add edi,esi
nd:
pusha
mov edx,ebx
mov edi,ebx
add edi,(6*65536)*80
wi1:
; draw ?
pusha
push ecx
imul eax,[posx],6
add eax,8
shl eax,16
mov ecx,eax
;  ecx = ([posx]*6+8)<<16
imul eax,[posy],10
add eax,46 ; y offs
add eax,ecx
;  eax = [posy]*10+46+ecx
pop ecx
cmp edx,eax
jnz drwa
mov eax,0x7ffff
call check_pos
jmp drlet
drwa:
popa
pusha
imul eax,[posxm],6
add eax,8
shl eax,16
mov ecx,eax
imul eax,[posym],10
add eax,46 ; y offs
add eax,ecx
cmp edx,eax
jnz drwa2
mov eax,0x7ffff
call check_pos
jmp drlet
drwa2:
popa
pusha
mov eax,0x78000 ; screen
add eax,[posl] ; screen+abs
sub eax,[post] ; eax = screen+abs-base = y*80+x + screen
mov edx,0x80000 ; file
add edx,[posl] ; edx = absolute
mov bl,[edx] ; in the file
call check_pos
mov cl,[eax] ; on the screen
cmp bl,cl
jnz drlet
popa
jmp nodraw
; draw letter
drlet:
mov [eax],bl ; mov byte to the screen
mov [tmpabc],bl
popa ; restore regs
;!!!!!!!!!!!!
cmp [tmpabc],' '
je @f
call draw_letter
jmp nodraw
@@:
call clear_char
nodraw:
inc [posl]
add edx,6*65536
cmp edx,edi
jz wi3
jmp wi1
wi3:
popa
add ebx,10
add edx,80
cmp edi,edx
jbe nde
jmp nd
nde:
mov eax,[posx]
mov ebx,[posy]
mov [posxm],eax
mov [posym],ebx
popa
ret
stText = 0
stInstr = 1
stReg = 2
stNum = 3
stQuote = 4
stComment = 5
stSymbol = 6
align 4
clear_char:
pusha
mov ebx,[sc.work]
push ecx
imul eax,[posx],6
add eax,8
shl eax,16
mov ecx,eax
imul eax,[posy],10
add eax,46 ; 26
add eax,ecx
pop ecx
cmp edx,eax
jnz @f
mov ebx,0xffffff ; light blue 0x00ffff
@@:
; draw bar
push ebx
mov eax,13
mov ebx,edx
mov bx,6
mov ecx,edx
shl ecx,16
add ecx,10
pop edx
int 0x40
popa
ret
align 4
; CHECK_POSITION {
check_pos:
cmp [asm_mode],1
je @f
mov [d_status],stText
ret
@@:
pushad
; COMMENT TERMINATOR
cmp [d_status],stComment
jnz @f
mov eax,[posl]
sub eax,[post]
cdq
mov ebx,80
div ebx
test edx,edx
jnz end_check_pos
mov [d_status],stText
@@:
; QUOTE TERMINATOR B
cmp [next_not_quote],1
jne @f
mov [d_status],stText
@@:
mov eax,[posl]
add eax,0x80000
mov edx,eax
mov al,[eax]
; QUOTE TERMINATOR A
cmp [d_status],stQuote
jnz @f
cmp al,[quote]
jne end_check_pos
mov [next_not_quote],1
jmp end_check_pos
@@:
mov [next_not_quote],0
; START QUOTE 1
cmp al,"'"
jne @f
mov [d_status],stQuote
mov [quote],al
jmp end_check_pos
@@:
; START QUOTE 2
cmp al,'"'
jne @f
mov [d_status],stQuote
mov [quote],al
jmp end_check_pos
@@:
; START COMMENT
cmp al,';'
jne @f
mov [d_status],stComment
jmp end_check_pos
@@:
; NUMBER TERMINATOR
cmp [d_status],stNum
jne nonumt
mov ecx,23
@@:
dec ecx
jz nonumt
cmp al,[symbols+ecx]
jne @b
nonumt1:
mov [d_status],stText
nonumt:
; START NUMBER
cmp [d_status],stNum
je end_check_pos
cmp al,'0'
jb nonum
cmp al,'9'
ja nonum
mov bl,[edx-1]
mov ecx,23
@@:
dec ecx
jz nonum
cmp bl,[symbols+ecx]
jne @b
@@:
mov [d_status],stNum
jmp end_check_pos
nonum:
; SYMBOL
mov esi,symbols
mov ecx,21
@@:
cmp byte [esi],al
je @f
dec ecx
jz nosymbol
inc esi
jmp @b
@@:
mov [d_status],stSymbol
jmp end_check_pos
nosymbol:
mov [d_status],stText
end_check_pos:
popad
ret
; CHECK_POSITION }
;;;;;;;;;;;;;;;;;
;; DRAW LETTER ;;
;;;;;;;;;;;;;;;;;
draw_letter:
call clear_char
pusha
mov ebx,edx ; x & y
mov eax,[d_status]
mov ecx,[eax*4+color_tbl]
mov eax,4
xor esi,esi
inc esi
mov edx,0x80000
mov edi,[posl]
add edx,edi
int 0x40
popa
ret
; ********************************************
; **************** SAVEFILE ****************
; ********************************************
save_file:
mov esi,0x80000
mov edi,0x10000
or ecx,-1
.new_string:
inc ecx
call save_string
cmp ecx,[lines]
jb .new_string
sub edi,0x10004 ; why???
mov [filelen],edi
cmp byte [filename],'/'
je .systree_save
mov eax,33
mov ebx,filename
mov ecx,0x10000
mov edx,[filelen]
xor esi,esi
int 0x40
test eax,eax
je .finish
; call file_not_found
call disk_is_full
;==============================
jmp .finish
.systree_save:
mov eax,[filelen]
mov [fileinfo_write+8],eax
mov esi,filename
mov edi,pathfile_write
mov ecx,50
cld
rep movsb
mov eax,58
mov ebx,fileinfo_write
int 0x40
cmp eax,0
je .finish
call disk_is_full
.finish:
call draw_window_for_dialogs
mov [modified],0
ret
save_string:
push ecx
push esi
mov eax,esi
mov ebx,eax
add ebx,79
.countlen:
cmp ebx,eax
jb .endcount
cmp byte [ebx],' '
jne .endcount
dec ebx
jmp .countlen
.endcount:
inc ebx
sub ebx,eax
mov ecx,ebx
jecxz .endcopy
.copystr:
mov al,[esi]
mov [edi],al
inc esi
inc edi
dec ecx
jnz .copystr
.endcopy:
mov eax,0x0a0d
stosw
pop esi
add esi,80
pop ecx
ret
; ********************************************
; **************** LOADFILE ****************
; ********************************************
loadhdfile:
mov esi,filename
mov edi,pathfile_read
mov ecx,250 ;50
cld
rep movsb
mov eax,58
mov ebx,fileinfo_read
int 0x40
xchg eax,ebx
inc eax
test ebx,ebx ;errorcode=0 - ok
je file_found
cmp ebx,6 ;errorcode=5 - ok
je file_found
call file_not_found
ret
loadfile1:
mov eax,6 ; 6 = open file
mov ebx,filename
xor ecx,ecx
mov edx,16800
mov esi,0x10000
int 0x40
inc eax ; eax = -1 -> file not found
jnz file_found ;strannaya proverka (Ed)
call file_not_found
ret
file_found:
dec eax
; eax = file size
jz .finish
mov [filesize],eax
mov edi,0x80000 ; clear all
@@:
mov [edi],byte ' '
inc edi
cmp edi,0x2effff
jnz @b
mov [lines],0
mov edi,0x10000
mov ebx,0x80000
; edi = from
; ebx = to
; eax = filesize
.new_char:
mov cl,[edi] ; get_char();
cmp cl,13 ; if (char==13)
je .new_str1 ; goto .new_str1;
cmp cl,10 ; if (char==10)
je .new_str2 ; goto .new_str2;
mov [ebx],cl ; store_char();
inc ebx ; dest++;
.back:
inc edi ; src++;
dec eax ; counter--;
jnz .new_char ; if (counter!=0) goto .new_char;
.finish:
inc [lines] ; [lines]++;
ret
.new_str1:
pusha
mov eax,ebx ; eax = destination
add eax,-0x80000 ; eax = offset
cdq
mov ecx,80
div ecx ; offset /= 80;
test edx,edx ; if not the first char in the string
jne @f ; go forward
test eax,eax ; if first line
je @f ; go forward
cmp [edi-1],byte 10; if previous char != 10 continue without line feed
jne .contin
@@:
inc eax ; offset++;
imul eax,80 ; offset *= 80;
add eax,0x80000
mov [esp+4*4],eax ; to ebx
.contin:
popa
inc edi ; do not look on the next char (10)
dec eax ; counter--;
inc [lines] ; [lines]++;
jmp .back
.new_str2:
pusha
mov eax,ebx
add eax,-0x80000
cdq
mov ecx,80
div ecx
inc eax
imul eax,80
add eax,0x80000
mov [esp+4*4],eax ; to ebx
popa
inc [lines]
jmp .back
file_not_found:
mov eax,55 ; beep
mov ebx,eax
mov esi,error_beep
int 0x40
mov [lines],1 ; open empty document
mov [to_return2],1
call openerror
ret
disk_is_full:
mov eax,55 ; beep
mov ebx,eax
mov esi,error_beep
int 0x40
mov [to_return2],1
call saveerror
mov [error2_found],1
ret
; *****************************
; ****** WRITE POSITION ******
; *****************************
writepos:
cmp [do_not_draw],1 ; return if drawing is not permitted
jne @f
ret
@@:
pusha
mov eax,[posx]
inc eax
cdq
mov ebx,10
div ebx
add al,'0'
add dl,'0'
mov [htext2+ 9],al
mov [htext2+10],dl
mov eax,[post]
cdq
mov ebx,80
div ebx
mov [real_posy],eax ;=====!!!!!!!!!
add eax,[posy]
inc eax
mov ebx,10
cdq
div ebx
add dl,'0'
mov [htext2+16],dl ; 00001
cdq
div ebx
add dl,'0'
mov [htext2+15],dl ; 00010
cdq
div ebx
add dl,'0'
mov [htext2+14],dl ; 00100
cdq
div ebx
add dl,'0'
add al,'0'
mov [htext2+13],dl ; 01000
mov [htext2+12],al ; 10000
mov eax,[lines] ; number of lines
cdq
mov ebx,10
div ebx
add dl,'0'
mov [htext2+31],dl ; 0001
cdq
div ebx
add dl,'0'
mov [htext2+30],dl ; 0010
cdq
div ebx
add dl,'0'
mov [htext2+29],dl ; 0100
cdq
div ebx
add dl,'0'
add al,'0'
mov [htext2+28],dl
mov [htext2+27],al ; 10000
; <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
; mov [htext2+42], word 'RU'
; mov eax,13 ; draw bar
; mov ebx,5*65536+38*6
; mov ecx,[dstart]
; shl ecx,16
; add ecx,15
; mov edx,[sc.work_graph]
; int 0x40
mov eax,13 ; BAR STRIPE
mov ebx,5*65536+497
mov ecx,[dstart]
add ecx,29;30 ;15
shl ecx,16
add ecx,14
mov edx,[sc.work_graph]
int 0x40
mov eax,4 ; write position
mov ebx,12*65536
mov bx,word [dstart]
add ebx,33 ;18
mov ecx,[sc.work_button_text]
mov edx,htext2
mov esi,38
int 0x40
cmp [modified],1
jne no_mod
if lang eq ru
putlabel 270,386,'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',[sc.work_button_text]
else
putlabel 270,386,'MODIFIED',[sc.work_button_text]
end if
no_mod:
popa
ret
;-----------------------------
; search window
;-----------------------------
search_window:
mov eax,13
mov ebx,55*65536+380
mov ecx,100*65536+60
mov edx,[sc.work_graph]
int 0x40
mov eax,38
mov ebx,55*65536+435
mov ecx,100*65536+100
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,55*65536+55
mov ecx,100*65536+160
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,435*65536+435
mov ecx,100*65536+160
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,55*65536+435
mov ecx,160*65536+160
mov edx,cl_White
int 0x40
if lang eq ru
drawlbut 375,110,50,15,'<27><><EFBFBD><EFBFBD><EFBFBD>',50,[sc.work_button],[sc.work_button_text]
drawlbut 375,130,50,15,'<27><EFBFBD><E2ACA5>',94,[sc.work_button],[sc.work_button_text]
else
drawlbut 375,110,50,15,'Search',50,[sc.work_button],[sc.work_button_text]
drawlbut 375,130,50,15,'Cancel',94,[sc.work_button],[sc.work_button_text]
end if
call read_string
; add eax,31
; mov [ya],eax
; mov [addr],search_string
; call print_text
jmp search
string_not_found:
mov eax,13
mov ebx,150*65536+200
mov ecx,100*65536+70
mov edx,[sc.work_graph] ;0x00dd9438 ;0x00ff7512
int 0x40
mov eax,38
mov ebx,150*65536+350
mov ecx,100*65536+100
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,150*65536+350
mov ecx,170*65536+170
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,150*65536+150
mov ecx,100*65536+170
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,350*65536+350
mov ecx,100*65536+170
mov edx,cl_White
int 0x40
if lang eq ru
putlabel 195,120,'<27><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!',cl_White
else
putlabel 195,120,'String not found!',cl_White
end if
drawlbut 235,140,30,15,'<27><>',94,[sc.work_button],cl_White
ret
read_string:
push eax
;----------------
mov eax,40
mov ebx,00000000000000000000000000000111b
int 0x40
;----------------
pop eax
; cmp al,51
; jz .f2
; ret
.f2:
mov [addr],dword search_string
mov eax,[dstart]
add eax,17+14
mov [ya],eax
mov [case_sens],1
.rk:
mov edi,[addr]
mov eax,[addr]
mov eax,[eax-4]
mov [temp],eax
add edi,eax
call print_text
.waitev:
mov eax, 10
int 0x40
cmp eax, 2
jne .read_done
int 0x40
shr eax, 8
cmp al, 13 ; enter
je .read_done
cmp al,27
jne ._f
jmp red
._f:
cmp al, 192 ; Ctrl + space
jne .noclear
xor eax, eax
mov [temp], eax
mov edi, [addr]
mov [edi-4], eax
mov ecx, 49
cld
rep stosb
mov edi, [addr]
call print_text
jmp .waitev
.noclear:
cmp al, 8 ; backspace
jnz .nobsl
cmp [temp], 0
jz .waitev
dec [temp]
mov edi, [addr]
add edi, [temp]
mov [edi], byte 0
mov eax,[addr]
dec dword [eax-4]
call print_text
jmp .waitev
.nobsl:
cmp [temp],50
jae .read_done
; CONVERT CHAR TO UPPER CASE:
cmp al, ' ' ; below "space" - ignore
jb .waitev
cmp [case_sens], 1 ; case sensitive?
je .keyok
cmp al, 'a'
jb .keyok
cmp al, 'z'
ja .keyok
sub al, 32
.keyok:
mov edi,[addr]
add edi,[temp]
mov [edi],al
inc [temp]
mov eax,[addr]
inc dword [eax-4]
call print_text
cmp [temp],50
jbe .waitev
.read_done:
mov ecx,50
sub ecx,[temp]
mov edi,[addr]
add edi,[temp]
xor eax,eax
cld
rep stosb
mov [temp],987
call print_text
call mask_events
ret
print_text:
pusha
mov eax,13
mov ebx,64*65536+50*6+2
; mov ecx,[ya]
; shl ecx,16
; add ecx,12
mov ecx,110*65536+12
mov edx,[sc.work]
int 0x40
mov edx,[addr]
mov esi,[edx-4]
mov eax,4
mov ebx,65*65536+112 ;2
; add ebx,[ya]
mov ecx,[color_tbl+0]
int 0x40
cmp [temp],50
ja @f
; draw cursor
; {
; mov eax,[ya]
mov eax,18*65536+102 ;65
mov ebx,eax
shl eax,16
add eax,ebx
add eax,10
mov ecx,eax
mov eax,[temp]
; imul eax,6
lea eax,[eax+eax*2]
shl eax,1
add eax,65
mov ebx,eax
shl eax,16
add ebx,eax
mov eax,38
mov edx,[color_tbl+0]
int 0x40
; }
@@:
popa
ret
; mov eax,8 ; STRING BUTTON
; mov ebx,5*65536+57
; mov ecx,[dstart]
; add ecx,29
; shl ecx,16
; add ecx,13
; mov edx,51 ;;;;;-----string button ID=51
; mov esi,[sc.work_button]
; int 0x40
; SEARCH BUTTON
; mov ebx,(505-129)*65536+125
; mov edx,50
; mov esi,[sc.work_button]
; int 0x40
; mov eax,4 ; SEARCH TEXT
; mov ebx,[dstart]
; add ebx,7*65536+32
; mov ecx,[sc.work_button_text]
; mov edx,searcht
; mov esi,searchtl-searcht
; int 0x40
; ****************************
; ******* READ STRING ********
; ****************************
goto_string:
mov [num_goto_string],0
call read_str_num
mov eax,[num_goto_string]
cmp eax,[lines]
ja .leave
;---------------
mov [posy],0
call goto_pos
.leave:
call draw_window_for_dialogs
call mask_events
jmp still
read_str_num:
push eax
;----------------
mov eax,40
mov ebx,00000000000000000000000000000111b
int 0x40
;----------------
pop eax
mov eax,13
mov ebx,100*65536+100
mov ecx,70*65536+60
mov edx,[sc.work_button]
int 0x40
mov eax,38
mov ebx,100*65536+200
mov ecx,70*65536+70
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,100*65536+200
mov ecx,130*65536+130
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,100*65536+100
mov ecx,70*65536+130
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,200*65536+200
mov ecx,70*65536+130
mov edx,cl_White
int 0x40
putlabel 105,75,'GoTo Line #',cl_White
mov eax,13
mov ebx,110*65536+40
mov ecx,90*65536+12;[ya]
mov edx,[sc.work]
int 0x40
outcount [num_goto_string],112,92,cl_Black,6*65536
drawlbut 110,105,40,15,'GoTo',93,cl_Grey,cl_Black
drawlbut 153,105,40,15,'Cancel',94,cl_Grey,cl_Black
.waitev:
mov eax, 10
int 0x40
; cmp eax,6
; je .mouse
cmp eax,3
je .but
cmp eax, 2
; jne .read_done
jne .waitev
int 0x40
shr eax, 8
cmp al, 13 ; enter
je .read_done
cmp al,27
je goto_string.leave
cmp al, 8 ; backspace
jnz .nobsl
xor edx,edx
mov eax,[num_goto_string]
mov ebx,dword 10
div ebx
mov [num_goto_string],eax
call print_text2
jmp .waitev
;.mouse:
;mov eax,37
;mov ebx,2
;int 0x40
;cmp eax,2
;je goto_string.leave
;jmp .waitev
.but:
mov eax,17
int 0x40
cmp ah,94
je goto_string.leave
cmp ah,93
je .read_done
jmp .waitev
.nobsl:
xor ecx,ecx
xor edx,edx
sub al,48
mov cl,al
mov eax,[num_goto_string]
cmp eax,99999
ja .read_done
mov ebx,10
mul ebx
add eax,ecx
mov [num_goto_string],eax
call print_text2
jmp .waitev
.read_done:
mov eax,[num_goto_string]
dec eax
mov [num_goto_string],eax
call print_text2
ret
print_text2:
pusha
mov eax,13
mov ebx,110*65536+40
mov ecx,90*65536+12;[ya]
mov edx,[sc.work]
int 0x40
outcount [num_goto_string],112,92,cl_Black,6*65536
popa
ret
;******************************************************************************
calc_scroll_size_and_pos:
;cmp [menu_is_on],0
;je ._ff
;call drawwindow
;mov [menu_is_on],0
;._ff:
cmp [lines],30
jbe .lines_less_30
xor edx,edx
mov eax,[post]
mov ebx,80
div ebx
add eax,[posy]
;add eax,[slines]
;checking for bug
mov ebx,[lines]
sub ebx,30
cmp eax,ebx
ja .f
mov [VScroll_1+16],eax
jmp .ff
.f:
mov [VScroll_1+16],ebx
.ff:
;---------------------
mov eax,[lines]
sub eax,30 ;---max=lines-30
mov [VScroll_1+12],eax
jmp .leave
.lines_less_30:
mov [VScroll_1+16],dword 0
mov [VScroll_1+12],dword 1
.leave:
ret
;============Draw vertical scroll bar=========
draw_vertical_scroll:
call calc_scroll_size_and_pos
;========================
xor ecx,ecx ;start at top of controls list
Draw_Controls_Loop: ;Redraw Controls Loop
mov ebp, [App_Controls+ecx] ;get controls data location
or ebp,ebp ;is this the last control?
jz Draw_Controls_Done ;
call dword [App_Controls+ecx+4] ;call controls draw function
add ecx, 12 ;get next control
jmp Draw_Controls_Loop ;loop till done
Draw_Controls_Done: ;all done
;========================
mov eax,38
mov ebx,488*65536+488
mov ecx,43*65536+388
mov edx,0x00000000
int 0x40
ret
mouse_info:
;call
mov eax, 37 ;get mouse cordinates
mov ebx, 1 ;
int 0x40 ;
mov ecx, eax ;
push ecx ;
mov eax, 37 ;get mouse buttons
mov ebx, 2 ;
int 0x40 ;
;------------------
; if menu is on - then we need to redraw window before continue
cmp eax,1
jne ._f1
pusha
cmp [menu_is_on],0
je ._ff
call drawwindow
mov [menu_is_on],0
._ff:
popa
._f1:
;------------------
cmp [mouseb], eax ;compare old mouse states to new states
jne redraw_mouse_info ;
cmp [mousey], cx ;
jne redraw_mouse_info ;
shr ecx, 16 ;
cmp [mousex], cx ;
jne redraw_mouse_info ;
pop ecx ;
ret ;return if no change in states
redraw_mouse_info:
pop ecx
mov [mouseb], eax ;save new mouse states
mov dword [mousey], ecx
xor ecx, ecx
Check_Mouse_Over_Controls_Loop:
mov ebp, [App_Controls+ecx]
or ebp, ebp
jz Check_Mouse_Over_Controls_Loop_done
movzx eax,word [ebp+2]
cmp ax, [mousex]
ja mouse_not_on_control
movzx eax,word [ebp+6]
cmp ax, [mousey]
ja mouse_not_on_control
movzx eax,word [ebp]
add ax, [ebp+2]
cmp ax, [mousex]
jb mouse_not_on_control
movzx eax,word [ebp+4]
add ax, [ebp+6]
cmp ax, [mousey]
jb mouse_not_on_control
call dword [App_Controls+ecx+8]
;------------------------------
cmp [mouseb],1
jne mouse_not_on_control
mov eax,[VScroll_1+16]
call goto_pos
;------------------------------
mouse_not_on_control:
add ecx, 12
jmp Check_Mouse_Over_Controls_Loop
Check_Mouse_Over_Controls_Loop_done:
ret
;******************************************************************************
goto_pos:
;pusha
mov ecx,eax ;save new position number in ecx for future
cmp [lines],30 ;check for 'cursor' bug
jbe .lines_less_30
;---------------
mov edx,[lines] ;if new pos is > than (lines-30)
sub edx,30
cmp eax,edx
ja .f1
jmp .ff
.f1:
mov eax,edx ;than newpos is = (lines-30)
sub ecx,edx ;and posY=newpos-(lines-30)
mov [posy],ecx
.ff:
;-----------------------
;in eax must be string number
mov ecx,80
mul ecx
; add eax,[slines]
; sub
;------------------------
mov [post],eax
.lines_less_30:
call clear_screen
call drawfile
;popa
ret
;******************************************************************************
mask_events:
mov eax,40
mov ebx,00100111b
int 0x40
ret
;******************************************************************************
main_cursor_move:
;call drawwindow
sub [mouse_x],7
sub [mouse_y],45
xor edx,edx
mov eax,[mouse_x]
mov ebx,6
div ebx ;eax=result
mov [posx],eax
xor edx,edx
mov eax,dword [mouse_y]
mov ebx,dword 10
div ebx ;eax=result=new posY
;error checking ------
cmp [lines],dword 1 ;for "1st line" bug
je ._do_nothing
mov ebx,[lines]
sub ebx,dword 1
cmp eax,ebx ;[lines]
ja ._do_nothing
;----------------------
mov [posy],eax
._do_nothing:
call clear_screen
call drawfile
call draw_vertical_scroll
ret
;******************************************************************************
make_fast_so:
;===========================
; 1) get info about me
mov eax,9
mov ebx,procinfo
mov ecx,-1
int 0x40
; eax = number of processes
; save process counter
inc eax
inc eax
mov [proccount],eax
mov eax,[procinfo.PID]
mov [PID],eax
;==========================
mov eax,51
mov ebx,1
mov ecx,fast_so_thread_start
mov edx,so_stack
int 0x40
ret
;******************************************************************************
;fast save & fast open
draw_fastso_window:
startwd
colorwindow 120,100,454,70,window_Type1+0x00cccccc,0x00cccccc,cl_Black
call draw_string00
drawlbut 10,40,30,20,'Save',17,cl_Grey,cl_Black
drawlbut 50,40,30,20,'Open',18,cl_Grey,cl_Black
drawlbut 90,40,37,20,'Close',19,cl_Grey,cl_Black
endwd
ret
draw_string00:
mov ebx,10*65536+433
mov ecx,10*65536+20
mov edx,0x00ffffff
mov eax,13
int 0x40
push eax
mov eax,6*65536
mul dword [pos00]
add eax,10*65536+6
mov ebx,eax
pop eax
mov edx,0x6a73d0
int 0x40
mov eax,4
mov ebx,12*65536+17
mov ecx,cl_Black ;0x00000000
mov edx,mypath ;filename ;path
mov esi,71 ;200
int 0x40
ret
fast_so_thread_start:
;copy filename to mypath
cld
mov esi,filename
mov edi,mypath
mov ecx,71 ;200
rep movsb
mov edi,mypath
mov ecx,71 ;200
xor eax,eax
repne scasb
;end copy
call draw_fastso_window
fastso_still:
wtevent fred,fkey,fbut
jmp fastso_still
fred:
call draw_fastso_window
jmp fastso_still
;====KEY
fkey:
mov eax,2
int 0x40
cmp ah,179
jne noright00
mov eax,[pos00]
cmp eax,70 ;41
ja fastso_still
inc eax
mov [pos00],eax
call draw_string00
jmp fastso_still
noright00:
cmp ah,176
jne noleft00
mov eax,[pos00]
test eax,eax
je fastso_still
dec eax
mov [pos00],eax
call draw_string00
jmp fastso_still
noleft00:
cmp ah,182
jne nodelete00
call shiftback00
call draw_string00
jmp fastso_still
nodelete00:
cmp ah,8
jne noback00
mov eax,[pos00]
test eax,eax
je fastso_still
dec eax
mov [pos00],eax
call shiftback00
call draw_string00
jmp fastso_still
noback00:
enter00:
cmp ah,19 ;ctrl+s
je fast_save
cmp ah,15 ;ctrl+o
je fast_open
cmp ah,27 ;esli escape
jne noesc00
jmp closethis ;to zakrivaem okno i nifiga ne delayem
noesc00:
cmp dword [pos00],71 ;200 ;42
jae fastso_still ;if pos>71 then jump to still
;============letters==================
;~~~~~~~TEST CODE~~~~~~~~~
; upper case
shr eax,8
cmp eax,dword 31
jbe no_lit
cmp eax,dword 95
jb capital
sub eax,32
capital:
;~~~~~~~~~~~~~~~~~~~~~~~~~
mov edi,mypath ;filename ;mypath ;**************PATHNAME
add edi,71 ;200 ;count of letters
mov esi,edi
dec esi
mov ecx,71 ;200 ;again???
sub ecx,[pos00]
std
rep movsb
;shr eax,8
mov esi,mypath ;filename ;*************PATH AGAIN
add esi,[pos00]
mov byte [esi],al
inc dword [pos00]
call draw_string00
no_lit:
jmp fastso_still
;===============================
shiftback00:
mov edi,mypath ;filename ;******PATH
add edi,[pos00]
mov esi,edi
inc esi
mov ecx,71 ;200 ; count???
sub ecx,[pos00]
cld
rep movsb
ret
;******************************************************************************
;====button
fbut:
mov eax,17
int 0x40
cmp ah,17
je fast_save
cmp ah,18
je fast_open
cmp ah,19
je closethis
jmp fastso_still
;******************************************************************************
;******************************************************************************
fast_open:
call path_copy
call set_title
mov [to_return],1
call do_load_file
jmp closethis
fast_save:
call path_copy
call save_file
call set_title
;call copy_fpath_s
closethis:
mov [to_return],0
cmp [error_found],1
je @f
call activate_main
@@:
mov [error_found],0
close
activate_main:
mov eax,9
mov ebx,procinfo
mov ecx,[proccount]
@@:
dec ecx
jz @f ; counter=0 => not found? => return
mov eax,9
int 0x40
mov edx,[procinfo.PID]
cmp edx,[PID]
jne @b
;found: ecx = process_number
mov eax,18
mov ebx,3
int 0x40
mov eax,5
mov ebx,eax
int 0x40
@@:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
doyouwannasave:
;******************************************************************************
cmp [modified],0
je newfile
mov eax,55 ; beep
mov ebx,eax
mov esi,save_beep1
int 0x40
delay 4
mov eax,55 ; beep
mov ebx,eax
mov esi,save_beep2
int 0x40
mov eax,13
mov ebx,150*65536+200
mov ecx,100*65536+70
mov edx,[sc.work_graph] ;0x00dd9438 ;0x00ff7512
int 0x40
mov eax,38
mov ebx,150*65536+350
mov ecx,100*65536+100
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,150*65536+350
mov ecx,170*65536+170
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,150*65536+150
mov ecx,100*65536+170
mov edx,cl_White
int 0x40
mov eax,38
mov ebx,350*65536+350
mov ecx,100*65536+170
mov edx,cl_White
int 0x40
if lang eq ru
putlabel 190,120,'<27><><EFBFBD><EFBFBD><E0A0AD><EFBFBD> <20><><EFBFBD><EFBFBD><E3ACA5>?',cl_White
drawlbut 170,140,30,15,'<27><>',46,[sc.work_button],cl_White
drawlbut 230,140,30,15,'<27><><EFBFBD>',45,[sc.work_button],cl_White
drawlbut 290,140,45,15,'<27><EFBFBD><E2ACA5>',47,[sc.work_button],cl_White
else
putlabel 190,120,'Save document?',cl_White
drawlbut 170,140,30,15,'Yes',46,[sc.work_button],cl_White
drawlbut 230,140,30,15,'No',45,[sc.work_button],cl_White
drawlbut 290,140,45,15,'Cancel',47,[sc.work_button],cl_White
end if
mov [exit_wnd_on],1
jmp still
;-------------
newfile:
;if filename is not NEWDOC## than change it to it!
mov eax,dword [orig_filename]
cmp dword [filename],eax ;[orig_filename]
je @f
cld
mov esi,orig_filename
mov edi,filename
mov ecx,71 ;50
rep movsb
mov edi,filename
mov ecx,71 ;50
xor eax,eax
repne scasb
sub edi,filename
dec edi
mov [filename_len],edi
@@:
call change_fname
call set_title
call draw_window_for_dialogs
call empty_work_space
mov [lines],1
jmp do_load_file.restorecursor
change_fname:
cmp [filename+7],'9'
jne addfname
cmp [filename+6],'9'
je error_creating_new_file
mov [filename+7],'0'
add [filename+6],0x1
jmp leavenow
addfname:
add [filename+7],0x1
leavenow:
ret
set_title:
cmp [error2_found],1
je no_set_title
mov esi, filename
mov edi, header
mov ecx, [filename_len]
mov eax, ecx
add eax, 10
mov [headlen], eax
cld
rep movsb
mov [edi], dword ' - '
add edi, 3
mov esi, htext
mov ecx, htext.size
rep movsb
call drawwindow
no_set_title:
mov [error2_found],0
ret
draw_window_for_dialogs:
call clear_screen
call drawwindow
ret
copy_fpath:
call mask_events
call path_copy
call set_title
call draw_window_for_dialogs
jmp do_load_file
copy_fpath_s:
call mask_events
call path_copy
call save_file
call set_title
call draw_window_for_dialogs
jmp still
path_copy:
cld
mov esi,mypath
mov edi,filename
mov ecx,250 ;71 ;50
rep movsb
mov edi,filename
mov ecx,250 ;71 ;50
xor eax,eax
repne scasb
sub edi,filename
dec edi
mov [filename_len],edi
ret
openerror:
mov eax,360
mov ebx,openerrtext
mov ecx,1
call alert_box
cmp [to_return2],1
jne jmp_to_still
mov [to_return2],0
mov [error_found],1
call mask_events
ret
saveerror:
mov eax,390
mov ebx,saveerrtext
mov ecx,1
call alert_box
cmp [to_return2],0
je jmp_to_still
mov [to_return2],0
mov [error_found],1
call mask_events
ret
;jmp still
jmp_to_still:
call mask_events
jmp still
error_creating_new_file:
mov eax,200
mov ebx,newfileerror
mov ecx,1
call alert_box
jmp still
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;MENU;;;;;;;;;;;;;;;;;;;;;;
draw_win_menu:
;mov eax,8
;mov ebx,145*65536+276
;mov ecx,22*65536+15
;mov edx,00100000000000000000000000001111b
;mov esi,0x00aaaaaa
;int 0x40
mov eax,13
mov ebx,5*65536+497
mov ecx,22*65536+17
mov edx,[sc.work_graph] ;0x00999999
int 0x40
mov ecx,39*65536+5
mov edx,0x00aaaaaa
int 0x40
if lang eq ru
drawlbut 5,22,70,15,'<27><><EFBFBD><EFBFBD>',97,[sc.work_button],[sc.work_button_text]
drawlbut 75,22,70,15,'<27><><EFBFBD>',98,[sc.work_button],[sc.work_button_text]
drawlbut 145,22,70,15,'<27><><EFBFBD><EFBFBD><EFBFBD>',96,[sc.work_button],[sc.work_button_text]
drawlbut 431,22,70,15,'<27><><EFBFBD><E0A0A2>',99,[sc.work_button],[sc.work_button_text]
else
drawlbut 5,22,70,15,'File',97,[sc.work_button],[sc.work_button_text]
drawlbut 75,22,70,15,'Code',98,[sc.work_button],[sc.work_button_text]
drawlbut 145,22,70,15,'Text',96,[sc.work_button],[sc.work_button_text]
drawlbut 431,22,70,15,'Help',99,[sc.work_button],[sc.work_button_text]
end if
ret
draw_win_menu_file:
call clear_screen
call drawwindow
;mov eax,13
;mov ebx,5*65536+71
;mov ecx,35*65536+90
;mov edx,[sc.grab_button];0x00999999
;int 0x40
;mov eax,38
;mov ebx,5*65536+35
;mov ecx,40*65536+47
;mov edx,0x00ff0000
;int 0x40
mov [menu_is_on],1
if lang eq ru
drawlbut 5,38,70,15,'<27><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>',100,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,53,70,15,'<27><><EFBFBD><EFBFBD><EFBFBD>',101,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,68,70,15,'<27><><EFBFBD><EFBFBD><E0A0AD><EFBFBD>',2,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,83,70,15,'<27><><EFBFBD><EFBFBD>. <20><><EFBFBD>',102,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,98,70,15,'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',103,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,113,70,15,'<27><>室',104,[sc.grab_button],[sc.grab_button_text]
else
drawlbut 5,38,70,15,'New window',100,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,53,70,15,'New',101,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,68,70,15,'Save',2,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,83,70,15,'Save as',102,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,98,70,15,'Open',103,[sc.grab_button],[sc.grab_button_text]
drawlbut 5,113,70,15,'Exit',104,[sc.grab_button],[sc.grab_button_text]
end if
jmp still
draw_win_menu_code:
call clear_screen
call drawwindow
if lang eq ru
drawlbut 75,38,70,15,'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.',10000,[sc.grab_button],[sc.grab_button_text]
drawlbut 75,53,70,15,'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',10001,[sc.grab_button],[sc.grab_button_text]
drawlbut 75,68,70,15,'<27><><20><><EFBFBD>.',10002,[sc.grab_button],[sc.grab_button_text]
drawlbut 75,83,70,15,'SysFunc',10003,[sc.grab_button],[sc.grab_button_text]
else
drawlbut 75,38,70,15,'Compile',10000,[sc.grab_button],[sc.grab_button_text]
drawlbut 75,53,70,15,'Run',10001,[sc.grab_button],[sc.grab_button_text]
drawlbut 75,68,70,15,'Debug board',10002,[sc.grab_button],[sc.grab_button_text]
drawlbut 75,83,70,15,'SysFunc',10003,[sc.grab_button],[sc.grab_button_text]
end if
mov [menu_is_on],1
jmp still
draw_win_menu_text:
call clear_screen
call drawwindow
if lang eq ru
drawlbut 145,38,70,15,'GoTo Line#',95,[sc.grab_button],[sc.grab_button_text]
drawlbut 145,53,70,15,'<27><><EFBFBD><EFBFBD><EFBFBD>',92,[sc.grab_button],[sc.grab_button_text]
drawlbut 145,68,70,15,'<27><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',50,[sc.grab_button],[sc.grab_button_text]
else
drawlbut 145,38,70,15,'GoTo Line#',95,[sc.grab_button],[sc.grab_button_text]
drawlbut 145,53,70,15,'Find',92,[sc.grab_button],[sc.grab_button_text]
drawlbut 145,68,70,15,'Find next',50,[sc.grab_button],[sc.grab_button_text]
end if
mov [menu_is_on],1
jmp still
new_pad_wnd:
mov eax,19
mov ebx,tinypad_filename
mov ecx,0
int 0x40
jmp still
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
if lang eq ru
openerrtext db '<27><EFBFBD><E8A8A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E4A0A9> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><EFBFBD><E2ACA5><EFBFBD><EFBFBD>!',0
saveerrtext db '<27><EFBFBD><E8A8A1> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><EFBFBD><><E4A0A9> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><EFBFBD> <20><EFBFBD><E2ACA5><EFBFBD><EFBFBD>!',0
newfileerror db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1AEA7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><>',0
else
openerrtext db 'Error while opening file or opening canceled!',0
saveerrtext db 'Error while saving file or saving canceled!',0
newfileerror db 'Cannot create new file',0
end if
; ********************
; ****** DATA ******
; ********************
sz fasm_filename, 'FASM '
sz debug_filename, 'BOARD '
sz tinypad_filename, 'TINYPAD '
lsz sysfuncs_filename,\
ru, <'SYSFUNCR.TXT',0>,\
en, <'SYSFUNCS.TXT',0>
sz setup, 'SETUP ' ; we need to run SETUP to change keyboard layout
param_setup db 'LANG',0 ; parameter for SETUP
addr dd filename ; address of input string
filename_len dd 12
filename db 'NEWDOC00.TXT'
times 256 db 0;51-12 db 0
;times db 0 ; <20> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><E2A0A2> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
orig_filename db 'NEWDOC00.TXT'
rb 256
search_len dd 5
search_string db 'still'
times 51-5 db 0
case_sens db 0 ; for search function
align 4
comment_string:
db ';***************************************'
db '*************************************** '
; INTERFACE DATA:
sz htext, 'TINYPAD'
;sz toolbar_btn_text, 'COMPILE RUN BOARD SYSFUNC'
searcht:
if lang eq ru
db ' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> > '
db ' <20><><EFBFBD><EFBFBD><EFBFBD> '
else
db ' STRING > '
db ' SEARCH '
end if
searchtl:
htext2:
if lang eq ru
db ' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 00:00000 <20><><EFBFBD><EFBFBD><EFBFBD> 00000 <20><><EFBFBD><EFBFBD><EFBFBD> '
else
db 'POSITION 00:00000 LENGTH 00000 LINES '
end if
htextlen2:
help_text:
if lang eq ru
db ' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: '
db ' '
db ' CTRL+F1 : <20><><EFBFBD> <20><><EFBFBD><EFBFBD> '
db ' CTRL+S : <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD> '
db ' CTRL+E : <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD> '
db ' CTRL+P : <20><><EFBFBD><E2A0A2><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD> <20><><><E2A5AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '
db ' CTRL+D : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> '
db ' CTRL+L : <20><><EFBFBD><E2A0A2><EFBFBD> <20><><EFBFBD>-ࠧ<><E0A0A7><EFBFBD><EFBFBD><EFBFBD> '
db ' CTRL+[ : <20><><EFBFBD><E0A5A9> <20> <20><><EFBFBD><><E4A0A9> '
db ' CTRL+] : <20><><EFBFBD><E0A5A9> <20> <20><><EFBFBD><EFBFBD><EFBFBD><><E4A0A9> '
db ' CTRL+F2 : <20><><EFBFBD><EFBFBD><EFBFBD><E3A7A8><> '
db ' CTRL+F3 : <20><><EFBFBD><EFBFBD><EFBFBD> '
db ' CTRL+F4 : <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><> '
db ' CTRL+F5 : <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><> <20><><EFBFBD>... '
db ' CTRL+F6 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>᪠ '
db ' CTRL+F7 : "<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>" '
db ' CTRL+F8 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E1AAAB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '
db ' CTRL+F9 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><> '
db ' CTRL+F10 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '
db ' F12 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E2ABA0><EFBFBD> '
db 'x'
else
db ' COMMANDS: '
db ' '
db ' CTRL+F1 : SHOW THIS WINDOW '
db ' CTRL+S : SELECT FIRST STRING TO COPY '
db ' CTRL+E : SELECT LAST STRING TO COPY '
db ' CTRL+P : PASTE SELECTED TO CURRENT POSITION '
db ' CTRL+D : DELETE CURRENT LINE '
db ' CTRL+L : INSERT SEPARATOR LINE '
db ' CTRL+[ : GO TO THE BEGINNING OF FILE '
db ' CTRL+] : GO TO THE END OF FILE '
db ' CTRL+F2 : LOAD FILE '
db ' CTRL+F3 : SEARCH '
db ' CTRL+F4 : SAVE FILE '
db ' CTRL+F5 : SAVE FILE AS... '
db ' CTRL+F6 : ENTER SEARCH STRING '
db ' CTRL+F7 : DRAW "FAST SAVE AND OPEN" WINDOW '
db ' CTRL+F8 : CHANGE KEYBOARD LAYOUT '
db ' CTRL+F9 : COMPILE FILE '
db ' CTRL+F10 : RUN OUTFILE '
db ' F12 : OPEN DEBUG BOARD '
db 'x'
end if
help_wnd_header:
if lang eq ru
db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',0
else
db 'TINYPAD HELP',0
end if
hlphead_len = $ - help_wnd_header
save_yes_no:
if lang eq ru
db '<27><><EFBFBD><EFBFBD><E0A0AD><EFBFBD><> <20><><20><><EFBFBD><E5AEA4>?',0
else
db 'Save file before exit?',0
end if
VScroll_1:
dw 13 ;width +0
dw 489 ;x +2
dw 341 ;326 ;height +4
dw 43 ;y +6
dd 0 ;min +8
dd 100 ;scrl_max ;lines ;max +12
dd 0 ;cur_pos ;current +16
dd 1 ;small change +20
dd 10 ;big change +24
App_Controls:
dd VScroll_1 , drawvscroll, VScroll_mouse_over ;
dd 0,0,0 ;last control do not delete
; END OF INTERFACE DATA
symbols db '%#&*\:/<>|{}()[]=+-,. '
error_beep:
db 0xA0,0x30,0
save_beep1:
db 0x84,0x43,0
save_beep2:
db 0x84,0x48,0
align 4
fileinfo_read:
dd 0
dd 0
dd 300000/512
dd 0x10000
dd 0x70000
pathfile_read:
times 250 db 0 ;51 db 0
align 4
fileinfo_write:
dd 1
dd 0
dd 0
dd 0x10000
dd 0x70000
pathfile_write:
times 250 db 0 ; 51 db 0
align 4
temp dd 0xabc ; used in read_string
d_status dd 0
color_tbl:
dd 0x00000000 ; text
dd 0x00000000 ; instruction
dd 0x00000000 ; register
dd 0x00009000 ; number
dd 0x00a00000 ; quote
dd 0x00909090 ; comment
dd 0x003030f0 ; symbol
next_not_quote2 db 0 ; "
next_not_quote db 0 ; '
quote db 0
asm_mode db 0 ; ASM highlight?
tmpabc db 0
I_PARAM db 0 ; parameters are HERE - <20><><EFBFBD><E0A0AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E7A8AD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>!
TINYPAD_END: ; end of file
; Uninitialised data
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6A8A0><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
align 4
posx dd ? ; x <20><> <20><><EFBFBD> (on the screen)
posy dd ? ; y <20><> <20><><EFBFBD>
post dd ? ; ᬥ饭<E1ACA5><E9A5AD> <20><> <20><><EFBFBD> - offset
posl dd ?
lines dd ? ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><20> <20><><EFBFBD><EFBFBD><E3ACA5><EFBFBD>
posxm dd ?
posym dd ?
dstart dd ? ; ᬥ饭<E1ACA5><E9A5AD> <20><> <20><><EFBFBD> y <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E1AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><>.
filelen dd ? ; <20><><EFBFBD><EFBFBD><EFBFBD><><E4A0A9>
PID dd ? ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4A8AA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
proccount dd ? ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
filesize dd ? ; ࠧ<><E0A0A7><EFBFBD><><E4A0A9>
ya dd ? ; <20><><EFBFBD> read_string
slines dd ? ; number of strings on the screen - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><20><> <20><><EFBFBD>
run_outfile dd ? ; for FASM
copy_start dd ? ; Ctrl+S
copy_count dd ? ; Ctrl+E
headlen dd ? ; header length
do_not_draw dd ? ; to draw or not to draw - this is a serious question ;)
MainWndClosed dd ?
sc system_colors
to_return db 0
to_return2 db 0
error_found db 0
error2_found db 0
header: ; window header - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
rb 256
; <20><><EFBFBD><EFBFBD><EFBFBD><E0ACA0><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA2A0><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
procinfo process_information
virtual at procinfo
fasm_parameters rb 256
end virtual
pos00 dd 0
newdoc db ?
mypath:
times 1024+16 db 0
real_posy dd 0
vscroll_size dd 0
vscroll_pos dd 0
cur_pos dd 0
scrl_max dd 100
mouse_x dd 0
mouse_y dd 0
mousey dw 0
mousex dw 0
mouseb dd 0
num_goto_string dd 0
menu_is_on db 0
exit_wnd_on db 0
modified db 0
;fast save n open stack
rb 1024
so_stack:
;growing down
; the end!