*20 / MILDRED -- MULTIPLE INDEX LOOKUP, DELETION, REPLACEMENT, AND ENTRY (DISK) / DIRECT DESCENDENT OF: / FRED -- FILE REPLACEMENT, ENTRY, AND DELETION / 29 MAY, 1970 / / / BETA REGISTER DEFINITIONS / (3, 13, 14, AND 17 ARE UNUSED) / PARAM=1 FDV=2 XPNT=4 XPNT2=5 LP1=6 LP2=7 MARK=10 ENTSW=11 NFSW=12 RET3=15 RET2=16 / / ENTRY POINTS OF MS I/O HANDLERS / READ=7774 WRITE=7775 RWFLD=10 / / LOAD ADDRESS OF DIAL INDEX -- DO NOT MODIFY: RAMIFICATIONS ARE OVERWHELMING / INDEX=1000 / / PDP-8 MODE INSTRUCTIONS FOR USE AFTER IOB / LRMF=6244 LRIB=6234 LRIF=6224 / / / ENTRY POINTS FOR MAJOR ROUTINES OF FRED / / DJR JMP LKP000 DJR JMP NTR000 DJR JMP RPL000 DJR JMP DEL000 EJECT / / LOOKUP - FIND NAMED FILE IN DIAL INDEX / / ENTERED IN LINC MODE WITH ADDRESS OF A PARAMETER / LIST IN AC. / / 0/ UNIT NUMBER / / 1/ FILE NAME / / 2/ CONTD / / 3/ CONTD / / 4/ CONTD / / 5/ TYPE (S OR B)/ / 6/ STARTING BLOCK / 7/ NO OF BLOCKS / / LKP000, SET I RET3 / INDICATE EXTERNAL CALL 7777 LKP010, SET RET2 / SAVE RETURN JMP 0 / / GET CALLERS FIELDS AND PARAMETER LIST / BSE I / SET BIT 0, LATER BECOMES BIT 1 4000 ROL I 2 / IF-DF BIT TO LINK ROR 2 / RESTORE REST BCL I / CLEAR HALF-WORD BIT 4000 STC PARAM / HOLD THE REST STC ENTSW / CLEAR ENTRY SW IOB / DO RIB IOT LRIB STA I / HOLD IT SAVFLD, 0 ROR 3 / IF TO BITS 7-11 BCL I / DROP OTHERS 7740 BSE I / BUILD LIF INST LIF STC RESTIF / FOR RESTORING ADD SAVFLD / GET DF BITS IN 9-11, 0-1 ROL 2 / NOW IN 7-11 BCL I / CLEAR OTHERS 7740 BSE I / BUILD LDF INST LDF STC RESTDF / SAVE TO RESTORE LATER LZE / SKIP IF PARMS IN USER INST FLD ADD RESTDF LZE I / SKIP IF PARMS IN HIS DATA FIELD ADD RESTIF BSE I / MAKE AN LDF INST OF IT LDF STC SETUDF / HOLD FOR ADDRESSING PARAMS / / RELOCATE FOR THIS SEGMENT / LDA I / INIT AC 11=1 1 IOB LRIF / GET INSTRUCTION FIELD IN 6-10 ROL 1 / NOW IN 5-9, 10=1, 11=0 STA / HOLD FOR READING XPARM+1 ROR 2 / FOR BUILDING LDF BCL I / DROP EXTRANEOUS 7740 BSE I LDF / BECOMES INSTR FOR SETTING TO THIS SEGMENT STA / HOLD FOR LATER USE SETMDF BCL I / GET SEGMENT BITS 7774 ROR 2 / MOVE TO HIGH ORDER ADD PPOINT / COMBINE WITH PARAMETER ADDRESS STA PPNT1 STC PPNT2 /...FOR INPUT AND OUTPUT / / READ THE INDEX / JMP SETUDF / SET DATA FIELD FOR USERS PARAMS LDA PARAM / GET UNIT BCL I / ONLY 7760 STC XPARM JMP SETMDF / SET DATA FIELD TO US FOR RETURN FROM I/O PDP / PMODE FOR READING PMODE CIF RWFLD / I/O IS IN FIELD 1 JMS I PREAD PPNT1, XPARM / PARAMETER ADDRESS LINC LMODE JMP SETUDF / GET USERS PARAMETER LIST SET I XPNT INDEX LDA XPNT / GET FIRST WORD OF INDEX SAE I / SKIP IF VALID FOR INDEX 5757 / FIRST WORD OF INDEX SKP / NOT AN INDEX -- BUILD ONE JMP LKP020 / INDEX IS OK -- GO TO NAME SCAN / / THERE IS NO INDEX -- CREATE ONE / LDA I / GET FILLER WORD 5757 STA XPNT / STORE IN NEXT INDEX WORD XSK I XPNT / INCREMENT AND TEST FOR END JMP .-2 / ZAP ANOTHER XSK I PARAM / ADJUST PARAM STA XPNT / ZAP LAST WORD JMP ERRTN / RETURN NO FIND / / ADDR OF READ ROUTINE IN FIELD 1 / PREAD, READ EJECT / / SCAN INDEX FOR NAME / LKP020, LDA I PARAM / GET FIRST WORD OF NAME STC WORD1 / SAVE AT COMPARE INST LKP030, LDA I / CONSTANT 7 7 ADM / ADD IT TO INDEX POINTER XPNT XSK XPNT / TEST FOR END OF INDEX SKP / SKIP NOT END JMP ERRTN / OTHERWISE RETURN NO SUCCESS LDA I XPNT / GET A WORD OF INDEX NAME SAE I / SKIP OUT OF LOOP IF FIRST WORDS EQUAL WORD1, 0 JMP LKP030 / LOOP IF NOT EQUAL SET XPNT2 / FIRST WORDS EQUAL XPNT / START FINAL COMPARE SET FDV / POINT TEMPORARY FDV INDEX PARAM SET I LP2 / SET LOOP COUNTER -3 LKP050, LDA I FDV / GET NEXT TWO CHARS SAE I XPNT2 / COMPARE TO THOSE IN INDEX ENTRY JMP LKP030 / UNEQUAL - RETURN TO SEARCH LOOP XSK I LP2 / LOOP TO COMPARE ENTIRE NAME JMP LKP050 / / IF WE GET HERE, WEVE FOUND THE NAME / LDA I FDV / PICK UP SOURCE/BINARY CODE SHD I / IS THE CODE S? 2300 JMP WNTS / YES - GIVE HIM SOURCE SHD I / IS THE CODE B? 0200 JMP WNTB / YES - GIVE HIM BINARY / / COME HERE ON DETECTING ERROR, OR UNSUCCESSFUL FIND / ERRTN, XSK RET3 / TEST FOR INTERNAL CALL JMP RET2 / RETURN NOW IF INTERNAL SET 0 / MOVE IN RETURN JMP RET2 RESTOR=. RESTDF, LDF / MODIFIED FOR... RESTIF, LIF /...USERS FIELDS JMP 0 / RETURN TO CALLER EJECT / / WEVE FOUND WHAT HE WANTS - GIVE IT HIM / WNTB, XSK I XPNT2 / CANT SKIP, BUT THIS ... XSK I XPNT2 /...FAKES OUT THE POINTER WNTS, XSK RET3 / IF INTERNAL CALL... XSK I RET2 /...SETUP FOR THREE RETURNS LDA I XPNT2 / GET STARTING BLOCK NO FROM INDEX STA I FDV / STORE IN CALLERS PARAMETER LIST LDA I XPNT2 / GET NO OF BLOCKS APO / SKIP IF DESIRED DATA EXISTS JMP ERRTN / RETURN ERROR IF NO FILE XSK RET3 / DONT STORE RESULT IF INTERNAL SKP STA I FDV / RETURN NO OF BLOCKS XSK I RET2 / INCREMENT JMP RETURN ADDRESS JMP ERRTN / NOT REALLY AN ERROR / / / SETUDF - SET DATA FIELD FOR USERS PARAMETER LIST / SETUDF, LDF / INSTRUCTION OVERLAID JMP 0 / RETURN / / / SETMDF - SET DATA FIELD FOR MILDRED / SETMDF, LDF / MODIFIED JMP 0 / / PPOINT, XPARM&777 / LOW-ORDER BITS OF XPARM ADDR / / PARAMETERS TO READ ROUTINE / XPARM, 0 / UNIT 0 / DATA ADDRESS SHIFTED RIGHT 8 BITS 346 / BLOCK NUMBER 2 / BLOCK COUNT EJECT / / REPLACE -- REPLACE A NAMED ENTRY IN DIAL INDEX / / ENTERED IN LINC MODE AFTER CALLING ENTER. / MAY BE CALLED ONLY IMMEDIATELY AFTER ENTER HAS RETURNED TO P+1, / INDICATING THAT A FILE OF THE PROPOSED NAME AND TYPE ALREADY EXISTS. / RPL000, SET RET3 / SAVE RETURN 0 XSK I ENTSW / TEST FOR NAME FOUND, SET "REPLACE" RPL010, HLT / ILLEGAL SEQUENCE -- STOP XSK ENTSW / TEST FOR CONTINUE AFTER HALT JMP RPL010 / BAD BOY -- STOP AGAIN JMP SETUDF / GET CORRECT DATA FIELD LDA I / ZAP LENGTH FIELD OF THIS FILE 5757 STA XPNT2 JMP FSP000 / ALL LOOKS GOOD -- DO YOUR THING / / ENTER -- ADD A NAMED ENTRY TO DIAL INDEX / / ENTERED IN LINC MODE WITH AC POINTING TO A PARAMETER LIST / IDENTICAL TO THAT FOR LOOKUP, EXCEPT THAT THE FILE-LENGTH / FIELD IS FILLED BY THE USER. / / RETURN IMMEDIATELY FOLLOWING THE JMP (P+1) IF THE FILE ALREADY EXISTS. / RETURN TO P+2 IF THERE IS NO ROOM FOR THE FILE. / RETURN TO P+3 IF OPERATION COMPLETE (DIAL INDEX HAS BEEN UPDATED). / NTR000, SET RET3 / SAVE RETURN 0 JMP LKP010 / LOOKUP NAME IN INDEX JMP NTR020 / THIS NAME IS NOT IN INDEX JMP NTR010 / NAME IS IN INDEX, BUT NOT WITH THIS TYPE / / WE FOUND A FILE OF THIS NAME AND TYPE / LDA I / GET CONSTANT -2 -2 ADD XPNT2 / POINT TO POINTER AREA - 2 STC MARK / SAVE POINTER FOR REPLACE SET I ENTSW / INDICATE READY-FOR-REPLACE 1776 JMP RTRN0 / GO HOME / / FOUND THE NAME, BUT NOT TYPE / NTR010, LDA I / CONSTANT -2 -2 ADD XPNT2 / FROM POINTER INDEX STC MARK / SAVE ADDR OF FILE POINTERS JMP NTR030 / GO BEGIN SCAN FOR FILE SPACE / / NOTHING FOUND IN THE LOOKUP SCAN / NTR020, SET I MARK / INDICATE NO FIND 7777 NTR030, XSK I RET3 / NO NAME CONFLICT, INCREMENT RETURN EJECT / / FSP - FIND SPACE ON DIAL TAPE FOR NEW FILE / FSP000, LDA I / PICK UP SKIP-NEG INSTRUCTION APO I / MOVED TO FCF050 STC FCF050 / STORE IN INDEX-SCAN ROUTINE LDA I 5 ADD PARAM / POINT TO USERS START BLOCK FIELD STA / HOLD FOR LATER LP1 STC LP2 / STORE POINTER LDA I LP2 / PICK UP LENGTH APO / TEST FOR POSITIVE LEN REQUEST JMP RTRN0 / ELSE RETURN ERROR AZE I / SKIP IF LEN NOT ZERO JMP RTRN0 / BOMB IF NULL REQUEST STA / HOLD LENGTH HANDY TRYLEN COM ADA I / SUBTRACT LEN FROM HIGHEST BLOCK NO, LOW FILE 270 FSP010, AZE I / SKIP NOT ZERO CLR / FORCE TRUE ZERO IF RESULT IS 7777 APO / SKIP IF STILL ON THE TAPE JMP FSP020 / NO SPACE IN LOW FILE AREA STC TRY / HOLD TRIAL STARTING BLOCK JMP FCF000 / GO FIND POSSIBLE CONFLICT JMP FSP030 / HOORAY -- NO CONFLICT LDA / NOPE -- THAT TRY IS NO GOOD TRYLEN COM / SUBTRACT THE SEARCH LENGTH FROM... ADA XPNT /... THE START BLOCK OF CONFLICT FILE... JMP FSP010 /...AND TRY AGAIN / / WEVE FOUND NO SPACE LARGE ENOUGH IN THE LOWER FILE AREA / FSP020, SET I NFSW / SET NO-FIND SWITCH 0 LDA I / PICK UP MINUS END OF TAPE -1000 ADD TRYLEN / MINUS LAST FEASIBLE START BLOCK STC UPLIM / HOLD AS SCAN LIMIT JMP FSP035 / ENTER UPPER SCAN / / TRY POINTS TO GOOD SPACE IN LOWER AREA / FSP030, SET I NFSW / INDICATE SPACE FOUND 7777 LDA / PICK UP OLD TRY TRY STA / SAVE IT SVTRY ADD TRYLEN / GET END BLOCK ADA I / GET COMPARE CONSTANT (TRYEND-2*INDEX LOC) -716 STC UPLIM / MINUS HIGHEST DESIRABLE STARTING BLOCK FSP035, LDA I / GET SKIP-POS INSTRUCTION APO / MOVED TO FCF050 STC FCF050 / STORE IN INDEX SCAN ROUTINE LDA I / INITIAL STARTING BLOCK, UPPER FILE 470 FSP040, STA / SET NEW TRY BLOCK TRY ADD UPLIM / COMPARE TO MAXIMUM USABLE BLOCK APO I / SKIP IF STILL IN USEFUL REGION JMP FSP050 / NO SPACE IN THIS AREA JMP FCF000 / SEARCH FOR CONFLICT JMP FSP060 / WEVE FOUND SPACE LDA XPNT / THIS TRY WONT WORK... ADA XPNT2 /...SO TRY AT END OF CONFLICT FILE JMP FSP040 / / THERE WAS NO SPACE FOUND IN UPPER FILE AREA / FSP050, XSK NFSW / SKIP IF FOUND IN LOWER AREA JMP RTRN0 / RETURN BAD NEWS -- NO SPACE LDA / GET START BLOCK OF FILE IN LOWER AREA SVTRY STC TRY / THATS THE ONE WELL USE / / THERE IS SPACE AT TRY / FSP060, XSK MARK / WAS THERE A FILE BY THIS NAME JMP FSP100 / YES - GO USE THAT ENTRY / / WE MUST SEARCH FOR EMPTY INDEX SPACE / SET I MARK / INITIALIZE MARK POINTER INDEX FSP070, LDA I / BUMP INDEX INDEX 7 ADM MARK XSK MARK / TEST FOR END OF INDEX SKP / NOT END JMP RTRN0 / NO SPACE IN INDEX -- RETURN ZERO LDA I MARK / FIRST WORD OF INDEX NAME SAE I / CHECK FOR EMPTY ENTRY 5757 JMP FSP070 / NOT EMPTY, TRY NEXT / / MARK POINTS TO AN UNUSED INDEX ENTRY / PUT THE NAME INTO IT / LDA PARAM / FIRST WORD OF USER NAME STA MARK / PLUNK INTO INDEX LDA I PARAM / 2ND STA I MARK LDA I PARAM / 3RD STA I MARK LDA I PARAM / 4TH STA I MARK LDA I PARAM / TYPE CONTROL (S OR B) SHD I / IS TYPE S 2300 JMP FSP080 / YES SHD I / IS TYPE B 0200 JMP FSP090 / YES JMP RTRN0 / NO-- BOMB NOW EJECT / / HE WANTS A SOURCE FILE -- SCRATCH THE BINARY POINTERS / FSP080, SET LP2 / TEMP POINTER MARK XSK I LP2 / CANT SKIP XSK I LP2 / DITTO LDA I / GET 57S... 5757 STA I LP2 / STORE THEM... STA I LP2 /... IN BINARY POINTERS JMP FSP100 / / HE WANTS BINARY FILE / FSP090, LDA I 5757 STA I MARK / STORE 57S... STA I MARK /...IN SOURCE POINTERS / / MARK NOW POINTS TO POINTER AREA OF DESIRED TYPE IN A NAMED INDEX ENTRY / FSP100, LDA / PICK UP STARTING BLOCK TRY STA I MARK / STORE IN INDEX STA LP1 / STORE IN USERS LIST LDA I LP1 / GET LENGTH STA I MARK / STORE IN INDEX / / NOW EVERYBODY IS HAPPY EXCEPT THE TAPE, WHICH HASNT BEEN UPDATED / XSK I RET3 / BUMP RETURN ADDR FSP110, JMP SETMDF / SET DATA FIELD TO MILDRED PDP PMODE / PMODE FOR I/O CIF RWFLD / ROUTINES IN FIELD ONE JMS I PWRITE PPNT2, XPARM / RELOCATED FOR THIS SEGMENT LINC LMODE RTRN0, SET 0 / MOVE RETURN JMP TO 0 RET3 DJR JMP RESTOR / RETURN TO USER / / ADDR OF WRITE ROUTINE IN FIELD 1 / PWRITE, WRITE EJECT / / FIND POSSIBLE CONFLICT BETWEEN INDEX ENTRY AND TRIAL STARTING BLOCK / / CALLER MUST SET OR CLEAR I-BIT IN FCF050 TO SELECT DESIRED FILE AREA / FCF000, SET RET2 / SAVE RETURN 0 SET I XPNT / INITIALIZE POINTER TO INDEX IN CORE INDEX+6 FCF010, XSK I XPNT / SKIP ON END OF INDEX SKP JMP RET2 / END OF INDEX, RETURN NO CONFLICT XSK I XPNT / INCREMENT AGAIN, NO SKIP POSSIBLE LDA / PICK UP POINTER XPNT ROR I 3 / MOVE BIT 9 TO LINK LZE / SKIP IF NAME AREA OF ENTRY JMP FCF040 / JMP IF POINTER AREA LDA XPNT / GET FIRST WORD OF NAME SAE I / SKIP IF EMPTY ENTRY 5757 JMP FCF030 / WORD IS VALID NAME LDA I / GET CONSTANT 6 6 ADM / ADDRESS NEXT ENTRY - 2, THIS ONE IS EMPTY XPNT JMP FCF010 / TRY NEXT INDEX ENTRY FCF030, LDA I / INCREMENT BY 4 4 ADM /...TO ADDRESS POINTER XPNT / / XPNT NOW ADDRESSES A STARTING BLOCK NO / FCF040, LDA XPNT / PICK UP STARTING BLOCK ADA I / SUBTRACT INDEX LOCATION -347 FCF050, APO / REVERSE SENSE BIT MAY BE SET BY CALLER JMP FCF010 / TRY AGAIN IF WRONG FILE AREA SET XPNT2 / TEMP POINT TO LENGTH WORD XPNT LDA I XPNT2 / PICK UP LENGTH APO / SKIP IF LENGTH POS JMP FCF010 / NEG LEN -- NO FILE HERE EJECT / / WE NOW HAVE A VALID INDEX ENTRY / COMPARE IT TO TRY / LDA XPNT / STARTING BLOCK OF THIS FILE BCL I / CLEAR GARBAGE IN HIGH THREE BITS 7000 COM ADD TRY / SUBTRACT XSTART FROM TRY APO / SKIP IF TRY ABOVE XSTART JMP FCF060 / JMP IF BELOW / / TRY IS ABOVE THE START OF THIS FILE / COM / MAKE DIFFERENCE NEGATIVE ADA XPNT2 / SUBTRACT DIFFERENCE FROM FILE LENGTH APO / ZERO RESULT WILL BE NEG (7777) JMP FCF010 / NO CONFLICT, TRY NEXT ENTRY JMP FCF070 / CONFLICT FOUND -- RETURN / / THE TRY IS BELOW OR AT THE START OF THIS FILE / FCF060, ADD TRYLEN / SUBTRACT STARTING DIFF FROM LEN OF TRY APO / SKIP IF CONFLICT JMP FCF010 / NO CONFLICT - TRY NEXT ENTRY / / WE HAVE FOUND A CONFLICT -- RETURN IT TO CALLER / FCF070, XSK I RET2 / INCREMENT RETURN ADDRESS JMP RET2 / GO BACK / / WORK AREA / TRY, 0 TRYLEN, 0 SVTRY, 0 UPLIM, 0 EJECT / / DELETE -- REMOVE A FILE FROM THE DIAL INDEX / / SAME CALLING SEQUENCE AS LOOKUP, EXCEPT NO ALTERNATE RETURNS / DEL000, SET RET3 / SAVE RETURN 0 JMP LKP010 / LOOKUP NAME IN INDEX JMP RTRN0 / DIDNT FIND THE FILE JMP RTRN0 / DITTO LDA I / DECREMENT XPNT2 -1 ADM /...TO ADDRESS START BLOCK FIELD XPNT2 LDA I / EMPTY AREA INDICATOR 5757 STA XPNT2 / ZAP START BLOCK FIELD STA I XPNT2 / DITTO LEN LDA / GET POINTER XPNT2 BCO I / ADDRESS OTHER TYPE LEN FIELD 2 STC XPNT2 LDA XPNT2 / PICK LENGTH OF OTHER-TYPE FILE APO I / SKIP IF OTHER-TYPE EMPTY JMP FSP110 / GO RE-WRITE INDEX LDA I / BOTH TYPES EMPTY -- CLEAR NAME 5757 STA XPNT / ZAP FIRST WORD OF NAME STA I XPNT / 2ND STA I XPNT / 3RD STA I XPNT / 4TH / / WAS THAT THE LAST FILE ? / SET I XPNT / POINT TO INDEX INDEX-1 /...FOR SCAN DEL010, SAE I XPNT / IS THERE ANY ENTRY? JMP FSP110 / YES - REWRITE INDEX XSK XPNT / HAVE WE CHECKED ALL? JMP DEL010 / NO - LOOP / / INDEX IS EMPTY: FILL WITH ZERO / CLR SET I XPNT / RESET POINTER INDEX-1 STA I XPNT / CLEAR NEXT WORD XSK XPNT / DONE? JMP .-2 JMP FSP110 / RE-WRITE INDEX EJECT / / THIS WILL CAUSE AN ASSEMBLY ERROR IF ROUTINE BECOMES SO LARGE / THAT INDEX WILL OVERLAY CODE WHEN IT IS READ IN ASMIFM INDEX-. NAUGHTY BAD BOY - ROUTINE IS TOO BIG FOR ONE FIELD. / IN CASE OF MINOR SIZE PROBLEMS, REMOVE 5 LINES OF CODE AT FCF040. / REMOVE 3 LINES AT FSP000, AND THREE LINES AT FSP035. THIS SHOULD / REMOVE ALL REFERENCES TO FCF050. ALL OTHER TAGS MUST BE RETAINED. / / / / END OF MILDRED /