;
;  ** Cursor-cycle
;  ** written by A.Moller and W.Baecker
;  ** KOELN,  06.06.1987
;  ** AMIGA 1000 512k  + SEKA
; läuft auch mit anderen Konfigurationen
; NOTE:
; nicht von SEKA aus starten
; erst mit >>wo<< abspeichern 
; Programm vom CLI aufrufen
timer=0
GfxBase=2
fac=6


start:
 movem.l d0-d7/a0-a6,-(sp)      ; Alle Register retten
 move.l $4,a6                   ; Addresse exec.library
 move.l #cend-L3Int,d0          ; Länge des zu
                                ; reservierenden Blocks
 move.l #%10000000000000001,d1  ; PUBLIC memory
 jsr -198(a6)                   ; Aufruf >>AllocMem()<<
 move.l d0,d6                   ; Adresse des Blocks retten
 beq error                      ; NULL, kein Speicher !!

 lea GfxName,a1                 ; graphics.library öffnen:
 jsr -408(a6)                   ; OldOpenLibrary()
 move.l d0,dat+2                ; GFX-Base retten

 move.l $6c,OldInt       ; alten Interrupt Vector retten
                         ; Sowohl GFX-Base als auch die Adresse
                         ; alten Interupt-Routine werden vor
                         ; Kopieren in die neue
                         ; Einsprungroutine übertragen
 lea L3Int,a1                   ; Block kopieren : Quelle
 move.l d6,a0                   ; Ziel
 move.l #[[cend-L3Int]/2]-2,d0  ; Zahl der zu kopierenden Worte
clop: 
 move.w (a1)+,(a0)+     ; kopieren
 dbra d0,clop           ; fertig ?
 move.w #$0020,$dff09a  ; VBlank stoppen
 move.w #$0020,$dff09c  ; löscht IRQ-Request
 move.l d6,$6c          ; Zeiger auf neue IRQ-Routine setzen
 move.w #$8020,$dff09a  ; VBlank wieder zulassen

 move.l dat+2,a1        ; GfxBase wieder schließen !!!
 move.l 4,a6            ; Zeiger auf exec.library
 jsr -414(a6)           ; >>close library<<
error: 
 movem.l (sp)+,d0-d7/a0-a6 ; alle Registers wieder holen
 clr.l d0                  ; kein RETURN CODE
 rts                       ; zurück: >>Cursor-Cycle<< aktiviert

 
 GfxName: dc.b 'graphics.library',0 ; Name der Bibliothek
 even
; --- Level 3 Interrupt Handler
; NOTE:
; Es folgt die neue Einsprung-Routine in den Interupt
; Die Routine wird in den reservierten Bereich kopiert.
; Niemand weiß wohin die Routine geschrieben wird, daher
; handelt es sich um frei verschiebbaren CODE !
L3Int:
 move.l SR,-(sp)           ; Status auf Stack
 btst #5,$dff01f           ; VBLANK ??
 bne.s vblank              ; ja   -> Sprung in eigene Routine
 bra EndHandler            ; nein -> Sprung in System-Routine
; --- Aktueller VBLANK Handler
vblank:
 movem.l d0-d7/a0-a6,-(sp) ; Register sichern
 lea dat(pc),a5            ; Adresse timer (Verzögerung)
  subq.w #1,timer(a5)      ; timer - 1
 bpl.s out                 ; positiv -> keine Änderung
 move.w #$2,timer(a5)      ; reset timer (2/50 Sekunde)
 move.l GfxBase(a5),a0     ; Adresse: graphics.library
 adda.l #$32,a0            ; Adresse: Zeiger auf coplist
 move.l (a0),a0            ; Adresse: active copper list
 lea tabel(pc),a1          ; Adresse: color table
 move.w fac(a5),d0         ; Index in color table
 lsl.w #1,d0               ; byte to word-Index
; -- 18 bytes vom Start der Copper-Liste, finden Sie die 
; -- the Copper-Anweisung zum Setzen des Hardware-Color-Registers.
 move.w 0(a1,d0.w),18(a0)  ; Neue Farbe in Copper-Liste
 addq.w #1,fac(a5)         ; Index in Farbtabelle +1
 cmp.w #24,fac(a5)         ; Index größer Maximum ?
 blo.s out                 ; nein, dann Sprung
 clr.w fac(a5)             ; ja,   Index = 0
out: 
movem.l (sp)+,d0-d7/a0-a6  ; Ende  VBLANK Handler
EndHandler:
 move (sp)+,SR  ; Status wiederholen
 dc.w $4ef9     ; OPCODE für JMP xxxxxxxx.l
OldInt: 
 dc.l $0        ; hier wird bei Initialisierung die Adresse
                ; der alten Interuptroutine eingetragen

dat: 
dc.w 0,0,0,0    ; Zähler, Platz für >>GfxBase<<, Farbindex
; --- Aktuelle Farbwerte für Rotation
; --- Die Werte können Sie nach eigenen Wünschen ändern
tabel: 
 dc.w $333,$444,$555,$666,$777,$888,$999,$aaa,$bbb
 dc.w $ccc,$ddd,$eee
 dc.w $fff,$eee,$ddd,$ccc,$bbb,$aaa,$999,$888,$777,$666
 dc.w $555,$444
 even
cend: equ *     ; Label um das Ende der Routine zu markieren



