1 ; Termcap description of capabilities:
3 ;ibmans4:mtcon:IBM PC with V4.0 ANSI driver:\
4 ; :al=\E[L:am:bs:ce=\E[K:cl=\E[2J\E[H:cm=\E[%;%H:co#80:\
5 ; :dl=\E[M:do=\E[B:ho=\E[H:li#24:mi:nd=\E[C:\
6 ; :ms:pt:se=\E[m:so=\E[1;36m:up=\E[A:\
7 ; :kb=^h:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C:kh=\E[H:kn#8:\
8 ; :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:\
9 ; :k6=\EP:k7=\EQ:k8=\ER:
16 DW CUF ;CUrsor Forward
20 DW CUP ;CUrsor Position
22 DW ED ;Erase in Display
30 ;; DW CPR ;Cursor Postion Report
32 DW HVP ;Horizontal and Vertical Position
38 DW SGR ;Select Graphics Rendition
40 ;; DW DSR ;Device Status Report
42 DW SCP ;Save Cursor Position
44 DW RCP ;Restore Cursor Position
47 ; Graphic Rendition modes: parameter, mask, set
48 GRMODE DB 00,00000000B,00000111B ; all off
49 DB 01,11111111B,00001000B ; bold (increased intensity)
50 DB 04,11111000B,00000001B ; underscore
51 DB 05,11111111B,10000000B ; blink
52 DB 07,11111000B,01110000B ; reverse video
53 DB 08,10001000B,00000000B ; concealed
54 DB 30,11111000B,00000000B ; foreground colors ...
55 DB 31,11111000B,00000100B
56 DB 32,11111000B,00000010B
57 DB 33,11111000B,00000110B
58 DB 34,11111000B,00000001B
59 DB 35,11111000B,00000101B
60 DB 36,11111000B,00000011B
61 DB 37,11111000B,00000111B
62 DB 40,10001111B,00000000B ; background colors ...
63 DB 41,10001111B,01000000B
64 DB 42,10001111B,00100000B
65 DB 43,10001111B,01100000B
66 DB 44,10001111B,00010000B
67 DB 45,10001111B,01010000B
68 DB 46,10001111B,00110000B
69 DB 47,10001111B,01110000B
72 ; Set/Reset Modes: indexed by (SelChar-'<'*8) + (PARAM0 AND 7)
73 SRMODE DW 0,0,0,0,0,0,0,0 ; SelChar '<'
74 DW 1,1,1,1,1,1,1,WRAP ; SelChar '='
75 DW 0,EnaL25,0,0,0,0,0,0 ; SelChar '>'
76 DW 0,0,0,0,0,0,0,WRAP ; SelChar '?'
79 ; The following are duplicates of the same variables from the ROM
81 ;* WARNING - the following two variables are accessed as a word
84 IF LINE25 ; special treatment of line 25?
89 ;* WARNING - the following two variables are accessed as a word
90 COL DB 0 ; current column
91 ROW DB 0 ; current row
94 AnsiState LABEL BYTE ; the following must be saved on a screen swap
95 WRAP DB 1 ; 0 = NO WRAP, 1 = WRAP
96 EnaL25 DB 0 ; 0 = 25th line disabled, 1 = enabled
98 SAVCR DW 0 ; saved cursor position
99 ;* WARNING - the following two variables are accessed as a word
100 SelChar DB 0 ; <,=,> or ? private use indicators
101 PRMCNT LABEL BYTE ; number of parameters for command
103 NUMPARAM equ 5 ; max. number of parameters
104 PARAM DB NUMPARAM DUP (?) ; buffer for command parameters
105 ;* WARNING - the following two variables are accessed as a word
107 ATTR DB 00000111B ;CHARACTER ATTRIBUTE
108 BPAGE DB 0 ;BASE PAGE
110 AnsiSize equ ($-AnsiState)
112 IF (AnsiSize GT TermSize)
113 .RADIX 0 ; ERROR - Terminal state not big enough
116 ;-------------------------------------------------------------
118 ; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
123 chrout: cmp al,13 ; carriage return?
130 trylf: cmp al,10 ; line feed?
157 cmp al,8 ; backspace?
179 lf: cmp [row],(maxrow-1)
180 ja setit ; on line 25, don't move
181 jz lf1 ; on 24th line, scroll
186 setit: mov dx,word ptr col
199 mov dh,(maxrow-1) ; to maxrow-1,maxcol
202 mov ax,0601h ; scroll up one line
222 ; This code will never get executed since we get here when
223 ; mode = 2 or 3 only.
224 ;; cmp cs:[base],0b800h
240 out dx,al ;turn off video
247 out dx,al ;turn on video
253 CharOut: PUSH AX ; Main entry point
263 XCHG AX,SI ; SAVE CHARACTER TO STUFF
264 MOV AX,40H ; POINT TO ROS BIOS
266 MOV AX,DS:[49H] ; AL=MODE, AH=MAX COL
267 DEC AH ; ANSI NEEDS 0-79 OR 0-39
268 MOV WORD PTR CS:[MODE],AX ; SAVE MODE AND MAX COL
271 MOV WORD PTR CS:[base],0B000H
272 NOT_BW: MOV AL,DS:[62H] ; GET ACTIVE PAGE
277 MOV AX,DS:[BX+50H] ; AL=COL, AH=ROW
278 MOV WORD PTR CS:[COL],AX ; SAVE ROW AND COLUMN
279 MOV AX,DS:[4EH] ; GET START OF SCREEN SEG
281 SHR AX,CL ; CONVERT TO A SEGMENT
285 XCHG AX,SI ; GET BACK CHARACTER IN AL
299 ;----------------------------------------------------------
301 ; OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE
303 VIDEO: MOV SI,OFFSET STATE
309 S22: MOV WORD PTR [SI],OFFSET S30
311 MOV WORD PTR SelChar,BX
312 MOV WORD PTR PARAM,BX
315 S30: CMP AL,'?' ; experimental use selector (SM/RM)?
318 MOV WORD PTR [SI],OFFSET S3
327 MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO
336 XCHG AL,BYTE PTR [BX]
339 ADD BYTE PTR [BX],AL ;MOVE IN DIGIT
343 ;; CMP AL,'"' ;BEGIN QUOTED STRING
347 ;;S3E: MOV WORD PTR [SI],OFFSET S4
352 ; ENTER QUOTED STRINGS
355 ;;S4: CMP AL,[INQ] ;CHECK FOR STRING TERMINATOR
357 ;; DEC PRMCNT ;TERMINATE STRING
358 ;; MOV WORD PTR [SI],OFFSET S3
362 ;; MOV BYTE PTR [BX],AL
363 ;; MOV WORD PTR [SI],OFFSET S4
366 ; LOOK FOR ANSI COMMAND SPECIFIED IN AL
369 S7: MOV BX,OFFSET CMDTABL-3
377 S7B: MOV AX,WORD PTR [BX+1] ;AX = JUMP ADDRESS
380 XOR DH,DH ;DX = FIRST PARAMETER
384 INC CX ; if DX=0, CX=1 else CX = DX
385 S7C: JMP AX ;AL = COMMAND
387 S1: CMP AL,1Bh ;ESCAPE SEQUENCE?
389 MOV WORD PTR [SI],OFFSET S2
393 S1A: MOV WORD PTR [STATE],OFFSET S1
396 MOVCUR: CMP BYTE PTR [BX],AH
400 SETCUR: MOV DX,WORD PTR COL
410 jb cup3 ; new row is 24 or less
411 JA SETCUR ; error - 26 or greater
412 cmp EnaL25,0 ; else 25, is it allowed?
420 MOV CH,BYTE PTR [BX+1]
434 CUF1: MOV BX,OFFSET COL
441 CUU1: MOV BX,OFFSET ROW
444 CUD: MOV AX,(maxrow-1)*256+1
446 cmp ah,[row] ; at bottom of screen?
451 SCP: MOV AX,WORD PTR COL
462 rcp1: MOV WORD PTR COL,AX
469 SGR1: MOV AL,BYTE PTR [BX]
472 SGR2: MOV AH,BYTE PTR [BX]
478 MOV AX,WORD PTR [BX-2]
488 cmp row,maxrow ; on 25th line?
489 je EL ; yes, treat like Erase in Line
494 cmp param,1 ; which subcommand?
497 mov dh,row ; to beginning
501 ed1: mov ch,row ; to end
509 EL: MOV CX,WORD PTR COL
512 inc al ; 0,1,2 => 1,2,3
516 el1: test al,2 ; to beginning?
524 IL: mov ah,7 ; scroll down
527 xDL: mov ah,6 ; scroll up
528 dl1: mov al,cl ; number of lines
541 SM1: mov bl,SelChar ; get selection character
543 jb S1A_j ; less than '<'
545 jae S1A_j ; greater than '?'
555 mov bx,SRMODE[bx] ; get function indicator
556 cmp bx,1 ; no or special function?
558 jz SM2 ; sets screen mode
566 ; GetPtr - get a pointer to the current parameter
567 GETPTR: MOV BX,PRMCNTW
572 GET1: ADD BX,OFFSET PARAM