	UNIVERSAL IMPPRM  PARAMETER FILE FOR MACRO ROUTINES IN IMP
; K. FARVIS 9TH. NOV. 1976
	.DIRECTIVE	.NOBIN

;DEFS OF ACS

	T1=2
	T2=3
	T3=4
	T4=5
	T5=6
	J=3		;***  DUPLICATE USE OF REGISTER 3 ***
	IOREG=4
	ARG3=4		;***  NOTE DUPLICATE OF IOREG AND T3 ***
	ARG2=5		;***  THIS ALSO DUPLICATE OF T4 ***
	ARG1=6		;***  DUPLICATE OF T5 ***
	P=17


	BASE1=16
	BASE2=15
	BASE3=14
	BASE4=13
	BASE5=12

;	P=17		;PDL FOR ROUTINE ENTRY-EXIT
;	ARG1=16	;1ST PARAMETER FOR PROCEDURE
;	ARG2=15	;2ND PARAMETER
;	ARG3=14	;3RD PARAMETER
;	 AC'S 13-7 ARE BASE REGISTERS 5-1
; FOR GENERAL MACRO ROUTINES THE FOLLOWING REGISTERS ARE FREE
;	T6=6
;	T5=5
;	T4=4
;	T3=3
;	T2=2
;	T1=1		;AND ALSO
	AC1=1		;%RESULT REGISTER FROM MAPS
;	AC=0		;%RESULT REGISTER FROM FUNCTIONS
	AC=1

;ADDITIONAL AC DEFNS FOR PRIMITIVE PROCEDURES
	P2=1		;PRESERVED ACS
	P1=2
	J=3		;RETURN ADDRESS

	ARGLST==2	;START LOCATION OF PARAMETERS ON STACK
;THE REGISTER FOR LONG REAL ARGUMENT PARAMETER
	LARG1==6
;NOW LOCATION OF LONG REAL ARGUMENTS ON THE STACK
	A1INC==2	;LOC OF 1ST
	A2INC==4	;LOC OF 2ND
	A3INC==6	;LOC OF 3RD
	A4INC==10	;LOC OF 4TH
	A5INC==12	;LOC OF 5TH
	A6INC==14	;LOC OF 6TH



;DEVICE TYPE DEFINITIONS
	TMPDEV==-2
	UNDEV==-1
	DSKDEV==0
	DTADEV==1
	MTADEV==2
	TTYDEV==3
	XDSKDEV==4


; SCB RECORD DEFININTIONS MUST CORRESPOND TO IMP SIDE

	DEVTYP==0
;**TEMP UNTIL SHORT INTEGERS
	CHNTYP==1
	NXTCHR==2
	OPER==3
	FLAGS==4
	RESVD==5
	TMPNAME==6
	UDX==7
	FILOPFN==10
	STATUS==11
	DEVNAM==12
	BUFHEDS==13
	BUFNUM==14
	LKENT==15
	PATHARG==16
	BUFADR==17
	BYTPTR==20
	BYTCNT==21
	MPXUDX==21
	IBUFOP==23
	OBUFOP==24
	USETI==25
	USETO==26
	STATZ==27
	BLOCKSIZE==30
	;NEXT COMES THE PATH BLOCK
	;THEN THE LOOKUP ENTER BLOCK



;+ADDITIONAL DEFNS FOR TERMINAL SCB
	ARGPTR==5
	FUNCT==6
	OUTARG==10

;AND FOR STRRING SCB
	LENGTH==4
	LENPTR==5
	POINTER==6


;THE CALLING INSTRUCTIONS FOR ROUTINES

OPDEF CALL [ PUSHJ P,]

OPDEF RETURN [POPJ 17,0]
OPDEF GOTO [JRST]
OPDEF PJRST [JRST]

;OPENING SEQUENCE FOR LONG REAL PROCEDURES, TO PUT ARGS ON STACK

DEFINE IHELLO (NAME) <
	SALL
;**NEW**NAME:	DMOVEM	ARG1,A1INC(SP)
NAME:	MOVEM	ARG1,A1INC(SP)
	SETZM	A1INC+1(SP)
	MOVEM	ARG2,A2INC(SP)
	SETZM	A2INC+1(SP)
	MOVEM	ARG3,A3INC(SP)
	SETZM	A3INC+1(SP)
>

	SUBTTL PROCESSOR DEFINITION (KA10/KI10)

;TYPE OF PROCESSOR
KA10==1
KI10==2
IFNDEF CPU,<CPU==KI10>


