;
;------ graphics.library ------
;
Text                 = -30 - 30
InitRastPort         = -30 -168
SetAPen              = -30 -312
InitBitMap           = -30 -360
ScrollRaster         = -30 -366
;
;-------- exec.library --------
;
ExecBase             =        4
;
Forbid               = -30 -102
Permit               = -30 -108
AllocMem             = -30 -168
FreeMem              = -30 -180
OldOpenLibrary       = -30 -378
CloseLibrary         = -30 -384
;
;------------------------------
;
Start:   move.l   ExecBase,a6       ; Pointer naar Exec.library.
         lea      GFXName,a1        ; Naam van de Graphics.library.
         jsr      OldOpenLibrary(a6) ; Open de graphics.library.
         move.l   d0,GFXBase        ; Sla de pointer op.
         beq.l    No_GFXBase        ; Geen library gevonden ???

         move.l   ExecBase,a6       ; Pointer naar de Exec.library.
         move.l   #400*300/8,d0     ; Aantal bytes reserveren voor 2 bit-
         mulu     #2,d0             ;    Planes.
         move.l   #$10002,d1        ; Het moet CHIP-MEM zijn.
         jsr      AllocMem(a6)      ; Reserveer geheugen.
         move.l   d0,bit_Adress     ; Sla het adres daarvan op.
         beq.l    No_BitMap         ; Geen geheugen gevonden ???

         move.l   bit_Adress,d0     ; Geheugenadres naar d0.
         move.l   d0,d1             ; Ook naar d1.
         add.l    #400*300/8,d1     ; 1 BitPlane verder in d1.
         move.w   d0,P1Lo           ; 1e Low-woord van Plane 1.
         move.w   d1,P2Lo           ; 1e Low-woord van Plane 2.
         swap     d0                ; Verwissel Hi en Lo.
         swap     d1                ; Verwissel Hi en Lo.
         move.w   d0,P1Hi           ; 2e High-woord van Plane 1.
         move.w   d1,P2Hi           ; 2e High-woord van Plane 2.

         move.l   #CopSize+2,d0     ; CopperLijst-lengte plus 2.
         move.l   #$10002,d1        ; Het moet CHIP-MEN zijn.
         jsr      AllocMem(a6)      ; Reserveer geheugen.
         move.l   d0,Cop_Adress     ; Sla het adres daarvan op.
         beq.l    No_Copper         ; Geen geheugen gevonden ???

         move.l   GFXBase,a6        ; Pointer naar de Graphics.library.
         lea      bitMap,a0         ; Adres van de BitMap-struktuur.
         move.b   #2,d0             ; 2 BitPlanes, dus 4 kleuren.
         move.w   #400,d1           ; Breedte is 400 punten.
         move.w   #300,d2           ; Hoogte is 300 punten.
         jsr      InitBitMap(a6)    ; Initialiseer de BitMap-struktuur.

         move.l   bit_Adress,a0     ; Zet adres van BitMap in a0.
         move.l   a0,a1             ; Ook in a1.
         add.l    #400*300/8,a1     ; Bereken het 2e bitPlane in a1.
         move.l   a0,Plane1         ; Start Plane 1.
         move.l   a1,Plane2         ; Start Plane 2.

         lea      RastPort,a1       ; Adres van de RastPort-struktuur.
         jsr      InitRastPort(a6)  ; Initialiseer de RastPort-struktuur.
         move.l   #bitMap,R_BitMap  ; BitMap-pointer in de RastPort zetten.

Copy_Copper:
         move.l   #Copper,a0        ; Het adres van de nieuwe CopperLijst. 
         move.l   Cop_Adress,a1     ; Het gereserveerde geheugen voor de
                                    ; CopperLijst.
         move.w   #CopSize-1,d0     ; Lengte van de nieuwe CopperLijst.
CoLoop:  move.b   (a0)+,(a1)+       ; Verplaatsen.
         dbf      d0,CoLoop         ; Totdat alles gedaan is.

         move.l   #ScrollText,Text_Ptr ; De plaats van de tekst.

         move.l   ExecBase,a6       ; Adres van de Exec.library.
         jsr      Forbid(a6)        ; STOP alle Tasks.

         move.l   GFXBase,a0        ; Adres van de Graphics.library.
         move.w   #$4000,$dff09a    ; STOP de Interrupts.
         move.w   #$0080,$dff096    ; STOP de Copper.
         move.l   $6c,OldIrq        ; Sla de Interrupt-vektor op.
         move.l   #Interrupt,$6c    ; Zet de nieuwe Interrupt-vektor.
         move.l   50(a0),OldCopper  ; Sla de Copper-vektor op.
         move.l   Cop_Adress,50(a0) ; Zet de nieuwe Copper0vektor.
         move.w   #$86c0,$dff096    ; START de Copper.
         move.w   #$c000,$dff09a    ; START de Interrupts.

Wacht:   btst     #6,$bfe001        ; Wacht op de linker-muisknop.
         beq.s    Stop              ; Ja ???
         btst     #10,$dff016       ; Wacht op de rechter-muisknop.
         bne.s    Wacht             ; Nee ???

Stop:    move.l   GFXBase,a0        ; Adres van de Graphics.library.
         move.w   #$4000,$dff09a    ; STOP Interrupts.
         move.w   #$0080,$dff096    ; STOP Copper.
         move.l   OldIrq,$6c        ; Herstel oude Iterrupt-vektor.
         move.l   OldCopper,50(a0)  ; Herstel oude Copper-vektor.
         move.w   #$8080,$dff096    ; START Copper.
         move.w   #$c000,$dff09a    ; START Interrupts.

         move.l   ExecBase,a6       ; Adres van de Exec.library.
         jsr      Permit(a6)        ; START alle Tasks.

         move.l   ExecBase,a6       ; Adres van de Exec.library.
         move.l   Cop_Adress,a1     ; Adres van het eigen Copper-geheugen.
         move.l   #CopSize+2,d0     ; Het aantal bytes dat dat lang is.
         jsr      FreeMem(a6)       ; Geef het geheugen vrij.
No_Copper:
         move.l   ExecBase,a6       ; Adres van de Exec.library.
         move.l   bit_Adress,a1     ; Adres van het BitMap-geheugen.
         move.l   #400*300/8,d0     ; Het aantal bytes per bitPlane.
         mulu     #2,d0             ; Maal 2.
         jsr      FreeMem(a6)       ; Geef het geheugen vrij.
No_BitMap:
         move.l   ExecBase,a6       ; Adres van de Exec.library.
         move.l   GFXBase,a1        ; Adres van de Graphics.library.
         jsr      CloseLibrary(a6)  ; Sluit de Graphics.library.
No_GFXBase:
         clr.l    d0                ; Moet 0 zijn voor de CLI.
         rts                        ; Einde programma.......

Interrupt:
         move     SR,-(A7)          ; Sla de SR op.
         movem.l  a0-a6/d0-d7,-(A7) ; Sla de rest op.

         bsr.s    Scroll            ; De eigenlijke scroll-routine.

         movem.l  (A7)+,a0-a6/d0-d7 ; Herstel de rest.
         move     (A7)+,SR          ; Herstel de SR.

         dc.w     $4ef9             ; Code voor JMP. Hier achter zetten we
OldIrq:  dc.l     0                 ;    de oude Interrupt-vektor neer.

Scroll:  btst     #14,$dff002       ; Wacht op de Blitter.
         bne.s    Scroll            ; Nog niet ???
         move.l   bit_Adress,a0     ; Adres van de BitMap.
         add.l    #48*121,a0        ; Tel er 48*121 woorden bij op.
         move.l   a0,a1             ;
         move.l   a0,a2             ;
         add.l    #400*300/8,a2     ; En zoek het 2e BitPlane.
         move.l   a2,a3             ;
         sub.l    #$00000002,a1     ; 2 Bytes er af.
         sub.l    #$00000002,a3     ; 2 Bytes er af.
         move.l   a0,$dff050        ; Plane 1 Blitter-Source a
         move.l   a1,$dff054        ; Plane 1 Blitter-Destination b
         move.l   #$00000000,$dff064 ; Modulo source a destination b
         move.l   #$f9f00000,$dff040 ; Controlle-Byte Blitter.
         move.l   #$ffffffff,$dff044 ; Masker voor de Blitter-funktie.
         move.w   #$0512,$dff058    ; Blitter-maat.
         move.l   a2,$dff050
         move.l   a3,$dff054
         move.l   #$00000000,$dff064
         move.l   #$f9f00000,$dff040
         move.l   #$ffffffff,$dff044
         move.w   #$0512,$dff058 
         move.w   #0,CursorX        ; Zet de X-positie.
         move.w   #123,CursorY      ; Zet de Y-positie.
         move.l   GFXBase,a6        ; Adres van de Graphics.library.
         lea      RastPort,a1       ; Adres van de RastPort.
         lea      Text2,a0          ; Adres van Tekst 2.
         move.w   #$0003,d0         ; Slechts 1 letter.
         jsr      Text(a6)          ; En printen die tekst.
         subi.b   #$0001,distance   ; Klaar met alle letters ?
         bne.s    End_Scroll        ; Nee ???
         move.w   #374,CursorX      ; Zet X-positie.
         move.w   #123,CursorY      ; Zet Y-positie.
         move.l   GFXBase,a6        ; Adres van de Graphics.library.
         lea      RastPort,a1       ; Adres van de RastPort.
         move.b   #$01,d0           ; Tekst-kleur op 1 zetten.
         jsr      SetAPen(a6)       ; Zet de tekst-kleur.
         lea      RastPort,a1       ; Adres van de RastPort.
         move.l   Text_Ptr,a0       ; Adres van de te printen tekst.
         move.w   #$0001,d0         ; Print slechts 1 letter.
         jsr      Text(a6)          ; Printen.
         move.b   #$09,distance     ; 9 puntjes optellen bij de afstand.
         add.l    #1,Text_Ptr       ; Adres van de volgende letter.
         cmp.l    #TextEnd,Text_Ptr ; Al aan het einde ?
         bne.s    End_Scroll        ; Nee ???
         move.l   #ScrollText,Text_Ptr ; Herstel het tekst-adres.
End_Scroll:
         addi.b   #$01,Speed        ; Snelheid plus 1.
         cmpi.b   #$03,Speed        ; Snelheid is 3 ?
         bne.l    Scroll            ; Nee ???
         clr.b    Speed             ; Snelheid op 0 zetten.
         rts                        ; Einde van deze routine.

GFXName:          dc.b "graphics.library",0
even

GFXBase:          dc.l 0
bit_Adress:       dc.l 0
Cop_Adress:       dc.l 0
Text_Ptr:         dc.l 0
OldCopper:        dc.l 0

distance:         dc.b 0
Speed:            dc.b 0

bitMap:           blk.l 2,0
Plane1:           blk.l 1,0
Plane2:           blk.l 7,0

RastPort:         dc.l 0            ; Adres naar Layer-struktuur.
R_BitMap:         dc.l 0            ;   "    "   BitMap-struktuur.
AereaFill:        dc.l 0            ;   "    "   AreaFill.
Tmp_Ras:          dc.l 0            ;   "    "   TmpRas-struktuur.
AereaInfo:        dc.l 0            ;   "    "   AereaInfo-struktuur.
GelsInfo:         dc.l 0            ;   "    "   GelsInfo-struktuur.
                  dc.b 0            ;
APen:             dc.b 0            ; Kleur voor pen a, letterkleur.
BPen:             dc.b 0            ; Kleur voor pen b, achtergrondkleur.
OPen:             dc.b 0            ; Kleur voor AreaFill.
Z_Modus:          dc.b 0            ; 0 = Jam1.
                                    ; 1 = Jam2.
                                    ; 2 = Complement.
                                    ; 4 = Inverse.
AereaPtsz:        dc.b 0            ; Pointer voor AreaFill.
No_Operat:        dc.b 0
ldpp:             dc.b 0            ; Lijn-patroon.
Controll_Bit:     dc.w 0            ; 1 = first dot
                                    ; 2 = one dot
                                    ; 4 = doublebuffer
LinePtrn:         dc.w 0            ; 16-Bit lijnpatroon.
CursorX:          dc.w 0            ; X-positie van de cursor.
CursorY:          dc.w 0            ; Y-positie van de cursor.
MinTerm:          blk.b 8,0         ; MinTerms.
C_Widgh:          dc.w 0            ; Cursor breedte.
C_Height:         dc.w 0            ; Cursor hoogte.
CPointer:         dc.l 0            ; Adres van de karaktergenerator.
CharModus:        dc.b 0            ; 0 = Normaal.
                                    ; 1 = Onderlijnd.
                                    ; 2 = Vet.
                                    ; 3 = Vet + Onderlijnd.
                                    ; 4 = Kursief.
                                    ; 5 = Kursief + Onderlijnd.
Flags:            dc.b 0            ; ???
CharHight:        dc.w 0            ; Hoogte karakterzet.
CharWidth:        dc.w 0            ; Breedte karakterzet.
TextHeight:       dc.w 0            ; Tekst-hoogte.
CharD:            dc.w 0            ; Karakter-afstand.
UserData:         dc.l 0            ;
                  blk.w 7,0         ;
                  blk.l 2,0         ;
                  blk.b 8,0         ;

Copper:           dc.w $008e,$2c81  ; DIW-Start
                  dc.w $0090,$74f1  ; DIW-stop
                  dc.w $0092,$0028  ; DFF-Start
                  dc.w $0094,$00d8  ; DFF-stop
                  dc.w $00e0        ; Startadres Plane1 -hi-
P1Hi:             dc.w $0000
                  dc.w $00e2        ; Startadres Plane1 -lo-
P1Lo:             dc.w $0000
                  dc.w $00e4        ; Startadres Plane2 -hi-
P2Hi:             dc.w $0000
                  dc.w $00e6        ; Startadres Plane2 -lo-
P2Lo:             dc.w $0000
                  dc.w $0100,$2200  ; 2 Planes.
                  dc.w $0102,$0000  ; Geen scrollen.
                  dc.w $0104,$0000  ; Geen dubbel Playfield.
                  dc.w $0108,$0004  ; Modulo voor Planes.
                  dc.w $010a,$0004  ; Modulo voor Planes.
                  dc.w $0120,$0000  ; Startadres sprite1 -hi-.
                  dc.w $0122,$0000  ; Startadres sprite1 -lo-.
                  dc.w $0180,$0000  ; Color0 Achtergrond= $0000 (zwart).
                  dc.w $0182,$0000  ; Color1 Tekst = $0ccc (grijs).
                  dc.w $0184,$0666  ; Color2 Tekst = $0666 (grijs).
                  dc.w $0186,$0999  ; Color3 Tekst = $0999 (grijs).
                  dc.w $9b07,$fffe  ; Copper Wacht op lijn $9B.
                  dc.w $0180,$0bbb  ; Color0 = $0bbb (grijs).
                  dc.w $9e07,$fffe  ; Copper Wacht op lijn $9E.
                  dc.w $0180,$0888  ; Color0 = $0888 (grijs).
                  dc.w $ab07,$fffe  ; Copper Wacht op lijn $AB.
                  dc.w $0180,$0555  ; Color0 = $0555 (grijs).
                  dc.w $ae07,$fffe  ; Copper Wacht op lijn $AE.
                  dc.w $0180,$0000  ; Color0 = $0000 (zwart).
                  dc.w $ffff,$fffe  ; Copper Einde.
CopEnd:

CopSize = CopEnd - Copper

ScrollText:       dc.b "Hallo daar, dit is een scroll-tekst geschreven "
                  dc.b "in SEKA. De source staat op deze diskette.     "
                  dc.b "Dit is AmiGazette nummer 11, een Nederlands-"
                  dc.b "talig tijdschrift op diskette. Op deze diskette "
                  dc.b "staan onder andere : Cursus AmigaBasic, Cursus "
                  dc.b "Assembler, 3D Cycle, Black Box, WoordenPuzzel, "
                  dc.b "OlieMagnaat, MAD en een aantal plaatjes, printer-"
                  dc.b "tekeningen en teksten.    U kunt deze tekst stoppen "
                  dc.b "door op de muisknop te drukken. Zo niet herhaalt de "
                  dc.b "tekst zich steeds weer."
                  dc.b "                                    "
                  dc.b "                                    "
TextEnd:
Text2:            dc.b "   "
