TITLE LOST BLOCKS PROGRAM LPTC==0 RIBPTR==1 F==2 BLK==3 FBN==4 CH==5 U==6 BUF==7 T1==10 T2==11 T3==12 T4==13 P1==14 P2==15 P3==16 P==17 VWHO==4 VMAJOR==2 VMINOR==0 VEDIT==0 LOC 137 BYTE (3)VWHO(9)VMAJOR(6)VMINOR(18)VEDIT RELOC ;VERSION 1-2 12 NOV 73 ;RE-ADDED INSTRUCTION THAT HAD "DISAPPEARED" ;AND INSERTED CODE TO SET UNIT BITS IN LAST SAT OF EACH UNIT ;PARAMETERS FROM COMMOD.MAC HOMNAM==0 ;"HOM" IN SIXBIT HOMSNM==4 ;STR TO WHICH THIS UNIT BELONGS HOMNXT==5 ;ID OF NEXT UNIT IN FILE STRUCTURE HOMLUN==10 ;LOGICAL UNIT IN STR HOMBSC==14 ;BLOCKS PER SUPERCLUSTER HOMSCU==15 ;SUPER CLUSTERS/UNIT HOMCNP==16 ;CLUSTER COUNT BYTE PTR FOR RETRIEVAL PTRS HOMCKP==17 ;CHECKSUM BYTE PTR HOMCLP==20 ;CLUSTER ADDR BYTE PTR HOMBPC==21 ;BLOCKS PER CLUSTER HOMSPU==31 ;SATS ON THIS UNIT HOMSAT==34 ;LOGICAL BLOCK WITHIN STR OF 1ST RIB FOR SAT.SYS HOMMFD==46 ;LOGICAL BLOCK WITHIN STR OF 1ST MFD RIB HOMCOD==176 ;CONAINS UNLIKELY CODE HOMSLF==177 ;THIS BLOCK WITHIN UNIT CODHOM==707070 ;UNLIKELY CODE FOR HOME BLOCK RIBFIR==0 ;RELATIVE POINTER TO RETRIEVAL PTRS IN RIB RIBPPN==1 RIBNAM==2 RIBEXT==3 RIBSIZ==5 RIBSTS==17 RBXXX==22 ;BASE FOR RIB RIBFLR==33 RIBXRA==34 ;EXTENDED RIB ADD RIBCOD==176 RIBSLF==177 RIPABC==20000 RIPNUB==400000 CODRIB==777777 BLKSIZ==200 SFDLVL==5 ;MAXIMUM NUMBER OF NESTED SFD'S ;END PARAMETERS FROM COMMOD.MAC OPDEF PJRST [JRST] OPDEF HALT [HALT] ;MAKE IT COME OUT IN CREF EXTERN .JBFF,.JBREL,.JBINT ST: JFCL ;DEFEND AGAINST CCL RESET SETZM .JBINT ;ENABLE ^C INTERUPT MOVE P,[IOWD 200,PDLBLK] GETPPN T1, HLRZ T2,T1 ;PROJECT # CAIE T2,1 JRST NOTP1 ;NOT PROJECT 1 MOVE T1,[ASTRST,,ASTRST+1] SETZM ASTRST BLT T1,LAB-1 ;ZERO OUT CORE MOVE T1,[XWD 0,16] GETTAB T1, ;GET MFD PPN MOVE T1,[1000001] ;ASSUME 1,1 IF GETTAB FAILED MOVEM T1,MFDPPN ;SAVE JUMPE T1,ZERPPN ;IF 0 INIT LPTC,0 SIXBIT/LPT/ XWD OUTBUF,0 JRST LPTERR ;ERROR RETURN OUTBUF LPTC, ;SET UP GETSTR: MOVE T2,[POINT 6,STRNAM] OUTSTR [ASCIZ/ WHICH STRUCTURE?/] MOVEI T3,6 ;MAX. COUNT MORSTR: TTCALL 4,T1 CAIN T1,15 ;END I/P? JRST ENDSTR SUBI T1,40 ;CONVERT TO SIXBIT IDPB T1,T2 SOJG T3,MORSTR ;NEXT CHAR ENDSTR: PUSHJ P,CLEAR ;CLEAR REMAINING I/P GETDRV: OUTSTR [ASCIZ/ WHICH DRIVES? (IN FORMAT DRIVE1,DRIVE2,..FOLLOWED BY A CR.):/] MOVEI P1,0 ;INDEX FOR UN%NAM TABLE NXTDRV: SETZ T3, MOVE T2,[POINT 6,T3] MOVEI T4,6 ;MAX. COUNT MORUN: TTCALL 4,T1 CAIN T1,"," ;END OF DRIVE? JRST ENDRV CAIN T1,15 ;END OF I/P? JRST ENDALL SUBI T1,40 ;CONVERT TO SIXBIT IDPB T1,T2 SOJG T4,MORUN ;STILL THIS DRIVE? TTCALL 4,T1 CAIE T1,"," ;CORRECT DELIM.? JRST SYNTER ;SYNTAX ERROR ENDRV: MOVEM T3,UN%NAM(P1) ADDI P1,1 CAILE P1,^D8 JRST TOMANY ;TOO MANY DRIVES JRST NXTDRV ;GET NEXT DRIVE ENDALL: MOVEM T3,UN%NAM(P1) ADDI P1,1 MOVEM P1,DRVCNT ;SAVE #DRIVES SETZM UN%NAM(P1) PUSHJ P,CLEAR ;CLEAR REMAINING I/P MOVEI CH,10 ;CHBASE=10 MOVEM CH,CHBASE MOVEI F,0 ;INDEX MORINT: MOVE T3,UN%NAM(F) JUMPE T3,LOOPY ;END OF UN%NAM TABLE PUSHJ P,INITAL ;INIT. CH=CHAN,T3=DRIVE ADDI F,1 ;NEXT NAME AOJA CH,MORINT ;NEXT ONE LOOPY: SETZM FLAG OUTSTR [ASCIZ/ DO YOU WANT TO INCLUDE LOOP TEST FOR DISK? Y OR C.R.:/] TTCALL 4,T1 CAIE T1,"Y" JRST DATIM ;NO SO DONT SET FLAG MOVEI T1,1 MOVEM T1,FLAG ;SET FLAG PUSHJ P,CLEAR ;CLEAR L.F. ;O/P DATE AND TIME DATIM: OUTSTR [ASCIZ/ /] MOVE T1,STRNAM PUSHJ P,SIXASC ;O/P STR NAME IN ASCIZ PUSHJ P,STRING ASCIZ/ ANALYSIS BEGUN AT / MSTIME P1, ;GET TIME IDIVI P1,^D1000 ;IN SECONDS IDIVI P1,^D60 ;MINS PUSH P,P2 ;STACK SECS IDIVI P1,^D60 ;HRS REM MINS MOVE F,P1 PUSHJ P,DECOUT ;O/P HRS IN DECIMAL PUSHJ P,STRING ASCIZ/:/ MOVE F,P2 PUSHJ P,DECOUT ;O/P MINS PUSHJ P,STRING ASCIZ/:/ POP P,F PUSHJ P,DECOUT ;O/P SECS PUSHJ P,STRING ASCIZ/ / DATE P1, ;GET DATE IDIVI P1,^D372 ;YEARS + REMAINDER IN P2 IDIVI P2,^D31 ;MONTHS-1 REM DAYS-1 AOS F,P3 ;DAYS PUSHJ P,DECOUT PUSHJ P,STRING ASCIZ/-/ AOS F,P2 ;MONTHS PUSHJ P,DECOUT PUSHJ P,STRING ASCIZ/-/ MOVE F,P1 ;YEARS ADDI F,^D1964 ;BASE YEAR PUSHJ P,DECOUT PUSHJ P,STRING ASCIZ/ / INTDUN: MOVE T1,DRVCNT ;# OF DRIVES MOVEI CH,10 ;1ST. CHAN NXT1: PUSH P,T1 ;SAVE COUNT PUSHJ P,GETHOM ;GET HOME BLOCK FOR THIS DRIVE ;INTO BUFHOM & TEST IT PUSHJ P,UNITST ;THIS UNIT IN STR? ;LOGICAL UNIT# IN U CAMLE U,HGHUNI MOVEM U,HGHUNI ;UPDATE HIGHEST UNIT MOVEM CH,UN%CHN(U) ;MAKE ENTRY IN UN%CHN TABLE PUSHJ P,GETWPS ;WRDS/SAT FOR UNIT IN T1 MOVEM T1,UN%WPS(U) ;ENTRY IN TABLE MOVEI BUF,BUFHOM MOVE T2,HOMSPU(BUF) ;SATS ON THIS UNIT MOVEM T2,SATNUM(U) ;# SATS ON THIS UNIT PUSHJ P,GETCLS ;GET CLS/UNIT TO T1 MOVEM T1,ST%ON(U) ;SAVE IN TABLE IDIV T1,HOMSPU(BUF) ;GET CLUSTERS/SAT SKIPE T2 ADDI T1,1 ;ROUND UP MOVEM T1,UN%CPS(U) ;CLUSTERS/SAT ADDI CH,1 ;NEXT CHAN POP P,T1 ;GET COUNT BACK SOJG T1,NXT1 ;GET NEXT PUSHJ P,GAPTST ;ANY GAPS IN UN%CHN? SETZM SATBAS MOVEI U,0 NXT2: MOVE T1,UN%WPS(U) MOVE T2,SATNUM(U) IMUL T1,T2 ADD T1,SATBAS(U) MOVEM T1,SATBAS+1(U) ADDI U,1 CAMGE U,DRVCNT JRST NXT2 PUSHJ P,CUMCLS ;CUMULATIVE COUNT OF "CLUSTERS ;BELOW THIS UNIT" TABLE MOVEI BUF,BUFHOM MOVE T1,HOMBPC(BUF) MOVEM T1,BLKCLS ;BLOCKS/CLUSTER MOVE T1,HOMCNP(BUF) MOVEM T1,BPCLCT ;BYTE PTR. FOR CLUST. CNT. MOVE T1,HOMCLP(BUF) MOVEM T1,BPCLAD ;BYTE PTR. FOR CLUST. ADD. PUSHJ P,STRING ASCIZ/BLOCKS PER CLUSTER=/ MOVE F,BLKCLS PUSHJ P,PRNOCT PUSHJ P,STRING ASCIZ/ / ;TEST TO SEE IF PACKS ARE MOUNTED TESTM: MOVEI T1,0 ;INDEX TO UN%NAM TESTM0: MOVE P1,UN%NAM(T1) ;GET NAME JUMPE P1,OK ;FINISHED TEST MOVEM P1,MNTST ;FOR DSKCHR MOVE T2,[XWD 4,MNTST] DSKCHR T2, JRST [OUTSTR [ASCIZ/ ?DSKCHR UUO FAILED /] JRST QUIT] ;GIVE UP LDB T3,[POINT 1,T2,1] CAIE T3,0 ;IF BIT 1=1 THEN PACK OFF LINE JRST OFFLIN ;PACK OFF LINE LDB T3,[POINT 2,T2,8] CAIN T3,2 ;IF BITS 7&8=10 THEN PACK NOT MOUNTED JRST NXTPAK ;OK SO TEST NEXT PACK OUTSTR [ASCIZ/ PACK MOUNTED. NOT USUALLY DONE. ARE YOU SURE? Y OR CAR RET.:/] TTCALL 4,T3 CAIN T3,"Y" JRST NXTPK0 ;YES BUT TEST FURTHER PACKS ANYWAY PUSHJ P,CLEAR ;GET RID OF REMAINING I/P JRST TESTM ;START AGAIN NXTPK0: OUTSTR [ASCIZ/ /] NXTPAK: ADDI T1,1 ;INCREMENT INDEX JRST TESTM0 ;TEST NEXT ONE OFFLIN: OUTSTR [ASCIZ/ ?PACK OFF LINE. FIX AND START AGAIN /] JRST QUIT ;STILL HAVE A HOME BLOCK IN CORE IN BUFHOM ;GET RIB OF SAT.SYS OK: MOVEI BUF,BUFHOM MOVE T1,HOMSAT(BUF) ;LOG. BLK# OF RIB FOR SAT.SYS ;(WITHIN STR) PUSHJ P,STRUNI ;LOG BLK# WITHIN UNIT IN BLK ;UNIT# IN U MOVEI BUF,SATRIB PUSHJ P,RUB200 ;GET SAT.SYS RIB JRST STRBER ;I/P ERROR PUSHJ P,RIBTST ;IS IT A RIB? JRST RIBERR ;RIB ERROR MOVEI BUF,SATRIB MOVE T1,[SIXBIT/SAT/] CAME T1,RIBNAM(BUF) ;NAME=SAT? JRST NOTSAT MOVE T1,[SIXBIT/SYS/] HLLZ T1,RIBEXT(BUF) ;EXT ONLY CAME T1,[SIXBIT/SYS/] JRST NOTSAT ;WANT TO BUILD ST%ADD TABLE (SAT# TO DISC ADDRESS) MOVEI U,0 ;1ST. UNIT MOVEI P2,-1 MOVEI P1,SATRIB ADD P1,(P1) ;AOBJN TO POINTERS NXTPTR: MOVE T1,(P1) ;GET POINTER IN T1 JUMPE T1,SATRD ;EOF PUSH P,P1 ;SAVE AOBJN POINTER TO POINTERS TLNN T1,777777 ;UNIT CHANGE BITS SET? JRST NXTUNI MOVE P3,BPCLAD HRRI P3,T1 LDB T2,P3 ;T2=CLUST. ADD REL TO UNIT MOVEM T2,ST%ADD(P2) ;CLUSTER ADD MOVE P1,[POINT 3,U,35] MOVE P3,[POINT 3,ST%ADD(P2),2] LDB T1,P1 ;UNIT DPB T1,P3 ;IN TABLE CNTDWN: ADDI P2,1 ;UPDATE SAT# CNTDW1: POP P,P1 AOBJN P1,NXTPTR ;NEXT POINTER HALT . ;SHOULD NEVER HAPPEN (NO EOF PTR) NXTUNI: TRZN T1,400000 ;UNIT CHANGE? JRST CMPLAN ;WHY NOT? MOVE U,T1 ;UPDATE UNIT JRST CNTDW1 ;GO ON FOR NEXT SAT ;READ IN SAT BLOCKS SATRD: CAIGE P2,1 ;TOP SAT # HALT . ;NO SATS SETZM ST%ADD-1(P2) ;CLEAR LAST ADD+1 MOVEI P1,0 ;INDEX TO ST%ADD MOVE P2,.JBFF ;START OF FREE CORE MOVEM P2,ASTRST ;START ADD OF STRSAT NXTSAT: LDB U,[POINT 3,ST%ADD(P1),2] LDB BLK,[POINT 33,ST%ADD(P1),35] SKIPN BLK ;IF NOT BLK 0 JUMPE U,DONE ;IF BLK=U=0 THEN DONE IMUL BLK,BLKCLS ;BLK ADD ADD P2,UN%WPS(U) CAMLE P2,.JBREL PUSHJ P,GETCOR ;GET ENOUGH CORE MOVEM P2,.JBFF ;UPDATE SUB P2,UN%WPS(U) ;RESET P2 MOVEI BUF,(P2) ;ADD OF BUFFER MOVN T1,UN%WPS(U) ;COUNT PUSHJ P,RUBT1 ;I/P T1 WRDS TO BUF JRST SATERR ;I/P ERROR ADD P2,UN%WPS(U) ;NEXT SAT AOJA P1,NXTSAT ;NEXT SAT BLOCK DONE: SUB P2,ASTRST MOVEM P2,LSTRST ;LENGTH OF SAT TABLE ;MAKE OUR SAT TABLE ;GET ENOUGH CORE TO MAKE OURSAT MOVE P2,.JBFF MOVEM P2,STAOUR ;START ADD OF OURSAT ADD P2,LSTRST ;LENGTH OF STRSAT PUSHJ P,GETCOR ;GET ENOUGH CORE MOVEM P2,.JBFF ;UPDATE ;CLEAR OUR SAT AREA MOVE T2,STAOUR ;START ADDRESS SETZM (T2) ;SET TO ZEROS HRR T1,STAOUR ;ADD ADDI T1,1 HRL T1,STAOUR ADD T2,LSTRST SUBI T2,1 ;LAST ADD TO CLEAR BLT T1,(T2) ;SET UNUSED BITS IN LAST WORD OF EACH SAT SETWRD: MOVEI U,0 ;START WITH UNIT 0 MOVE P2,DRVCNT ;# OF DRIVES UNINXT: MOVE P1,SATNUM(U) ;# OF SATS ON THIS UNIT MOVE T1,SATBAS(U) ;BASE OF 1ST SAT FOR UNIT ADD T1,STAOUR ;ADD OF 1ST SAT ON UNIT MOVE T2,UN%WPS(U) ;WRDS/SAT IMULI T2,^D36 ;CLUSTERS REP BY EACH SAT SUB T2,UN%CPS(U) ;T2=BITS TO SET AT END OF EACH SAT SETOM T4 ;BITS TO STORE (ALL ONES) SATNXT: ADD T1,UN%WPS(U) ;ADD OF NEXT SAT SUBI T1,1 ;ADD OF LAST WORD IN SAT MOVSI T3,T1 ;SET INDEX IN BYTE PTR ACC DPB T2,[POINT 6,T3,11];SIZE DPB T4,T3 ;SET BITS ADDI T1,1 ;RESET T1 SOJLE P1,ALLSAT ;NONE LEFT CAIE P1,1 ;IF LAST SAT JRST SATNXT ;NEXT ONE PUSH P,T1 ;SAVE T1 MOVE T3,SATNUM(U) ;# SATS ON UNIT SUBI T3,1 ;# SATS SO FAR IMUL T3,UN%CPS(U) ;CLUSTERS SO FAR PUSHJ P,GETCLS ;CLUSTERS ON UNIT IN T1 SUB T1,T3 ;CLUSTERS IN LAST SAT MOVE T3,UN%CPS(U) ;C/SAT SUB T3,T1 ;EXTRA BITS FOR LAST SAT ADD T2,T3 ;TOTAL BITS FOR LAST SAT PUSHJ P,LSTCLS ;IF LAST CLUSTER IS NOT WHOLE ;THEN INCREMENT T2 POP P,T1 ;RESTORE T1 JRST SATNXT ALLSAT: ADDI U,1 ;NEXT UNIT SOJG P2,UNINXT ;GET MFD RIB MOVEI BUF,BUFHOM MOVE T1,HOMMFD(BUF) ;LOG BLK# OF MFD RIB (WITHIN STR) PUSHJ P,STRUNI ;U=UNIT,BLK=LOG BLK# OF MFD RIB ; (WITHIN UNIT) MOVE P1,P ;CURRENT P MOVEI P,@.JBFF PUSHJ P,ADVSTK JFCL PUSH P,P1 ;SAVE OLD P JSP T1,SETSTP ;SET UP STACK FOR MFD JRST RIBERR ;ERROR IN RIB MOVE P3,[IOWD 50,PDLBK2] ;STACK FOR RECURSION ROUTINE PUSHJ P3,SETSAT ;MAKE OURSAT SUBI P,405 ;WIND BACK STACK POP P,P ;GET OLD P BACK PUSHJ P,STRING ASCIZ/ TOTAL NO OF MULTIPLY DEFINED CLUSTERS= / MOVE F,MULCNT PUSHJ P,DECOUT ;O/P IN DECIMAL PUSHJ P,STRING ASCIZ/ / OUTHED: PUSHJ P,STRING ASCIZ/ LOST CLUSTERS/ PUSHJ P,STRING ASCIZ/ / ;COMPARE OUR SAT WITH THEIRS COMPAR: MOVEI U,0 SETZM CLSBEF ;CLUSTERS BEFORE START OF THIS SAT SETZM SATCNT ;#SATS SO FAR SETZM LSTCNT ;#LOST BLOCKS SO FAR SETZM FRECNT ;# NF FREE BLOCKS SETZM LINCNT ;# OF NOS. O/P ON LINE SO FAR MOVEI P1,0 ;START INDEX AT 0 MOVEI F,0 ;CLUSTER # OF 1ST CLUSTER IN WRD NXTENT: MOVE P2,ASTRST ;START ADD OF THEIR SAT MOVE P3,STAOUR ;START ADD OF OUR SAT ADD P2,P1 ADD P3,P1 MOVE T1,(P2) ;THEIR ENTRY MOVE T2,(P3) ;OUR ENTRY XOR T1,T2 ;SET BITS THAT ARE DIFFERENT JUMPE T1,NODIF ;SAME PUSH P,F ;SAVE CLUST# OF 1ST CLUST IN WRD ;BITS SET IN T1 ARE EITHER LOST OR FREE BLOCKS ;T2=OUR ENTRY MOVEI T4,^D36 ;COUNT MOVE P2,[POINT 1,T1] MOVE P3,[POINT 1,T2] GETMOR: PUSH P,T4 ;SAVE COUNT ILDB T4,P2 JUMPE T4,[ILDB T4,P3 JRST NOTONE] PUSH P,T1 PUSH P,T2 PUSHJ P,SPACNG ;GET SPACING RIGHT PUSHJ P,PRNOCT ;CLUST# IN F.CONVERT TO OCTAL & O/P POP P,T2 POP P,T1 ILDB T4,P3 JUMPE T4,LSTONE ;LOST PUSHJ P,FREE ;O/P AN F AND UPDATE # OF FREE JRST NOTONE LSTONE: AOS LSTCNT NOTONE: ADDI F,1 ;ADD OF NEXT CLUSTER POP P,T4 ;GET COUNT BACK SOJG T4,GETMOR ;NEXT BIT POP P,F ;RESTORE CLUST # OF 1ST CLUST IN WRD NODIF: ADDI P1,1 ;INCREMENT INDEX ADDI F,^D36 ;AND CLUST# MOVE T1,UN%CPS(U) ;CLUST/SAT FOR UNIT ADD T1,CLSBEF ;CLUSTS BEFORE START OF THIS SAT CAMG F,T1 JRST NXTENT ;STILL IN SAME SAT MOVE F,T1 MOVE T1,UN%CPS(U) ADDM T1,CLSBEF ;UPDATE CLUSTS BEFORE THIS SAT AOS T1,SATCNT ;UPDATE CAMGE T1,SATNUM(U) ;TOTAL # OF SATS ON UNIT JRST NXTENT ;STILL THIS UNIT ADDI U,1 ;NEXT UNIT CAML U,DRVCNT ;FINISHED? JRST TOTOUT ;YES GO TO NEXT PART SETZM SATNUM ;RESET JRST NXTENT ;NEXT ENTRY FREE: PUSH P,T1 MOVEI T1,"F" PUSHJ P,WRITEC ;O/P AN F TO SHOW CLUSTER FREE (T2 PRESERVED) AOS FRECNT ;UPDATE FREE COUNT POP P,T1 POPJ P, ; O/P TOTAL # OF LOST BLOCKS TOTOUT: PUSHJ P,STRING ASCIZ/ TOTAL NO. OF LOST CLUSTERS = / MOVE F,LSTCNT PUSHJ P,DECOUT ;CONVERT & O/P PUSHJ P,STRING ASCIZ/ / OUT LPTC, ;GET IT ON PAPER PUSHJ P,STRING ASCIZ/ TOTAL NO OF FREE CLUSTERS=/ MOVE F,FRECNT PUSHJ P,DECOUT ;CONVERT AND O/P PUSHJ P,STRING ASCIZ/ / OUT LPTC, ;GET IT ON PAPER ;IF NO LOST OR FREE CLUSTERS THEN FINISHED MOVE T1,LSTCNT MOVE T2,FRECNT ;FREE MOVE T2,FRECNT ;FREE CAIN T1,0 ;NO LOST? CAIE T2,0 ;NO FREE JRST SATWIT ;YES SO WRITE OUR SATS JRST QUIT ;NO LOST OR FREE SO ALL DONE SATWIT: CLRBFI ;MAKE SURE GET AN "HONEST" REPLY OUTSTR [ASCIZ/ DO YOU WANT THESE SATS WRITTEN ONTO DSK?Y OR N:/] TTCALL 4,T1 ;GET ANSWRE CAIE T1,"Y" JRST QUIT ;NO SO DONE PUSHJ P,CLEAR ;CLEAR REMAINING I/P & CONTINUE MOVEI T1,INTRBK MOVEM T1,.JBINT ;DISABLE ^C INTERRUPT ;WRITE OUR SATS ONTO DSK ;ST%ADD=TABLE OF POINTERS TO SATS; 1ST 4 BITS=UNIT ;RH=BLOCK ADD REL TO UNIT MOVEI P1,0 ;INDEX TO ST%ADD TABLE MOVE P2,STAOUR ;START ADD OF OUR SAT NXTCOP: PUSHJ P,SETTMP ;SET TRANSFER BUFFER TO ALL ONES HRLZ P3,P2 ;CURRENT POS IN OUR SAT HRRI P3,TMPBUF ;ADD OF TRANSFER BUFFER MOVE T1,ST%ADD(P1) ;THIS ENTRY JUMPE T1,QUIT ;END OF PTRS IF U=ADD=0 LDB U,[POINT 4,T1,3] MOVE T1,UN%WPS(U) ;# OF WRDS TO TRANSFER ADDI T1,TMPBUF-1 ;ADD OF LAST WORD TO TRANSFER BLT P3,(T1) ;TRANSFER THIS MANY MOVE T2,ST%ADD(P1) ;THIS ENTRY LDB FBN,[POINT 32,T2,35] IMUL FBN,BLKCLS ;BLOCK ADDRESS MOVE CH,UN%CHN(U) ;CHAN THIS UNIT IS ON ;WRITE OUT 1 DISK BLOCK FROM TMPBUF TO UNIT ON CHAN,CH ;STARTING AT BLK ADD FBN DPB CH,[POINT 4,SET1,12] ;FOR USETO DPB CH,[POINT 4,SET2,12] ;FOR O/P DPB CH,[POINT 4,SET3,12] ;FOR STATUS DPB CH,[POINT 4,SET0,12] ;FOR GETSTS SETZM LABO+1 SET0: GETSTS 0,T1 SET1: USETO 0,FBN SET2: OUTPUT 0,LABO SET3: STATZ 0,740000 ;ANY ERROR? JRST OUTERR ;YES ADD P2,UN%WPS(U) ;UPDATE IT AOJA P1,NXTCOP ;INCREMENT INDEX & LOOP ;ROUTINES ;I/P ROUTINE ;----------- ;T1=COUNT RUBT1: MOVE CH,UN%CHN(U) ;GET CHANNEL JRST RUB200+2 RCB200: SKIPA ;GOT CHAN ALREADY ;U=UNIT,BLK=BLOCK#,BUF=BUFFER RUB200: MOVE CH,UN%CHN(U) ;GET CHANNEL MOVEI T1,-200 ;COUNT HRLM T1,LAB HRRM BUF,LAB ;BUFFER ADD SOS LAB ;MAKE LAB A PROPER I/O WRD PUSHJ P,INP ;I/P THIS BLK POPJ P, JRST CPOPJ1 ;GIVE SKIP RETURN INP: DPB CH,[POINT 4,SET,12] DPB CH,[POINT 4,INCHAN,12] DPB CH,[POINT 4,INCHAN+1,12] SET: USETI 0,BLK INCHAN: INPUT 0,LAB STATZ 0,740000 ;ERROR? SOS (P) ;COUNTERACT SKIP RETURN CPOPJ1: AOS (P) CPOPJ: POPJ P, ;LINE PRINTER O/P ROUTINES WRITC0: OUT LPTC, JRST WRITEC ;OK STATZ LPTC,740000 ;ANY ERROR? JRST LPTOER ;YES JRST HELP ;ASSUME EOF & SCREAM!! WRITEC: SOSG OUTBUF+2 ;DECREMENT COUNT JRST WRITC0 ;O/P IDPB T1,OUTBUF+1 POPJ P, ;RETURN ;CONVERT C(F) TO OCTAL & O/P PRNOCT: PUSH P,F MOVEI T2,6 ;COUNT HRLZ F,F MOVE T3,[POINT 3,F] NXTNO: ILDB T1,T3 ADDI T1,60 ;CONVERT TO NO. PUSHJ P,WRITEC ;O/P SOJG T2,NXTNO POP P,F POPJ P, ;O/P A STRING OF ASCIZ CHARACTERS STRING: MOVSI T2,440700 ;MAGIC # HRR T2,(P) ;T2=BYTE PTR TO STRING ILDB T1,T2 JUMPE T1,.+3 ;END OF STRING PUSHJ P,WRITEC ;O/P JRST .-3 ;NEXT BYTE ADDI T2,1 HRRM T2,(P) ;UPDATE P POPJ P, ;AND RETURN ;CONVERT C(T1) FROM SIXBIT TO ASCIZ & RETURN RESULT IN T1 SIXASC: MOVEI T4,5 ;COUNT MOVE T2,T1 MORCNV: ILDB T1,[POINT 6,T2] ADDI T1,40 PUSHJ P,WRITEC SOJG T4,MORCNV ;STILL MORE POPJ P, DECOUT: PUSH P,F+1 ;MAKE SURE NO DISASTER HAPPENS PUSHJ P,DECOU0 ;CONVERT & PRINT POP P,F+1 ;RESTORE F+1 POPJ P, DECOU0: MOVEI T2,^D10 RADOUT: IDIVI F,(T2) ;USES RADIX T2 HRLM F+1,(P) ;STACK REMAINDER SKIPE F ;WHEN DONE PUSHJ P,RADOUT ;NEXT DIGIT HLRZ T1,(P) MOVEI T1,"0"(T1) PJRST WRITEC ;OUT CHAR AND RETURN ;CH=CHAN,T3=DRIVE IN SIXBIT INITAL: DPB CH,[POINT 4,INTBLK,12] MOVEM T3,INTBLK+1 ;DRIVE INTBLK: INIT 0,17 ;DUMP MODE 0 ;DEVICE 0 JRST INTERR POPJ P, CLEAR: TTCALL 4,T1 CAIE T1,12 ;L.F.? JRST CLEAR ;CONT UNTIL U GET ONE POPJ P, GETCLS: PUSH P,T2 MOVEI BUF,BUFHOM MOVE T1,HOMSCU(BUF) ;SUPER CLUST./UNIT IMUL T1,HOMBSC(BUF) IDIV T1,HOMBPC(BUF) SKIPE T2 ADDI T1,1 ;ROUND UP T2POPJ: POP P,T2 ;RESTORE T2 POPJ P, GETHOM: MOVEI BUF,BUFHOM ;BUFFER MOVEI BLK,1 ;1ST HOME BLK PUSHJ P,RCB200 JRST HOM2 ;TRY 2ND HOME BLOCK PUSHJ P,HOMTST ;IS IT A HOME BLOCK? SKIPA ;TRY OTHER ONE JRST CPOPJ ;NO GOT ONE HOM2: MOVEI BUF,BUFHOM MOVEI BLK,10 ;2ND HOME BLK PUSHJ P,RCB200 JRST HOMERD PUSHJ P,HOMTST ;IS IT A HOME BLOCK? JRST HOMERR POPJ P, HOMTST: MOVEI BUF,BUFHOM MOVE T1,[SIXBIT/HOM/] CAME T1,HOMNAM(BUF) JRST CPOPJ MOVEI T1,CODHOM CAME T1,HOMCOD(BUF) JRST CPOPJ JRST CPOPJ1 ;GIVE SKIP RETURN. (HAVE HOME BLK) RIBTST: SKIPL RIBFIR(BUF) JRST RBTST0 ;NO AOBJN WRD MOVE T1,RIBCOD(BUF) CAME T1,[CODRIB] JRST RBTST0 ;NO CODE CAME BLK,RIBSLF(BUF) ;THIS BLOCK JRST RBTST0 ;RIBERR AOS (P) ;SKIP RETURN IF OK POPJ P, RBTST0: OUTSTR [ASCIZ/ ?RIB ERROR /] POPJ P, ;NON SKIP RETURN IF ERROR ;P2 SET UP ;ROUTINE TO SEE IF LAST CLUSTER ON UNIT IS WHOLE ;IF NOT WHOLE THEN INCREMENT T2 (BITS TO SET AT END OF LAST SAT) LSTCLS: PUSH P,T1 ;SAVE ACCS PUSH P,T2 MOVE T1,UN%NAM(U) ;UNIT NAME MOVEM T1,NAMLOC ;STORE MOVE T1,[XWD 1,NAMLOC] DSKCHR T1, JRST [OUTSTR [ASCIZ/ ?DSKCHR UUO FAILED FOR UNIT /] JRST QUIT] LDB T2,[POINT 6,T1,26];CONTROLLER TYPE CAIN T2,1 JRST FIXED ;FIXED HEAD CAIE T2,2 JRST [OUTSTR [ASCIZ/ ?CONTROLLER IS NEITHER FH OR DP /] JRST QUIT] ;MOVEABLE HEAD LDB T2,[POINT 3,T1,32];UNIT TYPE CAIN T2,1 ;RPO2? JRST [MOVE T1,[^D40000] JRST GOTBLK] CAIN T2,2 ;RPO3? JRST [MOVE T1,[^D80000] JRST GOTBLK] OUTSTR [ASCIZ/ MOVEABLE HEAD IS NEITHER RPO2 OR RPO3 /] JRST QUIT FIXED: LDB T2,[POINT 3,T1,32];UNIT TYPE CAIN T2,0 ;BURROUGHS DISK? JRST [MOVE T1,[^D4000] JRST GOTBLK] CAIN T2,1 ;BRYANT DRUM? JRST [MOVE T1,[^D2700] JRST GOTBLK] OUTSTR [ASCIZ/ FIXED HEAD IS NEITHER BURROUGHS DISK OR BRYANT DRUM /] JRST QUIT ;T1=BLOCKS ON UNIT GOTBLK: IDIV T1,BLKCLS SKIPE T2 AOS (P) ;INCREMENT T2 (IE. ROUND UP) POP P,T2 ;RESTORE T2 POP P,T1 ;& T1 POPJ P, GETCOR: PUSH P,T1 MOVE T1,P2 CORE T1, JRST NOCORE ;NO MORE CORE TPOPJ: POP P,T1 ;RESTORE T1 POPJ P, ;AND RETURN CUMCLS: SETZ P3, ;COUNT TO ADD MOVE T4,DRVCNT ;# OF DRIVES SETZM ST%BEL ;1ST ENTRY 0 MOVEI T1,0 ;INDEX TO ST%ON MOVEI T2,1 ;INDEX TO ST%BEL NXTCUM: MOVE T3,ST%ON(T1) ;CLUSTERS ON UNIT ADD T3,P3 ;ADD COUNT SO FAR MOVEM T3,ST%BEL(T2) ;CLUSTERS BELOW UNIT ADD P3,T3 ;UPDATE COUNT TO ADD ADDI T1,1 ADDI T2,1 ;AND INDEXES SOJG T4,NXTCUM ;NEXT ENTRY POPJ P, UNITST: MOVEI BUF,BUFHOM MOVE T1,HOMSNM(BUF) ;STR THIS UNIT BELONGS TO CAME T1,STRNAM ;SAME? JRST WRNSTR ;WRONG STR MOVE U,HOMLUN(BUF) ;LOGICAL UNIT# OF THIS UNIT POPJ P, ;WITHIN THIS FILE STR GAPTST: MOVEI T1,0 MOVE T4,DRVCNT ;# OF DRIVES JUMPE T4,AYAY ;0 DRIVES? NXTCHN: MOVE T3,UN%CHN(T1) ;CHAN JUMPE T3,GAP ADDI T1,1 ;NEXT INDEX SOJG T4,NXTCHN ;NEXT POPJ P, GAP: OUTSTR [ASCIZ/ ?GAP FOUND IN CHANNEL TABLE.HAVE YOU GIVEN ALL THE DRIVES?/] JRST GETDRV ;TRY AGAIN GETWPS: MOVEI BUF,BUFHOM MOVE T1,HOMBSC(BUF) IMUL T1,HOMSCU(BUF) IDIV T1,HOMBPC(BUF) ;T1=#CLUSTERS/UNIT SKIPE T2 ;IF REMAINDER=0 ADDI T1,1 ;ROUND UP IDIV T1,HOMSPU(BUF) ;WRDS/SAT CAIE T2,0 ADDI T1,1 ;ROUND UP IDIVI T1,^D36 ;WORDS NEEDED SKIPE T2 ;IF REMAINDER=0 ADDI T1,1 ;ROUND UP POPJ P, ;U=UNIT,T1=CLUSTER ADD REL TO UNIT UNISTR: ADD T1,ST%BEL(U) POPJ P, ;T1=LOGICAL BLOCK# WITHIN STR STRUNI: MOVEI U,0 ;START WITH UNIT 0 MOVE T2,ST%ON(U) ;CLUSTERS IMUL T2,BLKCLS ;T2=BLOCKS ON UNIT CAMLE T1,T2 ;ON THIS UNIT? AOJA U,STRUNI+1 ;NEXT MOVE T2,ST%BEL(U) ;CLS BELOW THIS UNIT IMUL T2,BLKCLS ;BLKS BELOW THIS UNIT SUB T1,T2 ;T1=LOG BLK# WITHIN UNIT MOVE BLK,T1 POPJ P, ;T1=WRDS,T2=BITS TABMAK: PUSH P,P1 ;SAVE P1 MOVE T3,STAOUR ;START ADD OF OURSAT MOVEI T4,^D35 SUB T4,T2 ;BITS TO RIGHT ADD T3,T1 ;WORD IN TABLE MOVE P1,[POINT 1,(T3),0] DPB T4,[POINT 6,P1,5] ;CHECK ON 5 SETO T2, LDB T4,P1 JUMPN T4,MULTI ;BIT ALREADY SET SO COMPLAIN DPB T2,P1 ;SET BIT TABMK1: POP P,P1 ;RESTORE P1 POPJ P, MULTI: PUSHJ P,SPACNG MOVE F,CDUMP ;CLUSTER # WRT UNIT ADD F,CLSBEF(U) ;CLUSTER # WRT STR PUSHJ P,PRNOCT ;O/P AOS MULCNT JRST TABMK1 ;RDBLK: READ BLOCK FBN,RELATIVE TO FILE WHOSE RIB ADD IS ;IN RIBPTR. BUFFER GIVEN IN BUF RDBLK: PUSHJ P,GENBLK ;RETURN WITH U=UNIT ;T2=CLUSTER ADD & ;T3=BLOCKS ON IN FRAGMENT JRST RDBLK0 IMUL T2,BLKCLS ;BLOCK ADD OF 1ST. CLUSTER ADD T2,T3 ;THIS BLOCK MOVE BLK,T2 ;BLOCK# FOR I/P PUSHJ P,RUB200 ;I/P JRST INPERR AOS (P) ;GOOD RETURN RDBLK0: POPJ P, ;RIBPTR=ADD OF RIB. MARK ALL BLOCKS OF FILE MRKBLK: MOVEI FBN,0 NXTBLK: PUSHJ P,GENBLK POPJ P, ;RETURN IF EOF MOVE T1,T2 IMUL T1,BLKCLS ;BLK ADD ADD T1,T3 ;THIS BLK IDIV T1,BLKCLS ;THIS CLUSTER # WRT UNIT MOVEM T1,CDUMP ;SAVE CLUSTER # FOR PRINTING IF MULTIPLE JUMPN T2,COUNTY ;IF REMAINDER NOT 0 THEN CLUSTER ;IS ALREADY MARKED IDIV T1,UN%CPS(U) ;T1=SAT# ;T2=CLUSTER # WRT THIS SAT IDIVI T2,^D36 ;T2=WRDS ON IN THIS SAT ;T3=BITS ON IN THIS WRD IMUL T1,UN%WPS(U) ADD T1,SATBAS(U) ;BASE FOR THIS SAT ADD T1,T2 ;THIS WRD MOVE T2,T3 ;FOR TABMAK PUSHJ P,TABMAK ;SET THIS BLOCK "IN USE" COUNTY: ADDI FBN,1 ;NEXT BLOCK JRST NXTBLK ;MARK NEXT BLOCK ;CALLED WITH RIBPTR=ADD OF RIB & FBN=BLOCK # OF FILE GENBLK: PUSH P,FBN PUSH P,P1 SUB FBN,RBXXX(RIBPTR);SUBTRACT BASE JUMPL FBN,OHDEAR ;-VE FBN NOT ALLOWED!! MOVE P1,RIBPTR ;ADD OF RIB ADD P1,(P1) ;AOBJN TO POINTERS NXTGRP: MOVE T1,(P1) ;T1=POINTER JUMPN T1,NXTGR1 ;NOT EOF NXTGR0: POP P,P1 POP P,FBN POPJ P, NXTGR1: TLNE T1,777777 ;UNIT CHANGE BITS SET? JRST GRPTR ;NO SO GROUP POINTER TRZN T1,400000 ;UNIT CHANGE? JRST [OUTSTR [ASCIZ/ ?BAD UNIT CHANGE IN RIB - TREATED AS EOF /] JRST NXTGR0] ;GIVE NON SKIP RETURN MOVE U,T1 ;UPDATE UNIT JRST COUNT+1 ;COUNTDOWN GRPTR: PUSHJ P,GETINF ;T2=CLS ADD,T3=FRGCNT IN BLKS ;IS FBN IN THIS GROUP? TSTGRP: CAML FBN,T3 JRST COUNT MOVE T3,FBN AOS -2(P) ;FOUND GROUP SKIP RETURN JRST NXTGR0 ;QUIT COUNT: SUB FBN,T3 ;# BLKS AFTER THIS GRP AOBJN P1,NXTGRP ;TRY NEXT GROUP MOVE T1,RIBXRA(RIBPTR);GET EXTENDED RIB ADD JUMPE T1,NOPTRS ;NOT AN EXTENDED RIB LDB U,[POINT 4,T1,12];UNIT LDB BLK,[POINT 23,T1,35];ADD MOVE BUF,RIBPTR ;BUFFER PUSHJ P,RUB200 ;READ IN EXTENDED RIB JRST EXTERR ;YES PUSHJ P,RIBTST ;IS IT A RIB? JRST NOGO ;ERROR RETURN POP P,P1 ;KEEP STACK RIGHT POP P,FBN MOVEM FBN,RBXXX(RIBPTR);SET OFFSET JRST GENBLK ;CONTINUE WITH NEXT RIB NOPTRS: OUTSTR [ASCIZ/ ?RUN OUT OF POINTERS BEFORE REACHING END OF FILE /] JRST NXTGR0 ;SIMULATE EOF WHEN CANT READ ;EXTENDED RIB OR GET RIB ERROR NOGO: OUTSTR [ASCIZ/ ?ERROR IN EXTENDED RIB. CONTINUING /] JRST NXTGR0 ;RIB ERROR - SIMULATE EOF ;POINTER IN T1 ;GET 1) CLUSTER ADD IN T2 ; 2) FRGCNT IN BLOCKS IN T3 GETINF: PUSH P,P1 ;RESPECT P1 MOVE P1,BPCLCT ;BYTE PTR FOR CLUST CNT HRRI P1,T1 LDB T3,P1 ;CLUSTER CNT IMUL T3,BLKCLS ;BLOCK COUNT MOVE P1,BPCLAD ;BYTE PTR FOR CLUST ADD HRRI P1,T1 LDB T2,P1 ;CLUST ADD (REL TO UNIT) POP P,P1 ;RESPECT P1 POPJ P, ;BUFFER IN BUF GETSIZ: MOVE T1,RIBSIZ(BUF) IDIV T1,200 ;SIZE IN BLOCKS OF FILE POPJ P, ;RECURSIVE ROUTINE TO MAKE OURSAT SETSAT: MOVE P1,(P) ;INITIALISE P1 SETST0: SKIPN (P1) ;FILE NAME =0? JRST SETST4 ;WAS 0 SO GET NEXT HLRZ T2,1(P1) ;EXT CAIE T2,'UFD' ;.UFD JRST SETST1 ;CANT BE MFD MOVE T2,(P1) CAMN T2,MFDPPN ;WAS MFD IE .UFD JRST SETST4 ;IGNORE IT (SO DONT LOOP) SETST1: SKIPE FLAG ;IF FLAG NOT SET PUSHJ P,LOPTST ;TEST FOR LOOP ON DISK HRRZ T1,1(P1) ;GET CFP MOVEM P1,-1(P) ;SAVE CURRENT POSITION PUSHJ P,CFPCNV ;U=UNIT,BLK=BLOCK# JRST SETST4 ;FORGET IT! JSP T1,SETSTP ;SET UP STACK JRST SETST7 ;GOT A RIB ERROR PUSHJ P3,SETSAT ;RECURSE SETST3: SUBI P,405 ;WIND BACK STACK SETST8: MOVE P1,-1(P) ;GET POINTER TO POSITION SETST4: AOBJN P1,.+1 ;ADVANCE AOBJN P1,SETST0 ;JUMP IF MORE AOS FBN,-3(P) ;INCREM. & LOAD FBN CAMLE FBN,-2(P) ;EOF? JRST SETST5 ;EOF MOVE P1,(P) ;INITIALISE P1 AGAIN MOVEM P1,-1(P) ;SAVE CURRENT POS MOVEI BUF,(P1) MOVEI RIBPTR,-200(BUF) PUSHJ P,RDBLK ;READ BLOCK IN JRST SETST3 ;ERROR RETURN SO MISS THIS STEP OUT JRST SETSAT ;LOOP SETST6: MOVEI RIBPTR,-404(P) ;PTR TO RIB SETZM RBXXX(RIBPTR);ZERO OUT BASE FOR RIB PUSHJ P,MRKBLK JRST SETST3 SETST5: MOVEI RIBPTR,-404(P) ;PTR TO RIB (ITSELF) PUSHJ P,MRKBLK ;MARK IT POPJ P3, SETST7: SUBI P,401 ;WIND BACK STACK IF BAD RIB JRST SETST8 ;CONT AS IF NOT THERE ;SET UP STACK SETSTP: MOVEM T1,LNKSAV ;SAVE LINK ADD PUSHJ P,ADVSTK ;ADVANCE STACK ADDI P,401 ;PARAMETER MOVEI BUF,-400(P) ;SET UP BUFFER PUSHJ P,RUB200 ;READ BLOCK JRST TEMP ;I/P ERROR PUSHJ P,RIBTST ;IS IT A RIB? JRST SETSP0 ;ERROR RETURN MOVEI FBN,1 ;START AT 1ST. BLOCK PUSH P,FBN ;STACK BLK# MOVE T1,RIBSIZ(BUF) JUMPL T1,NEGSIZ ;-VE RIBSIZ LSH T1,-7 ;GET LAST BLK# PUSH P,T1 ;STACK BLK# LIMIT MOVSI P1,-200 HRRI P1,-202(P) ;AOBJN PTR TO DATA PUSH P,P1 ;REMEMBER ORIGINAL POS PUSH P,P1 ;AND CURRENT POS MOVEI T1,1B18 ;DIRECTORY BIT TDNE T1,RIBSTS(BUF) ;SKIP IF SET SKIPN -2(P) ;CATCH 0 LENGTH FILES JRST SETST6 ;WAS 0 MOVE BUF,-1(P) ;SET UP BUFFER ADD ;FROM ORIGINAL PTR MOVEI RIBPTR,-200(BUF);PTR TO RIB SETZM RBXXX(RIBPTR) ;INITIALISE OFFSET SKIPN FLAG JRST NOTEST PUSHJ P,INCONS ;SEE IF INCONSISTENCEY JRST SETST3 ;YES. IGNORE THIS LEVEL NOTEST: PUSHJ P,RDBLK ;READ A DATA BLOCK JRST SETST3 ;ERROR RETURN SO MISS THIS STEP OUT AOS T1,LNKSAV ;GET LINK ADD BACK AND GIVE SKIP RET. JRST @T1 ;& RETURN TO CALL OF SETSTP SETSP0: MOVE T1,LNKSAV JRST @T1 TEMP: OUTSTR [ASCIZ/ ?INPUT ERROR /] JRST QUIT ;TEST FOR LOOP ON DISC LOPTST: POP P,T1 ;LINK MOVEM T1,LNKSAV ;SAVE MOVEM P1,SAVE1 ;SAVE P1 & DONT CHANGE STACK MOVEM P2,SAVE2 ;& P2 MOVEM P3,SAVE3 ;& P3 MOVE T1,(P1) ;NAME MOVEM T1,NAME ;SAVE NAME HLRZ T2,1(P1) ;EXT MOVEM T2,EXT ;SAVE EXT MOVE T2,1(P1) ;EXT & CFP MOVEI T3,-406 ;PTR TO POSITION IN PREVIOUS LEVEL LPTST0: HRRZ P2,P ;CURRENT POS IN STACK ADD P2,T3 ;ADD OF PTR TO DATA MOVEM P2,SAVE ;SAVE P2 HRRZ P1,(P2) ;PTR IN P1 MOVE P2,(P1) ;NAME CAME P2,T1 ;SAME AS CURRENT NAME? JRST ENDTST ;NO MOVE P3,1(P1) ;EXT & CFP CAME P3,T2 ;SAME? JRST ENDTST ;NO MOVE P1,SAVE1 MOVE P2,SAVE2 MOVE P3,SAVE3 OUTSTR [ASCIZ/ ?FOUND A LOOP ON THE DISC BUT CONTINUING /] JRST SETST3 ;LOOP SO IGNORE THIS LEVEL ENDTST: MOVE P2,SAVE ;GET P2 BACK ADDI P2,4 ;TO NAME IN RIB MOVE P1,(P2) ;NAME HLRZ P3,1(P2) ;EXT CAIN P3,'UFD' ;UFD? CAME P1,MFDPPN ;IS IT MFD? JRST NOTSAM ;REACHED LOWEST LEVEL JRST NOTDUN ;STILL MORE LEVELS TO TEST NOTSAM: SUBI T3,405 ;NEXT LEVEL UP JRST LPTST0 ;TEST IT NOTDUN: MOVE P1,SAVE1 MOVE P2,SAVE2 MOVE P3,SAVE3 JRST @LNKSAV ;RETURN NO LOOP FOUND ;INCONSISTENCY TEST INCONS: MOVE T1,2(RIBPTR) ;NAME IN RIB CAMN T1,MFDPPN JRST EXTST ;DONT WANT TO FOR MFD CAME T1,NAME JRST INCON0 ;INCONSISTENCY ERROR EXTST: HLRZ T1,3(RIBPTR) ;EXT CAIN T1,'UFD' JRST RET ;MFD SO RETURN CAME T1,EXT JRST INCON0 ;INCONSISTENCY RET: AOS (P) ;SKIP RETURN IS GOOD POPJ P, INCON0: OUTSTR [ASCIZ/ ?INCONSISTENCY ERROR. CONTINUING /] POPJ P, ;ERROR RETURN ;ADVANCE STACK ADVSTK: HRRZ T1,@(P) ADD T1,P ADDI T1,100 ;EXTRA TLZ T1,-1 CORE T1, JRST NOCORE ;NO MORE CORE POPJ P, ;T1=CFP..CONVERT TO U=UNIT,BLK=BLOCK# CFPCNV: MOVEI U,1 ;INDEX=UNIT+1 CFPCN0: MOVE T3,ST%BEL(U) ;CLUSTS BELOW THIS UNIT CAMG T1,T3 ;FOUND UNIT? JRST GOTUNI ;FOUND UNIT ADDI U,1 ;NEXT UNIT CAMLE U,DRVCNT ;WITHIN BOUNDS? JRST BADUN ;NO JRST CFPCN0 ;TRY NEXT UNIT GOTUNI: SUBI U,1 ;U=UNIT MOVE T3,ST%BEL(U) ;CLUSTERS BELOW THIS UNIT SUB T1,T3 ;CLUST# ON UNIT CAMLE T1,ST%ON(U) ;WITHIN BOUNDS? JRST BADUN ;NO IMUL T1,BLKCLS ;BLK# ON UNIT MOVE BLK,T1 AOS (P) ;GIVE GOOD RETURN BADUN: POPJ P, ;SET TMPBUF TO ALL ONES SETTMP: SETOM TMPBUF MOVE T1,[XWD TMPBUF,TMPBUF+1] BLT T1,TMPBUF+177 POPJ P, SPACNG: PUSH P,T2 MOVE T2,LINCNT ;# OF NOS ON LINE SO FAR JUMPE T2,UPDCNT ;DONT WANT TAB 1ST TIME THRU CAIL T2,^D15 JRST EOL PUSH P,T2 ;SAVE COUNT PUSHJ P,STRING ASCIZ/ / ;O/P A TAB POP P,T2 UPDCNT: ADDI T2,1 ;INCREMENT COUNT MOVEM T2,LINCNT ;UPDATE COUNT POP P,T2 POPJ P, EOL: PUSHJ P,STRING ASCIZ/ / SETZ T2, ;RESET LINE COUNT TO 0 JRST UPDCNT ;UPDATE TO 1 AND RETURN ;INTERRUPT ROUTINE INTRTN: PUSH P,T1 ;SAVE T1 LDB T1,[POINT 1,INTRBK+3,34];GET REASON FOR INTERRUPT SKIPN T1 EXIT 1, ;NOT ^C SO EXIT, NOT CLEARING JOB OUTSTR [ASCIZ/ ?CANT ^C WHILE SATS ARE BEING WRITTEN /] MOVE T1,INTRBK+2 ;GET PC OF TRAP MOVEM T1,INTPC ;SAVE SETZM INTRBK+2 ;CLEAR TRAP PC SETZM INTRBK+3 ;CLEAR CLASS & WHY BITS POP P,T1 ;RESTORE T1 JRSTF INTPC ;RETURN ;ERROR MESSAGES HELP: OUTSTR [ASCIZ/ ?GOT EOF ON LPT /] JRST QUIT SYNTERR: OUTSTR [ASCIZ/ ?SYNTAX ERROR. TRY AGAIN /] JRST GETDRV TOMANY: OUTSTR [ASCIZ/ ?CANT HAVE MORE THAN 8 DRIVES IN ONE STRUCTURE /] JRST GETDRV STRBER: OUTSTR [ASCIZ/ ?ERROR READING SAT.SYS RIB /] JRST QUIT CMPLAN: OUTSTR [ASCIZ/ ?BAD FORMAT UNIT CHANGE POINTER IN RIB OF SAT.SYS -REBUILD 'STR' !!!! /] JRST QUIT SATERR: OUTSTR [ASCIZ/ ?INPUT ERROR READING SAT.SYS /] LPTERR: OUTSTR [ASCIZ/ ?CANT INIT LPT /] JRST QUIT LPTOER: OUTSTR [ASCIZ/ ?ERROR ON OUTPUT TO LPT /] JRST QUIT OUTERR: OUTSTR [ASCIZ/ ?ERROR RE-WRITING SATS ONTO DSK - THE 'STR' SHOULD BE REBUILT!!! /] JRST QUIT NOCORE: OUTSTR [ASCIZ/ ?NO MORE CORE /] JRST QUIT NOTSAT: OUTSTR [ASCIZ/ ?HOME BLOCK POINTER TO SAT.SYS RIB WRONG - REBUILD 'STR' /] JRST QUIT AYAY: OUTSTR [ASCIZ/ ?NO DRIVES! /] JRST GETDRV WRNSTR: OUTSTR [ASCIZ/ ?DRIVE NOT IN GIVEN STR /] JRST GETSTR HOMERD: OUTSTR [ASCIZ/ ?INPUT ERROR READING 2ND. HOME BLOCK - REBUILD 'STR'!!! /] JRST QUIT HOMERR: OUTSTR [ASCIZ/ ?NOT A HOME BLOCK WHEN EXPECTED - CALL SYSTEMS GROUP /] JRST QUIT OHDEAR: OUTSTR [ASCIZ/ ?NOW HAVE A -VE FBN!! - CALL THE SYSTEMS GROUP & DO A DCORE /] JRST QUIT NOTP1: OUTSTR [ASCIZ/ CANNOT RUN UNLESS PROJECT 1 /] INPERR: OUTSTR [ASCIZ/ ?ERROR READING A SPECIFIED BLOCK OF A FILE /] JRST QUIT RIBERR: OUTSTR [ASCIZ/ ?RIB ERROR FOR RIB OF SAT.SYS OR MFD - REBUILD 'STR'!!! /] JRST QUIT ERROR: OUTSTR [ASCIZ/ ?EOF AND BLOCK FBN OF FILE NOT FOUND /] JRST QUIT INTERR: OUTSTR [ASCIZ/ ?CANT INIT DRIVE /] JRST QUIT ZERPPN: OUTSTR [ASCIZ/ ?MFDPPN IS ZERO /] JRST QUIT EXTERR: OUTSTR [ASCIZ/ ?ERROR READING EXTENDED RIB /] JRST QUIT NEGSIZ: OUTSTR [ASCIZ/ ?RIBSIZ IS -VE /] JRST QUIT ASTRST: BLOCK 1 BLKCLS: BLOCK 1 BPCLAD: BLOCK 1 BPCLCT: BLOCK 1 CDUMP: BLOCK 1 CHBASE: BLOCK 1 CLSBEF: BLOCK 1 DRVCNT: BLOCK 1 FLAG: BLOCK 1 FRECNT: BLOCK 1 HGHUNI: BLOCK 1 INTPC: BLOCK 1 LINCNT: BLOCK 1 LNKSAV: BLOCK 1 LSTCNT: BLOCK 1 LSTRST: BLOCK 1 MAXSIZ: BLOCK 1 MFDPPN: BLOCK 1 MULCNT: BLOCK 1 NAME: BLOCK 1 NAMLOC: BLOCK 1 EXT: BLOCK 1 SATCNT: BLOCK 1 SAVE: BLOCK 1 SAVE1: BLOCK 1 SAVE2: BLOCK 1 SAVE3: BLOCK 1 STAOUR: BLOCK 1 STRNAM: BLOCK 1 PDLBLK: BLOCK 200 PDLBK2: BLOCK 50 BUFHOM: BLOCK 200 ST%ADD: BLOCK 200 SATRIB: BLOCK 200 UN%CHN: BLOCK 10 UN%NAM: BLOCK 10 UN%WPS: BLOCK 10 ST%BEL: BLOCK 10 ST%ON: BLOCK 10 SATBAS: BLOCK 10 SATNUM: BLOCK 10 UN%CPS: BLOCK 10 TMPBUF: BLOCK 200 OUTBUF: BLOCK 3 LAB: 0 0 LABO: -200,,TMPBUF-1 0 MNTST: 0 0 0 0 INTRBK: 4,,INTRTN ;# OF ARGS & ADD OF INT ROUTINE 0,,2 ;BIT 34 FOR ^C 0 ;PC OF TRAP 0 ;CLASS,,WHY QUIT: SETZM .JBINT ;ENABLE ^C INTERRUPT AGAIN CALLI 12 END ST