summaryrefslogtreecommitdiff
path: root/v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC
blob: 37e661b82b921096b79e433dea4eb0150bdb2590 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
;	Termcap description of capabilities:

;ibmans4:mtcon:IBM PC with V4.0 ANSI driver:\
;	:al=\E[L:am:bs:ce=\E[K:cl=\E[2J\E[H:cm=\E[%;%H:co#80:\
;	:dl=\E[M:do=\E[B:ho=\E[H:li#24:mi:nd=\E[C:\
;	:ms:pt:se=\E[m:so=\E[1;36m:up=\E[A:\
;	:kb=^h:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C:kh=\E[H:kn#8:\
;	:k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:\
;	:k6=\EP:k7=\EQ:k8=\ER:

CMDTABL DB	'A'
	DW	CUU		;CUrsor Up
	DB	'B'
	DW	CUD		;CUrsor Down
	DB	'C'
	DW	CUF		;CUrsor Forward
	DB	'D'
	DW	CUB		;CUrsor Back
	DB	'H'
	DW	CUP		;CUrsor Position
	DB	'J'
	DW	ED		;Erase in Display
	DB	'K'
	DW	EL		;Erase in Line
	DB	'L'
	DW	IL		;Insert Line
	DB	'M'
	DW	xDL		;Delete Line
;;	DB	'R'
;;	DW	CPR		;Cursor Postion Report
	DB	'f'
	DW	HVP		;Horizontal and Vertical Position
	DB	'h'
	DW	SM		;Set Mode
	DB	'l'
	DW	RM		;Reset Mode
	DB	'm'
	DW	SGR		;Select Graphics Rendition
;;	DB	'n'
;;	DW	DSR		;Device Status Report
	DB	's'
	DW	SCP		;Save Cursor Position
	DB	'u'
	DW	RCP		;Restore Cursor Position
	DB	00

;	Graphic Rendition modes:  parameter, mask, set
GRMODE	DB	00,00000000B,00000111B	; all off
	DB	01,11111111B,00001000B	; bold (increased intensity)
	DB	04,11111000B,00000001B	; underscore
	DB	05,11111111B,10000000B	; blink
	DB	07,11111000B,01110000B	; reverse video
	DB	08,10001000B,00000000B	; concealed
	DB	30,11111000B,00000000B	; foreground colors ...
	DB	31,11111000B,00000100B
	DB	32,11111000B,00000010B
	DB	33,11111000B,00000110B
	DB	34,11111000B,00000001B
	DB	35,11111000B,00000101B
	DB	36,11111000B,00000011B
	DB	37,11111000B,00000111B
	DB	40,10001111B,00000000B	; background colors ...
	DB	41,10001111B,01000000B
	DB	42,10001111B,00100000B
	DB	43,10001111B,01100000B
	DB	44,10001111B,00010000B
	DB	45,10001111B,01010000B
	DB	46,10001111B,00110000B
	DB	47,10001111B,01110000B
	DB	0FFH

; Set/Reset Modes:  indexed by (SelChar-'<'*8) + (PARAM0 AND 7)
SRMODE	DW	0,0,0,0,0,0,0,0		; SelChar '<'
	DW	1,1,1,1,1,1,1,WRAP	; SelChar '='	
	DW	0,EnaL25,0,0,0,0,0,0	; SelChar '>'
	DW	0,0,0,0,0,0,0,WRAP	; SelChar '?'	

PAGE
;	The following are duplicates of the same variables from the ROM
;
;* WARNING - the following two variables are accessed as a word
MODE	DB	3
MAXCOL	DB	79
IF	LINE25		; special treatment of line 25?
maxrow	equ	24
ELSE
maxrow	equ	25
ENDIF
;* WARNING - the following two variables are accessed as a word
COL	DB	0			; current column
ROW	DB	0			; current row


AnsiState	LABEL	BYTE	; the following must be saved on a screen swap
WRAP	DB	1		; 0 = NO WRAP, 1 = WRAP
EnaL25	DB	0		; 0 = 25th line disabled, 1 = enabled
STATE	DW	S1
SAVCR	DW	0			; saved cursor position
;* WARNING - the following two variables are accessed as a word
SelChar	DB	0			; <,=,> or ? private use indicators
PRMCNT	LABEL	BYTE			; number of parameters for command
PRMCNTW	DW	0
NUMPARAM equ	5			; max. number of parameters
PARAM	DB	NUMPARAM DUP (?)	; buffer for command parameters
;* WARNING - the following two variables are accessed as a word
attrw	LABEL	WORD
ATTR	DB	00000111B	;CHARACTER ATTRIBUTE
BPAGE	DB	0		;BASE PAGE

AnsiSize	equ	($-AnsiState)

IF	(AnsiSize GT TermSize)
	.RADIX 0		; ERROR - Terminal state not big enough
ENDIF

;-------------------------------------------------------------
;
;	CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
;
base	   dw	0b800h
screen_seg dw	00000h

chrout: cmp	al,13		; carriage return?
	ja	outchr
	jnz	trylf
	mov	[col],0
;;	jmp	short setit
	jmp	setit

trylf:	cmp	al,10		; line feed?
	jz	lf
	cmp	al,7		; bell?
	jnz	trytab
torom:
	mov	bx,[attrw]
	and	bl,7
	mov	ah,14
	int	10h
ret5:	ret

trytab:
	cmp	al,9		; tab?
	jnz	tryback
	mov	al,[col]
	add	al,8
	mov	ah,al
	and	ah,7
	sub	al,ah
	cmp	al,[maxcol]
	jb	tunder
	mov	al,[maxcol]
tunder:
	mov	[col],al
		jmp	short setit

tryback:
	cmp	al,8		; backspace?
	jnz	outchr
	cmp	[col],0
	jz	ret5
	dec	[col]
	jmp	short setit

outchr:
	mov	bx,[attrw]
	mov	cx,1
	mov	ah,9
	int	10h
	inc	[col]
	mov	al,[col]
	cmp	al,[maxcol]
	jbe	setit
	cmp	[wrap],1
	jz	outchr1
	dec	[col]
	ret
outchr1:
	mov	[col],0
lf:	cmp	[row],(maxrow-1)
	ja	setit				; on line 25, don't move
	jz	lf1				; on 24th line, scroll
	inc	[row]
	jmp	short setit
lf1:	call	scroll

setit:	mov	dx,word ptr col
	mov	bh,[bpage]
	mov	ah,2
	int	10h
	ret

scroll: mov	al,mode
	cmp	al,2
	jz	myscroll
	cmp	al,3
	jz	myscroll
IF	LINE25
	xor	cx,cx			; from 0,0
	mov	dh,(maxrow-1)		; to maxrow-1,maxcol
	mov	dl,maxcol
	mov	bh,attr
	mov	ax,0601h		; scroll  up one line
	int	10h
	ret
ELSE
	mov	al,10
	jmp	torom
ENDIF
myscroll:
	mov	bh,[attr]
	mov	bl,' '
	mov	bp,80
	mov	ax,[base]
	add	ax,[screen_seg]
	mov	es,ax
	mov	ds,ax
	xor	di,di
	mov	si,160
	mov	cx,(maxrow-1)*80
	cld

;	This code will never get executed since we get here when
;  mode = 2 or 3 only.
;;	cmp	cs:[base],0b800h
;;	jz	colorcard

;;    rep	movsw
;;	mov	ax,bx
;;	mov	cx,bp
;;    rep	stosw
;;	jmp	short sret

;;colorcard:
	mov	dx,3dah
wait2:	in	al,dx
	test	al,8
	jz	wait2
	mov	al,25h
	mov	dx,3d8h
	out	dx,al		;turn off video
    rep	movsw
	mov	ax,bx
	mov	cx,bp
	rep	stosw
	mov	al,29h
	mov	dx,3d8h
	out	dx,al		;turn on video
sret:	push	cs
	pop	ds
	ret


CharOut:	PUSH	AX		; Main entry point
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	PUSH	DI
	PUSH	ES
	PUSH	BP

	MOV	[base],0B800H
	XCHG	AX,SI			; SAVE CHARACTER TO STUFF
	MOV	AX,40H			; POINT TO ROS BIOS
	MOV	DS,AX
	MOV	AX,DS:[49H]		; AL=MODE, AH=MAX COL
	DEC	AH			; ANSI NEEDS 0-79 OR 0-39
	MOV	WORD PTR CS:[MODE],AX	; SAVE MODE AND MAX COL
	CMP	AL,7
	JNZ	NOT_BW
	MOV	WORD PTR CS:[base],0B000H
NOT_BW: MOV	AL,DS:[62H]		; GET ACTIVE PAGE
	MOV	CS:[BPAGE],AL
	CBW
	ADD	AX,AX
	MOV	BX,AX
	MOV	AX,DS:[BX+50H]		; AL=COL, AH=ROW
	MOV	WORD PTR CS:[COL],AX	; SAVE ROW AND COLUMN
	MOV	AX,DS:[4EH]		; GET START OF SCREEN SEG
	MOV	CL,4
	SHR	AX,CL			; CONVERT TO A SEGMENT
	PUSH	CS
	POP	DS
	MOV	[screen_seg],AX
	XCHG	AX,SI			; GET BACK CHARACTER IN AL

	CALL	VIDEO
	POP	BP
	POP	ES
	POP	DI
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET


;----------------------------------------------------------
;
;	OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE
;
VIDEO:	MOV	SI,OFFSET STATE
	JMP	[SI]

S2:	CMP	AL,'['
	JZ	S22
	JMP	S1
S22:	MOV	WORD PTR [SI],OFFSET S30
	XOR	BX,BX
	MOV	WORD PTR SelChar,BX
	MOV	WORD PTR PARAM,BX
	JMP	SHORT S3B

S30:	CMP	AL,'?'			; experimental use selector (SM/RM)?
	JA	S7
	mov	SelChar,al
	MOV	WORD PTR [SI],OFFSET S3
	cmp	al,'<'
	jae	S3B

S3:	CMP	AL,';'
	JNZ	S3C
S3A:	INC	PRMCNT
S3B:	CALL	GETPTR
	XOR	AX,AX
	MOV	WORD PTR [BX],AX    ;DEFAULT VALUE IS ZERO
	RET

S3C:	CMP	AL,'0'
	JB	S3D
	CMP	AL,'9'
	JA	S7
	CALL	GETPTR
	SUB	AL,'0'
	XCHG	AL,BYTE PTR [BX]
	MOV	AH,10
	MUL	AH			;*10
	ADD	BYTE PTR [BX],AL	;MOVE IN DIGIT
	RET

S3D:
;;	CMP	AL,'"'                  ;BEGIN QUOTED STRING
;;	JZ	S3E
;;	CMP	AL,"'"
	JNZ	S7
;;S3E:	MOV	WORD PTR [SI],OFFSET S4
;;	MOV	[INQ],AL
S3RET:	RET

;
;   ENTER QUOTED STRINGS
;

;;S4:	CMP	AL,[INQ]		;CHECK FOR STRING TERMINATOR
;;	JNZ	S4A
;;	DEC	PRMCNT			;TERMINATE STRING
;;	MOV	WORD PTR [SI],OFFSET S3
;;	RET

;;S4A:	CALL	GETPTR
;;	MOV	BYTE PTR [BX],AL
;;	MOV	WORD PTR [SI],OFFSET S4
;;	JMP	S3A
;
;  LOOK FOR ANSI COMMAND SPECIFIED IN AL
;

S7:	MOV	BX,OFFSET CMDTABL-3
;
S7A:	ADD	BX,3
	CMP	BYTE PTR [BX],0
	JZ	S1B
	CMP	BYTE PTR [BX],AL
	JNZ	S7A
;
S7B:	MOV	AX,WORD PTR [BX+1]     ;AX = JUMP ADDRESS
	MOV	BX,OFFSET PARAM
	MOV	DL,BYTE PTR [BX]
	XOR	DH,DH		       ;DX = FIRST PARAMETER
	MOV	CX,DX
	OR	CX,CX
	JNZ	S7C
	INC	CX		       ; if DX=0, CX=1 else CX = DX
S7C:	JMP	AX		       ;AL = COMMAND

S1:	CMP	AL,1Bh		       ;ESCAPE SEQUENCE?
	JNZ	S1B
	MOV	WORD PTR [SI],OFFSET S2
	RET

S1B:	CALL	CHROUT
S1A:	MOV	WORD PTR [STATE],OFFSET S1
	RET

MOVCUR: CMP	BYTE PTR [BX],AH
	JZ	SETCUR
	ADD	BYTE PTR [BX],AL
	LOOP	MOVCUR
SETCUR: MOV	DX,WORD PTR COL
	XOR	BX,BX
	MOV	AH,2
	int	10h			; call ROM
	JMP	S1A

HVP:
CUP:
IF	LINE25
	CMP	CL,(maxrow+1)
	jb	cup3			; new row is 24 or less
	JA	SETCUR			; error - 26 or greater
	cmp	EnaL25,0		; else 25, is it allowed?
	jz	SETCUR
cup3:
ELSE
	CMP	CL,maxrow
	JA	SETCUR
ENDIF
	MOV	AL,MAXCOL
	MOV	CH,BYTE PTR [BX+1]
	OR	CH,CH
	JZ	CUP1
	DEC	CH
CUP1:	CMP	AL,CH
	JA	CUP2
	MOV	CH,AL
CUP2:	XCHG	CL,CH
	DEC	CH
	MOV	WORD PTR COL,CX
	JMP	SETCUR

CUF:	MOV	AH,MAXCOL
	MOV	AL,1
CUF1:	MOV	BX,OFFSET COL
	JMP	MOVCUR

CUB:	MOV	AX,00FFH
	JMP	CUF1

CUU:	MOV	AX,00FFH
CUU1:	MOV	BX,OFFSET ROW
	JMP	MOVCUR

CUD:	MOV	AX,(maxrow-1)*256+1
IF	LINE25
	cmp	ah,[row]			; at bottom of screen?
	ja	SETCUR
ENDIF
	JMP	CUU1

SCP:	MOV	AX,WORD PTR COL
	MOV	SAVCR,AX
	JMP	SETCUR

RCP:	MOV	AX,SAVCR
IF	LINE25
	cmp	ch,maxrow
	jb	rcp1
	cmp	EnaL25,0
	jz	rcp2
ENDIF
rcp1:	MOV	WORD PTR COL,AX
rcp2:	JMP	SETCUR

SGR:	XOR	CX,CX
	XCHG	CL,PRMCNT
	CALL	GETPTR
	INC	CX
SGR1:	MOV	AL,BYTE PTR [BX]
	PUSH	BX
	MOV	BX,OFFSET GRMODE
SGR2:	MOV	AH,BYTE PTR [BX]
	ADD	BX,3
	CMP	AH,0FFH
	JZ	SGR3
	CMP	AH,AL
	JNZ	SGR2
	MOV	AX,WORD PTR [BX-2]
	AND	ATTR,AL
	OR	ATTR,AH
SGR3:	POP	BX
	INC	BX
	LOOP	SGR1
	JMP	SETCUR

ED:
IF	LINE25
	cmp	row,maxrow		; on 25th line?
	je	EL			; yes, treat like Erase in Line
ENDIF
	xor	cx,cx
	mov	dl,maxcol
	mov	dh,(maxrow-1)
	cmp	param,1			; which subcommand?
	ja	el2			; all
	jb	ed1
	mov	dh,row			; to beginning
	dec	dh
	jle	EL
	jmp	short ed2
ed1:	mov	ch,row			; to end
	inc	ch
	cmp	ch,dh
	jae	EL
ed2:	mov	bh,attr
	MOV	AX,0600H
	int	10h			; call ROM

EL:	MOV	CX,WORD PTR COL
	MOV	dx,cx
	mov	al,param
	inc	al			; 0,1,2 => 1,2,3
	test	al,1			; to end?
	je	el1
	mov	dl,maxcol
el1:	test	al,2			; to beginning?
	je	el2
	mov	cl,0
el2:	mov	bh,attr
	mov	ax,0600H
	int	10h
S1A_j:	jmp	S1A

IL:	mov	ah,7			; scroll down
	jmp	short dl1

xDL:	mov	ah,6			; scroll up
dl1:	mov	al,cl			; number of lines
	mov	ch,row
	xor	cl,cl
	mov	dh,(maxrow-1)
	mov	dl,maxcol
	mov	bh,attr
	int	10h
	jmp	S1A_j

RM:	XOR	CL,CL
	JMP	SHORT SM1

SM:	MOV	CL,1
SM1:	mov	bl,SelChar		; get selection character
	sub	bl,'<'			; adjust
	jb	S1A_j			; less than '<'
	cmp	bl,4
	jae	S1A_j			; greater than '?'
	xor	bh,bh
	shl	bx,1
	shl	bx,1
	shl	bx,1
	MOV	AL,DL
	CMP	AL,7
	JA	S1A_j
	or	bl,al
	shl	bx,1
	mov	bx,SRMODE[bx]		; get function indicator
	cmp	bx,1			; no or special function?
	jb	S1A_j
	jz	SM2			; sets screen mode
	MOV	[bx],CL
	JMP	S1A_j

SM2:	MOV	AH,0
	int	10h			; call ROM
	JMP	S1A_j

;	GetPtr - get a pointer to the current parameter
GETPTR: MOV	BX,PRMCNTW
	CMP	BX,NUMPARAM
	JB	GET1
	DEC	PRMCNT
	JMP	GETPTR
GET1:	ADD	BX,OFFSET PARAM
	RET