;Dit programma laat IFF-ILBM files op het scherm zien. Het programma werkt
;ook met overscan en halfbright. De plaatjes worden automatisch gecentreerd.
;Color-cycling werkt nog niet.
;
          OPT       A+
          INCDIR    :Talen/Devpac/include/
          include   libraries/dos_lib.i
          include   libraries/dos.i
          include   exec/exec_lib.i
          include   exec/memory.i
          include   graphics/graphics_lib.i
          include   intuition/intuition.i
          include   intuition/intuition_lib.i
          include   hardware/custom.i
          cmp.b     #$0a,(a0)           geen filenaam ingevuld ?
          seq       error               vlag zetten
          beq.s     begin
          cmp.b     #'?',(a0)           ? ingevuld ?
          seq       error               vlag zetten
begin     move.l    a0,a2               beginadres van de filenaam
          clr.b     -1(a0,d0)           nulstring van maken
          cmp.b     #34,(a2)            staat de naam tussen ""
          bne.s     openlib
          addq.l    #1,a2               sla het eerste " over
          clr.b     -2(a0,d0)           verwijder de laatste "
openlib   move.l    #dosname,a1
          CALLEXEC  OldOpenLibrary      dos.library openen
          beq       geenlib
          move.l    d0,_DOSBase
          move.l    #intname,a1
          jsr       _LVOOldOpenLibrary(a6)        intuition.library openen
          beq       geenlib
          move.l    d0,_IntuitionBase
          move.l    #grafname,a1
          jsr       _LVOOldOpenLibrary(a6)        graphics.library openen
          beq       geenlib
          move.l    d0,_GfxBase
          tst.b     error               is de vlag gezet ?
          bne       geennaam            laat het gebruik zien
          move.l    a2,d1
          move.l    #MODE_OLDFILE,d2
          CALLDOS   Open                file openen
          beq       geenfile
          move.l    d0,filehandle
          moveq.b   #12,d3              12 bytes lezen
header    bsr       readx
          bmi       leesfout
          move.l    buffer,d5
          cmp.l     #'FORM',d5          Is het een IFF file ?
          bne       geeniff
          move.l    buffer+8,d5
          cmp.l     #'ILBM',d5          Is het een ILBM file ?
          bne       geenilbm
lezen     moveq.b   #8,d3               Chunks lezen
          bsr       readx
          bmi       leesfout            leesfout
          beq       wachten             end of file
          move.l    buffer,d5
          cmp.l     #'BMHD',d5          Is de BitMapHeader er ?
          beq.s     gegevens
          cmp.l     #'CMAP',d5          Kleuren ?
          beq       kleuren
          cmp.l     #'CAMG',d5          Viewmode ?
          beq       viewmd
          cmp.l     #'BODY',d5          Het plaatje ?
          beq       planes
          move.l    buffer+4,d2         Onbekende chunk, overslaan.
          addq.l    #1,d2
          bclr      #0,d2
          clr.l     d3
          move.l    filehandle,d1
          CALLDOS   Seek                Op zoek naar de volgende.
          bra.s     lezen
gegevens  move.l    buffer+4,d3
          bsr       readx               Lees de BitMap gegevens
          bmi       leesfout
          move.w    buffer,d2
          addq.w    #1,d2               breedte even maken
          bclr      #0,d2
          move.w    d2,breedte
          move.w    buffer+2,hoogte
          move.b    buffer+8,d1         diepte byte omzetten naar woord
          move.w    buffer+16,br        breedte van bronpagina
          move.w    buffer+18,ho        hoogte van bronpagina
          clr.w     mode
          cmp.b     #6,d1
          bgt       tediep              foutmelding als diepte > 6
          blt.s     geenham             geen HAM als diepte < 6
          or.w      #V_HAM,mode         wel HAM of EXTRAHALFBRIGHT
geenham   ext.w     d1
          move.w    d1,diepte
          move.b    buffer+9,d0         is er masking ?
          cmp.b     #1,d0
          beq.s     welmask
          cmp.b     #3,d0               is er masking ?
          beq.s     welmask
          bra.s     geenmask
