&&
------------------------------------------------------------------------------
                  CURSUS ASSEMBLER  -  FADEINOUTTYPE DEEL 1
------------------------------------------------------------------------------

FadeInOutType is een programma waarmee u een tekst in het CLI-scherm kunt af-
drukken. Het scherm wordt daarbij even donker tijdens het eigenlijke printen.

Het programma heeft twee verschillende manieren waarop het de tekst zichtbaar
kan maken. De eerste is de normale manier :

Het scherm wordt donker en de tekst wordt afgedrukt. Als de tekst op het
scherm staat krijgt het scherm weer de oorspronkelijke kleuren terug. De over-
gangen zijn daarbij langzaam.

De tweede versie laat eerst alle kleuren naar wit verschuiven om daarna pas
het scherm zwart te maken. Op dezelfde manier komen de kleuren weer terug als
de tekst op het scherm staat.

De aanroep is de volgende :

FIT <TekstFile> [w]

Daarbij is w de optie waarbij de tweede manier wordt gekozen. Is deze niet
aanwezig dan wordt de eerste manier gebruikt.

Het programma is weer voorzien van het nodige commentaar.
&&
; Als eerste de library-routines.

; 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.
&&
; Als eerste moeten we kijken of er na FIT ook een filenaam staat en of de
; letter w aanwezig is.

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 wordt 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.

; Nu moet de filenaam in een buffer worden gezet.

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.

; De diverse libraries openen.

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.

; De originele kleuren moeten worden opgeslagen in een buffer.

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.

; De diverse routines die de kleuren naar zwart laat schuiven.

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

; Tussen elke overgang wachten we 2 vijftigste van een sekonde. U kunt deze
; tijd veranderen door de tijd-waarde aan te passen.

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.
&&
; Nu lezen we het file in de tekst-buffer.

       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.

; We lezen alle tekens in de buffer, maar pas vanaf de tweede positie. In de
; eerste positie zetten we een 12, scherm schoon. Dat doen we achteraan in het
; programma bij de reservering van de buffer.

       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.


De rest van de tekst staat in het tweede deel.





















- EINDE DEEL 1 ---------------------------------------------------------------
&&
