www.pudn.com > 日期、菜单、字符串的C函数.rar > BIOSIO.ASM


;                         *** biosio.asm *** 
; 
; IBM-PC microsoft "C" under PC-DOS v2.00 
; 
; MICROSOFT "C" callable 8088 assembly routines that interface directly 
; with the basic I/O system (BIOS). 
; 
; NOTE -- The IBM Technical Reference Manual contains a listing of the 
;         BIOS and more complete descriptions of each interrupt. 
; 
; Written by L. Cuthbertson, April 1984 
; 
;********************************************************************** 
; 
PGROUP	GROUP	PROG 
PROG	SEGMENT	BYTE PUBLIC 'PROG' 
 
	PUBLIC	KEYRD,KEYHIT,KEYSHIF 
 
	PUBLIC	BIOSINI,BIOSSET,BIOSPOS 
	PUBLIC	BIOSUP,BIOSDWN,BIOSRCA,BIOSWCA,BIOSWC 
	PUBLIC	BIOSWD,BIOSTTY,BIOSCUR 
 
	PUBLIC	COMINI,COMOUT,COMIN,COMSTAT 
 
	PUBLIC	INP,OUTP 
 
	ASSUME	CS:PGROUP 
; 
;********************************************************************** 
; 
;                        *** KEYBOARD I/O *** 
; 
; NOTE - Keyboard interrupt description starts on page A-23 of Tech 
;        Ref Manual. 
; 
;********************************************************************** 
; 
; Read a keyboard entry - wait for entry if one not ready. 
; 
; synopsis	c = keyrd(); 
; 
;		int c;		high order bits contain scan code 
;				low order bits contain character 
; 
; NOTE - Scan codes are described on page 2-17 of the Technical 
;        Reference Manual. 
; 
KEYRD	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AH,0		; READ NEXT CHARACTER ENTERED 
	INT	16H		; BIOS KEYBOARD I/O INTERRUPT 
	POP	BP 
	RET 
KEYRD	ENDP 
; 
; Check to see if there is a character in the keyboard buffer. 
; 
; synopsis	iret = keyhit(); 
; 
;		int iret;	= 0 if no character availible 
;				= 1 character is availible 
; 
KEYHIT	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AH,1		; CHECK KEYBOARD BUFFER FUNCTION 
	INT	16H		; BIOS KEYBOARD I/O INTERRUPT 
	MOV	AX,0		; ASSUME THAT NO CHARACTER READY 
	JZ	K1 
	MOV	AX,1		; CHARACTER READY 
K1: 
	POP	BP 
	RET 
KEYHIT	ENDP 
; 
; Check to see what the shift key status is. 
; 
; synopsis	iret = keyshif(); 
; 
;		int iret;       shift key status 
; 
;			0x80 = insert state is active 
;			0x40 = cap lock state has been toggled 
;			0x20 = num lock state has been toggled 
;			0x10 = scroll lock state has been toggled 
;			0x08 = alternate shift key depressed 
;			0x04 = control shift key depressed 
;			0x02 = left shift key depressed 
;			0x01 = right shift key depressed 
; 
; NOTE - from page A-2 and A-3 of Tech Ref Manual 
; 
KEYSHIF	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AH,2		; CHECK SHIFT STATUS FUNCTION 
	INT	16H		; BIOS KEYBOARD I/O INTERRRUPT 
	POP	BP 
	RET 
KEYSHIF	ENDP 
; 
; ********************************************************************* 
; 
;			*** VIDEO I/O *** 
; 
; NOTE - the video I/O interrupt description starts on page A-43 of the 
;        Tech Ref Manual. 
; 
; ********************************************************************* 
; 
; Initialize screen I/O using the BIOS set mode call 
; 
; synopsis	biosini(stype); 
; 
;		int stype;	screen type 
; 
;			0 = 40x25 BW (power on default) 
;			1 = 40x25 Color 
;			2 = 80x25 BW 
;			3 = 80x25 Color 
;			graphics mode 
;			4 = 320x200 Color 
;			5 = 320x200 BW 
;			6 = 640x200 BW 
;			internal use only 
;			7 = 80x25 BW card 
; 
BIOSINI	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AL,[BP+4]	; SCREEN TYPE IN AL 
	MOV	AH,0		; SET MODE FUNCTION 
	INT	10H		; BIOS VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSINI	ENDP 
