.MCALL .MODULE .MODULE PC,VERSION=05,COMMENT=,AUDIT=YES ; COPYRIGHT (c) 1986 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. .SBTTL CONDITIONAL ASSEMBLY SUMMARY ;+ ;COND ; ; PR11$X (0) support both reader and punch ; PR11$X 0 support both reader and punch ; PR11$X 1 support only reader ; ; PP$CSR (PC$CSR+4) punch CSR ; PP$VEC (PC$VEC+4) punch vector ; ; MMG$T std conditional ; TIM$IT std conditional (no code effects) ; ERL$G std conditional (no code effects) ;- .SBTTL EDIT HISTORY ; DL02 - FIX NON-STANDARD VECTOR ADDRESS ASSIGNMENT STATEMENT ; ; 03 4-Aug-85 Jim Williams ; add .DRPTR, .DREST .SBTTL MACROS AND DEFINITIONS .MCALL .DRDEF .IIF NDF PR11$X, PR11$X=0 ;UNLESS SPECIFIED, DO NOT GENERATE READER ONLY .IIF NE PR11$X, PR11$X=1 ;FORCE NON-ZERO VALUE TO 1 .DRDEF PC,7,,0,177550,70 .DRPTR .DREST CLASS=DVC.UK PCB == PC$CSR+2 ;DATA REGISTER ; PAPER TAPE PUNCH CONTROL REGISTERS .IIF NDF PP$VEC, PP$VEC == PC$VEC+4 ;PUNCH VECTOR ADDR .IIF NDF PP$CSR, PP$CSR == PC$CSR+4 ;PUNCH CONTROL REGISTER PPB = PP$CSR+2 ;PUNCH DATA BUFFER PRGO = 1 ;READER ENABLE BIT PINT = 101 ;INTERRUPT ENABLE BIT AND GO BIT .SBTTL DRIVER ENTRY .DRBEG PC ;DEFINE ENTRY POINT AND QUEUE HEADS MOV PCCQE,R4 ;POINT TO CURRENT QUEUE ELEMENT ASL Q$WCNT(R4) ;CONVERT WORD COUNT TO BYTE COUNT BCS PP ;IF NEGATIVE, PUNCH (OR ERROR IN NO PUNCH) BEQ PCDONE ;A REQUEST FOR 0 BYTES IS A SEEK, JUST EXIT MOV #PC$CSR,R5 ;READ REQUEST, GET THE CSR TST (R5)+ ;IS READER READY? BPL PCGORD ;YES, START TRANSFER BIS #EOF$,@-(R4) ;NOT READY ON ENTRY, SET EOF BR PCFIN ; AND COMPLETE OPERATION ; START PUNCH OPERATION (IMMEDIATE ERROR IF NO PUNCH SUPPORT) PP: .IF EQ PR11$X BIS #100,@#PP$CSR ;CAUSES INTERRUPT, STARTING TRANSFER RTS PC ; PUNCH-READER VECTOR TABLE .DRVTB PC,PC$VEC,PCINT .DRVTB ,PP$VEC,PPINT ; PUNCH INTERRUPT SERVICE .DRAST PP,4,PCDONE MOV PCCQE,R4 ;POINT TO CURRENT QUEUE ELEMENT MOV #PP$CSR,R5 ;POINT TO PUNCH STATUS REGISTER TST (R5)+ ;ERROR? BMI PPERR ;YES, PUNCH OUT OF PAPER .IF EQ MMG$T ADD #Q$WCNT,R4 ;POINT TO WORD COUNT TST @R4 ;ANY MORE CHARACTERS TO OUTPUT? BEQ PCDONE ;NO, TRANSFER DONE INC @R4 ;DECREMENT BYTE COUNT (IT IS NEGATIVE) MOVB @-(R4),@R5 ;PUNCH CHARACTER INC @R4 ;BUMP POINTER .IFF TST Q$WCNT(R4) ;ANY MORE CHARACTERS TO OUTPUT? BEQ PCDONE ;NO, TRANSFER DONE INC Q$WCNT(R4) ;DECREMENT BYTE COUNT (IT IS NEGATIVE) JSR PC,@$GTBYT ;GET A BYTE FROM USER BUFFER MOVB (SP)+,@R5 ;PUNCH IT .ENDC ;EQ MMG$T RTS PC .ENDC ;EQ PR11$X PPERR: BIS #HDERR$,@-(R4) ;SET HARD ERROR BIT BR PCFIN ;GO TO I/O COMPLETION ; READER INTERRUPT SERVICE .DRAST PC,4,PCDONE MOV PCCQE,R4 ;POINT TO CURRENT QUEUE ELEMENT .IF EQ MMG$T ADD #Q$WCNT,R4 ; AT WORD COUNT .ENDC ;EQ MMG$T MOV #PC$CSR,R5 ;POINT TO READER STATUS REGISTER TST (R5)+ ;ANY ERRORS? BMI PREOF ;YES, ZERO-FILL BUFFER (GIVE EOF NEXT TIME) .IF EQ MMG$T MOVB @R5,@-(R4) ;PUT CHARACTER INTO BUFFER INC (R4)+ ;BUMP BUFFER POINTER DEC @R4 ;DECREASE BYTE COUNT .IFF MOVB @R5,-(SP) ;GET A CHARACTER JSR PC,@$PTBYT ;MOVE IT TO USER'S BUFFER DEC Q$WCNT(R4) ;DECREASE BYTE COUNT .ENDC ;EQ MMG$T BEQ PCDONE ;IF ZERO, WE ARE DONE WITH THIS READ REQUEST PCGORD: BIS #PINT,-(R5) ;ENABLE READER INTERRUPT, GET A CHARACTER RTS PC PREOF: CLR -(R5) ;DISABLE READER INTERRUPTS .FORK PCFBLK ;REQUEST SYSTEM PROCESS 1$: ;CLEAR REMAINDER OF USER BUFFER .IF EQ MMG$T CLRB @-(R4) ;CLEAR A BYTE INC (R4)+ ;BUMP BUFFER ADDRESS DEC @R4 ;COUNT DOWN BYTES REMAINING .IFF CLR -(SP) ;SET NULL BYTE JSR PC,@$PTBYT ;PUT BYTE INTO USER BUFFER DEC Q$WCNT(R4) ;COUNT DOWN BYTES REMAINING .ENDC ;EQ MMG$T BNE 1$ ;LOOP UNTIL DONE PCDONE: CLR @#PC$CSR ;TURN OFF THE READER INTERRUPT .IF EQ PR11$X CLR @#PP$CSR ;TURN OFF THE PUNCH INTERRUPT .ENDC ;EQ PR11$X CLR PCFBLK+2 ;CLEAR FORK BLOCK TO AVOID DISPATCH PCFIN: .DRFIN PC ;GO TO I/O COMPLETION PCFBLK: .WORD 0,0,0,0 ;FORK QUEUE BLOCK .DREND PC .END