ASMB,Q,C,N * HED DVA32 12821 (HPIB) RTE DISC DRIVER * HPIB DISK DRIVER WITH SPECIALS * NAME: DVA32 * SOURCE: 92060-18553 * RELOC: 92060-16553/92067-16506 * PGMR: * J.S.W. -- NEW TRACK MAP FORMAT * J.R.S. -- DMA CONFIG...9895 FIRST STATUS CLEAR * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. 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. * * *************************************************************** * IFN NAM DVA32,0 92067-16553 REV.2013 800129 XIF IFZ NAM DVC32,0 92067-16506 REV.2013 800129 XIF * * * THIS DRIVER OPERATES UNDER THE CONTROL OF * THE I/O CONTROL MODULE OF THE REAL-TIME EXECUTIVE. * THIS DRIVER IS RESPONSIBLE FOR CONTROLLING DATA * TRANSMISSION WITH A MOVING HEAD TYPE DISC FILE. * * THIS DRIVER MAKES THE MOVING HEAD DISC APPEAR TO * HAVE 64 WORD SECTORS, HOWEVER SPEED IS IMPROVED * IF THE DRIVER DOES NOT HAVE TO DO THIS PROCESSING. * * THIS IS DONE BY ALWAYS STARTING A READ REQUEST ON AN * EVEN SECTOR AND BY ENDING WRITE REQUESTS WITHIN. * ODD SECTORS. * * * ALL DATA TRANSFER IS DONE UNDER DMA CONTROL. * THE USER SPECIFIES TRACK AND SECTOR AND * LENGTH OF EACH REQUEST. * * THE USER MAY SPECIFY * CYCLIC CHECKING BE DONE ON WRITE REQUESTS * BY SETING SUBFUNCTION BIT 8 IN THE WRITE REQUEST. * A FAILED CYCLIC CHECK WILL CAUSE THE WRITE TO BE * RETRIED UP TO TEN TIMES. * * * SPECIAL SYSTEM REQUESTS: A GROUP OF TRANSFERS * MAY BE SPECIFIED BY AN INTERNAL SYSTEM * REQUEST (VIA ). THIS REQUEST HAS THE * SPECIAL FORMAT: * * (EQ T7,I) 'CONTAINS A POINTER TO A GROUP OF * 3 OR 4 WORDS CONTAINING THE BUFFER ADDRESS(WORD 1), * LENGTH(WORD 2) AND TRACK/SECTOR(WORD 3 OR IF SIGN * BIT IS SET ON WORD 3 THEN IT IS THE SECTOR (THE SIGN * IS STRIPED) AND WORD FOUR IS THE TRACK) ADDRESS FOR * EACH TRANSFER. THE GROUP OF TRANSFER VECTORS IS * OPEN-ENDED AND IS TERMINATED BY A ZERO-WORD. * ALL TRANSFERS ARE MADE BEFORE A COMPLETION * RETURN TO IS MADE. * * * ************************************************************************** * * CONTROL REGISTER FORMAT FOR 12821 HPIB CARD * * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 * * SRQ IFC REN IRL LBO LBI EOI ATN X NRD PPE P/E P L T CIC * ************************************************************************** * IFN ENT IA32,CA32 EXT $TA32,.MVW,$UPIO XIF IFZ ENT IC32,CC32 EXT $TC32,.MVW,$UPIO XIF * * A EQU 0 A REGISTER B EQU 1 B REGISTER . EQU 1650B BASE PAGE ORIGIN EQTA EQU . EQT1 EQU .+8 I/O R QUEST LIST POINTER EQT2 EQU .+9 INITIATION SECTION ADDRESS EQT3 EQU .+10 COMPLETION SECTION ADDRESS EQT4 EQU .+11 I/O ASSIGNMENT EQT5 EQU .+12 DEVICE STATUS INFO EQT6 EQU .+13 I/O REQUEST INFO EQT7 EQU .+14 REQUEST BUFFER ADDRESS EQT8 EQU .+15 REQUEST BUFFER LENGTH EQT9 EQU .+16 REQUEST TRACK # EQT10 EQU .+17 SECTOR # EQT11 EQU .+18 DRIVER TEMP EQT12 EQU .+81 XMIT LOG EQT13 EQU .+82 NOT USED EQT14 EQU .+83 TIME-OUT VALUE SET BY USER OF RTGEN EQT15 EQU .+84 TIME-OUT CLOCK * IBI EQU 26B SELECT CODE FOR IBI CARD * CHAN EQU .+19 DMA CHANNEL * INTBA EQU 1654B DUMMY EQU 1737B * IF REQ TRACK > LAST TRACK IN SUB OR -1 AND READ * RETURN LAST TRACK AND SECTOR PER TRACK * * SYSTEM TRIPLET FORMAT (XSIO CALL): * * 1ST WORD - REQ BUFFER ADDRESS * 2ND - LENGTH * 3RD - TRACK/SECTOR * TERMINATED BY 0 * * * SKP * I.34 DEC -1 -1 MEANS NO IO IN PROGRESS STA SCODE SAVE DEVICE CODE JMP CONFI CONFIGURE SELECT CODR AND I/O LDA CHAN GET DMA CHANNEL # ADA STF COFIGURE STF DMA STA STFD SET STF DMA ADA B500 STA OTAD CONFIGURE ALL DMA INSTRUCTIONS XOR B1100 STA STCDC START DMA INSTRUCTION XOR B5000 STA CLCD INHIBIT DMA INTERRUPT INSTR STA CLCD1 INHIBIT DMA INTERRUPT INSTR 800114 JRS XOR B4 STA CLCD2 XOR B4000 STA STCD2 XOR B100 * STA OTAD2 STA OTAD3 ADA BM100 STA LIAD2 * *********************************************** * NOW SET UP EXIT FLAGS AND RETURN ADDRESS * ********************************************** * CLA A=0 => I.XX STA XFLAG INDICATE EXIT FLAG STA TFLAG CLEAR TIME OUT FLAG * LDA I.34 GET RETURN ADDRESS STA C.34 SET IT * * SET UP TB34 ENTRY ADDRESS AND CHECK FOR ILLEGAL SUBCHANNEL # * * LDA EQT4,I GET UNIT AND CHANNEL # * IF DMA NOT ASSIGNED REJECT CALL**** * (MAY NOT NEEDED) * SSA,RSS DMA BIT (15) SET? JMP REJCT NO DMA, REJECT IOR BIT12 ENABLE TIME-OUT FOR DRIVER STA EQT4,I SET IT RRR 6 BITS 6-10 HAS UNIT # AND B37 EXTRACT UNIT # STA B SAVE IN B STA SUBC# SAVE SUBCHANNEL# ADB TB34A,I NEG SUBC# SSB,RSS IF POSSITIVE JMP REJCT REJECT * * * 5 WORD PER ENTRY * MPY B5 STA .SUBC SAVE SUBCHANNEL ENTRY ADDRESS * * LDA EQT6,I GET REQUEST CODE AND B3 BIT 0 & 1 HAS ICODE CPA B3 CONTROL REQUEST? JMP $CNTL CONTROL REQ * STA REQC SAVE REQ CODE LDA BM12 RESET COUNTER STA ERCTR ERROR RETRY COUNTER * * * LDA EQT6,I GET REQUEST CODE SYS2 LDB EQT7,I GET BUFFER ADDRESS SSA SYSTEM CALL? JMP SYS YES GO DO SYSTEM CALL * * LNTS LDA EQT6,I GET REQ CODE RAR,CLE,ELA SET RBL,ERB SIGN OF BUFFER ADDRESS TO SHOW DIRECTION STB EQT11,I AND SAVE FOR TRIPLT CALL * LDA EQT8,I GET XFER LENGTH STA EQT12,I SET IT FOR RETURN SSA,RSS MAKE IT NEGATIVE WORD COUNT CMA,INA,RSS ARS IF CHAR COUNT, TAKE HALF STA EQT8,I SET IT UP FOR READ/WRITE SZA CHECK FOR ZERO XFER JMP TIPLT GO PROCESS $TB34 OR SYSTEM TRIPLET * EOXF LDA EQT6,I GET REQ CODE SSA SYYTEM CALL? JMP SYS2 YES SYRTN JSB ENDCM SEND END COMMAND .RTN. LDB EQT12,I GET XMIT LOG CCE,SSB SET TO POSITIVE CMB,INB IF NEGAIVE JMP DONE NO,RETURN ********************************************************** * * CONTROL REQUEST: * SUBFUNCTION=0 => PROGRAM ABORTND SEND IFC * UNADDRESS DEVICE AND IFC * NOT=0=> IGNORE, RETURNS IMMEDIATELY * * ********************************************************** * MASK7 OCT 77774 MASK FOR BITS 3 TO 14 * $CNTL LDA EQT6,I GET REQUEST CODE & SUBFUNCTION AND MASK7 EXTRACT BITS 3-14 SZA,RSS IF ZERO MEANS PROGRAM ABORT JMP CLEAR CLEAR CARD RETURN * JSB $UNLS UNADDRESS DEVICE CB LDA IFCTL SET UP CONTROL REG FOR IFC JSB SETC SET IBI CLC08 CLC IBI CONTROL MODE LIA01 LIA IBI GET STATUS STC08 STC IBI DATA MODE AND BIT7 GET BIT 7 (IFC) SZA CLEAR? JMP CLC08 NO TRY AGAIN CLA CLEAR FIFO JSB CFIFO JMP DONE IMMEDIATE COMPLETION * IFCTL OCT 40001 * CLEAR JSB CFIFO CLA JSB SETC JMP DONE * ********************************************** * * CONSTANT POOL * * ************************************************** EQT# NOP B2 OCT 2 B3 OCT 3 B4 OCT 4 B5 OCT 5 B17 OCT 17 B37 OCT 37 B177 OCT 177 B377 OCT 377 B500 OCT 500 B1100 OCT 1100 B5000 OCT 5000 BIT12 OCT 10000 SET BIT 12 BM100 OCT -100 BM12 DEC -10 B100 OCT 100 B4000 OCT 4000 BIT11 EQU B4000 STF STF 0 REQC NOP REQUEST CODE (1=READ,2=WRITE) SCODE OCT 14 SELECT CODE FOR CARD XFLAG NOP EXIT FLAG: 0 => I.34, NONZERO => C.34 IFN TB34A DEF $TA32 ADDRESS OF TRACK MAP TABLE XIF IFZ TB34A DEF $TC32 ADDRESS OF TRACK MAP TABLE XIF .TB34 NOP POINTER FOR SUBCHANNEL ENTRY TPER NOP RETRY COUNTER ERCTR NOP SECTR NOP # SECTOR PER TRACK MXSIZ NOP # OF WORDS PER TRACK * SUBC# NOP SUBCHANNEL ENTRY# .SUBC NOP SUBCHANNEL ENTRY ADDRESS CHDSC NOP * ******************************************************** * * REJECT CALL,RETURN TO RTIOC * ********************************************************* TEMP NOP TEMPORY STORAGE FOR SYSTEM CALL (XSIO) REJCT EQU * CLA,INA REJECT CALL,A=1 JMP I.34,I REJECT CALL * *********************************************************** * * * SPC 5 SYS STB TEMP SYSTEM TRIPLE PROCESSOR INB STEP TO THE ADDRESS OF LDA B,I LENGTH AND STORE IT IN STA EQT8,I EQT 8 INB STEP TO DISC ADDRESS LDA B,I GET THE ADDRESS RAL,CLE,SLA,ERA IF FOUR WORD ENTRY INB,RSS STEP TO THE TRACK AND SKIP MASK AND B177 MASK THE SECTOR AND STA EQT10,I SET IT IN THE EQT XOR B,I GET THE TRACK ADDRESS ALF,ALF ROTATE TO LOW A RAL SEZ IF FOUR WORD ENTRY USE LDA B,I FULL FOURTH WORD FOR TRACK STA EQT9,I AND SET IN THE EQT INB STEP TO ADDRESS OF NEXT TRIPLET STB EQT7,I AND SET IT IN EQT 7 LDB TEMP,I GET THE BUFFER ADDRESS SZB IF ZERO THEN DONE JMP LNTS AGAIN JSB STATR LDA PPCTL FORCE A DUMMY INTERRUPT JSB SETC P POLL JSB WEXIT JMP SYRTN SEND END COMMAND AND RETURN * * * SKP * TRIPLET PROCESSER-- PROCESS $TB34 INFO :: TRANSLATE LOGICAL TRACK * AND SECTOR WITH SUBCHANNEL INTO PHYSICAL DISK ADDRESS * $TA32 FORMAT: * * WORD * 0 $TA32 NEGATIVE # OF SUBCHANNEL * 1 # OF SECTORS PER TRACK * 2 CYLINDER # OF TRACK 0 * 3 BITS 10-15: # HEADS THIS SUBC * 4-9 : STARTING HEAD# * 3-0 : HPIB DEVICE ADDRESS * 4 # OF TRACKS IN THIS SUBCHANNEL * 5 CONTROLLER/UNIT/ # OF SPARES * (REPEAT 1-5 FOR N SUBCHANNEL) * * EQT8-- REQ LENGTH * EQT9-- REQ TRACK # * EQT10- REQ SECTOR # * SPC 5 B16K OCT 16000 FCODE NOP B2301 OCT 2301 B2200 OCT 2200 UNIT# NOP UNIT # OF THIS HPIB ADDRESS BM10 OCT -10 B2300 OCT 2300 * TIPLT EQU * LDA .SUBC GET SUBCHANNEL ENTRY DISPLACEMENT ADA TB34A ADD TO $TB34 ADDRESS INA STEP 1ST WORD OF $TB34 (COUNTER) STA .TB34 SAVE SUBCH ADDRESS * LDA EQT6,I GET REQUEST CODE CPA B2301 SUBFUNCTION CODE=23 AND READ? JMP FUSTA YES, FULL STATUS AND B2300 EXTRACT BITS 6-10 STA FCODE SAVE FUNC. CODE CPA B2200 SPECIAL CALL? SUBF=22? JMP $SPCL YES, DO SPECIALS * * LDB .TB34,I GET 1ST WORD CONTENT--SECTOR # STB SECTR ISZ .TB34 * CLA PREVENT OVERFLOW ASL 6 SECTOR * 64 TO MAKE WORD PER TRACK STB MXSIZ SAVE IT * * DLD EQT9,I GET TRACK AND SECTOR * SEE IF TRACK = -1 * INA,SZA,RSS *TRACK= -1? JMP CK02 YES DONT REJECT * LDA EQT9,I GET TRACK# SSA,RSS IF EITHER IS NEGATIVE SSB GO REJECT JMP REJCT * CLA ASL 6 REQUEST SECTR *64 CMB,INB MAKE IT NEGATIVE ADB EQT8,I ADD XFER LENGTH ADB MXSIZ SUBTRACT MAX WORD PER TRACK SOS IF REQUEST TOO MANY WORDS SSB JMP REJCT REJECT CALL # * * CK02 EQU * LDA BM12 STA VRER SET ERROR RETRY COUNT LDA .TB34,I GET STARTING CYL # STA CYL01 SAVE IT ISZ .TB34 * * NOW SET UP UNIT # * LDA .TB34 ADDRESS FOR 3 WORD OF TA32 ADA B2 5TH WORD LDA A,I GET CONTENT OF 5TH WORD AND B16K MASK OUT UNIT # ALF PUT UNIT # IN ITS PLACE RAL,RAL STA UNIT# SAVE IT * DLD .TB34,I GET WORD 3,4 OF &TB34 * A HAS HEAD,SURF,UNIT# * B HAS # OF TRACK IN THIS SUBCH AND B17 ISOLATE UNIT # STA ADDRS HPIB ADDRESS * LDA EQT9,I GET TRACK # INA,SZA,RSS IF -1 RETURN LAST TRACK JMP EOT * LDA B # OF TRACKS IN THIS SUBCH CMA,INA NEGATE ADA EQT9,I ADD TO REQ TRACK # TO CHECK SSA IF REQ TRACK > TRACK IN SUBCH JMP CONT NO,OK EOT LDA EQT5,I SET END OF TAPE IN EQT 5 IOR B40 STA EQT5,I UPDATE EQT5 * LDA REQC GET REQUEST CODE SLA,RSS IF WRITE REQUEST JMP XOUT DONT RETURN SECT/TRK * LDA EQT7,I GET IBUFR ADDRESS STA UBUF SAVE IT IN UBUF LDA SECTR GET #SECTR/TRK STA UBUF,I RETURN IT IN IBUF(1) JMP XOUT IMMEDIATE COMPLETION TRACK TOO LARGE * * * * FUSTA-- GET FULL STATUS AND STORE IN IBUFR 1-4 * * * * FUSTA LDB EQT7,I GET IBUFR ADDRESS STB UBUF SET UP POINTER LDA EQT8,I GET LENGTH ADA B2 CHECK IF LENGTH =2 SZA YES,RETURN CURRENT STATUS JMP GT2ST RETURN OLD AND NEW * * CSTAT JSB STATR GET CURRENT STATUS DLD S1 GET S1 S2 DST UBUF,I PUT INTO IBUFR 1,2 LDB EQT8,I JMP DONE * * GT2ST ADA B2 MAKE SURE LENGTH =4 SZA JMP REJCT IF NOT REJECT * ADB B2 IBUFR(3) ADDRESS STB TPBUF SET POINTER DLD S1 GET S1 S2 (OLD) DST TPBUF,I STORE THEM IN IBUF 3 4 JMP CSTAT GET CURRENT STATUS * * * * * CONT EQU * * JSB $UNLS JSB DSJ SEE IF DISK IS READY SZA,RSS IF DSJ NOT 0 CHECK STATUS JMP ST.OK IF ZERO EVERYTHING OK JSB STATR CHECK STATUS RAR,RAR BIT 1 OF S2 SLA SET? JMP NRERR ST.OK LDA .TB34,I GET HEAD& DEVICE ADDRESS ALF,RAL # HEAD IN LOW A RAL SHIFT 6 BITS LEFT TO GET HEAD# AND B77 ISOLATE # OF HEAD STA HEAD# SAVE LDA EQT9,I GET REQ TRACK CLB CLEAR B FOR DIVIDE DIV HEAD# TRACK/# HEADS * A= CYL OFFSET / B= HD OFFSET ADA CYL01 QUOTIENT ADD TO BASE CYLINDER STA TRACK SAVE TRACK # FOR RD.WR COMPARE ASR 8 PUT HEAD# IN BITS 7 TO 15 LDB .TB34,I BLF ADA B AND B374H LDB EQT10,I GET SECTOR CLE,ERB TAKE 1/2 OF IT * ADA B COMBINE HEAD WITH SECTORFOR COMPARE TIPRT STA CHDSC SAVE FOR CYCL CHECK * STA HDSC SAVE IT FOR COMPARE LDB EQT8,I BRING IN THE LENGTH STB TPLN SET IN FOR READ/WRITE LDB EQT11,I AND THE STB TPBUF BUFFER ADDRESS SPC 4 LDA TPLN PRESENT A FOR EVEN SECTOR LDB EQT10,I GET SECTOR CCE,SLB,RSS IF EVEN SECOTR JMP TPNXT NO PATCHING * LDB BUFA ELSE READ LDA DM128 128 WORDS TO JSB RD.WR LOCAL BUFFER LDA HLBUF SET MOVE BUFFER STA LBUFP ADDRESS LDB TPLN GET LENGTH ADB B100 LESS 64 LDA TPLN USE MIN OF REQUEST CLE,SSB AN LDA BM100 64 LDB TPBUF GET ADDRESS ELB,RBR CLEAR SIGN AND SET READ/WRITE JSB MOVE GO MOVE THE WORDS LDA DM128 SET TO WRITE LDB BUFA THE SECTOR SEZ,RSS WRITE REQUEST? JSB RD.WR YES WRITE IT OUT LDA BM100 UPDATE POINTERS * TPA CMA,INA TO REFLECT STA MOVE LAST TRANSFER ADA TPBUF ADJUST BUFFER ADDRESS STA TPBUF TPBUF=TPBUF+(-(-A REGISTER)) LDA MOVE LENGTH THAT HAS BEEN XFERED ADA B100 ROUND UP THE COUNT CLB CLEAR B FOR SHIFT LSR 7 SHIFT TO GET SECTOR COUNT ADA HDSC ADD TO THE CURRENT SECTOR STA HDSC SAVE FOR NEXT ACCESS LDA TPLN GET THE LENGTH ADA MOVE SUBTRACT THE NUMBER XFERED CLE,SSA,RSS IF NON LEFT CHECK JMP CYCK FOR CYCLIC CHECK * STA TPLN SAVE UPDATED LENGTH * TPNXT LDB TPBUF GET BUFFER ADDRESS CLE,SSB READ? JMP TPRD NO GOT TRANSFER LAST WORDS * ADA B100 CCE,SSA,RSS JMP TPB * LDA TPLN YES,TEST FOR MORE THAN/LESS THAN AND B100 64 WORDS MOD 128 LEFT STA B SAVE FLAG ADA TPLN GET LENGTH TO SET FOR XFER CLE,SZB IF LESS THAN 64 MOD 128 LEFT AND DM128 DELETE EXCELL OVER EVEN SECTOR LDB TPBUF GET BUFFER ADDRESS TPRD ELB,RBR SET READ/WRITE FLAG JSB RD.WR DO THE XFER LDA LN.N GET THE LENGTH JMP TPA GO UPDATE THE POINTERS * * TPB LDA DM128 WRITE OF LAST 64 WORD IN LDB BUFA FIRST HALF OF SECTOR STB LBUFP SET UP JSB RD.WR AND READ THE SECTOR LDA TPLN SET UP TO LDB TPBUF MOVE THE USER WORDS JSB MOVE GO MOVE TO THE BUFFER LDA DM128 WRITE THE BUFFER OUT AGAIN LDB BUFA JSB RD.WR * SPC 4 CYCK LDA EQT6,I REQUEST FOR CYLIC CHECK? AND B2002 CPA B2002 AND WRITE? RSS JMP EOXF NO,RETURN * * LDB CHDSC GET HEAD/SECTOR STB HDSC SET IT LDA TRACK GET TRACK JSB SEEK DO A SEEK LDB EQT8,I GET LENGTH CMB,INB CALCULATE # OF SECTORS LDA EQT10,I TRANSFERRED B10 SLA START ODD ADB B100 ADD 64 ADB B177 ROUND UP NEXT HIGHER SECTOR LSR 7 JSB VERFY DO VERIFY JSB STATS GET STATUS JMP BADV BAD NEWS JMP EOXF OK RETURN * * BADV LDA CHDSC ISZ VRER STEP VERIFY ERROR COUNTER JMP TIPRT RETRY JMP PARER TOO MANY! PARITY ERROR * * * * * * * VRER NOP VERIFY RETRY COUNTER B2002 OCT 2002 VERIFY AFTER WRITE REQUEST CODE LBUFA DEF BUF BUFA EQU LBUFA HLBUF DEF BUF+64 HIGH PORTION OF LOCAL BUFFER TPLN NOP TPBUF NOP DM128 DEC -128 B77 OCT 77 B374H OCT 37400 * SKP * * * * * *RD.WR-- READ/WRITE SUBROUTINE * * *READ=01 WRITE=10 IN EQT7 * E=0 => WRITE * E=1 => READ * * B= BUFFER ADDRESS * * A = -LENGTH IN WORDS * * * * * RD.WR NOP * STB UBUF SAVE BUFFER ADDRESS STA LN.N SAVE LENGTH * * SEE IF R/W TO SAME SUBCHANNEL# ,TRACK AND HEAD/SECTOR * LDB SUBC# GET SUBCH # CPB LSUBC SAME AS LAST SUBCH? RSS YES, SAME SUBCH, CHECK TRACK STA LTRK NO,DIFFERENT SUBCH:- SET TO NEGATIVE * TO FAIL NEXT TEST * LDB TRACK GET CURRENT TRACK CPB LTRK SAME AS IN LOCAL BUFFER? LDB BM10 YES B=-8 * LDA BM7 GET COUNT STA TPER INIT ERROR COUNTER * LDA HDSC CHECK THE HEAD/SECTOR CPA LHDSC SAME AS IN LOCAL BUFFER? INB YES B=B+1 LDA LN.N UNDER 129 WORDS? SEZ,RSS IF WRITE JMP WRT1 GO DO WRITE TESTS * ADA D128 REQUEST? CPB BM7 ALL CONDITION MET? SSA MET? JMP RD2 NO GO READ * LDA LBUFA YES SET FOR MOVE CPA UBUF IF DATA IS WANTED IN LOCAL BUFFER JMP CLE CLEAR E AND RETURN * STA LBUFP SET UP FOR LDA LN.N MOVE LDB UBUF JSB MOVE AND MOVE DATA CLE CLE SET E FOR CONTINUATION JMP RD.WR,I RETURN B40 EQU CLE SPC 5 RD2 LDB UBUF READ CPB LBUFA TO LOCAL BUFFER? STB LTRK SHOW LOCAL SECTOR BUFFER EMPTY WRT1 SSB,RSS IF SAME TRACK JMP WRIT DIFFERENT TRACK SKIP * ADA D128 AND REQUEST TO WRITE MORE THAN 128 CLE,SSA,RSS WORDS OR CPB BM7 TO WRITE ON LOACAL SECTOR STB LTRK YES SETR TO SHOW LOCAL BUFF EMPTY * RE.SK ISZ TPER RSS JMP PARER FAILED 6 TIMES GO PARITY ERROR WRIT LDA TRACK SET UP TRACK# & HD/SEC FOR SEEK LDB HDSC JSB SEEK SEEK CYL,HEAD&SECTOR JSB DSJ GET DSJ RESPONSE SZA,RSS ANY ERROR JMP SKOK NO,ERROR JSB STATR RAR,SLA,RAR IF BIT 13 (NOT READY) SET JMP NRERR NOT READY ABORT RAR,SLA IF SEEK CHECK BIT SET JMP RE.SK RE-SEEK RAR,SLA CHECK FIRST STATUS BIT...IF SET RETRY SEEK JMP RE.SK RE-SEEK JRS 800129 * SKOK EQU * * * CALL READ/WRITE TO DO DISK OP * * E=0 FOR READ E=1 FOR WRITE (AFTER CME INSTR) SEZ,CME FLIP E FOR RETRY , IF READ JMP .RD ADDRESS DEVICE JSB WRITE ADDRESS TO LISTEN JMP *+2 .RD JSB READ DO READ * LDA UBUF GET USER BUFFER ADDRESS SEZ,RSS READ? (E=0 FOR READ, E=1 FOR WRITE ) ADA SIGNB SET SIGN IN BUFFER ADDRESS FOR READ * * CALL STDMA TO SET UP DMA, CHECK FOR PRIV. SYSTEM, ENABLE DMA INTR * IF PRIV. SYS. START DMA, WAIT AND ABORT DMA * JSB STDMA DO THE DMA STUFF JSB $UNLS UNADDRESS DEVICE LIAD2 LIA 2 GET DCPC WORD COUNT JSB STATS REQUEST STATUS JMP WRIT ERROR RETRY * LDA UBUF WAS XFER TO LOCAL BUFFER? CPA LBUFA RSS JMP RD.WR,I NO RETURN * LDA TRACK UPDATE ALL FLAGS AND STA LTRK LOCAL BUFFER LDA HDSC DISK ADDRESS STA LHDSC * LDA SUBC# UPDATE LAST SUBCHANNEL# STA LSUBC JMP RD.WR,I RETURN * LSUBC OCT -1 LAST SUBCHANNEL# TRACK NOP LTRK OCT -1 HDSC NOP LHDSC NOP LAST HEAD/SECTOR# LN.N NOP UBUF NOP D128 DEC 128 BM7 OCT -7 * * THE FOLLOWING CODES HANDLE READ/WRITE OPERATION USING DMA IN A PRIV. * SYSTEM. IF PRIV. SYSTEM, INHIBIT DMA INTERRUPT AND SET SIGN BIT * OF INTERRUPT ENTRY IN INTERRUPT TABLE FOR DMA CHANNEL 6 OR 7 * THEN WAIT FOR DMA COMPLETION, ABORT DMA, CLEAR THE ENTRY AND EXIT * IF NOT A PRIV. SYSTEM, SEE IF READ, IF NO, INHIBIT DMA INTERRUPT. * STDMA NOP CLCD2 CLC 2 SET DMA CONTROL OTAD2 OTA 2 SEND BUFFER ADDRESS LDA SCODE GET SELECT CODE OTAD OTA 6 SEND TO DMA LDA LN.N GET XFER LENGTH STCD2 STC 2 SET UP DMA WORD 2 OTAD3 OTA 2 SEND LENGTH * * SEE IF PRIVELEGED SYSTEM, SET BIT 15 OF DMA ASSIGNMENT TO * ENABLE DMA INTERRUPT IN READ . * CLF 0 INTERRUPT OFF STCDC STC 6,C STAT DMA HERE * CLA IF NOT A PRIV. SYSTEM CPA DUMMY IGNORE THE FOLLOWING JMP X NO SPECIAL PROCESSING NEEDED * CLCD CLC 6 INHIBIT DMA INTERRUPT HERE (LET RTIOC DO IT LATER) * SEZ IF WRITE JMP INTON DONT WANT DMA INTERRUPT, JUST WAIT FOR THE CARD * READ LDB INTBA GET INTERRUPT TABLE ADDRESS LDA STCDC FIND OUT CHANNEL 6 OR 7 SLA IF CHANNEL 6 SKIP INB CHANNEL 7 GET SECOND WORD STB .CHAN SAVE THE ENTRY ADDRESS LDA B,I GET CONTENT IOR SIGNB SET SIGN BIT STA B,I RESTORE, SET SIGN BIT INTON STF 0 RE-ENABLE INTERRUPT JMP XWAIT WAIT FOR DMA DONE * X SEZ IF WRITE REQUEST CLCD1 CLC 6 INHIBIT DMA INTERRUPT XWAIT EQU * JSB .WAIT WAIT FOR XFER DONE STFD STF 6 ABORT DMA * * IF PRIV. SYSTEM CLEAR INTERRUPT TABLE ENTRY BIT 15 TO PREVENT * FURTHER INTERRUPT FORM DMA * IF NOT PRIV. SYSTEM RETURN * CLA IF PRIV. SYSTEM CPA DUMMY SKIP TO CLEAR INTBA JMP STDMA,I ELSE RETURN LDA .CHAN,I GET DMA INTERRUPT ENTRY ADDRESS AND SMSK MASK OUT SIGN BIT STA .CHAN,I PUT IT BACK JMP STDMA,I * SMSK OCT 77777 CLEAR SIGN BIT MASK .CHAN NOP *