; 
; Set the current cursor position. 
; 
; synopsis	biosset(irow,icol); 
; 
;		*** no value returned *** 
;		int irow;	0 to 24 
;		int icol;	0 to 79 
; 
BIOSSET	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	DH,[BP+4]	; ROW 
	MOV	DL,[BP+6]	; COLUMN 
	MOV	BH,0		; CURRENT PAGE NUMBER 
	MOV	AH,2		; CURSOR POSITION SET FUNTION NUMBER 
	INT	10H		; VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSSET	ENDP 
; 
; Return the current cursor postion. 
; 
; synopsis	iret = biospos(); 
; 
;		int iret;	high order bits contain row 
;				low order bits contain column 
; 
BIOSPOS	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	BH,0		; CURRENT PAGE NUMBER 
	MOV	AH,3		; CURSOR POSITION FUNCTION NUMBER 
	INT	10H		; VIDEO I/O INTERRUPT 
	MOV	AH,DH		; MOVE INT RETURN INTO FUNCTION RETURN 
	MOV	AL,DL		; DITTO 
	POP	BP 
	RET 
BIOSPOS	ENDP 
; 
; Scroll the screen up within a defined window. 
; 
; synopsis	biosup(numlines,trow,tlcol,brow,brcol,fchar); 
; 
;		int numlines;	number of lines to scroll up 
;		int trow;	top row of window 
;		int tlcol;	top left column of window 
;		int brow;	bottom row of window 
;		int brcol;	bottom right column of window 
;		int fchar;	fill character of opened line 
; 
; note: numlines = 0 blanks entire window.  Upper left corner of full 
;	screen is 0,0 while the bottom right corner of full screen is 
;	24,79. 
; 
BIOSUP	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AL,[BP+4]	; NUMBER OF LINES TO SCROLL 
	MOV	CH,[BP+6]	; TOP ROW OF WINDOW 
	MOV	CL,[BP+8]	; TOP LEFT COLUMN OF WINDOW 
	MOV	DH,[BP+10]	; BOTTOM ROW OF WINDOW 
	MOV	DL,[BP+12]	; BOTTOM RIGHT COLUMN OF WINDOW 
	MOV	BH,[BP+14]	; FILL CHARACTER 
	MOV	AH,6		; SCROLL UP FUNCTION NUMBER 
	INT	10H		; VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSUP	ENDP 
; 
; Scroll the screen down within a defined window. 
; 
; synopsis	biosdwn(numlines,trow,tlcol,brow,brcol,fchar); 
; 
;		int numlines;	number of lines to scroll down 
;		int trow;	top row of window 
;		int tlcol;	top left column of window 
;		int brow;	bottom row of window 
;		int brcol;	bottom right column of window 
;		int fchar;	fill character of opened line 
; 
; note: numlines = 0 blanks entire window.  Upper left corner of full 
;	screen is 0,0 while the bottom right corner of full screen is 
;	24,79. 
; 
BIOSDWN	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AL,[BP+4]	; NUMBER OF LINES TO SCROLL 
	MOV	CH,[BP+6]	; TOP ROW OF WINDOW 
	MOV	CL,[BP+8]	; TOP LEFT COLUMN OF WINDOW 
	MOV	DH,[BP+10]	; BOTTOM ROW OF WINDOW 
	MOV	DL,[BP+12]	; BOTTOM RIGHT COLUMN OF WINDOW 
	MOV	BH,[BP+14]	; FILL CHARACTER 
	MOV	AH,7		; SCROLL DOWN FUNCTION NUMBER 
	INT	10H		; VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSDWN	ENDP 
; 
; Read the contents of a given screen cell. 
; 
; synopsis	iret=biosrca(); 
; 
;		int iret;	high order bits contain attributes 
;				low order bits contain character 
; 
; NOTE - Attributes are defined on page 13-9 of the DOS v2.0 manual 
; 
BIOSRCA	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	BH,0		; ACTIVE DISPLAY PAGE 
	MOV	AH,8		; READ CHARACTER + ATTRIBUTES FUNCTION 
	INT	10H		; VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSRCA	ENDP 
