Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-10 - 43,50520/forprm.ka
There is 1 other file named forprm.ka in the archive. Click here to see a list.
	UNIVERSAL FORPRM %4.(435) - FOROTS UNIVERSAL PARAMETER FILE
	SUBTTL	D. TODD/DRT/HPW/SRM/MD/DPL		09-APR-75
IFNDEF	FTWMU,<FTWMU==-1>	;0 IF DON'T WANT DEVTB. IN LOWSEG
				;STANDARD FOROTS HAS IT IN HIGHSEG.
;NOTE THAT THE ROUTINES IN FORWMU WHICH NORMALLY ACCEPT UNIT NUMBERS
;	WILL ONLY ACCEPT DEVICE NAMES IF THIS IS ZERO, AND THAT
;	DEVCHG WILL NOT WORK AT ALL.
	SUBTTL	REVISION HISTORY

;247	 -----	IMPLEMENT FULL SLIST AND ELIST
;250	 -----	IMPLEMENT ARRAY BOUNDS CHECKING
;260	 -----	SWITCH FT.EXT AND FT.ELT
;435	-----	FIX ERROR MACRO TO ALLOW UP TO 48 ERROR MSGS PER CLASS
	PASS2		;SAVE PRINT OUT ON PASS 2

;***COPYRIGHT 1972,1973,1974,1975 DIGITAL EQUIPMENT CORP., MAYNARD, MASS.***




; THIS FILE MUST BE ASSEMBLED WITH ALL SOURCE FILES
; OF THE FORTRAN OBJECT TIME STSTEM (FOROTS)

	MLON


VFOROT==4		;FOROTS SYSTEM VERSION NUMBER
VERNO==4		;MAJOR VERSION NUMBER
VEDIT==311		;EDIT NUMBER
VMINOR==00		;MINOR VERSION NUMBER
VWHO==0			;WHO EDITED LAST

VERPRM==BYTE (3)VWHO(9)VERNO(6)VMINOR(18)VEDIT

; EXTERNAL SYSTEM SYMBOLS
	EXTERN	.JBFF,.JBREL,.JBOPS,.JBSA,.JBTPC,.JBOPC,.JB41,.JBHRL
	EXTERN	FOROT%		;DEFINE ENTRY POINT TO FOROTS


; PDP-10 PROCESSOR SWITCHES
	; PDP-6		PR0CESS=PDP6
	; PDP-10 (KA10)	PROCESSOR=KA10
	; PDP-10 (KI10)	PROCESS==KI10

	PDP6==0
	KA10==1
	KI10==2
	IFNDEF CPU,<CPU==KA10>	;THE DEFAULT CPU

; FOROTS SYSTEM DEVICE

	;FOROTS ON DSK	SYSDEV=SIXBIT /DSK/
	;FOROTS ON SYS	SYSDEV=SIXBIT /SYS/

	IFNDEF SYSDEV,<SYSDEV=SIXBIT /SYS/> ;DEFAULT ON DSK FOR DEVELOP.


; SYSTEM PARAMETERS TO FOROTS
; ASSEMBLY OPTIONS
	;FOROTS VERSION NUMBERS FOR PREVIOUS RELEASES
	IFNDEF %V1,<%V1==-1>	;ASSEMBLE VERSION 1 CALLING SEQUENCE
				;DOES NOT CONFLICT WITH VERSION 2

	IFNDEF STK.SZ,<STK.SZ==100>	;DEFINE THE SIZE OF THE STACK
	IFNDEF STRCNK,<STRCNK==^D15>	;DEFAULT CHUNK SIZE FOR INTERNAL STRINGS
	IFNDEF QUEUER,<QUEUER==-1>	;ALLOW FOROTS TO CALL QMANGR FOR
				  	;FOR FILE PRINTING ETC.
	IFNDEF ASTFL,<ASTFL==-1>  	;SET ASTERICK FILL ON OVERFLOW ON
	IFNDEF CHKSUM,<CHKSUM==0> 	;SET CHECK SUMMING OF BINARY
	IFNDEF FORSE,<FORSE==-1>	;FORSE COMPATIABLE BINARY I/O
					;INPUT ONLY(BINARY)
	IFNDEF FLU.MX,<FLU.MX==^D63>	;THE LARGEST ALLOWABLE
					;FORTRAN LOGICAL UNIT NUMBER
			FLU.SZ==FLU.MX/6+2	;SIZE OF THE FLU TABLE