welmask   seq       mask                zet de masking vlag
geenmask  move.b    buffer+10,compress
          move.w    breedte,d0
          addq.w    #7,d0               3 LSB bits niet vergeten
          asr       #3,d0               breedte door 8 delen
          addq.w    #1,d0               aantal bytes even maken
          bclr      #0,d0
          move.w    d0,bytes
          move.l    _IntuitionBase,a0
          move.l    ib_ActiveScreen(a0),a0
          move.w    sc_Width(a0),d3     breedte van de workbench
          move.w    sc_Height(a0),d4    hoogte van de workbench
          move.w    hoogte,d2
          cmp.w     #340,d2             is het scherm INTERLACE ?
          bgt.s     wellace
          move.w    ho,d7
          cmp.w     #340,d7             is het bronscherm INTERLACE ?
          blt.s     geenlace
wellace   or.w      #V_LACE,mode
          cmp.w     #340,d4             is de workbench INTERLACE ?
          bls.s     wbnolace
          move.w    d4,d5                         WB - scherm
          sub.w     d2,d5               deltay = -------------
          asr.w     #1,d5                              2
          move.w    #-32,d6
          bra.s     testdlty
wbnolace  move.w    d4,d5
          asl.w     #1,d5                         (WB*2) - scherm
          sub.w     d2,d5               deltay = -----------------
          asr.w     #1,d5                                2
          move.w    #-32,d6
          bra.s     testdlty
geenlace  cmp.w     #340,d4   
          bhi.s     wblace
          move.w    d4,d5                         WB - scherm
          sub.w     d2,d5               deltay = -------------
          asr.w     #1,d5                              2
          move.w    #-16,d6
          bra.s     testdlty
wblace    move.w    d4,d5
          asr.w     #1,d5                         (WB/2) - scherm
          sub.w     d2,d5               deltay = -----------------
          asr.w     #1,d5                                2
          move.w    #-16,d6
testdlty  cmp.w     d5,d6
          blt.s     hiresyn
          move.w    d6,d5
hiresyn   move.w    breedte,d2
          cmp.w     #388,d2             is het scherm HIRES ?
          bgt.s     hires
          move.w    br,d7
          cmp.w     #388,d7             is het bronscherm HIRES ?
          bls.s     lores
hires     or.w      #V_HIRES,mode                 WB - scherm
          sub.w     d2,d3               deltax = -------------
          asr.w     #1,d3                              2
          bra.s     testdltx
lores     asr.w     #1,d3                         (WB/2) - scherm
          sub.w     d2,d3               deltax = -----------------
          asr.w     #1,d3                                2
testdltx  cmp.w     d3,d6
          blt.s     scherm
          move.w    d6,d3
scherm    lea       MijnScreen(pc),a0   Screen maken
          move.w    breedte,ns_Width(a0)
          move.w    hoogte,ns_Height(a0)
          move.w    diepte,ns_Depth(a0)
          move.w    mode,ns_ViewModes(a0)
          move.w    #CUSTOMSCREEN!SCREENBEHIND,ns_Type(a0)
          CALLINT   OpenScreen
          tst.l     d0
          beq       geenscreen
          move.l    d0,Screen1
          move.l    Screen1,a0
          move.w    d3,sc_ViewPort+vp_DxOffset(a0)   verschuiven in x-richting
          move.w    d5,sc_ViewPort+vp_DyOffset(a0)   verschuiven in y-richting
          jsr       _LVORemakeDisplay(a6)         nieuwe waarde gebruiken
          lea       MijnWindow(pc),a0             Window maken
          move.w    breedte,nw_Width(a0)
          move.w    hoogte,nw_Height(a0)
          move.l    #BORDERLESS!RMBTRAP!ACTIVATE,nw_Flags(a0)
          move.l    #MOUSEBUTTONS!RAWKEY,nw_IDCMPFlags(a0)
          move.w    #CUSTOMSCREEN,nw_Type(a0)
          move.l    Screen1,nw_Screen(a0)
          jsr       _LVOOpenWindow(a6)
          tst.l     d0
          beq       geenwindow
          move.l    d0,Window1
          st        bmhdok              vlag zetten, de BMHD is ingelezen
          bra       lezen               volgende CHUNK lezen
