/* This loads a sequence of absolute hunks produced by SYSLINK,
then outputs a 'core-image'.
*/
needs "USINGCMS"
get "NLIBHDR"
GET "USINGCMS"
manifest $( t.end=1002; t.abshunk=1003 $)
static $( cvec=0 $)
let start() be $( USINGCMS("HUNK") $(
let vvvv = vec (64*1024/bytesperword)
LET max = ?
cvec := vvvv
for i = 0 to 64*1024/bytesperword do cvec!i := 0
$( LET fd = findinput("SYSLINK")
LET fc = findinput("SYSCODE")
LET so = findoutput("SYSPRINT")
IF so=0 stop(85)
selectoutput(so)
IF fd=0 DO
$( writes("*NNo data segment input*N")
stop(10)
$)
IF fc=0 DO
$( writes("*NNo code segment input*N")
stop(10)
$)
selectinput(fd)
max := readhunks()
writef("*Nmax = %X5*N", max)
IF max=0 DO
$( writes("*NError reading data hunks*N")
stop(85)
$)
// interrupt vectors loaded from 0 to hex 400
// data is loaded from hex 500 to hex 600
// plus the top 3K bytes.
selectoutput(findoutput("TRIPOS DATA"))
writes("LOC0000")
outlims(0, #X400-1)
outlims(#X500, #X660-1)
outlims(max-#XC00, max)
writes("*NSTOR"); endwrite()
selectinput(fc)
FOR i = 0 to 64*1024/bytesperword-1 DO cvec!i := 0
max := readhunks()
selectoutput(so)
writef("*Nmax = %X5*N", max)
IF max=0 DO
$( selectoutput(so)
writes("*NError reading code hunks*N")
stop(85)
$)
selectoutput(findoutput("TRIPOS CODE"))
writes("LOC0000")
// code is loaded from 8 to 11 plus the top #X9C40 bytes
outlims(8, 11)
outlims(max-#X9C3F, max)
writes("*NSTOR")
endwrite()
selectoutput(so)
writes("*NTripos image files created OK*N")
stop(0)
$)
$)
$)
AND readhunks() = VALOF
$( LET m = 0
$( let b1 = rd16()
if b1=t.end do b1 := rd16()
unless b1=t.abshunk break
$( let base = rd16()*2
let size = rd16()*2
for i = 0 to size-1 do
$( let x = rd8()
IF x=-1 DO RESULTIS 0
cvec%(base+i) := x
IF base+i-m>0 DO m := base+i // max
$)
$)
$) repeat
RESULTIS m
$)
AND RD8() = VALOF
$( LET VAL = READX()
IF VAL=-1 RESULTIS -1
$( LET VAL2 = READX()
IF VAL2=-1 RESULTIS -1
RESULTIS VAL*16 + VAL2
$)
$)
AND READX() = VALOF
$( LET C = ?
C := RDCH() REPEATWHILE C='*S' | C='*N'
IF C=ENDSTREAMCH RESULTIS -1
RESULTIS '0'<=C<='9' -> C-'0', C-'A'+10
$)
AND RD16() = VALOF
$( LET VAL1 = RD8()
IF VAL1=-1 RESULTIS -1
$( LET VAL2 = RD8()
IF VAL2=-1 RESULTIS -1
RESULTIS (VAL2<<8) | VAL1
$)
$)
AND outlims(a, b) BE
$( // output bytes from limits a to b
FOR i = a TO b DO
$( IF i REM (32) = 0 | i=a DO writef("*NOG%X4", i)
writehex(cvec%i, 2)
$)
$)