.TITLE DRB. / 9-23-68 /COPYRIGHT 1968, DIGITAL EQUIPMENT CORP., MAYNARD, MASS /DRUM ADAPTATION /M. SIFNAS 12-18-67 (DELTA - 4-8-68 (.WAITR 3-22-68) (IOPS 23 5-9-68) /(56 FILES 5-15-68)(EOF 5-22-68) /DRB.=IOPS DRUM/DECTAPE HANDLER-READ, WRITE IOPS MODES ONLY, 2 FILES /LIMITED FUNCTIONS /2-256 WD. BUF. /2 DIRECTORY BIT MAPS (32 WDS), 2 FILE BIT MAPS (32 WDS) /2 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) /CAL+.DAT SLOT (9-17) /.OPER (ILL. FUNCTION) /DIR TYPE (0-2)=1+CORE ADDR. (3-17) /UNIT (0-2)+2 /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 (ILL. FUNCTION) /UNIT(0-2)+5 /CAL+.DAT SLOT(9-17) /.CLOSE /UNIT(0-2)+6 /CAL+SUBFUNCTION(5-8)+.DAT SLOT /.MTAPE (0=REWIND) (ILL. FUNCTION) /UNIT(0-2)+7 (2=BACKSPACE RECORD) /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+1000+.DAT SLOT(9-17) /.WAITR /UNIT(0-2)+12 /BUSY ADDRESS (15 BITS) /CAL+X(8)+.DAT SLOT (9-17) /.TRAN (X=0=READ) (ILL FUNCTION) /UNIT (0-2)+13 (X=1=WRITE) /BLOCK# /CORE ADDRESS /-WC / .EJECT .GLOBL DRB. .SCOM=100 .MED=3 /IOT ASSIGNMENTS DRSF=706101 /SKIP ON DONE FLAG DRNEF=706201 /SKIP ON NOT ERROR DRCE=706202 /CLEAR DATA ERROR DRCF=706102 /CLEAR DONE AND ERROR FLAG DRLD=706106 /CLEAR FLAGS,LOAD DRUM ADDR.,BEGIN TRANSFER DRRD=706006 /LOAD CORE ADDR. AND SET TO READ DRWR=706046 /LOAD CORE ADDR. AND SET TO WRITE DABSIZ=BLBND-BLAB DELTA=5 DRB. 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 /FILE STORAGE BLOCK SWAP ROUTINE LAC* DTCALP /GET DAT SLOT (9-17) AND L777 DTSLOT=DTTABL /T. STORE FOR NEW DAT SLOT DAC DTSLOT /T. SAVE SAD DTFLS2 /FILE 2 SLOT # JMP DTSWAP /CURRENT CALL FOR FILE 2 SAD DTFLS1 /FILE 1 SLOT # JMP DTSLOK /CURRENT CALL FOR FILE 1 LAC DTCT2 /MUST BE AN INIT XOR DTIOSW /DOES I/O BIT FOR FILE ONE MATCH NEW ONE? SNA /NO, SWAP JMP DTSLOK / .EJECT /SWAP STORAGE BLOCKS DTFB1P=DTMPS DTFB2P=DTMPP DTSWAP LAC DTCT1 /UNIT # OF CURR. CALL XOR DTUNIT /UNIT # OF FILE 1 DAC DTSAM /SET SAME UNIT SW LAW -DABSIZ /SAVE FULL BLOCK (A & B) DTSWP1 DAC DTCT /COUNT TO MOVE LAC (DLTDIR /1ST ADDR. OF FILE BLOCK 1 DAC DTFB1P /FILE BLOCK 1 POINTER TAD LDAB /(DABSIZ DAC DTFB2P /FILE BLOCK 2 POINTER DTSWP2 LAC* DTFB1P /SAVE BLOCK 1 CELL DTBLSV=DTWCS /T. STORE FOR FILE BLOCK SWAP 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 /FUNCTION (3-17)=1-13 ISZ DTARGP /INDEX TO ARG.3 AND (77 TAD (JMP DTTABL DAC DTTABL LAC DFULSW /FULL SW SET? SZA!CLA!CLL /CLEAR LINK FOR INIT BIT MAP CLEAR JMP DTCLOS /YES, CONT. CLOSE .EJECT DTTABL XX JMP DTIN /1=.INIT JMP DTER6 /2=.OPER (ILL) JMP DTSEEK /3=.SEEK JMP DTENTR /4=.ENTER JMP DTER6 /5=.CLEAR (ILL.) JMP DTCLOS /6=.CLOSE JMP DTER6 /7=.MTAPE (ILL) JMP DTREAD /10=.READ JMP DTWRIT /11=.WRITE JMP DTWAIT /12=.WAIT,.WAITR JMP DTER6 /13=.TRAN (ILL.) 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 (ION 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 (ION /PIC ON, BUILD ION DTSTON DAC DTDVSW DRNEF /SKIP ON NOT ERROR JMP DRER /ERROR FLAG UP .EJECT /DONE FLAG MUST HAVE COME UP LAC DRDWAT /IS THIS A DONE FLAG WAIT CONDITION? SZA /NO, ALL OK: TRANSFER DONE JMP DRPREV /YES, RESOLVE EARLIER ERROR STATE DRCF /CLEAR DONE AND ERROR FLAGS DZM DTUND /CLEAR I/O UNDERWAY SWITCH LAC DTSAFE /BLK 100 (DIRECTORY) IN? AND L777 XOR (100 XOR DTDRGT /DIRECTORY REQ. SW. SZA!CLC JMP DTDISM /NO, DISMIS DAC DTDRGT /RESET DIR. RQ. SW. LAC DTUNIT DAC DTNCOR /SET DIRECTORY IN CORE SW. JMP DTDISM /DISMIS /ERROR FLAG ROUTINE DRER DRCE /CLEAR DATA ERROR /CLEARS ONLY IF TIMING,WRITE LOCK OR NON-EX. LAC DRIOT SAD (DRRD /WAS THIS A READ? LAC (JMP DPARIT /YES, COULD BE PARITY OR TIMING ERROR DRNEF /SKIP OCCURS IF TIMING OR WRITE LOCK,ETC SKP /DEFINATELY PARITY LAC DLCLA /IOPS 4: TIMING OR WRITE LOCK DAC DRDWAT /COME HERE ON DONE TO CHECK FOR EARLIER ERROR DRPREV DAC DRXCT DRSF /SKIP ON DONE JMP DTDISM /DISMIS TO WAIT FOR DONE DRCF /ISSUE CLEAR DONE ONLY WHEN DONE SKIP SKIPS DZM DRDWAT /CLEAR DONE WAIT SW. DRXCT XX /JMP DPARIT OR CLA (IOPS 4) /IOPS 4 ROUTINE LAC (DRETRY DAC* DLIT3 LAC DLIT4 /IOPS 4 CODE JMP* DLIT4 DPARIT ISZ DTERCT /PARITY RETRY COUNT DRETRY JMS DKSET /REISSUE DISK READ DNRET LAC DTERCT /0 IF TRY COUNT OVERFLOWS DAC DTUND /I/O UNDERWAY SW. .EJECT 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 JMP* DOUT /INTERR. EXIT /INIT DTA ROUTINE - MAINSTREAM DTIN ISZ DTARGP /INDEX TO BUF. SIZE ARG. LAC L377 /RETURN 255 AS BUF. SIZE DAC* DTARGP LAC DTCT2 /I OR O DAC DTIOSW /OUTPUT=1, INPUT=0 ISZ DTARGP /INDEX TO NORM. EXIT SNA!CLL /L=0 FOR BIT MAP CLEAR JMP DTIN3 /INPUT LAC DLMBIT /(DT2BIT) JMS DTBFC2 /CLEAR FILE BIT MAP (L=0) DTIN3 LAC DTSAM /SAME UNIT-BOTH FILES SZA /YES - CHECK DATSLOT JMP DTIN1 /WAIT IF I/O UNDERWAY LAC DTFLS1 /IS CURR. DAT SLOT SAME AS SAD DTCSLT /THAT FOR I/O UNDERWAY DJSTOP JMP DTSTOP /YES JMP DTIN2 /NO - WAIT DTIN1 LAC DTUND /IS I/O UNDERWAY FOR AND (700000 /A UNIT OTHER THAN XOR DTUNIT /CURRENT INIT SZA /NO DTIN2 JMS DTIOU /YES - WAIT .EJECT DTONCE CAL 46 /API CORE ADDR.-MODIFIED /DTONCE+1 UP TO DTSTOP USED FOR TEMP. STORE. AFTER 1ST .INIT /DTAC=AC STORAGE CELL DURING INTERRUPT /DOUT=INTERRUPTED RETURN ADDRESS /DTERCT=PARITY COUNTER (INIT. TO-10) /DTCSLT=DAT SLOT FOR I/O UNDERWAY /DRDWAT=NON0=WAIT FOR DONE FLAG DTAC 16 /.SETUP DOUT DRSF /DRUM DONE FLAG DTWPC DTINT /DRA INT. SERV. ADDR. DTOBCK CAL 46 DTERCT 16 DTCCA DRNEF DTDATC DTINT DRDWAT LAC* (.SCOM+4 /BITS 15-17=DRUM SIZE (1-5) DTTR AND (7 DTDMOD SNA DTHPTS JMP DTER35 /IOPS 35:DRUM SIZE NOT IN .SCOM+4 DTUCKP TAD DRLIM /(LAC DRSTAB DTSAFE DAC DRLIM DRLIM LAC DRSTAB /LAC DRSTAB,LAC DRSTAB+1-5 OR -(DRUM SIZE) DTUDP CMA DTUHP DAC DRLIM DTWC LAC DJSTOP /(JMP DTSTOP DTCSLT DAC DTONCE DRSTAB=. DTCKSM JMP DTSTOP DTBLOK 177 /32K=1/4 DECTAPE=128 BLKS.(UNIT 0) (.SCOM+4,15-17=1) L377 377 /65 1/2 256 (UNIT 0) ( 2) L777 777 /131 1 512 (UNIT 0) ( 3) DTPONT 1777 /262 2 1024 (UNIT 0,1) ( 4) DTRELB 3777 /524 4 2048 (UNIT 0,1,2,3)( 5) DTER35 LAW 35 /DRUM SIZE(1-5) NOT SET IN .SCOM+4 DTRBIT JMP* DLIT4 /ALL CODE FROM DTONCE UP TO HERE OVERLAYED EXCEPT L377,L777 DTBMIN=DTFAKE /BIT MAP BLOCK IN SWITCH (NON0=IN) DTBMOT=DTFAKE+1 /BIT MAP BLOCK OUT SWITCH (NON0=OUT) / .EJECT /STOP DTA ROUTINE DTSTOP DZM DTUND /CLEAR I/O UNDERWAY DZM DRDWAT /CLEAR WAIT FOR DONE FLAG SW. DZM DTWRWT /CLEAR OUTPUT WAIT SWITCH DZM DTEOF /CLEAR EOF SWITCH DZM DTCLSS /SET .CLOSE SWITCH DZM DTSKNT /CLEAR .SEEK,.ENTER SW DZM DTBMIN /BIT MAP BLOCK IN SWITCH DZM DTBMOT /BIT MAP BLOCK OUT SWITCH LAC DTMTP4 /JMP DTAPE1 DAC DTOUT JMP DTDBK-1 /WAIT DTA ROUTINE DTWAIT LAC DTCT2 /0 IF .WAIT SNA /1 IF .WAITR JMP DTDBK-1 LAC (700000 /GET LINK,EXT MODE, MEM PTCT AND DTCALP DAC DTCALP LAC* DTARGP /BUSY ADDR AND (77777 XOR DTCALP ISZ DTARGP DAC DTCALP JMS DTIOU /CHECK I/O UNDERWAY DTDBK DBR XCT .+1 JMP* DTARGP /NORM. EXIT / /CHECK DIRECT. IN CORE SUBR. DTDRCK 0 JMS DTIOU /I/O UNDERWAY LAC DTNCOR /D IN SAD DTUNIT /NO JMP* DTDRCK /YES - EXIT LAC (DRRD /READ PARAM JMS DTDRIN /BRING IN DIRECTORY JMP DTDRCK+1 /WAIT FOR DIRECTORY / /CALL IN DIRECTORY SUBR. DTDRIN 0 DAC DTTR /TRANSFER DIRECTION SWITCH LAC (100 DAC DTNXBK /BL# TO TRANSFER DZM DTDRGT /SET IND. TO SET DIR IN CORE SWITCH LAC DTCLSS /0 IF SEEK, ENTER SZA!CLA TAD (40 /NOT 0 IF CLOSE (DTBUF-1 TAD DLTDIR /(DTRDIR DTDRN1 JMS DTWCS /SETUP WC,CA JMP* DTDRIN DTDRGT 777777 /GET DIR INDIC. (+0=GET) / .EJECT DTUDRR=DTDVS /USER DIR. ENTRY POINTER (FIXED) DTUDRP=DTCKSM /USER DIR. ENTRY POINTER (INDEXED) 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 DTSK2 CLC /SYSTEM TAPE? XOR* DLTSYS /WD 3 OF SYS BIT MAP SNA!CLA /NO, 56 FILES LAW -30 /YES, 24 FILES SMA LAW -70 DAC DTFPCT XOR (777700 DAC DBLKLC /50 IF 24; 10 IF 56 LAC DLTBUF /DIR. POINTER=DTDIR+40 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 DLCLA CLA JMP* DTSK1 /YES-CAN'T FIND FILE NAME / .EJECT /CLOSE FILE SUBR DTCLOS JMS DTIOU /I/O UNDERWAY WAIT LAC DTIOSW /I OR O SNA JMP DTFND1 /INPUT-CLEAR SWITCHES EXIT DTCLS2 LAC DTEOF /EOF BUF IS OUT SPA!CLC JMP DTCLS3 DAC DTEOF /SET EOF SWITCH LAC DTDMOD /FOR USE OF DTMCK DAC DTCT LAC (DRWR /OUTPUT JMS DTMCK LAC DLEOFH /EOF HEADER POINTER (DTEOFH JMP DTWRT1 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 /NON0 IF 56 FILES LAW -4 /24 FILES TAD (77 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 JMP DTSEK1 /READ BIT MAP BLOCK INTO DIR. BIT MAP / .EJECT DTCLS4 LAC DTBMOT /FILE BIT MAP BLOCK OUT SZA!CLC JMP DTCLS6 DAC DTBMOT /SET BIT MAP OUT SWITCH LAC DTFPCT /REL. BIT MAP POINTER CLL!RAL /X 40 RTL RTL TAD DLTBUF /(DTBUF DTOLBM=DTOBCK /RELATIVE FILE BIT MAP ADDRESS DTXROL=DTMPS /OLD 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 (DRWR JMP DTSEK2 /OUTPUT BIT MAP BLOCK / /SUBROUTINE TO XOR BIT MAP 1 INTO BIT MAP 2 /ALSO CLEARS BIT MAP 1 / 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 DZM* DTXROL /CLEAR BIT MAP 1 ISZ DTXROL ISZ DTXRNW ISZ DTCTS JMP DTXOR1 JMP* DTXOR / .EJECT DTCLS6 LAC DTCLSS /FILE CLOSED SNA!CLC 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) DTFIN=DTBFC2 /DT1SAV OR DT2SAV 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 (DRWR /REWRITE DIRECTORY JMS DTDRIN DZM DTCLSS /CLEAR CLOSE IND. JMP DTCLOS DTFEND DAC DTNCOR /CLEAR DIR IN CORE SWITCH DTFND1 LAC DFULSW /FULL SW SET? DZM DFULSW SZA!CLC JMP DTER16 JMP DTSTOP /CLEAR OTHER SWITCHES+EXIT / .EJECT /SUBR. TO SET UP CA, WC AND TRANSFER DTWCS 0 DAC DTCCA /ADDR LAW -10 DAC DTERCT /PARITY ERROR RETRY COUNT DAC DTUND /I/O UNDERWAY LAC DTFLS1 /SAVE CURR. SLOT POINTER DAC DTCSLT LAC DTUNIT /UNIT # MUST BE: /0 IF 32,65 OR 131K DRUM /1 OR LESS IF 262K /3 OR LESS IF 524K CLL!RAR RAR RTR RTR DAC DTSAFE /UNIT# IN BITS 7,8 TAD DRLIM SMA /UNIT OK JMP DTER26 /IOPS 26: ILL. UNIT # LAW -1000 /SECTOR ADDR=777 OR LESS? TAD DTNXBK /REQ. BLK. # SMA!CLC JMP DTER25 /ILL. SECTOR ADDR.: IOPS 25 LAC DTNXBK /CHECK AGAINST MAX DRUM SIZE TAD DTSAFE /UNIT # DAC DTSAFE /DRUM ADDR TAD DRLIM /-(MAX DRUM SIZE) SMA!CLC JMP DTER25 /ILL SECTOR ADDR: IOPS 25 LAC DTTR DAC DRIOT /SET TO DRRD OR DRWR JMS DKSET /SET UP DRUM I/O + EXECUTE IOT'S JMP* DTWCS /EXIT SUBR /SUBR TO SET UP DRUM I/O AND EXECUTE IOT'S DKSET 0 LAC DTCCA /CORE ADDR. DRIOT XX LAC DTSAFE /DRUM ADDR. DRLD JMP* DKSET .EJECT /.READ, .WRITE COMMON SETUP SUBR. DTUWC=DTXOR /USER 2'S COMP. WC FOR ARG. LIST DTMCK 0 DAC DTTR /READ (DRRD) OR WRITE (DRWR) LAC DTSKNT /.SEEK OR .ENTER EXECUTED? SNA!CLC /YES, OK FIR READ , WRITE JMP DTER12 /NO, IOPS 11 XCT* DTMCK /L.B. OR DTA BUF. L.B. ADDR. ISZ DTMCK /INDEX TO IMAGE EXIT DAC DTUHP /HEADER POINTER DAC DTUDP /DATA POINTER ISZ DTARGP LAC* DTARGP /USER WC DAC DTUWC LAC* DTUHP /COMPUTE W.C. FROM L.B.H. W.P.C JMS DTGWPC LAC DTCT2 /DATA MODE DAC DTDMOD JMP* DTMCK /EXIT, /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 /ILL. WPC? JMP DTER23 /0 WPC AND (400 SNA!CLA /WPC GREATER THAN 177 JMP* DTGWPC /L.B.W.C. INAC DTER23 LAC DTNXBK /DISPLAY BLK# WITH IOPS ERROR DAC* DLIT3 LAC (5 /IOPS 23 - ILL. WPC DTER16 TAD DLIT2 /DECTAPE FULL (DTER15) DTER14 TAD DLIT2 /FILE NOT FOUND (DTER13) DTER12 TAD DLIT4 /IRREC. DTA ERROR /.SEEK,.ENTER NOT EXECUTED (DTER11) DTER6 TAD (6 /ILL. HANDLER FUNCTION JMP* DLIT4 /KM-9 ERROR LOC (.MED+1=4) DTER26 CLA /IOPS 26: ILL. DRUM UNIT DTER25 TAD (10 /IOPS 25: ILL. SECTOR ADDR. JMP DTER16 /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 .EJECT /SUBR. TO CHECK ACTIVE FILE DTCKCL 0 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 JMS DTCKCL /CHECK DIRECTORY FOR THIS FILE SNA!CLC JMP DTER14 /FILE NOT FOUND XCT DTSK5 /LAC* DTDES(GET 1ST BL.#) SMA /O.K. JMP DTSK6 /FILE INCOMPLETE, TRY AGAIN XOR (400000 DAC DTNXBK /BL. TO READ DAC DTSKNT /SET .SEEK EXECUTED SW DTSEK1 LAC (DRRD DTSEK2 DAC DTTR /INPUT DAC DTNCOR /CLEAR DIR. IN CORE SWITCH XOR (DRRD SNA JMP DTRNX1 /TRANSFER 1ST BLOCK IN JMP DTCOUB /OUT / /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 DTDATC /DATA WORD COUNT ISZ DTHPT ISZ DTUWC /DONE JMP DTWT2 JMP* DTRWT / .EJECT /.WRITE ROUTINE DTWRIT JMS DTIOU /I/O UNDERWAY LAC DTMTP4 DAC DTOUT LAC (DRWR JMS DTMCK /READ/WRITE COMMON SETUP LAC* DTARGP 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 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 / DTWT4 CLC TAD DTCKSM CMA DAC* DTUCKP /STORE 2'S COMP CKSUM IN DTABUF LAC DTEOF SZA /NO EOF JMP DTCOUY /TRANSFER EOF JMP DTAPE1 /IOPS WRITE COMPLETE DTWRCL JMS DTBUFC /CLEAR DTA BUF ISZ DTARGP /INDEX TO WC JMP DTWRT1 /PUT LINE IN DTA BUF .EJECT /CLEAR OUTPUT BUF. SUBR. /ALSO NEEDED FOR INPUT BECAUSE OF POINTER INITIALIZATION DTBUFC 0 STL /SET LINK TO CLEAR 400 CELLS LAC DLTBUF /BUF. (WD0) POINTER (DTBUF DAC DTHPT /DTA BUF HEADER POINTER DAC DTRHPT /FOR READ JMS DTBFC2 /CLEAR BUF JMP* DTBUFC /CLEAR SPECIFIED AREA SUBR DTBFC2 0 DAC DTCT2 LAW -40 SZL /CLEAR 40 AND DTUMSK /CLEAR 400, DTUMSK=777400 DTCLCT=DTMPP /COUNTER DAC DTCLCT /DTCLCT=DTMPP DAC DTBFCT /INIT BUF SIZE CT. ISZ DTBFCT DTBFC1 DZM* DTCT2 ISZ DTCT2 ISZ DTCLCT JMP DTBFC1 JMP* DTBFC2 /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 DFULL /DECTAPE FULL (DTER15) LAC DTWRWT /IF DTWRWT NON 0, ALWAYS GET NEXT BLK # SNA!CLA LAC DTEOF /EOF SWITCH SET? JMS DTMAP /FIND NEXT FREE BLK DAC* DTLINK /DATA LINK POINTER DTCOUB LAC DLTBUF /(DTBUF JMS DTWCS /SETUP WC,CA AND BEGIN TRAN. DTOUT XX /JMP DTAPE1 OR JMP DTBUSY /DECTAPE FULL - CLOSE FILE AND OUTPUT MSG 15 DFULL DAC DTEOF /SET EOF SW DAC DFULSW /SET FULL SW DZM DTWRWT LAC DLSAV TAD DLIT2 DAC DTFIN /EXT POINTER LAW 10000 /CHANGE LAST 2 CHARS TO XX AND* DTFIN XOR (3030 DAC* DTFIN JMP DTCLS3 .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 LAC (DRRD JMS DTMCK /READ/WRITE COMMON SETUP, RETURN TO .+2 LAC DTRHPT /DTA BUF HEADER POINTER 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 DTDATC /DATA COUNT DZM DTCKSM /CLEAR CHECKSUM JMS DTRWT /TRANSFER LINE TO USER L.B. LAC* DTUDP /BYPASS JMS DTUPTR /EXCESS DATA JMP .-2 / /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 .EJECT 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* DTLINK DAC DTNXBK /DATA LINK INTO NEXT BLOCK DTRNX1 JMS DTBUFC /INIT. BUFFER JMP DTCOUB /TRANSFER / /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 .EJECT / /DTA ENTER FILE ROUTINE DTENTR 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 DTER14 DTNTR6 LAC* DTARGP /SAVE USER D.E POINTER DAC DTUDRP JMS DTNTRZ /SAVE USER D.E IN DT1SAV OR DT2SAV 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 DAC DTBLOK LAW -1 /INIT BIT MAP SEARCH TO FIND DAC DTREM /1ST EMPTY BLK DAC DTSKNT /SET .ENTER EXECUTED SW 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# XOR (400000 XCT DTNTR3 /STORE BL#+COMPLETION BIT IN DTESAV+3 SMA!CLC JMP DTER16 /DECTAPE FULL (DTER15) DAC DTNCOR /CLEAR DIR IN CORE SW JMS DTBUFC DTMTP4 JMP DTAPE1 /NORM EXIT / .EJECT /SUBROUTINE TO SAVE USER D.E DTNTRZ 0 LAC DLSAV /(DT1SAV) OR (DT2SAV) DAC DTFIN LAW -3 /SET DTA D.E DAC DTCT /TRANSFER COUNTER DTNTR2 LAC* DTUDRP /SAVE USER D.E DTNTR3 DAC* DTFIN ISZ DTFIN ISZ DTUDRP ISZ DTCT JMP DTNTR2 JMP* DTNTRZ / DT2SAV 0 / NEW FILE ENTRY SAVED HERE 0 0 0 DTFAKE 0 /EMPTY SLOT FOR ENTER SEARCH (LAST WD. UNUSED) 0 DLIT0 0 /MUST BE 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 SUBROUTINE 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 /DECTAPE FULL DZM DTBMCT /CLEAR BITMAP 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 LAC DTDIRA RAL /L=1=REV,L=0=FORW LAC DTNXBK /LASTT BL # RCORDED FOR THIS FILE SNL!CMA /REV JMP DTMPP3 TAD (1100 CMA DTMPP3 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) /BLOCK AVAILABILITY BIT MAP SEARCH, AC=777777 ON ENTRY DTMAP 0 DAC* DTLINK /SAVE AC FOR -1 CASE 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 /DECTAPE FULL JMP DTREM5 .EJECT 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 TAD DTBMCT DTREM3 SPA!CLC /OK-DELTA BLOCKS IN BETWEEN JMP DTMAP4 /CHECK BIT MAP AGAIN SAD* DTLINK /IF ENTRY AC = -1, NO DTCBIT JMP DTREM6 JMS DTCBIT /SET BIT IN MAPS CMA DAC DTSBIT DTREM6 LAW -DELTA /RESET BLK DIST TO -DELTA DAC DTREM LAC DTDIRA /UPDATE DTDIRL DAC DTDIRL DTREM4 LAC DTRELB /T. STORE BL# TO BE USED DTREM5 DAC DTCNBK /EXIT LAW -1 /WAS AC = -1 ON ENTRY? SAD* DTLINK SKP /YES, USE -1 (EOF) LAC DTCNBK JMP* DTMAP /EXIT -BL ! FOUND(777777=DTA FULL) /SUBR TO XOR OCCUPE BIT INTO FILE AND DIR BIT MAPS 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 .EJECT DT2BIT 0 /FILE 2 BIT MAP .LOC DT2BIT+40 / DTDIR=. DTBUF 0 /DTA BUFFER (FILE1) .LOC DTBUF+400 DTDIR2 0 /DTA DIRECTORY (FILE2) .LOC DTDIR2+40 DTBUF2 0 /DTA BUFFER (FILE2) .LOC DTBUF2+400 /FILE 1 BLOCK-SECTION A BLAB=. DLTDIR DTDIR /DIRECTORY POINTER DLTSYS DTDIR+203 /WD 3 OF SYS BIT MAP DLTBUF DTBUF /DTA BUF. POINTER-1 DTLINK DTBUF+377 /FILE1 DATA LINK POINTER DTNXBK 0 /BL.# TO BE TRANSFERRED DTCNBK 0 /DATA LINK (NEXT BL.#) DTCURE 0 /DIR. POINTER TO 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 DTSKNT 0 /NON0=.SEEK OR .ENTER EXECUTED DTRHPT 0 /DTA BUF. LINE HEADER POINTER (.READ) DTCLSS 0 /FILE OPEN, CLOSE SWITCH(NON-0=OPEN,0=CLOSED) DTBFCT 0 /BUFFER COUNT (INIT=-377) DTFPCT 0 /FILE ENTRY COUNT DBLKLC 0 /24,56 ENTRY SWITCH(50=24;10=56) DTFLS1 0 /FILE 1 DAT SLOT BLAND=. / /FILE 1 BLOCK-SECTION B DTUNIT 0 /(0-2)=DTA UNIT# FOR TRANSFER DTNCOR 077777 /DIRECT. IN CORE SWITCH (NON-0=OPEN, 0=CLOSED) BLBND=. / .EJECT /FILE 2 BLOCK - SECTION A DTDIR2 /DIRECT 2 POINTER DTDIR2+203 DTBUF2 /DTA BUF 2 POINTER DTBUF2+377 /FILE 2 DATA LINK POINTER 0 0 0 0 0 0 0 0 0 0 0 0 DTFLS2 0 /FILE 2 DAT SLOT /FILE 2 BLOCK - SECTION B 0 077777 / .EJECT /FOLLOWING =CELLS USED IN COMMON BY BOTH FILES DLFAKE DTFAKE /POINTER TO EMPTY FILE NAME DTARGP 0 /ENTRANCE ARG. POINTER /DTCCA 0 /CURRENT ADDR. (C.A.) POINTER FOR TRANSFER DTCALP 0 /USER CAL POINTER DTCT1 0 /GEN. PURP. COUNTER AND T. STOR. DTCT2 0 /GEN PURP COUNT AND STORE /DTDATC 0 /LINE DATA COUNT /DTDMOD 0 /DATA MODE (15-17) /DTHPTS 0 /DTA BUF. LINE HEADER POINTER /DTTR 0 /DTA SEARCH-READ(DRRD) OR SEARCH-WRITE(DRWR)CONVERSION FACTOR /DTUCKP 0 /USER LINE BUF. CHECKSUM POINTER /DTUDP 0 /USER LINE BUF DATA POINTER (MODIFIED) /DTUHP 0 /USER LINE BUF. HEADER POINTER DTUND 0 /I/O UNDERWAY SWITCH,-=BUSY,0=NOT BUSY /DTWC 0 /2'S COMP TRANSFER WORD COUNT DTWRWT 0 /CONTINUED I/O SWITCH (NON 0=CONT),0=DONE) DLEOFH DTEOFH /EOF HEADER POINTER (FOR .CLOSE) /DTCKSM 0 /LINE CHECKSUM DTCT 0 /GEN. PURPOSE COUNTER=T.STORE DTSAM -1 /BOTH FILES ON SAME UNIT SWITCH (NON 0 = SAME) /DTSAFE 0 /BL.# SAFE STORAGE DURING TRANSFER DLIT1 1 DLIT2 2 DLIT3 3 DLIT4 4 DFULSW 0 /DECTAPE FULL SW(NON 0=FULL) DTDIRA 0 /BIT MAP DIRECTION SW(CURR BL)+1=F,-1=R DTDIRL 0 /DTDIRA FOR LAST BLOCKTRANSFERRED DTMTRX 0 /CURR BIT MAP WD POINTER /DTRBIT 0 /18 BIT 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 /BIT MAP 1 POINTER /DTBLOK 0 /BLOCK EXAMINED COUNT DLMBIT DT2BIT /OUTPUT FILE BIT MAP POINTER DLSAV DT2SAV /POINTER TO CELL 1 OF NEW DIR ENTRY /DTPONT 0 /CURR FILE BIT MAP POINTER /DTOBCK 0 /T STORE LDAB DABSIZ /LIT DTUMSK LAW -400 .END