viewmd    tst.b     bmhdok
          beq       geenbmhd
          move.l    buffer+4,d3
          bsr       readx
          bmi       leesfout
          move.l    buffer,d1
          btst      #7,d1               Is het HALFBRITE ?
          beq       lezen
          andi.w    #~V_HAM,mode        HAM bit uitzetten
          ori.w     #$0080,mode         HALFBRITE bit aanzetten
          move.l    Screen1,a0
          move.w    mode,sc_ViewPort+vp_Modes(a0)   In de ViewPort zetten
          CALLINT   RemakeDisplay       Nieuwe waarde gebruiken
          bra       lezen
kleuren   tst.b     bmhdok
          beq       geenbmhd
          move.l    buffer+4,d7
          divs      #3,d7               aantal kleuren is rgb/3
          move.b    d7,aantkleur
          subq      #1,d7
          moveq.b   #3,d3
          lea       kleurbuff,a2        pointer naar kleurenbuffer
nogeen    bsr       readx
          bmi       leesfout
          move.b    buffer,d4           roodwaarde
          and.b     #$f0,d4             alleen 4 LSB bits nodig
          asl       #4,d4               4 bits opschuiven voor eindkleur
          move.b    buffer+1,d5         groenwaarde
          ext.w     d5
          and.w     #$f0,d5             alleen 4 LSB bits nodig
          clr.w     d6
          move.b    buffer+2,d6         blauwwaarde
          andi.b    #$f0,d6             alleen 4 LSB bits nodig
          asr.w     #4,d6               4 bits opschuiven voor eindkleur
          add.w     d5,d4
          add.w     d6,d4               eindkleur samenstellen en in buffer
          move.w    d4,(a2)+            zetten
          dbra      d7,nogeen           volgende kleur
          move.l    Screen1,a0
          lea       sc_ViewPort(a0),a0
          lea       kleurbuff,a1
          move.b    aantkleur,d0
          CALLGRAF  LoadRGB4            kleuren activeren
          bra       lezen               volgende CHUNK
planes    tst.b     bmhdok
          beq       geenbmhd
          move.l    buffer+4,d0
          move.l    d0,bodylengte       lengte van de body
          move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
          CALLEXEC  AllocMem            geheugen voor body reserveren
          move.l    d0,a4               bodypointer
          move.l    d0,bodymemory
          beq       geenmemory
          move.l    filehandle,d1       body in geheugen kopiëren
          move.l    a4,d2
          move.l    bodylengte,d3
          CALLDOS   Read
          bmi       leesfout
          move.l    Screen1,a0
          lea       sc_RastPort(a0),a0
          move.l    rp_BitMap(a0),a0
          lea       bm_Planes(a0),a0    plane-pointer
          lea       plane0,a1           planebuffer
          move.w    diepte,d1
          subq.w    #1,d1
nextpl    move.l    (a0)+,(a1)+         alle plane-pointers lezen
          dbra      d1,nextpl
          tst.b     mask                is er masking ?
          beq.s     makebody
          move.l    a1,-(sp)  
          move.w    hoogte,d0
          move.w    breedte,d1
          muls      d1,d0               plane geheugen berekenen
          move.l    d0,plbytes
          move.l    #MEMF_CHIP!MEMF_CLEAR!MEMF_PUBLIC,d1
          CALLEXEC  AllocMem            geheugen voor masking plane reserveren
          move.l    (sp)+,a1
          tst.l     d0
          beq       geenmemory
          move.l    d0,(a1)             plane-pointer toevoegen
          move.l    d0,MijnPlane
          move.w    diepte,d0
          addq.w    #1,d0               diepte teller 1 verhogen vanwege
          move.w    d0,diepte           extra plane
makebody  tst.b     compress
          bne.s     comprim             is het gecomprimeerd
          move.w    hoogte,d4           hoogteteller
          subq.w    #1,d4
          clr.w     d6                  teller voor screengeheugen
          lea       plane0,a3           eerste plane
          move.w    bytes,d3            bytes per regel
          move.w    diepte,d7           diepte
          subq.w    #1,d7
loop1     movea.l   a3,a2               pointer naar eerste plane
          move.w    d7,d5               diepte teller initialiseren
loop2     move.l    d6,d2               juiste screengeheugen aanwijzen
          add.l     (a2)+,d2            pointer naar volgende plane
          bsr       mijnread            regel inlezen
          dbra      d5,loop2            volgende plane
          add.w     d3,d6               screengeheugen teller ophogen
          dbra      d4,loop1            volgende regel
          bra       lezen               volgende CHUNK
