GET "CGHDR"

LET START(PARMST) BE $(
 SELECTINPUT(FINDINPUT("CODE"))
$( LET RELCON = 0
    LET B1 = RD16()
    LET COUNT = RD16()*2
    LET V = GETVEC(COUNT-1)

    SELECTOUTPUT(FINDOUTPUT("SYSPRINT"))
    WRITEF("LOADER PARMST IS %S *N", PARMST)
    FOR I = 1 TO GETBYTE(PARMST, 0) DO
    $( LET CH = GETBYTE(PARMST, I)
       IF CH='/' THEN BREAK
       RELCON := RELCON*16 + ('0'<=CH<='9'->CH-'0',CH-'A'+10)
    $)

    UNLESS B1=T.HUNK DO
    $(
       WRITEF("*NFIRST WORD IS %X4", B1)
       STOP(8)
    $)

    IF V=0 DO STOP(9)

    FOR I = 0 TO COUNT-1 DO V!I := RD8()

    B1 := RD16()

   IF B1=T.RELOCB & RELCON~=0 DO
    $( B1 := RD16()
       FOR I = 1 TO B1 DO
       $( LET J = RD16()
          LET VAL = ((V!(J+1))<<8) + V!J
          VAL := VAL + RELCON
          V!J := VAL&255
          V!(J+1) := (VAL>>8)&255
       $)
    $)

    SELECTOUTPUT(FINDOUTPUT("LOADF"))

    WRITEF("LOC%X4", RELCON)
    FOR I = 0 TO COUNT-1 DO
    $( IF (I REM 16)=0 DO WRITEF("*NOG%X4", I)
       WRITEHEX(V!I, 2)
    $)

    WRITES("*NSTOR*N")
 $)
                     $)

AND RD8() = VALOF
$( LET VAL = READX()
   RESULTIS VAL*16 + READX()
$)

AND READX() = VALOF
$( LET C = ?
   C := RDCH() REPEATWHILE C='*S' | C='*N'
   RESULTIS '0'<=C<='9' -> C-'0', C-'A'+10
$)

AND RD16() = VALOF
$( LET VAL = RD8()
   RESULTIS (RD8()<<8) | VAL
$)