IFN HED ** D.37A: BCS BUS I/O DRIVER ** NAM D.37A 59310-60020 REV.C, 760227 XIF IFZ HED ** D.37B: BCS BUS I/O DRIVER ** NAM D.37B 59310-60021 REV.C, 760227 XIF ENT D.37,I.37 EXT .BUFR IFZ EXT DMAC1,DMAC2,IOERR XIF SKP ******************************************* * * *** I N I T I A T O R S E C T I O N *** * * ******************************************* * ENTER WITH * * A = ADDR OF WD1 OF EQT ENTRY * B = ADDR OF WD2 OF I/O REQUEST * * EXIT VIA D.37,I WITH * A = 0 REQUEST INITIATED * A = 1 REQUEST REJECTED REASON IN B * B15 = 1 THE DRIVER IS BUSY OR * THE DEVICE IS BUSY * B0 = 1 DMA CHANEL(S) BUSY * B15-B0=0 ILLEGAL * * EXIT TO IOERR IF DMA REQUEST AND NOT AVAIALBLE IN SYSTEM * A=3 DMA REQUESTED NOT IN SYSTEM * B15-B0 ADDRESS OF WD1 OF USER CALL * D.37 NOP ENTRY FROM IOC STA EQTAD SAVE ADDR OF EQT WD1 STB REQAD SAVE ADDR OF REQUEST WD2 * * GET FROM USER CALL * LDA REQAD,I GET WD2 OF USER REQUEST AND =B177700 ISOLATE * * TEST FOR CLEAR REQUEST * SZA,RSS TEST FOR CLEAR REQUEST JMP CLEAR YES: GO PROCESS CLEAR REQUEST * * TEST IF DRIVER CONTINUATOR SECTION IS BUSY * LDB DVRBF GET DRIVER BUSY FLAG SSB TEST IF BUSY JMP REJRQ YES: GO TO REJECT EXIT,B=100000 * NO:CONTINUE * * ISOLATE * GFC ALF PUT FUNCTION BITS INTO BITS 0-3 AND =B17 ISOLATE STA FCODE SAVE IT * * TEST FOR LEGAL * * NOTE:ALL 1,2 &3 ARE LEGAL * FOR THIS DRIVER * * * GET FROM EQT AND TEST IF NEW CH # * LDA EQTAD,I GET WD 1 FROM EQT AND =B77 ISOLATE SC BITS CPA OLDSC IS CURRENT SC = TO OLD SC JMP X.1 YES: BYPASS CONFIGURATION SECTION * NO: RECONFIGURE ALL I/O INSTUCTIONS * * CONFIGURE I/O INSTRUCTIONS * STA OLDSC UPDATE OLD SC TO NEW VALUE IOR STFI STA STF1 STA STF2 STA STF3 ADA =B000100 CONVERT STF TO SFC STA SFC1 XOR =B000700 CONVERT SFC TO LIA STA LIA1 STA LIA3 UNL IFZ LST STA LIA4 STA LIA5 XIF LST ADA =B000100 CONVERT LIA TO OTA STA OTA1 ADA =B000100 CONVERT OTA TO STC STA STC1 STA STC2 UNL IFZ LST STA STC3 XIF LST XOR =B001200 CONVERT STC TO LIA ,C STA LIAC1 STA LIA2 ADA =B000100 CONVERT LIA ,C TO OTA ,C STA OTAC1 STA OTAC2 XOR =B005300 CONVERT OTA ,C TO LIB STA LIB1 IOR =B000700 CONVERT LIB TO CLC STA CLC1 IOR =B001200 CONVERT CLC TO CLC ,C STA CLCC2 STA CLCC4 UNL IFZ LST STA CLCC5 XIF LST SKP * *** GET PARAMETERS USED IN COMMON BY READ,WRITE & CONTROL SECTIONS *** * * * GET CODE * X.1 LDA EQTAD,I GET EQT WD 1 ALF,ALF PUT BITS RAL,RAL INTO BIST 0-4 AND =B37 ISOLATE CODE STA SUBUN SAVE IT * * GET * LDA REQAD,I GET WD2 OF USER REQUEST ALF,ALF PUT BITS RAL,RAL INTO BITS 0-5 AND =B67 ISOLATE STA SUBFU SAVE IT * * SET UP POINTERS TO EQT WD2 AND WD3 * LDA EQTAD GET ADDR OF EQT WD1 INA SET TO WD2 STA EQTW2 SAVE IT INA SET TO WD3 STA EQTW3 SAVE IT * * BRANCH TO CONTROL OR READ/WRITE SECTION * * LDA FCODE CPA =B3 IS IT A CONTROL REQUEST JMP CTLRQ YES: * NO: CONTINUE TO R/W REQUEST SKP * *** GET REMAINING PARAMETERS FOR A READ/WRITE REQUEST *** * * * GET AND RESOLVE * ISZ REQAD SET REQAD TO WD3 ISZ REQAD SET REQAD TO WD4 LDA REQAD PUT ADDR OF WF4 INTO A LDA A,I GET FROM USER REQUEST RAL,CLE,SLA,ERA TEST AND CLEAR INDIRECT JMP *-2 INDIRECT: REPEAT,GET NEXT LEVEL STA UBUFA DIRECT: SAVE * * GET FROM USER REQUEST AND CONVERT TO + BYTES * ISZ REQAD SET REQ. ADDR TO WD5 LDA REQAD,I GET STA UBUFL SAVE IT SSA TEST IF WORDS OR BYTES JMP *+3 -:BYTES,CONVERT TO +BYTES * +:WDS,CONVERT TO BYTES ALS CONVERT WDS TO BYTES RSS CMA,INA CONV -BYTES TO +BYTES STA ULFLG SAVE +BYTES FOR XMISSION LOG COMP * * SET-UP READ/WRITE FLAG * LDA FCODE GET ERA PUT BIT0 INTO E CLA SET A=0 ERA PUT E INTO A15 STA RWFLG SAVE RESULT UNL IFZ LST * *** CLAIM A DMA CHANNEL IF DMA REQUESTED *** * LDA EQTAD,I GET WD1 OF EQUIP.TBL. SSA,RSS TEST IF DMA IS TO BE USED JMP SETBY 0:DMA NOT REQUIRED,GOTO BUSY EXIT * 1:USE DMA,CONTINUE * * CHECK CH1 FOR AVAILABILITY AND BUSY * LDB DMAC1 GET DMA CH1 FLAG CCE,SZB,RSS SET E=1,TEST IF SYSTEM HAS DMA? JMP NODMA NO:GO TO ABORT EXIT * YES:CHECK IF CH1 IS BUSY SSB TEST IF CH1 BUSY JMP CKCH2 1:YES,TRY CH 2 * 0:NO,CONTINUE * * CLAIM DMA CH1 * STB DMAC# SAVE DMA CH# RBL,ERB SET BIT15=1 FOR BUSY FLAG,E=0 STB DMAC1 RESTORE DMAC1 WITH BUSY FLAG JMP SETBY GO TO SET BUSY SEC * * CHECK CH 2 FOR AVAILABILITY AND BUSY * CKCH2 LDB DMAC2 GET DMA CH2 FLAG SZB,RSS TEST IF SYSTEM HAS DMA JMP NODMA NO: GO TO ABORT EXIT * YES: CONTINUE SSB,RSS TEST IF CH2 BUSY JMP CDMA2 0:NO,GO CLAIMIT * YES: REJECT CALL * 1:YES,REJECT CALL,DMA BUSY * * REJECT REQUEST,BOTH DMA CHANNELS BUSY * CLB,INB SET B=1 JMP REJRQ EXIT VIA REJECT RETURN * * ABORT REQUEST, NO DMA * NODMA CCB SET B= -1 ADB REQAD ADD IN ADDR OF WD2 OF USER REQ. LDA =B3 SET A= 3 JMP IOERR EXIT TO IOC ERROR HALT * * CLAIM DMA CH2 * CDMA2 STB DMAC# SAVE DMAC# RBL,ERB SET BIT 15 = 1,E=1 STB DMAC2 RESTORE DMAC2 WITH BUSY FLAG XIF LST * * SET DRIVER BUSY FLAG * SETBY LDB =B100000 SET B15=1 STB DVRBF SET DVR BUSY FLAG TO BUSY * * SET DEVICE BUSY FLAG IN EQT WD2 * JSB UEQT2 GO UPDATE EQT WD2 * * CLEAR TRANSMISSION LOG * CLA SET A = 0 STA EQTW3,I CLEAR TRANSMISSION LOG * *** DETERMINE IF AUTO-ADDRESSING REQUESTED *** * AADCK LDA SUBUN GET SZA,RSS TEST IF FOR BUS(0) OR DEVICE(>0) JMP NOADR 0:GOTO NO ADDRESSING SECTION * >0: ENTER ADDRESSING SECTION SKP * *** AUTO ADDRESSING SECTION *** * * THIS SECTION ADDRESSES THE DEVICE TO TALK (READ REQUEST) * OR LISTEN (WRITE REQUEST) USING FOR THE * BUS ADDR. * * * PUT I/O CARD INTO CONTROLLER MODE WITH PACKING * LDA =B024267 GET CTL WD FOR CTLR MODE WITH PACING JSB CTLWD OUPUT CTL WD * * CONSTRUCT DEVICE ADDRESS FROM AND PUT INTO ADDR BUFFER * LDB RWFLG GET RED/WRT FLAG LDA =B000100 GET TALK ADDR BITS SSB,RSS TEST IF READ OR WRITE LDA =B000040 0:WRT,REPLACE WITH LISTEN ADDR * GROUP BITS * 1:RED,LEAVE AS IS IOR SUBUN ADD IN FOR ADDR ALF,ALF PUT INTO UPPER HALF WD STA ADDRB+1 PUT IT INTO ADDR BUFFER * * SET-UP OUTPUT SECTION PARAMETERS FOR OUTPUT OF ADDRESS * LDA ADRBA GET ADDR OF ADDR BUFEER STA BPNTR PUT INTO BUFFER POINTER LDA =B-2 GET # OF WDS STA WCNTR PUT INTO WORD COUNTER CLA,INA SET A0 = 1 STA OBFLG SET ODD BYTE FLAG LDA OBUFA GET ADDR OF OUPUT BUF CONT SEC STA IENTP PUT INTO INT.ENT PNTR * * SET-UP CONTINUATOR SECTION TO EXIT TO AUTO-ADDRESSING * COMPLETION SECTION * LDA ADRCA GET ADDR OF AUTO-ADDR'G COMPLT. SEC. STA OBEP PUT INTO OUT. BUF EXIT PNTR JMP AADIN GO TO AUTO-ADDR'G INIT. EXIT * * ADDRESS BUFFER * ADRBA DEF ADDRB ADDRB OCT 057477 UNTALK & UNLISTEN COMMANDS OCT 0 STORAGE FOR DEVICE ADDRESS SKP * *** AUTO-ADDRESSING COMPLETION SECTION *** * * PUT THE I/O CARD INTO THE TALK MODE(WRITE REQUEST) * OD LISTEN MODE(READ REQUEST) AND TAKE IT OUT * OF THE CONTROLLER MODE * ADDRC LDB RWFLG GET R/W FLAG LDA =B000110 GET CTL WD TO ENABLE TALK SSB TEST IF RED OR WRT LDA =B000120 1:RED,REPLACE WITH LISTEN CTLWD * 0:WRT,LEAVE AS IS JSB CTLWD OUTPUT IT JMP INIRW GO TO INITIATE RED/WRT SEC. SKP * *** NO ADDRESSING SECTION *** * * * DETERMINE IF I/O CARD IS * ADDRESSED TO TALK (WRITE REQUEST) * ADDRESSED TO LISTEN (READ REQUEST) * * * GET CURRENT I/O CARD & BUS STATUS * NOADR JSB STAWD * * DETERMINE IF READ OR WRITE REQUEST * LDB RWFLG GET R/W FLAG SSB,RSS TEST IF READ OR WRITE REQ. JMP ATCHK 0:WRT, GO TO ADDR'D TO TALK CHK * 1:RED,CONTINUE TO ADDR'D TO LIST,CHK * * IF READ,TEST IF ADDRESSED TO LISTEN, * MRE=HIGH,RFD=HIGH, & DAC=LOW * AND =B000300 ISOLATE MRE & LISTEN BITS CPA =B000100 TEST IF MRE=H & LISTEN=1 JMP INIRW YES:GO TO RW INIT SEC JMP REJNA NO: GO TO NOT AVAIL REJ * * IF WRITE,TEST IF * 1.ADDRESED TO TALK AND MRE=HIGH * OR 2.ACTIVE AND MRE=LOW * ATCHK LDB A SAVE STATUS AND =B000240 ISOLATE TALK & MRE BITS CPA =B000040 IS TALK=1 & MRE=0? JMP INIRW YES: GO TO RW INIT. SEC. * NO:TRY CTLR MODE LDA B GET STATUS AND =B000220 ISOLATE MRE & ACTIVE BITS CPA =B000220 IS ACTIVE=1 & MRE=1? JMP INIRW YES: GO TO RW INIT. SEC. * NO:CONT. TO REJECT EXIT * * REJECT TEQUEST,CARD AND/OR BUS NOT READY * REJNA CLB,INB GET DEV NOT AVAILABLE STATUS JSB UEQT2 GO UPDATE EQT WD2 STB DVRBF CLR DVR BUSY FLG JMP REJRW SKP * *** READ/WRITE INITIATOR SECTION *** * * * SET-UP RECORD FORMAT FLAGS * INIRW LDB SUBFU GET SUBFUNCTION CODE RBR PUT A/B BIT INTO A15 * F/V BIT INTO A0 * R/A BIT INTO A3 STB RFMTF PUT RESULT INTO REC FMT FLGS UNL IFZ LST * * TEST IF DMA IS TO BE USED * LDA DMAC# GET DMA CH # CLAIMED SZA,RSS TEST IF ONE CLAIMED OR NOT JMP SUIRW 0:NO,GO SET-UP FOR INT. R/W * 6,7:YES,SET-UP FOR DMA R/W ERA SET E TO INDICATE DMA CH# TO USE * 0=6,1=7 * *** SET-UP READ OR WRITE USING DMA TRANSFER *** * * * SET DMA COMPLETION INTERUPT LINKAGE * SUDMA LDA OLDSC,I GET JSB,I FROM I/O INT.TRAP CELL STA DMAC#,I PUT IT IN DMA COMPLETION INT.LOC LDA DTCAD GET ADDR OF DMA XFER COMPLET SEC STA IENTP PUT INTO INT.ENT.PNTR * * ENABLE I/O CARD FOR DMA TRANSFER * LDB RWFLG GET R/W FLAG LDA =B004207 WRT:GET CTL WD FOR DMA WRT SSB TEST IF RED REQ. IOR =B012000 1:RED,ADD IN DMA REQ.FLAG SEL.BIT * AND EOR FLG ENABLE LDB RFMTF GET REC FMT FLGS SSB,RSS TEST A/B BIT IOR =B000400 0:ASCII,ADD IN ASCII MODE BIT JSB CTLWD OUTPUT IT * * FORM CTL WD 3 IN B (-WORD COUNT) * LDB ULFLG GET LENGTH OF USER BUF IN +BYTES INB ADD 1 TO ROUND UP TO WORDS BRS DIVIDE BY 2 TO MAKE WORDS STB WCNTR SAVE FOR XMISSIOM LOG COMP. CMB,INB MAKE IT NEGATIVE * * FORM CTL WD 1 IN A (RED/WRT MODE AND SELECT CODE) * LDA =B020000 GET DMA CTL WD 1:STC=0,WORD,CLC=0 IOR OLDSC ADD IN SC OF BUS I/O CARD * * DETERMINE DMA CHANNEL TO BE USED * SEZ TEST E FOR DMA CH# TO INITILIZE JMP ICH2 1:CH2,GO TO CH2 INIT. SEC. * 0:CH1,CONT. TO CH1 INIT. SEC. * * INITILIZE CH1 * ICH1 OTA 6 PUTPUT CW1 TO DMA CH1 LDA UBUFA GET BUFFER ADDR IOR RWFLG ADD IN R/W CTL BIT CLC 2 SET-UP DMA CH1 TO RCV CW2 OTA 2 SEND SW2 STC 2 SET-UP DMA CH1 TO RCV CW3 OTB 2 SEMD CW3 JMP DMAEX GOTO DMA EXIT ROTUTNE * * INITILIZE CH2 * ICH2 OTA 7 OUTPUT CW1 TO DMA CH2 LDA UBUFA GET BUFFER ADDR IOR RWFLG ADD IN R/W CTL BIT CLC 3 SET-UP DMA CH2 TO RCV CW2 OTA 3 SEND CW2 STC 3 SET-UP DMA CH2 TO RCV CW3 OTB 3 SEND CW3 * * CONFIGURE DMA STC INSRUCTION * DMAEX LDA STCCI GET CTC ,C INST IOR DMAC# ADD IN DMA CH # IN USE STA STCD1 STA STCD2 * * TURN ON INTERRUPT ON I/O CARD * CLCC5 CLC SC,C CLR FLG LDA =B000007 JSB CTLWD INITILIZE I/O CARD STC3 STC SC TURN ON INTERRUPT ON I/O CARD * * DETERMINE IF AUTO ADDRESSING USED * LDA SUBUN GET SUB UNIT REQUESTED SZA TEST IF AUTO ADDR'G UXSED JMP DMACX >0:YES,GOTO DMA CONT EXIT * 0:NO,CONT TO INITATOR EXIT * * IF AUTO ADD'G NOT USED,EXIT VIA INITIATORR SECTION * LIA4 LIA SC SET RFD FF TO START READ STCD1 STC 6,C TURN ON DMA CHANNEL JMP REQIN GOYTO REQ INIT EXIT * * IF AUTO ADDR'G USED, EXIT VIA CONTINUATOR SEC * DMACX LDA I.37 GET ADDR OF LOC FROM WHICH INT OCCURED STA DMAIR SAVE TI LIA5 LIA SC SET RFD FF TO START READ JSB RESTR RESTORE THE REGISTER CONTENTS STCD2 STC 6,C TURN ON DMA JMP DMAIR,I RETURN * DMAIR OCT 0 STCCI STC 0,C XIF LST SKP * *** SET-UP READ OR WRITE USING INTERRUPT TRANSFER *** * * * INITILIZE BUFFER POINTER * SUIRW LDA UBUFA GET VALUE OF USER STA BPNTR PUT INTO BUFFER POINTER * * INITILIZE BYTE COUNTER FOR READ * WORD COUNTER & ODD BYTE FLG FOR WRITE * LDA ULFLG GET LENGTH OF USER BUF IN +BYTES SZA,RSS TEST IF BUF LENGTH=0 JMP BUFL0 0:YES,GOTO BUF LEN 0 EXIT CMA,INA CONVERT TO -BYTES STA BCNTR SAVE -BYTES FOR READ STA OBFLG SAVE ODD BYT CNT FOR WRT INA ROUND DOWN ARS CONVERT TO WDS LESS ODD BYTE ADA =B-1 SET WD CNT TO 1 LESS STA WCNTR SAVE WD CNT FOR WRT * * SET-UP FOR ASCII R/W * CLA SSB,RSS TEST IF ASCII FMT LDA =B000400 0:ASCII,GET CTLWD BIT FOR ASCII MODE * 1:BINARY,LEAVE=0 * * DETERMINE IF READ OR WRITE REQUEST * LDB RWFLG GET READ/WTIRE FLAG SSB TEST IF RED OR WRT JMP SURED 1:RED,GO TO SET-UP RED SEC. * 0:WRT,CONTINUE TO SET-UP WRT SEC. * * SET-UP FOR WRITE * SUWRT LDB OBUFA GET ADDR OF WRT CONTINUATOR ROUT STB IENTP PUT INTO INT ENTRY PNTR LDB CMPLA GET ADDR OF CMPLTION SEC SZA TEST IF ASCII OR BINARY LDB SUCLA 1:ASCII,GET ADDR OF CRLF OUT SEC * 0:BIN,LEAVE AS IS STB OBEP PUT INTO OUT BUF ROUT EXIT PNTR IOR =B024207 ADD CTL WD FOR WRITE JSB CTLWD OUTPUT THE CONTROL WORD JMP RWRIN GO TO RED/WRT REQ INITIALTED EXIT * * SET-UP READ * SURED LDB REDAD GET ADDR OF READ ONTINUATOR ROUT. STB IENTP PUT IT INTO POINTER IOR =B050200 ADD IN CTL WD BITS FOR READ JSB CTLWD OUTPUT THE CONTROL WORD * * INITILIZE UPPER/LOWER BYTE FLAG * CLB STB ULFLG UNL IFZ LST * * INITIALIZE EOF COUNTER * LDB =D-30 STB EOFCT XIF LST * * SET-UP INPUT SEC TO BRANCH TO LEADER PROCESSOR * IFN LDA PACKA GET ADDR OF INPUT PACKING SEC XIF IFZ LDA INLDA GET ADDR OF LEADER PROC'G SEC XIF STA INPTP PUT INTO INPUT SEC BRANCH PNTR * * TEST IF RFD FF NEEDS TO BE SET * LIA2 LIA SC,C SET RFD FF TO START READ JMP RWRIN GO TO RED/WRT REQ INITIATED EXIT * * BUFFER LENGTH=0 EXIT PROCESING * BUFL0 LDB SUBUN GET SUB UNIT REQUESTED SZB TEST IF AUTO ADDR'G USED JMP CMPLT >0:YES,GOTO COMPLT'N SEC * 0:NO,SET-UP INITIATOR EXIT LDA REQIA GET ADDR OF REQ INIT EXIT STA I.37 PUT INTO CONT SEC FOR .BUFR RET JMP CMPLT GOTO COMPLT'N SEC SKP * *** PROCESS A CLEAR REQUEST *** * * * CONFIGURE I/O INSTRUCTONS USED BY CLEAR PROCESSOR * CLEAR LDA EQTAD,I GET WD1 FROM EQT AND =B000077 ISOLATE BITS IOR STFI MAKE INTO STF INSTRUCTION STA STF9 STA STF8 IOR =B000400 CONVERT STF TO LIA STA LIA9 ADA =B000100 CONVERT LIA TO OTA STA OTA9 STA OTA8 IOR =B005300 CONVERT OTA TO CLC ,C * * TURN OFF INTERRUPT AND CLEAR FLAG * CLCC9 CLC SC,C * * IF = 0, EOP BUS * LDA EQTAD,I GET WD1 OF EQT AND =B003700 ISOLATE BITS SZA TEST FOR = 0 JMP CLR1 N/:BYPASS EOP * YES:CONTINUE TO EOP SECTIOM LDA =B000001 GET CTRL WD FOR EOP STF9 STF SC OTA9 OTA SC * * CLEAR IRL FF * CLR1 LIA SC LIA9 EQU CLR1 * * CLEAR OWRLFF,OBRLFF,RFD FF * LDA =B000007 STF8 STF SC OTA8 OTA SC * * CLEAR DRIVER BUSY FLAG * CLB STB DVRBF CLEAR DVR BUSY FLAG * * CLEAR EQT TABLE ENTRIES * LDA EQTAD GET ADDR OF EQT WD1 INA SET TO WD2 STA EQTW2 PUT INTO EQT WD2 ADDR INA SET ADDR TO EQT W&3 STB A,I CLEAR TRAMSMISSION LOG JSB UEQT2 CLEAR BITS 0-7: * BITS 14: R/W ERROR FLG * BIT 15: DEVICE BUSY FLG UNL IFZ LST * * RELEASE DMA CHANNEL IF CLAIMED * LDA DMAC# GET DMA CH # CURRENTLY IN USE SZA TEST IF DMA IN USE JSB RCDMA >0:GORELEASE & CLEAR DMA * 0:NO,GO TO EXIT XIF