Code: Alles auswählen
org $1000
;----- Definition der Hardwareregister -----
RANDOM = 53770
XITVBV = 58466
SETVBV = 58460
VDSLST = 512
NMIEN = 54286
wsync = 54282
hscrol = 54276
rtclok = 18
colpf0 = 53270
colpf1 = 53271
colpf2 = 53272
colpf3 = 53273
;----- Definition dere Variablen ----
screen = 220
scrolm1 = 222
scrolm2 = 223
scrolm3 = 224
scrolindex1 = 225
scrolindex2 = 226
scrolindex3 = 227
display = 228
zeilen = 230
delay = 232
var1 = 233
var0 = 234
var80 = 236
var160 = 238
var20 = 240
var280 = 242
var260 = 244
grob1y = 1000
grob2y = 1001
grob3y = 1002
grobn = 1003
groba = 1004
.proc main
mwa #39936 display ;--- hier fängt die Bildschirmadresse an 0,156 = 256x156
mwa #dlist 560 ;--- die neue Displaylist wird auf 560 umgebogen ANTIC D
ldy #0 ;der VBI wird initialisiert
ldx #0
ldx #>vbinter ;VB-Interrupt VektorHi
ldy #<vbinter ;VB-Interrupt VektorLo
lda #7 ;Deferred Mode mit lda #7 festlegen
jsr setvbv
lda #<dli0 ;der 1. Displaylist-Interrupt wird initialisiert
sta VDSLST
lda #>dli0
sta VDSLST+1
lda #192
sta NMIEN
ldy #0
lda #4
sta scrolm1
sta scrolm2
sta scrolm3
loop ;hier steht das Hauptprogramm
jsr scrolling ;der Scrollaufruf
mva #0 delay ;eine Warteschleife 1/50sek.
jsr wartes
jmp loop
.endp
; ---------------------------- S U B R O U T I N E N ----------------------------------
.proc scrolling
#if .byte scrolm2<=#4 ; Zähler für Feinscroll - in Antic D von 8 -> 4
jsr grob2 ; der Grobscroll für den mittleren Bereich wird ausgeführt
mva #8 scrolm2
#end
#if .byte scrolm3<=#4
mva #8 scrolm3 ; Grobscroll unterer Bereich
jsr grob3
#end
; hier wird die Geschwindigkeit gesteuert
inc scrolindex1
inc scrolindex2
inc scrolindex3
#if .byte scrolindex1=#3
mva #0 scrolindex1
dec scrolm1
#end
#if .byte scrolindex2=#2
mva #0 scrolindex2
dec scrolm2
#end
#if .byte scrolindex3=#1
mva #0 scrolindex3
dec scrolm3
#end
rts
.endp
.proc grobmain ;diese Routine macht den Grobscroll für Grob1,2,3
@ tya
sta dlist,x ;hier wird die jeweilige DList pro Zeile geschoben
lda random
sta (var20),y ;Wert rechts außen speichern (sichtbar)
dey
sta (var0),y ;Wert um eins verschoben in den unsichtbaren Bereich schieben
iny
inx ;3x inx für die nächste DL-Zeile
inx
inx
tya
adc #80 ;wir bearbeiten in dieser Routine immer 3 DL Zeilen
sta dlist,x ;0 / 80 / 160 - da sind immer 2x40 Zeilen drin - die sichtbare und die unsichtbare
lda random ;und nach 3 Zeilen wird einfach das High Byte incrementiert
sta (var280),y ;danach startet diese Routine erneut für einen 3er Block
dey
sta (var80),y
iny
inx
inx
inx
tya
adc #160 ;3.Zeile
sta dlist,x
lda random
sta (var260),y
dey
sta (var160),y
iny
inx
inx
inx
inc var0+1 ;das High Byte wird für alle incrementiert
inc var80+1
inc var160+1
inc var20+1
inc var280+1
inc var260+1
clc
inc zeilen ;Anzahl der Zeilen pro Block
#if .byte zeilen<grobn ;es werden max.81 Zeilen grobgescrollt (dann geht x über 255)
jmp @-
#end
rts
.endp
.proc grob1
mva #0 zeilen
lda #156
sta var0+1
sta var80+1
sta var160+1
sta var20+1
sta var280+1
sta var260+1
mva #0 var0
mva #80 var80
mva #160 var160
mva #43 var20 ;0+39
mva #123 var280 ;80+39
mva #203 var260 ;160+39
mva #0 zeilen
;mva #0 groba
;#if .byte grob1y<#1
mva random groba ;in groba kommt rein was rechts geprintet wird
;#end
ldx #7 ;bei 7 wird die erste Displaylist manipuliert - dann immer plus 3
mva #2 grobn ;der erste Block ist 2x3 Zeilen breit
ldy grob1y
#if .byte grob1y=#48 ;wegen des DLI haben wir nicht 40 Zeichen pro Zeile sondern 48
#end
jsr grobmain
inc grob1y
#if .byte grob1y=#47
mva #0 grob1y
#end
rts
.endp
.proc grob2
mva #0 zeilen
lda #158
sta var0+1
sta var80+1
sta var160+1
sta var20+1
sta var280+1
sta var260+1
mva #0 var0
mva #80 var80
mva #160 var160
mva #43 var20 ;0+39
mva #123 var280 ;80+39
mva #203 var260 ;160+39
mva #0 zeilen
;mva #0 groba
;#if .byte grob2y<#1
mva random groba
;#end
ldx #25
mva #4 grobn
ldy grob2y
#if .byte grob2y=#48
#end
jsr grobmain
inc grob2y
#if .byte grob2y=#47
mva #0 grob2y
#end
rts
.endp
.proc grob3
lda #162
sta var0+1
sta var80+1
sta var160+1
sta var20+1
sta var280+1
sta var260+1
mva #0 var0
mva #80 var80
mva #160 var160
mva #43 var20 ;0+39
mva #123 var280 ;80+39
mva #203 var260 ;160+39
mva #0 zeilen
;mva #0 groba
;#if .byte grob3y<#1
mva random groba
;#end
ldx #61
mva #21 grobn
ldy grob3y
#if .byte grob3y=#48
#end
jsr grobmain
inc grob3y
#if .byte grob3y=#47
mva #0 grob3y
#end
rts
.endp
.proc wartes
clc
ldx delay ; Warteschleife
st
lda RTCLOK+2
wa
cmp RTCLOK+2
beq wa
dex
bpl st
rts
.endp
.proc dli0 ;Farbe mittlerer Streifen
phr
sta wsync
mva #2 colpf0
mva #6 colpf1
mva #10 colpf2
mva #14 colpf3
mva scrolm2 hscrol ;hier wird der Feinscroll gesteuert
#if .byte scrolm1<=#4 ;der erste Balken wird im 1.DLI gesteuert
jsr grob1 ;der mittlere und untere im Hauptprogramm
mva #8 scrolm1
#end
mwa #dli1 512 ;hier wird im 1.DLI der 2.DLI initialisiert
plr
rti
.endp
.proc dli1 ;Farbe unterer Streifen
phr
mva scrolm3 hscrol ;hier wird der Feinscroll gesteuert
mva #37 colpf1
mva #101 colpf0
mva #168 colpf2
mva #246 colpf3
mwa #dli2 512 ;der 2. DLI initialisiert den 3.DLI
plr
rti
.endp
.proc dli2
phr
mva scrolm1 hscrol ;hier wird der Feinscroll gesteuert
mwa #dli0 512 ;der 3.DLI initialisiert den 1.DLI
plr
rti
.endp
.proc vbinter ;den VBI brauchen wir aktuell nur für die Farbe des ersten Blocks
pha
txa
pha
tya
pha
mva #222 colpf1
mva #68 colpf0
mva #182 colpf2
mva #38 colpf3
pla
tay
pla
tax
pla
jmp xitvbv ;vb-interrupt wird über xitvbv beendet!!
.endp
dlist .by 117,117,117 ;dies ist die Displaylist
.by 93,210,155 ;keine Ahnung warum, aber diese scheinbar unnötige Zeile brauche ich hier...
.by 93,0,156 ;hier geht die erste Zeile des ersten Blocks los
.by 93,80,156 ;93= 64 (Sprungbefehl)+16 (HSCROL aktiv) +13 (Antic D)
.by 93,160,156
.by 93,0,157
.by 93,80,157
.by 221,160,157 ;93 +128 (Interrupt wird ausgelöst)
.by 93,0,158
.by 93,80,158
.by 93,160,158
.by 93,0,159
.by 93,80,159
.by 93,160,159
.by 93,0,160
.by 93,80,160
.by 93,160,160
.by 93,0,161
.by 93,80,161
.by 221,160,161
.by 93,0,162
.by 93,80,162
.by 93,160,162
.by 93,0,163
.by 93,80,163
.by 93,160,163
.by 93,0,164
.by 93,80,164
.by 93,160,164
.by 93,0,165
.by 93,80,165
.by 93,160,165
.by 93,0,166
.by 93,80,166
.by 93,160,166
.by 93,0,167
.by 93,80,167
.by 93,160,167
.by 93,0,168
.by 93,80,168
.by 93,160,168
.by 93,0,169
.by 93,80,169
.by 93,160,169
.by 93,0,170
.by 93,80,170
.by 93,160,170
.by 93,0,171
.by 93,80,171
.by 93,160,171
.by 93,0,172
.by 93,80,172
.by 93,160,172
.by 93,0,173
.by 93,80,173
.by 93,160,173
.by 93,0,174
.by 93,80,174
.by 93,160,174
.by 93,0,175
.by 93,80,175
.by 93,160,175
.by 93,0,176
.by 93,80,176
.by 93,160,176
.by 93,0,177
.by 93,80,177
.by 93,160,177
.by 93,0,178
.by 93,80,178
.by 93,160,178
.by 93,0,179
.by 93,80,179
.by 93,160,179
.by 93,0,180
.by 93,80,180
.by 93,160,180
.by 93,0,181
.by 93,80,181
.by 93,160,181
.by 93,0,182
.by 93,80,182
.by 93,160,182
.by 93,0,183
.by 93,80,183
.by 93,160,183
.by 93,0,184
.by 93,80,184
.by 93,160,184
.by 93,0,185
.by 93,80,185
.by 93,160,185
.by 93,0,186
.by 93,80,186
.by 93,160,186
.by 93,0,187
.by 93,80,187
.by 221,160,187
.by 65
.wo dlist
run main