TITLE RESDEC SUBTTL RESTORE A DECTAPE'S DIRECTORY BLOCKN=10 ;SUBSCRIPTS WORD FCOUNT=12 ;SUBSCRIPTS FILEN NUMOKF=14 SIX=6 ;************************************************************** LOC 124 JOBREN: BITS RELOC ;************************************************************** BEGIN: CALL [SIXBIT/RESET/] MOVE 14,[POINT 6,DTAN,17] SETZ 15, JSA 15,INITSR START: INIT 1,116 DTAN: SIXBIT /DTA / 0 JSR 2,TTYOUT USETO 1,144 ;ZERO "LINK" WORD OF DIR. BLOK OUTPUT 1,OUTZ MOVEI 15,STOREP-1 ;USE ACC.15 FOR P/D LIST MOVEI 16,40 ;(16)=R-J ASCII BLANK. SETZ FCOUNT, ;(FCOUNT)=THEORETICAL NO. OF FILES MOVEI BLOCKN,10 ;(BLOCKN)=CURRENT BLOCK NO. 0-576(DEC.) SETZ NUMOKF, ;(NUMOKF)=NO. OF COMPLETE FILES MOVE 7,[777777777641] ;-95(DEC). ACC7 COUNTS NO. OF D/T READS MOVEI SIX,6 MOVEI 13,700000 ;WILL BE USED LATER TO SET FLAG TTCALL 3,HEADG1 JRST LOOP6 LOOP9: ADDM SIX,SETIBL AOSN 7 ;CHECK FOR LAST READ. SKIP IF NOT JRST LAST2B ;CHANGE READL FOR LAST READ(I.E. 2 BLKS+1 WD) ADDI BLOCKN,14 LOOP6: MOVEI 5,1200 SETIBL: USETI 1,3 ;BLOK #(FOR I/P)=3,9,15,21,...573(DEC.) INPUT 1,READL ;READ 5 BLOCKS+1 WORD INTO GARBIJ LOOP3: HRRZ 0,GARBIJ(5) ;(0)=R-H OF LINK WORD FROM BLOCKN LSH 0,-10 ;DISCARD BITS INDICATING # OF DATA WORDS IN BLOCKN JUMPE 0,CON3 MOVEM FCOUNT,CHECK ;(0)=BLOCK # OF 1ST BLOCK IN A FILE COMPAR: CAMN 0,FSTFBL(FCOUNT) ;(I) IF (0) IN FSTFBL,FSTFBL+1,... JRST EASY ; CARRY ON WITH CON3: ETC. SOJG FCOUNT,COMPAR MOVE FCOUNT,CHECK ADDI FCOUNT,1 CAIN FCOUNT,47 ;ONLY ALLOW 39(DEC.) FILES JSR 4,TTYOUT MOVEM 0,FSTFBL(FCOUNT) ;(II) IF NOT ADD TO LIST CON3: HLL 0,GARBIJ(5) MOVEM 0,WORD(BLOCKN) SUBI BLOCKN,1 ;STORE LINK WORD (MINUS INFO RE # DATA SUBI 5,200 ; [WORDS) IN WORD(BLOCKN). JUMPGE 5,LOOP3 NEX: JRST LOOP9 EASY: MOVE FCOUNT,CHECK JRST CON3 ;******************************************************* WORD: BLOCK 1102 STOREP: BLOCK ^D100 FSTFBL: BLOCK ^D40 READL: IOWD 1201,GARBIJ 0 GARBIJ: BLOCK 1201 READSP: IOWD 601,GARBIJ ;*************************************************************** LAST2B: MOVE 0,READSP ;MODIFY SOME LOC'S FOR THE LAST D/T READ MOVEM 0,READL MOVEI 5,400 ADDI BLOCKN,12 MOVEI 0,REDABS HRRM 0,NEX JRST SETIBL PAGE ;*************************************************************** ; ALL LINK WORDS HAVE NOW BEEN READ. REDABS: SETZ 3, ;ACC3=COUNTER FOR # OF BLOKS IN A FILE MOVE 6,FSTFBL(FCOUNT) HRRM 6,COM1 LOOP2: ADDI 3,1 CAIL 3,^D575 JSR 1,TTYOUT HRRZ 7,WORD(6) COM1: CAIE 7,6 ;CHECK FSTFBL(FCOUNT)=R-H OF WORD(6) JRST FORGET ;INCOMPLETE FILE HLRZ 7,WORD(6) ;(ACC)=BLOK# OF NEXT BLOK IN FILE CAIL 7,1102 ;MAKE SURE IT'S NOT OUT OF BOUNDS. IT JRST FORGET ;WILL BE IF BLOK HAS NEVER BEEN ACCESSED SKIPN 7 JRST CHEKNO ;IF (ACC7)=0 A COMPLETE FILE FOUND MOVEM 6,TEMPST-1(3) ;STORE BLOK #'S REFERENCING THE CURRENT MOVE 6,7 ; [FILE IN TEMPST,TEMPST+1,... JRST LOOP2 CHEKNO: AOJ NUMOKF, CAIL NUMOKF,27 ;CHECK THAT # OF COMPLETE FILES <23(DEC) JRST AKWARD ; (1) IF NOT GO TO AKWARD JRST OKFILE+3 ; (2) IF OK GO TO OKFILE+3 OKFILE: SOSG 3 JRST ENTERN ;WHEN ALL SLOTS FILLED GO TO ENTERN MOVE 6,TEMPST-1(3) ADDM 13,WORD(6) ;SET FLAG FOR ALL BLOK#'S REFERENCING ;COMPLETE FILES. JSR BLOKPT ;DEPOSIT IN THE DECDIR SLOTS REFERRING DPB NUMOKF,POINTD ;TO THE BLOCK #'S CONTAINED IN TEMPST, JRST OKFILE ;TEMPST+1,... THE CURRENT (NUMOKF). FORGET: CAIN 3,1 JRST Z JSR TTYSR MOVEM 17,NUMPR+3 MOVE 3,FSTFBL(FCOUNT) JSR TTYSR MOVEM 17,NUMPR+1 TTCALL 3,NUMPR Z: PUSH 15,FSTFBL(FCOUNT) Z2: SOJG FCOUNT,REDABS JRST RERITE ;*************************************************************** BLOKPT: 0 ;THIS S/R LOADS POINTD WITH IDIVI 6,7 ;THE 'SLOT' ADDRESS REQ. BY OKFILE JUMPN 7,CON SUBI 6,1 MOVEI 7,7 CON: MOVEI 4,DECDIR(6) DPB 4,POINTA MOVEI 4,^D36 ;44(OCTAL) IMULI 7,5 SUB 4,7 DPB 4,POINTB JRST @BLOKPT POINTA: POINT 18,POINTD,35 POINTB: POINT 6,POINTD,5 POINTD: POINT 5,DECDIR DECDIR: BLOCK ^D128 TEMPST: BLOCK ^D574 PAGE ;**************************************************************** MESINQ: ASCIZ / DECTAPE DRIVE NO. = / FIRSTQ: ASCIZ / 1ST. BLOK# = / OUTLST: IOWD ^D128,DECDIR 0 OUTZ: IOWD 1,CHECK 0 NAMES: SIXBIT /FILE1 FILE2 FILE3 FILE4 FILE5 FILE6 FILE7/ SIXBIT /FILE8 FILE9 FILE10FILE11FILE12FILE13FILE14/ SIXBIT /FILE15FILE16FILE17FILE18FILE19FILE20FILE21FILE22/ PAGE ;*************************************************************** ENTERN: MOVE 0,NAMES-1(NUMOKF) ;ENTERN MOVES A 6-BIT FILE-NAME TO MOVEM 0,DECDIR+122(NUMOKF) ;DECDIR EA. TIME A COMPLETE FILE JRST Z ; IS FOUND ;*********************************************************** RERITE: MOVEI 1,1736 DPB 1,POINT1 MOVE 1,[7777777] DPB 1,POINT2 MOVEI 1,36 DPB 1,POINT3 USETO 1,144 OUTPUT 1,OUTLST MOVE 1,[311224042212] ;(1)= '2) DE' IN ASCII MOVEM 1,HEADG1+5 ALPHA: TTCALL 3,HEADG1 OPTION: POP 15,3 ;(3)=FSTFBL OF INCOMPLETE FILE TLNN 15,777777 JRST TGTE ;HAVE COME TO END OF LIST OF FSTFBL'S G: MOVEI 1,2 ;USE ACC.1 TO INDEX WORD SETZB 5,TEMPST+1 ; SETZ 4, LOOP4: AOJ 1, ; CAIL 1,1102 JRST PROCES ;ALL FSTFBLS IN WORD CHECKED AGAINST (3) HRLZ 2,WORD(1) ;L-H OF AC2=FSTFBL REF. TO BY WORD(1) JUMPL 2,LOOP4 ; =-VE IF BLOK# IN COMPL. FILE HRRZ 2,WORD(1) ;R-H OF AC2=FSTFBL REF. TO BY WORD(1) CAME 2,3 JRST LOOP4 ;IF (2)NE.(3) INVESTIGATE NEXT WORD ADDI 4,2 ;(4)/2 = COUNT OF BLOK#'S IN GARBIJ MOVEM 1,GARBIJ(4) ;GARBIJ(N) CONTAINS BLOK#'S REF'G TO (3) HLRZ 2,WORD(1) ;GARBIJ(M) CONTAINS LINK-POINTERS ASSOC. MOVEM 2,GARBIJ+1(4) ;WITH ABOVE BLOK#'S. N=ODD. M=EVEN. TRNE 2,777777 ;CHECK IF CURRENT BLOK=LAST FILE BLOK JRST LOOP4 ;IF NOT, INVESTIGATE NEXT WORD. AOJ 5, MOVEM 4,TEMPST(5) SETZM ,TEMPST+1(5) JRST LOOP4 PROCES: MOVEM 4,TEMPST ;STORE COUNT FOR FUTURE REFERENCE SETZB 7,1 ;(3)=COUNTER FOR LAST BLOK#'S FOR A LOOP5: AOJ 7, ; [PARTICULAR FILE. MOVE 6,TEMPST(7) ;(6)=LAST BLOK# OF FILE,-INITIALLY CAIN 6,0 ;CHEK FOR MORE THAN 1 LAST BLOK PER FILE JRST OPTION MOVE 6,GARBIJ(6) LOOP7: CAME 6,GARBIJ+1(4) JRST Y MOVE 6,GARBIJ(4) AOJ 1, ;(1)=# OF BLOKS LINKING TO LAST BLOK MOVE 4,TEMPST JRST LOOP7 Y: SUBI 4,2 CAIE 4,2 JRST LOOP7 AOJ 1, ;(1)=# OF LINKED BLOKS FOUND MOVE 3,6 X: JSR TTYSR MOVEM 17,NUMPR+1 MOVEM 1,3 JSR TTYSR MOVEM 17,NUMPR+3 TTCALL 3,NUMPR MOVE 4,TEMPST D: JRST LOOP5 ;************************************************************ TTYSR: 0 ;TTYSR CONVERTS A BINARY MOVE 10,[POINT 3,3,20] MOVEM 10,ICHAR MOVE 10,[POINT 7,17] MOVEM 10,OCHAR MOVNI 10,5 ;NO. IN ACC.3 LOOP10: ILDB 0,ICHAR ;TO ASCII IN ACC17. JUMPN 0,MAJ ;E.G. 00107 WILL BE IDPB 16,OCHAR ;PUT OUT ON TTY AS: AOJN 10,LOOP10 ; (BLANK)(BLANK)(1)(0)(7) MOVE 17,[201004020140] JRST @TTYSR LOOP11: ILDB 0,ICHAR MAJ: ADDI 0,60 IDPB 0,OCHAR AOJN 10,LOOP11 JRST @TTYSR ICHAR: POINT 3,3,20 OCHAR: POINT 7,17 ;************************************************************ TGTE: MOVE 15,[CALLI 12] MOVEM 15,OPTION JRST G POINT1: POINT 10,DECDIR,9 POINT2: POINT 21,DECDIR+^D82,35 POINT3: POINT 5,DECDIR+^D14,9 ;*********************************************************** AKWARD: INIT 2,16 ;1ST TIME FILE O/P ON DSK SIXBIT /DSK/ 0 JSR 5,TTYOUT MOVEI 1,AK2 ;IN FUTURE JUMP TO AK2 WHEN A COMPLETE HRRM 1,CHEKNO+2 ;FILE IS FOUND. MOVEI 1,1 ;USE ACC.1 AS A COUNTER FOR NO. JRST FIRST ;OF FILES O/P ON DSK AK2: AOJ 1, CAIN 1,^D18 JSR 7,TTYOUT FIRST: MOVE 2,DNAMES-1(1) MOVEM 2,READDL LOOKUP 2,READDL JRST GOAHED JRST AK2 GOAHED: MOVEM 6,TEMPST-1(3) ;STORE LAST BLOK# OF FILE MOVN 3,3 ;INITIALLY, (3)=NO. OF BLOKS SETZ 2, ENTER 2,READDL JSR 6,TTYOUT LOOPO: MOVE 10,TEMPST(2) USETI 1,(10) ADDM 13,WORD(10) INPUT 1,READEC OUTPUT 2,RITEDL AOJ 2, AOJL 3,LOOPO JRST Z PAGE ;*************************************************************** DNAMES: SIXBIT /FILEX1FILEX2FILEX3FILEX4FILEX5FILEX6FILEX7FILEX8FILEX9/ SIXBIT /FILX10FILX11FILX12FILX13FILX14FILX15FILX16FILX17/ READDL: SIXBIT /DUMMY / SIXBIT / / 0 XWD 0 READEC: IOWD ^D128,GARBIJ 0 RITEDL: IOWD ^D127,GARBIJ+1 0 HEADG1: ASCIZ / PARTIAL FILES OF TYPE(1) DETECTED: 1ST. BLOK# NO. OF BLOKS / NUMPR: ASCIZ / / ;*********************************************************** PAGE ;*********************************************************** BITS: CALL [SIXBIT/RESET/] MOVE 14,[POINT 6,DTAN2,17] SETZ 15, JSA 15,INITSR START2: INIT 1,116 DTAN2: SIXBIT /DTA / ;INIT SPECIFIED DECTAPE 0 JSR 2,TTYOUT INIT 2,16 SIXBIT /DSK/ ;INIT DSK 0 JSR 2,TTYOUT MOVE 2,[POINT 10,GARBIJ,27] MOVNI 4,12 FIND1: MOVEI 15,5 JSA 15,INITSR X3: USETI 1,(1) ;SET UP INITIAL DECTAPE BLOK# FOR I/P INPUT 1,READEC LDB 3,2 ;(3)="FSTFBL" MOVEM 3,CHECK AOJE 4,TOOMAN ;(4)=COUNTER FOR # OF PARTIAL FILES REQ. MOVE 3,DNAMP+11(4) ;DURING A REE. -ONLY 9 PERMITTED MOVEM 3,READDL ;SET UP FILE-NAME(1 OF BITSF1,...BITSF9) LOOKUP 2,READDL JRST .+2 JRST .-5 ENTER 2,READDL ;ON DSK. JSR 6,TTYOUT OUT5: OUTPUT 2,RITEDL ;O/P ON DSK LAST D'TAPE BLOK READ HLRZ 1,GARBIJ ;GET NEXT D'TAPE BLOK# = N CAIN 1,0 ;IF N=0, JUMP TO ALLOUT JRST ALLOUT USETI 1,(1) ;(1)=N INPUT 1,READEC ;READ NEXT BLOK FROM D'TAPE LDB 3,2 ;FOR PARTIAL FILES CONSISTING OF THE 1ST CAMN 3,CHECK ;X BLOKS OF A FILE(RATHER THAN THE LAST) JRST OUT5 ;THE LAST BLOK IS DETECTED BECAUSE THE ;FSTFBL REF. BY THE LINK-WORD OF THE ;(X+1)TH BLOK IS NOT EQUAL TO (3) ALLOUT: CLOSE 2, JRST FIND1 TOOMAN: JSR 3,TTYOUT CHECK: 0 DNAMP: SIXBIT /BITSF1BITSF2BITSF3BITSF4BITSF5BITSF6BITSF7BITSF8BITSF9/ ;************************************************************* TTYOUT: 0 HRRZ 10,TTYOUT ;(10)=ADDRESS OF JSR INSTR'N. HLRZ 10,-1(10) ;(10)=L-H OF INSTR'N JSR N,TTYOUT LSH 10,-5 ANDI 10,17 ;(10)=ACC#, USED FOR NOTE# IDENT'N. ADDI 10,60 ;(10)=ACC# IN ASCII DPB 10,POINTX ;MOVE (10) TO TTYMES TTCALL 3,TTYMES ;TYPE OUT NOTE# CAIE 10,61 ;IF NOTE# WAS 1, RETURN CALLI 12 ;IF NOT, EXIT JRST Z2 POINTX: POINT 5,TTYMES+1,20 TTYMES: ASCIZ / NOTE-1 / ;************************************************************** INITSR: 0 MOVEI 17,TEMPST-1 ;USE ACC17 FOR P/D LIST MOVE 13,INITSR ;IF (13)=0, O/P MESINQ ON TTY TTCALL 3,MESINQ(13) ;IF (13)=5, O/P FIRSTQ ON TTY X2: TTCALL 0,0 ;I/P A CHAR FROM TTY CAIN 0,15 ;CHECK FOR CARRIAGE RETURN CHAR JRST X1 CAIN 0,177 ;CHECK FOR RUB-OUT CHAR JRST SCRUB PUSH 17,0 ;STORE CHAR JRST X2 ;GET NEXT CHAR SCRUB: POP 17,0 TTCALL 1,0 ;ECHO BACK CHAR PRECEDING RUB-OUT JRST X2 X1: TTCALL 0,0 ;EMPTY LINE-FEED CHAR FROM TTY BUFFER JUMPE 13,CONLOP ;IF SERVICING MESINQ START CHAR CONVERS'N SETZ 1, ; " " FIRSTQ SET UP POINTER AND MOVE 14,[POINT 3,1,23] ; CONV INSTR'N MOVE 0,[SUBI 0,60] MOVEM 0,CONV CONLOP: HLRZM 17,CHECK ;(CHECK)=NO. OF CHARS I/P SETZ 13, ;USE ACC13 AS A COUNTER LOOP12: MOVE 0,TEMPST(13) ;(0)=CHARS IN TURN,STARTING AT MOST SIG. CONV: ADDI 0,40 ;CONVERT CHAR TO BINARY OR 6-BIT IDPB 0,14 ;DEPOSIT IT AOJ 13, CAME 13,CHECK ;HAVE ALL CHARS BEEN CONVERTED? JRST LOOP12 ;IF NOT, GET NEXT. TRNE 14,777776 ;IF MESINQ CALL, RETURN JRA 15,(15) SUBI 13,4 ;IF FIRSTQ CALL, SHIFT (1) SO AS TO IMULI 13,3 LSH 1,(13) ;RIGHT-JUSTIFY IT JRA 15,(15) ;RETURN END BEGIN