www.pudn.com > c_editor.rar > ED11.A


;	ED11.A	--	Screen and keyboard interface routines for the PC 
; 
;	This is a modified version of the PCIO.A routines included with the 
;		C ware (Desmet) C compiler and included with permission of 
;		C ware 
; 
 
		dseg 
; 
;	CHARACTER ATTRIBUTE EQUATES 
; 
NORMAL	EQU	7 
REVERSE	EQU	112 
BLINK	EQU	128 
INTENSE	EQU	8 
; 
;	ATTRIBUTE SET CODES 
; 
SETNORMAL	EQU	0 
SETREVERSE	EQU	1 
SETINTENSE	EQU	2 
SETFAINT	EQU	3 
SETBLINK	EQU	4 
NOBLINK		EQU	5 
; 
 
;/* control key translations */ 
UP1	EQU	10 
DOWN1	EQU	13 
UP2	EQU	21 
DOWN2	EQU	4 
LEFT1	EQU	25 
RIGHT1	EQU	18 
INS1	EQU	14 
EDIT1	EQU	5 
ESC1	EQU	27 
DEL1	EQU	127 
ZAP1	EQU	26 
ABT1	EQU	24 
SPLT1	EQU	19 
JOIN1	EQU	16 
DTOCH	EQU	1 
GTOCH	EQU	2 
HOME	EQU	6 
DSCROL 	EQU	7 
GOTO	EQU	17 
LSTRT	EQU	11 
LEND	EQU	12 
USCROL	EQU	15 
ERASE	EQU	20 
LFTDEL	EQU	8 
BEGINPL	EQU	200 
ENDPL	EQU	201 
PUTIT	EQU	202 
PICKIT	EQU	203 
RECORD	EQU	204 
REPLAY	EQU	205 
ABSLEFT	EQU	206 
ABSRGHT	EQU	207 
PAGEUP	EQU	208 
PAGEDN	EQU	209 
 
;	the table that is used to make the translation 
 
convert: 
		db	72, UP2			;up_char 
		db	80, DOWN2		;down_char 
		db	75, LEFT1		;left_char 
		db	77, RIGHT1		;right_char 
		db	71, HOME		;home 
		db	79, DEL1	 	;end 
		db	73, USCROL		;pageup_char 
		db	81, DSCROL		;pagedown_char 
		db	82, UP1			;Ins_char 
		db	83, ZAP1		;Del_char 
		db	115, LSTRT		;ctl-left 
		db	116, LEND		;ctl-rgt 
		db	59, ESC1		;F1 
		db	60, EDIT1		;F2 
		db	61, GOTO		;F3 
		db	62, INS1		;F4 
		db	63, ERASE		;F5 
		db	64, ABT1		;F6 
		db	65, BEGINPL		;F7 
		db	66, ENDPL		;F8 
		db	67, PICKIT		;F9 
		db	68, PUTIT		;F10 
		db	120,SPLT1		;alt-1 
		db	121,JOIN1		;alt-2 
		db	122,DTOCH		;alt-3 
		db	123,GTOCH		;alt-4 
		db	130,ABSLEFT		;alt - 
		db	131,ABSRGHT		;alt + 
		db	132,PAGEUP		;ctl-Pg Up 
		db	118,PAGEDN		;ctl-Pg Dn 
		db	0, 255 ; illegal character 
 
;	equates for bios interface. 
 
;	the interrupt and codes for the screen interface interrupt. 
 
video		equ	10h		;interrupt for dealing with screen 
 
mode		equ	0		;code for setting new screen mode 
curtype		equ	1		;code for setting new cursor type 
setcur		equ	2		;code for addressing cursor 
readcur		equ	3		;code for reading cursor location 
readlp		equ	4		;code for reading light pen position 
setpage		equ	5		;code to select active page 
scrollup	equ	6		;code to scroll screen up 
scrolldn	equ	7		;code to scroll screen nown 
readch		equ	8		;code to read a character from screen 
writeach	equ	9		;code to write char and attributes 
writech		equ	10		;code to write character only 
setpal		equ	11		;code to set new setpal or border 
wdot		equ	12		;code to write a dot 
rdot		equ	13		;code to read a dot 
wtty		equ	14		;code to write as if teletype 
state		equ	15		;code to find current screen status 
 
 
 
