SECTION "LDR"
GET "NLIBHDR" // STANDARD LIB HEADER
// THIS FILE SHOULD BECOME THE INSERT FILE "AHDR"
GET "AHDR"
STATIC $(
BWORD=4; BSHIFT=32
BCHSUM=0
CSECTNUMBER=0
COMMTOP=0; INTOP=0;EXTTOP=0
WORDP1=0;WORDF=0
CURADR=0; OLDADR=0
RELID=0;RELADR=0
EXTID=0;EXTADR=0
$)
MANIFEST $(
S.SD=0
S.LD=1
S.ER=2
S.PC=4
S.CM=5
S.PR=6
S.WX=10
$)
LET DUMPINIT() BE $(
LET NEXT=0 AND N=1 AND ECNT=0 AND A=OUTPUT()
AND UNPACKV=VEC 32 AND VN = VEC 32
//** DEBUG(" START OF DUMPINIT ECNT =%N*N*N",ECNT)
SELECTOUTPUT(BINOUT)
UNPACKSTRING(PGM,UNPACKV)
FOR I=1 TO UNPACKV!0 DO PUTBYTE(VN,I,UNPACKV!I)
ECNT:=ECNT+1
ESD(S.SD,ECNT,VN*BYTESPERWORD,UNPACKV!0,0)
ECNT:=ECNT+1
UNTIL COMMONS=0 DO $(
LET A=SNAME!(1!COMMONS)
AND T=1!COMMONS
LET L=GETBYTE(0,A)
//** DEBUG(" IN COMMON LOOP COMMONS = %X8*N",COMMONS)
ESD(S.CM,(!(NAMEP!T)Ͽ)+1,A,L,0)
ECNT:=ECNT+1
COMMONS:=!COMMONS
$)
COMMTOP:=ECNT
UNTIL INTERNALS=0 DO $(
LET A=SNAME!(1!INTERNALS)
AND T=1!INTERNALS
LET L=GETBYTE(0,A)
//** DEBUG(" IN INTERNALS , INTERNALS =%X8*N",INTERNALS)
ESD(S.LD,0,A,L,1!(NAMEP!T))
INTERNALS:=!INTERNALS
$)
INTOP:=ECNT-1
UNTIL EXTERNALS=0 DO $(
LET A=SNAME!(1!EXTERNALS)
AND T=1!EXTERNALS
LET L=GETBYTE(0,A)
//** DEBUG(" IN EXTERNALS, EXTERNALS =%X8*N",EXTERNALS)
ESD(S.ER,INTOP+(!(NAMEP!T)Ͽ),A,L,0)
ECNT:=ECNT+1
EXTERNALS:=!EXTERNALS
$)
EXTTOP:=ECNT
SELECTOUTPUT(A)
DUMPCNT,DUMPWORD,DUMPSTATE:=0,0,0
$)
AND ESD(X,ESDID,NAMP,NAMN,ADDR) BE $(
LET Y=0
//** DEBUG(" ESD CALL X=%N, Y=%N, NAMP=%X8, NAMN=%N, ADDR=%X4*N",
//** X,ESDID,NAMP,NAMN,ADDR)
WRBYTE(#X02)
WRITES("ESD ")
WR8(16)
WRITES(" ")
TEST X=S.LD THEN WRITES(" ") ELSE WR8(ESDID)
NAMN:=NAMN>8->8,NAMN
FOR I=1 TO NAMN DO WRBYTE(GETBYTE(0,NAMP+I))
FOR I= NAMN+1 TO 8 DO WRBYTE(' ')
WRBYTE(X)
WR16(ADDR)
WRBYTE(' ')
IF X=S.LD THEN Y:=1
IF X=S.ER THEN Y:=#X404040
WR16(Y)
NEWLINE()
$)
AND WR8(X) BE $(
WRBYTE((X>>8)ÿ)
WRBYTE(Xÿ)
$)
AND WR16(X) BE $(
WRBYTE((X>>16)ÿ)
WRBYTE((X>>8)ÿ)
WRBYTE(Xÿ)
$)
AND DEBUG(X,X1,X2,X3,X4,X5,X6,X7,X8,X9) BE $(
LET A=OUTPUT()
SELECTOUTPUT(ERRSTR)
WRITEF(X,X1,X2,X3,X4,X5,X6,X7,X8,X9)
SELECTOUTPUT(A)
$)
AND WRBYTE(X) BE BINWRCH(X)
AND RLD(ID,ADR) BE $(
//** DEBUG(" IN RLD ID= %N, ADR =%X8*N",ID,ADR)
WRBYTE(#X02)
WRITES("RLD ")
WR8(8)
WRITES(" ")
WR8(ID)
WR8(1)
WRBYTE(8)
WR16(ADR-1)
NEWLINE()
$)
AND TXT(V,N,A) BE $(
//** DEBUG(" IN TEXT V=%X8, N=%N , ADDR =%X8*N",V,N,A)
WRBYTE(#X02)
WRITES("TXT ")
WR16(A)
WRITES(" ")
WR8(N)
WRITES(" ")
WR8(1)
FOR I=1 TO N DO WRBYTE(V!I)
NEWLINE()
$)
AND TXTO(V0,V1) BE $(
IF (DUMPCNT>=54) LOGOR(CURADR~=V1) THEN $(
IF DUMPCNT>0 THEN TXT(VX,DUMPCNT-1,OLDADR)
DUMPCNT:=1
CURADR:=V1
OLDADR:=V1
$)
VX!DUMPCNT:=V0
CURADR:=CURADR+1
DUMPCNT:=DUMPCNT+1
$)
AND FORCETXT() BE $(
IF DUMPCNT>0 THEN TXT(VX,DUMPCNT-1,OLDADR)
DUMPCNT:=0
CURADR:=-1
$)
AND DUMP(TYPE,V0,V1,V2,V3,V4) BE $(
LET A=OUTPUT()
DEBUG(" DUMP ENTRY TYPE =%N, V0 =%X4, V1=%X4*N",TYPE,V0,V1)
SELECTOUTPUT(BINOUT)
SWITCHON TYPEﰀ INTO $(
CASE T.ABS:
IF DUMPCNT=0 THEN $(
OLDADR:=V1
CURADR:=V1
DUMPCNT:=1
$)
TXTO(V0,V1)
ENDCASE
CASE T.REL:
TEST DUMPWORD=0 THEN $(
RELADR:=V1
RELID:=1
TXTO(V0,V1)
DUMPWORD:=1
$) ELSE $(
TXTO(V0,V1)
FORCETXT()
RLD(RELID,RELADR)
DUMPWORD:=0
$)
ENDCASE
CASE T.COMMON:
CASE T.EXT:
TEST DUMPWORD= 0 THEN $(
EXTID:=(TYPEﰀ)=T.EXT->INTOP,0
EXTID:=EXTID+(TYPEϿ)
EXTADR:=V1
DUMPWORD:=1
TXTO(V0,V1)
$) ELSE $(
TXTO(V0,V1)
FORCETXT()
RLD(EXTID,EXTADR)
DUMPWORD:=0
$)
ENDCASE
CASE T.DIR:
SWITCHON TYPEϿ INTO $(
CASE D.ORG: ENDCASE
CASE D.RES:
FOR I=0 TO V0-1 DO TXTO(V1,P.LOC+I)
ENDCASE
CASE D.END:
IF DUMPCNT >0 THEN TXT(VX,DUMPCNT-1,OLDADR)
WRBYTE(#X02)
WRITES("END ")
DUMPCNT:=(CNT=RELC)->TOPRELCNT,TOPABSCNT
WRBYTE(0)
WR16(DUMPCNT)
WRITES(" ")
NEWLINE()
$)
$)
SELECTOUTPUT(A)
$)
.