comprim   cmp.b     #1,compress         is het byterun1-algoritme
          bne       geencode            onbekend algoritme
          move.w    hoogte,d4           hoogteteller
          subq.w    #1,d4
          clr.w     d6                  teller voor screengeheugen
          subq.w    #1,diepte           diepte
floop1    lea       plane0,a2           pointer naar eerste plane
          move.w    diepte,d5           diepte teller initialiseren
floop2    move.l    d6,a3               juiste screengeheugen aanwijzen
          add.l     (a2)+,a3            pointer naar volgende plane
          clr.l     d7                  byte teller op 0
while     move.l    #buffer,d2          1 byte in buffer inlezen
          move.w    #1,d3
          bsr       mijnread
          move.b    buffer,d1
          move.w    d1,codeb
          cmpi.w    #128,d1             indien gelijk aan 128
          beq.s     wend                volgende byte lezen
          bgt.s     herhaal             herhaal volgende byte 257-n maal
          move.l    a3,d2               pointer naar plane
          add.l     d7,d2               aantal gelezen bytes verder
          add.w     codeb,d3            codeb + 1 bytes lezen
          bsr       mijnread
          add.w     d3,d7               byte teller ophogen
          cmp.w     bytes,d7            is de regel al vol ?
          blt.s     while               
          bra.s     floop2end 
herhaal   bsr       mijnread            1 byte lezen
          move.b    buffer,d1           indien nul verder springen, want
          beq.s     verder              het scherm is al gevuld met nullen
          move.l    a3,a5               pointer naar plane
          add.l     d7,a5               aantal gelezen bytes optellen
          move.w    #256,d3             257 - codeb maal herhalen
          sub.w     codeb,d3
loop3     move.b    d1,(a5)+
          dbra      d3,loop3
verder    sub.w     codeb,d7            byte teller ophogen
          addi.w    #257,d7
wend      cmp.w     bytes,d7            is de regel al vol ?
          blt.s     while
floop2end dbra      d5,floop2           is de diepte bereikt ?
floop1end add.w     bytes,d6            zet de screen-pointer 1 regel verder
          dbra      d4,floop1           totdat alle regels zijn geweest
          bra       lezen
wachten   move.l    filehandle,d1
          CALLDOS   Close               file sluiten
          clr.l     filehandle
          move.l    Screen1,a0
          CALLINT   ScreenToFront       screen naar voren halen
          move.w    #32,$DFF000+dmacon  pointer uitzetten
          move.l    Window1,a0
          move.l    wd_UserPort(a0),a0
          move.b    MP_SIGBIT(a0),d1
          moveq.l   #1,d0
          lsl.l     d1,d0
          CALLEXEC  Wait                wacht op een signaal
          bra       allesok
readx     move.l    filehandle,d1
          move.l    #buffer,d2
          CALLDOS   Read
          rts
mijnread  move.w    d3,d0
          subq.w    #1,d0
          move.l    d2,a1
readloop  move.b    (a4)+,(a1)+
          dbra      d0,readloop
          clr.w     d1
          rts
geennaam  lea       textnaam,a2
          bra.s     print
geenlib   lea       textlib,a2
          bra.s     print
geenfile  lea       textfile,a2
          bra.s     print
geeniff   lea       textiff,a2
          bra.s     print
geenilbm  lea       textilbm,a2
          bra.s     print
geenbmhd  lea       textbmhd,a2
          bra.s     print
leesfout  lea       textfout,a2
          bra.s     print
tediep    lea       textdiep,a2
          bra.s     print
geenscreen lea      textscr,a2
          bra.s     print
geenwindow lea      textwind,a2
          bra.s     print
geencode  lea       textcode,a2
          bra.s     print
geenmemory lea      textmem,a2
print     move.l    a2,a3               pointer naar tekst
          clr.l     d3                  teller initialiseren
pluslet   addq.l    #1,d3               teller ophogen
          tst.b     (a3)+               is dit het laatste teken ?
          bne.s     pluslet             nee, nog meer
          move.l    a2,d2               
          move.b    #10,-1(a2,d3)       return toevoegen
          CALLDOS   Output
          move.l    d0,d1
          jsr       _LVOWrite(a6)       tekst uitvoeren
