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,- ;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, ; 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, 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, 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, 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 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 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, 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, 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 ;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, 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, 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, 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