ASMB,R,L,C HED DVR62D -- 2313B DRIVER FOR RTE SYSTEMS WITH DMS * NAME: DVR62D * SOURCE: 02313-18001 REV.A * RELOC: 02313-16001 REV.A * PGMR: RHB * * *************************************************************** * * (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 DVR62D 02313-16001 REV.A 750505 ENT I.62,C.62 EXT $XDMP SET USER MAP ROUTINE *X* EXT $LPSA LAST PAGE OF S.A.M. *X* EXT $MPFT FENCE TABLE USED TO FIND *X* * LOWEST LEGAL BUFFER ADDR SPC 2 * EXTENDED MEMORY VERSION SPC 2 * THIS DRIVER OPERATES THE 2313B SUBSYSTEM IN THE RTE-III * 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) * * FOR RTE VERSIONS WHICH SUPPORT CLASS I/O A CLASS I/O * EXEC CALL CAN BE MADE IN THE FORMAT: * * FORTRAN: CALL EXEC(ICOD,ICNWD,IQUE,NWORD,N,IPRM,ICLAS) * * * ASSEMBLY: * (NORMAL) (CLASS I/O) * * EXT EXEC EXT EXEC * . . * : . * JSB EXEC JSB EXEC * DEF *+5 DEF *+8 * DEF ICODE DEF ICOD WRITE REQUEST * DEF ICNWD DEF ICNWD * DEF IQUE DEF IQUE * DEF N DEF NWORD SEE NOTE BELOW * DEF N * DEF IPRM (PARAMETER PLACE HOLDER) * DEF ICLASS * * . * : * * WHERE: * * ICODE=2 (NORMAL CALLS ASSUME WRITE PATH) * ICOD =18(CLASS 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 * NWORD=NUMBER OF WORDS IN QUEUE BUFFER ONLY. NOTE THAT ANY * BUFFER POINTED TO BY THE QUEUE BUFFER MUST NOT BE * IN A DISK RESIDENT AREA. IN ADDITION, NO BUFFER * POINTER IN THE QUEUE BUFFER SHOULD POINT TO AN AREA * INCLUDED IN THE QUEUE BUFFER WORDS (NWORDS). THE * QUEUE BUFFER WILL BE MOVED TO SYSTEM MEMORY, AND * ANY POINTERS TO DATA BUFFERS IN THE QUEUE BUFFER WILL * NOT BE RELOCATED TO POINT TO NEW LOCATION OF QUEUE * BUFFER IN SYSTEM MEMORY. IF QUEUE BUFFER * CONTAINS POINTERS TO ELSEWHERE IN QUEUE BUFFER * THESE POINTERS WILL NOT BE ADJUSTED WHEN THE * QUEUE BUFFER IS MOVED TO SYSTEM MEMORY. * IPRM =A PARAMETER PLACE HOLDER * ICLAS=CLASS NUMBER * * * 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 NORMAL * * VERSION TO SUPPORT RTE SYSTEMS WITH EXTENDED MEMORY (GREATER * * THAN 32K). THE NEW CODE IS MARKED WITH *X* (FOR "EXTENDED" * * MEMORY) IN THE COMMENTS FIELD. THIS VERSION IS ENTIRELY * * INCOMPATIBLE WITH NON-MAPPED SYSTEMS. * * * * * ******************************************************************** SKP ************************ * * * INITIATION SECTION * * * ************************ SPC 2 I.62 NOP JSB SSTAT SAVE DMS STATUS AT ENTRY *X* CLB CLEAR THE *X* STB MFLAG THE MAP-OK FLAG. *X* 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 EQT6,I GET REQUEST CONTROL WORD LDB A RBL SSB,SLB,RSS CLASS REQUEST? JMP NORML NORMAL--NOT CLASS REQUEST SPC 1 * CHECK FOR LEGAL CLASS WRITE-READ REQUEST SPC 1 LDB EQT9,I GET FIRST OPTIONAL PARAMETER AND MASK MASK REQUEST CODE CPA CLASS LEGAL CLASS REQUEST? SZB,RSS 1ST OPTIONAL PARAMETER GIVEN? JMP ERROR NO, ERROR STB EQT8,I YES, TAKE AS # OF ENTRIES COUNT JMP CHKQU GO ON TO CHECK QUEUE BUFFER NORML EQU * 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 EQU * CLA READ REQUEST - A=1 FOR RETURN INA (ALSO FOR BAD ENTRIES) JMP I.RTN ERROR RETURN SPC 2 MASK OCT 140077 CLASS REQUEST MASK CLASS OCT 140002 CLASS WRITE REQUEST WORD MFLAG BSS 1 FLAG SET MEANS MAPS SETUP *X* 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), * OTHERWISE 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 ABOVE THE LAST PAGE OF SYSTEM AVAILABLE MEMORY, THEN * IT MUST BE PART OF A DISC PARTITION . NOTE THAT * ALL PAGES OF THE BUFFER ARE CHECKED SO THAT PARTITION NEED * NOT CONSIST OF CONTIGUOUS PAGES. * * THE USER (REPEAT, USER) MAP IS DUMPED TO ACCOMPLISH THIS * TEST. NOTE THAT ALL BUFFERS CHECKED HERE WILL BE VISIBLE * FROM THE USER MAP. (THERE IS NO WAY FOR USER TO GET A * BUFFER INTO S.A.M., EXCEPT FOR CLASS I/O CALL Q-BUFFER * WHICH IS NOT CHECKED HERE....AND MUST NOT BE!!! SPC 2 DRA? NOP ENTRY (A)=ADDRESS,(B)=LENGTH *X* SSA ERROR IF BUFFER ADDR LESS *X* JMP ERROR THAN ZER0 *X* SZB,RSS MAKE ZERO LENGTH BUFFERS *X* INB LOOK LIKE ONE WORD FOR THIS CODE *X* STA TEMP4 *X* ADB A ERROR IF *X* ADB N1 END ABOVE *X* SSB 77777B. *X* JMP ERROR *X* CLA CLEAR A TEMPORARY TO KEEP TRACK *X* STA SETMP OF PAGES IN DISC PART OF MEM *X* LDA TEMP4 PUT FWA IN A, LWA IN B *X* LSR 10 GET PAGE NUMBERS *X* AND B77 AND ISOLATE THEM. *X* SPC 1 CMB GET -NUMBER OF PAGES STRADDLED *X* ADB A BY BUFFER AND *X* STB TEMP4 SAVE AS LOOP COUNTER. *X* ADA P32 CONVERT START PAGE TO MAP# *X* SPC 1 LOOP LDB TEMP. POINT TO PLACE TO DUMP MAP *X* LDX N1 DUMP ONLY ONE REGISTER *X* XMM DUMP MAP TO MEMORY *X* LDB TEMP7 PICK UP MAP REG *X* RBL ERROR OF BIT 14 *X* SSB IS SET. *X* JMP ERROR (WRITE *X* RBR PROTECTED PAGE). *X* SWP MASK TO AND M1777 PHYSICAL PAGE SWP ADDRESS. CMB,INB IF PHYSICAL PAGE ADDR *X* ADB $LPSA IS ABOVE S.A.M *X* SSB THEN INCR COUNTER - MUST BE *X* ISZ SETMP IN DISC AREA. *X* ISZ TEMP4 BUMP COUNTER *X* JMP LOOP AND CONTINUE IF MORE. *X* SPC 1 LDA SETMP IF ANY PAGES IN DISC AREA *X* SZA,RSS THEN RETURN AT P+1 *X* ISZ DRA? ELSE AT P+2 *X* DRADS JMP DRA?,I RETURN TO CALLER *X* SPC 2 N1 DEC -1 *X* P32 DEC 32 *X* TEMP. DEF TEMP7 *X* M1777 OCT 1777 SKP * ** CHECK QUEUE BUFFER ** SPC 1 CHKQU EQU * JSB SETMP SET USER MAP IF NEEDED *X* 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 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 * ** CORE RESIDENT 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. (IF CLASS I/O CALL THEN QUEUE BUFFER IS IN SYS. AV. MEM. * WHICH IS NOT A DISK RESIDENT AREA.) * L2 EQU * STB TEMP6 SAVE (B) ISZ TEMP1 POINT TO BUFFER ADDR LDA EQT6,I GET REQUEST CONTROL WORD RAL ROTATE SIGN BIT TO BIT 0 SSA,SLA,RSS CLASS CALL? (BITS 14 & 15) RSS NORMAL CALL - NOT CLASS JMP CORE YES-BUFFR NOT TO BE IN DISK AREA LDA TEMP3 GET QUEUE ADDR CLB SET LENGTH TO 0 JSB DRA? NORML CALL--CHECK QUEUE LOCATION JMP NOSWP QUEUE IN DISK AREA-NOT SWAPABLE CORE EQU * MAKE SURE BUFFR NOT IN DISK AREA JSB CPASS FETCH BUFFER LENGTH *X* LDA TEMP1,I FETCH BUFFER ADDRESS *X* JSB DRA? CHECK BUFFER LOCATION JMP ERROR BUFFER IS IN DISK AREA -- ERROR JMP NSWP2 BUFFER IS IN CORE AREA *X* SPC 1 NOSWP EQU * QUEUE IN DISC AREA *X* JSB CPASS FETCH BUFFER LENGTH *X* LDA TEMP1,I FETCH BUFFER ADDR *X* JSB DRA? CHECK BUFFER ADDRESS ANYHOW *X* NOP (DON'T CARE IF BUFF IN DISC AREA) *X* NSWP2 EQU * BUFFER NOT IN DISC AREA IF ENTRY HERE*X* LDB TEMP6 RESTORE (B) SSB FIRST BUFFER? JMP L3 NO CPB FOUR YES - TYPE = 4? JMP L4 YES - CHK VALIDITY CPB THREE TYPE = 3? JMP L5 YES - BUFFER OK CMB,INB SET FOR SECOND BUFFER CHECK JMP L2 SPC 2 CPASS NOP *X* LDB TEMP5 GET DATA LEN FROM Q *X* LDA TEMP6 GET TYPE & BUFF NUMBER FLG *X* SSA 1ST BUFFER? *X* JMP PASS2 NO, 2ND *X* CPA SEVEN YES, IF TYPE 7 CALL *X* CLB,INB THEN LENGTH IS 1 *X* CPA EIGHT ELSE IF TYPE 8 *X* LDB TWO THE LENGTH IS 2 *X* JMP CPASS,I RETURN *X* SPC 1 PASS2 CMA,INA 2ND BUFF, COMPL FLAG FOR TYPE *X* CPA NINE IF TYPE 9 *X* CLB,INB THEN 2ND BUFF LEN IS 1 *X* JMP CPASS,I RETURN *X* SPC 1 NINE DEC 9 *X* MIN10 DEC -10 SPC 2 L3 EQU * CMB,INB RECOVER TYPE CPB FIVE TYPE = 5? RSS YES - CHECK VALIDITY JMP L5 NO - BUFFERS OK SKP * ** VALID BUFFER CHECK ** * (BUFFER MUST BE ABOVE START OF SSGA FOR MAPPED SYSTEMS) SPC 1 L4 EQU * LDA MPFT.,I GET MPFT ADDRESS *X* ADA FOUR POINT TO SSGA BASE *X* LDA A,I AND LOAD IT *X* CMA,INA NEGATE ADA TEMP1,I ADD BUFFER ADDR SSA < 0? JMP ERROR YES - IN SYSTEM AREA - ERROR * (UPPER BOUND CHECK DELETED FOR MAPPED SYSTEMS) *X* 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 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 *X* 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 * JSB SETMP MAKE SURE MAP IS SET UP *X* LDA EQT6,I SET CONWD AND BX177 FOR DMA IOR BIT7 OPERATIONS STA EQT6,I WHERE POSSIBLE SPC 1 LDB EQT9,I RAL IF CLASS I/O SSA,SLA,RSS THEN MOVE NUMBER OF RSS ENTRIES TO EQT 8 IN STB EQT8,I PLACE OF BUFF LENGTH SPC 1 LDA CHAN ODD CHANNEL MEANS PORT 0 *X* IOR BIT15 SIGN BIT MEANS COPY USER MAP *X* XMA GO COPY USER MAP TO DMA MAP *X* 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 JSB MAPCK RESET USER MAP IF CHANGED *X* JMP I.62,I THEN RETURN TO SYSTEM *X* SPC 2 THREE DEC 3 FIVE DEC 5 SIX DEC 6 MPFT. DEF $MPFT *X*