GET "AHDR" MANIFEST $( T.HUNK = 1000 T.END = 1002 T.ABSHUNK = 1003 T.RELOCB = 1005 T.ABSRELOCB = 1006 $) STATIC $( OUTCOUNT=0 CURADR=0 MYRELC=0 DUMPCNT=0 DUMPWORD=0 RELADR=0 ABASE=0 RELBASE=0 HTYPE=T.HUNK savb=0 SEGLOC=0 SEGGED=FALSE $) LET DUMPINIT() BE $( HUNKINIT() $) AND HUNKINIT() BE $( MYRELC, CURADR, DUMPCNT := 0, 0, 0 DUMPWORD, RELADR := 0, 0 $) AND DUMP(TYP, V0, V1, V2, V3, V4) BE $( SWITCHON TYPﰀ INTO $( CASE T.ABS: TXTO(V0, V1) ENDCASE CASE T.REL: TEST DUMPWORD=0 DO $( RELADR := V1 TXTO(V0, V1) DUMPWORD := 1 $) OR $( TXTO(V0, V1) IF myrelc>rvsize DO $( writes("*NNot enough reloc space*N") tidy.and.finish(19) $) RELVECC!MYRELC := RELADR MYRELC := MYRELC + 1 DUMPWORD := 0 $) ENDCASE CASE T.DIR: SWITCHON TYPϿ INTO $( CASE D.ORG: TEST V0=T.ABS DO $( ABASE := V1; HTYPE := T.ABSHUNK $) OR $( RELBASE := CURADR ; HTYPE := T.HUNK $) ENDCASE CASE D.RES: FOR I = 0 TO V0-1 DO TXTO(V1, P.LOC+I) ENDCASE CASE D.DSEG: UNLESS SEGGED DO $( IF HTYPE=T.ABSHUNK DO $( FAULT('J') ENDCASE $) SEGGED := TRUE SEGLOC := CURADR $) ENDCASE CASE D.END: WRITEHUNK(TRUE) $) $) $) AND TXTO(X1, X2) BE $( UNTIL CURADR=X2 DO $( checkcnt() putbyte(codevec, curadr, 0) CURADR := CURADR + 1 DUMPCNT := DUMPCNT + 1 $) checkcnt() PUTBYTE(CODEVEC, CURADR, X1) CURADR := CURADR + 1 DUMPCNT := DUMPCNT + 1 $) AND checkcnt() BE IF cdsize*bytesperword-dumpcnt < 0 DO $( writes("*NNot enough code space for pusher*N") tidy.and.finish(20) $) AND WRITEHUNK(ENDQ) BE $( LET A = OUTPUT() LET ABSRELCNT, I = 0, 1 SELECTOUTPUT(BINOUT) UNTIL I>MYRELC DO $( LET N = RELVECC!(I-1) // ADDRESS IN CODE VECTOR LET T = GETBYTE(CODEVEC, N) // MS BYTE OF ITEM LET U = GETBYTE(CODEVEC, N+1) // LS BYTE OF ITEM LET VAL = (T<<8) | U TEST VAL>=RELBASE DO // REFERRING TO HUNK $( VAL := VAL - RELBASE // MAKE VAL OFFSET IN HUNK T := VAL>>8 U := VAL&255 IF N=RELBASE DO WR16(RELVECC!(I-1)-RELBASE) $) $) $) IF RELBASE>0 | HTYPE=T.ABSHUNK DO // IF ABSHUNK EXISTS $( WR16(T.ABSHUNK) WR16(ABASE/2) // WORD ADDRESS OF BASE $( LET AAB = (ABASE/2)*2 LET ACNT = HTYPE=T.ABSHUNK -> (CURADR-AAB+1)/2, (RELBASE-AAB+1)/2 WR16(ACNT) FOR I = 0 TO ACNT*2 - 1 DO WR8(GETBYTE(CODEVEC, AAB+I)) IF ABSRELCNT>0 DO // MAKE T.ABSRELOCB LIST $( WR16(T.ABSRELOCB) WR16(ABSRELCNT) FOR I = 1 TO MYRELC DO IF RELVECC!(I-1)