1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-28 04:57:43 +00:00

- Added support for METER

- Also fixed build script after initializing COMSAT (KLH10 only) to kill
  COMSAT job.
This commit is contained in:
Eric Swenson
2016-12-03 16:18:31 -08:00
committed by Lars Brinkhoff
parent a305421ff8
commit 9ed7bf3035
6 changed files with 896 additions and 0 deletions

709
src/syseng/meter.18 Normal file
View File

@@ -0,0 +1,709 @@
; -*-MIDAS-*-
TITLE METER - ITS SYSTEM METERING - DAM OCT. 19, 1974
.INSRT SYSENG;CALRET >
TTYIF==1 ;CHAR TYPED INTERRUPT
BSCLK==10000 ;SLOW-CLOCK INTERRUPT (1/2 SEC)
OPTINT==4000 ;NEW STYLE INTERRUPTS
;;; DEFINE MACROS SO THAT SYSTEM VARIABLES ACCESSED
;;; THROUGH ABS PAGES CAN BE REFERENCED IN A NATURAL WAY
DEFINE CONC A,B
A!B!TERMIN
DEFINE ABSREF SYMS
DEFINE ABSTAB
IRPW SYM,,[SYMS]
IFSE [SYM]----, IMMEDS: ;FROM HERE DOWN ARE NOT ADDRESSES
.ELSE [ SQUOZE 0,SYM
CONC ABSRF",\.IRPCNT,ABS
CONC [EXPUNGE ABSRF"]\.IRPCNT,ABS
]
TERMIN
TERMIN
IRPW SYM,,[SYMS]
IFSN [SYM]----, ABSRF. SYM,\.IRPCNT
TERMIN
TERMIN
DEFINE ABSRF. SYM,CT
ABSRF"!CT!ABS==0
IF1,[DEFINE SYM ?MOD
(MOD)[.,,ABSRF"!CT!ABS]TERMIN
]
IF2,[DEFINE SYM ?MOD
(MOD)<ZZZ==ABSRF"!CT!ABS ? ABSRF"!CT!ABS==[.,,ZZZ] ? ZZZ>TERMIN
]
TERMIN
.BEGIN ABSRF ;PLACE TO KEEP NNNABS SYMBOLS
.END
DEFINE INFORM A,B,C,D,E
PRINTX/A B C D E
/
TERMIN
;;; FORMAT OF DISPLAY
FORMAT: ASCIZ\###% User Time,###% Idle,###% Overhead,###% Lost
### Processes,###% active last 15 seconds
###% Processes running,###% Exec run,###% Blocked,###% Stopped
ATB disk i/o ##.###: read ##.###, write ##.###, PgIn ##.###, PgOut ##.###
TTY #### ch/s in, #### ch/s out (estimated)
ATB Sched ##.###, ATB PCLSR ##.###, ATB swap out ##.###
ATB page faults ##.###:###% in,###% coming,###% out,###% going
\
ABSREF [TIME ;TIME COUNTER, 30'THS OF A SECOND
NULTM1 ;USECS USED BY NULL JOB
NULTM3 ;SECONDS PART OF THAT
USRTM1 ;USECS USED BY USERS OVER 4
USRTIM ;SECONDS PART OF THAT
LOSTM1 ;4USECS LOST
LOSTIM ;SECONDS OF LOST TIME (ALL OTHERWISE RUNNABLE JOBS WAITING FOR PAGES)
NWXFR ;NUMBER OF NON-SWAP DISK WRITES
NRXFR ;NUMBER OF NON-SWAP DISK READS
NSWXFR ;NUMBER OF SWAP DISK WRITES
NSRXFR ;NUMBER OF SWAP DISK READS
NSKED ;NUMBER OF TIMES INTO SCHEDULER
NPCLSR ;NUMBER OF ATTEMPTS TO PCLSR
NSOUSR ;NUMBER OF ATTEMPTS TO SWAP OUT A USER
NSOPGS ;NUMBER OF SEARCHES FOR A PAGE TO SW OUT
NPGFLT ;NUMBER OF PAGE FAULTS
NRPI ;.. PAGE ALREADY IN
NRPCI ;.. PAGE COMING IN
NRPO ;.. PAGE OUT
NRPGO ;.. PAGE GOING OUT
TIIP ;TYI BUF IN PTR
TOOP ;TYO BUF OUT PTR
TOIP
USRHI ;HIGHEST LOC OF USER VARS
UPC ;010000,, IS USER MODE BIT
USTP ;USER STOP WORD
FLSINS ;USER BLOCK WORD
UNAME ;0 MEANS IDLE SET OF VARS
LUBTM ;TIME USER LAST UNBLOCKED
----
TIBS ;TYI BYTES/BUFFER
TOBS ;TYO BYTES/BUFFER
LUBLK ;(CONST) LENGTH OF USER BLOCK
]
%TOOVR==1000 ;TTY OVERSTRIKE CAPABILITY
%TOERS==40000 ;TTY SELECTIVE ERASE CAPABILITY
%TOMVU==400 ;TTY RANDOM MOTION CAPABILITY
;;; DATA AREAS
OTIME: 0 ;TIME PREVIOUSLY WOKE UP
OUSRTM: 0 ;OLD VALUE OF USRTM1 (WELL,...
ONULTM: 0 ;OLD VALUE OF NULTM1 SEE THE CODE
OLOSTM: 0 ;OLD VALUE OF LOSTM1 ...)
ONWXFR: 0 ;.. NWXFR
ONRXFR: 0 ;.. NRXFR
ONSWXF: 0 ;.. NSWXFR
ONSRXF: 0 ;.. NSRXFR
OXFR: 0 ;.. NXFR (WELL, NOT REALLY)
OTOOP: BLOCK 100 ;OLD TOOP VALUES FOR TTYS
TOCT: 0 ;COUNT OF CHARS OUTPUT ON TTYS
OTOCT: 0 ;OLD VALUE OF TOCT
OTIIP: BLOCK 100 ;OLD TIIP VALUE FOR TTYS
TICT: 0 ;COUNT OF CHARS INPUT ON TTYS
OTICT: 0 ;OLD VALUE OF ..
ONSKED: 0 ;OLD VALUE OF NSKED
ONPCLSR:0 ;.. NPCLSR
ONSOUSR:0 ;.. NSOUSR
ONPGFLT:0 ;.. NPGFLT
ONRPI: 0 ;.. NRPI
ONRPCI: 0 ;.. NRPCI
ONRPO: 0 ;.. NRPO
ONRPGO: 0 ;.. NRPGO
TTYOPT: 0 ;TTYOPT WORD GETS PUT HERE
MEMHOL: ASCIZ\WARNING: THERE IS A HOLE IN LOW MEMORY
\
NO340: ASCIZ\CAN'T GET 340
\
BLETCH: ASCIZ\
WRONG SYSTEM VERSION - REPURIFY
\
TYIC==2 ;TTY INPUT CHANNEL
TYOC==1 ;TTY OUTPUT CHANNEL
TYO=<.IOT TYOC,> ;INSTRUCTION TO OUTPUT A CHAR
;;; ROUTINE TO OUTPUT A NUMBER IN FORMAT (CALL IN SAME ORDER
;;; AS THEY APPEAR IN STRING ABOVE)
PUTNUM: PROCEDURE N
REGISTER W,W1,TTOPT,CH,NOSUP
REGISTER NDIGS ;NUMBER OF DIGITS
REGISTER NZDIGS ;.. NON ZERO SUPPRESSED
MOVE TTOPT, TTYOPT
; SCAN DOWN TO NEXT FIELD
MOVEI W, 7 ;LEFT MARGIN CONST MINUS 1
NXTFLD: ILDB CH, FORMPT
JUMPE CH, [.VALUE] ;TOO MANY NUMBERS FOR FORMAT
CAIN CH, "#
JRST GOTFLD ;NUMBER SIGN BEGINS FIELD
TLNN TTOPT, %TOERS
TYO CH
CAIN CH, 15
MOVEM W, HPOS ;CARRIAGE RETURN
CAIN CH, 12
AOSA VPOS ;LINE FEED
AOS HPOS ;PRINTING CH - INCR HPOS
JRST NXTFLD
; GOT BEGINNING OF FIELD, NOW ANALYZE IT --> NDIGS, NZDIGS
GOTFLD: IF [TLNN TTOPT,%TOERS][
TYO [^P] ;SET POSITION
TYO ["V]
TYO VPOS
TYO [^P]
TYO ["H]
TYO HPOS
]
SETZB NDIGS, NZDIGS
GOTFL0: CAIN CH, ". ;PERIOD STOPS ZERO SUPPRESS
SOJA NDIGS, GOTFL1
CAIE CH, "# ;NUMBER INDICATES A DIGIT
JRST GOTFLX
SKIPE NZDIGS ;IF THIS NOT ZERO SUPPRESSED
GOTFL1: ADDI NZDIGS, 1 ; THEN COUNT NZSUP DIGS
AOS HPOS
MOVE W1, FORMPT
ILDB CH, FORMPT ;CHECK NEXT CHAR
AOJA NDIGS, GOTFL0
GOTFLX: MOVEM W1, FORMPT ;DON'T COUNT TERMINATING CHAR
SKIPN NZDIGS ;ENSURE AT LEAST 1 DIGIT
MOVEI NZDIGS, 1
SETZM NOSUP ;flag turned on after first nonzero digit
; NOW DO NUMBER CONVERSION (UNLESS SAME AS BEFORE)
MOVE W, N
AOS NUMPT
IF [TLNE TTOPT,%TOERS ;SUPPRESS IF NUMBER SAME & DISPLAY
CAME W, @NUMPT][
RETURN ;SAME AS BEFORE
]
MOVEM W, @NUMPT
NUMLP: IDIV W, TENPOW(NDIGS) ;GET A DIGIT IN W, REM IN W1
JUMPN NOSUP, .+5
JUMPN W, .+3 ;SEE IF SHOULD BLANK OUT
CAMLE NDIGS, NZDIGS ;..
SKIPA W, [-20] ;YES
SETOM NOSUP ;have digit don't blank zeroes any more
ADDI W, "0 ;MAKE ASCII CHAR
IF [ TLNE TTOPT, %TOERS
TLNN TTOPT, %TOOVR ][;IF NECESSARY, ERASE PREV CHAR
TYO [^P]
TYO ["K]
]
TYO W
IF [CAIE NDIGS,1 ;IF NECESSARY, SKIP OVER PERIOD
CAME NDIGS, NZDIGS][
IF [ TLNE TTOPT, %TOERS
TLNN TTOPT, %TOOVR ][
TYO [^P]
TYO ["F] ]
ELSE [ TYO [".] ]
]
MOVE W, W1 ;PICK UP REMAINDER
SOJG NDIGS, NUMLP ;DO ANOTHER DIGIT
PTNMXX: RETURN
HPOS: 0 ;HORIZONTAL POSITION
VPOS: 0 ;VERTICAL POSITION
FORMPT: 0 ;B.P. TO FORMAT STRING
NUMPT: 0 ;PTR TO NUMBUF
NUMBUF: REPEAT 30., -1 ;USED TO AVOID REDISPLAYING IF UNCHANGED
TENPOW: -1 ? 1 ? 10. ? 100. ? 1000. ? 10000. ? 100000.
1000000. ? 10000000. ? 100000000.
;;; ENTRY PUTNUM"RESET GETS SET FOR ANOTHER SET OF FIGURES
RESET: ENTRY
MOVE TT, [440700,,FORMAT] ;INIT VARS
MOVEM TT, FORMPT
MOVEI TT, 10 ;TOP OF PAGE LOGICALLY
MOVEM TT, HPOS
MOVEM TT, VPOS
IF [SKIPE TT, TTYOPT][
TYO [^L]] ;340
ELSE [ TYO [^P] ;AND PHYSICALLY
IF [TLNN TT, %TOERS][
TYO ["T]] ;OVER WRITE
ELSE [ TYO ["C] ] ;NEW THING ENTIRELY
]
MOVEI TT, NUMBUF-1 ;INIT NUMPT
MOVEM TT, NUMPT
RETURN
;;; PUTNUM"FINISH FINISHES IT OFF
FINISH: ENTRY
MOVE TT, TTYOPT
TLNE TT, %TOERS ;PRINTING TTY'S ONLY
RETURN
FINIS0: ILDB CH, FORMPT
JUMPE CH, .RETN.
TYO CH
JRST FINIS0
.END
;;; Routine to meter TTYs, called frequently
CHKTTY: PROCEDURE
REGISTER I ;TTY NUMBER
REGISTER A,B,FROB,C ;TEMPS
MOVEI I, TOOP ;COMPUTE # TTYS
SUBI I, TOIP ;..
NEXTTY: SOJLE I, LASTTY ;JUMP IF NO MORE TTYS
; COUNT CHARACTERS OUTPUT
MOVE A, TOOP(I)
LDB B, [360600,,A] ;POS FIELD
SUBI B, 44
LDB C, [300600,,A] ;SIZE FIELD
IDIV B, C ;B := - NUM OF CHARS (BITS)
MOVE C, CHPRWD(C) ; CONVERT CHAR SIZE TO CHARS PER WORD
IMULI C, (A) ;C := NUM OF CHARS (WORDS)
SUB C, B ;C := NUM OF CHARS
MOVE A, C
EXCH C, OTOOP(I) ;COMPARE AGAINST OLD READING
SUB A, C ;TAKE DIFFERENCE
SKIPGE A ;SKIP IF NO BUFFER WRAP AROUND
ADDI A, TOBS ;WRAP AROUND ADD BUFFER SIZE
ADDM A, TOCT ;ACCUM TOTAL CHARS OUTPUT
;COUNT CHARACTERS INPUT
MOVE A, TIIP(I)
LDB B, [360600,,A] ;POS FIELD
SUBI B, 44
LDB C, [300600,,A] ;SIZE FIELD
IDIV B, C ;B := - NUM OF CHARS (BITS)
MOVE C, CHPRWD(C) ; CONVERT CHAR SIZE TO CHARS PER WORD
IMULI C, (A) ;C := NUM OF CHARS (WORDS)
SUB C, B ;C := NUM OF CHARS
MOVE A, C
EXCH C, OTIIP(I) ;COMPARE AGAINST OLD READING
SUB A, C ;TAKE DIFFERENCE
SKIPGE A ;SKIP IF NO BUFFER WRAP AROUND
ADDI A, TIBS ;WRAP AROUND ADD BUFFER SIZE
ADDM A, TICT ;ACCUM TOTAL CHARS OUTPUT
JRST NEXTTY ;GO DO ANOTHER TTY
LASTTY: RETURN
CHPRWD: 36. ;CHARS PER WORD, INDEXED BY CHAR SIZE
REPEAT 35., 36./<1+.RPCNT>
.END
;;; MAIN PROGRAM
PROGRAM METER
REGISTER A,B,C,MS
.SUSET [.RJNAME,,A] ;SEE IF SHOULD USE 340
SETZM DIXONSLOSS
IF [ CAME A,['SMETER] ][ SETOM DIXONSLOSS ]
IF [ CAME A,['METERD] ][ ;YES, SET UP
.OPEN TYOC, [.UAO,,'DIS]
JRST [ CALL TYPE,NO340
JRST KILL
]
SETZM TTYOPT ;ABSOLUTELY NO FEATURES
.VALUE [ASCIZ/:PROCED /]
]
ELSE [ ;NORMALLY USE TTY
.OPEN TYIC, [.UAI,,'TTY] ;JUST SO CAN GET INTERRUPTS
.VALUE
.OPEN TYOC, [20+.UAO,,'TTY]
.VALUE
.CALL CNSGET,[#TYOC][A,A,A,A,TTYOPT]
.VALUE
]
CALL RITUAL ;ASSURANCE OF PURITY
MOVE A, [-11.,,INTLST] ;set up interrupts
MOVEM A, 42
.SUSET [.ROPTION,,A]
TLO A, OPTINT
.SUSET [.SOPTION,,A]
.SUSET [.SMASK,,[TTYIF+BSCLK]]
IF [SKIPE TTYOPT][TYO [^L]]
ELSE [ TYO [^P] ;DISPLAY FIXED STUFF
TYO ["C]
]
MOVE TT, TTYOPT
IF [ TLNN TT, %TOERS ][ CALL TYPE,FORMAT ]
; MACRO TO PICK UP A VAR, UPDATE OLD COPY, PUT DIFFERENCE IN T
DEFINE DERIV REG,VAR
MOVE REG, VAR
MOVE TT, REG
EXCH TT, O!VAR
SUB REG, TT
TERMIN
; MACRO TO CONVERT NUMBER IN REG TO % OF VAR, LEAVE IN REG
DEFINE PERCENT REG,VAR
IMULI REG, 100.
IDIV REG, VAR
TERMIN
;;; MAIN DISPLAY LOOP
LOCAL ELAPSED ;ELAPSED TIME SINCE LAST CYCLE
; IN MILLISECONDS
LOOP: CALL PUTNUM"RESET ;GET SET FOR DISPLAY CYCLE
DERIV T,TIME ;COMPUTE TIME SINCE LAST CYCLE
IMULI T, 33. ;CONVERT 30THS TO MILLISECONDS
MOVEM T, ELAPSED ;..
; DERIV T,USRTM1 ;PUT % USER TIME IN A
MOVE T, USRTIM ;ALLOWING FOR VARIOUS FROBS
IMULI T, 1000. ;CONVERT TO MILLISECONDS
MOVE T0, USRTM1 ;AND GET CURRENT STUFF
IDIVI T0, 250. ;ALSO IN MILLISECONDS
ADD T, T0
MOVE TT, T
EXCH TT, OUSRTM1
SUB T, TT ;END FAKE DERIV EXPANSION
PERCENT T, ELAPSED
MOVE A, T
; DERIV T,NULTM1 ;PUT % NULL TIME IN B
MOVE T0, NULTM1 ;AGAIN ALLOWING FOR FROBS
IDIVI T0, 250. ;AND CONVERTING TO MILLISEC
MOVE T, NULTM3
IMULI T, 1000.
ADD T, T0
MOVE TT, T
EXCH TT, ONULTM
SUB T, TT ;END FAKE EXPANSION
PERCENT T, ELAPSED
MOVE B, T
; DERIV T,LOSTM1 ;PUT % LOST TIME IN B
MOVE T0, LOSTM1 ;AGAIN ALLOWING FOR FROBS
IDIVI T0, 250. ;AND CONVERTING TO MILLISEC
MOVE T, LOSTIM
IMULI T, 1000.
ADD T, T0
MOVE TT, T
EXCH TT, OLOSTM
SUB T, TT ;END FAKE EXPANSION
PERCENT T, ELAPSED
MOVE C, T
CALL PUTNUM,A
CALL PUTNUM,B
MOVNS B ;COMPUTE OVERHEAD
ADDI B, 100.
SUB B, A
CALL PUTNUM,B
CALL PUTNUM,C
; AT LAST, THAT CRUFT IS OVER WITH!
; SCAN USERS
REGISTER U ;USER INDEX
IRP Z,,[TOTU,ACTU,RUNU,ERUNU,BLOCKU,STOPU]
LOCAL Z ;BUCKETS
SETZM Z
TERMIN
SETZM U
;CAN'T USE UNTIL MACRO WITH ABSREF MACROS.....WAAAH - ???
ULOOP: ;LOOP THROUGH ALL USERS
SKIPN UNAME(U)
JRST ULOOP0
AOS TOTU
MOVE T, LUBTM(U) ;SEE IF RECENTLY ACTIVE
ADDI T, 15.*30.
CAML T, TIME
AOS ACTU ;YES
SKIPN USTP(U)
JRST .+3
AOS STOPU ;STOPPED
JRST ULOOP0
SKIPN FLSINS(U)
JRST .+3
AOS BLOCKU ;BLOCKED
JRST ULOOP0
MOVE T, UPC(U)
TLNE T, 010000
JRST .+3
AOS ERUNU ;RUNNING IN EXEC MODE
JRST ULOOP0
AOS RUNU
ULOOP0: ADDI U, LUBLK
CAMGE U, USRHI
JRST ULOOP
CALL PUTNUM,TOTU
IRP Z,,[ACTU, RUNU, ERUNU, BLOCKU, STOPU]
MOVE A, Z
PERCENT A, TOTU
CALL PUTNUM,A
TERMIN
; DISK STATISTICS
MOVE MS, ELAPSED ;SET UP FOR IDIVM'S
MOVE A,NRXFR
ADD A,NWXFR
ADD A,NSRXFR
ADD A,NSWXFR
MOVE TT, A
EXCH TT, OXFR
SUB A, TT
IDIVM MS, A
CALL PUTNUM,A
DERIV A,NRXFR
IDIVM MS, A
CALL PUTNUM,A
DERIV A,NWXFR
IDIVM MS, A
CALL PUTNUM,A
DERIV A,NSRXFR
IDIVM MS, A
CALL PUTNUM,A
DERIV A,NSWXFR
IDIVM MS, A
CALL PUTNUM,A
; TTY STATISTICS
DERIV A,TICT ;TTY CHARS/SECOND
IMULI A, 1000.
IDIV A, ELAPSED
CALL PUTNUM,A
DERIV A,TOCT
IMULI A, 1000.
IDIV A, ELAPSED
CALL PUTNUM,A
; RANDOM SCHED ATB'S - MILLISECONDS
DERIV A,NSKED
IDIVM MS, A
CALL PUTNUM,A
DERIV A,NPCLSR
IDIVM MS, A
CALL PUTNUM,A
DERIV A,NSOUSR
IDIVM MS, A
CALL PUTNUM,A
; PAGE FAULT DATA
DERIV A,NPGFLT ;ATB P F
MOVE C, A ;TOTAL PF SAVED FOR BELOW
IDIVM MS, A
CALL PUTNUM,A
IRP PF,,[NRPI,NRPCI,NRPO,NRPGO]
DERIV A,PF
IMULI A, 100. ;PERCENT OF THIS TYPE
IDIV A, C ;RELATIVE TO TOTAL
CALL PUTNUM,A
TERMIN
CALL PUTNUM"FINISH
IF [ SKIPE TT, TTYOPT ;IF DISPLAY BUT NOT 340
TLNN TT, %TOERS ][
TYO [^P]
TYO ["Z]
TYO [^P] ;leave line for :KILL message
TYO ["U]
TYO [^P] ;leave line for :KILL message
TYO ["U]
TYO [^P] ;leave line for **MORE** OR RATHER TO AVOID IT.
TYO ["U]
]
SKIPE TTYOPT ;DON'T LISTEN IF 340
.LISTEN A,
IF [ SKIPN DIXONSLOSS ][ MOVEI A,60.*60. ] ;WHOLE MINUTE
ELSE [ MOVEI A, 150. ] ;SLEEP 5 SEC
.SLEEP A,
SKIPE A,TTYOPT ;DON'T LISTEN IF 340
.LISTEN A,
JUMPE A, LOOP
KILL: .BREAK 16, 040000
DIXONSLOSS: 0 ;FLAG FOR SLOW REPEAT (FOR GARY DIXON)
;;; Interrupt Handlers
INTLST: P
TTYIF ? 0 ;CHARACTER TYPED
TTYIF ? 0 ? KILL ; STOP JOB
BSCLK ? 0 ;1/2 SEC INT CHECK TTYS
BSCLK ? 0 ? .+1
PUSH P, T
PUSH P, TT
PUSH P, T0
PUSH P, T1
PUSH P, .PF.
CALL CHKTTY
POP P, .PF.
POP P, T1
POP P, T0
POP P, TT
POP P, T
.CALL DISMIS,[P]
.END
;;; ROUTINE TO TYPE A CONSTANT STRING
TYPE: PROCEDURE STRING
REGISTER PT,CH
MOVEI PT, STRING ;SET UP B.P. TO STRING
TLOA PT, 440700 ;..
LOOP: TYO CH
ILDB CH, PT ;GET NEXT CHAR
JUMPN CH, LOOP ;AND IF NOT DONE, TYPE IT
RETURN
.END
;;; PURIFICATION RITUAL
OITSVRS:0 ;ITS VERSION PURIFIED FOR
OUSRSTG:0 ;EXTRA Check
RITUAL: PROCEDURE
.RSYSID TT,
MOVE T, [SQUOZE 0,USRSTG] ;SEE IF SYSTEM CHANGED
.EVAL T,
JFCL
CAMN TT, OITSVRS
CAME T, OUSRSTG
JRST NOGOOD
RETURN
NOGOOD: CALL PURIFY ;WRONG SYS VERSION OR NOT PURE
RETURN ;YET SO REPURIFY
.END
ABSTB1: ABSTAB
ABSTB2:
PURIFY: PROCEDURE
REGISTER I,L,V,LIM
.VALUE [ASCIZ\:New system version; must repurify.
Take paws off keys and wait.

 p\]
MOVEI LIM, IMMEDS-ABSTB1 ;LIMIT ON REMAPPABLENESS
MOVSI I, <ABSTB1-ABSTB2>/2 ;SCAN ABSTAB
EVLOOP: MOVE V, ABSTB1(I) ;GET SYMBOL
.EVAL V, ;EVALUATE IT
.VALUE ;NOT THERE???
CAIG LIM, (I) ;SKIP FOLLOWING CODE
JRST EVLP00 ; IF IMMEDIATE SYMBOL
CAIGE V, REMAPT ;REMAP LOW CORE
SUBI V, REMAPT ;INTO HIGH CORE
EVLP00: ADDI I, 1
MOVE TT, ABSTB1(I) ;FOLLOW PATCH LIST
PLOOP: JUMPE TT,EVLPNX ;JUMP IF END OF LIST
MOVE L,TT
HLRZ TT,(L) ;LOC TO PATCH
HRRM V,(TT) ;PATCH IT
HRRZ TT,(L) ;LINK TO NEXT
JRST PLOOP ;AND TRY AGAIN
EVLPNX:AOBJN I, EVLOOP ;NEXT SYMBOL
; HAVING PATCHED, SET UP PAGE TABLE
; FOR NOW, WE DON'T ACTUALLY PURIFY ANY PAGES...
.RSYSID V, ;REMEMBER ITS VERSION
MOVEM V, OITSVRS
MOVE V, [SQUOZE 0,USRSTG] ;AND A KLUDGEY MACHINE CHECK
.EVAL V,
.VALUE
MOVEM V, OUSRSTG
SETZM V
MOVEI TT, REMAPT_-10. ;GET ABS PAGES
HRLI TT, <REMAPT-400000>_-10. ;FROM 0 TO 400000
MOVE T, TT
GETMOR: .CALL CORBLK,[#210000,#-1,TT,#400000,T]
JRST .+2 ;ERROR RETURN
JRST GOTIT
.SUSET [.RBCHN,,V] ;FIND OUT WHAT LOST
.CALL STATUS,V,V ;GET ERROR CODE
.VALUE
LDB V, [270600,,V] ;..
CAIE V, 32 ;CAN'T GET THAT ACCESS
.VALUE ;NO - UNCLEAR
ADD TT, [40,,40] ;YES - BITING MD10'S HAVE A 32K HOLE!
MOVE T, TT
JUMPL TT, GETMOR
GOTIT: JUMPE V,GOTIT1
CALL TYPE,MEMHOL
GOTIT1: MOVEI TT, <1000000-REMAPT>_-10. ;DO REMAPPAGE
HRLI TT, -<REMAPT_-10.>
SETZ T,
.CALL CORBLK,[#210000,#-1,TT,#400000,T]
.VALUE
.VALUE [ASCIZ\:PDUMP SYS1;TS METER
P\]
RETURN
.END PURIFY
CONSTANTS
REMAPT=<.+1777>&776000 ;FIRST NON USED PAGE
END METER