ASMB,R,L,C NAM DVR24 ENT I.24,C.24 * * * M. SCHOENDORF 8/31/73 REV. B * M. SCHOENDORF 3/28/74 REV. C * G. SPRADER 5/ 2/74 REV. D * R. CHIPMAN REV. 1813 * * * * SOURCE TAPE 25117-80687 * HED ** HP 7970 7 TRACK MT RTE DRIVER ** ,[HJF,4/16/72] * INITIATION SECTION. SPC 1 I.24 NOP ENTRY POINT LDB EQT11,I LOAD THE "EOT" FLAG WORD. M5600 ELB *SHIFT THE FLAG INTO "E". LDB CHAN LOAD THE "DMA" CHANNEL NUMBER. ELB,CLE,RBR *INCLUDE THE "EOT" FLAG BIT. STB EQT11,I *STORE THE "EOT" FLAG WORD JSB SETIO SET I/O INSTRUCTIONS FOR MT. STA C.24 SET THE INITIATOR FLAG LDA N3 LOAD: A=-3. STA EQT10,I SET THE ERROR RETRY COUNTER. LDA EQT6,I LOAD REQUEST CONTROL WORD AND DEC64 ISOLATE MODE BIT CCE,SZA BCD? CLA,CME NO! ERA YES! STA BCD,I BCD FLAG = 100000 FOR BCD LDA EQT6,I LOAD THE REQUEST CONTROL WORD. AND DEC3 ISOLATE THE REQUEST CODE. CPA DEC3 *IS REQUEST A CONTROL REQUEST? JMP R3 *YES, GO EXAMINE FUNCTION CODE. SLB,RBR *IS UNIT IN LOCAL MODE? JMP I.A.3 YES, GO DOWN THE UNIT. SLA,ARS *NO; IS THE REQUEST TO READ? JMP READ YES, CONTINUE. RBR,SLB NO; IS WRITE ENABLE RING IN? JMP I.A.3 NO, GO REJECT THE REQUEST. JSB CEOT *GO CHECK FOR END-OF-TAPE (EOT). JSB NBUFL GO GET THE NEGATIVE WORD COUNT. SZB,RSS IS THE BUFFER LENGTH = 0? JMP I.A.4 YES, GIVE IMMEDIATE COMPLETION. * M5000 BLS *CONVERT TO CHARS(-) LDA BCD,I *GET THE BCD FLAG. SSA,RSS *BINARY MODE ? JMP M1100-1 *YES! SKIP LIMIT CHECK . SEZ ODD # OF CHARACTERS? ADB M1 *YES! ADD ONE CHARACTER . ADB M4 *B= -[# OF CHARACTERS] + 4 ADB P130 *YES! SSB *MORE THAN 134 CHARACTERS? CLB *YES FORCE 134! ADB M134 *NO! LDA B *A= -[# OF CHARACTERS TO WRITE] CMA,SZA *ONE OR CPA M1 * TWO CHARACTERS ? LDA DEC3 *YES! ADJUST FOR FOUR CMA,RSS * CHARACTERS TO BE WRITTEN. LDA B *A= -[# OF CHARACTERS TO WRITE] M1100 ARS *A= -[# OF WORDS] STA EQT13,I *SAVE THE NEGATIVE WORD COUNT. LDA BCD,I GET BCD FLAG REJ CLE,SSA,RSS *BCD MODE ? JMP BINRY *NO! GO WRITE BINARY * * CONVERT FROM ASCII TO BCD * LDA EQT7,I *GET ADDRESS OF USERS BUFFER STA PAKUN *USE PAKUN AS POINTER * * ASSIGN AN INTERNAL (DRIVER) BUFFER * TO A DMA CHANNEL * JSB WBUF *GET INTERNAL BUFFER ADDRESS STA BPNTR *SAVE IT. * INA * STA CLC.0 *SAVE INTERNAL BUF ADDRESS + 1 . LDA DBLNK *GET DOUBLE BLANK. STA CLC.0,I *SET INTO 2ND WORD. * LOOP LDA PAKUN,I GET UPPER CHAR ALF,ALF MOVE DOWN AND M77 CUT OFF UPPER CHARACTER ADA TBLAD ADD TABLE ADDRESS LDA A,I GET EQUIV AND M37.4 *KEEP UPPER SIX BITS. INB,SZB ALL DONE? JMP *+4 NO, GO AND DO NEXT XOR O20 YES, PUT BCD BLANK IN LAST CHAR CCB SET B=-1 TO FORCE EXIT JMP SECND STORE LAST WORD STA STAT. STORE TEMPORARILY LDA PAKUN,I GET LOWER CHAR AND M77 CUTOFF UPPER CHAN ADA TBLAD ADD TABLE ADDRESS LDA A,I GET EQUIV ALF,ALF MOVE AROUND AND M77 KEEP SIX. IOR STAT. ADD IN UPPER CHAR SECND STA BPNTR,I PLACE CHARS IN DVR BUFFER ISZ PAKUN INCREMENT USER BUFFER POINTER ISZ BPNTR INCREMENT DVR BUFF POINTER INB,SZB DONE? JMP LOOP NO, GO BACK JSB WBUF *GET INTERNAL BUFFER ADDRESS CLE,RSS *RESTORE READ/WRITE FLAG TO WRITE SPC 1 BINRY LDA EQT7,I LOAD OUTPUT BUFFER ADDRESS STA EQT7,I *SAVE OUTPUT BUFFER ADDRESS[REJ] JSB IODMA GO PERFORM THE OPERATION. LDB M301 LOAD: WRITE COMMAND CODE ADB BCD,I ADD BIT 15 IF BCD MODE LDA .1 *LOAD THE INTERRUPT RETURN. JSB FUNCT GO INITIATE THE FUNCTION. DEF REJ *REJECT INTERRUPT RETURN ADDRESS. * DBLNK OCT 010020 N3 DEC -3 N6 DEC -6 M134 DEC -134 M1 OCT 1 M4 OCT 4 P130 DEC 130 M301 OCT 301 M37.4 OCT 37400 O20 OCT 20 BCD BLANK * * WBUF NOP *ENTRY. LDA EQT11,I *GET THE DMA CHANNEL WORD. AND M7 *ISOLATE THE DMA CHANNEL #. ADA N6 *SUBTRACT SIX. ADA BUFRS *ADD THE INTERNAL BUFFER POINTER. LDA A,I *A=ADDRESS OF DVR INTERNAL BUFFER. JMP WBUF,I *RETURN. * * BUFRS DEF *+1 DEF OBUF1 (USED BY DMA CH 6) IFZ DEF OBUF2 (USED BY DMA CH 7) XIF DEF OBUF1 (USED BY DMA CH 7) * .1 DEF ..1 ..1 JSB CHECK *ANY PARITY ERRORS? ..4 LDB DEC5 YES, LOAD: BACKSPACE COMMAND. LDA .5 LOAD THE INTERRUPT RETURN. JSB FUNCT GO INITIATE THE FUNCTION. DEF ..4 *REJECT INTERRUPT RETURN ADDRESS. * ..5 LDA .20 LOAD THE INTERRUPT RETURN. LDB M121 LOAD: GAP COMMAND CODE JSB FUNCT GO INITIATE THE FUNCTION. .5 DEF ..5 REJECT, INTERRUPT ADDRESS RETURN. * * * .20 DEF ..20 ..20 LDA EQT5,I LOAD THE MT UNIT STATUS. AND M22 GET PARITY & TIMING BITS SZA WERE THERE ANY ERRORS? JMP W.ERR YES, GO ABORT THE REQUEST. JSB CEOT NO, GO CHECK FOR END-OF-TAPE. JMP BINRY *TRY TO WRITE AGAIN SPC 2 READ CPA EQT8,I IS THE BUFFER LENGTH = ZERO(0)? JMP SKIP. YES, GO CHECK THE MODE. JSB EOTF NO, GO CHECK FOR "EOT" CONDITION. ..6 JSB NBUFL GO GET THE NEGATIVE WORD COUNT. CCE *SET "E" TO INDICATE DMA INPUT. LDA EQT7,I LOAD THE USER BUFFER ADDRESS. JSB IODMA GO PERFORM THE OPERATION. LDB M203 LOAD: READ COMMAND CODE ADB BCD,I ADD BIT 15 IF BCD MODE LDA .7 LOAD THE INTERRUPT RETURN. JSB FUNCT GO INITIATE THE FUNCTION. .6 DEF ..6 REJECT, INTERRUPT ADDRESS RETURN. * M203 OCT 203 * .7 DEF ..7 ..7 LDA BCD,I *GET XMISSION COMPLETE FLG. RAR,SLA *CONVERSION DONE YET? RSS JMP TLOG *NO! JSB CHECK *CHECK FOR R/W PARITY ERRORS. ..7.5 ISZ EQT10,I IS THIS THE LAST RETRY? JMP *+2 *NO! SKIP. JMP FINI *UPDATE THE TRANSMISSION LOG. ..8 LDB DEC5 LOAD: BACKSPACE COMMAND LDA .6 LOAD THE INTERRUPT RETURN. JSB FUNCT GO INITIATE THE FUNCTION. DEF ..8 REJECT, INTERRUPT ADDRESS RETURN. * DEC5 DEC 5 * SKIP. LDA EQT6,I LOAD THE FUNCTION REQUEST CODE. AND DEC64 ISOLATE THE MODE BIT. SZA IS THE MODE BINARY? JMP FSR YES, GO SKIP FORWARD 1 RECORD. CLB I.A.4 LDA DEC4 LOAD: A=4. IMMEDIATE COMP. JMP I.24,I RETURN TO THE USER;B=X-LOG SPC 2 R3 LDA EQT6,I GET THE REQUEST CONTROL WORD. AND M1700 *ISOLATE THE FUNCTION CODE. CPA M600 IS IT A DYNAMIC STATUS REQUEST? JMP I.A.4-1 *YES, GIVE AN IMMEDIATE RETURN. SLB,RBR IS THE UNIT IN LOCAL MODE? JMP I.A.3 YES, THEN DOWN UNIT. CPA M200 *NO; IS IT A BACKSPACE REQUEST? JMP BSR YES, CONTINUE. CPA M300 NO; IS IT FORWARD SPACE REQUEST? JMP FSR YES, CONTINUE. CPA M400 NO; IS IT A REWIND REQUEST? JMP REW YES, CONTINUE. CPA DEC64 NO; WRITE END-OF-FILE REQUEST? JMP EOF YES, CONTINUE. CPA M1200 NO; IS IT A GAP REQUEST? JMP GAP YES, CONTINUE. CPA M1300 NO; IS IT FORWARD SPACE FILE? JMP FSF YES, CONTINUE. CPA M1400 NO; IS IT BACKSPACE FILE? JMP BSF YES, CONTINUE. CPA M500 IS IT A REWIND/STANDBY REQUEST? JMP RWS YES, CONTINUE. JMP I.A.2 NO, GO REJECT THE REQUEST. * M77 OCT 77 DEC64 DEC 64 @100 M200 OCT 200 M300 OCT 300 M400 OCT 400 M600 OCT 600 M1200 OCT 1200 M1300 OCT 1300 M1400 OCT 1400 M1700 OCT 1700 * BSR JSB CSOT *GO CHECK FOR "BOT" CONDITION. JSB RWCHK CHECK IF REWINDING ..9 LDB DEC5 LOAD: BACKSPACE COMMAND LDA .10 LOAD THE INTERRUPT RETURN. JSB FUNCT GO INITIATE THE FUNCTION. DEF ..9 REJECT, INTERRUPT ADDRESS RETURN. .10 DEF ..10 * FSR JSB CEOT GO CHECK FOR "EOT" CONDITION. ..11 LDA .TLOG LOAD THE INTERRUPT RETURN. LDB DEC3 LOAD: FORWARD SPACE COMMAND CODE. JSB FUNCT GO INITIATE THE FUNCTION. DEF ..11 REJECT, INTERRUPT ADDRESS RETURN. * REW JSB CSOT *GO CHECK FOR "BOT" CONDITION. JSB RWCHK *SEE IF UNIT ALREADY REWINDING. ..12 LDB M11 LOAD: REWIND COMMAND CODE LDA .10 LOAD THE INTERRUPT RETURN. JSB FUNCT GO INITIATE THE FUNCTION. DEF ..12 REJECT, INTERRUPT ADDRESS RETURN. * M11 OCT 11 * * RWS STA EQT10,I *SET REW/STANDBY FLAG. JSB RWCHK *SEE IF UNIT ALREADY REWINDING. LDA STORE *GET THE HARDWARE STATUS. ALF,ALF *MOVE "BOT" RAL,RAL * TO SIGN. SSA,RSS *IS TAPE AT LOAD POINT? JMP ..RWS *NO! LDA .RWS *SET INTERRUPT RETURN ADDRESS. LDB DEC3 *GET FORWARD SPACE CODE. JSB FUNCT *INITIATE THE FUNCTION. DEF *-3 *REJECT INTERRUPT ADDRESS. * ..RWS LDB M31 *LOAD REWIND/OFF-LINE COMMAND. LDA .10 LOAD THE INTERRUPT RETURN. JSB FUNCT GO INITIATE THE FUNCTION. DEF RWS+2 *REJECT, INTERRUPT ADDRESS RETURN. * .RWS DEF ..RWS M31 OCT 31 * RWCHK NOP *ENTRY. LDA STORE *GET HARDWARE STATUS. ALF,RAL *MOVE REWIND BIT TO SIGN. SSA *UNIT CURRENTLY REWINDING ? JMP I.A.4-1 *YES! RETURN IMMEDIATELY! JMP RWCHK,I *NO. CONTINUE. * FSF JSB CEOT GO CHECK FOR "EOT" CONDITION. ..14 LDA .TLOG LOAD THE INTERRUPT RETURN. LDB M1.43 JSB FUNCT GO INITIATE THE FUNCTION. DEF ..14 REJECT, INTERRUPT ADDRESS RETURN. .TLOG DEF TLOG0 * M1.43 OCT 100043 * * BSF JSB CSOT *GO CHECK FOR "BOT" CONDITION. JSB RWCHK CHECK IF REWINDING ..15 LDA .10 LOAD THE INTERRUPT RETURN. LDB M1.45 JSB FUNCT GO INITIATE THE FUNCTION. DEF ..15 REJECT, INTERRUPT ADDRESS RETURN. * M1.45 OCT 100045 * * GAP RBR,SLB IS WRITE RING PROVIDED? JMP I.A.3 NO, GO REJECT THE REQUEST. JSB CEOT YES, GO CHECK FOR END-OF-TAPE. ..23 LDA .22 LOAD THE INTERRUPT RETURN. LDB M121 LOAD: GAP COMMAND CODE JSB FUNCT GO INITIATE THE FUNCTION. DEF ..23 REJECT, INTERRUPT ADDRESS RETURN. * M22 OCT 22 M121 OCT 121 * * .22 DEF ..22 ..22 LDA EQT5,I LOAD THE MT UNIT STATUS. AND M22 GET PARITY & TIMING BITS SZA WERE THERE ANY ERRORS? JMP W.ERR YES, GO ABORT THE REQUEST. JMP TLOG0 NO, GO UPDATE TRANSMISSION LOG. * EOF RBR,SLB IS WRITE RING PROVIDED? JMP I.A.3 NO, GO REJECT THE REQUEST. ..13 JSB EOTF GO CHECK FOR END-OF-TAPE. ..17 LDB S1161 LOAD: WRITE EOF COMMAND LDA .18 LOAD THE INTERRUPT RETURN. JSB FUNCT GO INITIATE THE FUNCTION. DEF ..17 REJECT, INTERRUPT ADDRESS RETURN. * S1161 OCT 100161 * .18 DEF ..18 ..18 LDA EQT5,I LOAD THE MT UNIT STATUS. AND M22 GET PARITY & TIMING BITS SZA,RSS WERE THERE ANY ERRORS? JMP TLOG. NO, GO UPDATE TRANSMISSION LOG. ..19 LDB DEC5 YES, LOAD: BACKSPACE COMMAND LDA .13 LOAD THE INTERRUPT RETURN. JSB FUNCT GO INITIATE THE FUNCTION. DEF ..19 REJECT, INTERRUPT ADDRESS RETURN. .13 DEF ..13 SPC 2 STAT. NOP ENTRY POINT. LIA1C LIA CMND GET MIXED UP BITS FROM 13182A STB CONFG SAVE B STA STORE SAVE MIXED BITS AND M3012 REW,NOT READY,REJ,P/E STA B PUT A IN B TO BUILD STATUS LDA STORE NEXT BITS AND M160 EOF,BOT,EOT ALS MOVE ONE LEFT ADB A ADD TO STATUS LDA STORE NEXT BITS AND M401 OFF LINE, CONTROLLER BUSY ALF,ALF SWAP BITS ROUND ADB A ADD TO STATUS LDA STORE NEXT BIT AND DEC4 TIMING ERROR ALS,ALS MOVE LEFT TWO ADB A ADD TO STATUS LDA STORE LAST BIT AND M200 PROTECTED ALF,ALF 12 LEFT + 1 RIGHT ALF,ARS = 5 RIGHT ADA B A = STATUS LDB CONFG RESTORE B JMP STAT.,I *RETURN * M160 OCT 160 M401 OCT 401 M3012 OCT 3012 * CEOT NOP ENTRY POINT. LDA EQT5,I LOAD THE MT UNIT STATUS. AND M40 EOT STATUS BIT CLE,SZA,RSS IS MT UNIT AT END-OF-TAPE (EOT)? JMP CEOT,I NO, RETURN. I.A.2 LDB C.24 LOAD THE INTERRUPT FLAG LDA DEC2 LOAD: A=2;ILLEG CONTL/EOT SSB,RSS INTERRUPT RETURN? JMP C.24,I YES, GIVE A COMPLETION RETURN JMP I.24,I NO, RETURN TO USER SPC 1 I.A.3 LDA DEC3 LOAD: A=3;NOT READY JMP I.24,I RETURN TO THE USER * DEC2 DEC 2 DEC3 DEC 3 DEC4 EQU M4 M40 OCT 40 * NBUFL NOP ENTRY POINT. LDB EQT8,I LOAD THE BUFFER LENGTH REQUEST. CCE,SSB,RSS IS THE LENGTH IN WORDS? CMB,CLE,INB,RSS SI!CONVERT TO NEGATIVE; SKIP. ERB NO, CONVERT TO WORDS. STB EQT13,I *STORE THE NEGATIVE WORD COUNT. JMP NBUFL,I RETURN: B=(-)WORD COUNT * E=0=>WDS OR EV # CHRS * E=1=>ODD # CHARS SPC 2 * JSB SETIO *SET THE MT I/O INSTRUCTIONS. SPC 2 TLOG LIA CMND *LOAD THE HARDWARE STATUS. AND DEC64 *ISOLATE THE "EOF" BIT. SZA WAS IT AN END-OF-FILE (EOF) ? JMP TLOG0 *RETURN 0 XMISSION LOG. W.CNT LIA DMA-4 LOAD THE WORD COUNT REGISTER. SZA DID "DMA" GO TO COMPLETION? IOR DMASK *NO! RESTORE THE LOST BITS [-] . LDB EQT6,I LOAD THE REQUEST CONTROL WORD. RBR,ERB SHIFT THE WRITE BIT TO "E". CMA,SEZ,INA,SZA DID THE WRITE COMPLETE? JMP W.ERR NO, GO ABORT THE REQUEST. LDB EQT13,I *YES! GO GET NEGATIVE WORD COUNT. ADB A LET "B" = -(WORDS TRANSMITTED). STB CTEMP *SAVE THE ACTUAL COUNT. ISZ BCD,I *BUMP THE XMISSION COMPLETE FLAG. LDA EQT6,I *GET THE REQUEST WORD. CCE,SLA,RSS *READ REQUEST ? JMP STEER *NO! LDA BCD,I GET BCD FLAG SSA,RSS *BCD MODE ? JMP STEER *NO! CONTINUE. SPC 1 * * START BCD TO ASCII CONVERSION * SPC 1 LDB CTEMP YES, LOAD NEG WORD COUNT STB MBUFC STORE COUNT LDA EQT7,I GET USER BUFFER ADDRESS STA UNPAK USE UNPAK AS POINTER RSS * NEWCH ISZ UNPAK *ADVANCE BUFFER POINTER. LDA UNPAK,I *GET TWO CHARACTERS. ALF,ALF USE UPPER BCD CHAR AND M77 GET 6 BITS ADA TBLAD ADD TABLE ADDRESS LDA A,I GET ASCII EQUIV. AND M377 USE LOWER 8 BITS. ALF,ALF MOVE BACK UP STA STAT. STORE TEMPORARILY LDA UNPAK,I GET OTHER CHAR AND M77 ADA TBLAD LDA A,I AND M377 IOR STAT. ADD IN UPPER CHAR STA UNPAK,I PUT BACK IN BUFFER ISZ MBUFC DONE? JMP NEWCH NO, GO BACK * STEER JSB DMAI *DMA INTERRUPT ? ISZ BCD,I *YES! INCREMENT XMISSION FLAG. LDA EQT11,I *GET THE DMA CHANNEL #. JMP SPURI *RETURN. * CTEMP NOP WORD COUNT STORAGE * DMAI NOP *ENTRY. LDA C.24 *GET COMPLETION ENTRY POINT. SSA *POST INTERRUPT PHASE? JMP NDMAI *NO! LIA 4 *GET INTERRUPT SOURCE CODE. CPA M6 *INT FROM DMA CH6 ? JMP DMAI,I *YES! RETURN "P+1" . CPA M7 *INT FROM DMA CH7 ? JMP DMAI,I *YES! RETURN "P+1" . NDMAI ISZ DMAI *ADVANCE RETURN ADDRESS. JMP DMAI,I *RETURN "P+2" . * CHECK NOP *ENTRY POINT. JSB CEOT *CHECK FOR EOT. LDA BCD,I *GET MODE WORD. ELA *PRESERVE CLA,SEZ * MODE BIT IN ERA * CASE OF STA BCD,I * REJECT. LIA3C LIA CMND *LOAD THE MT UNIT STATUS. AND DEC2 *GET PARITY BIT. CLE,SZA *PARITY ERROR? JMP CHECK,I *YES! RETURN. * FINI LDB CTEMP *RESTORE WORD COUNT IN B. SSB CMB,INB LDA EQT8,I LOAD THE USER BUFFER LENGTH. SSA WAS THE REQUEST FOR CHARACTERS? BLR *YES! CREATE [+] CHARACTERS. LDA EQT10,I *GET THE RETRY COUNTER. SZA *WERE 3 TRYS NEEDED? JMP END *NO! <3 ; RETURN TO SYSTEM. LDA DEC3 *YES! A=3 ; XMISSION ERROR! JMP END+1 *GIVE COMPLETION RETURN. * M377 OCT 377 * EOTF NOP ENTRY POINT. LDA EQT5,I LOAD THE MT UNIT STATUS. AND M40 EOT STATUS BIT CCE,SZA,RSS IS MT UNIT AT END-OF-TAPE (EOT)? JMP EOTF,I NO, RETURN. LDA EQT11,I YES, LOAD THE "EOT" FLAG WORD. ELA,RAR SHIFT THE "EOT" FLAG TO "E". STA EQT11,I STORE THE "EOT" FLAG. SEZ,CCE WAS END-OF-TAPE ALREADY REACHED? JMP I.A.2 YES, GO REJECT THE REQUEST. JMP EOTF,I NO, RETURN. * DMASK OCT 140000 "DMA" WORD COUNT MASK * CSOT NOP ENTRY POINT. LDA EQT5,I LOAD THE MT UNIT STATUS. AND DEC64 SOT STATUS BIT SZA,RSS *IS THE MT UNIT AT "BOT" ? JMP CSOT,I NO, RETURN. ..10 CLA ENTER: A=0. STA EQT11,I CLEAR THE "EOT" FLAG. TLOG0 CLB,RSS ENTER: B=0; SKIP. TLOG. CLB,INB ENTER: B=1. LDA C.24 LOAD THE INTERRUPT FLAG SSA IS CONTROL FROM INTERRUPT? JMP I.A.4 NO, GIVE IMMEDIATE COMPLETION. END CLA ENTER: A=0. CLC.G CLC CMND *CLEAR CMND CONTROL. JMP C.24,I GIVE A COMPLETION RETURN SPC 2 IODMA NOP ENTRY POINT. ISZ S.DMA CLEAR THE "DMA" SKIP FLAG; SKIP. S.DMA OCT -1 "DMA" SKIP FLAG. CLC2F CLC DMA-4 PREPARE THE ADDRESS REGISTER. RAL,ERA SET THE READ/WRITE BIT. OTA3E OTA DMA-4 OUTPUT THE BUFFER ADDRESS. LDA CSOT *LOAD MT DATA CHANNEL NUMBER. IOR M20K *INCLUDE THE CLC OPTION . OTA1C OTA DMA ASSIGN THE DMA CHANNEL. LDA EQT13,I *LOAD THE NEGATIVE WORD COUNT. STC2F STC DMA-4 *PREPARE WORD COUNT REGISTER OTA4E OTA DMA-4 OUTPUT THE WORD COUNT. JMP IODMA,I RETURN. * M20K OCT 020000 * REJCT CCA ENTER: A=-1. STA S.DMA SET THE "DMA" SKIP FLAG. LDA FUNCT,I LOAD REJECT INTERRUPT ADDRESS. LDB M110 LOAD THE CLEAR COMMAND CODE. RSS SKIP. * FUNCT NOP ENTRY POINT. STA EQT9,I STORE THE RETURN ADDRESS. CLC1D CLC DATA *CLEAR DATA CONTROL. OTB1C OTB CMND OUTPUT THE COMMAND CODE. LIA2C LIA CMND *GET HARDWARE STATUS. RAR,RAR SHIFT I/O REJECT BIT TO 0. RAR,SLA WAS THE COMMAND REJECTED? JMP REJCT YES, GO ISSUE A CLEAR REQUEST. CLA,CCE NO, ENTER: A=0; E=1. CPA S.DMA IS THE REQUEST A READ OR WRITE? JMP R.W YES, GO INITIALIZE THE TRANSFER. CPB M110 *CLEAR COMMAND? JMP C.RTN-1 *YES! * * RETURN DMA CHANNEL TO SYSTEM * LDA CHAN A=DMA CHANNEL JSB FITAB GET INTERRUPT TABLE ADDRESS LDA B,I *GET INT TABLE ENTRY ELA,CLE,ERA *REMOVE THE SIGN BIT. STA B,I *SET NEW TABLE ENTRY. STC1C STC CMND,C *INITIALIZE MT UNIT CONTROL. * C.RTN LDA C.24 LOAD THE INTERRUPT CONTROL FLAG INA,SZA,RSS IS CONTROL THROUGH INTERRUPT? JMP I.24,I NO, RETURN TO THE USER JMP A,I YES, SYSTEM INTERRUPT RETURN. * R.W EQU * CLF1D CLF DATA *CLEAR DATA CHANNEL FLAG. RWCON STC CMND,C *INITIALIZE MT UNIT CONTROL. STC1E STC DMA,C *INITIALIZE DMA CHANNEL JMP C.RTN *RETURN. * * * ENTRY: A=DMA CHANNEL # FITAB NOP LDB INTBA LOAD INT TABLE ADDRESS CPA M7 IS "DMA" CH 7 BEING USED? INB YES! INCR TABLE ADDRESS JMP FITAB,I * EXIT: B=ADDRESS OF INTERRUPT TABLE ENTRY * SETIO NOP ENTRY POINT. LDA EQT4,I *GET MT CHANNEL WD. AND M77 *ISOLATE THE DATA CHANNEL. STA CSOT *STORE MT DATA CHANNEL NUMBER. IOR CLC *FORM A "CLC DATA". STA CLC1D *SET THE INSTRUCTION. STA *+1 *PUT CLC DATA IN NEXT LOCATION NOP * AND EXECUTE XOR M5600 *FORM "CLF DATA" . STA CLF1D *STORE THE INSTRUCTION. XOR M600 *FORM "STC DATA,C" . INA *FORM A "STC CMND,C". STA STC1C *STORE THE INSTRUCTION. STA RWCON *STORE THE INSTRUCTION. XOR M5000 *FORM A "CLC CMND". STA CLC.G *STORE THE INSTRUCTION. XOR M4200 *FORM A "LIA CMND". STA LIA1C *STORE THE INSTRUCTION. STA LIA2C *STORE THE INSTRUCTION. STA LIA3C *STORE THE INSTRUCTION. STA TLOG *STORE THE INSTRUCTION. XOR M4300 *FORM A "OTB CMND". STA OTB2C *STORE THE INSTRUCTION. STA OTB1C *STORE THE INSTRUCTION. LDA EQT11,I *GET THE ELA,CLE,ERA * DMA CHANNEL #. IOR STCC *FORM A "STC DMA,C". STA STC1E *SET THE INSTRUCTION. XOR M1100 *FORM A "OTA DMA". STA OTA1C *SET THE INSTRUCTION. ADA N4 *"SUBTRACT": "DMA" - 4 . STA OTA3E *STORE THE INSTRUCTION. STA OTA4E *STORE THE INSTRUCTION. XOR DEC64 *FORM A "STC DMA-4". STA STC2F *STORE THE INSTRUCTION. XOR M200 *FORM A "LIA DMA-4". STA W.CNT *STORE THE INSTRUCTION. XOR M4200 *FORM A "CLC DMA-4". STA CLC2F *STORE THE INSTRUCTION. JSB DMAI *DMA INTERRUPT ? JMP IOSET *YES! BYPASS STATUS CHECK. LDA EQT4,I *LOAD THE UNIT NUMBER. AND M300 *ISOLATE THE UNIT NUMBER. ALF,ALF *ROTATE UNIT TO RAL,RAL * LOW A-REG. CMA *SET AS COUNTER. LDB M400 *PRE-SET B-REG. BLS *SET B TO UNIT INA,SZA *THIS UNIT? JMP *-2 *NO! TRY NEXT ONE. ADB M400 *YES! COMPLETE THE WORD. OTB2C OTB CMND *OUTPUT THE MT UNIT SELECT CODE. JSB STAT. *GET MT STATUS IN "A" AND M377 *ISOLATE BITS 7-0 . LDB A *SAVE THE STATUS IN "B" . LDA EQT5,I *LOAD THE STATUS WORD FROM EQT. AND M1774 *REMOVE THE OLD STATUS. IOR B *INCLUDE THE NEW STATUS. STA EQT5,I *UPDATE THE STATUS WORD IN EQT . IOSET CCA *SET A= -1 . STA S.DMA *SET THE "DMA" SKIP FLAG. JMP SETIO,I *RETURN: A= -1 , B=STATUS * M1774 OCT 177400 N4 DEC -4 M7 OCT 7 M6 DEC 6 M110 OCT 110 M4200 OCT 4200 M4300 OCT 4300 CONFG NOP * SKP * COMPLETION SECTION. SPC 1 C.24 NOP ENTRY POINT LDB EQT11,I LOAD THE "DMA" CHANNEL NUMBER. RBL,CLE,ERB REMOVE THE "EOT" FLAG BIT. CPA B *DMA INTERRUPT? JMP GO *YES! START PROCESSING. LDB EQT1,I LOAD THE DEVICE LIST POINTER SZB,RSS DID A SPURIOUS INTERRUPT OCCUR? JMP SPURI YES! IGNORE THE INTERRUPT. JSB SETIO *SET I/O INSTRUCTIONS FOR MT. ERB *SHIFT LOCAL BIT TO "E". LDB EQT10,I *LOAD THE REWIND/STANDBY FLAG. LDA EQT9,I *LOAD THE CONTINUATION ADDRESS. SSA,RSS *INDIRECT ADDRESS ? JMP *+3 *NO! CONTINUE . LDA A,I *GET THE JMP *-3 * EFFECTIVE ADDRESS . SEZ,CLE IS THE MT UNIT IN "LOCAL"? CPB M500 YES;IS THE INTERRUPT FROM "RWS"? JMP A,I YES, GO CONTINUE PROCESSING. * W.ERR CLA,INA ENTER: A=1.(NOT READY) CLB ENTER: B=0. JMP C.24,I COMPLETION RETURN SPC 2 M500 OCT 500 SPC 2 * SPURI LDB A SAVE THE CHANNEL NUMBER. IOR CLC *CONFIGURE "CLC XX" STA CLC.0 *SET THE INSTRUCTION. CLC.0 CLC 00B CLEAR CONTROL. CLA STA EQT15,I PREVENT TIMEOUT LDB BCD,I *GET THE I/O XMISSION FLAG. ERB *SET THE CONTINUATION/COMPLETION FLG. LDA C.24 *GET THE RETURN ADDRESS. SEZ,INA,RSS *CONTINUATION RETURN ? JMP A,I *YES! JSB CHECK *ANY R/W PARITY ERRORS? JMP ..7.5 *READ PARITY ERROR! * * GO LDB DUMMY *LOAD SPECIAL INTERRUPT FLAG. SZB,RSS *PRIVILEGED INTERRUPT ACTIVE ? JMP TLOG-1 *NO! CONTINUE. JSB FITAB *YES! GET INTERRUPT TABLE ADDRESS. STB CONFG *SAVE TABLE ADDRESS. LDB B,I *LOAD THE TABLE ENTRY. ELB,CLE,ERB *REMOVE BIT 15 . STB CONFG,I *STORE NEW TABLE ENTRY. JMP TLOG-1 *START PROCESSING. * * * BEGIN "LOCAL STORAGE". SPC 1 A EQU 00000B "A" REGISTER ADDRESS DEFINITION. B EQU 00001B "B" REGISTER ADDRESS DEFINITION. BPNTR EQU SETIO CLC CLC 00B DMA EQU 06B "DMA" CHANNEL NUMBER 1. MBUFC EQU NBUFL PAKUN EQU CHECK STCC STC 00B,C STORE EQU PAKUN UNPAK EQU CHECK DATA EQU 00B DATA CHANNEL NUMBER. CMND EQU DATA+01B COMMAND CHANNEL NUMBER. SKP * SYSTEM BASE PAGE COMMUNICATION AREA: SPC 2 . EQU 1657B EQT1 EQU .+1 EQT4 EQU .+4 EQT5 EQU .+5 EQT6 EQU .+6 EQT7 EQU .+7 EQT8 EQU .+8 EQT9 EQU .+9 EQT10 EQU .+10 EQT11 EQU .+11 .. EQU 1770B EQT12 EQU ..+1 EQT13 EQU ..+2 EQT15 EQU ..+4 SPC 2 BCD EQU EQT12 BCD FLAG WORD, =100000 FOR BCD CHAN EQU 1673B CURRENT "DMA" CHANNEL NUMBER. DUMMY EQU 1737B INTBA EQU 1654B *FWA OF INTERRUPT TABLE SUP SPC 1 SPC 1 HED ********** CONVERSION TABLE *********** * * ASCII => BCD / BCD => ASCII * (HIGH) / (LOW) * TBLAD DEF *+1 * @ A B C D E F G ASC 08,L 11223344556677 * * H I J K L M N O ASC 08,8899!0"=#@$:%>&# * * P Q R S T U V W ASC 08,' (/)SRTSUTVUWVX * * X Y Z [ \ ] ^ ASC 08,WYXZY_=,^(-'?\Z" * * ! " # $ % & ' ASC 08,P-*J_KOL+M/N0O]P * * ( ) * + , - . / ASC 08,\Q ? ASC 08,HHIIM?..>)K[N<:^ HED <*** OUTPUT BUFFERS ***> OBUF1 EQU * OCT 10020,10020 (BCD BLANKS) BSS 65 IFZ OBUF2 EQU * OCT 10020,10020 (BCD BLANKS) BSS 65 XIF PLEN EQU *+1 PROGRAM LENGTH (OCTAL) END