Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
836 diamond 1
; Функции работы с консолью для программ КолибриОС
852 diamond 2
; diamond, 2006-2008
836 diamond 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
 
9105 hidnplayr 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
 
836 diamond 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.
6067 serge 49
        push    ebx
836 diamond 50
        push    68
51
        pop     eax
52
        push    11
53
        pop     ebx
54
        int     0x40
6067 serge 55
        pop     ebx
836 diamond 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:
6067 serge 65
 
836 diamond 66
        pop     eax
67
        pop     [con.wnd_width]
68
        pop     [con.wnd_height]
9105 hidnplayr 69
        pop     [con.main_scr_width]
70
        pop     [con.main_scr_height]
836 diamond 71
        pop     [con.title]
72
        push    eax
2170 serge 73
 
9105 hidnplayr 74
        push    ebx
2170 serge 75
 
9105 hidnplayr 76
        mov     [con.init_cmd],1
6067 serge 77
 
836 diamond 78
        mov     ecx, 4
79
        mov     eax, con.wnd_width
2170 serge 80
        mov     edx, con.def_wnd_width
9105 hidnplayr 81
  .1:
836 diamond 82
        cmp     dword [eax], -1
83
        jnz     @f
2170 serge 84
        mov     ebx, [edx]
836 diamond 85
        mov     [eax], ebx
9105 hidnplayr 86
  @@:
836 diamond 87
        add     eax, 4
2170 serge 88
        add     edx, 4
836 diamond 89
        loop    .1
9105 hidnplayr 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)
836 diamond 98
        lea     ecx, [eax+eax]
9105 hidnplayr 99
 
100
; Alternate buffer
101
        mov     [con.altbuffer], ecx
836 diamond 102
        mov     eax, [con.wnd_width]
103
        mul     [con.wnd_height]
9105 hidnplayr 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]
836 diamond 110
        imul    eax, font_width*font_height
111
        mov     ebx, eax
112
        push    ebx ecx
113
        add     ecx, eax
9105 hidnplayr 114
 
115
; malloc
836 diamond 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
9105 hidnplayr 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
836 diamond 131
        mov     [con.data], eax
9105 hidnplayr 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
836 diamond 140
        push    edi
141
        mov     edi, eax
142
        shr     ecx, 1
143
        mov     ax, 0x0720
144
        rep     stosw
9105 hidnplayr 145
 
146
; Clear bitmap buffer
836 diamond 147
        mov     ecx, ebx
148
        mov     [con.image], edi
149
        xor     eax, eax
150
        rep     stosb
151
        pop     edi
1133 diamond 152
        and     byte [con_flags+1], not 2
9105 hidnplayr 153
 
836 diamond 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
9105 hidnplayr 164
        js      .fatal
836 diamond 165
        mov     [con.console_tid], eax
166
        pop     ebx
167
        ret
9105 hidnplayr 168
 
169
  .fatal:
836 diamond 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
9105 hidnplayr 180
        jmp     .fatal
181
  @@:
836 diamond 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]
1133 diamond 193
        and     ah, not 2
836 diamond 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
9105 hidnplayr 214
  @@:
836 diamond 215
        mov     eax, [con.cursor_height]
216
        ret     4
217
 
5835 pavelyakov 218
con_init_check:
9105 hidnplayr 219
        mov     ah, [con.init_cmd]
220
        test    ah, ah
221
        jne     .yes
6067 serge 222
 
9105 hidnplayr 223
        push    con.title_init_console
224
        push    -1
225
        push    -1
226
        push    -1
227
        push    -1
6067 serge 228
 
9105 hidnplayr 229
        call    con_init
230
  .yes:
231
        ret
6067 serge 232
 
836 diamond 233
; void __stdcall con_write_asciiz(const char* string);
234
con_write_asciiz:
9105 hidnplayr 235
 
236
        call    con_init_check
237
 
836 diamond 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:
9105 hidnplayr 247
 
836 diamond 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
3690 hidnplayr 311
con.charjump:
312
        dd      con_printf.normal
836 diamond 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:
9105 hidnplayr 334
 
335
        call    con_init_check
336
 
836 diamond 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
9105 hidnplayr 343
  .loop:
836 diamond 344
        xor     eax, eax
345
        lodsb
346
        test    al, al
347
        jz      .done
348
        cmp     al, '%'
349
        jz      .spec_begin
9105 hidnplayr 350
  .normal:
836 diamond 351
        call    con.write_char_ex
352
        inc     dword [esp+64+28]
353
        jmp     .loop
9105 hidnplayr 354
  .errspec:
355
  .percent:
836 diamond 356
        add     esp, 12
357
        jmp     .normal
9105 hidnplayr 358
  .spec_begin:
836 diamond 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/'+'/' '
9105 hidnplayr 378
  .spec:
836 diamond 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 - ' ']
3690 hidnplayr 388
        jmp     dword[con.charjump + ecx*4]
836 diamond 389
 
9105 hidnplayr 390
  .sharp:
836 diamond 391
        test    bl, bl
392
        jnz     .errspec
393
        or      bh, 1
394
        jmp     .spec
9105 hidnplayr 395
  .minus:
836 diamond 396
        test    bl, bl
397
        jnz     .errspec
398
        or      bh, 2
399
        jmp     .spec
9105 hidnplayr 400
  .plus:
401
  .space:
836 diamond 402
        test    bl, bl
403
        jnz     .errspec
404
        cmp     byte [esp], '+'
405
        jz      .spec
406
        mov     byte [esp], al
407
        jmp     .spec
