TITLE LPTSER - LINE PRINTER SERVICE ROUTINE SUBTTL 8-4-65 INTERNAL LPTINT,LPTINI EXTERNAL LPTCHN, LPTCHL, LPTRET, OUT, WAIT1, LPTSAV, IOSET EXTERNAL ADVBFE, SETIOD,ILLINP,LPTCHB,LPTCLB ;DEVICE DATA BLOCK LINKAGE EXTERNAL LPTDAT,LPTCHR,LPTIOS,LPTSER,LPTMOD,LPTBUF,LPTPTR EXTERNAL LPTADR,LPTSV1 ENTRY LPTDSP ,LPT PARAMETER ASSIGNMENTS , LPT CONTROL REGISTER LPTCLR=2000 ;CLEAR BUFFER LPTDON=100 ;DONE FLAG LPTERR=400 ;ERROR FLAG LPTLOV=1000 ;LINE OVERFLOW , SPECIAL IO STATUS WORD ASSIGNMENTS LPTADV=100000 REPEAT 0,< , LPT DATABLOCK LPTDAT: SIXBIT .LPT. LPTCHR: 32 LPTIOS: 0 LPTSER: EXP LPTDSP LPTMOD: XWD 0,3 0 LPTBUF: 0 LPTPTR: 0 LPTADR: XWD PROG,0 LPTSV1: 0 > , LPT SERVICE DISPATCH TABLE LPTDSP: JRST LPTINI ;RELEASE JRST LPTCLS ;CLOSE JRST LPTOUT ;OUTPUT JRST ILLINP ;INPUT LPTINI: CONO LPT,LPTCLR ;LPT INITIALIZE HLLZS LPTINT POPJ PDP, LPTCLS: PUSHJ PDP,OUT ;PRINT REMAINING BUFFERS PUSHJ PDP, WAIT1 ;WAIT FOR IOACT=0 DATAO LPT,LPTTOP ;PRINT CARRAGE RETURN, FORM FEED POPJ PDP, ;CLOSE RETURN LPTOUT: TRO IOS,IOACT ;IOACT=1 TLZ IOS,IODISC ;IODISC:=0 TLO IOS,IO ;IO:=1 TLNE IOS,IOBEG ;VIRGIN DEVICE? IOBEG:=0 JRST LPTBEG ;YES PUSHJ PDP,LPTSET MOVEM IOS,LPTIOS ;C(LPTIOS):=C(IOS) MOVEI TAC,LPTDON JRST LPTBG1 LPTBEG: TLO IOS,IODISC MOVEM IOS,LPTIOS ;C(LPTIOS):=C(IOS) PUSHJ PDP,LPTSET MOVEI TAC,LPTCLR LPTBG1: MOVEI TAC1,LPTLOV+LPTERR+LPTDON HRRM TAC1,LPTINT CONO LPT, LPTCHB(TAC) ;CLEAR BUFFER AND ASSIGN PI C POPJ PDP, ;RETURN , LINE PRINTER INTERRUPT SERVICE LPTINT: CONSO LPT,LPTLOV+LPTERR+LPTDON;LINE OVERFLOW, ERROR OR DONE JRST LPTINT ;IF LPT IS IN FLAG LIST, GO TO ERROR, E CONSZ LPT,70 CONSO LPT,LPTDON JRST LPTERI ;YES LPTIN1: SKIPGE LPTIOS ;IODISC=1? JRST LPTDSC ;YES BLKO LPT,LPTPTR ;PRINT SKIPA ;BUFFER EMPTY JEN @LPTCHL ;DISMISS INTERRUPT AND RETURN MOVEM TAC,LPTSV1 ;SAVE TAC HRLZI TAC,IODISC ;IODISC:=1 IORM TAC,LPTIOS LPTERX: MOVE TAC,LPTSV1 ;RESTORE TAC JEN @LPTCHL ;DISMISS INTERRUPT AND RETURN LPTDSC: JSR LPTSAV ;SAVE ACCUMULATORS AND ESTABL MOVEI DEVDAT,LPTDAT ;DEVDAT:=LPTDAT PUSHJ PDP,IOSET ;PROG:=C(JBTADR18-35),ITEM:=C(DEVPTR) MOVE IOS,LPTIOS TLZE IOS,IOBEG JRST LPTBG ;PUT OUT CR-LF PUSHJ PDP,ADVBFE ;ADVANCE BUFFER JRST LPTOFF ;NEXT BUFFER EMPTY TRNE IOS,IOCON ;CONTINUOUS? (IOCON=0?) JRST LPTOFF ;NO TLZ IOS,IODISC PUSHJ PDP,LPTSET ;SET LPTPTR LPTINX: TLZE IOS,IOW ;IN A WAIT? IOW:=0 PUSHJ PDP,SETIOD ;YES. IOWS:=1 LPTXIT: MOVEM IOS,LPTIOS ;C(LPTIOS):=C(IOS) JRST LPTRET ;RESTORE ACCUMULATORS AND DIS LPTOFF: TRZ IOS,IOACT CONO LPT,0 HLLZS LPTINT ;TURN LPT OFF JRST LPTINX LPTBG: DATAO LPT,LPTTOP ;SEND OUT CR-FF TLZ IOS,IODISC ;WHEN IODISC=1 JRST LPTXIT ;HERE ON EITHER OVERFLOW OR ERROR(OFFLINE) OR ERROR CHANNEL ;NOT ASSIGNED. LPTERI: MOVEM TAC,LPTSV1 ;SAVE TAC CONSO LPT,LPTLOV ;LINE OVERFLOW? JRST LPTER1 ;NO MOVN TAC,[EXP 100001] ;YES, DECREMENT POINTER ADDM TAC,LPTPTR DATAO LPT,[EXP 15B6+12B13] ;PRINT CARRIAGE RETURN, LINE JRST LPTERX LPTER1: CONSO LPT,70 ;ERROR INTERRUPT ASSIGNED? JRST LPTER2 ;NO CONO LPT,LPTCLB ;YES, DEASSIGN IT,SET BUSY,CLEAR REST MOVEI TAC,LPTDON ;ENABLE FOR DONE FLAG ONLY LPTERA: HRRM TAC,LPTINT JRST LPTERX LPTER2: CONI LPT,TAC ANDI TAC,300 CONO LPT,LPTCHB(TAC) MOVEI TAC,LPTDON+LPTERR+LPTLOV HRRM TAC,LPTINT MOVE TAC,LPTSV1 JRST LPTIN1 LPTTOP: EXP 15B6+14B13 ;CARRIAGE RETURN, FORM FEED ,SET UP PRINTER COUNTER AND POINTER LPTSET: MOVEI TAC,@LPTADR ;LPTPTR:=-(WORD COUNT+1), BUFFER ADDRES MOVN TAC1,1(TAC) HRL TAC,TAC1 AOJLE TAC,.+2 ;C(LPTPTR0-17)<0? HRROI TAC,LPTNUL-1 MOVEM TAC,LPTPTR POPJ PDP, ;RETURN LPTNUL: 0 END,