&&
------------------------------------------------------------------------------
           CURSUS ASSEMBLER  -  EEN SROLL-PROGRAMMA MET EXTRA'S 2
------------------------------------------------------------------------------

De eigenlijke scroll-routine. Via de Blitter wordt steeds een karakter ver-
plaatst. Daarbij wordt alles steeds 1 puntje verplaatst en eventueel een
nieuwe letter toegevoegd. De routine wordt 3 keer per interrupt uitgevoerd.
Daardoor wordt de scroll erg rustig.

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 eraf.
         sub.l    #$00000002,a3     ; 2 Bytes eraf.
         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.

Dan volgt het testen of de routine al drie keer gedaan is in deze interrupt.

End_Scroll:
         addi.b   #$01,Speed        ; Snelheid plus 1.
         cmpi.b   #$03,Speed        ; Testen op 3 keer gedaan.
         bne.l    Scroll            ; Nee ???
         clr.b    Speed             ; Snelheid op 0 zetten.
         rts                        ; Einde van deze routine.

Nu een hele reeks variabelen en pointers.

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         ;
&&
Nu komt de Copper-lijst. U ziet dat vier adressen, P1Hi, P1Lo, P2Hi en P2Lo,
de start-adressen van de diverse BitPlanes bevatten. Ze zijn hier neergezet
door de vorige routines. Zo kunnen er veranderingen gemaakt worden in de
Copper-lijst zonder dat er problemen optreden.

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
&&
En natuurlijk de tekst die moet scrollen.

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 "   "

U kunt de totale Seka-source vinden in de directory Assembler. Daar staan ook
twee geassembleerde programma's. De eerste is het programma dat u hier ziet,
het tweede is met een iets gewijzigde Copper-lijst. Beiden kunnen vanuit de
CLI en vanaf de Workbench gestart worden.
Probeer ook eens zelf wat kleine veranderingen te maken in de source.




- EINDE ----------------------------------------------------------------------
&&
