; Exec.Library Offsets !

ExecBase=           4                  ; Vektor naar de Exec.library.
CloseLibrary=       -414               ; Sluiten van library.
OpenLibrary=        -552               ; Openen van library.

; DOS.Library Offsets !

Open=               -30                ; Open een file.
Close=              -36                ; Sluit een file.
Read=               -42                ; Lezen vanuit een file.
Write=              -48                ; Schrijven naar een file.
Output=             -60                ; Uitvoer van tekst.
Delay=              -198               ; Wacht een aantal jiffies.

Mode_old=           1005               ; Type-aanduiding OUD FILE.

; Graphics.Library Offsets !

GetRGB4=            -582               ; Lees de kleuren uit window.
SetRGB4=            -288               ; Schrijf de kleuren in window.

PRGStart:
       move.l  a0,ParaMPointer         ; Pointer naar het volgende teken.
       move.l  d0,ParaMLength          ; Aantal tekens dat aanwezig is.
       sub.l   #1,d0                   ; Zijn er wel tekens?
       beq     Information             ; NEE, dan informatie geven.

       sub.l   #2,d0                   ; Als het een na laatste teken geen
       add.l   d0,a0                   ; spatie is dan werd de white-option
       cmp.b   #" ",(a0)+              ; niet gekozen. We gaan normaal verder
       bne     Copy                    ; met het afdrukken.

       cmp.b   #"w",(a0)               ; testen of white-option gekozen is.
       bne     Copy                    ; Nee.
       jsr     White                   ; Ja, de kleuren aanpassen.

Copy:
       add.l   #2,d0                   ; Teken-pointer 2 ophogen.
       move.l  ParaMPointer,a0         ; Teken-pointer naar A0.
       lea     FileName,a1             ; Filenaam-buffer naar A1.

CopyFileName:
       move.b  (a0)+,(a1)+             ; Kopieeren van de filenaam naar de
       dbra    d0,CopyFileName         ; Filenaam-buffer.

       lea     FileName,a1             ; FileName naar A1.
       move.l  ParaMLength,d0          ; Lengte naar D0.
       cmp.l   #$12345678,WhiteCode    ; Is white-option gekozen?
       bne     ContCopy                ; Nee, filenaam kopieeren.
       sub.l   #2,d0                   ; Ja, de lengte min 2.

ContCopy:
       sub.l   #1,d0                   ; d0=d0-1
       add.l   d0,a1                   ; A1 op einde van de parameters.
       move.b  #0,(a1)                 ; 0 Achter de filenaam zetten.
       move.l  ExecBase,a6             ; ExecBase naar A6.
       lea     DosName,a1              ; "dos.library".
       clr.l   d0                      ; Versie is onbelangrijk.
       jsr     OpenLibrary(a6)         ; Dos.Library openen.
       move.l  d0,DosBase              ; Pointer naar library opslaan.
       beq     End                     ; Fout, dan stoppen.

       lea     GraphicsName,a1         ; "graphics.library".
       clr.l   d0                      ; Versie is onbelangrijk.
       jsr     OpenLibrary(a6)         ; Graphics.Library openen.
       move.l  d0,GraphicsBase         ; Pointer naar library opslaan.
       beq     Dos_Sluiten             ; Fout, dan stoppen.

       move.l  GraphicsBase,a6         ; GraphicsBase naar A6.
       move.l  34(a6),a1               ; View naar A1.
       move.l  (a1),a0                 ; ViewPort naar A0.
       move.l  a0,ViewPort             ; De ViewPort opslaan.
       move.l  4(a0),a1                ; ColorMap naar A1.
       move.l  a1,ColorMap             ; De ColorMap opslaan.
       lea     ChanColArea+6,a4        ; Adr.ChangeColorArea+6 naar A1.
       lea     ColorMemory+6,a5        ; Adr.ColorMemory+6 naar A2.
       move.l  #3,d2                   ; 4 Keer de lus door lopen.

SaveColors:
       move.l  ColorMap,a0              ; ColorMap naar A0.
       move.l  d2,d0                    ; Farbregister naar D0.
       jsr     GetRGB4(a6)              ; GetRGB4
       move.w  d0,(a5)                  ; Kleurwaarde opslaan.
       move.w  d0,(a4)                  ; Kleurwaarde in tabel zetten.
       sub.l   #2,a4                    ; Tabel-pointer omlaag.
       sub.l   #2,a5                    ; Andere Tabel-pointer ook omlaag.
       dbra    d2,SaveColors            ; Einde van de lus. (4 keer).

       cmp.l   #$12345678,WhiteCode     ; Werd white-option gekozen?
       bne     FadeOut                  ; Nee, dan normale FadeOut.
       jsr     FadeWhite                ; Ja, dan speciale FadeOut.

