.TITLE DPA. /COPYRIGHT 1969, 1970, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. / 6-22-70 (EDIT 7) /RP EDIT 7 10--20--70 /RF09/15 DISK ADAPTATION - 8-26-70 - W. DESIMONE /M. SIFNAS 4-17-68 (IOPS 23 5-9-68)(56 FILES,EOF 5-22-68) /CLEAR FIX (5-15-68); IOPS 22 (6-4-68). /DPA.=IOPS DISK/DECTAPE HANDLER ALL MODES, 3 FILES /ALL FUNCTIONS /3-256 WD. BUF. /3 FILE BIT MAPS, 3 DIRECTORY BIT MAPS (32 WDS EACH) /3 FILES ACTIVE AT ANY GIVEN TIME /CALLING SEQUENCE /CAL+.DAT SLOT(9-17)+I(7-8)/.INIT /UNIT (0-2)+1 /RESTART ADDR. (MEANINGFUL FOR TTY HANDLER ONLY) /BUF SIZE (255) / /UNIT (0-2)+2 CAL+X(6-8)+.DAT SLOT (9-17) /.OPER (X=1=.DLETE) /DIR TYPE (0-2)=1+CORE ADDR. (3-17) /CAL+.DAT SLOT (9-17) /.SEEK /UNIT (0-2)+3 /USER DIRECTORY ENTRY POINTER /SAME AS .SEEK(FUNCTION=4) /.ENTER /CAL+.DAT SLOT (9-17) /.CLEAR /UNIT(0-2)+5 /CAL+.DAT SLOT(9-17) /.CLOSE /UNIT(0-2)+6 /.MTAPE - ILLEGAL /CAL+D.M.(6-8)+.DATSLOT(9-17) /.READ /UNIT (0-2)+10 /LINE BUF ADDR /-WC OF L.B. (2'S COMP) /SAME AS .READ(FUNCTION=11) /.WRITE /CAL+.DAT SLOT(9-17) /.WAIT /UNIT(0-2)+12 /CAL+X(8)+.DAT SLOT (9-17) /.TRAN (X=0=READ) /UNIT (0-2)+13 (X=1=WRITE) /BLOCK# /CORE ADDRESS /-WC / .EJECT .GLOBL DPA. 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=706322 /READ STATUS B INTO AC DPLO=706444 /LOAD AC ONES INTO ST. A (BITS 0-8) DPSA=706321 /SKIP ON ATTENTION FLAG DASIZE=BLAND-BLAB /FILE BLOCK A SIZE DABSIZ=BLBND-BLAB /FILE BLOCK A+B SIZE DABSZ2=DABSIZ*2 .IFUND DELTA DELTA=5 .ENDC DPA. DAC DTCALP /CAL POINTER DAC DTARGP /ARG. POINTER ISZ DTARGP /INDEX TO FUNCTION (AND UNIT#) LAC* DTARGP AND DTUMSK DAC DTCT1 /T SAVE UNIT# /EXTRACT DATA MODE OR SUBFUNCTION LAW 7000 AND* DTCALP RAR!CLL RTR RTR RTR RTR DAC DTCT2 /T STORE DATA MODE OR SUBFUNCTION /FILE STORAGE BLOCK SWAP ROUTINE LAC* DTCALP /GET DAT SLOT (9-17) AND (777 DTSLOT=DTTABL /TEMP. STOR. FOR .DAT SLOT OF CURRENT CALL SWAPSW=DTNTRZ DAC DTSLOT /T. SAVE DZM SWAPSW /CLEAR SWAP SW SAD DTFLS2 /FILE 2 SLOT # JMP DTSW2 /CURRENT CALL FOR FILE 2-SET UP SWAP SAD DTFLS3 /FILE 3 SLOT # JMP DTSW3 /CURR. CALL FOR FILE 3- SETUP SWAP SAD DTFLS1 /FILE 1 SLOT # JMP DTSLOK /CURRENT CALL FOR FILE 1 LAC DTFLS1 /FILE 1 SLOT # SNA JMP DTSLOK /EMPTY LAC DTFLS2 SNA JMP DTSW2 /EMPTY - SWAP. LAC DTFLS3 SZA!CLA /EMPTY - SWAP JMP DTER17 /EXCESSIVE # OF FILES REFERENCED /ROUTINE TO SET UP FOR FILE 3 SWAP DTSW3 LAC DTFLS1 /SLOT 1 INTO SLOT 3 DAC DTFLS3 LAC LDBSZ2 JMP DTSW4 /ROUTINE TO SET UP FOR FILE 2 SWAP DTSW2 LAC DTFLS1 /FILE 1 SLOT INTO FILE 2 SLOT DAC DTFLS2 LAC LDBSZ /(DABSIZ DTSW4 DAC DADSIZ /FILE BLOCK RELAT. POSITION /SWAP STORAGE BLOCKS DTSWAP LAW -DABSIZ /SAVE FULL BLOCK (A & B) DAC SWAPSW /SET SWAP SW DTSWP1 DAC DTCT /COUNT TO MOVE LAC (DLTDIR /1ST ADDR. OF FILE BLOCK 1 DTFB1P=DTMPS /FILE BLOCK 1 POINTER DTFB2P=DTMPP /FILE BLOCK 2 POINTER DAC DTFB1P /FILE BLOCK 1 POINTER TAD DADSIZ DAC DTFB2P /FILE BLOCK 2 POINTER DTSWP2 LAC* DTFB1P /SAVE BLOCK 1 CELL DTBLSV=DTWCS DAC DTBLSV LAC* DTFB2P /BLOCK 2 CELL INTO BLOCK 1 DAC* DTFB1P LAC DTBLSV /BLOCK 1 CELL INTO BLOCK 2 DAC* DTFB2P ISZ DTFB1P ISZ DTFB2P ISZ DTCT JMP DTSWP2 /CONT. DTSLOK LAC DTCT1 /CURR. UNIT DAC DTUNIT /INTO FILE BLOCK 1 LAC DTSLOT /STORE CURRENT DAT SLOT # DAC DTFLS1 /IN FILE BLOCK 1 LAC* DTARGP /IS THIS CALL AN INIT? AND DLIT77 XOR DLIT1 SZA!CLC /YES, USE NEW I/O BIT JMP DTSWMD DAC SWAPSW /SET SWAP SW LAC DTCT2 SKP DTSWMD LAC DTIOSW DAC DTIOSW /T STORE SNA /OUTPUT? JMP DTONW /NO SAD DTIOSW+DABSIZ /IS FILE 2 OUTPUT? JMP D2SAME /YES, SWAP MORE MAYBE DTSWME SAD DTIOSW+DABSZ2 /IS FILE 3 OUTPUT? JMP D3SAME /YES, SWAP MORE MAYBE JMP DTONW D2SAME LAC SWAPSW /SWAP SW SET? SZA LAC DTSKNT+DABSIZ /ENTER EXECUTED? SNA /YES JMP D2SAM1 LAC DTUNIT /OUTOUT ON SAME UNIT? XOR DTUNIT+DABSIZ SNA!CLC JMP DTER23 /IOPS 22: 2OUTPUT FILES ON 1 UNIT D2SAM1 LAC DTIOSW /CHECK FILE 3 JMP DTSWME D3SAME LAC SWAPSW /SWAP SW SET? SZA LAC DTSKNT+DABSZ2 /ENTER EXECUTED? SNA /YES JMP DTONW LAC DTUNIT /SAME UNIT XOR DTUNIT+DABSZ2 SNA!CLC JMP DTER23 /IOPS 22: 2 OUTPUT FILES ON 1 UNIT / DTONW LAC* DTARGP /FUNCTION (3-17)=1-13 ISZ DTARGP /INDEX TO ARG.3 AND DLIT77 TAD (JMP DTTABL DAC DTTABL CLA!CLL /AC AND LINK MUST BE 0 FOR DISPATCH. DTTABL XX JMP DTIN /1=.INIT JMP DTOPER /2=.OPER JMP DTSEEK /3=.SEEK JMP DTENTR /4=.ENTER JMP DTCLER /5=.CLEAR JMP DTCLOS /6=.CLOSE JMP DTER6 /7=.MTAPE(ILL) JMP DTREAD /10=.READ JMP DTWRIT /11=.WRITE JMP DTWAIT /12=.WAIT,.WAITR JMP DTRAN /13=.TRAN DTBUSY LAC DTCALP /BUSY-DTA I/O GOING ON DAC DTARGP /RETURN TO USER CAL JMP DTDBK /I/O UNDERWAY CHECK SUBR. DTIOU 0 LAC DTUND /I/O UNDERWAY SZA /NO DTBUSB JMP DTBUSY /WAIT LAC DTWRWT /CONTINUE MORE I/O SZA!CMA JMP* DTWRWT /YES JMP* DTIOU /OK-EXIT /DTA-DISK-INTERRUPT SERVICE DTPIC DAC DTAC /SAVE AC LAC* DLIT0 DAC DOUT /SAVE PC, LINK, EXT. MODE, MEM. PTCT. LAC DTION JMP DTSTON DTINT JMP DTPIC /PIC ENTRY DAC DTAC /API ENTRY, SAVE AC LAC DTINT /SAVE PC, ETC. DAC DOUT IORS /CHECK PIC STATUS SMA!CLA /FOR RESTORATION AT DISMISSAL LAW 17740 /PIC OFF, BUILD IOF TAD DTION /PIC ON, BUILD ION DTSTON DAC DTDVSW / /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 CLL!RAR SZL JMP DTERT /ERR. FLAG RFRDWT DPCS /CLEAR DISK STATUS. LAC DKSET /RELOAD STATUS A TO GET RP UNIT AND (700000) /MASK UNIT # AND IDLE TO CLEAR DPLF /DONE AND ERR INTERUPT ENABLE DTION ION /ION TO ALLOW OTHER INTERRUPTS DZM DTUND /CLEAR I/O UNDERWAY. DTUMSK LAW -400 DAC DWORD LAC RPCABS /BASE CYL. ADDR. FROM .INIT DAC RPCACK /INIT. CYL ADDR. FOR BLK 100 TEST RPCM10 LAW -10 /SET COUNTER DAC RPCT1 LAC DTBLC AND (1777) /MASK HA,SA SAD (304) /IS HA,SA=6,4? SKP JMP DTION1 DTION3 LAC DTBLC AND (776000) /(776000 SAD RPCACK JMP DTION2 /LOG BLK# 100 TRANSF. LAC RPCACK /ADD 3 TO CYL. ADDR TO TAD (6000 /CHECK ANOTHER LOG. UNIT# DAC RPCACK ISZ RPCT1 /BUMP CNT - CHECK ONLY 8 UNITS JMP DTION3 DTION1 CLC JMP DTDISM DTION2 LAC DTDRGT /CHECK DIR. REQ. SWITCH SZA!CLC JMP DTDISM DAC DTDRGT /CLEAR LAC DTUNIT DAC DTNCOR /SET DIR. IN CORE SWITCH JMP DTDISM /DATA OK, DISMISS DTERT LAC DKSET /RELOAD ST A. AND (24) SZA /AC>0 IF SEEK INCOMP. OR HEADER JMP RPRCL /NOT FOUND - RECALIBRATE + RETRY LAC DKSET AND (340) /AC>0 IF NON-EXISTENT DISK ADDR. SZA JMP DTER21 LAC DKSET /CHK. FOR WRITE PROT. ERR AND (400) SZA /AC>0 IF ERR JMP DKIPS4 /IOPS4 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 DKIPS4 LAC (DRETRY DAC* DLIT3 LAC DLIT4 JMP DTM4 RPRCL LAC (30000 /LOAD RECALIBRATE FUNCT. XOR RPUNIT /AND RETRY. DPLF DPRSB /2 INSTRUS. FOR 4 MICROSEC. DELAY DPRSB DPSA /TEST ATTENTION FLAG JMP .-1 ISZ DTERCT  JMP DRETRY /GO RETRY JMP DKER20 /DISK FAILURE RP12RT ISZ DTERCT /RETRY ROUTINE FOR FORMAT JMP DRETRY /OR TIMING ERROR JMP RPER12 DKER20 LAC DKSET /DISK HARDWARE OR ADDR. PARITY. DAC* DLIT3 /(.MED LAW 20 JMP DTM4 /DISK FAILURE. DTER21 LAC DKSET /ILLEGAL DISK ADDRESS. DTR21A DAC* DLIT3 LAW 21 JMP DTM4 DPARIT ISZ DTERCT /IF OVERFLOW, TAKE DATA ANYWAY SKP JMP RFRDWT /TAKE DATA ANYWAY. DRETRY JMS DKSET /REISSUE DISK TRANSFER LAC DTERCT /0 IF RETRY COUNT OVERFLOWS DAC DTUND /I/O UNDERWAY SW DTDISM LAC (JMP DTPIC /RESTORE PIC INTERR. ENTRY DAC DTINT LAC DTAC /RESTORE AC DTDVSW XX /ION IF PIC, LAC DTAC IF API DBR XCT .+1 XCT .+1 JMP* DOUT /INTERR. EXIT .EJECT / /INIT DTA ROUTINE - MAINSTREAM DTIN ISZ DTARGP /INDEX TO BUF. SIZE ARG. LAC (377 /RETURN 255 AS BUF. SIZE DAC* DTARGP LAC DTCT2 /I OR O DAC DTIOSW /OUTPUT=1, INPUT=0 ISZ DTARGP /INDEX TO NORM. EXIT LAC DLMBIT /DTMBIT)=FILE BITMAP POINTER JMS DTBFC2 /CLEAR FILE BIT MAP (L=0) DTIN2 JMS DTIOU /YES-WAIT DTONCE CAL 64 /API CORE ADDR.-MODIFIED / /DTONCE+1 TO DTSTOP EXCLUSIVE USED FOR TEMP. STORE. AFTER 1ST .INIT. /DTAC=AC STORAGE CELL DURING INTERRUPT /DOUT=INTERRUPTED RETURN ADDRESS /DTERCT=PARITY COUNTER (INIT. TO-10) /DTBLC=BL# BEING SEARCHED FOR /DTEOTS=END ZONE (EOT) ENTERED SWITCH (-=EOT, +=NO EOT) /DTCSLT=DAT SLOT FOR I/O UNDERWAY /DTCCA=CURRENT ADDR. (C.A.) POINTER FOR TRANSFER. /RPCABS=STORAGE FOR BASE SUPERUNIT ADDRESS. /RPUNIT=PHYSICAL DISK PACK DRIVE # /RPSTB=STORAGE FOR STATUS B /RPCACK=TEMP STORAGE FOR CHECK BLK# 100 ROUTINE /DTDMOD=DATA MODE (15-17) /DTHPTS=DTH BUFFER LINE HEADER POINTER. /DTTR=13000 FOR READ, 15000 FOR WRITE. /DTUCKP=USER LINE BUFFER CHECKSUM POINTER. /DTUDP=USER LINE BUFFER DATA POINTER (MODIFIED). /DTUHP=USER LINE BUFFER HEADER POINTER. /DTWC=2'S COMP. TRANSFER WORD COUNT. /DTCKSM=LINE CHECKSUM. /DTWPC=WORD PAIR COUNT. DTAC 16 /.SETUP DOUT DPSJ /DISK DONE FLAG SKIP DTCCA DTINT /DKA INT. SERV. ADDR. RPCABS CAL 64 RPUNIT 16 RPSTB DPSE /SKIP ON ERROR FLAG RPCACK DTINT JMP DTEOTS DTERCT 0 DTBLC 0 DTDMOD 0 DTEOTS LAC DJSTOP /SIGN BIT MUST INITIALLY = 0 FOR DTEOTS DTCSLT DAC DTONCE DTHPTS LAS /READ AC SWITCHES DTTR AND (770) /DRIVE #(9-11) SUPER UNIT# (12-14) DKCLR3 DAC DTHPTS /MASK BITS 9-14 AND STORE DKNUM AND (700) /MASK BITS 9-11 DKUNIT JMS RPR9 /AND SET UP RP UNIT# DTUCKP DAC RPUNIT /TOTAL ROT LEFT 9 AND STORE DTUDP LAC DTHPTS DKBUFP AND (70) /MASK BITS 12-14 DTUHP DAC DTHPTS /STR SUPUNT# TIMES 10(8) DTWC RAL!CLL /NOW TIMES 20(8) DTCKSM TAD DTHPTS /NOW TIMES 30(8)-THAT IS DTWPC JMS RPR9 /30(8)*SUPUNT#=20(8)*SUPUNT#+10(8)*SUPUNT# RPTEMP RAL /TOTAL OF 10 SHFTS RPCT1 DAC RPCABS /STORE BASE CTL. ADDR. JMP DTSTOP RPR9 0 RAL!CLL RTL RTL RTL RTL JMP* RPR9 DTBMIN=DTFAKE /BIT MAP BLOCK IN SWITCH (NON0=IN) DTBMOT=DTFAKE+1 /BIT MAP BLOCK OUT SWITCH (NON0=OUT) / /STOP DTA ROUTINE DTSTOP DZM DTWRWT /CLEAR OUTPUT WAIT SWITCH DZM DTEOF /CLEAR EOF SWITCH DZM DTCLSS /SET .CLOSE SWITCH DZM DTSKNT /CLEAR .SEEK, .ENTER SWITCH DZM DTWREX /CLEAR .WRITE EXECUTED SWITCH DZM DTBMIN /BIT MAP BLOCK IN SWITCH DZM DTBMOT /BIT MAP BLOCK OUT SWITCH LAC DTMTP4 /JMP DTAPE1 DAC DTOUT DAC DTNCOR /CLEAR DIR IN CORE SWITCH JMP DTDBK-1 /WAIT DTA ROUTINE DTWAIT LAC DTCT2 /0 IF .WAIT SNA /1 IF .WAITR JMP DTDBK-1 LAC (700000 /GET LINK, ETC. AND DTCALP DAC DTCALP LAC* DTARGP /BUSV ADDR. AND (77777 XOR DTCALP ISZ DTARGP DAC DTCALP JMS DTIOU /CHECK I/O UNDERWAY DTDBK DBR XCT .+1 XCT .+1 JMP* DTARGP /NORM. EXIT .EJECT /.OPER ROUTINE TO INTERPRET: /.DLETE (SUBFUNCTION 1) /.RENAME (SUBFUNCTION 2) /.FSTAT (SUBFUNCTION 3) DTDLUN=DTEOF /DELETE, RENAME UND-WAY SWITCH DTUDRP=DTCKSM /USER DIR ENTRY POINTER (INDEXED) DTOPER LAC DTDLUN /DELETE OR RENAM UNDERWAY SZA /NO, IF 1ST PASS THUR JMP DTLET3 /YES LAC DLFAKE /SETUP FOR DELETE DAC DTUDRP JMS DTNTRZ /DZM DT1SAV OR DT2SAV CLA XCT DTNTR3 /CLEAR LAST WD OF DTNSAV JMS DTCKCL /CHECK DIRECTORY FOR THIS FILE DAC DTNXBK /SAVE FOR AC=0ON NOT FOUND SNA JMP DTFST /NOT FOUND-RETURN WITH AC=0 XCT DTSK5 /PICK UP FIRST BLOCK # OF FILE. XOR (400000 /CLEAR FILE COMPLETE BIT. DAC DTNXBK LAC DTCT2 /SET UP SUBFUNTION DISPATCH TAD (JMP DTOPTB DAC DTOPTB-1 LAW -4 TAD DTCT2 /CHECK SUBFUNCTION SPA!CLA /1-3 LEGAL ONLY XX /DISPATCH TO SUBFUNCTION DTOPTB JMP DTER6 /ILL. HANDLER FUNCTION JMP DTLET /1=.DLETE JMP DTREN /2=.RENAM DTFST LAC* DTARGP /3=.FSTAT XOR (100000 /RETURN TYPE (1 IN 0-2) DAC* DTARGP /TO USER LAC DTNXBK /PICK UP BL#, RETURN TO USER IN AC DZM DTCLSS JMP DTAPE1 /.RENAM ROUTINE DTREN JMS DTNTRZ /NEW NAME INTO DTESAV XCT DTSK5 /GET 4TH WD OF OLD ENTRY XCT DTNTR3 /SAVE IN DTESAV+3 DAC DTBMIN /NO NEED TO RERECORD DAC DTBMOT /FILE BIT MAPS /.DELETE ROUTINE DTLET CLC DAC DTNCOR /CLEAR DIR IN CORE SWITCH DAC DTDLUN /SET DELETE UNDERWAY SWITCH DAC DTIOSW /SIMULATE WRITE DAC DTWREX /USE .CLOSE TO MODIFY LAC DLTDIR /SETUP FOR TRAN OF DAC DTBMPT /DIR BIT MAP TO DIR ENTRY SECTION DTLET3 ISZ DTARGP /INDEX ENTRANCE ARG. POINTER JMP DTCLOS /FILE BIT MAP+DIRECTORY .EJECT /CHECK DIRECT. IN CORE SUBR. DTDRCK 0 JMS DTIOU /I/O UNDERWAY LAC DTNCOR /D IN SAD DTUNIT /NO JMP DTDRC1 /YES - CHECK PARITY. LAC (13000 /READ PARAM JMS DTDRIN /BRING IN DIRECTORY JMP DTDRCK+1 /WAIT FOR DIRECTORY DTDRC1 LAC DTERCT /DIRECTORY UNACCEPTABLE WITH PARITY ERROR. SZA /OK. JMP* DTDRCK /OK. DTER61 LAW 61 /DIRECTORY OR FILE BIT MAP PARITY ERROR. JMP* DLIT4 / /CALL IN DIRECTORY SUBR. DTDRIN 0 DAC DTTR /TRANSFER DIRECTION SWITCH LAC DLT100 DAC DTNXBK /BL# TO TRANSFER DZM DTDTR /TRANSFER FORWARD DZM DTDRGT /SET IND. TO SET DIR IN CORE SWITCH LAC DTCLSS /0 IF SEEK, ENTER SZA LAC (40 /NOT 0 IF CLOSE (DTBUF-1 TAD DLTDIR /(DTRDIR DTDRN1 JMS DTWCS /SETUP WC,CA JMP* DTDRIN DTUDRR=DTDVS /USER DIR. ENTRY POINTER (FIXED) DTCTS=DTCCA /ENTRY COUNT (-3) DTCT1S=DTWC /MATCH COUNT (-4) DTDES=DTWCS /DTA DIR. ENTRY SECTION POINTER (INDEXED) /DIRECTORY SEARCH SUBR. DTSK1 0 DAC DTUDRR /USER DIR. ENTRY POINTER DZM DTDTR /SET TRANSF. DIRECTION=FORWARD DTSK2 CLC /SYSTEM TAPE? XOR* DLTSYS /WD3 OF SYS BIT MAP SNA!CLA /NO,56 FILES LAW -30 /YES, 24 FILES SMA LAW -70 DAC DTFPCT /DIR. POINTER=DTDIR+40=DTBUF XOR (777700 DAC DBLKLC /50 IF 24;10 IF 56 LAC DLTBUF /DIR. POINTER=DTDIR+40=DTBUF DTSK3 DAC DTDES /ENTRY SECTION POINTER DAC DTCURE /CURR. ENTRY, WD0, POINTER /NEXT FILE NAME ENTRY LAC DTUDRR /USER DIR. ENTRY POINTER DAC DTUDRP LAW -4 DAC DTCT1S /MATCH COUNT DAC DTCTS /COUNT OF ENTRY WDS TO CHECK ISZ DTCTS /NEXT WORD OF CURRENT ENTRY DTSK5 LAC* DTDES /DTA DIR. ENTRY (.E.) SAD* DTUDRP /USER D.E. ISZ DTCT1S /WD N OF ENTRY SATCHES ISZ DTDES /NEXT WD OF DTA ENTRY ISZ DTUDRP /NEXT WD OF USER ENTRY ISZ DTCTS /ENTRY WD COUNT JMP DTSK5 /CONT. MATCH CHECK DTSK6 LAC DTCURE ISZ DTCT1S /MATCH SKP /N JMP* DTSK1 /YES-CURRENT ENTRY POINTER IN AC TAD DLIT4 /INDEX TO NEXT ENTRY ISZ DTFPCT /INDEX FILE ENTRY CT. JMP DTSK3 /NEXT ENTRY CLA JMP* DTSK1 /YES-CAN'T FIND FILE NAME /CLOSE FILE SUBR DTCLOS JMS DTIOU /I/O UNDERWAY WAIT LAC DTIOSW /I OR O SNA JMP DTFND1 /INPUT-CLEAR SWITCHES EXIT LAC DTWREX /WRITE EXECUTED AFTER .ENTER SZA JMP DTCLS2 /YES JMS DTCBIT /NO-CLEAR BIT MAP JMP DTFND1 DTCLS2 LAC DTEOF /EOF BUF IS OUT SPA!CLC JMP DTCLS3 DAC DTEOF /SET EOF SWITCH DZM DTCT2 /FAKE DATA MODE = IOPS BIN LAC (15000 /OUTPUT JMS DTMCK LAC DLEOFH /EOF HEADER POINTER (DTEOFH /FAKE ARG FOLLOWS - USED AS VARIABLE DTDRGT LAW -1 /GET DIR IND. (0=GET) JMP DTWRT1 .EJECT DTCLS3 LAC DTBMIN /FILE BIT MAP BLOCK IN SZA!CLC JMP DTCLS4 DAC DTBMIN /SET BIT MAP IN SWITCH LAW -50 TAD DBLKLC SNA!CLA /NON 0 IF 56 ENTRIES LAW -4 TAD DLIT77 DTCLT DAC DTNXBK /BIT MAP BLOCK # LAC DTFPCT /FILE COUNT TAD (10 DAC DTFPCT SMA!CLC JMP DTCLQ /IN THIS BLOCK TAD DTNXBK /DECR. BIT MAP BL# BY 1 JMP DTCLT DTCLQ LAC DTBUSB DAC DTOUT DZM DTDTR /SET TRANSF. DIRECT. SW. = FORW. JMP DTSEK1 /READ BIT MAP BLOCK INTO DIR. BIT MAP DTCLS4 LAC DTBMOT /FILE BIT MAP BLOCK OUT SZA!CLA JMP DTCLS6 SAD DTERCT /PARITY ERROR COUNT. JMP DTER61 /ERROR ON FILE BIT MAP. DAC DTBMOT /SET BIT MAP OUT SWITCH LAC DTFPCT /REL. BIT MAP POINTER CLL!RAL /X 40 RTL RTL TAD DLTBUF /(DTBUF DAC DTBMOT /SET FILE BIT MAP OUT SWITCH. DTOLBM=DTOBCK /RELATIVE FILE BIT MAP ADDRESS DTXROL=DTMPS /OLD FILE BIT MAP ADDRESS DAC DTOLBM DAC DTXROL /OLD BIT MAP ADDR. LAC DLTDIR /DIR. BIT MAP ADDR. JMS DTXOR /XOR OLD FILE BIT MAP INTO DIR. BIT MAP LAC DLMBIT /NEW FILE BIT MAP ADDR DAC DTXROL LAC DTOLBM /OLD BIT MAP ADDR JMS DTXOR /XOR NEW INTO OLD BIT MAP LAC (15000 JMP DTSEK2 /OUTPUT BIT MAP BLOCK / .EJECT /SUBROUTINE TO XOR BIT MAP 1 INTO BIT MAP 2 /ALSO CLEARS BIT MAP 1 IF LINK = 0 DTXOR 0 DTXRNW=DTMPP /NEW BIT MAP ADDRESS DAC DTXRNW /BIT MAP 2 ADDR LAW -40 DAC DTCTS DTXOR1 LAC* DTXROL /BIT MAP 1 POINTER XOR* DTXRNW /BIT MAP 2 POINTER DAC* DTXRNW SNL!CLC /DO NOT CLEAR BIT MAP 1, CLC FOR SETTING DTNCOR DZM* DTXROL /CLEAR BIT MAP 1 ISZ DTXROL ISZ DTXRNW ISZ DTCTS JMP DTXOR1 JMP* DTXOR DTCLS6 SAD DTCLSS /FILE CLOSED (AC=0 ON ENTRY). JMP DTFEND /YES-CLEAR SWITCHES, EXIT JMS DTDRCK /LOAD DIRECTORY INTO DTBUF LAC DTBMPT /DT. BIT MAP POINTER DTCLRP=DTMPS /COUNTER DAC DTCLRP /NIT. DIR ENTRY SECT. POINTER LAW -40 /DIR. ENTRY SECTION COUNT DAC DTCT LAC DLTBUF /(DTBUF) DAC DTCT1 DTCLS5 LAC* DTCLRP /TRANSFER DIR. BIT MAP DAC* DTCT1 /TO FRONT OF DIR. ENTRY SECTION ISZ DTCLRP ISZ DTCT1 ISZ DTCT JMP DTCLS5 LAC DLSAV /(DTESAV .EJECT DTFIN=DTBFC2 /DTESAV POINTER DAC DTFIN LAC DTCURE /ADD 40 TO ACCOUNT FOR BLOCK MOVE TAD (40 DAC DTCURE LAW -4 DAC DTCT DTCLS7 LAC* DTFIN /NEW FILE NAME (4 WDS) DAC* DTCURE /INTO DIRECTORY ENTRY SECTION ISZ DTFIN ISZ DTCURE ISZ DTCT JMP DTCLS7 LAC (15000 /REWRITE DIRECTORY JMS DTDRIN DZM DTCLSS /CLEAR CLOSE IND. JMP DTCLOS DTFEND DAC DTNCOR /CLEAR DIR IN CORE SWITCH DTFND1 DZM DTFLS1 /CLEAR FILE 1 SLOT # DJSTOP JMP DTSTOP /CLEAR OTHER SWITCHES+EXIT /.TRAN ROUTINE DTRAN JMS DTIOU /I/O UNDERWAY LAC* DTARGP /BL# JMS DTSET /SETUP BL#, ETC ISZ DTARGP LAC* DTARGP /CORE ADDR. ISZ DTARGP DAC DTWCS /TEMP LAC* DTARGP /WC DAC DWORD LAC DTWCS /CA JMS DTWCS /SETUP CA AND START TRAN. JMP DTAPE1 /NORM USER EXIT /SUBROUTINE TO SET UP BLOCK #, TRANSFER DIRECTION DTSET 0 DAC DTNXBK LAC DTCT2 /TRANSFER DIRECTION RTR SMA!CLC /OUTPUT LAC (11000 /INPUT XOR (2000 AND (17000 DAC DTTR /WRITE (15000) OR READ (13000) SZL!CLA /FORWARD CLC /REVERSE DAC DTDTR /TRANSFER DIRECTION SWITCH JMP* DTSET .EJECT /SUBR. TO SET UP CA, WC AND TRANSFER DTWCS 0 DAC DTCCA /ADDR.-1 LAW -5 DAC DTERCT /SET PARITY RETRY COUNT DAC DTUND /SET I/O UNDERWAY SWITCH LAC DTFLS1 DAC DTCSLT /SAVE CURR. SLOT POINTER LAC DTUNIT /CHECK FOR LEGALITY OF CLL / 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) LAC DTNXBK /LOGICAL BLOCK NUMBER TAD (-1100 /-1100(8) SPA /CHECK FOR ILLEGAL BLOCK NUMBER JMP DTWCS1 /GO ON AND FINISH CONVERSION LAC DTNXBK /ILLEGAL BLOCK NUMBER JMP DTR21A /OUTPUT BAD BLOCK# WITH ERROR DTWCS1 LAC DTNXBK /CONVERT LOGICAL BLK# TO 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 /SUBR TO SET UP DISK I/O AND EXECUTE IOT'S DKSET 0 DKSET2 LAC DTCCA DPCA /LOAD CA LAC DWORD DPWC /LOAD WC LAC DTBLC DPLA /LOAD CYL. ADDR,HA,SA LAC RPUNIT /DESELECT CURRENTLY ACTIVE DRIVE TAD (400000 /TO ALLOW READ ONLY SWITCHES DPLF /TO ACTIVATE LAC DTTR XOR (13000 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 SZL /L=1 IF SELECTED 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 /IOPS 4 ON UNIT OFF LINE DAC* DLIT3 LAC DLIT4 JMP DTM4 DKSET1 LAC DTERCT /RESET I/O UNDERWAY DAC DTUND JMP DKSET2 / /.READ, .WRITE COMMON SETUP SUBR. DTUWC=DTXOR /USER 2'S COMP. WC FOR ARG. LIST DTMCK 0 DAC DTTR /READ (13000) OR WRITE (15000) LAC DTSKNT /.SEEK, .ENTER SWITCH SNA!CLC JMP DTER12 /.SEEK, .ENTER NOT EXECUTED (DTER11) XCT* DTMCK /L.B. OR DTA BUF. L.B. ADDR. DAC DTUHP /HEADER POINTER DAC DTUDP /DATA POINTER ISZ DTARGP LAC* DTARGP /USER WC DAC DTUWC LAC DTCT2 /DATA MODE DAC DTDMOD ISZ DTMCK /INDEX TO DUMP EXIT SAD DLIT4 JMP DTMCK2 /DUMP MODE LAC* DTUHP /COMPUTE W.C. FROM L.B.H. W.P.C JMS DTGWPC ISZ DTMCK /IOPS, IMAGE EXIT JMP* DTMCK /EXIT, /DUMP MODE DTMCK2 LAC DTUWC /SAVE USER WC DTWCSV=DTGWPC DAC DTWCSV DZM DTWPC XCT* DTMCK /JMP DTRDUM OR JUMP DTWDUM / /SUBR. TO TRANSF. WPC FROM HEADER TO DTWPC DTGWPC 0 RTR RTR RTR RTR AND (776 DAC DTWPC /T. STORE L.B.W.P.C. SNA JMP DTER23 AND (400 SNA!CLA JMP* DTGWPC /L.B.W.C. INAC DTER23 TAD DLIT4 /IOPS 23-ILL. WPC.(0 OR GREATER THAN 177) JMP DTER17 /SUBR. TO ADD TO CHKSUM AND INDEX COUNTS DTUPTR 0 TAD DTCKSM /ADD DATA WD TO CKSM. DAC DTCKSM ISZ DTUDP ISZ DTRHPT ISZ DTBFCT /INCR DTA BUF COUNT ISZ DTWPC JMP* DTUPTR JMP DTRDE /END LINE / /SUBR. TO CHECK ACTIVE FILE DTCKCL 0 LAC DTCLSS /PREVIOUS FILE CLOSED SZA!CLA JMP DTER10 /NO-FILE STILL ACTIVE JMS DTDRCK /CHECK FOR DIRECTORY IN CORE LAC* DTARGP /USER D.E. POINTER JMS DTSK1 /DIR. SEARCH FOR FILE DAC DTCLSS /CLEAR OR SET CLOSE SWITCH JMP* DTCKCL /DTA SEEK FILE SUBR DTSEEK LAC DTIOSW SZA!CLC JMP DTER10 /ILL. DATA MODE (.SEEK ON OUTPUT FILE) (DTER7) JMS DTCKCL /CHECK DIRECTORY FOR THIS FILE SNA!CLC /DTA DIR. ENTRY POINTER IN AC JMP DTER14 /FILE NOT FOUND (DTER13) XCT DTSK5 /PICK UP FIRST BLOCK # OF FILE. XOR (400000 /CLEAR FILE COMPLETE BIT. DAC DTNXBK /FIRST BLOCK # TO READ. DAC DTSKNT /SET .SEEK, .ENTER EXECUTED SWITCH. DTSEK1 LAC (13000 DTSEK2 DAC DTTR /INPUT DAC DTNCOR /CLEAR DIR. IN CORE SWITCH XOR (13000 SZA JMP DTCOUB /OUT DZM DTDMOD /CLEAR DATA MODE TO BYPASS DUMP CHECK JMP DTRNX1 /L.B. TO DTA BUF (.WRITE) OR DTABUF TO L.B. (.READ) DTRWT 0 DTWT2 LAC* DTUDP /USER L.B. DAC* DTHPT /TO DTA BUF JMS DTUPTR /ADD TO CKSUM, INDEX CTS, ETC ISZ DTHPT ISZ DTUWC /DONE JMP DTWT2 JMP* DTRWT / /.WRITE ROUTINE DTWRIT JMS DTIOU /I/O UNDERWAY LAC DTMTP4 DAC DTOUT DAC DTWREX /SET .WRITE EXECUTED SWITCH LAC (15000 JMS DTMCK /READ/WRITE COMMON SETUP LAC* DTARGP JMP DTWDUM /DUMP MODE WRITE ROUT. /RETURN HERE FOR IMAGE OR IOPS MODES DTWRT1 CLC TAD DTWPC /REMAINING BUF. AREA SIZE TAD DTBFCT /REMAINING BUF. AREA SIZE SMA!CLA JMP DTCOUT /NO ROOM FOR THIS LINE DTWRT2 DAC DTWRWT /OUTPUT WAIT SWITCH-CLEAR LAC* DTUHP AND (7 SAD (5 JMP DTWRT4 LAC* DTUHP /USER LBH., WD0 AND (377000 XOR DTDMOD /DATA MODE DTWRT3 DAC* DTUHP DTWRT4 ISZ DTUHP /CLEAR USER CKSM DZM* DTUHP DZM DTCKSM /INIT CHECKSUM LAW -377 JMS DTOBCK /OUTPUT BUF. SIZE CHECK CLC /EXCLUDE L.B.H.; WD0 DTWTM1 TAD DTWPC /FROM COUNT DTWT CMA DTWT1 DAC DTUWC /ACTUAL WC (2'S COMP) LAC DTHPT /SET UP CKSM POINTER DAC DTUCKP /FOR .WRITE ISZ DTUCKP JMS DTRWT LAC DTDMOD SAD DLIT4 JMP DTDUMK /DUMP MODE, CHECK FULL BOFF DTWT4 CLC TAD DTCKSM CMA DAC* DTUCKP /STORE 2'S COMP CKSUM IN DTABUF DTWT5 LAC DTEOF SZA /NO EOF JMP DTCOUY /TRANSFER EOF DTMTP4 JMP DTAPE1 /IOPS WRITE COMPLETE DTWRCL JMS DTBUFC /CLEAR DTA BUF ISZ DTARGP /INDEX TO WC ARG JMP DTWRT1 /PUT LINE IN DTA BUF / /OUTPUT BUFFER SIZE CHECK DTOBCK 0 TAD DTWPC /L.B. W.C. SPA!CLC /OUTPUT BUF. OVERFLOW (DTER16) JMP* DTOBCK DTER17 TAD DLIT1 /TOO MANY (4 OR MORE) FILES REFERENCED DTER16 TAD DLIT1 /OUTPUT BUFFER OVERFLOW DTER15 TAD DLIT1 /DECTAPE FULL. DTER14 TAD DLIT2 /DTA DIRECTORY FULL DTER12 TAD DLIT2 /IRREC. DTA ERR. MK. TK., EOT DURING TRANSFER /.SEEK, .ENTER NOT EXECUTED (DTER11) DTER10 TAD DLIT2 /FILE STILL ACTIVE DTER6 TAD (6 /ILL HANDLER FUNCTION DTM4 DZM DTUND /ZERO I/O UND SWT. IN CASE ^P JMP* DLIT4 /KM-9 ERR. LOC (.MED+1=4) /CLEAR OUTPUT BUF. SUBR. /ALSO NEEDED FOR INPUT BECAUSE OF POINTER INITIALIZATION DTBUFC 0 LAC (377 /INIT DUMP MODE DAC DTROOM /BUFF SIZE LAC DTIOSW RAR LAC DLTBUF /BUF. (WD0) POINTER (DTBUF SZL!STL /DO NOT MODIFY DTHPT ON INPUT DAC DTHPT /DTA BUF HEADER POINTER DAC DTRHPT /FOR READ JMS DTBFC2 /CLEAR BUF, LINK=1 JMP* DTBUFC /CLEAR SPECIFIED AREA SUBR. DTBFC2 0 DAC DTBFC3 LAW -40 /CLEAR 40 SZL AND DTUMSK /CLEAR 400, DTUMSK=777400 DTCLCT=DTMPP DAC DTCLCT /DTCLCT=DTMPP DAC DTBFCT /INIT BUF SIZE CT. ISZ DTBFCT DTBFC1 DZM* DTBFC3 ISZ DTBFC3 ISZ DTCLCT JMP DTBFC1 JMP* DTBFC2 DTBFC3 0 /CLEAR POINTER / /OUTPUT CURR. IOPS BUFFER DTCOUT LAC (DTWRCL /SET RETURN FROM INT. DAC DTWRWT /SET OUTPUT WAIT SWITCH DTCOUY LAC DTBUSB DAC DTOUT DTCOUZ LAC DTCNBK /CURR. BL# TO WRITE DAC DTNXBK SPA!CLC JMP DTER16 /DECTAPE FULL (DTER15) LAC DTWRWT SNA!CLA /IF DTWRWT IS NON 0,ALWAYS GET NEXT BLK # LAC DTEOF /EOF SWITCH SET? JMS DTMAP /FIND NEXT FREE BLOCK DAC* DTLINK /DATA LINK POINTER DTCOUB LAC DLTBUF /(DTBUF JMS DTWCS /SETUP WC,CA AND BEGIN TRAN. DTOUT XX /JMP DTAPE1 OR JMP DTBUSY / /DUMP MODE OUPUT DTWDUM JMS DTDUMB DTDUMX XCT DTXXX /JMS DTBUFC OR NOP JMP DTWT1 / DTDUMB 0 XCT* DTDUMB /JMS DTBUFC (WRITE) OR NOP (READ) ISZ DTDUMB LAC DTWRCL /SET SWITCH TO CLEAR DAC DTXXX /OUTPUT BUFF (JMS DTBUFC) LAC DTROOM TAD DTWCSV SMA /MORE THAN 3 7 TO TRANSFER JMP DTDUMZ /LAST ELEMENT OF TRANSFER DAC DTWCSV /SAVE REMAINDER LAW -2 TAD DTDUMB /RET. ADDR. FOR TRANS. COMP DAC DTWRWT /=I/O WAIT SWITCH LAC DTBUSB /JMP DTBUSY DAC DTOUT CLC TAD DTROOM /FILL IN BUFF CMA DTDUMY XCT* DTDUMB /JMP DTWT1(WRITE) OR JMP DTNSH1 DTDUMZ DZM DTWRWT /CLEAR I/O WAIT SWITCH DAC DTROOM /SPACE LEFT FOR NEXT DUMP SNA JMP .+3 /FULL BUFF, DO NOT NOP CLEAR BUFF LAC DTLNOP /SET SWITCH NOT TO CLEAR OUTPUT BUFF DAC DTXXX LAC DTMTP4 DAC DTOUT LAC DTWCSV /REMAINDER JMP DTDUMY DTDUMK LAC DTROOM /IF DTROOM=0, BUFF FULL SZA!CMA LAC DTWRWT /IF DTWRWT=0, BUFF NOT FULL SZA /NO JMP DTCOUZ /YES-OUTPUT JMP DTWT5 /CHECK EOF / .EJECT /DTA .READ ROUTINE DTREAD LAC DTEOF /EOF SWITCH SET? SZA JMP DTEFX /YES - IGNORE CALL JMS DTIOU /I/O UNDERWAY CHECK LAC* DTARGP /USER L.B. POINTER DAC DTHPT DAC DTHPTS LAC DTMTP4 /JMP DTAPE1 DAC DTOUT DTRD1 LAC (13000 JMS DTMCK /READ/WRITE COMMON SETUP, RETURN TO .+2 LAC DTRHPT /DTA BUF HEADER POINTER JMP DTRDUM /DUMP MODE INPUT /RETURN HERE FOR IOPS OR IMAGE MODES CLC TAD DTWPC /IOPS ASCII OR BIN (AC=777777 ON RETURN) TAD DTUWC DZM DTDVS /CLEAR SHORT LINE FLAG SMA!CLC DAC DTDVS /SET SHORT LINE FLAG TAD DTWPC CMA DAC DTWPC /2'S COMP HEADER W.C. DTRD2 DZM DTCKSM /CLEAR CHECKSUM JMS DTRWT /TRANSFER LINE TO USER L.B. LAC DTDMOD SAD DLIT4 JMP DTRDM1 /DUMP LAC* DTUDP /BYPASS JMS DTUPTR /EXCESS DATA JMP .-2 DTRDM1 LAC DTROOM /DUMP MODE BUFF SIZE SZA!CMA /IF DTROOM=0 OR LAC DTWRWT /DTWRWT=NON 0, SZA!CLC JMP DTRNEX /GET NEXT DUMP BLOCK JMP DTAPE1 / .EJECT /END INPUT LINE ROUTINE DTRDE LAC* DTHPTS /HEADER WD 0-IOPS AND (7 SAD (5 /EOF? JMP DTREOF /YES ISZ DTDVS /SHORT LINE FLAG SET JMP DTRDE1 /NO LAC (60 JMS DTDVS /SET D.V. BITS FOR SHORT LINE DTRDE1 LAC DTERCT /PARITY RETRY COUNT SMA!CLA JMP DTRDP /SET D.V. BITS=PARITY LAC* DTHPTS /HEADER, WD 0 SPA JMP DTRDN /IGNORE CKSUM ALREADY SET LAC DTCKSM SNA /SET D.V. BITS=CKSUM ERROR JMP DTRDN DTRDC LAC (20 /CHECKSUM ERR. IN LINE, 12,13=10 DTRDP TAD (20 /PARITY ERROR IN DTA BLOCK 12,13=01 JMS DTDVS /SET DATA VALIDITY BITS DTRDN LAC* DTUDP DTRDN1 SNA!CLC JMP DTRNEX /NO MORE DATA-GET NEXT BL. ISZ DTBFCT /DATA BUF. CT = GET NEXT BL. JMP DTRNOR /NORM EXIT DTRNEX SAD* DTLINK /DATA LINK=-0 JMP DTREOF /LAST BLOCK -SET EOF SWITCH LAC DTNXBK /MAST BL# CMA TAD* DTLINK /DATA LINK (NEXT BLOCK) SPA!CLA /READ FORW CLC /READ REV. DAC DTDTR /TRANSF. DIRECTION SWITCH LAC* DTLINK DAC DTNXBK /DATA LINK INTO NEXT BLOCK DTRNX1 JMS DTBUFC /INIT. BUFFER LAC DTDMOD /DUMP MODE? XOR DLIT4 SZA /YES JMP DTCOUB /NO LAC DTRHPT /RESET BUFF POINTER DAC DTUDP JMP DTCOUB /TRANSFER / .EJECT /SUBR. TO SET DATA VALIDITY BITS DTDVSM=DTTABL /DATA VALIDITY BIT MASK DTDVS 0 DAC DTDVSM /SAVE MASK LAC* DTHPTS /MASK ALL BUT BITS 0, 12,13 AND (777717 XOR DTDVSM DAC* DTHPTS /HEADER, WD0 JMP* DTDVS DTEFX ISZ DTARGP DTREOF DAC DTEOF /SET EOF SWITCH+DROP THRU TO EXIT DTRNOR TAD DTBFCT /DECR. (BY 1) DTFCT DAC DTBFCT /BUF COUNT DTAPE1 ISZ DTARGP JMP DTDBK DTNSH1 DAC DTUWC JMP DTRD2 /TRANSFER LINE /DUMP MODE INPUT DTRDUM JMS DTDUMB /SET UP FOR DUMP INPUT DTLNOP NOP JMP DTNSH1 / /DTA ENTER FILE ROUTINE DTENTR LAC DTIOSW /I/O SWITCH SNA!CLC JMP DTER10 /ILL. DATA MODE (.ENTER ON INPUT FILE)(DTER7) JMS DTCKCL /CHECK DIRECTORY FOR THIS FILE SZA JMP DTNTR6 /FOUND-WILL BE MODIFIED ON .CLOSE LAC DLFAKE /INIT GOR EMPTY SLOT SEARCH (DTFAKE JMS DTSK1 /D SEARCH FOR EMPTY FILE ENTRY DAC DTCLSS /CLEAR OR SET CLOSE SWITCH SNA JMP DTER14 /DIRECTORY FULL DTNTR6 LAC* DTARGP /SAVE USER D.E. POINTER DAC DTUDRP JMS DTNTRZ /SAVE USER D.E. IN DT1SAVOR DT2SAV / .EJECT LAW -40 /INIT BIT MAP SEARCH DAC DTWMCT /BIT MAP WORD COUNT LAC DLMBIT /FILE BIT MAP POINTER (DT1BIT) OR (DT2BIT) DAC DTPONT /CURR. FILE BIT MAP WD. POINTER LAC DLTDIR /BIT MAP ADDR. POINTER (DTDIR DAC DTMTRX DAC DTBMPT /SET BIT MAP POINTER DZM DTRELB /BL. # DL1100 LAW -1100 /INIT DT BLOCK COUNT. DAC DTBLOK DLM1 LAW -1 /INIT BIT MAP DAC DTREM /SEARCH TO DAC DTSKNT /PICK UP DAC DTNCOR /1ST BLOCK FREE LAC DLIT1 /(1 DAC DTDIRA /SET BIT MAP DIRECTION SWITCH DAC DTDIRL /TO FORWARD (+1) JMS DTMPS /SETUP TO EXAM. MAP, WD0 DTNTR4 JMS DTMAP /GET NEXT FREE BL# SNA /CANNOT ALLOW A FILE TO BEGIN IN BLOCK ZERO. JMP DTER15 /DISK UNIT FULL. XOR (400000 XCT DTNTR3 /STORE BL#+COMPLETION BIT IN DTESAV+3 SMA!CLC JMP DTER16 /DECTAPE FULL (DTER15) JMS DTBUFC LAC DTLNOP DAC DTXXX /SET OUTPUT DUMP SWITCH JMP DTAPE1 /NORM EXIT /SUBR. TO SAVE USER D.E. DTNTRZ 0 LAC DLSAV /(DT1SAV) OR (DT2SAV) DAC DTFIN LAW -3 /SET DTA D.E. DAC DTCLCT /TRANSFER COUNTER DTNTR2 LAC* DTUDRP /SAVE USER D.E. DTNTR3 DAC* DTFIN ISZ DTFIN ISZ DTUDRP ISZ DTCLCT JMP DTNTR2 JMP* DTNTRZ .EJECT DT1SAV 0 /1ST NEW FILE ENTRY SAVED HERE 0 0 0 DT2SAV 0 /2ND NEW FILE ENTRY SAVED HERE 0 0 0 DT3SAV 0 /3RD NEW FILE ENTRY SAVED HERE 0 0 0 DTFAKE 0 /EMPTY SLOT FOR ENTER SEARCH (LAST WD. UNUSED) 0 0 DTEOFH 1005 /EOF HEADER FOR CLOSE /SUBR TO SET UP FOR EXAM OF NEXT BIT MAP WORD DTMPS 0 LAW -22 DAC DTRBIT /18 BIT COUNT LAC* DTMTRX /NEXT BIT MAP WD CMA!STL DAC DTSBIT LAC DTDIRA /BIT MAP DIRECTION SWITCH SMA!CLA!RAL /REVERSE-SEARCH BIT 18-0 RTR /FORWARD-SEARCH BIT 0-18 DAC DTTBIT /FORWARD(0=1); REVERSE (18=1) JMP* DTMPS .EJECT /END OF CURRENT BIT MAP WORD SUBR. DTMPP 0 DTMPP1 LAC DTDIRA /INCR. (IF FORWARD) OR TAD DTMTRX /DECR. (IF REV) BY 1 DAC DTMTRX /DT. BIT MAP POINTER LAC DTDIRA TAD DTPONT /FILE BIT MAP POINTER DAC DTPONT DTMPP2 JMS DTMPS /SET FOR NEXT WD ISZ DTWMCT /BIT MAP WORD CT JMP* DTMPP /EXIT LAW -1100 DAC DTBLOK /RESET BLK COUNT DZM DTBMCT /CLEAR BIT MAP SEARCH COUNT CLA ISZ DTDIRA /TURN AROUND LAW -2 /REV. TAD DLIT1 /FORWARD DAC DTDIRA /SET FOR REV. SEARCH TAD DTRELB /REINIT DAC DTRELB /ROUTINE TO SET DTREM FOR TURN AROUND CASE LAC DTDIRA RAL /L=1=REV.,L=0=FORW. LAC DTNXBK /LAST BL # RECORDED FOR THIS FILE CMA SNL /REV JMP .+3 TAD (1100 CMA DAC DTREM /LAW TO CHECK ENOUGH SPACE BETW BL LAW -41 DAC DTWMCT /MATRIX COUNT JMP DTMPP1 /START REV. SEARCH DTBMCT=DTOBCK /BIT MAP SEARCH COUNT (MUST BE 5 OR MOR TO EXIT) / .EJECT /BLOCK AVAILABILITY BIT MAP SEARCH DTMAP 0 DAC DTCLR2 /SAVE AC, IF -1, IT WILL BE BLK# ON EXIT DZM DTBMCT /BIT MAP SEARCH COUNT DTMAP1 LAC DTTBIT /TEST BIT DTMAP2 AND DTSBIT /MATRIX WORX SZA!CLC DTMAP3 JMP DTREM /BLOCK AVAILABLE ISZ DTBLOK /INCR. DT BLOCK COUNT JMP DTMAP4 DAC DTBLOK JMP DTREM5 DTMAP4 ISZ DTBMCT LAC DTDIRA /IF FORW, INCR. BL# TAD DTRELB /IF REV., DECR. BL.# BY1 DAC DTRELB LAC DTDIRA RAL /L=0=FORW; L=1=REV. LAC DTTBIT /SHIFT TEST BIT RIGHT IF FORW, SNL!CLL!RAL /LEFT IF REV. RTR DAC DTTBIT ISZ DTRBIT /INDEX-18 BIT COUNT JMP DTMAP2 /NEXT BIT JMS DTMPP /END OF MATRIX WD. SUBR. JMP DTMAP1 /NEXT WORD DTREM XX /DELTA BLOCKS IN BETWEEN TAD DTBMCT DTREM3 SPA!CLC /OK-4 BLOCKS IN BETWEEN JMP DTMAP4 /CHECK BIT MAP AGAIN SAD DTCLR2 /IF ENTRY AC = -1, NO DTCBIT JMP DTREM6 JMS DTCBIT /SET BIT IN MAPS CMA DAC DTSBIT DTREM6 LAW -DELTA /RESET BLOCK DAC DTREM /DISTANCE CHECK TO -DELTA LAC DTDIRL /SET TRANSF DIRECTION SWITCH SPA!CLA CMA DAC DTDTR LAC DTDIRA /UPDATE DTDIRL DAC DTDIRL DTREM4 LAC DTRELB /T. STORE BL# TO BE USED DTREM5 DAC DTCNBK /EXIT LAW -1 /WAS AC ON ENTRY = -1? SAD DTCLR2 SKP /YES, EXIT WITHH AC= -1 LAC DTCNBK /NEW BLK # JMP* DTMAP /EXIT -BL ! FOUND(777777=DTA FULL) / /CHANGE BIT IN MAPS SUBR. DTCBIT 0 LAC DTTBIT /SET BIT IN FILE BIT MAP XOR* DTPONT DAC* DTPONT LAC DTTBIT /SET BIT IN MAP XOR* DTMTRX DAC* DTMTRX JMP* DTCBIT /C(*DTMTRX) MUST BE IN AC ON EXIT /CLEAR DIRECTORY ROUTINE DTCLR2 XX /LAC DTBLBT=BLOCK TABLE DZM DTCT2 ISZ DTCT2 /WRITE FORWARD JMS DTSET /SET BL# ETC LAC DLTBUF /(DTBUF JMS DTWCS /SET UP CA, WC+BEGIN TRANSFER ISZ DTCLR2 /INDEX FOR NEXT TRANSFER DTCLER JMS DTIOU /WAIT FOR I/O TO FINISH LAC DTCLSS /CLOSE SWITCH CLEAR SZA!CLA /YES JMP DTER10 /FILE STILL ACTIVE LAC (DTCLR1 /SET RETURN AND DAC DTWRWT /I/O WAIT SWITCH DAC DTNCOR /CLEAR DIR IN CORE SWITCH LAC (LAC DTBLBT DAC DTCLR2 /INIT TABLE REF JMS DTBUFC /CLEAR BUFF LAW -10 /COUNT FOR DAC DTBFC3 /FILE BIT MAP BLOCKS LAW -11 DAC DTCLCT /COUNT OF BLOCKS TO CLEAR+1 DTCLR1 ISZ DTBFC3 /FILE BIT MAP BLOCKS CLEARED? JMP DTCLR4 LAC (77600 /INIT DIRECTORY TO 4 SYSTEM BLKS OCCUPE DAC* DLB003 DAC* DLB203 DTCLR4 ISZ DTCLCT /DONE JMP DTCLR2 DZM DTWRWT /YES-CLEAR I/O WAIT SWITCH JMP DTDBK .EJECT /DTCLER BLOCK TABLE DTBLBT 71 /BLOCKS 71-73 CONTAIN 72 /24 BIT MAPS ORDERED ACCORDING DLIT73 73 /TO THE FILE NAMES IN THE DIR. ENTRY SECTION 74 75 76 DLIT77 77 DLT100 100 /BLOCK 100=DIRECTORY DT1BIT 0 /FILE 1 BIT MAP .LOC DT1BIT+40 DT2BIT 0 /FILE 2 BIT MAP .LOC DT2BIT+40 DT3BIT 0 /FILE 3 BIT MAP .LOC DT3BIT+40 DTDIR 0 /DTA DIRECTORY (FILE1) .LOC DTDIR+40 DTBUF 0 /DTA BUFFER (FILE1) .LOC DTBUF+400 DTDIR2 0 /DTA DIRECTORY (FILE2) .LOC DTDIR2+40 DTBUF2 0 /DTA BUFFER (FILE2) .LOC DTBUF2+400 DTDIR3 0 .LOC DTDIR3+40 /DTA DIRECTORY (FILE 3) DTBUF3 0 .LOC DTBUF3+400 /DTA BUFFER (FILE 3) DTFLS1 0 /FILE1 DAT SLOT DTFLS2 0 /FILE 2 DAT SLOT DTFLS3 0 /FILE 3 DAT SLOT / .EJECT /FILE 1 BLOCK-SECTION A BLAB=. DLTDIR DTDIR /DIRECTORY POINTER DLTSYS DTDIR+203 /WD3 0F SYS BIT MAP DLTBUF DTBUF /DTA BUF. POINTER DLB003 DTBUF+3 /SYSTEM BLOCK BITS POINTER DLB203 DTBUF+203 /BASIC SYSTEM BLOCK BITS POINTER DTLB40 DTBUF+40 /DIR. ENTRY POINTER (.CLOSE) DTLINK DTBUF+377 /FILE1 DATA LINK POINTER DLMBIT DT1BIT /FILE1 BIT MAP POINTER DLSAV DT1SAV /POINTER TO 1ST CELL OF NEW DIR. ENTRY DTROOM 377 /DUMP MODE BUFF SIZE (MODIFIED DTXXX XX /DUMP MODE OUT SWITCH(JMS DTBUFC OR NOP) DTNXBK 0 /BL.# TO BE TRANSFERRED DTCNBK 0 /DATA LINK (NEXT BL.#) DTCURE 0 /DIR. POINTER TTO CURR. FILE ENTRY EXAMINED DTEOF 0 /EOF SWITCH, -0=EOF DTHPT 0 /DTA BUF. LINE HEADER POINTER (INDEXED) DTIOSW 0 /I/O SWITCH, 0=INPUT, 1=OUTPUT DTRHPT 0 /DTA BUF. LINE HEADER POINTER (.READ) DTSKNT 0 /.SEEK,.ENTER EXECUTED SWITCH (NON 0=EXECUTED) DTPONT 0 /CURR. FILE BIT MAP WD POINTER DTCLSS 0 /FILE OPEN, CLOSE SWITCH(NON-0=OPEN,0=CLOSED) DTBFCT 0 /BUFFER COUNT (INIT=-377) DTDTR 0 /TRANSF. DIRECT. SW.,0=F,-1=R DTWREX 0 /WRITE EXECUTED SWITCH (0=NOT, NON 0=EXECUTED) DTFPCT 0 /FILE ENTRY COUNT DBLKLC 0 /24-56 FILE ENTRY SWITCH(50=24;10=70) BLAND=. /FILE 1 BLOCK-SECTION B /SECTION B IS NOT SWAPPED WHEN BOTH FILES ARE ON SAME UNIT DTUNIT 0 /(0-2)=DTA UNIT# FOR TRANSFER DTNCOR 077777 /DIRECT. IN CORE SWITCH DTDIRA 0 /BIT MAP DIRECTION SWITCH (CURR. BL.)+1=F,-1=R DTDIRL 0 /BIT MAP DIRECTION SWITCH (LAST.BL.),+1=F,-1=R DTMTRX 0 /CURRENT BIT MAP WD. POINTER DTRBIT 0 /18 BIT (2'S COMP)COUNTER FOR BIT MAP SEARCH DTRELB 0 /FREE BL.#AFTER BIT MAP SEARCH DTSBIT 0 /-(MATRIX WORD) DTTBIT 0 /TEST BIT FOR BIT MAP SEARCH DTWMCT 0 /BIT MAP WORD COUNT DTBMPT 0 /DIR. BIT MAP 1 POINTER DTBLOK 0 /BLOCK EXAMINED COUNT BLBND=. / .EJECT /FILE 2 BLOCK - SECTION A DTDIR2 /DIRECT 2 POINTER DTDIR2+203 DTBUF2 /DTA BUF 2 POINTER DTBUF2+3 DTBUF2+203 DTBUF2+40 /DIR. ENTRY POINTER (FOR CLOSE) DTBUF2+377 /FILE 2 DATA LINK POINTER DT2BIT /FILE 2 BIT MAP POINTER DT2SAV /NEW DIR ENTRY POINTER 377 XX 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /FILE 2 BLOCK - SECTION B 0 077777 0 0 0 0 0 0 0 0 0 0 / .EJECT /FILE 3 BLOCK - SECTION A DTDIR3 /DIRECTORY 3 POINTER DTDIR3+203 DTBUF3 /DTA BUF 3 POINTER DTBUF3+3 DTBUF3+203 DTBUF3+40 /DIRECTORY ENTRY POINTER (FOR CLOSE) DTBUF3+377 /FILE 3 DATA LINK POINTER DT3BIT /FILE 3 BIT MAP POINTER DT3SAV /NEW DIRECTORY ENTRY POINTER 377 XX 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 / / /FILE 3 BLOCK - SECTION B 0 077777 0 0 0 0 0 0 0 0 0 0 / .EJECT /FOLLOWING =CELLS USED IN COMMON BY BOTH FILES DLFAKE DTFAKE /POINTER TO EMPTY FILE NAME DTARGP 0 /ENTRANCE ARG. POINTER DTCALP 0 /USER CAL POINTER DTCT1 0 /GEN. PURP. COUNTER AND T. STOR. DTCT2 0 /GEN PURP COUNT AND T STOR DTUND 0 /I/O UNDERWAY SWITCH,NOT 0=BUSY,0=NOT BUSY DTWRWT 0 /CONTINUED I/O SWITCH (NON 0=CONT),0=DONE) DLEOFH DTEOFH /EOF HEADER POINTER (FOR .CLOSE) DTCT 0 /T STORE DADSIZ 0 /FILE BLOCK RELATIVE POSITION DLIT0 0 DLIT1 1 DLIT2 2 DLIT3 3 DLIT4 4 LDASZ DASIZE /LIT LDBSZ DABSIZ /LIT LDBSZ2 DABSZ2 /LIT DWORD LAW -400 /WORD COUNT, MODIFIED BY.TRAN .END