.TITLE HC V01 1-MAY-79 .IDENT /V01/ ; RT-11 V03 HANDLER FOR USING ALTERNATE TERMINAL AS LINEPRINTER. USEFUL IN ; SITUATIONS WHERE THE CONSOLE TERMINAL IS A CRT TYPE, BUT A HARDCOPY ; TERMINAL IS AVAILABLE FOR PERMANENT RECORDS. ANY OUTPUT THAT WOULD ; ORDINARILY BE SENT TO THE LINEPRINTER, SUCH AS OBJECTS OF A PRINT COMMAND, ; OUTPUT SENT TO FORTRAN UNIT 6, ETC. CAN BE SENT TO THE HARDCOPY TERMINAL ; USING THIS HANDLER. TO DO THIS THE HANDLER MUST BE INSTALLED, "INSTALL HC", ; AND HAVE THE LOGICAL DEVICE LP ASSIGNED TO IT, "ASSIGN HC LP". THE HANDLER ; SERVICES TABS AND FORM FEEDS BY SOFTWARE TECHNIQUES EVEN IF THE TERMINAL ; IS CAPABLE OF DOING THEM BY HARDWARE. ; ; FIVE SET COMMANDS ARE AVAILABLE FOR CHANGING OPTIONS: ; 1. SET HC WIDTH=XX SETS THE NUMBER OF COLUMNS TO XX - DEFAULT IS 132. ; 2. SET HC LENGTH=XX SETS THE PAGE LENGTH TO XX - DEFAULT IS 66. ; 3. SET HC LC TERMINAL WILL PRINT LOWER CASE CHARACTERS (DEFAULT). ; SET HC NOLC CONVERT LOWER CASE TO UPPER CASE. ; 4. SET HC DOFF DO FORM FEEDS IN RESPONSE TO FORM FEED CHARACTERS (DEFAULT). ; SET HC NODOFF IGNORE FORM FEED CHARACTERS. ; 5. SET HC PAGE DO 8 LINEFEEDS AT END OF PAGE. ; SET HC NOPAGE DO NOTHING SPECIAL AT END OF PAGE (DEFAULT). ; TO USE THE SET HC PAGE COMMAND, SET THE LENGTH OF THE PAGE TO 8 LINES LESS ; THAN THE ACTUAL PHYSICAL LENGTH. FOR EXAMPLE, WHEN USING 66 LINE PAPER DO ; SET HC LENGTH=58. YOU WILL THEN GET 8 BLANK LINES AROUND THE CREASE IN THE ; PAPER, PROVIDED YOU INITIALLY POSITIONED THE PAPER TO START NEAR THE TOP ; OF THE PAGE. PROPER INITIAL POSITIONING IS ALSO REQUIRED FOR GETTING FORM ; FEEDS THAT KEEP THE TEXT IN PROPER ALIGNMENT WITH THE PAGE, SINCE UNLIKE ; THE SITUATION WITH A TRUE LINEPRINTER, THE TERMINAL DOES NOT "KNOW" WHERE ; THE TOP OF THE PAGE IS. BECAUSE OF THIS, EACH TIME THE HANDLER IS CALLED ; ANEW THE PAPER WILL NEED TO BE REPOSITIONED. NOTE ALSO THAT COMBINING THE ; PAGE AND DOFF OPTIONS CAN LEAD TO WASTED PAPER IN SOME CIRCUMSTANCES. ; ; THE HANDLER CAN BE RECONFIGURED FOR DIFFERENT VECTOR AND REGISTER ADDRESSES ; BY CHANGING THE ASSIGNMENTS OF HCSR AND HCVEC IN THE NEXT SECTION. ; HIGH SPEED TERMINALS SUCH AS THE LS120 NEED NULL FILL CHARACTERS AFTER ; LINEFEEDS IN ORDER TO WORK PROPERLY. THIS CAN BE ACCOMPLISHED BY ENTERING ; "FILCNT=10" IN THE NEXT SECTION. .MCALL .DRBEG,.FORK,.DREND .MCALL .DRAST,.DRFIN,.QELDF .IIF NDF MMG$T, MMG$T=0 .IIF NDF ERL$G, ERL$G=0 .IIF NDF TIM$IT, TIM$IT=0 .QELDF .IIF NDF HCSR, HCSR=176504 .IIF NDF HCVEC, HCVEC=304 HCDSIZ = 0 .IIF NDF HCSTS,HCSTS = 20003 .IIF NDF FILCNT,FILCNT =0 HDERR = 1 CR = 15 LF = 12 FF = 14 HT = 11 FILCNT = 10 .IIF NDF HCCSZ, HCCSZ = 132. .IIF NDF PAGSIZ, PAGSIZ = 66. COLSIZ = HCCSZ .GLOBL COLCNT,LINCNT .ASECT . = 400 .WORD 30. .RAD50 /WIDTH / .WORD /2+40000 BR DONEXT-FFOPT+. .RAD50 /DOFF / .WORD /2+100000 .WORD 40 .RAD50 /LC / .WORD /2+100000 .WORD 10. .RAD50 /LENGTH/ .WORD /2+40000 BEQ PAGEND-LINOPT+. .RAD50 /PAGE / .WORD /2+100000 .WORD 0 O.WIDTH:MOV R0,COLCNT MOV R0,RSTC+2 CMP R0,R3 RTS PC O.DOFF: MOV (PC)+,R3 BNE DONEXT-FFOPT+. MOV R3,FFOPT RTS PC O.LC: CLR R3 NOP MOV R3,LCOPT RTS PC O.LENGTH:MOV R0,LINCNT MOV R0,PAGEND+2 CMP R0,R3 RTS PC O.PAGE: MOV (PC)+,R3 BEQ PAGSPC-LINOPT+. MOV R3,LINOPT RTS PC ;HEADER SECTION ; .=1000 .DRBEG HC,HCVEC,HCDSIZ,HCSTS ;HANDLER HEADER HC: MOV HCCQE,R4 ;R4 IS BUFFER POINTER ASL 6(R4) ;CHANGE WORD COUNT TO BYTE COUNT BCC HCERR ;MUST BE ILLEGAL READ REQUEST BEQ HCDONE ;A SEEK COMPLETES IMMEDIATELY RET: BIS #100,@#HCSR ;ENABLE INTERRUPT RTS PC ; ;INTERRUPT AND FORK SERVICE ; .IF EQ MMG$T .IFTF .DRAST HC,4,HCDONE ;SET INTERRUPT ENTRY POINT & PRIORITY MOV HCCQE,R4 ;R4 -> CURRENT QUEUE ELEMENT TSTB @#HCSR ;TERMINAL READY? BPL RET ;NO, EXIT & WAIT CLR @#HCSR ;YES, DISABLE INTERRUPT .FORK HCFBLK ;REQUEST FORK PROCESS HCNEXT: TSTB @#HCSR ;READY FOR ANOTHER CHARACTER? BPL RET ;NO, EXIT & WAIT ASLB (PC)+ ;MOVE TAB POSITION PNTR & TABFLG: .WORD 0 ;TEST IF WE'RE DOING A TAB BEQ TSTFIL ;BR IF NOT DOING A TAB TAB: MOV #40,R5 ;PUT OUT A SPACE AS ELEMENT OF TAB BR TCHAR TSTFIL: TST (PC)+ ;ARE WE IN THE MIDDLE OF DOING FILLS? FILFLG: .WORD 0 BEQ 1$ ;BR IF NOT DEC FILFLG ;DECREMENT THE FILL FLAG CLR R5 ;SEND A NULL TO THE TERMINAL BR TYPIT 1$: TST (PC)+ ;ARE WE IN PROCESS OF DOING A FORM FEED? FFFLAG: .WORD 0 BGT FORM ;IF YES, BR TO FORM FEED ROUTINE DONEXT: TST 6(R4) ;ANY CHARACTERS LEFT IN BUFFER? BEQ HCDONE ;NO, XFER IS DONE .IFT MOVB @4(R4),R5 ;YES, GET A CHAR. INC 4(R4) ;BUMP BUFFER POINTER .IFF JSR PC,@$GTBYT ;SAME AS ABOVE FOR MEMORY MANAGEMENT MOV (SP)+,R5 .IFTF INC 6(R4) ;BUMP CHARACTER COUNT BIC #^C177,R5 ;STRIP TO 7 BIT ASCII CMPB R5,#40 ;ASCII BELOW 40 MAY BE TAB, CR, LF, OR FF BLO CHRTST ;TEST ABOVE POSSIBILITIES CMPB #140,R5 ;LOWER CASE CHARACTER? BHIS TCHAR ;BR IF NOT SUB (PC)+,R5 ;DEPENDING ON OPTION, LEAVE IT ALONE OR LCOPT: 0 ;CONVERT TO UPPER CASE TCHAR: DEC (PC)+ ;KEEP TRACK OF HORIZONTAL POSITION COLCNT: .WORD COLSIZ BLT DONEXT ;IF WE'RE PAST RT. MARGIN, DON'T TYPE ASLB (PC)+ ;KEEP TRACK OF TAB POSITION TABCNT: .WORD 1 BNE TYPIT ;BETWEEN TAB STOPS, TYPE RSTTAB: MOV #1,TABCNT ;AT TAB STOP, SET UP FOR NEXT ONE FIRST TYPIT: MOVB R5,@#HCSR+2 ;SEND CHARACTER TO TERMINAL BR HCNEXT ;GO BACK FOR ANOTHER ; ;THE FOLLOWING SECTION TESTS FOR & SERVICES TABS, CARRIAGE RETURNS, LINE ;FEEDS, AND FORM FEEDS. OTHER NONPRINTABLE CHARACTERS ARE IGNORED. ; CHRTST: CMPB R5,#HT ;TAB CHARACTER? BNE LFTST ;BR IF NOT MOV TABCNT,TABFLG ;SET TAB FLAG TO OUTPUT PROPER # OF SPACES BR TAB ;START THE TAB LFTST: CMPB R5,#LF ;LINEFEED CHARACTER? BEQ LFSRV ;YES, BR TO SERVICE ROUTINE CMPB R5,#CR ;CARRIAGE RETURN CHARACTER? BNE FFTST RSTC: MOV #COLSIZ,COLCNT ;SET HORIZONTAL POS. TO LEFT MARGIN BR RSTTAB ;SET TO START OF TAB POSITION & OUTPUT FFTST: CMPB R5,#FF ;FORM FEED CHARACTER? FFOPT: BNE DONEXT ;IGNORE ANYTHING ELSE, OPTIONALLY IGNORE FF MOV LINCNT,FFFLAG ;SET UP FF FLAG & FF COUNT FORM: MOV #LF,R5 ;PUT OUT A LF AS PART OF A FF DEC FFFLAG ;COUNT DOWN FOR THE FORM FEED LFSRV: MOV #FILCNT,FILFLG ;LF'S MAY REQUIRE FILL CHARACTERS DEC (PC)+ ;KEEP TRACK OF VERTICAL POSITION LINCNT: .WORD PAGSIZ LINOPT: BEQ PAGEND ;END OF PAGE? BR TYPIT ;NO, OUTPUT THE LF PAGEND: MOV #PAGSIZ,LINCNT ;YES, RENEW THE LINE COUNT FIRST BR TYPIT PAGSPC: DEC (PC)+ ;WITH PAGE OPTION, OUTPUT 8 BLANK LINES INTPAG: .WORD 9. ;ACTUALLY 1 NULL AND 8 LF'S BLE 1$ ;8 LF'S DONE? INC LINCNT ;CAUSE PROGRAM TO RETURN TO PAGSPC: INC FFFLAG ;CAUSE PROGRAM TO RETURN TO FORM: BR TYPIT 1$: MOV #9.,INTPAG ;RESTORE COUNT FOR NEXT TIME BR PAGEND ;GO SET VERT. POS. TO TOP OF PAGE HCERR: BIS #HDERR,@-(R4) ;SET ERROR BIT IN CHANNEL .ENDC HCDONE: CLR @#HCSR ;DISABLE INTERRUPT .DRFIN HC ;I/O COMPLETION CODE HCFBLK: .WORD 0,0,0,0 ;FORK QUEUE ELEMENT .DREND HC .END