FadeOut:
       lea     ChanColArea,a0           ; A0 naar de kleurentabel zetten.
       moveq   #15,d5                   ; 16 Keer de lus door lopen.

FadeOutLoop:
       move.l  a0,a1                    ; A0 even opslaan.
       moveq   #3,d6                    ; 4 Keer de lus.

Blauw1:
       move.w  (a1),d7                  ; Byte voor de blauw-waarde.
       andi.w  #$000f,d7                ; Isoleren.
       cmp.w   #0,d7                    ; Al 0 ?
       beq     Groen1                   ; Nee, dan 1 minder.
       jsr     BlauwDecr

Groen1:
       move.w  (a1),d7                  ; Byte voor de groen-waarde.
       andi.w  #$00f0,d7                ; Isoleren.
       cmp.w   #0,d7                    ; Al 0 ?
       beq     Rood1                    ; Nee, dan 1 minder.
       jsr     GroenDecr

Rood1:
       move.w  (a1),d7                  ; Byte voor de rood-waarde.
       andi.w  #$0f00,d7                ; Isoleren.
       cmp.w   #0,d7                    ; Al 0 ?
       beq     ContFadeOut              ; Nee, dan 1 minder.
       jsr     RoodDecr

ContFadeOut:
       add.l   #2,a1                    ; A1 naar de volgende tabel-waarde.
       dbra    d6,Blauw1                ; Einde binnenste lus.

       movem.l a0-a6/d0-d7,-(a7)        ; Registers opslaan.
       move.l  GraphicsBase,a6
       jsr     WriteColorMap

       move.l  DosBase,a6               ; DosBase naar A6.
       move.l  #2,d1                    ; Wacht-waarde op 2 50e sekonde.
       jsr     Delay(a6)                ; Wachten.
       movem.l (a7)+,a0-a6/d0-d7        ; Registers weer terug zetten.
       dbra    d5,FadeOutLoop           ; Einde buitenste lus.

       move.l  DosBase,a6               ; DosBase naar A6.
       move.l  #FileName,d1             ; Filenaam-adres naar D1.
       move.l  #Mode_old,d2             ; Mode: OUD FILE.
       jsr     Open(a6)                 ; File openen,
       move.l  d0,FileHandle            ; File-pointer opslaan.

       beq     FW                       ; File-Fout. Stoppen.
       move.l  FileHandle,d1            ; FileHandle naar D1.
       move.l  #TussenOpslag+1,d2       ; Tussenopslag-buffer-pointer naar D2.
       move.l  #80*29,d3                ; max. 80*29 karakters lezen.
       jsr     Read(a6)                 ; File lezen.
       move.l  d0,FileLength            ; Aantal gelezen karakters opslaan.
       add.l   #1,FileLength            ; Plus 1 om de CLR ook af te drukken.
       jsr     Output(a6)               ; Uitvoer naar de CLI.
       move.l  d0,d1                    ; Venster-pointer naar D1.
       move.l  #TussenOpslag,d2         ; Adres van de Tussenopslag-buffer.
       move.l  FileLength,d3            ; File-lengte naar D3.
       jsr     Write(a6)                ; File afdrukken op het venster.

       move.l  FileHandle,d1            ; FileHandle naar D1.
       jsr     Close(a6)                ; File sluiten.

FW:
       cmp.l   #$12345678,WhiteCode     ; Werd white-option gekozen?
       bne     FadeIn                   ; Nee, normaal terugzetten.
       jsr     FadeWhite                ; Ja, met effect terugzetten.

FadeIn:
       lea     ChanColArea,a0           ; Kleurentabel naar A0.
       lea     ColorMemory,a2           ; Tabel van de opgeslagen oude waarde.
       moveq   #15,d5                   ; 16 Keer.

FadeInLoop:
       move.l  a0,a1                    ; A0 tussenopslaan.
       move.l  a2,a3                    ; A2 tussenopslaan.
       moveq   #3,d6                    ; 4 Keer lus doorlopen.