; 
; Write a character to the screen - with attributes. 
; 
; synopsis	bioswca(char,count,att); 
; 
;		*** no value returned *** 
;		int char;	character to output 
;		int count;	number of times to output character 
;		int att;	character attribute 
; 
; NOTE - Attributes are defined on page 13-9 of the DOS v2.0 manual 
; 
BIOSWCA	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AL,[BP+4]	; CHARACTER 
	MOV	CX,[BP+6]	; NUMBER OF CHARACTERS TO WRITE 
	MOV	BL,[BP+8]	; CHARACTER ATTRIBUTE 
	MOV	BH,0		; ACTIVE DISPLAY PAGE 
	MOV	AH,9		; WRITE CHARACTER/w ATTRIBUTES FUNCTION 
	INT	10H		; VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSWCA	ENDP 
; 
; Write a character to the screen - no attributes. 
; 
; synopsis	bioswc(char,count); 
; 
;		*** no value returned *** 
;		int char;	character to output 
;		int count;	number of times to output character 
; 
BIOSWC	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AL,[BP+4]	; CHARACTER 
	MOV	CX,[BP+6]	; NUMBER OF CHARACTERS TO WRITE 
	MOV	BL,0;		; CHARACTER ATTRIBUTE - NULL 
	MOV	BH,0		; ACTIVE DISPLAY PAGE 
	MOV	AH,10		; WRITE CHARACTER ONLY FUNCTION NUMBER 
	INT	10H		; VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSWC	ENDP 
; 
; Write a dot in graphics mode. 
; 
; synopsis	bioswd(irow,icol); 
; 
;		*** no value returned *** 
;		int irow; 
;		int icol; 
; 
BIOSWD	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	DX,[BP+4]	; ROW 
	MOV	CX,[BP+6]	; COLUMN 
	MOV	AL,1		; GREEN COLOR 
	MOV	AH,12		; WRITE A DOT FUNCTION NUMBER 
	INT	10H		; VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSWD	ENDP 
; 
; Write a character to the screen using the BIOS ascii teletype call. 
; The teletype call will send cr/lf if column 79 is written to (0-79). 
; It will scroll the screen up if row 24 (0-24) column 79 is written to. 
; It will also beep the bell if ^g is received and provide a destructive 
; backspace. 
; 
; synopsis	biostty(c); 
; 
;		char c;		character to write. 
; 
BIOSTTY	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AL,[BP+4]	; CHARACTER TO WRITE INTO AL 
	MOV	AH,14		; TTY FUNCTION 
	MOV	BH,0		; DISPLAY PAGE 
	INT	10H		; BIOS VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSTTY	ENDP 
; 
; Return the current video state of the screen. 
; 
; synopsis	iret = bioscur(); 
; 
;		int iret;	low bits are the mode currently set 
;				(see biosini for description) 
;				high bits are the number of columns on screen 
; 
BIOSCUR	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	AH,15		; CURRENT VIDEO STATE FUNCTION 
	INT	10H		; BIOS VIDEO I/O INTERRUPT 
	POP	BP 
	RET 
BIOSCUR	ENDP 
; 
; ******************************************************************* 
; 
;			*** communications port *** 
; 
; NOTE - the communications port I/O is described starting on page A-20 
;        of the Tech Ref Manual. 
; 
; ******************************************************************* 
; 
; Initialize the communications port. 
; 
; synopsis	iret = comini(port,params); 
; 
;		int iret;	return status (see comstat) 
;		int port;	communications port to initialize (0,1) 
;		int params;	bit pattern for initialization - 
; 
;	7	6	5	4	3	2	1	0 
;       ------BAUD RATE ---     --PARITY--   STOP BIT   --WORD LENGTH-- 
; 
;	000 - 110		X0 - NONE	0 - 1	10 - 7 BITS 
;	001 - 150		01 - ODD	1 - 2	11 - 8 BITS 
;	010 - 300		11 - EVEN 
;	011 - 600 
;	100 - 1200 
;	101 - 2400 
;	110 - 4800 
;	111 - 9600 
; 
COMINI	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	DX,[BP+4]	; COMM PORT TO INITIALIZE 
	MOV	AL,[BP+6]	; PARAMETERS 
	MOV	AH,0		; INITIALIZATION FUNCTION 
	INT	14H		; COMM PORT I/O INTERRUPT 
	POP	BP 
	RET 
