Subversion Repositories Kolibri OS

Rev

Rev 111 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; SYSTEM HEADER:
  2.    use32
  3.    org 0x0
  4.    db  'MENUET01'  ; identifier
  5.    dd  0x01        ; version
  6.    dd  START       ; pointer to start
  7.    dd  TINYPAD_END ; size of file
  8.    dd  0x300f00 ;0x500000; 0x3fff00;0x300000    ; size of memory
  9.    dd  0xeff0 ;0x4fffff ;0x3ff000;0xeff0      ; esp
  10.    dd  I_PARAM     ; parameters
  11.    dd  0           ; reserved
  12. include 'ascl.inc'
  13. include 'lang.inc'
  14. include 'macros.inc' ; useful stuff
  15. include 'dialogs1.inc'
  16. include 'scroll.inc'
  17. include 'debug.inc'
  18. purge mov            ;  SPEED
  19. ;******************************************************************************
  20. ; INITIALIZING
  21. START:
  22. ;debug_print_hex TINYPAD_END
  23. call mask_events
  24.  
  25.     cmp    [I_PARAM],byte 0
  26.     jz     noparams
  27.  
  28. ;//Willow
  29.     cmp    byte[I_PARAM],'*'
  30.     jne    .noipc
  31. ; convert size from decimal representation to dword
  32.         mov     esi, I_PARAM+1
  33.         xor     edx, edx
  34.         xor     eax, eax
  35. @@:
  36.         lodsb
  37.         test    al, al
  38.         jz      @f
  39.         lea     edx, [edx*4+edx]
  40.         lea     edx, [edx*2+eax]
  41.         jmp     @b
  42. @@:
  43.     add    edx,20
  44.     mcall  60,1,0x10000-16
  45.     mov    dword[0x10000+-16+4],8
  46.     mcall  40,1000000b
  47.     mcall  23,200
  48. ;    dpd    eax
  49.     cmp    eax,7
  50.     jne    exit_now
  51.     mov    esi,0x10000-16
  52.     mov    byte[esi],1
  53.     call   mask_events
  54.     mov    eax,[esi+12]
  55.     inc    eax
  56.     call   file_found
  57.     jmp    do_load_file.restorecursor
  58.   .noipc:
  59. ;//Willow
  60.     ; parameters are at I_PARAM
  61.     mov    esi,I_PARAM
  62.     mov    edi,filename
  63.     mov    ecx,50
  64.     cld
  65.     rep    movsb
  66.  
  67.     mov    edi,filename
  68.     mov    ecx,50
  69.     xor    eax,eax
  70.     repne  scasb
  71.     sub    edi,filename
  72.     dec    edi
  73.     mov    [filename_len],edi
  74.     jmp    do_load_file
  75.   noparams:
  76.     jmp newfile
  77. ;******************************************************************************
  78. ; MAIN LOOP
  79. still:
  80.     call writepos ; write current position & number of strings
  81.     call mouse_info
  82.  
  83.     mov  eax,10   ; wait here until event
  84.     int  0x40
  85.  
  86.     cmp eax,1
  87.     je red
  88.     cmp eax,2
  89.     je key
  90.     cmp eax,3
  91.     je button
  92.     cmp eax,6
  93.     je mouse
  94.     jmp  still
  95. ;******************************************************************************
  96. ; *********************************
  97. ; *          MOUSE                *
  98. ; *********************************
  99. mouse:
  100. mov eax,37    ;mouse click
  101. mov ebx,2
  102. int 0x40
  103. cmp eax,0
  104. je .leave_now
  105. ;if exit window is on
  106. cmp [exit_wnd_on],1
  107. jne @f
  108. mov [exit_wnd_on],0
  109. jmp red
  110. ;else
  111. @@:
  112. cmp eax,1     ;mouse 1
  113. jne .leave_now
  114.  
  115. mov eax,37    ;mouse position
  116. mov ebx,1
  117. int 0x40
  118.  
  119. mov word[mouse_y],ax
  120. shr eax,16
  121. mov word[mouse_x],ax
  122.  
  123.  
  124. cmp [mouse_x],7
  125. jb .leave_now ;.leave_now       ;if <
  126. cmp [mouse_x],485;487
  127. ja .leave_now ;.leave_now       ;if >
  128.  
  129. cmp [mouse_y],45
  130. jb .leave_now ;.leave_now ;if <
  131. cmp [mouse_y],342 ;345
  132. ja .leave_now ;.leave_now       ;if >
  133.  
  134. call main_cursor_move
  135.  
  136. .leave_now:
  137. jmp still
  138.  
  139. ; *********************************
  140. ; *         BUTTON HANDLER        *
  141. ; *********************************
  142.  
  143.   button:
  144.  
  145.     mov  eax,17
  146.     int  0x40
  147. ;;;;;;;;;;;;;;;exit dialog box check;;;;;;;;;;;;;
  148. cmp ah,49
  149. je save_and_exit
  150. cmp ah,48
  151. je exit_now
  152. cmp ah,47
  153. mov [exit_wnd_on],0
  154. je red
  155. cmp ah,46
  156. jne @f
  157.  
  158.   call save_file
  159.   jmp newfile
  160. @@:
  161. cmp ah,45
  162. je newfile
  163. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  164. ;;;;;;;;;;;;;;;;MENU CHECK;;;;;;;;;;;;;;;;;;;;;;;
  165. cmp ah,15
  166. jne no_d_w
  167. call draw_window_for_dialogs
  168. jmp still
  169. no_d_w:
  170. cmp ah,97
  171. je draw_win_menu_file
  172. cmp ah,98
  173. je draw_win_menu_code
  174. cmp ah,96
  175. je draw_win_menu_text
  176. cmp ah,95
  177. je goto_string
  178. cmp ah,92
  179. je search_window
  180. cmp ah,94
  181. je red
  182. cmp ah,99
  183.   je help_wnd
  184. cmp ah,100
  185.   je new_pad_wnd
  186. cmp ah,101
  187.   je doyouwannasave
  188. cmp ah,102
  189.   jne nosavenow
  190.    for_key_save:
  191.    savedialog draw_window_for_dialogs,copy_fpath_s,saveerror,mypath
  192. nosavenow:
  193. cmp ah,103
  194.   jne noopennow
  195.    for_key_open:
  196.    opendialog draw_window_for_dialogs,copy_fpath,openerror,mypath
  197. noopennow:
  198. cmp ah,104
  199. je exit
  200. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  201.     shr  eax,8
  202.  
  203.     cmp  al,50
  204.     jne  no_search
  205.  
  206. ; SEARCH {
  207.   search:
  208.  
  209.     cmp [lines],1  ;something like bug fix
  210.     je red ;still
  211.  
  212.     xor  esi,esi
  213.     mov  edi,[post]
  214.     add  edi,80
  215.     imul ecx,[lines],80
  216.     sub  ecx,edi         ; ecx (loop counter) = lines*80-(post+80)
  217.   news:
  218.     push edi
  219.   news2:
  220.  
  221.      ; 1) LOAD BYTES
  222.      mov  al,[esi+search_string]
  223.      mov  bl,[edi+0x80000]
  224.  
  225.      ; 2) COMPARE BYTES
  226.      cmp  al,bl
  227.      je   yes_char
  228.  
  229.      ; 3) LETTER?
  230.      cmp  al,'A'
  231.      jb   notequal
  232.      cmp  al,'z'
  233.      ja   notequal
  234.  
  235.      ; 4) A->a OR a->A
  236.      cmp  al,'a'
  237.      jb   @f
  238.      add  al,-32
  239.      jmp  compare_bytes
  240.     @@:
  241.      cmp  al,'Z'
  242.      ja   notequal
  243.      add  al,32
  244.  
  245.     compare_bytes:
  246.      cmp  al,bl
  247.      jne  notequal
  248.  
  249.   yes_char:
  250.     inc  edi
  251.     inc  esi
  252.     cmp  esi,[search_len]
  253.     jge  sfound
  254.     jmp  news2
  255.  
  256.   notequal:
  257.     pop  edi
  258.     xor  esi,esi
  259.     inc  edi
  260.     loop news
  261.     call string_not_found
  262.     jmp  still
  263.  
  264.   sfound:
  265.     mov  eax,edi
  266.     cdq                   ; edx = 0;
  267.     mov  ebx,80
  268.     div  ebx
  269. ;;;;;   imul eax,80
  270. ;    lea  eax,[eax+eax*4]  ; eax *= 5;
  271. ;    shl  eax,4           ; eax *= 16;
  272.  
  273. ;    mov  [post],eax
  274.     mov  [posy],0
  275. ;---------------
  276. ;    mov ebx,80
  277. ;    div ebx
  278.     call goto_pos
  279.     call draw_vertical_scroll
  280.     jmp  still
  281. ; SEARCH }
  282.  
  283.   no_search:
  284.  
  285. ; TOOLBAR {
  286.    cmp     eax,10000
  287.    jb      no_toolbar
  288.  
  289.    add     eax,-10000
  290.    jne     @f
  291. lbl_compile_file:
  292.    mov     [run_outfile],0
  293.    call    start_fasm
  294.    jmp     still
  295.  @@:
  296.    dec     eax
  297.    jnz     @f
  298. lbl_run_outfile:
  299.    mov     [run_outfile],1
  300.    call    start_fasm
  301.    jmp     still
  302.  @@:
  303.    dec     eax
  304.    jnz     @f
  305.    call    open_debug_board
  306.    jmp     still
  307.  @@:
  308.    dec     eax
  309.    jnz     still
  310.    call    open_sysfuncs_txt
  311.    jmp     still
  312. ; TOOLBAR }
  313.  
  314.   no_toolbar:
  315.  
  316.     cmp  al,4
  317.     jne  noid4
  318.  
  319. ; LOAD_FILE {
  320.   do_load_file:
  321.     mov [modified],0
  322.  
  323.   call empty_work_space
  324.  
  325.  
  326.   cmp  [filename],'/'
  327.     jne  @f
  328.  
  329.     call loadhdfile
  330.     jmp  .restorecursor
  331.   @@:
  332.    call loadfile1
  333.   .restorecursor:
  334.     mov  edi,0x78000
  335.     mov  ecx,80*80/4
  336.     mov  eax,0x01010101
  337.     cld
  338.     rep  stosd
  339.     xor  eax,eax
  340.     mov  [post],eax
  341.     mov  [posx],eax
  342.     mov  [posy],eax
  343.  
  344. ; enable color syntax for ASM and INC files:
  345.     mov  [asm_mode], 0
  346.  
  347.     mov  eax, [filename_len]
  348.     add  eax, filename
  349.     cmp  word [eax-3],'AS'
  350.     jne  @f
  351.     cmp  byte [eax-1],'M'
  352.     jne  @f
  353.     mov  [asm_mode], 1
  354.     jmp  .nocol
  355.   @@:
  356.     cmp  word [eax-3],'IN'
  357.     jne  @f
  358.     cmp  byte [eax-1],'C'
  359.     jne  @f
  360.     mov  [asm_mode], 1
  361.   @@:
  362.   .nocol:
  363.  
  364. ; if the header is the same as the previous,
  365. ; just redraw the text area
  366. ; else redraw the window
  367.  
  368. ;------pos00=filename_len
  369.     mov eax,[filename_len]
  370.     mov [pos00],eax
  371. ;-------------------------
  372.     mov  ecx, [filename_len]
  373.     add  ecx, 10             ; strlen(" - TINYPAD");
  374.     cmp  ecx, [headlen]
  375.     jne  @f
  376.     add  ecx, -10
  377.     mov  esi, filename       ; strcmp(filename,header);
  378.     mov  edi, header
  379.     rep  cmpsb
  380.     jne  @f
  381.     call drawfile
  382.     call draw_window_for_dialogs ;redraw, because it's needed
  383.     cmp [to_return],0
  384.     je still
  385.     ret
  386.     ;jmp  still
  387.   @@:
  388. call set_title
  389. cmp [to_return],0
  390. je still
  391. ret
  392. ;    jmp  still
  393. ; LOAD_FILE }
  394.  
  395.   noid4:
  396.  
  397.     cmp  al, 2
  398.     jz   yessave
  399.  
  400.     dec  al       ; close if butid == 0
  401.     jnz  nosave
  402. ; EXIT:
  403. exit:
  404. cmp [modified],0
  405. je exit_now
  406.  
  407.       mov  eax,55           ; beep
  408.       mov  ebx,eax
  409.       mov  esi,save_beep1
  410.       int  0x40
  411.       delay 4
  412.       mov  eax,55           ; beep
  413.       mov  ebx,eax
  414.       mov  esi,save_beep2
  415.       int  0x40
  416.  
  417.  ;---------"EXIT" dialog box
  418.  
  419.  mov eax,13
  420.  mov ebx,150*65536+200
  421.  mov ecx,100*65536+70
  422.  mov edx,[sc.work_graph] ;0x00dd9438 ;0x00ff7512
  423.  int 0x40
  424.  
  425.  
  426. mov eax,38
  427. mov ebx,150*65536+350
  428. mov ecx,100*65536+100
  429. mov edx,cl_White
  430. int 0x40
  431. mov eax,38
  432. mov ebx,150*65536+350
  433. mov ecx,170*65536+170
  434. mov edx,cl_White
  435. int 0x40
  436. mov eax,38
  437. mov ebx,150*65536+150
  438. mov ecx,100*65536+170
  439. mov edx,cl_White
  440. int 0x40
  441. mov eax,38
  442. mov ebx,350*65536+350
  443. mov ecx,100*65536+170
  444. mov edx,cl_White
  445. int 0x40
  446.  
  447.  
  448. if lang eq ru
  449.  putlabel 190,120,'Сохранить документ?',cl_White
  450.  
  451.  drawlbut 170,140,30,15,'Да',49,[sc.work_button],cl_White
  452.  drawlbut 230,140,30,15,'Нет',48,[sc.work_button],cl_White
  453.  drawlbut 290,140,45,15,'Отмена',47,[sc.work_button],cl_White
  454. else
  455.  putlabel 190,120,'Save the document?',cl_White
  456.  
  457.  drawlbut 170,140,30,15,'Yes',49,[sc.work_button],cl_White
  458.  drawlbut 230,140,30,15,'No',48,[sc.work_button],cl_White
  459.  drawlbut 290,140,45,15,'Cancel',47,[sc.work_button],cl_White
  460. end if
  461.  
  462.  mov [exit_wnd_on],1
  463. ;----------------
  464.  
  465. jmp still
  466.  
  467.     exit_now:
  468.     mov  [MainWndClosed], 1
  469.     or   eax, -1
  470.     int  0x40
  471.  
  472.     save_and_exit:
  473.     call save_file
  474.     jmp exit_now
  475. ;    mov  [MainWndClosed], 1
  476. ;    or   eax, -1
  477. ;    int  0x40
  478.  
  479. ; SAVE_FILE {
  480.   yessave:
  481.   call clear_screen
  482.   call drawwindow
  483.     call save_file
  484. ;  call clear_screen
  485. ;  call drawwindow
  486.     mov [modified],0
  487.  
  488.     jmp  still
  489. ; SAVE_FILE }
  490.  
  491.   nosave:
  492.  
  493.     inc  al
  494.     call read_string
  495.  
  496.     jmp  still
  497.  
  498. ;**********************************
  499. ;*         REDRAW HANDLER         *
  500. ;**********************************
  501.  
  502. red:
  503. ; перерисовка окна
  504.    call   clear_screen
  505.    call   drawwindow
  506.    jmp    still
  507.  
  508.  
  509.  
  510. ;**********************************
  511. ;*          KEY HANDLER           *
  512. ;**********************************
  513.  
  514.   key:
  515.     mov  eax, 2   ; GET KEY
  516.     int  0x40
  517.  
  518.   cmp [exit_wnd_on],1 ;exit window is ON?
  519.   jne no_exit_wnd     ; no - goto other checks
  520.  
  521. ;  cmp eax,13          ;enter - save n exit
  522. ;  je save_and_exit
  523.  
  524. ;  cmp eax,173         ;ctrl+enter - exit
  525. ;  je exit_now
  526.   mov [exit_wnd_on],0 ;other keys - cancel
  527. ;  call draw_window_for_dialogs
  528.  
  529.   jmp red ;redraw and still
  530.  
  531.  
  532.   no_exit_wnd:
  533.     shr  eax, 8
  534.  
  535. ; HELP_TEXT {
  536.     cmp  al, 210  ; Ctrl + F1
  537.     jne  no_help_text
  538. help_wnd:
  539. call clear_screen
  540. call drawwindow
  541.     mov  eax, 51
  542.     mov  ebx, 1
  543.     mov  ecx, help_thread_start
  544.     mov  edx, 0xfff0
  545.     int  0x40
  546.     jmp  still
  547.  
  548. help_thread_start:
  549.     call draw_help_wnd
  550.  
  551.   still_hw:
  552.     cmp  [MainWndClosed], 1
  553.     je   exit_hw
  554.     mov  eax, 10
  555.     int  0x40
  556.     cmp  eax, 1
  557.     je   red_hw
  558.     cmp  eax, 2
  559.     je   key_hw
  560.     cmp  eax, 3
  561.     je   button_hw
  562.     jmp  still_hw
  563.  
  564.   red_hw:
  565.     call draw_help_wnd
  566.     jmp  still_hw
  567.  
  568.   key_hw:
  569. ;   mov  eax, 2
  570.     int  0x40
  571.     cmp  ah, 27
  572.     jne  still_hw
  573.  
  574.   button_hw:
  575.     mov  eax, 17
  576.     int  0x40
  577.   exit_hw:
  578.     or   eax, -1
  579.     int  0x40
  580.  
  581. ; draw help window
  582.  draw_help_wnd:
  583.     mov  eax, 12
  584.     mov  ebx, 1
  585.     int  0x40
  586.  
  587.     xor  eax, eax
  588.     mov  ebx, 200 shl 16 + 320
  589.     mov  ecx, 200 shl 16 + 260
  590.     mov  edx, 0x03e0e0e0   ; work
  591.     mov  esi, [sc.grab]
  592.     or   esi, 0x80000000   ; grab
  593.     mov  edi, [sc.frame]   ; frame
  594.     int  0x40
  595.  
  596.     mov  eax, 4
  597.     mov  ebx, 8 shl 16 + 8
  598.     mov  ecx, 0xffffff
  599.     mov  edx, help_wnd_header
  600.     mov  esi, hlphead_len
  601.     int  0x40
  602.  
  603.     mov  eax, 4
  604.     mov  ebx, 8 shl 16 + 34
  605.     xor  ecx, ecx
  606.     mov  esi, 51
  607.     mov  edx, help_text
  608.   .new_help_line:
  609.     int  0x40
  610.     add  ebx, 10
  611.     add  edx, esi
  612.     cmp  [edx], byte 'x'
  613.     jne  .new_help_line
  614.  
  615.     mov  eax, 12
  616.     mov  ebx, 2
  617.     int  0x40
  618.     ret
  619. ; HELP_TEXT }
  620.  
  621.   no_help_text:
  622. ; LOAD_FILE {
  623.     cmp  al, 211       ; Ctrl + F2
  624.     je   for_key_open ;do_load_file
  625. ; LOAD_FILE }
  626.  
  627. ; SEARCH {
  628.     cmp  al, 212       ; Ctrl + F3
  629.     je   search
  630. ; SEARCH }
  631.  
  632. ; SAVE_FILE {
  633.     cmp  al, 213       ; Ctrl + F4
  634.     je   yessave
  635. ; SAVE_FILE }
  636.  
  637. ; ENTER_FILENAME {
  638.     cmp  al, 214       ; Ctrl + F5
  639.     jne  @f
  640. jmp for_key_save
  641.   @@:
  642. ; ENTER_FILENAME }
  643.  
  644. ; ENTER_SEARCH {
  645.     cmp  al, 215       ; Ctrl + F6
  646.     jne  @f
  647. ;    mov  al, 51
  648. ;    call read_string
  649. ;    jmp  still
  650.     jmp search_window
  651.   @@:
  652. ; ENTER_SEARCH }
  653.  
  654. ; CHANGE_LAYOUT {
  655.     cmp  al, 217       ; Ctrl + F8
  656.     jne  @f
  657.     call layout
  658.     jmp  still
  659.   @@:
  660. ; CHANGE_LAYOUT }
  661.  
  662. ; COMPILE_FILE {
  663.     cmp al, 208
  664.     je lbl_compile_file
  665. ; COMPILE_FILE }
  666.  
  667. ; RUN_OUTFILE {
  668.    cmp al, 209
  669.    je lbl_run_outfile
  670.  
  671. ; RUN_OUTFILE }
  672.  
  673. ;run debug board {      -----
  674.    cmp al,255
  675.    jne @f
  676.    call open_debug_board
  677.    call activate_me
  678.    jmp still
  679. ;}
  680.    @@:
  681. ;open sysfuncR {        -----
  682. ;   cmp al,228
  683. ;   jne @f
  684. ;   call open_sysfuncs_txt
  685. ;   jmp still
  686. ;   @@:
  687.  
  688. ;fast_save_and_open {
  689.    cmp al,216
  690.    jne @f
  691.    call make_fast_so
  692.    jmp still
  693. ;}
  694.    @@:
  695. ; 3 times english -> русский
  696. ; 2 times русский -> english
  697.  
  698. ; COPY START {
  699.     cmp  al, 19
  700.     jne  no_copy_start
  701.     mov  eax, [post]
  702.     imul ebx, [posy], 80
  703.     add  eax, ebx
  704.     mov  [copy_start], eax
  705.     jmp  still
  706. ; COPY START }
  707.  
  708.   no_copy_start:
  709. ; COPY END {
  710.     cmp  al, 5
  711.     jne  no_copy_end
  712.     cmp  [copy_start], 0
  713.     je   still
  714.     mov  ecx, [post]
  715.     imul ebx, [posy], 80
  716.     add  ecx, ebx
  717.     add  ecx, 80
  718.     cmp  ecx, [copy_count]
  719.     jb   still
  720.     sub  ecx, [copy_start]
  721.     mov  [copy_count], ecx
  722.     mov  esi, [copy_start]
  723.     add  esi, 0x80000
  724.     mov  edi, 0x2f0000
  725.     cld
  726.     rep  movsb
  727.     jmp  still
  728. ; COPY END }
  729.  
  730.   no_copy_end:
  731.  
  732. ; PASTE {
  733.     cmp  al, 16
  734.     jne  no_copy_paste
  735.     cmp  [copy_count], 0
  736.     je   still
  737.     mov  eax,[copy_count]
  738.     cdq
  739.     mov  ebx, 80
  740.     div  ebx
  741.     add  [lines], eax
  742.     mov  ecx, 0x2e0000
  743.     mov  eax, [post]
  744.     imul ebx, [posy], 80
  745.     add  eax, ebx
  746.     add  eax, 0x80000
  747.     sub  ecx, eax
  748.     mov  esi, 0x2e0000
  749.     sub  esi, [copy_count]
  750.     mov  edi, 0x2e0000
  751.     std
  752.     rep  movsb
  753.     mov  esi, 0x2f0000
  754.     mov  edi, [post]
  755.     imul eax, [posy], 80
  756.     add  edi, eax
  757.     add  edi, 0x80000
  758.     mov  ecx, [copy_count]
  759.     cld
  760.     rep  movsb
  761.  
  762.     call clear_screen
  763.     call drawfile
  764. call draw_vertical_scroll
  765.     mov [modified],1
  766.  
  767.     jmp  still
  768. ; PASTE }
  769.  
  770.  
  771.   no_copy_paste:
  772.  
  773.  
  774. ; INSERT_SEPARATOR {
  775.     cmp  al,0xc       ; Ctrl+L
  776.     jne  no_insert_separator
  777.  
  778.     imul eax,[posy],80
  779.     add  eax,[post]
  780.     add  eax,0x80000
  781.     mov  ebx,eax
  782.  
  783.     imul eax,[lines],80
  784.     add  eax,0x80000     ; теперь указывает на конец файла
  785.  
  786.     mov  ecx,eax ; size
  787.     sub  ecx,ebx
  788.     inc  ecx
  789.  
  790.     mov  esi,eax ; from
  791.     mov  edi,eax
  792.     add  edi,80  ; to
  793.  
  794.     std
  795.     rep  movsb
  796.  
  797.     mov  ecx,80/4
  798.     mov  esi,comment_string
  799.     mov  edi,ebx
  800.     cld
  801.     rep  movsd
  802.  
  803.     inc  [lines]
  804.  
  805.     call clear_screen
  806.     call drawfile
  807. ;call calc_scroll_size_and_pos
  808. call draw_vertical_scroll
  809.     mov [modified],1
  810.  
  811.     jmp  still
  812. ; INSERT_SEPARATOR }
  813.  
  814.  
  815.   no_insert_separator:
  816.  
  817.  
  818. ; DEL_LINE {
  819.     cmp  al,4
  820.     jne  no_delete_line
  821.     mov  eax,[post]
  822.     cdq
  823.     mov  ebx,80
  824.     div  ebx
  825.     add  eax,[posy]
  826.     inc  eax
  827.     cmp  eax,[lines]
  828.     jge  still
  829.     dec  dword [lines]
  830.     imul edi,[posy],80
  831.     add  edi,[post]
  832.     add  edi,0x80000
  833.     mov  esi,edi
  834.     add  esi,80
  835.     mov  ecx,0x2e0000
  836.     sub  ecx,esi
  837.     shr  ecx,4
  838.     cld
  839.     rep  movsd
  840.     call clear_screen
  841.     call drawfile
  842. ;call calc_scroll_size_and_pos
  843. call draw_vertical_scroll
  844.     mov [modified],1
  845.  
  846.     jmp  still
  847. ; DEL_LINE }
  848.  
  849.   no_delete_line:
  850.  
  851. ; ENTER {
  852.     cmp  al,13
  853.     jnz  noenter
  854.  
  855.     ; lines down
  856.     mov  eax,[posy]
  857.     inc  eax
  858. ;   imul eax,80
  859.     lea  eax,[eax+eax*4]  ; eax *= 5
  860.     shl  eax,4            ; eax *= 16
  861.     add  eax,0x80000
  862.     add  eax,[post]
  863.     mov  ebx,eax
  864.  
  865.     ; ebx = ([posy]+1)*80 + 0x80000 + [post]
  866.     ; ebx -> first byte of next string
  867.  
  868.     imul eax,[lines],80
  869.     add  eax,0x80000
  870.     mov  ecx,eax
  871.  
  872.     ; ecx = [lines]*80 + 0x80000
  873.     ; ecx -> end of the document
  874.  
  875.     cmp  ebx,ecx
  876.     jz   .bug_fixed
  877.  
  878.    @@:
  879.     dec  ecx
  880.     mov  dl,[ecx]
  881.     mov  [ecx+80],dl
  882.  
  883.     cmp  ecx,ebx
  884.     jnz  @b
  885.  
  886.    .bug_fixed:
  887.  
  888.     ; save for later
  889.     imul eax,[posy],80
  890.     add  eax,0x80000
  891.     add  eax,[post]
  892.     mov  ebx,eax
  893.     add  eax,[posx]
  894.     ; eax = 0x80000 + [post] + [posy]*80 + [posx]
  895.  
  896.     push eax
  897.  
  898.     dec  ebx
  899.     xor  ecx,ecx
  900.   @@:
  901.     cmp  ecx,80
  902.     je   @f
  903.     inc  ecx
  904.     inc  ebx
  905.     cmp  byte [ebx],' '
  906.     je   @b
  907.   @@:
  908.     dec  ecx
  909.  
  910.     cmp  ecx,80-1
  911.     jne  @f
  912. ;   mov  [posx],0
  913.     jmp  .lbl
  914.   @@:
  915.  
  916.     cmp  [posx],ecx
  917.     jbe  @f
  918.     mov  [posx],ecx
  919.     jmp  .lbl
  920.   @@:
  921.     mov  [posx],0
  922.  
  923.   .lbl:
  924.     inc  [posy]
  925.  
  926.     ;clear line
  927.     imul eax,[posy],80
  928.     add  eax,0x80000
  929.     add  eax,[post]
  930.  
  931.     mov  edi,eax
  932.     mov  eax,'    '
  933.     mov  ecx,80/4
  934.     cld
  935.     rep  stosd
  936.  
  937.  
  938.     ; end of line to next line beginning
  939.     imul eax,[posy],80
  940.     add  eax,0x80000
  941.     add  eax,[post]
  942. ;   add  eax,[posx]
  943.     mov  ebx,eax
  944.     ; ebx -> beginning of this line
  945.  
  946.     pop  esi
  947.     mov  edi,eax
  948.  
  949.    @@:
  950.     mov  al,[esi]
  951.     mov  [ebx],al
  952.     mov  [esi],byte ' '
  953.  
  954.     inc  esi
  955.     inc  ebx
  956.  
  957.     cmp  esi,edi
  958.     jb   @b
  959.  
  960.     inc  [lines]
  961.  
  962.     mov  ecx,[posy]
  963.     cmp  ecx,[slines]
  964.     jne  @f
  965.  
  966.     dec  [posy]
  967.     add  [post],80
  968.  
  969.    @@:
  970.     call clear_screen
  971.     call drawfile
  972. ;call calc_scroll_size_and_pos
  973.  
  974.     call draw_vertical_scroll
  975.     mov [modified],1
  976.  
  977.     jmp  still
  978. ; ENTER }
  979.  
  980.  
  981.   noenter:
  982.  
  983.  
  984. ; UP {
  985.     cmp  al,130+48
  986.     jnz  noup
  987.     mov  ecx,[posy]
  988.     test ecx,ecx
  989.     jnz  .up1
  990.     mov  ecx,[post]
  991.     test ecx,ecx
  992.     jz   still
  993.     add  ecx,-80
  994.     mov  [post],ecx
  995.     call clear_screen
  996.     jmp  .finish
  997.   .up1:
  998.     dec  ecx
  999.     mov  [posy],ecx
  1000.   .finish:
  1001.     call drawfile
  1002.     call draw_vertical_scroll
  1003. ;call calc_scroll_size_and_pos
  1004.  
  1005.     jmp  still
  1006. ; UP }
  1007.  
  1008.   noup:
  1009.  
  1010. ; DOWN {
  1011.     cmp  al,129+48
  1012.     jnz  nodown
  1013.  
  1014.     mov  ecx,[posy]
  1015.     mov  eax,[slines]
  1016.     dec  eax
  1017.     cmp  ecx,eax
  1018.     jb   .do1         ; goto do1 if [posy] < [slines]-1
  1019.  
  1020.     mov  eax,[lines]
  1021.     sub  eax,[slines]
  1022.     dec  eax
  1023.     jb   still        ; goto still if [lines] < [slines]-1
  1024. ;   imul eax,80
  1025.     lea  eax,[eax+eax*4]
  1026.     shl  eax,4
  1027.     cmp  [post],eax
  1028.     jg   still        ; goto still if [post] > ([lines]-[slines]-1)*80
  1029.  
  1030.     add  [post],80
  1031.     call clear_screen
  1032.     call drawfile
  1033.     call draw_vertical_scroll
  1034. ;call calc_scroll_size_and_pos
  1035.  
  1036.     jmp  still
  1037.  
  1038.   .do1:
  1039.     pusha
  1040.     mov  eax,[post]
  1041.     cdq
  1042.     mov  ebx,80
  1043.     div  ebx
  1044.     add  eax,[posy]
  1045.     inc  eax
  1046.     cmp  eax,[lines]
  1047.     jb   .do10
  1048.     popa
  1049.     jmp  still
  1050.  
  1051.   .do10:
  1052.     popa
  1053.     inc  ecx
  1054.     mov  [posy],ecx
  1055.     call drawfile
  1056.     call draw_vertical_scroll
  1057. ;call calc_scroll_size_and_pos
  1058.  
  1059.     jmp  still
  1060. ; DOWN }
  1061.  
  1062.  
  1063.   nodown:
  1064.  
  1065.  
  1066. ; LEFT {
  1067.     cmp  al,128+48
  1068.     jnz  noleft
  1069.     cmp  [posx],0
  1070.     je   still
  1071.     dec  [posx]
  1072.     call drawfile
  1073.     jmp  still
  1074. ; LEFT }
  1075.  
  1076.  
  1077.   noleft:
  1078.  
  1079.  
  1080. ; RIGHT {
  1081.     cmp  al,131+48
  1082.     jnz  noright
  1083.     cmp  [posx],79
  1084.     je   still
  1085.     inc  [posx]
  1086.     call drawfile
  1087.     jmp  still
  1088. ; RIGHT }
  1089.  
  1090.  
  1091.   noright:
  1092.  
  1093.  
  1094. ; PAGE_UP {
  1095.   page_up:
  1096.     cmp  al,136+48
  1097.     jnz  nopu
  1098. scrl_up:
  1099.     mov  eax,[slines]
  1100.     dec  eax
  1101. ;   imul eax,80
  1102.     lea  eax,[eax+eax*4]
  1103.     shl  eax,4
  1104.     mov  ecx,[post]
  1105.     cmp  eax,ecx
  1106.     jbe  pu1
  1107.     mov  ecx,eax
  1108.    pu1:
  1109.     sub  ecx,eax
  1110.     mov  [post],ecx
  1111.  
  1112.     call clear_screen
  1113.     call drawfile
  1114.     call draw_vertical_scroll
  1115. ;call calc_scroll_size_and_pos
  1116.     jmp  still
  1117. ; PAGE_UP }
  1118.  
  1119.  
  1120.   nopu:
  1121.  
  1122.  
  1123. ; PAGE_DOWN {
  1124.   page_down:
  1125.     cmp  al,135+48
  1126.     jnz  nopd
  1127. scrl_down:
  1128.     mov  eax,[lines]
  1129.     cmp  eax,[slines]
  1130.     jb   still
  1131.  
  1132.     mov  eax,[post]   ; eax = offset
  1133.     cdq
  1134.     mov  ebx,80
  1135.     div  ebx          ; eax /= 80
  1136.     mov  ecx,[lines]  ; ecx = lines in the file
  1137.     cmp  eax,ecx      ; if eax < ecx goto pfok
  1138.     jnb  still
  1139.     mov  eax,[slines] ; eax = lines on the screen
  1140.     dec  eax          ; eax--
  1141. ;   imul eax,80       ; eax *= 80
  1142.     lea  eax,[eax+eax*4]
  1143.     shl  eax,4
  1144.     add  [post],eax   ; offset += eax
  1145.  
  1146.     mov  eax,[lines]  ; eax =  lines in the file
  1147.     sub  eax,[slines] ; eax -= lines on the screen
  1148. ;   imul eax,80       ; eax *= 80
  1149.     lea  eax,[eax+eax*4]
  1150.     shl  eax,4
  1151.     cmp  [post],eax
  1152.     jb   @f
  1153.     mov  [post],eax
  1154.   @@:
  1155.  
  1156.     call clear_screen
  1157.     call drawfile
  1158.     call draw_vertical_scroll
  1159. ;call calc_scroll_size_and_pos
  1160.  
  1161.     jmp  still
  1162. ; PAGE_DOWN }
  1163.  
  1164.   nopd:
  1165.  
  1166. ; HOME {
  1167.     cmp  al,132+48
  1168.     jnz  nohome
  1169.  
  1170.     push 0
  1171.     pop  [posx]
  1172.  
  1173.     call drawfile
  1174.     jmp  still
  1175. ; HOME }
  1176.  
  1177.  
  1178.   nohome:
  1179.  
  1180.  
  1181. ; END {
  1182.   end_key:
  1183.     cmp    al,133+48
  1184.     jnz    noend
  1185.  
  1186.     imul   eax,[posy],80
  1187.     add    eax,0x80000
  1188.     add    eax,[post]
  1189.  
  1190.     mov    esi,eax
  1191.     add    eax,80+1
  1192.  
  1193. @@: dec    eax
  1194.     cmp    eax,esi
  1195.     je     @f
  1196.     cmp    byte [eax-1],' '
  1197.     jbe    @b
  1198. @@:
  1199.     sub    eax,esi
  1200.     cmp    eax,80-1
  1201.     jbe    @f
  1202.     dec    eax
  1203. @@:
  1204.     mov    [posx],eax
  1205.  
  1206.     call drawfile
  1207.     jmp  still
  1208. ; END }
  1209.  
  1210.  
  1211.   noend:
  1212.  
  1213.  
  1214. ; GO_START {
  1215.     cmp  al,251         ; Ctrl + [
  1216.     jnz  no_go_to_start
  1217.  
  1218.     push 0
  1219.     pop  [post]         ; offset = 0
  1220.  
  1221.     call clear_screen
  1222.     call drawfile       ; draw file
  1223.     call draw_vertical_scroll
  1224. ;call calc_scroll_size_and_pos
  1225.     jmp  still          ; go to still
  1226. ; GO_START }
  1227.  
  1228.  
  1229.   no_go_to_start:
  1230.  
  1231.  
  1232. ; GO_END {
  1233.     cmp  al,253         ; Ctrl + ]
  1234.     jnz  no_go_to_end
  1235.     cmp [lines],30   ;to fix ctrl+] bug
  1236.     jb @f
  1237.     mov  eax,[lines]    ; eax = lines in the file
  1238.     sub  eax,[slines]   ; eax -= lines on the screen
  1239. ;   imul eax,80         ; eax *= 80 (length of line)
  1240.     lea  eax,[eax+eax*4]
  1241.     shl  eax,4
  1242.     mov  [post],eax     ; offset in the file
  1243.  
  1244.     call clear_screen
  1245.     call drawfile       ; draw file
  1246.     call draw_vertical_scroll
  1247.     @@:
  1248.     jmp  still          ; go to still
  1249. ; GO_END }
  1250.  
  1251.  
  1252.   no_go_to_end:
  1253.  
  1254.  
  1255. ; DELETE {
  1256.     cmp  al,134+48
  1257.     jne  nodel
  1258.  
  1259.     imul eax,[posy],80
  1260.     add  eax,0x80000
  1261.     add  eax,[post]
  1262.     add  eax,[posx]
  1263.     mov  ecx,eax
  1264.  
  1265.     imul eax,[posy],80
  1266.     add  eax,0x80000+79
  1267.     add  eax,[post]
  1268.     mov  ebx,eax
  1269.  
  1270.     push ebx
  1271.  
  1272.     dec  ecx
  1273.     dec  ebx
  1274.  
  1275.  
  1276.     push ecx ebx
  1277.  
  1278.     push ebx
  1279.  
  1280.     imul eax,[posy],80
  1281.     add  eax,0x80000
  1282.     add  eax,[post]
  1283.     mov  ecx,eax
  1284.  
  1285.     xor  eax,eax
  1286.     cdq
  1287.  
  1288.     pop  ebx
  1289.  
  1290.     dec  ecx
  1291.    @@:
  1292.     inc  ecx
  1293.     mov  dh,[ecx]
  1294.     cmp  dh,33
  1295.     jb   .nok
  1296.     xor  eax,eax
  1297.     inc  eax
  1298.    .nok:
  1299.     cmp  ecx,ebx
  1300.     jb   @b
  1301.  
  1302.     pop  ebx ecx
  1303.  
  1304.    @@:
  1305.     inc  ecx
  1306.     mov  dl,[ecx+1]
  1307.     mov  [ecx],dl
  1308.     cmp  ecx,ebx
  1309.     jb   @b
  1310.  
  1311.  
  1312.     pop  ebx
  1313.     mov  [ebx],byte 32
  1314.  
  1315.     test eax,eax
  1316.     jz   dellinesup
  1317.  
  1318.     call clear_screen
  1319.     call drawfile
  1320.     mov [modified],1
  1321.  
  1322.     jmp  still
  1323.  
  1324.   dellinesup:
  1325.  
  1326.     ; lines -1
  1327.  
  1328.     pusha
  1329.  
  1330.     mov  eax,[post]
  1331.     cdq
  1332.     mov  ebx,80
  1333.     div  ebx
  1334.     add  eax,[posy]
  1335.     inc  eax
  1336.  
  1337.     cmp  eax,[lines]
  1338.     jb   @f
  1339.  
  1340.     popa
  1341.     mov [modified],1
  1342.  
  1343.     jmp  still
  1344.  
  1345.   @@:
  1346.  
  1347.     popa
  1348.  
  1349.     dec  [lines]
  1350.  
  1351.     ; lines up
  1352.  
  1353.     mov  [posx],dword 0
  1354.  
  1355.     imul eax,[posy],80
  1356.     add  eax,0x80000-1
  1357.     add  eax,[post]
  1358.     mov  ebx,eax
  1359.  
  1360.     push ebx
  1361.  
  1362.     imul eax,[lines],80
  1363.     add  eax,0x80000-1
  1364.     add  eax,[post]
  1365.     mov  ecx,eax
  1366.  
  1367.     pop  ebx
  1368.  
  1369.    @@:
  1370.     mov  dl,[ebx+80]
  1371.     mov  [ebx],dl
  1372.     inc  ebx
  1373.  
  1374.     cmp  ecx,ebx
  1375.     jnz  @b
  1376.  
  1377.     call clear_screen
  1378.     call drawfile
  1379.     mov [modified],1
  1380.  
  1381.     jmp  still
  1382. ; DELETE }
  1383.  
  1384.  
  1385.   nodel:
  1386.  
  1387.  
  1388. ; INSERT {
  1389.     cmp  al,137+48
  1390.     jnz  noins
  1391.  
  1392.     imul eax,[posy],80
  1393.     add  eax,0x80000
  1394.     add  eax,[post]
  1395.     add  eax,[posx]
  1396.     mov  ecx,eax
  1397.     ; ecx = [posy]*80+0x80000+[post]+[posx]
  1398.  
  1399.     imul eax,[posy],80
  1400.     add  eax,0x80000+79
  1401.     add  eax,[post]
  1402.     mov  ebx,eax
  1403.     ; ebx = [posy]*80+0x80000+79+[post]
  1404.  
  1405.    .movstr:
  1406.     dec  ebx
  1407.     mov  dl,[ebx]
  1408.     mov  [ebx+1],dl
  1409.     cmp  ecx,ebx
  1410.     jb   .movstr
  1411.  
  1412.     mov  [ecx],byte ' '
  1413.  
  1414.     call invalidate_string
  1415.     call drawfile
  1416.     mov [modified],1
  1417.  
  1418.     jmp  still
  1419. ; INSERT }
  1420.  
  1421.  
  1422.   noins:
  1423.  
  1424.  
  1425. ; BACKSPACE {
  1426.     cmp  al,8
  1427.     jnz  nobs
  1428.     mov  ecx,[posx]
  1429.     test ecx,ecx
  1430.     jz   still
  1431.     dec  ecx
  1432.     mov  [posx],ecx
  1433.  
  1434.     imul eax,[posy],80
  1435.     add  eax,0x80000
  1436.     add  eax,[post]
  1437.     add  eax,[posx]
  1438.     mov  ebx,eax
  1439.  
  1440.     push ebx
  1441.  
  1442.     imul eax,[posy],80
  1443.     add  eax,0x80000+79
  1444.     add  eax,[post]
  1445.     mov  ebx,eax
  1446.  
  1447.     pop  ecx
  1448.  
  1449.     push ebx
  1450.  
  1451.     dec  ecx
  1452.    .movleft:
  1453.     inc  ecx
  1454.     mov  dl,[ecx+1]
  1455.     mov  [ecx],dl
  1456.     cmp  ecx,ebx
  1457.     jb   .movleft
  1458.  
  1459.     pop  ebx
  1460.     mov  [ebx],byte ' '
  1461.  
  1462.     call invalidate_string
  1463.     call drawfile
  1464.     mov [modified],1
  1465.  
  1466.     jmp  still
  1467. ; BACKSPACE }
  1468.  
  1469.  
  1470.   nobs:
  1471.  
  1472.  
  1473. ; TAB {
  1474.     cmp  eax,9  ; Tab
  1475.     jne  notab
  1476.  
  1477.     mov  eax,[posx]
  1478.     cmp  eax,80-1
  1479.     jae  still
  1480.     add  eax,5          ; 9         5        3
  1481.     and  eax,11111100b  ; ...1000b, ...100b, ...10b
  1482.     dec  eax
  1483.     mov  [posx], eax
  1484.  
  1485.     call drawfile
  1486.     mov [modified],1
  1487.  
  1488.     jmp  still
  1489. ; TAB }
  1490.  
  1491.  
  1492.   notab:
  1493.  
  1494.  
  1495. ; ADD_KEY {
  1496.     push eax  ; add key
  1497.  
  1498.     imul eax,[posy],80
  1499.     add  eax,0x80000
  1500.     add  eax,[post]
  1501.     add  eax,[posx]
  1502.     mov  ecx,eax
  1503.  
  1504.     push ecx
  1505.  
  1506.     imul eax,[posy],80
  1507.     add  eax,0x80000+79
  1508.     add  eax,[post]
  1509.     mov  ebx,eax
  1510.  
  1511.    .movright:
  1512.     dec  ebx
  1513.     mov  al,[ebx]
  1514.     mov  [ebx+1],al
  1515.     cmp  ecx,ebx
  1516.     jbe  .movright
  1517.  
  1518.     pop  ebx
  1519.  
  1520.     pop  eax
  1521.  
  1522.     mov  [ebx],al
  1523.     mov  edx,78
  1524.     mov  ecx,[posx]
  1525.     cmp  edx,ecx
  1526.     jb   noxp
  1527.     inc  ecx
  1528.     mov  [posx],ecx
  1529.   noxp:
  1530.  
  1531.     call invalidate_string
  1532.     call drawfile
  1533.     mov [modified],1
  1534. ;    call draw_vertical_scroll
  1535.     jmp  still
  1536. ; ADD_KEY }
  1537.  
  1538.  
  1539. ;******************************************************************************
  1540.  
  1541. start_fasm:
  1542.    cmp     [asm_mode],1
  1543.    je      @f
  1544.    ret
  1545.   @@:
  1546.    mov     esi,filename
  1547.    mov     edi,fasm_parameters
  1548.  
  1549.    cmp     byte [esi],'/'
  1550.    je      .yes_systree
  1551.  
  1552.    mov     ecx,[filename_len]
  1553.    rep     movsb
  1554.  
  1555.    mov     al,','
  1556.    stosb
  1557.  
  1558.    mov     ecx,[filename_len]
  1559.    add     ecx,-4
  1560.    mov     esi,filename
  1561.    rep     movsb
  1562.  
  1563.    mov     al,','
  1564.    stosb
  1565.  
  1566.    mov     [edi],dword '/RD/'
  1567.    add     edi,4
  1568.    mov     [edi],word '1/'
  1569.    inc     edi
  1570.    inc     edi
  1571.  
  1572.    mov     al,0
  1573.    stosb
  1574.  
  1575.    jmp     .run
  1576.  
  1577.  .yes_systree:
  1578.    add     esi,[filename_len]
  1579.    dec     esi
  1580.  
  1581.    xor     ecx,ecx
  1582.    mov     al,'/'
  1583.  @@:
  1584.    cmp     [esi],al
  1585.    je      @f
  1586.    dec     esi
  1587.    inc     ecx
  1588.    jmp     @b
  1589.  @@:
  1590.    inc     esi
  1591.  
  1592.    push    esi
  1593.    push    esi
  1594.    push    ecx
  1595.  
  1596.    rep     movsb
  1597.  
  1598.    mov     al,','
  1599.    stosb
  1600.  
  1601.    pop     ecx
  1602.    pop     esi
  1603.  
  1604.    add     ecx,-4
  1605.    rep     movsb
  1606.  
  1607.    mov     al,','
  1608.    stosb
  1609.  
  1610.    pop     ecx
  1611.    sub     ecx,filename
  1612.    mov     esi,filename
  1613.  
  1614.    rep     movsb
  1615.  
  1616.    mov     al,0
  1617.    stosb
  1618.  
  1619.  .run:
  1620.    cmp     [run_outfile],1
  1621.    jne     @f
  1622.    dec     edi
  1623.    mov     eax,',run'
  1624.    stosd
  1625.    mov     al,0
  1626.    stosb
  1627.   @@:
  1628.  
  1629.    mov     eax,19
  1630.    mov     ebx,fasm_filename
  1631.    mov     ecx,fasm_parameters
  1632.    int     0x40
  1633. ret
  1634.  
  1635. open_debug_board:
  1636.    mov     eax,19
  1637.    mov     ebx,debug_filename
  1638.    xor     ecx,ecx
  1639.    int     0x40
  1640. ret
  1641.  
  1642. open_sysfuncs_txt:
  1643.    mov     eax,19
  1644.    mov     ebx,tinypad_filename
  1645.    mov     ecx,sysfuncs_filename
  1646.    int     0x40
  1647. ret
  1648.  
  1649.  
  1650. empty_work_space:
  1651. ; очистить все
  1652.    mov     eax,'    '
  1653.    mov     edi,0x80000
  1654.    mov     ecx,(0x300000-0x90000)/4
  1655.    cld
  1656.    rep     stosd
  1657.    mov     edi,0x10000
  1658.    mov     ecx,0x60000/4
  1659.    rep     stosd
  1660. ret
  1661.  
  1662.  
  1663. clear_screen:
  1664. ; очистить экран
  1665.    mov     ecx,80*40
  1666.    mov     edi,0x78000
  1667.    xor     eax,eax
  1668.  @@:
  1669.    mov     [edi],eax
  1670.    add     edi,4
  1671.    dec     ecx
  1672.    jnz     @b
  1673. ret
  1674.  
  1675. invalidate_string:
  1676.    imul    eax,[posy],80
  1677.    add     eax,0x78000
  1678.    mov     edi,eax
  1679.    mov     al,1
  1680.    mov     ecx,80/4
  1681.    rep     stosd
  1682. ret
  1683.  
  1684. layout:
  1685. ; сменить раскладку клавиатуры
  1686.    mov     eax,19
  1687.    mov     ebx,setup
  1688.    mov     ecx,param_setup
  1689.    int     0x40
  1690.    mov     eax,5
  1691.    mov     ebx,eax
  1692.    int     0x40
  1693.    call    activate_me
  1694. ret
  1695.  
  1696.  
  1697. activate_me:
  1698. ; 1) get info about me
  1699.    mov     eax,9
  1700.    mov     ebx,procinfo
  1701.    mov     ecx,-1
  1702.    int     0x40
  1703.    ; eax = number of processes
  1704.  
  1705. ; save process counter
  1706.    inc     eax
  1707.    inc     eax
  1708.    mov     [proccount],eax
  1709.  
  1710.    mov     eax,[procinfo.PID]
  1711.    mov     [PID],eax
  1712.  
  1713. ; 2) get my process number
  1714.    mov     eax,9
  1715.    mov     ebx,procinfo
  1716.    mov     ecx,[proccount]
  1717.  @@:
  1718.    dec     ecx
  1719.    jz      @f    ; counter=0 => not found? => return
  1720.    mov     eax,9
  1721.    int     0x40
  1722.    mov     edx,[procinfo.PID]
  1723.    cmp     edx,[PID]
  1724.    jne     @b
  1725.  
  1726.    ;found: ecx = process_number
  1727.    mov     eax,18
  1728.    mov     ebx,3
  1729.    int     0x40
  1730.  
  1731.    mov     eax,5
  1732.    mov     ebx,eax
  1733.    int     0x40
  1734.  
  1735.  @@:
  1736. ret
  1737.  
  1738.  
  1739.  
  1740.  
  1741. ; *******************************************************************
  1742. ; **************************  DRAW WINDOW  **************************
  1743. ; *******************************************************************
  1744.  
  1745. align 4
  1746. drawwindow:
  1747.  
  1748.     mov  eax,12                   ; WINDOW DRAW START
  1749.     mov  ebx,1
  1750.     int  0x40
  1751.   mov [menu_is_on],0
  1752.     mov  eax,48  ; get system colors
  1753.     mov  ebx,3
  1754.     mov  ecx,sc
  1755.     mov  edx,sizeof.system_colors
  1756.     int  0x40
  1757.  
  1758.     mov  [sc.work],0xe0e0e0
  1759.  
  1760.     xor  eax,eax                  ; DEFINE WINDOW
  1761.     mov  ebx,100*65536+506 ; 496
  1762.     mov  ecx,75*65536+400 ;385;400  ; sum < 480 for 640x480
  1763.     mov  edx,[sc.work]
  1764.     add  edx,0x03000000
  1765.     mov  esi,[sc.grab]
  1766.     or   esi,0x80000000
  1767.     mov  edi,[sc.frame]
  1768.     int  0x40
  1769.  
  1770. ; header string
  1771.     mov  eax,4
  1772.     mov  ebx,10*65536+8
  1773.     mov  ecx,[sc.grab_text]
  1774.     mov  edx,header
  1775.     mov  esi,[headlen]
  1776.     int  0x40
  1777.  
  1778.     mov  eax,9    ; get info about me
  1779.     mov  ebx,procinfo
  1780.     or   ecx,-1
  1781.     int  0x40
  1782.  
  1783.     mov  eax,[procinfo.y_size]
  1784.  
  1785.     mov  [do_not_draw],1 ; do_not_draw = true
  1786.     cmp  eax,100
  1787.     jb   .no_draw        ; do not draw text & buttons if height < 100
  1788.     mov  [do_not_draw],0 ; do_not_draw = false
  1789.     add  eax,-(46+47) ;  46 = y offs
  1790.     cdq
  1791.     mov  ebx,10
  1792.     div  ebx
  1793.     mov  [slines],eax
  1794.  
  1795.     cmp  eax,[posy]
  1796.     jnb  @f
  1797.     dec  eax
  1798.     mov  [posy],eax
  1799.   @@:
  1800.  
  1801.     mov  eax,[procinfo.y_size] ; calculate buttons position
  1802.     add  eax,-47
  1803.     mov  [dstart],eax
  1804.  
  1805. ;    mov  eax,8                   ; STRING BUTTON
  1806. ;    mov  ebx,5*65536+57
  1807. ;    mov  ecx,[dstart]
  1808. ;    add  ecx,29
  1809. ;    shl  ecx,16
  1810. ;    add  ecx,13
  1811. ;    mov  edx,51              ;;;;;-----string button ID=51
  1812. ;    mov  esi,[sc.work_button]
  1813. ;    int  0x40
  1814.                                   ; SEARCH BUTTON
  1815. ;    mov  ebx,(505-129)*65536+125
  1816. ;    mov  edx,50
  1817. ;    mov  esi,[sc.work_button]
  1818. ;    int  0x40
  1819.  
  1820. ;    mov  eax,4                   ; SEARCH TEXT
  1821. ;    mov  ebx,[dstart]
  1822. ;    add  ebx,7*65536+32
  1823. ;    mov  ecx,[sc.work_button_text]
  1824. ;    mov  edx,searcht
  1825. ;    mov  esi,searchtl-searcht
  1826. ;    int  0x40
  1827.  
  1828.  
  1829.     mov  eax,13                   ; BAR STRIPE
  1830.     mov  ebx,5*65536+497
  1831.     mov  ecx,[dstart]
  1832.     shl  ecx,16
  1833.     add  ecx,30 ;15
  1834.  
  1835.     mov  edx,0x00aaaaaa
  1836.     int  0x40
  1837.  
  1838. ;    mov  eax,4                   ; FIRST TEXT LINE (POSITION...)
  1839. ;    mov  ebx,12*65536
  1840. ;    add  ebx,[dstart]
  1841. ;    add  ebx,38 ;18
  1842. ;    mov  ecx,[sc.work_button_text]
  1843. ;    mov  edx,htext2
  1844. ;    mov  esi,htextlen2-htext2
  1845. ;    int  0x40
  1846.  
  1847.  
  1848.     call drawfile
  1849.  
  1850. ;    mov  eax,[dstart]
  1851.  
  1852. ;    add  eax,31
  1853. ;    mov  [ya],eax
  1854. ;    mov  [addr],search_string
  1855. ;    call print_text
  1856.  
  1857.   .no_draw:
  1858.   call draw_win_menu
  1859.  
  1860.   call draw_vertical_scroll
  1861.  
  1862.     mov  eax,12                   ; WINDOW DRAW END
  1863.     mov  ebx,2
  1864.     int  0x40
  1865.  
  1866.     ret
  1867.  
  1868.  
  1869.  
  1870.  
  1871. ; **********************************
  1872. ; ***********  DRAWFILE  ***********
  1873. ; **********************************
  1874.  
  1875. drawfile:
  1876. ;---------------
  1877. cmp [menu_is_on],1
  1878. jne .ff
  1879. call drawwindow
  1880. .ff:
  1881. ;---------------
  1882.     mov  [next_not_quote],1
  1883.     mov  [next_not_quote2],1
  1884.  
  1885.     mov  eax,[post]        ; print from position
  1886.  
  1887.     pusha
  1888.  
  1889.     mov  edi,[post]
  1890.     mov  [posl],edi
  1891.  
  1892.     mov  ebx,8*65536+46    ; letters (46 = y offs)
  1893.     xor  ecx,ecx
  1894.  
  1895.     mov  edx,0x80000
  1896.     add  edx,eax
  1897.     mov  edi,edx
  1898.  
  1899.     imul esi,[slines],80
  1900.     add  edi,esi
  1901.  
  1902.  
  1903.   nd:
  1904.  
  1905.     pusha
  1906.  
  1907.     mov       edx,ebx
  1908.     mov       edi,ebx
  1909.     add       edi,(6*65536)*80
  1910.  
  1911.   wi1:
  1912.  
  1913.  
  1914.     ; draw ?
  1915.  
  1916.  
  1917.     pusha
  1918.  
  1919.     push      ecx
  1920.  
  1921.     imul      eax,[posx],6
  1922.     add       eax,8
  1923.     shl       eax,16
  1924.     mov       ecx,eax
  1925.  
  1926. ;    ecx = ([posx]*6+8)<<16
  1927.  
  1928.     imul      eax,[posy],10
  1929.     add       eax,46  ; y offs
  1930.     add       eax,ecx
  1931.  
  1932. ;    eax = [posy]*10+46+ecx
  1933.  
  1934.     pop       ecx
  1935.  
  1936.     cmp       edx,eax
  1937.     jnz       drwa
  1938.  
  1939.     mov       eax,0x7ffff
  1940.     call      check_pos
  1941.     jmp       drlet
  1942.  
  1943.   drwa:
  1944.  
  1945.     popa
  1946.  
  1947.  
  1948.     pusha
  1949.  
  1950.     imul      eax,[posxm],6
  1951.     add       eax,8
  1952.     shl       eax,16
  1953.     mov       ecx,eax
  1954.  
  1955.     imul      eax,[posym],10
  1956.     add       eax,46     ; y offs
  1957.     add       eax,ecx
  1958.  
  1959.     cmp       edx,eax
  1960.     jnz       drwa2
  1961.  
  1962.     mov       eax,0x7ffff
  1963.     call      check_pos
  1964.     jmp       drlet
  1965.  
  1966.   drwa2:
  1967.  
  1968.     popa
  1969.  
  1970.     pusha
  1971.  
  1972.     mov       eax,0x78000  ; screen
  1973.     add       eax,[posl]   ; screen+abs
  1974.     sub       eax,[post]   ; eax = screen+abs-base = y*80+x + screen
  1975.  
  1976.     mov       edx,0x80000 ; file
  1977.     add       edx,[posl]  ; edx = absolute
  1978.     mov       bl,[edx]    ; in the file
  1979.  
  1980.     call      check_pos
  1981.  
  1982.     mov       cl,[eax]   ; on the screen
  1983.     cmp       bl,cl
  1984.     jnz       drlet
  1985.  
  1986.     popa
  1987.  
  1988.     jmp       nodraw
  1989.  
  1990.  
  1991.     ; draw letter
  1992.  
  1993.  
  1994.   drlet:
  1995.  
  1996.     mov       [eax],bl ; mov byte to the screen
  1997.     mov       [tmpabc],bl
  1998.     popa      ; restore regs
  1999.  
  2000. ;!!!!!!!!!!!!
  2001.  
  2002.     cmp       [tmpabc],' '
  2003.     je        @f
  2004.     call      draw_letter
  2005.     jmp       nodraw
  2006.    @@:
  2007.     call      clear_char
  2008.  
  2009.     nodraw:
  2010.  
  2011.     inc       [posl]
  2012.  
  2013.     add       edx,6*65536
  2014.     cmp       edx,edi
  2015.     jz        wi3
  2016.     jmp       wi1
  2017.  
  2018.   wi3:
  2019.  
  2020.     popa
  2021.  
  2022.     add       ebx,10
  2023.     add       edx,80
  2024.     cmp       edi,edx
  2025.     jbe       nde
  2026.     jmp       nd
  2027.  
  2028.   nde:
  2029.  
  2030.     mov       eax,[posx]
  2031.     mov       ebx,[posy]
  2032.  
  2033.     mov       [posxm],eax
  2034.     mov       [posym],ebx
  2035.  
  2036.     popa
  2037.  
  2038.     ret
  2039.  
  2040.  stText    = 0
  2041.  stInstr   = 1
  2042.  stReg     = 2
  2043.  stNum     = 3
  2044.  stQuote   = 4
  2045.  stComment = 5
  2046.  stSymbol  = 6
  2047.  
  2048. align 4
  2049.  
  2050. clear_char:
  2051.  
  2052.     pusha
  2053.     mov       ebx,[sc.work]
  2054.  
  2055.     push      ecx
  2056.  
  2057.     imul      eax,[posx],6
  2058.     add       eax,8
  2059.     shl       eax,16
  2060.     mov       ecx,eax
  2061.  
  2062.     imul      eax,[posy],10
  2063.     add       eax,46 ; 26
  2064.     add       eax,ecx
  2065.  
  2066.     pop       ecx
  2067.     cmp       edx,eax
  2068.     jnz       @f
  2069.     mov       ebx,0xffffff   ; light blue 0x00ffff
  2070.   @@:
  2071.  
  2072.                      ; draw bar
  2073.     push      ebx
  2074.     mov       eax,13
  2075.     mov       ebx,edx
  2076.     mov       bx,6
  2077.     mov       ecx,edx
  2078.     shl       ecx,16
  2079.     add       ecx,10
  2080.     pop       edx
  2081.     int       0x40
  2082.     popa
  2083.     ret
  2084.  
  2085. align 4
  2086.  
  2087. ; CHECK_POSITION {
  2088. check_pos:
  2089.   cmp  [asm_mode],1
  2090.   je   @f
  2091.  
  2092.   mov  [d_status],stText
  2093.   ret
  2094.  
  2095.  @@:
  2096.   pushad
  2097.  
  2098. ; COMMENT TERMINATOR
  2099.   cmp  [d_status],stComment
  2100.   jnz  @f
  2101.   mov  eax,[posl]
  2102.   sub  eax,[post]
  2103.   cdq
  2104.   mov  ebx,80
  2105.   div  ebx
  2106.   test edx,edx
  2107.   jnz  end_check_pos
  2108.   mov  [d_status],stText
  2109.  @@:
  2110.  
  2111. ; QUOTE TERMINATOR B
  2112.   cmp  [next_not_quote],1
  2113.   jne  @f
  2114.   mov  [d_status],stText
  2115.  @@:
  2116.  
  2117.   mov  eax,[posl]
  2118.   add  eax,0x80000
  2119.   mov  edx,eax
  2120.   mov  al,[eax]
  2121.  
  2122. ; QUOTE TERMINATOR A
  2123.   cmp  [d_status],stQuote
  2124.   jnz  @f
  2125.   cmp  al,[quote]
  2126.   jne  end_check_pos
  2127.   mov  [next_not_quote],1
  2128.   jmp  end_check_pos
  2129.  @@:
  2130.   mov  [next_not_quote],0
  2131.  
  2132. ; START QUOTE 1
  2133.   cmp  al,"'"
  2134.   jne  @f
  2135.   mov  [d_status],stQuote
  2136.   mov  [quote],al
  2137.   jmp  end_check_pos
  2138.  @@:
  2139.  
  2140. ; START QUOTE 2
  2141.   cmp  al,'"'
  2142.   jne  @f
  2143.   mov  [d_status],stQuote
  2144.   mov  [quote],al
  2145.   jmp  end_check_pos
  2146.  @@:
  2147.  
  2148. ; START COMMENT
  2149.   cmp  al,';'
  2150.   jne  @f
  2151.   mov  [d_status],stComment
  2152.   jmp  end_check_pos
  2153.  @@:
  2154.  
  2155. ; NUMBER TERMINATOR
  2156.   cmp  [d_status],stNum
  2157.   jne  nonumt
  2158.   mov  ecx,23
  2159.  @@:
  2160.   dec  ecx
  2161.   jz   nonumt
  2162.   cmp  al,[symbols+ecx]
  2163.   jne  @b
  2164.  
  2165.  nonumt1:
  2166.   mov  [d_status],stText
  2167.  nonumt:
  2168.  
  2169. ; START NUMBER
  2170.   cmp  [d_status],stNum
  2171.   je   end_check_pos
  2172.   cmp  al,'0'
  2173.   jb   nonum
  2174.   cmp  al,'9'
  2175.   ja   nonum
  2176.   mov  bl,[edx-1]
  2177.   mov  ecx,23
  2178.  @@:
  2179.   dec  ecx
  2180.   jz   nonum
  2181.   cmp  bl,[symbols+ecx]
  2182.   jne  @b
  2183.  @@:
  2184.   mov  [d_status],stNum
  2185.   jmp  end_check_pos
  2186.  nonum:
  2187.  
  2188. ; SYMBOL
  2189.   mov   esi,symbols
  2190.   mov   ecx,21
  2191.  @@:
  2192.   cmp   byte [esi],al
  2193.   je    @f
  2194.   dec   ecx
  2195.   jz    nosymbol
  2196.   inc   esi
  2197.   jmp   @b
  2198.  @@:
  2199.   mov   [d_status],stSymbol
  2200.   jmp   end_check_pos
  2201.  
  2202.  nosymbol:
  2203.   mov   [d_status],stText
  2204.  
  2205.  end_check_pos:
  2206.   popad
  2207.   ret
  2208. ; CHECK_POSITION }
  2209.  
  2210.  
  2211. ;;;;;;;;;;;;;;;;;
  2212. ;; DRAW LETTER ;;
  2213. ;;;;;;;;;;;;;;;;;
  2214. draw_letter:
  2215.  
  2216.     call      clear_char
  2217.  
  2218.     pusha
  2219.  
  2220.     mov       ebx,edx  ; x & y
  2221.  
  2222.     mov       eax,[d_status]
  2223.     mov       ecx,[eax*4+color_tbl]
  2224.     mov       eax,4
  2225.  
  2226.     xor       esi,esi
  2227.     inc       esi
  2228.     mov       edx,0x80000
  2229.     mov       edi,[posl]
  2230.     add       edx,edi
  2231.     int       0x40
  2232.  
  2233.     popa
  2234.  
  2235.     ret
  2236.  
  2237.  
  2238. ; ********************************************
  2239. ; ****************  SAVEFILE  ****************
  2240. ; ********************************************
  2241. save_file:
  2242.    mov     esi,0x80000
  2243.    mov     edi,0x10000
  2244.    or      ecx,-1
  2245.  .new_string:
  2246.    inc     ecx
  2247.    call    save_string
  2248.    cmp     ecx,[lines]
  2249.    jb      .new_string
  2250.  
  2251.    sub     edi,0x10004  ; why???
  2252.    mov     [filelen],edi
  2253.  
  2254.    cmp     byte [filename],'/'
  2255.    je      .systree_save
  2256.  
  2257.    mov     eax,33
  2258.    mov     ebx,filename
  2259.    mov     ecx,0x10000
  2260.    mov     edx,[filelen]
  2261.    xor     esi,esi
  2262.    int     0x40
  2263.  
  2264.    test    eax,eax
  2265.    je      .finish
  2266. ;   call    file_not_found
  2267.    call disk_is_full
  2268. ;==============================
  2269.    jmp     .finish
  2270.  
  2271.  .systree_save:
  2272.    mov     eax,[filelen]
  2273.    mov     [fileinfo_write+8],eax
  2274.  
  2275.    mov     esi,filename
  2276.    mov     edi,pathfile_write
  2277.    mov     ecx,50
  2278.    cld
  2279.    rep     movsb
  2280.  
  2281.    mov     eax,58
  2282.    mov     ebx,fileinfo_write
  2283.    int     0x40
  2284.    cmp eax,0
  2285.    je .finish
  2286.    call disk_is_full
  2287.  .finish:
  2288. call draw_window_for_dialogs
  2289.     mov [modified],0
  2290. ret
  2291.  
  2292. save_string:
  2293.    push    ecx
  2294.    push    esi
  2295.    mov     eax,esi
  2296.    mov     ebx,eax
  2297.    add     ebx,79
  2298.  .countlen:
  2299.    cmp     ebx,eax
  2300.    jb      .endcount
  2301.    cmp     byte [ebx],' '
  2302.    jne     .endcount
  2303.    dec     ebx
  2304.    jmp     .countlen
  2305.  .endcount:
  2306.    inc     ebx
  2307.    sub     ebx,eax
  2308.  
  2309.    mov     ecx,ebx
  2310.    jecxz   .endcopy
  2311.  .copystr:
  2312.    mov     al,[esi]
  2313.    mov     [edi],al
  2314.    inc     esi
  2315.    inc     edi
  2316.    dec     ecx
  2317.    jnz     .copystr
  2318.  .endcopy:
  2319.  
  2320.    mov     eax,0x0a0d
  2321.    stosw
  2322.  
  2323.    pop     esi
  2324.    add     esi,80
  2325.    pop     ecx
  2326. ret
  2327.  
  2328.  
  2329.  
  2330. ; ********************************************
  2331. ; ****************  LOADFILE  ****************
  2332. ; ********************************************
  2333.  
  2334. loadhdfile:
  2335.  
  2336.      mov  esi,filename
  2337.      mov  edi,pathfile_read
  2338.      mov  ecx,250 ;50
  2339.      cld
  2340.      rep  movsb
  2341.  
  2342.      mov  eax,58
  2343.      mov  ebx,fileinfo_read
  2344.      int  0x40
  2345.  
  2346.      xchg eax,ebx
  2347.      inc  eax
  2348.      test ebx,ebx   ;errorcode=0 - ok
  2349.      je   file_found
  2350.      cmp  ebx,6     ;errorcode=5 - ok
  2351.      je   file_found
  2352.      call file_not_found
  2353.      ret
  2354.  
  2355.  
  2356. loadfile1:
  2357.  
  2358.     mov  eax,6        ; 6 = open file
  2359.     mov  ebx,filename
  2360.     xor  ecx,ecx
  2361.     mov  edx,16800
  2362.     mov  esi,0x10000
  2363.     int  0x40
  2364.  
  2365.     inc  eax          ; eax = -1 -> file not found
  2366.     jnz  file_found   ;strannaya proverka (Ed)
  2367.  
  2368.     call file_not_found
  2369.     ret
  2370.  
  2371.  
  2372.   file_found:
  2373.     dec  eax
  2374. ;   eax = file size
  2375.     jz   .finish
  2376.     mov  [filesize],eax
  2377.  
  2378.     mov  edi,0x80000     ; clear all
  2379.   @@:
  2380.     mov  [edi],byte ' '
  2381.     inc  edi
  2382.     cmp  edi,0x2effff
  2383.     jnz  @b
  2384.  
  2385.     mov  [lines],0
  2386.     mov  edi,0x10000
  2387.     mov  ebx,0x80000
  2388.  
  2389. ; edi = from
  2390. ; ebx = to
  2391. ; eax = filesize
  2392.  
  2393.   .new_char:
  2394.     mov  cl,[edi]     ; get_char();
  2395.     cmp  cl,13        ; if (char==13)
  2396.     je   .new_str1    ;   goto .new_str1;
  2397.     cmp  cl,10        ; if (char==10)
  2398.     je   .new_str2    ;   goto .new_str2;
  2399.     mov  [ebx],cl     ; store_char();
  2400.     inc  ebx          ; dest++;
  2401.   .back:
  2402.     inc  edi          ; src++;
  2403.     dec  eax          ; counter--;
  2404.     jnz  .new_char    ; if (counter!=0) goto .new_char;
  2405.  
  2406.   .finish:
  2407.     inc  [lines]      ;   [lines]++;
  2408.     ret
  2409.  
  2410.   .new_str1:
  2411.     pusha
  2412.     mov  eax,ebx        ; eax = destination
  2413.     add  eax,-0x80000   ; eax = offset
  2414.     cdq
  2415.     mov  ecx,80
  2416.     div  ecx            ; offset /= 80;
  2417.     test edx,edx        ; if not the first char in the string
  2418.     jne  @f             ;   go forward
  2419.     test eax,eax        ; if first line
  2420.     je   @f             ;   go forward
  2421.     cmp  [edi-1],byte 10; if previous char != 10 continue without line feed
  2422.     jne  .contin
  2423.    @@:
  2424.     inc  eax            ; offset++;
  2425.     imul eax,80         ; offset *= 80;
  2426.     add  eax,0x80000
  2427.     mov  [esp+4*4],eax  ; to ebx
  2428.    .contin:
  2429.     popa
  2430.     inc  edi     ; do not look on the next char (10)
  2431.     dec  eax     ; counter--;
  2432.     inc  [lines] ; [lines]++;
  2433.     jmp  .back
  2434.  
  2435.  
  2436.   .new_str2:
  2437.     pusha
  2438.     mov  eax,ebx
  2439.     add  eax,-0x80000
  2440.     cdq
  2441.     mov  ecx,80
  2442.     div  ecx
  2443.     inc  eax
  2444.     imul eax,80
  2445.     add  eax,0x80000
  2446.     mov  [esp+4*4],eax ; to ebx
  2447.     popa
  2448.     inc  [lines]
  2449.     jmp  .back
  2450.  
  2451.  
  2452. file_not_found:
  2453.    mov  eax,55           ; beep
  2454.    mov  ebx,eax
  2455.    mov  esi,error_beep
  2456.    int  0x40
  2457.    mov  [lines],1        ; open empty document
  2458.  
  2459.    mov [to_return2],1
  2460.    call openerror
  2461.  
  2462.    ret
  2463.  
  2464. disk_is_full:
  2465.    mov  eax,55           ; beep
  2466.    mov  ebx,eax
  2467.    mov  esi,error_beep
  2468.    int  0x40
  2469.    mov [to_return2],1
  2470.    call saveerror
  2471.    mov [error2_found],1
  2472. ret
  2473.  
  2474.  
  2475. ; *****************************
  2476. ; ******  WRITE POSITION ******
  2477. ; *****************************
  2478.  
  2479. writepos:
  2480.  
  2481.     cmp [do_not_draw],1  ; return if drawing is not permitted
  2482.     jne @f
  2483.     ret
  2484.    @@:
  2485.  
  2486.     pusha
  2487.  
  2488.     mov  eax,[posx]
  2489.     inc  eax
  2490.     cdq
  2491.     mov  ebx,10
  2492.     div  ebx
  2493.     add  al,'0'
  2494.     add  dl,'0'
  2495.     mov  [htext2+ 9],al
  2496.     mov  [htext2+10],dl
  2497.  
  2498.     mov  eax,[post]
  2499.     cdq
  2500.     mov  ebx,80
  2501.     div  ebx
  2502.     mov [real_posy],eax ;=====!!!!!!!!!
  2503.  
  2504.     add  eax,[posy]
  2505.     inc  eax
  2506.     mov  ebx,10
  2507.     cdq
  2508.     div  ebx
  2509.     add  dl,'0'
  2510.     mov  [htext2+16],dl  ; 00001
  2511.     cdq
  2512.     div  ebx
  2513.     add  dl,'0'
  2514.     mov  [htext2+15],dl  ; 00010
  2515.     cdq
  2516.     div  ebx
  2517.     add  dl,'0'
  2518.     mov  [htext2+14],dl  ; 00100
  2519.     cdq
  2520.     div  ebx
  2521.     add  dl,'0'
  2522.     add  al,'0'
  2523.     mov  [htext2+13],dl  ; 01000
  2524.     mov  [htext2+12],al  ; 10000
  2525.  
  2526.  
  2527.     mov  eax,[lines]     ; number of lines
  2528.     cdq
  2529.     mov  ebx,10
  2530.     div  ebx
  2531.     add  dl,'0'
  2532.     mov  [htext2+31],dl  ; 0001
  2533.     cdq
  2534.     div  ebx
  2535.     add  dl,'0'
  2536.     mov  [htext2+30],dl  ; 0010
  2537.     cdq
  2538.     div  ebx
  2539.     add  dl,'0'
  2540.     mov  [htext2+29],dl  ; 0100
  2541.     cdq
  2542.     div  ebx
  2543.     add  dl,'0'
  2544.     add  al,'0'
  2545.     mov  [htext2+28],dl
  2546.     mov  [htext2+27],al  ; 10000
  2547.  
  2548. ;   НАДО БЫ ОТОБРАЖАТЬ РАСКЛАДКУ КЛАВИАТУРЫ!
  2549. ;    mov  [htext2+42], word 'RU'
  2550.  
  2551. ;    mov  eax,13      ; draw bar
  2552. ;    mov  ebx,5*65536+38*6
  2553. ;    mov  ecx,[dstart]
  2554. ;    shl  ecx,16
  2555. ;    add  ecx,15
  2556. ;    mov  edx,[sc.work_graph]
  2557. ;    int  0x40
  2558.  
  2559.     mov  eax,13                   ; BAR STRIPE
  2560.     mov  ebx,5*65536+497
  2561.     mov  ecx,[dstart]
  2562.     add  ecx,29;30 ;15
  2563.     shl  ecx,16
  2564.     add  ecx,14
  2565.     mov  edx,[sc.work_graph]
  2566.     int  0x40
  2567.  
  2568.     mov  eax,4       ; write position
  2569.     mov  ebx,12*65536
  2570.     mov  bx,word [dstart]
  2571.     add  ebx,33 ;18
  2572.     mov  ecx,[sc.work_button_text]
  2573.     mov  edx,htext2
  2574.     mov  esi,38
  2575.     int  0x40
  2576.  
  2577.     cmp [modified],1
  2578.     jne no_mod
  2579. if lang eq ru
  2580.      putlabel 270,386,'ИЗМЕНЕН',[sc.work_button_text]
  2581. else
  2582.      putlabel 270,386,'MODIFIED',[sc.work_button_text]
  2583. end if
  2584.     no_mod:
  2585.     popa
  2586.  
  2587.     ret
  2588.  
  2589. ;-----------------------------
  2590. ;   search window
  2591. ;-----------------------------
  2592. search_window:
  2593.  
  2594. mov eax,13
  2595. mov ebx,55*65536+380
  2596. mov ecx,100*65536+60
  2597. mov edx,[sc.work_graph]
  2598. int 0x40
  2599.  
  2600. mov eax,38
  2601. mov ebx,55*65536+435
  2602. mov ecx,100*65536+100
  2603. mov edx,cl_White
  2604. int 0x40
  2605. mov eax,38
  2606. mov ebx,55*65536+55
  2607. mov ecx,100*65536+160
  2608. mov edx,cl_White
  2609. int 0x40
  2610. mov eax,38
  2611. mov ebx,435*65536+435
  2612. mov ecx,100*65536+160
  2613. mov edx,cl_White
  2614. int 0x40
  2615. mov eax,38
  2616. mov ebx,55*65536+435
  2617. mov ecx,160*65536+160
  2618. mov edx,cl_White
  2619. int 0x40
  2620.  
  2621. if lang eq ru
  2622. drawlbut 375,110,50,15,'Поиск',50,[sc.work_button],[sc.work_button_text]
  2623. drawlbut 375,130,50,15,'Отмена',94,[sc.work_button],[sc.work_button_text]
  2624. else
  2625. drawlbut 375,110,50,15,'Search',50,[sc.work_button],[sc.work_button_text]
  2626. drawlbut 375,130,50,15,'Cancel',94,[sc.work_button],[sc.work_button_text]
  2627. end if
  2628.  
  2629. call read_string
  2630.  
  2631. ;    add  eax,31
  2632. ;    mov  [ya],eax
  2633. ;    mov  [addr],search_string
  2634. ;    call print_text
  2635.  
  2636.  
  2637.  
  2638. jmp search
  2639.  
  2640. string_not_found:
  2641.  mov eax,13
  2642.  mov ebx,150*65536+200
  2643.  mov ecx,100*65536+70
  2644.  mov edx,[sc.work_graph] ;0x00dd9438 ;0x00ff7512
  2645.  int 0x40
  2646.  
  2647. mov eax,38
  2648. mov ebx,150*65536+350
  2649. mov ecx,100*65536+100
  2650. mov edx,cl_White
  2651. int 0x40
  2652. mov eax,38
  2653. mov ebx,150*65536+350
  2654. mov ecx,170*65536+170
  2655. mov edx,cl_White
  2656. int 0x40
  2657. mov eax,38
  2658. mov ebx,150*65536+150
  2659. mov ecx,100*65536+170
  2660. mov edx,cl_White
  2661. int 0x40
  2662. mov eax,38
  2663. mov ebx,350*65536+350
  2664. mov ecx,100*65536+170
  2665. mov edx,cl_White
  2666. int 0x40
  2667.  
  2668. if lang eq ru
  2669.  putlabel 195,120,'Строка не найдена!',cl_White
  2670. else
  2671.  putlabel 195,120,'String not found!',cl_White
  2672. end if
  2673.  
  2674.  drawlbut 235,140,30,15,'Ок',94,[sc.work_button],cl_White
  2675.  
  2676. ret
  2677.  
  2678. read_string:
  2679.  
  2680. push eax
  2681. ;----------------
  2682. mov eax,40
  2683. mov ebx,00000000000000000000000000000111b
  2684. int 0x40
  2685. ;----------------
  2686. pop eax
  2687.  
  2688. ;    cmp  al,51
  2689. ;    jz  .f2
  2690. ;    ret
  2691.  
  2692.   .f2:
  2693.     mov  [addr],dword search_string
  2694.     mov  eax,[dstart]
  2695.     add  eax,17+14
  2696.     mov  [ya],eax
  2697.     mov  [case_sens],1
  2698.  
  2699.   .rk:
  2700.  
  2701.     mov  edi,[addr]
  2702.  
  2703.     mov  eax,[addr]
  2704.     mov  eax,[eax-4]
  2705.     mov  [temp],eax
  2706.  
  2707.     add  edi,eax
  2708.  
  2709.     call print_text
  2710.  
  2711.   .waitev:
  2712.     mov  eax, 10
  2713.     int  0x40
  2714.     cmp  eax, 2
  2715.     jne  .read_done
  2716.     int  0x40
  2717.     shr  eax, 8
  2718.  
  2719.     cmp  al, 13     ; enter
  2720.     je   .read_done
  2721.  
  2722.     cmp al,27
  2723.     jne ._f
  2724.     jmp red
  2725.     ._f:
  2726.     cmp  al, 192    ; Ctrl + space
  2727.     jne  .noclear
  2728.  
  2729.     xor  eax, eax
  2730.     mov  [temp], eax
  2731.     mov  edi, [addr]
  2732.     mov  [edi-4], eax
  2733.     mov  ecx, 49
  2734.     cld
  2735.     rep  stosb
  2736.     mov  edi, [addr]
  2737.     call print_text
  2738.     jmp  .waitev
  2739.  
  2740.   .noclear:
  2741.  
  2742.     cmp  al, 8      ; backspace
  2743.     jnz  .nobsl
  2744.     cmp  [temp], 0
  2745.     jz   .waitev
  2746.     dec  [temp]
  2747.     mov  edi, [addr]
  2748.     add  edi, [temp]
  2749.     mov  [edi], byte 0
  2750.  
  2751.     mov  eax,[addr]
  2752.     dec  dword [eax-4]
  2753.  
  2754.     call print_text
  2755.     jmp  .waitev
  2756.  
  2757.   .nobsl:
  2758.     cmp  [temp],50
  2759.     jae  .read_done
  2760.  
  2761. ; CONVERT CHAR TO UPPER CASE:
  2762.     cmp  al, ' '        ; below "space" - ignore
  2763.     jb   .waitev
  2764.     cmp  [case_sens], 1 ; case sensitive?
  2765.     je   .keyok
  2766.     cmp  al, 'a'
  2767.     jb   .keyok
  2768.     cmp  al, 'z'
  2769.     ja   .keyok
  2770.     sub  al, 32
  2771.    .keyok:
  2772.  
  2773.     mov  edi,[addr]
  2774.     add  edi,[temp]
  2775.     mov  [edi],al
  2776.  
  2777.     inc  [temp]
  2778.  
  2779.     mov  eax,[addr]
  2780.     inc  dword [eax-4]
  2781.     call print_text
  2782.  
  2783.     cmp  [temp],50
  2784.     jbe  .waitev
  2785.  
  2786.   .read_done:
  2787.     mov ecx,50
  2788.     sub ecx,[temp]
  2789.     mov edi,[addr]
  2790.     add edi,[temp]
  2791.     xor eax,eax
  2792.     cld
  2793.     rep stosb
  2794.  
  2795.     mov [temp],987
  2796.  
  2797.     call print_text
  2798.     call mask_events
  2799.     ret
  2800.  
  2801.  
  2802. print_text:
  2803.  
  2804.     pusha
  2805.  
  2806.     mov  eax,13
  2807.     mov  ebx,64*65536+50*6+2
  2808. ;    mov  ecx,[ya]
  2809. ;    shl  ecx,16
  2810. ;    add  ecx,12
  2811.     mov ecx,110*65536+12
  2812.     mov  edx,[sc.work]
  2813.     int  0x40
  2814.  
  2815.     mov  edx,[addr]
  2816.     mov  esi,[edx-4]
  2817.     mov  eax,4
  2818.     mov  ebx,65*65536+112 ;2
  2819. ;    add  ebx,[ya]
  2820.     mov  ecx,[color_tbl+0]
  2821.     int  0x40
  2822.  
  2823.     cmp  [temp],50
  2824.     ja   @f
  2825.  
  2826. ; draw cursor
  2827. ; {
  2828. ;    mov  eax,[ya]
  2829.     mov eax,18*65536+102 ;65
  2830.     mov  ebx,eax
  2831.     shl  eax,16
  2832.     add  eax,ebx
  2833.     add  eax,10
  2834.     mov  ecx,eax
  2835.  
  2836.     mov  eax,[temp]
  2837. ;   imul eax,6
  2838.     lea  eax,[eax+eax*2]
  2839.     shl  eax,1
  2840.     add  eax,65
  2841.     mov  ebx,eax
  2842.     shl  eax,16
  2843.     add  ebx,eax
  2844.  
  2845.     mov  eax,38
  2846.     mov  edx,[color_tbl+0]
  2847.     int  0x40
  2848. ; }
  2849.  
  2850. @@:
  2851.     popa
  2852.  
  2853.     ret
  2854.  
  2855.  
  2856.  
  2857. ;    mov  eax,8                   ; STRING BUTTON
  2858. ;    mov  ebx,5*65536+57
  2859. ;    mov  ecx,[dstart]
  2860. ;    add  ecx,29
  2861. ;    shl  ecx,16
  2862. ;    add  ecx,13
  2863. ;    mov  edx,51              ;;;;;-----string button ID=51
  2864. ;    mov  esi,[sc.work_button]
  2865. ;    int  0x40
  2866.                                   ; SEARCH BUTTON
  2867. ;    mov  ebx,(505-129)*65536+125
  2868. ;    mov  edx,50
  2869. ;    mov  esi,[sc.work_button]
  2870. ;    int  0x40
  2871.  
  2872. ;    mov  eax,4                   ; SEARCH TEXT
  2873. ;    mov  ebx,[dstart]
  2874. ;    add  ebx,7*65536+32
  2875. ;    mov  ecx,[sc.work_button_text]
  2876. ;    mov  edx,searcht
  2877. ;    mov  esi,searchtl-searcht
  2878. ;    int  0x40
  2879.  
  2880.  
  2881.  
  2882. ; ****************************
  2883. ; ******* READ STRING ********
  2884. ; ****************************
  2885. goto_string:
  2886.  
  2887. mov [num_goto_string],0
  2888. call read_str_num
  2889. mov eax,[num_goto_string]
  2890. cmp eax,[lines]
  2891. ja .leave
  2892.  
  2893. ;---------------
  2894. mov [posy],0
  2895. call goto_pos
  2896.  
  2897. .leave:
  2898. call draw_window_for_dialogs
  2899. call mask_events
  2900.  
  2901. jmp still
  2902.  
  2903.  
  2904. read_str_num:
  2905. push eax
  2906. ;----------------
  2907. mov eax,40
  2908. mov ebx,00000000000000000000000000000111b
  2909. int 0x40
  2910. ;----------------
  2911. pop eax
  2912.  
  2913. mov eax,13
  2914. mov ebx,100*65536+100
  2915. mov ecx,70*65536+60
  2916. mov edx,[sc.work_button]
  2917. int 0x40
  2918.  
  2919.  
  2920. mov eax,38
  2921. mov ebx,100*65536+200
  2922. mov ecx,70*65536+70
  2923. mov edx,cl_White
  2924. int 0x40
  2925. mov eax,38
  2926. mov ebx,100*65536+200
  2927. mov ecx,130*65536+130
  2928. mov edx,cl_White
  2929. int 0x40
  2930. mov eax,38
  2931. mov ebx,100*65536+100
  2932. mov ecx,70*65536+130
  2933. mov edx,cl_White
  2934. int 0x40
  2935. mov eax,38
  2936. mov ebx,200*65536+200
  2937. mov ecx,70*65536+130
  2938. mov edx,cl_White
  2939. int 0x40
  2940.  
  2941.  
  2942.  
  2943. putlabel 105,75,'GoTo Line #',cl_White
  2944.     mov  eax,13
  2945.     mov  ebx,110*65536+40
  2946.     mov  ecx,90*65536+12;[ya]
  2947.     mov  edx,[sc.work]
  2948.     int  0x40
  2949.  
  2950. outcount [num_goto_string],112,92,cl_Black,6*65536
  2951. drawlbut 110,105,40,15,'GoTo',93,cl_Grey,cl_Black
  2952. drawlbut 153,105,40,15,'Cancel',94,cl_Grey,cl_Black
  2953.   .waitev:
  2954.     mov  eax, 10
  2955.     int  0x40
  2956. ;    cmp eax,6
  2957. ;    je .mouse
  2958.     cmp eax,3
  2959.     je .but
  2960.     cmp  eax, 2
  2961. ;    jne  .read_done
  2962.     jne .waitev
  2963.     int  0x40
  2964.     shr  eax, 8
  2965.  
  2966.     cmp  al, 13     ; enter
  2967.     je   .read_done
  2968.     cmp al,27
  2969.     je goto_string.leave
  2970.     cmp  al, 8      ; backspace
  2971.     jnz  .nobsl
  2972.  
  2973. xor edx,edx
  2974.  
  2975. mov eax,[num_goto_string]
  2976. mov ebx,dword 10
  2977. div ebx
  2978. mov [num_goto_string],eax
  2979. call print_text2
  2980. jmp .waitev
  2981.  
  2982. ;.mouse:
  2983. ;mov eax,37
  2984. ;mov ebx,2
  2985. ;int 0x40
  2986. ;cmp eax,2
  2987. ;je goto_string.leave
  2988. ;jmp .waitev
  2989.  
  2990. .but:
  2991. mov eax,17
  2992. int 0x40
  2993. cmp ah,94
  2994. je goto_string.leave
  2995. cmp ah,93
  2996. je .read_done
  2997. jmp .waitev
  2998.  
  2999.  
  3000.   .nobsl:
  3001. xor ecx,ecx
  3002. xor edx,edx
  3003.  
  3004. sub al,48
  3005. mov cl,al
  3006.  
  3007. mov eax,[num_goto_string]
  3008. cmp eax,99999
  3009. ja .read_done
  3010. mov ebx,10
  3011. mul ebx
  3012. add eax,ecx
  3013. mov [num_goto_string],eax
  3014.  
  3015. call print_text2
  3016. jmp .waitev
  3017.  
  3018.   .read_done:
  3019. mov eax,[num_goto_string]
  3020. dec eax
  3021. mov [num_goto_string],eax
  3022.     call print_text2
  3023.     ret
  3024.  
  3025.  
  3026. print_text2:
  3027.  
  3028.     pusha
  3029.  
  3030.     mov  eax,13
  3031.     mov  ebx,110*65536+40
  3032.     mov  ecx,90*65536+12;[ya]
  3033.     mov  edx,[sc.work]
  3034.     int  0x40
  3035.  
  3036. outcount [num_goto_string],112,92,cl_Black,6*65536
  3037.     popa
  3038.  
  3039.     ret
  3040.  
  3041. ;******************************************************************************
  3042. calc_scroll_size_and_pos:
  3043.  
  3044. ;cmp [menu_is_on],0
  3045. ;je ._ff
  3046. ;call drawwindow
  3047. ;mov [menu_is_on],0
  3048. ;._ff:
  3049.  
  3050. cmp [lines],30
  3051. jbe .lines_less_30
  3052.  
  3053. xor edx,edx
  3054. mov eax,[post]
  3055. mov ebx,80
  3056. div ebx
  3057. add eax,[posy]
  3058. ;add eax,[slines]
  3059.  
  3060. ;checking for bug
  3061. mov ebx,[lines]
  3062. sub ebx,30
  3063.  
  3064. cmp eax,ebx
  3065. ja .f
  3066. mov [VScroll_1+16],eax
  3067. jmp .ff
  3068. .f:
  3069. mov [VScroll_1+16],ebx
  3070.  
  3071. .ff:
  3072. ;---------------------
  3073. mov eax,[lines]
  3074. sub eax,30       ;---max=lines-30
  3075. mov [VScroll_1+12],eax
  3076. jmp .leave
  3077.  
  3078. .lines_less_30:
  3079.  
  3080. mov [VScroll_1+16],dword 0
  3081. mov [VScroll_1+12],dword 1
  3082.  
  3083. .leave:
  3084.  
  3085. ret
  3086. ;============Draw vertical scroll bar=========
  3087. draw_vertical_scroll:
  3088. call calc_scroll_size_and_pos
  3089. ;========================
  3090.     xor  ecx,ecx                    ;start at top of controls list
  3091. Draw_Controls_Loop:                 ;Redraw Controls Loop
  3092.     mov  ebp, [App_Controls+ecx]    ;get controls data location
  3093.     or   ebp,ebp                    ;is this the last control?
  3094.     jz   Draw_Controls_Done         ;
  3095.     call dword [App_Controls+ecx+4] ;call controls draw function
  3096.     add  ecx, 12                    ;get next control
  3097.     jmp  Draw_Controls_Loop         ;loop till done
  3098. Draw_Controls_Done:                 ;all done
  3099. ;========================
  3100.  
  3101. mov eax,38
  3102. mov ebx,488*65536+488
  3103. mov ecx,43*65536+388
  3104. mov edx,0x00000000
  3105. int 0x40
  3106. ret
  3107.  
  3108. mouse_info:
  3109. ;call
  3110.    mov eax, 37            ;get mouse cordinates
  3111.    mov ebx, 1             ;
  3112.    int 0x40               ;
  3113.    mov ecx, eax           ;
  3114.    push ecx               ;
  3115.    mov eax, 37            ;get mouse buttons
  3116.    mov ebx, 2             ;
  3117.    int 0x40               ;
  3118. ;------------------
  3119. ; if menu is on - then we need to redraw window before continue
  3120. cmp eax,1
  3121. jne ._f1
  3122.  
  3123. pusha
  3124. cmp [menu_is_on],0
  3125. je ._ff
  3126. call drawwindow
  3127. mov [menu_is_on],0
  3128. ._ff:
  3129. popa
  3130.  
  3131. ._f1:
  3132. ;------------------
  3133.    cmp [mouseb], eax      ;compare old mouse states to new states
  3134.    jne redraw_mouse_info  ;
  3135.    cmp [mousey], cx       ;
  3136.    jne redraw_mouse_info  ;
  3137.    shr ecx, 16            ;
  3138.    cmp [mousex], cx       ;
  3139.    jne redraw_mouse_info  ;
  3140.    pop ecx                ;
  3141. ret                       ;return if no change in states
  3142. redraw_mouse_info:
  3143.    pop   ecx