.MCALL .MODULE .MODULE PC,VERSION=07,COMMENT=,AUDIT=YES ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only 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 except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. .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 ; ; 07 7-Jun-88 John R. Gregg ; Change Device Class from unknown to either Serial Input ; or Serial Bi-directional (conditionalized) .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,DMA=NO .DRPTR .IF NE PR11$X .DREST CLASS=DVC.SI ;Reader Only is Device Class Serial Input .IFF ;NE PR11$X .DREST CLASS=DVC.SB ;Rdr/Punch is Device Class Serial Bidirectional .ENDC ;NE PR11$X 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