;	FORTRAN LIBRARY ASSEMBLY PARAMETERS
	IFNDEF F10LIB,<F10LIB==-1> 	;ASSEMBLE THE LIBRARY FOR FORTRAN 10
	IFNDEF F40LIB,<F40LIB==-1> 	;ASSEMBLE THE LIBRARY FOR F40
	IFN F40LIB,<%V1==-1>		;VERSION 1 CODE REQUIRED FOR F40 COMPILER


;	LOADING PARAMETERS
			CONCEA==0	;SET HIGH SEG PUBLIC
	DEFINE SEGMEN<	SALL
			CONCEA==-1	;SET HIGH SEGMENT CONCEALED
			TWOSEGMNETS
			RELOC 400000>
	DEFINE LIBSEG<	SALL
				>

;	TELL THE USER WHAT IS BEING ASSEMBLED

IFE CPU-PDP6,<PRINTX ASSEMBLING PDP-6 VERSION>
IFE CPU-KA10,<PRINTX ASSEMBLING KA-10 VERSION>
IFE CPU-KI10,<PRINTX ASSEMBLING KI-10 VERSION>
IFN F10LIB,<PRINTX ASSEMBLING FORTRAN 10 LIBRARY>
IFN F40LIB,<PRINTX ASSEMBLING F40 !JSA! ENTRIES>
	SUBTTL FORPRM - ACCUMULATOR ASSIGNMENTS
;TEMPORARY AC's.
T0=0	;The temporary AC's must be saved by  the
T1=1	;calling  program  or  module.   A called
T2=2	;routine  will  use  the  temporary  AC's
T3=3	;startiON SYt  T1  and working toward T5.
T4=4	;In general T0 will contain an  item  for
T5=5	;input  or  output  or  the  result  of a
	;conversion routine.
;GLOBAL AC's.
G1=6	;The GLOBAL AC's must be preserved by the
G2=7	;called  routine.   Any  routine  calling
G3=10	;another routine is  assured  the  GLOBAL
G4=11	;AC's  will remain unchanged, unless data
	;is to be passed as  arguments.   Passing
	;of  arguments must be clearly defined by
	;documentation in the calling and  called
	;routines.
;PERMANENT AC
P1=12	;P1 IS USED AS AN INTERNAL JSP AC.
P2=13	;AC P2 contain a pointer to  the  encoded
	;format  statement  in the right half and
	;flags in the left half.  The  left  half
	;flags   pertain   only   to  the  format
	;statement and the conversion routines.
;PERMANENT AC
P3=14	;The right half of P3 points to a  device
	;block   defining  the  functions  for  a
	;software   channel.    The   left   half
	;contains  flag  bits  pertaining  to the
	;unit pointed to by the right half.
;PERMANENT AC
P4=15	;P4 is a permanent  AC  pointing  to  the
	;orgin of the low segment data base.  The
	;contents of the right  half  of  p4  are
	;saved in the right half of .JBOPS in the
	;JOB DATA AREA.
L=16	;The link register contains a pointer  in
	;the  right  half pointing to an argument
	;block.  AC L is set up  by  the  FORTRAN
	;compiler  and used to transfer arguments
	;to FOROTS.
;PUSH DOWN POINTER
P=17	;The  stack   pointer   is   defined   at
	;initilization   time   and  can  not  be
	;redefined or used for any purpose  other
	;than the system stack pointer.  The only
	;exception  is   the   error   processing
	;routine  which  may  redefine  the stack
	;pointer to the  extended  stack  in  the
	;case of a push down overflow.
	SUBTTL	OPERATION CODE DEFINITIONS
