kolibrios-fun/programs/other/tinypad2/trunk/tinypad2.asm
Evgeny Grechnikov (Diamond) 11c04adbbc docpak: added; now it uses new 70th function; use new tinypad/tinypad2
tinypad: new version from Kolibri 0.5.8.1 + corrections in IPC algo for new docpak
tinypad2: corrections in IPC for new docpak + full english translation
bcdclk, crownscr: small fixes to match to Kolibri 0.5.8.1 distro

git-svn-id: svn://kolibrios.org@122 a494cfbc-eb01-0410-851d-a64ba20cac60
2006-08-14 12:50:43 +00:00

4094 lines
74 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.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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 258 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!