PAGE 56,132
TITLE	MIDIO	PERFORM DIRECT DOS CALLS FOR C86 C MAIN PROGRAMS
;   (c) Copyright 1984 by The Computer Entomologist
;
;	Permission is hearby granted to use or distribute this software
;without any restrictions.  You may make copies for yourself or your
;friends. You may include it in any hardware or software product that you
;sell for profit.
;
;	This software is distributed as is, and is not guaranteed to work
;on any particular hardware/software configuration.  Furthermore, no 
;liability is granted with this software: the user takes responcibility for
;any damage this software may do to his system.
;
;	Nasy notices aside, if you have any questions about this software, you
;can reach me at the address below.  If you impliment any new features or
;find (and fix!) any bugs, I would be happy to hear from you.
;
;	Mike Higgins
;	The Computer Entomologist
;	P.O. Box 197
;	Duncans Mills, CA 95430


INCLUDE	CODE

	PUBLIC	_MOPEN
_MOPEN	PROC	NEAR	;INT=MOPEN(NAME);
NAME=4

	PUSH	BP		;DO THE NORMAL C LINKAGE
	MOV	BP,SP

	MOV	DX,NAME[BP]		;GET NAME OF DEVICE TO OPEN
	MOV	AX,03D02H		;OPEN IT FOR READ/WRITE.
	INT	021H			;WELL, CAN DOS DO IT?
	JC	OPENERR			;CHECK FOR ERROR
	MOV	BX,AX			;SET UP TO DO AN IOCTL CALL
	MOV	AX,04400H		;GET DEVICE INFO
	INT	021H
	OR	DL,020H			;SET THE "RAW" BIT, AND
	MOV	DH,0			;CLEAR UPPER BITS
	MOV	AX,04401H		;WRITE IT BACK OUT
	INT	021H

	MOV	AX,BX			;RETURN THE HANDLE
OPENDONE:
	POP	BP			;RECOVER BP
	RET				;RETURN TO C
OPENERR:
	OR	AH,080H			;MAKE AX NEGATIVE
	JMP	OPENDONE

_MOPEN	ENDP

	PUBLIC	_MCLOSE
_MCLOSE	PROC	NEAR	;MCLOSE(HANDLE);
HAND=4
	PUSH	BP
	MOV	BP,SP

	MOV	BX,HAND[BP]	;GET FILE HANDLE
	MOV	AH,03EH
	INT	021H		;CLOSE FILE

	POP	BP
	RET

_MCLOSE	ENDP

	PUBLIC	_MREAD
_MREAD	PROC	NEAR	;SIZE=MREAD(BUF,SIZE,HAND);
BUF=4
SIZE=6
HAND=8
	PUSH	BP
	MOV	BP,SP

	MOV	DX,BUF[BP]	;GET BUFFER ADDRESS
	MOV	CX,SIZE[BP]	;AND LENGTH
	MOV	BX,HAND[BP]	;GET FILE HANDLE
	MOV	AH,03FH		;SET UP TO DO A READ
	INT	021H
	JNC	RDONE		;CHECK FOR ERROR
	OR	AH,080H		;MAKE NEGATIVE FOR ERROR
RDONE:
	POP	BP
	RET

_MREAD	ENDP

	PUBLIC	_MWRITE
_MWRITE	PROC	NEAR	;SIZE=MWRITE(BUF,SIZE,HAND);

	PUSH	BP
	MOV	BP,SP

	MOV	DX,BUF[BP]	;GET BUFFER ADDRESS
	MOV	CX,SIZE[BP]	;AND LENGTH
	MOV	BX,HAND[BP]	;GET FILE HANDLE
	MOV	AH,040H		;SET UP TO DO A WRITE
	INT	021H

	POP	BP
	RET

_MWRITE	ENDP

	PUBLIC	_MIOCTLR		;DO I/O CONTROL READ
_MIOCTLR	PROC	NEAR	;ERR=MIOCTLR(BUF,LEN,HAND);

	PUSH	BP		;DO THE NORMAL C LINKAGE
	MOV	BP,SP

	MOV	BX,HAND[BP]		;STORE HANDLE IN BX
	MOV	DX,BUF[BP]		;GET BUFFER ADDRESS
	MOV	CX,SIZE[BP]		;AND LENGTH.
	MOV	AX,04402H		;TELL DOS THIS IS IOCTL CALL READ
	INT	021H			;WAKE UP DOS.
	JNC	IORDONE			;CHECK FOR ERROR
	OR	AH,080H			;RETURN ERROR NEGATIVE
IORDONE:
	POP	BP			;RECOVER BP
	RET				;RETURN TO C

_MIOCTLR	ENDP

	PUBLIC	_MIOCTLW		;DO I/O CONTROL WRITE
_MIOCTLW	PROC	NEAR	;ERR=MIOCTLW(BUF,LEN,HAND);

	PUSH	BP		;DO THE NORMAL C LINKAGE
	MOV	BP,SP

	MOV	BX,HAND[BP]		;STORE HANDLE IN BX
	MOV	DX,BUF[BP]		;GET BUFFER ADDRESS
	MOV	CX,SIZE[BP]		;AND LENGTH.
	MOV	AX,04403H		;TELL DOS THIS IS IOCTL CALL WRITE
	INT	021H			;WAKE UP DOS.
	JNC	IOWDONE			;CHECK FOR ERROR
	OR	AH,080H			;RETURN ERROR NEGATIVE
IOWDONE:
	POP	BP			;RECOVER BP
	RET				;RETURN TO C

_MIOCTLW	ENDP

INCLUDE ENDCODE

	END
