ASMB,R,L,C HED RTE DVR36 WCS DRIVER -- INITIATION SECTION NAM DVR36 RTE DVR36 13197-16001 REV.A 751221 ENT I.36,C.36 SUP * * ********************************************************* * * (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. * * ********************************************************* * * * ***************************************** * * * I N I T I A T I O N S E C T I O N * * * ***************************************** * * ENTRY: * LDA * JSB I.36 * * EXIT: * A=0: OPERATION INITIATED. XFER CONTROL TO C.36 ON DMA OR * TIMER INTERRUPT * 1: (NOT USED) * 2: ILLEGAL RQ OR CONTROL-RQ SUBFUNC CODE * 3: "INOPERABLE DEVICE" -- NO CORRESPONDING ST ENTRY. * HIGHLY UNLIKELY ERROR; OCCURS ONLY WHEN THERE ARE * MORE THAN 32 SUBCHANNELS * 4: IMMEDIATE COMPLETION * B=TRANSMISSION LOG (ONLY IF A=4) * * * OCT 113 VERSION NUMBER: YEAR OCT 1425 BITS 9-6=MONTH...BITS 5-0=DAY I.36 NOP ?I1 JMP FIRST ZAPPED AFTER FIRST TIME STA SC SAVE SELECT CODE CLA CLEAR DYNAMIC STATUS STA &XSTA,I * GET STATE TABLE ADDRESS LDA &UNIT,I GET SCHNL LSR 6 AND =B37 STA SCHNL ADA STX PTR TO ST ENTRY OFFSET LDB &STAD,I SZB,RSS JMP NOST NO ST ENTRY (VERY RARE) ADB A,I PTR TO ST ENTRY STB @ST * GO TO APPROPRIATE I/O SECTION LDA &CNTL,I GET RQ CODE AND =B77 CPA =D1 JMP IREAD CPA =D2 JMP IWRIT CPA =D3 JMP ICNTL * *************************** * EXIT INITIATION SECTION * *************************** * BADRQ EQU * ILL RQ CODE LDA =D1 JMP I.36,I ABORT * NOST EQU * NO ST ENTRY LDA =D3 JMP I.36,I ABORT * BADAD EQU * BAD WCS ADDR LDA =B3 STA &XSTA,I JMP IEXIT * VIOL EQU * WCS ADDR CONFLICT (ASSIGN/ENABLE) LDA =B7 STA &XSTA,I JMP IEXIT * NOBUF EQU * BUFFER TOO SMALL (READ STATE) LDA =B13 STA &XSTA,I JMP IEXIT * BADST EQU * I/O OR ENABLE RQ ON UNKNOWN SCHNL LDA =B15 STA &XSTA,I JMP IEXIT * NRESP EQU * NON-RESPONDING DMA LDA =B17 STA &XSTA,I * IEXIT EQU * NO XMISSN: CONTROL (& STATE) EXIT CLA RETURN 0 XMISSION STA &WCNT,I DDONE EQU * DMA XMISSN COMPLETE CLA FAKE XMISSN RESIDUE STA COUNT IDONE EQU * COMPLETION EXIT JSB TIO B=XMISSN LOG LDA =D4 JMP I.36,I DONE * IPAUS EQU * TIME-OUT EXIT JSB SAVE CLA JMP I.36,I WAIT FOR INTERRUPT * * *************** * LOGICAL I/O * *************** * * ****************************** * * I R E A D * * EXEC CALL: * JSB EXEC * DEF *+6 * DEF RCODE * DEF CONWD * DEF BUFR * DEF LEN * DEF WCSAD * : * RCODE DEC 1 * CONWD DEC * BUFR BSS <2W, W=# MICROWORDS> * LEN DEC <2W OR -4W> * WCSAD OCT * IREAD EQU * READ OR STATUS RQ LDA &CNTL,I GET SUBFUNC FIELD AND ENSURE CLB EXTRANEOUS BITS ARE NOT SET LSR 6 CPA =D1 JMP STATE READ STATE RQ SZA JMP BADRQ ILL RQ CODE JSB UNKN? DOWN STATE OR DOWN 12978'S? JMP BADST YES: DON'T ALLOW I/O JSB SIO LDA &UNIT,I DMA ASSIGNED? SSA,RSS JMP IR.1 NO JSB GTSC GO TO APPROPRIATE DMA DVR DEF DR1K DEF DR1K DEF IR256 ALWAYS NON-DMA IR.1 EQU * JSB GTSC GO TO APPROPRIATE NON-DMA DVR DEF IR1K DEF IR1K DEF IR256 * DR1K EQU * DMA 1K READ JSB SET1K SET UP 1K BOARD CLA,CCE A=CWD1 INDICATES NO STC/CLC JSB DMA E=1 FOR READ JSB XFR1K DO DMA TRANSFER JMP DDONE * IR1K EQU * NON-DMA 1K READ JSB SIO1K INITIALIZE TRANSFER JSB NR1K JMP IDONE DONE JMP IPAUS TIME-OUT * IR256 EQU * NON-DMA 1/4K READ JSB NODMA RETURN DMA CHANNEL JSB NR256 JMP IDONE DONE JMP IPAUS TIME-OUT * * ****************************** * * I W R I T * * EXEC CALL: * JSB EXEC * DEF *+6 * DEF RCODE * DEF CONWD * DEF BUFR * DEF LEN * DEF WCSAD * : * RCODE DEC 2 * CONWD OCT * BUFR BSS <2W, W=# MICROWORDS> * LEN DEC <2W OR -4W> * WCSAD OCT * IWRIT EQU * JSB UNKN? DOWN STATE OR DOWN 12978'S? JMP BADST YES: DON'T ALLOW I/O LDA &CNTL,I ENSURE EXTRANEOUS BITS ARE NOT SET AND =B177600 SZA JMP BADRQ JSB SIO LDA &UNIT,I DMA ASSIGNED? SSA,RSS JMP IW.1 NO JSB GTSC GO TO APPROPRIATE DMA DVR DEF DW1K DEF DW1K DEF IW256 ALWAYS NON-DMA IW.1 EQU * JSB GTSC GO TO APPROPRIATE NON-DMA DVR DEF IW1K DEF IW1K DEF IW256 * DW1K EQU * DMA 1K WRITE JSB SET1K SET UP 1K BOARD CLA,CLE A=CWD1 INDICATES NO STC/CLC JSB DMA E=0 FOR WRITE JSB XFR1K DO DMA TRANSFER JSB VERF? CHECK FOR VERIFY OPTION JMP DDONE NO VERIFY RQ JSB NODMA RETURN DMA TO SYSTEM JSB SIO1K RE-INITIATE I/O JMP IPAUS * IW1K EQU * NON-DMA 1K WRITE JSB SIO1K INITIALIZE TRANSFER JSB NW1K JMP *+2 DONE--CHECK FOR VERIFY RQ JMP IPAUS TIME-OUT JSB VERF? JMP IDONE NO VERIFY RQ JSB RESET JSB SIO1K RE-INITIATE I/O JMP IPAUS TIME-OUT * IW256 EQU * NON-DMA 1/4K WRITE JSB NODMA RETURN DMA CHANNEL JSB NW256 JMP *+2 DONE--CHECK FOR VERIFY RQ JMP IPAUS TIME-OUT JSB VERF? JMP IDONE NO VERIFY RQ JSB RESET JMP IPAUS TIME-OUT * * ****************************** * * I C N T L * ICNTL EQU * LDA &CNTL,I GET SUBFUNC FIELD AND ENSURE CLB EXTRANEOUS BITS ARE NOT SET LSR 6 CPA =D1 JMP ASSGN CPA =D2 JMP ENAB CPA =D3 JMP DISAB CPA =D4 JMP DNRQ JMP BADRQ ILL CNTL RQ * * ****************************** * * A S S G N * * EXEC CALL: * JSB EXEC * DEF *+4 * DEF RCODE * DEF CONWD * DEF WCSAD * : * RCODE DEC 3 * CONWD OCT * WCSAD OCT * * FOR HP12978A, ACCEPT ASSIGN REQUEST ONLY IF 1/4K BOARD IS IN DOWN STATE * OR ADDRESS IS SAME AS CURRENT BASE ADDRESS. SET HP12978A ENABLED. FOR * HP13197A IS IN DOWN STATE, SET DISABLED. * * NOTE THAT WCSAD WILL BE PASSED THROUGH &BUFR IN THE EQT. * * WE USE 'FLAG' HERE TO INDICATE WHETHER ADDRESS CONTENTION CHECK * SHOULD BE MADE ON DOWNED BOARD. FOR HP13197A, WE DON'T HAVE TO * SINCE BOARD WILL COME UP DISABLED. BUT FOR HP12978A, WE MUST * SINCE BOARD IS ALWAYS ENABLED. * ASSGN EQU * JSB GTSC CASE ON SCHNL DEF A.1K DEF A.1K DEF A.256 1/4K BOARD * A.1K EQU * PHYSICALLY ASSIGN ADDR TO 1K BOARD CLA SET 'FLAG' FOR "DISABLED" STA FLAG LDA =B177000 JSB A.BAS ADJUST BASE ADDR AND CHECK JSB A.SET SET BASE ADDR IN ST ENTRY JSB DOWN? JSB DABLE YES: LOGICALLY DISABLE ALL SCHNLS JSB BASES A=SCHN1 BASE ADDR, B=SCHN0 BASE ADDR ALF,ALF RAR,RAR (WE SHIFT AGAIN BELOW) IOR B RAR JSB A1K SEND BLOCK NUMBERS JMP IEXIT * A.256 EQU * CLA,INA SET 'FLAG' FOR "PSEUDO-DISABLED" STA FLAG LDA =B177400 JSB A.BAS ADJUST BASE ADDR AND CHECK JSB DOWN? JMP A.OK LDA @ST,I NO: CHECK FOR SAME BASE ADDR AND =B177 ALF,ALF CPA BASE JMP IEXIT THE SAME: BOARD IS ALREADY ENABLED JMP BADAD NOT THE SAME: REJECT ASSIGN RQ A.OK EQU * LOGICALLY ALTER STATE OF 1/4K BOARD JSB A.SET ON RETN, A=ST ENTRY AND =B117777 (ASSUME PRIOR DOWN STATE) STA @ST,I LDA #UNKN REDUCE UNKN COUNTER SSA,INA STA #UNKN JMP IEXIT * A.BAS NOP INTERNAL SUBR. A=BASE ADDR MASK. AND &BUFR,I ISOLATE BLOCK/MODULE NUMBER SSA JMP BADAD ERROR: WCS ADDR<0 STA BASE LDB @ST,I SCHNL ENABLED? BLF,RBR SSB,SLB DOWN (NEITHER BIT 0)? LDB FLAG YES: USE FLAG CMB,SSB,SLB ENABLED OR PSEUDO-DISABLED? JMP A.BAS,I NO--OK TO PROCEED LDB @ST CHECK FOR CONFLICTS WITH OUR SCHNL JSB DUPE? (SISTER SCHNLS WERE CHECKED PREVIOUSLY) JMP VIOL ERROR: CONFLICTING ADDR SPACES JMP A.BAS,I * A.SET NOP SET BASE ADDR IN ST ENTRY LDA @ST,I AND =B177600 LDB BASE BLF,BLF IOR B STA @ST,I JMP A.SET,I A=ST ENTRY * * ****************************** * * D I S A B * * EXEC CALL: * JSB EXEC * DEF *+3 * DEF RCODE * DEF CONWD * : * RCODE DEC 3 * CONWD OCT * * ALGORITHM: * 1.0 IF DOWN, IGNORE REQUEST WITHOUT ERROR (ESSENTIALLY DISABLED * ALREADY) * 1.1 IF 12978A (AND NOT DOWN), REQUEST HAS NO AFFECT SINCE CANNOT * DYNAMICALLY ALTER CONTROL STATE. RETURN PSEUDO-DISABLE ERROR * BUT DO NOT ALTER STATE TABLE. * 1.2 IF 13197A (AND NOT DOWN), DYNAMICALLY DISABLE BOARD OR SET * PSEUDO-DISABLE SUBCHANNEL IF BROTHER SUBCHANNEL IS ENABLED. * (IF THERE ARE UNKNOWN 12978A'S, WE DON'T HAVE TO DO THIS * SINCE WE KNOW THAT NO ENABLE REQUEST HAS BEEN HONORED. * NONETHELESS, WE IGNORE THIS DEGENERATE CASE.) * DISAB EQU * JSB DOWN? INACTIVE SCHNL? JMP IEXIT YES: IGNORE RQ WITHOUT NOTICE JSB GTSC CASE ON SCHNL DEF D.1K DEF D.1K DEF D.2 1/4K BOARD: RETURN PSEUDO-DISABLE ERROR * D.1K EQU * JSB EN? BROTHER SCHNLS ENABLED? JMP D.PSD YES: PSEUDO-DISABLE THIS ONE JSB DABLE NO: LOGICALLY DISABLE ALL SCHNLS JSB DS1K PHYSICALLY DISABLE 1K BOARD JMP IEXIT * D.PSD EQU * PSEUDO-DISABLE BOARD LDA @ST,I AND =B147777 CLEAR ENABLE BIT IOR =B060000 SET PSEUDO-DISABLE BIT STA @ST,I D.2 EQU * SET PSEUDO-DISABLE ERROR LDA =B11 STA &XSTA,I JMP IEXIT * * ******************************** * * E N A B * * EXEC CALL: * JSB EXEC * DEF *+3 * DEF RCODE * DEF CONWD * : * RCODE DEC 3 * CONWD OCT * * WE FILTER "UNKNOWN" SUBCHANNELS FIRST: NO SUBCHANNEL MAY BE ENABLED * UNTIL THE STATE OF ALL 12978A BOARDS IS KNOWN (BY ASSIGNING A BASE * ADDRESS OR DISABLING) AND UNTIL THE STATE OF THE CURRENT SUBCHANNEL * IS KNOWN (BY ASSIGNING A BASE ADDRESS). THESE RESTRICTIONS ARE * NEEDED: (1) TO ENSURE THE INTEGRITY OF THE ADDRESS CONTENTION CHECKS * (SINCE THE 12978A BOARD IS ALWAYS ENABLED, WE CANNOT PREVENT ADDRESS * CONFLICTS UNTIL WE ARE MADE AWARE OF THEIR ADDRESS SPACE), AND (2) TO * ENSURE THAT DYNAMICALLY CONFIGUARABLE BOARDS (EG., 13197A) HAVE BEEN * ASSIGNED BLOCK NUMBERS PRIOR TO ENABLING. * * IF 12978A (1/4K) BOARD, WE ACCEPT REQUEST BUT IT HAS NO AFFECT. THIS * IS BECAUSE BOARD MUST ALREADY BE ENABLED (SINCE WE ENABLED BOARD WHEN * ADDRESS WAS ASSIGNED). * ENAB EQU * JSB UNKN? DOWN STATE OR DOWN 12978'S JMP BADST YES: DON'T ALLOW ENABLE JSB #SCHN GET # SCHNLS (NEGATIVE) STA CNT1 STA CNT2 FOR E.PSD SUBR LDB &STAD,I STB @PTR E.LP1 EQU * CHK FOR CONFLICTS WITH EACH SISTER SCHNL LDA @PTR,I IF SCHNL IS NOT DISABLED, NO NEED ALF,RAR TO CHECK FOR CONFLICTS: DONE BEFORE CMA,SSA,SLA,RSS BOTH BITS RESET (=DISABLED)? JMP E.NX1 NO: IGNORE NON-DISABLED SCHNL LDA @PTR,I ST ENTRY AND =B177 CONVERT MODULE NUMBER... ALF,ALF ...TO BASE ADDR LDB @PTR PTR TO ST ENTRY JSB DUPE? JMP VIOL CONFLICT E.NX1 EQU * ISZ @PTR ISZ CNT1 JMP E.LP1 JSB GTSC CASE ON SCHNL DEF E.1K DEF E.1K DEF IEXIT 1/4K BOARD: ALREADY ENABLED * E.1K EQU * 1K BOARD JSB BASES A=SCHNL1 MOD#, B=SCHNL0 MOD# ALF,ALF CONVERT MODULE NUMBERS... BLF,BLF ...TO BASE ADDRS JSB DJNT? CONFLICT BETWEEN SCHNLS? DEC 1 DEC 0 JMP VIOL YES: NOT DISJOINT JSB E.PSD NO: PSEUDO-DISABLE SISTER SCHNLS JSB EN1K PHYSICALLY ENABLE BOARD LDA @ST,I LOGICALLY ENABLE SCHNL AND =B147777 IOR =B010000 STA @ST,I JMP IEXIT * * INTERNAL SUBROUTINE: SET DISABLED SISTER SCHNLS TO PSEUDO-DISABLE. * THIS ROUTINE IS CALLED ONLY FOR DEVICES WITH INTERDEPENDENT SCHNLS * WHICH CANNOT BE INDIVIDUALLY DISABLED/ENABLED. * E.PSD NOP LDB &STAD,I E.LP2 EQU * PSEUDO-DISABLE OTHER SCHNLS LDA B,I ENABLED? ALF,SLA JMP E.NX2 LDA B,I NO: SET PSEUDO-DISABLE BIT IOR =B020000 STA B,I E.NX2 EQU * INB ISZ CNT2 JMP E.LP2 JMP E.PSD,I * * ****************************** * * D N R Q * * EXEC CALL: * JSB EXEC * DEF *+3 * DEF RCODE * DEF CONWD * : * RCODE DEC 3 * CONWD OCT * * CALLED BEFORE :DN'ING BOARD (IE., REMOVING FROM MAINFRAME). WE SET DOWN * STATE FOR TWO REASONS: (1) EXCLUDE SUBCHANNELS FROM ADDRESS CONTENTION * CHECKS, AND (2) PREVENT SUBSEQUENT ACCESS TO BOARD WITHOUT PRIOR ASSIGNMENT * OF BASE ADDRESS. FOR 13197A (1K) BOARD, WE ALSO PHYSICALLY DISABLE BOARD. * WE DO NOT REQUIRE THAT BOARD IS IN INACTIVE STATE AT THE TIME ON THE * ASSUMPTION THAT IF USER IS ABOUT TO REMOVE BOARD, HE MUST HAVE FULL * CONTROL OVER IT. FOR 12978A (1/4K) BOARD, WE MUST INCREMENT "UNKN" * COUNTER. * DNRQ NOP JSB SETST SET ALL SCHNLS TO DOWN STATE OCT 030000 JSB GTSC CASE ON SCHNL DEF DN.1K DEF DN.1K DEF DN256 1/4K BOARD * DN.1K EQU * PHYSICALLY DISABLE 1K BOARD JSB DS1K JMP IEXIT * DN256 EQU * DECREMENT "UNKN" COUNTER LDA #UNKN SSA,INA INCREMENT IF NEGATIVE STA #UNKN JMP IEXIT * * ****************************** * * S T A T E * * EXEC CALL: * JSB EXEC * DEF *+5 * DEF RCODE * DEF CONWD * DEF STATE * DEF LEN * : * RCODE DEC 1 * CONWD OCT * STATE BSS 2 * LEN DEC <2 OR -4 (OR GREATER)> * * NOTE THAT THIS IS A READ REQUEST. THIS IS SO THAT WE CAN * RETURN INFORMATION TO THE CALLER. THE LENGTH OF STATE AND * THE SIZE OF LEN MAY EXCEED TWO WORDS. * STATE EQU * LDA &LEN,I CHECK BUFLEN SSA,RSS BYTE COUNT? JMP S.CHK CMA,INA YES INA ROUND UP TO WORD ARS S.CHK EQU * ADA =D-2 BUFLEN>=2? SSA JMP NOBUF NO LDA @ST,I FORMAT SCHNL & STATUS LSR 7 AND =B177 LDB &BUFR,I STA B,I INB LDA @ST,I FORMAT BASE ADDR AND =B177 ALF,ALF STA B,I JMP IEXIT * * *************** * SUBROUTINES * *************** * * ****************************** * * B A S E S * * EXIT: * A= BASE ADDR FOR SCHNL 1 * B= BASE ADDR FOR SCHNL 0 * * PICKS UP BASE MODULE #'S FOR 2-SCHNL DEVICE (EG., 1K BOARD) AND PUTS INTO * A & B REGISTERS. * BASES NOP LDB &STAD,I PTR TO ST ENTRIES LDA B,I FIRST ST ENTRY AND =B177 BASE ADDR FOR SCHNL 0 SWP INA LDA A,I SECOND ST ENTRY AND =B177 BASE ADDR FOR SCHNL 1 JMP BASES,I * * ****************************** * * D A B L E * * LOGICALLY DISABLE ALL SISTER SUBCHANNELS. APPLIES TO ALL INTERCONNECTED * SUBCHANNELS (EG., 13197A). * DABLE NOP JSB SETST DISABLE ALL SCHNLS OCT 0 JMP DABLE,I * * ****************************** * * D J N T ? *