PAGE	60,132
;
;	PLM.ASM:	PL/M-86 -TO- MTOS-86 INTERFACE
;	F. W. PORRETTO,	8/10/82
;
;	THIS MODULE CONTAINS ALL THE CODE REQUIRED TO PROVIDE A SERVICE
;	INTERFACE USABLE BY INTEL PL/M-86 PROGRAMS. ALL THE BASIC SERVICES
;	ARE SUPPORTED. ANY HIGH-LEVEL LANGUAGE WHOSE PARAMETER-PASSING CON-
;	VENTIONS ARE A CLOSE MATCH TO THOSE OF PL/M-86 MAY BE FITTED TO THIS
;	INTERFACE, THOUGH SOME CUSTOMIZATION OF THESE ROUTINES MAY BE REQUIRED.
;
;	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. PL/M-86
;	  MAINTAINS A CALL-BY-VALUE CONVENTION, AND PUSHES ITS ARGUMENTS ONTO
;	  THE STACK IN INVERSE ORDER OF POSITION IN THE CALLING SEQUENCE.
;
;	2)ABOVE THAT IS THE RETURN ADDRESS TO THE TASK, WHICH IS ASSUMED TO BE
;	  A PL/M PROCEDURE DECLARED LARGE.
;
;	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	PLM_TO_MTOS
;
PLM_CS		SEGMENT PARA PUBLIC
		ASSUME	CS:PLM_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 PL/M-86 CALLING PROCEDURE'S STATUS VARIABLE,
;	INTO WHICH THE FLAGS REGISTER IS FORCED ON RETURN FROM MTOS.
;
MTOS		PROC	NEAR
		PUSH	SS
		PUSH	BP
		INT	LOW X_SVC_VECTOR
		POP	BP
		POP	SS
		PUSHF
		LDS	DI,DWORD PTR [BP][DI]	;GET ADDRESS OF STATUS WORD
		POP	WORD PTR [DI]		;RETURN STATUS WORD
		RET
MTOS		ENDP
PAGE
;
;	SYMBOLS FOR ALOC:
;
ALOCS_WTID	EQU	1
ALOCS_SZE	EQU	2
ALOCS_BUFR	EQU	4
ALOCS_SIZE	EQU	8	;ALLOCATED FOR SDB.
ALOC_STS	EQU	12
ALOC_BUFR	EQU	16
ALOC_SZE	EQU	20
ALOC_ID		EQU	22
ALOC_WT		EQU	24
ALOC_SIZE	EQU	14	;USED BY PL/M-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	ALOC_SIZE		;DONE.
ALOC		ENDP
PAGE
;
;	SYMBOLS FOR CNTRL:
;
CNTRLS_SE	EQU	1
CNTRLS_CID	EQU	2
CNTRLS_SIZE	EQU	4	;ALLOCATED FOR SDB.
CNTRL_STS	EQU	8
CNTRL_CID	EQU	12
CNTRL_SE	EQU	14
CNTRL_SIZE	EQU	8	;USED BY PL/M-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	CNTRL_SIZE
CNTRL		ENDP
PAGE
;
;	SYMBOLS FOR LOADED:
;
LOADEDS_STATUS	EQU	1
LOADEDS_ORD	EQU	2
LOADEDS_SIZE	EQU	6	;ALLOCATED FOR THE SDB.
LOADED_STS	EQU	10
LOADED_ORD	EQU	14
LOADED_STATUS	EQU	18
LOADED_SIZE	EQU	10	;USED BY PL/M-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	LOADED_SIZE		;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_RPB	EQU	16	;PLM:	ADDRESS OF REQUEST RPB.
HSFS_STS	EQU	20	;	ADDRESS OF STATUS WORD.
HSFS_FMASK	EQU	24	;	EVENT FLAG MASK WORD.
HSFS_OPCODE	EQU	26	;	HSFS OPCODE.
HSFS_SIZE	EQU	12	;BYTES USED BY PL/M-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	HSFS_SIZE		;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	2
SVCOK		ENDP
;
;
GETPARM		PROC	FAR
		MOV	ES,BX		;BX PARAMETER BECOMES POINTER SEGMENT
		MOV	BX,AX		;AX PARAMETER BECOMES POINTER OFFSET.
		RET
GETPARM		ENDP
;
PLM_CS		ENDS
;
		END
