Trailing-Edge
-
PDP-10 Archives
-
BB-D480F-SB_FORTRAN10_V10
-
forini.mac
There are 13 other files named forini.mac in the archive. Click here to see a list.
SEARCH MTHPRM,FORPRM
TV FORINI INITIALIZE FOROTS LOWSEG, 10(4204)
SUBTTL /DAW/JLC/AHM/BL/PLB/CDM 16-Feb-84
; Previous authors (before V6)
; D. TODD/DRT/HPW/DMN/MD/JNG/SWG/CAL
;COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1981, 1985
;ALL RIGHTS RESERVED.
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
COMMENT \
***** Begin Revision History *****
***** Begin Version 6 *****
1262 DAW 9-Feb-81
Allow FORINI to run in a non-zero section. (Assumes
that all code is in the same section).
1530 JLC 10-Jul-81
FOROTS becomes FOROT6.
1623 DAW 21-Aug-81
Entry point RESET$ to test extended addressing in FOROTS.
2005 JLC 15-Oct-81
Added REENTER code. Make DDT-20 understand symbol tables
at other than 400000.
2007 JLC 16-Oct-81
Fixed temp stack to be larger for reenter code.
2033 DAW 19-Nov-81
Fixed problems in REENTER code.
***** Begin Version 7 *****
3035 JLC 29-Jan-81
FOROT6 becomes FOROT7.
3056 JLC 23-Mar-82
Rework lowseg/hiseg dispatch, save ACs in lowseg.
3101 JLC 5-Apr-81
Modified lowseg/hiseg interface - address of user's ACs
are now passed in F instead of T1.
3102 JLC 7-Apr-82
Fix OTS/NONSHAR, INIT call was going to 0. Slightly modify
passing of return address of RESET. - PDL is now in
the lowseg.
3103 JLC 8-Apr-82
More minor changes to lowseg/hiseg interface. Stack setup
is now done totally in FORINI.
3122 JLC 28-May-82
Change lowseg/hiseg interface again. Now uses 2-word entries.
3123 JLC 29-May-82
Modified interface again to make it faster.
3125 JLC 3-Jun-82
Moved AC save routine to hiseg again.
3137 AHM 30-Jun-82
Development patches for running entirely in a non-zero section
for V8. If .JBSA in RESET.'s section contains 0, synthesize
reasonable numbers to put in JOBDAT for the current section.
Do XGVEC% and XSVEC% to save and restore the program's entry
vector. Set up a global stack pointer when running in a
non-zero section. Don't pass the address of AU.ACS to INIT.
in F, since it isn't used any more.
3156 AHM 21-Jul-82
Don't do XGVEC% and XSVEC% unless we are running in a non-zero
section so that we can run UNDER Tops-20 release 4.1 on a KS.
Also, do private OPDEFs of PDVOP%, XGVEC% and XSVEC% so that
FORINI will assemble with release 4.1 MONSYM.
3163 AHM 24-Aug-82
Make FAKJBD a little more paranoid about blamming the location
that 770001 references with a symbol table pointer by checking
770000 for JRST 770002 ala EXEC and OVRLAY. Use section
defaulting in RPACS% calls. Don't zero left half of .JBREN.
3177 BL 14-Sep-82
Store DBMS entry vector at .JBBLT.
3202 JLC 26-Oct-82
Install non-skip (error) return from CLOSF.
3205 AHM 28-Oct-82
Add code under IF20 conditional to define %SRTAD (SORT's start
address) here, zero it upon restart, and toss the section that
SORT is in, if it owns its own section.
3220 AHM 18-Nov-82
Replace non-zero section tests that depended upon the sign of
the stack pointer with a check that uses XMOVEI so that we
know which section we are currently executing in.
3231 JLC 14-Dec-82
RESET. becomes FOROK. for new DBMS interface.
3235 AHM 16-Dec-82
Fix ACs for entry vector JSYS call around code to GET% FOROTS.
3236 JLC 17-Dec-82
Move setup of FUNCT. in .JBBLT to FORMEM.
3244 JLC 30-Dec-82
Moved setup of FUNCT. back into FORINI, as PORTAL is
almost inaccessible from hiseg. Changed the name of
DBSTP$ to a FOROTS entry, resolved by a file later
in FORLIB if DBMS program, resolved to dummy one if
no DBMS program.
3245 JLC 4-Jan-82
Look at %DBSTP to determine whether to GETSEG FOROT7.EXE
or FDBOT7.EXE.
3246 JLC 5-Jan-83
Put PORTAL back here.
3252 JLC 12-Jan-83
Move KSORT to FORSRT.MAC.
3253 JLC 13-Jan-83
Change %FRSNONSHARE to %FRSNS. Change %FRSLOAD to %FRSLO.
Fix CLSFIL to set up 'STOP!!' on stack to stop traceback loop.
3254 CKS 13-Jan-83
Do not set up .JBHSO so that FOROTS symbols will not be seen by DDT
unless user explicitly requests them by setting up .JBHSO.
3260 JLC 17-Jan-83
Make KSORT an EXTERN on the -10 so it will be drawn in to
get %SRTAD.
***** End V7 Development *****
3354 TGS 3-Oct-83 SPR:NONE
Move setup of DBMS entry vector from FORINI to FOROTS. Store
FUNCT address in .JBBLT+2 as well as .JBBLT.
BEGIN V10
4000 JLC 22-Feb-83
Make RESET$ entry restartable.
4002 JLC 23-Feb-83
Code review changes.
4006 JLC 28-Feb-83
FOROT7 becomes FORO10.
4022 PLB 28-Jun-83
Ream FORINI so it will get FOROTS into another section,
this includes section searching.
4023 JLC 29-Jun-83
Move CHRPT. from here to FORCHR. Insert global symbols
F.BOT and F.TOP, both set to zero, to resolve them
and keep them out of the way for FORMEM.
4025 JLC 1-Jul-83
Add arg block for user subroutine calls on library traps.
4031 JLC 7-Jul-83
Fix JBHRL so it looks like LINK built it.
4037 JLC 31-Aug-83
Modify GET code to allow for FORO10.EXE having a page 0,
which will now be ignored.
4042 JLC 8-Sep-83
Fix GTFRSX so that it will avoid page 0 of FOROTS for
non-zero sections.
4065 JLC 6-Dec-83
Just some cleanup.
4066 JLC 11-Jan-84
Just a little bit more cleanup.
4072 JLC 24-Jan-84
New lowseg/hiseg value-passing interface.
4101 CDM 16-Feb-84
Create and expand the character stack differently when running
in extended addressing. Give the stack its own section(s) so
that it has plenty of room. Also add user subroutine ALCCHR.
4104 JLC 23-Feb-84
Add a new internal which is (FLGVX. V FLG77.) for use
in subroutine entries.
4111 JLC 16-Mar-84
Moved code around to eliminate the "percented" entry points
in FOROTS, and avoid loading the GETSEG code if there is nothing
to GETSEG.
4112 JLC 19-Mar-84
Removed code for FDBOTS, no longer needed.
4116 JLC 6-Apr-84
Fix DOCLS, stack setup was not updated for extended addressing.
4117 JLC 26-Apr-84
Fix DOCLS for TOPS-20 entry vector.
4122 JLC 2-May-84
Fix .JBSYM so it has IOWD format symbol pointer for FORDDT
and FORERR.
4123 JLC 5-May-84
Install REENT., the reenter address for /EXTEND. By default
a REENTER command will go to code which merely does an EXIT
(TOPS-10) or a CLOSF and HALTF (TOPS-20).
4127 JLC 15-May-84
Fixed some TOPS-10 code.
4131 JLC 12-Jun-84
Fix %EXTND, broken in some previous rework.
4134 JLC 3-Jul-84
Fix REENTER, was broken by half-word fixup. Make it
Polish, so it will get a full-word fixup.
4144 JLC 29-Aug-84
Remove code to put FOROTS in its own section, since this
would make it impossible to use V7 and non-extend rel files
with extended code.
4147 MRB 11-Sep-84
Change the symbol named FLGVX. to FLGV.
4152 JLC 24-Sep-84
Remove FAKJBD, replaced with much enhanced code in FORMEM.
Add new RESET entry point for use by FORDDT which sets
a flag to prevent the RESET. call from the FORTRAN
program from doing another one.
4153 JLC 27-Sep-84
Fix start address recording problem introduced by edit 4152,
by adding an entry in the initialization arg block containg
the start address.
4155 JLC 4-Oct-84
Modify REENTER behavior to what it should have been - HALTF%
or EXIT 1, and do not close any files.
4203 JLC 13-Mar-85
Fix REENTER on TOPS-10.
4204 MRB 15-Mar-85
Moved DUMVAX and DUMF77 to here from FORINI. Aleviates the
undefinied globals when searching FORLIB for math routines
in a non-FORTRAN program.
***** End V10 Development *****
***** End Revision History *****
\
SEGMENT CODE
ENTRY FOROT.,FOROT$,FINIT.
EXTERN %DBSTP,%EXTND,FLG77.,FLGV.
EXTERN KCHST.,KDBMS.,KSORT.
EXTERN %LARGL
EXTERN %GOGET
INTERN F.TOP,F.BOT,F.BHS,FLGON.,%ENTVC,%GTSEC,%EXICL
DEFINE X(E) <EXTERN E'.>
FORVEC
F.BHS==0 ;BOTTOM OF FOROTS HIGH SEGMENT IS ZERO
F.TOP==0 ;TOP AND BOTTOM OF FOROTS ARE
F.BOT==0 ;ZERO FOR /OTS:NONSHARE
FLGON.==FLGV.!FLG77. ;[4147] NON-ZERO IF EITHER VAX OR ANSI FLAGGING
;RESET. WILL GETSEG FOROTS IF IT WAS NOT LOADED WITH THE PROGRAM.
;IF FOROT% HAS NOT BEEN DEFINED, IT IS RESOLVED IN
;FORNON, AND FOROTS WILL BE LOADED WITH THE USER PROGRAM.
;IF FOROT% HAS BEEN DEFINED, EITHER BY
;LINK OR IN THE LINK COMMAND STRING, THE GETSEG ROUTINE IS LOADED.
;
;CALL:
; JSP 16,RESET.
; 0 ;ARG, IGNORED
;
;RETURNS WITH FOROTS PRESENT AND INITIALIZED. SETS UP P.
;CAN DESTROY ALL ACS
FINIT.: SETOM FDDTFL ;SET THE "INIT FROM FORDDT" FLAG
JRST INCOM ;JOIN COMMON INIT CODE
FOROT.:!
PORTAL .+1 ;ALLOW ENTRY FROM PUBLIC
SKIPN FDDTFL ;DID WE JUST INIT FROM FORDDT?
JRST INCOM ;NO. JUST A PLAIN OLD INIT CALL
SETZM FDDTFL ;YES. MAKE SURE WE DON'T LEAVE IT THAT WAY
XMOVEI T1,@L ;[4153] GET RETURN ADDRESS
SUBI T1,2 ;[4153] POINT TO START ADDRESS OF PROGRAM
MOVEM T1,STADR ;[4153] SAVE IT FOR FORERR
JRST 1(L) ;AND RETURN TO USER IMMEDIATELY
;SINCE WE DON'T WANT TO RESET FORDDT'S INIT
INCOM: SKIPN [%EXTND] ;DO WE WANT TO RUN IN SECTION 1?
JRST NOMAP ;NO. DON'T
FOROT$:!
PORTAL .+1 ;ALLOW ENTRY FROM PUBLIC
SKIPE MAPPED ;[4022] ALREADY MAPPED?
JRST DOEXTJ ;YES. DON'T TRY AGAIN
XMOVEI T1,. ;GET CURRENT SECTION IN LH
TLNE T1,-1 ;ALREADY IN NON-ZERO SECTION?
JRST NOMAP ;YES. DON'T MAP SECTIONS TOGETHER
MOVE P,[IOWD LPDL,INIPDL] ;[4022] SET UP LOCAL STACK (TEMP)
PUSHJ P,%GTSEC ;[4022] FIND A FREE SECTION
JRST MAPERR ;[4022] NO YOU DON'T
MOVEM T1,SECNUM ;SAVE THE SECTION NUMBER
PUSHJ P,MAPSEC ;MAP SECTION ZERO TO SOME NON-ZERO SECTION
SETOM MAPPED ;FLAG WE ARE MAPPED
DOEXTJ: SETZ T1, ;[4022] FLAGS
HRLZ T2,SECNUM ;[4131] GET SECTION NUMBER
HRRI T2,EXTJ ;[4022] ,, PC
XJRSTF T1 ;[4022] JUMP!
EXTJ: HRL L,SECNUM ;[4022] AND PUT A SECTION NUMBER IN RETURN ADDR
NOMAP: XMOVEI P,INIPDL-1 ;[3137] Set up a global stack
TLNN P,-1 ;[3137] Is there a section number ?
HRLI P,-LPDL ;NO. USE A LOCAL STACK
PUSH P,['STOP!!'] ;FLAG BOTTOM OF STACK FOR TRACEBACK
PUSH P,L ;PUSH RETURN ADDR FROM JSP
XMOVEI T1,@L ;[4153] GET RETURN ADDRESS
SUBI T1,2 ;[4153] POINT TO START ADDRESS OF PROGRAM
MOVEM T1,STADR ;[4153] SAVE IT FOR FORERR
PUSHJ P,KCHST. ;[4101] Kill the character stack.
PUSHJ P,KDBMS. ;KILL PREVIOUS TRACES OF DBMS
PUSHJ P,KSORT. ;[3205] Get rid of SORT, if it is present
PUSHJ P,SETEV ;GET ENTRY VECTOR, SETUP REENTER IN IT
PUSHJ P,%GOGET ;GO GET FOROTS
XMOVEI L,INIARG ;PASS ARG LIST OF PARAMETERS
PJRST INIT. ;GO TO FOROTS INITIALIZATION
-ININUM,,0 ;[4153] ARG COUNT (ALA FORTRAN CALL)
INIARG: IFIW %DBSTP ;PASS ADDRESS OF DBSTP$ OR POPJ P,
IFIW %LARGL ;PASS ADDRESS OF LIBRARY ERROR ARG LIST
IFIW [FLGV.] ;[4147] ADDRESS OF VAX COMPATIBILITY FLAG
IFIW [FLG77.] ;ADDRESS OF ANSI-77 FLAG
IFIW STADR ;[4153] START ADDRESS OF USER'S PROGRAM
ININUM=.-INIARG
CLSMSG: ASCIZ /Do you want to close all files? (Y or N):/
MAPMSG: ASCIZ /Can't map up section 0
/
SEGMENT DATA
STADR: BLOCK 1 ;[4153] START ADDRESS OF USER'S PROGRAM
FDDTFL: BLOCK 1 ;FLAG FOR "FORDDT DID THE INIT CALL"
SECNUM: BLOCK 1 ;SECTION # TO WHICH WE ARE MAPPED
MAPPED: BLOCK 1 ;IF .NE. 0, WE ARE MAPPED TO ANOTHER SECTION
INIPDL: BLOCK LPDL ;FOR NOW THE PERM PDL
USEREN: BLOCK 1 ;USER REENTER ADDR
YESWRD: BLOCK 1 ;WORD FOR USER RESPONSE
%ENTVC: BLOCK 2 ;SAVED ENTRY VECTOR
SEGMENT CODE
;JOBDAT CODE FOR REENTER ADDRESS FIXUP
USJOBD: SKIPN T1,.JBREN ;DOES USER HAVE .JBREN ADDR?
MOVEI T1,%EXICL ;NO. USE AN EXIT CALL
HRRZ T2,T1 ;Did we already do this?
CAIN T2,CLSFIL
POPJ P, ;YES. DON'T DO IT AGAIN
HRLI T1,(JRST) ;MAKE IT A LOCAL INSTRUCTION
MOVEM T1,USEREN ;TO EXECUTE AFTER %EXIT1
MOVEI T1,CLSFIL ;[3137] Used to close all files
HRRM T1,.JBREN ;[3137] When user types "REENTER"
POPJ P,
IF10,<
SETEV: JRST USJOBD ;USE JOBDAT CODE FOR ENTRY VECTOR SETUP
%GTSEC: MOVEI T1,1 ;FOR NOW, JUST RETURN SECTION 1
AOS (P) ;SKIP RETURN
POPJ P,
MAPSEC: MOVE T1,SECNUM ;GET SECTION NUMBER
TXO T1,PG.GMS ;MAP IT TO SECTION 0
MOVEM T1,MAPBLK+1 ;SAVE FOR PAGE.
MOVEI T1,1 ;1 ARGUMENT
MOVEM T1,MAPBLK
MOVE T1,[.PAGSC,,MAPBLK]
PAGE. T1, ;MAP THEM
JRST MAPERR ;CAN'T
POPJ P,
CLSFIL: OUTSTR CLSMSG ;GIVE USER A MSG
INCHWL T1 ;GET THE FIRST CHAR
CLRBFI ;CLEAR TYPE-AHEADS
;[4203]
CAIE T1,"Y" ;CHECK FOR UPPER AND LOWER CASE Y
CAIN T1,"y"
JRST DOCLS ;YES, IT'S YES
XCT USEREN ;[4155] EXECUTE REENTER INST
EXIT 1, ;[4155] DO A MONRET
JRST .-1 ;[4155] AND DON'T ALLOW CONTINUATION
DOCLS: XMOVEI P,INIPDL-1 ;[3137] Set up a global stack
TLNN P,-1 ;[3137] Is there a section number ?
HRLI P,-LPDL ;NO. USE A LOCAL STACK
PUSH P,['STOP!!'] ;FLAG BOTTOM OF STACK FOR TRACEBACK
XMOVEI L,[1+[EXP 0,0]] ;NULL ARGS
PUSHJ P,EXIT1. ;CLOSE ALL FILES
NDOCLS: XCT USEREN ;EXECUTE REENTER INST
%EXICL: EXIT ;HALT FOROTS
MAPERR: OUTSTR MAPMSG ;CAN'T MAP TO A NON-ZERO SECTION
EXIT
SEGMENT DATA
MAPBLK: BLOCK 2 ;A SHORT PAGE BLOCK
SEGMENT CODE
>;END IF10
IF20,<
SETEV:
MOVEI T1,.FHSLF ;[3137] Reference this fork
XGVEC% ;[3137] Get entry vector length and address
ERJMP S0GVEC ;NOT RUNNING ON A MODEL B
JRST S1GVEC ;[3156] Interpret the entry vector
S0GVEC: MOVEI T1,.FHSLF ;[3137] Reference this fork
GEVEC% ;[3156] Get entry vector info using old call
HRRZ T3,T2 ;[3235] Put the address where XGVEC% puts it
HLRZ T2,T2 ;[3235] Put the length in the right half
S1GVEC: DMOVEM T2,%ENTVC ;[3137] Save it
CAIE T2,(JRST) ;[3137] Real entry vector?
CAIG T2,1 ;[3137] Yes, big enough?
JRST USJOBD ;NO. USE JOBDAT
SKIPN T1,1(T3) ;[3137] Get reenter instruction
MOVE T1,[JRST %EXICL];USE OURS IF NONE
CAMN T1,[JRST CLSFIL] ;Already setup? (Program re-started?)
POPJ P, ;YES. DON'T DO IT AGAIN
TLNN T1,-1 ;ANY OPCODE?
HRLI T1,(JRST) ;NO. PUT IN A JRST
MOVEM T1,USEREN ;TO EXECUTE AFTER %EXIT1
MOVE T1,[JRST CLSFIL];USED TO CLOSE ALL FILES
MOVEM T1,1(T3) ;[3137] When user types "@REENTER"
POPJ P,
MAPSEC: MOVSI T1,.FHSLF ;THIS FORK IN SECT 0
MOVSI T2,.FHSLF ;[4022] THIS FORK ,,
HRR T2,SECNUM ;[4022] CORRECT SECTION
MOVX T3,SM%RD!SM%WR!SM%EX+1
SMAP% ;MAP SECTIONS 0 & N TOGETHER
ERJMP MAPERR ;CAN'T
POPJ P,
CLSFIL: MOVE T1,[POINT 7,CLSMSG] ;GIVE USER A MSG
PSOUT%
MOVE T1,[TXIBLB,,TXIBLK] ;Copy args to TXIBLK
BLT T1,TXIBLK+.TXLEN-1
XMOVEI T1,TXIBLK ;SETUP FOR TEXTI
TEXTI%
JFCL ;?Failed
;Clear input buffer.
MOVEI T1,.PRIIN ;Get terminal designator
CFIBF% ;Clear input buffer
ERJMP .+1 ;Ignore error
LDB T1,[POINT 7,YESWRD,6] ;GET THE 1ST CHAR
CAIE T1,"Y" ;CHECK FOR UPPER AND LOWER CASE Y
CAIN T1,"y"
JRST DOCLS ;YES, IT'S YES
XCT USEREN ;[4155] EXECUTE REENTER INST
HALTF% ;[4155] STOP THE PROGRAM
JRST .-1 ;[4155] AND DON'T ALLOW CONTINUATION
DOCLS: XMOVEI P,INIPDL-1 ;[3137] Set up a global stack
TLNN P,-1 ;[3137] Is there a section number ?
HRLI P,-LPDL ;NO. USE A LOCAL STACK
PUSH P,['STOP!!'] ;FLAG BOTTOM OF STACK FOR TRACEBACK
XMOVEI L,[1+[EXP 0,0]] ;NULL ARGS
PUSHJ P,EXIT1. ;CLOSE ALL FILES
NDOCLS: XCT USEREN ;EXECUTE REENTER INST
%EXICL: MOVNI T1,1 ;CLOSE ALL OTHER FILES
CLOSF%
$FCALL IOE ;REPORT WHATEVER ERROR IT IS
HALTF% ;STOP FOROTS
JRST .-1 ;AND STAY THAT WAY
MAPERR: HRROI T1,MAPMSG ;GET MESSAGE
ESOUT%
HALTF%
JRST .-1
TXIBLB: .RDRTY ;LENGTH FOLLOWING
RD%TOP!RD%JFN ;STOP ON TOPS-10 STYLE CODES
.PRIIN,,.PRIOU ;INPUT,,OUTPUT
POINT 7,YESWRD ;THE ANSWER POINTER
5 ;5 BYTES MAX
POINT 7,YESWRD ;THE DELETE-UP-TO-HERE POINTER
POINT 7,CLSMSG ;THE GIVE-ME-BACK-THAT-PROMPT POINTER
.TXLEN==.-TXIBLB ;Length of block
SEGMENT DATA
TXIBLK: BLOCK .TXLEN ;Real TEXTI block.
SEGMENT CODE
; New [4022]/PLB FNDSEC; FIND A FREE SECTION
%GTSEC: MOVSI T3, -37 ;[4022] SEARCH 1..37
FNDLOP: MOVSI T1, .FHSLF ;[4022] GET FORK (THATS US)
HRRI T1, 1(T3) ;[4022] SNEAK SECTION IN
RSMAP% ;[4022] READ SECTION MAP
ERJMP FNDRET ;[4022] YOU LOSE BIG
AOJE T1, FNDGOT ;[4022] IN USE? (NOT -1)
AOBJN T3, FNDLOP ;[4022] FRAID SO
POPJ P, ;[4022] I'M SORRY YOUR TIME IS UP.
FNDGOT: MOVEI T1, 1(T3) ;[4022] RETURN SECTION IN T1
AOS (P) ;[4022] GIVE HAPPY RETURN
FNDRET: POPJ P, ;[4022] HOMEWARD BOUND
SEGMENT DATA
PDVARG: EXP PDVLEN ;[3137] Length of the block
EXP .FHSLF ;[3137] This process
EXP PDVALN ;[3137] Data block length
BLOCK 1 ;[3137] Address of associated data block (PDVA)
PDVLEN==.-PDVARG ;[3137] Length of this block
;[3137]
PDVA: BLOCK 1 ;[3137] Gets address of PDV
PDVALN==.-PDVA ;[3137] Length of this block
SEGMENT CODE
>;END IF20
PRGEND
SEARCH MTHPRM,FORPRM
TV FORNON NON-SHARE MODULE
;THIS MODULE IS REACHED IF LINK DOES NOT DEFINE FOROT%, THAT IS, IF
;WE ARE LOADING /OTS:NONSHARE OR WITH /SEARCH. THIS MODULE IS HERE
;TO REMOVE ALL OTHER TRACES OF THE SYMBOL FOROT% FROM FOROTS.
ENTRY FOROT%
INTERN %GOGET
SEGMENT CODE
FOROT%==0 ;IF DEFINED HERE, FORCES LOADING OF FOROTS
%GOGET: POPJ P,
PRGEND
SEARCH MTHPRM,FORPRM
TV FORGET GETSEG FOROTS
SEGMENT CODE
ENTRY %GOGET
EXTERN %GTSEC,%ENTVC
DEBUG==1 ;[4022] NON-ZERO FOR DEBUG CODE
DDTPAG==766 ;BOTTOM PAGE OF CURRENT DDT
%GOGET: SKIPE T1,FBASE ;FOROTS ALREADY GETED?
POPJ P, ;YES. DON'T GET IT AGAIN
IF10,<
JS.XO==2000 ;JBTSTS BIT, JOB IS EXECUTE ONLY
MOVEM P,SAVET ;SAVE P, GETSEG DESTROYS IT
HRROI T1,.GTSTS ;GET JOB STATUS
GETTAB T1,
SETZ T1, ;CAN'T, ASSUME NOT EXECUTE ONLY
TRNN T1,JS.XO ;EXECUTE ONLY?
TDZA T2,T2 ;NO
MOVEI T2,UU.PHY ;YES, SET FOR PHYS-ONLY GETSEG
MOVEI T1,FOROTS
DOGETS: GETSEG T1,(T2)
HALT ;FAILED, TYPE MONITOR ERROR MESSAGE
MOVE P,SAVET ;GETSEG WRECKED P, GET IT BACK
MOVE T1,[-2,,.GTUPM] ;GET BASE ADDRESS OF HIGH SEG (FOROTS)
GETTAB T1,
JRST GETFAL ;SHOULDN'T FAIL
HLRZ T1,T1 ;PUT IN RIGHT HALF
TRZ T1,777 ;CLEAR EXTRA BITS
TRO T1,10 ;START ADDRESS IS XXX010
SUBI T1,RBASE ;SUBTRACT TABLE OFFSET
MOVEM T1,FBASE ;STORE FOR LATER
POPJ P, ;DONE
GETFAL: OUTSTR [ASCIZ /?Cannot find base address of FOROTS
/]
EXIT
FOROTS: 'SYS '
'FORO10'
EXP 0,0,0,0
> ;IF10
IF20,<
MOVX T1,RF%LNG+.FHSLF ;FUNNY CALL,,THIS FORK
MOVEI T2,STBLK ;POINT TO FORK STATUS BLOCK
RFSTS% ;READ FORK STATUS
SKIPL STBLK+.RFSFL ;SEE IF WE ARE EXECUTE ONLY
SKIPA T1,[GJ%SHT+GJ%OLD] ;NO, SET UP FOR REGULAR GTJFN
MOVX T1,GJ%SHT+GJ%OLD+GJ%PHY ;YES, SET UP FOR PHYSICAL-ONLY GTJFN
HRROI T2,[ASCIZ /SYS:FORO10.EXE/]
GTJFN%
ERJMP RERR
HRRZM T1,FRSJFN ;SAVE THE JFN
PUSHJ P,GTFRSX ;[4022] SETUP FOR SECTION N GET%
GET% ;GET FOROTS
ERJMP RERR
XMOVEI T1,. ;[4022] GET OUR SECTION
HLRZ T1,T1 ;[4022] PUT IN RIGHT HALF
CAME T1,GARGBL+.GBASE ;[4022] SAME AS FOROTS SECTION?
PUSHJ P,FRSJBD ;[4022] NO, MAKE A JOBDAT FOR FOROTS
MOVEI T1,.FHSLF ;THIS FORK
XMOVEI T2,0 ;[4022] SECTION 0?
JUMPN T2,GOGET1 ;[4022] NO, GET XTENDED ENTRY VECTOR
GEVEC% ;GET FOROTS ENTRY VECTOR
MOVEI T3,(T2) ;[4022] ADDR ONLY, WHERE XGVEC LEAVES IT
HLRZ T2,T2 ;[4022] GET ENTRY VECTOR LENGTH
TRNA ;[4022] PRETEND WE JUST DID AN XGVEC
GOGET1: XGVEC% ;[4022] GET START ADDRESS W/ SECTION
CAIE T2,(JRST) ;[4022] IF NOT TOPS-10 ENTRY VECTOR
HRR T3,(T3) ;[4022] GET ENTRY ADDRESS W/ SECTION
XMOVEI T2,(T3) ;[4022] GET EXTENDED ADDR THEREOF
XMOVEI T4,RBASE ;GET EXTENDED ADDR OF TABLE OFFSET
SUB T2,T4 ;[4022] SUBTRACT TABLE OFFSET
MOVEM T2,FBASE ;[4022] SAVE BASE ADDRESS OF DISPATCH VECTOR
TRZ T3,777 ;GET JUST PAGE-ALIGNED ADDRESS
HLRZ T2,.JBHRN(T3) ;GET SEGMENT LENGTH
ADDI T2,-1(T3) ;CALC TOP ADDR OF FOROTS
IORI T2,777 ;MAKE IT THE END OF THE PAGE
HLL T2,.JBHRN(T3) ;MAKE .JBHRL LOOK LIKE ON THE -10
SKIPN .JBHRL ;AND IF THE USER DIDN'T HAVE ONE
MOVEM T2,.JBHRL ;SAVE FOR DDT
IFN DEBUG,< ;[3254] USE THIS FOR DEBUGGING; REMOVED FOR
;[3254] PRODUCTION
XMOVEI T1,(T3) ;GET EXTENDED ADDR
LSH T1,-9 ;CREATE PAGE ADDR
SKIPN .JBHSO ;AND IF THE USER DOESN'T HAVE ONE
MOVEM T1,.JBHSO ;SAVE THE FOROTS HIGH SEG ORIGIN FOR DDT
XMOVEI T1,. ;[4022] GET OUR SECTION
HLRZ T1,T1 ;[4022] GET IN RIGHT HALF
CAMN T1,GARGBL+.GBASE ;[4022] SAME AS FOROTS?
JRST GOGET2 ;[4022] YES, PMAP WILL DIE
MOVE T1,[.FHSLF,,770] ;[4022] IS DDT ACCESSIBLE?
RPACS% ;[4022] GET ACCESS INFO
$FJCAL IJE,ABORT. ;[4022] SHOULD NEVER FAIL
JUMPE T2,GOGET2 ;[4022] NO DDT
MOVE T1,770000 ;[4022] GET FIRST WORD OF 'DDT'
CAME T1,[JRST 770002] ;[4022] IS IT FOR REAL?
JRST GOGET2 ;[4022] NO
XMOVEI T1,DDTPAG*1000 ;[4022] GET DDT BOTTOM ADDR
LSH T1,-9 ;[4022] MAKE PAGE
HRLI T1,.FHSLF ;[4022] IN US
MOVE T2,GARGBL+.GBASE ;[4022] GET DESTINATION SECTION #
LSH T2,9 ;[4022] PAGEIFY
ADD T2,[.FHSLF,,DDTPAG] ;[4022] DESTINATION
MOVE T3,[PM%CNT!PM%RWX+<1000-DDTPAG>] ;[4022] ACCESS INFO
PMAP% ;[4022] MAP THE PAGES TOGETHER
$FJCAL IJE,ABORT. ;[4022] SHOULD NEVER FAIL!
GOGET2:
> ;IFN DEBUG
MOVEI T1,.FHSLF ;THIS FORK
DMOVE T2,%ENTVC ;[3137] Put real entry vector back
XMOVEI T4,0 ;[3220] See what section the ACs are in
JUMPE T4,S0SVEC ;[3220] Do a SEVEC% if we are in section 0
XSVEC% ; SO ^C, START WORKS
POPJ P, ;DONE
S0SVEC: HRLZ T2,T2 ;[3235] Put the size in the left half
HRR T2,T3 ;[3235] Put the address in the right half
SEVEC% ;[3156] Set the entry vector with an old call
POPJ P, ;DONE
;Call here to do setup for GET% into any section
;Exits with AC1 and AC2 set up for GET%
GTFRSX: MOVX T1,GT%BAS!GT%LOW ;Tell monitor to look at .GBASE in GARGBL
MOVEM T1,GARGBL+.GFLAG ;STORE FLAGS
XMOVEI T1,GARGBL ;[4022] GET SECTION FOR ARGBLOCK
HLRZ T1,T1 ;GET SECTION NUMBER IN RH
MOVEM T1,GARGBL+.GBASE ;[4022] STORE SECTION NUMBER
MOVEI T2,(T1) ;COPY THE SECTION NUMBER
LSH T2,^D9 ;MAKE IT A PAGE NUMBER
ADDI T2,1 ;IGNORE PAGE 0 WITHIN IT
MOVEM T2,GARGBL+.GLOW ;ON THE GET
MOVE T1,FRSJFN ;GET JFN
TDO T1,[.FHSLF,,GT%NOV!GT%ARG] ;[4022] THIS FORK,
;ERROR IF PAGES EXIST, USE ARG BLOCK
XMOVEI T2,GARGBL ;[4022] GET% ARG BLOCK
POPJ P, ;Back to main code
RERR: HRROI T1,RERRBF ;POINT TO MESSAGE BUFFER
HRLOI T2,.FHSLF ;THIS FORK,,LAST ERROR
MOVSI T3,-^D80 ;LIMIT OF 80 CHARS
ERSTR% ;GET ERROR STRING
JRST [HRROI T1,[ASCIZ /Undefined error number/]
JRST RQUIT]
SKIPA T1,[-1,,[ASCIZ /Error in ERSTR/]]
HRROI T1,RERRBF
RQUIT: MOVEM T1,SAVET ;SAVE T1 FOR A WHILE
HRROI T1,[ASCIZ /Can't get FORO10.EXE/]
ESOUT% ;TYPE EXPLANATION
MOVE T1,SAVET ;GET POINTER BACK
ESOUT% ;TYPE ERROR STRING
HALTF% ;QUIT AND DON'T CONTINUE
JRST .-1
; [4022] New /PLB; Create crucial JOBDAT locations in FOROTS' section
; when FOROTS resides in another section.
FRSJBD: HRLZ T2,GARGBL+.GBASE ;GET FOROTS SECTION
MOVEI T1,.JBDA ;GET VALUE
MOVSM T1,.JBSA(T2) ;STORE INITIAL FIRST FREE LOCATION
MOVEM T1,.JBFF(T2) ;STORE FIRST FREE LOCATION
MOVEI T1,777 ;GET VALUE
MOVEM T1,.JBREL(T2) ;SET LOWSEG LOWER BOUND
POPJ P,
SEGMENT DATA
STBLK: 5 ;LENGTH OF RFSTS BLOCK
BLOCK 4 ;RFSTS BLOCK
GARGBL: BLOCK 4 ;"GET" arg block
RERRBF: BLOCK ^D80/5 ;BUFFER FOR ERROR MESSAGE
SEGMENT CODE
> ;END IF20
;DISPATCH VECTOR. JUMP TO APPROPRIATE PLACE IN FOROTS DISPATCH VECTOR
DEFINE X (E) <
INTERN E'.
SIXBIT /E'./
E'.: PUSHJ P,RDISP
>
XALL
RVEC: FORVEC
SALL
RBASE==RVEC+1 ;LOCAL RETURN PC-1 ON CALL FROM 1ST ENTRY
;THE FOLLOWING LOWSEG/HISEG INTERFACE ALLOWS FORGET TO BE IN
;A DIFFERENT SECTION THAN FOROTS. FBASE IS THE ENTRY VECTOR
;ADDRESS, MINUS THE OFFSET OF THE TRANSFER VECTOR TABLE (RVEC).
;RDISP JUST DOES A JUMP TO FOROTS, WITHOUT SAVING ANY AC'S.
;IT IS EXPECTED THAT EITHER THE AC'S ARE STORED SEPARATELY (E.G. INIT)
;OR STORED BY THE HISEG ENTRY POINT
RDISP: EXCH 0,(P) ;GET RETURN ADDR, SAVE 0
ADD 0,FBASE ;RELOCATE TO FOROTS ENTRY POINT
EXCH 0,(P) ;GET 0 BACK, SAVE ENTRY POINT
POPJ P, ;GO TO IT
SEGMENT DATA
FBASE: BLOCK 1 ;FOROTS BASE ADDR MINUS TABLE OFFSET
SAVET: BLOCK 1 ;RANDOM TEMP
FRSJFN: BLOCK 1 ;FOROTS' JFN
SRETAD: BLOCK 1 ;RETURN ADDR OF CALL TO SDISP
SEGMENT CODE
PRGEND
TITLE DUMEXT
ENTRY %EXTND
;THIS MODULE IS LINKED IF EXTEND HAS NOT BEEN CALLED IN THE
;USER PROGRAM. IT RESOLVES THE GLOBAL SYMBOL %EXTND, WHICH DETERMINES
;WHETHER THE USER WISHES TO RUN IN A NON-ZERO SECTION.
%EXTND==0
PRGEND
TITLE FORREN REENTER ADDRESS FOR /EXTEND
ENTRY REENT.
EXTERN %EXICL
REENT.==<%EXICL+0>
END