COMINI	ENDP 
; 
; Write a character to the communications port. 
; 
; synopsis	iret = comout(port,c); 
; 
;		int iret;	error return ( >127 if error occured) 
;				- see AH under modem control 
;		int port;	communications port to write (0 or 1) 
;		int c;		character to write. 
; 
COMOUT	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	DX,[BP+4]	; COMM PORT TO WRITE 
	MOV	AL,[BP+6]	; CHARACTER TO WRITE 
	MOV	AH,1		; WRITE CHARACTER FUNCTION 
	INT	14H		; COMM PORT I/O INTERRUPT 
	POP	BP 
	RET 
COMOUT	ENDP 
; 
; Read a character from the communications port.  Waits for character if 
; one is not ready.  See \comm\ibmtty.c for example of polling comm port 
; for character without wait. 
; 
; synopsis	c = comin(port); 
; 
;		int c;		character read from comm port, 
;				> 127 if error or no character ready. 
;				- see AH under modem control 
;		int port;	communications port to read (0 or 1) 
; 
COMIN	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	DX,[BP+4]	; COMM PORT TO READ 
	MOV	AH,2		; READ CHARACTER FUNCTION 
	INT	14H		; COMM PORT I/O INTERRUPT 
	POP	BP 
	RET 
COMIN	ENDP 
; 
; Check the line and modem status 
; 
; synopsis	iret = comstat(port); 
; 
;		int iret;	; line and modem status 
;		AH - high order bits contain line control status 
;		bit 7 = time out 
;		bit 6 = trans shift register empty 
;		bit 5 = trans holding register empty 
;		bit 4 = break detect 
;		bit 3 = framing error 
;		bit 2 = parity error 
;		bit 1 = overrun error 
;		bit 0 = data ready 
; 
;		AL - low order bits contain modem status 
;		bit 7 = received line signal detect 
;		bit 6 = ring indicator 
;		bit 5 = data set ready 
;		bit 4 = clear to send 
;		bit 3 = delta receive line signal detect 
;		bit 2 = trailing edge ring detector 
;		bit 1 = delta data set ready 
;		bit 0 = delta clear to send 
; 
; Note - from page A-21 of Tech Ref Manual 
; 
;		int port;	; communications port to check 
; 
COMSTAT	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	DX,[BP+4]	; COMM PORT TO CHECK 
	MOV	AH,3		; STATUS FUNCTION 
	INT	14H		; COMM PORT I/O INTERRUPT 
	POP	BP 
	RET 
COMSTAT	ENDP 
; 
;********************************************************************** 
; 
;			*** io.asm *** 
; 
; IBM-PC 8088 assembly for interface with microsoft "C" under PC-DOS 
; 
; "C" callable subroutines that provide absolute pointer addressing. 
; Pointers within a IBM-PC microsoft "C" program are relative to the 
; start of the programs data segment.  These subroutines provide a 
; mechanism to address absolute memory locations. 
; 
; Supplied by microsoft - commented by L. Cuthbertson, April 1984 
; 
;********************************************************************** 
; 
; Read an absolute memory location. 
; 
; synopsis	c = readabs(loc); 
; 
;		int c;		contents of memory location 
;		int loc;	absolute memory location in hex 
; 
INP	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	DX,[BP+4]	;GET LOCATION ADDRESS 
	IN	AL,DX		;READ LOCATION 
	XOR	AH,AH		;CLEAR HIGH BYTE 
	POP	BP 
	RET 
INP	ENDP 
; 
; Write an absolute memory location. 
; 
; synopsis	writeabs(loc,c); 
; 
;		int loc;	absolute memory location in hex 
;		int c;		integer to write to memory location 
; 
OUTP	PROC	NEAR 
	PUSH	BP 
	MOV	BP,SP 
	MOV	DX,[BP+4]	;GET LOCATION ADDRESS 
	MOV	AX,[BP+6]	;GET ADDRESS OF INTEGER TO WRITE 
	OUT	DX,AL		;WRITE TO MEMORY LOCATION 
	POP	BP 
	RET 
OUTP	ENDP 
; 
;********************************************************************** 
; 
PROG	ENDS 
	END 
;