summaryrefslogtreecommitdiff
path: root/v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC')
-rw-r--r--v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC573
1 files changed, 573 insertions, 0 deletions
diff --git a/v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC b/v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC
new file mode 100644
index 0000000..37e661b
--- /dev/null
+++ b/v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC
@@ -0,0 +1,573 @@
1; Termcap description of capabilities:
2
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:
10
11CMDTABL DB 'A'
12 DW CUU ;CUrsor Up
13 DB 'B'
14 DW CUD ;CUrsor Down
15 DB 'C'
16 DW CUF ;CUrsor Forward
17 DB 'D'
18 DW CUB ;CUrsor Back
19 DB 'H'
20 DW CUP ;CUrsor Position
21 DB 'J'
22 DW ED ;Erase in Display
23 DB 'K'
24 DW EL ;Erase in Line
25 DB 'L'
26 DW IL ;Insert Line
27 DB 'M'
28 DW xDL ;Delete Line
29;; DB 'R'
30;; DW CPR ;Cursor Postion Report
31 DB 'f'
32 DW HVP ;Horizontal and Vertical Position
33 DB 'h'
34 DW SM ;Set Mode
35 DB 'l'
36 DW RM ;Reset Mode
37 DB 'm'
38 DW SGR ;Select Graphics Rendition
39;; DB 'n'
40;; DW DSR ;Device Status Report
41 DB 's'
42 DW SCP ;Save Cursor Position
43 DB 'u'
44 DW RCP ;Restore Cursor Position
45 DB 00
46
47; Graphic Rendition modes: parameter, mask, set
48GRMODE 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
70 DB 0FFH
71
72; Set/Reset Modes: indexed by (SelChar-'<'*8) + (PARAM0 AND 7)
73SRMODE 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 '?'
77
78PAGE
79; The following are duplicates of the same variables from the ROM
80;
81;* WARNING - the following two variables are accessed as a word
82MODE DB 3
83MAXCOL DB 79
84IF LINE25 ; special treatment of line 25?
85maxrow equ 24
86ELSE
87maxrow equ 25
88ENDIF
89;* WARNING - the following two variables are accessed as a word
90COL DB 0 ; current column
91ROW DB 0 ; current row
92
93
94AnsiState LABEL BYTE ; the following must be saved on a screen swap
95WRAP DB 1 ; 0 = NO WRAP, 1 = WRAP
96EnaL25 DB 0 ; 0 = 25th line disabled, 1 = enabled
97STATE DW S1
98SAVCR DW 0 ; saved cursor position
99;* WARNING - the following two variables are accessed as a word
100SelChar DB 0 ; <,=,> or ? private use indicators
101PRMCNT LABEL BYTE ; number of parameters for command
102PRMCNTW DW 0
103NUMPARAM equ 5 ; max. number of parameters
104PARAM DB NUMPARAM DUP (?) ; buffer for command parameters
105;* WARNING - the following two variables are accessed as a word
106attrw LABEL WORD
107ATTR DB 00000111B ;CHARACTER ATTRIBUTE
108BPAGE DB 0 ;BASE PAGE
109
110AnsiSize equ ($-AnsiState)
111
112IF (AnsiSize GT TermSize)
113 .RADIX 0 ; ERROR - Terminal state not big enough
114ENDIF
115
116;-------------------------------------------------------------
117;
118; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
119;
120base dw 0b800h
121screen_seg dw 00000h
122
123chrout: cmp al,13 ; carriage return?
124 ja outchr
125 jnz trylf
126 mov [col],0
127;; jmp short setit
128 jmp setit
129
130trylf: cmp al,10 ; line feed?
131 jz lf
132 cmp al,7 ; bell?
133 jnz trytab
134torom:
135 mov bx,[attrw]
136 and bl,7
137 mov ah,14
138 int 10h
139ret5: ret
140
141trytab:
142 cmp al,9 ; tab?
143 jnz tryback
144 mov al,[col]
145 add al,8
146 mov ah,al
147 and ah,7
148 sub al,ah
149 cmp al,[maxcol]
150 jb tunder
151 mov al,[maxcol]
152tunder:
153 mov [col],al
154 jmp short setit
155
156tryback:
157 cmp al,8 ; backspace?
158 jnz outchr
159 cmp [col],0
160 jz ret5
161 dec [col]
162 jmp short setit
163
164outchr:
165 mov bx,[attrw]
166 mov cx,1
167 mov ah,9
168 int 10h
169 inc [col]
170 mov al,[col]
171 cmp al,[maxcol]
172 jbe setit
173 cmp [wrap],1
174 jz outchr1
175 dec [col]
176 ret
177outchr1:
178 mov [col],0
179lf: cmp [row],(maxrow-1)
180 ja setit ; on line 25, don't move
181 jz lf1 ; on 24th line, scroll
182 inc [row]
183 jmp short setit
184lf1: call scroll
185
186setit: mov dx,word ptr col
187 mov bh,[bpage]
188 mov ah,2
189 int 10h
190 ret
191
192scroll: mov al,mode
193 cmp al,2
194 jz myscroll
195 cmp al,3
196 jz myscroll
197IF LINE25
198 xor cx,cx ; from 0,0
199 mov dh,(maxrow-1) ; to maxrow-1,maxcol
200 mov dl,maxcol
201 mov bh,attr
202 mov ax,0601h ; scroll up one line
203 int 10h
204 ret
205ELSE
206 mov al,10
207 jmp torom
208ENDIF
209myscroll:
210 mov bh,[attr]
211 mov bl,' '
212 mov bp,80
213 mov ax,[base]
214 add ax,[screen_seg]
215 mov es,ax
216 mov ds,ax
217 xor di,di
218 mov si,160
219 mov cx,(maxrow-1)*80
220 cld
221
222; This code will never get executed since we get here when
223; mode = 2 or 3 only.
224;; cmp cs:[base],0b800h
225;; jz colorcard
226
227;; rep movsw
228;; mov ax,bx
229;; mov cx,bp
230;; rep stosw
231;; jmp short sret
232
233;;colorcard:
234 mov dx,3dah
235wait2: in al,dx
236 test al,8
237 jz wait2
238 mov al,25h
239 mov dx,3d8h
240 out dx,al ;turn off video
241 rep movsw
242 mov ax,bx
243 mov cx,bp
244 rep stosw
245 mov al,29h
246 mov dx,3d8h
247 out dx,al ;turn on video
248sret: push cs
249 pop ds
250 ret
251
252
253CharOut: PUSH AX ; Main entry point
254 PUSH BX
255 PUSH CX
256 PUSH DX
257 PUSH SI
258 PUSH DI
259 PUSH ES
260 PUSH BP
261
262 MOV [base],0B800H
263 XCHG AX,SI ; SAVE CHARACTER TO STUFF
264 MOV AX,40H ; POINT TO ROS BIOS
265 MOV DS,AX
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
269 CMP AL,7
270 JNZ NOT_BW
271 MOV WORD PTR CS:[base],0B000H
272NOT_BW: MOV AL,DS:[62H] ; GET ACTIVE PAGE
273 MOV CS:[BPAGE],AL
274 CBW
275 ADD AX,AX
276 MOV BX,AX
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
280 MOV CL,4
281 SHR AX,CL ; CONVERT TO A SEGMENT
282 PUSH CS
283 POP DS
284 MOV [screen_seg],AX
285 XCHG AX,SI ; GET BACK CHARACTER IN AL
286
287 CALL VIDEO
288 POP BP
289 POP ES
290 POP DI
291 POP SI
292 POP DX
293 POP CX
294 POP BX
295 POP AX
296 RET
297
298
299;----------------------------------------------------------
300;
301; OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE
302;
303VIDEO: MOV SI,OFFSET STATE
304 JMP [SI]
305
306S2: CMP AL,'['
307 JZ S22
308 JMP S1
309S22: MOV WORD PTR [SI],OFFSET S30
310 XOR BX,BX
311 MOV WORD PTR SelChar,BX
312 MOV WORD PTR PARAM,BX
313 JMP SHORT S3B
314
315S30: CMP AL,'?' ; experimental use selector (SM/RM)?
316 JA S7
317 mov SelChar,al
318 MOV WORD PTR [SI],OFFSET S3
319 cmp al,'<'
320 jae S3B
321
322S3: CMP AL,';'
323 JNZ S3C
324S3A: INC PRMCNT
325S3B: CALL GETPTR
326 XOR AX,AX
327 MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO
328 RET
329
330S3C: CMP AL,'0'
331 JB S3D
332 CMP AL,'9'
333 JA S7
334 CALL GETPTR
335 SUB AL,'0'
336 XCHG AL,BYTE PTR [BX]
337 MOV AH,10
338 MUL AH ;*10
339 ADD BYTE PTR [BX],AL ;MOVE IN DIGIT
340 RET
341
342S3D:
343;; CMP AL,'"' ;BEGIN QUOTED STRING
344;; JZ S3E
345;; CMP AL,"'"
346 JNZ S7
347;;S3E: MOV WORD PTR [SI],OFFSET S4
348;; MOV [INQ],AL
349S3RET: RET
350
351;
352; ENTER QUOTED STRINGS
353;
354
355;;S4: CMP AL,[INQ] ;CHECK FOR STRING TERMINATOR
356;; JNZ S4A
357;; DEC PRMCNT ;TERMINATE STRING
358;; MOV WORD PTR [SI],OFFSET S3
359;; RET
360
361;;S4A: CALL GETPTR
362;; MOV BYTE PTR [BX],AL
363;; MOV WORD PTR [SI],OFFSET S4
364;; JMP S3A
365;
366; LOOK FOR ANSI COMMAND SPECIFIED IN AL
367;
368
369S7: MOV BX,OFFSET CMDTABL-3
370;
371S7A: ADD BX,3
372 CMP BYTE PTR [BX],0
373 JZ S1B
374 CMP BYTE PTR [BX],AL
375 JNZ S7A
376;
377S7B: MOV AX,WORD PTR [BX+1] ;AX = JUMP ADDRESS
378 MOV BX,OFFSET PARAM
379 MOV DL,BYTE PTR [BX]
380 XOR DH,DH ;DX = FIRST PARAMETER
381 MOV CX,DX
382 OR CX,CX
383 JNZ S7C
384 INC CX ; if DX=0, CX=1 else CX = DX
385S7C: JMP AX ;AL = COMMAND
386
387S1: CMP AL,1Bh ;ESCAPE SEQUENCE?
388 JNZ S1B
389 MOV WORD PTR [SI],OFFSET S2
390 RET
391
392S1B: CALL CHROUT
393S1A: MOV WORD PTR [STATE],OFFSET S1
394 RET
395
396MOVCUR: CMP BYTE PTR [BX],AH
397 JZ SETCUR
398 ADD BYTE PTR [BX],AL
399 LOOP MOVCUR
400SETCUR: MOV DX,WORD PTR COL
401 XOR BX,BX
402 MOV AH,2
403 int 10h ; call ROM
404 JMP S1A
405
406HVP:
407CUP:
408IF LINE25
409 CMP CL,(maxrow+1)
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?
413 jz SETCUR
414cup3:
415ELSE
416 CMP CL,maxrow
417 JA SETCUR
418ENDIF
419 MOV AL,MAXCOL
420 MOV CH,BYTE PTR [BX+1]
421 OR CH,CH
422 JZ CUP1
423 DEC CH
424CUP1: CMP AL,CH
425 JA CUP2
426 MOV CH,AL
427CUP2: XCHG CL,CH
428 DEC CH
429 MOV WORD PTR COL,CX
430 JMP SETCUR
431
432CUF: MOV AH,MAXCOL
433 MOV AL,1
434CUF1: MOV BX,OFFSET COL
435 JMP MOVCUR
436
437CUB: MOV AX,00FFH
438 JMP CUF1
439
440CUU: MOV AX,00FFH
441CUU1: MOV BX,OFFSET ROW
442 JMP MOVCUR
443
444CUD: MOV AX,(maxrow-1)*256+1
445IF LINE25
446 cmp ah,[row] ; at bottom of screen?
447 ja SETCUR
448ENDIF
449 JMP CUU1
450
451SCP: MOV AX,WORD PTR COL
452 MOV SAVCR,AX
453 JMP SETCUR
454
455RCP: MOV AX,SAVCR
456IF LINE25
457 cmp ch,maxrow
458 jb rcp1
459 cmp EnaL25,0
460 jz rcp2
461ENDIF
462rcp1: MOV WORD PTR COL,AX
463rcp2: JMP SETCUR
464
465SGR: XOR CX,CX
466 XCHG CL,PRMCNT
467 CALL GETPTR
468 INC CX
469SGR1: MOV AL,BYTE PTR [BX]
470 PUSH BX
471 MOV BX,OFFSET GRMODE
472SGR2: MOV AH,BYTE PTR [BX]
473 ADD BX,3
474 CMP AH,0FFH
475 JZ SGR3
476 CMP AH,AL
477 JNZ SGR2
478 MOV AX,WORD PTR [BX-2]
479 AND ATTR,AL
480 OR ATTR,AH
481SGR3: POP BX
482 INC BX
483 LOOP SGR1
484 JMP SETCUR
485
486ED:
487IF LINE25
488 cmp row,maxrow ; on 25th line?
489 je EL ; yes, treat like Erase in Line
490ENDIF
491 xor cx,cx
492 mov dl,maxcol
493 mov dh,(maxrow-1)
494 cmp param,1 ; which subcommand?
495 ja el2 ; all
496 jb ed1
497 mov dh,row ; to beginning
498 dec dh
499 jle EL
500 jmp short ed2
501ed1: mov ch,row ; to end
502 inc ch
503 cmp ch,dh
504 jae EL
505ed2: mov bh,attr
506 MOV AX,0600H
507 int 10h ; call ROM
508
509EL: MOV CX,WORD PTR COL
510 MOV dx,cx
511 mov al,param
512 inc al ; 0,1,2 => 1,2,3
513 test al,1 ; to end?
514 je el1
515 mov dl,maxcol
516el1: test al,2 ; to beginning?
517 je el2
518 mov cl,0
519el2: mov bh,attr
520 mov ax,0600H
521 int 10h
522S1A_j: jmp S1A
523
524IL: mov ah,7 ; scroll down
525 jmp short dl1
526
527xDL: mov ah,6 ; scroll up
528dl1: mov al,cl ; number of lines
529 mov ch,row
530 xor cl,cl
531 mov dh,(maxrow-1)
532 mov dl,maxcol
533 mov bh,attr
534 int 10h
535 jmp S1A_j
536
537RM: XOR CL,CL
538 JMP SHORT SM1
539
540SM: MOV CL,1
541SM1: mov bl,SelChar ; get selection character
542 sub bl,'<' ; adjust
543 jb S1A_j ; less than '<'
544 cmp bl,4
545 jae S1A_j ; greater than '?'
546 xor bh,bh
547 shl bx,1
548 shl bx,1
549 shl bx,1
550 MOV AL,DL
551 CMP AL,7
552 JA S1A_j
553 or bl,al
554 shl bx,1
555 mov bx,SRMODE[bx] ; get function indicator
556 cmp bx,1 ; no or special function?
557 jb S1A_j
558 jz SM2 ; sets screen mode
559 MOV [bx],CL
560 JMP S1A_j
561
562SM2: MOV AH,0
563 int 10h ; call ROM
564 JMP S1A_j
565
566; GetPtr - get a pointer to the current parameter
567GETPTR: MOV BX,PRMCNTW
568 CMP BX,NUMPARAM
569 JB GET1
570 DEC PRMCNT
571 JMP GETPTR
572GET1: ADD BX,OFFSET PARAM
573 RET