TITLE LPTSER - LINE PRINTER SERVICE ROUTINE FOR MULTIPLE LINE PRINTERS - V405 SUBTTL T. W. MCMANUS /TNM TS 20 MAY 69 XP VLPTSR,405 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN COMMON: EXTERNAL CPOPJ1, PION, PIOFF ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN CLOCK1: EXTERNAL SETIOD, WAIT1 ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN ERRCON: EXTERNAL HNGSTP, ILLINP ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN UUCON: EXTERNAL ADVBFE, IOSET, OUT, SETACT, STOIOS ;THE FOLLOWING SYMBOLS ARE REFERENCED OUTSIDE OF LPTSER: INTERN LPTINT, LPTNXT, LPTECM, LPTDON, LPTDSP ENTRY LPTSER LPTSER: ;LINE PRINTER CONTROL REGISTER MNEMONIC DEFINITIONS LPTCLR=1B25 ;CLEAR LINE PRINTER BUFFER LPTLOV=1B26 ;LINE OVERFLOW FLAG (PDP-6 ONLY) LPTERR=1B27 ;ERROR FLAG LPTBSY=1B28 ;BUSY FLAG LPTDON=1B29 ;DONE FLAG LPTECM=7B32 ;ERROR CHANNEL MASK LPTDCM=7B35 ;DONE CHANNEL MASK LPTBDM=LPTBSY+LPTDON ;BUSY/DONE FLAG MASK ;LINE PRINTER DEVICE DEPENDANT I/O STATUS MNEMONIC DEFINITIONS LPTEND=Z(1B10) ;CLOSE UUO HAS BEEN DONE LPTSYN=Z(1B11) ;CREF AFTER CLOSE UUO HAS BEEN SENT ;LINE PRINTER DEVICE DATA BLOCK ADDRESSING MNEMNIC DEFINITIONS LPTCON=-4 ;RH = SKIP CHAIN MASK REGISTER LPTPTR= 7 ;BLOCK OUTPUT POINTER LPTCH= 11 ;INTERRUPT CHANNEL ASSIGNMENTS LPTSVE=12 ;DDB ROUTINE TO SAVE AC'S LPTEX1=16 ;DDB EXIT ROUTINE IF AC'S NOT SAVED LPTSV2=20 ;TEMP. SAVE LOCN. FOR TAC LPTECH=21 ;CONSZ LP?,LPTECM LPTDNE=22 ;CONSO LP?,LPTDON LPTCSO=23 ;CONSO LP?,(TAC) LPTCSZ=24 ;CONSZ LP?,(TAC) LPTCNI=25 ;CONI LP?,TAC LPTCNO=26 ;CONO LP?,(TAC) LPTDTO=27 ;DATAO LP?,(TAC) LPTBKO=30 ;BLKO LP?,LP?PTR ;LINE PRINTER SERVICE DISPATCH TABLE JRST LPTINI ;INITIALIZE JRST LPTHNG ;HUNG DEVICE ERROR LPTDSP: JRST LPTREL ;RELEASE JRST LPTCLS ;CLOSE JRST LPTOUT ;OUTPUT JRST ILLINP ;INPUT ;LINE PRINTER INITIALIZATION, HUNG DEVICE AND RELEASE CODE ;LPTINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM ;IOGO IN SYSINI WITH THE DDB ADDRESS IN DEVDAT ;LPTHNG IS CALLED FROM DEVCHK IN UUOCON (IOCSS) WITH ;THE DDB ADDRESS IN DEVDAT WHENEVER A LINE PRINTER ;HUNG DEVICE COUNT IS DECREMENTED TO ZERO ;LPTREL IS CALLED FROM RELEA1 IN UUOCON WITH THE DDB ;ADDRESS IN DEVDAT WHENEVER A RELEASE UUO IS EXECUTED ;FOR A LINE PRINTER ;EACH OF THE ABOVE ROUTINE MUST: ; ; 1. CLEAR THE SPECIFIED LINE PRINTER ; 2. DEASSIGN BOTH THE ERROR AND DONE INTERRUPT ; CHANNELS FOR THE LINE PRINTER ; 3. CLEAR THE SKIP CHAIN INTERRUPT MASK FLAGS ; FOR THAT LINE PRINTER ;NOTE: THE LPTINI CODE FORCES IOGO IN SYSINI TO INVOKE ; LPTINI FOR EACH LINE PRINTER ON THE SYSTEM RATHER ; THAN FOR THE NORMAL CASE WHERE IT INVOKES THE ; INITIALIZATION CODE ONCE FOR EACH DISPATCH TABLE. ; ; THEREFORE, THE CORRECT OPERATION OF THE LPTINI CODE ; IS DEPENDANT UPON THE IOGO CODE WHICH SHOULD BE: ; ; PUSHJ PDP,DINI(AC3) ; HRRZM AC3,SAVITM LPTHNG: LPTREL: SOS (PDP) ;COUNTERACT SKIP RETURN LPTINI: MOVEI TAC,LPTCLR ;CLEAR THE LINE PRINTER XCT LPTCNO(DEVDAT) HLLZS LPTCON(DEVDAT) ;CLEAR SKIP CHAIN MASK FLAGS JRST CPOPJ1 ;SKIP RETURN IF ENTERED AT LPTINI ; TO FORCE CALL FOR EACH LPT ;LINE PRINTER CLOSE UUO ROUTINE LPTCLS: TLO IOS,LPTEND ;TURN ON THE END FLAG TLZ IOS,LPTSYN ;TURN OFF SYNCHRONIZATION FLAG MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS IN THE DDB JRST OUT ; AND RETURN TO UUOCON ;LINE PRINTER OUTPUT UUO ROUTINE LPTOUT: SETZ TAC, ;CLEAR ALL POSSIBLE XCT LPTCNO(DEVDAT) ; LINE PRINTER FLAGS MOVEI TAC,LPTERR ;SET MASK FOR ERROR FLAG XCT LPTCSO(DEVDAT) ;SKIP IF ERROR FLAG IS ON JRST .+3 ; LPT IS NOT OFF, NOT ON LOCAL PUSHJ PDP,HNGSTP ;STOP JOB AND PRINT REMINDER JRST LPTOUT ;TRY AGAIN WHEN USER TYPES "CONT" TLNE IOS,IOBEG ;IS THIS FIRST OUTPUT SINCE INIT? JRST LPTNEW ; YES PUSHJ PDP,LPTSET ; NO, SET UP BLKO POINTER LPTGO: PUSHJ PDP,SETACT ;SET I/O ACTIVE BIT, STORE IOS ; AND SET HUNG DEVICE COUNT MOVE TAC,LPTCH(DEVDAT) ;GET CHANNEL ASSIGNMENTS FROM DDB TLNE IOS,IOBEG ;IS THIS FIRST OUTPUT SINCE INIT? IORI TAC,LPTCLR+LPTDON ;SET LPTCLR IF IOBEG:=1, ELSE XORI TAC,LPTDON ; SET LPTDON HRLI TAC,LPTLOV+LPTERR+LPTDON ;GET SKIP CHAIN MASK FLAGS CONO PI,PIOFF ;TURN OFF PI TO PREVENT IMM. INT. XCT LPTCNO(DEVDAT) ;SEND CONDITIONS OUT TO LPT HLRM TAC,LPTCON(DEVDAT) ;SAVE SKIP CHAIN MASK FLAGS CONO PI,PION ;REENABLE ALL INTERRUTPS POPJ PDP, ; AND RETURN TO UUOCON LPTNEW: TLO IOS,IO ;SET I/O DIRECTION TO OUTPUT SETZM LPTPTR(DEVDAT) ;CLEAR BLKO POINTER JRST LPTGO ;RETURN TO MAINSTREAM ;LINE PRINTER INTERRUPT SERVICE ROUTINE LPTINT: XCT LPTECH(DEVDAT) ;SKIP IF NO ERROR CHANNEL ASSIGNED XCT LPTDNE(DEVDAT) ;SKIP IF DONE FLAG IS UP JRST LPTER1 ; BRANCH TO ERROR SERVICE ROUTINE SKIPL LPTPTR(DEVDAT) ;BLKO COUNT TO 0 ON PREV. INTERRUPT JRST LPTSVE(DEVDAT) ; YES, GO SAVE ORIGINAL AC'S XCT LPTBKO(DEVDAT) ; NO, SEND NEXT WORD FOR PRINTING JRST LPTEX1(DEVDAT) ;LAST WORD SENT BUT INTERRUPT PENDING JRST LPTEX1(DEVDAT) ;GO RESTORE DEVDAT AND RETURN LPTNXT: ;ENTER HERE AFTER DDB ROUTINE SAVE ; ORIGINAL AC'S IN PROPER CHANNEL ; SAVE AREA AND SETS UP DEVDAT ; TO POINT TO DDB AGAIN PUSHJ PDP,IOSET ;SET AC PROG:= JOB AREA ADDRESS AND ; AC IOS:= DEVIOS IN THE DDB TLZE IOS,IOBEG ;FIRST BUFFER SINCE INIT? JRST LPTBG1 ; YES, GO OUTPUT A CRFF PUSHJ PDP,ADVBFE ; NO, ADVANCE TO NEXT BUFFER JRST LPTOFF ;CANNOT ADVANCE, BUFFER UNAVAILABLE PUSHJ PDP,LPTSET ;SET UP NEW BLKO POINTER LPTWCK: TLZE IOS,IOW ;IS JOB WAITING FOR I/O COMPLETION? PUSHJ PDP,SETIOD ; YES, ARRANGE FOR JOB TO RUN AGAIN LPTEX2: JRST STOIOS ;SAVE IOS, RESET HUNG DEVICE COUNT ; AND DISMISS INTERRUPT LPTOFF: TLNN IOS,LPTEND ;SKIP IF CLOSE HAS BEEN DONE JRST LPTOF1 ; GO TURN PRINTER OFF UNTIL NEXT OUTPUT TLON IOS,LPTSYN ;HAS FINAL CRFF BEEN OUTPUT? JRST LPTBG2 ; NO, SO GO DO IT TLZ IOS,LPTEND ; YES, SO CLEAR END FLAG LPTOF1: TRZ IOS,IOACT ;CLEAR I/O ACTIVE BIT SETZ TAC, ;CLEAR TAC AND XCT LPTCNO(DEVDAT) ; TURN LPT OFF HLLZS LPTCON(DEVDAT) ;CLEAR SKIP CHAIN MASK FLAGS JRST LPTWCK ; AND BRANCH LPTBG1: PUSHJ PDP,LPTSET ;SET UP INITIAL BLKO POINTER ***** LPTBG2: MOVEI TAC,[EXP 15B6+14B13] ;SEND OUT A CRFF XCT LPTDTO(DEVDAT) JRST LPTEX2 ;GO DISMISS ITERRUPT ;LINE PRINTER ERROR HANDLING ROUTINE LPTER1: MOVEM TAC,LPTSV2(DEVDAT) ;SAVE TAC IN DDB MOVEI TAC,LPTLOV ;GET LINE OVERFLOW ERROR MASK XCT LPTCSO(DEVDAT) ;SKIP IF LINE OVERFLOW FLAG IS ON JRST LPTER2 ; GO CHECK IF PREVIOUS ERROR OCCURRED MOVN TAC,[EXP 1000001] ;DECREMENT BLK0 POINTER ADDM TAC,LPTPTR(DEVDAT) MOVE TAC,[EXP 15B6+12B13] ;PRINT CRLF XCT LPTDTO(DEVDAT) JRST LPTER4 LPTER2: XCT LPTECH(DEVDAT) ;SKIP IF ERROR INTERRUPT NOT ASSIGNED JRST LPTER5 ; ERROR CONDITION DETECTED MOVE TAC,LPTCH(DEVDAT) ;GET INTERRUPT CHANNEL ASSIGNMENTS ANDI TAC,LPTDCM ;MASK OUT ERROR CHANNEL IORI TAC,LPTBSY ;SET THE BUSY FLAG XCT LPTCNO(DEVDAT) ;SEND IT OUT TO THE LPT MOVEI TAC,LPTLOV+LPTERR+LPTDON ;ENABLE FOR ALL INTERRUPTS LPTER3: HRRM TAC,LPTCON(DEVDAT) ;SAVE SKIP CHAIN MASK FLAGS LPTER4: MOVE TAC,LPTSV2(DEVDAT) ;RESTORE SAVED ACCUMULATOR JRST LPTEX1(DEVDAT) ; AND GO DISMISS INTERRUPT LPTER5: MOVE TAC,LPTCH(DEVDAT) ;GET INTERRUPT CHANNEL ASSIGNMENTS ANDI TAC,LPTDCM ;MASK OUT ERROR CHANNEL ASSIGNMENT IORI TAC,LPTBSY ;SET BUSY FLAG XCT LPTCNO(DEVDAT) ;SEND IT OUT TO THE LPT MOVEI TAC,LPTDON ;ENABLE FOR DONE FLAG ONLY JRST LPTER3 ;LINE PRINTER BLKO POINTER SETUP ROUTINE LPTSET: MOVEI TAC,@DEVOAD(DEVDAT) ;GET ABS. ADDR. OF CURRENT BUFFER MOVN TAC1,1(TAC) ;GET NEGATIVE WORD COUNT HRL TAC,TAC1 ;COMBINE NEG. WORD COUNT AND ADDR, AOJ TAC, ;INCREMENT BUFFER ADDRESS TO FORM MOVEM TAC,LPTPTR(DEVDAT) ; LPTPTR:= -(WORD COUNT),(BUFF, ADDR, +1) POPJ PDP, ; AND RETURN END