; MISCELLANEOUS DEFINITIONS

	OPDEF PJRST [JRST]	;PUSHJ/POPJ
	OPDEF PJSP [JRST]	;JSP
	OPDEF	PJMPL	[JUMPL]	;[354] JUMPL/POPJ
	OPDEF JUMPO [JUMPL P3,]	;JUMP ON OUTPUT
	OPDEF JUMPI [JUMPGE P3,];JUMP ON INPUT
	OPDEF JUMPDP [JUMPL P2,]  ;JUMP ON SINGLE PRECISION VARIABLE
	OPDEF JUMPSP [JUMPGE P2,]  ;JUMP ON DOUBLE PRECISION VARIABLE
	OPDEF	KADFN [DFN]		;PRESERVE KA10 DEFINITION OF DFN
	SUBTTL PROCESSOR DEFINATION (KA10/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 FORPRM DATA MODE TYPE DEFINED BY FORTRAN BITS (14-17)

TP%UDF==0	;UNDEFINE TYPE CODE
TP%LOG==1	;LOGICAL
TP%INT==2	;INTEGER
TP%REA==4	;REAL
TP%OCT==6	;OCTAL
TP%DOR==10	;DOUBLE PRECISION REAL
TP%DOT==12	;DOUBLE PRECISION OCTAL
TP%COM==14	;COMPLEX
TP%LBL==7	;LABEL FIELD
TP%LIT==17	;LITERAL
	SUBTTL UUO BIT DEFINATIONS AND FLAGS

;LEFT HALT

;DEVCHR	DEVICE CHARASTICS UUO
DV.DRI==400000	;DECTAPE DIRECTORY IN CORE
DV.DSK==200000	;DEVICE IS A DSK
DV.CDR==100000	;DEVICE IS A READ 0R PUNCH (SEE DV.IN/DV.OUT)
DV.LPT==040000	;DEVICE IS A LINE PRINTER
DV.TTA==020000	;DEVICE IS THE USERS TTY
DV.TTU==010000	;DEVICE IS ANY TTY
DV.PTY==004000	;DEVICE IS A PTY
DV.DIS==002000	;DEVICE IS A DISPLAY
DV.LNG==001000	;LONG DISPATCH TABLE
DV.PTP==000400	;DEVICE IS A PAPER TAPE PUNCH
DV.PTR==000200	;DEVICE IS A PAPER TAPE READER
DV.DTA==000100	;DEVICE IS A DECTAPE
DV.AVL==000040	;DEVICE IS AVAILABLE
DV.MTA==000020	;DEVICE IA A MAG TAPE
DV.TTY==000010	;DEVICE IS A TELETYPE
DV.DIR==000004	;DEVICE HAS A DIRECTORY
DV.IN==000002	;DEVICE CAN DO INPUT
DV.OUT==000001	;DEVICE CAN DO OUTPUT

;RIGHT HALF

DV.ASC==400000	;DEVICE IS ASSIGN BY CONSOLE
DV.ASP==200000	;DEVICE IS ASIGNED BY PROGRAM

;DEVTYP DEVICE TYPE UUO

;LEFT HALT
TY.MAN==400000	;LOOKUP/ENTER MANDATORY
TY.AVL==000040	;DEVICE IS AVAILABLE
TY.SPL==000020	;DEVICE IS BEING SPOOLED
TY.INT==000010	;DEVICE IS INTERACTIVE DEVICE (BREAK OUTPUT)
TY.VAR==000004	;VARIABLE BUFFER SIZES
TY.IN==000002	;DEVICE CAN DO INPUT
TY.OUT==000001	;DEVICE CAN DO OUTPUT
	SUBTTL FOROTS FLAG DEFINATION BY ACCUMULATOR AND FUNCTION

;FLAGS DEFINED IN THE LEFT HALT OF AC P3

IO.INO==400000	;DIRECTION OF I/O 0=INPUT 1=OUTPUT (SIGN BIT ONLY)
IO.OPN==200000	;THE DEVICE IS OPEN LOOK/ENTER DONE
IO.RNG==100000	;CHANGE RINGS FOR THIS I/O REQUEST
IO.TTY==040000	;ANY TTY TYPE DEVICE
IO.TTA==020000	;USERS TTY (USES TTCALL'S)
IO.INT==010000	;INTERACTIVE DEVICE (BREAK OUTPUT)
IO.FMT==004000	;FORMAT STATEMENT IN USE
IO.EDC==002000	;PRECESSING ENCODE/DECODE REQUEST
IO.EOL==001000	;END OF LINE IS REACHED
IO.CCC==000400	;CONVERT THE FIRST CHARACTER OF A LINE (FORMS CONTROL)
IO.EOF==000200	;END OF THE INPUT STREAM CAN NOT ADVANCE
IO.STR==000100	;INCORE STRINGS ARE IN USE
IO.NON==000010	;NON STANDARD TYPE OF I/O (IMAGE,EBCDIC,BCD,ETC)
IO.RAN==000004	;RANDOM INPUT/OUTPUT
IO.SIO==000003	;SEQUENTAIL INPUT/OUTPUT
IO.SIN==000002	;SEQUENTIAL INPUT
IO.SOU==000001	;SEQUENTIAL OUTPUT

;FLAGS DEFINE IN G4 DURING OPEN STATEMENT PROCESSING
;INCLUDING ALL FLAGS IN P3 (ABOVE)

OP.OPN==400000	;SCANNER FLAG FOR FILES VRS MEMORY
OP.DIA==200000	;DIALOG ARGUMENT SCANNIN IN PROCESS
OP.ERR==100000	;ERROR FOUND IN OPEN ARGS
;40000	IS USED AS TEMPORAY DIALOGUE FLAG BY OPNARG
OP.SAC==20000	;OPNARG SET SOME RENAME ARGUMENT TO NEW VALUE


;FLAGS DEFINE IN THE LEFT HALF OF P2 DURING FORMAT PROCESSING

FT.PRC==400000	;0= SINGLE PRECISION , 1= DOUBLE PRECISION  SIGN ONLY
FT.ETP==200000	;1 E TYPE DATA CONVERSION (FLOUT-FLIRT)
FT.GTP==100000	;1 G TYPE CONVERSION
FT.LSD==040000	;SUPPRESS THE LEADING BLANKS FOR CONVERSION
FT.FSE==020000	;SET FORSE RECORD FOUND
FT.DOL==010000	;SUPPRESS THE <CR>,<LF> ON TTY OUTPUT
FT.LST==004000	;INPUT/OUTPUT LIST SEEN
FT.SLT==002000	;SLIST IN PROCESS
FT.EXT==001000	;EXTENDED LIST IN PROGRESS
FT.FIN==000400	;FIN CALLED
FT.NML==000200	;NAMELIST I/O
FT.LRP==000100	;LAST RIGHT PAREN SEEN

;BITS 30-35 ARE PROCESS DEPENDENT FLAGS AND ARE SHARED

;LIST DIRECTED I/O DEPENDENT FLAGS
FT.NUL==000040	;NULL ITEM SEEN
FT.QOT==000020	;QUOTED STRING SEEN IE '.............'
FT.SLH==000004	;[366] SLASH SEEN

;I/O LIST CALL PROCESSSING SWITCHES
FT.ELT=000010	;ELIST IN PROGRESS

;FORMAT STATEMENT ENCODING FLAGS
FT.TXX==000002	;SET T FORMAT SEEN (FORMAT ENCODING ONLY)
FT.SCL==000001	;NEGATIVE SCALE FACTOR FLAG (FORMAT ENCODING ONLY)

	SUBTTL FORPRM STATIC LOW SEGMENT DATA BASE DEFNS.

; THE STATIC LOW SEGMENT OF FOROTS IS ASSIGNED RELATIVE TO
; THE VALUE OF .JBFF AT INITILIZATION TIME.
; 
; THESE VALUES ARE RELATIVE TO .JBFF ONLY AND MUST BE INDEXED
; BY AC P4.
	DEFINE STATIC(NAME,SIZE)<	NAME==ZZ.
					ZZ.==ZZ.+SIZE>

;SYMBOL    DESCRITPION
ZZ.==0		;START THE STATIC TABLES AT RELATIVE ZERO

STATIC(ACC.SV,20)	;A sixteen word block to save the user's AC's.
			;All AC's are saved for debugging aids.
STATIC(IOL.SV,0)	;A 5 WORD BLOCK TO SAVE  AC'S (G3,G4,P1,P2,P3)
			;THIS BLOCK IS USED BY THE I/O LIST TO SAVE
			;A STATE TABLE OVER CALLS TO THE USER'S I/O LIST
STATIC(IOL.G3,1)	;SAVE AC G3
STATIC(IOL.G4,1)	;SAVE AC G4
STATIC(IOL.P1,1)	;SAVE AC P1
STATIC(IOL.P2,1)	;SAVE AC P2
STATIC(IOL.P3,1)	;SAVE AC P3
STATIC(USR.PC,1)	;The user's pc and flags save here
STATIC(ERR.PC,1)	;Optional error return address (ERR=)
			;Optional end of file return address(END=)
STATIC(MON.SV,1)	;The type of monitor currently running under.
STATIC(JOB.SV,1)	;GLOGAL JOB INFORMATION
STATIC(RUN.TM,1)	;ACCUMULATED RUNTIME SO FAR
STATIC(DAY.TM,1)	;TIME OF DAY THE PROGRAM IS STARTED
			;THESE TWO TABLE ARE PAIRED TOGETHER
STATIC(DEC.TB,3)	;DECODE buffer header
STATIC(ENC.TB,3)	;ENCODE buffer header
STATIC(CHN.TB,40)	;The software channel table.
			;CHANNELS 20-37 ARE PSEDUO CHANNELS TTY=20
STATIC(FRE.DY,1)	;A pointer to the free dynamic core heap.
STATIC(FMT.DY,1)	;A pointer to  the  encoded  FORMAT  STATEMENT
			;LIST
STATIC(FST.DY,1)	;A pointer to  the  current  FORMAT  STATEMENT
			;list.
STATIC(DAT.TP,3)	;Address  of   the   corrent   varriable   for
			;conversion.
STATIC(ERRMX.,1)	;ERROR COUNTER
STATIC(OVCNT.,1)	;ARITHMETIC FAULT COUNTER
STATIC(ILLEG.,1)	;ILLEGAL CHARACTER FLAG
STATIC(SCL.SV,1)	;Current scale factor (....nP.....)
STATIC(RER.SV,1)	;REREAD information.
STATIC(POS.TB,3)	;POSITION TABLE
			;POSTB+0=	CURRENT HORIZ POSITION
			;		+ FIXED LENGTH REORD
			;		- VARIABLE LENGTH RECORD
STATIC(FBG.BP,1)	;A byte pointer to the beginning of the format
			;statement.
STATIC(FEN.BP,1)	;A byte pointer  to  the  end  of  the  format
			;statement.
STATIC(LPN.BP,1)	;A point to the last level 0 or 1 left paren.
STATIC(FLU.BP,1)	;A BYTE POINTER TO THE FORTRAN LOGICAL UNIT TABLE WITH
			;THE CURRENT SOFTWARE CHANNEL NUMBER.
STATIC(ALT.PC,1)	;[225] The alternate return on END= or ERR=
STATIC(LST.TP,1)	;[247] Extended I/O list pointer
STATIC(CH.SAV,1)	;[354] Saved delimiter during FREE FORMAT input.
STATIC(REGS.0,1)	;[311] TO SAVE INITIAL RUN FILE SPEC (FORFUN)
STATIC(REGS.1,1)	;[311]
STATIC(REGS.2,1)	;[311]
STATIC(STK.SV,STK.SZ)	;The FOROTS system push down stack.
IFN FTWMU,<
;	S.M. #485.5	RRB/ 12-16-75
STATIC(DEV.TB,1)	;ADDRESS OF DEVTAB
STATIC(DEV.SZ,1)	;POSITIVE SIZE OF DEVTAB
>
STATIC(FLU.TB,FLU.SZ)	;The FORTRAN logical unit number table.
STATIC(PAG.TB,20)	;WORDS FOR FORFUN TO DO PAGE. UUOS
LOW.SZ==ZZ.		;SIZE OF THE STATIC LOW SEGMENT
	SUBTTL  FORPRM DD.BLK DEVICE BLOCK ALLOCATION

; THE DEVICE BLOCKS ARE ALLOCATED FROM FREE CORE AND POINTED TO
; BY TdressGHT HALF OF CHN.TB. THERE IS ONE DEVICE BLOCK FOR EVERY
; SOFTWARE CHANNEL THAT IS OPEN. ALL SYMBOLS DEFINED BELOW ARE
; RELATIVE TO THE BEGINNING OF THE DEVICE BLOCK.

	DEFINE DEVALC(NAME,SIZE)<	DD.'NAME==ZZ.
					ZZ.==ZZ.+SIZE>

;SYMBOL		DESCRIPTION
ZZ.==0			;START THE DEVICE BLOCK ORGIN AT RELATIVE ZERO
DEVALC(BLK,1)		;LEFT HALF
			; BIT  3    MAG TAPE PARITY
			; =1 FOR EVEN
			; =0 FOR ODD PARITY
			; BITS 4-5   DENSITY
			; =00	DEFAULT STANDARD
			; =01   200 BPI
			; =10   556 BPI
			; =11   800 BPI
			; BITS 6-9  INDEX TO THE ACCESS TABLE
			; BITS 10-13 INDEX TO THE MODE TABLE
			; BITS 14-17 INDEX TO THE DISPOSE TABLE
			;RIGHT HALF - COUNT OF INPUT/OUTPUT UUO'S
DEVALC(STS,1)		;DEVCHAR UUO BITS
DEVALC(OPN,1)		;FILE STATS, ETC (FIRST WORD OF THE OPEN UUO)
DEVALC(DEV,1)		;DEVICE NAME IN SIXBIT
DEVALC(RNG,1)		;LEFT - POINTER TO OUTPUT RING HEADER
			;RIGHT - POINTER TO INPUT RING HEADER
DEVALC(HRI,3)		;THE INPUT BUFFER RING HEADER
DEVALC(HRO,3)		;THE OUTPUT BUFFER RING HEADER
DEVALC(UNT,1)		;BITS (9-12) CONTAIN THE CHANNEL NUMBER
			;RIGHT HALT THE FORTRAN LOGICAL UNIT NUMBER (FLU)
DEVALC(ERV,1)		;POINTER TO THE ERROR VARIABLE IN USER CORE
DEVALC(LOG,1)		;FIXED LOGICAL RECORD SIZE IN WORDS
DEVALC(BUF,1)		;LEFT  - THE NUMBER OF BUFFERS ALLOCATED
			;RIGHT - THE SIZE OF EACH BUFFER
			;         INCLUDING THE THREE WORD HEAHER
DEVALC(CNV,1)		;ADDRESS OF A DYNAMIC CONVERSION TABLE
DEVALC(LIM,1)		;LEFT  - THE CURRENT LOGICAL RECORD
			;RIGHT - THE FILE SIZE LIMIT IN LOGICAL RECORDS
DEVALC(RLS,1)		;LEFT  - THE CURRENT REEL COUNT
			;RIGHT - THE ADDRESS OF AN ARRAY OF
			;        REEL IDENTIFICATIONS
DEVALC(CNT,1)		;EXTENDED LOOKUP/ENTER ARGUMENT COUNT
DEVALC(PPN,1)		;PROJECT #,PROGRAMMER # - OR A POINTER TO AN
			;SFD LIST
DEVALC(NAM,1)		;FILE NAME IN SIXBIT
DEVALC(EXT,1)		;FILE EXTENSION IN SIXBIT
DEVALC(PRV,1)		;FILE PRIVLEGES
DEVALC(SIZ,1)		;FILE SIZE
DEVALC(VER,1)		;OCTAL VERSION NUMBER
DEVALC(SPL,1)		;SPOOLING FILE NAME
DEVALC(EST,1)		;ESTIMENTED FIFE SIZE FOR ALLOCATION
DEVALC(ALC,1)		;FILE SIZE TO BE PRE-ALLOCATED
IFN QUEUER,<		;[240] IF QUEUEING IS ALLOWED
DEVALC(POS,1)		;[240] FIRST LOGICAL BLOCK TO ALLOCATE
DEVALC(FT1,1)		;[240] FUTURE NONPRIVILEGED ARGUMENT
DEVALC(NCA,1)		;[240] GNONPRIVILEGED CUSTOMER ARGUMENT
DEVALC(MTA,1)		;[240] TAPE LABEL
DEVALC(STR,1)		;[240] STRUCTURE NAME FOR FILE
>			;END OF QUEUER CONDITIONAL
DEVALC(ASC,1)		;ADDRESS OF THE ASSOCIATE VARIABLE FOR RANDOM
			;ACCESS MODE
DDB.SZ==ZZ.		;SIZE OF THE DEVICE BLOCK
	SUBTTL ENTRY POINTS TO FOROTS
; THE FOLLOWING MACRO DEFINITIOS ARE TAKEN FROM THE ALGOL OPERATING
; SYSTEM (ALGOT) WRITTEN BY RICHARD DE MORGEN.
; FOROTS USES THESE DEFINITIONS TO INSURE FUTURE COMPATIBILITY

	DEFINE R(A,B)
	<DEFINE B
	<FOROT%+A>>

	DEFINE JRSTI (C,A)
	<JRST C,A>

	DEFINE JRST (C,A)
	<IFNDEF Q,<Q=0>
	R \Q,A
	Q=Q+1>

	DEFINE FORDIR<
	JRST	1,INIT%		; FOROTS INITIALIZION ROUTINE (ASS DYNAMIC CORE)
	JRSTI	1,FORER%	;DEFINE THE ERROR PROCESSOR ENTRY POINT
	JRST	1,OPEN%		; DEVICE OPEN ROUTINE
	JRST	1,CLOSE%	; DEVICE CLOSE ROUTINE
	JRST	1,RELEA%	; DEVICE RELEASE ROUTINE
	JRST	1,IN%		; FORMATED INPUT ROUTINE
	JRST	1,OUT%		; FORMATED OUTPUT ROUTINE
	JRST	1,RTB%		; UN-FORMATED BINARY INPUT (CONTROL WORDS)
	JRST	1,WTB%		; UN-FORMATED BINARY OUTPUT (CONTROL WORDS)
	JRST	1,ENC%		; ENCODE ROUTINE
	JRST	1,DEC%		; DECODE ROUTINE
	JRST	1,NLI%		; NAMES LIST INPUT ROUTINE
	JRST	1,NLO%		; NAME LIST OUTPUT ROUTINE
	JRST	1,IOLST%	; INPUT/OUTPUT LIST PROCESSING ROUTINE
	JRST	1,FIN%		; INPUT/OUTPUT LIST TERMINATION ROUTINE
	JRST	1,MTOP%		; UTILITY FILE SPACING FUNCTIONS
	JRST	1,FIND%		; FIND THE NEXT RECORD FOR RANDOM ACCESS
	JRST	1,EXIT%		; TERMINATE THE PROGRAM EXECUTION
	JRST	1,ALCOR%	; DYNAMIC CORE ALLOCATION ROUTINE
	JRST	1,DECOR%	; DEALLOCATE DYNAMIC CORE
	JRST	1,ALCHN%	; ROUTINE TO GET A SOFTWARE CHANNEL
	JRST	1,DECHN%	; ROUTINE TO PUT A SOFTWARE CHANNEL
	JRST	1,TRACE%	; ROUTINE TO TRACE SUBROUTINE CALLS
	JRST	1,FUNCT%	;[232] OVERLAY INTERFACE
>
	FORDIR
	PURGE JRST,JRSTI
	SUPPRESS Q
	OPDEF JRSTI [JRST @]	;MAKE THE DIRECT MACRO WORK
	SUBTTL FORERR MACROS FOR DEFINING ENTRIES TO THE ERROR ROUTINE

	DEFINE RR(A,B)
	<DEFINE B
	<A>>

	DEFINE XWD(B,A)
	<IFNDEF QQ,<QQ==0>
	RR \QQ,A
	QQ==QQ+1>

	DEFINE ERRARG(CLASS)<
	A.==(SIXBIT/CLASS/)
	XWD	A.,ER%'CLASS	;DEFINE THE CLASS ERROR ENTRY
	>

	DEFINE ERRDIR<
	ERRARG	(SYS)		;0;FOROTS SYSTEM ERROR
		;TYPE CODE FOR SYS ERROR CALLS
		;0  FOROTS DETECTED SYSTEM ERROR
		;1  CALL TO EXIT THE PROGRAM (PRINT TIME ETC.)
		;2  ARGUMENT BLOCK IS NOT IN THE CORRECT FORMAT
		;3  MONITOR IS NOT BUILT TO SUPPORT THE FOROTS SYSTEM
		;4  FATAL ERROR RETURN TO MONITOR VIA EXIT
		;5  NO CORE AVAILABLE FOR LOW SEG EXPANSION
	ERRARG	(UUO)		;1;UUO ERRORS UUO DOES NOT EXIST
	ERRARG	(APR)		;2;PROCESSOR TRAPS OVER/UNDER  FLOW
		;TYPE CODES FOR APR ERROR CALLS
		;0  INTEGER OVERFLOW
		;1  INTEGER DIVIDE CHECK
		;2  ILLEGAL TRAP
		;3  ILLEGAL TRAP
		;4  FLOATING OVERFLOW
		;5  FLOATING DIVIDE CHACK
		;6  FLOATING  UNDERFLOW
		;7  ILLEGAL TRAP
	ERRARG	(OPN)		;3;OPEN ROUTINE ERROR
		;TYPE CODES FOR THE OPEN ERROR CALL
		;0  LOOKUP/ENTER ERROR MESSAGE DEFINE IN DD.EXT
		;1  ILLEGAL DATA MODE FOR DEVICE
		;2  ILLEGAL ACCESS FOR DEVICE
		;3  ACCESS ARGUMENT MISSING
		;4  NOT USED
		;5  DEVICE NOT AVAILABLE
		;6  NO SUCH DEVICE
		;7  NOT USED
		;10 TOO MANY DEVICES OPEN MAX=15.
		;11 SWITCH ERROR DURING DIALOG MODE
		;12 LOGICAL RECORD SIZE MISSING (RANDOM ACCESS)
		;13  FORTRN LOGICAL UNIT 0 ILLEGAL
	ERRARG	(DEV)		;4;DEVICE ERROR
	ERRARG	(DAT)		;5;DATA ERROR FORMATED/BINARY
		;TYPE CODES FOR DATA ERROR CALLS
		;0  UNDEFINED ERROR ENTRY
		;1  ILLEGAL CHARACTER IN FORMAT STATEMENT
		;2  ILLEGAL BINARY RECORD OR READING ASCII IN BINARY
		;3  CHECK SUM ERROR WHILE READING BINARY RECORDS
		;4  INPUT/OUTPUT LIST GREATER THAN RECORD SIZE
		;5  FIELD OVER FLOW ASTERICK FILL
		;6  INPUT/OUTPUT LIST WITH OUT DATA CONVERSION
		;7  ILLEGAL CAHARACTER IN DATA
		;10 WRITE OPERATION FOLLOWED BY A READ OR SPACING
	ERRARG	(QUE)		;6;QUEUEING ERROR
	ERRARG	(MSG)		;7;TYPE THE MESSAGE POINTED TO
				;   BY THE RETURN ADDRESS
	ERRARG	(LIB)		;10;LIBRARY CALL
	ERRARG	(SRE)		;11;[250] Array bounds checking
	ERRARG	(UNF)		;12;UNDEFINED
	ERRARG	(UNF)		;13;UNDEFINED
	ERRARG	(UNF)		;14;UNDEFINED
	ERRARG	(US0)		;15;RESERVED FOR THE USERS
	ERRARG	(US1)		;16;RESERVED FOR THE USERS
	ERRARG	(US2)		;17;RESERVED FOR THE USERS
	>
	ERRDIR
	SUPPRESS ZZ.,QQ
	PURGE XWD
	OPDEF ARG [JUMP]	;

	DEFINE ERROR(CLASS,TYPE,SEVER,RETURN)<
	IFNDEF ER%'CLASS,<PRINTX ER%'CLASS IS AN UNDEFINED ENTRY IN FORERR>
	IFL 57-TYPE,<PRINTX THE ERROR TYPE. TYPE FOR ER%'CLASS TOO BIG>
	IFG SEVER-17,<PRINTX THE SEVERITY CODE FOR ER%'CLASS TOO BIG>
IFE CONCEA,<
	XCT	ER%'CLASS,FORER.##	;PROCESS CLASS ERROR
>
IFN CONCEA,<
	XCT	ER%'CLASS,FORER%##	;PROCESS CLASS ERROR
>
	IFLE	TYPE-57,<CODE==JUMP>	;[435] JUMP NO-OP FOR MSGS 40-57
	IFLE	TYPE-37,<CODE==CAM>	;[435] CAM NO-OP FOR MSGS 20-37
	IFLE	TYPE-17,<CODE==CAI>	;[435] CAI NO-OP FOR MSGS 0-17

	CODE	TYPE,RETURN(SEVER)	;[435]
	PURGE	CODE			;[435]
	>

	DEFINE TYPSTR(A)<
	IF2,<IFNDEF TY%STR,<EXTERNAL TY%STR>>
	PUSHJ P,TY%STR
	CAI	A>
	DEFINE SHIFT(ZZ.,CC.)<
	IFN ZZ.&77B5,<ZZ.==ZZ._1
			IFE << ZZ.&760000000000>-740000000000>,<
					ZZ.==ZZ.&017777777777>
			EXP ZZ.!1B35
			ZZ.==0
			IFE CC.,<CC.==36>>
	ZZ.==ZZ._5+CC.>
	DEFINE FIVBIT (C.)<
	ZZ.==0
	CASE.==0
	IRPC C.<
	CC.==0
	IFGE "C."-"A",<IFLE "C."-"Z",<IFN CASE.,<CASE.==0
						SHIFT (ZZ.,37)>
				CC.=="C."&37>>
	IFGE "C."-"A"-40,<IFLE "C."-"Z"-40,<IFE CASE.,<CASE.==1
						SHIFT (ZZ.,37)>
				CC.="C."&37>>
	IFE CC.,<IFN "C."-" ",<PRINTX C. IS ILLEGAL IN FIVE BIT CODE>>
	SHIFT (ZZ.,CC.)>
	IFN ZZ.,<DEFINE FILL<IFE ZZ.&77B5,<ZZ.==ZZ._5
					FILL>
				>
		FILL>
	ZZ.==ZZ._1
	IFE << ZZ.&760000000000>-740000000000>,<
			ZZ.==ZZ.&017777777777>
	EXP	ZZ.
	>



	SUBTTL FORLIB MACROS (USED BY THE LIBRARY ROUTINES)

	DEFINE	FUNCT(A,B)<
	SALL
	C.....=0
	IRP B,<C.....=C.....+1>
	IF2,<IFNDEF A,<EXTERNAL A>>
	IFNB <B>,<
	PUSH	P,L
	MOVEI	L,[XWD -C.....,0
		IRP B,<B>]+1>
	PUSHJ	P,A
	IFNB <B>,<
	POP	P,L>>

	DEFINE HELLO (A,B)<
	SALL
	IFNB <B>,<IFIDN <B>,<.>,<SIXBIT /A/
				 ENTRY A'.
				 A'.:>
		  IFDIF <B>,<.>,<SIXBIT /B/
				 ENTRY A
				 A:>
		 >
	IFB  <B>,<SIXBIT /A/
		  ENTRY	A
		  A:>
IFN F40LIB,<
	CAIA
	PUSH	P,CEXIT.##
>
>	;END OF HELLO MACRO

	DEFINE GOODBY (N)<
	POPJ	P,N>
	END