;	the interrupt and codes for the keyboard interface. 
 
keyboard	equ	16h		;interrupt 16 to deal with keyboard 
 
cicode		equ	0		;code for reading a character 
cstscode	equ	1		;code for keyboard status 
 
 
 
 
;	caution: must change column number if 40 column mode 
 
crt_cols	equ	80 
 
;	variables available to a C88 program 
 
		public	scr_cols_, scr_rows_ 
		public	scr_mode_,scr_page_,scr_attr_ 
 
scr_cols_:	dw	crt_cols	;current number of columns 
scr_rows_:	dw	25		;current number of rows 
scr_mode_	db	0		;current screen mode 
scr_page_	db	0		;current page 
scr_attr_	db	NORMAL		;current attributes for screen 
					;NORMAL is white letters on black 
 
 
 
		cseg 
 
;	SCR_SETUP_	scr_setup must be called before any use of any 
;			other routine unless the starting mode is 80X25 
;			character mode (3,4 or 7). 
 
;			Usage:	scr_setup(); 
 
		public	scr_setup_ 
scr_setup_:	push	bp 
		mov	ah,state		;get current state 
		int	video 
		mov	scr_mode_,al		;current mode 
		mov	cl,ah			;make cols a word 
		mov	ch,0 
		mov	scr_cols_,cx		;40 or 80 columns 
		mov	scr_page_,bh 
		mov	scr_attr_,NORMAL		;set to white chars on black 
		cmp	al,4			;see if a character mode 
		jc	got_attr 
		cmp	al,7			;7 is for graphics mode 
		jz	got_attr 
		mov	scr_attr_,0		;attribute is zero in graphics 
got_attr:	mov	ah,0			;return int containing mode 
		pop	bp 
		ret 
 
 
 
;	SCR_SETMODE_		set a new screen mode 
 
;				Usage:	scr_setmode(new mode); 
 
		public	scr_setmode_ 
scr_setmode_:	push	bp 
		mov	bp,sp 
		mov	al,[bp+4]	; new mode value 
		mov	ah,mode 
		int	video		; set new mode 
		call	scr_setup_	;remember new values 
		pop	bp 
		ret 
 
 
;	SCR_ROWCOL_		sets cursor at any location. 
 
;				Usage:	scr_rowcol(new row, new column); 
 
		public	scr_rowcol_ 
scr_rowcol_:				; move cursor to x,y 
		push	bp		; save from bios 
		mov	bp,sp 
		mov	dx,[bp+6]	; column 
		mov	ax,[bp+4]	; row 
		mov	dh,al 
		mov	bh,scr_page_	; force page zero 
		mov	ah,setcur	; set cursor location 
		int	video		; call bios 
		pop	bp 
		ret 
 
 
 
;	SCR_CLR_		clear entire screen 
 
;				Usage:	scr_clr(); 
 
		public	scr_clr_ 
scr_clr_:				; clear screen 
 
 
		push	bp		;save from video call 
		mov	al,0		;ask for a clear window 
		xor	cx,cx		;start at 0,0 
		mov	dh,24		;24 is the last line 
		mov	dl,byte scr_cols_	;clear entire width 
		dec	dl		;last column is width-1 
		mov	bh,scr_attr_	;attributes for new blanks 
		mov	ah,scrollup	;ask for a scrollup to clear 
		int	video		;do the clear 
		pop	bp 
		ret 
 
 
 
;	SCR_CLRL_		clear rest of line. 
 
;				Usage:		scr_clrl(); 
 
		public	scr_clrl_		 
scr_clrl_:				; clear rest of line 
		push	bp 
		mov	ah,readcur	;see where we are 
		int	video 
		mov	cl,byte scr_cols_	;calc how many chars left in line 
		sub	cl,dl		;number left 
		mov	ch,0		;number of blanks needed 
		mov	al,' '		;write blanks 
		mov	bl,scr_attr_	;normal attributes 
		mov	ah,writeach	;write the blanks 
		int	video 
		pop	bp 
		ret 
 
 
 
 
 
