PAGE	60,132
;
;	C.ASM:	C-86 -TO- MTOS-86 INTERFACE FOR LARGE-MODEL C-86 TASKS.
;	F. W. PORRETTO,	8/10/82
;
;	THIS MODULE CONTAINS ALL THE CODE REQUIRED TO PROVIDE A SERVICE
;	INTERFACE USABLE BY INTEL C-86 PROGRAMS. ALL THE BASIC SERVICES
;	ARE SUPPORTED. ANY HIGH-LEVEL LANGUAGE WHOSE PARAMETER-PASSING CON-
;	VENTIONS ARE A CLOSE MATCH TO THOSE OF C-86 MAY BE FITTED TO THIS
;	INTERFACE, THOUGH SOME CUSTOMIZATION OF THESE ROUTINES MAY BE REQUIRED.
;
;	THE REASON FOR THE REFERENCE TO INTEL C-86 SPECIFICALLY IS THAT THIS
;	INTERFACE WAS TESTED WITH THAT COMPILER. HOWEVER, THE INTERFACE STAN-
;	DARD FOR LINKAGE BETWEEN C FUNCTIONS SHOULD MAKE THIS INTERFACE USABLE
;	WITH OTHER LARGE-MODEL COMPILERS AS WELL. NOTE: EVERY INTERFACE ROUTINE
;	PROVIDED HERE HAS A NAME SUFFIXED BY AN UNDERSCORE, BECAUSE THE INTEL
;	C-86 COMPILER AUTOMATICALLY SUFFIXES **ALL** FUNCTION NAMES, WHETHER
;	INTERNAL OR EXTERNAL TO THE MODULE BEING COMPILED, WITH THE UNDERSCORE
;	CHARACTER. THESE UNDERSCORES MAY BE REMOVED IF THEY OBSTRUCT THE USE OF
;	THE INTERFACE WITH ANOTHER COMPILER; THEY ARE NOT SEMANTICALLY IMPOR-
;	TANT.
;
;	THE ROUTINES WHICH PROVIDE THE INTERFACE ARE MULTIPROCESSOR-CO-ENTRANT,
;	A REQUIREMENT FOR THIS PARTICULAR APPLICATION. THE REQUIRED SDBS ARE
;	BUILT ON THE REQUESTING TASK'S STACK, AND SUBMITTED TO MTOS VIA THE
;	TYPE 1 SVC (SDB ADDRESS PUSHED BEFORE INTERRUPT INSTRUCTION). THERE IS
;	A REQUIREMENT FOR A RATHER UNUSUAL KIND OF STACK MAINTENANCE, OWING
;	TO THE ORDER OF EVENTS AND THE WAY IN WHICH VARIOUS REQUIRED ITEMS ARE
;	SAVED:
;
;	1)AT THE "BOTTOM" OF THE STACK WILL BE THE USER'S PARAMETERS. C-86
;	  MAINTAINS A CALL-BY-VALUE CONVENTION, AND ARRANGES ITS ARGUMENTS ON
;	  THE STACK IN ORDER OF POSITION IN THE CALLING SEQUENCE.
;
;	2)ABOVE THAT IS THE RETURN ADDRESS TO THE TASK, WHICH IS ASSUMED TO BE
;	  A C FUNCTION COMPILED IN THE LARGE MODEL.
;
;	3)ABOVE THAT, THE INTERFACE ROUTINES ALLOCATE SPACE IN WHICH TO BUILD
;	  THE SDB FOR THE REQUESTED FUNCTION. IT SHOULD ALSO BE OBSERVED HERE
;	  THAT THE INTERFACE DOES ALL NECESSARY SHIFTING AND PARAMETER COMBI-
;	  NING, BUT NO VALIDATION.
;
;	4)ABOVE THAT, AT THE TOP, ARE THE REGISTERS OF THE CALLING TASK, SAVED
;	  AS NECESSARY, AND FOR A SHORT TIME THE ADDRESS OF THE SDB AS IT IS
;	  SUBMITTED TO MTOS.
;
;	THE READER WILL NOTE THAT THE FUNDAMENTAL OPERATIONS OF ANY SELECTED
;	ROUTINE ARE MUCH THE SAME AS THOSE OF ANY OTHER. TO CONSERVE MEMORY,
;	SEVERAL ROUTINES SHARE PROCESSING WITH ONE ANOTHER. THE ACTUAL GOINGS-
;	ON SHOULD BE FAIRLY OBVIOUS, GIVEN A KNOWLEDGE OF THE MTOS-86 SDB FOR-
;	MATS AND BEARING IN MIND THE STACK CONTROL SCHEME DESCRIBED ABOVE.
;
		NAME	C_TO_MTOS