9105 hidnplayr 408
  .zero:
836 diamond 409
        test    bl, bl
410
        jnz     .digit
411
        test    bh, 2
412
        jnz     .spec
413
        or      bh, 4
414
        inc     ebx
415
        jmp     .spec
9105 hidnplayr 416
  .digit:
836 diamond 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
9105 hidnplayr 428
  .precision:
836 diamond 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
9105 hidnplayr 436
  .asterisk:
836 diamond 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
9105 hidnplayr 445
  @@:
836 diamond 446
        mov     [esp+4], eax
447
        mov     bl, 3
448
        jmp     .spec
9105 hidnplayr 449
  .asterisk_precision:
836 diamond 450
        cmp     bl, 3
451
        jnz     .errspec
452
        mov     [esp+8], eax
453
        inc     ebx
454
        jmp     .spec
9105 hidnplayr 455
  .dot:
836 diamond 456
        cmp     bl, 2
457
        ja      .errspec
458
        mov     bl, 3
459
        and     dword [esp+8], 0
460
        jmp     .spec
9105 hidnplayr 461
  .long:
836 diamond 462
        cmp     bl, 3
463
        ja      .errspec
464
        mov     bl, 4
465
        jmp     .spec
9105 hidnplayr 466
  .short:
836 diamond 467
        cmp     bl, 3
468
        ja      .errspec
469
        mov     bl, 4
470
        or      bh, 8
471
        jmp     .spec
9105 hidnplayr 472
  .unsigned:
473
  .dec:
836 diamond 474
        push    10
475
        jmp     .write_number
9105 hidnplayr 476
  .pointer:
836 diamond 477
        mov     dword [esp+12], 8
478
        or      bh, 4
479
        and     bh, not 8
9105 hidnplayr 480
  .hex:
836 diamond 481
        push    16
482
        jmp     @f
9105 hidnplayr 483
  .oct:
836 diamond 484
        push    8
9105 hidnplayr 485
  @@:
836 diamond 486
        mov     byte [esp+4], 0
9105 hidnplayr 487
  .write_number:
836 diamond 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
9105 hidnplayr 502
  @@:
836 diamond 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
9105 hidnplayr 510
  @@:
836 diamond 511
        push    edx
512
        xor     edx, edx
513
; число в eax, основание системы счисления в ecx
9105 hidnplayr 514
  @@:
836 diamond 515
        cmp     dword [esp+16+8], 0
516
        jnz     .print_num
517
        test    eax, eax
518
        jz      .zeronum
9105 hidnplayr 519
  .print_num:
836 diamond 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
9105 hidnplayr 528
  @@:
836 diamond 529
        dec     edi
530
        mov     [edi], al
531
        xor     eax, eax
532
        xchg    eax, edx
533
        test    eax, eax
534
        jnz     .print_num
9105 hidnplayr 535
  .zeronum:
836 diamond 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
9105 hidnplayr 546
  .noprec1:
836 diamond 547
        test    bh, 4
548
        jnz     .do_print_num
9105 hidnplayr 549
  .len_found1:
836 diamond 550
        test    bh, 2
551
        jnz     .do_print_num
552
        cmp     byte [esp+20], 0
553
        jz      @f
554
        inc     eax
9105 hidnplayr 555
  @@:
836 diamond 556
        cmp     byte [esp+20], 0
557
        jnz     @f
558
        cmp     byte [esp+4], 0
559
        jz      @f
560
        inc     eax
9105 hidnplayr 561
  @@:
836 diamond 562
        test    bh, 1
563
        jz      .nosharp1
564
        cmp     cl, 8
565
        jnz     @f
566
        inc     eax
567
        jmp     .nosharp1
9105 hidnplayr 568
  @@:
836 diamond 569
        cmp     cl, 16
570
        jnz     .nosharp1
571
        inc     eax
572
        inc     eax
9105 hidnplayr 573
  .nosharp1:
836 diamond 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, ' '
9105 hidnplayr 581
  @@:
836 diamond 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
9105 hidnplayr 590
  .do_print_num:
836 diamond 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
9105 hidnplayr 597
  .write_sign:
836 diamond 598
        call    .num_write_char
9105 hidnplayr 599
  .sign_written:
836 diamond 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]
9105 hidnplayr 609
  @@:
836 diamond 610
        call    .num_write_char
9105 hidnplayr 611
  .nosharp2:
836 diamond 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
9105 hidnplayr 618
  .noprec2:
836 diamond 619
        test    bh, 4
620
        jz      .do_print_num2
621
        add     ecx, [esp]
622
        sub     ecx, [esp+20+4]
9105 hidnplayr 623
  .lead_zeroes:
836 diamond 624
        jae     .do_print_num2
9105 hidnplayr 625
  @@:
836 diamond 626
        mov     al, '0'
627
        call    .num_write_char
628
        inc     ecx
629
        jnz     @b
9105 hidnplayr 630
  .do_print_num2:
836 diamond 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
9105 hidnplayr 637
  .num_written:
836 diamond 638
        pop     ecx
639
        mov     edi, [esp+12]
640
        cmp     dword [esp+16+4], -1
641
        jz      .num_written2
9105 hidnplayr 642
  @@:
836 diamond 643
        cmp     ecx, [esp+16+4]
644
        jae     .num_written2
645
        mov     al, ' '
646
        call    con.write_char
647
        inc     ecx
648
        jmp     @b
9105 hidnplayr 649
  .num_written2:
836 diamond 650
        add     esp, 16
9105 hidnplayr 651
  .spec_done:
836 diamond 652
        add     esp, 12
