s XRB pointing to separator INC NAMPTR ; if no error, just past it if error BIT #NAMFND, @#XRB + 10 ;Did the filespec have a name field? BNE 4$ ;Yes MOV #R5STAR, @#FIRQB + FQNAM1 ;No, force an "*" MOV #R5STAR, @#FIRQB + FQNAM1 + 2 4$: BIT #DOTFND, @#XRB + 10 ;Did the filespec have a "."? BNE 3$ ;Yes MOV #R5STAR, @#FIRQB + FQEXT ;No, force ".*" 3$: CALL CLRJNK ;Clear unused parts of FIRQB CALL MOVFQB, R5 ;Move the FIRQB .WORD FIRQB ;From here .WORD FQBSAV ;To here MOVB #UU.LOK, FQBSAV+FQFUN ;Set code for wildcard lookup ;SAVE CORRECT PROTECTION CODE BIT MOV #1, R0 ;Read protected against owner TST @#FIRQB + FQPPN ;Same account? BEQ 2$ ;Yes CMP OURPPN, @#FIRQB + FQPPN ;Same account? BEQ 2$ ;Yes MOV #4, R0 ;Read protected against group CMPB OURPPN+1, @#FIRQB+FQPPN+1 ;Same group? BEQ 2$ ;Yes MOV #16., R0 ;Read protected against others 2$: MOV R0, PROCOD ;Save protection code bit ;MOVE SAVED FIRQB TO REAL FIRQB, DO WILDCARD LOOKUP, AND PRINT THE ;FILE IF WE FOUND ONE CLR INDEX ;Start with the first instance SRCHLP: CALL MOVFQB, R5 .WORD FQBSAV ;From here .WORD FIRQB ;To here MOV INDEX, @#FIRQB+FQFIL ;Get this instance SYSCALL .UUO TSTB @#IOSTS ;Error code <> 0? BNE LPEND ;Yes, no more matches; exit CALL PRINT ;Open file and print it INC INDEX ;Go for the next match BR SRCHLP ;Repeat forever ;IF NO MATCHES AT ALL, SAY SO LPEND: TST INDEX BNE 1$ CALL FRMFED MESAGE NOFIND, BELLS 1$: TST NAMCNT ;If more filespec then BGT NAMELP ; go again TST PRNTER ;Turn off printer port? BEQ 3$ SETUP PPOFF, BADDEV MOV #2*2, @#XRB + XRCI SYSCALL .WRITE 3$: TST BINARY ;If not BINARY BNE 2$ ; then MESAGE BELLS, FRMFD ; tell user we are through CALL CLRFQB MOVB #RSTFQ, @#FIRQB + FQFUN MOV #2*2, @#FIRQB + FQFIL SYSCALL CALFIP ;Close channel 2 ;EXIT WITH NO READY MESSAGE IF REQUESTED 2$: CALL DROP ;Permanently drop privileges TST READY ;/R switch? BEQ EXIT ;No, so exit CALL CLRFQB SETUP NOREDY, NOREND SYSCALL .FSS SYSCALL .RUN ;Chain to no ready program ;RETURN TO DEFAULT RUN-TIME SYSTEM EXIT: CALL DROPFG CALL CLRFQB SYSCALL .RTS ;Exit to default RTS SYSCALL .EXIT ;In case of failure ORG PRINT .SBTTL OPEN AND PRINT THE SELECTED FILE IN THE REQUESTED MODES .PAGE ;DON'T PRINT EXECUTABLE FILES OR THOSE PROTECTED AGAINST US PRINT: BIT #64., @#FIRQB+FQBUFL ;Executable? BNE 1$ ;Yes, skip it BIT #JFPRIV, @#KEY ;Do we have permanent privileges? BNE 2$ ;Yes, print it BIT PROCOD, @#FIRQB+FQBUFL ;Protected against us? BEQ 2$ ;No, print it 1$: JMP NEXT ;Skip this file ;SHOW FILE NAME ON SYSTAT AND CANCEL CONTROL/O 2$: SYSCALL .NAME SYSCALL .TTRST ;Cancel control/O CALL GETNAM ;PRINT FILENAME FIRST IF IN QUERY MODE PRTNAM: TST QUERY ;Skip if not query mode BEQ OPEN CALL TYPENM, R5 .WORD 0 ;User's terminal ;GET REPLY IF QUERY MODE TST QUERY ;If query mode BEQ OPEN CALL CLRXRB ;Cancel type-ahead MOV #XRB, R1 MOV #7, (R1)+ ;Special function code CMP (R1)+, (R1)+ TSTB (R1)+ MOVB #TTYHND, (R1) SYSCALL .SPEC CALL CLRXRB ;then get response MOV #XRB, R1 MOV #80., (R1)+ CLR (R1)+ MOV #REPBUF, (R1) SYSCALL .READ ;"Y"-->PRINT FILE ELSE DON'T. BICB #'y-'Y, REPBUF ;Make it upper case CMPB #'Y, REPBUF ;If response is not "Y" BNE NEXT ;then skip this one ;OPEN FILE, PRINT CONTENTS, AND CLOSE OPEN: MOV @#FIRQB+FQSIZ, SIZE ;save the file size BEQ NEXT ;Skip if file size is 0 CALL CLRJNK ;Leave only the important stuff MOVB #OPNFQ, @#FIRQB+FQFUN ;Open the file MOV #2*1, @#FIRQB+FQFIL ;on channel 1 MOV #256.+2048.+8192.+100000, @#FIRQB+FQMODE ;Read only, seq cashe CALL REGAIN ;privileges, that is SYSCALL CALFIP CALL DROP TSTB @#IOSTS BNE NEXT ;Skip if error CALL OUTPUT ;Type the contents CALL CLRFQB MOVB #CLSFQ, @#FIRQB+FQFUN ;ClosTCODE MAC[.050001]TCODE .MAC[.050001]    X14|H [4;Ik(&'( k ߫H&P` \RrPP2PPzPP{PPPPP2P~\$\\TD 0D \~ hi) +\ ^( n ^( np\^txY\^ˀ\!kVk<\F˰<˴ˬ\VVkˤ1`@lP ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789<@<SЬTЬ UQS>?\\\\\\\\\`:#@'="\abcdefghi\\\\\\\jklmnopqr\\\\\\\~stuvwxyz\\\\\\\\\\\\\\\\\\\\\\{ABCDEFGHI\\\\\\}JKLMNOPQR\\\\\\\\STUVWXYZ\\\\\\0123456789\\\\\  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~@ggh<i|o<m<4p<p<k|Zn<l fr rwx<x<x<x޺<w@]@@fjnr]Ze@@|> | |v<H|  |  |xz|  |zt f r   < &^ @&@'*/V,"?Lh:hmBmz|z{x`y~|fN|@@|@͂|@ ݃ƃ<ns<|Ŏ |️|ep|u|-@率|<ᄇ2ֻr||ZRM | ntB|xyvZw|J=|R>|J? nnaa|bddf (R1) ;Anything there? BNE 2$ ;Yes, get it PUTBUF #'S, R0 ;No, fake it as "SY" PUTBUF #'Y, R0 BR 1$ ;and skip the unit number 2$: PUTBUF (R1)+, R0 ;Get PUTBUF (R1)+, R0 ;both chars CLR R2 ;Temporary location MOVB (R1)+, R2 ;Unit number TSTB (R1)+ ;Unit number real? BEQ 1$ ;No, skip it PTBDIG R2, R0 1$: PUTBUF #':, R0 ;Finish the device spec ;NOW THE PPN PUTBUF #'[, R0 ;Start the PPN MOV #FIRQB + FQPPN + 1, R1 ;Point to project # CALL NUMASC ;Make it ASCII & store PUTBUF <#',>, R0 DEC R1 ;Programmer # CALL NUMASC ;Do it too PUTBUF #'], R0 ;Finish PPN ;THEN THE FILENAME AND EXTENSION TST (R1)+ ;Start of filename CALL RADASC ;File name is CALL RADASC ;two words PUTBUF #'., R0 CALL RADASC ;Extension CALL STARS ; add stars PUTBUF #'?, R0 ; and a "?" PUTBUF #SPACE, R0 SUB #NAMBUF, R0 ;Now complete filespec is in MOV R0, STRLEN ; NAMBUF and char count is in STRLEN 3$: RETURN TYPENM: CALL CLRXRB MOV #XRB, R1 MOV STRLEN, (R1) ;Buffer size MOV (R1)+, (R1)+ ;Byte count MOV #NAMBUF, (R1)+ ;Buffer location MOV (R5)+, (R1)+ ; outfile is passed to us SYSCALL .WRITE RETURN R5 ORG OUTPUT .SBTTL READ AND WRITE THE DISK BLOCKS IN THE FILE .PAGE OUTPUT: MOV COPIES, COPCNT TST NAME BEQ 2$ MOV R0, -(SP) ;Take no chances MOV #NAMBUF, R0 ADD STRLEN, R0 SUB #2, R0 ;Replace the "? " CRLFLF R0 ; with CR LF LF MOV (SP)+, R0 2$: CALL ONECPY DEC COPCNT BGT 2$ RETURN ;PRINT CHUNKS OF SIZE CLUS WHILE SIZE > CLUS ONECPY: MOV #TRUE, BLKONE MOV SIZE, R3 CALL FRMFED TST NAME BEQ 1$ CALL TYPENM, R5 .WORD 2*2 1$: CMP R3, #CLUS ;Size remaining : buffersize BLOS LAST CALL READ CALL SHAVE CALL WRITE SUB #CLUS, R3 ;Correct size remaining BR 1$ ;PRINT REMAINDER OF FILE LAST: CALL READ CALL SHAVE CALL WRITE RETURN ;READ A BUFFER FULL READ: MOV #XRB, R0 MOV #CLUS * BLKSIZ, (R0)+ ;Buffer size CLR (R0)+ ;Byte count MOV #BUFFER, (R0)+ ;Address of buffer MOV #1*2, (R0)+ ;Channel 1 TST BLKONE ;If BLKONE BEQ 1$ ; then MOV #1, (R0)+ ; read block one CLR BLKONE ; not block one next time BR 2$ ; else 1$: CLR (R0)+ ; read next block 2$: CLR (R0)+ CLR (R0)+ SYSCALL .READ RETURN ;WRITE THE CHARACTERS WRITE: MOV #XRB, R0 ;Now set up to print what's left MOV #CLUS * BLKSIZ, (R0)+ ;Buffer size TST (R0)+ ;Byte count returned from shave MOV #BUFFER, (R0)+ ;Address of buffer MOV #2*2, (R0)+ ;Channel 2 CLR (R0)+ CLR (R0)+ TST BINARY ;If BINARY BEQ 1$ ; then MOV #BINMOD, (R0)+ ; write binary mode BR 2$ ; else 1$: CLR (R0)+ ; write normal mode 2$: SYSCALL .WRITE RETURN ;FIND LAST NOT NULL CHARACTER IN BUFFER SHAVE: TST BINARY ;Don't shave if binary mode BNE 3$ MOV #BUFFER, R1 ;Start of buffer MOV @#XRB + XRBC, R0 ADD R0, R1 ;End of buffer 1$: TSTB -(R1) ;Check a char BNE 2$ ;Not a null, so quit checking SOB R0, 1$ ;Go again if there's more 2$: MOV R0, @#XRB + XRBC ;Put correct value back 3$: RETURN ORG CONVERT .SBTTL CONVERSION ROUTINES (TO ASCII) .PAGE ;DIVIDE R3 BY (R5) AND STACK REMAINDER THREE TIMES DIVIT: MOV #3, R4 ;Loop counter 1$: MOV R2, R3 ;Set up for division CLR R2 ;High-order word DIV (R5), R2 ;Divide by radix PUSH R3 ;Save remainder SOB R4, 1$ ;Go three times ;FIX UP STACK FOR RETURN TST (R5)+ ;Return to the right place MOV 6(SP), R4 ;Link register contents MOV 4(SP), 6(SP) ;Move every thing MOV 2(SP), 4(SP) ;down one MOV (SP), 2(SP) ;place MOV R4, (SP) ;so we can return ok RETURN R5 ;CONVERT BYTE TO DECIMAL DIGITS NUMASC: MOVB (R1), R2 ;Get an 8-bit # BIC #^C377, R2 ;Low byte only CALL DIVIT, R5 ;Convert to codes on stack .WORD 10. ;Use remainders mod 10. ;PUT CHARACTERS IN BUFFER SUPPRESSING LEADING ZEROS MOV #2, R5 1$: POP R2 BNE 3$TCODE MAC[.050001]TCODE .MAC[.050001]    X14|H [4;Ik(&'( k ߫H&P` \RrPP2PPzPP{PPPPP2P~\$\\TD 0D \~ hi) +\ ^( n ^( np\^txY\^ˀ\!kVk<\F˰<˴ˬ\VVkˤ1`@lP ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789<@<SЬTЬ UQS>?\\\\\\\\\`:#@'="\abcdefghi\\\\\\\jklmnopqr\\\\\\\~stuvwxyz\\\\\\\\\\\\\\\\\\\\\\{ABCDEFGHI\\\\\\}JKLMNOPQR\\\\\\\\STUVWXYZ\\\\\\0123456789\\\\\  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~@ggh<i|o<m<4p<p<k|Zn<l fr rwx<x<x<x޺<w@]@@fjnr]Ze@@|> | |v<H|  |  |xz|  |zt f r   < &^ @&@'*/V,"?Lh:hmBmz|z{x`y~|fN|@@|@͂|@ ݃ƃ<ns<|Ŏ |️|ep|u|-@率|<ᄇ2ֻr||ZRM | ntB|xyvZw|J=|R>|J? nnaa|bddf SOB R5, 1$ BR 4$ 2$: POP R2 3$: PTBDIG R2, R0 SOB R5, 2$ ;SEND LAST DIGIT REGARDLESS 4$: POP R2 PTBDIG R2, R0 RETURN ;CONVERT WORD OF RAD50 BACK TO CHARACTERS RADASC: MOV (R1)+, R2 ;Take care of pointer ;GET STACK OF REMAINDERS CALL DIVIT, R5 .WORD 50 ;Remainders mod 50 ;PUT CHARACTERS IN BUFFER SUPPRESSING BLANKS UNLESS QUERY MODE MOV #3, R4 ;Loop counter 1$: POP R2 ;Get remainder BNE 3$ ;Not blank TST QUERY BEQ 2$ ;Skip blank if not query mode 3$: MOVB RADLST(R2), (R0)+ ;Get correct char 2$: SOB R4, 1$ ;Do three characters RETURN ORG CONSTANTS .SBTTL CONSTANT DEFINITIONS .PAGE DOTFND = 10 ;See flag word 2 in XRB after .FSS NAMFND = 1 ;Ditto HIBYTE = 177400 TRUE = -1 IOSTS = FIRQB BEL = 7 FF = 12. CR = 13. LF = 10. ESC = 155. BLKSIZ = 512. ;Size of a disk block SPACE = 32. NOSTAR = 4. ;# of stars before and after name BINMOD = 4096. ;Binary output mode QUEST = 35 ;.RAD50 /?/ R5STAR = << + QUEST> * 50> + QUEST ;.RAD50 /???/ ;ORDER IS CRITICAL IN THE FOLLOWING TWO TABLES SWTBL: .WORD 'F ;Switch table .WORD 'R .WORD 'N .WORD 'Q .WORD 'B .WORD 'P .WORD 'S DSTTBL: .WORD FORM ;Table of flags corresponding to switches .WORD READY .WORD NAME .WORD QUERY .WORD BINARY .WORD PRNTER .WORD SEPRTE ;BYTE DATA BEGINS HERE. ORDER OF LABELS IS IMPORTANT ;ADD NEW STRINGS ONLY AT THE BEGINNING (I.E. HERE) PPON: .BYTE ESC .ASCII /[?5i/ PPOFF: .BYTE ESC .ASCII /[?4i/ BADDEV: .ASCII %?Bad out dev?% .BYTE CR, LF KBNAME: .ASCII /KB:/ NOFIND: .ASCII /?File not found?/ .BYTE CR, LF BELLS: .BYTE BEL,BEL,BEL FRMFD: .BYTE FF BLANKS: .BYTE CR, LF, LF, LF, LF ;LIST OF RAD50 CHARACTERS IN ORDER OF ENCODING RADLST: .BYTE SPACE .ASCII /ABCDEFGHIJKLMNOPQRSTUVWXYZ/ .ASCII /$.?/ .ASCII /0123456789/ NCONST: .EVEN ORG HELPMF .SBTTL SOME FILE NAMES WE WILL USE ;NAME OF HELP MESSAGE FILE HELPMF: .ASCII %SY0:[001,013]TYPE.HLP/R% ;NAME OF FILE TO CHAIN TO IF NO READY MESSAGE WANTED ON EXIT NOREDY: .ASCII /SY0:[001,013]NREADY.BAC/ NOREND: .EVEN ORG PATCH .SBTTL PATCH SPACE .END