;
C_CS		SEGMENT PARA PUBLIC
		ASSUME	CS:C_CS
;
		PUBLIC	ALOC_,CNTRL_,CPRI_,DALOC_,DSCRTE_,ENDT_,ENDR_,PAUSE_
		PUBLIC	QSTRT_,STRT_,RECV_,REF_,RESUME_,RIO_,RSF_,SEF_
		PUBLIC	SEFET_,SEND_,STIME_,TEF_,TIME_,TSF_,WEF_,QCOPY_
		PUBLIC	CREATE_,DELETE_,DELTSK_,LOADED_,HSFS_
                PUBLIC	GETPARM_,SVCOK_
;
;	SPECIAL NOTE!!
;
;		IN THIS, THE IBM PC MACROASSEMBLER VERSION OF MTOS-86UP V3.0,
;	IT HAS BEEN NECESSARY TO MAKE A SLIGHT CHANGE TO ACCOMMODATE A FAULT
;	IN THE ASSEMBLER: THE VECTOR NUMBERS FOR THE TWO SVC INTERRUPT IN-
;	STRUCTIONS ARE DECLARED LOCALLY TO THIS MODULE, THUS:
;
X_SVC_VECTOR	EQU	186
;
PAGE
;
;	TYPE 1 SVC GENERATOR:
;
;	THIS ROUTINE PRESUMES THAT AT SS:BP IS THE SDB, AND THAT AT 
;	SS:[BP][DI] IS THE C-86 CALLING PROCEDURE'S STATUS VARIABLE,
;	INTO WHICH THE FLAGS REGISTER IS FORCED ON RETURN FROM MTOS.
;
MTOS		PROC	NEAR
		PUSH	SS			;STACK THE ADDRESS OF THE
		PUSH	BP			;SDB JUST BUILT.
		INT	LOW X_SVC_VECTOR	;INVOKE MTOS.
		POP	BP			;REMOVE THE SDB ADDRESS
		POP	SS			;FROM THE STACK.
		PUSHF				;SAVE RETURNED STATUS.
		LDS	DI,DWORD PTR [BP][DI]	;GET ADDRESS OF STATUS WORD
		POP	WORD PTR [DI]		;RETURN STATUS WORD FILLED.
		RET
MTOS		ENDP
PAGE
;
;	SYMBOLS FOR ALOC:
;
ALOCS_WTID	EQU	1	;SDB:	WAIT PARAMETER, POOL ID.
ALOCS_SZE	EQU	2	;	SIZE OF REQUIRED BLOCK.
ALOCS_BUFR	EQU	4	;	ADDRESS OF BLOCK POINTER BUFFER.
ALOCS_SIZE	EQU	8	;ALLOCATED FOR SDB.
ALOC_WT		EQU	12	;C-86:	WAIT PARAMETER,
ALOC_ID		EQU	14	;	POOL ID,
ALOC_SZE	EQU	16	;	SIZE OF REQUIRED BLOCK,
ALOC_BUFR	EQU	18	;	ADDRESS OF BLOCK POINTER BUFFER,
ALOC_STS	EQU	22	;	ADDRESS OF STATUS WORD.
ALOC_SIZE	EQU	ALOC_STS-ALOCS_SIZE	;USED BY C-86.
;
;
ALOC_		PROC	FAR
		SUB	SP,ALOCS_SIZE		;ALLOW FOR SDB
		PUSH	AX
		PUSH	BP
		PUSH	DI
		PUSH	DS
		MOV	BP,SP
		ADD	BP,8			;MARK THE SDB.
		MOV	BYTE PTR [BP],0FH	;ALOC SERVICE CODE.
		MOV	AL,[BP+ALOC_WT]
		ROR	AL,1
		OR	AL,[BP+ALOC_ID]
		MOV	[BP+ALOCS_WTID],AL	;WAIT PARAM AND POOL ID.
		MOV	AX,[BP+ALOC_SZE]
		MOV	[BP+ALOCS_SZE],AX	;SIZE OF BLOCK NEEDED.
		LDS	DI,DWORD PTR [BP+ALOC_BUFR]
		MOV	[BP+ALOCS_BUFR],DI	;BUFFER OFFSET
		MOV	[BP+ALOCS_BUFR+2],DS	;       SEGMENT
		MOV	DI,ALOC_STS
		CALL	MTOS			;TYPE 1 SVC
		POP	DS
		POP	DI
		POP	BP
		POP	AX
		ADD	SP,ALOCS_SIZE		;DESTROY SDB
		RET				;DONE.
