source: vendor/emx/current/src/dos/termio.asm

Last change on this file was 18, checked in by bird, 22 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 27.4 KB
Line 
1;
2; TERMIO.ASM -- General terminal interface
3;
4; Copyright (c) 1991-1995 by Eberhard Mattes
5;
6; This file is part of emx.
7;
8; emx is free software; you can redistribute it and/or modify it
9; under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2, or (at your option)
11; any later version.
12;
13; emx is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17;
18; You should have received a copy of the GNU General Public License
19; along with emx; see the file COPYING. If not, write to
20; the Free Software Foundation, 59 Temple Place - Suite 330,
21; Boston, MA 02111-1307, USA.
22;
23; See emx.asm for a special exception.
24;
25
26__TERMIO = 1
27 INCLUDE EMX.INC
28 INCLUDE TERMIO.INC
29 INCLUDE SIGNAL.INC
30 INCLUDE PROCESS.INC
31 INCLUDE ERRORS.INC
32
33 PUBLIC STDIN_TERMIO, STDIN_FL
34 PUBLIC TERMIO_INIT, TERMIO_READ, STDIN_AVAIL, KBD_FLUSH
35 PUBLIC POLL_KEYBOARD, INIT_TERMIO
36
37SV_DATA SEGMENT
38
39CHAR_SIG = 0100H
40CHAR_NO = 0101H
41CHAR_TIME = 0102H
42
43STDIN_TERMIO TERMIO <>
44STDIN_ESCAPE DB FALSE
45 DALIGN 4
46STDIN_FL DD 0
47STDIN_BUFFERED DD 0
48STDIN_BUF_PTR DD ?
49STDIN_BUFFER DB 256 DUP (?)
50
51EXT_KBD DB 00H ; Either 00H or 10H
52
53TR_OUT_TMP_CHAR DB ?
54
55KBD_PTR_IN DW KBD_BUF
56KBD_PTR_OUT DW KBD_BUF
57KBD_BUF DB 64 DUP (?)
58KBD_BUF_END = THIS BYTE
59
60SV_DATA ENDS
61
62SV_CODE SEGMENT
63
64 ASSUME CS:SV_CODE, DS:NOTHING
65
66
67;
68; Set default values for a TERMIO structure
69;
70; In: BX Pointer to TERMIO structure
71;
72; The default values for c_iflag, c_lflag and c_cc differ from Unix
73;
74 TALIGN 2
75 ASSUME BX:PTR TERMIO
76TERMIO_INIT PROC NEAR
77 MOV [BX].C_IFLAG, BRKINT OR ICRNL OR IXON OR IXANY
78 MOV [BX].C_OFLAG, 0
79 MOV [BX].C_CFLAG, B9600 OR CS8 OR CREAD OR HUPCL
80 MOV [BX].C_LFLAG, ISIG OR ICANON OR IECHO OR ECHOE OR ECHOK OR IDEFAULT
81 MOV [BX].C_LINE, 0
82 MOV [BX].C_CC[VINTR], 03H ; Ctrl-C
83 MOV [BX].C_CC[VQUIT], 1CH ; Ctrl-\
84 MOV [BX].C_CC[VERASE], 08H ; Ctrl-H
85 MOV [BX].C_CC[VKILL], 15H ; Ctrl-U
86 MOV [BX].C_CC[VEOF], 04H ; Ctrl-D
87 MOV [BX].C_CC[VEOL], 0 ; Disabled
88 MOV [BX].C_CC[VMIN], 6
89 MOV [BX].C_CC[VTIME], 1
90 RET
91 ASSUME BX:NOTHING
92TERMIO_INIT ENDP
93
94;
95; Query `struct termio'
96;
97; In: EAX File handle
98; ES:EBX Destination address, points to `struct termio'
99;
100; Out: EAX Return code (0 on success, -1 on error)
101; ECX errno (0 on success)
102
103 TALIGN 4
104 ASSUME DS:SV_DATA
105 ASSUME EBX:NEAR32 PTR TERMIO
106TERMIO_GET PROC NEAR
107 CMP EAX, 0 ; stdin
108 JNE TG_EBADF
109 IRP F, <C_IFLAG, C_OFLAG, C_CFLAG, C_LFLAG>
110 MOV EAX, STDIN_TERMIO.F
111 MOV ES:[EBX].F, EAX
112 ENDM
113 MOV ES:[EBX].C_LINE, 0
114 MOV ESI, 0
115TG_1: MOV AL, STDIN_TERMIO.C_CC[SI]
116 MOV ES:[EBX].C_CC[ESI], AL
117 INC SI
118 CMP SI, NCC
119 JB SHORT TG_1
120 XOR EAX, EAX
121 XOR ECX, ECX
122 RET
123
124TG_EBADF: MOV EAX, -1
125 MOV ECX, EBADF
126 RET
127TERMIO_GET ENDP
128
129
130;
131; Set terminal attributes from `struct termio'
132;
133; In: EAX File handle
134; ES:EBX Source address, points to `struct termio'
135;
136; Out: EAX Return code (0 on success, -1 on error)
137; ECX errno (0 on success)
138;
139 TALIGN 4
140 ASSUME DS:SV_DATA
141 ASSUME EBX:NEAR32 PTR TERMIO
142TERMIO_SET PROC NEAR
143 CMP EAX, 0 ; stdin?
144 JNE SHORT TS_EBADF
145 IRP F, <C_IFLAG, C_OFLAG, C_CFLAG, C_LFLAG>
146 MOV EAX, ES:[EBX].F
147 MOV STDIN_TERMIO.F, EAX
148 ENDM
149 MOV ESI, 0
150TS_1: MOV AL, ES:[EBX].C_CC[ESI]
151 MOV STDIN_TERMIO.C_CC[SI], AL
152 INC SI
153 CMP SI, NCC
154 JB SHORT TS_1
155 MOV STDIN_TERMIO.C_CC[VSUSP], 0 ; Disabled
156 MOV STDIN_TERMIO.C_CC[VSTOP], 13H ; Ctrl-S
157 MOV STDIN_TERMIO.C_CC[VSTART], 11H ; Ctrl-Q
158 XOR EAX, EAX
159 XOR ECX, ECX
160 RET
161
162TS_EBADF: MOV EAX, -1
163 MOV ECX, EBADF
164 RET
165TERMIO_SET ENDP
166
167
168;
169; Flush input queue for termio
170;
171; In: EAX File handle
172;
173; Out: EAX Return code (0 on success, -1 on error)
174; ECX errno (0 on success)
175;
176 TALIGN 4
177 ASSUME DS:SV_DATA
178TERMIO_FLUSH PROC NEAR
179 CMP EAX, 0 ; stdin
180 JNE SHORT TF_EBADF
181 CALL KBD_FLUSH
182 XOR EAX, EAX
183 XOR ECX, ECX
184 RET
185
186TF_EBADF: MOV EAX, -1
187 MOV ECX, EBADF
188 RET
189TERMIO_FLUSH ENDP
190
191
192;
193; Query `struct termios'
194;
195; In: EAX File handle
196; ES:EBX Destination address, points to `struct termios'
197;
198; Out: EAX Return code (0 on success, -1 on error)
199; ECX errno (0 on success)
200;
201 TALIGN 4
202 ASSUME DS:SV_DATA
203 ASSUME EBX:NEAR32 PTR TERMIOS
204TERMIOS_GET PROC NEAR
205 CMP EAX, 0 ; stdin
206 JNE TSG_ENOTTY
207 IRP F, <C_IFLAG, C_OFLAG, C_CFLAG>
208 MOV EAX, STDIN_TERMIO.F
209 MOV ES:[EBX].F, EAX
210 ENDM
211 MOV EAX, STDIN_TERMIO.C_LFLAG
212 AND EAX, NOT IDEFAULT
213 MOV ES:[EBX].C_LFLAG, EAX
214 MOV ESI, 0
215TSG_1: MOV AL, STDIN_TERMIO.C_CC[SI]
216 MOV ES:[EBX].C_CC[ESI], AL
217 INC SI
218 CMP SI, NCCS
219 JB SHORT TSG_1
220 XOR EAX, EAX
221 XOR ECX, ECX
222 RET
223
224TSG_ENOTTY: MOV EAX, -1
225 MOV ECX, ENOTTY
226 RET
227TERMIOS_GET ENDP
228
229;
230; Set terminal attributes from `struct termios'
231;
232; In: EAX File handle
233; ES:EBX Source address, points to `struct termios'
234;
235; Out: EAX Return code (0 on success, -1 on error)
236; ECX errno (0 on success)
237;
238 TALIGN 4
239 ASSUME DS:SV_DATA
240 ASSUME EBX:NEAR32 PTR TERMIOS
241TERMIOS_SET PROC NEAR
242 CMP EAX, 0 ; stdin?
243 JNE SHORT TCS_ENOTTY
244 IRP F, <C_IFLAG, C_OFLAG, C_CFLAG>
245 MOV EAX, ES:[EBX].F
246 MOV STDIN_TERMIO.F, EAX
247 ENDM
248 MOV EAX, ES:[EBX].C_LFLAG
249 AND EAX, NOT IDEFAULT
250 MOV STDIN_TERMIO.C_LFLAG, EAX
251 MOV ESI, 0
252TCS_1: MOV AL, ES:[EBX].C_CC[ESI]
253 MOV STDIN_TERMIO.C_CC[SI], AL
254 INC SI
255 CMP SI, NCCS
256 JB SHORT TCS_1
257 XOR EAX, EAX
258 XOR ECX, ECX
259 RET
260
261TCS_ENOTTY: MOV EAX, -1
262 MOV ECX, ENOTTY
263 RET
264TERMIOS_SET ENDP
265
266
267;
268; Flush input queue for termios
269;
270; In: EAX File handle
271;
272; Out: EAX Return code (0 on success, -1 on error)
273; ECX errno (0 on success)
274;
275 TALIGN 4
276 ASSUME DS:SV_DATA
277TERMIOS_FLUSH PROC NEAR
278 CMP EAX, 0 ; stdin
279 JNE SHORT TF_ENOTTY
280 CALL KBD_FLUSH
281 XOR EAX, EAX
282 XOR ECX, ECX
283 RET
284
285TF_ENOTTY: MOV EAX, -1
286 MOV ECX, ENOTTY
287 RET
288TERMIOS_FLUSH ENDP
289
290
291;
292; Get and preprocess a character for termio input
293;
294; In: CX=FALSE Return AX=CHAR_NO if no character available
295; CX!=FALSE Wait until signal or character available
296; Out: AX=CHAR_SIG Interrupted by signal
297; AX=CHAR_NO No character available (for CX!=FALSE)
298; AX=CHAR_TIME Time-out
299; AL Character (AH=0)
300;
301 TALIGN 2
302 ASSUME DS:SV_DATA
303TR_GET PROC NEAR
304TR_GET_0: PUSH CX
305 CALL READ_KEYBOARD
306 POP CX
307 OR AH, AH
308 JNZ SHORT TR_GET_RET
309;
310; Strip bit 7 if ISTRIP is set
311;
312 TEST STDIN_TERMIO.C_IFLAG, ISTRIP
313 JZ SHORT TR_GET_1
314 AND AL, 7FH
315TR_GET_1:
316;
317; Ignore CR characters if IGNCR is set
318;
319 TEST STDIN_TERMIO.C_IFLAG, IGNCR
320 JZ SHORT TR_GET_2
321 CMP AL, CR
322 JE SHORT TR_GET_0
323TR_GET_2:
324;
325; Translate LF to CR if INLCR is set (don't translate the CR back to LF if
326; ICRNL is also set; IGNCR is also ignored for a CR created by this
327; translation)
328;
329 TEST STDIN_TERMIO.C_IFLAG, INLCR
330 JZ SHORT TR_GET_3
331 CMP AL, LF
332 JNE SHORT TR_GET_3
333 MOV AL, CR
334 JMP SHORT TR_GET_4
335TR_GET_3:
336;
337; Translate CR to LF if ICRNL is set
338;
339 TEST STDIN_TERMIO.C_IFLAG, ICRNL
340 JZ SHORT TR_GET_4
341 CMP AL, CR
342 JNE SHORT TR_GET_4
343 MOV AL, LF
344TR_GET_4:
345;
346; Translate upper-case letters to lower case if IUCLC is set
347;
348 TEST STDIN_TERMIO.C_IFLAG, IUCLC
349 JZ SHORT TR_GET_5
350 CMP AL, "A"
351 JB SHORT TR_GET_5
352 CMP AL, "Z"
353 JA SHORT TR_GET_5
354 ADD AL, "a" - "A"
355TR_GET_5:
356;
357; No further input transformations are available
358;
359TR_GET_RET: RET
360TR_GET ENDP
361
362
363;
364; Read keyboard
365;
366; In: CX=FALSE Return AX=CHAR_NO if no character available
367; CX!=FALSE Wait until signal, time-out or character available
368; Out: AX=CHAR_SIG Interrupted by signal
369; AX=CHAR_NO No character available (for CX!=FALSE)
370; AX=CHAR_TIME Time-out
371; AL Character (AH=0)
372;
373 TALIGN 4
374 ASSUME DS:SV_DATA
375READ_KEYBOARD PROC NEAR
376RK_LOOP: MOV AX, 7F16H ; Poll keyboard
377 INT 21H
378 MOV BX, PROCESS_PTR
379 ASSUME BX:PTR PROCESS
380 MOV AX, CHAR_SIG
381 CMP [BX].P_SIG_PENDING, 0
382 JNE SHORT RK_RET
383 TEST [BX].P_FLAGS, PF_TERMIO_TIME
384 MOV AX, CHAR_TIME
385 JNZ SHORT RK_RET
386 ASSUME BX:NOTHING
387 CLI
388 MOV BX, KBD_PTR_OUT
389 CMP BX, KBD_PTR_IN
390 JE SHORT RK_NONE
391 MOV AL, [BX]
392 INC BX
393 CMP BX, OFFSET KBD_BUF_END
394 JNE SHORT RK_OK
395 LEA BX, KBD_BUF
396RK_OK: MOV KBD_PTR_OUT, BX
397 STI
398 MOV AH, 0
399 JMP SHORT RK_RET
400
401RK_NONE: STI
402 CMP CX, FALSE
403 JNE SHORT RK_LOOP
404 MOV AX, CHAR_NO
405RK_RET: RET
406READ_KEYBOARD ENDP
407
408;
409; Return the number of characters in the keyboard buffer
410;
411 TALIGN 4
412STDIN_AVAIL PROC NEAR
413 MOV AX, 7F16H ; Poll keyboard
414 INT 21H
415 CLI
416 MOV AX, KBD_PTR_IN
417 SUB AX, KBD_PTR_OUT
418 JAE SHORT SA_1
419 ADD AX, SIZE KBD_BUF
420SA_1: STI
421 MOVZX EAX, AX
422 RET
423STDIN_AVAIL ENDP
424
425;
426; Unix-like read() for terminal
427;
428; In: ES:EDI Destination address
429; ECX Number of bytes
430;
431; Out: CY Error
432; EAX Number of bytes read (NC)
433; EAX errno (CY)
434;
435; Currently implemented for the keyboard only
436;
437TR_COUNT EQU (DWORD PTR [BP-1*4])
438TR_RESULT EQU (DWORD PTR [BP-2*4])
439TR_TIMER EQU (DWORD PTR [BP-3*4])
440TR_TIMER_FLAG EQU (DWORD PTR [BP-4*4])
441TR_MIN EQU (DWORD PTR [BP-5*4])
442TR_TMP EQU (DWORD PTR [BP-6*4])
443
444 TALIGN 2
445 ASSUME DS:SV_DATA
446TERMIO_READ PROC NEAR
447 PUSH BP
448 MOV BP, SP
449 SUB SP, 6*4
450 MOV TR_COUNT, ECX
451 MOV TR_RESULT, 0
452 MOV TR_TIMER_FLAG, FALSE
453 MOV BX, PROCESS_PTR
454 AND (PROCESS PTR [BX]).P_FLAGS, NOT PF_TERMIO_TIME
455 TEST STDIN_TERMIO.C_LFLAG, ICANON
456 JNZ TR_CANON
457 MOVZX EAX, STDIN_TERMIO.C_CC[VMIN]
458 MOV TR_MIN, EAX
459;
460; Check for O_NDELAY mode
461;
462 TEST STDIN_FL, O_NDELAY ; O_NDELAY set?
463 JZ SHORT TR_RAW_DELAY ; No -> skip
464;
465; Rule out all cases where we have to wait
466;
467 MOVZX EAX, STDIN_TERMIO.C_CC[VMIN]
468 OR EAX, EAX
469 JNZ SHORT TR_RAW_COUNT ; Check count
470 CMP STDIN_TERMIO.C_CC[VTIME], 0
471 JE SHORT TR_RAW_DELAY ; Both zero -> won't wait
472 INC EAX ; At least one character
473TR_RAW_COUNT: PUSH EAX
474 CALL STDIN_AVAIL ; Available characters
475 POP ECX
476 CMP EAX, ECX ; Enough characters for VMIN?
477 JAE TR_RAW_DELAY ; Yes ->
478 CMP EAX, TR_COUNT ; Enough characters for COUNT?
479 JAE TR_RAW_DELAY ; Yes ->
480 MOV EAX, EAGAIN
481 STC
482 JMP TR_RET
483
484TR_RAW_DELAY:
485;
486; Start timer if VMIN = 0 and VTIME > 0
487;
488 CMP STDIN_TERMIO.C_CC[VMIN], 0
489 JNE SHORT TR_RAW_LOOP
490 CMP STDIN_TERMIO.C_CC[VTIME], 0
491 JE SHORT TR_RAW_LOOP
492 CALL TR_START_TIMER
493 MOV TR_MIN, 1
494TR_RAW_LOOP: CMP TR_COUNT, 0
495 JE TR_OK
496 MOV CX, NOT FALSE ; Wait
497 MOV EAX, TR_RESULT
498 CMP EAX, TR_MIN
499 JB SHORT TR_RAW_GET
500 MOV CX, FALSE
501TR_RAW_GET: CALL TR_GET
502 CMP AX, CHAR_NO
503 JE TR_OK
504 CMP AX, CHAR_TIME
505 JE TR_OK
506 CMP AX, CHAR_SIG
507 JE SHORT TR_SIG
508 MOV ES:[EDI], AL ;...ext
509 INC EDI
510 INC TR_RESULT
511 DEC TR_COUNT
512 CALL TR_ECHO
513 CMP TR_COUNT, 0
514 JE TR_OK
515;
516; Restart timer for VMIN > 0 and VTIME > 0
517;
518 CMP STDIN_TERMIO.C_CC[VMIN], 0
519 JE SHORT TR_RAW_LOOP
520 CMP STDIN_TERMIO.C_CC[VTIME], 0
521 JE SHORT TR_RAW_LOOP
522;
523; Stop timer if TR_TIMER_FLAG
524;
525 CMP TR_TIMER_FLAG, FALSE
526 JE SHORT TR_RAW_INTER_1
527 CALL TR_STOP_TIMER
528TR_RAW_INTER_1: MOV BX, PROCESS_PTR
529 AND (PROCESS PTR [BX]).P_FLAGS, NOT PF_TERMIO_TIME
530 CALL TR_START_TIMER
531 JMP TR_RAW_LOOP
532
533TR_SIG: CMP TR_TIMER_FLAG, FALSE
534 JE SHORT TR_SIG_1
535 CALL TR_STOP_TIMER
536TR_SIG_1: MOV EAX, EINTR
537 STC
538 JMP TR_RET
539
540TR_CANON: CMP STDIN_BUFFERED, 0
541 JE SHORT TR_CANON_10
542 MOV ECX, TR_COUNT
543 CMP ECX, STDIN_BUFFERED
544 JBE SHORT TR_CANON_01
545 MOV ECX, STDIN_BUFFERED
546TR_CANON_01: SUB TR_COUNT, ECX
547 SUB STDIN_BUFFERED, ECX
548 ADD TR_RESULT, ECX
549 MOV ESI, STDIN_BUF_PTR
550 ADD STDIN_BUF_PTR, ECX
551 CLD
552 REP MOVS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI]
553 JMP TR_OK
554
555TR_CANON_10: CMP TR_COUNT, 0
556 JZ TR_OK
557;
558; Read a line
559;
560 MOV STDIN_BUFFERED, 0
561 LEA ESI, STDIN_BUFFER
562 MOV STDIN_BUF_PTR, ESI
563 MOV STDIN_ESCAPE, FALSE
564TR_CANON_LOOP: MOV CX, NOT FALSE
565 CALL TR_GET
566 CMP AX, CHAR_SIG
567 JE TR_SIG
568 OR AL, AL
569 JZ TR_CANON_EXT
570 CMP AL, LF
571 JE TR_CANON_LF
572 CMP AL, STDIN_TERMIO.C_CC[VEOL]
573 JE TR_CANON_LF
574 CMP AL, STDIN_TERMIO.C_CC[VEOF]
575 JE TR_CANON_EOF
576 CMP AL, STDIN_TERMIO.C_CC[VERASE]
577 JE SHORT TR_CANON_ERASE
578 CMP AL, STDIN_TERMIO.C_CC[VKILL]
579 JE SHORT TR_CANON_KILL
580 CMP STDIN_ESCAPE, FALSE
581 JNE TR_CANON_QUOTE
582 CMP AL, "\"
583 JE TR_CANON_ESC
584TR_CANON_PUT: MOV STDIN_ESCAPE, FALSE
585 CALL TR_PUT
586 CALL TR_ECHO
587 JMP SHORT TR_CANON_LOOP
588
589TR_CANON_ERASE: CMP STDIN_ESCAPE, FALSE
590 JNE SHORT TR_CANON_ESC_PUT
591 CMP STDIN_BUFFERED, 0
592 JE TR_CANON_LOOP
593 CALL TR_BACK
594 JMP TR_CANON_LOOP
595
596TR_CANON_ESC_PUT:
597 PUSH AX
598 MOV AL, 08H
599 CALL TR_OUT ; Delete the backslash
600 POP AX
601 JMP SHORT TR_CANON_PUT
602
603TR_CANON_KILL: CMP STDIN_ESCAPE, FALSE
604 JNE SHORT TR_CANON_ESC_PUT
605 MOV STDIN_BUFFERED, 0
606 LEA ESI, STDIN_BUFFER
607 TEST STDIN_TERMIO.C_LFLAG, ECHOK
608 JZ TR_CANON_LOOP
609 MOV AL, CR
610 CALL TR_OUT
611 MOV AL, LF
612 CALL TR_OUT
613 JMP TR_CANON_LOOP
614
615TR_CANON_EXT: MOV CX, NOT FALSE
616 CALL TR_GET
617 CMP AX, CHAR_SIG
618 JE TR_SIG
619 JMP TR_CANON_LOOP
620
621TR_CANON_EOF: CMP STDIN_ESCAPE, FALSE
622 JNE SHORT TR_CANON_ESC_PUT
623 CMP STDIN_BUFFERED, 0
624 JE SHORT TR_OK
625 JMP TR_CANON
626
627TR_CANON_LF: CALL TR_PUT
628 CALL TR_ECHO
629 JMP TR_CANON
630
631TR_CANON_ESC: MOV STDIN_ESCAPE, NOT FALSE
632 CALL TR_ECHO
633 JMP TR_CANON_LOOP
634
635TR_CANON_QUOTE: PUSH EAX
636 MOV AL, "\"
637 CALL TR_PUT
638 POP EAX
639 JMP TR_CANON_PUT
640
641TR_OK: CMP TR_TIMER_FLAG, FALSE
642 JE SHORT TR_OK_1
643 CALL TR_STOP_TIMER
644TR_OK_1: MOV EAX, TR_RESULT
645 CLC
646TR_RET: MOV SP, BP
647 NOP ; Try to fix Cyrix 486DLC bug
648 POP BP
649 RET
650TERMIO_READ ENDP
651
652;
653;
654;
655 TALIGN 2
656 ASSUME DS:SV_DATA
657TR_START_TIMER PROC NEAR
658 MOVZX EAX, STDIN_TERMIO.C_CC[VTIME]
659 MOV ECX, 91
660 MUL ECX ; Multiply by 1.82
661 ADD EAX, 49
662 MOV ECX, 50
663 DIV ECX
664 MOV BX, PROCESS_PTR
665 MOV DX, TT_TERMIO_TIME
666 CALL SET_TIMER
667 MOV TR_TIMER_FLAG, NOT FALSE
668 RET
669TR_START_TIMER ENDP
670
671;
672;
673;
674 TALIGN 2
675 ASSUME DS:SV_DATA
676TR_STOP_TIMER PROC NEAR
677 MOV BX, PROCESS_PTR
678 MOV DX, TT_TERMIO_TIME
679 XOR EAX, EAX
680 CALL SET_TIMER
681 MOV TR_TIMER_FLAG, FALSE
682 RET
683TR_STOP_TIMER ENDP
684
685;
686;
687;
688 TALIGN 2
689 ASSUME DS:SV_DATA
690TR_PUT PROC NEAR
691 CMP STDIN_BUFFERED, SIZE STDIN_BUFFER
692 JAE SHORT TR_PUT_OV
693 MOV [ESI], AL
694 INC ESI
695 INC STDIN_BUFFERED
696TR_PUT_OV: RET
697TR_PUT ENDP
698
699;
700;
701;
702 TALIGN 2
703 ASSUME DS:SV_DATA
704TR_ECHO PROC NEAR
705 TEST STDIN_TERMIO.C_LFLAG, IECHO
706 JZ SHORT TR_ECHO_RET
707 CMP AL, LF
708 JE SHORT TR_ECHO_LF
709 if 1
710 JMP SHORT TR_ECHO_1
711 else
712 CMP AL, 20H
713 JAE SHORT TR_ECHO_1
714 PUSH EAX
715 MOV AL, "^"
716 CALL TR_OUT
717 POP EAX
718 PUSH EAX
719 ADD AL, 40H
720 CALL TR_OUT
721 POP EAX
722 RET
723 endif
724
725TR_ECHO_LF: MOV AL, CR
726 CALL TR_OUT
727 MOV AL, LF
728TR_ECHO_1: CALL TR_OUT
729TR_ECHO_RET: RET
730TR_ECHO ENDP
731
732;
733;
734;
735 TALIGN 2
736 ASSUME DS:SV_DATA
737TR_BACK PROC NEAR
738 DEC STDIN_BUFFERED
739 DEC ESI
740 MOV AL, 08H
741 CALL TR_OUT
742 MOV AL, " "
743 CALL TR_OUT
744 MOV AL, 08H
745 CALL TR_OUT
746 RET
747TR_BACK ENDP
748
749;
750; Note: Ctrl-C!!!
751;
752; Don't use function 02H as that would require calling MAP_HANDLE.
753;
754 TALIGN 4
755TR_OUT PROC NEAR
756 PUSH EAX
757 PUSH EBX
758 PUSH ECX
759 PUSH EDX
760 MOV TR_OUT_TMP_CHAR, AL
761 LEA EDX, TR_OUT_TMP_CHAR
762 MOV ECX, 1
763 MOV EBX, 1 ; Standard output
764 MOV AH, 40H
765 INT 21H
766 POP EDX
767 POP ECX
768 POP EBX
769 POP EAX
770 RET
771TR_OUT ENDP
772
773
774 TALIGN 4
775KBD_FLUSH PROC NEAR
776KF_1: MOV AH, 01H
777 ADD AH, EXT_KBD
778 INT 16H
779 JZ SHORT KF_2
780 MOV AH, 00H
781 ADD AH, EXT_KBD
782 INT 16H
783 JMP SHORT KF_1
784 TALIGN 4
785KF_2: CLI
786 LEA AX, KBD_BUF
787 MOV KBD_PTR_IN, AX
788 MOV KBD_PTR_OUT, AX
789 STI
790 MOV STDIN_BUFFERED, 0
791 RET
792KBD_FLUSH ENDP
793
794SV_CODE ENDS
795
796
797INIT_CODE SEGMENT
798
799 ASSUME CS:INIT_CODE, DS:NOTHING
800
801;
802; Get keyboard type
803;
804 ASSUME DS:SV_DATA
805 TALIGN 4
806INIT_TERMIO PROC NEAR
807 MOV EXT_KBD, 00H
808 MOV AX, 40H
809 MOV ES, AX
810 TEST BYTE PTR ES:[96H], 10H ; Extended keyboard?
811 JZ SHORT IT_1
812 MOV EXT_KBD, 10H
813IT_1: RET
814INIT_TERMIO ENDP
815
816;
817; Read keyboard
818;
819; If the keyboard buffer is full, it will be cleared
820;
821 ASSUME DS:SV_DATA
822 TALIGN 4
823POLL_KEYBOARD PROC NEAR
824PK_LOOP: MOV AH, 01H
825 ADD AH, EXT_KBD
826 INT 16H
827 JZ PK_RET
828 MOV AH, 00H
829 ADD AH, EXT_KBD
830 INT 16H
831 OR AX, AX ; Ctrl-Break?
832 JZ SHORT PK_LOOP ; Yes -> repeat
833 OR AH, AH ; Alt+numeric keypad?
834 JZ SHORT PK_NORMAL ; Yes -> no extended code
835 OR AL, AL ; Extended code?
836 JZ SHORT PK_EXT ; Yes ->
837 CMP AL, 0E0H ; New extended code?
838 JE SHORT PK_EXT ; Yes ->
839PK_NORMAL: TEST STDIN_TERMIO.C_IFLAG, IDELETE
840 JZ SHORT PK_1
841 CMP AH, 0EH ; Backspace?
842 JNE SHORT PK_1 ; No -> skip
843 MOV AH, AL ; Save character code
844 MOV AL, 08H ; BS
845 CMP AH, 7FH ; DEL?
846 JE SHORT PK_1 ; Yes -> convert to BS
847 MOV AL, 7FH ; DEL
848 CMP AH, 08H ; BS?
849 JE SHORT PK_1 ; Yes -> convert to DEL
850 MOV AL, AH ; Restore character code
851PK_1: TEST STDIN_TERMIO.C_LFLAG, ISIG
852 JZ SHORT PK_PUT
853 MOVZX EBX, PROCESS_PTR
854 ASSUME EBX:NEAR32 PTR PROCESS
855 CMP BX, NO_PROCESS
856 JE SHORT PK_PUT
857 CMP AL, STDIN_TERMIO.C_CC[VINTR]
858 MOV ECX, SIGINT
859 JE SHORT PK_SIG
860 CMP AL, STDIN_TERMIO.C_CC[VQUIT]
861 MOV ECX, SIGQUIT
862 JE SHORT PK_SIG
863PK_PUT: CALL KBD_PUT
864 JMP SHORT PK_LOOP
865
866 TALIGN 4
867PK_EXT: XOR AL, AL ; Prefix
868 CALL KBD_PUT
869 MOV AL, AH ; Scan code
870 CALL KBD_PUT
871 JMP PK_LOOP
872
873 TALIGN 4
874PK_SIG: CMP [EBX].P_SIG_HANDLERS[4*ECX], SIG_IGN
875 JE PK_LOOP
876 BTS (PROCESS PTR [BX]).P_SIG_PENDING, ECX
877 JMP PK_LOOP
878
879 TALIGN 4
880PK_RET: RET
881 ASSUME EBX:NOTHING
882POLL_KEYBOARD ENDP
883
884
885 TALIGN 4
886KBD_PUT PROC NEAR
887 MOV BX, KBD_PTR_IN
888 MOV [BX], AL
889 INC BX
890 CMP BX, OFFSET KBD_BUF_END
891 JNE SHORT KP_1
892 LEA BX, KBD_BUF
893KP_1: MOV KBD_PTR_IN, BX
894 RET
895KBD_PUT ENDP
896
897
898INIT_CODE ENDS
899
900 END
Note: See TracBrowser for help on using the repository browser.