;	SCR_SCUP_		scroll text up leaving top line alone. 
 
;				Usage:	scr_scup(); 
 
		public	scr_scup_ 
scr_scup_:			; scroll last line, screen from line 2 to 24 
		mov	ax,scr_cols_	;need last column of screen 
		dec	ax 
		push	ax 
		mov	ax,24		;scroll through last line 
		push	ax 
		xor	ax,ax		;from column 0 
		push	ax 
		inc	ax		;leave top line alone 
		push	ax 
		push	ax		;scroll by 1 
		call	scr_scrup_	;do the scroll 
		add	sp,10		;clear arge 
		ret 
 
 
;	SCR_SCDN_		scroll all but the top line down one. 
 
;				Usage:	scr_scdn(); 
 
		public	scr_scdn_ 
scr_scdn_: 
		mov	ax,scr_cols_	;need last column of screen 
		dec	ax 
		push	ax 
		mov	ax,24		;scroll through last line 
		push	ax 
		xor	ax,ax		;from column 0 
		push	ax 
		inc	ax		;leave top line alone 
		push	ax 
		push	ax		;scroll by 1 
		call	scr_scrdn_	;do the scroll 
		add	sp,10		;clear arge 
		ret 
 
		push	ax 
		xor	ax,ax		;from column 0 
		push	ax 
		inc	ax		;leave top line alone 
		push	ax 
		push	ax		;scroll by 1 
		call	scr_scrup_	;do the scroll 
		add	sp,10		;clear arge 
		ret 
 
;	SCR_SCRUP_		Scroll the screen up. The window is scrolled 
;				up nline lines. A zero nline will clear the 
;				window. Top left of the screen in 0,0. 
 
;			Usage: scr_scrup(nline,fromrow,fromcol,torow,tocol); 
 
		public	scr_scrup_ 
scr_scrup_:	push	bp 
		mov	bp,sp 
		mov	al,[bp+4]	;number of lines 
		mov	ch,[bp+6]	;starting row 
		mov	cl,[bp+8]	;starting column 
		mov	dh,[bp+10]	;ending row 
		mov	dl,[bp+12]	;ending column 
		mov	bh,scr_attr_	;current attribute 
		mov	ah,scrollup 
		int	video		;do the scroll 
		pop	bp 
		ret 
 
 
 
;	SCR_SCRDN_		scroll the screen down. the window is scrolled 
;				down nline lines. A zero nline will clear the 
;				window. Top left of the screen in 0,0. 
 
;			Usage: scr_scrdn(nline,fromrow,fromcol,torow,tocol); 
 
		public	scr_scrdn_ 
scr_scrdn_:	push	bp 
		mov	bp,sp 
		mov	al,[bp+4]	;number of lines 
		mov	ch,[bp+6]	;starting row 
		mov	cl,[bp+8]	;starting column 
		mov	dh,[bp+10]	;ending row 
		mov	dl,[bp+12]	;ending column 
		mov	bh,scr_attr_	;current attribute 
		mov	ah,scrolldn 
		int	video		;do the scroll 
		pop	bp 
		ret 
 
 
 
;	SCR_CO_			write a character to the screen. this 
;				routine increments the cursor position 
;				after writing. normal C88 puts and printf 
;				statements can also be used to write to the 
;				screen. 
 
;				Usage:	scr_co_(character); 
 
		public	scr_co_ 
scr_co_:					; standard console output 
		push	bp 
		mov	bp,sp 
		mov	al,[bp+4]	;character to write 
		push	ax 
		push	ax 
		mov	bh,scr_page_ 
		mov	ah,readcur 
		int	video 
		cmp	dl,crt_cols-1 
		jle	u20 
		mov	dl,crt_cols-1	 
u20:	pop	ax 
		cmp	al,8 
		je	u8 
		cmp	al,0dh 
		je	u9 
		cmp	al,0ah 
		je	u10 
		cmp	al,07h 
		je	u11 
		mov	bh,scr_page_ 
		mov	bl,scr_attr_ 
		mov	ah,writeach		;use write char/attr routine 
		mov	cx,1 
		int video 
		inc	dl 
		cmp	dl,crt_cols 
		jnz	u7 
		dec	dl 
		jmp	u7 
 
