; -*-MIDAS-*- TITLE INQPAT ;INQPAT IS A PROGRAM FOR PATCHING THE INQUIR DATA BASE (LSR1). ;LOAD IT INTO A JOB AND START IT AT ONE OF THESE ENTRY POINTS WITH DDT: ; INIT SET UP ENVIRONMENT AND THEN LOCK. ; LOCK LOCK AND READ IN LSR1 DATA BASE. ; DEL GIVEN UNAME AS 2 WORDS OF ASCII IN A AND B, ; DELETES THE ENTRY FOR THAT UNAME. ; DELA GIVEN CORE-ADDRESS OF ENTRY IN D, DELETES IT. ; LOOK GIVEN UNAME AS 2 WORDS OF ASCII IN A AND B, RETURNS ADDRESS IN D. ; NOTE THAT THIS LOSES ON ENTRIES WHOSE NAMES CONTAIN CONTROL CHARACTERS! ; WRITE WRITES OUT AND UNLOCKS THE ALTERED DATA BASE. ;TO CANCEL CHANGES, JUST KILL THE JOB WITHOUT CALLING WRITE. ;AC DEFS F=0 P=1 A=2 B=3 C=4 D=5 E=6 I=10 J=11 K=12 L=13 ;USED ONLY IN LNMSRT R=14 ;IO CHANS DSKI==0 DSKO==1 LOCKC==5 ;HOLDS THE LOCKING FILE OPEN IN WRITEOVER MODE DEFINE RENAME FNAM11,FNAM12,FNAM21,FNAM22,ERRTYP .FDELE [SIXBIT / DSK/ IFSE FNAM11,, 0 ? FNAM12 IFSN FNAM11,, SIXBIT /FNAM11/ ? SIXBIT /FNAM12/ IFSE FNAM21,, 0 ? 0 IFSN FNAM21,, SIXBIT /FNAM21/ ? SIXBIT /FNAM22/ ] IFSE ERRTYP,CONTIN,JFCL IFSN ERRTYP,CONTIN,IFSN ERRTYP,, .LOSE TERMIN DEFINE SYSCAL NAME,ARGS .CALL [ SETZ ? SIXBIT /NAME/ ? ARGS ((SETZ))] TERMIN ;DECREMENT 7-BIT BYTE POINTER IN AC. DEFINE DBP7 AC ADD AC,[70000,,] SKIPGE AC SUB AC,[430000,,1] TERMIN ;The LSR1 file contains a fixed header, as follows, at the front. ;The header contains the addesses in the file of the other tables. HDRSID==0 ; wd 0 SIXBIT /LSR1!!/ HDRDAT==1 ; wd 1 Date of compilation as sixbit YYMMDD HDRTIM==2 ; wd 2 Time of compilation as sixbit HHMMSS HDRUNM==3 ; wd 3 Address in file of UNAME table. HDRLNM==4 ; wd 4 Address in file LASTNAME table. HDRDTA==5 ; wd 5 Address in file of start of data area. ; The data area must start on a page boundary, ; and it must be the last thing in the file. HDRLEN==6 ;This is the number of words in the header ;UNAME table: ; wd 0 Number of entries in this table, ;followed by entries, one per page of data area, ;each containing the UNAME of the first data area entry which begins on that page. ;Sign bit is complemented to speed up searching. ;LASTNAME table: ; wd 0 Number of entries in this table, ; followed by entries, in order by last name ; Each entry looks like this: ; rh addr in file of entry ; lh addr in file of Last-name string ;The lastname strings are word-aligned upper-case ASCIZ strings, ; and they follow the LASTNAME table. ;The data area: ; It starts on a page boundary. It is made up of consecutive entries, ; in order by UNAME, each looking like this: LDACNT==0 ; entry wd 0 lh ; the number of words in the entry, ; including this one. ; entry wd 0 rh -1 ; followed by unaligned ASCIZ strings, one per item, separated ; only by the single ^@ that ends the ASCIZ. The strings are associated ; with their meanings according to their numerical position in the entry. ; The entire entry is then padded to a word boundary with nulls. ; Note that the low bit is set in the count-words of entries ; and not in any other words of the data area. ; The entries are sorted in ascii order, which is NOT the same ; as the order obtained by arithmetically sorting the SIXBIT unames. ; The end of the data area is marked by ,,-1, which ; is tantamount to an entry 0 words long. ; That word is also the last word of the file. ;;; Symbols for fields of an entry. ; I$ prefix is for the sake of bit-typeout mode I$==,-1 I$UNAM==0 ;UNAME I$NAME==1 ;FULL NAME I$NICK==2 ;NICKNAME I$SSN==3 ;SOC SEC #. I$MITA==4 ;MIT ADDRESS I$MITT==5 ;MIT TELEPHONE NUMBER I$HOMA==6 ;HOME ADDRESS I$HOMT==7 ;HOME TELEPHONE NUMBER I$SUPR==10 ;SUPERVISOR(S) I$PROJ==11 ;PROJECT I$DIR==12 ;FILE DIR NAMES I$AUTH==13 ;AUTHORIZATION I$GRP==14 ;GROUP AFFILIATION I$REL==15 ;RELATION TO GROUP I$BRTH==16 ;BIRTHDAY I$REM==17 ;REMARKS I$NETA==20 ;NETWORK ADDRESS I$ALTR==21 ;USER &TIME OF LAST ALTERATION I$MACH==22 ;I.T.S.'S TO BE KNOWN ON. ;INIT SETS UP PDL, ETC, AND READS IN DATA BASE. ;LOCK JUST READS IN DATA BASE. INIT: MOVE P,[-PDLLEN,,PDL] .SUSET [.SSNAM,,['INQUIR]] .SUSET [.ROPTIO,,A] TLO A,%OPOPC .SUSET [.SOPTIO,,A] MOVE A,[JSR TSINT] MOVEM A,42 .SUSET [.SMASK,,[%PIMPV]] ;LOCK THE DATA BASE SO WE CAN START TO HACK. LOCK: .OPEN LOCKC,[100007,,'DSK ? SIXBIT /LSR1/ ? SIXBIT/LOCK/] JRST LOCKLS ;NOW READ IN THE DATA BASE TO START UPDATING IT. .OPEN DSKI,[SIXBIT / "DSKLSR1 >/] .LOSE MOVE A,[-1-HDRDTA,,BUF] .IOT DSKI,A ;READ IN ADDRESS IN FILE OF DATA AREA. MOVE B,HDRDTA+BUF ;INSERT PAGES STARTING FROM THERE. TRNE B,1777 .LOSE .CALL [ SETZ ? 'FILLEN ? 1000,,DSKI ? SETZM A] .LOSE SUB A,B LSH B,-10. ;GET # OF 1ST PAGE TO MAP. PUSH P,A ADDI A,1777 LSH A,-10. ;GET # OF PAGES FILE TAKES UP. CAIL A,NPAGES .LOSE ;TOO MANY PAGES. WE HAVEN'T ALLOCATED ROOM. MOVNS A HRLZS A HRRI A,DATADR/2000 ;A GETS AOBJN PTR TO SET OF PAGES TO MAP FILE INTO. SYSCAL CORBLK,[1000,,%CBNDW+%CBCPY ? 1000,,%JSELF ? A ? 1000,,DSKI ? B] .LOSE %LSSYS POP P,LENGTH ;REMEMBER LENGTH IN WORDS OF STUFF JUST MAPPED. .VALUE [ASCIZ /:LSR1 loaded and locked. /] LOCKLS: .STATUS LOCKC,A ;HERE IF FAIL TO OPEN LSR LOCK. LDB A,[220600,,A] CAIN A,%ENAFL ;IF BECAUSE SOMEONE ELSE HAS IT LOCKED, WAIT. JRST [ .VALUE [ASCIZ / :An INQUPD is running; wait.  P/] MOVEI A,300. .SLEEP A, JRST LOCK] CAIE A,%ENSFL ;IF LSR1 LOCK DOESN'T EXIST, .LOSE .CALL [ SETZ ? 'RENAME ;MAYBE IT GOT RENAMED LSR1 LOCK ! BECAUSE SYS CRASHED WHILE ;IT WAS OPEN. TRY UN-RENAMING IT. ['DSK,,] ? [SIXBIT/LSR1/] ? [SIXBIT /LOCK !/] ? ['INQUIR] [SIXBIT/LSR1/] ? SETZ [SIXBIT /LOCK/]] CAIA JRST LOCK ;LSR1 LOCK REESTABLISHED => TRY LOCKING IT. .STATUS A LDB A,[220600,,A] CAIE A,%ENSFL ;IF THE RENAME FAILED BECAUSE OF "FILE NOT FOUND", .LOSE .OPEN LOCKC,[ SIXBIT / DSKLSR1 LOCK/] .LOSE .CLOSE LOCKC, JRST LOCK ;THEN IT MIGHT BE BECAUSE SOME OTHER INQUPD RENAMED IT FIRST. ;DELETE ENTRY SPECIFIED BY UNAME AS ASCII IN A AND B. DEL: PUSHJ P,FIND ;SO FIND THAT ENTRY. .VALUE [ASCIZ /:No such entry /] ;DELETE ENTRY SPECIFIED BY CORE-ADDRESS IN D. DELA: HRRO C,(D) CAME C,[-1] .VALUE [ASCIZ /:Bad entry address /] PUSH P,A PUSH P,B PUSH P,D HLRZ A,(D) ;A GETS LENGTH OF ENTRY IN WORDS. MOVN B,A ADDB B,LENGTH ;FILE IS SHRINKING BY THAT MUCH. ADD A,D HRL D,A HRRZ A,D CAIE A,DATADR-1(B) ;DON'T DO THE BLT IF 0 WORDS ARE TO BE MOVED. BLT D,DATADR-1(B) ;MOVE FOLLOWING STUFF DOWN. POP P,D POP P,B POP P,A .VALUE [ASCIZ /:Entry deleted. /] ;FIND CORE-ADDRESS IN D OF ENTRY SPECIFIED BY UNAME AS ASCII IN A AND B. LOOK: PUSHJ P,FIND .VALUE [ASCIZ /:No such entry /] .VALUE [ASCIZ /:Address is: D[ /] ;] ;FIND THE ENTRY FOR THE UNAME IN ASCIZ IN A AND B. ;THE ADDRESS OF THE ENTRY IS RETURNED IN D, SKIPPING. ;IF THERE IS NO ENTRY, WE RETURN NON SKIPPING WITH D POINTING ;AT THE ENTRY TO INSERT BEFORE. FIND: PUSH P,A PUSH P,B MOVEI E,A-1 ;Convert UNAME to search for to SIXBIT in D. PUSHJ P,FIND76 MOVE B,D ;and keep it in B. HRRZI E,DATADR ;E gets address of 1st user's entry. ;Now linearly search for the start of an entry, and compare Unames. ;This code assumes the Uname is the first item in an entry. FIND1: HLRZ C,(E) ;Get word count of next user. JUMPE C,FINDL ;0 => EOF => user not found PUSHJ P,FIND76 CAMLE B,D JRST FIND2 ;not found yet, scan more CAME B,D JRST FINDL ;got past where it should be => doesn't exist AOS -2(P) ;Found it => take success return FINDL: HRRZI D,(E) ;Address of entry or address to insert it at, in D. POP P,B POP P,A POPJ P, FIND2: ADD E,C ;This entry before desired one => advance to next entry. JRST FIND1 ;Convert aligned ASCIZ string that E points TO THE WORD BEFORE to SIXBIT in D. ;Actually, we complement the sign bit of the returned sixbit word ;so that they compare in the same order as ascii strings. ;This routine must not use A or B since the arg string can be there. FIND76: PUSH P,I ;Extract uname and convert to sixbit PUSH P,C PUSH P,E MOVEI D,0 ;Accumulate sixbit in D HRLI E,010700 ;using byte pointer in E to load MOVE I,[440600,,D] ;and byte pointer in B to store FIND77: ILDB C,E JUMPE C,FIND78 CAIGE C,140 SUBI C,40 TLNE I,770000 IDPB C,I JRST FIND77 FIND78: POP P,E POP P,C POP P,I TLC D,(SETZ) POPJ P, ;HERE TO WRITE OUT THE MODIFIED DATA BASE. ;FIRST CLEAN THE DATA BASE UP, IN CASE PREVIOUS INQUIR CRASHED WHILE UPDATING IT. ;THE RENAMES IT WAS SUPPOSED TO DO WERE: ;NUL: _ LSR1 OLDOLD _ LSR1 OLD _ LSR1 1 _ LSR1 2 FROM LEFT TO RIGHT. ;DO WHATEVER RENAMES WEREN'T DONE ALREADY. WRITE: .OPEN DSKI,[SIXBIT/ DSKLSR1 2/] JRST LOCK1 .OPEN DSKI,[SIXBIT/ DSKLSR1 1/] JRST LOCK2 .OPEN DSKI,[SIXBIT/ DSKLSR1 OLD/] JRST LOCK3 RENAME LSR1,OLDOLD,,,CONTIN RENAME LSR1,OLD,LSR1,OLDOLD,CONTIN LOCK3: RENAME LSR1,1,LSR1,OLD,CONTIN LOCK2: RENAME LSR1,2,LSR1,1,CONTIN LOCK1: .CLOSE DSKI, RENAME LSR1,NEW,,,CONTIN ;NOW WRITE THE UPDATED LSR1 FILE OUT AS LSR1 NEW. PUSHJ P,LSRIDX ;FIRST CREATE TABLES, PUSHJ P,LSRWRT ;THEN WRITE TABLES FOLLOWED BY DATA. ;NOW RENAME LSR1 NEW -> LSR1 2, THUS PROVISIONALLY INSTALLING IT. RENAME LSR1,NEW,LSR1,2,DELREN ;INSTAL NEW VERSION, THEN MOVE ALL OLD VERSIONS ;NOW RENAME NUL: <- LSR1 OLDOLD <- LSR1 OLD <- LSR1 1 <- LSR1 2 RENAME LSR1,OLDOLD,,,CONTIN ;DOWN ONE SLOT. RENAME LSR1,OLD,LSR1,OLDOLD,CONTIN RENAME LSR1,1,LSR1,OLD,DELREN RENAME LSR1,2,LSR1,1,DELREN .CLOSE LOCKC, .VALUE [ASCIZ /:LSR1 written and unlocked.KILL /] ;KILL THE JOB, SINCE CONTINUED USAGE WILL LOSE DUE TO UN-REINITIALIZED VARIABLES. ;WRITE THE UPDATED LSR1 FILE OUT AS LSR1 NEW. LSRWRT: .OPEN DSKO,[SIXBIT / #DSKLSR1 NEW/] .LOSE MOVN A,LNMREL ;SIZE OF HDR AND UNM TABLES HRLZS A HRRI A,HDR .IOT DSKO,A SETCM A,NLNMS ;- WRITE OUT LNM TABLE HRLZS A HRRI A,NLNMS .IOT DSKO,A MOVE A,LNMPTR ;WRITE OUT LNM STRINGS SUBI A,LNMSTR MOVNS A HRLZS A HRRI A,LNMSTR .IOT DSKO,A MOVN A,DTAPAD ;PAD TO PAGE BOUND HRLZS A HRRI A,ZERO .IOT DSKO,A .CALL [ SETZ ;CHECK 'RFPNTR MOVEI DSKO SETZM A ] .LOSE %LSFIL TRNE A,1777 .LOSE CAME A,DTAREL .LOSE MOVE A,LENGTH ;OUTPUT C(LENGTH) WORDS STARTING AT DATADR MOVEI C,DATADR LSRWR1: JUMPE A,LSRWR2 MOVE B,A CAIL B,40000 ;BUT DON'T TRY TO IOT TOO MANY WORDS AT ONCE MOVEI B,40000 ;BECAUSE THE HIGH BITS OF THE COUNT MOVNS B ;CAN BE MISINTERPRETED. ADD A,B HRL C,B .IOT DSKO,C JRST LSRWR1 LSRWR2: .CLOSE DSKO, POPJ P, ;FIRST STEP IS TO MAKE THE UNAME INDEX AND VERIFY THAT EVERYTHING HAS BEEN SORTED. ;ALSO, WE COLLECT THE LAST NAMES AND SET UP AN UNSORTED LAST NAME TABLE. LSRIDX: MOVEI I,DATADR ;-> ENTRY SETZM DTALST SETZM NUNMS SETOM MPVOK MOVSI A,400000 MOVEM A,LASUNM MOVEI A,LNMSTR MOVEM A,LNMPTR LSRID0: HLRZ A,(I) ;SEE IF EOF JUMPE A,LSRID3 ;YUP. MOVEI R,-DATADR(I) ;SAVE RELATIVE ADDRESS MOVE J,I EXCH J,DTALST ;GET ADDRESS OF ENTRY BEFORE THIS ONE XOR J,I ;MAKE J ZERO IF THIS IS ON SAME PAGE ANDI J,-2000 HRLI I,010700 ;SET UP TO EXTRACT UNAME MOVEI E,0 MOVE D,[440600,,E] GUNM1: ILDB A,I JUMPE A,GUNM2 CAIGE A,140 SUBI A,40 TLNE D,770000 IDPB A,D JRST GUNM1 GUNM2: MOVE A,LASUNM TLC E,(SETZ) ;CHANGE SIGN BIT SO IT SORTS CORRECTLY CAMGE E,A .VALUE ;OUT OF ORDER MOVEM E,LASUNM JUMPE J,GLNM ;JUMP IF SAME PAGE AOS A,NUNMS ;OTHERWISE, STORE ANOTHER INDEX ENTRY MOVEM E,UNMIDX-1(A) GLNM: MOVE D,LNMPTR ;SET UP TO STORE LAST NAME HRLI D,440700 GLNM1: ILDB A,I CAIE A,", CAIG A,40 JRST GLNM2 ;LAST NAME ENDS WITH COMMA, SPACE, NULL, OR CONTROL CAIL A,"a CAILE A,"z CAIA SUBI A,40 ;UPPER CASE IFY IDPB A,D JRST GLNM1 GLNM2: MOVEI A,0 ;END ASCIZ STRING IDPB A,D TLNE D,760000 ;PAD OUT TO WORD BOUNDARY JRST GLNM2 SKIPN @LNMPTR ;IGNORE NULL LAST NAMES JRST GLNM3 MOVEI D,1(D) ;NEW VALUE OF LNMPTR EXCH D,LNMPTR SUBI D,LNMSTR ;MAKE RELATIVE ADDRESS FOR LNM TABLE AOS A,NLNMS HRLM D,LNMIDX-1(A) HRRM R,LNMIDX-1(A) GLNM3: MOVEI I,DATADR(R) ;GET BACK BEGINNING OF ENTRY HLRZ A,(I) ;GET LENGTH ADD I,A ;ADVANCE TO NEXT ENTRY JRST LSRID0 ;LOOP ;ALL DONE. NOW WHAT WE HAVE TO DO IS SET UP HDR, ; SORT THE LNM TABLE, AND DE-RELATIVIZE THE VARIOUS POINTERS. LSRID3: SETZM MPVOK ;MPV NOW IS AN ERROR. MOVE A,[SIXBIT/LSR1!!/] ;PUT FILE TYPE IDENTIFICATION, DATE AND TIME IN HEADER. MOVEM A,HDR+HDRSID .RDATE A, MOVEM A,HDR+HDRDAT .RTIME A, MOVEM A,HDR+HDRTIM MOVEI A,HDRLEN MOVEM A,HDR+HDRUNM MOVE A,NUNMS ;COMPUTE RELOCATION OF LNM INDEX ADDI A,HDRLEN+1 ;HDR + SIZE MOVEM A,LNMREL MOVEM A,HDR+HDRLNM ADD A,NLNMS ;COMPUTE RELOCATION OF LNM STRINGS ADDI A,1 ;FOR SIZE MOVEM A,STRREL ADD A,LNMPTR ;COMPUTE RELOCATION OF DATA AREA SUBI A,LNMSTR MOVE B,A ADDI A,1777 ;MUST BE ON PAGE BOUNDARY ANDI A,-2000 MOVEM A,DTAREL MOVEM A,HDR+HDRDTA SUB A,B MOVEM A,DTAPAD ;AMOUNT OF SPACE TO PAD TO PAGE BOUNDARY PUSHJ P,LNMSRT ;RELOCATE THE ENTRY PTRS AND STRING PTRS IN LNM TABLE MOVN B,NLNMS HRLZS B REL1: HRRZ A,LNMIDX(B) ADD A,DTAREL HRRM A,LNMIDX(B) HLRZ A,LNMIDX(B) ADD A,STRREL HRLM A,LNMIDX(B) AOBJN B,REL1 POPJ P, ;SUBROUTINE TO SORT THE LNM TABLE ;FOR DOCUMENTATION SEE THE LISP-MACHINE QUICKSORT ROUTINE ;LH OF EACH ENTRY IS A RELATIVE ADDRESS INTO LNMSTR. ;USES STRCMP. LNMSRT: MOVEI L,0 MOVE R,NLNMS SUBI R,1 ;INDICES ARE INCLUSIVE ;RECURSES TO HERE LNMSR0: CAMG R,L ;SKIP IF MORE THAN ONE LONG POPJ P, ;ALREADY SORTED OR L>R (WHICH CAN HAPPEN!) MOVE D,R ;RANDOMLY CHOOSE A POINT HALFWAY BETWEEN SUB D,L LSH D,-1 ADD D,L ;DO MOVE K,LNMIDX(D) ;K IS OLD D'TH (NEW E'TH) ELEMENT MOVE A,LNMIDX(L) ;STORE L'TH INTO D'TH MOVEM A,LNMIDX(D) MOVE I,L MOVE J,R LNMSR1: ;DECREASE J UNTIL K NOT LT A[J] CAME J,I JRST LNMSR2 MOVEM K,LNMIDX(I) MOVE E,I JRST LNMSRX LNMSR2: HLRZ B,K HLRZ C,LNMIDX(J) PUSHJ P,STRCMP JRST LNMSR3 SOJA J,LNMSR1 ;KC ;Does assume that both strings are nulled out to word boundaries. STRCMP: ADDI B,LNMSTR ADDI C,LNMSTR PUSH P,D PUSH P,E STRCM1: MOVE D,(B) LSH D,-1 MOVE E,(C) LSH E,-1 CAMLE D,E JRST STRCM3 ;B>C CAME D,E JRST STRCM2 ;B CREATE THE MEMORY. .VALUE TSINTA: 0 ;HOLDS AC A DURING TSINT. INTJPC: 0 ;JPC SAVED WHEN INTERRUPT HAPPENS. ;ON MPV CREATE THE STORAGE MPVINT: .SUSET [.RMPVA,,A] CAIL A,MPVOKB ;LEGAL MPV'S MUST BE IN A CERTAIN TANGE OF ADDRESSES. CAIL A,MPVOKE .LOSE SKIPN MPVOK ;AND ARE ONLY LEGAL AT CERTAIN TIMES. .LOSE LSH A,-10. .CALL [ SETZ 'CORBLK MOVEI %CBNDR+%CBNDW MOVEI %JSELF MOVEI (A) SETZI %JSNEW ] .LOSE %LSSYS MOVE A,TSINTA .DISMISS TSINT+1 MPVOK: 0 ;NONZERO => MPV SHOULD CREATE CORE. POPJ2: AOS (P) POPJ1: AOS (P) CPOPJ: POPJ P, POPBAJ: POP P,B POPAJ: POP P,A POPJ P, PAT: PATCH: BLOCK 100 PATCHE: -1 DEBUG: 0 LENGTH: 0 ;LENGTH IN WORDS OF THE LSR1 DATA AREA (WHICH IS ALL WE READ IN). BUF: BLOCK HDRLEN ;VARIABLES USED IN CREATING THE TABLES FORTHE NEW LSR1 FILE. ;NOTE THAT SINCE ONE INVOCATION OF INQUPD CAN DO THIS SEVERAL TIMES (SEE "DONE"), ;THESE MUST ALL BE INITIALIZD BY LSRIDX. LNMPTR: LNMSTR ;NEXT FREE LOCATION IN LAST NAME STRINGS DTALST: 0 ;ADDRESS OF LAST DATA ENTRY SCANNED. DTAREL: 0 ;RELOCATION OF DATA AREA STRREL: 0 ;RELOCATION OF LNM STRINGS LNMREL: 0 ;RELOCATION OF LNM INDEX DTAPAD: 0 ;NUMBER OF WORDS TO PAD TO PAGE BOUNDARY ;HDR THROUGH THE FILLED PART OF UNMIDX ARE ALL WRITTEN INTO THE NEW ;LSR1 FILE WITH ONE IOT. HDR: BLOCK HDRLEN ;FIXED HEADER AREA FOR NEW LSR1 FILE. NUNMS: 0 ;NUMBER OF ENTRIES IN UNAMES TABLE UNMIDX: BLOCK 400 ;UNAMES TABLE LASUNM: SETZ ;LAST UNAME SEEN, TO CHECK SORTING PDLUND: .LOSE VARIABILITY CONSTANTINOPLE IFNDEF PDLLEN,PDLLEN==200 PDL: PDLUND BLOCK PDLLEN+10 ZERO: BLOCK 2000 ;BLOCK OF ZEROS, FOR WRITING PADDING OUT TO NEW LSR FILE. -1 ;MAKE SURE THAT CORE EXISTS. DATADR==<.+1777>&-2000 ;PLACE TO READ LSR1 FILE INTO. IFNDEF NPAGES,NPAGES==300 ;ALLOW 196K FOR LSR1 FILE DATA AREA. IFG DATADR+NPAGES*2000+56000.-<1,,0>,.ERR NPAGES TOO LARGE. .=DATADR+NPAGES*2000 MPVOKB:: ;THE TABLES OF THE NEW LSR1 FILE ARE CREATED HERE. ;CORE IN THIS REGION IS CREATED BY MPV INTS DURING LSRIDX. NLNMS: BLOCK 1 ;NUMBER OF ENTRIES IN LAST NAMES TABLE LNMIDX: BLOCK 5000. ;LAST NAMES TABLE LNMSTR: BLOCK 50000. ;LAST NAME STRINGS. MPVOKE: ;mpv's aren't allowed past this address. END INIT