mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-01 09:21:15 +00:00
620 lines
21 KiB
Plaintext
620 lines
21 KiB
Plaintext
TITLE CDRSER - I/O BUS CARD READER SERVICE - V132
|
||
SUBTTL T. WACHS/TW/CF/WM/JE TS 21 JUNE 88
|
||
|
||
SEARCH F,S,DEVPRM
|
||
$RELOC
|
||
$HIGH
|
||
|
||
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
|
||
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
||
;
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
|
||
; 1973,1974,1975,1976,1977,1978,1979,1980,1982,1984,1986,1988.
|
||
;ALL RIGHTS RESERVED.
|
||
|
||
.CPYRT<1973,1988>
|
||
|
||
XP VCDRSR,132 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP
|
||
|
||
CDRSER::ENTRY CDRSER
|
||
COD029==5252 ;12-0-2-4-6-8
|
||
COD026==4242 ;12-2-4-8
|
||
CODEOF==7400 ;12-11-0-1
|
||
NEWEOF==0017 ;6-7-8-9 PUNCH.
|
||
|
||
;BITS IN LH OF S
|
||
COLUM1==100 ;SET WHEN FIRST COL HAS NOT BEEN READ.
|
||
COLUM2==200 ;SET WHEN SECOND COL HAS NOT BEEN READ.
|
||
CR029==400 ;SET WHEN 029 TRANSLTN TO BE MADE.
|
||
FORGET==1000 ;SET TO AVOID BUFFER ADVANCEMENT.
|
||
IGNRBT==2000 ;SET TO AVOID USER BUFFER OVERFLOW.
|
||
|
||
|
||
CRTRBL==4000
|
||
|
||
|
||
|
||
;BITS IN RH OF S
|
||
SPIMBT==1B29 ;IO STATUS BIT FOR SUPER-IMAGE MODE.
|
||
|
||
;BUFFER SIZES
|
||
ASBFSZ==^D18 ;BUFFER SIZE FOR ASCII MODE.
|
||
BIBFSZ==^D27 ;BUFFER SIZE FOR BINARY MODE.
|
||
IMBFSZ==^D28 ;BUFFER SIZE FOR IMAGE MODE.
|
||
SIBFSZ==^D81 ;BUFFER SIZE FOR SUPER-IMAGE MODE.
|
||
|
||
|
||
;HARDWARE STATUS FLAGS FOR CDR
|
||
ITREN==1B18 ;TROUBLE ENABLED.
|
||
IRDEN==1B19 ;READY-TO-READ ENABLED.
|
||
F27PK==1B20 ;PICK FAILURE FLAG, SET WITH ITRBL.
|
||
F27PC==1B21 ;PHOTO CELL ERROR, SET WITH ITRBL.
|
||
F27CM==1B22 ;CARD MOTION ERROR, SET WITH ITRBL.
|
||
F27ST==1B23 ;STOP FLAG, SET WITH ITRBL OR EXTERNALLY.
|
||
FCIRD==1B24 ;CARD IN READ FLAG.
|
||
F27HS==1B25 ;HOPPER EMPTY/STACKER FULL FLAG, SET WITH ITRBL.
|
||
FRDCD==1B26 ;READING CARD FLAG.
|
||
ITRBL==1B27 ;TROUBLE INTERRUPT.
|
||
IDMSD==1B28 ;DATA MISSED INTERRUPT.
|
||
IRDYR==1B29 ;READY-TO-READ INTERRUPT.
|
||
IEOFL==1B30 ;END OF FILE INTERRUPT.
|
||
IEOCD==1B31 ;END OF CARD INTERRUPT.
|
||
IDRDY==1B32 ;DATA READY INTERRUPT.
|
||
NOTRDY==ITRBL+IDMSD+IEOFL+IEOCD ;SYMBOL FOR TEST IN DDB'S
|
||
SUBTTL AUTOCONFIGURE
|
||
|
||
|
||
;DRIVER CHARARCTERISTICS
|
||
; CR1 = CR1CNF
|
||
; CDR = CARD PUNCH
|
||
; 7 = MAXIMUM DEVICES IN SYSTEM
|
||
; 0 = KONTROLLER TYPE
|
||
; 0 = MAXIMUM DRIVES PER KONTROLLER
|
||
; 0 = HIGHEST DRIVE NUMBER ON KONTROLLER
|
||
; MDSEC0 = SECTION FOR KDB/UDB
|
||
; MDSEC0 = SECTION FOR DDB
|
||
DRVCHR (CR1,CDR,7,0,0,0,MDSEC0,MDSEC0,<DR.GCC!DR.NET>)
|
||
|
||
.ORG DEVLLD
|
||
|
||
CDRCHF:! BLOCK 1 ;PI CHANNEL FLAGS
|
||
CDRRET:! BLOCK 1 ;ADDRESS OF INTERRUPT EXIT
|
||
CDRCSO:! BLOCK 1 ;ADDRESS OF INTERRUPT CODE
|
||
CDRSVE:! BLOCK 1 ;ADDRESS OF ALTERNATE ENTRY TO INTERRUPT CODE
|
||
CDRCSF:! BLOCK 1 ;ADDRESS OF INTERRUPT CODE FOR DATA
|
||
CDRCHK:! BLOCK 1 ;CHECKSUM OF CURRENT INPUT BINARY CARD
|
||
CDRCNT:! BLOCK 1 ;NUMBER OF CARDS READ
|
||
CDRCOL:! BLOCK 1 ;COLUMN COUNT ON CURRENT CARD
|
||
CDRSUP:! BLOCK 1 ;BLKI POINTER TO BUFFER FOR SUPER IMAGE
|
||
CDRMIS:! BLOCK 1 ;-1 IF MISSED DATA ON CURRENT CARD
|
||
CDRSPU:! BLOCK 1 ;COUNT FO SPURIOUS END-OF-CARD FLAGS
|
||
CDRSV2:! BLOCK 1 ;SAVED AC 'U'
|
||
CDRIOB:! ;START OF I/O INSTRUCTIONS
|
||
CDRCNI:! BLOCK 1 ;CONI
|
||
CDRCNO:! BLOCK 1 ;CONO
|
||
CDRCST:! BLOCK 1 ;CONSO
|
||
CDRCSZ:! BLOCK 1 ;CONSZ
|
||
CDRDTI:! BLOCK 1 ;DATAI
|
||
CDRBKI:! BLOCK 1 ;BLKI FOR SUPER IMAGE
|
||
CDRRDY:! BLOCK 1 ;SKIP IF DATA READY
|
||
CDRRTR:! BLOCK 1 ;SKIP IF READY TO READ
|
||
CDRIOE:! ;END OF I/O INSTRUCTIONS
|
||
CR1LEN:! ;LENGTH OF PTP DDB
|
||
|
||
.ORG
|
||
|
||
|
||
$LOW
|
||
CR1DDB: DDBBEG (CDR,CR1LEN)
|
||
SETWRD (DEVCHR,<2*HUNGST,,0>) ;DEVCHR
|
||
SETWRD (DEVSER,<MCSEC0+CDRDSP>) ;DEVSER
|
||
SETWRD (DEVMOD,<DVIN!DVCDR,,14403>) ;DEVMOD
|
||
SETWRD (DEVTYP,<<.TYCDR*.TYEST>!.SPCDR,,0>) ;DEVTYP
|
||
SETWRD (DEVCPU,<CDRCHN##>) ;DEVCPU
|
||
SETWRD (DEVHCW,<1B11>) ;BA10 CONTROLLER
|
||
SETWRD (CDRCHF,<CDRCHN##>) ;PI CHANNEL FLAGS
|
||
SETWRD (CDRCOL,<CRFCHN##-CDRCHN##>) ;OFFSET TO DATA CHANNEL
|
||
SETWRD (CDRCNI,<CONI 000,DEVSTS(F)>) ;CONI
|
||
SETWRD (CDRCNO,<CONO 000,(U)>) ;CONO
|
||
SETWRD (CDRCST,<CONSO 000,(U)>) ;CONSO
|
||
SETWRD (CDRCSZ,<CONSZ 000,(U)>) ;CONSZ
|
||
SETWRD (CDRDTI,<DATAI 000,U>) ;DATAI
|
||
SETWRD (CDRBKI,<BLKI 000,CDRSUP>) ;BLKI FOR SUPER IMAGE
|
||
SETWRD (CDRRDY,<CONSO 000,IDRDY>) ;SKIP IF DATA READY
|
||
SETWRD (CDRRTR,<CONSZ 000,NOTRDY>) ;SKIP IF READY TO READ
|
||
DDBEND
|
||
|
||
$HIGH
|
||
|
||
|
||
;CONSO SKIP CHAIN CODE (AUTCON WILL FILL IN THE BLANKS)
|
||
CR1ICD: PHASE 0
|
||
CONSO 000,0 ;(00) SKIP IF INTERRUPT FOR THIS LPT
|
||
JRST .-1 ;(01) GO TO NEXT SKIP CHAIN ELEMENT
|
||
MOVEM F,CR1SVF ;(02) SAVE AC 'F'
|
||
SKIPA F,.+1 ;(03) SET UP DDB ADDRESS
|
||
CR1DDA:!EXP 0 ;(04) DDB ADDRESS
|
||
XJRST .+1 ;(05) CALL INTERRUPT HANDLER
|
||
CR1INR:!EXP 0 ;(06) INTERRUPT HANDLER ADDRESS
|
||
CR1INE:!EXP 0,0 ;(07,10) XPCW ENTRY
|
||
EXP IC.UOU ;(11) PC FLAG
|
||
EXP .+1 ;(12) WHERE TO JUMP
|
||
MOVE F,CR1SVF ;(13) RESTORE AC 'F'
|
||
JSR PIERR## ;(14) SAVE ACS AND SETUP PDL
|
||
MOVE F,CR1DDA ;(15) RESET DDB ADDRESS
|
||
XJRSTF CR1INE ;(16) GO PROCESS INTERRUPT
|
||
CR1EXT:!MOVE F,CR1SVF ;(17) RESTORE AC 'F'
|
||
XJEN -1 ;(20) DISMISS INTERRUPT
|
||
CF1INX:!CONSO 000,0 ;(21) SKIP IF CDR FLAG
|
||
JRST .-1 ;(22) GO TO NEXT SKIP CHAIN ELEMENT
|
||
CF1SVR:!JSR PIERR## ;(23) SAVE ACS AND SETUP PDL
|
||
MOVE F,CR1DDA ;(24) SET UP DDB ADDRESS
|
||
XJRST .+1 ;(25) CALL INTERRUPT HANDLER
|
||
EXP CF1INT ;(26) INTERRUPT HANDLER ADDRESS
|
||
CR1SVF:!EXP -1 ;(27) SAVED 'F' FOR CR1INT
|
||
DEPHASE
|
||
CR1ICL==.-CR1ICD ;LENGTH OF CONSO SKIP CHAIN CODE
|
||
|
||
EQUATE (LOCAL,0,<CR1CKT,CR1KDB,CR1KLN,CR1UDB,CR1ULN>)
|
||
EQUATE (LOCAL,0,<CR1ULB,CR1ULP>)
|
||
|
||
CR1DSP: DRVDSP (CR1,CDRCHN##,CR1DDB,CR1LEN,URDDIA##)
|
||
|
||
;DEFAULT MONGEN'ED DEVICE TABLE
|
||
DEFMDT: MDKL10 (7,114,0,0,<MD.KON>,) ;DEVICE CODE 114
|
||
MDKL10 (7,150,0,0,<MD.KON>,) ;DEVICE CODE 150
|
||
MDKL10 (7,154,0,0,<MD.KON>,) ;DEVICE CODE 154
|
||
EXP 0
|
||
CR1CFG: XMOVEI T1,CR1MDT## ;MONGEN'ED DEVICE TABLE
|
||
XMOVEI T2,DEFMDT ;DEFAULT TABLE
|
||
MOVNI T3,1 ;NO MASSBUS UNIT OR DRIVE INFORMATION
|
||
MOVEI T4,MD.KON ;MATCH ON KONTROLLER DEFINITION
|
||
PUSHJ P,AUTMDT## ;SCAN THE TABLES
|
||
JRST CPOPJ1## ;NO MATCHES
|
||
PUSH P,T1 ;SAVE MDT DATA
|
||
MOVEI T1,CDRIOB ;WORD CONTAINING AN I/O INSTRUCTION
|
||
PUSHJ P,AUTFND## ;SEE IF THERE'S ALREADY A DDB
|
||
JRST CR1CF1 ;JUST MAKE SURE THE NUMBERS ARE OK
|
||
PUSHJ P,AUTADN## ;ALLOCATE A DEVICE NUMBER
|
||
HRLI T1,'CDR' ;INCLUDE GENERIC DEVICE NAME
|
||
SETZ T2, ;LOCAL DEVICE
|
||
PUSHJ P,AUTDDB## ;CREATE A DDB
|
||
JRST [POP P,T1 ;NO CORE
|
||
PJRST AUTDDN##] ;DEALLOCATE DEVICE NUMBER
|
||
CR1CF1: MOVSI T1,-<CDRIOE-CDRIOB> ;-LENGTH
|
||
XMOVEI T2,CDRIOB(F) ;STARTING ADDRESS
|
||
HRRZ T3,.CPDVC## ;DEVICE CODE
|
||
PUSHJ P,AUTDVC## ;FILL IN DEVICE CODES
|
||
SKIPE CDRCSO(F) ;BEEN HERE BEFORE?
|
||
JRST CR1CF3 ;THEN DON'T MESS WITH THE SKIP CHAIN
|
||
ADDM F,CDRBKI(F) ;RELOCATE BLKI FOR SUPER IMAGE MODE
|
||
MOVE T1,F ;DATA BLOCK ADDRESS
|
||
XMOVEI T2,CR1INT ;INTERRUPT SERVICE
|
||
PUSHJ P,AUTICD## ;GENERATE INTERRUPT ROUTINES
|
||
SKIPA T2,F ;NO CORE
|
||
JRST CR1CF2 ;ONWARD
|
||
MOVEI T1,CR1LEN ;GET DDB LENGTH
|
||
PUSHJ P,AUTKIL## ;DELETE THE DDB
|
||
PUSHJ P,AUTDDN## ;DEALLOCATE DEVICE NUMBER
|
||
JRST TPOPJ## ;PHASE STACK AND RETURN
|
||
CR1CF2: MOVEM T1,CDRCSO(F) ;SAVE ADDRESS
|
||
MOVEI T2,CRFCHN## ;PI CHANNEL FOR DATA
|
||
HRRZ T2,.CPSAV##-1(T2) ;GET ASSOCIATED SAVE ROUTINE
|
||
HRRM T2,CF1SVR(T1) ;FIXUP INTERRUPT CODE
|
||
MOVEI T2,CR1INE(T1) ;INTERRUPT SAVE ROUTINE ADDRESS
|
||
MOVEM T2,CDRSVE(F) ;SAVE
|
||
MOVEI T2,CR1EXT(T1) ;INTERRUPT EXIT ADDRESS
|
||
MOVEM T2,CDRRET(F) ;SAVE
|
||
MOVEI T2,CDRCHN## ;PI CHANNEL
|
||
PUSHJ P,AUTCSO## ;LINK INTO CONSO SKIP CHAIN
|
||
MOVE T1,CDRCSO(F) ;START OF SKIP CHAIN CODE
|
||
ADDI T1,CF1INX ;OFFSET TO DATA CHANNEL INTERRUPT CODE
|
||
MOVEM T1,CDRCSF(F) ;SAVE FOR HACKING FLAGS CHANNEL
|
||
MOVEI T2,CRFCHN## ;PI CHANNEL
|
||
PUSHJ P,AUTCSO## ;LINK INTO CONSO SKIP CHAIN
|
||
CR1CF3: POP P,T1 ;GET MDT DATA BACK
|
||
POPJ P, ;ALL DONE
|
||
;CDR SERVICE DISPATCH TABLE
|
||
JRST CDRONL ;CHECK TO SEE IF CDR IS ON LINE
|
||
JRST ECOD2## ;SPECIAL ERROR STATUS
|
||
JRST GTBFSZ ;GET BUFFER SIZE AS FCTN OF MODE
|
||
JRST CDRINI ;INITIALIZATION
|
||
JRST CDRHNG ;HUNG DEVICE
|
||
CDRDSP: JRST CDRREL ;RELEASE
|
||
JRST ILLOUT## ;CLOSE CALLED ONLY ON ILLEGAL OUTPUT
|
||
JRST ILLOUT## ;OUTPUT IS ILLEGAL
|
||
JRST CDRINP ;INPUT
|
||
;HERE ON INPUT UUO TO START READER.
|
||
CDRINP: TLZN S,CRTRBL ;TROUBLE DETECTED ON INTERRUPT?
|
||
JRST CDSET ;NO
|
||
MOVEM S,DEVIOS(F) ;YES, SAVE S (CRTRBL OFF)
|
||
JRST TKUSER ;AND CALL HNGSTP
|
||
|
||
CDSET: PUSHJ P,CDRONL ;CDR ON LINE?
|
||
JRST TKUSER ;NO, READER MUST BE OFF, TELL USER.
|
||
CDSET1: TLNN S,IOBEG
|
||
JRST CDRGO
|
||
TLZ S,CR029+FORGET+IGNRBT ;YES. SET UP FOR 1ST TIME
|
||
MOVSI T2,PCDRAS## ;SET UP FOR ASCII CARDS
|
||
TRNN S,10 ;REALLY ASCII?
|
||
JRST SETPTR ;YES.
|
||
MOVSI T2,PCDRBI## ;BINARY AND IMAGE BYTE SIZE= 12.
|
||
TRNE S,SPIMBT ;IS THIS SUPER-IMAGE MODE?
|
||
MOVSI T2,PCDRSI## ;SUPER-IMAGE BYTE SIZE = 36.
|
||
SETPTR: MOVEM T2,DEVPTR(F) ;SET BYTE SIZE
|
||
CDRGO: TLZ S,IOBEG ;CLEAR VIRGIN DEVICE BIT.
|
||
PUSHJ P,NEWBUF## ;INITIALIZE NEW BUFFER
|
||
JRST ADRERR## ;ADDRESS ERROR
|
||
CDRGO1: SETZM CDRMIS(F)
|
||
MOVEI U,IEOFL
|
||
XCT CDRCST(F) ;EOF BUTTON PRESSED?
|
||
TLNE S,IOEND ;EOF?
|
||
JRST EOF ;YES-PROCESS IT NOW
|
||
TRNE S,SPIMBT ;IS S SET FOR SUPER-IMAGE MODE?
|
||
PUSHJ P,SETSPI ;YES, SET UP THE BLKI PTR: SUPIMG.
|
||
TLO S,COLUM1+COLUM2 ;NO. INIT FOR COLUMN 1
|
||
MOVEI T1,1670 ;SET UP CONO FOR NEXT CARD
|
||
MOVEI U,ITREN+IRDYR
|
||
XCT CDRCST(F) ;WAS TROUBLE ENCOUNTERED OR CARD READY?
|
||
MOVEI T1,370 ;YES. SET CONO FOR READY-TO-READ
|
||
MOVE U,T1 ;GET BITS FOR CONO INTO U
|
||
ANDI T1,500 ;GET INTERRUPT ENABLE BITS
|
||
ADDI T1,270 ;GET OTHER INTERRUPT BITS
|
||
PUSHJ P,SETDLV ;SET UP DATA LEVEL INTERRUPT
|
||
TRO S,IOACT ;CANT USE SETACT AS IT ZEROES IOW
|
||
JRST STOIOS## ;WHICH MAY BE ON AFTER IGNORING A CARD
|
||
TKUSER: HRRZ T2,DEVBUF(F) ;ADR OF BUFFER HDR
|
||
EXCTUX <HRRZ T1,@T2> ;CURRENT USER BUFFER
|
||
PUSHJ P,UADRCK##
|
||
EXCTUX <SKIPGE @T1> ;DOES IT CONTAIN DATA?
|
||
PJRST RTEVM## ;YES, GIVE IT TO THE USER
|
||
MOVSI T1,DVOFLN ;OFF-LINE BIT
|
||
IORM T1,DEVCHR(F) ;LITE IT
|
||
PUSHJ P,HNGSTP## ;PROBLEM. OPR CAN CORRECT AND CONT.
|
||
JRST CDSET1 ;TRY IT AGAIN.
|
||
|
||
;SUBROUTINE TO SEE IF THE CDR IS ON LINE
|
||
; RETURN CPOPJ1 IF IT IS
|
||
|
||
CDRONL: MOVEI U,F27ST+F27HS ;STOP CONDITION TO BE CONTINUED BY THE OPR?
|
||
XCT CDRCSZ(F) ;CONSZ FROM DDB
|
||
POPJ P, ;YES, TELL THE OPR
|
||
MOVEI U,IRDYR+IEOFL ;IF WE ARE HERE, READER CAN BE ON OR OFF
|
||
XCT CDRCST(F) ;BUT IF ON, THIS BETTER SKIP
|
||
POPJ P, ;OFF
|
||
JRST CPOPJ1## ;ON
|
||
|
||
;HERE TO GET BUFFER SIZE, CALLED DURING INIT UUO.
|
||
GTBFSZ: MOVEI T1,ASBFSZ ;ASSUME ASCII.
|
||
TRNN M,10 ;C(UUO) IS USER'S INIT ARG.
|
||
JRST GPBFS1 ;ASCII.
|
||
MOVEI T1,BIBFSZ ;NOT ASCII. ASSUME BINARY.
|
||
TRNE M,4 ;BINARY?
|
||
JRST GPBFS1 ;YES.
|
||
MOVEI T1,IMBFSZ ;MUST BE IMAGE MODE.
|
||
TRNE M,1B29 ;SUPER-IMAGE?
|
||
MOVEI T1,SIBFSZ ;YES, 80 WORDS OF DATA/BUFFER.
|
||
POPJ P, ;RETURN WITH BUFFER SIZE IN TAC.
|
||
GPBFS1: TRZ M,1B29 ;SUPER-IMAGE ALLOWED ONLY
|
||
POPJ P, ;IF INITIALIZED FOR IMAGE MODE.
|
||
|
||
;HERE TO INITIALIZE BLKI PTR USED FOR SUPER-IMAGE MODE.
|
||
SETSPI: MOVN T1,DEVCTR(F) ;NEG NUMBER OF BYTES.
|
||
HRLZ T1,T1 ;MAKE IT THE NEG CNTR IN BLKI PTR.
|
||
HRRI T1,@DEVPTR(F) ;PICK UP ADDRESS TO FIRST SRD OF BUFFER.
|
||
MOVEM T1,CDRSUP(F) ;SET PTR.
|
||
POPJ P, ;AND PRETURN READY TO PROCESS A CARD.
|
||
|
||
;SUBROUTINE TO DISABLE INTERRUPTS ON FLAG LEVEL AND ENABLE INTERRUPTS
|
||
;ON DATA LEVEL. CALLED WITH CONO BITS IN AC(U) AND CONSO BITS
|
||
;IN AC(T1)
|
||
|
||
SETDLV: HLLZS @CDRCSF(F) ;DISABLE FLAG LEVEL PI
|
||
ADD U,CDRCHF(F) ;PIA
|
||
CONO PI,PI.OFF ;DISABLE PI'S WHILE CHANGING LEVELS
|
||
HRRM T1,@CDRCSO(F) ;AND SET UP INTERRUPT LOCATION
|
||
XCT CDRCNO(F) ;START CARD READER
|
||
CONO PI,PI.ON ;TURN PI SYSTEM BACK ON
|
||
POPJ P, ;AND RETURN
|
||
|
||
;THIS IS THE ENTRY POINT FOR THE INTERRUPT LEVEL SERVICE FOR THE CDR
|
||
|
||
CR1INT: SKIPN CDRMIS(F) ;DONT CHANGE STATUS IF ERROR
|
||
XCT CDRCNI(F) ;STORE STATUS.
|
||
|
||
XCT CDRRDY(F) ;SKIP IF DATA READY FLAG
|
||
JRST NOTDAT ;NOT DATA READY, FIND OUT WHAT
|
||
AOS CDRCOL(F) ;COUNT FOR DETECTION OF SPURIOS EOC INTERRUPTS.
|
||
SKIPN CDRSUP(F) ;SUPER-IMAGE MODE?
|
||
JRST NORMOD ;NO, PROCESS NORMALLY.
|
||
XCT CDRBKI(F) ;YES, XMIT TO USER'S BUFFER.
|
||
JRST .+2 ;NON-SKIP IF DEVCTR COLUMNS PROCESSED.
|
||
XJRST CDRRET(F) ;ROOM FOR MORE COLUMNS, DISMISS INTERRUPT.
|
||
|
||
;HERE WHEN 80 CHARS HAVE BEEN XMTD TO USER.
|
||
MOVEM U,CDRSV2(F) ;SAVE AC(U)
|
||
HRRZ U,CDRSUP(F) ;PICK UP LAST PTR ADR
|
||
HRRM U,DEVPTR(F) ; AND STORE IT FOR WRD CNT CALC.
|
||
SETZM CDRSUP(F) ;TURN OFF SUPER-IMAGE TEMPORARILY.
|
||
MOVSI U,IGNRBT ;IGNORE THE REST OF THE WORD
|
||
IORM U,DEVIOS(F) ;SAVE IOS
|
||
JRST CDRXIT ;RESTORE U AND EXIT
|
||
|
||
;HERE TO PROCESS NON SUPER-IMAGE MODE INPUT.
|
||
|
||
NORMOD: MOVEM U,CDRSV2(F) ;SAVE AC U
|
||
MOVE U,DEVIOS(F) ;GET STATUS WORD
|
||
TLNE U,FORGET+IGNRBT ;PROCESS IT?
|
||
JRST IGNORE ;NO, READ AND DISMISS
|
||
TRNN U,7 ;SKIP IF NOT ASCII OR IMAGE
|
||
TRNN U,10 ;SKIP IF IMAGE MODE
|
||
JRST NOTIMG ;ASCII OR BINARY
|
||
XCT CDRDTI(F) ;READ DATA INTO U
|
||
IDPB U,DEVPTR(F) ;PUT INTO USER'S BUFFER
|
||
MOVSI U,IGNRBT ;BIT TO IGNORE REST OF CARD
|
||
SOSG DEVCTR(F) ;ROOM FOR MORE?
|
||
IORM U,DEVIOS(F) ;NO, SET IGNORE BIT
|
||
JRST CDRXIT ;RESTORE IT AND EXIT
|
||
|
||
;HERE TO READ AND THROW AWAY THE COLUMN
|
||
IGNORE: XCT CDRDTI(F) ;READ THE COLUMN
|
||
CDRXIT: MOVE U,CDRSV2(F) ;RESTORE U
|
||
XJRST CDRRET(F) ;AND EXIT
|
||
|
||
;HERE IF DATA IS IN ASCII MODE, READ AND CONVERT
|
||
NOTIMG: XCT CDRDTI(F) ;READ THE COLUMN INTO U
|
||
EXCH U,CDRSV2(F) ;SAVE DATA, RESTORE U
|
||
XPCW @CDRSVE(F) ;SAVE INTERRUPT ACS
|
||
HRRZ U,CDRSV2(F) ;GET BACK DATA
|
||
MOVE S,DEVIOS(F) ;GET STATUS WORD TO S
|
||
TLZE S,COLUM1 ;FIRST COLUMN?
|
||
JRST FSTCOL ;YES, MAKE SPECIAL CHECKS
|
||
CDRDIS: TRNN S,10 ;ASCII?
|
||
JRST CDRASC ;YES, CONVERT IT
|
||
JRST DISRET ;NO, STORE BINARY DATA IN USER'S BUFFER
|
||
;HERE ON INTERRUPTS OTHER THAN DATA READY
|
||
|
||
NOTDAT: XCT CDRRTR(F) ;SKIP IF READY TO READ INTERRUPT
|
||
JRST CRFLAG ;GO PROCESS NON-DATA INTERRUPT.
|
||
MOVEM U,CDRSV2(F) ;READY TO READ, SAVE U
|
||
MOVEI U,670 ;GET INTERRUPT MASK
|
||
HRRM U,@CDRCSO(F) ;AND SET UP INTERRUPT LOCATION
|
||
MOVEI U,1670 ;GET CONO BITS
|
||
ADD U,CDRCHF(F) ;PIA
|
||
XCT CDRCNO(F) ;START CARD MOVING.
|
||
JRST CDRXIT ;RESTORE U AND EXIT
|
||
;HERE WHEN AN ASCII CHARACTER IS READ
|
||
CDRASC: SETZB T1,T2
|
||
JUMPE U,CDRAS2 ;0-PICK UP AN ASCII BLANK
|
||
CAIN U,5000
|
||
MOVEI U,4202
|
||
CAIN U,3000
|
||
MOVEI U,2202
|
||
LDB T2,[XWD 110300,U]
|
||
TRNE U,3
|
||
TRC T2,7
|
||
TRNE U,74
|
||
TRO T2,10
|
||
TRNE U,314
|
||
TRO T1,2
|
||
TRNE U,525
|
||
TRO T1,1
|
||
TLNE S,CR029 ;AN 029 CARD READ?
|
||
TRO T2,20 ;NO. BUMP T2 TO 026 TABLE
|
||
CDRAS2: LDB U,CRCVPT##(T1) ;PICK UP ASCII CHAR FROM TABLE
|
||
DISRET: IDPB U,DEVPTR(F) ;STORE CHAR IN USERS BUFFER
|
||
SOSLE DEVCTR(F) ;ROOM FOR MORE?
|
||
POPJ P, ;YES, EXIT
|
||
TLO S,IGNRBT ;IGNORE REST OF CARD
|
||
STODIS: MOVEM S,DEVIOS(F) ;SAVE STATUS
|
||
POPJ P, ;AND EXIT
|
||
|
||
CRFLAG: MOVEM U,CDRSV2(F) ;SAVE AC
|
||
HLLZS @CDRCSO(F) ;DISABLE DATA LEVEL INTERRUPT
|
||
MOVEI U,660 ;SET UP FLAG LEVEL INTERRUPT
|
||
HRRM U,@CDRCSF(F) ;TO CATCH CHANGE OF PI LEVELS
|
||
MOVEI U,CRFCHN##+ITRBL+IRDYR ;GET FLAG LEVEL PI
|
||
XCT CDRCNO(F) ;CHANGE INTERRUPT LEVELS
|
||
JRST CDRXIT ;RESTORE U
|
||
;AND DISMISS
|
||
;HERE WHEN THE 1ST COLUMN OF A CARD HAS BEEN READ.
|
||
FSTCOL: TLNN S,COLUM2 ;REALLY FIRST COL?
|
||
JRST NOTFST ;NO, IT'S THE 2ND COL.
|
||
CAIE U,CODEOF+NEWEOF ;YES, IS IT AN EOF?
|
||
CAIN U,CODEOF ;MAYBE, CHECK ANOTHER STYLE OF EOF.
|
||
JRST EOFCRD ;YES, GO PROCESS.
|
||
CAIN U,NEWEOF ;MAYBE, SEE IF ITS THE NEW EOF.
|
||
JRST EOFCRD ;YES, PROCESS.
|
||
NOTFST: TRNE S,10 ;ASCII CARD?
|
||
JRST NOTASC ;NO
|
||
CAIN U,COD026 ;YES. IS IT AN 026 CARD?
|
||
JRST SET026 ;YES. HANDLE IT
|
||
CAIE U,COD029
|
||
JRST SETIOS
|
||
TLZ S,CR029
|
||
TLO S,FORGET
|
||
SETIOS: MOVEM S,DEVIOS(F) ;SAVE S
|
||
TLNN S,FORGET ;FORGET REST OF CARD?
|
||
JRST CDRDIS ;NO. PROCESS IT
|
||
POPJ P, ;YES. DISMISS INTERRUPT
|
||
SETFRG: TLOA S,FORGET ;SET BIT TO FORGET ABOUT CARD
|
||
NOTASC: TRNN S,4 ;COL 1 OF A NOT ASCII CARD
|
||
JRST SETIOS ;IMAGE MODE - NO PROCESSING
|
||
TLZN S,COLUM2 ;COLUMN1?
|
||
JRST COL2IN ;NO. COLUMN2 JUST READ
|
||
MOVEI T1,-5(U) ;COL1 - IS THERE A 7-9 PUNCH?
|
||
TRNE T1,17
|
||
TRO S,IOIMPM ;NO. SET ERROR BIT
|
||
LSH U,-6 ;COLUMNS 12-3 ARE WORD COUNT
|
||
JUMPE U,SETFRG ;FORGET CARD IF WRDCNT=0
|
||
PUSH P,U ;SAVE U
|
||
IMULI U,3 ;COMPUTE ITEM COUNT
|
||
CAMGE U,DEVCTR(F) ;MORE THAN THE BUFFER CAN HOLD?
|
||
MOVEM U,DEVCTR(F) ;NO. SAVE AS REAL COUNT
|
||
POP P,U ;GET WRDCNT
|
||
HRRM U,@DEVPTR(F) ;IN R.H. OF 1ST DATA WORD OF BUFFER
|
||
TLO S,COLUM1 ;SET TO PICK UP COLUMN2
|
||
JRST STODIS ;STORE S AND RETURN
|
||
|
||
;HERE WHEN COL 2 OF A BINARY CARD WAS READ
|
||
COL2IN: MOVSM U,CDRCHK(F) ;COLUMN2 IS CHECKSUM
|
||
HRLM U,@DEVPTR(F) ;ALSO IN L.H. OF 1ST DATA WORD
|
||
JRST STODIS ;STORE S AND RETURN
|
||
;HERE ON A NON-DATA CDR INTERRUPT
|
||
|
||
CF1INT: MOVE S,DEVIOS(F) ;AND GET STATUS INTO S
|
||
MOVEI U,IEOCD
|
||
XCT CDRCST(F) ;END OF CARD?
|
||
JRST NOTEOC ;NO
|
||
MOVE U,CDRCOL(F) ;YES, EOC INTERRUPT.
|
||
SKIPE CDRMIS(F)
|
||
JRST DONCNT
|
||
CAIGE U,^D79
|
||
JRST SPUEOC ;NO, ASSUME SPURIOUS INTERRUPT.
|
||
DONCNT: SETOM CDRCOL(F) ;YES, RE-INIT COL CNT.
|
||
AOS CDRCNT(F)
|
||
TLZE S,FORGET ;FORGET ABOUT CARD?
|
||
JRST CDRGO1 ;YES, START TO READ NEXT CARD.
|
||
SKIPN CDRSUP(F) ;IF CDRSUP NON-ZERO, DEVPTR MUST BE SET.
|
||
JRST NTSUPI ;DEVPTR ALREADY SET OR NOT IN SUPER-IMAGE MODE.
|
||
HRRZ U,CDRSUP(F) ;PICK UP LWA OF XFR.
|
||
MOVEM U,DEVPTR(F) ;SET IN PTR FOR WORD CNT CALC.
|
||
SETZM CDRSUP(F) ;FLAG THAT ITS DONE.
|
||
NTSUPI: TRNE S,10 ;BINARY?
|
||
JRST BINEOC ;YES. CHECK CHKSUM
|
||
MOVEI U,15 ;NO. INSERT <CR>
|
||
IDPB U,DEVPTR(F)
|
||
MOVEI U,12 ;INSERT <LF>
|
||
IDPB U,DEVPTR(F)
|
||
NXTCRD: TLZ S,IGNRBT ;SET UP TO READ NEXT CARD
|
||
MOVEI T1,@DEVPTR(F) ;LAST ADDRESS
|
||
MOVEI T2,@DEVIAD(F) ;FIRST ADDRESS (-1)
|
||
SUBI T1,1(T2) ;COMPUTE NUMBER OF WORDS STORED
|
||
HRRM T1,1(T2) ;STORE IN 1ST WORD OF BUFFER
|
||
;IN IO WAIT?
|
||
PUSHJ P,SETIOD## ;YES. TAKE OUT
|
||
PUSHJ P,ADVBFF## ;ADVANCE BUFFERS
|
||
JRST CDROFF ;NEXT BUFFER NOT EMPTY
|
||
MOVEI U,F27PC+F27CM+IDMSD
|
||
XCT CDRCSZ(F)
|
||
TRO S,IODERR
|
||
MOVEI U,F27ST+F27HS
|
||
XCT CDRCST(F) ;SKIP IF STOP CONDITION
|
||
TRNE S,IODERR+IOIMPM+IODTER ;BUFFER AVAILABLE, ANY ERRORS?
|
||
JRST CDROFF ;YES, TURN OFF CDR.
|
||
JRST CDRGO ;NO, PROCEES READING CARDS.
|
||
|
||
;HERE TO PROCESS SPURIOUS EOC INTERRUPTS.
|
||
|
||
SPUEOC: AOS CDRSPU(F)
|
||
MOVEI T1,IEOCD ;SET TO CLEAR EOC
|
||
MOVEI U,ITREN
|
||
XCT CDRCSZ(F) ;TROUBLE ENABLED?
|
||
TRO T1,ITRBL ;YES
|
||
MOVEI U,IRDEN
|
||
XCT CDRCSZ(F) ;RDY TO READ ENABLED?
|
||
TRO T1,IRDYR ;YES
|
||
MOVE U,T1
|
||
ANDI T1,500
|
||
ADDI T1,270
|
||
PUSHJ P,SETDLV ;GO BACK TO DATA LEVEL
|
||
SKIPGE CDRCOL(F) ;ARE WE ACTIVELY PROCESSING A CARD?
|
||
POPJ P, ;NO, DISMISS SINCE THIS SHOULDN'T HARM.
|
||
MOVEI U,^D79 ;YES, FLAG IT AND LET ANY FURTHER
|
||
MOVEM U,CDRCOL(F) ; SPURIOUS INTERRUPTS FOR THIS CARD PASS THRU.
|
||
JRST SETERR ;FLAG IT AND DISMISS.
|
||
|
||
;HERE ON THE END OF A BINARY CARD
|
||
|
||
BINEOC: TRNN S,4 ;REALLY BINARY?
|
||
JRST NXTCRD ;IMAGE MODE
|
||
MOVEI T2,@DEVIAD(F) ;ADDRESS OF BUFFER
|
||
PUSHJ P,CKS12## ;COMPUTE CHECKSUM
|
||
CAME T1,CDRCHK(F) ;DOES IT COMPARE WITH CARD'S CHKSUM?
|
||
TRO S,IODTER ;NO. LIGHT A BIT
|
||
JRST NXTCRD ;START READ OF NEXT CARD
|
||
SET026: TLOA S,CR029 ;026 - RESET 029 BIT
|
||
EOFCRD: TLO S,IOEND ;EOF - LIGHT BIT
|
||
JRST SETFRG ;FORGET REST OF CARD
|
||
NOTEOC: MOVEI U,IEOFL
|
||
XCT CDRCSZ(F) ;EOF BUTTON PRESSED?
|
||
JRST EOF ;YES.
|
||
MOVEI U,ITRBL
|
||
XCT CDRCST(F) ;TROUBLE?
|
||
JRST NOTRBL ;NO, PROCEED
|
||
MOVEI U,0
|
||
MOVEI T1,270
|
||
PUSHJ P,SETDLV ;GO BACK TO DATA LEVEL
|
||
NOTRBL: MOVEI U,F27PC+F27CM+IDMSD
|
||
XCT CDRCST(F) ;ERROR EXCEPT PICK OR STOP BUTTON?
|
||
JRST SETRDY ;NO. GO SET READY-TO-READ INTERRUPT
|
||
SETERR: TRO S,IODERR ;YES. SET ERROR BIT
|
||
MOVEI T1,670
|
||
MOVEI U,IDMSD
|
||
PUSHJ P,SETDLV ;GO BACK TO DATA LEVEL
|
||
SETOM CDRMIS(F)
|
||
PJRST STOIOS##
|
||
STOERR: PUSHJ P,CDROFF ;DISABLE INTERRUPTS SINCE IOACT CLEARED BY DEVERR
|
||
|
||
TLO S,CRTRBL ;SET TROUBLE BIT IF CDR TROUBLE INTERCEPT
|
||
|
||
MOVEM S,DEVIOS(F) ;STORE STATUS
|
||
PJRST DEVERR## ;AND REPORT ERROR
|
||
|
||
EOF: TLO S,IOEND+IOBEG ;EOF - LIGHT BIT
|
||
CDRREL: MOVEI T1,0 ;
|
||
DPB T1,PBUFSZ## ;ZERO OUT BUFFER SIZE.
|
||
SETOM CDRCOL(F) ;INITIALIZE COLUMN COUNT.
|
||
SETZM CDRSUP(F) ;TURN OFF SUPERIMAGE MODE.
|
||
|
||
TLZ S,CRTRBL ;CLEAR TROUBLE BIT
|
||
|
||
CDROFF: MOVEI U,10000 ;CONTROLLER RESET BIT
|
||
XCT CDRCNO(F)
|
||
HLLZS @CDRCSO(F) ;RESET INTERUPT LOC
|
||
HLLZS @CDRCSF(F) ;ALSO FLAG LEVEL
|
||
PUSHJ P,SETIOD## ;TAKE OUT OF IO WAIT
|
||
PUSHJ P,RTEVM## ;RETRUN ANY EVM
|
||
|
||
JRST CLRACT## ;ZERO IOACT, STORE S AND RETURN
|
||
|
||
SETRDY: MOVEI U,F27HS
|
||
XCT CDRCSZ(F)
|
||
JRST TSTINR
|
||
MOVEI U,10000 ;CONTROLLER RESET BIT
|
||
XCT CDRCNO(F) ;RESET READ-A-CARD FLOP
|
||
JRST CDRGO ;ENABLE FOR READY TO READ
|
||
|
||
;HERE ON HOPPER/STACKER ERROR
|
||
TSTINR: MOVEI U,FCIRD
|
||
XCT CDRCSZ(F) ;CARD IN READER?
|
||
POPJ P, ;YES, IGNORE INTERRUPT (TRBL NOT ENEBLED)
|
||
PJRST STOERR ;NO, GO INTERCEPT THE ERROR
|
||
|
||
|
||
CR1INI:!
|
||
CDRINI: MOVEI T1,CDRCNT ;OFFSET TO CARDS READ
|
||
MOVEM T1,CDROCR## ;SAVE FOR GETTABS
|
||
MOVEI U,10000 ;CONTROLLER RESET BIT
|
||
XCT CDRCNO(F)
|
||
HLLZS @CDRCSO(F) ;CLEAR SKIP CHAIN MASK FLAGS
|
||
HLLZS @CDRCSF(F) ; FOR BOTH DATA AND FLAGS
|
||
IFN FTMP,<
|
||
MOVE T1,CDRCOL(F) ;INTERLOCK POINTS AT INTERRUPT CHAIN
|
||
ADDM T1,DEVCPU(F) ;POINT IT AT FLAGS CHAIN
|
||
>
|
||
SETOM CDRCOL(F) ;INITIALIZE COLUMN COUNT
|
||
SETZM CDRSUP(F) ;TURN OFF SUPERIMAGE MODE
|
||
|
||
JRST CPOPJ1## ;SKIP RETURN TO FORCE CALL FOR EACH CDR
|
||
|
||
;HERE ON HUNG DEVICE TIME OUT IF TROUBLE INTERCEPT ENABLED
|
||
CDRHNG: MOVEI U,F27PC+F27CM+FCIRD ;IF PHOTO CELL DARK, CARD MOTION
|
||
XCT CDRCSZ(F) ; ERROR, OR CARD IN READER AFTER TIME OUT
|
||
TRO S,IODERR ;LIGHT AN ERROR BIT
|
||
PUSHJ P,CDRREL ;RELEASE AND TURN OFF CDR
|
||
AOS (P) ;SKIP RETURN SO NO HUNG MESSAGE
|
||
PJRST STOERR ;AND RETURN
|
||
|
||
END
|