;		mov	dl,0 
;		cmp	dh,24 
;		jnz	u6 
 
u1:		mov	ah,setcur 
		mov	bh,0 
		int	video 
		mov	bh,scr_attr_ 
u3:		mov	ax,0601h 
		mov	cx,0 
		mov	dh,24 
		mov	dl,crt_cols 
		dec	dl 
u4:		int	video 
u5:		pop	ax		 
		pop	bp 
		ret 
u6:		inc	dh 
u7:		mov	ah,setcur 
		jmp	u4 
u8:		cmp	dl,0 
		je	u7 
		dec	dl 
		jmp	u7 
u9:		mov	dl,0 
		jmp	u7 
u10:	cmp	dh,24 
		jne	u6 
		jmp	u1 
u11:	jmp	u5		 
; 
;	SCR_CHR_ATTR_	set screen attribute 
; 
;				Usage:  scr_chr_attr_(character); 
; 
		public	scr_chr_attr_ 
scr_chr_attr_: 
		push	bp 
		mov	bp,sp 
		mov	al,[bp+4]	;attribute 
		cmp	al,SETNORMAL 
		je	norset 
		cmp	al,SETREVERSE 
		je	revset 
		cmp	al,SETBLINK 
		je	blnkset 
		cmp	al,SETINTENSE 
		je	intset 
		cmp	al,SETFAINT 
		je	fntset 
		cmp	al,NOBLINK 
		je	blnkres 
attfin:	 
		pop	bp 
		ret 
norset:	mov	al,scr_attr_ 
		and	al,136	;save intensity and blink state 
		or	al,NORMAL 
		mov	scr_attr_,al 
		jmp	attfin 
revset:	mov	al,scr_attr_ 
		and	al,136 
		or	al,REVERSE 
		mov	scr_attr_,al 
		jmp attfin 
blnkset:mov	al,scr_attr_ 
		and	al,INTENSE 
		or	al,NORMAL 
		or	al,BLINK 
		mov	scr_attr_,al 
		jmp	attfin 
blnkres:mov	al,scr_attr_ 
		and	al,INTENSE 
		or	al,NORMAL 
		mov	scr_attr_,al 
		jmp	attfin 
intset:	mov	al,scr_attr_ 
		or	al,INTENSE 
		mov	scr_attr_,al 
		jmp	attfin 
fntset: mov	al,scr_attr_ 
		and	al,247 
		mov	scr_attr_,al 
		jmp	attfin 
 
 
;	SCR_CI_			keyboard input. function and soft keys are 
;				translated. see equates for values. 
 
;				Usage:	character = scr_ci(); 
 
		public	scr_ci_ 
scr_ci_:				;return the next character 
					; translate if necessary 
		push	bp 
		mov	ah,cicode	;ask for a keyboard character 
		int	keyboard 
		CMP	AH,74 
		JE	PLUS_KEY   
		CMP	AH,78 
		JE	MINUS_KEY  
		cmp	al,0 
		jne	not_special 
		mov	bx, offset convert	; convert special key 
ci_loop: 
		cmp	byte[bx],0 
		jz	got_it 
		cmp	ah, byte[bx] 
		je	got_it 
		add	bx,2 
		jmp	ci_loop 
got_it:		inc	bx 
		mov	al,[bx] 
		mov	ah,0 
		pop	bp 
		ret 
not_special:	mov	ah,0 
		pop	bp 
		ret 
 
PLUS_KEY:	MOV	AL,RECORD 
		JMP	not_special 
MINUS_KEY:	MOV	AL,REPLAY 
		JMP	not_special 
	 
 
 
;	SCR_CSTS_		return character if any available. otherwise 
;				return zero. 
 
;				Usage:	character = scr_csts(); 
 
		public	scr_csts_ 
scr_csts_:				;return coded character if any available 
		push	bp 
		mov	ah,cstscode 
		int	keyboard 
		mov	ax,0 
		jz	csts_over 
		call	scr_ci_		;get the coded character 
csts_over:	pop	bp 
		ret