.TITLE DEMOSP LINE PRINTER SPOOLER .IDENT /V05.00/ ; THIS PROGRAM WILL LIST ANY FILE WITH THE EXTENSION "LST" THAT IS FOUND ; ON THE DEVICE "SPL", AND ONCE THE FILE HAS BEEN LISTED, IT WILL BE ; DELETED. BEFORE STARTING THIS PROGRAM WITH AN 'FRUN PRINT' COMMAND, ; THE USER MUST ASSIGN THE DEVICE WHICH CONTAINS THE "LST" FILES TO "SPL". ; EX: .ASSIGN RK1 SPL ; ALSO, ANY NON-RESIDENT HANDLERS MUST BE LOADED. ; EX: .LOAD LP,DT ; .FRUN DEMOSP ; IF THE SPL DEVICE IS OFF LINE OR A DIRECTORY READ ERROR OCCURS, ; THE PROGRAM WILL GO INTO A WAIT STATE AND TRY AGAIN LATER. .MCALL .READW, .WRITW, .LOOKUP, .DELETE, .PURGE, .TWAIT .MCALL .DSTAT, .PRINT, .RCTRLO, .EXIT, .CLOSE .IF NE MMG$T .MCALL .CRRG, .CRAW, .RDBBK, .RDBDF, .WDBBK .RDBDF ;DEFINE EXTENDED MEMORY MNEMONICS .ENDC .IIF NDF MMG$T, MMG$T=0 ;MAKE SURE MMG$T IS DEFINED .IF NE MMG$T JSW = 44 ;ADDRESS OF JOB STATUS WORD VIRTUAL = 0 ;BIT WHICH MAKES A JOB VIRTUAL(SET 2000 IN JSW) APR = 7 ;PAR/PDR SET USED FOR WINDOW WINOFF = 0 ;OFFSET IN REGION TO START WINDOW BUFF = APR*4096.*2 ;THIS IS WHERE THE BUFFER IS .ENDC ERRBYT = 52 ;EMT ERROR BYTE ADDRESS WDCT = 512. ;WORD COUNT FOR READ'S (2 BLOCKS) ; PLACE THE EMT REQUEST BLOCKS BEFORE THE CODE SO THAT THE USR CAN ; SWAP OVER THE AREA STARTING AT 'START'. .IF NE MMG$T .ASECT .=JSW ;POINT TO SYSTEM COMMUNICATION AREA .WORD VIRTUAL ;THIS IS A VIRTUAL JOB .PSECT SPOOLR .ENDC TIMBLK::.BYTE 0,24 ;TWAIT CODE .WORD TIME TIME:: .WORD 0,60.*30. ;WAIT 30 SECONDS DBLK:: .RAD50 /SPL LST/ LP:: .RAD50 /LP0 / AREA:: .WORD 0,0,0,0,0 ;EMT REQUEST AREA .IF NE MMG$T WADR:: .WDBBK APR,WDCT/32.,0,WINOFF,WDCT/32.,WS.MAP WNRID= WADR+W.NRID ;ADDRESS OF REGION ID WORD RGADR:: .RDBBK WDCT/32. .ENDC START:: .RCTRLO ;MAKE THE TTY SPEAK IF ERROR MOV #AREA,R2 ;R2 -> EMT REQUEST AREA & DSTATUS INFO .IF NE MMG$T .CRRG R2,#RGADR ;ALLOCATE A REGION IN EXTENDED MEMORY BCC 1$ ;IF CC, ALLOCATION OK MOV #MSG2,R0 ;IF CS, ALLOCATION ERROR BR QUIT 1$: MOV RGADR,WNRID ;LINK REGION TO WINDOW .CRAW R2,#WADR ;CREATE A WINDOW BCC 2$ ;IF CC, WINDOW CREATED AND MAPPED MOV #MSG3,R0 ;C=1, SO WINDOW CREATION ERROR BR QUIT 2$: .ENDC MOV #START,@#46 ;USR LOAD ADDR.(MUST HAVE ONE FOR FG) ;SL .DSTAT R2,#LP ;SEE IF LP LOADED BCS 3$ ;IF C=1 THEN ERROR TST 4(R2) ;IF ENTRY POINT=0, BNE 4$ ;NOT IN CORE 3$: MOV #MSG0,R0 ;R0 -> LP NOT LOADED MESSAGE BR QUIT 4$: .LOOKUP R2,#1,#LP,#0 ;OPEN CHANNEL 1 FOR OUTPUT BCS 3$ ;IF C=1 THEN ERROR MOV #DBLK,R1 ;R1 -> DEV:FILNAM.EXT .DSTAT R2,R1 ;SEE IF SPL LOADED BCS 5$ ;FAILED? TST 4(R2) ;IF ENTRY POINT = 0 THEN NOT LOADED BNE GO 5$: MOV #MSG1,R0 ;PREPARE FOR FAIL MESSAGE QUIT: .PRINT .EXIT ;QUIT AFTER ERROR GO: .PRINT #OK ;PRINT ALL IS OK MESSAGE FIND: .PURGE #0 ;FREE CHANNEL 0 FOR USE CLR 2(R1) ;WHEN FILENAME IS 0 THEN .LOOKUP #AREA,#0,R1,#0 ; READ'S WILL BE ABSOLUTE BLOCK MODE 1$: MOV #BUFF,R2 ;R2 -> BUFFER AREA FOR READS MOV #1,R3 ;DIRECTORY STARTS AT BLK 6 2$: ASL R3 ;BY 2 ADD #4,R3 .READW #AREA,#0,R2,#WDCT,R3 ;CHAN,BUFF,WDCT,BLK BCS 5$ ;DIRECTORY READ ERROR, ;DEVICE OFF LINE, SO WAIT. 3$: MOV R2,R5 ;COPY START OF BUFR PTR ADD #12,R5 ;R5 -> FILE STATUS WD 4$: BIT #4000,@R5 ;END OF SEGMENT IF=4XXX BEQ 6$ MOV 2(R2),R3 ;NEXT DIR SEG PTR BNE 2$ ;0 IF NO NEXT SEG 5$: MOV #TIMBLK,R0 ;NO FILE TO LIST SO WAIT .TWAIT BR FIND 6$: BIT #2000,(R5)+ ;PERMANENT ENTRY ? BEQ 7$ ;NO IF EQ CMP 4(R5),#^RLST ;YES,LOOK AT EXTENSION BEQ COPIER ;IF EXTENSION = LST THEN GO COPY FILE 7$: ADD #14,R5 ;SKIP OTHER FILE ENTRY WORDS BR 4$ COPIER: MOV (R5)+,2(R1) ;PUT FILNAM IN DBLK MOV (R5)+,4(R1) .LOOKUP #AREA,#2,R1,#0 BCS FIND ;LOOKUP FAILED CLR R5 ;RELATIVE BLK # ; HAVE THE FILE, NOW LIST IT 1$: .READW #AREA,#2,R2,#WDCT,R5 BCS 3$ ;READ ERROR OR EOF MOV R0,R4 ;NUMBER OF WORDS ACTUALLY READ .WRITW #AREA,#1,R2,R4,R5 BCC 2$ MOV #ERROUT,R0 ;R0 -> MSG FOR OUTPUT ERROR BR QUIT 2$: TST (R5)+ ;BUMP BLK # BR 1$ 3$: TSTB @#ERRBYT ;EMT ERROR BYTE BEQ 4$ ;EOF IF=0 .PRINT #ERRIN 4$: .CLOSE #2 ;CLOSE INPUT CHANNEL & DELETE LST FILE .DELETE #AREA,#2,R1,#0 ;R1 -> DBLK BR FIND ;CONTINUE .ENABL LC .NLIST BEX MSG0: .ASCIZ /?DEMOSP-F-No LP/ MSG1: .ASCIZ /?DEMOSP-F-ASSIGN or LOAD SPL/ .IF NE MMG$T MSG2: .ASCIZ /?DEMOSP-F-Extended memory region creation error/ MSG3: .ASCIZ /?DEMOSP-F-Extended memory window creation error/ .ENDC OK: .ASCIZ /?DEMOSP-I-Started OK, SPL & LP devices are assigned & loaded/ ERRIN: .ASCIZ /?DEMOSP-F-LST file read error/ ERROUT: .ASCIZ /?DEMOSP-F-Write error/ .EVEN .IF EQ MMG$T BUFF:: .BLKB 4096.+START-. ;ROOM FOR USR & BUFFER AREA ;SL .ENDC .END START