ASMB,R,L,C HED DVR62F -- 2313B DRIVER FOR RTE-IV SYSTEMS * NAME: DVR62F * SOURCE: 02313-18004 * RELOC: 02313-16004 * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * NAM DVR62F 02313-16004 REV 1826 780403 ENT I.62,C.62 EXT $MATA FIRST PAGE OF USER PARTITION EXT $MPFT FENCE TABLE USED TO FIND * LOWEST LEGAL BUFFER ADDR SPC 2 SPC 2 * ************************************************************ * * * * * THIS DRIVER WILL NOT SUPPORT CLASS I/O * * * * * ************************************************************ SPC 2 * THIS DRIVER OPERATES THE 2313B SUBSYSTEM IN THE RTE-IV * ENVIRONMENT. IT REQUIRES THE USE OF INTERFACE ROUTINES * TO SIMPLIFY OPERATION. IT CAN, HOWEVER, BE CALLED * DIRECTLY BY AN EXEC CALL IF THE USER FOLLOWS THE * FOLLOWING FORMAT: * * FORTRAN: CALL EXEC(ICODE,ICNWD,IQUE,N) * * * * * ASSEMBLY: * * EXT EXEC * . * : * JSB EXEC * DEF *+5 * DEF ICODE * DEF ICNWD * DEF IQUE * DEF N * * . * : * * WHERE: * * ICODE=2 (NORMAL CALLS ASSUME WRITE PATH) * ICNWD=BITS 0-5 ARE THE LOGICAL UNIT # * BIT 6 IS 1 TO SPECIFY DMA NEEDED * (NOT USED FOR REMOTE,I.E.,SUBCHANNEL 1 - SEE BELOW) * IQUE=ADDRESS OF QUEUE BUFFER CONTAINING * ALL OPERATIONS * N=NUMBER OF "ENTRIES" IN IQUE * * * IQUE CONTAINS A NUMBER OF MULTIPLE WORD ENTRIES * WHICH DEFINE OPERATIONS. MOST PRACTICAL USES OF * THE 2313B WILL REQUIRE MORE THAN ONE OPERATION. * ALL OPERATIONS IN IQUE ARE EXECUTED IN ONE CALL * TO THE DRIVER. THIS METHOD PREVENTS ANOTHER * PROGRAM FROM CHANGING SUB-SYSTEM PARAMETERS * DURING RELATED OPERATIONS. SPC 2 * ONE WORD ENTRIES: * * TYPE = 1 ISSUE SYSTEM NORMALIZE (NO DMA) * * TYPE = 2 ISSUE 2930A LOOP ESCAPE (NO DMA) * * THREE WORD ENTRIES: * * TYPE = 3 OUTPUT NUMB WORDS (DMA AVAILABLE - LOCAL ONLY) * NUMB = NUMBER TO OUTPUT * BUFF = ADDRESS OF OUTPUT BUFFER * * TYPE = 4 INPUT NUMB WORDS (DMA AVAILABLE - LOCAL ONLY) * NUMB = NUMBER TO INPUT * BUFF = ADDRESS OF INPUT BUFFER * * FOUR WORD ENTRIES: * * TYPE = 5 OUTPUT THEN INPUT NUMB PAIRS (NO DMA) * NUMB = NUMBER OF OUT-IN PAIRS * OBUF = ADDRESS OF OUTPUT BUFFER * IBUF = ADDRESS OF INPUT BUFFER * * TYPE = 6 OUTPUT NUMB ADRS THEN DATA PAIRS (NO DMA) * NUMB = NUMBER OF OUT-OUT PAIRS * OBF1 = ADDRESS OF CHANNEL BUFFER * OBF2 = ADDRESS OF DATA BUFFER * * TYPE = 7 OUTPUT NUMB CHAN THEN DATA PAIRS (NO DMA) * NUMB = NUMBER OF DATA POINTS TO OUTPUT * CHAN = ADDRESS OF THE CHANNEL NUMBER * OBUF = ADDRESS OF DATA BUFFER * * TYPE = 8 OUTPUT NUMB DATA POINTS SEQUENTIALLY (NO DMA) * NUMB = NUMBER OF DATA POINTS TO OUTPUT * OBF1 = ADDRESS OF 2 WORD BUFF CONTAINING START & END CHAN * OBF2 = ADDRESS OF DATA BUFFER * * TYPE = 9 OUTPUT NUMB ERASE COMMANDS (NO DMA) * NUMB = NUMBER OF DACS TO ERASE * OBUF = ADDRESS OF CHANNEL BUFFER * CMND = ADDRESS OF THE DATA WORD (ERASE) * * ADDITIONAL COMMENTS: * * IN ALL CASES NUMB MUST NOT BE LESS THAN 0. FOR ALL BUT * TYPE 3 NUMB MUST BE GREATER THEN 0. FOR TYPE 3 NUMB * MAY BE 0 TO INDICATE OUTPUT BUT DO NOT ENCODE. * (FOR REMOTE NO OUTPUT WILL BE DONE BUT THE WORD WILL * BE SAVED TO BE OUTPUT FOR NEXT ENTRY IF NEEDED.) * * FOR TYPE 3 WITH DMA REQUESTED, DMA WILL BE USED * WHEN NUMB IS GREATER THAN 2. FOR TYPE 4 WITH DMA REQUESTED, * DMA WILL BE USED. DMA IS NEVER USED FOR REMOTE (SUBCHANNEL 1) * * TYPES 3 THROUGH 7 MAKE THIS DRIVER A GENERAL * PURPOSE MICROCIRCUIT I/O CARD DRIVER * (MUST BE SUBCHANNEL 0 -- SEE BELOW) ****************************************************************** * * * THE RTE MUST BE CONFIGURED FOR SUBCHANNEL 0 FOR LOCAL, * * SUBCHANNEL 1 FOR REMOTE. * * * ****************************************************************** SKP ******************************************************************** * * * * * >>>>>>> IMPORTANT NOTE FOR FUTURE MODIFIERS <<<<<<< * * * * * * THIS VERSION OF THE 2313 DRIVER WAS ADAPTED FROM THE RTE-III * * VERSION TO SUPPORT RTE SYSTEMS WITH EXTENDED MEMORY (GREATER * * THAN 32K). THIS VERSION IS COMPATIBLE ONLY WITH RTE IV * * SYSTEMS. THIS DRIVER DOES NOT SUPPORT CLASS I-O CALLS. * * * * * ******************************************************************** SKP ************************ * * * INITIATION SECTION * * * ************************ SPC 2 I.62 NOP JSB CNFGR CONFIGURE ALL I/O INSTRUCTIONS LDA BIT7 FORM MASK CMA TO TURN OFF AND EQT5,I XMSN ERROR STATUS BIT STA EQT5,I AND RESTORE STATUS WORD DLD INTBA,I \ CPA EQT1 \ JMP HVDMA > CHECK FOR DMA ASSIGNED CPB EQT1 / JMP HVDMA / SPC 2 * ** VALID REQUEST CHECK ** SPC 1 LDA EQT1,I GET REQUEST LIST POINTER INA LDB A,I RBL SSB CLASS OR BUFFERED I-O REQUEST? JMP ERROR YES - CLASS I/O ILLEGAL SLB JMP NORML INA REIO REQUEST? LDB A,I SSB JMP ERROR YES - REIO REQUEST ILLEGAL NORML EQU * LDA EQT6,I GET REQUEST CONTROL WORD AND B77 MASK REQUEST TYPE CPA TWO WRITE REQUEST? JMP CHKQU YES - GOOD CPA THREE CONTROL REQUEST? CLA,INA,RSS YES - A=2 FOR RETURN ERROR CLA READ REQUEST - A=1 FOR RETURN INA (ALSO FOR BAD ENTRIES) JMP I.RTN ERROR RETURN SPC 2 SKP * THIS ROUTINE CHECKS A SPECIFIED BUFFER TO SEE IF ANY PART * OF IT LIES IN A DISK RESIDENT PROGRAM AREA. IF ANY PART * OF THE BUFFER IS IN A DISK AREA THEN RETURN IS TO (P+1), * IF IN LEGAL SYSTEM AREA,RETURN IS TO (P+2). * * ENTER WITH (A)=BUFFER ADDRESS, (B)=BUFFER LENGTH * * OPERATION: WE CHECK ALL PHYSICAL PAGES (REPEAT, PHYSICAL) * OCCUPIED WHOLLY OR PARTIALLY BY A BUFFER. IF ANY SUCH PAGE * IS WRITE PROTECTED, THE DRIVER REJECTS THE CALL. IF ANY * SUCH PAGE IS PART OF A DISK PARTITION, THEN RETURN IS TO * (P+1). OTHERWISE, IF THE BUFFER BEGINS IN SSGA OR SYSTEM * COMMON, RETURN IS TO (P+2): IF BELOW SSGA, THE DRIVER REJECTS * THE CALL. NOTE THAT ALL PAGES OF THE BUFFER ARE CHECKED SO * THAT THE PARTITION NEED NOT CONSIST OF CONTIGUOUS PAGES. * * THE USER (REPEAT, USER) MAP IS EXAMINED TO ACCOMPLISH THIS * TEST. NOTE THAT ALL BUFFERS CHECKED HERE WILL BE VISIBLE * FROM THE USER MAP. SPC 2 DRA? NOP ENTRY (A)=ADDRESS,(B)=LENGTH SSA ERROR IF BUFFER ADDR LESS JMP ERROR THAN ZER0 SZB,RSS MAKE ZERO LENGTH BUFFERS INB LOOK LIKE ONE WORD FOR THIS CODE STA TEMP4 ADB A ERROR IF ADB N1 END ABOVE SSB 77777B. JMP ERROR CLA CLEAR A TEMPORARY TO KEEP TRACK STA PAGES OF PAGES IN DISC PART OF MEM LDA TEMP4 PUT FWA IN A, LENGTH IN B LSR 10 GET PAGE NUMBERS AND B77 AND ISOLATE THEM. SPC 1 CMB GET -NUMBER OF PAGES STRADDLED ADB A BY BUFFER AND STB COUNT SAVE AS LOOP COUNTER. ADA P32 CONVERT START PAGE TO MAP# SPC 1 LDB MATA.,I GET MATA ADDRESS ADB THREE POINT TO FIRST USER PARTITION BASE LDB B,I AND LOAD IT SWP ISOLATE AND M1777 PAGE SWP NUMBER INB IGNORE BASE PAGE STB SPFP AND SAVE IT SPC 1 LOOP LDB TEMP. POINT TO PLACE TO DUMP MAP LDX N1 DUMP ONLY ONE REGISTER XMM DUMP MAP TO MEMORY LDB TEMP7 PICK UP MAP REG RBL ERROR IF BIT 14 SSB IS SET. JMP ERROR (WRITE RBR PROTECTED PAGE). SWP MASK TO AND M1777 PHYSICAL PAGE SWP ADDRESS. CMB,INB IF PHYSICAL PAGE ADDR INB ADB SPFP IS IN USER PARTITION SSB THEN INCR COUNTER - MUST BE ISZ PAGES IN DISC AREA. ISZ COUNT BUMP COUNTER JMP LOOP AND CONTINUE IF MORE. SPC 1 LDA PAGES IF ANY PAGES IN DISC AREA SZA THEN JMP DRA?,I RETURN TO CALLER ISZ DRA? ELSE CHECK IF IN COMMON OR SSGA SPC 2 * CHECK IF BUFFER IN COMMON, SSGA OR MEMORY RESIDENT AREA SPC 2 LDA MPFT.,I FETCH MPFT ADDRESS ADA FOUR POINT TO SSGA BASE LDA A,I AND LOAD IT CMA,INA NEGATE ADA TEMP4 ADD BUFFER ADDRESS SSA <0? JMP ERROR YES - NOT IN LEGAL MEM. RES. AREA JMP DRA?,I NO - RETURN TO CALLER - BUFFER LEGAL N1 DEC -1 P32 DEC 32 TEMP. DEF TEMP7 M1777 OCT 1777 MATA. DEF $MATA START PAGE OF FIRST USER PARTITION SPFP BSS 1 PAGES BSS 1 COUNT BSS 1 SKP * ** CHECK QUEUE BUFFER LENGTH ** SPC 1 CHKQU EQU * LDA EQT8,I CHECK QUEUE CMA,INA BUFFER # OF ENTRIES SSA,RSS >0? JMP ERROR NO - REJECT SPC 2 * ** VALID ENTRY TYPES CHECK ** SPC 1 LDB EQT7,I GET & SAVE STB TEMP1 QUEUE BUFFER ADDRESS STA TEMP2 SAVE ENTRY COUNTER STB TEMP3 SPC 1 * FIND QUEUE BUFFER LOCATION * SPC 1 CLB SET UP STB QBUF QUEUE FLAG LDA TEMP3 FETCH QUEUE ADDRESS JSB DRA? FIND LOCATION ISZ QBUF IF QUEUE IN DISK AREA, QBUF=1 * IF QUEUE IN SSGA OR COMMON, QBUF=0 SPC 1 L1 EQU * LDB TEMP1,I GET CURRENT ENTRY TYPE NUMBER ISZ TEMP1 ADVANCE QUEUE BUFFER ADDRESS CPB ONE TYPE = 1? RSS YES - OK CPB TWO TYPE = 2? JMP L6 YES - OK LDA TEMP1,I GET NUMBER OF STA TEMP5 OPERATIONS AND CMA,SSA,RSS CHECK FOR <0 JMP ERROR <0 SO REJECT CPB THREE TYPE = 3? JMP L2 YES - OK SZB IF ENTRY TYPE = 0 THEN ERROR CMA,SZA,RSS CHECK # OF OPERATIONS FOR 0 JMP ERROR =0 SO REJECT LDA MIN10 IS TYPE ADA B MORE THAN SSA THREE BUT SSB LESS THAN TEN? JMP ERROR NO SPC 2 * ** VALID BUFFER CHECK ** * * IF THE QUEUE BUFFER IS NOT IN A DISK RESIDENT AREA (EITHER RT * OR BACKGROUND) THEN NO DATA BUFFER MAY BE IN A DISK RESIDENT * AREA. * L2 EQU * STB TEMP6 SAVE (B) ISZ TEMP1 POINT TO BUFFER ADDR LDA QBUF CHECK QUEUE LOCATION CPA ONE IF QUEUE JMP NOSWP IN DISK AREA - NOT SWAPABLE SPC 1 SPC 1 JSB CPASS FETCH BUFFER LENGTH LDA TEMP1,I FETCH BUFFER ADDRESS JSB DRA? CHECK BUFFER LOCATION JMP ERROR BUFFER IS IN DISK AREA -- ERROR JMP NSWP2 BUFFER IS IN CORE AREA SPC 1 NOSWP EQU * QUEUE IN DISC AREA JSB CPASS FETCH BUFFER LENGTH LDA TEMP1,I FETCH BUFFER ADDR JSB DRA? CHECK BUFFER ADDRESS ANYHOW NOP (DON'T CARE IF BUFF IN DISC AREA) NSWP2 EQU * BUFFER NOT IN DISC AREA IF ENTRY HERE LDB TEMP6 RESTORE (B) SSB FIRST BUFFER? JMP L3 NO CPB FOUR YES - TYPE = 4? JMP L5 YES - BUFFER OK CPB THREE TYPE = 3? JMP L5 YES - BUFFER OK CMB,INB SET FOR SECOND BUFFER CHECK JMP L2 SPC 2 CPASS NOP LDB TEMP5 GET DATA LEN FROM Q LDA TEMP6 GET TYPE & BUFF NUMBER FLG SSA 1ST BUFFER? JMP PASS2 NO, 2ND CPA SEVEN YES, IF TYPE 7 CALL CLB,INB THEN LENGTH IS 1 CPA EIGHT ELSE IF TYPE 8 LDB TWO THE LENGTH IS 2 JMP CPASS,I RETURN SPC 1 PASS2 CMA,INA 2ND BUFF, COMPL FLAG FOR TYPE CPA NINE IF TYPE 9 CLB,INB THEN 2ND BUFF LEN IS 1 JMP CPASS,I RETURN SPC 1 NINE DEC 9 MIN10 DEC -10 SPC 2 L3 EQU * CMB,INB RECOVER TYPE CPB FIVE TYPE = 5? RSS YES - CHECK VALIDITY JMP L5 NO - BUFFERS OK SPC 2 SPC 2 * ** CHECKED ALL ENTRIES? ** SPC 1 L5 ISZ TEMP1 ADVANCE QUEUE ADDRESS L6 ISZ TEMP2 CHECKED ALL ENTRIES? JMP L1 NO - CHECK NEXT ONE QBUF BSS 1 SKP * ** NEED DMA? ** SPC 1 LDA REMOT GET REMOTE/LOCAL FLAG SLA REMOTE? JMP NODMA YES, NO DMA LDA EQT6,I CHECK CONWD BIT 6 AND BIT6 TO SEE IF DMA SZA,RSS HAS BEEN REQUESTED BY USER JMP NODMA NOT REQUESTED LDA FIVE COMPLETE TO GET JMP I.RTN DMA ASSIGNED SPC 1 * ** DON'T USE DMA ** SPC 1 NODMA EQU * LDA EQT6,I MAKE SURE THAT CONWD AND BX177 IS CLEAR OF STA EQT6,I UNDESIRABLE BITS JMP OP SPC 2 BX177 OCT 140177 BIT7 OCT 200 SPC 2 * ** HAVE DMA ** SPC 1 HVDMA EQU * LDA EQT6,I SET CONWD AND BX177 FOR DMA IOR BIT7 OPERATIONS STA EQT6,I WHERE POSSIBLE SPC 1 LDB EQT9,I SPC 1 LDA CHAN CONFIGURE JSB DCFGR DMA INSTRUCTIONS SPC 2 * ** CALL MAIN PROCESSOR ** SPC 1 OP EQU * LDA EQT8,I CREATE CMA NUMBER OF ENTRIES STA EQT8,I COUNTER CCA FORCE STA EQT10,I START-UP JSB PROC START OPERATIONS CLA,RSS OPERATION INITIATED LDA FOUR IMMEDIATE COMPLETION CLB I.RTN EQU * JMP I.62,I THEN RETURN TO SYSTEM SPC 2 THREE DEC 3 FIVE DEC 5 SIX DEC 6 MPFT. DEF $MPFT SKP ***************************************** * * * CONTINUATION AND COMPLETION SECTION * * * ***************************************** SPC 2 C.62 NOP LDB EQT1,I SPURIOUS SZB,RSS INTERRUPT? JMP SPURI YES - IGNORE IT SPC 1 CPA SIX WAS RSS INTERRUPT CPA SEVEN FROM RSS DMA JMP DEV NO JSB DCFGR YES - CONFIGURE DMA SPC 1 CLCD1 CLC HDMA TURN OFF DMA CCA FORCE NEW STA EQT10,I ENTRY CHECK LDA EQT6,I IS A DEVICE \ ALF,ALF INTERRUPT CHECKS BIT 9 RAR,SLA REQUIRED? / JMP CONT YES LDA EQT4,I NO - GET DEVICE AND B77 SELECT CODE SPC 2 * ** CALL MAIN PROCESSOR ** SPC 1 DEV EQU * JSB CNFGR CONFIGURE ALL I/O INSTRUCTIONS SPC 1 LDA REMOT REMOTE? SLA,RSS YES - SKIP JMP LOCAL NO - SKIP STATUS WORD CHECK LIA2 LIA .2313,C READ STATUS WORD AND SMASK SAVE PARITY, MISSED, & RIP BITS SZA,RSS CHECK FOR BAD STATUS JMP LOCAL GOOD STATUS - CONTINUE LDA EQT5,I BAD STATUS IOR BIT7 SET XMSN ERROR BIT STA EQT5,I IN STATUS WORD JMP PERR AND RETURN TO CALLER LOCAL EQU * LDA EQT6,I IS A \ ALF,ALF DMA CHANNEL CHECKS BIT 7 SSA,RSS ASSIGNED? / JMP L7 NO DLD INTBA,I \ ELA,CLE,ERA \ ELB,CLE,ERB \ CPA EQT1 > GET PROPER LDA SIX / DMA CHANNEL CPB EQT1 / LDA SEVEN / JSB DCFGR GO CONFIGURE DMA SPC 1 L7 EQU * JSB PROC START OR CONT OPERATION JMP CONT OPERATION CONTINUATION CLB,INB,RSS ALL OPERATIONS DONE (B=1) PERR EQU * CLB PARITY ERROR(B=0) LDA BIT15 SET A= BIT 15 TO RELEASE DMA CLC1 CLC .2313,C TURN OFF DEVICE JMP C.RTN RETURN TO SYSTEM (COMPLETED) SPC 2 TWO DEC 2 SMASK OCT 100006 SPC 2 SPURI EQU * STB EQT15,I CLEAR TIME OUT ON SPURIOUS INT CONT EQU * ISZ C.62 SET RETURN FOR CONTINUATION C.RTN EQU * JMP C.62,I RETURN TO SYSTEM SPC 2 ONE DEC 1 B77 OCT 77 SKP ******************** * * * MAIN PROCESSOR * * * ******************** SPC 2 PROC NOP ISZ EQT10,I CHECK FOR END OF CURRENT ENTRY JMP MORE MORE TO GO ON THIS ONE * ("MORE" ENABLES USER MAP) NEXT EQU * LDA STCC1 SET ENCODE STA STCC2 COMMAND ISZ EQT8,I MORE ENTRIES TO GO? RSS YES JMP DONE NO - ALL DONE LDB EQT7,I GET NEW TYPE NUMBER LDB B,I AND SAVE STB EQT9,I IT IN EQT ISZ EQT7,I ADVANCE QUEUE ADRS CCA ASSUME TYPE 1 OR 2 AND STA EQT10,I SET FOR 1 OPERATION CPB ONE TYPE = 1? JMP SYNRM YES - GO DO A SYSTEM NORMALIZE CPB TWO TYPE = 2? JMP ESCPE YES - ISSUE 2930A ESCAPE WORD SPC 1 SPC 1 LDA EQT7,I GET TRANSFER LDA A,I LENGTH FROM QUEUE BUFFER CMA MAKE IT A NEGATIVE STA EQT10,I COUNTER & STORE IN EQT ISZ EQT7,I ADVANCE QUEUE ADRS LDA EQT7,I GET 1ST OR ONLY BUFF ADRS LDA A,I AND PLACE IT IN STA EQT11,I EQT IN POSITIONS FOR BOTH STA EQT12,I BUFFER ADDRESSES ISZ EQT7,I ADVANCE QUEUE ADRS LDB EQT9,I RESTORE TYPE TO B CPB THREE TYPE = 3? JMP OUT DO SIMPLE OUTPUT UNDER USER MAP * ("OUT" ENABLES USER MAP) CPB FOUR TYPE=4? JMP IN DO SIMPLE INPUT UNDER USER MAP * ("IN" ENABLES USER MAP) LDA EQT7,I GET 2ND BUFF ADRS LDA A,I AND PLACE IT IN STA EQT12,I THE EQT ISZ EQT7,I ADVANCE QUEUE ADRS SPC 1 UJP NEXT3 SWITCH TO USER MAP NEXT3 CPB FIVE TYPE = 5? JMP OUTPT YES - GO TO OUTPUT (THEN INPUT) LDA EQT11,I GET & SAVE LDA A,I THE 1ST WORD OF STA EQT13,I THE 1ST BUFFER LDA EQT10,I ADJUST THE INA OPERATIONS COUNTER BIT9 ALS FOR DOUBLE OPERATIONS STA EQT10,I ON THE DUAL DAC JMP DAC SKP SEVEN DEC 7 EIGHT DEC 8 SYN OCT 140001 SPC 1 * ** ISSUE SYSTEM NORMALIZE ** SPC 1 SYNRM EQU * LDA SYN GET SYSTEM NORMALIZE COMMAND LDB REMOT GET REMOTE/LOCAL FLAG SLB REMOTE? JMP R/L YES,ISSUE COMMAND REMOTE CLC2 CLC .2313,C CLC TO GET ENCODE EDGE OTA1 OTA .2313 AND ISSUE IT STCC1 STC .2313,C DOUBLE ENCODE NOP TO INSURE STC1 STC .2313 RESPONSE JMP PROC,I CONTINUATION RETURN SPC 1 FOUR DEC 4 BIT8 OCT 400 SPC 1 * ** CONTINUATION ** SPC 1 MORE EQU * LDB EQT9,I GET CURRENT TYPE NUMBER CPB THREE TYPE = 3? JMP OUTPT YES - CONT SIMPLE OUTPUT CPB FOUR TYPE = 4? JMP INPT1 YES - CONT SIMPLE INPUT CPB FIVE TYPE = 5? JMP INPT2 YES - GO INPUT (THEN OUTPUT) SPC 1 DAC EQU * LDA EQT6,I GET REQUEST CONTROL WORD XOR BIT8 TOGGLE BIT 8 FOR MIXED IN/OUT STA EQT6,I SAVE IT ALF,ALF POSITION FOR TESTING LATER CPB SIX TYPE = 6? JMP BLOCK YES - GO DO BLOCK SCAN ON DAC CPB SEVEN TYPE = 7? JMP SINGL YES - GO DO SINGLE CHAN ON DAC CPB EIGHT TYPE = 8? JMP SEQTL YES - GO TO SEQUENTIAL ON DAC SLA TYPE = 9: CHECK CONWD BIT 8? JMP CHANL CHANNEL # OUTPUT LDA EQT12,I GET DATA WORD LDA A,I JMP R/L GOTO REMOTE LOCAL OUTPUT SKP SEQTL EQU * SLA,RSS DAC SEQ SCAN: CHECK CONWD BIT 8? JMP DATA DATA OUTPUT LDA EQT13,I GET ADDRESS TO BE OUTPUT AND DMASK & ELIMINATE WAIT BIT STA B LDA EQT11,I GET END CHANNEL INA ADDRESS FOR SEQUENTIAL LDA A,I SCAN AND CHECK AND DMASK TO SEE IF CPA B CURRENT CHAN IS END CHAN JMP NWSCN IT IS - START NEW SCAN LDA EQT13,I \ STA B \ INCREMENT ADB B20 / CHANNEL # STB EQT13,I / SPC 2 CLB,INB IS THIS THE CMB LAST CHANNEL CPB EQT10,I TO BE SET? JMP DWAIT YES - SET WAIT BIT JMP R/L# SPC 1 ESCPE EQU * LDA SCAPE (GET 2930A ESCAPE WORD) R/L EQU * REMOTE/LOCAL OUTPUT FROM (A) REGISTER STA EQT13,I SAVE LAST OUTPUT WORD R/L# EQU * LDB REMOT GET REMOTE/LOCAL FLAG SLB,RSS LOCAL? JMP OTA2 YES SPC 1 REOUT EQU * REMOTE OUTPUT ONLY STCC4 STC .2313,C SET RECEIVE MODE LIB1 LIB .2313,C CLEAR STATUS LIB2 LIB .2313 CLEAR DATA OTA3 OTA .2313 OUTPUT COMMAND WORD TO 2313 JMP PROC,I RETURN AND WAIT FOR FLAG SPC 1 OTA2 OTA .2313 ISSUE A WORD * * NOTE: THE FOLLOWING INSTRUCTION IS NORMALLY A CONFIGURED * "STC SC,C" EXCEPT FOR TYPE 3 ENTRIES WITH N=0. IN THIS * CASE, IT IS A "JMP NEXT". * STCC2 JMP NEXT AND ENCODE JMP PROC,I CONTINUATION RETURN SPC 2 B20 OCT 20 DMASK OCT 7776 BIT6 OCT 100 SCAPE OCT 146000 BIT15 OCT 100000 SKP NWSCN EQU * LDB EQT11,I DAC SEQ NEW SCAN LDB B,I RESTORE CURRENT CHAN ADRS STB EQT13,I STORAGE WITH START CHAN ADRS LDA EQT11,I INA LDA A,I DWAIT EQU * IOR ONE SET FLAG WAIT BIT JMP R/L# SPC 1 SINGL EQU * SLA,RSS DAC SINGLE CHAN: CHK CONWD B8? JMP DATA DATA OUTPUT LDA EQT11,I GET "THE" CHANNEL LDA A,I NUMBER JMP R/L SPC 1 BLOCK EQU * SLA,RSS DAC BLK SCAN: CHK CONWD BIT 8? JMP DATA DATA OUTPUT CHANL EQU * LDA EQT11,I GET NEXT CHANNEL LDA A,I NUMBER ADVNC EQU * ISZ EQT11,I ADVANCE CHAN BUFF ADDRESS JMP R/L SPC 1 DATA EQU * LDA EQT12,I DAC DATA OUTPUT: LDA A,I GET DATA WORD FROM BUFFER ISZ EQT12,I ADVANCE DATA BUFF ADDRESS JMP R/L# GO OUTPUT THE DATA WORD SPC 2 * ** SIMPLE OUTPUT (TYPE 3) ** SPC 1 OUT EQU * ISZ EQT10,I ADJUST OPERATIONS COUNTER JMP DMCHK IF >0 OPS THEN GO CHK MORE LDA SAJMP FOR 0 OPS ELIMINATE STA STCC2 ENCODE AND FORCE NEXT ENTRY LDA REMOT \ SLA,RSS \ JMP OUTPT (LOCAL) LDA EQT11,I SKIP OUPUT BUT LDA A,I SAVE OUTPUT WORD STA EQT13,I / ISZ EQT11,I / JMP NEXT / SPC 1 OUTPT EQU * LDA EQT11,I GET OUTPUT WORD LDA A,I FROM BUFFER JMP ADVNC SKP DMCHK EQU * LDA REMOT GET REMOTE FLAG SLA REMOTE JMP OUTPT YES,NO DMA LDA EQT10,I CHECK NUMBER OF CMA,INA OPERATIONS CPA ONE FOR >2? JMP OUTPT =1 (NO DMA) CPA TWO >1 JMP OUTPT =2 (NO DMA) LDA EQT6,I >2 SO CHECK CONWD ALF,ALF BIT 7 SSA,RSS FOR DMA? JMP OUTPT NO DMA ALF,CLE,ALF SET BIT 9 OF CONWD (DEV INTRPT IOR BIT9 REQUIRED) & CLEAR E (OUTPUT) JMP DMSET GO START OUTPUT DMA SPC 2 NOT9 OCT 176777 BIT13 OCT 20000 SPC 1 * ** SIMPLE INPUT (TYPE 4) ** SPC 1 IN EQU * * UJP IN2 MAKE SURE WE'RE IN USER MAP *CIO* LDA REMOT SLA,RSS JMP IN1 NCODE EQU * LDA EQT13,I JMP REOUT IN1 EQU * LDA EQT6,I CHECK CONWD ALF,ALF BIT 7 FOR SSA,RSS DMA OPERATION? JMP STCC2 NO DMA - GO ENCODE ALF,ALF CLEAR CONWD BIT 9(NO DEV INTRPT) AND NOT9 REQUIRED) & SET E CCE FOR DMA INPUT SPC 1 * ** SET UP & START DMA ** * (LOCAL ONLY) SPC 1 DMSET EQU * STA EQT6,I SAVE CONWD LDA EQT4,I FORM DMA AND B77 COMMAND WORD 1 WITH DEVICE IOR BIT15 SELECT CODE & STC OPTION SEZ INPUT? IOR BIT13 YES - SET CLC OPTION OTAD1 OTA HDMA ISSUE CW1 & CLCD2 CLC LDMA PREPARE FOR CW2 LDA EQT11,I GET BUFFER ADDRESS FOR CW2 SEZ INPUT? IOR BIT15 YES - SET INPUT MODE BIT OTAD2 OTA LDMA ISSUE CW2 & STCD1 STC LDMA PREPARE FOR CW3 LDA EQT10,I GET TRANSMISSION LENGTH SEZ AS CW3 AND INA ADJUST IF INPUT OTAD3 OTA LDMA ISSUE CW3 - DMA IS NOW READY CLF 0 TURN OFF INTERRUPT SYSTEM SEZ,RSS OUTPUT? STF1 STF .2313 YES - SET DEVICE FLAG SEZ INPUT? STCC3 STC .2313,C YES - START DEVICE STCD2 STC HDMA,C START DMA TRANSFER CLA PRIVILEGED I/O CPA DUMMY PRESENT? JMP PROC,I NO - CONTINUATION EXIT CLCD3 CLC HDMA YES - TURN OFF DMA INTERRUPT LDB INTBA GET ADDRESS LDA CHAN OF APPROPRIATE CPA SEVEN DMA CHANNEL INB IN INTERRUPT LDA B,I TABLE IOR BIT15 SET BIT 15 TO INDICATE THIS DMA STA B,I CHANNEL IS IN USE STF 0 TURN INTERRUPT SYSTEM BACK ON JMP PROC,I CONTINUATION EXIT SPC 2 SAJMP NOP SPC 2 DONE EQU * ISZ PROC SET FOR COMPLETION JMP PROC,I AND RETURN SPC 2 * ** INPUT ROUTINE ** SPC 1 INPUT NOP LIA1 LIA .2313 GET READING FROM I/O CARD LDB EQT12,I GET BUFFER ADDRESS STA B,I AND STORE THE READING ISZ EQT12,I ADVANCE BUFFER ADDRESS LDA EQT10,I GET OPERATION COUNTER INA,SZA AND CHECK FOR DONE? JMP INPUT,I NO - GO ON JMP NEXT YES - GET NEXT ENTRY SPC 2 INPT1 EQU * CONTINUE SIMPLE INPUT OPERATION JSB INPUT CONTINUE SIMPLE INPUT LDB REMOT SLB JMP NCODE JMP STCC2 OPERATION SPC 1 INPT2 EQU * JSB INPUT CONT INPUT THEN GO JMP OUTPT OUTPUT NEXT CHAN # SKP SKP ******************************* * * * I/O CONFIGURATION ROUTINE * * * ******************************* SPC 1 CNFGR NOP LDB STCC2 SAVE JUMP STB SAJMP INSTRUCTION CLB FIRST TIME STB *-2 ONLY IOR OTA0 FORM "OTA SC" INST STA OTA1 AND STA OTA2 STORE IT STA OTA3 IOR BIT6 FORM "STC SC" INST STA STC1 AND STORE IT XOR B5000 FORM "CLC SC,C " INST STA CLC1 AND STORE IT STA CLC2 XOR BIT11 FORM "STC SC,C" INST STA STCC1 AND STA STCC2 STORE STA STCC3 IT STA STCC4 XOR B1200 FORM "LIA SC" INST STA LIA1 AND STORE IT IOR BIT9 FORM "LIA SC,C" INST STA LIA2 AND STORE IT IOR BIT11 FORM "LIB SC,C" INSTRUCTION STA LIB1 XOR BIT9 FORM "LIB SC" INSTRUCTION STA LIB2 XOR BIT8 FORM "STF SC" INST STA STF1 AND STORE IT LDA EQT4,I GET SUBCHANNEL ASR 6 SHIFT TO LSB STA REMOT JMP CNFGR,I SPC 2 REMOT NOP REMOTE/LOCAL FLAG OTA0 OTA 0 BIT11 OCT 4000 B1200 OCT 1200 B5000 OCT 5000 NB4 OCT -4 SKP ******************************************* * * * DMA INSTRUCTION CONFIGURATION ROUTINE * * * ******************************************* SPC 1 DCFGR NOP STA CHAN SAVE CHANNEL IOR OTA0 FORM "OTA 6 OR 7" INST STA OTAD1 AND STORE IT ADA NB4 FORM "OTA 2 OR 3" INST STA OTAD2 AND STA OTAD3 STORE IT IOR BIT6 FORM "STC 2 OR 3" INST STA STCD1 AND STORE IT IOR BIT11 FORM "CLC 2 OR 3" INST STA CLCD2 AND STORE IT ADA FOUR FORM "CLC 6 OR 7" INST STA CLCD1 AND STA CLCD3 STORE IT XOR B5000 FORM "STC 6,C OR 7,C" INST STA STCD2 AND STORE IT LDB INTBA \ SLA \ INB \ CLEAR BIT 15 OF LDA B,I / PROPER INTBL LOC. ELA,CLE,ERA / STA B,I / JMP DCFGR,I SKP **************************************** * * * BASE PAGE POINTERS AND OTHER EQU'S * * * **************************************** SPC 2 A EQU 0 B EQU 1 .2313 EQU 0 LDMA EQU 0 HDMA EQU 0 SPC 1 TEMP1 EQU CLCD1 TEMP2 EQU C.62 TEMP3 EQU OTAD1 TEMP4 EQU CLCD2 TEMP5 EQU OTAD2 TEMP6 EQU PROC TEMP7 EQU INPUT SPC 1 INTBA EQU 1654B SPC 1 . EQU 1657B ESTABLISHES REF POINT EQT1 EQU .+1 EQT4 EQU .+4 EQT5 EQU .+5 EQT6 EQU .+6 EQT7 EQU .+7 EQT8 EQU .+8 NEG. COUNT OF # OF ENTRIES EQT9 EQU .+9 CURRENT ENTRY TYPE # EQT10 EQU .+10 # BUFFER WORDS IN CURRENT ENTRY EQT11 EQU .+11 1ST BUFFER ADDRESS EQT12 EQU 1771B 2ND BUFFR ADDR(=EQT11 IF NO 2ND) EQT13 EQU 1772B LAST WORD OUTPUT (LAST ADDR DAC) SPC 1 EQT15 EQU 1774B TIME-OUT TIMER SPC 1 CHAN EQU 1673B DUMMY EQU 1737B SPC 3 ******************* * * * END OF DRIVER * * * ******************* SPC 1 END