' IMG_READ.LST
' Unpacking an IMG graphic
' --------------------------
' Load IMG picture
file$="a:\KARIN.IMG"+CHR$(0)
VOID GEMDOS(78,L:VARPTR(file$),1+2+4+16+32)
length%=LPEEK(GEMDOS(47)+26)
'
d$=SPACE$(length%)
BLOAD file$,VARPTR(d$)
' Origin and address
d%=VARPTR(d$)
'
' Determine picture dimensions
w%=DPEEK(d%+12)
h%=DPEEK(d%+14)
'
' Read IMG header
IF RIGHT$(file$,5)=".IMG"+CHR$(0) AND DPEEK(d%+2)=8 AND DPEEK(d%+4)=1 AND DPEEK(d%+6)=2 AND w%<=640 AND h%<=400
  '
  ' s$=unpacked file
  s$=SPACE$(32000)
  s%=VARPTR(s$)
  '
  ALERT 2,"Unpack picture |in GFA BASIC|or GFA ASSEMBLER?",1,"Basic|Ass.",question%
  t=TIMER
  '
  ' GFA BASIC
  IF question%=1
    ' xb%=Line length in bytes, rounded up to full bytes
    xb%=(w%+7) DIV 8
    '
    ' z%= Counter for the IMG picture
    z%=d%+16
    '
    ' zz%, p%= Counter for the unpacked picture
    zz%=s%
    '
    ' fin%=Number of line repeats, normal=1
    fin%=1
    '
    CLR limit%
    '
    REPEAT
      '
      ' Test bytes one after the other
      a%=PEEK(z%)
      '
      IF zz%=limit%
        ADD zz%,xb%*(fin%-1)
        fin%=1
      ENDIF
      '
      IF a%=0
        a1%=PEEK(z%+1)
        a2%=PEEK(z%+2)
        a3%=PEEK(z%+3)
        '
        ' Word repeats
        IF a1%>0
          p%=zz%
          FOR m%=1 TO fin%
            c$=STRING$(a1%,CHR$(a2%)+CHR$(a3%))
            BMOVE VARPTR(c$),p%,a1%*2
            ADD p%,xb%
          NEXT m%
          ADD zz%,a1%*2
          ADD z%,4
        ENDIF
        '
        ' Line repeats
        IF a1%=0 AND a2%=255
          fin%=a3%
          limit%=zz%+xb%
          ADD z%,4
        ENDIF
      ENDIF
      '
      ' Zero bytes (0)
      IF a%>0 AND a%<128
        p%=zz%
        FOR m%=1 TO fin%
          c$=STRING$(a%,0)
          BMOVE VARPTR(c$),p%,a%
          ADD p%,xb%
        NEXT m%
        ADD zz%,a%
        INC z%
      ENDIF
      '
      '  Full bytes (255)
      IF a%>128
        SUB a%,128
        p%=zz%
        FOR m%=1 TO fin%
          c$=STRING$(a%,255)
          BMOVE VARPTR(c$),p%,a%
          ADD p%,xb%
        NEXT m%
        ADD zz%,a%
        INC z%
      ENDIF
      '
      ' unpacked sequences
      IF a%=128
        a%=PEEK(z%+1)
        p%=zz%
        FOR m%=1 TO fin%
          BMOVE z%+2,p%,a%
          ADD p%,xb%
        NEXT m%
        ADD zz%,a%
        ADD z%,a%+2
      ENDIF
      '
    UNTIL z%>=d%+length%
  ENDIF
  '
  ' GFA ASSEMBLER
  IF question%=2
    INLINE ass_in%,958
    ' Calling assembler program, with
    ' 2 = unpack
    ' s% and d% the addresses of the graphics data
    ' w% and h% the dimensions of the source graphic in pixels
    ' Return value error%=0, if everything OK
    error%=C:ass_in%(2,L:s%,L:d%,w%,h%)
  ENDIF
  '
  tt=(TIMER-t)/200
  t$=STR$(tt)
  '
  ' If no error, then show picture
  IF error%=0
    z%=XBIOS(2)
    xb%=(w%+7) DIV 8
    FOR n%=0 TO h%-1
      BMOVE s%,z%,xb%
      ADD s%,xb%
      ADD z%,80
    NEXT n%
  ENDIF
  '
  IF question%=1
    ALERT 1,"Unpacking graphic |in GFA BASIC takes|"+t$+" seconds.",1," OK ",d%
  ELSE
    ALERT 1,"Unpacking graphic |in GFA ASSEMBLER takes|"+t$+" seconds.",1," OK ",d%
  ENDIF
ENDIF
'
EDIT
