.MCALL .MODULE .MODULE CR,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 ; CR$CSR (177160) CSR ; CR$VEC (230) Vector ; ; MMG$T std conditional ; TIM$IT std conditional (no code effects) ; ERL$G std conditional (no code effects) ;- .SBTTL MACROS AND DEFINITIONS .MCALL .DRDEF,.ADDR,.ASSUME .DRDEF CR,14,RONLY$,0,177160,230 .DRPTR .DREST CLASS=DVC.SI CRB1 =: CR$CSR+2 ;DATA BUFFER 1 CRB2 =: CR$CSR+4 ;DATA BUFFER 2 ; ASCII CONSTANTS CR =: 15 ;CARRIAGE RETURN LF =: 12 ;LINE FEED SPACE =: 40 ;SPACE EOF =: 41 ;END OF FILE ; RMON REFERENCES SYSPTR =: 54 ; SYSCOM pointer to RMON CONFG2 =: 370 ; second configuration word PROS$ =: 020000 ; Running on PRO3xx ; CARD READER CONTROL AND STATUS BITS READ =: 1 ;READ EJECT =: 2 ;EJECT CARD INTEB =: 100 ;INTERRUPT ENABLE COLD =: 200 ;COLUMN DONE READY =: 400 ;READY BUSY =: 1000 ;BUSY ONLIN =: 2000 ;ONLINE DATLAT =: 4000 ;DATA LATE MOTIN =: 10000 ;MOTION CHECK(CM11 ONLY) HOPCK =: 20000 ;HOPPER CHECK(CM11 ONLY) CARDN =: 40000 ;CARD DONE ERR =: 100000 ;ERROR .SBTTL INSTALLATION CODE .DRINS CR BR 1$ ; data device installation check .ASSUME . EQ INSSYS BR 2$ ; system device: NEVER! 1$: MOV @#SYSPTR,R0 ; get address of RMON BIT #PROS$,CONFG2(R0) ; is this a PRO3xx? BNE 2$ ; yes, don't install TST (PC)+ ; clear carry, skip setting carry 2$: SEC ; set carry RETURN .Assume . LE 400,MESSAGE=<;Install code too big> .SBTTL SET OPTIONS ; SET CR [NO] CRLF ; APPEND/DO NOT APPEND CARRIAGE RETURN/LINE FEED TO EACH CARD IMAGE .DRSET CRLF,
,CRLF,NO ; SET CR [NO] TRIM ; TRIM/DO NOT TRIM TRAILING BLANKS FROM CARD IMAGES .DRSET TRIM,
,TRIM,NO ; SET CR [NO] HANG ; HANG/RETURN HARD ERROR IF READER NOT READY AT START OF TRANSFER .DRSET HANG,,HANG,NO ; SET CR CODE [=] 026 [029] ; SET TRANSLATION TO 026 [029] MODE .DRSET CODE,026.,CODE,NUM ; SET CR [NO] IMAGE ; TRANSMIT EACH COLUMN AS 12 BITS (ONE WORD/COLUMN) .DRSET IMAGE,,IMAGE,NO .SBTTL CONFIGURATION SUBROUTINES CRLF: MOV (PC)+,R3 ;NOP IF POSITIVE NOP NOCRLF: MOV R3,XCRLF ;ENTRY POINT FOR NO .ASSUME CRLF+4 EQ NOCRLF RETURN TRIM: MOV (PC)+,R3 ;NOP IF POSITIVE NOP NOTRIM: MOV R3,XTRIM ;ENTRY POINT FOR NO .ASSUME TRIM+4 EQ NOTRIM RETURN HANG: MOV (PC)+,R3 ;NOP IF POSITIVE NOP NOHANG: MOV R3,XHANG ;ENTRY POINT FOR NO .ASSUME HANG+4 EQ NOHANG RETURN CODE: .ADDR #SET026,R1 ;R1 -> CONVERSION TABLE FOR 026 SUB R3,R0 ;026 REQUESTED? BMI CODEXT ;NOPE - ERROR (NOTE THAT C IS SET!) BEQ SETCOD ;YES, IT'S 026 - GO DO IT ADD #SET029-SET026,R1 ;R1 -> CONVERSION TABLE FOR 029 CMP #3,R0 ;WAS IT 029? BEQ SETCOD ;YES SEC ;ELSE AN ERROR - INDICATE SUCH CODEXT: RETURN ;AND RETURN TO KMON SETCOD: .ADDR #CHRTBL,R3 ;R3 -> CHARACTER TABLE SCODE: CLR R0 ;PICK UP NEXT OFFSET TO BE MODIFIED BISB (R1)+,R0 ; FROM APPROPRIATE TABLE BEQ CODEXT ;ALL DONE (NOTE: C IS CLEAR) ADD R3,R0 ;POINT TO BYTE TO MODIFY MOVB (R1)+,@R0 ;AND PLUG IN NEW VALUE BR SCODE ;CONTINUE IMAGE: ADD #YAIMAG-NOIMAG,R3 ;POINT TO "YES" TABLE NIMAGE: ADD PC,R3 ;ENTRY FOR "NO" .ASSUME IMAGE+4 EQ NIMAGE IMBASE: MOV (R3)+,XIM1 ;AND PATCH HANDLER MOV (R3)+,XIM2 MOV (R3)+,XIM2+2 MOV (R3)+,XIM3+2 RETURN NOIMAG: BEQ .+NXTCHR-XIM1 MOVB CHRTBL-XIM2(R4),@(PC)+ .WORD 1 YAIMAG: BR .+NXTCHR-XIM1 MOV @#CRB1,@(PC)+ .WORD 2 .SBTTL 026, 029 CONVERSION TABLES ; 026 CONVERSION TABLE ; MODIFIES CHARACTER TABLE TO ACCEPT 026 KEYPUNCH CODES SET026: .BYTE 012,137 ;BACK ARROW (8-2) .BYTE 013,075 ;EQUAL (8-3) .BYTE 015,136 ;UP ARROW (8-5) .BYTE 016,047 ;APOSTROPHE (8-6) .BYTE 017,134 ;BACKSLASH (8-7) .BYTE 052,073 ;SEMICOLON (0-8-2) .BYTE 054,050 ;LEFT PAREN (0-8-4) .BYTE 055,042 ;QUOTES (0-8-5) .BYTE 056,043 ;LB. SIGN (0-8-6) .BYTE 057,045 ;PERCENT (0-8-7) .BYTE 112,072 ;COLON (11-8-2) .BYTE 115,133 ;L BRACKET (11-8-5) .BYTE 116,076 ;GREATER THAN (11-8-6) .BYTE 117,046 ;AMPERSAND (11-8-7) .BYTE 200,053 ;PLUS (12) .BYTE 212,077 ;QUESTION (12-8-2) .BYTE 214,051 ;RIGHT PAREN (12-8-4) .BYTE 215,135 ;R BRACKET (12-8-5) .BYTE 216,074 ;LESS THAN (12-8-6) .WORD 0 ;** END OF TABLE ** ; 029 CONVERSION TABLE ; MODIFIES CHARACTER TABLE TO ACCEPT 029 KEYPUNCH CODES SET029: .BYTE 012,072 ;COLON (8-2) .BYTE 013,043 ;LB. SIGN (8-3) .BYTE 015,047 ;APOSTROPHE (8-5) .BYTE 016,075 ;EQUAL (8-6) .BYTE 017,042 ;QUOTES (8-7) .BYTE 052,134 ;BACKSLASH (0-8-2) .BYTE 054,045 ;PERCENT (0-8-4) .BYTE 055,137 ;BACK ARROW (0-8-5) .BYTE 056,076 ;GREATER THAN (0-8-6) .BYTE 057,077 ;QUESTION (0-8-7) .BYTE 112,135 ;R BRACKET (11-8-2) .BYTE 115,051 ;RIGHT PAREN (11-8-5) .BYTE 116,073 ;SEMICOLON (11-8-6) .BYTE 117,136 ;UP ARROW (11-8-7) .BYTE 200,046 ;AMPERSAND (12) .BYTE 212,133 ;L BRACKET (12-8-2) .BYTE 214,074 ;LESS THAN (12-8-4) .BYTE 215,050 ;LEFT PAREN (12-8-5) .BYTE 216,053 ;PLUS (12-8-6) .WORD 0 ;** END OF TABLE ** MAXOFS =: 216 ; max offset to update .ASSUME CHRTBL+MAXOFS-CRSTRT LE 1000 .Assume . LE 1000,MESSAGE=<;Set code too big> .SBTTL DRIVER ENTRY .DRBEG CR MOV CRCQE,R4 ;POINT TO Q ELEMENT MOV CHRPTR,R5 ;POINT INTO CARD IMAGE ASL Q$WCNT(R4) ;CONVERT WORD COUNT TO BYTE COUNT BLOS LERROR ;NULL REQUEST OR WRITE IS LOGIC ERR TST EOFFLG ;EOF ON PREVIOUS READ? BNE CLREOF ;IF NE, YES, RETURN IMMEDIATE EOF BIT #READY!BUSY,@#CR$CSR ;IS READER READY? XHANG: NOP ;* PATCH HERE TO ISSUE HARD ERROR .ASSUME CRSTRT-. LE 1000 .IF EQ MMG$T ;BC1+ TST (R4)+ ;BLOCK 0 REQUEST ? .IFF TST (R4) ;BLOCK 0 REQUEST ? .IFTF BEQ READR ;YES, GO INITIATE REQUEST .IFT TST (R4)+ ;NO, POINT TO BUFFER PTRS .IFF ;(MMG$T-LEAVE R4 PTING TO Q ELEMENT FOR $PTBYT) .ENDC ;EQ MMG$T ;BC1- BR CONT ;GO SEE IF ANY STUFF IS LEFT IN OLD CARD .SBTTL INTERRUPT ENTRY POINT .DRAST CR,6,ABORTB ;DEFINE AST ENTRY POINTS TABLE DEC COLCNT ;COUNT DOWN INTERRUPTS THIS CARD MOV @#CR$CSR,R4 ;GET STATUS BMI ERROR ;WHOOPS -- ERROR TSTB R4 ;CHECK FOR COLUMN DONE BPL CARD ;BRANCH IF NOT COLUMN DONE MOV @#CRB2,R4 ;GET COMPRESSED CHAR BEQ INCOLT ;IT'S BLANK MOV @#CRB1,-(SP) ;GET EXPANDED CHAR CMP CHRPTR,BUFPTR ;FIRST COLUMN? BNE TSTPUN ;NOPE MOV @SP,CHAR12 ;ELSE SAVE FOR EOF CHECK TSTPUN: BIC #177003,@SP ;CHECK ONLY ROWS 1-7 MOV @SP,-(SP) ;CHECK FOR INVALID PUNCHES NEG @SP ;BY CHECKING FOR 2 OR MORE PUNCHES BIC (SP)+,(SP)+ ;IN COLUMNS 1-7 XIM1: BEQ NXTCHR ;IT'S OKAY .ASSUME CRSTRT-. LE 1000 MOV #377,R4 ;ELSE FORCE TRANSLATION INTO 134 NXTCHR: MOV CHRPTR,(PC)+ ;REMEMBER POSITION OF NON-BLANK ENDPTR: .WORD 0 INCOLT: ADD PC,R4 ;MAKE A PIC POINTER TO TRANS TABLE XIM2: MOVB CHRTBL-.(R4),@(PC)+ ;PUT TRANSLATED CHAR IN LINE CHRPTR: .WORD 0 XIM3: ADD #1,CHRPTR ;PUSH BUFFER POINTER BY 1 OR 2 .ASSUME CRSTRT-. LE 1000 INTRET: BIS #INTEB,@#CR$CSR ;ENABLE ONLINE INTR IF NECESSARY RETURN .SBTTL CARD DONE OR ERROR CARD: BIT #CARDN,R4 ;CARD DONE? BEQ ERR1 ;NOPE -- SPURIOUS INTERRUPT - IGNORE CLR @#CR$CSR ;DISABLE INTERRUPTS .FORK CRFBLK ;REQUEST SYSTEM PROCESS MOV (PC)+,R5 ;R5 -> CHRBUF BUFPTR: .WORD 0 ;POINTER TO CHRBUF MOV CRCQE,R4 ;POINT TO Q ELEMENT .IF EQ MMG$T CMP (R4)+,(R4)+ ;PUSH OVER BUFFER POINTER .ASSUME Q$BLKN+4 EQ Q$BUFF .ENDC ;EQ MMG$T CMP #7417,(PC)+ ;END OF FILE? CHAR12: .WORD 0 ;12-BIT FOR FIRST CARD COL. BEQ ENDFIL ;YES MOV CHRPTR,R1 ;POINT TO PAST END OF 80 CHARS XTRIM: NOP ;* PATCH HERE TO SUPPRESS TRIMMING .ASSUME CRSTRT-. LE 1000 MOV ENDPTR,R1 ;DA, GIVE IT TO HIM INC R1 LXTRIM: XCRLF: NOP ;* PATCH HERE TO SUPPRESS CR/LF .ASSUME .-CRSTRT LE 1000 MOVB #CR,(R1)+ ;JA, GIVE IT HIM MOVB #LF,(R1)+ LXCRLF: MOV R1,ENDPTR ;THIS IS NOW THE END BR CONT ;ENTER FILLING LOOP FILBUF: .IF EQ MMG$T MOVB (R5)+,@(R4)+ ;PUT A BYTE IN HIS BUFFER .ASSUME Q$BUFF+2 EQ Q$WCNT DEC @R4 ;IS HE FULL ? BEQ RETMON ;YEP INC -(R4) ;PUSH BUFFER POINTER .ASSUME Q$WCNT-2 EQ Q$BUFF .IFF MOVB (R5)+,-(SP) ;GET A CHARACTER JSR PC,@$PTBYT ;MOVE TO USER BUFFER DEC Q$WCNT(R4) ;IS USER BUFFER FULL? BEQ RETMON ;YES ,RETURN TO COMPLT .ENDC ;EQ MMG$T CONT: CMP ENDPTR,R5 ;END OF OUR CARD ? BHI FILBUF ;NOT YET ERR1: BIT #READY!BUSY,@#CR$CSR ;OKAY TO INIT READ? BNE INTRET ;NOPE - GO HANG UNTIL READY READR: .ADDR #CHRBUF,R5 ;POINT TO CHRBUF MOV R5,CHRPTR ;START FILLING FROM NEW CARD MOV R5,ENDPTR ;WHICH IS AS YET EMPTY MOV R5,BUFPTR ;ESTABLISH BUFFER POINTER CLR CHAR12 ;CLEAR EOF FLAG MOV #80.,(PC)+ ;SET COLUMN COUNT COLCNT: .WORD 0 ;COUNT OF COLUMNS REMAINING IN CARD MOV #READ+INTEB,@#CR$CSR ;START A CARD GOIN' RETURN ;BYE .ASSUME Q$BLKN-2 EQ Q$CSW CLREOF: BIS #20000,@-2(R4) ;SET EOF IN CHANNEL CLR EOFFLG ;CLEAR EOF FLAG BR RETMON ;RETURN TO MONITOR ; VARIOUS ERRORS LERROR: MOV CRCQE,R4 ;POINT TO QUEUE ELEMENT .ASSUME Q$BLKN-2 EQ Q$CSW BIS #HDERR$,@-(R4) ;YOU CAN'T WRITE ON A READER ABORTB: BR ABORT ERROR: BIT #DATLAT,R4 ;DATA LATE IS ONLY NOT CURABLE BNE LERROR ;ISSUE HARD ERROR IF SO TST COLCNT ;DONE WITH DATA COLUMNS? BPL ERR1 ;NOPE -- MUST BE PICK CHECK, ETC., ; START A NEW READ TO CORRECT CONDITION. BR CARD ;ELSE ASSUME CARD DONE ; END OF FILE CARD FOUND ENDFIL: .IF EQ MMG$T MOV (R4)+,R5 ;POINT INTO HIS BUFFER .ENDC ;EQ MMG$T MOV SP,(PC)+ ;FLAG END OF FILE FOR NEXT READ EOFFLG: .WORD 0 ;EOF FLAG (NON-0 => EOF) CLRBUF: .IF EQ MMG$T CLRB (R5)+ ;CLEAR IT ALL .ASSUME Q$BUFF+2 EQ Q$WCNT DEC @R4 .IFF CLRB -(SP) JSR PC,@$PTBYT DEC Q$WCNT(R4) .ENDC ;EQ MMG$T BNE CLRBUF ABORT: CLR ENDPTR ;FORCE A READ NEXT TIME ; RETURN TO MONITOR (REQUEST DONE, EOF, OR ERROR) RETMON: MOV R5,CHRPTR ;SAVE POSITION IN CARD CLR @#CR$CSR ;NO INTERRUPTS CLR CRFBLK+2 ;CLEAR FORK BLOCK IN CASE WE ARE ABORTING .DRFIN CR ;GO TO I/O COMPLETION .SBTTL CHARACTER TABLE ; THE FOLLOWING MACRO TAKES AS ARGUMENTS THE ASCII TRANSLATION ; DESIRED AND THE LIST OF PUNCH COMBINATIONS FOR THAT CHARACTER. .MACRO C $LIST T=0 .IRP X,<$LIST> .IF NE X'. .IF LE X'.-7 T=T+X'. .IFF U=10 .REPT X'.-8. U=U+U .ENDR T=T+U .ENDC .IFF T=T+40 .ENDC .ENDR .=CHRTBL+T .BYTE $CHAR $CHAR = $CHAR + 1 .ENDM C ; THE FOLLOWING TABLE TRANSLATES 029 KEYPUNCH CODES TO ASCII. .NLIST BEX CHRTBL: .REPT 256. .BYTE 134 ;DEC STANDARD ERROR CHARACTER .ENDR .=CHRTBL $CHAR = 0 ;START AT OCTAL 000 C <12,0,9,8,1> ;NULL C <12,9,1> ;CTRL-A C <12,9,2> ;CTRL-B C <12,9,3> ;CTRL-C C <9,7> ;CTRL-D C <0,9,8,5> ;CTRL-E C <0,9,8,6> ;CTRL-F C <0,9,8,7> ;CTRL-G C <11,9,6> ;CTRL-H C <12,9,5> ;CTRL-I C <0,9,5> ;CTRL-J C <12,9,8,3> ;CTRL-K C <12,9,8,4> ;CTRL-L C <12,9,8,5> ;CTRL-M C <12,9,8,6> ;CTRL-N C <12,9,8,7> ;CTRL-O C <12,11,9,8,1> ;CTRL-P C <11,9,1> ;CTRL-Q C <11,9,2> ;CTRL-R C <11,9,3> ;CTRL-S C <9,8,4> ;CTRL-T C <9,8,5> ;CTRL-U C <9,2> ;CTRL-V C <0,9,6> ;CTRL-W C <11,9,8> ;CTRL-X C <11,9,8,1> ;CTRL-Y C <9,8,7> ;CTRL-Z C <0,9,7> ;ALTMODE (ESCAPE) C <11,9,8,4> ;CTRL-\ C <11,9,8,5> ;CTRL-] C <11,9,8,6> ;CTRL-^ C <11,9,8,7> ;CTRL-_ C <> ;SPACE C <12,8,7> ;! C <8,7> ;" C <8,3> ;# C <11,8,3> ;$ C <0,8,4> ;% C <12> ;& C <8,5> ;' C <12,8,5> ;( C <11,8,5> ;) C <11,8,4> ;* C <12,8,6> ;+ C <0,8,3> ;, C <11> ;- C <12,8,3> ;. C <0,1> ;/ C <0> ;0 C <1> ;1 C <2> ;2 C <3> ;3 C <4> ;4 C <5> ;5 C <6> ;6 C <7> ;7 C <8> ;8 C <9> ;9 C <8,2> ;: C <11,8,6> ;; C <12,8,4> ;< C <8,6> ;= C <0,8,6> ;> C <0,8,7> ;? C <8,4> ;@ C <12,1> ;A C <12,2> ;B C <12,3> ;C C <12,4> ;D C <12,5> ;E C <12,6> ;F C <12,7> ;G C <12,8> ;H C <12,9> ;I C <11,1> ;J C <11,2> ;K C <11,3> ;L C <11,4> ;M C <11,5> ;N C <11,6> ;O C <11,7> ;P C <11,8> ;Q C <11,9> ;R C <0,2> ;S C <0,3> ;T C <0,4> ;U C <0,5> ;V C <0,6> ;W C <0,7> ;X C <0,8> ;Y C <0,9> ;Z C <12,8,2> ;[ C <0,8,2> ;\ C <11,8,2> ;] C <11,8,7> ;^ C <0,8,5> ;_ C <8,1> ;ACCENT GRAVE C <12,0,1> ;LC A C <12,0,2> ;LC B C <12,0,3> ;LC C C <12,0,4> ;LC D C <12,0,5> ;LC E C <12,0,6> ;LC F C <12,0,7> ;LC G C <12,0,8> ;LC H C <12,0,9> ;LC I C <12,11,1> ;LC J C <12,11,2> ;LC K C <12,11,3> ;LC L C <12,11,4> ;LC M C <12,11,5> ;LC N C <12,11,6> ;LC O C <12,11,7> ;LC P C <12,11,8> ;LC Q C <12,11,9> ;LC R C <11,0,2> ;LC S C <11,0,3> ;LC T C <11,0,4> ;LC U C <11,0,5> ;LC V C <11,0,6> ;LC W C <11,0,7> ;LC X C <11,0,8> ;LC Y C <11,0,9> ;LC Z C <12,0> ;OPEN BRACE C <12,11> ;VERTICAL BAR C <11,0> ;CLOSE BAR C <11,0,1> ;TILDE C <12,9,7> ;DEL . = CHRTBL + 256. .LIST BEX CHRBUF: .BLKW 81. CRFBLK: .WORD 0,0,0,0 ;FORK QUEUE BLOCK .DREND CR .END