IFN CPU-KA10,<
DEFINE DOUBLE (A,B)<
	A
	B>
>

IFE CPU-KA10,<
DEFINE DOUBLE (A,B)<
ZZ1.==A&<777000,,0>
IFL ZZ1.,<ZZ1.==-ZZ1.-<1000,,0>>
ZZ1.==ZZ1.-<033000,,0>
IFE B,<ZZ1.==0>
ZZ2.==ZZ1.+<<B+200>_-8>&<000777,,777777>
IFL ZZ1.,<ZZ2.==0>
	A
	ZZ2.
SUPPRESS ZZ1.,ZZ2.>
DEFINE DMOVE(AC,M)<
	IFL <Z M>-<@>,<
	MOVE AC,M
	MOVE AC+1,1+M>

	IFGE <Z M>-<@>,<
	MOVEI AC+1,M
	MOVE AC,(AC+1)
	MOVE AC+1,1(AC+1)>
>

DEFINE	DMOVN(AC,M)<
	DMOVE AC,M
	DFN AC,AC+1>

DEFINE DMOVEM(AC,M)<
	MOVEM AC,M
	MOVEM AC+1,1+M
>

DEFINE FLMUL (AC,M,%OV)<
	MOVEM AC,AC+2
	FMPR AC+2,1+M
	JFCL (2)
	FMPR AC+1,M
	JFCL (2)
	UFA AC+1,AC+2
	JFCL
	FMPL AC,M
	JOV %OV
	UFA AC+1,AC+2
	FADL AC,AC+2
%OV: >

DEFINE FLDIV(AC,M,%OV)<
	FDVL AC,M
	JOV %OV
	MOVN AC+2,AC
	FMPR AC+2,1+M
	JFCL (2)
	UFA AC+1,AC+2
	FDVR AC+2,M
	JFCL
	FADL AC,AC+2
%OV: >

DEFINE FLADD(AC,M,%OV)<
	UFA AC+1,1+M
	FADL AC,M
	JOV %OV
	UFA AC+1,AC+2
	FADL AC,AC+2
%OV: >

>	;END OF KA10 CONDITIONAL
IFE CPU-KI10,<
OPDEF	FLADD	[DFAD]
OPDEF	FLMUL	[DFMP]
OPDEF	FLDIV	[DFDV]

DEFINE DFN (A,B)<	DMOVN A,A
IFN < <A+1>&17-<B>>,<PRINTX "DMOVN A,A" CAN'T REPLACE "DFN A,B">
>
>	;END OF KI10 CONDITIONAL


SUBTTL	IMP STRING DEFINITION

;DEFINE AN IMPSTRING TO BE 9-BIT BYTES WITH COUNT AS THE FIRST
DEFINE IMPSTR($C)
<	SALL
$N==0
$CT==1
IRPC $C,<$N==$N+1>
IRPC $C,
   <IFN $CT-4,
       <$N==$N_11+"$C">
   IFE $CT-4,
      <	EXP	$N
       $N=="$C"
       $CT==0>
   $CT==$CT+1>
IFE $CT-3,<$N==$N_11>
IFE $CT-2,<$N==$N_22>
IFE $CT-1,<$N==$N_33>
  	EXP	$N
>

SUBTTL	ERROR MACROS

DEFINE ERROR(EVENT,SUBEV,XTRA,EMESS,%A)<
	SALL
	MOVE	ARG3,XTRA
	MOVEI	P2,%A
	MOVEI	P1,ERRMSG##
	JSP	J,.$MOVE##
	POP	P,J		;GET ORIGINAL RETURN ADDRESS
	HRREI	ARG1,EVENT
	HRREI	ARG2,SUBEV
	GOTO	.$SNAL##	;GOTO IT
%A:	EMESS
>

DEFINE PRMERROR(EVENT,SUBEV,XTRA,EMESS,%A)<
	SALL
	MOVE	ARG3,XTRA
	MOVEI	P2,%A
	MOVEI	P1,ERRMSG##
	MOVEM	J,ARG1		;SAVE RETURN ADDRESS
	JSP	J,.$MOVE##
	MOVE	J,ARG1		;GET ORIGINAL RETURN ADDRESS
	HRREI	ARG1,EVENT
	HRREI	ARG2,SUBEV
	GOTO	.$SNAL##
%A:	EMESS
>


SUBTTL	STORAGE CONSTANTS

$IOSIZE==^D2000
$PDLSIZE==200
$STACKSIZE==^D20000
$ERRORS==1

	END