Blauw2:
       move.w  (a1),d7                  ; Byte voor de blauw-waarde.
       andi.w  #$000f,d7                ;
       move.w  (a3),d4                  ;
       andi.w  #$000f,d4                ;
       cmp.w   d4,d7                    ; Al wat die moet zijn?
       beq     Groen2                   ; Ja, verder.
       cmp.l   #$12345678,WhiteCode     ; Nee, verder met de volgende.
       bne     BIn                      ;
       jsr     BlauwDecr                ; Waarde verminderen.
       jmp     Groen2                   ; of
BIn:   jsr     BlauwIncr                ; Waarde verhogen.

Groen2:
       move.w  (a1),d7                  ; Buye voor de groen-waarde.
       andi.w  #$00f0,d7                ;
       move.w  (a3),d4                  ;
       andi.w  #$00f0,d4                ;
       cmp.w   d4,d7                    ;
       beq     Rood2                    ;
       cmp.l   #$12345678,WhiteCode     ;
       bne     GIn                      ;
       jsr     GroenDecr                ;
       jmp     Rood2                    ;
GIn:   jsr     GroenIncr                ;

Rood2:
       move.w  (a1),d7                  ; Byte voor de rood-waarde.
       andi.w  #$0f00,d7                ;
       move.w  (a3),d4                  ;
       andi.w  #$0f00,d4                ;
       cmp.w   d4,d7                    ;
       beq     ContFadeIn               ;
       cmp.l   #$12345678,WhiteCode     ;
       bne     RIn                      ;
       jsr     RoodDecr                 ;
       jmp     ContFadeIn               ;
RIn:   jsr     RoodIncr                 ;

ContFadeIn:
       add.l   #2,a1                    ; A1 naar de volgende tabel-waarde.
       add.l   #2,a3                    ; A2 naar de volgende tabel-waarde.
       dbra    d6,Blauw2                ; Einde binnenste lus.
       movem.l a0-a6/d0-d7,-(a7)        ; Registers redden.
       move.l  GraphicsBase,a6          ; GraphicsBase naar A6.
       jsr     WriteColorMap            ; Kleuren-tabel naar ColorMap.
       move.l  DosBase,a6               ; DosBase naar A6.
       move.l  #2,d1                    ; Tijd 2 50e sekonde.
       jsr     Delay(a6)                ; Wachten.
       movem.l (a7)+,a0-a6/d0-d7        ; Registers terugzetten.
       dbra    d5,FadeInLoop            ; Einde buitenste lus.

Graphics_Sluiten:
       move.l  ExecBase,a6              ; ExecBase naar A6.
       move.l  GraphicsBase,a1          ; GraphicsBase naar A1.
       jsr     CloseLibrary(a6)         ; Graphics.Library Sluiten.
Dos_Sluiten:
       move.l  DosBase,a1               ; DosBase naar A1.
       jsr     CloseLibrary(a6)         ; Dos.Library Sluiten.
End:
       clr.l   d0                       ; D0 wissen.
       rts                              ; Einde.

BlauwIncr:
       add.w   #1,(a1)                  ; Blauw-Waarde verhogen.
       rts

GroenIncr:
       add.w   #16,(a1)                 ; Groen-Waarde verhogen.
       rts

RoodIncr:
       add.w   #256,(a1)                ; Rood-Waarde verhogen.
       rts

BlauwDecr:
       sub.w   #1,(a1)                  ; Blauw-Waarde verlagen.
       rts

GroenDecr:
       sub.w   #16,(a1)                 ; Groen-Waarde verlagen.
       rts

RoodDecr:
       sub.w   #256,(a1)                ; Rood-Waarde verlagen.
       rts

FadeWhite:
       lea     ChanColArea,a0           ; A0 naar de tabel laten wijzen.
       moveq   #15,d5                   ; 16 Keer lus doorlopen.

FadeWhiteLoop:
       move.l  a0,a1                    ; A0 even opslaan.
       moveq   #3,d6                    ; 4 Keer 2e lus.

WhiteBlauw:
       move.w  (a1),d7                  ; Byte voor de blauw-waarde.
       andi.w  #$000f,d7                ; Isoleren.
       cmp.w   #$f,d7                   ; Al $F ?
       beq     WhiteGroen               ; Ja, dan verder.
       jsr     BlauwIncr

WhiteGroen:
       move.w  (a1),d7                  ; Byte voor de groen-waarde.
       andi.w  #$00f0,d7                ;
       cmp.w   #$f0,d7                  ;
       beq     WhiteRood                ;
       jsr     GroenIncr

WhiteRood:
       move.w  (a1),d7                  ; Byte voor de rood-waarde.
       andi.w  #$0f00,d7                ;
       cmp.w   #$f00,d7                 ;
       beq     WhiteContFadeOut         ;
       jsr     RoodIncr