ALOC_		ENDP
PAGE
;
;	SYMBOLS FOR CNTRL:
;
CNTRLS_SE	EQU	1	;SDB:	ENTER/EXIT INDICATOR.
CNTRLS_CID	EQU	2	;	CONTROLLED PROGRAM ID.
CNTRLS_SIZE	EQU	4	;ALLOCATED FOR SDB.
CNTRL_SE	EQU	8	;C-86:	ENTER/EXIT INDICATOR.
CNTRL_CID	EQU	10	;	CONTROLLED PROGRAM ID.
CNTRL_STS	EQU	12	;	ADDRESS OF STATUS WORD.
CNTRL_SIZE	EQU	CNTRL_STS-CNTRLS_SIZE	;USED BY C-86
;
;
CNTRL_		PROC	FAR
		SUB	SP,CNTRLS_SIZE		;ALLOW FOR SDB.
		PUSH	AX
		PUSH	BP
		PUSH	DI
		PUSH	DS
		MOV	BP,SP
		ADD	BP,8			;MARK THE SDB.
		MOV	AL,[BP+CNTRL_SE]
		ROR	AL,1
		MOV	[BP+CNTRLS_SE],AL	;ENTER/EXIT FLAG.
		MOV	AL,[BP+CNTRL_CID]
		MOV	[BP+CNTRLS_CID],AL	;CONTROLLED PROGRAM ID.
		MOV	BYTE PTR [BP],011H	;CNTRL CODE.
		MOV	DI,CNTRL_STS
		CALL	MTOS			;TYPE 1 SVC.
		POP	DS
		POP	DI
		POP	BP
		POP	AX
		ADD	SP,CNTRLS_SIZE		;DESTROY SDB
		RET				;DONE.
CNTRL_		ENDP
PAGE
;
;	SYMBOLS FOR LOADED:
;
LOADEDS_STATUS	EQU	1	;SDB:	LOAD COMPLETION STATUS,
LOADEDS_ORD	EQU	2	;	OVERLAY REGION DESCRIPTOR ADDRESS,
LOADEDS_SIZE	EQU	6	;ALLOCATED FOR THE SDB.
LOADED_STATUS	EQU	10	;C-86:	LOAD COMPLETION STATUS,
LOADED_ORD	EQU	12	;	OVERLAY REGION DESCRIPTOR ADDRESS,
LOADED_STS	EQU	16	;	ADDRESS OF STATUS WORD.
LOADED_SIZE	EQU	LOADED_STS-LOADEDS_SIZE	;USED BY C-86
;
;
LOADED_		PROC	FAR
		SUB	SP,LOADEDS_SIZE		;ALLOW FOR THE SDB.
		PUSH	AX
		PUSH	BP
		PUSH	DI
		PUSH	DS
		MOV	BP,SP
		ADD	BP,8			;MARK THE SDB.
		MOV	BYTE PTR [BP],01DH	;LOADED SERVICE CODE.
		MOV	AL,[BP+LOADED_STATUS]	;GET LOAD COMPLETION STATUS
		MOV	[BP+LOADEDS_STATUS],AL	;TO SDB.
		LDS	DI,DWORD PTR [BP+LOADED_ORD]	;ADDR OF ORD
		MOV	[BP+LOADEDS_ORD],DI	;TO THE SDB.
		MOV	[BP+LOADEDS_ORD+2],DS	;(BOTH PARTS.)
		MOV	DI,LOADED_STS		;ADDRESS THE STATUS VARIABLE.
		CALL	MTOS			;TYPE 1 SVC.
		POP	DS
		POP	DI
		POP	BP
		POP	AX			;RESTORE REGISTERS,
		ADD	SP,LOADEDS_SIZE		;DESTROY STACKED SDB,
		RET				;THAT'S IT.
LOADED_		ENDP
;
;	SYMBOLS FOR HSFS SERVICE:
;
HSFSS_OPCODE	EQU	1	;SDB:	HSFS OPCODE.
HSFSS_FMASK	EQU	2	;	EVENT FLAG MASK WORD.
HSFSS_STS	EQU	4	;	ADDRESS OF STATUS WORD.
HSFSS_RPB	EQU	8	;	ADDRESS OF REQUEST RPB.
HSFSS_SIZE	EQU	12	;BYTES NEEDED TO CONSTRUCT SDB.
HSFS_OPCODE	EQU	16	;C:	HSFS OPCODE.
HSFS_FMASK	EQU	18	;	EVENT FLAG MASK WORD.
HSFS_STS	EQU	20	;	REQUEST STATUS WORD ADDRESS.
HSFS_RPB	EQU	24	;	ADDRESS OF RPB.
HSFS_SIZE	EQU	HSFS_RPB-HSFSS_SIZE	;BYTES USED BY C-86 TO PASS PARAMETERS.
;
;	THE INTERFACE PROCEDURE.
;
HSFS_		PROC	FAR
		SUB	SP,HSFSS_SIZE		;MAKE ROOM FOR GENERATED SDB.
		PUSH	AX
		PUSH	BP
		PUSH	DI
		PUSH	DS
		MOV	BP,SP			;MARK THE SDB FRAME,
		ADD	BP,8			;BELOW THE SAVE AREA.
		MOV	BYTE PTR [BP],01EH	;SDB SERVICE CODE.
		MOV	AX,[BP+HSFS_OPCODE]	;HSFS OPCODE.
		MOV	[BP+HSFSS_OPCODE],AL	;(BECOMES A BYTE.)
		MOV	AX,[BP+HSFS_FMASK]	;EVENT FLAG MASK WORD
		MOV	[BP+HSFSS_FMASK],AX
		LDS	DI,DWORD PTR [BP+HSFS_STS]	;ADDRESS OF STATUS
		MOV	[BP+HSFSS_STS],DI	;WORD BUFFER.
		MOV	[BP+HSFSS_STS+2],DS
		LDS	DI,DWORD PTR [BP+HSFS_RPB]	;ADDRESS OF REQUEST'S
		MOV	[BP+HSFSS_RPB],DI	;RPB.
		MOV	[BP+HSFSS_RPB+2],DS
		PUSH	SS			;ADDRESS OF THE SDB ONTO
		PUSH	BP			;THE TASK'S STACK.
		INT	LOW X_SVC_VECTOR	;TYPE 1 SERVICE CALL.
		ADD	SP,4			;DESTROY SDB ADDRESS.
		POP	DS
		POP	DI
		POP	BP
		POP	AX
		ADD	SP,HSFSS_SIZE		;DESTROY SDB CONSTRUCTION.
		RET				;RETURN TO CALLER.
HSFS_		ENDP
PAGE
;
;	UTILITY PROCEDURES SVCOK AND GETPARM:
;
SVCOK_		PROC	FAR
		PUSH	BP
		MOV	BP,SP
		XOR	AL,AL		;ASSUME FALSITY.
		TEST	WORD PTR [BP+6],0040H	;SVC FAILED?
		JNE	@1		;YES.
		NOT	AL		;NO.
@1:		POP	BP
		RET	
SVCOK_		ENDP
;
;
GETPARM_	PROC	FAR
		MOV	DX,BX		;BX PARAMETER BECOMES POINTER SEGMENT
		MOV	AX,AX		;AX PARAMETER BECOMES POINTER OFFSET.
		RET
GETPARM_	ENDP
;
C_CS		ENDS
		END