653
        jmp     .loop
9105 hidnplayr 654
  .char:
836 diamond 655
        mov     ecx, [esp+4]
656
        cmp     ecx, -1
657
        jnz     @f
658
        inc     ecx
9105 hidnplayr 659
  @@:
836 diamond 660
        test    ecx, ecx
661
        jnz     @f
662
        inc     ecx
9105 hidnplayr 663
  @@:
836 diamond 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
9105 hidnplayr 670
  @@:
836 diamond 671
        call    con.write_char
672
        loop    @b
9105 hidnplayr 673
  .nowidth:
836 diamond 674
        mov     al, [ebp]
675
        add     ebp, 4
676
        jmp     .percent
9105 hidnplayr 677
  .char_left_pad:
836 diamond 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, ' '
9105 hidnplayr 685
  @@:
836 diamond 686
        call    con.write_char
687
        loop    @b
9105 hidnplayr 688
  .nowidth2:
836 diamond 689
        jmp     .spec_done
9105 hidnplayr 690
  .string:
836 diamond 691
        push    esi
692
        mov     esi, [ebp]
693
        test    esi, esi
694
        jnz     @f
695
        mov     esi, con.aNull
9105 hidnplayr 696
  @@:
836 diamond 697
        add     ebp, 4
698
        or      ecx, -1
9105 hidnplayr 699
  @@:
836 diamond 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]
9105 hidnplayr 706
  @@:
836 diamond 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, ' '
9105 hidnplayr 715
  @@:
836 diamond 716
        call    con.write_char
717
        inc     dword [esp+20+64+28]
718
        inc     ecx
719
        jnz     @b
9105 hidnplayr 720
  .nospace:
836 diamond 721
        pop     ecx
9105 hidnplayr 722
  .write_string:
836 diamond 723
        jecxz   .string_written
724
        add     dword [esp+16+64+28], ecx
725
        push    ecx
9105 hidnplayr 726
  @@:
836 diamond 727
        lodsb
728
        call    con.write_char_ex
729
        loop    @b
730
        pop     ecx
9105 hidnplayr 731
  .string_written:
836 diamond 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, ' '
9105 hidnplayr 740
  @@:
836 diamond 741
        call    con.write_char
742
        inc     dword [esp+12+64+28]
743
        inc     ecx
744
        jnz     @b
745
        jmp     .spec_done
9105 hidnplayr 746
  .done:
836 diamond 747
        add     esp, 64
748
        popad
749
        jmp     con.update_screen
9105 hidnplayr 750
  .num_write_char:
836 diamond 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
9105 hidnplayr 764
  .loop:
836 diamond 765
        lodsb
766
        cmp     ebx, -1
767
        jnz     @f
768
        test    al, al
769
        jz      .done
9105 hidnplayr 770
  @@:
836 diamond 771
        call    con.write_char_ex
9105 hidnplayr 772
  .next:
836 diamond 773
        cmp     ebx, -1
774
        jz      .loop
775
        dec     ebx
776
        jnz     .loop
9105 hidnplayr 777
  .done:
836 diamond 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
3690 hidnplayr 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
9105 hidnplayr 801
  @@:
3690 hidnplayr 802
        mov     eax, [esp]
836 diamond 803
        stosb
804
        mov     al, byte [con_flags]
805
        stosb
3690 hidnplayr 806
 
836 diamond 807
        mov     eax, [con.cur_x]
808
        inc     eax
809
        mov     [con.cur_x], eax
3690 hidnplayr 810
 
836 diamond 811
        pop     eax
812
        ret
813
 
814
con.write_special_char:
815
        cmp     [con_esc], 0
816
        jnz     .esc_mode
9105 hidnplayr 817
  .normal_mode:
836 diamond 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
9096 hidnplayr 826
        cmp     al, 7
827
        jz      .bell
836 diamond 828
        cmp     al, 9
829
        jnz     con.write_char
9105 hidnplayr 830
  .write_tab:
836 diamond 831
        mov     al, ' '
832
        call    con.write_char
833
        test    [con.cur_x], 7
834
        jnz     .write_tab
835
        ret
9105 hidnplayr 836
  .write_cr:
836 diamond 837
        and     [con.cur_x], 0
838
        jmp     con.get_data_ptr
9105 hidnplayr 839
  .write_lf:
836 diamond 840
        and     [con.cur_x], 0
841
        jmp     con.newline
9105 hidnplayr 842
  .write_bs:
836 diamond 843
        cmp     [con.cur_x], 0
844
        jz      @f
845
        dec     [con.cur_x]
846
        dec     edi
847
        dec     edi
848
        ret
9105 hidnplayr 849
  @@:
836 diamond 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
9105 hidnplayr 860
  @@:
836 diamond 861
        pop     eax
862
        ret
9105 hidnplayr 863
  .bell:
9096 hidnplayr 864
        pusha
865
        push    55
866
        pop     eax
867
        mov     ebx, eax
9105 hidnplayr 868
        mov     esi, con.bell
9096 hidnplayr 869
        int     0x40
870
        popa
871
        ret
9105 hidnplayr 872
  .write_esc:
836 diamond 873
        mov     [con_esc], 1
874
        mov     [con_esc_attr_n], 1
875
        and     [con_esc_attrs], 0
876
        ret
9105 hidnplayr 877
 
878
  .esc_mode:
836 diamond 879
        cmp     [con_sci], 0
880
        jnz     .esc_sci
9125 hidnplayr 881
        cmp     al, '['         ; CSI - Control Sequence Introducer
9105 hidnplayr 882
        je      .esc_sqro
9125 hidnplayr 883
        cmp     al, ']'         ; OSC - Operating System Command
9105 hidnplayr 884
        je      .esc_sqrc
9125 hidnplayr 885
        cmp     al, '('         ; Designate G0 Character Set, VT100, ISO 2022.
9105 hidnplayr 886
        je      .esc_rndo
9125 hidnplayr 887
        cmp     al, '>'         ; Normal Keypad (DECKPNM), VT100.
9105 hidnplayr 888
        je      .keypm_norm
9125 hidnplayr 889
        cmp     al, '='         ; Application Keypad (DECKPAM).
9105 hidnplayr 890
        je      .keypm_alt
9125 hidnplayr 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
9105 hidnplayr 902
; Unrecognized escape sequence, print it to screen
836 diamond 903
        push    eax
904
        mov     al, 27
905
        call    con.write_char
906
        pop     eax
907
        jmp     con.write_char
9105 hidnplayr 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
 
836 diamond 929
.esc_sci:
9105 hidnplayr 930
        cmp     [con_sci], 3
931
        je      .string
932
        cmp     [con_sci], 4
933
        je      .g0charset
836 diamond 934
; this is real Esc sequence
3886 hidnplayr 935
        cmp     al, '?'         ; DEC private mode (DECSET/DECRST sequences)
936
        je      .questionmark
836 diamond 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
9105 hidnplayr 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
3886 hidnplayr 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
836 diamond 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
9105 hidnplayr 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
@@:
836 diamond 1013
        pop     eax
1014
        ret
1015
.not_digit:
1016
        mov     [con_esc], 0
1017
        mov     [con_sci], 0    ; in any case, leave Esc mode
9105 hidnplayr 1018
 
1019
;        cmp     al, '@'
1020
;        je      .insert_chars
853 diamond 1021
        cmp     al, 'A'
9105 hidnplayr 1022
        je      .cursor_up
853 diamond 1023
        cmp     al, 'B'
9105 hidnplayr 1024
        je      .cursor_down
853 diamond 1025
        cmp     al, 'C'
9105 hidnplayr 1026
        je      .cursor_right
853 diamond 1027
        cmp     al, 'D'
9105 hidnplayr 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
9096 hidnplayr 1043
        cmp     al, 'K'
1044
        je      .erase_in_line
9105 hidnplayr 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
 
836 diamond 1075
        ret     ; simply skip unknown sequences
3886 hidnplayr 1076
 
9105 hidnplayr 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:
3886 hidnplayr 1188
        mov     eax, [con_esc_attrs]
1189
        cmp     eax, 0xffffffff
1190
        jne     .no_dec_rst
1191
        mov     eax, [con_esc_attrs+4]
9105 hidnplayr 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
3886 hidnplayr 1198
        cmp     eax, 25
9105 hidnplayr 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
3886 hidnplayr 1210
.no_dec_rst:
9105 hidnplayr 1211
;        cmp     eax, 2
1212
;        je      .rst_keyb_action_mode
1213
;        cmp     eax, 4
1214
;        je      .set_replace_mode
3886 hidnplayr 1215
        ret
1216
 
9105 hidnplayr 1217
.set_mode:
3886 hidnplayr 1218
        mov     eax, [con_esc_attrs]
1219
        cmp     eax, 0xffffffff
1220
        jne     .no_dec_set
1221
        mov     eax, [con_esc_attrs+4]
9105 hidnplayr 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
3886 hidnplayr 1228
        cmp     eax, 25
9105 hidnplayr 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
3886 hidnplayr 1240
.no_dec_set:
9105 hidnplayr 1241
;        cmp     eax, 2
1242
;        je      .set_keyb_action_mode
1243
;        cmp     eax, 4
1244
;        je      .set_insert_mode
3886 hidnplayr 1245
        ret
1246
 
9105 hidnplayr 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:
3886 hidnplayr 1256
        mov     [con.cursor_height], (15*font_height+50)/100    ; default height
1257
        ret
9096 hidnplayr 1258
 
9105 hidnplayr 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
 
9096 hidnplayr 1359
.erase_in_line:
1360
        mov     eax, [con_esc_attrs]
1361
        test    eax, eax
