.TITLE DPF. / 6-2-70 (EDIT20) /COPYRIGHT 1969,1970, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. /RP09/15 ADAPTATION W.A. DESIMONE 9-1-70 /W. A. DESIMONE - (RP EDIT 7 11-3-70) /9-16-69 (TIMING BUG) / 4/30/69 /DPF. = IOPS DECTAPE/DISK HANDLER FOR NON-FILE ORIENTED I/O /LIMITED FUNCTIONS /NO INTERNAL BUFFERS /CALLING SEQUENCE /CAL+.DAT SLOT(9-17) + I(7-8)/.INIT /UNIT (0-2) +1(=FUNCTION) /RESTART ADDR. (ONLY MEANINGFUL FOR TTY HANDLER) /MAXIMUM BUFFER SIZE (255) /CAL + .DAT SLOT (9-17)/.CLOSE - PERFORMS EOF /UNIT (0-2) +6(=FUNCTION) /CAL + SUBFUNCTION(5-8) + .DAT SLOT /.MTAPE (00=REWIND /UNIT (0-2) +7(=FUNCTION) (02=BACKSPACE RECORD / (05=FORWARD SPACE RECORD /CAL + DATA MODE(6-8) + .DAT SLOT(9-17)/.READ /UNIT(0-2) + 10(=FUNCTION) (IOPS ASCII AND IOPS BINARY /LINE BUF ADDR DATA MODES ONLY) /-WC OF L.B. (2'S COMP) /SAME AS .READ (FUNCTION = 11)/.WRITE /CAL + .DAT SLOT (9-17)/.WAIT /UNIT 0-2) + 12(=FUNCTION) /CAL + 1000 + .DAT SLOT(9-17)/.WAITR /UNIT(0-2) + 12(=FUNCTION) /15BIT BUSY ADDRESS .EJECT .GLOBL DPF. IDX=ISZ /IOT ASSIGNMENTS DPCS=706324 /CLEAR STATUS (BITS 13,17,18 OF ST.A) /(BITS 9-15 OF ST.B) DPSJ=706341 /SKIP ON JOB DONE FLAG DPSE=706361 /SKIP ON ERROR FLAG DPLF=706464 /LOAD ST.A (BITS 0-8) DPLA=706304 /LOAD CYA,HA,SA FROM AC. DPCA=706344 /LOAD CA REGISTER FROM AC (3-17) DPWC=706364 /LOAD WC REGISTER FROM AC DPRSA=706312 /READ ST. A INTO AC DPRU=706412 /READ CA INTO AC (10-17) DPCN=706454 /EXECUTE FUNC. REG.-AC CLEARED DPRA=706432 /READ CYA,HA,SA INTO AC DPRC=706452 /READ CA REGISTER INTO AC (3-17) DPRW=706472 /READ WC REGISTER INTO AC DPRSB=706332 /READ STATUS B INTO AC DPLO=706444 /LOAD AC ONES INTO ST. A (BITS 0-8) DPSA=706321 /SKIP ON ATTENTION FLAG / DPF. DAC DTCALP /STORE CAL POINTER DAC DTARGP /SET UP ARG. POINTER LAW 7000 AND* DTCALP /MASK (6-8) RAR!CLL /SHIFT TO (15-17) RTR /ROTATE 8 RIGHT RTR RTR RTR DAC DTCT /TEMP. STORE DATA MODE OR SUBFUNCTION IDX DTARGP /INDEX TO FUNCTION AND UNIT # LAC* DTARGP /MASK UNIT # AND DTUMSK /DTUMSK=LAW -400 /LINK=0 - GET STATUS OF THIS DT UNIT RTL RTL /RIGHT JUSTIFY UNIT # DAC DTUNIT /SAVE UNIT NUMBER (BITS 15-17). TAD (LAC DTMULP /CONSTR. FOR DT STATE LAC DAC DTPVOT XOR (240000 /CONSTR. A DAC FOR DTUPDT DAC DTLOAD DTPVOT XX DAC DTSTAT /STORE DT STATE RAR /DTIOSW BIT TO 17 AND DLIT1 DAC DTIOSW /SWITCH SET TO CURRENT STATUS LAC DTSTAT RTR /BITS 4-15 TO 6-17 AND (7777 /MASK OFF DTNXBK SAD (7777 DLITM1 LAW -1 DAC DTNXBK CLL LAC DTSTAT /MASK OFF UNITNO (BITS0-2). AND (700000 RTL RTL DAC UNITNO SNA JMP DTPVO1 /NO ADDED UNITS - USE UNIT # FROM CAL. CMA /MUST UPDATE UNIT # PASSED BY CAL TO THE TAD DLIT1 /ONE ACTUALLY BEING USED. DAC DTWCS /TEMP STORAGE. IDX DTUNIT ISZ DTWCS JMP .-2 DTPVO1 LAC* DTARGP /INDEX TO ARG. 3 IDX DTARGP AND (77 TAD (JMP DTTABL DAC DTTABL LAC ENDSW /IF WRITING AN EOF BECAUSE OUT OF DISK, SPA!CLL /GO TO THE CLOSE ROUTINE. JMP DTCLOS DTTABL XX JMP DTINIT /1=.INIT JMP DIGNR /2=.OPER IGNORE JMP DIGNR /3=.SEEK IGNORE JMP DIGNR /4=.ENTER IGNORE JMP DTER6 /5=.CLEAR ILLEG. JMP DTCLOS /6=.CLOSE JMP DTMTAP /7=.MTAPE JMP DTREAD /10=.READ JMP DTWRIT /11=.WRITE JMP DTWAIT /12=.WAIT, .WAITR DTER6 LAC DLIT6 /13=.TRAN ILLEGAL JMP DTM4 /ILL FUNCTION; IOPS 6 DIGNR IDX DTARGP /INDEX TO CORRECT RETURN ADDRESS CLA /AC=0 FOR FAKE BLK. NOT FOUND FOR .SEEK ETC. JMP DTFBK / /I/O UNDERWAY CHECK SUBROUTINE DTUND = 0 IMPLIES I/O NOT UNDERWAY DTIOU 0 LAC DTUND SZA!CLL!CMA /I/O UNDERWAY? LINK CLEARED FOR USE IN DTMCK JMP DTBUSY /YES JMP* DTIOU /NO. EXIT / DTBUSY LAC DTCALP /CAUSE HANG ON USER CAL DAC DTARGP JMP DTFBK /EXIT ON HANG. .EJECT / /DTF. INTERRUPT SERVICE / DTIN JMP DTPIC /JMP FOR PI ENTRY DAC DTAC /STORE AC FOR API ENTRY LAC DTFVSW-1 /DTFVSW-1 = LAC DTAC DAC DTFVSW /LEAVE PIC ALONE ON EXIT LAC DTIN /FOR API. CONTAINS PC,L,EM,MP JMP DTCOM /COMMON EXIT DTPIC DAC DTAC /SAVE AC ON PI ENTRY LAC DTSVTM /ALLOW FOR PIC TO BE TURNED ON DTSUTM = ION DAC DTFVSW /AGAIN AT EXIT IN PI ENVIRONMENT LAC* DTMBAK /DTMBAK = 0. GET PC,L,EM,MP FOR PI DTCOM DAC DTOUT /RP15 DISK STATUS REGISTER "A" BIT ASSIGNMENTS / 0-2=SELECTED UNIT / 3-5=FUNCTION / 0=IDLE,1=READ,2=WRITE,3=RECALIBRATE / 4=SEEK,5=READ ALL,6=WRITE ALL, 7=READ COMPARA / 6=DONE AND ERROR FLAG INTERRUPT ENABLED / 7=ATTENTION FLAG INTERRUPT ENABLED / 8=GO / 9=WRITE PROTECT ERROR / 10=NON-EXISTENT CYLINDER ADDRESS / 11=NON-EXISTENT SURFACE ADDRESS / 12=NON-EXISTENT SECTOR ADDRESS / 13=HEADER NOT FOUND / 14=SELECTED UNIT IS WRITE PROTECTED / 15=SELECTED UNIT IS SEEK INCOMPLETE / 16=JOB DONE FLAG / 17=ERROR FLAG /RP15 DISK STATUS REGISTER "B" BIT ASSIGNMENTS / 0-7=ATTENTION UNITS 0-7 / 8=SELECTED UNIT IS UNSAFE / 9=PROGRAM ERROR / 10=END OF PACK / 11=TIMING ERROR / 12=FORMAT ERROR / 13=WRITE CHECK ERROR / 14=WORD PARITY ERROR / 15=LONGITUDINAL PARITY ERROR / 16=SELECTED UNIT SEEK UNDERWAY / 17=SLECTED UNIT NOT READY / DPRSA /READ DISK STATUS. DAC DKSET /TEMP STORAGE OF STATUS WORD. CLL!RAR SZL JMP DTERT /ERROR FLAG ON. RFRDWT DPCS /CLEAR DISK STATUS. LAC DKSET /GET ST A FOR RP UNIT# AND (700000) /MASK AND ISSUE AN IDLE TO CLEAR DPLF /JOB DONE AND ERR INTERR. ENABLE DTION ION /ION TO ALLOW OTHER INTERRUPTS. DZM DTUND /CLEAR I/O UNDERWAY SWITCH. JMP DTXIOT DTERT LAC DKSET /RELOAD ST A. AND (24) SZA /AC70 IF SEEK INCOMP. OR HEADER JMP RPRCL /NOT FOUND-RECALIBRATE + RETRY LAC DKSET AND (340) /AC70 IF NON-EXISTENT DISK ADDR. SZA JMP DTER21 LAC DKSET /CHK. FOR WP. ERR AND (400) SZA /AC>0 MEANS WRITE PROT. ERR JMP DKIPS4 /IOPS 4 DPRSB /LOAD STATUS B DAC RPSTB /STORE /CHECK STATUS B. / AND (34) /AC>0 IF LONG., WORD PARITY, WRITE CHK., SZA /WRITE CHECK SHOULD NEVER HAPPEN JMP DPARIT /RETRY AND PASS DATA ANYWAY LAC RPSTB AND (140) /AC>0 IF FORMAT ERR OR TIMING ERR. SZA /RETRY.IF FAILS, IOPS 12 PLUS JMP RP12RT /STATUS B LAC RPSTB AND (200) /END OF PACK SZA /IF AC>0-IOPS-21 JMP DTER21 RPER12 LAC RPSTB /FALLS THROUGH HERE DAC* DLIT3 /ON PROGRAM ERROR OR CLA /SELECTED UNIT UNSAFE JMP DTER12 /IOPS 12 RPRCL LAC (30000 /LOAD RECALIBRATE FUNCT. XOR RPUNIT /AND RETRY. DPLF DPRSB /2 INSTRS. FOR 4 MICROSECOND DELAY DPRSB DPSA /TEST ATTENTION FLAG JMP .-1 ISZ DTERCT JMP DRETRY /GO RETRY JMP DKER20 /DISK FAILURE DKIPS4 LAC (DRETRY DAC* DLIT3 LAC DLIT4 JMP DTM4 RP12RT ISZ DTERCT /RETRY ROUTINE FOR FORMAT JMP DRETRY /OR TIMING ERROR JMP RPER12 DKER20 LAC DKSET /DISK STATUS. DAC* DLIT3 /(.MED LAW 20 JMP DTM4 /DISK FAILURE. DTER21 LAC DKSET DTR21A DAC* DLIT3 LAW 21 /ILLEGAL DISK ADDRESS. JMP DTM4 DPARIT ISZ DTERCT /IF OVERFLOW, TAKE DATA ANYWAY SKP JMP RFRDWT /TAKE DATA ANYWAY. DRETRY JMS DKSET /REISSUE DISK READ (TRY 10 TIMES). LAC DTERCT /0 IF RETRY COUNT OVERFLOWS DAC DTUND /I/O UNDERWAY SW. JMP DTXIOT DTPRGO DZM DTUND /REINIT I/O UNDERWAY SWITCH DTXIOT LAC (JMP DTPIC /RESTORE PIC INTERRUPT ENTRY DAC DTIN LAC DTAC /RESTORE AC DTFVSW XX /ION IF UNDER PI - LAC DTAC IS UNDER API DBR XCT .+1 /PRESERVE IOT CHAIN XCT .+1 JMP* DTOUT /DTOUT = 0 IF PI DTOUT = DTIN IF API LAC DTTR /RETURNING FROM READ OR WRITE SAD (15000 /A WRITE? JMP DTPRGO /DON'T CALCULATE CHECKSUM ON WRITE /INTERRUPT TURNED ON TO ALLOW EXIT DTSVTM ION /ALLOW INTERRUPT LAC* DTUFP JMS DTWGPC /CALC. WC FROM USER HEADER 0 LAC DTWPC /LOAD CALC. WC TAD DTUWC /ADD 2'S COMP. OF WC FROM .READ SMA!CLA /> OR = 0 IF SHORT LINE JMP DTSHRT /GO SET VALIDITY BITS LAC DTUFP /LOAD PTR. TO USER W0 DZM DTCKSM /CLEAR CHECKSUM COUNT JMS CALCKS /GO CALC. CHK SUM. RETRN IN AC SNA!CLA /SKP IF CHK SUM NOT 0 JMP DTPRGO /NO CHK SUM OR SHRT LINE PROBLEM SKP DTSHRT TAD (20 TAD (40 XOR* DTUFP /SET VALIDITY BITS DAC* DTUFP /REDEFINE JMP DTPRGO / / .INIT FUNCTION. / DTINIT ISZ DTARGP /INDEX TO BUFFER SIZE ARG. LAC (377 /MAX BUFFER SIZE - DAC* DTARGP LAC DTCT /USED DATA MODE OR SUBFUNCTION A SWITCH SET DAC DTIOSW /LOAD SWITCH TO 0 IF INPUT IDX DTARGP /FOR NORMAL EXIT DTONCE CAL 64 /ONCE ONLY CODE FROM HERE TO DTSTOP / /CODE FROM HERE TO DTSTOP ONCE ONLY CODE. / /DTTR = IOT SETUP - /DTOUT = EXIT ADDRESS /DTUCKP = CHECKSUM POINTER /CKSCNT = COUNTER IN CHECKSUM CALCULATOR /DTERCT - PARITY RETRY COUNT /DTAC - SAVE AC REGISTER /RPCABS=STORAGE FOR BASE SUPERUNIT ADDRESS /RPUNIT=PHYSICAL DISK PACK DRIVE # /RPSTB=STORAGE FOR STATUS B /RPCACK=TEMP STORAGE FOR CHECK BLK# 100 ROUTINE /DTBCA-BLOCK JUST READ. /DTFCA-STORAGE FOR DATA MODE /DTBLC-STORAGE FOR BLOCK LOOKED FOR. /DTUWC-STORAGE FOR USER WORD COUNT. /DTWPC-DT WC IN 2'S COMP /DTHPT-DT WORD 0 WORKING PTR. /DTCKSM-CHECKSUM STORAGE /DTBUIL-T - DTSTAT. 16 /SKIP ON JOB DONE FLAG DTTR DPSJ DTOUT DTIN RPCABS CAL 64 RPUNIT 16 RPSTB DPSE /SKIP ON ERROR FLAG RPCACK DTIN DTERCT LAC (JMP DTSTOP /RESET FOR JUMP OVER ONCE ONLY CODE DTAC DAC DTONCE DTUCKP LAS /READ AC SWITCHES CKSCNT AND (770) /DRIVE #(9-11) SUPER UNIT# (12-14) DKUNIT DAC DTUCKP /MASK BITS 9-14 AND STORE DKNUM AND (700) /MASK BITS 9-11 DTBCA JMS RPTEMP /AND SET UP RP UNIT# DTUWC DAC RPUNIT /TOTAL ROT LEFT 9 AND STORE DTBLC LAC DTUCKP DTFCA AND (70) /MASK BITS 12-14 DTWPC DAC DTUCKP /STR SUPUNT# TIMES 10(8) DTHPT RAL!CLL /NOW TIMES 20(8) DTCKSM TAD DTUCKP /NOW TIMES 30(8) - THAT IS DTBUIL JMS RPTEMP /30(8)*SUPUNT#=20(8)*SUPUNT#+10(8)*SUPUNT# RAL /TOTAL OF 10 SHFTS DAC RPCABS /STORE BASE CIL. ADDR. JMP DTSTOP RPTEMP 0 RAL!CLL RTL RTL RTL RTL JMP* RPTEMP DTSTOP JMS DTIOU /ALLOW FOR I/O BUSY TEST? JMP DTREXT / / .MTAPE FUNCTION. / DTMTAP JMS DTIOU /I/O UNDERWAY? LAC DTCT /LOAD .MTAPE FUNCTION SNA JMP DTMREW /REWIND SAD DLIT2 /A 2? JMP DTBKSP /BACKSPACE SAD DLIT5 /A 5? JMP DTFORS /YES, FOREWARD SPACE. JMP DTREXT /IGNORE FUNCTIONS NOT = 00,02,05. DTMREW LAW -1 /REWIND DAC DTNXBK /SET SP BUMP OF BOLCK ON TRANSFER GIVES 0. DZM UNITNO /RESET TO ORIGINAL UNIT NUMBER. JMP DTREXT DTBKSP LAC DTNXBK / BACKSPACE. SAD DLITM1 /IS IT -1? JMP DTREXT /YES. IGNORE BACKSPACE. SAD (0 JMP DTBKS1 DTBSK2 LAC DTNXBK TAD DLITM1 /DECREMENT BLOCK # BY 1. DAC DTNXBK /STORE JMP DTREXT /EXIT. DTBKS1 LAC UNITNO /IF UNIT HAS BEEN BUMPED, MUST GO BACK SNA /TO NEXT SEQUENTIAL UNIT. JMP DTBSK2 /ONLY 1 UNIT INVOLVED . TAD DLITM1 DAC UNITNO /SUBTRACT 1 FROM UNIT NUMBER. /LAST BLOCK = 1077 LAC (1077) DAC DTNXBK LAC (DTREXT /SET UP FOR RETURN ON IOPS4. DAC* DLIT3 LAC DLIT4 JMP DTM4 DTFORS LAC DTNXBK /PROCESS FORWARD SPACE. TAD DLIT1 DAC DTNXBK LAC DTNXBK TAD (-1100) SMA!CLL /CLEAR LINK FOR DTUPDT. JMP DTFULL /DECTAPE FULL. DTREXT JMS DTUPDT /COMMON EXIT JMP DTFBK / / CURRENT DISK UNIT FULL. / ALLOW USER TO USE MORE THAN 1 SEQUENTIAL DISK UNIT. /WARNING*** USER MUST BE CAREFUL OF .DAT SLOT ASSIGNMENTS /SO THAT HE DOESN'T ALLOW CLOBBERING OF GOOD DATA ON THE NEXT UNIT!!!!! / DTFULL LAC (DTREXT /SET FOR REENTRY. SKP DTFULA DZM DTUND /IN CASE .CLOSE REQUIRED DAC* DLIT3 IDX DTUNIT /BUMP TO NEXT UNIT NUMBER. LAC DTUNIT /IF OFF THE END OF THE LAST UNIT, TAD (-10) /AND TERMINATE. SMA JMP DTWCS7 /OFF END OF DISK? LAW -1 DAC DTNXBK /SET SO BUMP OF BLOCK ON TRANSFER GIVES 0. JMS DTUPDT /UPDATE DT STATUS REGISTERS IDX UNITNO JMS DTUPDT LAC DLIT4 JMP DTM4 /GO OUTPUT IOPS 4 / / CONSTANTS, STORAGE, ETC. / DTEOFH 2005 /EOF HEADER WORD 0 775773 /EOF HEADER WORD 1. DTMBAK 0 /MUST REMAIN ZERO DLIT4 4 DLIT3 3 DTMBAC 1076 DLIT6 6 DLIT7 7 DLIT1 1 DLIT2 2 DTFMOD 0 /STORAGE FOR DATA MODE DTUFP 0 /FIXED PTR. TO WORD 0 OF USER BUFFER. DTARGP 0 /DTF CAL ARGPOINTER DTCALP 0 /DTF CAL POINTER DTIOSW 0 /DT I/O SWITCH DTLMK LAC DTMBAK DTLMC LAC DTMBAC DTCT 0 /TEMP STORAGE FOR DM OR FUNCT. DLIT5 5 DTUNIT 0 /DT UNIT # STORAGE (BITS 15-17). DKU 0 /LOG. UNIT# BITS 0-2 UNITNO 0 /ACTUAL UNIT NUMBER. DTUND 0 / I/O UNDERWAY SWIT. 0 IF NOT DTCLSW 777777 /.CLOSE DONE SWITCH DTSTAT 0 /DT STATE DTNXBK -1 /ALLOW FOR BUMP BEFORE SEARCH. DTUMSK LAW -400 /MASK FOR CAL PROCESSOR ENDSW 0 /TERMINATE W/ IOPS 15 AFTER OUTPUTTING EOF. DLM677 777100 /(-677 .EJECT / /SUBROUTINE TO CALCULATE CHECKSUM. / CALCKS 0 /ROUT. TO CALCULATE CHKSUM DAC DTUCKP LAC DTUWC DAC CKSCNT CKAGAN LAC* DTUCKP /LOAD WORD 0 TAD DTCKSM DAC DTCKSM /STORE CUMULATIVE TOTAL ISZ DTUCKP /BUMP PTR. ISZ CKSCNT /BUMP COUNTER JMP CKAGAN /REPEAT JMP* CALCKS / / DTWGPC 0 RTR RTR RTR RTR AND (776 DAC DTWPC /NOW WORD COUNT SNA JMP DTER23 AND (400 SNA!CLA JMP* DTWGPC / / DTER23 TAD DLIT5 /IOPS 23 JMP DTER16 / /.READ FUNCTION. / DTREAD JMS DTIOU /I/O UNDERWAY LAC DLIT3 /FOR READ SET UP JMS DTMCK /COMMON READ - WRITE SETUP - RETURNS WITH AC=777777 DZM DTCKSM /CLEAR CHKSUM LAC DTHPT /ENTER WITH CA JMS DTWCS DTAPE1 IDX DTARGP /BUMP TO NORMAL JMP DTFBK /EXIT / / DTMCK 0 /COMMON READ - WRITE SETUP DAC DTTR LAC* DTARGP /GET USER BUFFER POINTER DAC DTHPT /WORKING POINTER IN USER BUFFER DAC DTUFP /FIXED PTR. IDX DTARGP /BUMP POINTER LAC* DTARGP /GET USER WC - 2'S COMP. - FROM PSEUDO OP DAC DTUWC /USER WC LAC DTCT /DATA MODE DAC DTFMOD /STORE DATA MODE /LINK SHOULD BE CLEARED IN DTIOU ROUTINE RTR /0 OR 2 DATA MODE TEST ONLY! SNA!CLC /COMPL. AC IN CASE OF ERROR JMP* DTMCK /DATA MODE O.K. EXIT JMP DTER10 /IOPS7 - ILLEGAL DATA MODE / /SUBROUTINE TO SET UP CA,WA / DTWCS 0 DAC DTFCA /CURRENT ADDRESS REGISTER DTWCS6 LAW -5 /PARITY ERROR RETRY COUNT DAC DTERCT /REINIT DAC DTUND /SET I/O *NDER WAY LAC DTUNIT /UNIT# IN BITS 15-17 CLL / RTR RTR AND (700000 /MASK BITS 0-2 RTR; RTR DAC RPTEMP /STORE 2* UNIT# IN BITS 0-7 RAR TAD RPTEMP /NOW 3* UNIT# IN BITS 0-7 TAD RPCABS /BASE CYL. ADDR FROM .INIT DAC DTBLC /ABSOLUTE CYLA IN (0-7) IDX DTNXBK /BUMP TO NEXT SEQ. BLOCK DLM177 777600 /(-177)--ALLOW FOR ISZ OF 777777 JMS DTUPDT /UPDATE UNIT STATUS WORD LAC DTNXBK SAD (1100) /UNIT FULL? JMP DKFUL DAC RPTEMP /ABSOLUTE PACK ADDR. DTWCS2 TAD (-310 SPA /BLK# < 310(8)? JMP DTWCS3 /GO GET HEAD ADDR DAC RPTEMP /STORE REMAINDER LAC DTBLC TAD (2000) /ADD ONE TO CA DAC DTBLC LAC RPTEMP JMP DTWCS2 DTWCS3 LAC RPTEMP DTWCS4 TAD (-12 SPA JMP DTWCS5 DAC RPTEMP LAC DTBLC TAD (40) /BUMP HEAD ADDRESS DAC DTBLC LAC RPTEMP JMP DTWCS4 /RECYCLE DTWCS5 LAC DTBLC TAD RPTEMP /INCLUDE SECTOR ADDRESS DAC DTBLC JMS DKSET JMP* DTWCS DKFUL LAC (DTWCS6 /SET UP FOR REENTRY ON IOPS 4. JMP DTFULA DTWCS7 LAC DTUNIT /CHECK TO SEE IF HAVE RUN OFF END OF DISK. TAD DLITM1 DAC DTUNIT LAC DLITM1 /NOW, PUT EOF ON LAST BLOCK OF LAST UNIT. DAC ENDSW LAC DTNXBK TAD (-2 /BUMP BACK 2 SO OK FOR DTWCS ROUTINE. DAC DTNXBK JMP DTCLOS /CLOSE ROUTINE OUTPUTS EOF. / /SUBROUTINE TO SET UP DISK I/O AND EXECUTE IOT'S. / DKSET 0 DKSET2 LAC DTFCA DPCA /LOAD CA LAC DTUWC /LOAD WC DPWC /LOAD WC LAC DTBLC DPLA /LOAD C-1L. ADDR,HA,SA LAC RPUNIT /DESELECT CURRENTLY ACTIVE DRIVE TAD (400000 /TO ALLOW READ ONLY SWITCHES DPLF /TO ACTIVATE LAC DTTR XOR DLIT3 SZA /ZERO IF INPUT LAC (10000 /OUTPUT TAD (10000 XOR RPUNIT /LOAD PACK PHYS. UNIT# DPCS /CLEAR STATUS DPLF /LOAD FUNCTION LESS GO BIT TO TEST UNIT DPRSB /READY. NOP /ADDED INSTR. FOR 4 MICRS. DELAY DPRSB /ADDED INSTR. FOR 4 MICRS. DELAY RAR AND (400) SZL /L=1 IF SELECTED UNIT NOT READY JMP RPUOFL /AC=0 IF WRITE PROT. ERR. -IOPS4 LAC (5000 /JAM GO BIT, JB. DONE AND ERR INTERP. DPCS /ENABLE-CLEAR STATUS DPLO /LOAD GO BIT+INTERRUPT ENABLES ION /ALLOW OTHER INTERRUPTS JMP* DKSET RPUOFL LAC (DKSET1 /IOPS4 ON UNIT OFF LINE DAC* DLIT3 LAC DLIT4 JMP DTM4 DKSET1 LAC DTERCT DAC DTUND /RESET I/O UNDERWAY SWITCH JMP DKSET2 / / .WRITE FUNCTION. / DTWRIT JMS DTIOU /I/O UNDERWAY? LAC DLIT5 /NO JMS DTMCK /COMMON READ - WRITE SETUP ROUTINE - 1 LAC* DTUFP /LOAD WORD 0 JMS DTWGPC /GO CALCULATE WC FROM USER WORD 0 LAC* DTUFP /LOAD WORD 0 OF USER BUFFER AND DLIT7 /MASK BITS SAD DLIT5 /EOF? JMP DTPASM-1 /FORGET LOADING DATA MODEP DTPASM SAD DLIT6 /EOT? DAC DTFMOD /OVERRIDE DATA MODE FOR EOT OR EOF INDICATOR. DTPASM LAC* DTUFP /IT IS O.K. SINCE DATA MODE CHECKED IN DTMCK AND (377000 /SAVE UP COUNT XOR DTFMOD DAC* DTUFP /RESTORE MODIFIED WORD 0 DZM DTCKSM /INIT CHECKSUM COUNT IDX DTHPT /BUMP TO WORD 1 DZM* DTHPT /ZERO WORD 1 FOR CHECKSUM CALCULATION LAW -377 JMS DTOBCK /CHECK USER BUFFER SIZE CLC /GET TWO'S COMPL. OF WC TAD DTWPC CMA DAC DTUWC /2'S COMPL OF WC-FOR DEFINING CHKSUM COUNTER LAC DTUFP /WORD 0 JMS CALCKS /CALCULATE CHKSUM CMA TAD DLIT1 /2'S COMP OF CHKSUM DAC* DTHPT /LOAD CHKSUM LAC DTUFP /CA JMS DTWCS /SUBROTINE TO SET UP WC,CA & SEARCH JMP DTAPE1 /NORMAL EXIT / / DTOBCK 0 TAD DTWPC /LBWC SPA!CLA JMP* DTOBCK /NO BUFFER OVERFLOW / / ERROR ROUTINES. / DTER15 DZM ENDSW LAC DLIT1 /DECTAPE FULL. SKP DTER16 TAD DLIT2 /BUFFER OVERFLOW /DECTAPE FULL DTER14 TAD DLIT2 /DTA DIRECTORY FULL-NOT USED ** /FILE NOT FOUND-NOT USED ** DTER12 TAD DLIT2 /IRREC. DTFERR.MK.TIK,EOT DURING TRANSFER /.SEEK OR .ENTER NOT EXECUTED-NOT USED ** DTER10 TAD DLIT2 /FILE STILL ACTIVE-NOT USED /ILLEG. DATA MODE TAD DLIT6 /ILLEG. HANDLER FUNCTION DTM4 DZM DTUND JMP* DLIT4 / / .CLOSE FUNCTION. / DTCLOS JMS DTIOU /I/O UNDERWAY ISZ DTCLSW /INIT. 777777 JMP DTCLDN /.CLOSE FINISHED--AC=777777 LAC DTIOSW /I OR O SNA!CLC JMP DTCLDN /INPUT-RESET SWITCHES AND EXIT. LAC (-3 /OUTPUT - 2'S COMPL. OF WORD COUNT FOR EOF DAC DTUWC LAC DLIT5 DAC DTTR LAC (DTEOFH /LOAD PTR. TO EOF HEADERS MINUS ONE JMS DTWCS JMP DTBUSY /GO HANG ON .CLOSE DTCLDN DAC DTCLSW /RESET TO 777777 LAC ENDSW /IF DOING A CLOSE BECAUSE OUT OF AVAILABLE SZA /DISK AREA, OUTPUT TERMINAL ERROR. JMP DTER15 JMP DTFBK /NORMAL EXIT / / .WAIT FUNCTION. / DTWAIT LAC DTCT /WAIT DTF ROUTINE SNA /1 IF .WAITR JMP DTFBK-1 /NO. HANG ON .WAIT LAC (700000 /LINK ETC. AND DTCALP DAC DTCALP LAC* DTARGP /15 BIT BUSY ADDR. AND (77777 XOR DTCALP ISZ DTARGP DAC DTCALP JMS DTIOU DTFBK DBR XCT .+1 XCT .+1 JMP* DTARGP /NORMAL EXIT / / UPDATE DISK UNIT STATUS WORD. / DTUPDT 0 LAC DTIOSW RAL!CLL /SAVE BIT 16 - DTIOSW DAC DTBUIL LAC DTNXBK SPA /SKIP IF NOT SPEC. CASE -1. CLC /777777 IN AC IF LESS THAN 0 AND (7777 /MASK OFF 12 BITS RTL XOR DTBUIL /LOAD BITS 4-15 WITH DTNXBK DAC DTBUIL LAC UNITNO /LOAD BITS 0-2 WITH UNITNO. RTR; RTR XOR DTBUIL DTLOAD XX /WILL BE A DAC DTMULP+DT UNIT # JMP* DTUPDT /EXIT /MULTIUNIT DECTAPE STATUS TABLE /UNITNO, DTNXBK, DTIOSW INFORMATION STORED IN ONE WORD FOR EACH UNIT. /BIT ASSIGNMENT FOR DT UNIT STATUS WORD: /BITS 0-2 = ACTUAL UNIT BEING USED (UNITNO). /BIT3=0 ALWAYS, BITS 4-15=DTNXBK(=7777 IF DTNXBK=-1), /BIT16=DTIOSW(0=INPUT, 1=OUTPUT). /INITIALLY BITS 4-15=1 ALL OTHERS=0 DTMULP=. .REPT 10 37774 .END