WhiteContFadeOut:
       add.l   #2,a1                    ; A1 op de volgende kleur-waarde.
                                        ; In tabel zetten.
       dbra    d6,WhiteBlauw            ; Einde binnenste lus.

       movem.l a0-a6/d0-d7,-(a7)        ; Registers redden.
       move.l  GraphicsBase,a6          ; GraphicsBase naar A6.
       jsr     WriteColorMap            ; ColorMap beschrijven.

       move.l  DosBase,a6               ; DosBase naar A6.
       move.l  #2,d1                    ; Tijd 2 50e sekonde.
       jsr     Delay(a6)                ; Wachten.
       movem.l (a7)+,a0-a6/d0-d7        ; Registers terug zetten.
       dbra    d5,FadeWhiteLoop         ; Einde buitenste lus.
       rts

Information:
       move.l  ExecBase,a6              ; ExecBase naar A6.
       lea     DosName,a1               ; "dos.library".
       jsr     OpenLibrary(a6)          ; Dos.Library openen.
       move.l  d0,DosBase               ; Pointer naar library opslaan.
       beq     End                      ; Fout, dan stoppen.

       move.l  DosBase,a6               ; DosBase naar A6.
       jsr     Output(a6)               ; Uitvoer naar de CLI.
       move.l  d0,d1                    ; Window-pointer opslaan.
       move.l  #InfTxt,d2               ; Adres van de informatie-tekst.
       move.l  #InfTxtEnd-InfTxt,d3     ; Lengte van de tekst.
       jsr     Write(a6)                ; Printen van de tekst.
       move.l  ExecBase,a6              ; ExecBase naar A6.
       jsr     Dos_Sluiten              ; Dos.library sluiten.
       rts                              ; Einde programma.

WriteColorMap:
       lea     ChanColArea+6,a3         ; Adres van de kleurentabel naar A3.
       move.l  #3,d4                    ; 4 Keer door de lus.
WCMLoop:
       move.l  ViewPort,a0              ; Viewport naar A0.
       move.l  d4,d0                    ; Kleurregister naar D0.

       move.w  (a3),d5
       lsr.w   #8,d5
       move.b  d5,d1                    ; Rood-Waarde naar D1.

       move.w  (a3),d5
       lsr.w   #4,d5
       move.b  d5,d2                    ; Groen-Waarde naar D2.

       move.w  (a3),d5
       move.b  d5,d3                    ; Blauw-Waarde naar D3.

       jsr     SetRGB4(a6)              ; In de ColorMap zetten.

       sub.l   #2,a3                    ; Pointer 1 kleur omlaag = 2 bytes.
       dbra    d4,WCMLoop               ; Einde lus.
       rts                              ;

White:
       move.l  #$12345678,WhiteCode     ; Vlag voor white-option zetten.
       sub.l   #2,d0                    ; D0 corrigeren.
       rts                              ;

; Variabelen

GraphicsName:  dc.b       "graphics.library",0
even
GraphicsBase:  blk.l       1,0
DosName:       dc.b       "dos.library",0
even
DosBase:       blk.l       1,0
ColorMap:      blk.l       1,0
ColorMemory:   blk.w       4,0
ChanColArea:   blk.w       4,0
ParaMPointer:  blk.l       1,0
ParaMLength:   blk.l       1,0
ViewPort:      blk.l       1,0
WhiteCode:     blk.l       1,0
FileLength:    blk.l       1,0
FileHandle:    blk.l       1,0
FileName:      blk.b       100,0
even
InfTxt:        dc.b       10,13         ; De informatie-tekst.
               dc.b       $9b,"1;31;40mF"
               dc.b       $9b,"1;32;40mI"
               dc.b       $9b,"1;33;40mT"
               dc.b       $9b,"1;31;40m 1.1"
               dc.b       $9b,"0;31;40m - "
               dc.b       $9b,"0;31;40mFade"
               dc.b       $9b,"0;32;40mIn"
               dc.b       $9b,"0;33;40mType "
               dc.b       $9b,"0;31;40mVersion 1.1",10,10,13
               dc.b       $9b,"0;31;40mUSAGE: FIT <Filename> [w]",10
               dc.b       10,10,13,0
InfTxtEnd:
even
TussenOpslag:  dc.b       12            ; Een Clear-Screen-karakter.
               blk.b       80*29,0      ; Tekstbuffer.
PRGEnd:
