Trailing-Edge
-
PDP-10 Archives
-
decuslib20-03
-
decus/20-0078/util/simdir.mac
There is 1 other file named simdir.mac in the archive. Click here to see a list.
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
AUTHOR: Claes Wihlborg
UPDATE: 12
PURPOSE: SIMDIR is a utility program used to getting directory
lists of and cross references between separately
compiled SIMULA modules
COMPILATION and LOADING:
UNIVERSAL SIMMAC must be available at compile time.
Must be loaded with HELPER.REL from SYS: or REL:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SALL
SEARCH SIMMAC
CTITLE SIMDIR (Utility program)
SUBTTL PROLOGUE
INTERN SIMDIR
EXTERN .JBFF,.JBREL
MACINIT
TWOSEG
SUBTTL DEFINITIONS
;ACCUMULATOR DEFINITIONS
XTOP=16
XSWITCH=15
XEXT=14
XPPN=13
XDEV=12
XPATH=11
XDIR=10
XMP2=7
XMOD2=6
XMOD=5
XZUS=4
XCC=2
XCOMTYP=XEXT
XPATTERN=XPATH
XMBP=XMP2
;ASSEMBLY TIME CONSTANT DEFINITIONS
LSTCH=1
DIRCH=2
MODCH=3
QUSING=2
QREQUIRED=4
QBUFSZ=204
QMAXLINE=55
QSZSTK=200
QSWM=1
QSWMM=2
QSWC=4
QSWFP=10
QSWMP=20
QSWSP=40
QSWSFD=100
QSWF=200
QSWT=400
QSWOTH=1K
QSWPJ=2K
QSWPG=4K
QSWLIB=200K ;[12] Module is member of a library
QSWMP2=400K
QSWP=QSWFP+QSWMP+QSWSP
QSWEXT=QSWC+QSWP
QSWALL=QSWM+QSWEXT
;FIELD DEFINITIONS
;PATTERN RECORD (Defines a search pattern)
PATPPN=0 ;PPN
PATDEV=1 ;Device
PATSW=2 ;Switches
PATNAME=3 ;File-name
;ZDI RECORD (Defines a directory)
ZDISW=-1 ;Switches
ZDIPPN=-2 ;PPN
ZDIDEV=-3 ;Device
DF(ZDINXT,-4,18,17) ;Link to next dir independent of structure
DF(ZDIBACK,-4,18,35) ;Link to directory containing name of this SFD
DF(ZDISFD,-5,18,17) ;Link to SFD:s under this directory
DF(ZDIMOD,-5,18,35) ;Link to modules under this directory
;ZMO RECORD (Defines a module)
ZMONAME=-1 ;File name
ZMOUNR=-2 ;Unique number of prototype
ZMOSW=-3 ;Switches
DF(ZMODIR,-3,18,17) ;Link to directory containing name of this module
DF(ZMOUS,-4,18,17) ;Link to cref this module using
DF(ZMOREQ,-4,18,35) ;Link to cref this module required by
DF(ZMONXT,-5,18,17) ;Link to next module independent of structure
DF(ZMOMOD,-5,18,35) ;Link to next module under same directory
DF(ZMOLIB,-6,36,35) ;[12] Library name if module is in a library
;ZUS RECORD (Defines a cross reference)
DF(ZUSNXT,-1,18,17) ;Link next cross reference
DF(ZUSMOD,-1,18,35) ;Link to module
;ZCH RECORD (Defines properties of characters)
DSW(ZCHILLEGAL,ZCH,35) ;Character illegal in command
DSW(ZCHSKIP,ZCH,34) ;Character should be skipped in command
DSW(ZCHEND,ZCH,33) ;Character terminates command
DSW(ZCHOCT,ZCH,32) ;Character is octal digit
DSW(ZCHNAME,ZCH,0) ;Character allowed in names
DSW(ZCHBLANK,ZCH,30) ;Character is blank,tab etc.
;SWITCH DEFINITIONS
DSW(SWLIST,YSWLIST,36) ;List file is given
DSW(SWTTY,YSWTTY,36) ;Output on TTY
DSW(SWFAST,YSWFAST,36) ;Output no path
;MACRO AND OPDEF DEFINITIONS
DEFINE DEFOP(A)<
IRP A,<OPDEF A[PUSHJ XPDP,.'A]>
>
DEFOP(<ATRSCAN,ENDSCAN,GETWORD,MODINIT,PPNMATCH,SCANANDTEST,SETCRF,SKIPINPUT,TESTANDSCAN>)
DEFOP(<GETPPN,GETSWITCH,GETFILE,GETNAME,GETOCT>)
DEFOP(<OUTCOM,OUTSIX,OUTOCT,OUTDEC,OUTCH,OUTPPN,OUTMOD,OUTPAGE,OUTLINE>)
DEFOP(<SIXRX50>) ;[12] RADIX50 to SIXBIT
OPDEF SCAN[ILDB XCC,COMBBP]
DEFINE GETNW(N)<
IRP N,<DEFINE GET'N'W<
ADD XTOP,[N,,N]
SKIPL XTOP
EXEC MORECORE
>
>
>
GETNW(<1,2,5,6>)
SYN GET6W,GETZMO ;[12a]
DEFINE MATCH(A)<
L XMBP,[POINT 6,A]
EXEC .MATCH
>
DEFINE OUTTEXT(A)<
EXEC .OUTTEXT,<<[POINT 7,A]>>
>
DEFINE COMERR(MESSAGE)<
GOTO [OUTSTR[ASCIZ/
/]
LI XCC,0
IDPB XCC,COMBBP
OUTSTR COMBUF
OUTSTR [ASCIZ/
? MESSAGE
/]
GOTO RNC
]
>
DEFINE ERROR(MESSAGE)<
GOTO [OUTSTR [ASCIZ/
? MESSAGE
/]
GOTO RNC
]
>
DEFINE SEVERE(MESSAGE)<
GOTO [OUTSTR [ASCIZ/?
? MESSAGE/]
EXIT]
>
SUBTTL LOW SEGMENT DATA AREAS
LOC 137 ;.jbver
EXP VERCOM ;set same version as compiler
RELOC 0
LOWSTART:
OWNPPN: BLOCK 1 ;PPN of controlling job
YSTK: BLOCK QSZSTK ;Push-down list
;DATA AREAS WHICH ARE RESET BETWEEN COMMANDS
COMBUF: BLOCK ^D28 ;Command buffer
COMBBP: BLOCK 1 ;Command buffer byte pointer
LASTPPN: BLOCK 1 ;Last directory outputted
YPAT1: BLOCK 4 ;1:st search pattern
YPAT2: BLOCK 4 ;2:nd search pattern
DIRSW: BLOCK 1 ;Switches in directory command
COMEND:
;DIR-COMMAND DATA AREAS
DIRBASE: BLOCK 1
DIRTOP: BLOCK 1
DIRSTREAM: BLOCK 1 ;Contains elements in search list of job
DIRZDI: BLOCK 1 ;Link directories
DIRZMO: BLOCK 1 ;Link modules
LIBNAME: BLOCK 1 ;[12] Name of current ATR library or zero
BLOCKNO: BLOCK 1 ;[12] Count of input blocks on current file
MOFSET: BLOCK 1 ;[12] Offset of module within disk block
YPATH: BLOCK 12 ;Path used at lookup
DIROBL: BLOCK 3 ;Open block for directories
MODOBL: BLOCK 3 ;Open block for modules
DIRLBL: BLOCK 4 ;Lookup block for directories
MODLBL: BLOCK 4 ;Lookup block for modules
DIRBH: BLOCK 3 ;Buffer header for directories
MODBH: BLOCK 3 ;Buffer header for modules
INDEX: BLOCK 200 ;[12] Current index block
DIRBUF: BLOCK 2*QBUFSZ ;Buffer ring for directories
MODBUF: BLOCK 2*QBUFSZ ;Buffer ring for modules
;LIST COMMAND DATA AREAS
LSTOBL: BLOCK 3 ;Open block for list file
LSTEBL: BLOCK 4 ;Enter block for list file
LSTBH: BLOCK 3 ;Buffer header for list file
LSTLINE: BLOCK 1 ;Line count
LSTPAGE: BLOCK 1 ;Page count
YSWLIST: BLOCK 1 ;Location of switch SWLIST
YSWTTY: BLOCK 1 ;Location of switch SWTTY
;SEARCH COMMAND DATA AREAS
YSWFAST: BLOCK 1 ;Location of switch SWFAST
;START OF DYNAMIC STORAGE
DYNSTART:
SUBTTL High segment data
RELOC 400K
INCOMMAND: ASCIZ %[,]/M
%
PAGEHEADER: ASCIZ/ SIMDIR OUTPUT PAGE /
ZCH:
DEFINE X(CH,SW)<
REPEAT CH-XCH,<XSW>
XCH=CH
XSW=0
IRPC SW,<XSW=XSW+SW'Q>
>
XCH=0
IQ=1
SQ=2
EQ=4
OQ=10
NQ=400K,,0
BQ=40
X(0,S)
X(1,I)
X(QHT,B)
X(QLF,ES)
X(QCR,S)
X(QCR+1,I)
X(33,ES)
X(34,I)
X(" ",B)
X(" "+1,I)
X("*")
X("0",ON)
X("8",N)
X("9"+1)
X("A",N)
X("Z"+1)
X("a",N)
X("z"+1)
X(177,S)
X(200)
SUBTTL Initialization routine
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
The program starts execution here
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SIMDIR:
RESET ;ALL I/O
LI DYNSTART+1K
CORE
SEVERE(NOT ENOUGH CORE)
;CLEAR LOWSEG
SETZM LOWSTART
MOVSI LOWSTART
HRRI LOWSTART+1
L X1,.JBREL
BLT (X1)
;SETUP PUSH-DOWN POINTER
L XPDP,[IOWD QSZSTK,YSTK]
;SETUP DYNAMIC DATA AREA POINTER
LI XTOP,DYNSTART
LI DYNSTART
SUB .JBREL
HRL XTOP,
;INIT OPEN BLOCKS
LI 14 ;STATUS WHEN READING
ST DIROBL
ST MODOBL
LI 0 ;STATUS WHEN WRITING
ST LSTOBL
LI DIRBH
ST DIROBL+2
LI MODBH
ST MODOBL+2
MOVSI LSTBH
ST LSTOBL+2
;SET UP INPUT BUFFERS
L [201,,DIRBUF+1]
ST DIRBUF+QBUFSZ+1
L [201,,DIRBUF+QBUFSZ+1]
ST DIRBUF+1
L [201,,MODBUF+1]
ST MODBUF+QBUFSZ+1
L [201,,MODBUF+QBUFSZ+1]
ST MODBUF+1
;GET OWN PPN
CALLI 24 ;GETPPN IS REDEFINED
ST OWNPPN
;SIMULATE A
;*DIRECTORY [SELF]/MAIN
;COMMAND
L [POINT 7,INCOMMAND]
ST COMBBP
SCAN
GOTO EDC ;EXECUTE COMMAND
SUBTTL RNC Read next command
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: This routine reads a command from user TTY, stores it in
the command buffer and checks if it can recognize the
command specifier. If so a jump to the appropriate action
routine is performed, otherwise a new command is read after
issuing an error message.
EXIT CONDITIONS:The command buffer byte pointer is positioned on the first non-blank
character following the command specifier.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RNC:
;REINITIALIZE PUSH-DOWN POINTER IN CASE OF ERROR
L XPDP,[IOWD QSZSTK,YSTK]
;OUTPUT PROMPTER
SKPINC ;CLEAR ^O
NOP
OUTSTR [ASCIZ/
*/]
;CLEAR COMMAND DATA AREAS
SETZM COMBUF
MOVSI COMBUF
HRRI COMBUF+1
BLT COMEND-1
SETOFF SWFAST
;READ UNTIL <LF>,<VT>,<FF> OR <ALTMODE>
;SKIP <CR> AND <NUL> CHARACTERS
L X1,[POINT 7,COMBUF]
ST X1,COMBBP
L X3,[POINT 7,COMBUF+^D27,34]
LOOP
INCHWL XCC
IFOFF ZCHSKIP(XCC)
IDPB XCC,COMBBP
AS
IFON ZCHILLEGAL(XCC)
GOTO [ENDSCAN
COMERR(ILLEGAL CHARACTER IN COMMAND)]
CAMN X3,COMBBP
GOTO [ENDSCAN
ERROR(TOO LONG COMMAND)]
IFOFF ZCHEND(XCC)
GOTO TRUE
SA
LI XCC,QCR
IDPB XCC,COMBBP
LI XCC,QLF
IDPB XCC,COMBBP
ST X1,COMBBP ;RESET COMMAND BUFFER BYTE POINTER
SCANANDTEST
CAIN XCC,QCR
GOTO RNC ;IF NULL COMMAND
GETNAME
COMERR(COMMAND NOT RECOGNIZED)
LI X3,RNCTRV-RNCNAM-1
LOOP
SUBI X3,1
AS
MATCH RNCNAM(X3)
SOJG X3,TRUE
SA
SKIPGE X3
COMERR(COMMAND NOT RECOGNIZED)
LSH X3,-1
GOTO @RNCTRV(X3)
;COMMAND NAMES
RNCNAM: SIXBIT/CLOSE: /
SIXBIT/EXIT: /
SIXBIT/HELP: /
SIXBIT/LIST: /
SIXBIT/DIRECTORY:/
SIXBIT/SEARCH:/
;TRANSFER VECTOR
RNCTRV: ECC
EEC
EHC
ELC
EDC
ESC
SUBTTL ECC Execute CLOSE command
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Close current list file
COMMAND SYNTAX: <close-command>::=CLOSE
EXIT CONDITIONS: SWLIST is off
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ECC:
CAIE XCC,QCR
COMERR(ERROR IN COMMAND)
IFOFF SWLIST
ERROR(ILLEGAL COMMAND) ;No list file to close
SETOFF SWLIST
CLOSE LSTCH,
STATZ LSTCH,740K
ERROR(CLOSE LIST FILE)
GOTO RNC ;READ NEXT COMMAND
SUBTTL EDC Execute DIRECTORY command
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Find all modules under the given directories and their
subdirectories and append them to the core data base
COMMAND SYNTAX: <directory-command>::=DIRECTORY<directory>[<directory>]...
Further details in the help text
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EDC:
L YSWLIST
SETCAM YSWTTY
ST XTOP,DIRBASE ;SAVE BASE ADDRESS OF COLLECTED DIRECTORIES
EXEC EDCSCD ;SCAN FIRST DIRECTORY
WHILE
CAIE XCC,","
GOTO FALSE
DO
SCANANDTEST
EXEC EDCSCD
OD
CAIE XCC,QCR
COMERR(ERROR IN COMMAND)
ST XTOP,DIRTOP ;SAVE TOP OF COLLECTED DIRECTORIES
;HERE IF SYNTACTICALLY CORRECT COMMAND
OUTCOM ;OUTPUT COMMAND ON LIST FILE (IF ANY)
;APPEND THE COLLECTED DIRECTORIES TO LIST
SETOM DIRSTREAM
WHILE ;MORE FILE STRUCTURES
LI DIRSTREAM
JOBSTR
ERROR(JOBSTR UUO FAILURE)
SKIPN XDEV,DIRSTREAM
GOTO FALSE ;IF FENCE REACHED
DO ;READ MFD AND MATCH DIRECTORIES
ST XDEV,DIROBL+1
OPEN DIRCH,DIROBL
SEVERE(CANNOT OPEN MFD)
L [1,,1]
ST DIRLBL
ST DIRLBL+3
MOVSI 'UFD'
ST DIRLBL+1
SETZM DIRLBL+2
LOOKUP DIRCH,DIRLBL
SEVERE(CANNOT LOOKUP MFD)
L [400K,,DIRBUF+1]
ST DIRBH
;MFD INITIALIZED FOR READING
WHILE
EXEC EDCNF
GOTO FALSE
DO ;MATCH THIS PPN VERSUS THOSE FROM COMMAND
L XDIR,DIRBASE
LOOP ;THRU THE PPN GIVEN
ADD XDIR,[2,,2]
L XSWITCH,ZDISW(XDIR)
L ZDIPPN(XDIR)
XOR XPPN
IF
PPNMATCH
GOTO FALSE ;IF NOT
THEN
EXEC EDCAPD ;APPEND DIRECTORY
FI
AS
CAME XDIR,DIRTOP
GOTO TRUE
SA
OD
OD
;SEARCH DIRECTORY LIST IF ANY DIRECTORIES NEED READING
L XDIR,DIRZDI
WHILE
JUMPE XDIR,FALSE
DO ;CHECK THIS DIRECTORY
IF
HRLZ XSWITCH,ZDISW(XDIR)
ANDCM XSWITCH,ZDISW(XDIR)
JUMPE XSWITCH,FALSE
THEN ;DIR NEEDS READING
ORM XSWITCH,ZDISW(XDIR)
L ZDIDEV(XDIR)
ST DIROBL+1
ST MODOBL+1
OPEN DIRCH,DIROBL
SEVERE(CANNOT OPEN UFD)
OPEN MODCH,MODOBL
SEVERE(CANNOT OPEN MODCH)
LI XPATH,YPATH+1
MOVSI 'UFD'
ST DIRLBL+1
L [1,,1]
ST DIRLBL+3
EXEC EDCSCF ;SCAN AND APPEND FILES
FI
LF XDIR,ZDINXT(XDIR)
OD
GOTO RNC ;READ NEXT COMMAND
SUBTTL EDCAPD Append directory to data base
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Check if a directory with given device and PPN exists
in the data base. If so set switches, otherwise create a
new directory object with specified properties.
ENTRY CONDITIONS: XDEV Device
XPPN PPN
XSWITCH Switches
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EDCAPD: PROC
SAVE XDIR
L XDIR,DIRZDI
TRZ XSWITCH,<QSWPJ+QSWPG+QSWMM>
WHILE
JUMPE XDIR,FALSE
DO ;SEE IF DIRECTORY ALREADY APPENDED
IF
CAMN XDEV,ZDIDEV(XDIR)
CAME XPPN,ZDIPPN(XDIR)
GOTO FALSE
THEN ;IT IS
ORM XSWITCH,ZDISW(XDIR) ;ADD (NEW?) SWITCHES
RETURN
FI
LF XDIR,ZDINXT(XDIR)
OD
;DIRECTORY NOT FOUND, APPEND IT TO LIST
GET5W ;GET ZDI-RECORD
ST XPPN,ZDIPPN(XTOP)
ST XDEV,ZDIDEV(XTOP)
ST XSWITCH,ZDISW(XTOP)
L DIRZDI
SF ,ZDINXT(XTOP)
HRRZM XTOP,DIRZDI
RETURN
EPROC
SUBTTL EDCSCD Scan <directory>
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: This routine will scan a directory in the command buffer
EXIT CONDITIONS: The properties of the scanned directory are placed
in a ZDI-record on top of lowseg.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EDCSCD: PROC
L XSWITCH,DIRSW ;LOAD DEFAULT SWITCH SETTING
IF
CAIE XCC,"/"
GOTO FALSE
THEN ;CHANGE DEFAULT SWITCH SETTING
GETSWITCH
TRNE XSWITCH,<QSWEXT+QSWT+QSWF>
COMERR(ILLEGAL SWITCH)
ST XSWITCH,DIRSW
FI
CAIE XCC,"["
COMERR(PPN EXPECTED)
GETPPN
TRNE XSWITCH,QSWOTHER
COMERR(ILLEGAL PPN)
IF
CAIE XCC,"/"
GOTO FALSE
THEN ;CHANGE SWITCH FROM DEFAULT
GETSWITCH
TRNE XSWITCH,<QSWEXT+QSWF+QSWT>
COMERR(ILLEGAL SWITCH)
FI
TRO XSWITCH,<QSWEXT+QSWSFD>
GET2W ;GET SHORTENED ZDI-RECORD
ST XSWITCH,ZDISW(XTOP)
ST XPPN,ZDIPPN(XTOP)
RETURN
EPROC
SUBTTL EDCNF New file
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: This routine reads a directory and for each call it returns
a new member. If a MFD is read a UFD is returned otherwise
a file or a SFD is returned.
EXIT CONDITIONS: Skip return if new member found.
Simple return if EOF or read error.
XPPN holds the filename
XEXT holds the extension (swapped)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EDCNF: PROC
;FIND PPN OR FILENAME
LOOP
IF
SOSL DIRBH+2
GOTO FALSE
THEN
IN DIRCH,
SOSGE DIRBH+2
GOTO [CLOSE DIRCH,
RETURN ;EOF OR ERROR
]
FI
ILDB XPPN,DIRBH+1
AS
JUMPE XPPN,TRUE
SA
;GET EXTENSION
SOSGE DIRBH+2
ERROR(DIRECTORY PHASE ERROR)
ILDB XEXT,DIRBH+1
HLRZ XEXT,XEXT
AOS (XPDP)
RETURN
EPROC
SUBTTL EDCSCF Scan files in directory
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: This routine reads a UFD (or SFD) and appends all modules
and SFD:s to the core data base. The same is
done for all SFD:s found.
ENTRY CONDITIONS: XDIR Points to directory to be read
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EDCSCF: PROC
SAVE XDIR
L XPPN,ZDIPPN(XDIR)
ST XPPN,DIRLBL
SETZM DIRLBL+2
LOOKUP DIRCH,DIRLBL
GOTO [RETURN ;IF PROTECTION FAILURE
]
L [400K,,DIRBUF+1]
ST DIRBH
PUSH XPATH,XPPN
WHILE
EXEC EDCNF
GOTO FALSE
DO
IF
CAIN XEXT,'REL'
TLNN XSWITCH,QSWM
GOTO FALSE
THEN ;APPEND THIS MAIN MODULE
EXEC EDCMAIN
CLOSE MODCH,
ELSE
IF
CAIN XEXT,'ATR'
TLNN XSWITCH,QSWEXT
GOTO FALSE
THEN ;APPEND THIS EXTERNAL MODULE
EXEC EDCATR
CLOSE MODCH,
ELSE
IF
CAIN XEXT,'SFD'
TLNN XSWITCH,QSWSFD
GOTO FALSE
THEN ;APPEND THIS SFD
GET5W
ST XPPN,ZDIPPN(XTOP)
LF ,ZDISFD(XDIR)
SF ,ZDINXT(XTOP)
SF XTOP,ZDISFD(XDIR)
SF XDIR,ZDIBACK(XTOP)
FI FI FI
OD
;READ FILES IN COLLECTED SFD'S
LF XDIR,ZDISFD(XDIR)
WHILE
JUMPE XDIR,FALSE
DO
MOVSI 'SFD'
ST DIRLBL+1
LI YPATH
ST DIRLBL+3
EXEC EDCSCF
LF XDIR,ZDINXT(XDIR)
OD
SETZM (XPATH)
SUB XPATH,[1,,1]
RETURN
EPROC
SUBTTL EDCATR [12] Read ATR file and append one or more external modules
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: This routine will read an ATR file and collect useful
information on the corresponding module.
ENTRY CONDITIONS: XPPN Filename
XEXT Extension (swapped)
EXIT CONDITIONS: If a record for this module already exists it
is updated otherwise a record is created.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OPDEF LIBERROR [JSP [ERROR(ATR library inconsistent)]]
EDCATR: PROC
MODINIT
RETURN
GETWORD ;1st word
RETURN ;If file is empty
HLRZ X1
IF ;INDEX block header is found
CAIE 14
GOTO FALSE
THEN ;Save the index block, treat all modules in library
ST XPPN,LIBNAME
L1():! HRRZ X1,MODBH ;Make BLT word
HRLI X1,2(X1) ;for copying the entire buffer
HRRI X1,INDEX
BLT X1,INDEX+177
EXEC EDCATI ;Get next bufferful
LIBERROR
LI INDEX
ST INDEX ;Use as pointer to current word
L2():! AOS X1,INDEX
HLRZ (X1)
IF ;Start of index item
CAIE 4
GOTO FALSE
THEN ;Find offset,,block no
HRRZ X1,(X1)
ADDI X1,1
ADDB X1,INDEX
L X1,(X1)
HLRZM X1,MOFSET
HRRZ X1
IF ;Not current block
SUB BLOCKNO
JUMPE FALSE
THEN ;Make sure the block is input
IF ;Already bypassed
JUMPG FALSE
THEN LIBERROR
ELSE
LOOP
EXEC EDCATI
LIBERROR
AS SOJG TRUE
SA
FI FI
;Now check if offset is ok
HRRZ MODBH+1
SUBI @MODBH
SUBI 1
CAMLE MOFSET
LIBERROR
L MOFSET
ADDI @MODBH ;Adjust byte ptr
ADDI 1
HRRM MODBH+1
LI 200 ;and byte count
SUB MOFSET
ST MODBH+2
GETWORD
LIBERROR
EXEC EDCATM ;Treat the library module
GOTO L2
ELSE ;Not index item, should be link to next index block
HRRE (X1)
IF ;Not last block
JUMPL FALSE
THEN ;Find the index block
SUB BLOCKNO
IF ;Accessible
JUMPL FALSE
THEN ;Make it the current block
WHILE
SOJL FALSE
DO
EXEC EDCATI
LIBERROR
OD
ELSE
LIBERROR
FI
GOTO L1
FI FI
ELSE ;Separate ATR file
SETZM LIBNAME
EXEC EDCATM
FI
RETURN
EPROC
EDCATI: IN MODCH,
AOS (XPDP) ;Normal return is skip
AOS BLOCKNO ;Count the block
RETURN
SUBTTL EDCATM [12] Read and append external ATR module
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: EDCATM reads one ATR module either from a library
or from a separate ATR file and saves some useful info.
ENTRY CONDITIONS: XPPN filename
LIBNAME filename if library, otherwise zero.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EDCATM: PROC
HLRZ X1
IF ;New format
CAIE 4
GOTO FALSE
THEN ;Treat overhead info
LI XEXT,1(X1)
SKIPINPUT
RETURN
HLRZ X1
CAIE 6 ;Must be name block
RETURN ; if not
GETWORD
RETURN
GETWORD
RETURN
IF ;Library file
SKIPN LIBNAME
GOTO FALSE
THEN ;Put name of module in XPPN
L X1
SIXRX50
ST XPPN
FI
GETWORD
RETURN
WHILE ;Not type 0 block
TLNN X1,-1
GOTO FALSE
DO ;Skip blocks
LI XEXT,1(X1)
SKIPINPUT
OD
GETWORD
RETURN
FI
LI XEXT,6
SKIPINPUT
RETURN
; X1 CONTAINS FIRST WORD OF ZHB-RECORD
HRRZ X2,MODBH+1
L X3,4(X2)
L XMOD,DIRZMO
WHILE
JUMPE XMOD,FALSE
SKIPE ZMONAME(XMOD)
GOTO TRUE
CAMN X3,ZMOUNR(XMOD)
GOTO FALSE
DO
LF XMOD,ZMONXT(XMOD)
OD
IF
JUMPN XMOD,FALSE
THEN
GETZMO
LI XMOD,(XTOP)
ST X3,ZMOUNR(XMOD)
L DIRZMO
SF ,ZMONXT(XMOD)
ST XMOD,DIRZMO
FI
LF ,ZDIMOD(XDIR)
SF ,ZMOMOD(XMOD)
SF XMOD,ZDIMOD(XDIR)
SF XDIR,ZMODIR(XMOD)
ST XPPN,ZMONAME(XMOD)
;GET TYPE OF EXTERNAL
LF ,ZHETYP(,1)
IF ;Class
CAIE QCLASB
GOTO FALSE
THEN
LI X1,QSWC
ELSE ;Discriminate MACRO, FORTRAN, SIMULA
LF X1,ZHBMFO(X2) ;[5] Get tag field
IF ;[5] SIMULA code
JUMPN X1,FALSE
THEN LI X1,QSWSP
ELSE ;Check for MACRO or FORTRAN
IF ;"CODE" or "QUICK"
CAILE X1,QEXMQI
GOTO FALSE
THEN ;MACRO procedure
LI X1,QSWMP
ELSE ;FORTRAN assumed
LI X1,QSWFP
FI FI FI ;[5]
L LIBNAME
IF ;Scanning a library
JUMPE FALSE
THEN ;Save library name, set QSWLIB
SF ,ZMOLIB(XMOD)
TRO X1,QSWLIB
FI
ORM X1,ZMOSW(XMOD)
ATRSCAN
RETURN
WHILE
GETWORD
RETURN
JUMPE X1,FALSE
DO
GETWORD
RETURN
SETCRF
GETWORD
RETURN
GETWORD
RETURN
OD
RETURN
EPROC
SUBTTL EDCMAIN Read REL file and append main module
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Read a REL file and test if it originates from a
SIMULA main program. If so, append the module to the
data base and search for cross references.
ENTRY CONDITIONS: XPPN Filename
XEXT Extension (swapped)
XDIR Points to directory which contains this module
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EDCMAIN:PROC
MODINIT
RETURN
GETWORD
RETURN
IF ;[030406] Entry block with one data word
CAME X1,[4,,1]
GOTO FALSE
THEN ;Could be SIMULA, check for name .MAIN
GETWORD ;reloc word
RETURN
GETWORD ;Entry name
RETURN
CAMN X1,[RADIX50 0,.MAIN]
GETWORD
RETURN
FI ;[030406]
CAMN X1,[6,,2]
GETWORD
RETURN
CAIN X1,0
GETWORD
RETURN
CAMN X1,[RADIX50 0,.MAIN]
GETWORD
RETURN
CAMN X1,[QSIMREL]
GETWORD
RETURN
;SETUP ZMO-RECORD FOR THIS MODULE
GETZMO
LI XMOD,(XTOP)
ST XPPN,ZMONAME(XMOD)
LI QSWM
ORM ZMOSW(XMOD)
L DIRZMO
SF ,ZMONXT(XMOD)
ST XMOD,DIRZMO
LF ,ZDIMOD(XDIR)
SF ,ZMOMOD(XMOD)
SF XMOD,ZDIMOD(XDIR)
SF XDIR,ZMODIR(XMOD)
;FIND LINK ITEM [0,,N] WHICH DEFINES THE EXTERNALS
WHILE
TLNE X1,-1
GOTO TRUE
TRNE X1,-1
GOTO FALSE
DO
LI XPPN,21(X1)
IDIVI XPPN,22
L XEXT,XPPN
ADDI XEXT,(X1)
SKIPINPUT
RETURN
OD
;CREATE CROSS REFERENCES
LI XPPN,21(X1)
IDIVI XPPN,22
ADDI XPPN,(X1)
LOOP
GETWORD
RETURN
SKIPN X1
RETURN
SETCRF
AS
SOJG XPPN,TRUE
SA
RETURN
EPROC
SUBTTL EEC Execute EXIT command
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: If a list file is open, close it. Return to monitor.
COMMAND SYNTAX: <exit-command>::=EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EEC:
CAIE XCC,QCR
COMERR(ERROR IN COMMAND)
IFOFF SWLIST
EXIT
CLOSE LSTCH,
STATZ LSTCH,740K
SEVERE(CLOSE LIST FILE)
EXIT
SUBTTL EHC Execute HELP command
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output help text. If /TTY switch is given, output on
user TTY even if list file exists.
COMMAND SYNTAX: <help-command>::=HELP [/TTY]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXTERN .HELPR ;[12]
EHC:
L YSWLIST
SETCAM YSWTTY
LI XSWITCH,0
IF
CAIE XCC,"/"
GOTO FALSE
THEN
GETSWITCH
TRNN XSWITCH,QSWT
COMERR(ILLEGAL SWITCH)
SETON SWTTY
FI
CAIE XCC,QCR
COMERR(ERROR IN COMMAND)
;HERE IF COMMAND SYNTACTICALLY CORRECT
OUTCOM ;OUTPUT ON LIST FILE (IF ANY)
;[12] OUTTEXT HELPTEXT
L 1,[SIXBIT/SIMDIR/] ;[12]
EXEC .HELPR ;[12]
GOTO RNC ;READ NEXT COMMAND
SUBTTL ELC Execute LIST command
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: If old list file exists, close it. Open new list file.
COMMAND SYNTAX: <list-command>::=LIST <file specification>
EXIT CONDITIONS: SWLIST has been set
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELC:
;GET OUTPUT FILE SPECIFICATION
GETFILE
SKIPN XDEV
MOVSI XDEV,'DSK'
ST XDEV,LSTOBL+1
SKIPN
L ['SIMDIR']
ST LSTEBL
IF
CAIE XCC,"."
GOTO FALSE
THEN ;EXTENSION IS GIVEN
SCANANDTEST
GETNAME
NOP ;ACCEPT NULL EXTENSION
ELSE
MOVSI 'LST'
FI
HLLZM LSTEBL+1
SETZM LSTEBL+2
LI XPPN,0
IF
CAIE XCC,"["
GOTO FALSE
THEN ;PPN IS GIVEN
LI XSWITCH,0
GETPPN
TRNE XSWITCH,<QSWOTHER+QSWPJ+QSWPG>
COMERR(ILLEGAL PPN)
FI
ST XPPN,LSTEBL+3
CAIE XCC,QCR
COMERR(ERROR IN COMMAND)
;HERE IF COMMAND SYNTACTICALLY CORRECT
;CLOSE OLD LIST FILE (IF ANY)
IF
IFOFF SWLIST
GOTO FALSE
THEN
SETOFF SWLIST
CLOSE LSTCH,
STATZ LSTCH,740K
ERROR(CLOSE OLD LIST FILE)
FI
;IF NEW DEVICE IS TTY: THEN READ NEXT COMMAND
CAMN XDEV,[SIXBIT/TTY/]
GOTO RNC
;OPEN NEW LIST FILE
OPEN LSTCH,LSTOBL
ERROR(CANNOT OPEN LIST FILE)
ENTER LSTCH,LSTEBL
ERROR(CANNOT ENTER LIST FILE)
HRRZM XTOP,.JBFF
OUTBUF LSTCH,
;RECOMPUTE XTOP
L XTOP,.JBFF
L XTOP
SUB .JBREL
HRL XTOP,
;INIT OUTPUT
SETZM LSTPAGE
SETON SWLIST
SETOFF SWTTY
OUTPAGE
GOTO RNC ;READ NEXT COMMAND
SUBTTL ESC Execute SEARCH command
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Performs syntax checking and all actions of a SEARCH command
COMMAND SYNTAX: <search-command>::=SEARCH<pattern>[<relation>[<pattern>]]
Further details in help text.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ESC:
CAIN XCC,QCR
COMERR(NO PATTERN FOUND)
L YSWLIST
SETCAM YSWTTY
LI XPATTERN,YPAT1
EXEC ESCPAT
LI XCOMTYP,0 ;SIMPLE SEARCH
IF
CAIN XCC,QCR
GOTO FALSE
THEN ;SCAN <RELATION>
GETNAME
COMERR(ILLEGAL COMMAND)
IF
MATCH [SIXBIT/USING:/]
GOTO FALSE
THEN ;RELATION IS USING
LI XCOMTYP,QUSING
ELSE ;RELATION MUST BE REQUIRED BY
MATCH [SIXBIT/REQUIRED:/]
COMERR(ERROR IN COMMAND)
GETNAME
COMERR(ERROR IN COMMAND)
MATCH [SIXBIT/BY:/]
COMERR(ERROR IN COMMAND)
LI XCOMTYP,QREQUIRED
FI
IF
CAIN XCC,QCR
GOTO FALSE
THEN ;SECOND PATTERN EXISTS
LI XPATTERN,YPAT2
ADDI XCOMTYP,1
EXEC ESCPAT
FI
FI
CAIE XCC,QCR
COMERR(ERROR IN COMMAND)
;HERE WHEN COMMAND SYNTACTICALLY CORRECT
OUTCOM ;OUTPUT COMMAND ON LIST FILE IF ANY
;IF NO MODULES EXISTS, READ NEXT COMMAND
SKIPN XMOD,DIRZMO
GOTO RNC
;IF SECOND PATTERN EXISTS, MARK ALL THOSE WHO MATCH IT
IF
TRNN XCOMTYP,1
GOTO FALSE
THEN ;SECOND PATTERN EXISTS
;FIRST RESET MATCH MARK FOR ALL MODULES
LI XMP2,QSWMP2
LOOP
ANDCAM XMP2,ZMOSW(XMOD)
AS
LF XMOD,ZMONXT(XMOD)
JUMPN XMOD,TRUE
SA
;THEN MARK ALL THOSE WHO MATCH
EXEC ESCDIR
FI
;OUTPUT THOSE WHO MATCH FIRST PATTERN (AND RELATION)
LI XPATTERN,YPAT1
EXEC ESCDIR
GOTO RNC ;READ NEXT COMMAND
SUBTTL ESCPAT Scan search pattern
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Scan and decode a search pattern.
ENTRY CONDITIONS: XPATTERN Points to the pattern record to be updated
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ESCPAT: PROC
GETFILE
ST XDEV,PATDEV(XPATTERN)
ST PATNAME(XPATTERN)
LI XSWITCH,0
IF
CAIE XCC,"["
GOTO FALSE
THEN ;PPN IS GIVEN
GETPPN
ST XPPN,PATPPN(XPATTERN)
ELSE ;PPN NOT GIVEN, ASSUME [*,*]
TRO XSWITCH,<QSWPJ+QSWPG>
FI
WHILE
CAIE XCC,"/"
GOTO FALSE
DO
GETSWITCH
TRNE XSWITCH,QSWMM
COMERR(ILLEGAL SWITCH)
OD
TRNN XSWITCH,QSWALL
TRO XSWITCH,QSWALL ;SET ALL IF NO CATEGORY IS GIVEN
TRZE XSWITCH,QSWT
SETON SWTTY
TRZE XSWITCH,QSWF
SETON SWFAST
ST XSWITCH,PATSW(XPATTERN)
RETURN
EPROC
SUBTTL ESCDIR Find UFD:s matching a pattern
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: For all UFD:s matching a pattern, call ESCMOD to find
out if any modules match the pattern.
ENTRY CONDITIONS: XPATTERN Points to the pattern
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ESCDIR: PROC
L XDIR,DIRZDI
L XSWITCH,PATSW(XPATTERN)
WHILE
JUMPE XDIR,FALSE
DO
L PATPPN(XPATTERN)
XOR ZDIPPN(XDIR)
IF
PPNMATCH
GOTO FALSE
THEN ;PPN DO MATCH
L PATDEV(XPATTERN)
IF
JUMPE TRUE
CAME ZDIDEV(XDIR)
GOTO FALSE
THEN ;DEVICE MATCH
TDNE XSWITCH,ZDISW(XDIR)
EXEC ESCMOD ;There may be matching modules
FI
FI
LF XDIR,ZDINXT(XDIR)
OD
RETURN
EPROC
SUBTTL ESCMOD Find modules matching a pattern
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Search all modules under the given directory and
call ESCMOD for all SFD:s under the directory.
ENTRY CONDITIONS: XDIR Points to a directory to be searched
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ESCMOD: PROC
SAVE XDIR
LF XMOD,ZDIMOD(XDIR)
WHILE
JUMPE XMOD,FALSE
DO
IF
TDNN XSWITCH,ZMOSW(XMOD)
GOTO FALSE
SKIPN X1,PATNAME(XPATTERN)
GOTO TRUE ;IF NO NAME IN PATTERN
CAME X1,ZMONAME(XMOD)
GOTO FALSE
THEN ;MODULE MATCH
IF
CAIE XPATTERN,YPAT2
GOTO FALSE
THEN ;SECOND PATTERN MATCH
ORM XMP2,ZMOSW(XMOD)
ELSE ;FIRST PATTERN MATCH
EXEC ESCFPM
FI
FI
LF XMOD,ZMOMOD(XMOD)
OD
LF XDIR,ZDISFD(XDIR)
WHILE
JUMPE XDIR,FALSE
DO
EXEC ESCMOD
LF XDIR,ZDINXT(XDIR)
OD
RETURN
EPROC
SUBTTL ESCFPM First pattern match found
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output the module if no relation given or if module
satisfies the relation.
ENTRY CONDITIONS:
XCOMTYP Gives the relation and the existence of a second pattern
XMOD Points to the module
XMP2 Contains a bit pattern for testing of 2:nd pattern match
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ESCFPM: PROC
SAVE XMOD
IF
JUMPE XCOMTYP,FALSE
THEN ;RELATION WAS GIVEN
IF
TRNN XCOMTYP,QUSING
GOTO FALSE
THEN ;RELATION IS USING
LF XZUS,ZMOUS(XMOD)
ELSE
LF XZUS,ZMOREQ(XMOD)
FI
IF
TRNN XCOMTYP,1
GOTO FALSE
THEN ;SECOND PATTERN WAS GIVEN
WHILE
JUMPE XZUS,FALSE ;IF NO MATCH FOUND
LF XMOD2,ZUSMOD(XZUS)
TDNN XMP2,ZMOSW(XMOD2)
GOTO TRUE ;TRY NEXT
OUTMOD
GOTO FALSE ;MATCH FOUND
DO
LF XZUS,ZUSNXT(XZUS)
OD
ELSE ;NO SECOND PATTERN
OUTMOD
WHILE
JUMPE XZUS,FALSE
DO
LI XCC,QHT
OUTCH
LF XMOD,ZUSMOD(XZUS)
OUTMOD
LF XZUS,ZUSNXT(XZUS)
OD
FI
ELSE ;NO RELATION
OUTMOD
FI
RETURN
EPROC
SUBTTL ATRSCAN Scan a declaration segment
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: The routine will scan past a declaration segment in the
ATR file. Such a segment starts with a ZHB-record,
contains ZQU-records and declaration segments and
terminates with a zeroword.
ENTRY CONDITIONS: The last word read is the first word of a ZHB-record
EXIT CONDITIONS: If an EOF or error occurs a return is made.
If routine successful, a skip return is made.
The last word read is the terminating zero-word.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ATRSCAN:PROC
LI XEXT,4
SKIPINPUT
RETURN
WHILE
JUMPE X1,FALSE
DO
LF ,ZDETYP(,1)
IF
CAIE ZQU%V
GOTO FALSE
THEN
LI XEXT,5
SKIPINPUT
RETURN
ELSE
ATRSCAN
RETURN
GETWORD
RETURN
FI
OD
AOS (XPDP)
RETURN
EPROC
SUBTTL ENDSCAN Scan until end of command
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: The routine will read terminal input until a termination
character is found. It is used when an error has been
found in command input.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ENDSCAN:PROC
WHILE
IFON ZCHEND(XCC)
GOTO FALSE
DO
INCHWL XCC
OD
RETURN
EPROC
SUBTTL GETPPN Scan PPN
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Scan PPN in command buffer
ENTRY CONDITIONS: The left bracket has just been scanned.
EXIT CONDITIONS: XPPN holds the PPN.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.GETPPN:PROC
SCANANDTEST
IF
IFOFF ZCHOCT(XCC)
GETNAME
GOTO FALSE
THEN ;PPN IS [SELF] OR [OTHERS]
L XPPN,OWNPPN
IF
MATCH [SIXBIT/OTHERS:/]
GOTO FALSE
THEN ;IT IS [OTHERS]
TRO XSWITCH,QSWOTHER
ELSE ;TRY [SELF]
MATCH [SIXBIT/SELF:/]
COMERR(ERROR IN PPN)
FI
ELSE ;PPN IS [...,...]
LI XPPN,0
IF
CAIE XCC,"*"
GOTO FALSE
THEN ;PPN IS [*,...
TRO XSWITCH,QSWPJ
SCAN
ELSE
IF
CAIE XCC,","
GOTO FALSE
THEN ;PPN IS [,..
HLL XPPN,OWNPPN
ELSE
GETOCT
HRL XPPN,XCC-1
FI FI
TESTANDSCAN
CAIE XCC,","
COMERR(ERROR IN PPN)
SCANANDTEST
IF
CAIE XCC,"*"
GOTO FALSE
THEN ;PPN IS [...,*]
TRO XSWITCH,QSWPG
SCAN
ELSE
IF
CAIE XCC,"]"
GOTO FALSE
THEN ;PPN IS [...,]
HRR XPPN,OWNPPN
ELSE
GETOCT
HRR XPPN,XCC-1
FI FI
TESTANDSCAN
FI
CAIE XCC,"]"
COMERR(ERROR IN PPN)
SCANANDTEST
RETURN
EPROC
SUBTTL GETFILE
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Scan <device>:<filename> in command buffer
EXIT CONDITIONS: XDEV Contains <device>. 0 if not given.
X0 Contains <filename>. 0 if not given.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.GETFILE:PROC
LI XDEV,0
GETNAME
RETURN ;NOTHING
CAIE XCC,":"
RETURN ;<FILENAME>
CAME [SIXBIT/DSK/]
L XDEV, ;ONLY IF NOT DSK
SCANANDTEST
GETNAME
RETURN ;<DEVICE>:
RETURN ;<DEVICE>:<FILENAME>
EPROC
SUBTTL GETSWITCH
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: The routine will scan a switch in the command buffer.
ENTRY CONDITIONS: The leading / has just been scanned.
EXIT CONDITIONS: XSWITCH Is updated.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.GETSWITCH:PROC
SCANANDTEST
IF
CAIE XCC,"-"
GOTO FALSE
THEN ;TRY /-MAIN
SCANANDTEST
GETNAME
COMERR(ERROR IN SWITCH)
MATCH [SIXBIT/MAIN:/]
COMERR(ERROR IN SWITCH)
TRZ XSWITCH,QSWM
TRO XSWITCH,QSWMM
ELSE
GETNAME
COMERR(ERROR IN SWITCH)
LI X3,YSWBIT-YSWL-1
LOOP
SUBI X3,1
AS
MATCH YSWL(X3)
SOJG X3,TRUE
SA
SKIPGE X3
COMERR(ERROR IN SWITCH)
LSH X3,-1
TDO XSWITCH,YSWBIT(X3)
FI
RETURN
EPROC
YSWL:
SIXBIT/FPROCEDURES:/
SIXBIT/MPROCEDURES:/
SIXBIT/SPROCEDURES:/
SIXBIT/FAST: /
SIXBIT/TTY: /
SIXBIT/PROCEDURES:/
SIXBIT/CLASSES:/
SIXBIT/MAIN: /
SIXBIT/ALL: /
YSWBIT:
QSWFP
QSWMP
QSWSP
QSWF
QSWT
QSWP
QSWC
QSWM
QSWALL
SUBTTL GETNAME
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Scan a name in command buffer
EXIT CONDITIONS: If no name found take simple return.
If name found X0 and X1 keeps the
name in SIXBIT. Take skip return.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.GETNAME:PROC
SETZB X0,X1
SKIPL ZCH(XCC)
RETURN ;IF NO NAME FOUND
AOS (XPDP)
L XCC+1,[POINT 6,0]
LOOP
CAIL XCC,140 ;IF LOWER CASE LETTER
TRZ XCC,40 ;THEN CONVERT TO UPPER CASE
SUBI XCC,40 ;CONVERT TO SIXBIT
CAME XCC+1,[POINT 6,1,35]
IDPB XCC,XCC+1
SCAN
AS
SKIPGE ZCH(XCC)
GOTO TRUE
SA
TESTANDSCAN
RETURN
EPROC
SUBTTL GETOCT
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Scan an octal number in command buffer.
EXIT CONDITIONS: XCC-1 Holds the octal number.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.GETOCT:PROC
IFOFF ZCHOCT(XCC)
COMERR(OCTAL DIGIT EXPECTED)
LI XCC-1,0
LOOP
ROT XCC,-3
LSHC XCC-1,3
SCAN
AS
IFON ZCHOCT(XCC)
GOTO TRUE
SA
RETURN
EPROC
SUBTTL GETWORD
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Reads a word from ATR or REL file.
EXIT CONDITIONS: If EOF or error occurs take simple return,
Otherwise take skip return with value in X1.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.GETWORD:PROC
IF
SOSL MODBH+2
GOTO FALSE
THEN
IN MODCH,
SOSGE MODBH+2
RETURN
AOS BLOCKNO ;[12] Count the block
FI
ILDB X1,MODBH+1
AOS (XPDP)
RETURN
EPROC
SUBTTL MATCH
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Match two names versus each other. The first name must be
an initial segment of the second name.
ENTRY CONDITIONS: XMBP Byte pointer to second name
X0 & X1 First name in SIXBIT
EXIT CONDITIONS: If a match is found then take skip return,
otherwise take simple return.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.MATCH: PROC
SAVE <X4,X5,X6>
L X6,[POINT 6,0]
LOOP
ILDB X4,XMBP
ILDB X5,X6
AS
CAMN X4,X5
GOTO TRUE
SA
CAIN X5,0
AOS -3(XPDP) ;MODIFY RETURN ADDRESS IF MATCH
RETURN
EPROC
SUBTTL MODINIT
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Perform some actions common to the REL and ATR files
when opened.
ENTRY CONDITIONS: XPPN Filename
XEXT Extension (swapped)
EXIT CONDITIONS: If the file is successfully looked up and the first
buffer read take skip return,otherwise take simple return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.MODINIT:PROC
ST XPPN,MODLBL
MOVSM XEXT,MODLBL+1
SETZM MODLBL+2
LI YPATH
ST MODLBL+3
LOOKUP MODCH,MODLBL
RETURN
L [400K,,MODBUF+1]
ST MODBH
IN MODCH,
AOS (XPDP)
LI 1 ;[12]
ST BLOCKNO ;[12] Initial count
RETURN
EPROC
SUBTTL MORECORE
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Expand low segment one page.
EXIT CONDITIONS: XTOP Left halfword is updated.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MORECORE:PROC
SAVE X1
HRRZ X1,.JBREL
ADDI X1,1K
CORE X1,
SEVERE(NOT ENOUGH CORE)
HRRZ X1,XTOP
SUB X1,.JBREL
HRL XTOP,X1
RETURN
EPROC
SUBTTL OUTCOM Output command
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output the given command to list file (if any)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTCOM:PROC
IFON SWTTY
RETURN ;IF OUTPUT ON TTY
OUTLINE
LI XCC,"*"
OUTCH
OUTTEXT COMBUF
OUTLINE
RETURN
EPROC
SUBTTL OUTMOD Output module
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output a module name and its accessing path.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTMOD:PROC
SAVE XDIR
IF
SKIPN XCC+1,ZMONAME(XMOD)
GOTO FALSE
THEN ;MODULE FOUND IN SOME DIRECTORY
OUTSIX
IF ;[12] Part of a library
L ZMOSW(XMOD)
TRNN QSWLIB
GOTO FALSE
THEN ;Output library name also
OUTTEXT <[ASCIZ/ in /]>
LF XCC+1,ZMOLIB(XMOD)
OUTSIX
FI ;[12]
LF XDIR,ZMODIR(XMOD)
OUTPPN
ELSE
OUTTEXT <[ASCIZ/NOT FOUND
/]>
FI
RETURN
EPROC
SUBTTL OUTPPN Output PPN
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output <ht><device>:[PPN,SFD..]
ENTRY CONDITIONS: XDIR Points to a directory.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTPPN:PROC
IF
IFOFF SWFAST
CAMN XDIR,LASTPPN
GOTO FALSE
THEN
ST XDIR,LASTPPN
LI XCC,QHT
OUTCH
EXEC ..OUTPPN
LI XCC,"]"
OUTCH
FI
OUTLINE
RETURN
EPROC
..OUTPPN:PROC
SAVE XCC-1
IF
SKIPN XCC+1,ZDIDEV(XDIR)
GOTO FALSE
THEN ;UFD
OUTSIX ;OUTPUT DEVICE
OUTTEXT [ASCIZ/: [/]
HLRZ XCC-1,ZDIPPN(XDIR)
OUTOCT
LI XCC,","
OUTCH
HRRZ XCC-1,ZDIPPN(XDIR)
OUTOCT
ELSE ;SFD
L XCC-1,XDIR
LF XDIR,ZDIBACK(XDIR)
EXEC ..OUTPPN
LI XCC,","
OUTCH
L XCC+1,ZDIPPN(XCC-1)
OUTSIX
FI
RETURN
EPROC
SUBTTL OUTSIX Output a sixbit name
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output a sixbit name. Trailing blanks are not output.
ENTRY CONDITIONS: XCC+1 Holds the name left justified.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTSIX:PROC
LOOP
LI XCC,0
LSHC XCC,6
ADDI XCC,40
OUTCH
AS
JUMPN XCC+1,TRUE
SA
RETURN
EPROC
SUBTTL OUTDEC
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output a number in decimal radix.
ENTRY CONDITIONS: XCC-1 Holds the number.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTDEC:PROC
SAVE XCC
IDIVI XCC-1,^D10
SKIPE XCC-1
OUTDEC
ADDI XCC,60
OUTCH
RETURN
EPROC
SUBTTL OUTOCT
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output a number in octal radix.
ENTRY CONDITIONS: XCC-1 Holds the number.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTOCT:PROC
SAVE XCC
IDIVI XCC-1,8
SKIPE XCC-1
OUTOCT
ADDI XCC,60
OUTCH
RETURN
EPROC
SUBTTL OUTTEXT
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output a ASCIZ string. The corresponding macro call
will generate the byte pointer.
ENTRY CONDITIONS: The argument is a byte pointer to the string.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTTEXT:PROC BP
WHILE
ILDB XCC,BP
JUMPE XCC,FALSE
DO
OUTCH
OD
RETURN
EPROC
SUBTTL OUTLINE
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output carriage-return line-feed.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTLINE:PROC
LI XCC,QCR
OUTCH
LI XCC,QLF
OUTCH
RETURN
EPROC
SUBTTL OUTPAGE
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output form feed and page header.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTPAGE:PROC
LI QMAXLIN
ST LSTLIN
LI XCC,QFF
OUTCH
OUTTEXT PAGEHEADER
AOS XCC-1,LSTPAGE
OUTDEC
OUTLINE
OUTLINE
SETZM LASTPPN
RETURN
EPROC
SUBTTL OUTCH
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Output one character.
ENTRY CONDITIONS: XCC Holds the character.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.OUTCH:PROC
IF
IFOFF SWTTY
GOTO FALSE
THEN ;OUTPUT ON TTY
OUTCHR XCC
ELSE ;OUTPUT ON LIST FILE
SOSGE LSTBH+2
EXEC .OUT
IDPB XCC,LSTBH+1
;IF <LF> THEN DECREMENT LINE-COUNT
;IF LINE-COUNT < 0 THEN OUTPUT NEW PAGE
IF
CAIN XCC,QLF
SOSL LSTLINE
GOTO FALSE
THEN
OUTPAGE
FI
FI
RETURN
EPROC
.OUT: PROC
OUT LSTCH,
SOSGE LSTBH+2
ERROR(ERROR ON OUTPUT LIST FILE)
RETURN
EPROC
SUBTTL PPNMATCH
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Match two PPN versus each other.
ENTRY CONDITIONS: X0 Holds the result when the two PPN:s
are XOR:ed with each other.
XSWITCH Holds information about *:s etc.
EXIT CONDITIONS: Skip return if match, otherwise simple return.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.PPNMATCH:PROC
SAVE X1
LI X1,0
TLNE -1
TRNE XSWITCH,QSWPJ
ADDI X1,1
TRNE -1
TRNE XSWITCH,QSWPG
ADDI X1,1
TRNE XSWITCH,QSWOTHER
TRC X1,2
TRNE X1,2
AOS -1(XPDP)
RETURN
EPROC
SUBTTL SETCRF
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Create a cross reference (2 ZUS-records).
ENTRY CONDITIONS: X1 Unique number of used module.
XMOD Module which requires the other
EXIT CONDITIONS: Both modules get a ZUS-record pointing at each other.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.SETCRF:PROC
SAVE XMOD2
L XMOD2,DIRZMO
WHILE
JUMPE XMOD2,FALSE
CAMN X1,ZMOUNR(XMOD2)
GOTO FALSE
DO
LF XMOD2,ZMONXT(XMOD2)
OD
IF
JUMPN XMOD2,FALSE
THEN
GETZMO
LI XMOD2,(XTOP)
ST X1,ZMOUNR(XMOD2)
L DIRZMO
ST XMOD2,DIRZMO
SF ,ZMONXT(XMOD2)
FI
GET1W
LF ,ZMOUS(XMOD)
SF XTOP,ZMOUS(XMOD)
SF ,ZUSNXT(XTOP)
SF XMOD2,ZUSMOD(XTOP)
GET1W
LF ,ZMOREQ(XMOD2)
SF XTOP,ZMOREQ(XMOD2)
SF ,ZUSNXT(XTOP)
SF XMOD,ZUSMOD(XTOP)
RETURN
EPROC
SUBTTL SIXRX50
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Convert X0 from RADIX50 to SIXBIT
INPUT: X0 = Radix50 symbol
OUTPUT: X0 = SIXBIT symbol
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.SIXRX50:PROC
SAVE <X1,X2>
TLZ (74B4) ;Eliminate code bits
SETZ X2, ;Accumulate SIXBIT in X2
LOOP ;Over all characters
IDIVI X0,50
IF ;Special characters
CAIGE X1,45
GOTO FALSE
THEN
L X1,[EXP '.','$','%']-45(X1)
ELSE ;Null, digit or letter
IF ;Not null
JUMPE X1,FALSE
THEN
LI X1,'A'-13(X1) ;Assume letter
CAIGE X1,'A'
LI X1,'0'-'A'+12(X1) ;Modif for digit
FI FI
LSHC X1,-6 ;One SIXBIT character into X2
AS
JUMPN TRUE
SA
L X2
RETURN
EPROC
SUBTTL SKIPINPUT
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Scan past some words in the REL or ATR file.
ENTRY CONDITIONS: XEXT Holds number of words to be skipped.
EXIT CONDITIONS: Skip return if routine succeded, otherwise (EOF or
read error) simple return.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.SKIPINPUT:PROC
LOOP
GETWORD
RETURN
AS
SOJGE XEXT,TRUE
SA
AOS (XPDP)
RETURN
EPROC
SUBTTL SCAN AND TEST
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Find first non-blank character past current.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.SCANANDTEST:PROC
SAVE X0
LOOP
SCAN
AS
IFON ZCHBLANK(XCC)
GOTO TRUE
SA
RETURN
EPROC
SUBTTL TEST AND SCAN
COMMENT;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FUNCTION: Find first non-blank character.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.TESTANDSCAN:PROC
SAVE X0
WHILE
IFOFF ZCHBLANK(XCC)
GOTO FALSE
DO
SCAN
OD
RETURN
EPROC
SUBTTL EPILOG
LIT
END SIMDIR