allesok   move.l    bodymemory,a1
          cmp.l     #0,a1               is er geheugen gereserveerd ?
          beq.s     wegplane
          move.l    bodylengte,d0       geheugen vrijgeven
          CALLEXEC  FreeMem
wegplane  move.l    MijnPlane,a1        is er een masking plane ?
          cmp.l     #0,a1
          beq.s     wegfile
          move.l    plbytes,d0          geheugen vrijgeven
          CALLEXEC  FreeMem
wegfile   move.l    filehandle,d1       is de file open ?
          tst.l     d1
          beq.s     wegwindow
          CALLDOS   Close               file sluiten
wegwindow move.l    Window1,a0          is er een window ?
          cmp.l     #0,a0
          beq.s     wegscreen
          CALLINT   CloseWindow         window sluiten
wegscreen move.l    Screen1,a0
          cmp.l     #0,a0               is er een screen ?
          beq.s     weggfx
          CALLINT   CloseScreen         screen sluiten
weggfx    move.l    _GfxBase,a1
          cmp.l     #0,a1               is de graphics.library geopend ?
          beq.s     wegint
          CALLEXEC  CloseLibrary        library sluiten
wegint    move.l    _IntuitionBase,a1
          cmp.l     #0,a1               is de intuition.library geopend ?
          beq.s     wegdos
          CALLEXEC  CloseLibrary        library sluiten
wegdos    move.l    _DOSBase,a1
          cmp.l     #0,a1               is de dos.library geopend ?
          beq.s     einde
          CALLEXEC  CloseLibrary        library sluiten
einde     rts                           einde
          
filehandle dc.l     0
bodymemory dc.l     0
bodylengte dc.l     0
plbytes   dc.l      0
Screen1   dc.l      0
Window1   dc.l      0
MijnPlane dc.l      0
_IntuitionBase dc.l 0
_GfxBase  dc.l      0
_DOSBase  dc.l      0
plane0    dcb.l     7,0
breedte   dc.w      0
hoogte    dc.w      0
diepte    dc.w      0
mode      dc.w      0
bytes     dc.w      0
codeb     dc.w      0
br        dc.w      0
ho        dc.w      0
kleurbuff dcb.w     64,0
compress  dc.b      0
bmhdok    dc.b      0
error     dc.b      0
mask      dc.b      0
MijnScreen ds.b     ns_SIZEOF
MijnWindow ds.b     nw_SIZE
aantkleur dc.b      0
          even
buffer    dcb.b     20,0
intname   INTNAME
grafname  GRAFNAME
dosname   DOSNAME
textfile  dc.b      'Kan file niet openen',0
textiff   dc.b      'Dit is geen IFF-file',0
textilbm  dc.b      'Dit is geen ILBM-file',0
textbmhd  dc.b      'Waar is de BitMapHeader ?',0
textdiep  dc.b      'Er zijn te veel BitPlanes',0
textscr   dc.b      'Kan screen niet openen',0
textwind  dc.b      'Kan window niet openen',0
textcode  dc.b      'Onbekende codering',0
textfout  dc.b      'Er is een leesfout',0
textlib   dc.b      'Kan library niet openen',0
textmem   dc.b      'Geen geheugen genoeg',0
textnaam  dc.b      12,27,'[32m',27,'[41m',27,'[1m'
          dc.b      'IFF Versie 1.3        januari 199O        Public Domain',10
          dc.b      '                                                       ',10
          dc.b      'Tips (bijv. over colorcycling) naar:                   ',10
          dc.b      '                                             ____      ',10
          dc.b      'Arthur Pijpers                      /\      /    \     ',10
          dc.b      '2e Scheepvaartstraat 24            /  \    /     /     ',10
          dc.b      '3151 NP Hoek van Holland          /ŻŻŻŻ\  /\____/      ',10
          dc.b      'Nederland                        /      \/             ',10
          dc.b      '                                                       ',10
          dc.b      'Gebruik: IFF [ILBMfile]                                ',10
          dc.b      '                                                       ',10
          dc.b      'Scherm sluiten door op een muisknop of toets te drukken'
          dc.b      27,'[40m',27,'[0m',10,0
          even

