mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-06 19:11:04 +00:00
1311 lines
40 KiB
Plaintext
1311 lines
40 KiB
Plaintext
TITLE WHOONC - Once-only symbol setup
|
||
|
||
SEARCH WHOMAC
|
||
$SETUP (WHOONC)
|
||
.DIRECT FLBLST,.ITABM
|
||
|
||
ONCPDS==30 ;ONCE-ONLY PDL SIZE
|
||
FILWDS==21 ;NUMBER OF WORDS IN AN ASCIZ FILESPEC
|
||
|
||
WHODEV==<SIXBIT/DSK/> ;DEFAULT SAVE FILE DEVICE
|
||
WHOFIL==<SIXBIT/WHO/> ;DEFAULT SAVE FILE NAME
|
||
WHODDT==<SIXBIT/WHODDT/>;DEFAULT SAVE FILE NAME IF DDT IS LOADED
|
||
; Parser data block definitions
|
||
|
||
.PBPMT==0 ;PROMPT STRING
|
||
.PBHLP==1 ;HELP TEXT ADDRESSES
|
||
.PBTYI==2 ;TYPEIN ROUTINE
|
||
.PBTYO==3 ;TYPEOUT ROUTINE
|
||
.PBTYA==4 ;TYPEOUT FOR ARGUMENT
|
||
.PBDEF==5 ;DEFAULT RESPONSE
|
||
.PBARG==6 ;ARGUMENT
|
||
.PBRSP==7 ;RESPONSE
|
||
.PBCHK==10 ;RESPONSE CHECK
|
||
.PBLEN==11 ;LENGTH OF BLOCK
|
||
|
||
DEFINE $PARSE (TYP,PFX,PMT,DEF,ARG1,ARG2,HLP),<
|
||
|
||
JSP T1,PARSER
|
||
EXP [ASCIZ |'PMT|] ;;PROMPT STRING
|
||
EXP [ASCIZ |'HLP|] ;;HELP TEXT
|
||
|
||
;; INPUT,,OUTPUT/ARGUMENT ROUTINES
|
||
IFIDN <TYP><DEC>,<EXP .DECNW##,.TDECW##,NUMARG>
|
||
IFIDN <TYP><OCT>,<EXP .OCTNW##,.TOCTW##,NUMARG>
|
||
IFIDN <TYP><SIX>,<EXP .SIXSW##,.TSIXN##,LSTARG>
|
||
IFIDN <TYP><TXT>,<EXP .ASCQW##,.TSTRG##,LSTARG>
|
||
IFIDN <TYP><FIL>,<EXP .FILIN##,.TFBLK##,.POPJ##>
|
||
|
||
;; DEFAULT RESPONSES
|
||
IFIDN <TYP><DEC>,<MOVE T1,[EXP ^D'DEF]>
|
||
IFIDN <TYP><OCT>,<MOVE T1,[EXP ^O'DEF]>
|
||
IFIDN <TYP><SIX>,<MOVE T1,[SIXBIT /DEF/]>
|
||
IFIDN <TYP><TXT>,<MOVEI T1,[ASCIZ |DEF|]>
|
||
IFIDN <TYP><FIL>,<MOVEI T1,DEF>
|
||
|
||
;; ARGUMENTS
|
||
IFIDN <TYP><DEC>,<XWD ^D'ARG1,^D'ARG2>
|
||
IFIDN <TYP><OCT>,<XWD ^O'ARG1,^O'ARG2>
|
||
IFIDN <TYP><SIX>,<IOWD PFX'.L,PFX'.T>
|
||
IFIDN <TYP><TXT>,<IOWD PFX'.L,PFX'.T>
|
||
IFIDN <TYP><FIL>,<EXP ARG1>
|
||
|
||
;; RESPONSE
|
||
IFIDN <TYP><DEC>,<MOVE T1,N>
|
||
IFIDN <TYP><OCT>,<MOVE T1,N>
|
||
IFIDN <TYP><SIX>,<MOVE T1,N>
|
||
IFIDN <TYP><TXT>,<MOVEI T1,.NMUL##>
|
||
IFIDN <TYP><FIL>,<MOVEI T1,ARG1>
|
||
|
||
;; CHECK
|
||
IFIDN <TYP><DEC>,<EXP NUMCHK>
|
||
IFIDN <TYP><OCT>,<EXP NUMCHK>
|
||
IFIDN <TYP><SIX>,<EXP SIXCHK>
|
||
IFIDN <TYP><TXT>,<EXP .POPJ1##>
|
||
IFIDN <TYP><FIL>,<EXP FILCHK>
|
||
|
||
> ;END $PARSE
|
||
$LOW
|
||
|
||
WHOONC::JFCL ;NO CCL
|
||
RESET ;STOP I/O
|
||
SETZB 0,O.ZBEG ;CLEAR AN AC AND A WORD
|
||
MOVE P,[O.ZBEG,,O.ZBEG+1] ;SET UP BLT
|
||
BLT P,O.ZEND-1 ;CLEAR OUT ONCE-ONLY DATA
|
||
MOVEI 17,1 ;SETUP UP BLT
|
||
BLT 17,17 ;CLEAR THE ACS
|
||
MOVE P,[IOWD ONCPDS,ONCPDL] ;SET UP STACK
|
||
MOVEI T1,'WHO' ;SET ERROR PREFIX
|
||
PUSHJ P,.ERXPF## ;TELL ERROR HANDLER
|
||
PUSHJ P,MAPMON## ;SET UP FOR MONITOR MAPPING
|
||
PUSHJ P,WEHSEG ;WRITE ENABLE THE HIGH SEGMENT
|
||
PUSHJ P,DEFALT ;DO DEFAULTING FOR DIALOG
|
||
PUSHJ P,DIALOG ;ASK SOME QUESTIONS
|
||
PUSHJ P,BOOTS ;CONVERT THE FILESPEC TO ASCIZ
|
||
PUSHJ P,MAPCRS## ;SET UP EXE FILE MAPPING
|
||
PUSHJ P,UUOFET## ;GET MONITOR FEATURES
|
||
PUSHJ P,SYMLOD ;LOAD SYMBOLS FROM AN UNRUN MONITOR
|
||
PUSHJ P,SYMCHK ;CHECK SYMBOLS
|
||
PUSHJ P,HIDATA ;SET UP SPECIAL HIGH SEG DATA
|
||
PUSHJ P,INISET ;SET UP INITIALIZATION TEXT
|
||
PJRST SAVER ;SAVE OUR CORE IMAGE
|
||
SUBTTL Dialog defaulting
|
||
|
||
|
||
DEFALT: SETZM ONCFLG ;FLAG STARTING ONCE-ONLY CODE
|
||
PUSHJ P,BTSDEF ;BOOTSTRAP FILESPEC
|
||
PUSHJ P,SAVDEF ;SAVE FILE
|
||
PUSHJ P,DDTDEF ;DDT
|
||
PUSHJ P,SYMDEF ;SYMBOL TABLE
|
||
POPJ P, ;RETURN
|
||
; Default the monitor bootstrap filespec
|
||
BTSDEF: MOVEI P1,BTSGTB ;POINT TO TABLE
|
||
PUSHJ P,GTBS ;DO SOME GETTABS
|
||
SETOM BTSSCB+.FXNMM ;MASK FOR FILE NAME
|
||
HLLOS BTSSCB+.FXEXT ;MASK FOR EXTENSION
|
||
SETOM BTSSCB+.FXDIM+0 ;MASK FOR SFD #1
|
||
SETOM BTSSCB+.FXDIM+2 ;MASK FOR SFD #2
|
||
SETOM BTSSCB+.FXDIM+4 ;MASK FOR SFD #3
|
||
SETOM BTSSCB+.FXDIM+6 ;MASK FOR SFD #4
|
||
SETOM BTSSCB+.FXDIM+10 ;MASK FOR SFD #5
|
||
|
||
; Default the monitor filespec
|
||
MONDEF: MOVSI T1,-.FXLEN ;-COUNT,,0
|
||
|
||
MOND.1: MOVE T2,BTSSCB(T1) ;GET A DEFAULT
|
||
SKIPN MONSCB(T1) ;WORD SPECIFIED?
|
||
MOVEM T2,MONSCB(T1) ;NO
|
||
AOBJN T1,MOND.1 ;LOOP
|
||
POPJ P, ;RETURN
|
||
|
||
; Monitor bootstrap file spec
|
||
BTSGTB: EXP %CNMBS,BTSSCB+.FXDEV ;DEVICE
|
||
EXP %CNMBF,BTSSCB+.FXNAM ;FILE NAME
|
||
EXP %CNMBX,BTSSCB+.FXEXT ;EXTENSION
|
||
EXP %CNMBD,BTSSCB+.FXDIR+0 ;PPN
|
||
EXP %CNSF1,BTSSCB+.FXDIR+2 ;SFD #1
|
||
EXP %CNSF2,BTSSCB+.FXDIR+4 ;SFD #2
|
||
EXP %CNSF3,BTSSCB+.FXDIR+6 ;SFD #3
|
||
EXP %CNSF4,BTSSCB+.FXDIR+10 ;SFD #4
|
||
EXP %CNSF5,BTSSCB+.FXDIR+12 ;SFD #5
|
||
EXP 0 ;TERMINATE LIST
|
||
; Default the save filespec
|
||
SAVDEF: MOVSI T1,-.FXLEN ;-COUNT,,0
|
||
|
||
SAVD.1: MOVE T2,SAVDSB(T1) ;GET A DEFAULT
|
||
SKIPN SAVSCB(T1) ;WORD SPECIFIED?
|
||
MOVEM T2,SAVSCB(T1) ;NO
|
||
AOBJN T1,SAVD.1 ;LOOP
|
||
POPJ P, ;RETURN
|
||
|
||
; Save file default scan block
|
||
SAVDSB: EXP WHODEV ;DEVICE
|
||
EXP WHOFIL ;FILE NAME
|
||
EXP -1 ;FILE NAME MASK
|
||
XWD 'EXE',-1 ;EXTENSION AND MASK
|
||
BLOCK .FXLEN-<.-SAVDEF> ;REMAINDER OF BLOCK IS ZEROS
|
||
; DDT
|
||
DDTDEF: SKIPN .JBDDT ;IS DDT LOADED?
|
||
POPJ P, ;NO
|
||
HRRZ T1,.JBHRL ;GET HIGH SEG END
|
||
JUMPE T1,DDTD.1 ;DON'T HAVE ONE
|
||
MOVE T1,[-2,,.GTUPM] ;ARGS TO READ UPMP
|
||
PUSHJ P,.MAPG## ; FOR OUR HIGH SEG
|
||
|
||
DDTD.1: MOVSI T1,.JBHGH ;ASSUME THE NORMAL STARTING ADDRESS
|
||
HLRZS T1 ;PUT IN RH
|
||
MOVEM T1,HGHORG ;SAVE HIGH SEG ORIGIN
|
||
HLRZ T2,.JBDDT ;GET DDT ENDING ADDRESS
|
||
CAML T1,T2 ;IF BELOW THE HIGH SEG, NOT VMDDT
|
||
MOVEM T2,DDTFLG ;FLAG REAL DDT PRESENT
|
||
POPJ P, ;RETURN
|
||
; Symbol table
|
||
SYMDEF: SKIPE T1,HGHORG ;GET HIGH SEG ORIGIN
|
||
SKIPN .JBHSM(T1) ;SAVE A SYMBOL TABLE UP THERE?
|
||
POPJ P, ;NO HIGH SEG OR NO SYMBOLS
|
||
MOVEM T1,SYMFLG ;SAVE ADDRESS
|
||
POPJ P, ;AND RETURN
|
||
DIALOG: SETZM DEFFLG ;NO DEFAULTING RIGHT NOW
|
||
MOVEI T1,PMTPROMPT ;GET DEFAULT HELP MODE
|
||
MOVEM T1,HLPLVL ;SET IT
|
||
PUSHJ P,.TCRLF## ;CRLF TO START THINGS OFF
|
||
MOVEI T1,[ASCIZ | WHO %|] ;BEGIN
|
||
PUSHJ P,.TSTRG## ; INTRODUCTION
|
||
MOVE T1,.JBVER ;GET OUR VERSION
|
||
PUSHJ P,.TVERW## ;TYPE IT
|
||
MOVEI T1,[ASCIZ | for TOPS10 |]
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVEI T1,%VER ;GET MONITOR WHO WAS BUILT FOR
|
||
PUSHJ P,.TOCTW## ;TYPE IT
|
||
MOVEI T1,[ASCIZ | monitors|] ;FINISH
|
||
PUSHJ P,.TSTRG## ; LINE
|
||
PUSHJ P,.TCRLF## ;CRLF
|
||
MOVEI T1,[ASCIZ | Once-only initialization code|]
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
PUSHJ P,.TCRLF## ;CRLF
|
||
PUSHJ P,.TCRLF## ;ONE MORE
|
||
|
||
DIAL.0: $PARSE (SIX,YNA,<Do you want help>,NO,,,<
|
||
In the following dialog, all numbers are decimal unless
|
||
otherwise noted. Default responses are surrounded by []. Lists
|
||
of legal responses are surrounded by (). "/HELP" may be typed
|
||
in response to any question. It causes the question to be
|
||
re-typed in the next longer mode. At any time, the dialog may
|
||
be restarted by typing ESCAPE. Typing Control-Z to any
|
||
question will cause immediate return to monitor level.
|
||
>)
|
||
HRRZ T2,T1 ;GET ANSWER
|
||
SUBI T2,YNA.T-1 ;NOW INDEX INTO TABLE
|
||
MOVEI T1,DIAL.0+1 ;POINT TO START OF PARSER BLOCK
|
||
MOVE T1,.PBHLP(T1) ;GET TEXT ADDRESS
|
||
CAIN T2,YNAYES ;WAS ANSWER NO?
|
||
PUSHJ P,.TSTRG## ;TYPE HELP TEXT
|
||
|
||
|
||
$PARSE (SIX,PMT,</HELP>,PROMPT,,,<
|
||
Questions may be asked in three different modes. The modes are:
|
||
SHORT only asks for input.
|
||
PROMPT lists default and legal responses.
|
||
LONG lists help text, default, and legal responses.
|
||
>)
|
||
HRRZS T1 ;GET JUST KEYWORD ADDRESS
|
||
SUBI T1,PMT.T-1 ;NOW INDEX INTO TABLE
|
||
MOVEM T1,HLPLVL ;SAVE PROMPT HELP LEVEL
|
||
JRST DIAL.1
|
||
|
||
KEYS (PMT,<SHORT,PROMPT,LONG>)
|
||
DIAL.1: $PARSE (FIL,XXX,<Monitor file>,BTSSCB,MONSCB,,<
|
||
WHO must obtain monitor symbols in order for it to examine a
|
||
running monitor or a crash file. The extracted symbols are
|
||
often used whenever an offset, monitor address, or byte pointer
|
||
is not available from the monitor via the GETTAB UUO.
|
||
>)
|
||
|
||
DIAL.2: SKIPN DDTFLG ;IS DDT LOADED?
|
||
JRST DIAL.3 ;NO
|
||
$PARSE (SIX,YNA,<Preserve DDT>,NO,,,<
|
||
Normally, DDT is not included in a production version of WHO.
|
||
For ease of debugging, however, you have the option of
|
||
preserving DDT.
|
||
>)
|
||
HRRZS T1 ;GET JUST KEYWORD ADDRESS
|
||
SUBI T1,YNA.T-1 ;NOW INDEX INTO TABLE
|
||
CAIN T1,YNANO ;WAS ANSWER NO?
|
||
SETZM DDTFLG ;WIPE OUT DDT
|
||
MOVE T2,[WHOFIL] ;ASSUME NO DDT
|
||
SKIPE DDTFLG ;WHAT DID HE ANSWER?
|
||
MOVE T2,[WHODDT] ;KEEPING DDT SO CHANGE DEFAULT NAME
|
||
MOVEM T2,SAVDSB+.FXNAM ;SET DEFAULT FILE NAME
|
||
|
||
DIAL.3: SKIPN SYMFLG ;HAVE SYMBOLS?
|
||
JRST DIAL.4 ;NO
|
||
$PARSE (SIX,YNA,<Preserve symbols>,NO,,,<
|
||
Normally, symbols are not included in a production version of
|
||
WHO. For ease of debugging, however, you have the option of
|
||
preserving the symbol table.
|
||
>)
|
||
HRRZS T1 ;GET JUST KEYWORD ADDRESS
|
||
SUBI T1,YNA.T-1 ;NO INDEX INTO TABLE
|
||
CAIN T1,YNANO ;WAS ANSWER NO?
|
||
SETZM SYMFLG ;WIPE OUT SYMBOLS
|
||
DIAL.4: $PARSE (FIL,XXX,<Save file>,SAVDSB,SAVSCB,,<
|
||
When the once-only initialization proceedure is completed, a
|
||
runnable production version of WHO will need to be saved in a
|
||
.EXE file. Although this file usually resides on SYS:, it is
|
||
recommended that WHO be tested before it's put on SYS:.
|
||
>)
|
||
PUSHJ P,SAVSET ;SET UP EVENTUAL SAVE. UUO
|
||
JRST DIAL.4 ;SOMETHING WAS WRONG--TRY AGAIN
|
||
DIAL.5: $PARSE (SIX,YNA,<Default internal parameters>,YES,,,<
|
||
Normally, the standard internal defaults will suffice for most
|
||
installations. You have the option of changing these at this
|
||
time. Internal parameters are those which do not effect the
|
||
user directly, but instead control how WHO will get, process,
|
||
and display data.
|
||
>)
|
||
HRRZS T1 ;GET JUST KEYWORD ADDRESS
|
||
SUBI T1,YNA.T-1 ;NOW INDEX INTO TABLE
|
||
CAIN T1,YNANO ;WAS ANSWER NO?
|
||
TDZA T1,T1 ;YES
|
||
MOVEI T1,1 ;NO
|
||
MOVEM T1,DEFINT ;SET INTERNAL FLAG
|
||
DIAL.6: $PARSE (SIX,YNA,<Default user parameters>,YES,,,<
|
||
Normally, the standard user interface defaults will suffice for
|
||
most installations. You have the option of changing these at
|
||
this time. User parameters are those which effect the user
|
||
interface directly, such as switch and keyword defaults.
|
||
>)
|
||
HRRZS T1 ;GET JUST KEYWORD ADDRESS
|
||
SUBI T1,YNA.T-1 ;NOW INDEX INTO TABLE
|
||
CAIN T1,YNANO ;WAS ANSWER NO?
|
||
TDZA T1,T1 ;YES
|
||
MOVEI T1,1 ;NO
|
||
MOVEM T1,DEFUSR ;SET USER FLAG
|
||
DEFI.0: MOVE T1,DEFINT ;GET DEFAULT FLAG
|
||
MOVEM T1,DEFFLG ;SET IT
|
||
JUMPN T1,DEFI.1 ;DEFAULTING?
|
||
PUSHJ P,.TCRLF## ;CRLF TO START THINGS OFF
|
||
MOVEI T1,[ASCIZ | Internal parameters|]
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
PUSHJ P,.TCRLF## ;CRLF
|
||
PUSHJ P,.TCRLF## ;ONE MORE
|
||
|
||
DEFI.1: $PARSE (SIX,CHG,<Charge number typeout>,SIXBIT,,,<
|
||
Charge numbers are set in the monitor by the LOGIN UUO for
|
||
accounting purposes. The TOPS-10 monitor, however, makes no use
|
||
of the charge number. Therefore, the format was never defined.
|
||
Usually, it is a sixbit number.
|
||
>)
|
||
HRRZS T1 ;GET JUST KEYWORD ADDRESS
|
||
SUBI T1,CHG.T ;NOW INDEX INTO TABLE
|
||
MOVSI T2,(PJRST) ;LH
|
||
HRR T2,CHGTAB(T1) ;GET SUBROUTINE FOR TYPEOUT
|
||
MOVEM T2,CHGTYO ;SAVE IT
|
||
JRST DEFI.2
|
||
|
||
KEYS (CHG,<DECIMAL,OCTAL,SIXBIT>)
|
||
CHGTAB: EXP .TDECW##,.TOCTW##,.TSIXN##
|
||
|
||
DEFI.2: $PARSE (SIX,YNA,<Record mapper runtime>,NO,,,<
|
||
MAP, the page mapping subroutine package, has the ability to
|
||
keep track of it's own runtime. The accumulated runtime is made
|
||
available to WHO for displaying the mapper performance when the
|
||
/MPERFORMANCE switch is used. Answering "YES" to this question
|
||
will cause two RUNTIM UUOs to be executed on each call to the
|
||
mapper. Doing this could possibly cause excessive overhead.
|
||
>)
|
||
HRRZS T1 ;GET JUST KEYWORD ADDRESS
|
||
SUBI T1,YNA.T ;NO INDEX INTO TABLE
|
||
MOVEM T1,MAPRTM## ;SAVE 0 (NO) OR 1 (YES)
|
||
|
||
DEFI.3:
|
||
DEFU.0: MOVE T1,DEFUSR ;GET DEFAULT FLAG
|
||
MOVEM T1,DEFFLG ;SET IT
|
||
JUMPN T1,DEFU.1 ;DEFAULTING?
|
||
PUSHJ P,.TCRLF## ;CRLF TO START THINGS OFF
|
||
MOVEI T1,[ASCIZ | User interface parameters|]
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
PUSHJ P,.TCRLF## ;CRLF
|
||
PUSHJ P,.TCRLF## ;ONE MORE
|
||
|
||
DEFU.1:
|
||
IFN FTSERV,<
|
||
$PARSE (SIX,YNA,</SERVER legal when logged out>,NO,,,<
|
||
The /SERVER switch allows access to remote WHO servers. In some
|
||
network environments, this could incure a substantial amount of
|
||
runtime and tie up remote server tasks for extended periods of
|
||
time.
|
||
>)
|
||
HRRZS T1 ;GET JUST KEYWORD ADDRESS
|
||
SUBI T1,YNA.T ;NO INDEX INTO TABLE
|
||
MOVEM T1,SRVLGO## ;SAVE 0 (NO) OR 1 (YES)
|
||
> ;END IFN FTSERV
|
||
|
||
DEFU.3: POPJ P, ;RETURN
|
||
SUBTTL Parser logic -- Entry point
|
||
|
||
|
||
PARSER: MOVE P1,T1 ;COPY POINTER TO DATA BLOCK
|
||
MOVE T1,HLPLVL ;GET HELP LEVEL
|
||
MOVEM T1,HLPPRS ;SET PARSER COPY
|
||
|
||
PARS.0: PUSHJ P,.CLRFL## ;CLEAR STICKY DEFAULTS
|
||
SKIPE DEFFLG ;DEFAULTING?
|
||
JRST PARS.5 ;YES--DON'T ASK QUESTION
|
||
MOVE T1,HLPPRS ;TYPE OF HELP
|
||
CAIE T1,PMTLONG ;WANT HELP TEXT TOO?
|
||
JRST PARS.Y ;NO
|
||
MOVE T1,.PBHLP(P1) ;POINT TO TEXT
|
||
PUSHJ P,.TSTRG## ;TYPE HELP
|
||
|
||
PARS.Y: MOVE T1,.PBPMT(P1) ;POINT TO PROMPT
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVE T1,HLPPRS ;TYPE OF HELP
|
||
CAIE T1,PMTSHORT ;/HELP:SHORT?
|
||
PUSHJ P,@.PBTYA(P1) ;TYPE ARGUMENT
|
||
MOVE T1,HLPPRS ;GET HELP LEVEL
|
||
CAIGE T1,PMTPROMPT ;/HELP:PROMPT OR /HELP:LONG?
|
||
JRST PARS.X ;NO
|
||
PUSHJ P,.TSPAC## ;SPACE OVER
|
||
MOVEI T1,"[" ;START OF DEFAULT RESPONSE
|
||
PUSHJ P,.TCHAR## ;TYPE BRACKET
|
||
XCT .PBDEF(P1) ;GET DEFAULT RESPONSE
|
||
PUSHJ P,@.PBTYO(P1) ;TYPE IT
|
||
MOVEI T1,"]" ;END OF DEFAULT RESPONSE
|
||
PUSHJ P,.TCHAR## ;TYPE BRACKET
|
||
|
||
PARS.X: PUSHJ P,.TCOLN## ;PROMPT WITH A COLON
|
||
PUSHJ P,.TSPAC## ;AND A SPACE
|
||
SETZ T1, ;NO ARGUMENTS
|
||
PUSHJ P,.PSCAN## ;SET UP THE SCANNER
|
||
JFCL ;IGNORE SCAN'S CONFUSION
|
||
|
||
PARS.1: PUSHJ P,.TIALT## ;GET A CHARACTER
|
||
CAIE C,.CHTAB ;TAB?
|
||
CAIN C," " ;SPACE?
|
||
JRST PARS.1 ;IGNORE IT
|
||
CAIN C,"/" ;A SWITCH (WANTS HELP)?
|
||
JRST PARS.2 ;YES
|
||
CAIN C,.CHALX ;SOME FLAVOR OF ALTMODE?
|
||
JRST WHOONC ;YES--RESTART DIALOG
|
||
CAMN C,[.CHEOF] ;EOF?
|
||
JRST PARS.4 ;YES--GO STOP
|
||
JUMPL C,PARS.5 ;DEFAULTING?
|
||
PUSHJ P,.REEAT## ;RE-EAT THE LAST CHARACTER
|
||
PUSHJ P,@.PBTYI(P1) ;GET A RESPONSE
|
||
JFCL ;INCASE SKIP RETURN
|
||
JUMPGE C,E.INCL## ;JUNK ON LINE?
|
||
XCT .PBRSP(P1) ;GET RESPONSE
|
||
JRST PARS.6 ;RETURN
|
||
|
||
PARS.2: PUSHJ P,.SIXSW## ;GET A SIXBIT WORD
|
||
MOVE T1,[IOWD 1,['HELP ']] ;IOWD POINTER TO "HELP"
|
||
PUSHJ P,.NAME## ;SEE WHAT TYPED
|
||
$WARN (UST,<Unknown switch typed>,)
|
||
AOS T1,HLPPRS ;WANT IT?
|
||
CAILE T1,PMTLONG ;OUT OF RANGE?
|
||
MOVEI T1,PMTLONG ;YES
|
||
MOVEM T1,HLPPRS ;RESET VALUE
|
||
JRST PARS.0 ;GO BACK AND TRY AGAIN
|
||
|
||
PARS.4: PUSHJ P,.ALDON## ;CLEAR EOF, EXIT
|
||
JRST WHOONC ;THE FOOL TYPED CONTINUE
|
||
|
||
PARS.5: XCT .PBDEF(P1) ;GET DEFAULT
|
||
|
||
PARS.6: MOVEM T1,ANSWER ;SAVE ANSWER
|
||
PUSHJ P,@.PBCHK(P1) ;CHECK THE RESPONSE
|
||
JRST PARS.0 ;NO GOOD--TRY AGAIN
|
||
JRST .PBLEN(P1) ;RETURN
|
||
SUBTTL Parser logic -- Option typeout
|
||
|
||
|
||
; Numeric range
|
||
NUMARG: PUSHJ P,.TSPAC## ;SPACE
|
||
PUSHJ P,.TLPRN## ;START OF RANGE
|
||
HLRE T1,.PBARG(P1) ;GET LOW
|
||
PUSHJ P,@.PBTYO(P1) ;TYPE IT
|
||
MOVEI T1,[ASCIZ | to |] ;GET SEPARATOR
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
HRRE T1,.PBARG(P1) ;GET HIGH
|
||
PUSHJ P,@.PBTYO(P1) ;TYPE IT
|
||
PJRST .TRPRN## ;TYPE END OF RANGE AND RETURN
|
||
|
||
; List typeout
|
||
LSTARG: PUSHJ P,.TSPAC## ;SPACE
|
||
MOVE P2,.PBARG(P1) ;GET IOWD TO LIST OF ITEMS
|
||
SKIPA T1,["("] ;START OF LIST
|
||
|
||
LSTA.1: MOVEI T1,"," ;SEPARATOR
|
||
PUSHJ P,.TCHAR## ;TYPE IT
|
||
MOVE T1,1(P2) ;GET AN ITEM
|
||
PUSHJ P,@.PBTYO(P1) ;TYPE ITEM IN LIST
|
||
AOBJN P2,LSTA.1 ;LOOP THROUGH LIST
|
||
PJRST .TRPRN## ;TYPE END OF LIST AND RETURN
|
||
SUBTTL Parser logic -- Argument checking
|
||
|
||
|
||
; Numeric
|
||
NUMCHK: HLRE T2,.PBARG(P1) ;GET LOW
|
||
HRRE T3,.PBARG(P1) ;GET HIGH
|
||
CAML T1,T2 ;RANGE
|
||
CAMLE T1,T3 ; CHECK
|
||
SKIPA ;OUT OF RANGE
|
||
JRST .POPJ1## ;NUMBER CHECKS OUT OK
|
||
$FATAL (NOR,<Number >,E.NOR)
|
||
POPJ P, ;RETURN
|
||
|
||
E.NOR: PUSHJ P,@.PBTYO(P1) ;TYPE NUMBER
|
||
MOVEI T1,[ASCIZ | outside the range |]
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
HLRE T1,.PBARG(P1) ;GET LOW
|
||
PUSHJ P,@.PBTYO(P1) ;TYPE IT
|
||
MOVEI T1,[ASCIZ | to |] ;MORE
|
||
PUSHJ P,.TSTRG## ; TEXT
|
||
HRRE T1,.PBARG(P1) ;GET HIGH
|
||
PJRST @.PBTYO(P1) ;TYPE IT AND RETURN
|
||
|
||
|
||
; Sixbit
|
||
SIXCHK: MOVE T1,.PBARG(P1) ;GET IOWD TO TABLE
|
||
MOVE N,ANSWER ;PUT WHERE SCAN EXPECTS IT
|
||
PUSHJ P,.NAME## ;SEE IF A MATCH
|
||
SKIPA ;NO GOOD
|
||
JRST .POPJ1## ;RETURN
|
||
SKIPG T1 ;UNKNOWN?
|
||
$FATAL (UNK,<Unknown keyword ">,E.SIX)
|
||
SKIPL T1 ;AMBIGUOUS?
|
||
$FATAL (AMB,<Ambiguous keyword ">,E.SIX)
|
||
POPJ P, ;RETURN
|
||
|
||
E.SIX: PUSH P,T1 ;SAVE T1
|
||
MOVE T1,N ;GET KEYWORD
|
||
PUSHJ P,.TSIXN## ;TYPE IT
|
||
MOVEI T1,"""" ;TERMINATING QUOTE
|
||
PUSHJ P,.TCHAR## ;TYPE IT
|
||
POP P,T1 ;RESTORE T1
|
||
POPJ P, ;AND RETURN
|
||
|
||
|
||
; Filespec
|
||
FILCHK: SKIPN T1,.MYPPN## ;HAVE OUR PPN YET?
|
||
GETPPN T1, ;NO--GET IT NOW
|
||
JFCL ;INCASE OF JACCT
|
||
MOVEM T1,.MYPPN## ;SAVE FOR LATER
|
||
XCT .PBRSP(P1) ;POINT TO STORAGE
|
||
HRLZ T2,T1 ;GET START ADDRESS
|
||
HRRI T2,1(T1) ;MAKE A BLT POINTER
|
||
HRRZ T3,T1 ;GET SCAN BLOCK ADDRESS
|
||
SETZM (T3) ;CLEAR FIRST WORD
|
||
BLT T2,.FXLEN-1(T3) ;CLEAR OUT SCAN BLOCK
|
||
PUSHJ P,.GTSPC## ;GET FILESPEC
|
||
XCT .PBDEF(P1) ;GET DEFAULT
|
||
MOVE T2,T1 ;PUT IN T2
|
||
MOVE T1,.PBARG(P1) ;POINT TO ANSWER
|
||
|
||
MOVE T3,.FXDEV(T2) ;GET DEFAULT DEVICE
|
||
MOVX T4,FX.NDV ;GET NULL DEVICE FLAG
|
||
TDNE T4,.FXMOD(T1) ;HAVE ONE?
|
||
MOVEM T3,.FXDEV(T1) ;NO
|
||
|
||
DMOVE T3,.FXNAM(T2) ;GET DEFAULT FILE NAME AND MASK
|
||
SKIPN .FXNAM(T1) ;HAVE ONE?
|
||
DMOVEM T3,.FXNAM(T1) ;NO
|
||
|
||
MOVE T3,.FXEXT(T2) ;GET DEFAULT EXTENSION AND MASK
|
||
SKIPN .FXEXT(T1) ;HAVE ONE?
|
||
MOVEM T3,.FXEXT(T1) ;NO
|
||
|
||
MOVX T3,FX.DIR ;GET DIRECTORY SPECIFIED FLAG
|
||
TDNN T3,.FXMOM(T1) ;HAVE ONE?
|
||
JRST FILC.1 ;NO--GO LOAD FROM DEFAULT SCAN BLOCK
|
||
TDNE T3,.FXMOD(T1) ;WAS IT [-]?
|
||
SKIPE .FXDIR(T1) ;CHECK FOR [,]
|
||
JRST FILC.3 ;WANTS TO USE DEFAULT PATH
|
||
MOVE T3,.MYPPN## ;GET OUR PPN
|
||
MOVEM T3,.FXDIR(T1) ;SET OUR PPN
|
||
SETOM .FXDIM(T1) ; AND MASK TOO
|
||
JRST FILC.3 ;DONE
|
||
|
||
FILC.1: MOVSI T3,-.FXLND ;SET UP -LENGTH,,0
|
||
|
||
FILC.2: MOVE T4,.FXDIR(T2) ;GET A PPN OR SFD
|
||
MOVEM T4,.FXDIR(T1) ;DEFAULT IT
|
||
MOVE T4,.FXDIM(T2) ;GET MASK
|
||
MOVEM T4,.FXDIM(T1) ;DEFAULT IT TOO
|
||
ADDI T1,1 ;POINT TO NEXT STORAGE
|
||
ADDI T2,1 ;POINT TO NEXT DEFAULT
|
||
AOBJN T3,FILC.2 ;LOOP
|
||
|
||
FILC.3: JRST .POPJ1## ;AND RETURN
|
||
SUBTTL Parser logic -- Common tables
|
||
|
||
|
||
; YES/NO answer table
|
||
KEYS (YNA,<NO,YES>)
|
||
; Read the monitor's bootstrap file spec
|
||
BOOTS: MOVE T1,[POINT 7,CRSFIL##] ;POINT TO THE ASCIZ FILESPEC STORAGE
|
||
MOVEM T1,BYTPTR ;SAVE IT
|
||
MOVEI T1,<FILWDS*5>-1 ;GET BYTE COUNT
|
||
MOVEM T1,BYTCNT ;SAVE IT
|
||
MOVEI T1,BTSTYO ;POINT TO CHARACTER STICKER
|
||
PUSHJ P,.TYOCH## ;TELL SCAN ABOUT THE CHANGE
|
||
PUSH P,T1 ;SAVE OLD TYPER
|
||
|
||
SETOM MONSCB+.FXNMM ;MASK FOR FILE NAME
|
||
HLLOS MONSCB+.FXEXT ;MASK FOR EXTENSION
|
||
SETOM MONSCB+.FXDIM+0 ;MASK FOR SFD #1
|
||
SETOM MONSCB+.FXDIM+2 ;MASK FOR SFD #2
|
||
SETOM MONSCB+.FXDIM+4 ;MASK FOR SFD #3
|
||
SETOM MONSCB+.FXDIM+6 ;MASK FOR SFD #4
|
||
SETOM MONSCB+.FXDIM+10 ;MASK FOR SFD #5
|
||
|
||
MOVEI T1,MONSCB ;POINT TO THE SCAN BLOCK
|
||
PUSHJ P,.TFBLK## ;CONVERT TO ASCII
|
||
POP P,T1 ;GET OLD CHARACTER STICKER
|
||
PJRST .TYOCH## ;RESET INSIDE SCAN
|
||
|
||
BTSTYO: SOSLE BYTCNT ;COUNT
|
||
IDPB T1,BYTPTR ;SAVE CHARACTER
|
||
POPJ P, ;RETURN
|
||
SUBTTL Symbol table routines -- SYMLOD - Load symbols
|
||
|
||
SYMLOD: $INFO (LSF,<Loading symbols from file: >,E.LSF)
|
||
$INFO (MON,<Monitor is ">,E.MON)
|
||
MOVEI T1,.JBSYM ;POINTER TO THE SYMBOL TABLE
|
||
PUSHJ P,.MAPE## ;FIND IT
|
||
PJRST MAPSTP## ;UNRECOVERABLE MAPPING ERROR
|
||
JUMPGE T1,SYML.1 ;IF .GT. THEN VECTOR POINTER
|
||
HRRZ P2,T1 ;ADDRESS OF SYMBOL TABLE
|
||
HLRE P1,T1 ;NEGATIVE SYMBOL TABLE LENGTH
|
||
MOVM P1,P1 ;POSITIVE SYMBOL TABLE LENGTH
|
||
JRST SYML.4 ;SETUP FOR SYMBOL TABLE SEARCH
|
||
|
||
|
||
;Here to handle extended-addressing symbol table vector
|
||
|
||
SYML.1: SKIPN P4,T1 ;REMEMBER BASE ADDRESS OF VECTOR
|
||
POPJ P, ;NO SYMBOL TABLE POINTER . . .
|
||
PUSHJ P,.MAPE## ;GET SYM VECTOR LENGTH
|
||
PJRST MAPSTP## ;SO MUCH FOR THE SYMBOL TABLE
|
||
IDIVI T1,3 ;REDUCE TO COUNT OF SUB-TABLES
|
||
SKIPG P3,T1 ;REMEMBER THIS COUNT ALSO
|
||
POPJ P, ;NO SYMBOL TABLE
|
||
ADDI P4,.SYSTB ;OFFSET TO FIRST VECTOR SUBTABLE
|
||
|
||
;Loop over symtab vector subtable entries looking for "main" symbol table
|
||
|
||
SYML.2: MOVE T1,P4 ;ADDRESS OF NEXT SUBTABLE
|
||
.CREF .SYTYP ;TYPE-AND-LENGTH-WORD OFFSET
|
||
PUSHJ P,.MAPE## ;EXTRACT FLAGS + LENGTH
|
||
PJRST MAPSTP## ;BAD VECTOR SUBTABLE
|
||
LDB T2,[POINTR T1,SY.TYP] ;EXTRACT THIS SUBTABLE "TYPE"
|
||
CAIN T2,.SYR5D ;RADIX-50 "MAIN" SYMBOL TABLE?
|
||
JRST SYML.3 ;YES, THIS IS WHAT WE WANT
|
||
ADDI P4,.SYSTL ;NO, ADVANCE TO NEXT SUBTABLE ADDRESS
|
||
SOJG P3,SYML.2 ;CHECK OUT NEXT SUBTABLE
|
||
POPJ P, ;NO SYMBOL TABLE AFTER ALL
|
||
|
||
SYML.3: ANDX T1,SY.LEN ;REDUCE TO LENGTH
|
||
MOVE P1,T1 ;AND REMEMBER LENGTH
|
||
AOS T1,P4 ;ADDRESS OF SYMBOL TABLE ADDRESS
|
||
.CREF .SYADR ;SYMBOL-TABLE-ADDRESS OFFSET
|
||
PUSHJ P,.MAPE## ;GET IT
|
||
PJRST MAPSTP## ;BAD VECTOR SUBTABLE
|
||
TLNE T1,(1B0) ;SECTION-LOCAL POINTER?
|
||
HLL T1,P4 ;YES, SET SECTION ADDRESS
|
||
MOVE P2,T1 ;AND REMEMBER SYMBOL TABLE ADDRESS
|
||
SYML.4: TRNE P1,1 ;LENGTH MUST BE MODULO-2
|
||
JRST MAPSTP## ;BUMMER
|
||
LSH P1,-1 ;COUNT OF SYMBOL TABLE ENTRIES
|
||
SOJA P2,SYML.5 ;GO SEARCH SYMBOL TABLE
|
||
;Loop over symbol table, extracting desired symbols/values
|
||
|
||
SYML.5: MOVEI T1,SYMLEN ;GET NUMBER OF NEEDED SYMBOLS
|
||
CAMN T1,FOUND ;HAVE THEM ALL?
|
||
POPJ P, ;YES--RETURN
|
||
AOS T1,P2 ;GET SYMBOL
|
||
PUSHJ P,.MAPE## ; NAME ADDRESS
|
||
PJRST MAPSTP## ;UNRECOVERABLE MAPPING ERROR
|
||
TLZ T1,(74B5) ;CLEAR OUT FLAGS
|
||
MOVE P3,T1 ;HANG ONTO SYMBOL NAME
|
||
AOS T1,P2 ;GET SYMBOL VALUE ADDRESS
|
||
PUSHJ P,.MAPE## ; VALUE ADDRESS
|
||
PJRST MAPSTP## ;UNRECOVERABLE MAPPING ERROR
|
||
|
||
;Check this symbol to see if we want its value
|
||
|
||
MOVSI T4,-SYMLEN ;-NUMBER OF NEEDED SYMBOLS
|
||
SYML.6: CAME P3,SYMTAB(T4) ;A MATCH?
|
||
AOBJN T4,SYML.6 ;KEEP LOOKING
|
||
JUMPGE T4,SYML.8 ;DON'T NEED THIS SYMBOL
|
||
SKIPE T3,REFTAB(T4) ;GET REFERENCE COUNT
|
||
CAIE T3,1 ;JUST ONE MATCH?
|
||
SETCAM T1,VALTAB(T4) ;MAKE SURE WE STORE THIS VALUE
|
||
CAMN T1,VALTAB(T4) ;NEW VALUE SAME AS OLD VALUE?
|
||
JRST SYML.8 ;DON'T CALL THIS MULTIPLY DEFINED
|
||
MOVEM T1,VALTAB(T4) ;SAVE VALUE AWAY
|
||
AOS T3,REFTAB(T4) ;COUNT THE REFERNCE
|
||
CAIN T3,1 ;MULTIPLY DEFINED SYMBOLS TWICE?
|
||
AOS FOUND ;NO--ADD TO THE NUMBER OF SYMBOLS FOUND
|
||
|
||
SYML.8: SOJG P1,SYML.5 ;LOOP THROUGH SYMBOL TABLE
|
||
POPJ P, ;RETURN
|
||
SUBTTL Symbol table routines -- SYMCHK - Check extracted symbols
|
||
|
||
|
||
SYMCHK: MOVEI P1,SYMLEN ;GET NUMBER OF NEEDED SYMBOLS
|
||
MOVEM P1,SYMREQ ;SAVE IT
|
||
MOVSI P1,-SYMLEN ;-NUMBER OF NEEDED SYMBOLS
|
||
SETZ P2, ;CLEAR NUMBER OF ERRORS
|
||
|
||
SYMC.1: MOVE T1,REFTAB(P1) ;FIND THIS SYMBOL?
|
||
SOJE T1,SYMC.4 ;JUMP IF EXACTLY ONE MATCH
|
||
JUMPG T1,SYMC.3 ;JUMP IF MULTIPLY DEFINED
|
||
SKIPN T1,FLGTAB(P1) ;GET FLAGS
|
||
JRST SYMC.2 ;SYMBOL IS REQUIRED IF NO FLAGS
|
||
TDNN T1,F ;IS THIS FEATURE IN THE MONITOR?
|
||
SOSA SYMREQ ;ADJUST REQUIRED NUMBER
|
||
|
||
SYMC.2: $WARN (UDS,<Undefined>,E.SYM) ;NOT A FEATURE DEPENDENT SYMBOL
|
||
JRST SYMC.4 ;ONWARD
|
||
|
||
SYMC.3: $WARN (MDS,<Multiply defined>,E.SYM)
|
||
|
||
SYMC.4: AOBJN P1,SYMC.1 ;LOOP
|
||
MOVE T1,M.CPU ;GET COUNT OF CPUS
|
||
CAIG T1,1 ;HAVE MORE THAN ONE?
|
||
TLZA F,(FL.SMP) ;NO--TURN OFF SMP SUPPORT
|
||
TLO F,(FL.SMP) ;TURN ON SMP
|
||
|
||
SYMC.X: $INFO (NSL,<>,E.NSL) ;TYPE SUMMARY
|
||
POPJ P, ;RETURN
|
||
E.LSF: MOVE T1,MAPPTR## ;GET POINTER TO RETURNED DATA BLOCK
|
||
MOVEI T1,.MPAFS##(T1) ;POINT TO THE FILESPEC
|
||
PJRST .TSTRG## ;TYPE IT AND RETURN
|
||
|
||
E.MON: MOVEI P1,MONTAB ;POINT TO TABLE
|
||
PUSHJ P,GTBS ;GET MONITOR NAME, BUILD DATE, VERSION
|
||
MOVEI T1,MONNAM ;POINT TO MONITOR'S NAME
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVEI T1,[ASCIZ |", built on |];GET TEXT
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVEI T1,MONDAT ;POINT TO DATE
|
||
PJRST .TSTRG## ;TYPE IT AND RETURN
|
||
|
||
E.NSL: MOVE T1,FOUND ;GET SYMBOLS FOUND
|
||
PUSHJ P,.TDECW## ;TYPE IT
|
||
MOVE T1,FOUND ;GET COUNT AGAIN
|
||
CAMN T1,SYMREQ ;GOT ALL WE NEED?
|
||
JRST E.NSL1 ;YES
|
||
MOVEI T1,[ASCIZ | symbols loaded out of |]
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
MOVE T1,SYMREQ ;GET NUMBER NEEDED
|
||
PUSHJ P,.TDECW## ;TYPE IT
|
||
JRST E.NSL2 ;ONWARD
|
||
|
||
E.NSL1: MOVEI T1,[ASCIZ | symbols loaded|] ;ASSUME NO PROBLEMS
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
JUMPE P2,.POPJ## ;RETURN IF NO ERRORS
|
||
|
||
E.NSL2: MOVEI T1,[ASCIZ |; |] ;POINT TO TEXT
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVE T1,P2 ;GET COUNT OF ERRORS
|
||
MOVEI T2,[ASCIZ |error|] ;GET TEXT
|
||
PUSHJ P,.TPLRS## ;TYPE IT
|
||
MOVEI T1,[ASCIZ | detected|] ;GET FINAL TEXT
|
||
PJRST .TSTRG## ;TYPE IT AND RETURN
|
||
|
||
E.SYM: AOS P2 ;COUNT THE ERROR
|
||
MOVEI T1,[ASCIZ | symbol |] ;GET TEXT
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVE T1,SYMTAB(P1) ;GET SYMBOL NAME
|
||
|
||
TRDX50: IDIVI T1,50 ;DIVIDE BY RADIX
|
||
PUSH P,T2 ;SAVE REMAINDER
|
||
SKIPE T1 ;DONE?
|
||
PUSHJ P,TRDX50 ;NO--RECURSE
|
||
POP P,T1 ;GET CHARACTER BACK
|
||
JUMPE T1,.TSPAC## ;SHOW EMBEBDED SPACES
|
||
ADDI T1,260-1
|
||
CAILE T1,271
|
||
ADDI T1,301-272
|
||
CAILE T1,332
|
||
SUBI T1,334-244
|
||
CAIN T1,243
|
||
MOVEI T1,256
|
||
PJRST .TCHAR## ;TYPE CHARACTER AND RETURN
|
||
; Macro to build parallel tables of monitor symbol names and values
|
||
DEFINE SYMS,<
|
||
|
||
; Feature , Name , Flag
|
||
SYMBOL 1 ,ACCADT ,
|
||
SYMBOL 1 ,ACCALC ,
|
||
SYMBOL 1 ,ACCCNT ,
|
||
SYMBOL 1 ,ACCDEL ,
|
||
SYMBOL 1 ,ACCPPB ,
|
||
SYMBOL 1 ,ACCPRV ,
|
||
SYMBOL 1 ,ACCSTS ,
|
||
SYMBOL 1 ,ACCWRT ,
|
||
SYMBOL 1 ,ACPDEL ,
|
||
SYMBOL 1 ,ACMCNT ,
|
||
SYMBOL 1 ,ACPCNT ,
|
||
SYMBOL 1 ,ACPSMU ,
|
||
SYMBOL 1 ,ASSCON ,
|
||
SYMBOL 1 ,ASSPRG ,
|
||
SYMBOL 1 ,CHNQUL ,
|
||
SYMBOL 1 ,CHYSCN ,
|
||
SYMBOL 1 ,CORXTR ,
|
||
SYMBOL 1 ,DEVCHR ,
|
||
SYMBOL 1 ,DEVEXT ,
|
||
SYMBOL 1 ,DEVFIL ,
|
||
SYMBOL 1 ,DEVHCW ,
|
||
SYMBOL 1 ,DEVIOS ,
|
||
SYMBOL 1 ,DEVJOB ,
|
||
SYMBOL 1 ,DEVLOG ,
|
||
SYMBOL 1 ,DEVMOD ,
|
||
SYMBOL 1 ,DEVNAM ,
|
||
SYMBOL 1 ,DEVNET ,FL.ANF10
|
||
SYMBOL 1 ,DEVNPD ,FL.ANF10
|
||
SYMBOL 1 ,DEVPPN ,
|
||
SYMBOL 1 ,DEVREL ,
|
||
SYMBOL 1 ,DEVSER ,
|
||
SYMBOL 1 ,DEVSPL ,
|
||
SYMBOL 1 ,DIFNAL ,
|
||
SYMBOL 1 ,DSCHWC ,
|
||
SYMBOL 1 ,DVCNET ,
|
||
SYMBOL 1 ,ENTRB ,
|
||
SYMBOL 1 ,EV.D60 ,
|
||
SYMBOL 1 ,EV.DCN ,
|
||
SYMBOL 1 ,EV.DMR ,
|
||
SYMBOL 1 ,EV.DTE ,
|
||
SYMBOL 1 ,EV.FEI ,
|
||
SYMBOL 1 ,EV.FEO ,
|
||
SYMBOL 1 ,EV.IPC ,
|
||
SYMBOL 1 ,EV.KDP ,
|
||
SYMBOL 1 ,EV.LBL ,
|
||
SYMBOL 1 ,EV.NET ,
|
||
SYMBOL 1 ,EV.NTC ,
|
||
SYMBOL 1 ,EV.REW ,
|
||
SYMBOL 1 ,EV.STC ,
|
||
SYMBOL 1 ,EV.TKW ,
|
||
SYMBOL 1 ,FS.BMK ,
|
||
SYMBOL 1 ,FS.NMK ,
|
||
SYMBOL 1 ,IBLK ,
|
||
SYMBOL 1 ,IBUFB ,
|
||
SYMBOL 1 ,ICLOSB ,
|
||
SYMBOL 1 ,INBFB ,
|
||
SYMBOL 1 ,INPB ,
|
||
SYMBOL 1 ,IO ,
|
||
SYMBOL 1 ,IOSUPR ,
|
||
SYMBOL 1 ,JBPSCN ,
|
||
SYMBOL 1 ,JBPSYS ,
|
||
SYMBOL 1 ,JBPUFB ,
|
||
SYMBOL 1 ,JBPXSY ,
|
||
SYMBOL 1 ,KDBCAM ,
|
||
SYMBOL 1 ,LDBDDB ,
|
||
SYMBOL 1 ,LDBECC ,
|
||
SYMBOL 1 ,LDBHPS ,
|
||
SYMBOL 1 ,LDBMIC ,
|
||
SYMBOL 1 ,LDBNRT ,FL.DECNET
|
||
SYMBOL 1 ,LDBPAG ,
|
||
SYMBOL 1 ,LDBREM ,
|
||
SYMBOL 1 ,LDBTIC ,
|
||
SYMBOL 1 ,LDBTTW ,
|
||
SYMBOL 1 ,LDPBKA ,
|
||
SYMBOL 1 ,LDPECH ,
|
||
SYMBOL 1 ,LDPFCS ,
|
||
SYMBOL 1 ,LDPLNB ,
|
||
SYMBOL 1 ,LDPLNC ,
|
||
SYMBOL 1 ,LDPNRT ,FL.DECNET
|
||
SYMBOL 1 ,LDPOSU ,
|
||
SYMBOL 1 ,LDPSTB ,
|
||
SYMBOL 1 ,LDPSTC ,
|
||
SYMBOL 1 ,LDPSTP ,
|
||
SYMBOL 1 ,LDPTTT ,
|
||
SYMBOL 1 ,LDPWID ,
|
||
SYMBOL 1 ,LD.CIP ,
|
||
SYMBOL 1 ,LD.MAX ,FL.DECNET
|
||
SYMBOL 1 ,LN.LIB ,
|
||
SYMBOL 1 ,LNPOVR ,
|
||
SYMBOL 1 ,LOOKB ,
|
||
SYMBOL FTLGNQ ,LQ.LDB ,FL.LGNQ
|
||
SYMBOL FTLGNQ ,LQ.PLI ,FL.LGNQ
|
||
SYMBOL 1 ,LRLCON ,
|
||
SYMBOL 1 ,LRLDSR ,
|
||
SYMBOL 1 ,LTLANF ,
|
||
SYMBOL 1 ,LTLUSE ,
|
||
SYMBOL 1 ,M.CPU ,
|
||
SYMBOL 1 ,NMBACC ,
|
||
SYMBOL 1 ,NMBNAM ,
|
||
SYMBOL 1 ,NMBPPB ,
|
||
SYMBOL 1 ,NMPUPT ,
|
||
SYMBOL 1 ,NN.DLY ,FL.DECNET
|
||
SYMBOL 1 ,NN.LKC ,FL.DECNET
|
||
SYMBOL 1 ,NN.NXT ,FL.DECNET
|
||
SYMBOL 1 ,NR.CHN ,FL.DECNET
|
||
SYMBOL 1 ,NPDNAM ,
|
||
SYMBOL 1 ,NPDNLN ,
|
||
SYMBOL 1 ,NPDNOD ,
|
||
SYMBOL 1 ,NT%DLA ,FL.ANF10
|
||
SYMBOL 1 ,NT%SLA ,FL.ANF10
|
||
SYMBOL 1 ,OBLK ,
|
||
SYMBOL 1 ,OBUFB ,
|
||
SYMBOL 1 ,OCLOSB ,
|
||
SYMBOL 1 ,OUTBFB ,
|
||
SYMBOL 1 ,OUTPB ,
|
||
SYMBOL 1 ,PPBNAM ,
|
||
SYMBOL 1 ,RC.LID ,FL.DECNET
|
||
SYMBOL 1 ,RNLCL ,FL.DECNET
|
||
SYMBOL 1 ,RNRCH ,FL.DECNET
|
||
SYMBOL 1 ,SP.CJA ,FL.SMP
|
||
SYMBOL 1 ,STPPVS ,
|
||
SYMBOL 1 ,STRBSC ,
|
||
SYMBOL 1 ,STRJOB ,
|
||
SYMBOL 1 ,STRMNT ,
|
||
SYMBOL 1 ,STRNAM ,
|
||
SYMBOL 1 ,STRPPN ,
|
||
SYMBOL 1 ,STRPVS ,
|
||
SYMBOL 1 ,STRTAL ,
|
||
SYMBOL 1 ,STRUNI ,
|
||
SYMBOL 1 ,TDVSTS ,
|
||
SYMBOL 1 ,TDVUDB ,
|
||
SYMBOL 1 ,TKSOFL ,
|
||
SYMBOL 1 ,TKSSEL ,
|
||
SYMBOL 1 ,TKSSTD ,
|
||
SYMBOL 1 ,TOP.RT ,
|
||
SYMBOL 1 ,TTYOUW ,
|
||
SYMBOL 1 ,TUBCNF ,
|
||
SYMBOL 1 ,TUBFIL ,
|
||
SYMBOL 1 ,TUBLBL ,
|
||
SYMBOL 1 ,TUBREC ,
|
||
SYMBOL 1 ,TUBRID ,
|
||
SYMBOL 1 ,TUBSTS ,
|
||
SYMBOL 1 ,TUSBOT ,
|
||
SYMBOL 1 ,TUSNS ,
|
||
SYMBOL 1 ,TUSREW ,
|
||
SYMBOL 1 ,TUSWTL ,
|
||
SYMBOL 1 ,UDBNAM ,
|
||
SYMBOL 1 ,UDBPDN ,
|
||
SYMBOL 1 ,UNI2ND ,
|
||
SYMBOL 1 ,UNIALT ,
|
||
SYMBOL 1 ,UNIBPM ,
|
||
SYMBOL 1 ,UNIBPU ,
|
||
SYMBOL 1 ,UNIBRC ,
|
||
SYMBOL 1 ,UNIBUC ,
|
||
SYMBOL 1 ,UNIBWC ,
|
||
SYMBOL 1 ,UNICBK ,
|
||
SYMBOL 1 ,UNICHN ,
|
||
SYMBOL 1 ,UNICHR ,
|
||
SYMBOL 1 ,UNICRC ,
|
||
SYMBOL 1 ,UNICRH ,
|
||
SYMBOL 1 ,UNICWC ,
|
||
SYMBOL 1 ,UNICWH ,
|
||
SYMBOL 1 ,UNICYL ,
|
||
SYMBOL 1 ,UNIDRC ,
|
||
SYMBOL 1 ,UNIDWC ,
|
||
SYMBOL 1 ,UNIHID ,
|
||
SYMBOL 1 ,UNIKON ,
|
||
SYMBOL 1 ,UNILOG ,
|
||
SYMBOL 1 ,UNIMRC ,
|
||
SYMBOL 1 ,UNIMWC ,
|
||
SYMBOL 1 ,UNIMSC ,
|
||
SYMBOL 1 ,UNIQUL ,
|
||
SYMBOL 1 ,UNISTR ,
|
||
SYMBOL 1 ,UNITAL ,
|
||
SYMBOL 1 ,UNIUSC ,
|
||
SYMBOL 1 ,UNIXRA ,
|
||
SYMBOL 1 ,UNYK4S ,
|
||
SYMBOL 1 ,UNYKNM ,
|
||
SYMBOL 1 ,UNYSPU ,
|
||
SYMBOL 1 ,UNYWPS ,
|
||
SYMBOL 1 ,$NNNOD ,FL.DECNET
|
||
SYMBOL 1 ,$SJCHT ,FL.DECNET
|
||
SYMBOL 1 ,$SLDNA ,FL.DECNET
|
||
SYMBOL 1 ,.FSEND ,
|
||
SYMBOL 1 ,.FSFNC ,
|
||
SYMBOL 1 ,.FSMAX ,
|
||
SYMBOL 1 ,.FSMIN ,
|
||
|
||
>
|
||
DEFINE SYMBOL (FET,NAME,FLAG),<IFN FET,<RADIX50 0,NAME>>
|
||
|
||
SYMTAB: SYMS
|
||
SYMLEN==.-SYMTAB
|
||
|
||
|
||
DEFINE SYMBOL (FET,NAME,FLAG),<IFN FET,<EXP 0+FLAG>>
|
||
|
||
FLGTAB: SYMS
|
||
WEHSEG: TDZA T1,T1 ;WRITE LOCK
|
||
WLHSEG: MOVEI T1,1 ;WRITE ENABLE
|
||
SETUWP T1, ;...
|
||
$STOP (HWP,<Cannot set/clear high segment write protect>)
|
||
POPJ P, ;RETURN
|
||
GTBS: SKIPN T1,0(P1) ;GET A GETTAB ARGUMENT
|
||
POPJ P, ;DONE
|
||
PUSHJ P,.MAPG## ;...
|
||
SETZ T1, ;STRANGE MONITOR
|
||
MOVEM T1,@1(P1) ;SAVE A WORD
|
||
ADDI P1,2 ;ACCOUNT FOR TWO WORD ENTRIES
|
||
JRST GTBS ;LOOP
|
||
|
||
|
||
; Monitor name and build date
|
||
MONTAB: EXP %CNFG0,MONNAM+0
|
||
EXP %CNFG1,MONNAM+1
|
||
EXP %CNFG2,MONNAM+2
|
||
EXP %CNFG3,MONNAM+3
|
||
EXP %CNFG4,MONNAM+4
|
||
EXP %CNDT0,MONDAT+0
|
||
EXP %CNDT1,MONDAT+1
|
||
EXP %CNVER,LODONC
|
||
EXP %CNDVN,DECONC
|
||
EXP %CNCVN,CUSONC
|
||
EXP 0 ;TERMINATE LIST
|
||
SUBTTL Set up special high segment data
|
||
|
||
|
||
HIDATA:!
|
||
|
||
; Charge number
|
||
CHGINI: MOVE T1,[.GTCNO,,.GTSLF] ;GETTAB TO GET THE BASE OF THE
|
||
PUSHJ P,.MAPG## ; CHARGE NUMBER TABLE
|
||
MOVEI T1,0 ;NOT THERE
|
||
SKIPN T1 ;HAVE CHARGE NUMBERS?
|
||
TLZA F,(FL.CHARGE) ;NO
|
||
TLO F,(FL.CHARGE) ;YES
|
||
|
||
|
||
; ANF-10 networks
|
||
ANFINI: TLNN F,(FL.ANF10) ;HAVE ANF10 SUPPORT?
|
||
JRST DCNINI ;NO
|
||
|
||
|
||
; DECnet-10 networks
|
||
DCNINI: TLNN F,(FL.DECNET) ;HAVE DECNET SUPPORT?
|
||
JRST LGQINI ;NO
|
||
|
||
|
||
; LOGIN queue
|
||
LGQINI: TLNN F,(FL.LGNQ) ;HAVE LOGIN QUEUE SUPPORT?
|
||
JRST HIDATX ;NO
|
||
IFN FTLGNQ,<
|
||
> ;END IFN FTLGNQ
|
||
|
||
|
||
HIDATX: MOVE T1,F ;COPY FLAGS
|
||
AND T1,[FL.FEATURES] ;KEEP ONLY FEATURE FLAGS
|
||
MOVEM T1,FEATURES ;SAVE FOR RUN TIME
|
||
POPJ P, ;RETURN
|
||
SUBTTL Set up initialization text
|
||
|
||
INISET: MOVE T1,[INITXT##,,INITXT##+1] ;SET UP BLT
|
||
SETZM T1,INITXT## ;CLEAR FIRST WORD
|
||
BLT T1,INITXT##+LN$INI-1 ;CLEAR TEXT BLOCK
|
||
MOVEI T1,INITYO ;POINT TO CHARACTER STICKER
|
||
PUSHJ P,.TYOCH## ;TELL SCAN
|
||
PUSH P,T1 ;SAVE OLD TYPER
|
||
MOVE T1,[POINT 7,$$NAME##] ;BYTE POINTER TO TEXT
|
||
|
||
INIS.1: MOVE T2,T1 ;COPY POINTER
|
||
ILDB T3,T1 ;GET A CHARACTER
|
||
JUMPN T3,INIS.1 ;LOOP 'TILL WE FIND START OF INITXT
|
||
MOVEI T1," " ;GET A SPACE
|
||
|
||
INIS.2: DPB T1,T2 ;STORE A SPACE
|
||
ILDB T3,T2 ;GET NEXT CHARACTER
|
||
JUMPE T3,INIS.2 ;LOOP
|
||
|
||
INIS.3: MOVE T1,[POINT 7,INITXT##] ;BYTE POINTER TO STORAGE
|
||
MOVEM T1,INIPTR ;SAVE IT
|
||
MOVEI T1,<LN$INI*5>-1 ;NUMBER OF CHARACTERS
|
||
MOVEM T1,INICNT ;SAVE IT
|
||
MOVEI T1,[ASCIZ |WHO version |];OUR NAME
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVE T1,.JBVER ;OUR VERSION NUMBER
|
||
PUSHJ P,.TVERW## ;TYPE IT
|
||
MOVEI T1,[ASCIZ | configured on |]
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
PUSHJ P,.TDATN## ;TYPE TODAYS DATE
|
||
PUSHJ P,.TCRLF## ;NEW LINE
|
||
MOVEI T1,[ASCIZ | for TOPS10 version |]
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
MOVE T1,DECONC ;GET VERSION
|
||
PUSHJ P,.TVERW## ;TYPE IT
|
||
SKIPN CUSONC ;HAVE CUSTOMER VERSION?
|
||
JRST INIS.4 ;NO
|
||
MOVEI T1,"/" ;SEPARATOR
|
||
PUSHJ P,.TCHAR## ;TYPE IT
|
||
MOVE T1,CUSONC ;GET CUSTOMER VERSION
|
||
PUSHJ P,.TVERW## ;TYPE IT
|
||
|
||
INIS.4: MOVEI T1,[ASCIZ |, load |] ;GET TEXT
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVE T1,LODONC ;GET LOAD NUMBER
|
||
PUSHJ P,.TOCTW## ;TYPE IT
|
||
PUSHJ P,.TCRLF## ;NEW LINE
|
||
MOVEI T1,[ASCIZ | from file |]
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
MOVE T1,MAPPTR## ;GET POINTER TO RETURNED DATA BLOCK
|
||
MOVEI T1,.MPAFS##(T1) ;POINT TO THE FILESPEC
|
||
PUSHJ P,.TSTRG## ;TYPE FILE SPEC
|
||
PUSHJ P,.TCRLF## ;NEW LINE
|
||
MOVEI T1,[ASCIZ | monitor is "|]
|
||
PUSHJ P,.TSTRG## ;TYPE TEXT
|
||
MOVEI T1,MONNAM ;POINT TO NAME
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVEI T1,[ASCIZ |", built on |];SEPARATOR
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVEI T1,MONDAT ;POINT TO BUILD DATE
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
|
||
INIXIT: POP P,T1 ;RESTORE OLD CHARACTER STICKER
|
||
PJRST .TYOCH## ;TELL SCAN AND RETURN
|
||
|
||
|
||
INITYO: SOSLE INICNT ;COUNT CHARACTERS
|
||
IDPB T1,INIPTR ;STORE BYTE
|
||
POPJ P, ;RETURN
|
||
SUBTTL Save file handlind -- Set up
|
||
|
||
|
||
SAVSET: MOVE T1,[FOPBLK,,FOPBLK+1] ;SET UP BLT
|
||
SETZM FOPBLK ;CLEAR FIRST WORD
|
||
BLT T1,FOPBLK+.FOMAX-1 ;CLEAR ENTIRE BLOCK
|
||
MOVE T1,[FO.PRV!FO.ASC+.FOWRT] ;USE PRIVS/ASSIGN A CHANNEL/WRITE
|
||
MOVEM T1,FOPBLK+.FOFNC ;SAVE FUNCTION WORD
|
||
MOVEI T1,LERBLK ;GET ENTER BLOCK
|
||
MOVEM T1,FOPBLK+.FOLEB ;SAVE ADDR
|
||
MOVE T1,[.PTMAX,,PTHBLK] ;POINT TO RETURNED PATH BLOCK
|
||
MOVEM T1,FOPBLK+.FOPAT ;SAVE ADDR
|
||
MOVE T1,[.FOFMX,,FILBLK] ;POINT TO RETURNED FILESPEC BLOCK
|
||
MOVEM T1,FOPBLK+.FOFSP ;SAVE ADDR
|
||
MOVE T1,[LERBLK,,LERBLK+1] ;SET UP BLT
|
||
SETZM LERBLK ;CLEAR FIRST WORD
|
||
BLT T1,LERBLK+.RBMAX-1 ;CLEAR ENTIRE BLOCK
|
||
MOVEI T1,.RBMAX ;GET BLOCK LENGTH
|
||
MOVEM T1,LERBLK ;SET IT
|
||
MOVEI T1,PTHBLK ;POINT TO PATH BLOCK
|
||
MOVEM T1,LERBLK+.RBPPN ;SET ADDR
|
||
|
||
MOVE T1,[PTHBLK,,PTHBLK+1] ;SET UP BLT
|
||
SETZM PTHBLK ;CLEAR FIRST WORD
|
||
BLT T1,PTHBLK+.PTMAX-1 ;CLEAR ENTIRE BLOCK
|
||
|
||
MOVE T1,[.FXLEN,,SAVSCB] ;LENGTH,,SCAN BLOCK ADDR
|
||
MOVEI T2,FOPBLK+.FOIOS ;OPEN BLOCK
|
||
MOVEI T3,LERBLK ;ENTER BLOCK
|
||
MOVEI T4,PTHBLK ;PATH BLOCK
|
||
PUSHJ P,.STOPB## ;LOAD THE UUO BLOCKS
|
||
JRST SAV.E1 ;PROCESS ERROR
|
||
MOVEI T1,.IODMP ;DUMP MODE
|
||
IORM T1,FOPBLK+.FOIOS ;SET IT
|
||
MOVE T1,[.FOMAX,,FOPBLK] ;POINT TO FILOP BLOCK
|
||
FILOP. T1, ;TRY TO ENTER THE FILE
|
||
JRST SAV.E2 ;CAN'T
|
||
LDB T1,[POINTR (FOPBLK+.FOFNC,FO.CHN)] ;GET RETURNED CHANNEL NUMBER
|
||
RESDV. T1, ;TOSS THE FILE
|
||
JFCL ;...
|
||
SAVS.1: SKIPN T1,FILBLK+.FOFDV ;GET RETURNED DEVICE
|
||
MOVE T1,PTHBLK+.PTSTR ;USE THE ONE FROM PATH BLOCK INSTEAD
|
||
MOVEM T1,SAVBLK+0 ;SAVE IT
|
||
MOVEM T1,SAVSCB+.FXDEV ;HERE TOO
|
||
SKIPN T1,FILBLK+.FOFFN ;GET RETURNED FILE NAME
|
||
MOVE T1,LERBLK+.RBNAM ;USE THE ONE WE GAVE INSTEAD
|
||
MOVEM T1,SAVBLK+1 ;SAVE IT
|
||
MOVEM T1,SAVSCB+.FXNAM ;HERE TOO
|
||
SETOM SAVSCB+.FXNMM ;SET MASK
|
||
HLLZ T1,FILBLK+.FOFEX ;GET RETURNED EXTENSION
|
||
SKIPN T1 ;HAVE ONE?
|
||
HLLZ T1,LERBLK+.RBEXT ;USE THE ONE WE SPECIFIED
|
||
MOVEM T1,SAVBLK+2 ;SAVE IT
|
||
HLLOM T1,SAVSCB+.FXEXT ;HERE TOO
|
||
SKIPN T1,FILBLK+.FOFPP ;GET RETURNED PPN
|
||
MOVE T1,PTHBLK+.PTPPN ;USE THE ONE FROM RETURNED PATH
|
||
MOVEM T1,SAVPTH+.PTPPN ;SAVE IT
|
||
MOVEM T1,SAVSCB+.FXDIR ;HERE TOO
|
||
SETOM SAVSCB+.FXDIM ;SET MASK
|
||
MOVEI T1,FILBLK+.FOFPP+1 ;POINT TO FIRST RETURNED SFD
|
||
SKIPN FILBLK+.FOFDV ;REASONABLE RETURNED DATA?
|
||
MOVEI T1,PTHBLK+.PTSFD ;NO--USE THE PATH BLOCK
|
||
HRLI T1,-<.PTMAX-.PTSFD-1> ;GET -LENGTH
|
||
MOVEI T2,SAVPTH ;POINT TO TEMPORARY STORAGE
|
||
MOVEI T3,SAVSCB ;POINT TO THE SCAN BLOCK
|
||
|
||
SAVS.2: MOVE T4,(T1) ;GET AN SFD
|
||
MOVEM T4,.PTSFD(T2) ;PUT AN SFD
|
||
MOVEM T4,.FXDIR+2(T3) ;SAVE IN SCAN BLOCK
|
||
SETOM .FXDIM+2(T3) ;SET MASK
|
||
ADDI T2,1 ;POINT TO NEXT PATH BLOCK STORAGE
|
||
ADDI T3,2 ;POINT TO NEXT SCAN BLOCK STORAGE
|
||
AOBJN T1,SAVS.2 ;LOOP
|
||
JRST .POPJ1## ;RETURN
|
||
SAV.E1: $WARN (WCS,<Wildcards illegal in save file specification>)
|
||
POPJ P, ;RETURN
|
||
|
||
SAV.E2: HRL T1,LERBLK+.RBEXT ;GET ERROR CODE
|
||
TLNN T1,777777 ;SAVE AN ERROR CODE WHERE IT SHOULD BE?
|
||
HRRM T1,LERBLK+.RBEXT ;NO--USE WHAT FILOP RETURNED
|
||
$WARN (SEF,<Save file enter failure >,SAV.E3)
|
||
POPJ P, ;RETURN
|
||
|
||
SAV.E3: HRRZ T1,LERBLK+.RBEXT ;GET ERROR CODE
|
||
PUSHJ P,.TOCTW## ;TYPE IT
|
||
MOVEI T1,[ASCIZ | for |] ;GET SEPARATOT
|
||
PUSHJ P,.TSTRG## ;TYPE IT
|
||
MOVEI T1,FOPBLK+.FOIOS ;POINT TO ENBEDDED OPEN BLOCK
|
||
MOVEI T2,LERBLK ;POINT TO ENTER BLOCK
|
||
PJRST .TOLEB## ;TYPE FILESPEC AND RETURN
|
||
SAVER: $INFO (SAV,<Saving WHO core image on >,E.SAV);TELL WHERE .EXE FILE IS
|
||
SETZ T1, ;CAN'T USE A PATH BLOCK
|
||
; THIS BLETCHEROUS KROCK IS TO KEEP
|
||
; A "ZERO'ED" LOW SEG, YET STILL LET
|
||
; THE SAVE. BE USED TO SAVE WHO (AND
|
||
; NOT BREAK .CTL FILES). UNFORTUNATELY,
|
||
; A PATH BLOCK CAN'T BE IN THE HISEG
|
||
; (ADDR CHECK), THE ACS (GET TROUNCED
|
||
; BY SAVGET), OR JOBDAT (ILL ADDR IN
|
||
; UUO)).
|
||
MOVEM T1,SAVBLK+4 ;SAVE PATH BLOCK ADDRESS
|
||
SETZM SAVPTH+.PTFCN ;CLEAR OUT FUNCTION WORD
|
||
SETZM SAVPTH+.PTSWT ;CLEAR OUT FLAGS
|
||
SETZM SAVPTH+.PTMAX-1 ;FORCIBLY TERMINATE PATH BLOCK
|
||
|
||
SAVE.1: MOVEI T1,SAVBLK ;POINT TO THE ARGUMENT BLOCK
|
||
SKIPN DDTFLG ;KEEPING DDT?
|
||
TLO T1,(SS%SSH) ;NO--MAKE IT SHARABLE
|
||
MOVEM T1,SAVARG ;SAVE THE SAVE. UUO AC
|
||
|
||
SAVE.2: SKIPN T1,DDTFLG ;GET END OF DDT
|
||
MOVEI T1,WHOONC ;OR NORMAL END OF OUR LOW SEG
|
||
MOVEM T1,CORARG ;SAVE FOR CORE UUO
|
||
SKIPN T2,DDTFLG ;GET END OF DDT
|
||
MOVEI T2,.JBDA ;ELSE WILL CLEAR ENTIRE LOW SEG
|
||
HRLI T2,1(T2) ;T2 = ADDR+1,,ADDR
|
||
MOVSM T2,BLTARG ;SAVE BLT AC
|
||
|
||
SAVE.3: HRRM T1,.JBFF ;RESET .JBFF
|
||
HRLM T1,.JBSA ;AND THE SAVED COPY TOO
|
||
SKIPE DDTFLG ;KEEPING DDT?
|
||
SKIPA T1,CORARG ;YES--GET LAST ADDR IN LOW SEGMENT
|
||
MOVEI T1,.JBDA-1 ;ELSE MAKE SURE WE HAVE A NULL LOW SEG
|
||
HRLM T1,.JBCOR ;FIX UP FOR SAVGET
|
||
MOVEI T1,WHO## ;POINT TO NEW START ADDRESS
|
||
HRRM T1,.JBSA ;SET IT
|
||
SKIPE T2,HGHORG ;GET HIGH SEG ORIGIN
|
||
HRRM T1,.JBHSA(T2) ;SAVE IN HIGH SEG TOO
|
||
|
||
SAVE.4: SKIPE DDTFLG ;KEEPING DDT?
|
||
JRST SAVE.5 ;YES
|
||
SETZ T1, ;CLEAR AC
|
||
SETDDT T1, ;CLEAR .JBDDT ADDR IN PROTECTED JOBDAT
|
||
|
||
SAVE.5: SKIPE SYMFLG ;KEEPING SYMBOLS?
|
||
JRST SAVE.6 ;YES
|
||
SETZM .JBSYM ;CLEAR LOW SEG TABLE POINTER
|
||
SETZM .JBUSY ;CLEAR UNDEFINED SYMBOL TABLE POINTER
|
||
SKIPN T1,HGHORG ;GET HIGH SEG ORIGIN
|
||
JRST SAVE.6 ;NO HIGH SEG
|
||
HRRZ T2,.JBHRL ;GET HIGHEST ADDRESS IN HIGH SEGMENT
|
||
HLRE T3,.JBHSM(T1) ;GET -LENGTH OF SYMBOL TABLE
|
||
ADD T2,T3 ;COMPUTE NEW HIGH SEG END ADDRESS
|
||
HRRM T2,.JBHRL ;SAVE IT
|
||
HRLM T2,CORARG ;SAVE FOR CORE UUO TOO
|
||
|
||
SAVE.6: SETOM ONCFLG ;FLAG END OF ONCE-ONLY CODE
|
||
PUSHJ P,WLHSEG ;WRITE LOCK THE HIGH SEGMENT
|
||
MOVE T1,SAVBLK+1 ;GET SAVE FILE NAME
|
||
SETNAM T1, ;MAKE THAT OUR PROGRAM NAME
|
||
MOVE T1,[SAVBLT,,.JBBLT] ;BLT POINTER TO
|
||
BLT T1,.JBBLT+2 ;SET UP FOR SAVE. UUO
|
||
HLRZ T1,BLTARG ;GET FIRST ADDRESS TO ZERO
|
||
SETZM (T1) ;CLEAR IT NOW
|
||
MOVSI 17,SAVLOW ;SET UP BLT
|
||
BLT 17,17 ;COPY EXIT CODE
|
||
JRST SAVGO ;GO SAVE OUR CORE IMAGE
|
||
|
||
SAVBLT: SAVE. 2, ;.JBBLT+0 - SAVE OUR CORE IMAGE
|
||
OUTSTR SAVERR ;.JBBLT+1 - COMPLAIN
|
||
EXIT ;.JBBLT+2 - EXIT TO MONITOR
|
||
|
||
SAVLOW:!PHASE 0
|
||
SAVGO:! MOVE 0,CORARG ; 0 - GET CORE UUO AC
|
||
MOVE 1,BLTARG ; 1 - GET BLT AC
|
||
MOVE 2,SAVARG ; 2 - GET SAVE. UUO AC
|
||
CORE 0, ; 3 - SHRINK CORE
|
||
JFCL ; 4 - IGNORE FAILURE
|
||
HRR .+1,.JBREL ; 5 - WHERE TO STOP
|
||
BLT 1,0 ; 6 - CLEAR CORE
|
||
JRST .JBBLT ; 7 - SAVE AND EXIT
|
||
EXP 0 ;10 - FREE AC
|
||
EXP 0 ;11 - FREE AC
|
||
EXP 0 ;12 - FREE AC
|
||
EXP 0 ;13 - FREE AC
|
||
EXP 0 ;14 - FREE AC
|
||
EXP 0 ;15 - FREE AC
|
||
EXP 0 ;16 - FREE AC
|
||
EXP 0 ;17 - FREE AC
|
||
SAVEND:!DEPHASE
|
||
|
||
E.SAV: MOVEI T1,SAVSCB ;POINT TO SCAN BLOCK
|
||
PJRST .TFBLK## ;TYPE IT AND RETURN
|
||
O.ZBEG:! ;START OF BLOCK TO ZERO
|
||
|
||
ONCPDL: BLOCK ONCPDS ;ONCE-ONLY PUSH DOWN LIST
|
||
BYTPTR: BLOCK 1 ;RANDOM BYTE POINTER
|
||
BYTCNT: BLOCK 1 ;RANDOM BYTE COUNT
|
||
FOUND: BLOCK 1 ;COUNT OF NUMBER OF SYMBOLS FOUND
|
||
SYMREQ: BLOCK 1 ;NUMBER OF SYMBOLS REQUIRED
|
||
REFTAB: BLOCK SYMLEN ;REFERENCE TABLE
|
||
MONNAM: BLOCK 5 ;MONITOR NAME
|
||
MONDAT: BLOCK 2 ;MONITOR BUILD DATE
|
||
HLPLVL: BLOCK 1 ;HELP TEXT LEVEL
|
||
HLPPRS: BLOCK 1 ;HELP TEXT LEVEL FOR /HELP DURING PARSE
|
||
ANSWER: BLOCK 1 ;RESPONSE
|
||
BTSSCB: BLOCK .FXLEN ;SCAN BLOCK FOR BOOTSTRAP FILESPEC
|
||
MONSCB: BLOCK .FXLEN ;SCAN BLOCK FOR MONITOR FILE
|
||
SAVSCB: BLOCK .FXLEN ;SCAN BLOCK FOR SAVE FILE
|
||
HGHORG: BLOCK 1 ;HIGH SEGMENT ORIGIN
|
||
DDTFLG: BLOCK 1 ;DDT PRESENT (NOT VMDDT)
|
||
SYMFLG: BLOCK 1 ;SYMBOL TABLE PRESENT
|
||
FOPBLK: BLOCK .FOMAX ;SCRATCH FILOP BLOCK
|
||
LERBLK: BLOCK .RBMAX ;SCRATCH LOOKUP/ENTER BLOCK
|
||
PTHBLK: BLOCK .PTMAX ;SCRATCH PATH BLOCK
|
||
FILBLK: BLOCK .FOFMX ;SCRATCH RETURNED FILESPEC BLOCK
|
||
SAVPTH: BLOCK .PTMAX ;SAVE FILE PATH BLOCK
|
||
DEFINT: BLOCK 1 ;FLAG NON-ZERO TO DEFAULT INTERNAL PARAMETERS
|
||
DEFUSR: BLOCK 1 ;FLAG NON-ZERO TO DEFAULT USER PARAMETERS
|
||
DEFFLG: BLOCK 1 ;FLAG NON-ZERO TO DEFAULT PARAMETERS
|
||
INICNT: BLOCK 1 ;BYTE COUNT FOR INITIALIZATION TEXT
|
||
INIPTR: BLOCK 1 ;BYTE POINTER TO INITIALIZATION TEXT
|
||
CORARG: BLOCK 1 ;CORE UUO ARGUMENT
|
||
BLTARG: BLOCK 1 ;BLT AC
|
||
SAVARG: BLOCK 1 ;SAVE. UUO ARGUMENT
|
||
|
||
O.ZEND:! ;END OF BLOCK TO ZERO
|
||
|
||
$HIGH
|
||
|
||
SAVERR: ASCIZ |
|
||
? SAVE. UUO failed.
|
||
|
|
||
|
||
DEFINE SYMBOL (FET,NAME,FLAG),<IFN FET,<NAME::BLOCK 1>>
|
||
|
||
VALTAB::!SYMS
|
||
ONCFLG:: BLOCK 1 ;ONCE-ONLY INITIALIZATION FLAG
|
||
FEATUR:: BLOCK 1 ;FEATURE FLAGS
|
||
DECONC:: BLOCK 1 ;DEC VERSION
|
||
CUSONC:: BLOCK 1 ;CUSTOMER VERSION
|
||
LODONC:: BLOCK 1 ;LOAD NUMBER
|
||
CHGTYO:: BLOCK 1 ;CHARGE NUMBER TYPEOUT ROUTINE
|
||
SAVBLK: BLOCK 6 ;SAVE. UUO BLOCK
|
||
|
||
$LOW
|
||
|
||
LIT
|
||
|
||
|
||
END WHOONC
|