9105 hidnplayr 1362
        jz      .erase_after                    ; [0K (or [K)
9096 hidnplayr 1363
        dec     eax
9105 hidnplayr 1364
        jz      .erase_before                   ; [1K
9096 hidnplayr 1365
        dec     eax
1366
        je      .erase_current_line             ; [2K
1367
        ret     ; unknown sequence
1368
 
9105 hidnplayr 1369
.erase_after:
9096 hidnplayr 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
 
9105 hidnplayr 1379
.erase_before:
9096 hidnplayr 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
 
9105 hidnplayr 1405
.erase_in_display:
3885 hidnplayr 1406
        mov     eax, [con_esc_attrs]
1407
        test    eax, eax
9105 hidnplayr 1408
        jz      .erase_below            ; [0J (or [J)
3885 hidnplayr 1409
        dec     eax
9105 hidnplayr 1410
        jz      .erase_above            ; [1J
3885 hidnplayr 1411
        dec     eax
9105 hidnplayr 1412
        je      .erase_all              ; [2J
3885 hidnplayr 1413
        ret     ; unknown sequence
1414
 
9105 hidnplayr 1415
.erase_below:
3885 hidnplayr 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
 
9105 hidnplayr 1436
.erase_above:
3885 hidnplayr 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
 
9105 hidnplayr 1448
.erase_all:   ; clear screen completely
853 diamond 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
9105 hidnplayr 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
3688 hidnplayr 1469
        mov     [con.cur_y], eax
9105 hidnplayr 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
3686 hidnplayr 1481
@@:
9105 hidnplayr 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
@@:
853 diamond 1493
        cmp     eax, [con.scr_width]
9105 hidnplayr 1494
        jae     .no_x
853 diamond 1495
        mov     [con.cur_x], eax
9105 hidnplayr 1496
.no_x:
853 diamond 1497
.j_get_data:
1498
        jmp     con.get_data_ptr
1499
.cursor_up:
9105 hidnplayr 1500
        mov     eax, [con_esc_attrs]
1501
        test    eax, eax
1502
        jnz     @f
1503
        inc     eax     ; default = 1
853 diamond 1504
@@:
9105 hidnplayr 1505
        sub     [con.cur_y], eax
1506
        jns     .j_get_data
1507
        mov     [con.cur_y], 0
853 diamond 1508
        jmp     .j_get_data
1509
.cursor_down:
9105 hidnplayr 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]
853 diamond 1516
        cmp     eax, [con.scr_height]
9105 hidnplayr 1517
        ja      @f
1518
        mov     [con.cur_y], eax
1519
        jmp     .j_get_data
1520
@@:
853 diamond 1521
        mov     eax, [con.scr_height]
1522
        mov     [con.cur_y], eax
1523
        jmp     .j_get_data
1524
.cursor_right:
9105 hidnplayr 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]
853 diamond 1531
        cmp     eax, [con.scr_width]
9105 hidnplayr 1532
        ja      @f
1533
        mov     [con.cur_x], eax
1534
        jmp     .j_get_data
1535
@@:
853 diamond 1536
        mov     eax, [con.scr_width]
1537
        mov     [con.cur_x], eax
1538
        jmp     .j_get_data
1539
.cursor_left:
9105 hidnplayr 1540
        test    eax, eax
1541
        jnz     @f
1542
        inc     eax     ; default = 1
853 diamond 1543
@@:
9105 hidnplayr 1544
        sub     [con.cur_x], eax
1545
        jns     .j_get_data
1546
        mov     [con.cur_x], 0
853 diamond 1547
        jmp     .j_get_data
836 diamond 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
9105 hidnplayr 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
3690 hidnplayr 1567
 
9105 hidnplayr 1568
; Forground colors
836 diamond 1569
        xor     edx, edx
9105 hidnplayr 1570
        cmp     al, 30          ; Black
836 diamond 1571
        jz      .attr_color
1572
        mov     dl, 4
9105 hidnplayr 1573
        cmp     al, 31          ; Red
836 diamond 1574
        jz      .attr_color
1575
        mov     dl, 2
9105 hidnplayr 1576
        cmp     al, 32          ; Green
836 diamond 1577
        jz      .attr_color
1578
        mov     dl, 6
9105 hidnplayr 1579
        cmp     al, 33          ; Yellow
836 diamond 1580
        jz      .attr_color
1581
        mov     dl, 1
9105 hidnplayr 1582
        cmp     al, 34          ; Blue
836 diamond 1583
        jz      .attr_color
1584
        mov     dl, 5
9105 hidnplayr 1585
        cmp     al, 35          ; Purple
836 diamond 1586
        jz      .attr_color
1587
        mov     dl, 3
9105 hidnplayr 1588
        cmp     al, 36          ; Cyan
836 diamond 1589
        jz      .attr_color
1590
        mov     dl, 7
9105 hidnplayr 1591
        cmp     al, 37          ; White
836 diamond 1592
        jz      .attr_color
9105 hidnplayr 1593
        mov     dl, 7
1594
        cmp     al, 39          ; Default - White
1595
        jz      .attr_color
3690 hidnplayr 1596
 
9105 hidnplayr 1597
; Background colors
836 diamond 1598
        xor     edx, edx
9105 hidnplayr 1599
        cmp     al, 40          ; Black
836 diamond 1600
        jz      .attr_bgr_color
1601
        mov     dl, 0x40
9105 hidnplayr 1602
        cmp     al, 41          ; Red
836 diamond 1603
        jz      .attr_bgr_color
1604
        mov     dl, 0x20
9105 hidnplayr 1605
        cmp     al, 42          ; Green
836 diamond 1606
        jz      .attr_bgr_color
1607
        mov     dl, 0x60
9105 hidnplayr 1608
        cmp     al, 43          ; Yellow
836 diamond 1609
        jz      .attr_bgr_color
1610
        mov     dl, 0x10
9105 hidnplayr 1611
        cmp     al, 44          ; Blue
836 diamond 1612
        jz      .attr_bgr_color
1613
        mov     dl, 0x50
9105 hidnplayr 1614
        cmp     al, 45          ; Magenta
836 diamond 1615
        jz      .attr_bgr_color
1616
        mov     dl, 0x30
9105 hidnplayr 1617
        cmp     al, 46          ; Cyan
836 diamond 1618
        jz      .attr_bgr_color
1619
        mov     dl, 0x70
9105 hidnplayr 1620
        cmp     al, 47          ; White
3690 hidnplayr 1621
        jz      .attr_bgr_color
9105 hidnplayr 1622
        mov     dl, 0
1623
        cmp     al, 49          ; Default - Black
1624
        jz      .attr_bgr_color
3690 hidnplayr 1625
 
9105 hidnplayr 1626
; 16-color support, bright colors follow
1627
; Foreground colors
3690 hidnplayr 1628
        mov     dl, 0x08
9105 hidnplayr 1629
        cmp     al, 90          ; Black
3690 hidnplayr 1630
        jz      .attr_color
1631
        mov     dl, 4 + 8
9105 hidnplayr 1632
        cmp     al, 91          ; Red
3690 hidnplayr 1633
        jz      .attr_color
1634
        mov     dl, 2 + 8
9105 hidnplayr 1635
        cmp     al, 92          ; Green
3690 hidnplayr 1636
        jz      .attr_color
1637
        mov     dl, 6 + 8
9105 hidnplayr 1638
        cmp     al, 93          ; Yellow
3690 hidnplayr 1639
        jz      .attr_color
1640
        mov     dl, 1 + 8
9105 hidnplayr 1641
        cmp     al, 94          ; Blue
3690 hidnplayr 1642
        jz      .attr_color
1643
        mov     dl, 5 + 8
9105 hidnplayr 1644
        cmp     al, 95          ; Magenta
3690 hidnplayr 1645
        jz      .attr_color
1646
        mov     dl, 3 + 8
9105 hidnplayr 1647
        cmp     al, 96          ; Cyan
3690 hidnplayr 1648
        jz      .attr_color
1649
        mov     dl, 7 + 8
9105 hidnplayr 1650
        cmp     al, 97          ; White
3690 hidnplayr 1651
        jz      .attr_color
1652
 
9105 hidnplayr 1653
; Background colors
3690 hidnplayr 1654
        mov     dl, 0x80
9105 hidnplayr 1655
        cmp     al, 100         ; Black
3690 hidnplayr 1656
        jz      .attr_bgr_color
1657
        mov     dl, 0x80 + 0x40
9105 hidnplayr 1658
        cmp     al, 101         ; Red
3690 hidnplayr 1659
        jz      .attr_bgr_color
1660
        mov     dl, 0x80 + 0x20
9105 hidnplayr 1661
        cmp     al, 102         ; Green
3690 hidnplayr 1662
        jz      .attr_bgr_color
1663
        mov     dl, 0x80 + 0x60
9105 hidnplayr 1664
        cmp     al, 103         ; Yellow
3690 hidnplayr 1665
        jz      .attr_bgr_color
1666
        mov     dl, 0x80 + 0x10
9105 hidnplayr 1667
        cmp     al, 104         ; Blue
3690 hidnplayr 1668
        jz      .attr_bgr_color
1669
        mov     dl, 0x80 + 0x50
9105 hidnplayr 1670
        cmp     al, 105         ; Magenta
3690 hidnplayr 1671
        jz      .attr_bgr_color
1672
        mov     dl, 0x80 + 0x30
9105 hidnplayr 1673
        cmp     al, 106         ; Cyan
3690 hidnplayr 1674
        jz      .attr_bgr_color
1675
        mov     dl, 0x80 + 0x70
9105 hidnplayr 1676
        cmp     al, 107         ; White
836 diamond 1677
        jnz     .attr_continue
3690 hidnplayr 1678
 
836 diamond 1679
.attr_bgr_color:
1680
        mov     eax, [con_flags]
3690 hidnplayr 1681
        and     al, 0x0F
9105 hidnplayr 1682
        or      al, byte [con_flags_attr]
836 diamond 1683
        or      al, dl
1684
        mov     [con_flags], eax
1685
        jmp     .attr_continue
1686
.attr_color:
1687
        mov     eax, [con_flags]
3690 hidnplayr 1688
        and     al, 0xF0
9105 hidnplayr 1689
        or      al, byte [con_flags_attr]
836 diamond 1690
        or      al, dl
1691
        mov     [con_flags], eax
1692
        jmp     .attr_continue
1693
.attr_normal:
9105 hidnplayr 1694
        mov     byte [con_flags_attr], 0
1695
        mov     byte [con_flags], 0x07
836 diamond 1696
        jmp     .attr_continue
1697
.attr_reversed:
1698
        mov     byte [con_flags], 0x70
1699
        jmp     .attr_continue
1700
.attr_bold:
9105 hidnplayr 1701
        or      byte [con_flags_attr], 0x08
836 diamond 1702
        jmp     .attr_continue
1703
.attr_bgr_bold:
9105 hidnplayr 1704
        or      byte [con_flags_attr], 0x80
836 diamond 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:
9096 hidnplayr 1862
 
9105 hidnplayr 1863
        mov     ah, [con.init_cmd]
1864
        test    ah, ah
1865
        je      .ret
5835 pavelyakov 1866
 
836 diamond 1867
        cmp     byte [esp+4], 0
1868
        jz      .noexit
9105 hidnplayr 1869
        mov     [con.thread_op], OP_EXIT
836 diamond 1870
        call    con.wake
9096 hidnplayr 1871
 
836 diamond 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
9105 hidnplayr 1902
        mov     [con.thread_op], OP_SET_TITLE
836 diamond 1903
        call    con.wake
1904
        ret     4
1905
 
1906
; int __stdcall con_kbhit(void);
1907
con_kbhit:
1133 diamond 1908
        test    byte [con_flags+1], 2
1909
        jnz     @f
836 diamond 1910
        mov     eax, [con.input_start]
1911
        cmp     eax, [con.input_end]
9127 hidnplayr 1912
        jnz     @f
1913
        cmp     [con.entered_char], 0xffff
1133 diamond 1914
@@:
836 diamond 1915
        setnz   al
1916
        movzx   eax, al
1917
        ret
1918
 
1919
con.force_entered_char:
1920
        cmp     [con.entered_char], -1
1921
        jnz     .ret
9105 hidnplayr 1922
        mov     [con.thread_op], OP_GETCH
836 diamond 1923
        call    con.wake
1133 diamond 1924
        test    byte [con_flags+1], 2
1925
        jnz     .ret
836 diamond 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:
9105 hidnplayr 1942
        call    con_init_check
836 diamond 1943
        call    con.force_entered_char
1133 diamond 1944
        test    byte [con_flags+1], 2
1945
        jnz     con_getch_closed
836 diamond 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
 
1133 diamond 1955
con_getch_closed:
1145 diamond 1956
        xor     eax, eax
1133 diamond 1957
        ret
1958
 
836 diamond 1959
; int __stdcall con_getch2(void);
1960
con_getch2:
9105 hidnplayr 1961
        call    con_init_check
836 diamond 1962
        call    con.force_entered_char
1133 diamond 1963
        test    byte [con_flags+1], 2
1964
        jnz     con_getch_closed
836 diamond 1965
        mov     eax, 0xFFFF
1966
        xchg    ax, [con.entered_char]
1967
        ret
1968
 
9105 hidnplayr 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
9125 hidnplayr 1978
        mov     ebx, [esp+8]
9105 hidnplayr 1979
  .check_more:
1980
; Avoid buffer overflow
9125 hidnplayr 1981
        cmp     dword[esp+12], 16
9105 hidnplayr 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
9125 hidnplayr 2043
        sub     [esp+12], eax
9105 hidnplayr 2044
        add     ebx, eax
2045
        jmp     .check_more
2046
  .no_more:
2047
        mov     eax, ebx
9125 hidnplayr 2048
        sub     eax, [esp+8]
9105 hidnplayr 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
 
1133 diamond 2157
; char* __stdcall con_gets(char* str, int n);
836 diamond 2158
con_gets:
852 diamond 2159
        pop     eax
2160
        push    0
2161
        push    eax
1133 diamond 2162
; char* __stdcall con_gets2(con_gets2_callback callback, char* str, int n);
852 diamond 2163
con_gets2:
9105 hidnplayr 2164
        call    con_init_check
1133 diamond 2165
        mov     eax, [esp+8]            ; str
836 diamond 2166
        pushad
1133 diamond 2167
        mov     esi, eax                ; str
852 diamond 2168
        mov     ebx, [esp+20h+12]       ; n
836 diamond 2169
        sub     ebx, 1
2170
        jle     .ret
2171
        mov     byte [esi], 0
2172
        xor     ecx, ecx                ; длина уже введённой строки
2173
        call    con.get_data_ptr
2174
.loop:
852 diamond 2175
        call    con_getch2
836 diamond 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
852 diamond 2184
        cmp     al, 9
2185
        jz      .tab
836 diamond 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
852 diamond 2212
.ret_us:
836 diamond 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
852 diamond 2248
        cmp     esi, [esp+20h+8]
836 diamond 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:
852 diamond 2264
        cmp     esi, [esp+20h+8]
836 diamond 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
852 diamond 2328
.tab:
2329
        mov     al, 0
2330
        mov     ah, 0xF
836 diamond 2331
.extended:
1145 diamond 2332
        test    ah, ah
2333
        jz      .closed
852 diamond 2334
        xchg    al, ah
836 diamond 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
852 diamond 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
836 diamond 2443
        jmp     .loop
2444
.left:
852 diamond 2445
        cmp     esi, [esp+20h+8]
836 diamond 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:
852 diamond 2458
        cmp     esi, [esp+20h+8]
836 diamond 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
1133 diamond 2473
.closed:
2474
        and     dword [esp+1Ch], 0
836 diamond 2475
.ret:
2476
        popad
852 diamond 2477
        ret     12
836 diamond 2478
 
853 diamond 2479
; void __stdcall con_cls();
2480
con_cls:
9105 hidnplayr 2481
        mov     ah, [con.init_cmd]
2482
        test    ah, ah
2483
        je      cmd_init_no
9096 hidnplayr 2484
 
853 diamond 2485
        push    edi
9105 hidnplayr 2486
        call    con.write_special_char.erase_all
853 diamond 2487
        pop     edi
2488
        call    con.update_screen
9096 hidnplayr 2489
 
9105 hidnplayr 2490
        ret
9096 hidnplayr 2491
 
9105 hidnplayr 2492
cmd_init_no:
9096 hidnplayr 2493
 
9105 hidnplayr 2494
        push    con.title_init_console
2495
        push    -1
2496
        push    -1
2497
        push    -1
2498
        push    -1
9096 hidnplayr 2499
 
9105 hidnplayr 2500
        call    con_init
9096 hidnplayr 2501
 
853 diamond 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
 
836 diamond 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
9105 hidnplayr 2550
        mov     [con.thread_op], OP_REDRAW
836 diamond 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]
1133 diamond 2563
        jecxz   .ret
836 diamond 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
9163 Doczom 2585
        push    0x80000067 ;  program dont getting events mouse, when it dont active
836 diamond 2586
        pop     ebx
2587
        int     0x40
9163 Doczom 2588
        xor     ebx,ebx     ;clear ebx
836 diamond 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
8328 superturbo 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
 
836 diamond 2631
con.thread_exit:
1133 diamond 2632
        or      byte [con_flags+1], 2
2633
        and     [con.console_tid], 0
1134 diamond 2634
        and     [con.entered_char], 0
836 diamond 2635
        or      eax, -1
2636
        int     0x40
2637
con.key:
2638
        mov     al, 2
2639
        int     0x40
5618 hidnplayr 2640
        and     eax, 0xffff ; supress scancodes
836 diamond 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
4402 hidnplayr 2666
        cmp     dl, 0x4e
2667
        je      .numpad
2668
        cmp     dl, 0x4a
2669
        je      .numpad
836 diamond 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
4306 hidnplayr 2677
        test    al, 0x80        ; numlock
2678
        jnz     .numlock
836 diamond 2679
        bt      [scan_has_ascii], edx
2680
        jnc     .extended
4306 hidnplayr 2681
        test    al, 0x30        ; alt
836 diamond 2682
        jnz     .extended
4306 hidnplayr 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
4402 hidnplayr 2690
  .numpad:
4306 hidnplayr 2691
        mov     dh, [con.extended_numlock+edx-71]
2692
        xchg    dl, dh
2693
        jmp     .gotcode
2694
  .no_numlock:
836 diamond 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
4384 hidnplayr 2721
 
836 diamond 2722
        mov     ecx, con.extended_shift
2723
        test    al, 3
2724
        jnz     .xlat
4384 hidnplayr 2725
 
836 diamond 2726
        mov     ecx, con.extended_ctrl
2727
        test    al, 0xC
2728
        jnz     .xlat
4384 hidnplayr 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
@@:
836 diamond 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
9105 hidnplayr 2805
        dec     eax
2806
        jz      con.resize
836 diamond 2807
        jmp     con.msg_loop
9105 hidnplayr 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
836 diamond 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:
5618 hidnplayr 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
836 diamond 2877
        xor     eax, eax
5618 hidnplayr 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
836 diamond 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
9105 hidnplayr 3116
 
836 diamond 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]
2530 leency 3128
        mov     edx, 0x74000000
836 diamond 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
9105 hidnplayr 3138
 
3139
        mov     eax, 9
3140
        mov     ebx, process_info_buffer
3141
        mov     ecx, -1
3034 leency 3142
        int     0x40
9105 hidnplayr 3143
        test    [process_info_buffer.wnd_state], 110b   ; window is rolled up or minimized to panel
3034 leency 3144
        jnz     .exit
9105 hidnplayr 3145
 
836 diamond 3146
        call    con.draw_image
3034 leency 3147
 
3148
.exit:
836 diamond 3149
        push    12
3150
        pop     eax
3151
        push    2
3152
        pop     ebx
3153
        int     0x40
3686 hidnplayr 3154
 
836 diamond 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
4306 hidnplayr 3307
con.extended_numlock:
3308
        db      '7', '8', '9', '-'
3309
        db      '4', '5', '6', '+'
3310
        db      '1', '2', '3'
3311
        db      '0', '.'
836 diamond 3312
 
9105 hidnplayr 3313
 
3314
cursor_esc      dd 27 + ('[' shl 8)
3315
 
836 diamond 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
 
5835 pavelyakov 3325
con.init_cmd db 0
3326
con.title_init_console db "Console",0
836 diamond 3327
con.vscroll_pt      dd    -1
3328
 
3329
align 16
3330
EXPORTS:
3331
        dd      szStart,                START
9105 hidnplayr 3332
        dd      szVersion,              0x00020009
836 diamond 3333
        dd      szcon_init,             con_init
3334
        dd      szcon_write_asciiz,     con_write_asciiz
3686 hidnplayr 3335
        dd      szcon_write_string,     con_write_length
836 diamond 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
852 diamond 3344
        dd      szcon_gets2,            con_gets2
836 diamond 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
853 diamond 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
6603 0CodErr 3351
        dd      szcon_set_title,        con_set_title
9105 hidnplayr 3352
        dd      szcon_get_input,        con_get_input
836 diamond 3353
        dd      0
3354
 
9105 hidnplayr 3355
con_flags       dd      0x07    ; black on white
3356
con_flags_attr  dd      0       ; Modifiers (for example, high intensity colors)
836 diamond 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
9105 hidnplayr 3365
con_osc_str     rb      256
3366
con_osc_strlen  dd      0
836 diamond 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
3686 hidnplayr 3376
szcon_write_string      db 'con_write_string',0
836 diamond 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
852 diamond 3386
szcon_gets2             db 'con_gets2',0
836 diamond 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
853 diamond 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
6603 0CodErr 3393
szcon_set_title         db 'con_set_title',0
9105 hidnplayr 3394
szcon_get_input         db 'con_get_input',0
836 diamond 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
9096 hidnplayr 3400
con.beep            db 0x90, 0x3C, 0x00
9105 hidnplayr 3401
con.bell            db 0x85, 0x25, 0x85, 0x40, 0x00
836 diamond 3402
con.ipc_buf         dd 0,8,0,0
3403
                    db 0
3404
 
3405
section '.data' data readable writable align 16
3406
 
9105 hidnplayr 3407
process_info_buffer         process_info
3408
 
836 diamond 3409
con.finished_title          rb 256
3410
 
9105 hidnplayr 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
836 diamond 3421
 
9105 hidnplayr 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 ?
836 diamond 3446
 
9105 hidnplayr 3447
con.input_buffer            rw 128
836 diamond 3448
con.input_buffer_end = $
3449
 
9105 hidnplayr 3450
con.kbd_layout              rb 128
836 diamond 3451
 
9105 hidnplayr 3452
con.thread_op               db ?
3453
con.bUpPressed              db ?
3454
con.bDownPressed            db ?
3455
con.bScrollingUp            db ?
3456
con.bScrollingDown          db ?
836 diamond 3457
 
3458
con.stack                   rb 1024
3459
con.stack_top = $