; 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,'Сохранить документ?',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 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: ; перерисовка окна 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 if lang eq ru putlabel 270,386,'ИЗМЕНЕН',[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,'Поиск',50,[sc.work_button],[sc.work_button_text] drawlbut 375,130,50,15,'Отмена',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,'Строка не найдена!',cl_White else putlabel 195,120,'String not found!',cl_White end if 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 if lang eq ru 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 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,'Файл',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] 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,'Новое окно',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] 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,'Компил.',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] 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,'Найти',92,[sc.grab_button],[sc.grab_button_text] drawlbut 145,68,70,15,'Найти далее',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 'Ошибка открытия файла или открытие отменено!',0 saveerrtext db 'Ошибка сохранения файла или сохранение отменено!',0 newfileerror db 'Невозможно создать новый файл',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 ; я не знаю почему Вилл не поставил эту строчку 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 1024+16 db 0 real_posy dd 0 vscroll_size dd 0 vscroll_pos dd 0 cur_pos dd 0 scrl_max dd 100 mouse_x dd 0 mouse_y dd 0 mousey dw 0 mousex dw 0 mouseb dd 0 num_goto_string dd 0 menu_is_on db 0 exit_wnd_on db 0 modified db 0 ;fast save n open stack rb 1024 so_stack: ;growing down ; the end!