Subversion Repositories Kolibri OS

Rev

Rev 9127 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; ”㭪樨 à ¡®âë á ª®­á®«ìî ¤«ï ¯à®£à ¬¬ Š®«¨¡à¨Ž‘
  2. ; diamond, 2006-2008
  3.  
  4.  
  5. format MS COFF
  6.  
  7. public EXPORTS
  8.  
  9. section '.flat' code readable align 16
  10. include 'font.inc'
  11. include 'conscrl.inc'
  12.  
  13. struc process_info
  14. {
  15.   .cpu_usage              dd ?  ; +0
  16.   .window_stack_position  dw ?  ; +4
  17.   .window_stack_value     dw ?  ; +6
  18.                           dw ?  ; +8
  19.   .process_name           rb 12 ; +10
  20.   .memory_start           dd ?  ; +22
  21.   .used_memory            dd ?  ; +26
  22.   .PID                    dd ?  ; +30
  23.   .box.x                  dd ?  ; +34
  24.   .box.y                  dd ?  ; +38
  25.   .box.width              dd ?  ; +42
  26.   .box.height             dd ?  ; +46
  27.   .slot_state             dw ?  ; +50
  28.                           dw ?  ; +52
  29.   .client_box.x           dd ?  ; +54
  30.   .client_box.y           dd ?  ; +58
  31.   .client_box.width       dd ?  ; +62
  32.   .client_box.height      dd ?  ; +66
  33.   .wnd_state              db ?  ; +70
  34.   rb (1024-71)
  35. }
  36.  
  37. OP_EXIT         = 1
  38. OP_SET_TITLE    = 2
  39. OP_REDRAW       = 3
  40. OP_GETCH        = 4
  41. OP_RESIZE       = 5
  42.  
  43. ;void __stdcall START(dword state);
  44. START:
  45. ; N.B. The current kernel implementation does not require
  46. ;      evident heap initialization, because if DLL is loaded, heap is already initialized
  47. ;      (if heap was not initialized, loader does this implicitly).
  48. ;      So this action does nothing useful, but nothing harmful.
  49.         push    ebx
  50.         push    68
  51.         pop     eax
  52.         push    11
  53.         pop     ebx
  54.         int     0x40
  55.         pop     ebx
  56.         or      eax, -1
  57.         ret     4
  58.  
  59. ; ˆ­¨æ¨ «¨§ æ¨ï ª®­á®«¨
  60. ; void __stdcall con_init(dword wnd_width, dword wnd_height,
  61. ;       dword scr_width, dword scr_height, const char* title);
  62.  
  63. align 4
  64. con_init:
  65.  
  66.         pop     eax
  67.         pop     [con.wnd_width]
  68.         pop     [con.wnd_height]
  69.         pop     [con.main_scr_width]
  70.         pop     [con.main_scr_height]
  71.         pop     [con.title]
  72.         push    eax
  73.  
  74.         push    ebx
  75.  
  76.         mov     [con.init_cmd],1
  77.  
  78.         mov     ecx, 4
  79.         mov     eax, con.wnd_width
  80.         mov     edx, con.def_wnd_width
  81.   .1:
  82.         cmp     dword [eax], -1
  83.         jnz     @f
  84.         mov     ebx, [edx]
  85.         mov     [eax], ebx
  86.   @@:
  87.         add     eax, 4
  88.         add     edx, 4
  89.         loop    .1
  90.  
  91. ; Allocate memory for console data & bitmap data
  92. ; First, calculate required amount of bytes
  93.  
  94. ; Main buffer
  95.         mov     eax, [con.main_scr_width]
  96.         mul     [con.main_scr_height]
  97. ;       2 bytes per on-screen character (1 flags and 1 ascii)
  98.         lea     ecx, [eax+eax]
  99.  
  100. ; Alternate buffer
  101.         mov     [con.altbuffer], ecx
  102.         mov     eax, [con.wnd_width]
  103.         mul     [con.wnd_height]
  104. ;       2 bytes per on-screen character (1 flags and 1 ascii)
  105.         lea     ecx, [ecx+2*eax]
  106.  
  107. ; Bitmap data
  108.         mov     eax, [con.wnd_width]
  109.         mul     [con.wnd_height]
  110.         imul    eax, font_width*font_height
  111.         mov     ebx, eax
  112.         push    ebx ecx
  113.         add     ecx, eax
  114.  
  115. ; malloc
  116.         push    68
  117.         pop     eax
  118.         push    12
  119.         pop     ebx
  120.         int     0x40
  121.         pop     ecx ebx
  122.         mov     edx, con.nomem_err
  123.         test    eax, eax
  124.         jz      .fatal
  125.  
  126. ; Set pointers to the buffers
  127.         mov     [con.mainbuffer], eax
  128.         add     [con.altbuffer], eax
  129.  
  130. ; Set active buffer pointer and dimensions
  131.         mov     [con.data], eax
  132.  
  133.         push    [con.main_scr_width]
  134.         pop     [con.scr_width]
  135.  
  136.         push    [con.main_scr_height]
  137.         pop     [con.scr_height]
  138.  
  139. ; Clear text buffers
  140.         push    edi
  141.         mov     edi, eax
  142.         shr     ecx, 1
  143.         mov     ax, 0x0720
  144.         rep     stosw
  145.  
  146. ; Clear bitmap buffer
  147.         mov     ecx, ebx
  148.         mov     [con.image], edi
  149.         xor     eax, eax
  150.         rep     stosb
  151.         pop     edi
  152.         and     byte [con_flags+1], not 2
  153.  
  154. ; create console thread
  155.         push    51
  156.         pop     eax
  157.         xor     ebx, ebx
  158.         inc     ebx
  159.         mov     ecx, con.thread
  160.         mov     edx, con.stack_top
  161.         int     0x40
  162.         mov     edx, con.thread_err
  163.         test    eax, eax
  164.         js      .fatal
  165.         mov     [con.console_tid], eax
  166.         pop     ebx
  167.         ret
  168.  
  169.   .fatal:
  170. ; output string to debug board and die
  171.         mov     cl, [edx]
  172.         test    cl, cl
  173.         jz      @f
  174.         push    63
  175.         pop     eax
  176.         xor     ebx, ebx
  177.         inc     ebx
  178.         int     0x40
  179.         inc     edx
  180.         jmp     .fatal
  181.   @@:
  182.         or      eax, -1
  183.         int     0x40
  184.  
  185. ; dword __stdcall con_get_flags(void);
  186. con_get_flags:
  187.         mov     eax, [con_flags]
  188.         ret
  189.  
  190. ; dword __stdcall con_set_flags(dword flags);
  191. con_set_flags:
  192.         mov     eax, [esp+4]
  193.         and     ah, not 2
  194.         xchg    eax, [con_flags]
  195.         ret     4
  196.  
  197. ; dword __stdcall con_get_font_height(void);
  198. con_get_font_height:
  199.         mov     eax, font_height
  200.         ret
  201.  
  202. ; int __stdcall con_get_cursor_height(void);
  203. con_get_cursor_height:
  204.         mov     eax, [con.cursor_height]
  205.         ret
  206.  
  207. ; int __stdcall con_set_cursor_height(int new_height);
  208. con_set_cursor_height:
  209.         mov     eax, [esp+4]
  210.         cmp     eax, font_height
  211.         jae     @f
  212.         xchg    eax, [con.cursor_height]
  213.         ret     4
  214.   @@:
  215.         mov     eax, [con.cursor_height]
  216.         ret     4
  217.  
  218. con_init_check:
  219.         mov     ah, [con.init_cmd]
  220.         test    ah, ah
  221.         jne     .yes
  222.  
  223.         push    con.title_init_console
  224.         push    -1
  225.         push    -1
  226.         push    -1
  227.         push    -1
  228.  
  229.         call    con_init
  230.   .yes:
  231.         ret
  232.  
  233. ; void __stdcall con_write_asciiz(const char* string);
  234. con_write_asciiz:
  235.  
  236.         call    con_init_check
  237.  
  238.         push    ebx esi
  239.         or      ebx, -1
  240.         mov     esi, [esp+12]
  241.         call    con.write
  242.         pop     esi ebx
  243.         ret     4
  244.  
  245. ; void __stdcall con_write_string(const char* string, dword length);
  246. con_write_length:
  247.  
  248.         push    ebx esi
  249.         mov     esi, [esp+12]
  250.         mov     ebx, [esp+16]
  251.         call    con.write
  252.         pop     esi ebx
  253.         ret     8
  254.  
  255. ; Š ¦¤ë© ᨬ¢®« ª« áá¨ä¨æ¨àã¥âáï ª ª ®¤¨­ ¨§
  256. con.printfc.normal = 0   ; ­®à¬ «ì­ë© ᨬ¢®«
  257. con.printfc.percent = 1  ; '%'
  258. con.printfc.dot = 2      ; '.'
  259. con.printfc.asterisk = 3 ; '*'
  260. con.printfc.zero = 4     ; '0'
  261. con.printfc.digit = 5    ; ­¥­ã«¥¢ ï æ¨äà 
  262. con.printfc.plus = 6     ; '+'
  263. con.printfc.minus = 7    ; '-'
  264. con.printfc.sharp = 8    ; '#'
  265. con.printfc.space = 9    ; ' '
  266. con.printfc.long = 10    ; 'l' for 'long'
  267. con.printfc.short = 11   ; 'h' for 'short'
  268. con.printfc.dec = 12     ; 'd' = print decimal
  269. con.printfc.oct = 13     ; 'o' = print octal
  270. con.printfc.unsigned = 14 ; 'u' = print unsigned decimal
  271. con.printfc.hex = 15     ; 'x' = print hexadecimal
  272. con.printfc.pointer = 16 ; 'p' = print pointer
  273. con.printfc.char = 17    ; 'c' = print char
  274. con.printfc.string = 18  ; 's' = print string
  275.  
  276. macro set char,type
  277. {store byte con.printfc.#type at con.charcodes + char - ' '}
  278.  
  279. con.charcodes:
  280. times 'x'-' '+1         db      con.printfc.normal
  281.         set     '%', percent
  282.         set     '.', dot
  283.         set     '*', asterisk
  284.         set     '0', zero
  285.         set     '1', digit
  286.         set     '2', digit
  287.         set     '3', digit
  288.         set     '4', digit
  289.         set     '5', digit
  290.         set     '6', digit
  291.         set     '7', digit
  292.         set     '8', digit
  293.         set     '9', digit
  294.         set     ' ', space
  295.         set     '#', sharp
  296.         set     '+', plus
  297.         set     '-', minus
  298.         set     'X', hex
  299.         set     'x', hex
  300.         set     'c', char
  301.         set     'd', dec
  302.         set     'h', short
  303.         set     'i', dec
  304.         set     'l', long
  305.         set     'o', oct
  306.         set     'p', pointer
  307.         set     's', string
  308.         set     'u', unsigned
  309. purge set
  310. align 4
  311. con.charjump:
  312.         dd      con_printf.normal
  313.         dd      con_printf.percent
  314.         dd      con_printf.dot
  315.         dd      con_printf.asterisk
  316.         dd      con_printf.zero
  317.         dd      con_printf.digit
  318.         dd      con_printf.plus
  319.         dd      con_printf.minus
  320.         dd      con_printf.sharp
  321.         dd      con_printf.space
  322.         dd      con_printf.long
  323.         dd      con_printf.short
  324.         dd      con_printf.dec
  325.         dd      con_printf.oct
  326.         dd      con_printf.unsigned
  327.         dd      con_printf.hex
  328.         dd      con_printf.pointer
  329.         dd      con_printf.char
  330.         dd      con_printf.string
  331.  
  332. ; int __cdecl con_printf(const char* format, ...)
  333. con_printf:
  334.  
  335.         call    con_init_check
  336.  
  337.         xor     eax, eax
  338.         pushad
  339.         call    con.get_data_ptr
  340.         lea     ebp, [esp+20h+8]
  341.         mov     esi, [ebp-4]
  342.         sub     esp, 64         ; reserve space for buffer
  343.   .loop:
  344.         xor     eax, eax
  345.         lodsb
  346.         test    al, al
  347.         jz      .done
  348.         cmp     al, '%'
  349.         jz      .spec_begin
  350.   .normal:
  351.         call    con.write_char_ex
  352.         inc     dword [esp+64+28]
  353.         jmp     .loop
  354.   .errspec:
  355.   .percent:
  356.         add     esp, 12
  357.         jmp     .normal
  358.   .spec_begin:
  359.         xor     ebx, ebx
  360. ; bl = ⨯ ¯®§¨æ¨¨:
  361. ; 0 = ­ ç «®
  362. ; 1 = ¯à®ç¨â ­ ¢¥¤ã騩 0 ¢ ᯥæ¨ä¨ª æ¨¨ ä®à¬ â 
  363. ; 2 = ç¨â ¥¬ ¯®«¥ è¨à¨­ë
  364. ; 3 = ç¨â ¥¬ ¯®«¥ â®ç­®áâ¨
  365. ; 4 = ¯à®ç¨â ­® ¯®«¥ à §¬¥à   à£ã¬¥­â 
  366. ; 5 = ç¨â ¥¬ ¯®«¥ ⨯ 
  367. ; bh = ä« £¨:
  368. ; 1 = ä« £ '#', ¢ë¢®¤¨âì 0/0x/0X
  369. ; 2 = ä« £ '-', ¢ëà ¢­¨¢ ­¨¥ ¢«¥¢®
  370. ; 4 = ä« £ '0', ¤®¯®«­¥­¨¥ ­ã«ï¬¨
  371. ; 8 = ä« £ 'h', ª®à®âª¨©  à£ã¬¥­â
  372.         push    -1
  373. ; dword [esp+8] = precision
  374.         push    -1
  375. ; dword [esp+4] = width
  376.         push    0
  377. ; byte [esp] = ä« £ 0/'+'/' '
  378.   .spec:
  379.         xor     eax, eax
  380.         lodsb
  381.         test    al, al
  382.         jz      .done
  383.         cmp     al, ' '
  384.         jb      .normal
  385.         cmp     al, 'x'
  386.         ja      .normal
  387.         movzx   ecx, byte [con.charcodes + eax - ' ']
  388.         jmp     dword[con.charjump + ecx*4]
  389.  
  390.   .sharp:
  391.         test    bl, bl
  392.         jnz     .errspec
  393.         or      bh, 1
  394.         jmp     .spec
  395.   .minus:
  396.         test    bl, bl
  397.         jnz     .errspec
  398.         or      bh, 2
  399.         jmp     .spec
  400.   .plus:
  401.   .space:
  402.         test    bl, bl
  403.         jnz     .errspec
  404.         cmp     byte [esp], '+'
  405.         jz      .spec
  406.         mov     byte [esp], al
  407.         jmp     .spec
  408.   .zero:
  409.         test    bl, bl
  410.         jnz     .digit
  411.         test    bh, 2
  412.         jnz     .spec
  413.         or      bh, 4
  414.         inc     ebx
  415.         jmp     .spec
  416.   .digit:
  417.         sub     al, '0'
  418.         cmp     bl, 2
  419.         ja      .precision
  420.         mov     bl, 2
  421.         xchg    eax, [esp+4]
  422.         test    eax, eax
  423.         js      .spec
  424.         lea     eax, [eax*5]
  425.         add     eax, eax
  426.         add     [esp+4], eax
  427.         jmp     .spec
  428.   .precision:
  429.         cmp     bl, 3
  430.         jnz     .errspec
  431.         xchg    eax, [esp+8]
  432.         lea     eax, [eax*5]
  433.         add     eax, eax
  434.         add     [esp+8], eax
  435.         jmp     .spec
  436.   .asterisk:
  437.         mov     eax, [ebp]
  438.         add     ebp, 4
  439.         cmp     bl, 2
  440.         ja      .asterisk_precision
  441.         test    eax, eax
  442.         jns     @f
  443.         neg     eax
  444.         or      bh, 2
  445.   @@:
  446.         mov     [esp+4], eax
  447.         mov     bl, 3
  448.         jmp     .spec
  449.   .asterisk_precision:
  450.         cmp     bl, 3
  451.         jnz     .errspec
  452.         mov     [esp+8], eax
  453.         inc     ebx
  454.         jmp     .spec
  455.   .dot:
  456.         cmp     bl, 2
  457.         ja      .errspec
  458.         mov     bl, 3
  459.         and     dword [esp+8], 0
  460.         jmp     .spec
  461.   .long:
  462.         cmp     bl, 3
  463.         ja      .errspec
  464.         mov     bl, 4
  465.         jmp     .spec
  466.   .short:
  467.         cmp     bl, 3
  468.         ja      .errspec
  469.         mov     bl, 4
  470.         or      bh, 8
  471.         jmp     .spec
  472.   .unsigned:
  473.   .dec:
  474.         push    10
  475.         jmp     .write_number
  476.   .pointer:
  477.         mov     dword [esp+12], 8
  478.         or      bh, 4
  479.         and     bh, not 8
  480.   .hex:
  481.         push    16
  482.         jmp     @f
  483.   .oct:
  484.         push    8
  485.   @@:
  486.         mov     byte [esp+4], 0
  487.   .write_number:
  488.         pop     ecx
  489.         push    edi
  490.         lea     edi, [esp+16+64-1]      ; edi -> end of buffer
  491.         mov     byte [edi], 0
  492.         push    edx
  493.         push    eax
  494.         mov     eax, [ebp]
  495.         add     ebp, 4
  496.         test    bh, 8
  497.         jz      @f
  498.         movzx   eax, ax
  499.         cmp     byte [esp], 'd'
  500.         jnz     @f
  501.         movsx   eax, ax
  502.   @@:
  503.         xor     edx, edx
  504.         test    eax, eax
  505.         jns     @f
  506.         cmp     byte [esp], 'd'
  507.         jnz     @f
  508.         inc     edx
  509.         neg     eax
  510.   @@:
  511.         push    edx
  512.         xor     edx, edx
  513. ; ç¨á«® ¢ eax, ®á­®¢ ­¨¥ á¨á⥬ë áç¨á«¥­¨ï ¢ ecx
  514.   @@:
  515.         cmp     dword [esp+16+8], 0
  516.         jnz     .print_num
  517.         test    eax, eax
  518.         jz      .zeronum
  519.   .print_num:
  520.         div     ecx
  521.         xchg    eax, edx
  522.         cmp     al, 10
  523.         sbb     al, 69h
  524.         das
  525.         cmp     byte [esp+4], 'x'
  526.         jnz     @f
  527.         or      al, 20h
  528.   @@:
  529.         dec     edi
  530.         mov     [edi], al
  531.         xor     eax, eax
  532.         xchg    eax, edx
  533.         test    eax, eax
  534.         jnz     .print_num
  535.   .zeronum:
  536.         push    0
  537.         mov     edx, [esp+12]
  538.         lea     eax, [esp+32+64-1]
  539.         sub     eax, edi
  540.         cmp     dword [esp+20+8], -1
  541.         jz      .noprec1
  542.         cmp     eax, [esp+20+8]
  543.         jae     .len_found1
  544.         mov     eax, [esp+20+8]
  545.         jmp     .len_found1
  546.   .noprec1:
  547.         test    bh, 4
  548.         jnz     .do_print_num
  549.   .len_found1:
  550.         test    bh, 2
  551.         jnz     .do_print_num
  552.         cmp     byte [esp+20], 0
  553.         jz      @f
  554.         inc     eax
  555.   @@:
  556.         cmp     byte [esp+20], 0
  557.         jnz     @f
  558.         cmp     byte [esp+4], 0
  559.         jz      @f
  560.         inc     eax
  561.   @@:
  562.         test    bh, 1
  563.         jz      .nosharp1
  564.         cmp     cl, 8
  565.         jnz     @f
  566.         inc     eax
  567.         jmp     .nosharp1
  568.   @@:
  569.         cmp     cl, 16
  570.         jnz     .nosharp1
  571.         inc     eax
  572.         inc     eax
  573.   .nosharp1:
  574.         cmp     dword [esp+20+4], -1
  575.         jz      .do_print_num
  576.         sub     eax, [esp+20+4]
  577.         jae     .do_print_num
  578.         push    ecx
  579.         mov     ecx, eax
  580.         mov     al, ' '
  581.   @@:
  582.         xchg    edi, [esp+20]
  583.         call    con.write_char_ex
  584.         inc     dword [esp+24+12+64+28]
  585.         xchg    edi, [esp+20]
  586.         inc     dword [esp+4]
  587.         inc     ecx
  588.         jnz     @b
  589.         pop     ecx
  590.   .do_print_num:
  591.         mov     al, '-'
  592.         cmp     byte [esp+4], 0
  593.         jnz     .write_sign
  594.         mov     al, [esp+20]
  595.         test    al, al
  596.         jz      .sign_written
  597.   .write_sign:
  598.         call    .num_write_char
  599.   .sign_written:
  600.         test    bh, 1
  601.         jz      .nosharp2
  602.         mov     al, '0'
  603.         cmp     cl, 8
  604.         jz      @f
  605.         cmp     cl, 16
  606.         jnz     .nosharp2
  607.         call    .num_write_char
  608.         mov     al, [esp+8]
  609.   @@:
  610.         call    .num_write_char
  611.   .nosharp2:
  612.         lea     ecx, [esp+32+64-1]
  613.         sub     ecx, edi
  614.         cmp     dword [esp+20+8], -1
  615.         jz      .noprec2
  616.         sub     ecx, [esp+20+8]
  617.         jmp     .lead_zeroes
  618.   .noprec2:
  619.         test    bh, 4
  620.         jz      .do_print_num2
  621.         add     ecx, [esp]
  622.         sub     ecx, [esp+20+4]
  623.   .lead_zeroes:
  624.         jae     .do_print_num2
  625.   @@:
  626.         mov     al, '0'
  627.         call    .num_write_char
  628.         inc     ecx
  629.         jnz     @b
  630.   .do_print_num2:
  631.         mov     al, [edi]
  632.         test    al, al
  633.         jz      .num_written
  634.         call    .num_write_char
  635.         inc     edi
  636.         jmp     .do_print_num2
  637.   .num_written:
  638.         pop     ecx
  639.         mov     edi, [esp+12]
  640.         cmp     dword [esp+16+4], -1
  641.         jz      .num_written2
  642.   @@:
  643.         cmp     ecx, [esp+16+4]
  644.         jae     .num_written2
  645.         mov     al, ' '
  646.         call    con.write_char
  647.         inc     ecx
  648.         jmp     @b
  649.   .num_written2:
  650.         add     esp, 16
  651.   .spec_done:
  652.         add     esp, 12
  653.         jmp     .loop
  654.   .char:
  655.         mov     ecx, [esp+4]
  656.         cmp     ecx, -1
  657.         jnz     @f
  658.         inc     ecx
  659.   @@:
  660.         test    ecx, ecx
  661.         jnz     @f
  662.         inc     ecx
  663.   @@:
  664.         test    bh, 2
  665.         jnz     .char_left_pad
  666.         mov     al, ' '
  667.         dec     ecx
  668.         jz      .nowidth
  669.         add     [esp+12+64+28], ecx
  670.   @@:
  671.         call    con.write_char
  672.         loop    @b
  673.   .nowidth:
  674.         mov     al, [ebp]
  675.         add     ebp, 4
  676.         jmp     .percent
  677.   .char_left_pad:
  678.         mov     al, [ebp]
  679.         add     ebp, 4
  680.         call    con.write_char_ex
  681.         add     [esp+12+64+28], ecx
  682.         dec     ecx
  683.         jz      .nowidth2
  684.         mov     al, ' '
  685.   @@:
  686.         call    con.write_char
  687.         loop    @b
  688.   .nowidth2:
  689.         jmp     .spec_done
  690.   .string:
  691.         push    esi
  692.         mov     esi, [ebp]
  693.         test    esi, esi
  694.         jnz     @f
  695.         mov     esi, con.aNull
  696.   @@:
  697.         add     ebp, 4
  698.         or      ecx, -1
  699.   @@:
  700.         inc     ecx
  701.         cmp     byte [esi+ecx], 0
  702.         jnz     @b
  703.         cmp     ecx, [esp+12]
  704.         jb      @f
  705.         mov     ecx, [esp+12]
  706.   @@:
  707.         test    bh, 2
  708.         jnz     .write_string
  709.         cmp     dword [esp+8], -1
  710.         jz      .write_string
  711.         push    ecx
  712.         sub     ecx, [esp+12]
  713.         jae     .nospace
  714.         mov     al, ' '
  715.   @@:
  716.         call    con.write_char
  717.         inc     dword [esp+20+64+28]
  718.         inc     ecx
  719.         jnz     @b
  720.   .nospace:
  721.         pop     ecx
  722.   .write_string:
  723.         jecxz   .string_written
  724.         add     dword [esp+16+64+28], ecx
  725.         push    ecx
  726.   @@:
  727.         lodsb
  728.         call    con.write_char_ex
  729.         loop    @b
  730.         pop     ecx
  731.   .string_written:
  732.         pop     esi
  733.         test    bh, 2
  734.         jz      .spec_done
  735.         cmp     dword [esp+4], -1
  736.         jz      .spec_done
  737.         sub     ecx, [esp+4]
  738.         jae     .spec_done
  739.         mov     al, ' '
  740.   @@:
  741.         call    con.write_char
  742.         inc     dword [esp+12+64+28]
  743.         inc     ecx
  744.         jnz     @b
  745.         jmp     .spec_done
  746.   .done:
  747.         add     esp, 64
  748.         popad
  749.         jmp     con.update_screen
  750.   .num_write_char:
  751.         xchg    edi, [esp+20]
  752.         call    con.write_char_ex
  753.         inc     dword [esp+24+12+64+28]
  754.         xchg    edi, [esp+20]
  755.         inc     dword [esp+4]
  756.         ret
  757.  
  758. con.write:
  759. ; esi = string, ebx = length (ebx=-1 for ASCIIZ strings)
  760.         push    edi
  761.         call    con.get_data_ptr
  762.         test    ebx, ebx
  763.         jz      .done
  764.   .loop:
  765.         lodsb
  766.         cmp     ebx, -1
  767.         jnz     @f
  768.         test    al, al
  769.         jz      .done
  770.   @@:
  771.         call    con.write_char_ex
  772.   .next:
  773.         cmp     ebx, -1
  774.         jz      .loop
  775.         dec     ebx
  776.         jnz     .loop
  777.   .done:
  778.         pop     edi
  779.         jmp     con.update_screen
  780.  
  781. con.get_data_ptr:
  782.         mov     edi, [con.cur_y]
  783.         imul    edi, [con.scr_width]
  784.         add     edi, [con.cur_x]
  785.         add     edi, edi
  786.         add     edi, [con.data]
  787.         ret
  788.  
  789. con.write_char_ex:
  790.         test    byte [con_flags+1], 1
  791.         jz      con.write_special_char
  792.  
  793. con.write_char:
  794.         push    eax
  795.  
  796.         mov     eax, [con.cur_x]
  797.         cmp     eax, [con.scr_width]
  798.         jb      @f
  799.         and     [con.cur_x], 0
  800.         call    con.newline
  801.   @@:
  802.         mov     eax, [esp]
  803.         stosb
  804.         mov     al, byte [con_flags]
  805.         stosb
  806.  
  807.         mov     eax, [con.cur_x]
  808.         inc     eax
  809.         mov     [con.cur_x], eax
  810.  
  811.         pop     eax
  812.         ret
  813.  
  814. con.write_special_char:
  815.         cmp     [con_esc], 0
  816.         jnz     .esc_mode
  817.   .normal_mode:
  818.         cmp     al, 10
  819.         jz      .write_lf
  820.         cmp     al, 13
  821.         jz      .write_cr
  822.         cmp     al, 27
  823.         jz      .write_esc
  824.         cmp     al, 8
  825.         jz      .write_bs
  826.         cmp     al, 7
  827.         jz      .bell
  828.         cmp     al, 9
  829.         jnz     con.write_char
  830.   .write_tab:
  831.         mov     al, ' '
  832.         call    con.write_char
  833.         test    [con.cur_x], 7
  834.         jnz     .write_tab
  835.         ret
  836.   .write_cr:
  837.         and     [con.cur_x], 0
  838.         jmp     con.get_data_ptr
  839.   .write_lf:
  840.         and     [con.cur_x], 0
  841.         jmp     con.newline
  842.   .write_bs:
  843.         cmp     [con.cur_x], 0
  844.         jz      @f
  845.         dec     [con.cur_x]
  846.         dec     edi
  847.         dec     edi
  848.         ret
  849.   @@:
  850.         push    eax
  851.         mov     eax, [con.cur_y]
  852.         dec     eax
  853.         js      @f
  854.         mov     [con.cur_y], eax
  855.         mov     eax, [con.scr_width]
  856.         dec     eax
  857.         mov     [con.cur_x], eax
  858.         dec     edi
  859.         dec     edi
  860.   @@:
  861.         pop     eax
  862.         ret
  863.   .bell:
  864.         pusha
  865.         push    55
  866.         pop     eax
  867.         mov     ebx, eax
  868.         mov     esi, con.bell
  869.         int     0x40
  870.         popa
  871.         ret
  872.   .write_esc:
  873.         mov     [con_esc], 1
  874.         mov     [con_esc_attr_n], 1
  875.         and     [con_esc_attrs], 0
  876.         ret
  877.  
  878.   .esc_mode:
  879.         cmp     [con_sci], 0
  880.         jnz     .esc_sci
  881.         cmp     al, '['         ; CSI - Control Sequence Introducer
  882.         je      .esc_sqro
  883.         cmp     al, ']'         ; OSC - Operating System Command
  884.         je      .esc_sqrc
  885.         cmp     al, '('         ; Designate G0 Character Set, VT100, ISO 2022.
  886.         je      .esc_rndo
  887.         cmp     al, '>'         ; Normal Keypad (DECKPNM), VT100.
  888.         je      .keypm_norm
  889.         cmp     al, '='         ; Application Keypad (DECKPAM).
  890.         je      .keypm_alt
  891. ; Control characters
  892.         cmp     al, 'G'
  893.         je      .bell
  894.         cmp     al, 'H'
  895.         je      .write_bs
  896.         cmp     al, 'I'
  897.         je      .write_tab
  898.         cmp     al, 'J'
  899.         je      .write_lf
  900.         cmp     al, 'M'
  901.         je      .write_cr
  902. ; Unrecognized escape sequence, print it to screen
  903.         push    eax
  904.         mov     al, 27
  905.         call    con.write_char
  906.         pop     eax
  907.         jmp     con.write_char
  908.  
  909.   .esc_sqro:
  910.         mov     [con_sci], 1
  911.         ret
  912.   .esc_sqrc:
  913.         mov     [con_sci], 2
  914.         ret
  915.   .esc_rndo:
  916.         mov     [con_sci], 4
  917.         ret
  918.  
  919. .keypm_norm:
  920. ; TODO: turn numlock on
  921.         mov     [con_esc], 0
  922.         ret
  923.  
  924. .keypm_alt:
  925. ; TODO: turn numlock off
  926.         mov     [con_esc], 0
  927.         ret
  928.  
  929. .esc_sci:
  930.         cmp     [con_sci], 3
  931.         je      .string
  932.         cmp     [con_sci], 4
  933.         je      .g0charset
  934. ; this is real Esc sequence
  935.         cmp     al, '?'         ; DEC private mode (DECSET/DECRST sequences)
  936.         je      .questionmark
  937.         cmp     al, ';'
  938.         jz      .next_arg
  939.         cmp     al, '0'
  940.         jb      .not_digit
  941.         cmp     al, '9'
  942.         ja      .not_digit
  943.         push    eax ecx edx
  944.         sub     al, '0'
  945.         movzx   eax, al
  946.         mov     ecx, [con_esc_attr_n]
  947.         mov     edx, [con_esc_attrs+(ecx-1)*4]
  948.         lea     edx, [edx*5]
  949.         lea     edx, [edx*2+eax]
  950.         mov     [con_esc_attrs+(ecx-1)*4], edx
  951.         pop     edx ecx eax
  952.         ret
  953. .g0charset:
  954. ; Designate G0 Character Set
  955. ; Unimplemented: read and ignore.
  956.         mov     [con_sci], 0
  957.         mov     [con_esc], 0
  958.         ret
  959. .string:
  960.         cmp     al, 0x07        ; bell
  961.         je      .string_end
  962.         cmp     al, 0x9C        ; string terminator
  963.         je      .string_end
  964.         push    ecx
  965.         mov     ecx, [con_osc_strlen]
  966.         cmp     ecx, 255
  967.         jae     @f
  968.         mov     [con_osc_str+ecx], al
  969.         inc     [con_osc_strlen]
  970. @@:
  971.         pop     ecx
  972.         ret
  973. .string_end:
  974.         mov     [con_sci], 0
  975.         mov     [con_esc], 0
  976.         pusha
  977.         mov     ecx, [con_osc_strlen]
  978.         mov     byte[con_osc_str+ecx], 0
  979.         cmp     [con_esc_attrs+0], 0            ; Set Icon and Window Title
  980.         je      .set_title
  981.         cmp     [con_esc_attrs+0], 2            ; Set Window Title
  982.         je      .set_title
  983.         ret
  984. .set_title:
  985.         push    con_osc_str
  986.         call    con_set_title
  987.         popa
  988.         ret
  989. .questionmark:
  990.         push    ecx
  991.         mov     ecx, [con_esc_attr_n]
  992.         mov     dword[con_esc_attrs+(ecx-1)*4], 0xffffffff
  993.         pop     ecx
  994. .next_arg:
  995.         push    eax
  996.         mov     eax, [con_esc_attr_n]
  997.         inc     eax
  998.         cmp     al, 4
  999.         jbe     @f
  1000.         dec     eax
  1001. @@:
  1002.         mov     [con_esc_attr_n], eax
  1003.         and     [con_esc_attrs+(eax-1)*4], 0
  1004. ; Check for operating system command
  1005.         cmp     [con_sci], 2
  1006.         jne     @f
  1007.         cmp     [con_esc_attr_n], 2
  1008.         jne     @f
  1009. ; Next argument is string
  1010.         mov     [con_sci], 3
  1011.         mov     [con_osc_strlen], 0
  1012. @@:
  1013.         pop     eax
  1014.         ret
  1015. .not_digit:
  1016.         mov     [con_esc], 0
  1017.         mov     [con_sci], 0    ; in any case, leave Esc mode
  1018.  
  1019. ;        cmp     al, '@'
  1020. ;        je      .insert_chars
  1021.         cmp     al, 'A'
  1022.         je      .cursor_up
  1023.         cmp     al, 'B'
  1024.         je      .cursor_down
  1025.         cmp     al, 'C'
  1026.         je      .cursor_right
  1027.         cmp     al, 'D'
  1028.         je      .cursor_left
  1029. ;        cmp     al, 'E'
  1030. ;        je      .cursor_next_line
  1031. ;        cmp     al, 'F'
  1032. ;        je      .cursor_prev_line
  1033. ;        cmp     al, 'G'
  1034. ;        je      .cursor_next_line
  1035. ;        cmp     al, 'S'
  1036. ;        je      .scroll_page_up
  1037. ;        cmp     al, 'T'
  1038. ;        je      .scroll_page_down
  1039.         cmp     al, 'H'
  1040.         je      .cursor_position
  1041.         cmp     al, 'J'
  1042.         je      .erase_in_display
  1043.         cmp     al, 'K'
  1044.         je      .erase_in_line
  1045.         cmp     al, 'L'
  1046.         je      .insert_lines
  1047.         cmp     al, 'M'
  1048.         je      .delete_lines
  1049.         cmp     al, 'P'
  1050.         je      .delete_chars
  1051.         cmp     al, 'X'
  1052.         je      .erase_chars
  1053.  
  1054.         cmp     al, 'd'
  1055.         je      .line_position_abs
  1056. ;        cmp     al, 'e'
  1057. ;        je      .line_position_rel
  1058.         cmp     al, 'f'
  1059.         je      .cursor_position
  1060.         cmp     al, 'h'
  1061.         je      .set_mode
  1062.         cmp     al, 'l'
  1063.         je      .reset_mode
  1064.         cmp     al, 'm'
  1065.         je      .set_attr
  1066.         cmp     al, 'r'
  1067.         je      .scroll_region
  1068. ;        cmp     al, 's'
  1069. ;        je      .save_cursor_pos
  1070. ;        cmp     al, 't'
  1071. ;        je      .window_manip
  1072. ;        cmp     al, 'u'
  1073. ;        je      .restore_cursor_pos
  1074.  
  1075.         ret     ; simply skip unknown sequences
  1076.  
  1077. .insert_lines:
  1078.  
  1079.         push    eax ebx ecx esi
  1080.         mov     eax, [con_esc_attrs+0]  ; amount of lines to scroll down
  1081.         test    eax, eax
  1082.         jnz     @f                      ; default is 1
  1083.         inc     eax
  1084.   @@:
  1085. ; Check that we are inside the scroll region
  1086.         mov     ebx, [con.cur_y]
  1087.         cmp     ebx, [con.scroll_top]
  1088.         jb      .no_insert_lines
  1089.         add     ebx, eax
  1090.         cmp     ebx, [con.scroll_bot]
  1091.         ja      .no_insert_lines
  1092. ; Move cursor to the left
  1093.         mov     [con.cur_x], 0
  1094.         call    con.get_data_ptr
  1095. ; Calc amount of chars in requested numer of lines
  1096.         mov     ebx, [con.scr_width]
  1097.         imul    ebx, eax
  1098. ; Move the lines down (in backwards order)
  1099.         push    edi
  1100.         mov     ecx, [con.scroll_bot]
  1101.         sub     ecx, [con.cur_y]
  1102.         sub     ecx, eax
  1103.         imul    ecx, [con.scr_width]
  1104.         lea     esi, [edi + 2*ecx - 2]
  1105.         lea     edi, [esi + 2*ebx]
  1106.         std
  1107.         rep     movsw
  1108.         cld
  1109.         pop     edi
  1110. ; Insert empty lines
  1111.         push    edi
  1112.         mov     ecx, ebx
  1113.         mov     ah, byte[con_flags]
  1114.         mov     al, ' '
  1115.         rep     stosw
  1116.         pop     edi
  1117. .no_insert_lines:
  1118.         pop     esi ecx ebx eax
  1119.         ret
  1120.  
  1121. .delete_lines:
  1122.  
  1123.         push    eax ebx ecx esi
  1124.         mov     eax, [con_esc_attrs+0]  ; amount of lines to scroll up
  1125.         test    eax, eax
  1126.         jnz     @f                      ; default is 1
  1127.         inc     eax
  1128.   @@:
  1129. ; Check that we are inside the scroll region
  1130.         mov     ebx, [con.cur_y]
  1131.         cmp     ebx, [con.scroll_top]
  1132.         jb      .no_delete_lines
  1133.         add     ebx, eax
  1134.         cmp     ebx, [con.scroll_bot]
  1135.         ja      .no_delete_lines
  1136. ; Move cursor to the left
  1137.         mov     [con.cur_x], 0
  1138.         call    con.get_data_ptr
  1139. ; Calc amount of chars in requested numer of lines
  1140.         mov     ebx, [con.scr_width]
  1141.         imul    ebx, eax
  1142. ; Move the lines up
  1143.         mov     ecx, [con.scroll_bot]
  1144.         sub     ecx, [con.cur_y]
  1145.         imul    ecx, [con.scr_width]
  1146.         lea     esi, [edi + 2*ebx]
  1147.         rep     movsw
  1148. ; Set new cursor row position
  1149.         add     [con.cur_y], eax
  1150. ; Add empty lines till end of scroll region
  1151.         push    edi
  1152.         mov     ecx, ebx
  1153.         mov     ah, byte[con_flags]
  1154.         mov     al, ' '
  1155.         rep     stosw
  1156.         pop     edi
  1157. .no_delete_lines:
  1158.         pop     esi ecx ebx eax
  1159.         ret
  1160.  
  1161. .scroll_region:
  1162.         push    eax ebx
  1163.         cmp     [con_esc_attr_n], 2
  1164.         jb      .no_scroll_region
  1165.         mov     eax, [con_esc_attrs+0]  ; top
  1166.         dec     eax
  1167.         js      .no_scroll_region
  1168.         cmp     eax, [con.wnd_height]
  1169.         ja      .no_scroll_region
  1170.  
  1171.         mov     ebx, [con_esc_attrs+4]  ; bottom
  1172.         dec     ebx
  1173.         js      .no_scroll_region
  1174.         cmp     ebx, [con.wnd_height]
  1175.         ja      .no_scroll_region
  1176.  
  1177.         cmp     eax, ebx
  1178.         ja      .no_scroll_region
  1179.  
  1180.         mov     [con.scroll_top], eax
  1181.         mov     [con.scroll_bot], ebx
  1182.  
  1183. .no_scroll_region:
  1184.         pop     ebx eax
  1185.         ret
  1186.  
  1187. .reset_mode:
  1188.         mov     eax, [con_esc_attrs]
  1189.         cmp     eax, 0xffffffff
  1190.         jne     .no_dec_rst
  1191.         mov     eax, [con_esc_attrs+4]
  1192.         cmp     eax, 1
  1193.         je      .dec_rst_app_cursor_keys
  1194. ;        cmp     eax, 7
  1195. ;        je      .dec_rst_wraparound
  1196. ;        cmp     eax, 12
  1197. ;        je      .dec_rst_cursor_blink
  1198.         cmp     eax, 25
  1199.         je      .dec_rst_cursor
  1200. ;        cmp     eax, 1000
  1201. ;        je      .dec_rst_mouse
  1202. ;        cmp     eax, 1002
  1203. ;        je      .dec_rst_buttons
  1204. ;        cmp     eax, 1006
  1205. ;        je      .dec_rst_mouse_sgr
  1206.         cmp     eax, 1049
  1207.         je      .dec_rst_altbuff
  1208. ;        cmp     eax, 2004
  1209. ;        je      .dec_rst_brck_paste
  1210. .no_dec_rst:
  1211. ;        cmp     eax, 2
  1212. ;        je      .rst_keyb_action_mode
  1213. ;        cmp     eax, 4
  1214. ;        je      .set_replace_mode
  1215.         ret
  1216.  
  1217. .set_mode:
  1218.         mov     eax, [con_esc_attrs]
  1219.         cmp     eax, 0xffffffff
  1220.         jne     .no_dec_set
  1221.         mov     eax, [con_esc_attrs+4]
  1222.         cmp     eax, 1
  1223.         je      .dec_set_app_cursor_keys
  1224. ;        cmp     eax, 7
  1225. ;        je      .dec_set_wraparound
  1226. ;        cmp     eax, 12
  1227. ;        je      .dec_set_cursor_blink
  1228.         cmp     eax, 25
  1229.         je      .dec_set_cursor
  1230. ;        cmp     eax, 1000
  1231. ;        je      .dec_set_mouse
  1232. ;        cmp     eax, 1002
  1233. ;        je      .set_buttons
  1234. ;        cmp     eax, 1006
  1235. ;        je      .dec_rst_mouse_sgr
  1236.         cmp     eax, 1049
  1237.         je      .dec_set_altbuff
  1238. ;        cmp     eax, 2004
  1239. ;        je      .dec_set_brck_paste
  1240. .no_dec_set:
  1241. ;        cmp     eax, 2
  1242. ;        je      .set_keyb_action_mode
  1243. ;        cmp     eax, 4
  1244. ;        je      .set_insert_mode
  1245.         ret
  1246.  
  1247. .dec_set_app_cursor_keys:
  1248.         mov     [cursor_esc], 27 + ('O' shl 8)
  1249.         ret
  1250.  
  1251. .dec_rst_app_cursor_keys:
  1252.         mov     [cursor_esc], 27 + ('[' shl 8)
  1253.         ret
  1254.  
  1255. .dec_set_cursor:
  1256.         mov     [con.cursor_height], (15*font_height+50)/100    ; default height
  1257.         ret
  1258.  
  1259. .dec_rst_cursor:
  1260.         mov     [con.cursor_height], 0
  1261.         ret
  1262.  
  1263. .dec_set_altbuff:
  1264. ; Switch buffer
  1265.         push    [con.altbuffer]
  1266.         pop     [con.data]
  1267. ; Set new buffer size
  1268.         push    [con.wnd_width]
  1269.         pop     [con.scr_width]
  1270.         push    [con.wnd_height]
  1271.         pop     [con.scr_height]
  1272. ; Save cursor
  1273.         push    [con.cur_x]
  1274.         pop     [con.main_cur_x]
  1275.         push    [con.cur_y]
  1276.         pop     [con.main_cur_y]
  1277. ; Save window position
  1278.         push    [con.wnd_xpos]
  1279.         pop     [con.main_wnd_xpos]
  1280.         push    [con.wnd_ypos]
  1281.         pop     [con.main_wnd_ypos]
  1282. ; Clear screen
  1283.         mov     edi, [con.altbuffer]
  1284.         mov     eax, [con.wnd_width]
  1285.         mul     [con.wnd_height]
  1286.         mov     ecx, eax
  1287.         mov     ah, byte[con_flags]
  1288.         mov     al, ' '
  1289.         rep     stosw
  1290. ; Reset cursor position
  1291.         mov     [con.cur_x], 0
  1292.         mov     [con.cur_y], 0
  1293. ; Reset window position
  1294.         mov     [con.wnd_xpos], 0
  1295.         mov     [con.wnd_ypos], 0
  1296. ; Get new data ptr so we can sart writing to new buffer
  1297.         call    con.get_data_ptr
  1298. ; Finally, tell the GUI the window has been resized
  1299. ; (Redraw scrollbar and image)
  1300.         mov     [con.thread_op], OP_RESIZE
  1301.         jmp     con.wake
  1302.  
  1303. .dec_rst_altbuff:
  1304. ; Switch buffer
  1305.         push    [con.mainbuffer]
  1306.         pop     [con.data]
  1307. ; Set new buffer size
  1308.         push    [con.main_scr_width]
  1309.         pop     [con.scr_width]
  1310.         push    [con.main_scr_height]
  1311.         pop     [con.scr_height]
  1312. ; Restore cursor
  1313.         push    [con.main_cur_x]
  1314.         pop     [con.cur_x]
  1315.         push    [con.main_cur_y]
  1316.         pop     [con.cur_y]
  1317. ; Restore window position
  1318.         push    [con.main_wnd_xpos]
  1319.         pop     [con.wnd_xpos]
  1320.         push    [con.main_wnd_ypos]
  1321.         pop     [con.wnd_ypos]
  1322. ; Get new data ptr so we can sart writing to new buffer
  1323.         call    con.get_data_ptr
  1324. ; Finally, tell the GUI the window has been resized
  1325. ; (Redraw scrollbar and image)
  1326.         mov     [con.thread_op], OP_RESIZE
  1327.         jmp     con.wake
  1328.  
  1329. .erase_chars:
  1330.         push    edi ecx
  1331.         mov     ecx, [con_esc_attrs]
  1332.         test    ecx, ecx
  1333.         jnz     @f
  1334.         inc     ecx
  1335. @@:
  1336.         mov     ah, byte[con_flags]
  1337.         mov     al, ' '
  1338.         rep     stosw
  1339.         pop     ecx edi
  1340.         ; Unclear where cursor should point to now..
  1341.         ret
  1342.  
  1343. .delete_chars:
  1344.         push    edi ecx
  1345.         mov     ecx, [con_esc_attrs]
  1346.         test    ecx, ecx
  1347.         jnz     @f
  1348.         inc     ecx
  1349. @@:
  1350.         sub     edi, 2
  1351.         mov     ah, byte[con_flags]
  1352.         mov     al, ' '
  1353.         std
  1354.         rep     stosw
  1355.         cld
  1356.         pop     ecx edi
  1357.         ret
  1358.  
  1359. .erase_in_line:
  1360.         mov     eax, [con_esc_attrs]
  1361.         test    eax, eax
  1362.         jz      .erase_after                    ; <esc>[0K (or <esc>[K)
  1363.         dec     eax
  1364.         jz      .erase_before                   ; <esc>[1K
  1365.         dec     eax
  1366.         je      .erase_current_line             ; <esc>[2K
  1367.         ret     ; unknown sequence
  1368.  
  1369. .erase_after:
  1370.         push    edi ecx
  1371.         mov     ecx, [con.scr_width]
  1372.         sub     ecx, [con.cur_x]
  1373.         mov     ah, byte[con_flags]
  1374.         mov     al, ' '
  1375.         rep     stosw
  1376.         pop     ecx edi
  1377.         ret
  1378.  
  1379. .erase_before:
  1380.         push    edi ecx
  1381.         mov     edi, [con.cur_y]
  1382.         imul    edi, [con.scr_width]
  1383.         shl     edi, 1
  1384.         add     edi, [con.data]
  1385.         mov     ecx, [con.cur_y]
  1386.         mov     ah, byte[con_flags]
  1387.         mov     al, ' '
  1388.         rep     stosw
  1389.         pop     ecx edi
  1390.         ret
  1391.  
  1392. .erase_current_line:
  1393.         push    edi ecx
  1394.         mov     edi, [con.cur_y]
  1395.         imul    edi, [con.scr_width]
  1396.         shl     edi, 1
  1397.         add     edi, [con.data]
  1398.         mov     ecx, [con.scr_width]
  1399.         mov     ah, byte[con_flags]
  1400.         mov     al, ' '
  1401.         rep     stosw
  1402.         pop     ecx edi
  1403.         ret
  1404.  
  1405. .erase_in_display:
  1406.         mov     eax, [con_esc_attrs]
  1407.         test    eax, eax
  1408.         jz      .erase_below            ; <esc>[0J (or <esc>[J)
  1409.         dec     eax
  1410.         jz      .erase_above            ; <esc>[1J
  1411.         dec     eax
  1412.         je      .erase_all              ; <esc>[2J
  1413.         ret     ; unknown sequence
  1414.  
  1415. .erase_below:
  1416.         push    edi ecx
  1417.         mov     ecx, [con.scr_width]
  1418.         imul    ecx, [con.scr_height]
  1419.  
  1420.         mov     edi, [con.cur_y]
  1421.         imul    edi, [con.scr_width]
  1422.         add     edi, [con.cur_x]
  1423.  
  1424.         sub     ecx, edi
  1425.         shl     edi, 1
  1426.         add     edi, [con.data]
  1427.         mov     ah, byte[con_flags]
  1428.         mov     al, ' '
  1429.         rep     stosw
  1430.  
  1431.         and     [con.cur_x], 0
  1432.         and     [con.cur_y], 0
  1433.         pop     ecx edi
  1434.         ret
  1435.  
  1436. .erase_above:
  1437.         push    edi ecx
  1438.         mov     ecx, [con.cur_y]
  1439.         imul    ecx, [con.scr_width]
  1440.         add     ecx, [con.cur_x]
  1441.         mov     edi, [con.data]
  1442.         mov     ah, byte[con_flags]
  1443.         mov     al, ' '
  1444.         rep     stosw
  1445.         pop     ecx edi
  1446.         ret
  1447.  
  1448. .erase_all:   ; clear screen completely
  1449.         push    ecx
  1450.         and     [con.cur_x], 0
  1451.         and     [con.cur_y], 0
  1452.         mov     edi, [con.data]
  1453.         push    edi
  1454.         mov     ecx, [con.scr_width]
  1455.         imul    ecx, [con.scr_height]
  1456.         mov     ax, 0720h
  1457.         rep     stosw
  1458.         pop     edi ecx
  1459. .nosetcursor:
  1460.         ret
  1461. .line_position_abs:
  1462.         mov     eax, [con_esc_attrs]
  1463.         dec     eax
  1464.         jns     @f
  1465.         inc     eax
  1466. @@:
  1467.         cmp     eax, [con.scr_height]
  1468.         jae     .nolinepos
  1469.         mov     [con.cur_y], eax
  1470.         jmp     con.get_data_ptr
  1471. .nolinepos:
  1472.         ret
  1473. .cursor_position:
  1474. ; We always have at least one con_esc_attr, defaulting to 0
  1475. ; Coordinates however are 1-based
  1476. ; First comes Y (row) and then X (column)
  1477.         mov     eax, [con_esc_attrs]
  1478.         dec     eax
  1479.         jns     @f
  1480.         inc     eax
  1481. @@:
  1482.         cmp     eax, [con.scr_height]
  1483.         jae     .no_y
  1484.         mov     [con.cur_y], eax
  1485. .no_y:
  1486.         cmp     [con_esc_attr_n], 2
  1487.         jb      .no_x
  1488.         mov     eax, [con_esc_attrs+4]
  1489.         dec     eax
  1490.         jns     @f
  1491.         inc     eax
  1492. @@:
  1493.         cmp     eax, [con.scr_width]
  1494.         jae     .no_x
  1495.         mov     [con.cur_x], eax
  1496. .no_x:
  1497. .j_get_data:
  1498.         jmp     con.get_data_ptr
  1499. .cursor_up:
  1500.         mov     eax, [con_esc_attrs]
  1501.         test    eax, eax
  1502.         jnz     @f
  1503.         inc     eax     ; default = 1
  1504. @@:
  1505.         sub     [con.cur_y], eax
  1506.         jns     .j_get_data
  1507.         mov     [con.cur_y], 0
  1508.         jmp     .j_get_data
  1509. .cursor_down:
  1510.         mov     eax, [con_esc_attrs]
  1511.         test    eax, eax
  1512.         jnz     @f
  1513.         inc     eax     ; default = 1
  1514. @@:
  1515.         add     eax, [con.cur_y]
  1516.         cmp     eax, [con.scr_height]
  1517.         ja      @f
  1518.         mov     [con.cur_y], eax
  1519.         jmp     .j_get_data
  1520. @@:
  1521.         mov     eax, [con.scr_height]
  1522.         mov     [con.cur_y], eax
  1523.         jmp     .j_get_data
  1524. .cursor_right:
  1525.         mov     eax, [con_esc_attrs]
  1526.         test    eax, eax
  1527.         jnz     @f
  1528.         inc     eax     ; default = 1
  1529. @@:
  1530.         add     eax, [con.cur_x]
  1531.         cmp     eax, [con.scr_width]
  1532.         ja      @f
  1533.         mov     [con.cur_x], eax
  1534.         jmp     .j_get_data
  1535. @@:
  1536.         mov     eax, [con.scr_width]
  1537.         mov     [con.cur_x], eax
  1538.         jmp     .j_get_data
  1539. .cursor_left:
  1540.         test    eax, eax
  1541.         jnz     @f
  1542.         inc     eax     ; default = 1
  1543. @@:
  1544.         sub     [con.cur_x], eax
  1545.         jns     .j_get_data
  1546.         mov     [con.cur_x], 0
  1547.         jmp     .j_get_data
  1548. .set_attr:
  1549.         push    eax ecx edx
  1550.         xor     ecx, ecx
  1551. .set_one_attr:
  1552.         mov     eax, [con_esc_attrs+ecx*4]
  1553.         cmp     al, 0
  1554.         jz      .attr_normal
  1555.         cmp     al, 1
  1556.         jz      .attr_bold
  1557.         cmp     al, 5
  1558.         jz      .attr_bgr_bold
  1559.         cmp     al, 7
  1560.         jz      .attr_reversed
  1561. ;        cmp     al, 8
  1562. ;        jz      .attr_invisible
  1563.         cmp     al, 27
  1564.         jz      .attr_normal    ; FIXME: not inverse
  1565. ;        cmp     al, 28
  1566. ;        jz      .attr_visible
  1567.  
  1568. ; Forground colors
  1569.         xor     edx, edx
  1570.         cmp     al, 30          ; Black
  1571.         jz      .attr_color
  1572.         mov     dl, 4
  1573.         cmp     al, 31          ; Red
  1574.         jz      .attr_color
  1575.         mov     dl, 2
  1576.         cmp     al, 32          ; Green
  1577.         jz      .attr_color
  1578.         mov     dl, 6
  1579.         cmp     al, 33          ; Yellow
  1580.         jz      .attr_color
  1581.         mov     dl, 1
  1582.         cmp     al, 34          ; Blue
  1583.         jz      .attr_color
  1584.         mov     dl, 5
  1585.         cmp     al, 35          ; Purple
  1586.         jz      .attr_color
  1587.         mov     dl, 3
  1588.         cmp     al, 36          ; Cyan
  1589.         jz      .attr_color
  1590.         mov     dl, 7
  1591.         cmp     al, 37          ; White
  1592.         jz      .attr_color
  1593.         mov     dl, 7
  1594.         cmp     al, 39          ; Default - White
  1595.         jz      .attr_color
  1596.  
  1597. ; Background colors
  1598.         xor     edx, edx
  1599.         cmp     al, 40          ; Black
  1600.         jz      .attr_bgr_color
  1601.         mov     dl, 0x40
  1602.         cmp     al, 41          ; Red
  1603.         jz      .attr_bgr_color
  1604.         mov     dl, 0x20
  1605.         cmp     al, 42          ; Green
  1606.         jz      .attr_bgr_color
  1607.         mov     dl, 0x60
  1608.         cmp     al, 43          ; Yellow
  1609.         jz      .attr_bgr_color
  1610.         mov     dl, 0x10
  1611.         cmp     al, 44          ; Blue
  1612.         jz      .attr_bgr_color
  1613.         mov     dl, 0x50
  1614.         cmp     al, 45          ; Magenta
  1615.         jz      .attr_bgr_color
  1616.         mov     dl, 0x30
  1617.         cmp     al, 46          ; Cyan
  1618.         jz      .attr_bgr_color
  1619.         mov     dl, 0x70
  1620.         cmp     al, 47          ; White
  1621.         jz      .attr_bgr_color
  1622.         mov     dl, 0
  1623.         cmp     al, 49          ; Default - Black
  1624.         jz      .attr_bgr_color
  1625.  
  1626. ; 16-color support, bright colors follow
  1627. ; Foreground colors
  1628.         mov     dl, 0x08
  1629.         cmp     al, 90          ; Black
  1630.         jz      .attr_color
  1631.         mov     dl, 4 + 8
  1632.         cmp     al, 91          ; Red
  1633.         jz      .attr_color
  1634.         mov     dl, 2 + 8
  1635.         cmp     al, 92          ; Green
  1636.         jz      .attr_color
  1637.         mov     dl, 6 + 8
  1638.         cmp     al, 93          ; Yellow
  1639.         jz      .attr_color
  1640.         mov     dl, 1 + 8
  1641.         cmp     al, 94          ; Blue
  1642.         jz      .attr_color
  1643.         mov     dl, 5 + 8
  1644.         cmp     al, 95          ; Magenta
  1645.         jz      .attr_color
  1646.         mov     dl, 3 + 8
  1647.         cmp     al, 96          ; Cyan
  1648.         jz      .attr_color
  1649.         mov     dl, 7 + 8
  1650.         cmp     al, 97          ; White
  1651.         jz      .attr_color
  1652.  
  1653. ; Background colors
  1654.         mov     dl, 0x80
  1655.         cmp     al, 100         ; Black
  1656.         jz      .attr_bgr_color
  1657.         mov     dl, 0x80 + 0x40
  1658.         cmp     al, 101         ; Red
  1659.         jz      .attr_bgr_color
  1660.         mov     dl, 0x80 + 0x20
  1661.         cmp     al, 102         ; Green
  1662.         jz      .attr_bgr_color
  1663.         mov     dl, 0x80 + 0x60
  1664.         cmp     al, 103         ; Yellow
  1665.         jz      .attr_bgr_color
  1666.         mov     dl, 0x80 + 0x10
  1667.         cmp     al, 104         ; Blue
  1668.         jz      .attr_bgr_color
  1669.         mov     dl, 0x80 + 0x50
  1670.         cmp     al, 105         ; Magenta
  1671.         jz      .attr_bgr_color
  1672.         mov     dl, 0x80 + 0x30
  1673.         cmp     al, 106         ; Cyan
  1674.         jz      .attr_bgr_color
  1675.         mov     dl, 0x80 + 0x70
  1676.         cmp     al, 107         ; White
  1677.         jnz     .attr_continue
  1678.  
  1679. .attr_bgr_color:
  1680.         mov     eax, [con_flags]
  1681.         and     al, 0x0F
  1682.         or      al, byte [con_flags_attr]
  1683.         or      al, dl
  1684.         mov     [con_flags], eax
  1685.         jmp     .attr_continue
  1686. .attr_color:
  1687.         mov     eax, [con_flags]
  1688.         and     al, 0xF0
  1689.         or      al, byte [con_flags_attr]
  1690.         or      al, dl
  1691.         mov     [con_flags], eax
  1692.         jmp     .attr_continue
  1693. .attr_normal:
  1694.         mov     byte [con_flags_attr], 0
  1695.         mov     byte [con_flags], 0x07
  1696.         jmp     .attr_continue
  1697. .attr_reversed:
  1698.         mov     byte [con_flags], 0x70
  1699.         jmp     .attr_continue
  1700. .attr_bold:
  1701.         or      byte [con_flags_attr], 0x08
  1702.         jmp     .attr_continue
  1703. .attr_bgr_bold:
  1704.         or      byte [con_flags_attr], 0x80
  1705. .attr_continue:
  1706.         inc     ecx
  1707.         cmp     ecx, [con_esc_attr_n]
  1708.         jb      .set_one_attr
  1709.         pop     edx ecx eax
  1710.         ret
  1711.  
  1712. con.newline:
  1713.         mov     eax, [con.cur_y]
  1714.         inc     eax
  1715.         mov     [con.cur_y], eax
  1716.         cmp     eax, [con.scr_height]
  1717.         jb      @f
  1718.         call    con.scr_scroll_up
  1719. @@:
  1720.         call    con.get_data_ptr
  1721.         ret
  1722.  
  1723. con.scr_scroll_up:
  1724.         pushad
  1725.         mov     edi, [con.data]
  1726.         mov     esi, edi
  1727.         add     esi, [con.scr_width]
  1728.         add     esi, [con.scr_width]
  1729.         dec     [con.cur_y]
  1730.         mov     ecx, [con.scr_height]
  1731.         dec     ecx
  1732.         imul    ecx, [con.scr_width]
  1733.         shr     ecx, 1
  1734.         rep     movsd
  1735.         adc     ecx, ecx
  1736.         rep     movsw
  1737.         mov     ax, 0x0720
  1738.         mov     ecx, [con.scr_width]
  1739.         rep     stosw
  1740.         popad
  1741.         ret
  1742.  
  1743. con.data2image:
  1744.         pushad
  1745.         mov     edi, [con.image]
  1746.         mov     esi, [con.data]
  1747.         mov     eax, [con.wnd_ypos]
  1748.         mul     [con.scr_width]
  1749.         add     eax, [con.wnd_xpos]
  1750.         lea     esi, [esi+eax*2]
  1751.         mov     ecx, [con.wnd_height]
  1752. .lh:
  1753.         push    ecx
  1754.         mov     ecx, [con.wnd_width]
  1755. .lw:
  1756.         push    ecx edi
  1757.         xor     eax, eax
  1758.         mov     al, [esi+1]
  1759.         push    eax
  1760.         and     al, 0xF
  1761.         mov     ebx, eax                ; 梥â ⥪áâ 
  1762.         pop     eax
  1763.         shr     al, 4
  1764.         mov     ebp, eax                ; 梥â ä®­ 
  1765.         sub     ebx, ebp
  1766.         lodsb
  1767.         inc     esi
  1768. if font_width > 8
  1769.         lea     edx, [eax+eax+font]
  1770. else
  1771.         lea     edx, [eax+font]
  1772. end if
  1773. .sh:
  1774.         mov     ecx, [edx]
  1775. repeat font_width
  1776.         shr     ecx, 1
  1777.         sbb     eax, eax
  1778.         and     eax, ebx
  1779.         add     eax, ebp
  1780.         mov     [edi+%-1], al
  1781. end repeat
  1782.         mov     eax, [con.wnd_width]
  1783. ;        imul    eax, font_width
  1784. ;        add     edi, eax
  1785. if font_width = 6
  1786.         lea     eax, [eax*2+eax]
  1787.         lea     edi, [edi+eax*2]
  1788. else if font_width = 7
  1789.         lea     edi, [edi+eax*8]
  1790.         sub     edi, eax
  1791. else if font_width = 8
  1792.         lea     edi, [edi+eax*8]
  1793. else if font_width = 9
  1794.         lea     edi, [edi+eax*8]
  1795.         add     edi, eax
  1796. else if font_width = 10
  1797.         lea     eax, [eax*4+eax]
  1798.         lea     edi, [edi+eax*2]
  1799. else
  1800. Unknown font_width value!
  1801. end if
  1802. if font_width > 8
  1803.         add     edx, 256*2
  1804.         cmp     edx, font+256*2*font_height
  1805. else
  1806.         add     edx, 256
  1807.         cmp     edx, font+256*font_height
  1808. end if
  1809.         jb      .sh
  1810.         pop     edi ecx
  1811.         add     edi, font_width
  1812.         sub     ecx, 1
  1813.         jnz     .lw
  1814.         mov     eax, [con.wnd_width]
  1815.         imul    eax, (font_height-1)*font_width
  1816.         add     edi, eax
  1817.         pop     ecx
  1818.         mov     eax, [con.scr_width]
  1819.         sub     eax, [con.wnd_width]
  1820.         lea     esi, [esi+eax*2]
  1821.         dec     ecx
  1822.         jnz     .lh
  1823.         mov     eax, [con.cur_y]
  1824.         sub     eax, [con.wnd_ypos]
  1825.         jb      .nocursor
  1826.         cmp     eax, [con.wnd_height]
  1827.         jae     .nocursor
  1828.         inc     eax
  1829.         mul     [con.wnd_width]
  1830.         imul    eax, font_height*font_width
  1831.         mov     edx, [con.cur_x]
  1832.         sub     edx, [con.wnd_xpos]
  1833.         jb      .nocursor
  1834.         cmp     edx, [con.wnd_width]
  1835.         jae     .nocursor
  1836.         inc     edx
  1837.         imul    edx, font_width
  1838.         add     eax, edx
  1839.         add     eax, [con.image]
  1840.         mov     edx, [con.wnd_width]
  1841.         imul    edx, font_width
  1842.         neg     edx
  1843.         mov     ecx, [con.cursor_height]
  1844.         jecxz   .nocursor
  1845. .cursor_loop:
  1846.         push    ecx
  1847.         mov     ecx, font_width
  1848.         add     eax, edx
  1849.         push    eax
  1850. @@:
  1851.         xor     byte [eax-1], 7
  1852.         dec     eax
  1853.         loop    @b
  1854.         pop     eax
  1855.         pop     ecx
  1856.         loop    .cursor_loop
  1857. .nocursor:
  1858.         popad
  1859.         ret
  1860.  
  1861. con_exit:
  1862.        
  1863.         mov     ah, [con.init_cmd]
  1864.         test    ah, ah
  1865.         je      .ret
  1866.  
  1867.         cmp     byte [esp+4], 0
  1868.         jz      .noexit
  1869.         mov     [con.thread_op], OP_EXIT
  1870.         call    con.wake
  1871.                
  1872.         ret     4
  1873. .noexit:
  1874.         push    esi
  1875.         mov     esi, [con.title]
  1876.         mov     edx, con.finished_title
  1877.         mov     ecx, 255
  1878.         call    .strcpy
  1879.         mov     esi, con.aFinished
  1880.         call    .strcpy
  1881.         mov     byte [edx], 0
  1882.         pop     esi
  1883.         and     [con.cursor_height], 0
  1884.         push    con.finished_title
  1885.         call    con_set_title
  1886.         ret     4
  1887. .strcpy:
  1888.         jecxz   .ret
  1889. @@:
  1890.         lodsb
  1891.         test    al, al
  1892.         jz      .ret
  1893.         mov     [edx], al
  1894.         inc     edx
  1895.         loop    @b
  1896. .ret:
  1897.         ret
  1898.  
  1899. con_set_title:
  1900.         mov     eax, [esp+4]
  1901.         mov     [con.title], eax
  1902.         mov     [con.thread_op], OP_SET_TITLE
  1903.         call    con.wake
  1904.         ret     4
  1905.  
  1906. ; int __stdcall con_kbhit(void);
  1907. con_kbhit:
  1908.         test    byte [con_flags+1], 2
  1909.         jnz     @f
  1910.         mov     eax, [con.input_start]
  1911.         cmp     eax, [con.input_end]
  1912.         jnz     @f
  1913.         cmp     [con.entered_char], 0xffff
  1914. @@:
  1915.         setnz   al
  1916.         movzx   eax, al
  1917.         ret
  1918.  
  1919. con.force_entered_char:
  1920.         cmp     [con.entered_char], -1
  1921.         jnz     .ret
  1922.         mov     [con.thread_op], OP_GETCH
  1923.         call    con.wake
  1924.         test    byte [con_flags+1], 2
  1925.         jnz     .ret
  1926. ; wait for response
  1927.         push    ebx
  1928.         push    5
  1929.         pop     eax
  1930.         push    2
  1931.         pop     ebx
  1932. @@:
  1933.         int     0x40
  1934.         cmp     [con.entered_char], -1
  1935.         jz      @b
  1936.         pop     ebx
  1937. .ret:
  1938.         ret
  1939.  
  1940. ; int __stdcall con_getch(void);
  1941. con_getch:
  1942.         call    con_init_check
  1943.         call    con.force_entered_char
  1944.         test    byte [con_flags+1], 2
  1945.         jnz     con_getch_closed
  1946.         movzx   eax, byte [con.entered_char]
  1947.         sar     [con.entered_char], 8
  1948.         mov     byte [con.entered_char+1], 0xFF
  1949.         test    al, al
  1950.         jz      @f
  1951.         mov     byte [con.entered_char], 0xFF
  1952. @@:
  1953.         ret
  1954.  
  1955. con_getch_closed:
  1956.         xor     eax, eax
  1957.         ret
  1958.  
  1959. ; int __stdcall con_getch2(void);
  1960. con_getch2:
  1961.         call    con_init_check
  1962.         call    con.force_entered_char
  1963.         test    byte [con_flags+1], 2
  1964.         jnz     con_getch_closed
  1965.         mov     eax, 0xFFFF
  1966.         xchg    ax, [con.entered_char]
  1967.         ret
  1968.  
  1969. ; int __stdcall con_get_input(int *bufptr, int buflen);
  1970. con_get_input:
  1971.         call    con_init_check
  1972. ; Wait for input available
  1973.         call    con.force_entered_char
  1974.         test    byte [con_flags+1], 2
  1975.         jnz     .none
  1976.  
  1977.         push    ebx
  1978.         mov     ebx, [esp+8]
  1979.   .check_more:
  1980. ; Avoid buffer overflow
  1981.         cmp     dword[esp+12], 16
  1982.         jl      .no_more
  1983. ; Check element available
  1984.         cmp     [con.entered_char], 0xFFFF
  1985.         je      .no_more
  1986. ; Get an element from the input queue
  1987.         mov     eax, 0xFFFF
  1988.         xchg    ax, [con.entered_char]
  1989. ; Function keys F1-F4
  1990.         cmp     ah, 0x3B
  1991.         jb      @f
  1992.         cmp     ah, 0x3E
  1993.         jbe     .f1_4
  1994.   @@:
  1995. ; Function keys F5-F8
  1996.         cmp     ah, 0x3F
  1997.         jb      @f
  1998.         je      .f5
  1999.         cmp     ah, 0x42
  2000.         jbe     .f6_8
  2001.   @@:
  2002. ; Function keys F9-F12
  2003.         cmp     ah, 0x43
  2004.         je      .f9
  2005.         cmp     ah, 0x44
  2006.         je      .f10
  2007.         cmp     ah, 0x57
  2008.         je      .f11
  2009.         cmp     ah, 0x58
  2010.         je      .f12
  2011. ; Cursor keys
  2012.         cmp     ah, 0x47
  2013.         je      .home
  2014.         cmp     ah, 0x48
  2015.         je      .up
  2016.         cmp     ah, 0x49
  2017.         je      .pgup
  2018. ;        cmp     ah, 0x4a
  2019. ;        je      .minus
  2020.         cmp     ah, 0x4b
  2021.         je      .left
  2022.         cmp     ah, 0x4c
  2023.         je      .begin
  2024.         cmp     ah, 0x4d
  2025.         je      .right
  2026. ;        cmp     ah, 0x4e
  2027. ;        je      .plus
  2028.         cmp     ah, 0x4f
  2029.         je      .end
  2030.         cmp     ah, 0x50
  2031.         je      .down
  2032.         cmp     ah, 0x51
  2033.         je      .pgdown
  2034.         cmp     ah, 0x52
  2035.         je      .insert
  2036.         cmp     ah, 0x53
  2037.         je      .delete
  2038. ; regular ASCII
  2039.         mov     byte[ebx], al
  2040.         mov     eax, 1
  2041.   .got_input:
  2042.         and     eax, 0xff
  2043.         sub     [esp+12], eax
  2044.         add     ebx, eax
  2045.         jmp     .check_more
  2046.   .no_more:
  2047.         mov     eax, ebx
  2048.         sub     eax, [esp+8]
  2049.         pop     ebx
  2050.         ret     8
  2051.  
  2052.   .none:
  2053.         xor     eax, eax
  2054.         ret     8
  2055.  
  2056.   .f1_4:
  2057. ; F1 = SSR P, F2 = SS3 Q ..
  2058. ; SS3 = 0x8f (8bit) or 0x1b + 'O' (7-bit)
  2059.         mov     word[ebx], 27 + ('O' shl 8)
  2060.         add     ah, 'P' - 59
  2061.         mov     byte[ebx+2], ah
  2062.         mov     al, 3
  2063.         jmp     .got_input
  2064.   .f5:
  2065. ; CSI = 0x9b (8bit) or 0x1b + '[' (7-bit)
  2066.         mov     byte[ebx], 27
  2067.         mov     dword[ebx+1], '[15~'
  2068.         mov     al, 5
  2069.         jmp     .got_input
  2070.   .f6_8:
  2071.         mov     byte[ebx], 27
  2072.         xor     al, al
  2073.         shl     eax, 8
  2074.         add     eax, '[17~' - (0x40 shl 16)
  2075.         mov     dword[ebx+1], eax
  2076.         mov     al, 5
  2077.         jmp     .got_input
  2078.   .f9:
  2079.         mov     byte[ebx], 27
  2080.         mov     dword[ebx+1], '[20~'
  2081.         mov     al, 5
  2082.         jmp     .got_input
  2083.   .f10:
  2084.         mov     byte[ebx], 27
  2085.         mov     dword[ebx+1], '[21~'
  2086.         mov     al, 5
  2087.         jmp     .got_input
  2088.   .f11:
  2089.         mov     byte[ebx], 27
  2090.         mov     dword[ebx+1], '[23~'
  2091.         mov     al, 5
  2092.         jmp     .got_input
  2093.   .f12:
  2094.         mov     byte[ebx], 27
  2095.         mov     dword[ebx+1], '[24~'
  2096.         mov     al, 5
  2097.         jmp     .got_input
  2098.   .up:
  2099.         mov     eax, 'A' shl 16
  2100.         add     eax, [cursor_esc]
  2101.         mov     dword[ebx], eax
  2102.         mov     al, 3
  2103.         jmp     .got_input
  2104.   .down:
  2105.         mov     eax, 'B' shl 16
  2106.         add     eax, [cursor_esc]
  2107.         mov     dword[ebx], eax
  2108.         mov     al, 3
  2109.         jmp     .got_input
  2110.   .right:
  2111.         mov     eax, 'C' shl 16
  2112.         add     eax, [cursor_esc]
  2113.         mov     dword[ebx], eax
  2114.         mov     al, 3
  2115.         jmp     .got_input
  2116.   .left:
  2117.         mov     eax, 'D' shl 16
  2118.         add     eax, [cursor_esc]
  2119.         mov     dword[ebx], eax
  2120.         mov     al, 3
  2121.         jmp     .got_input
  2122.   .home:
  2123.         mov     eax, 'H' shl 16
  2124.         add     eax, [cursor_esc]
  2125.         mov     dword[ebx], eax
  2126.         mov     al, 3
  2127.         jmp     .got_input
  2128.   .end:
  2129.         mov     eax, 'F' shl 16
  2130.         add     eax, [cursor_esc]
  2131.         mov     dword[ebx], eax
  2132.         mov     al, 3
  2133.         jmp     .got_input
  2134.   .insert:
  2135.         mov     dword[ebx], 27 + ('[2~' shl 8)
  2136.         mov     al, 4
  2137.         jmp     .got_input
  2138.   .delete:
  2139.         mov     dword[ebx], 27 + ('[3~' shl 8)
  2140.         mov     al, 4
  2141.         jmp     .got_input
  2142.   .pgup:
  2143.         mov     dword[ebx], 27 + ('[5~' shl 8)
  2144.         mov     al, 4
  2145.         jmp     .got_input
  2146.   .pgdown:
  2147.         mov     dword[ebx], 27 + ('[6~' shl 8)
  2148.         mov     al, 4
  2149.         jmp     .got_input
  2150.   .begin:
  2151.         mov     dword[ebx], 27 + ('[E' shl 8)
  2152.         mov     al, 3
  2153.         jmp     .got_input
  2154.  
  2155.  
  2156.  
  2157. ; char* __stdcall con_gets(char* str, int n);
  2158. con_gets:
  2159.         pop     eax
  2160.         push    0
  2161.         push    eax
  2162. ; char* __stdcall con_gets2(con_gets2_callback callback, char* str, int n);
  2163. con_gets2:
  2164.         call    con_init_check
  2165.         mov     eax, [esp+8]            ; str
  2166.         pushad
  2167.         mov     esi, eax                ; str
  2168.         mov     ebx, [esp+20h+12]       ; n
  2169.         sub     ebx, 1
  2170.         jle     .ret
  2171.         mov     byte [esi], 0
  2172.         xor     ecx, ecx                ; ¤«¨­  㦥 ¢¢¥¤ñ­­®© áâப¨
  2173.         call    con.get_data_ptr
  2174. .loop:
  2175.         call    con_getch2
  2176.         test    al, al
  2177.         jz      .extended
  2178.         cmp     al, 8
  2179.         jz      .backspace
  2180.         cmp     al, 27
  2181.         jz      .esc
  2182.         cmp     al, 13
  2183.         jz      .enter
  2184.         cmp     al, 9
  2185.         jz      .tab
  2186.         inc     ecx
  2187.         mov     dl, al
  2188.         call    con.write_char_ex
  2189.         push    [con.cur_x]
  2190.         push    [con.cur_y]
  2191.         push    edi
  2192.         push    esi
  2193. @@:
  2194.         lodsb
  2195.         mov     [esi-1], dl
  2196.         mov     dl, al
  2197.         test    al, al
  2198.         jz      @f
  2199.         call    con.write_char_ex
  2200.         jmp     @b
  2201. @@:
  2202.         mov     [esi], dl
  2203.         pop     esi
  2204.         inc     esi
  2205.         pop     edi
  2206.         pop     [con.cur_y]
  2207.         pop     [con.cur_x]
  2208. .update_screen_and_loop:
  2209.         call    con.update_screen
  2210.         cmp     ecx, ebx
  2211.         jb      .loop
  2212. .ret_us:
  2213.         mov     edx, [con.cur_x]
  2214. @@:
  2215.         lodsb
  2216.         test    al, al
  2217.         jz      @f
  2218.         inc     edx
  2219.         cmp     edx, [con.scr_width]
  2220.         jb      @b
  2221.         xor     edx, edx
  2222.         call    con.newline
  2223.         jmp     @b
  2224. @@:
  2225.         mov     [con.cur_x], edx
  2226.         call    con.get_data_ptr
  2227.         call    con.update_screen
  2228.         jmp     .ret
  2229. .esc:
  2230.         mov     edx, [con.cur_x]
  2231. @@:
  2232.         lodsb
  2233.         test    al, al
  2234.         jz      @f
  2235.         inc     edx
  2236.         cmp     edx, [con.scr_width]
  2237.         jb      @b
  2238.         xor     edx, edx
  2239.         call    con.newline
  2240.         jmp     @b
  2241. @@:
  2242.         mov     [con.cur_x], edx
  2243.         call    con.get_data_ptr
  2244.         dec     esi
  2245.         xor     ecx, ecx
  2246. @@:
  2247.         mov     byte [esi], 0
  2248.         cmp     esi, [esp+20h+8]
  2249.         jbe     .update_screen_and_loop
  2250.         mov     al, 8
  2251.         call    con.write_special_char
  2252.         mov     al, ' '
  2253.         call    con.write_char
  2254.         mov     al, 8
  2255.         call    con.write_special_char
  2256.         dec     esi
  2257.         jmp     @b
  2258. .delete:
  2259.         cmp     byte [esi], 0
  2260.         jz      .loop
  2261.         lodsb
  2262.         call    con.write_char_ex
  2263. .backspace:
  2264.         cmp     esi, [esp+20h+8]
  2265.         jbe     .loop
  2266.         push    esi
  2267.         mov     edx, [con.cur_x]
  2268. @@:
  2269.         lodsb
  2270.         test    al, al
  2271.         jz      @f
  2272.         inc     edx
  2273.         cmp     edx, [con.scr_width]
  2274.         jb      @b
  2275.         xor     edx, edx
  2276.         call    con.newline
  2277.         jmp     @b
  2278. @@:
  2279.         mov     [con.cur_x], edx
  2280.         call    con.get_data_ptr
  2281.         dec     esi
  2282.         mov     al, 8
  2283.         call    con.write_special_char
  2284.         mov     al, ' '
  2285.         call    con.write_char
  2286.         mov     al, 8
  2287.         call    con.write_special_char
  2288.         mov     dl, 0
  2289. @@:
  2290.         cmp     esi, [esp]
  2291.         jbe     @f
  2292.         mov     al, 8
  2293.         call    con.write_special_char
  2294.         dec     esi
  2295.         xchg    dl, [esi]
  2296.         mov     al, dl
  2297.         call    con.write_char
  2298.         mov     al, 8
  2299.         call    con.write_special_char
  2300.         jmp     @b
  2301. @@:
  2302.         pop     esi
  2303.         dec     esi
  2304.         mov     [esi], dl
  2305.         dec     ecx
  2306.         jmp     .update_screen_and_loop
  2307. .enter:
  2308.         mov     edx, [con.cur_x]
  2309. @@:
  2310.         lodsb
  2311.         test    al, al
  2312.         jz      @f
  2313.         inc     edx
  2314.         cmp     edx, [con.scr_width]
  2315.         jb      @b
  2316.         xor     edx, edx
  2317.         call    con.newline
  2318.         jmp     @b
  2319. @@:
  2320.         mov     [con.cur_x], edx
  2321.         call    con.get_data_ptr
  2322.         mov     al, 10
  2323.         mov     [esi-1], al
  2324.         mov     byte [esi], 0
  2325.         call    con.write_special_char
  2326.         call    con.update_screen
  2327.         jmp     .ret
  2328. .tab:
  2329.         mov     al, 0
  2330.         mov     ah, 0xF
  2331. .extended:
  2332.         test    ah, ah
  2333.         jz      .closed
  2334.         xchg    al, ah
  2335.         cmp     al, 0x4B
  2336.         jz      .left
  2337.         cmp     al, 0x4D
  2338.         jz      .right
  2339.         cmp     al, 0x47
  2340.         jz      .home
  2341.         cmp     al, 0x4F
  2342.         jz      .end
  2343.         cmp     al, 0x53
  2344.         jz      .delete
  2345. ; give control to callback function
  2346.         cmp     dword [esp+20h+4], 0
  2347.         jz      .loop
  2348. ; remember length of text before and length of text after
  2349. ; and advance cursor to the end of line
  2350.         push    ecx
  2351.         push    eax
  2352.         lea     edx, [esi+1]
  2353. @@:
  2354.         lodsb
  2355.         test    al, al
  2356.         jz      @f
  2357.         call    con.write_char_ex
  2358.         jmp     @b
  2359. @@:
  2360.         sub     esi, edx
  2361.         pop     eax
  2362.         push    esi
  2363.         dec     edx
  2364.         sub     edx, [esp+28h+8]
  2365.         push    edx
  2366.         push    esp             ; ppos
  2367.         mov     ecx, [esp+30h+4]
  2368.         lea     edx, [esp+30h+12]
  2369.         push    edx             ; pn
  2370.         lea     edx, [esp+34h+8]
  2371.         push    edx             ; pstr
  2372.         push    eax             ; keycode
  2373.         call    ecx
  2374.         call    con.get_data_ptr
  2375.         dec     eax
  2376.         js      .callback_nochange
  2377.         jz      .callback_del
  2378.         dec     eax
  2379.         jz      .callback_output
  2380. ; callback returned 2 - exit
  2381.         add     esp, 12
  2382.         jmp     .ret
  2383. .callback_nochange:
  2384. ; callback returned 0 - string was not changed, only restore cursor position
  2385.         pop     esi
  2386.         pop     ecx
  2387.         test    ecx, ecx
  2388.         jz      .cncs
  2389. @@:
  2390.         mov     al, 8
  2391.         call    con.write_special_char
  2392.         loop    @b
  2393. .cncs:
  2394.         pop     ecx
  2395.         add     esi, [esp+20h+8]
  2396.         jmp     .callback_done
  2397. .callback_del:
  2398. ; callback returned 1 - string was changed, delete old string and output new
  2399.         mov     ecx, [esp+8]
  2400.         test    ecx, ecx
  2401.         jz      .cds
  2402. @@:
  2403.         mov     al, 8
  2404.         call    con.write_special_char
  2405.         mov     al, ' '
  2406.         call    con.write_char_ex
  2407.         mov     al, 8
  2408.         call    con.write_special_char
  2409.         loop    @b
  2410. .cds:
  2411. .callback_output:
  2412. ; callback returned 2 - string was changed, output new string
  2413.         pop     edx
  2414.         pop     esi
  2415.         pop     ecx
  2416.         mov     esi, [esp+20h+8]
  2417.         xor     ecx, ecx
  2418. @@:
  2419.         lodsb
  2420.         test    al, al
  2421.         jz      @f
  2422.         call    con.write_char_ex
  2423.         inc     ecx
  2424.         jmp     @b
  2425. @@:
  2426.         dec     esi
  2427.         push    ecx
  2428.         sub     ecx, edx
  2429.         jz      .cos
  2430. @@:
  2431.         mov     al, 8
  2432.         call    con.write_special_char
  2433.         dec     esi
  2434.         loop    @b
  2435. .cos:
  2436.         pop     ecx
  2437. .callback_done:
  2438.         call    con.update_screen
  2439.         mov     ebx, [esp+20h+12]
  2440.         dec     ebx
  2441.         cmp     ecx, ebx
  2442.         jae     .ret_us
  2443.         jmp     .loop
  2444. .left:
  2445.         cmp     esi, [esp+20h+8]
  2446.         jbe     .loop
  2447.         dec     esi
  2448.         mov     al, 8
  2449.         call    con.write_special_char
  2450.         jmp     .update_screen_and_loop
  2451. .right:
  2452.         cmp     byte [esi], 0
  2453.         jz      .loop
  2454.         lodsb
  2455.         call    con.write_char_ex
  2456.         jmp     .update_screen_and_loop
  2457. .home:
  2458.         cmp     esi, [esp+20h+8]
  2459.         jz      .update_screen_and_loop
  2460.         dec     esi
  2461.         mov     al, 8
  2462.         call    con.write_special_char
  2463.         jmp     .home
  2464. .end:
  2465.         lodsb
  2466.         test    al, al
  2467.         jz      @f
  2468.         call    con.write_char_ex
  2469.         jmp     .end
  2470. @@:
  2471.         dec     esi
  2472.         jmp     .update_screen_and_loop
  2473. .closed:
  2474.         and     dword [esp+1Ch], 0
  2475. .ret:
  2476.         popad
  2477.         ret     12
  2478.  
  2479. ; void __stdcall con_cls();
  2480. con_cls:
  2481.         mov     ah, [con.init_cmd]
  2482.         test    ah, ah
  2483.         je      cmd_init_no
  2484.                
  2485.         push    edi
  2486.         call    con.write_special_char.erase_all
  2487.         pop     edi
  2488.         call    con.update_screen
  2489.                
  2490.         ret
  2491.                
  2492. cmd_init_no:
  2493.                
  2494.         push    con.title_init_console
  2495.         push    -1
  2496.         push    -1
  2497.         push    -1
  2498.         push    -1
  2499.                
  2500.         call    con_init
  2501.                
  2502.         ret
  2503.  
  2504. ; void __stdcall con_get_cursor_pos(int* px, int* py);
  2505. con_get_cursor_pos:
  2506.         push    eax ecx
  2507.         mov     eax, [esp+12]
  2508.         mov     ecx, [con.cur_x]
  2509.         mov     [eax], ecx
  2510.         mov     eax, [esp+16]
  2511.         mov     ecx, [con.cur_y]
  2512.         mov     [eax], ecx
  2513.         pop     ecx eax
  2514.         ret     8
  2515.  
  2516. ; void __stdcall con_set_cursor_pos(int px, int py);
  2517. con_set_cursor_pos:
  2518.         push    eax
  2519.         mov     eax, [esp+8]
  2520.         cmp     eax, [con.scr_width]
  2521.         jae     @f
  2522.         mov     [con.cur_x], eax
  2523. @@:
  2524.         mov     eax, [esp+12]
  2525.         cmp     eax, [con.scr_height]
  2526.         jae     @f
  2527.         mov     [con.cur_y], eax
  2528. @@:
  2529.         pop     eax
  2530.         call    con.update_screen
  2531.         ret     8
  2532.  
  2533. con.update_screen:
  2534.         push    eax
  2535.         mov     eax, [con.cur_y]
  2536.         sub     eax, [con.wnd_ypos]
  2537.         jb      .up
  2538.         cmp     eax, [con.wnd_height]
  2539.         jb      .done
  2540.         mov     eax, [con.cur_y]
  2541.         sub     eax, [con.wnd_height]
  2542.         inc     eax
  2543.         jmp     .set
  2544. .up:
  2545.         mov     eax, [con.cur_y]
  2546. .set:
  2547.         mov     [con.wnd_ypos], eax
  2548. .done:
  2549.         pop     eax
  2550.         mov     [con.thread_op], OP_REDRAW
  2551.  
  2552. con.wake:
  2553.         pushad
  2554.         mov     al, [con.thread_op]
  2555.         cmp     al, byte [con.ipc_buf+0x10]
  2556.         jz      .ret
  2557. @@:
  2558.         push    60
  2559.         pop     eax
  2560.         push    2
  2561.         pop     ebx
  2562.         mov     ecx, [con.console_tid]
  2563.         jecxz   .ret
  2564.         mov     edx, con.thread_op
  2565.         push    1
  2566.         pop     esi
  2567.         int     0x40
  2568.         test    eax, eax
  2569.         jz      @f
  2570.         push    5
  2571.         pop     eax
  2572.         mov     bl, 1
  2573.         int     0x40
  2574.         jmp     @b
  2575. @@:
  2576. .ret:
  2577.         popad
  2578.         ret
  2579.  
  2580. ; ®â®ª ®ª­  ª®­á®«¨. Ž¡à ¡ â뢠¥â ¢¢®¤ ¨ ¢ë¢®¤.
  2581. con.thread:
  2582. ; ®â®ª ॠ£¨àã¥â ­  IPC, ª®â®à®¥ ¨á¯®«ì§ã¥âáï ⮫쪮 ¤«ï ⮣®, çâ®¡ë ¥£® ¬®¦­® ¡ë«® "à §¡ã¤¨âì"
  2583.         push    40
  2584.         pop     eax
  2585.         push    0x80000067 ;  program dont getting events mouse, when it dont active
  2586.         pop     ebx
  2587.         int     0x40
  2588.         xor     ebx,ebx     ;clear ebx
  2589.         mov     al, 60
  2590.         mov     bl, 1
  2591.         mov     ecx, con.ipc_buf
  2592.         push    0x11
  2593.         pop     edx
  2594.         int     0x40
  2595.         mov     al, 66
  2596.         mov     bl, 1
  2597.         mov     ecx, ebx
  2598.         int     0x40
  2599. con.redraw:
  2600.         call    con.draw_window
  2601. con.msg_loop:
  2602.         cmp     dword [con.bUpPressed], 0
  2603.         jnz     .wait_timeout
  2604.         push    10
  2605.         pop     eax
  2606.         jmp     @f
  2607. .wait_timeout:
  2608.         push    23
  2609.         pop     eax
  2610.         push    5
  2611.         pop     ebx
  2612. @@:
  2613.         int     0x40
  2614.         dec     eax
  2615.         jz      con.redraw
  2616.         dec     eax
  2617.         jz      con.key
  2618.         dec     eax
  2619.         jz      con.button
  2620.         cmp     al, 4
  2621.         jz      con.ipc
  2622.         jmp     con.mouse
  2623. con.button:
  2624. ; we have only one button, close
  2625.         mov     eax, 18
  2626.         mov     ebx, 18
  2627.         mov     ecx,[process_info_buffer+30]
  2628.         dec     ecx
  2629.         int     0x40 ; kill parent process
  2630.  
  2631. con.thread_exit:
  2632.         or      byte [con_flags+1], 2
  2633.         and     [con.console_tid], 0
  2634.         and     [con.entered_char], 0
  2635.         or      eax, -1
  2636.         int     0x40
  2637. con.key:
  2638.         mov     al, 2
  2639.         int     0x40
  2640.         and     eax, 0xffff ; supress scancodes
  2641. ; ah = scancode
  2642.         cmp     ah, 0xE0
  2643.         jnz     @f
  2644.         mov     [con.bWasE0], 1
  2645.         jmp     con.msg_loop
  2646. @@:
  2647.         shr     eax, 8
  2648.         xchg    ah, [con.bWasE0]
  2649.         test    al, al
  2650.         jle     con.msg_loop
  2651.         cmp     al, 0x1D
  2652.         jz      con.msg_loop
  2653.         cmp     al, 0x2A
  2654.         jz      con.msg_loop
  2655.         cmp     al, 0x36
  2656.         jz      con.msg_loop
  2657.         cmp     al, 0x38
  2658.         jz      con.msg_loop
  2659.         cmp     al, 0x3A
  2660.         jz      con.msg_loop
  2661.         cmp     al, 0x45
  2662.         jz      con.msg_loop
  2663.         cmp     al, 0x46
  2664.         jz      con.msg_loop
  2665.         mov     edx, eax
  2666.         cmp     dl, 0x4e
  2667.         je      .numpad
  2668.         cmp     dl, 0x4a
  2669.         je      .numpad
  2670.         push    66
  2671.         pop     eax
  2672.         push    3
  2673.         pop     ebx
  2674.         int     0x40    ; eax = control key state
  2675.         test    dh, dh
  2676.         jnz     .extended
  2677.         test    al, 0x80        ; numlock
  2678.         jnz     .numlock
  2679.         bt      [scan_has_ascii], edx
  2680.         jnc     .extended
  2681.         test    al, 0x30        ; alt
  2682.         jnz     .extended
  2683.         test    al, 0x80        ; numlock
  2684.         jz      .no_numlock
  2685.   .numlock:
  2686.         cmp     dl, 71
  2687.         jb      .no_numlock
  2688.         cmp     dl, 83
  2689.         ja      .no_numlock
  2690.   .numpad:
  2691.         mov     dh, [con.extended_numlock+edx-71]
  2692.         xchg    dl, dh
  2693.         jmp     .gotcode
  2694.   .no_numlock:
  2695. ; key has ASCII code
  2696.         push    eax edx
  2697.         push    2
  2698.         pop     ecx
  2699.         test    al, 3
  2700.         jnz     @f
  2701.         dec     ecx
  2702. @@:
  2703.         push    26
  2704.         pop     eax
  2705.         mov     bl, 2
  2706.         mov     edx, con.kbd_layout
  2707.         int     0x40
  2708.         pop     edx eax
  2709.         mov     dh, [con.kbd_layout+edx]
  2710.         test    al, 0xC
  2711.         jz      @f
  2712.         sub     dh, 0x60
  2713.         jmp     @f
  2714. .extended:
  2715.         mov     dh, 0   ; no ASCII code
  2716. @@:
  2717. ; dh contains ASCII-code; now convert scancode to extended key code
  2718.         mov     ecx, con.extended_alt
  2719.         test    al, 0x30
  2720.         jnz     .xlat
  2721.  
  2722.         mov     ecx, con.extended_shift
  2723.         test    al, 3
  2724.         jnz     .xlat
  2725.  
  2726.         mov     ecx, con.extended_ctrl
  2727.         test    al, 0xC
  2728.         jnz     .xlat
  2729.  
  2730.         cmp     dl, 28
  2731.         jne     @f
  2732.         shl     dx, 8
  2733.         mov     dl, 13
  2734.         jmp     .gotcode
  2735. @@:
  2736.         cmp     dl, 53
  2737.         jne     @f
  2738.         shl     dx, 8
  2739.         mov     dl, '/'
  2740.         jmp     .gotcode
  2741. @@:
  2742.         cmp     dl, 55
  2743.         jne     @f
  2744.         shl     dx, 8
  2745.         mov     dl, '*'
  2746.         jmp     .gotcode
  2747. @@:
  2748.         xchg    dl, dh
  2749.         cmp     dh, 0x57
  2750.         jz      @f
  2751.         cmp     dh, 0x58
  2752.         jnz     .gotcode
  2753. @@:
  2754.         add     dh, 0x85-0x57
  2755.         jmp     .gotcode
  2756. .xlat:
  2757.         movzx   eax, dl
  2758.         mov     dl, dh
  2759.         mov     dh, [eax+ecx]
  2760. .gotcode:
  2761.         test    dh, dh
  2762.         jz      con.msg_loop
  2763.         cmp     dh, 0x94
  2764.         jnz     @f
  2765.         mov     dl, 0
  2766. @@:
  2767. ; dx contains full keycode
  2768.         cmp     [con.bGetchRequested], 0
  2769.         jz      @f
  2770.         mov     [con.entered_char], dx
  2771.         jmp     con.msg_loop
  2772. @@:
  2773.         mov     eax, [con.input_end]
  2774.         mov     ecx, eax
  2775.         add     eax, 2
  2776.         cmp     eax, con.input_buffer_end
  2777.         jnz     @f
  2778.         mov     eax, con.input_buffer
  2779. @@:
  2780.         cmp     eax, [con.input_start]
  2781.         jnz     @f
  2782. ; buffer overflow, make beep and continue
  2783.         push    55
  2784.         pop     eax
  2785.         mov     ebx, eax
  2786.         mov     esi, con.beep
  2787.         int     0x40
  2788.         jmp     con.msg_loop
  2789. @@:
  2790.         mov     [ecx], dx
  2791.         mov     [con.input_end], eax
  2792.         jmp     con.msg_loop
  2793. con.ipc:
  2794.         movzx   eax, byte [con.ipc_buf+0x10]
  2795.         mov     byte [con.ipc_buf+4], 8
  2796.         mov     byte [con.ipc_buf+0x10], 0
  2797.         dec     eax
  2798.         jz      con.thread_exit
  2799.         dec     eax
  2800.         jz      con.set_title
  2801.         dec     eax
  2802.         jz      con.redraw_image
  2803.         dec     eax
  2804.         jz      con.getch
  2805.         dec     eax
  2806.         jz      con.resize
  2807.         jmp     con.msg_loop
  2808. con.resize:
  2809.         push    48
  2810.         pop     eax
  2811.         push    4
  2812.         pop     ebx
  2813.         int     0x40
  2814.  
  2815.         mov     edx, [con.def_wnd_x-2]
  2816.         mov     edx, [con.wnd_width]
  2817.         imul    edx, font_width
  2818.         add     edx, 5+5-1
  2819.  
  2820.         mov     esi, [con.def_wnd_y-2]
  2821.         mov     esi, [con.wnd_height]
  2822.         imul    esi, font_height
  2823.         lea     esi, [eax + esi + 5-1]
  2824. ; place for scrollbar
  2825.         mov     eax, [con.wnd_height]
  2826.         cmp     eax, [con.scr_height]
  2827.         jae     @f
  2828.         add     edx, con.vscroll_width
  2829. @@:
  2830.         push    67
  2831.         pop     eax
  2832.         mov     ebx, -1
  2833.         mov     ecx, ebx
  2834.         int     0x40
  2835.         call    con.draw_window
  2836.         jmp     con.msg_loop
  2837. con.set_title:
  2838.         push    71
  2839.         pop     eax
  2840.         push    1
  2841.         pop     ebx
  2842.         mov     ecx, [con.title]
  2843.         int     0x40
  2844.         jmp     con.msg_loop
  2845. con.redraw_image:
  2846.         call    con.data2image
  2847.         call    con.draw_image
  2848.         jmp     con.msg_loop
  2849. con.getch:
  2850.         mov     eax, [con.input_start]
  2851.         cmp     eax, [con.input_end]
  2852.         jz      .noinput
  2853.         mov     ecx, [eax]
  2854.         mov     [con.entered_char], cx
  2855.         inc     eax
  2856.         inc     eax
  2857.         cmp     eax, con.input_buffer_end
  2858.         jnz     @f
  2859.         mov     eax, con.input_buffer
  2860. @@:
  2861.         mov     [con.input_start], eax
  2862.         jmp     con.msg_loop
  2863. .noinput:
  2864.         mov     [con.bGetchRequested], 1
  2865.         jmp     con.msg_loop
  2866. con.mouse:
  2867.         push    37
  2868.         pop     eax
  2869.         push    7
  2870.         pop     ebx
  2871.         int     0x40
  2872.         test    eax, eax
  2873.         jz      .no_scrollmouse
  2874.         cwde
  2875.         add     eax, [con.wnd_ypos]
  2876.         jg      @f
  2877.         xor     eax, eax
  2878. @@:
  2879.         mov     ebx, [con.scr_height]
  2880.         sub     ebx, [con.wnd_height]
  2881.         cmp     eax, ebx
  2882.         jb      @f
  2883.         mov     eax, ebx
  2884. @@:
  2885.         mov     [con.wnd_ypos], eax
  2886.         jmp     con.redraw_image
  2887. .no_scrollmouse:
  2888.         xor     eax, eax
  2889.         xchg    eax, dword [con.bUpPressed]
  2890.         mov     dword [con.bUpPressed_saved], eax
  2891.         push    37
  2892.         pop     eax
  2893.         push    2
  2894.         pop     ebx
  2895.         int     0x40
  2896.         test    al, 1
  2897.         jnz     @f
  2898.         cmp     [con.vscroll_pt], -1
  2899.         jz      .redraw_if_needed
  2900.         or      [con.vscroll_pt], -1
  2901. .redraw_if_needed:
  2902.         cmp     dword [con.bUpPressed_saved], 0
  2903.         jnz     con.redraw_image
  2904.         jmp     con.msg_loop
  2905. @@:
  2906.         mov     al, 37
  2907.         dec     ebx
  2908.         int     0x40
  2909.         movsx   ebx, ax
  2910.         sar     eax, 16
  2911.         cmp     [con.vscroll_pt], -1
  2912.         jnz     .vscrolling
  2913.         test    ebx, ebx
  2914.         js      .redraw_if_needed
  2915.         sub     ax, [con.data_width]
  2916.         jb      .redraw_if_needed
  2917.         cmp     eax, con.vscroll_width
  2918.         jae     .redraw_if_needed
  2919.         cmp     ebx, con.vscroll_btn_height
  2920.         jb      .up
  2921.         sub     bx, [con.data_height]
  2922.         jae     .redraw_if_needed
  2923.         cmp     bx, -con.vscroll_btn_height
  2924.         jge     .down
  2925.         add     bx, [con.data_height]
  2926.         sub     bx, word [con.vscrollbar_pos]
  2927.         jl      .vscroll_up
  2928.         cmp     bx, word [con.vscrollbar_size]
  2929.         jl      .vscroll
  2930. .vscroll_down:
  2931.         cmp     [con.bScrollingDown_saved], 0
  2932.         jz      .vscroll_down_first
  2933.         cmp     [con.bScrollingDown_saved], 1
  2934.         jz      .vscroll_down_wasfirst
  2935.         mov     [con.bScrollingDown], 2
  2936. .vscroll_down_do:
  2937.         mov     eax, [con.wnd_ypos]
  2938.         add     eax, [con.wnd_height]
  2939.         dec     eax
  2940.         mov     ebx, [con.scr_height]
  2941.         sub     ebx, [con.wnd_height]
  2942.         cmp     eax, ebx
  2943.         jb      @f
  2944.         mov     eax, ebx
  2945. @@:
  2946.         mov     [con.wnd_ypos], eax
  2947.         jmp     con.redraw_image
  2948. .vscroll_down_first:
  2949.         push    26
  2950.         pop     eax
  2951.         push    9
  2952.         pop     ebx
  2953.         int     0x40
  2954.         mov     [con.scroll_down_first_time], eax
  2955.         mov     [con.bScrollingDown], 1
  2956.         jmp     .vscroll_down_do
  2957. .vscroll_down_wasfirst:
  2958.         push    26
  2959.         pop     eax
  2960.         push    9
  2961.         pop     ebx
  2962.         int     0x40
  2963.         sub     eax, [con.scroll_down_first_time]
  2964.         cmp     eax, 25
  2965.         jb      @f
  2966.         mov     [con.bScrollingDown], 2
  2967.         jmp     .vscroll_down_do
  2968. @@:
  2969.         mov     [con.bScrollingDown], 1
  2970.         jmp     con.msg_loop
  2971. .vscroll_up:
  2972.         cmp     [con.bScrollingUp_saved], 0
  2973.         jz      .vscroll_up_first
  2974.         cmp     [con.bScrollingUp_saved], 1
  2975.         jz      .vscroll_up_wasfirst
  2976.         mov     [con.bScrollingUp], 2
  2977. .vscroll_up_do:
  2978.         mov     eax, [con.wnd_ypos]
  2979.         inc     eax
  2980.         sub     eax, [con.wnd_height]
  2981.         jns     @f
  2982.         xor     eax, eax
  2983. @@:
  2984.         mov     [con.wnd_ypos], eax
  2985.         jmp     con.redraw_image
  2986. .vscroll_up_first:
  2987.         push    26
  2988.         pop     eax
  2989.         push    9
  2990.         pop     ebx
  2991.         int     0x40
  2992.         mov     [con.scroll_up_first_time], eax
  2993.         mov     [con.bScrollingUp], 1
  2994.         jmp     .vscroll_up_do
  2995. .vscroll_up_wasfirst:
  2996.         push    26
  2997.         pop     eax
  2998.         push    9
  2999.         pop     ebx
  3000.         int     0x40
  3001.         sub     eax, [con.scroll_up_first_time]
  3002.         cmp     eax, 25
  3003.         jb      @f
  3004.         mov     [con.bScrollingUp], 2
  3005.         jmp     .vscroll_up_do
  3006. @@:
  3007.         mov     [con.bScrollingUp], 1
  3008.         jmp     con.msg_loop
  3009. .up:
  3010.         cmp     [con.bUpPressed_saved], 0
  3011.         jz      .up_first
  3012.         cmp     [con.bUpPressed_saved], 1
  3013.         jz      .up_wasfirst
  3014.         mov     [con.bUpPressed], 2
  3015. .up_do:
  3016.         mov     eax, [con.wnd_ypos]
  3017.         dec     eax
  3018.         js      @f
  3019.         mov     [con.wnd_ypos], eax
  3020. @@:
  3021.         jmp     con.redraw_image
  3022. .up_first:
  3023.         push    26
  3024.         pop     eax
  3025.         push    9
  3026.         pop     ebx
  3027.         int     0x40
  3028.         mov     [con.up_first_time], eax
  3029.         mov     [con.bUpPressed], 1
  3030.         jmp     .up_do
  3031. .up_wasfirst:
  3032.         push    26
  3033.         pop     eax
  3034.         push    9
  3035.         pop     ebx
  3036.         int     0x40
  3037.         sub     eax, [con.up_first_time]
  3038.         cmp     eax, 25
  3039.         jb      @f
  3040.         mov     [con.bUpPressed], 2
  3041.         jmp     .up_do
  3042. @@:
  3043.         mov     [con.bUpPressed], 1
  3044.         jmp     con.msg_loop
  3045. .down:
  3046.         cmp     [con.bDownPressed_saved], 0
  3047.         jz      .down_first
  3048.         cmp     [con.bDownPressed_saved], 1
  3049.         jz      .down_wasfirst
  3050.         mov     [con.bDownPressed], 2
  3051. .down_do:
  3052.         mov     eax, [con.scr_height]
  3053.         sub     eax, [con.wnd_height]
  3054.         jbe     con.redraw_image
  3055.         cmp     [con.wnd_ypos], eax
  3056.         jae     con.redraw_image
  3057.         inc     [con.wnd_ypos]
  3058.         jmp     con.redraw_image
  3059. .down_first:
  3060.         push    26
  3061.         pop     eax
  3062.         push    9
  3063.         pop     ebx
  3064.         int     0x40
  3065.         mov     [con.down_first_time], eax
  3066.         mov     [con.bDownPressed], 1
  3067.         jmp     .down_do
  3068. .down_wasfirst:
  3069.         push    26
  3070.         pop     eax
  3071.         push    9
  3072.         pop     ebx
  3073.         int     0x40
  3074.         sub     eax, [con.down_first_time]
  3075.         cmp     eax, 25
  3076.         jb      @f
  3077.         mov     [con.bDownPressed], 2
  3078.         jmp     .down_do
  3079. @@:
  3080.         mov     [con.bDownPressed], 1
  3081.         jmp     con.msg_loop
  3082. .vscroll:
  3083.         mov     [con.vscroll_pt], ebx
  3084.         call    con.draw_image
  3085.         jmp     con.msg_loop
  3086. .vscrolling:
  3087.         sub     ebx, [con.vscroll_pt]
  3088.         sub     ebx, con.vscroll_btn_height
  3089.         jge     @f
  3090.         xor     ebx, ebx
  3091. @@:
  3092.         movzx   eax, [con.data_height]
  3093.         sub     eax, 2*con.vscroll_btn_height
  3094.         sub     eax, [con.vscrollbar_size]
  3095.         cmp     ebx, eax
  3096.         jb      @f
  3097.         lea     ebx, [eax-1]
  3098. @@:
  3099.         xchg    eax, ebx
  3100.         mov     edx, [con.scr_height]
  3101.         sub     edx, [con.wnd_height]
  3102.         inc     edx
  3103.         mul     edx
  3104.         div     ebx
  3105.         cmp     [con.wnd_ypos], eax
  3106.         jz      con.msg_loop
  3107.         mov     [con.wnd_ypos], eax
  3108.         jmp     con.redraw_image
  3109.  
  3110. con.draw_window:
  3111.         push    12
  3112.         pop     eax
  3113.         xor     ebx, ebx
  3114.         inc     ebx
  3115.         int     0x40
  3116.  
  3117.         mov     al, 48
  3118.         mov     bl, 4
  3119.         int     0x40
  3120.         mov     ebx, [con.def_wnd_x-2]
  3121.         mov     bx, word [con.wnd_width]
  3122.         imul    bx, font_width
  3123.         add     bx, 5+5-1
  3124.         mov     ecx, [con.def_wnd_y-2]
  3125.         mov     cx, word [con.wnd_height]
  3126.         imul    cx, font_height
  3127.         lea     ecx, [ecx+eax+5-1]
  3128.         mov     edx, 0x74000000
  3129.         mov     edi, [con.title]
  3130. ; place for scrollbar
  3131.         mov     eax, [con.wnd_height]
  3132.         cmp     eax, [con.scr_height]
  3133.         jae     @f
  3134.         add     ebx, con.vscroll_width
  3135. @@:
  3136.         xor     eax, eax
  3137.         int     0x40
  3138.  
  3139.         mov     eax, 9
  3140.         mov     ebx, process_info_buffer
  3141.         mov     ecx, -1
  3142.         int     0x40
  3143.         test    [process_info_buffer.wnd_state], 110b   ; window is rolled up or minimized to panel
  3144.         jnz     .exit
  3145.  
  3146.         call    con.draw_image
  3147.  
  3148. .exit:
  3149.         push    12
  3150.         pop     eax
  3151.         push    2
  3152.         pop     ebx
  3153.         int     0x40
  3154.                
  3155.         ret
  3156.  
  3157. con.draw_image:
  3158.         xor     edx, edx
  3159.         mov     ecx, [con.wnd_width]
  3160.         imul    ecx, font_width
  3161.         mov     [con.data_width], cx
  3162.         shl     ecx, 16
  3163.         mov     cx, word [con.wnd_height]
  3164.         imul    cx, font_height
  3165.         mov     [con.data_height], cx
  3166.         mov     ebx, [con.image]
  3167.         push    65
  3168.         pop     eax
  3169.         xor     ebp, ebp
  3170.         mov     edi, con.colors
  3171.         push    8
  3172.         pop     esi
  3173.         int     0x40
  3174.         mov     al, 7
  3175.         mov     edx, [con.wnd_height]
  3176.         cmp     edx, [con.scr_height]
  3177.         jae     .skip_vscroll
  3178.         push    ecx
  3179.         mov     edx, ecx
  3180.         xor     dx, dx
  3181.         mov     ebx, con.vscroll_btn3
  3182.         cmp     [con.bUpPressed], 0
  3183.         jnz     @f
  3184.         mov     ebx, con.vscroll_btn1
  3185. @@:
  3186.         mov     ecx, con.vscroll_width*65536 + con.vscroll_btn_height
  3187.         int     0x40
  3188.         pop     edx
  3189.         sub     dx, con.vscroll_btn_height
  3190.         mov     ebx, con.vscroll_btn4
  3191.         cmp     [con.bDownPressed], 0
  3192.         jnz     @f
  3193.         mov     ebx, con.vscroll_btn2
  3194. @@:
  3195.         int     0x40
  3196.         push    edx
  3197. ; ‚ëç¨á«ï¥¬ ¢ëá®âã ¡¥£ã­ª 
  3198.         mov     ax, dx
  3199.         sub     eax, con.vscroll_btn_height
  3200.         mov     ecx, eax
  3201.         mul     [con.wnd_height]
  3202.         div     [con.scr_height]
  3203.         cmp     eax, 5
  3204.         jae     @f
  3205.         mov     al, 5
  3206. @@:
  3207. ; eax = ¢ëá®â  ¡¥£ã­ª . ‚ëç¨á«ï¥¬ ¯®«®¦¥­¨¥ ¡¥£ã­ª 
  3208.         mov     [con.vscrollbar_size], eax
  3209.         xchg    eax, ecx
  3210.         sub     eax, ecx
  3211.         mul     [con.wnd_ypos]
  3212.         mov     ebx, [con.scr_height]
  3213.         sub     ebx, [con.wnd_height]
  3214.         div     ebx
  3215.         pop     edx
  3216.         push    edx
  3217. ; ecx = ¢ëá®â  ¡¥£ã­ª , eax = ¯®«®¦¥­¨¥
  3218.         add     eax, con.vscroll_btn_height
  3219.         mov     [con.vscrollbar_pos], eax
  3220.         mov     ebx, con.vscroll_bgr2
  3221.         cmp     [con.bScrollingUp], 0
  3222.         jnz     @f
  3223.         mov     ebx, con.vscroll_bgr1
  3224. @@:
  3225.         mov     ecx, con.vscroll_width*65536 + con.vscroll_bgr_height
  3226.         push    eax
  3227.         push    7
  3228.         pop     eax
  3229.         mov     dx, con.vscroll_btn_height
  3230.         call    .vpattern
  3231.         mov     dx, word [con.vscrollbar_pos]
  3232.         add     dx, word [con.vscrollbar_size]
  3233.         mov     cx, con.vscroll_bgr_height
  3234.         mov     ebx, con.vscroll_bgr2
  3235.         cmp     [con.bScrollingDown], 0
  3236.         jnz     @f
  3237.         mov     ebx, con.vscroll_bgr1
  3238. @@:
  3239.         call    .vpattern
  3240.         mov     ecx, [con.vscrollbar_pos]
  3241.         mov     dx, cx
  3242.         add     ecx, [con.vscrollbar_size]
  3243.         sub     ecx, con.vscroll_bar_height3
  3244.         push    ecx
  3245.         mov     ebx, con.vscroll_bar1
  3246.         mov     ecx, con.vscroll_width*65536 + con.vscroll_bar_height1
  3247.         int     0x40
  3248.         add     dx, cx
  3249.         mov     cx, con.vscroll_bar_height2
  3250.         mov     ebx, con.vscroll_bar2
  3251.         call    .vpattern
  3252.         mov     ebx, con.vscroll_bar3
  3253.         mov     cx, con.vscroll_bar_height3
  3254.         int     0x40
  3255. .skip_vscroll:
  3256.         ret
  3257.  
  3258. .vpattern:
  3259.         push    edx
  3260.         add     dx, cx
  3261.         cmp     dx, [esp+8]
  3262.         pop     edx
  3263.         jbe     @f
  3264.         mov     cx, [esp+4]
  3265.         sub     cx, dx
  3266.         jz      .ret
  3267. @@:
  3268.         int     0x40
  3269.         add     dx, cx
  3270.         cmp     dx, [esp+4]
  3271.         jb      .vpattern
  3272. .ret:
  3273.         ret     4
  3274.  
  3275. align 4
  3276. con.colors      dd      0x000000, 0x000080, 0x008000, 0x008080
  3277.                 dd      0x800000, 0x800080, 0x808000, 0xC0C0C0
  3278.                 dd      0x808080, 0x0000FF, 0x00FF00, 0x00FFFF
  3279.                 dd      0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF
  3280.  
  3281. scan_has_ascii:
  3282.         dd      11011111111111111111111111111110b
  3283.         dd      00000010001111111111101111111111b
  3284.         dd      00000000000000000000000000000000b
  3285.         dd      0
  3286.  
  3287. con.extended_alt:
  3288.         db      00h,01h,78h,79h,7Ah,7Bh,7Ch,7Dh,7Eh,7Fh,80h,81h,82h,83h,0Eh,0A5h
  3289.         db      10h,11h,12h,13h,14h,15h,16h,17h,18h,19h,1Ah,1Bh,1Ch,00h,1Eh,1Fh
  3290.         db      20h,21h,22h,23h,24h,25h,26h,27h,28h,29h,00h,2Bh,2Ch,2Dh,2Eh,2Fh
  3291.         db      30h,31h,32h,33h,34h,35h,00h,37h,00h,39h,00h,68h,69h,6Ah,6Bh,6Ch
  3292.         db      6Dh,6Eh,6Fh,70h,71h,00h,00h,97h,98h,99h,4Ah,9Bh,9Ch,9Dh,4Eh,9Fh
  3293.         db      0A0h,0A1h,0A2h,0A3h,00h,00h,00h,8Bh,8Ch,00h,00h,00h,00h,00h,00h,00h
  3294.         times 20h db 0
  3295. con.extended_ctrl:
  3296.         times 0Fh db %-1
  3297.         db      0x94
  3298.         times 2Bh db %-1
  3299.         db      5Eh,5Fh,60h,61h,62h,63h,64h,65h,66h,67h,00h,00h
  3300.         db      77h,8Dh,84h,8Eh,73h,8Fh,74h,90h,75h,91h,76h,92h,93h,00h,00h,00h,89h,8Ah
  3301.         times 0x80-0x59 db 0
  3302. con.extended_shift:
  3303.         times 3Bh db %-1
  3304.         db      54h,55h,56h,57h,58h,59h,5Ah,5Bh,5Ch,5Dh,00h,00h
  3305.         db      47h,48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh,4Fh,50h,51h,52h,53h,00h,00h,00h,87h,88h
  3306.         times 0x80-0x59 db 0
  3307. con.extended_numlock:
  3308.         db      '7', '8', '9', '-'
  3309.         db      '4', '5', '6', '+'
  3310.         db      '1', '2', '3'
  3311.         db      '0', '.'
  3312.  
  3313.  
  3314. cursor_esc      dd 27 + ('[' shl 8)
  3315.  
  3316. ; ‚ ⥪ã饩 ॠ«¨§ æ¨¨ §­ ç¥­¨ï ¯® 㬮«ç ­¨î â ª®¢ë.
  3317. ; ‚ ¡ã¤ã饬 ®­¨, ¢®§¬®¦­®, ¡ã¤ãâ áç¨â뢠âìáï ª ª ¯ à ¬¥âàë ¨§ ini-ä ©«  console.ini.
  3318. con.def_wnd_width   dd    80
  3319. con.def_wnd_height  dd    25
  3320. con.def_scr_width   dd    80
  3321. con.def_scr_height  dd    300
  3322. con.def_wnd_x       dd    200
  3323. con.def_wnd_y       dd    50
  3324.  
  3325. con.init_cmd db 0
  3326. con.title_init_console db "Console",0
  3327. con.vscroll_pt      dd    -1
  3328.  
  3329. align 16
  3330. EXPORTS:
  3331.         dd      szStart,                START
  3332.         dd      szVersion,              0x00020009
  3333.         dd      szcon_init,             con_init
  3334.         dd      szcon_write_asciiz,     con_write_asciiz
  3335.         dd      szcon_write_string,     con_write_length
  3336.         dd      szcon_printf,           con_printf
  3337.         dd      szcon_exit,             con_exit
  3338.         dd      szcon_get_flags,        con_get_flags
  3339.         dd      szcon_set_flags,        con_set_flags
  3340.         dd      szcon_kbhit,            con_kbhit
  3341.         dd      szcon_getch,            con_getch
  3342.         dd      szcon_getch2,           con_getch2
  3343.         dd      szcon_gets,             con_gets
  3344.         dd      szcon_gets2,            con_gets2
  3345.         dd      szcon_get_font_height,  con_get_font_height
  3346.         dd      szcon_get_cursor_height,con_get_cursor_height
  3347.         dd      szcon_set_cursor_height,con_set_cursor_height
  3348.         dd      szcon_cls,              con_cls
  3349.         dd      szcon_get_cursor_pos,   con_get_cursor_pos
  3350.         dd      szcon_set_cursor_pos,   con_set_cursor_pos
  3351.         dd      szcon_set_title,        con_set_title
  3352.         dd      szcon_get_input,        con_get_input
  3353.         dd      0
  3354.  
  3355. con_flags       dd      0x07    ; black on white
  3356. con_flags_attr  dd      0       ; Modifiers (for example, high intensity colors)
  3357. con.cursor_height dd    (15*font_height+50)/100
  3358. con.input_start dd      con.input_buffer
  3359. con.input_end   dd      con.input_buffer
  3360.  
  3361. con_esc_attr_n  dd      0
  3362. con_esc_attrs   dd      0,0,0,0
  3363. con_esc         db      0
  3364. con_sci         db      0
  3365. con_osc_str     rb      256
  3366. con_osc_strlen  dd      0
  3367.  
  3368. con.entered_char dw     -1
  3369. con.bGetchRequested db  0
  3370. con.bWasE0       db     0
  3371.  
  3372. szStart                 db 'START',0
  3373.  
  3374. szcon_init              db 'con_init',0
  3375. szcon_write_asciiz      db 'con_write_asciiz',0
  3376. szcon_write_string      db 'con_write_string',0
  3377. szcon_printf            db 'con_printf',0
  3378. szcon_exit              db 'con_exit',0
  3379. szVersion               db 'version',0
  3380. szcon_get_flags         db 'con_get_flags',0
  3381. szcon_set_flags         db 'con_set_flags',0
  3382. szcon_kbhit             db 'con_kbhit',0
  3383. szcon_getch             db 'con_getch',0
  3384. szcon_getch2            db 'con_getch2',0
  3385. szcon_gets              db 'con_gets',0
  3386. szcon_gets2             db 'con_gets2',0
  3387. szcon_get_font_height   db 'con_get_font_height',0
  3388. szcon_get_cursor_height db 'con_get_cursor_height',0
  3389. szcon_set_cursor_height db 'con_set_cursor_height',0
  3390. szcon_cls               db 'con_cls',0
  3391. szcon_get_cursor_pos    db 'con_get_cursor_pos',0
  3392. szcon_set_cursor_pos    db 'con_set_cursor_pos',0
  3393. szcon_set_title         db 'con_set_title',0
  3394. szcon_get_input         db 'con_get_input',0
  3395.  
  3396. con.thread_err      db 'Cannot create console thread!',13,10,0
  3397. con.nomem_err       db 'Not enough memory!',13,10,0
  3398. con.aFinished       db ' [Finished]',0
  3399. con.aNull           db '(null)',0
  3400. con.beep            db 0x90, 0x3C, 0x00
  3401. con.bell            db 0x85, 0x25, 0x85, 0x40, 0x00
  3402. con.ipc_buf         dd 0,8,0,0
  3403.                     db 0
  3404.  
  3405. section '.data' data readable writable align 16
  3406.  
  3407. process_info_buffer         process_info
  3408.  
  3409. con.finished_title          rb 256
  3410.  
  3411. con.cur_x                   dd ?        ; Active cursor column (0 based)
  3412. con.cur_y                   dd ?        ; Active cursor row (0 based)
  3413. con.main_cur_x              dd ?        ; Saved cursor position for main buffer
  3414. con.main_cur_y              dd ?        ; Saved cursor position for main buffer
  3415. con.wnd_xpos                dd ?        ; Active window position in active buffer
  3416. con.wnd_ypos                dd ?        ; Active window position in active buffer
  3417. con.main_wnd_xpos           dd ?        ; Saved window position for main buffer
  3418. con.main_wnd_ypos           dd ?        ; Saved window position for main buffer
  3419. con.scroll_top              dd ?        ; VT100 scroll region
  3420. con.scroll_bot              dd ?        ; VT100 scroll region
  3421.  
  3422. con.wnd_width               dd ?        ; window width (= alt buffer width)
  3423. con.wnd_height              dd ?        ; window height (= alt buffer height)
  3424. con.main_scr_width          dd ?        ; main buffer width
  3425. con.main_scr_height         dd ?        ; main buffer height
  3426. con.scr_width               dd ?        ; active buffer width
  3427. con.scr_height              dd ?        ; active buffer height
  3428. con.title                   dd ?
  3429. con.data                    dd ?        ; active buffer ptr
  3430. con.mainbuffer              dd ?
  3431. con.altbuffer               dd ?
  3432. con.image                   dd ?
  3433. con.console_tid             dd ?
  3434. con.data_width              dw ?        ; width in pixels
  3435. con.data_height             dw ?        ; height in pixels
  3436. con.vscrollbar_size         dd ?
  3437. con.vscrollbar_pos          dd ?
  3438. con.up_first_time           dd ?
  3439. con.down_first_time         dd ?
  3440. con.scroll_up_first_time    dd ?
  3441. con.scroll_down_first_time  dd ?
  3442. con.bUpPressed_saved        db ?
  3443. con.bDownPressed_saved      db ?
  3444. con.bScrollingUp_saved      db ?
  3445. con.bScrollingDown_saved    db ?
  3446.  
  3447. con.input_buffer            rw 128
  3448. con.input_buffer_end = $
  3449.  
  3450. con.kbd_layout              rb 128
  3451.  
  3452. con.thread_op               db ?
  3453. con.bUpPressed              db ?
  3454. con.bDownPressed            db ?
  3455. con.bScrollingUp            db ?
  3456. con.bScrollingDown          db ?
  3457.  
  3458. con.stack                   rb 1024
  3459. con.stack_top = $
  3460.