0,0 → 1,4001 |
; SYSTEM HAEDER: |
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 'lang.inc' |
include 'ascl.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 |
|
; 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 |
|
|
|
putlabel 190,120,'®åà ¨âì ¤®ªã¬¥â?',cl_White |
|
drawlbut 170,140,30,15,' ',49,[sc.work_button],cl_White |
drawlbut 230,140,30,15,'¥â',48,[sc.work_button],cl_White |
drawlbut 290,140,45,15,'⬥ ',47,[sc.work_button],cl_White |
|
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: |
; ¯¥à¥à¨á®¢ª ®ª |
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 -> àãá᪨© |
; 2 times àãá᪨© -> 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 ; ⥯¥àì 㪠§ë¢ ¥â ª®¥æ ä ©« |
|
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: |
; ®ç¨áâ¨âì ¢á¥ |
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: |
; ®ç¨áâ¨âì íªà |
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: |
; ᬥ¨âì à ᪫ ¤ªã ª« ¢¨ âãàë |
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 |
|
; ! |
; 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 |
putlabel 270,386,'
',[sc.work_button_text] |
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 |
|
|
drawlbut 375,110,50,15,'®¨áª',50,[sc.work_button],[sc.work_button_text] |
drawlbut 375,130,50,15,'⬥ ',94,[sc.work_button],[sc.work_button_text] |
|
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 |
|
|
putlabel 195,120,'âப ¥ ©¤¥ !',cl_White |
|
drawlbut 235,140,30,15,'ª',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 |
|
|
putlabel 190,120,'®åà ¨âì ¤®ªã¬¥â?',cl_White |
|
drawlbut 170,140,30,15,' ',46,[sc.work_button],cl_White |
drawlbut 230,140,30,15,'¥â',45,[sc.work_button],cl_White |
drawlbut 290,140,45,15,'⬥ ',47,[sc.work_button],cl_White |
|
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 |
|
drawlbut 5,22,70,15,' ©«',97,[sc.work_button],[sc.work_button_text] |
drawlbut 75,22,70,15,'®¤',98,[sc.work_button],[sc.work_button_text] |
drawlbut 145,22,70,15,'¥ªáâ',96,[sc.work_button],[sc.work_button_text] |
drawlbut 431,22,70,15,'¯à ¢ª ',99,[sc.work_button],[sc.work_button_text] |
|
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 |
|
drawlbut 5,38,70,15,'®¢®¥ ®ª®',100,[sc.grab_button],[sc.grab_button_text] |
drawlbut 5,53,70,15,'®¢ë©',101,[sc.grab_button],[sc.grab_button_text] |
drawlbut 5,68,70,15,'®åà ¨âì',2,[sc.grab_button],[sc.grab_button_text] |
drawlbut 5,83,70,15,'®åà. ª ª',102,[sc.grab_button],[sc.grab_button_text] |
drawlbut 5,98,70,15,'âªàëâì',103,[sc.grab_button],[sc.grab_button_text] |
drawlbut 5,113,70,15,'ë室',104,[sc.grab_button],[sc.grab_button_text] |
jmp still |
|
draw_win_menu_code: |
call clear_screen |
call drawwindow |
drawlbut 75,38,70,15,'®¬¯¨«.',10000,[sc.grab_button],[sc.grab_button_text] |
drawlbut 75,53,70,15,' ¯ãáâ¨âì',10001,[sc.grab_button],[sc.grab_button_text] |
drawlbut 75,68,70,15,'®áª ®â«.',10002,[sc.grab_button],[sc.grab_button_text] |
drawlbut 75,83,70,15,'SysFunc',10003,[sc.grab_button],[sc.grab_button_text] |
mov [menu_is_on],1 |
jmp still |
|
draw_win_menu_text: |
call clear_screen |
call drawwindow |
drawlbut 145,38,70,15,'GoTo Line#',95,[sc.grab_button],[sc.grab_button_text] |
drawlbut 145,53,70,15,' ©â¨',92,[sc.grab_button],[sc.grab_button_text] |
drawlbut 145,68,70,15,' ©â¨ ¤ «¥¥',50,[sc.grab_button],[sc.grab_button_text] |
mov [menu_is_on],1 |
jmp still |
|
new_pad_wnd: |
mov eax,19 |
mov ebx,tinypad_filename |
mov ecx,0 |
int 0x40 |
jmp still |
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
openerrtext db '訡ª ®âªàëâ¨ï ä ©« ¨«¨ ®âªàë⨥ ®â¬¥¥®!',0 |
saveerrtext db '訡ª á®åà ¥¨ï ä ©« ¨«¨ á®åà ¥¨¥ ®â¬¥¥®!',0 |
newfileerror db '¥¢®§¬®¦® á®å¤ âì ®¢ë© ä ©«',0 |
; ******************** |
; ****** 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 ; ï ¥ § î ¯®ç¥¬ã ¨«« ¥ ¯®áâ ¢¨« íâã áâà®çªã |
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 ' > ' |
db ' ' |
else |
db ' STRING > ' |
db ' SEARCH ' |
end if |
searchtl: |
|
|
htext2: |
if lang eq ru |
db ' 00:00000 00000 ' |
else |
db 'POSITION 00:00000 LENGTH 00000 LINES ' |
end if |
htextlen2: |
|
help_text: |
if lang eq ru |
db ' : ' |
db ' ' |
db ' CTRL+F1 : â® ®ª® ' |
db ' CTRL+S : ¥à¢ ï áâப ¤«ï ª®¯¨à®¢ ¨ï ' |
db ' CTRL+E : ®á«¥¤ïï áâப ¤«ï ª®¯¨à®¢ ¨ï ' |
db ' CTRL+P : áâ ¢¨âì ¢ë¡à ®¥ ⥪ãéãî ¯®§¨æ¨î ' |
db ' CTRL+D : ¤ «¨âì áâபã ' |
db ' CTRL+L : áâ ¢¨âì áâபã-à §¤¥«¨â¥«ì ' |
db ' CTRL+[ : ¥à¥©â¨ ¢ ç «® ä ©« ' |
db ' CTRL+] : ¥à¥©â¨ ¢ ª®¥æ ä ©« ' |
db ' CTRL+F2 : £à㧨âì ä ©« ' |
db ' CTRL+F3 : ®¨áª ' |
db ' CTRL+F4 : ®åà ¨âì ä ©« ' |
db ' CTRL+F5 : ®åà ¨âì ä ©« ª ª... ' |
db ' CTRL+F6 : ¢¥á⨠áâப㠤«ï ¯®¨áª ' |
db ' CTRL+F7 : "ª® ¡ëáâண® á®åà ¥¨ï ¨ § £à㧪¨" ' |
db ' CTRL+F8 : ¬¥¨âì à ᪫ ¤ªã ª« ¢¨ âãàë ' |
db ' CTRL+F9 : ®¬¯¨«¨à®¢ âì ä ©« ' |
db ' CTRL+F10 : ®¬¯¨«¨à®¢ âì ¨ § ¯ãáâ¨âì ' |
db ' F12 : ¯ãáâ¨âì ¤®áªã ®â« ¤ª¨ ' |
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 '',0 |
else |
db 'TINYPAD HELP',0 |
end if |
|
hlphead_len = $ - help_wnd_header |
|
save_yes_no: |
if lang eq ru |
db '®åà ¨âì ä ©« ¯¥à¥¤ ¢ë室®¬?',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 - ¯ à ¬¥âàë ¡ã¤ãâ ç¨ âìáï
! |
TINYPAD_END: ; end of file |
|
|
; Uninitialised data |
; ¥¨¨æ¨ «¨§¨à®¢ ë¥ ¤ ë¥ |
align 4 |
|
posx dd ? ; x íªà ¥ (on the screen) |
posy dd ? ; y íªà ¥ |
post dd ? ; ᬥ饨¥ ®â ç « - offset |
posl dd ? |
lines dd ? ; ª®«¨ç¥á⢮ áâப ¢ ¤®ªã¬¥â¥ |
posxm dd ? |
posym dd ? |
|
dstart dd ? ; ᬥ饨¥ ¯® ®á¨ y ¤«ï ®âà¨á®¢ª¨ ª®¯®ª ¨ ¤à. |
|
filelen dd ? ; ¤«¨ ä ©« |
|
PID dd ? ; ¨¤¥â¨ä¨ª â®à ¯à®æ¥áá |
proccount dd ? ; ª®«¨ç¥á⢮ ¯à®æ¥áᮢ |
|
filesize dd ? ; à §¬¥à ä ©« |
ya dd ? ; ¤«ï read_string |
slines dd ? ; number of strings on the screen - ª®«¨ç¥á⢮ áâப íªà ¥ |
|
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 - § £®«®¢®ª ®ª |
rb 256 |
|
; ¨ä®à¬ æ¨ï ® ¯à®æ¥áᥠ§ ¯¨áë¢ ¥âáï ¢ íâã áâàãªâãàã |
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! |
|
|
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |