              ; -------------------------------------------------------------------
              ; HardwareKurs (II) Beispielprogramm - Copperlist/Cycle...
              ; 1988,89 Sven Stillich, Oliver Siebenhaar (KICKSTART)
              ; Ausgabe Juni 1989
              ; -------------------------------------------------------------------
              ;
              ; definieren der CUSTOMchip Reg. und der Library Offsets (Bases)
              ;
allocmem      = -198        ; speicher reservieren
freemem       = -210        ; speicher freigeben
openlibrary   = -408        ; library öffnen
execbase      =  004        ; basisadresse EXEC
              ;
              ; Blitter- und Bitplaneadressen (CUSTOMCHIPBASE = $DFF000)
              ;
COP1LC        = $080        ; adresse copperlist
COPJMP1       = $088        ; sprung copperlist
DIWSTRT       = $08E        ; Fenster START
DIWSTOP       = $090        ; Fenster STOP
DDFSTRT       = $092        ; BitplaneDMA START
DDFSTOP       = $094        ; BitplaneDMA STOP
DMACON        = $096        ; DMA control
BPL1PTH       = $0E0        ; bitplane1 basis high
BPL1PTL       = $0E2        ; bitplane1 basis low
BPLCON0       = $100        ; bitplanecontrol 0
BPLCON1       = $102        ; control 1 (scroll)
BPLCON2       = $104        ; control 2 (prior)
BPL1MOD       = $108        ; ungerade modulo
BPL2MOD       = $10A        ; gerade modulo
SPR0PTH       = $120        ; sprite0 basis high
SPR0PTL       = $122        ; sprite0 basis low
COLOR00       = $180        ; hintergrundfarbe
CIAAPRA       = $BFE001     ; CIAportregister A
chip          = $02         ; parameter für den
clear         = chip+$10000 ; 'allocmem'-aufruf
startlist     = 38          ; basis alte cliste
              ;
              ;
              ; Programmbeginn
              ; Speicher reservieren (für bitplane/copperlist)
              ;
              LEA     $DFF000,a5          ; custombase nach a5
              MOVE.L  execbase.s,a6

              MOVE.L  #[40*290],d0        ; [320/8]*290 Bytes
              MOVE.L  #clear,d1           ; bedingungen
              JSR     allocmem(a6)        ; speicher bitplane
              MOVE.L  d0,bitplanebase
              MOVE.L  #156,d0             ; 39 * 4byte Befehle
              MOVEQ   #chip,d1
              JSR     allocmem(a6)        ; speicher copperlist
              MOVE.L  d0,copperbase
              ;
              ; Berechnung der Copperliste (Sprite/BitplanePointer)
              ;
              MOVE.L  d0,a0               ; a0 - copperbase
              MOVE.L  bitplanebase(pc),d0 ; d0 - bitplanebase
              MOVE.L  #spritebase,d1      ; d1 - spritebase
              MOVE.W  #BPL1PTH,(a0)
              MOVE.W  #BPL1PTL,4(a0)
              MOVE.W  #SPR0PTH,8(a0)
              MOVE.W  #SPR0PTL,12(a0)
              MOVE.W  d0,6(a0)            ; bpllow
              SWAP    d0
              MOVE.W  d0,2(a0)            ; bplhigh
              MOVE.W  d1,14(a0)           ; sprlow
              SWAP    d1
              MOVE.W  d1,10(a0)           ; sprhigh
              MOVE.W  #COLOR00,16(a0)
              MOVE.W  #$0000,18(a0)       ; background schwarz
              ;
              ; Colorspreading berechnen ab Zeile (d0)
              ;
              ADD.L   #20,a0              ; Parameter überspringen
              MOVEQ   #00,d0
              MOVE.W  #$500F,d0           ; ab Zeile $50
              LEA     colortabelle(pc),a1 ; farbwerte
              MOVEQ   #15,d1              ; 16 farbwerte
copper_set:   MOVE.W  d0,(a0)+            ; WAIT
              MOVE.W  #$FFFE,(a0)+
              MOVE.W  #COLOR00,(a0)+      ; MOVE
              MOVE.W  (a1)+,(a0)+
              ADD.W   #$0100,d0
              DBF     d1,copper_set

              MOVE.W  #COLOR00,(a0)+      ; background wieder
              MOVE.W  #$0000,(a0)+        ; schwarz
              MOVE.L  #$FFFFFFFE,(a0)     ; copperlist ende
              ;
              ; Copperlist initialisieren / sonstige Parameter setzen
              ;
              MOVE.W  #$03E0,DMACON(a5)            ; DMA sperren
              MOVE.L  copperbase(pc),COP1LC(a5)    ; basis setzen
              CLR.W   COPJMP1(a5)                  ; liste starten
              MOVE.W  #$2081,DIWSTRT(a5)
              MOVE.W  #$2FC1,DIWSTOP(a5)
              MOVE.W  #$0038,DDFSTRT(a5)
              MOVE.W  #$00D0,DDFSTOP(a5)
              MOVE.W  #%0001001000000000,BPLCON0(a5)
              ;         5432109876543210
              CLR.W   BPLCON1(a5)
              CLR.W   BPLCON2(a5)
              CLR.W   BPL1MOD(a5)
              CLR.W   BPL2MOD(a5)
              MOVE.W  #$83C0,DMACON(a5)
              ;
              ; ColorCyclen im durch WAIT/MOVE-Befehle definierten Bereich
              ;
cycle:        MOVE.L  copperbase(pc),a0
              ADD.L   #26,a0              ; auf ersten Befehl zeigen
              LEA     colortabelle(pc),a1 ; colortabelle
              ADDQ.L  #02,tabulator       ; tab + 2
              CMP.L   #31*2,tabulator     ; farben am ENDE ?
              BLE.S   do_it
              CLR.L   tabulator           ; ja => zurücksetzen
do_it:        ADD.L   tabulator(pc),a1    ; tab hinzuaddieren

              MOVEQ   #15,d0              ; 16 Zeilen
set:          MOVE.W  (a1)+,(a0)          ; neuer wert in clist
              ADDQ.L  #08,a0              ; nächster MOVE-befehl
              DBF     d0,set              ; ende der schleife
              MOVE.L  #20000,d0           ; verzögerung
wait:         DBF     d0,wait

mouseklick:   BTST    #06,CIAAPRA
              BNE.S   cycle
              ;
              ; Ende des Programms (alte Copperlist zulassen/speicher zurück)
              ;
              LEA     gfxname(pc),a1      ; graphics.library
              JSR     openlibrary(a6)     ; öffnen, um basis der
              MOVE.L  d0,a6               ; alten clist zu finden
              MOVE.L  startlist(a6),COP1LC(a5)  ; basis alte cliste
              CLR.W   COPJMP1(a5)               ; alte clist starten
              MOVE.W  #$8020,DMACON(a5)         ; dma zurücksetzen

              MOVE.L  execbase.s,a6
              MOVE.L  bitplanebase(pc),a1 ; basis bitplane
              MOVE.L  #[40*290],d0        ; size bitplane
              JSR     freemem(a6)         ; speicher freigeben
              MOVE.L  copperbase(pc),a1   ; basis copperlist
              MOVE.L  #156,d0             ; size copperlist
              JSR     freemem(a6)         ; speicher freigeben
              MOVEQ   #00,d0
              RTS
              ;
              ; Variablen/Parameter/Tabellen/Strings
              ;
              EVEN
copperbase:   DC.L 0
bitplanebase: DC.L 0
tabulator:    DC.L -2
spritebase:   DC.W 0,0
colortabelle: DC.W $0F00,$0F10,$0F20,$0F30,$0F40,$0F50,$0F60
              DC.W $0F70,$0F80,$0F90,$0FA0,$0FB0,$0FC0,$0FD0
              DC.W $0FE0,$0FF0,$0FE0,$0FD0,$0FC0,$0FB0,$0FA0
              DC.W $0F90,$0F80,$0F70,$0F60,$0F50,$0F40,$0F30
              DC.W $0F20,$0F10,$0F00
              ;      kopie der ersten farbwerte
              DC.W $0F00,$0F10,$0F20,$0F30,$0F40,$0F50,$0F60
              DC.W $0F70,$0F80,$0F90,$0FA0,$0FB0,$0FC0,$0FD0
              DC.W $0FE0,$0FF0,$0FE0,$0FD0,$0FC0,$0FB0,$0FA0
              DC.W $0F90,$0F80,$0F70,$0F60,$0F50,$0F40,$0F30
              DC.W $0F20,$0F10,$0F00
gfxname:      DC.B 'graphics.library',0





