1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-02-02 06:40:56 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/soupr/parse.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

2151 lines
48 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE INDIR
SEARCH PRS,UUOSYM
TWOSEG
RELOC 0
SPC: BLOCK SPCSIZ ;FILESPEC OF INDIRECT FILE
RELOC 400000
ENTRY INDIR
EXTERN CI,ICH,FNDCH,LKP,ICLS,SPCI,EATCR,BP,PRSSYN,CPOPJ1
INDIR: CAIE C,"@" ;INDIRECT?
POPJ P, ;NO
PUSHJ P,CI ;YES, EAT "@"
POPJ P,
PUSH P,P1 ;SAVE P1
PUSHJ P,PSPC ;PARSE THE SPEC
JRST INDDN2
PUSH P,ICH ;SAVE INPUT CH
PUSHJ P,FNDCH ;ALLOCATE A CH
HALT
PUSH P,T1 ;SAVE IT ON STACK
MOVEM T1,ICH ;AND SELECT IT
MOVEI P1,SPC ;OPEN THE FILE
PUSHJ P,LKP
JRST INDDON
INDLOP: MOVE T1,(P) ;SELECT THE CHANNEL
MOVEM T1,ICH
PUSHJ P,CI ;INPUT 1ST CHAR
JRST INDDON
PUSHJ P,@-3(P) ;LET USER PARSE THIS LINE
JFCL
JRST INDLOP
INDDON: POP P,ICH ;CLOSE THE FILE
PUSHJ P,ICLS
POP P,ICH ;RESTORE ORIGINAL CH
INDDN2: POP P,P1 ;RESTORE P1
POP P,T1 ;PUSHJ P,INDIR
POPJ P,
PSPC: SETZM SPC ;BUILD DEFAULT SPEC
MOVE T1,[XWD SPC,SPC+1]
BLT T1,SPC+SPCSIZ-1
MOVSI T1,SPCSIZ
MOVEM T1,SPC+.SBSIZ
MOVSI T1,'DSK'
MOVEM T1,SPC+.SBDEV
HRROI T1,.GTPRG
GETTAB T1,
MOVSI T1,'SPC'
MOVEM T1,SPC+.SBNAM
MOVSI T1,'CMD'
MOVEM T1,SPC+.SBEXT
MOVEI T1,.IOASC
MOVEM T1,SPC+.SBMOD
MOVEI P1,SPC ;PARSE THE SPEC
PUSHJ P,SPCI
POPJ P,
PUSHJ P,EATCR ;TEST FOR BREAK CHAR
POPJ P,
PUSHJ P,BP
JRST PRSSYN
JRST CPOPJ1
PRGEND
TITLE SWINI - READ SWITCH.INI
;THIS ROUTINE WILL READ SWITCH.INI ON A FREE CH AND PARSE THE SWITCHES
;ENTER WITH P2 AND P3 SET UP FOR SWTCH
;RETURNS CPOPJ IF I/O ERROR IN SWITCH.INI
;ELSE RETURNS CPOPJ1
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY SWINI
EXTERN EATCR,PRSSYN,BP,CPOPJ1
EXTERN SAVE1,ICH,FNDCH,FOO,SLKP,CI,ICLS,EATEOL,SIXI,SWTCH
SWINI: PUSHJ P,SAVE1 ;SAVE P1
PUSH P,ICH ;SAVE INPUT CH
PUSHJ P,FNDCH ;FIND A FREE CH
HALT
MOVEM T1,ICH
PUSH P,C ;SAVE CHAR
SETZM FOO ;CLEAR FOO
MOVE T1,[XWD FOO,FOO+1]
BLT T1,FOO+FOOSIZ-1
HRLZI T1,'DSK' ;SET UP FILESPEC
MOVEM T1,FOO+.SBDEV
HRLZI T1,'INI'
MOVEM T1,FOO+.SBEXT
MOVE T1,[SIXBIT /SWITCH/]
MOVEM T1,FOO+.SBNAM
HRROI T1,.GTPPN
GETTAB T1,
HALT
MOVEM T1,FOO+.SBPPN
MOVEI T1,.IOASC
MOVEM T1,FOO+.SBMOD
MOVEI P1,FOO ;LOOKUP THE FILE
PUSHJ P,SLKP
JRST WIN
HRROI P1,.GTPRG ;PROGRAM TO LOOK FOR
GETTAB P1,
HALT
SWLOP: PUSHJ P,CI ;INPUT 1ST CHAR
JRST SWINI9
PUSHJ P,SIXI ;INPUT THE PROGRAM NAME
JRST LOOSE
CAMN P1,T1 ;OUR NAME?
JRST SWFND ;YES, WE FOUND IT
PUSHJ P,EATEOL ;NO, EAT THE LINE
JRST LOOSE
JRST SWLOP ;KEEP LOOKING
SWFND: PUSHJ P,SWTCH ;PROCESS THE SWITCHES
JRST LOOSE
PUSHJ P,EATCR ;TEST FOR BREAK CHAR
JRST LOOSE
PUSHJ P,BP
JRST LOOSE
JRST WIN
LOOSE: TRON C,IO.ERR ;TYPED AN ERROR MESSAGE YET?
PUSHJ P,PRSSYN ;NO, USE THE CATCH ALL
SWINI9: TRNE C,IO.ERR ;EOF OR ERROR?
SOS -2(P) ;ERROR, NOSKIP RETURN
WIN: PUSHJ P,ICLS ;CLOSE SWITCH.INI
POP P,C ;RESTORE THE CHAR
POP P,ICH ;RESTORE THE CH
JRST CPOPJ1
PRGEND
TITLE VERBO - OUTPUT A VERBOSITY ERROR MESSAGE
;CALL:
; MOVEI T1,FOO
; PUSHJ P,VERBO
; ETC
; ADDR2
; ADDR1
;FOO: XWD BITS,"?"
; SIXBIT /PREFIX/
; ASCIZ /FIRST/
;WHERE THE FIRST OCCURENCE OF "^" IN FIRST CAUSES VERBO TO DO A
;PUSHJ TO ADDR1. IT IS ASSUMED THAT ADDR1 IS THE ADDRESS OF A ROUTINE
;THAT WILL TYPE OUT SOME VARIABLE PART OF THE ERROR MESSAGE.
;THE SECOND OCCURENCE OF "^" CAUSES VERBO TO DO A PUSHJ TO ADDR2. ETC.
;ARGS CAN BE PASSED FROM THE CALLER OF VERBO TO THE ADDRN ROUTINE IN P1.
;P1 IS PRESERVED THROUGH VERBO FOR THIS PURPOSE.
;THE ADDRN ROUTINE MAY RETURN CPOPJ OR CPOPJ1,
;BUT VERBO ALWAYS RETURNS CPOPJ
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY VERBO
EXTERN OCH,SAVE3,SIXO,CRLFO,CO,CPOPJ
VERBO: SETOM OCH ;OSELECT TTY
PUSHJ P,SAVE3 ;SAVE P1-P3
MOVE P2,T1 ;COPY ARG
HRROI P3,.GTWCH ;GET VERB BITS
GETTAB P3,
SETZ P3,
TLNN P3,(JW.WPR+JW.WFL)
HRLZI P3,(JW.WPR+JW.WFL)
PUSHJ P,CRLFO
HALT
MOVE T1,(P2) ;EAT TYPE AHEAD?
TLNE T1,(ER.EAT)
CLRBFI ;YES
HRRZ C,T1 ;TYPE "%" OR "?"
PUSHJ P,CO
HALT
MOVE T1,1(P2) ;GET PREFIX
TLNE P3,(JW.WPR) ;PREFIX?
PUSHJ P,SIXO ;YES, TYPE IT
JFCL
TLNN P3,(JW.WFL) ;FIRST?
POPJ P,
MOVEI C," "
PUSHJ P,CO
HALT
MOVEI P3,2(P2) ;YES, TYPE IT
HRLI P3,(POINT 7)
VERBO8: ILDB C,P3 ;GET NEXT CHAR
JUMPE C,CPOPJ ;QUIT IF EOS
CAIN C,"^" ;SPECIAL?
JRST VERBO9 ;YES
PUSHJ P,CO ;NO
HALT
JRST VERBO8
VERBO9: PUSHJ P,@-1(P2) ;FILL IN THE BLANK
JFCL
SOJA P2,VERBO8 ;BACK PNTR UP AND GO FOR MORE
PRGEND
TITLE SPCSI - PARSE A STRING OF FILE SPECS
;P1 PASSES ADR OF 1ST SPC (DESTROYED)
;SPC MUST BE PRE-LOADED WITH DEFAULTS
;P2+P3 PASS SWITCH ARGS
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY SPCSI
EXTERN SPCI,SWTCH,EATS,CPOPJ1,CI,GETBLK
SPCSI: PUSHJ P,SPCI ;GET FILE SPEC
POPJ P,
PUSHJ P,SWTCH ;DO SWITCHES
POPJ P,
PUSHJ P,EATS ;ANOTHER SPC COMING?
POPJ P,
CAIE C,","
JRST CPOPJ1 ;NO
PUSHJ P,CI ;YES, EAT THE COMMA
POPJ P,
HLRZ T1,.SBSIZ(P1) ;GET CORE FOR ANOTHER SPC
PUSHJ P,GETBLK
POPJ P,
ADD T1,T2 ;STICKY DEFAULTS
HRLZ T3,P1
HRR T3,T2
BLT T3,-1(T1)
HRRM T2,.SBNXT(P1) ;APPEND TO LINK LIST
MOVE P1,T2
JRST SPCSI ;GO GET THE SPC
PRGEND
TITLE LSTI - INPUT A SIXBIT LIST
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY LSTI
EXTERN CI,EATS,GETBLK,WSIXI,CPOPJ1,PRSSYN
LSTI: PUSHJ P,EATS ;EAT SPACES
POPJ P,
SETZ P1, ;0 MEANS END OF LIST
CAIE C,"(" ;REAL LIST OR JUST 1?
JRST LSTESY ;ONE
LSTLOP: PUSHJ P,CI ;EAT IT
POPJ P,
PUSHJ P,LSTESY ;GET ONE ITEM
POPJ P,
PUSHJ P,EATS ;EAT SPACES
POPJ P,
CAIN C,"," ;ANOTHER COMING?
JRST LSTLOP ;YES
CAIE C,")" ;NO, BETTER BE END
JRST PRSSYN
JRST CI ;EAT THE RIGHT
LSTESY: MOVEI T1,3 ;GET A CORE BLOCK
PUSHJ P,GETBLK
POPJ P,
HRRM P1,(T2) ;LINK IT TO FRONT OF LIST
MOVE P1,T2 ;NEW FRONT
PUSHJ P,WSIXI ;GET A SIXBIT WORD
POPJ P,
MOVEM T1,1(P1) ;STORE IT
MOVEM T2,2(P1)
JRST CPOPJ1
PRGEND
TITLE EXT - EXIT SWITCH
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY EXT
EXTERN EATEOL
EXT: PUSHJ P,EATEOL ;EAT UNTIL EOL
HALT
EXIT
PRGEND
TITLE EATEOL - EAT UNTIL EOL
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY EATEOL
EXTERN CI,BP,CPOPJ1
EATEO2: PUSHJ P,CI ;EAT IT
POPJ P,
;ENTER HERE
EATEOL: PUSHJ P,BP ;BREAK CHAR?
JRST EATEO2 ;NO
JRST CPOPJ1 ;YES
PRGEND
TITLE HELPER - HELP SWITCH
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY HELPER
EXTERN SAVE1,ICH,FNDCH,FOO,LKP,GETC,ICLS
HELPER: PUSHJ P,SAVE1 ;SAVE P1
PUSH P,ICH ;SAVE INPUT CH
PUSHJ P,FNDCH ;FIND A FREE CH
HALT
MOVEM T1,ICH ;ISELECT IT
PUSH P,C ;SAVE CHAR
SETZM FOO ;CLEAR FOO
MOVE T1,[XWD FOO,FOO+1]
BLT T1,FOO+FOOSIZ-1
HRLZI T1,'HLP' ;HLP:*.HLP
MOVEM T1,FOO+.SBDEV
MOVEM T1,FOO+.SBEXT
HRROI T1,.GTPRG ;GET PROGRAM NAME
GETTAB T1,
HALT
MOVEM T1,FOO+.SBNAM
MOVEI T1,.IOASC
MOVEM T1,FOO+.SBMOD
MOVEI P1,FOO ;LOOKUP THE FILE
PUSHJ P,LKP
JRST HLPDON
HLPLOP: PUSHJ P,GETC ;INPUT A CHAR
JRST HLPDON
OUTCHR C ;OUTPUT IT
JRST HLPLOP
HLPDON: PUSHJ P,ICLS ;RELEASE CH
POP P,C ;RECALL CHAR
POP P,ICH ;RECALL INPUT CH
POPJ P,
PRGEND
TITLE RST - RESET
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY RST
EXTERN FREMEM,RNGHDR
RST: RESET ;MONITOR DOES MOST
SETZM FREMEM ;NO FREE BLOCKS
SETZM RNGHDR ;CLEAR RING HDR TABLE
MOVE T1,[XWD RNGHDR,RNGHDR+1]
BLT T1,RNGHDR+17
POPJ P,
PRGEND
TITLE SWTCH - PARSE SWITCHES
;P2 PASSES AOBJN POINTER TO TABLE OF SWITCH NAMES
;P3 PASSES ADR OF TABLE OF ONE INSTRUCTION ROUTINES
;SWTCH WILL XCT THE INSTRUCTION CORRESPONDING TO THE SWITCH NAME.
;IF ONE INSTRUCTION ISN'T ENOUGH, USE A PUSHJ TO A SUBROUTINE.
;THE SUBROUTINE IS EXPECTED TO PRESERVE P1-P4, BUT MAY DESTROY T1-T4.
;THE SUBROUTINE IS EXPECTED TO RETURN CPOPJ.
;CPOPJ1 WILL BE REGARDED AS AN ERROR RETURN,
;AND SWTCH WILL PASS THE ERROR TO ITS CALLER BY RETURNING CPOPJ.
;SWTCH NORMALLY RETURNS CPOPJ1.
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY SWTCH
EXTERN EATS,CPOPJ1,CI,SIXI,FNDNAM
SWTCH: PUSHJ P,EATS ;EAT SPACES
POPJ P,
CAIE C,"/" ;ANY SWITCHES?
JRST CPOPJ1 ;NO
PUSHJ P,CI ;YES, EAT THE SLASH
POPJ P,
PUSHJ P,SIXI ;GET THE SWITCH NAME
POPJ P,
MOVE T2,P2 ;FIND IT IN TABLE
PUSHJ P,FNDNAM
POPJ P,
ADD T2,P3 ;XCT THE SWITCH
XCT (T2)
JRST SWTCH ;SWITCH WON, LOOK FOR ANOTHER
POPJ P, ;SWITCH LOST
PRGEND
TITLE WILDER - WILDCARD LOOKUP
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY WILDER
EXTERN WLDCNT,WILD,WLDNSF,CPOPJ1
WILDER: SETZM WLDCNT ;RESET COUNT
PUSHJ P,WILD ;WILDCARD LOOKUP
JFCL
SKIPN WLDCNT ;ANY FILES?
JRST WLDNSF ;NO
JRST CPOPJ1
PRGEND
TITLE WILD - WILDCARD LOOKUP
;P1 PASSES ADR FILE SPEC
;P2 PASSES ADR OF USER ROUTINE
;WILD WILL PUSHJ TO THE USER ROUTINE FOR EACH FILE MATCHED BY THE WILDCARD
;WHEN THE USER ROUTINE IS CALLED, P1 WILL STILL POINT TO THE FILE SPEC,
;BUT THE SPEC WILL HAVE BEEN MODIFIED TO REPRESENT THE PARTICULAR FILE
;THE USER ROUTINE MAY RETURN CPOPJ1 IF IT LIKES, NON-SKIP RETURNS
;ARE IGNORED
;WILD WILL RESTORE THE SPEC TO ITS ORG STATE BEFORE IT EXITS
;WILD MAY RETURN CPOPJ1 (MEANINGLESS)
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY WILD
EXTERN IINS,ICH,GETC,WILDP,WLDNSF,PRSIN,PRSOPN
EXTERN CPOPJ1,FOO,FNDCH,OPN,ICLS,CNVSPC,RNGHDR
EXTERN GETRNG,CPOPJ,PRSLKP,MYPATH,FIL,GETBLK,SLKP
DIRBLK=^D100 ;BLK OF DTA DIRECTORY
DTNAM=^D83 ;INDEX OF 1ST FILENAME IN DIR
DTNUM=^D22 ;FILES IN DIR
DTEXT=DTNAM+DTNUM ;INDEX OF 1ST EXT
WILD: PUSHJ P,WILDP ;ANY WILD CARDS?
JRST (P2) ;NO, JUST DO IT
SKIPE .SMDEV(P1) ;WILD DEVICE?
JRST AL ;YES, SUBSET OF ALL
MOVE T1,.SBDEV(P1) ;NO, GET DEVICE TYPE
DEVCHR T1,
TLNE T1,(DV.DTA) ;DEC-TAPE?
JRST DTA ;YES
TLNN T1,(DV.DSK) ;DISK?
JRST (P2) ;NO, NOT A DIRECTORY DEVICE
MOVE T1,.SBDEV(P1) ;YES, GET IT'S PATH
MOVEM T1,FOO
MOVE T2,[XWD FOOSIZ,FOO]
PATH. T2,
HALT
MOVE T1,FOO ;UNDONE LOGICAL NAME
MOVE T2,FOO+.PTSWT ;GET SWITCHES
LDB T3,[POINT 3,T2,29] ;GET SEARCH LIST TYPE
TRNN T2,PT.IPP ;ERSATZ?
JRST WILD1
MOVE T4,FOO+.PTPPN ;YES, OVER-RIDE USER PATH
MOVEM T4,.SBPPN(P1)
IFN SFDS,<
SETZM .SBPPN+1(P1)
>
SETZM .SMPPN(P1)
CAIN T3,.PTSLN ;ERSATZ WITH NO SEARCH LIST?
HRLI T1,'DSK' ;YES, USE THAT PPN ON DSKX
WILD1: MOVEM T1,.SBDEV(P1) ;PUT FINAL VERSION OF DEVICE BACK
CAMN T1,[SIXBIT /DSK/] ;IS IT DEFAULT DSK?
MOVEI T3,.PTSLJ ;YES, AVOID A MONITOR BUG
CAIN T3,.PTSLN ;NON-STANDARD SEARCH LIST
JRST WLD
CAIN T3,.PTSLJ ;JOB SEARCH LIST
JRST JOB
CAIN T3,.PTSLA ;ALL SEARCH LIST
JRST ALL
CAIN T3,.PTSLS ;SYS SEARCH LIST
JRST SYS
HALT
;JOB SEARCH LIST
JOB: SETOB T1,T2 ;OUR JOB, OUR PPN
JRST SYS1
;SYS SEARCH LIST
SYS: SETZ T1, ;SYS=JOB 0
SYS1: SETO T3, ;1ST STR IN SEARCH LIST
PUSH P,.SBDEV(P1) ;SAVE ORG DEVICE
PUSH P,.SMDEV(P1)
PUSH P,T1 ;SAVE GOBSTR ARG BLK IN STACK
PUSH P,T2
PUSH P,T3
SYSLOP: MOVEI T1,-2(P) ;GET NEXT STR
HRLI T1,3
GOBSTR T1,
HALT
SKIPN T1,(P)
JRST SYSDON ;FENCE
MOVEM T1,.SBDEV(P1) ;PASS IT TO USER
PUSHJ P,WLD ;DO WILD CARDS
JFCL
JRST SYSLOP ;TRY FOR ANOTHER STR
;ALL SEARCH LIST
ALL: SETOM .SMDEV(P1) ;MAKE ALL *
AL: PUSH P,.SBDEV(P1) ;SAVE ORG DEVICE
PUSH P,.SMDEV(P1) ;AND MASK
SETZM .SMDEV(P1) ;PASS NON-WILD MASK TO USER
TDZA T1,T1 ;1ST STR IN SEARCH LIST
ALLOP: MOVE T1,.SBDEV(P1) ;GET NEXT STR
SYSSTR T1,
HALT
JUMPE T1,ALLDON ;0 MEANS NONE LEFT
MOVEM T1,.SBDEV(P1) ;PASS IT TO USER
XOR T1,-1(P) ;MATCH WILD MASK?
ANDCM T1,(P)
JUMPN T1,ALLOP ;NO, TRY NEXT STR
PUSHJ P,WLD ;YES, DO WILDCARDS
JFCL
JRST ALLOP ;TRY FOR ANOTHER
;HERE WHEN SYS SEARCH IS DONE
SYSDON: POP P,T3 ;EAT GOBSTR ARG BLK
POP P,T2
POP P,T1
;HERE WHEN ALL SEARCH IS DONE
ALLDON: POP P,.SMDEV(P1) ;RESTORE MASK
POP P,.SBDEV(P1) ;RESTORE DEVICE
JRST CPOPJ1
;HERE WHEN DEVICE IS DEC-TAPE
DTA: HRRZ T1,.SMEXT(P1) ;ANY WILDCARDS?
IOR T1,.SMNAM(P1)
JUMPE T1,(P2) ;NO, JUST GOTO USER ROUTINE
PUSHJ P,FNDCH ;FIND A FREE CH
HALT
MOVEM T1,ICH ;ISELECT IT
MOVEI T1,3 ;GET A RING HDR
PUSHJ P,GETBLK
POPJ P,
MOVEM T2,OPN+.OPBUF
MOVE T1,.SBDEV(P1) ;AND BUILD OPEN BLK
MOVEM T1,OPN+.OPDEV
MOVEI T1,.IOIBN
MOVEM T1,OPN+.OPMOD
PUSHJ P,IINS ;OPEN IT
OPEN OPN
JRST PRSOPN
MOVE T3,ICH ;STORE ADR RING HDR
HRRZ T2,OPN+.OPBUF
HRRM T2,RNGHDR(T3)
PUSHJ P,GETRNG ;GET BUF RING
JRST ICLS
PUSHJ P,IINS ;WILL READ DIRECTORY BLOCK
USETI DIRBLK
PUSHJ P,IINS ;READ IT
IN
CAIA ;WIN
JRST PRSIN ;COMPLAIN
PUSHJ P,IINS ;RELEASE CH
RELEAS
PUSH P,.SBNAM(P1) ;-3(P) SAVE ORG STUFF
PUSH P,.SMNAM(P1) ;-2(P)
SETZM .SMNAM(P1) ;PASS NON-WILD MASK TO USER
PUSH P,.SBEXT(P1) ;-1(P)
MOVE T1,OPN+.OPBUF ;GET ADR OF BUF
HRRZ T1,1(T1)
TLOA T1,-<DTNUM+1> ;AOB POINTER
DTALOP: POP P,T1 ;RECALL COUNTS
AOBJP T1,DTADON ;BUMP COUNTS
PUSH P,T1 ;STORE COUNTS AGAIN
SKIPN T2,DTNAM-1(T1) ;GET FILENAME FROM DIR
JRST DTALOP
MOVEM T2,.SBNAM(P1) ;PASS IT TO USER
XOR T2,-3(P) ;MATCH WILD MASK?
ANDCM T2,-2(P)
JUMPN T2,DTALOP ;NO, TRY NEXT FILE
MOVE T2,DTEXT-1(T1) ;GET EXTENSION FROM DIR
HLLZM T2,.SBEXT(P1) ;PASS IT TO USER
XOR T2,-1(P) ;MATCH WILD MASK?
HRLO T3,-1(P)
ANDCM T2,T3
JUMPN T2,DTALOP ;NO, TRY NEXT FILE
PUSHJ P,(P2) ;YES, DO USER ROUTINE
JFCL
JRST DTALOP ;TRY FOR ANOTHER FILE
;HERE WHEN ALL 22 DTA FILES ARE DONE
DTADON: POP P,.SBEXT(P1) ;RESTORE ORG STUFF
POP P,.SMNAM(P1)
POP P,.SBNAM(P1)
PUSHJ P,ICLS ;CLOSE THE CH
JRST CPOPJ1
;ROUTINE TO DO DISK WILDCARDS
;P1 PASSES ADR FILE SPEC
;P2 PASSES ADR USER ROUTINE
;POSSIBLE SKIP RETURN (MEANINGLESS)
WLD: PUSHJ P,WILDP ;WILD?
JRST (P2) ;NO, JUST GOTO USER ROUTINE
PUSH P,P3 ;0(P3) BUILD ARG BLK TO WLDU IN STACK
MOVE P3,P ;SAVE IT'S ADR
PUSH P,P2 ;1(P3)
MOVEI P2,WLDU
PUSH P,.SBNAM(P1) ;2(P3)
PUSH P,.SMNAM(P1) ;3(P3)
PUSH P,.SBEXT(P1) ;4(P3)
PUSHJ P,PSHSPC ;GET PARENT DIR
PUSHJ P,WLD ;CALL WLDU FOR EACH FILE IN DIR
JFCL
PUSHJ P,POPSPC ;GET OFFSPRING PATH
POP P,.SBEXT(P1) ;RESTORE ORG STUFF
POP P,.SMNAM(P1)
POP P,.SBNAM(P1)
POP P,P2
POP P,P3
POPJ P,
;WLD IS SUPPOSED TO CALL A USER ROUTINE
;SOMETIMES IT CALLS ITSELF RECURSIVELY INSTEAD
;IF SO, IT REPLACES THE USER CALL WITH A CALL TO WLDU
;WLDU'S FUNCTION IS TO CALL THE ORG USER ROUTINE,
;ONCE FOR EACH FILE IN THE DIR
;CALL:
; MOVEI P1,<SPEC OF DIR>
; MOVEI P2,WLDU
; MOVEI P3,FOO
; PUSHJ P,(P2)
; JFCL
;FOO: WHEN CALLED RECURSIVELY, ADR OF CALLER'S ARG BLOCK
;FOO+1: ADR USER ROUTINE CALLER WAS SUPPOSED TO CALL
;FOO+2: NAME OF FILE TO FIND IN DIR
;FOO+3: WILD MASK FOR ABOVE FILENAME
;FOO+4: EXTENSION AND MASK
WLDU: PUSHJ P,FNDCH ;FIND A FREE CH
HALT
MOVEM T1,ICH ;ISELECT IT
PUSHJ P,LU ;LOOKUP THE DIR
JRST WLDLKP
PUSHJ P,POPSPC ;GET OFFSPRING PATH
MOVE P2,1(P3) ;RESTORE ADR ORG USER ROUTINE
PUSH P,P3 ;SAVE ADR ARG BLK
HRRZ T1,4(P3) ;WILD?
IOR T1,3(P3)
MOVE P3,(P3) ;RESTORE ADR CALLER'S ARG BLK
JUMPE T1,WLDESY ;NO, EASY
SETZM .SMNAM(P1) ;PASS NON-WILD MASK TO USER
WLDLOP: PUSHJ P,GETC ;INPUT THE FILE NAME
JRST WLDEOF ;EOF OR ERROR
MOVEM C,.SBNAM(P1) ;PASS IT TO USER
PUSHJ P,GETC ;INPUT THE EXTENSION
HALT
HLLZM C,.SBEXT(P1) ;PASS IT TO USER
SKIPN T1,.SBNAM(P1) ;NULL FILE?
JRST WLDLOP ;YES, IGNORE IT
MOVE T2,(P) ;FILENAME MATCH MASK?
XOR T1,2(T2)
ANDCM T1,3(T2)
JUMPN T1,WLDLOP ;NO, TRY NEXT FILE
XOR C,4(T2) ;EXTENSION MATCH MASK?
HRLO T1,4(T2)
ANDCM C,T1
JUMPN C,WLDLOP ;NO, TRY NEXT FILE
PUSH P,ICH ;SAVE DIR CH
PUSHJ P,(P2) ;CALL USER ROUTINE
JFCL
POP P,ICH ;RESTORE DIR CH
JRST WLDLOP ;TRY FOR ANOTHER FILE
;HERE WHEN SPEC ISN'T WILD AFTER ALL
WLDESY: MOVE T2,(P) ;GET ADR ARG BLK
MOVE T1,2(T2) ;PUT IN NAME OF FILE
MOVEM T1,.SBNAM(P1)
MOVE T1,4(T2)
MOVEM T1,.SBEXT(P1)
PUSH P,ICH ;SAVE CH
PUSHJ P,(P2) ;CALL USER ROUTINE
JFCL
POP P,ICH ;RESTORE CH
WLDEOF: PUSHJ P,PSHSPC ;GET PARENT DIR BACK
POP P,P3 ;RESTORE ADR ARG BLK
MOVEI P2,WLDU ;RESTORE P2
WLDLKP: JRST ICLS ;RELEASE THE CH
;ROUTINE TO FIND PARENT SFD OR UFD
;P1 PASSES ADR OF FILE SPEC
;THE SPEC IS NOT PRESERVED!
;IT IS CONVERTED INTO PARENT SPEC
PSHSPC: SKIPN .SBPPN(P1) ;PATH SPECIFIED?
PUSHJ P,MYPATH ;NO, USE DEFAULT
IFE SFDS,<
MOVE T2,.SBPPN(P1) ;MOVE UFD TO FRONT
MOVEM T2,.SBNAM(P1)
MOVE T2,.SMPPN(P1)
MOVEM T2,.SMNAM(P1)
> ;END IFE SFDS
IFN SFDS,<
MOVE T1,P1 ;FIND END OF PATH
PSHSP1: SKIPE .SBPPN+1(T1)
AOJA T1,PSHSP1
MOVE T2,.SBPPN(T1) ;MOVE LAST SFD TO FRONT
MOVEM T2,.SBNAM(P1)
MOVE T2,.SMPPN(T1)
MOVEM T2,.SMNAM(P1)
HRLZI T2,'SFD'
MOVEM T2,.SBEXT(P1)
SETZM .SBPPN(T1) ;CHOP IT OFF THE END
CAME T1,P1 ;IT WAS AN SFD WASN'T IT?
POPJ P, ;YES, LUCKY GUESS
> ;END IFN SFDS
HRLZI T2,'UFD' ;NO, OOPS A UFD
MOVEM T2,.SBEXT(P1)
MOVE T2,[%LDMFD] ;A UFD'S PARENT IS THE MFD
GETTAB T2, ;GET THE MFD PPN
MOVE T2,[XWD 1,1]
MOVEM T2,.SBPPN(P1)
SETZM .SMPPN(P1) ;THERE'S ONLY ONE MFD!
POPJ P,
;THIS ROUTINE IS THE CONVERSE OF PSHSPC
;IE IT CONVERTS THE SPEC OF A DIR INTO THE PATH OF AN OFFSPRING FILE
POPSPC: IFN SFDS,<
MOVE T1,P1 ;ASSUME UFD
HLRZ T2,.SBEXT(P1) ;A UFD?
CAIN T2,'UFD'
JRST POPSP1 ;YES, ALREADY KNOW LENGTH OF PATH
POPSP2: SKIPE .SBPPN(T1) ;NO, FIND END OF PATH
AOJA T1,POPSP2
POPSP1: MOVE T2,.SBNAM(P1) ;MOVE FILE THERE
MOVEM T2,.SBPPN(T1)
MOVE T2,.SMNAM(P1)
MOVEM T2,.SMPPN(T1)
SETZM .SBPPN+1(T1) ;ADD TERMINATOR
> ;END IFN SFDS
IFE SFDS,<
MOVE T2,.SBNAM(P1) ;MOVE FILE TO PATH
MOVEM T2,.SBPPN(P1)
MOVE T2,.SMNAM(P1)
MOVEM T2,.SMPPN(P1)
> ;END IFE SFDS
POPJ P,
LU: PUSH P,.SBMOD(P1) ;SAVE ORG MODE
MOVEI T1,.IOIBN ;SET MODE TO IMAGE
MOVEM T1,.SBMOD(P1)
PUSHJ P,SLKP ;TRY TO LOOKUP
JRST LU0
POP P,.SBMOD(P1) ;RESTORE ORG MODE
JRST CPOPJ1
LU0: POP P,.SBMOD(P1) ;RESTORE ORG MODE
HRRZ T1,FIL+1 ;GET ERROR CODE
JUMPE T1,CPOPJ ;ERFNF% FILE NOT FOUND
IFN SFDS,<
CAIE T1,ERSNF% ;SFD NOT FOUND
> ;END IFN SFDS
CAIN T1,ERIPP% ;UFD NOT FOUND
POPJ P,
JRST PRSLKP
PRGEND
TITLE WLDNSF
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY WLDNSF
INTERN WLDCNT
EXTERN SPCO,VERBO
WLDNSF: MOVEI T1,WLD1
PJRST VERBO
SPCO
WLD1: VB 0,"%",WLDNSF,<No such files as ^>
LIT ;PUT LITERALS IN HISEG
RELOC 0 ;SWITCH TO LOWSEG
WLDCNT: BLOCK 1 ;COUNT OF FILES
PRGEND
TITLE WILDP - TEST IF SPEC IS WILD
;P1 PASSES ADR SPEC
;SKIP IF WILD
;THIS ROUTINE ONLY CONSIDERS THE MASK WORDS
;IT DOESN'T CHECK SEARCH LISTS
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY WILDP
EXTERN CPOPJ1
WILDP: HRRZ T1,.SMEXT(P1) ;EXTENSION
IOR T1,.SMDEV(P1) ;DEVICE
IOR T1,.SMNAM(P1) ;FILENAME
IFN SFDS,<
SKIPA T2,P1 ;SETUP LOOP
WILDP1: IOR T1,.SMPPN-1(T2) ;SFD
SKIPE .SBPPN(T2) ;LAST SFD?
AOJA T2,WILDP1 ;NO, TRY NEXT
> ;END IFN SFDS
IFE SFDS,<
IOR T1,.SMPPN(P1) ;UFD
> ;END IFE SFDS
JUMPN T1,CPOPJ1
POPJ P,
PRGEND
TITLE FNDCH - FIND A FREE CH
;T1 RETURN CH
;SKIP IF WIN
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY FNDCH
EXTERN CPOPJ1
FNDCH: MOVEI T1,17 ;COUNT CH'S
FNDCH1: MOVE T2,T1 ;GET DEVICE TYPE
DEVTYP T2,
HALT
JUMPE T2,CPOPJ1 ;0 MEANS NOT OPEN
SOJGE T1,FNDCH1 ;ELSE TRY NEXT CH
HALT
PRGEND
TITLE IREN - RENAME INPUT
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY IREN
EXTERN CNVSPC,IINS,FIL,PRSLKP,ICLS,CPOPJ1
IREN: PUSHJ P,CNVSPC ;CONVERT TO TRAD FORMAT
PUSHJ P,IINS ;RENAME IT
RENAME FIL
JRST PRSLKP
PUSHJ P,ICLS ;CLOSE CH
JRST CPOPJ1
PRGEND
TITLE OREN - RENAME OUTPUT
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY OREN
EXTERN CNVSPC,OINS,FIL,PRSLKP,OCL,PUTBUF,CPOPJ1
OREN: PUSHJ P,PUTBUF ;OUTPUT LAST BUF
POPJ P,
PUSHJ P,CNVSPC ;CONVERT TO TRAD FORMAT
PUSHJ P,OINS ;RENAME IT
RENAME FIL
JRST PRSLKP
PUSHJ P,OCL ;CLOSE CH
JRST CPOPJ1
PRGEND
TITLE LKP - LOOKUP A FILE
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY LKP
EXTERN SLKP,PRSLKP,CPOPJ1
LKP: PUSHJ P,SLKP ;DO THE LOOKUP
JRST PRSLKP
JRST CPOPJ1
PRGEND
TITLE SLKP - LOOKUP A FILE
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY SLKP
EXTERN OPN,ICLS,GETBLK
EXTERN ICH,RNGHDR,GETRNG,CNVSPC,IINS,FIL,CPOPJ1
SLKP: PUSHJ P,ICLS ;IN CASE ALREADY OPEN
PUSHJ P,CNVSPC ;CONVERT TO TRAD FORMAT
MOVEI T1,3 ;GET A RING HDR
PUSHJ P,GETBLK
POPJ P,
MOVEM T2,OPN+.OPBUF ;STORE ADR
MOVE T3,ICH
HRRM T2,RNGHDR(T3)
PUSHJ P,IINS ;OPEN DEV
OPEN OPN
JRST SLKP0
HRRZ T2,OPN+.OPBUF ;GET BUF RING
PUSHJ P,GETRNG
POPJ P,
PUSHJ P,IINS ;LOOKUP FILE
LOOKUP FIL
POPJ P,
JRST CPOPJ1
SLKP0: MOVEI T1,ERNSD% ;OPEN FAILED
HRRM T1,FIL+1
POPJ P,
PRGEND
TITLE NTR - ENTER A FILE
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY NTR
EXTERN OCH,RNGHDR,GETRNG,CNVSPC,OINS,FIL,PRSOPN,PRSLKP,CPOPJ1
EXTERN OPN,OCL,GETBLK
NTR: PUSHJ P,OCL ;IN CASE ALREADY OPEN
PUSHJ P,CNVSPC ;CONVERT TO TRAD FORMAT
MOVEI T1,3 ;GET A RING HDR
PUSHJ P,GETBLK
POPJ P,
HRLZM T2,OPN+.OPBUF ;STORE ADR
MOVE T3,OCH
HRLM T2,RNGHDR(T3)
PUSHJ P,OINS ;OPEN DEV
OPEN OPN
JRST PRSOPN
HLRZ T2,OPN+.OPBUF ;GET BUF RING
PUSHJ P,GETRNG
POPJ P,
PUSHJ P,OINS ;ENTER FILE
ENTER FIL
JRST PRSLKP
JRST CPOPJ1
PRGEND
TITLE PRSOPN
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY PRSOPN
EXTERN FIL,PRSLKP
PRSOPN: MOVEI T1,ERNSD% ;NO SUCH DEVICE
HRRM T1,FIL+1
JRST PRSLKP
PRGEND
TITLE PRSLKP
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PRSLKP
EXTERN OCTO,SPCO,FIL,VERBO
PRSLKP: MOVEI T1,ERRM
PJRST VERBO
SPCO
ERRM1
ERRM: VB ER.EAT,"?",PRSLKP,<LOOKUP ENTER error ^ for ^>
ERRM1: HRRZ T1,FIL+1
PJRST OCTO
PRGEND
TITLE ICLS - CLOSE INPUT CH
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY ICLS
EXTERN IINS,ICH,RNGHDR,DELRNG
ICLS: PUSHJ P,IINS ;RELEASE IT
RELEAS
MOVE T2,ICH ;GET ADR RING HDR
HRRZ T1,RNGHDR(T2)
HLLZS RNGHDR(T2) ;CLEAR SAME
JRST DELRNG ;RECLAIM CORE
PRGEND
TITLE OCLS - CLOSE OUTPUT CH
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY OCLS
EXTERN PUTBUF,OCL,CPOPJ1
OCLS: PUSHJ P,PUTBUF ;OUTPUT LAST BUF
POPJ P,
PUSHJ P,OCL
JRST CPOPJ1
PRGEND
TITLE OCL
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY OCL
EXTERN RNGHDR,OINS,OCH,DELRNG
OCL: PUSHJ P,OINS ;RELEASE IT
RELEAS
MOVE T2,OCH ;GET ADR RING HDR
HLRZ T1,RNGHDR(T2)
HRRZS RNGHDR(T2) ;CLEAR SAME
;FALL TO DELRNG
PRGEND
TITLE DELRNG
;T1 PASSES ADR RING HDR
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY DELRNG
EXTERN CPOPJ,FREMEM
DELRNG: JUMPE T1,CPOPJ ;QUIT IF NO HDR
MOVEI T2,3 ;LENGHT HDR
HRRZ T3,(T1) ;ADR 1ST BUF
RNGLOP: SETZM 1(T1) ;FLAG THAT WE'VE BEEN HERE
HRLZM T2,(T1) ;STORE LENGHT
HRRZ T2,FREMEM ;DELETE BLK
HRRM T2,(T1)
HRRM T1,FREMEM
MOVEI T1,-1(T3) ;TOP OF BLK
HLRZ T2,1(T1) ;LENGHT
ADDI T2,2
HRRZ T3,1(T1) ;ADR NEXT BUF
JUMPN T3,RNGLOP ;LOOP UNLESS BEEN HERE BEFORE
POPJ P,
PRGEND
TITLE PUR - PURGE CORE
;RECLAIMS CORE FROM A LINKAGE LIST
;T1 PASSES ADR OF ADR OF LIST
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PUR
EXTERN CPOPJ,FREMEM
PUR: HRRZ T2,(T1) ;ADR NEXT BLK
JUMPE T2,CPOPJ ;QUIT IF NONE
HRRZ T3,(T2) ;UNLINK IT
HRRM T3,(T1)
HRRZ T3,FREMEM ;LINK TO FREE LIST
HRRM T3,(T2)
HRRM T2,FREMEM ;NEW 1ST FREE
JRST PUR ;TRY ANOTHER
PRGEND
TITLE GETRNG - GET BUF RING
;T2 PASSES ADR RING HDR
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY GETRNG
EXTERN SAVE2,GETBLK,CPOPJ1,OPN
GETRNG: PUSHJ P,SAVE2 ;SAVE P1-P2
MOVE P2,T2 ;P2=ADR RING HDR
MOVEI T1,OPN ;GET DEVICE SIZE
DEVSIZ T1,
HALT
HLRZ P1,T1 ;P1=# BUFS
TLZ T1,-1 ;T1=SIZE BUF
RNGLOP: PUSHJ P,GETBLK ;GET A CORE BLK
POPJ P,
AOS T3,T2 ;USE ADR+1
HRLI T3,(1B0) ;SET USE BIT
SKIPN (P2) ;1ST BUF?
MOVEM T3,(P2) ;YES, STORE ADR IN HDR
MOVE T3,@(P2) ;GET LINK FROM 1ST BUF
MOVEM T3,(T2) ;MOVE TO NEW BUF
HRLI T2,-2(T1) ;BUILD LINK TO NEW BUF
MOVEM T2,@(P2) ;STORE IN 1ST BUF
SOJG P1,RNGLOP ;LOOP FOR EACH BUF
JRST CPOPJ1
PRGEND
TITLE GETBLK - GET A CORE BLOCK
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY GETBLK
EXTERN .JBFF,.JBREL,PRSCOR,SAVE3,CPOPJ1,CPOPJ,FREMEM
;T1 PASSES SIZE OF BLK (PRESERVED)
;T2 RETURNS ADR OF BLK
GETBLK: PUSHJ P,TRYBLK ;ANY FREE BLOCKS?
JRST GOT ;YES
MOVE T2,.JBFF ;NO, ENOUGH CORE TO MAKE 1?
ADD T2,T1
CAMG T2,.JBREL
JRST GETESY ;YES
PUSHJ P,GC ;NO, GARBAGE COLLECT
PUSHJ P,TRYBLK ;TRY AGAIN
JRST GOT ;WIN
MOVE T2,.JBFF ;STILL LOSE, GET MORE CORE
ADD T2,T1
MOVE T3,T2
CORE T3,
JRST PRSCOR
GETESY: EXCH T2,.JBFF ;T2=ADR OF BLK
GOT: HRLZM T1,(T2) ;BLK KNOWS ITS OWN SIZE
JRST CPOPJ1
;ROUTINE TO TRY TO FIND A FREE CORE BLK
;T1 PASSES SIZE OF BLK (PRESERVED)
;T2 RETURNS ADR OF BLK
;SKIP IF FAIL
TRYBLK: PUSHJ P,SAVE3 ;SAVE P1-P3
SETO P1, ;FLAG NONE SO FAR
MOVEI P2,FREMEM ;POINT TO 0TH FREE BLK
TRYLOP: MOVE P3,P2 ;ADVANCE TO NEXT BLK
HRRZ P2,(P3)
JUMPE P2,TRY1 ;QUIT IF NO MORE BLKS
HLRZ T4,(P2) ;GET SIZE OF BLK
CAML T4,T1 ;BIG ENOUGH?
CAIL T4,(P1) ;AND SMALLEST SO FAR?
JRST TRYLOP ;NO
MOVE P1,T4 ;YES, REMEMBER WHERE IT IS
MOVE T3,P3
CAME P1,T1 ;BEST PERFECT?
JRST TRYLOP ;NO, CHECK THE REST
TRY1: JUMPL P1,CPOPJ1 ;QUIT IF NO WINNERS AT ALL
HRRZ T2,(T3) ;ADR OF BEST
CAMG P1,T1 ;TOO BIG?
JRST TRYESY ;NO, JUST RIGHT
MOVE P2,T2 ;COMPUTE ADR OF LEFTOVER
ADD P2,T1
SUB P1,T1 ;COMPUTE SIZE OF LEFTOVER
HRL P1,(T2) ;SPLIT INTO TWO BLKS
MOVSM P1,(P2)
HRL P2,T1
MOVEM P2,(T2)
TRYESY: HRRZ T4,(T2) ;UNLINK THE BLK
HRRM T4,(T3)
POPJ P,
;GARBAGE COLLECT ROUTINE
;COMBINES CONSECUTIVE FRAGMENTS
;T1 IS PRESERVED
GC: PUSHJ P,SAVE3 ;SAVE P1-P3
MOVEI P3,FREMEM ;POINT TO 0TH FREE BLK
GCLOP1: HRRZ P3,(P3) ;ADVANCE TO NEXT BLK
JUMPE P3,CPOPJ ;QUIT IF NO MORE BLKS
HLRZ T3,(P3) ;COMPUTE ADR JUST PAST END
GCAGN: ADD T3,P3
MOVEI P2,FREMEM ;SEARCH FOR A FREE BLK THERE
GCLOP2: MOVE P1,P2
HRRZ P2,(P1)
JUMPE P2,GCLOP1
CAME P2,T3
JRST GCLOP2
HRRZ T3,(P2) ;UNLINK IT
HRRM T3,(P1)
HLRZ T3,(P3) ;COMPUTE SIZE COMBINED BLK
HLRZ T2,(P2)
ADD T3,T2
HRLM T3,(P3) ;COMBINE THEM
JRST GCAGN
PRGEND
TITLE PRSCOR
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PRSCOR
PRSCOR: ERR 0,"%",PRSCOR,<Not enough core>
PRGEND
TITLE SPCO - OUTPUT FILE SPEC
;P1 PASSES ADR SPEC
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY SPCO
EXTERN SIXO,CO,CPOPJ1,FOO,SAVE1,SAVE2
SPCO: MOVE T2,.SBDEV(P1) ;DEVICE NAME
SKIPE T4,.SMDEV(P1) ;WILD DEVICE?
JRST SPCO5 ;YES, NOT DSK
CAMN T2,[SIXBIT /DSK/] ;DEVICE DSK?
JRST SPCO1 ;YES, DON'T SAY IT
SPCO5: PUSHJ P,WSIXO ;SAY DEVICE
POPJ P,
MOVEI C,":"
PUSHJ P,CO
POPJ P,
SPCO1: HLRZ T1,.SBEXT(P1) ;UFD?
CAIE T1,'UFD'
JRST NOTUFD ;NO
MOVE T1,.SBNAM(P1) ;YES, OUTPUT FILENAME AS PPN
MOVE T2,.SMNAM(P1)
PUSHJ P,WPPNO
POPJ P,
MOVEI C,"]" ;RIGHT BRACKET
PUSHJ P,CO
POPJ P,
JRST UFD
NOTUFD: MOVE T2,.SBNAM(P1) ;FILENAME
MOVE T4,.SMNAM(P1)
PUSHJ P,WSIXO
POPJ P,
UFD: MOVEI C,"." ;DOT
PUSHJ P,CO
POPJ P,
HLLZ T2,.SBEXT(P1) ;EXTENSION
HRRZ T4,.SMEXT(P1)
CAIN T4,-1
SETO T4,
MOVSS T4
PUSHJ P,WSIXO
POPJ P,
SKIPE .SMDEV(P1) ;WILD DEVICE MEANS DISK
JRST SPCO2
MOVE T1,.SBDEV(P1) ;A DISK?
DEVCHR T1,
TLNN T1,(DV.DSK)
JRST CPOPJ1 ;NO, ONLY DISKS HAVE PATHS
SPCO2: SKIPN .SBPPN(P1) ;PATH SPECIFIED?
JRST CPOPJ1 ;NO
SETOM FOO ;GET DEFAULT PATH
MOVE T1,[XWD SFDS+4,FOO]
PATH. T1,
HALT
IFE SFDS,<
SKIPE .SMPPN(P1) ;ALWAYS PRINT WILDCARDS
JRST SPCO3
MOVE T1,FOO+.PTPPN ;MATCHES DEFAULT PATH?
CAMN T1,.SBPPN(P1)
JRST CPOPJ1 ;YES, DON'T SAY IT
>
IFN SFDS,<
MOVE T1,P1 ;POINTERS TO PATH
MOVEI T2,FOO+.PTPPN
SPCO4: SKIPE T3,.SBPPN(T1) ;GET WORD FROM PATH
SKIPN .SMPPN(T1) ;ALWAYS PRINT WILDCARDS
CAME T3,(T2) ;PRINT IF NOT DEFAULT
JRST SPCO3
JUMPE T3,CPOPJ1 ;QUIT IF LAST SFD
ADDI T2,1 ;LOOP UNTIL 0 SFD
AOJA T1,SPCO4
>
SPCO3: MOVE T1,.SBPPN(P1) ;OUTPUT PPN
MOVE T2,.SMPPN(P1)
PUSHJ P,WPPNO
POPJ P,
IFN SFDS,<
PUSHJ P,SAVE1 ;SAVE P1
SPCLOP: SKIPN .SBPPN+1(P1) ;ANOTHER SFD?
JRST SPCDON ;NO
MOVEI C,"," ;YES, COMMA
PUSHJ P,CO
POPJ P,
MOVE T2,.SBPPN+1(P1) ;SFD
MOVE T4,.SMPPN+1(P1)
PUSHJ P,WSIXO
POPJ P,
AOJA P1,SPCLOP ;LOOP UNTIL 0 SFD
> ;END IFN FTSFDS
SPCDON: MOVEI C,"]" ;END PATH
JRST CO
;ROUTINE TO OUTPUT A PPN WITH WILDCARDS
;T1 PASSES PPN
;T2 PASSES MASK
WPPNO: PUSHJ P,SAVE2 ;SAVE P1-P2
MOVE P1,T1 ;SAVE PPN
MOVE P2,T2 ;SAVE MASK
MOVEI C,"[" ;LEFT BRACKET
PUSHJ P,CO
POPJ P,
HLRZ T1,P1 ;PROJECT
HLRZ T3,P2 ;PROJECT MASK
PUSHJ P,WOCTO ;OUTPUT IT
POPJ P,
MOVEI C,"," ;COMMA
PUSHJ P,CO
POPJ P,
HRRZ T1,P1 ;PROGRAMMER
HRRZ T3,P2 ;PROGRAMMER MASK
;FALL TO WOCTO
;ROUTINE TO OUTPUT OCTAL NUMBER WITH WILDCARDS
;T1 PASSES NUMBER
;T3 PASSES MASK
WOCTO: SETZB T2,T4
WOCTO1: LSHC T1,-3 ;GET LOW ORDER NIBBLE
LSH T2,-3 ;CONVERT TO SIXBIT
TLO T2,'0 '
LSHC T3,-3 ;GET LOW ORDER NIBBLE OF MASK
ASH T4,-3 ;REPLICATE HIGH BIT
JUMPN T1,WOCTO1 ;LOOP UNTIL WORD GONE
JUMPN T3,WOCTO1 ;AND MASK GONE
;FALL TO WSIXO
;ROUTINE TO OUTPUT SIXBIT NAME WITH WILDCARDS
;T2 PASSES NAME
;T4 PASSES MASK
WSIXO: ANDCM T2,T4 ;REMOVE WILD FIELDS
MOVE T1,[SIXBIT /??????/] ;EXTRACT WILD FIELDS
AND T1,T4
ADD T1,T2 ;COMBINE THEM
CAMN T1,[SIXBIT /??????/] ;STAR?
HRLZI T1,'* ' ;YES, SAY SO
JRST SIXO ;OUTPUT IT
PRGEND
TITLE PROMPT - PROMPT USER
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PROMPT
EXTERN ICH,CI,SWTCH,EATCR,BP,CPOPJ1,CRLF
PROMPT: SKPINC ;STOP CTRL-O
JFCL
SETOM ICH ;ISELECT TTY
OUTSTR CRLF
LOOP: OUTCHR ["*"] ;PROMPT HIM
PUSHJ P,CI ;INPUT 1ST CHAR
POPJ P,
PUSHJ P,SWTCH ;PARSE SWITCHES
POPJ P,
PUSHJ P,EATCR ;EAT <CR>
POPJ P,
PUSHJ P,BP ;BREAK CHAR?
JRST CPOPJ1 ;NO
CAIN C,"Z"-100 ;YES, CONTROL Z?
EXIT 1, ;YES
JRST LOOP
PRGEND
TITLE PRMPT - PROMPT USER
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PRMPT
EXTERN ICH,CI,EATCR,BP,CPOPJ1,CRLF
PRMPT: SKPINC ;STOP CTRL-O
JFCL
SETOM ICH ;ISELECT TTY
OUTSTR CRLF
LOOP: OUTCHR ["*"] ;PROMPT HIM
PUSHJ P,CI ;INPUT 1ST CHAR
POPJ P,
PUSHJ P,EATCR ;EAT <CR>
POPJ P,
PUSHJ P,BP ;BREAK CHAR?
JRST CPOPJ1 ;NO
CAIN C,"Z"-100 ;YES, CONTROL Z?
EXIT 1, ;YES
JRST LOOP
PRGEND
TITLE CRLFO - OUTPUT CARRIAGE RETURN LINE FEED
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY CRLFO
EXTERN STRO,CRLF
CRLFO: MOVEI T1,CRLF
;FALL TO STRO
PRGEND
TITLE STRO - OUTPUT AN ASCIZ STRING
;T1 PASSES ADR OF STRING
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY STRO
EXTERN BPO
STRO: HRLI T1,(POINT 7,0) ;MAKE INTO BP
;FALL TO BPO
PRGEND
TITLE BPO - OUTPUT AN ASCIZ STRING
;T1 PASSES BP TO STRING
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY BPO
EXTERN CPOPJ1,CO,SAVE1
BPO: PUSHJ P,SAVE1 ;SAVE P1
MOVE P1,T1 ;COPY ARG
PTBPLP: ILDB C,P1 ;GET A CHAR
JUMPE C,CPOPJ1 ;QUIT ON 0
PUSHJ P,CO ;OUTPUT IT
POPJ P,
JRST PTBPLP
PRGEND
TITLE DECO - OUTPUT A DECIMAL NUMBER
;T1 PASSES THE NUMBER
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY DECO
EXTERN NUMO
DECO: MOVEI T3,^D10 ;RADIX 10
JRST NUMO
PRGEND
TITLE OCTO - OUTPUT AN OCTAL NUMBER
;T1 PASSES THE NUMBER
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY OCTO
EXTERN NUMO
OCTO: MOVEI T3,10 ;RADIX 8
JRST NUMO
PRGEND
TITLE NUMO - OUTPUT A NUMBER
;T1 PASSES THE NUMBER
;T3 PASSES THE RADIX
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY NUMO
EXTERN CO
NUMO: IDIV T1,T3 ;DIVIDE BY RADIX
HRLM T2,(P) ;STORE REMAINDER
JUMPE T1,NUMO1 ;LOOP UNTIL NONE LEFT
PUSHJ P,NUMO
POPJ P,
NUMO1: HLRZ C,(P) ;RECALL REMAINDER LIFO
ADDI C,"0" ;CONVERT TO ASCII DIGIT
JRST CO ;OUTPUT IT
PRGEND
TITLE SIXO - OUTPUT SIXBIT WORD
;T1 PASSES THE WORD
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY SIXO
EXTERN CO,CPOPJ1,SAVE2
SIXO: PUSHJ P,SAVE2 ;SAVE P1-P2
MOVE P2,T1 ;COPY ARG
SIXOLP: JUMPE P2,CPOPJ1 ;QUIT IF NONE LEFT
LSHC P1,6 ;EXTRACT HIGH CHAR
ANDI P1,77
MOVEI C,40(P1) ;CONVERT TO ASCII
PUSHJ P,CO ;OUTPUT IT
POPJ P,
JRST SIXOLP ;LOOP UNTIL NONE LEFT
PRGEND
TITLE CO - OUTPUT CHAR
;C PASSES THE CHAR
;OCH SELECTS WHERE OUTPUT GOES:
;TTY OCH=-1
;CORE OCH=POINT X,Y,Z
;DISK OCH=XWD 0,CHANNEL
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY CO
EXTERN OCH,PUTC,CPOPJ1,PUTC1
CO: MOVE T1,OCH ;GET OUTPUT CH
TLNN T1,-1 ;FILE?
JRST PUTC1 ;YES
TLNE T1,40 ;NO, BP?
JRST CO0 ;NO, MUST BE TTY
IDPB C,OCH ;YES
JRST CPOPJ1
CO0: OUTCHR C ;TTY
JRST CPOPJ1
PRGEND
TITLE PUTC - OUTPUT A CHAR
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PUTC
INTERN PUTC1
EXTERN OCH,RNGHDR,PUTBUF,CPOPJ1
PUTC2: PUSHJ P,PUTBUF ;OUTPUT THE BUF
POPJ P,
PUTC: MOVE T1,OCH ;GET OUTPUT CH
PUTC1: HLRZ T1,RNGHDR(T1) ;GET ADR RING HDR
SOSGE 2(T1) ;MORE ROOM IN BUF?
JRST PUTC2 ;NO, OUTPUT THE BUF
IDPB C,1(T1) ;YES, PUT CHAR IN
JRST CPOPJ1
PRGEND
TITLE PUTBUF - OUTPUT A BUFFER
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PUTBUF
EXTERN OINS,CPOPJ1,PRSOUT
PUTBUF: PUSHJ P,OINS
OUT
JRST CPOPJ1
JRST PRSOUT
PRGEND
TITLE PRSOUT
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PRSOUT
EXTERN OCH,SIXO,SAVE1,VERBO,OCTO,OINS
PRSOUT: PUSHJ P,SAVE1
PUSHJ P,OINS
GETSTS P1
HRL P1,OCH
MOVEI T1,ERRM
PJRST VERBO
ERRM2: HRRZ T1,P1
PJRST OCTO
ERRM1
ERRM2
ERRM: VB ER.EAT,"?",PRSOUT,<Output error ^ for ^>
ERRM1: HLRZ T1,P1
DEVNAM T1,
HALT
PJRST SIXO
PRGEND
TITLE WLDMAT - MATCH WLD SPC'S
;P1 PASSES ADR LOOKUP SPC (OUTPUT FROM WILD)
;P2 PASSES ADR WILD SPC
;P3 PASSES ADR TO RETURN NEW SPC
;WLDMAT TAKES SPECIFICS FROM P1 ADDS THEM TO P2 AND PUTS
;RESULTS IN P3
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY WLDMAT
WLDMAT: HRLZ T1,P2 ;COPY SWITCHES
HRR T1,P3
HLRZ T2,(P2)
ADD T2,P3
BLT T1,-1(T2)
MOVE T1,.SBDEV(P2) ;DEVICE
ANDCM T1,.SMDEV(P2)
MOVE T2,.SBDEV(P1)
AND T2,.SMDEV(P2)
ADD T1,T2
MOVEM T1,.SBDEV(P3)
SETZM .SMDEV(P3)
MOVE T1,.SBNAM(P2) ;FILENAME
ANDCM T1,.SMNAM(P2)
MOVE T2,.SBNAM(P1)
AND T2,.SMNAM(P2)
ADD T1,T2
MOVEM T1,.SBNAM(P3)
SETZM .SMNAM(P3)
HLRZ T1,.SBEXT(P2) ;EXTENSION
HRRZ T2,.SMEXT(P2)
ANDCM T1,T2
HLRZ T3,.SBEXT(P1)
AND T3,T2
ADD T1,T3
HRLZM T1,.SBEXT(P3)
IFN SFDS,<
EXTERN SAVE3
PUSHJ P,SAVE3 ;SAVE P1-P3
> ;END IFN SFDS
WLDMT0: MOVE T1,.SBPPN(P2) ;DIRECTORY
ANDCM T1,.SMPPN(P2)
MOVE T2,.SBPPN(P1)
AND T2,.SMPPN(P2)
ADD T1,T2
MOVEM T1,.SBPPN(P3)
SETZM .SMPPN(P3)
IFN SFDS,<
ADDI P2,1 ;LOOP FOR EACH DIR
ADDI P3,1
SKIPE .SBPPN+1(P1)
AOJA P1,WLDMT0
> ;END IFN SFDS
POPJ P,
PRGEND
TITLE CNVSPC - CONVERT SPC BLK TO TRADITIONAL BLKS
;P1 PASSES ADR SPC BLK
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY CNVSPC
EXTERN FIL,OPN
CNVSPC: MOVE T4,.SBDEV(P1) ;DEVICE
MOVEM T4,OPN+.OPDEV
MOVE T4,.SBMOD(P1) ;MODE
MOVEM T4,OPN+.OPMOD
LDB T4,[POINT 4,T4,35] ;GET I/O MODE
CAIE T4,.IOASC ;SOME FLAVOR OF ASCII MODE
CAIN T4,.IOASL ;...
SKIPA T4,[UU.LBF] ;YES, GET LARGE BUFFERS BIT
SETZ T4, ;NO, GET A ZERO
IORM T4,OPN+.OPMOD ;INCLUDE IN MODE WORD
MOVE T4,.SBNAM(P1) ;FILENAME
MOVEM T4,FIL
HLLZ T4,.SBEXT(P1) ;EXTENSION
MOVEM T4,FIL+1
SETZM FIL+2
IFE SFDS,<
MOVE T4,.SBPPN(P1) ;PPN
MOVEM T4,FIL+3
> ;END IFE SFDS
IFN SFDS,<
EXTERN PTH
HRLZI T1,.SBPPN(P1) ;COPY PATH
HRRI T1,PTH+.PTPPN
BLT T1,PTH+.PTPPN+SFDS+1
SKIPE T3,.SBPPN(P1) ;POINT TO PATH
MOVEI T3,PTH
MOVEM T3,FIL+3
> ;END IFN SFDS
POPJ P,
PRGEND
TITLE SPCI - INPUT A FILE SPEC
;P1 PASSES ADR OF FILE SPEC
;SKIP IF SUCCESSFUL
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY SPCI
EXTERN WSIXI,EATS,CI,CPOPJ1,PRSPTH,MYPATH,SAVE2
SPCI: PUSHJ P,WSIXI ;DEVICE OR FILE NAME?
POPJ P,
PUSHJ P,EATS ;WHICH?
POPJ P,
CAIE C,":"
JRST SPCI2 ;FILENAME
JUMPE T1,SPCI5 ;0 MEANS USE DEFAULT
MOVEM T1,.SBDEV(P1) ;DEVICE, SAVE IT
MOVEM T2,.SMDEV(P1)
SPCI5: PUSHJ P,CI ;EAT THE COLON
POPJ P,
PUSHJ P,WSIXI ;INPUT THE FILENAME
POPJ P,
SPCI2: JUMPE T1,SPCI6 ;0 MEANS USE DEFAULT
MOVEM T1,.SBNAM(P1) ;SAVE FILENAME
MOVEM T2,.SMNAM(P1)
SPCI6: PUSHJ P,EATS ;EXTENSION?
POPJ P,
CAIE C,"."
JRST SPCI3 ;NO
PUSHJ P,CI ;YES, EAT THE DOT
POPJ P,
PUSHJ P,WSIXI ;INPUT THE EXTENSION
POPJ P,
HLR T1,T2 ;APPEND MASK
MOVEM T1,.SBEXT(P1) ;NO, SAVE IT
PUSHJ P,EATS ;PATH SPECIFIED?
POPJ P,
SPCI3: CAIE C,"["
JRST CPOPJ1 ;NO
PUSHJ P,CI ;YES, EAT THE BRACKET
POPJ P,
PUSHJ P,MYPATH ;GET DEFAULT PATH
PUSHJ P,WOCTI ;INPUT THE PROJECT NUMBER
POPJ P,
CAIN C,"-" ;DEFAULT PATH INDICATOR?
JRST [PUSHJ P,CI ;GET A CHARACTER
POPJ P,
JRST SPCI10] ;HANDLE [-]
JUMPE T1,SPCI7 ;0 MEANS USE DEFAULT
HRLM T1,.SBPPN(P1) ;SAVE IT
HRLM T2,.SMPPN(P1)
SPCI7: PUSHJ P,EATS ;EAT A COMMA
POPJ P,
CAIE C,","
JRST PRSPTH
PUSHJ P,CI
POPJ P,
PUSHJ P,WOCTI ;INPUT THE PROGRAMER NUMBER
POPJ P,
JUMPE T1,SPCI8 ;0 MEANS USE DEFAULT
HRRM T1,.SBPPN(P1) ;SAVE IT
HRRM T2,.SMPPN(P1)
SPCI8:
IFN SFDS,<
EXTERN SAVE1
PUSHJ P,SAVE1 ;SAVE P1
HRLI P1,-SFDS ;COUNT SFDS
SPCLOP: PUSHJ P,EATS ;ANOTHER SFD?
POPJ P,
CAIE C,","
JRST SPCI4 ;NO
PUSHJ P,CI ;YES, EAT THE COMMA
POPJ P,
PUSHJ P,WSIXI ;INPUT THE SFD NAME
POPJ P,
JUMPE T1,SPCI9 ;0 MEANS USE DEFAULT
MOVEM T1,.SBPPN+1(P1) ;SAVE IT
MOVEM T2,.SMPPN+1(P1)
SPCI9: AOBJN P1,SPCLOP ;LOOK FOR ANOTHER
JRST PRSPTH
SPCI4: SETZM .SBPPN+1(P1) ;TERMINATE PATH
> ;END IFN SFDS
SPCI10: PUSHJ P,EATS ;EAT A BRACKET
POPJ P,
CAIN C,"]"
JRST CI
JRST CPOPJ1
;INPUT A PROJECT OR PROGRAMMER, WITH WILDCARDS
;T1 RETURNS THE NUMBER
;T2 RETURNS A WILDCARD MASK
WOCTI: PUSHJ P,SAVE2 ;SAVE P1-P2
SETZB P1,P2 ;DEFAULT TO ZERO
PUSHJ P,EATS ;EAT SPACES
POPJ P,
CAIE C,"*" ;THE UNIVERSE?
JRST WOCTI3 ;NO
PUSHJ P,CI ;YES, EAT IT
POPJ P,
SETOB T1,T2 ;RETURN THE WORLD
JRST CPOPJ1
WOCTI3: CAIL C,"0" ;VALID DIGIT OR WILDCARD?
CAILE C,"7"
CAIN C,"?"
JRST WOCTI1 ;YES
WOCTI2: MOVE T1,P1 ;NO, RETURN RESULTS
MOVE T2,P2
JRST CPOPJ1
WOCTI1: LSH P1,3 ;YES, APPEND TO NUMBER
LSH P2,3
TRZE C,10
ADDI P2,7
ADDI P1,-"0"(C)
PUSHJ P,CI ;INPUT NEXT CHAR
POPJ P,
JRST WOCTI3 ;TEST IF VALID
PRGEND
TITLE MYPATH - GET MY DEFAULT PATH
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY MYPATH
EXTERN FOO
MYPATH: SETOM FOO ;GET DEFAULT PATH
MOVE T1,[XWD SFDS+4,FOO]
PATH. T1,
HALT
IFE SFDS,<
MOVE T1,FOO+.PTPPN ;COPY IT TO SPC
MOVEM T1,.SBPPN(P1)
> ;END IFE SFDS
SETZM .SMPPN(P1) ;CLEAR WILDCARDS
IFN SFDS,<
HRRZI T1,.SBPPN(P1) ;COPY IT TO SPC
HRLI T1,FOO+.PTPPN
BLT T1,.SBPPN+SFDS+1(P1)
HRLZI T1,.SMPPN(P1)
HRRI T1,.SMPPN+1(P1)
BLT T1,.SMPPN+SFDS(P1)
> ;END IFN SFDS
POPJ P,
PRGEND
TITLE PRSPTH
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PRSPTH
PRSPTH: ERR ER.EAT,"?",PRSPTH,<Illegal format for path>
PRGEND
TITLE DECI - INPUT A DECIMAL NUMBER
;T1 RETURNS THE NUMBER
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY DECI
EXTERN NUMI
DECI: MOVEI T3,^D10 ;RADIX 10
JRST NUMI
PRGEND
TITLE OCTI - INPUT AN OCTAL NUMBER
;T1 RETURNS THE NUMBER
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY OCTI
EXTERN NUMI
OCTI: MOVEI T3,10 ;RADIX 8
JRST NUMI
PRGEND
TITLE NUMI - INPUT A NUMBER
;T3 PASSES THE RADIX
;T1 RETURNS THE NUMBER
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY NUMI
EXTERN SAVE2,CI,CPOPJ1,EATS
NUMI: PUSHJ P,SAVE2 ;SAVE P1-P2
SETZ P1, ;DEFAULT TO ZERO
MOVE P2,T3 ;COPY RADIX
PUSHJ P,EATS ;EAT SPACES
POPJ P,
NUMILP: CAIL C,"0" ;LEGAL DIGIT?
CAILE C,"0"-1(P2)
JRST NUMI1 ;NO
IMUL P1,P2 ;YES, APPEND TO NUMBER
ADDI P1,-"0"(C)
PUSHJ P,CI ;INPUT NEXT CHAR
POPJ P,
JRST NUMILP
NUMI1: MOVE T1,P1 ;NO, RETURN NUMBER
JRST CPOPJ1
PRGEND
TITLE SIXI - INPUT A SIXBIT WORD
;T1 RETURNS THE WORD
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY SIXI
EXTERN EATS,CI,CPOPJ1,SAVE2
SIXI: PUSHJ P,SAVE2 ;SAVE P1-P2
MOVEI P2,6*6 ;BIT COUNT
PUSHJ P,EATS ;EAT SPACES
POPJ P,
SIXLOP: SUBI C,40 ;CONVERT LOWER CASE TO UPPER
CAIL C,"A" ;UPPER CASE?
CAILE C,"Z"
ADDI C,40 ;NO, OOPS CONVERT BACK
CAIL C,"0" ;VALID SIXBIT CHAR?
CAILE C,"9"
CAIL C,"A"
CAILE C,"Z"
JRST SIXGOT ;NO
JUMPE P2,SIXNX ;ONLY 1ST 6 CHARS SIGNIFICANT
LSH P1,6 ;APPEND CHAR TO NAME
ADDI P1,-40(C)
SUBI P2,6 ;COUNT IT
SIXNX: PUSHJ P,CI ;INPUT NEXT CHAR
POPJ P,
JRST SIXLOP ;TEST IF VALID
SIXGOT: LSH P1,(P2) ;NO, LEFT JUSTIFY RESULTS
MOVE T1,P1
JRST CPOPJ1
PRGEND
TITLE WSIXI - INPUT A WILD SIXBIT WORD
;T1 RETURNS THE WORD
;T2 RETURNS A WILDCARD MASK
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY WSIXI
EXTERN EATS,CI,CPOPJ1,SAVE4
WSIXI: PUSHJ P,SAVE4 ;SAVE P1-P4
SETZB P2,P3 ;INITIAL MASK
MOVEI P4,6*6 ;BIT COUNT
PUSHJ P,EATS ;EAT SPACES
POPJ P,
WSIXI3: SUBI C,40 ;CONVERT LOWER CASE TO UPPER
CAIL C,"A" ;UPPER CASE?
CAILE C,"Z"
ADDI C,40 ;NO, OOPS CONVERT BACK
CAIE C,"*" ;VALID SIXBIT CHAR?
CAIL C,"0"
CAILE C,"9"
CAIL C,"A"
CAILE C,"Z"
CAIN C,"?"
JRST WSIXI1 ;YES
WSIXI4: LSH P1,(P4) ;NO, LEFT JUSTIFY RESULTS
LSHC P2,(P4)
MOVE T1,P1
MOVE T2,P2
JRST CPOPJ1
WSIXI1: JUMPE P4,WSIXI2 ;ONLY 1ST 6 CHARS SIGNIFICANT
LSH P1,6 ;APPEND CHAR TO NAME
ADDI P1,-40(C)
CAIN C,"?"
TLO P3,770000
CAIN C,"*"
SETO P3,
LSHC P2,6
SUBI P4,6 ;COUNT IT
WSIXI2: PUSHJ P,CI ;INPUT NEXT CHAR
POPJ P,
JUMPL P3,WSIXI4 ;QUIT IF "*"
JRST WSIXI3 ;ELSE LOOP
PRGEND
TITLE EATCR - EAT <CR>
;EATS LEADING SPACES AND TABS 1ST
;SKIP IF OK
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY EATCR
EXTERN EATS,CI,CPOPJ1
EATCR: PUSHJ P,EATS ;EAT SPACES
POPJ P,
CAIE C,15 ;EAT CR
JRST CPOPJ1
JRST CI
PRGEND
TITLE BP - TEST FOR BREAK CHAR
;SKIP IF YES
;ABE'S METHOD
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY BP
BP: MOVEI T1,1 ;BREAK CHAR?
LSH T1,(C)
TDNE T1,[1400016000]
AOS (P) ;YES, SKIP
POPJ P, ;NO
PRGEND
TITLE COLON - EAT COLON
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY COLON
EXTERN EATS,CI,PRSSYN
COLON: PUSHJ P,EATS ;EAT SPACES
POPJ P,
CAIE C,":" ;COLON?
JRST PRSSYN
JRST CI ;YES, EAT IT
PRGEND
TITLE EATS - EAT SPACES AND TABS
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY EATS
EXTERN CI,CPOPJ1
EATS1: PUSHJ P,CI ;INPUT NEXT CHAR
POPJ P,
EATS: CAIE C," " ;SPACE OR TAB?
CAIN C,11
JRST EATS1 ;YES, EAT IT
JRST CPOPJ1 ;NO
PRGEND
TITLE PRSSYN
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PRSSYN
PRSSYN: ERR ER.EAT,"?",PRSSYN,<Syntax error>
PRGEND
TITLE CI - INPUT A CHAR
;C RETURNS THE CHAR
;ICH SELECTS WHERE INPUT FROM:
;TTY ICH=-1
;CORE ICH=POINT X,Y,Z
;DISK ICH=XWD 0,CHANNEL
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY CI
EXTERN ICH,LSNI,CPOPJ1
CI: MOVE C,ICH ;GET INPUT CH
TLNN C,-1 ;FILE?
JRST LSNI ;YES
TLNE C,40 ;NO, CORE?
JRST CI1 ;NO, MUST BE TTY
ILDB C,ICH ;YES
JRST CPOPJ1
CI1: INCHWL C ;TTY
JRST CPOPJ1
PRGEND
TITLE LSNI - INPUT A CHAR
;IGNORES LINE SEQUENCE NUMBERS
;SKIP IF OK
;ELSE NOSKIP
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY LSNI
EXTERN ICH,RNGHDR,GETC,CPOPJ1,SAVE2
LSNI: PUSHJ P,SAVE2 ;SAVE P1-P2
MOVE P1,ICH ;GET INPUT CH
HRRZ P1,RNGHDR(P1) ;GET ADR RING HDR
MOVEI P2,1 ;COUNT CHARS
LSNLOP: PUSHJ P,GETC ;GET A CHAR
POPJ P,
JUMPE C,LSNLOP ;EAT NULLS
MOVE T1,@1(P1) ;GET LSN BIT
CAIE P2,1 ;ALREADY SEEN IT?
SETZ T1, ;YES, DON'T LOOK AT IT AGAIN
TRNE T1,1 ;LSN?
MOVEI P2,7 ;YES, EAT 7 CHARS
SOJG P2,LSNLOP ;LOOP FOR EACH CHAR
JRST CPOPJ1
PRGEND
TITLE GETC - INPUT A CHAR
;SKIP IF OK
;ELSE NOSKIP
;NOSKIP WITH C=ERROR BITS
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY GETC
EXTERN ICH,RNGHDR,CPOPJ1,IINS,PRSIN
GETC: MOVE C,ICH ;GET INPUT CH
HRRZ C,RNGHDR(C) ;GET ADR RING HDR
SOSGE 2(C) ;MORE CHARS IN BUF?
JRST GETC9
ILDB C,1(C) ;YES, GET ONE
JRST CPOPJ1
GETC9: PUSHJ P,IINS ;NO, INPUT A BUF
IN
JRST GETC ;TRY AGAIN
JRST PRSIN ;NO, REAL ERROR
PRGEND
TITLE PRSIN
SEARCH PRS,UUOSYM
TWOSEG
RELOC 400000
ENTRY PRSIN
EXTERN ICH,SIXO,IINS,VERBO,SAVE1,OCTO
PRSIN: PUSHJ P,SAVE1 ;SAVE P1
PUSHJ P,IINS ;GET ERROR BITS
GETSTS P1
TRNN P1,IO.ERR ;FAILED BECAUSE EOF?
JRST PRSIN2 ;YES
MOVEI T1,ERRM
PUSHJ P,VERBO
PRSIN2: MOVE C,P1 ;RESTORE ERROR BITS
POPJ P,
ERRM1: MOVE T1,ICH ;TYPE DEVICE NAME
DEVNAM T1,
HALT
PJRST SIXO
ERRM2: MOVE T1,P1 ;TYPE THE STATUS
PJRST OCTO
ERRM1
ERRM2
ERRM: VB ER.EAT,"?",PRSIN,<Input error ^ for ^>
PRGEND
TITLE OINS - XCT AN OUTPUT INSTRUCTION
;CALL:
; PUSHJ P,OINS
; FOO 0,@FOO(FOO)
;NOSKIP
;SKIP
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY OINS
EXTERN OCH,IINS
OINS: SKIPA T1,OCH ;GET THE CH
;FALL TO IINS
PRGEND
TITLE IINS - XCT AN INPUT INSTRUCTION
;CALL:
; PUSHJ P,IINS
; FOO 0,@FOO(FOO)
;NOSKIP
;SKIP
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY IINS
EXTERN ICH,CPOPJ1
IINS: MOVE T1,ICH ;BUILD THE INS
LSH T1,^D23
ADD T1,@(P)
AOS (P)
XCT T1 ;DO IT
POPJ P,
JRST CPOPJ1
PRGEND
TITLE FNDNAM - FIND ABBREVIATED NAME IN TABLE
;T1 PASSES ABBR
;T2 PASSES AOBJN POINTER TO TABLE OF NAMES
;NO SKIP IF UNSUCCESSFUL
;SKIP RETURN:
;T2=INDEX INTO TABLE
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY FNDNAM
EXTERN CPOPJ1,SAVE3,PRSUKN
FNDNAM: PUSHJ P,SAVE3 ;SAVE P1-P3
SETO P1, ;MATCH MASK
TDZA T3,T3 ;WIN FLAG
FNDNM2: LSH P1,-6 ;BUILD UP THE MASK
TDNE T1,P1
JRST FNDNM2
MOVE P2,T2 ;SAVE INITIAL POINTER
FNDLP: MOVE P3,(T2) ;GET TABLE ENTRY
XOR P3,T1 ;COMPARE
JUMPE P3,FNDWON ;EXACT MATCH WINS
ANDCM P3,P1 ;CLOSE ENOUGH?
JUMPN P3,FNDNM1
JUMPN T3,PRSUKN ;YES, 2ND WIN AMBIGUOUS
MOVE T3,T2 ;SAVE ADR OF WIN
FNDNM1: AOBJN T2,FNDLP ;LOOP THROUGH TABLE
SKIPN T2,T3 ;RECALL WIN
JRST PRSUKN
FNDWON: SUB T2,P2 ;COMPUTE INDEX
TLZ T2,-1
JRST CPOPJ1
PRGEND
TITLE PRSUKN
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY PRSUKN
EXTERN SIXO,SAVE1,VERBO
PRSUKN: PUSHJ P,SAVE1
MOVE P1,T1
MOVEI T1,ERRM
PJRST VERBO
ERRM1
ERRM: VB ER.EAT,"?",PRSUKN,<Unknown or ambiguous abbreviation ^>
ERRM1: MOVE T1,P1
PJRST SIXO
PRGEND
TITLE CRLF
TWOSEG
RELOC 400000
ENTRY CRLF
CRLF: BYTE (7)15,12
PRGEND
TITLE OPN
TWOSEG
RELOC 0
ENTRY OPN
OPN: BLOCK 3 ;ARGS FOR OPEN UUO
PRGEND
TITLE ICH - INPUT CH
TWOSEG
RELOC 0
ENTRY ICH
ICH: BLOCK 1 ;INPUT CH
PRGEND
TITLE OCH - OUTPUT CH
TWOSEG
RELOC 0
ENTRY OCH
OCH: BLOCK 1 ;OUTPUT CH
PRGEND
TITLE FREMEM
TWOSEG
RELOC 0
ENTRY FREMEM
FREMEM: BLOCK 1 ;ADR FREE CHAIN
PRGEND
TITLE RNGHDR - TABLE OF POINTERS TO RING HDRS
;INDEX BY CH
;LH=ADR OUTPUT RING HDR
;RH=ADR INPUT RING HDR
TWOSEG
RELOC 0
ENTRY RNGHDR
RNGHDR: BLOCK 20
PRGEND
TITLE FOO - SCR SPACE
SEARCH PRS
TWOSEG
RELOC 0
ENTRY FOO
FOO: BLOCK FOOSIZ
PRGEND
TITLE FIL
TWOSEG
RELOC 0
ENTRY FIL
FIL: BLOCK 4 ;ARGS FOR LOOKUP/ENTER UUO
PRGEND
TITLE PTH
SEARCH PRS
TWOSEG
RELOC 0
ENTRY PTH
PTH: BLOCK SFDS+4 ;ARGS FOR PATH UUO
PRGEND
TITLE SAVE1 - SAVE P1
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY SAVE1
EXTERN CJRA,RET1
SAVE1: EXCH P1,(P)
HRL P1,P
PUSHJ P,CJRA
SOS -1(P)
JRST RET1
PRGEND
TITLE SAVE2 - SAVE P1-P2
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY SAVE2
EXTERN CJRA,RET2
SAVE2: EXCH P1,(P)
HRL P1,P
PUSH P,P2
PUSHJ P,CJRA
SOS -2(P)
JRST RET2
PRGEND
TITLE SAVE3 - SAVE P1-P3
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY SAVE3
EXTERN CJRA,RET3
SAVE3: EXCH P1,(P)
HRL P1,P
PUSH P,P2
PUSH P,P3
PUSHJ P,CJRA
SOS -3(P)
JRST RET3
PRGEND
TITLE SAVE4 - SAVE P1-P4
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY SAVE4
EXTERN CJRA,RET3
SAVE4: EXCH P1,(P)
HRL P1,P
PUSH P,P2
PUSH P,P3
PUSH P,P4
PUSHJ P,CJRA
SOS -4(P)
POP P,P4
;FALL TO RET3
PRGEND
TITLE RET3
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY RET3
EXTERN RET2
RET3: POP P,P3
;FALL TO RET2
PRGEND
TITLE RET2
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY RET2
EXTERN RET1
RET2: POP P,P2
;FALL TO RET1
PRGEND
TITLE RET1
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY RET1
EXTERN CPOPJ1
RET1: POP P,P1
;FALL TO CPOPJ1
PRGEND
TITLE CPOPJ1 - SKIP RETURN
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY CPOPJ1
EXTERN CPOPJ
CPOPJ1: AOS (P)
;FALL TO CPOPJ
PRGEND
TITLE CPOPJ
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY CPOPJ
CPOPJ: POPJ P,
PRGEND
TITLE CJRA
SEARCH PRS
TWOSEG
RELOC 400000
ENTRY CJRA
CJRA: JRA P1,(P1)
END