Tanz der Sprites
Moderator: Rockford
- Dr. Irata
- Beiträge: 968
- Registriert: 24.08.2021 14:40
- Has thanked: 121 times
- Been thanked: 289 times
- Kontaktdaten:
Tanz der Sprites
.... und damit es übersichtlicher wird, beginne ich von ganz vorne und nenne es Tanz der Sprites!
Das kleine Programm wird dann folgendes erzeugen:
Gruß
Peter
Das kleine Programm wird dann folgendes erzeugen:
Gruß
Peter
- Dr. Irata
- Beiträge: 968
- Registriert: 24.08.2021 14:40
- Has thanked: 121 times
- Been thanked: 289 times
- Kontaktdaten:
Re: Tanz der Sprites
...
und hier schon mal der komplette Code vorab:
wie gesagt, läuft unter MADS, läßt sich aber leicht in die anderen Versionen konvertieren.
Ich nutze gerne die #if ... #end Anweisung, wo das nicht geht, der muss das umschreiben!
Alle Parts werde ich einzeln erklären...
Gruß
Peter
und hier schon mal der komplette Code vorab:
Code: Alles auswählen
org 4096
dlist .by 117,117,117
.by 93,210,155
.by 93,0,156
.by 93,80,156
.by 93,160,156
.by 93,0,157
.by 93,80,157
.by 221,160,157
.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
display = 228
display99 = 230
;------ Speicher und Variablen für Player allgemein ----------
display1 = 232
display2 = 234
display3 = 236
display199 = 238
display299 = 240
display399 = 242
tmp1 = 1000
tmp2 = 1001
tmp3 = 1002
tmp4 = 1003
tmp5 = 1004
tmp6 = 1005
tmp7 = 1006
tmp8 = 1007
tmp9 = 1008
displayzw = 1009
ystore = 1011
xstore = 1012
beweg = 1013
;------ Variablen für die Warteschleifen -----------------------
delay = 1020
schleife1 = 1021
schleife2 = 1022
;------ Variablen für Player1 ----------------------------------
zaehler1 = 1100
display11 = 1102
display21 = 1104
display31 = 1106
tmp11 = 1108
tmp21 = 1109
tmp31 = 1110
tmp41 = 1111
tmp51 = 1112
tmp61 = 1113
tmp71 = 1114
tmp81 = 1115
tmp91 = 1116
displayzw1 = 1117
ystore1 = 1118
xstore1 = 1119
;------ Variablen für Player2 ----------------------------------
zaehler2 = 1120
display12 = 1122
display22 = 1124
display32 = 1126
tmp12 = 1128
tmp22 = 1129
tmp32 = 1130
tmp42 = 1131
tmp52 = 1132
tmp62 = 1133
tmp72 = 1134
tmp82 = 1135
tmp92 = 1136
displayzw2 = 1137
ystore2 = 1138
xstore2 = 1139
;------ Variablen für Player3 ----------------------------------
zaehler3 = 1140
display13 = 1142
display23 = 1144
display33 = 1146
tmp13 = 1148
tmp23 = 1149
tmp33 = 1150
tmp43 = 1151
tmp53 = 1152
tmp63 = 1153
tmp73 = 1154
tmp83 = 1155
tmp93 = 1156
displayzw3 = 1157
ystore3 = 1158
xstore3 = 1159
;---------------------------------------------------------------
player11 .by 170,170,0
.by 42,170,128
.by 10,170,160
.by 2,170,168
player12 .by 85,85,0
.by 21,85,64
.by 5,85,80
.by 1,85,84
player13 .by 170,170,0
.by 42,170,128
.by 10,170,160
.by 2,170,168
maske11 .by 0,0,255
.by 192,0,63
.by 240,0,15
.by 252,0,3
maske12 .by 0,0,255
.by 192,0,63
.by 240,0,15
.by 252,0,3
maske13 .by 0,0,255
.by 192,0,63
.by 240,0,15
.by 252,0,3
bewegung1 .by 3,3,3,4,4,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,6,7,7,7,7,7,7,8,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2
bewegung2 .by 5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
bewegung3 .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5
.proc main
mwa #39936 display ;--- hier fängt die Bildschirmadresse an 0,156 = 256x156
mwa #30720 display99
mwa #dlist 560
ldx #0 ;Bildschirm füllen
ldy #0
@ lda #11
sta tmp1
#if .byte tmp1>#40
;jmp @-
#end
sta (display),y
sta (display99),y
iny
bne @-
inc display+1
inc display99+1
clc
inx
cpx #31
bne @-
;-------------------- Variablen Player1 init ---------
mva #0 display11
mva #80 display21
mva #160 display31
lda #170
sta display11+1
sta display21+1
sta display31+1
mva #0 zaehler1
ldy #34
sty ystore1
;-------------------- Variablen Player2 init ---------
mva #0 display12
mva #80 display22
mva #160 display32
lda #173
sta display12+1
sta display22+1
sta display32+1
mva #0 zaehler2
ldy #44
sty ystore2
;-------------------- Variablen Player3 init ---------
mva #0 display13
mva #80 display23
mva #160 display33
lda #165
sta display13+1
sta display23+1
sta display33+1
mva #0 zaehler3
ldy #44
sty ystore3
;--------------------------Hauptprogramm----------------------------
loop
jsr player1
jsr player2
jsr player3
mva #4 delay
jsr warte2
jmp loop
.endp
;--------------------------Subroutinen------------------------------
.proc warte2
mva #0 schleife1
mva #0 schleife2
@ inc schleife1
#if .byte schleife1<#255
jmp @-
#end
mva #0 schleife1
inc schleife2
#if .byte schleife2<delay
jmp @-
#end
rts
.endp
.proc player1
mwa display11 display1
mwa display21 display2
mwa display31 display3
mva tmp11 tmp1
mva tmp21 tmp2
mva tmp31 tmp3
mva tmp41 tmp4
mva tmp51 tmp5
mva tmp61 tmp6
mva tmp71 tmp7
mva tmp81 tmp8
mva tmp91 tmp9
mva displayzw1 displayzw
mva ystore1 ystore
mva xstore1 xstore
ldx zaehler1
lda bewegung1,x
sta beweg
jsr player.bewegung
inc zaehler1
#if .byte zaehler1=#79
mva #0 zaehler1
#end
mwa display1 display11
mwa display2 display21
mwa display3 display31
mva tmp1 tmp11
mva tmp2 tmp21
mva tmp3 tmp31
mva tmp4 tmp41
mva tmp5 tmp51
mva tmp6 tmp61
mva tmp7 tmp71
mva tmp8 tmp81
mva tmp9 tmp91
mva displayzw displayzw1
mva ystore ystore1
mva xstore xstore1
#if .byte ystore1<=#0
jsr player.restore
mva #0 display11
mva #80 display21
mva #160 display31
lda #170
sta display11+1
sta display21+1
sta display31+1
mva #0 zaehler1
ldy #34
sty ystore1
#end
rts
.endp
.proc player2
mwa display12 display1
mwa display22 display2
mwa display32 display3
mva tmp12 tmp1
mva tmp22 tmp2
mva tmp32 tmp3
mva tmp42 tmp4
mva tmp52 tmp5
mva tmp62 tmp6
mva tmp72 tmp7
mva tmp82 tmp8
mva tmp92 tmp9
mva displayzw2 displayzw
mva ystore2 ystore
mva xstore2 xstore
ldx zaehler2
lda bewegung3,x
sta beweg
jsr player.bewegung
inc zaehler2
#if .byte zaehler2=#79
mva #0 zaehler2
#end
mwa display1 display12
mwa display2 display22
mwa display3 display32
mva tmp1 tmp12
mva tmp2 tmp22
mva tmp3 tmp32
mva tmp4 tmp42
mva tmp5 tmp52
mva tmp6 tmp62
mva tmp7 tmp72
mva tmp8 tmp82
mva tmp9 tmp92
mva displayzw displayzw2
mva ystore ystore2
mva xstore xstore2
#if .byte ystore2<=#0
jsr player.restore
mva #0 display12
mva #80 display22
mva #160 display32
lda #173
sta display12+1
sta display22+1
sta display32+1
mva #0 zaehler2
ldy #44
sty ystore2
#end
rts
.endp
.proc player3
mwa display13 display1
mwa display23 display2
mwa display33 display3
mva tmp13 tmp1
mva tmp23 tmp2
mva tmp33 tmp3
mva tmp43 tmp4
mva tmp53 tmp5
mva tmp63 tmp6
mva tmp73 tmp7
mva tmp83 tmp8
mva tmp93 tmp9
mva displayzw3 displayzw
mva ystore3 ystore
mva xstore3 xstore
ldx zaehler3
lda bewegung2,x
sta beweg
jsr player.bewegung
inc zaehler3
#if .byte zaehler3=#79
mva #0 zaehler3
#end
mwa display1 display13
mwa display2 display23
mwa display3 display33
mva tmp1 tmp13
mva tmp2 tmp23
mva tmp3 tmp33
mva tmp4 tmp43
mva tmp5 tmp53
mva tmp6 tmp63
mva tmp7 tmp73
mva tmp8 tmp83
mva tmp9 tmp93
mva displayzw displayzw3
mva ystore ystore3
mva xstore xstore3
#if .byte ystore3<=#0
jsr player.restore
mva #0 display13
mva #80 display23
mva #160 display33
lda #165
sta display13+1
sta display23+1
sta display33+1
mva #0 zaehler3
ldy #44
sty ystore3
#end
rts
.endp
.proc player
bewegung #if .byte beweg=#7
jsr player.nachlinks
#end
#if .byte beweg=#3
jsr player.nachrechts
#end
#if .byte beweg=#5
jsr player.nachunten
#end
#if .byte beweg=#1
jsr player.nachoben
#end
#if .byte beweg=#2
jsr player.nachoben
jsr player.nachrechts
#end
#if .byte beweg=#4
jsr player.nachunten
jsr player.nachrechts
#end
#if .byte beweg=#8
jsr player.nachoben
jsr player.nachlinks
#end
#if .byte beweg=#6
jsr player.nachunten
jsr player.nachlinks
#end
rts
nachoben
ldy ystore
ldx xstore
jsr restore
mva display1 displayzw
#if .byte displayzw=#160
mva #80 display1
mva #160 display2
dec display2+1
mva #0 display3
#end
#if .byte displayzw=#80
mva #0 display1
mva #80 display2
mva #160 display3
dec display3+1
#end
#if .byte displayzw=#0
mva #160 display1
dec display1+1
mva #0 display2
mva #80 display3
#end
ldy ystore
jsr store
ldy ystore
ldx xstore
jsr print
jsr store
rts
nachunten
ldy ystore
ldx xstore
jsr restore
mva display3 displayzw
#if .byte displayzw=#160
mva #0 display3
inc display3+1
mva #80 display1
mva #160 display2
#end
#if .byte displayzw=#0
mva #80 display3
mva #0 display2
inc display2+1
mva #160 display1
#end
#if .byte displayzw=#80
mva #160 display3
mva #80 display2
mva #0 display1
inc display1+1
#end
ldy ystore
ldy ystore
ldx xstore
jsr print
jsr store
rts
nachrechts
ldy ystore
ldx xstore
inx
inx
inx
stx xstore
#if .byte xstore=#12
ldx #0
stx xstore
jsr restore
mva tmp2 tmp1
mva tmp3 tmp2
mva tmp5 tmp4
mva tmp6 tmp5
mva tmp8 tmp7
mva tmp9 tmp8
inc ystore
ldy ystore
iny
iny
lda (display1),y
sta tmp3
clc
ldy ystore
iny
iny
lda (display2),y
sta tmp6
clc
ldy ystore
iny
iny
lda (display3),y
sta tmp9
ldy ystore
#end
jsr print
jsr store
#if .byte ystore=#45
dey
#end
rts
nachlinks
ldy ystore
ldx xstore
dex
dex
dex
stx xstore
#if .byte xstore=#253
ldx #9
stx xstore
jsr restore
mva tmp2 tmp3
mva tmp1 tmp2
mva tmp5 tmp6
mva tmp4 tmp5
mva tmp8 tmp9
mva tmp7 tmp8
dec ystore
ldy ystore
lda (display1),y
sta tmp1
clc
ldy ystore
lda (display2),y
sta tmp4
clc
ldy ystore
lda (display3),y
sta tmp7
ldy ystore
#end
jsr print
jsr store
#if .byte ystore=#1
iny
#end
rts
print ;Player printen + Fusion Bildschirm
lda tmp1
and maske11,x
eor player11,x
sta (display1),y
inx
iny
lda tmp2
and maske11,x
eor player11,x
sta (display1),y
inx
iny
lda tmp3
and maske11,x
eor player11,x
sta (display1),y
ldx xstore
clc
ldy ystore
lda tmp4
and maske12,x
eor player12,x
sta (display2),y
inx
iny
lda tmp5
and maske12,x
eor player12,x
sta (display2),y
inx
iny
lda tmp6
and maske12,x
eor player12,x
sta (display2),y
ldx xstore
clc
ldy ystore
lda tmp7
and maske13,x
eor player13,x
sta (display3),y
inx
iny
lda tmp8
and maske13,x
eor player13,x
sta (display3),y
inx
iny
lda tmp9
and maske13,x
eor player13,x
sta (display3),y
rts
store ;Bildschirm in tmp sichern
sec
lda display1+1
sbc #36
sta display199+1
sec
lda display2+1
sbc #36
sta display299+1
sec
lda display3+1
sbc #36
sta display399+1
mva display1 display199
mva display2 display299
mva display3 display399
lda (display199),y
sta tmp1
iny
lda (display199),y
sta tmp2
iny
lda (display199),y
sta tmp3
clc
ldy ystore
lda (display299),y
sta tmp4
iny
lda (display299),y
sta tmp5
iny
lda (display299),y
sta tmp6
clc
ldy ystore
lda (display399),y
sta tmp7
iny
lda (display399),y
sta tmp8
iny
lda (display399),y
sta tmp9
rts
restore ;tmp in Bildschirm printen (restore)
lda tmp1
sta (display1),y
iny
lda tmp2
sta (display1),y
iny
lda tmp3
sta (display1),y
clc
ldy ystore
lda tmp4
sta (display2),y
iny
lda tmp5
sta (display2),y
iny
lda tmp6
sta (display2),y
clc
ldy ystore
lda tmp7
sta (display3),y
iny
lda tmp8
sta (display3),y
iny
lda tmp9
sta (display3),y
rts
.endp
run main
Ich nutze gerne die #if ... #end Anweisung, wo das nicht geht, der muss das umschreiben!
Alle Parts werde ich einzeln erklären...
Gruß
Peter
- Dr. Irata
- Beiträge: 968
- Registriert: 24.08.2021 14:40
- Has thanked: 121 times
- Been thanked: 289 times
- Kontaktdaten:
Re: Tanz der Sprites
Part 1 - die Displaylist:
org 4096 legt fest, wo das Programm startet. Nämlich bei $1000 bzw. 4096
Es folgt die Definition der Displaylist (DL) - dlist ist letztlich die Definition, an welche Speicherstelle die DL steht. Dorthin wird dann SDLSTL und SDLSTH hingebogen - hier sucht der Rechner den Vektor für die DL.
117 in der DL bedeutet 3 schwarze Blöcke am oberen Bildschirmrand. Für das Scrolling habe ich diese DL so aufgebaut. Jede Bildschirmzeile bekommt eine eigene Adresse mit Sprungbefehl. Der Befehl ist 93 und setzt sich aus 64+13+16 = 93 zusammen. 64 ist der eigentliche Sprungbefehl, 13 bedeutet Antic D Modus und 16 bedeutet horizontales Scrolling. Drei Zeilen haben noch +128 (93+128=221) - hier ist ein DL-Interrupt Einsprung vorgesehen. Für dieses Beispiel brauchen wir allerdings keinen Interrupt und kein Feinscrolling - aus der 93 / 221 könnte man auch ein 77 machen. Die DL habe ich schon für das Parallax vorbereitet...
Der eigentliche Bildschirm startet bei 0, 156 - also 0 + 256x156 = 39936 (die Zeile 93,210,155 - Adresse 39890 vergessen wir mal - die brauche ich auch fürs Parallax).
Am Ende der DL kommt noch der Befehl 65 und .wo dlist - das bedeutet spring zurück zum Anfang der DL und wiederhole sie.
Das wars schon mit der DL für Antic D.
Man kann das natürlich anders definieren, ich habe es aber so gewählt, weil ich damit auch für den Grobscroll eine doppelte Zeilenbreite bereitstelle. Wenn ich bei den Playern immer drei kleine Sprites gleichzeitig behandle, dann muss ich für den Zeilenwechsel wenig Aufwand treiben und nichts berechnen oder mit Masken arbeiten, die DL ist quasi meine Maske - dazu aber später. Ein kompletter Zeilenwechsel erreicht man im besten Fall einfach durch Increment oder Decrement des Highbyte.
Gruß
Peter
Code: Alles auswählen
org 4096
dlist .by 117,117,117
.by 93,210,155
.by 93,0,156
.by 93,80,156
.by 93,160,156
.by 93,0,157
.by 93,80,157
.by 221,160,157
.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
Es folgt die Definition der Displaylist (DL) - dlist ist letztlich die Definition, an welche Speicherstelle die DL steht. Dorthin wird dann SDLSTL und SDLSTH hingebogen - hier sucht der Rechner den Vektor für die DL.
117 in der DL bedeutet 3 schwarze Blöcke am oberen Bildschirmrand. Für das Scrolling habe ich diese DL so aufgebaut. Jede Bildschirmzeile bekommt eine eigene Adresse mit Sprungbefehl. Der Befehl ist 93 und setzt sich aus 64+13+16 = 93 zusammen. 64 ist der eigentliche Sprungbefehl, 13 bedeutet Antic D Modus und 16 bedeutet horizontales Scrolling. Drei Zeilen haben noch +128 (93+128=221) - hier ist ein DL-Interrupt Einsprung vorgesehen. Für dieses Beispiel brauchen wir allerdings keinen Interrupt und kein Feinscrolling - aus der 93 / 221 könnte man auch ein 77 machen. Die DL habe ich schon für das Parallax vorbereitet...
Der eigentliche Bildschirm startet bei 0, 156 - also 0 + 256x156 = 39936 (die Zeile 93,210,155 - Adresse 39890 vergessen wir mal - die brauche ich auch fürs Parallax).
Am Ende der DL kommt noch der Befehl 65 und .wo dlist - das bedeutet spring zurück zum Anfang der DL und wiederhole sie.
Das wars schon mit der DL für Antic D.
Man kann das natürlich anders definieren, ich habe es aber so gewählt, weil ich damit auch für den Grobscroll eine doppelte Zeilenbreite bereitstelle. Wenn ich bei den Playern immer drei kleine Sprites gleichzeitig behandle, dann muss ich für den Zeilenwechsel wenig Aufwand treiben und nichts berechnen oder mit Masken arbeiten, die DL ist quasi meine Maske - dazu aber später. Ein kompletter Zeilenwechsel erreicht man im besten Fall einfach durch Increment oder Decrement des Highbyte.
Gruß
Peter
- pps
- Beiträge: 577
- Registriert: 18.06.2021 23:05
- Has thanked: 127 times
- Been thanked: 232 times
- Kontaktdaten:
Re: Tanz der Sprites
$1000 ist meist zu tief, um das Programm später am Atari laden zu können. DOS liegt oft noch dort im Speicher. Zur Sicherheit geht für die originalen ATARI DOS eine Startadresse ab $1f00 oder gleich bei $2000.
Natürlich gibt es GameDOS (z.B. MyPicoDOS) oder spezielle kurze DOS (z.B. uDOS oder auch xBOOT), die auch mit $1000 problemlos klarkommen.
Natürlich gibt es GameDOS (z.B. MyPicoDOS) oder spezielle kurze DOS (z.B. uDOS oder auch xBOOT), die auch mit $1000 problemlos klarkommen.
- Dr. Irata
- Beiträge: 968
- Registriert: 24.08.2021 14:40
- Has thanked: 121 times
- Been thanked: 289 times
- Kontaktdaten:
Re: Tanz der Sprites
... ja das stimmt und ist jetzt ja auch nur ein Demoprogramm, wo man das Dos nicht braucht. Battle of Eris übrigens fängt auch bei $1000 an (da brauchte ich jeden Speicher, den ich bekommen konnte) und hat dennoch die Highscore-Option mit einem sehr schmalen Dos
- pps
- Beiträge: 577
- Registriert: 18.06.2021 23:05
- Has thanked: 127 times
- Been thanked: 232 times
- Kontaktdaten:
- Dr. Irata
- Beiträge: 968
- Registriert: 24.08.2021 14:40
- Has thanked: 121 times
- Been thanked: 289 times
- Kontaktdaten:
Re: Tanz der Sprites
Code: Alles auswählen
org $2000
icl 'dlist.asm'
display = $e4
display99 = $e6
;------ Speicher und Variablen für Player allgemein ----------
display1 = $e8
display2 = $ea
display3 = $ec
display199 = $ee
display299 = $f0
display399 = $f2
tmp1 = $600
tmp2 = $601
tmp3 = $602
tmp4 = $603
tmp5 = $604
tmp6 = $605
tmp7 = $606
tmp8 = $607
tmp9 = $608
displayzw = $609
ystore = $60a
xstore = $60b
beweg = $60c
;------ Variablen für die Warteschleifen -----------------------
delay = $60d
schleife1 = $60e
schleife2 = $60f
;------ Variablen für Player1 ----------------------------------
zaehler1 = $610
display11 = $611
display21 = $613
display31 = $615
tmp11 = $617
tmp21 = $618
tmp31 = $619
tmp41 = $61a
tmp51 = $61b
tmp61 = $61c
tmp71 = $61d
tmp81 = $61e
tmp91 = $61f
displayzw1 = $620
ystore1 = $621
xstore1 = $622
;------ Variablen für Player2 ----------------------------------
zaehler2 = $630
display12 = $631
display22 = $633
display32 = $635
tmp12 = $637
tmp22 = $638
tmp32 = $639
tmp42 = $63a
tmp52 = $63b
tmp62 = $63c
tmp72 = $63d
tmp82 = $63e
tmp92 = $63f
displayzw2 = $640
ystore2 = $641
xstore2 = $642
;------ Variablen für Player3 ----------------------------------
zaehler3 = $650
display13 = $651
display23 = $653
display33 = $655
tmp13 = $657
tmp23 = $658
tmp33 = $659
tmp43 = $65a
tmp53 = $65b
tmp63 = $65c
tmp73 = $65d
tmp83 = $65e
tmp93 = $65f
displayzw3 = $660
ystore3 = $661
xstore3 = $662
;---------------------------------------------------------------
player11 .by 170,170,0
.by 42,170,128
.by 10,170,160
.by 2,170,168
player12 .by 85,85,0
.by 21,85,64
.by 5,85,80
.by 1,85,84
player13 .by 170,170,0
.by 42,170,128
.by 10,170,160
.by 2,170,168
maske11 .by 0,0,255
.by 192,0,63
.by 240,0,15
.by 252,0,3
maske12 .by 0,0,255
.by 192,0,63
.by 240,0,15
.by 252,0,3
maske13 .by 0,0,255
.by 192,0,63
.by 240,0,15
.by 252,0,3
bewegung1 .by 3,3,3,4,4,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,6,7,7,7,7,7,7,8,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2
bewegung2 .by 5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
bewegung3 .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5
Alles andere geht zwar auch, da kann es aber zu Konfikten mit dem DOS kommen.
In dem Programm definiere ich zunächst die Display-Variablen:
In display steht die Anfangsbildschirmadresse ($9c00) und in display99 kommt die Bildschirmkopie rein ($7800).
Ich brauche also 2 komplette Bildschirme... ein sichtbarer und eine Kopie (unsichtbar).
Es wird eine zentrale Routine geben, die den jeweiligen Player printet - da jeder Player im Prinzip aus 3 kleinen Player zusammengesetzt ist, brauche ich hierfür nochmal die Variablen display1,2,3 (sichtbarer Bereich) und display199,299,399 Kopie unsichtbarer Bereich. Diese Variablen müssen in Page 0 liegen wegen der notwendigen indirekt indizierten Adressierung.
Da die zentrale Playerprintroutine alle Player versorgt, müssen notwendige Variablen definiert werden (tmp1-9, ystore, xstore,beweg und displayzw) - jeder Player hat dann entsprechende Variablen, die den gesamten Zustand des Players beinhalten und jeweils in die Playerhauptroutine übertragen und am Ende wieder rückübertragen werden.
Als nächstes folgen die Definition des Players selber - also wie er aussieht:
Player 11 12 13 definiert einen (!) Player. Alle drei Player in diesem Beispiel greifen also auf die gleiche Maske zu und sehen entsprechend auch gleich aus. Da wir hier drei kleinste Einheiten haben, brauche ich drei Playerdefinitionen jeweils für einen großen Player.
player11 definiert also eine Kleinsteinheit (eigentlich sogar 2 nebeneinander). 170,170,0 bedeutet 2 Balken nebeneinander und ein leeres Feld rechts davon. Ich beschreibe also beim printen des Players drei 4 Bit Felder auf dem Bildschirm nebeneinander (Antic D - 4Bit).
Darunter das Gleiche nochmal, aber um ein Bit nach rechts verschoben, dann nochmal ein Bit nach rechts und nochmal - wir simulieren hier letztlich ein Feinscroll nach rechts. Nach printen von player11,x (x=0) player11,x (x=1) player11,x (x=2) player11,x (x=3) wird der Player um eins nach rechts versetzt (quasi ein grobscroll) und dann kommt wieder player11,x (x=0) ... das macht die Bewegung nach rechts.
Bewegung nach links ist im Prinzip ähnlich, man kommt aber von x=3 und printet bis x=0
Wozu die Masken?
Die Masken brauchen wir letztlich, um die Player nicht nur auf den Bildschirm zu printen, sondern um den Player mit dem Bildschirm zu fusionieren. Die Masken sind quasi ein Spiegelbild der Player und bewirken bei einer AND-Verknüpfung mit dem originalen Bildschirminhalt das voher Löschen des Bildschirminhaltes genau da, wo Inhalte des Player hinkommen. Überall da, wo der Player keinen Inhalt hat (also eine Null) soll ja der Bildschirminhalt sichtbar sein und das mache ich halt mit der Maske. Der eigentliche Schritt ist einfach und immer gleich:
Bildschirminhalt
AND
MaskePlayer
EOR
Playerinhalt
Das werde ich später nochmal etwas genauer erklären!
in bewegung1,2,3 habe ich mal ganz einfache Bewegungsmuster definiert: 1 = Player nach oben, 3 nach rechts, 5 nach unten, 7 nach links und die ganzen Zwischenstufen 2,4,6,8 für die Schrägbewegungen.
So viel zunächst dazu.
Danach erkläre ich das Hauptprogramm - also Aufbau des Testbildschirmes, Ablauf des Programmes und die Startwerte für die drei Player...
Ich hoffe alles ist einigermaßen verständlich, falls nicht, dann gerne nachfragen!
Gruß
Peter
- LarsImNetz
- Beiträge: 172
- Registriert: 24.08.2021 18:27
- Has thanked: 127 times
- Been thanked: 89 times
- Kontaktdaten:
Re: Tanz der Sprites
Ich finde das mit den Software Sprites von Dir voll cool.
Ich spiele gerade mit den Atari Hardware Player/Missiles rum. Genauer mit der MultiSprite Routine von Tebe/Shanti77. So langsam komme ich hinter das Geheimnis und habe den Source für mich schon stark angepasst.
Hier mal eine Demo: Das es nicht so stark flackert ist dem Altirra Emulator zu verdanken, wenn man in der Configuration unter Video das Frame blending aktiviert. Das entspricht wohl mehr den alten Röhrenmonitoren mit nachleuchtender Plasmaschicht die Älteren wissen was ich meine.
Hier werden 15 Sprites angezeigt, mein nächstes Game braucht allerdings nur max 8-10 Sprites und das auch nur in Single-Color. Werde den Code also für die Single-Sprites noch überarbeiten. Damit es nicht flackert, wenn ich 4 Sprites in einer Zeile zeige. Zudem sind einige Objekte höher als 16 Bytes.
BTW: Der Source-Code von Tebe/Shanti77 ist fürchterlich, sehr viel SMC (Self-Modified-Code), Bedingte Sprünge mit Bxx *+n wird viel verwendet, was in die Hose geht, wenn die zu überspringenden Bytes sich ändern von z.B. 2Byte auf 1Byte (Zero-Page). Da werden Tabellen an Adressen+128 gesucht. Statt 2 Tabellen mit low und high Byte zu verwenden. Dann das polnisch in den Kommentaren/Variablen Namen. Gut das es mittlerweile translate.google.de gibt.
Allerdings sind da auch ein paar coole Sachen drin, ein Optimizer der Sprite-Routinen erstellt und die 32 Bytes in weniger als 200 Zyklen in den Player/Missile Grafik kopiert. Schon krass. Mein schnellstes Move braucht dazu ~450Zyklen. Dafür ist es kleiner.
Ich schreibe mir den Code jedenfalls so um, das es einfacher ist ihn wieder zu verwenden.
BTW: Das Demo selbst funktioniert so wie es gerade ist nicht mehr sauber auf NTSC Maschinen, weil der Atari einfach nicht schnell genug ist.
LG
Lars
Ich spiele gerade mit den Atari Hardware Player/Missiles rum. Genauer mit der MultiSprite Routine von Tebe/Shanti77. So langsam komme ich hinter das Geheimnis und habe den Source für mich schon stark angepasst.
Hier mal eine Demo: Das es nicht so stark flackert ist dem Altirra Emulator zu verdanken, wenn man in der Configuration unter Video das Frame blending aktiviert. Das entspricht wohl mehr den alten Röhrenmonitoren mit nachleuchtender Plasmaschicht die Älteren wissen was ich meine.
Hier werden 15 Sprites angezeigt, mein nächstes Game braucht allerdings nur max 8-10 Sprites und das auch nur in Single-Color. Werde den Code also für die Single-Sprites noch überarbeiten. Damit es nicht flackert, wenn ich 4 Sprites in einer Zeile zeige. Zudem sind einige Objekte höher als 16 Bytes.
BTW: Der Source-Code von Tebe/Shanti77 ist fürchterlich, sehr viel SMC (Self-Modified-Code), Bedingte Sprünge mit Bxx *+n wird viel verwendet, was in die Hose geht, wenn die zu überspringenden Bytes sich ändern von z.B. 2Byte auf 1Byte (Zero-Page). Da werden Tabellen an Adressen+128 gesucht. Statt 2 Tabellen mit low und high Byte zu verwenden. Dann das polnisch in den Kommentaren/Variablen Namen. Gut das es mittlerweile translate.google.de gibt.
Allerdings sind da auch ein paar coole Sachen drin, ein Optimizer der Sprite-Routinen erstellt und die 32 Bytes in weniger als 200 Zyklen in den Player/Missile Grafik kopiert. Schon krass. Mein schnellstes Move braucht dazu ~450Zyklen. Dafür ist es kleiner.
Ich schreibe mir den Code jedenfalls so um, das es einfacher ist ihn wieder zu verwenden.
BTW: Das Demo selbst funktioniert so wie es gerade ist nicht mehr sauber auf NTSC Maschinen, weil der Atari einfach nicht schnell genug ist.
LG
Lars
- Dr. Irata
- Beiträge: 968
- Registriert: 24.08.2021 14:40
- Has thanked: 121 times
- Been thanked: 289 times
- Kontaktdaten:
Re: Tanz der Sprites
Hallo Lars,
vielen Dank für deinen Beitrag.
Ich hatte im Netz auch schon einige Beispiele gesehen, wo bis zu 60 Player über den Bildschirm huschen. Ich glaube da wird ganz viel mit DLI gearbeitet. Das Problem erschien mir immer dabei ein Flackern und schwieriges Handling wenn die Player frei überall hinfliegen - dann aauch mit starkem Flackern.
Wenn man eine moderate Anzahl von Playern nimmt, kann man das vielleicht viel stabiler hinbekommen - jedenfalls ist die Technik sehr interessant und ich bin höchst interessiert an deiner Analyse. Vielleicht kannst du es "uns" ja hier im Forum auch mir ein paar guten Erklärungen nahebringen - wenn du das möchtest... also ich bin immer sehr interessiert an neuen Techniken.
Es ist schon toll, was man aus dieser alten Kiste rausquetschen kann...
Gruß
Peter
vielen Dank für deinen Beitrag.
Ich hatte im Netz auch schon einige Beispiele gesehen, wo bis zu 60 Player über den Bildschirm huschen. Ich glaube da wird ganz viel mit DLI gearbeitet. Das Problem erschien mir immer dabei ein Flackern und schwieriges Handling wenn die Player frei überall hinfliegen - dann aauch mit starkem Flackern.
Wenn man eine moderate Anzahl von Playern nimmt, kann man das vielleicht viel stabiler hinbekommen - jedenfalls ist die Technik sehr interessant und ich bin höchst interessiert an deiner Analyse. Vielleicht kannst du es "uns" ja hier im Forum auch mir ein paar guten Erklärungen nahebringen - wenn du das möchtest... also ich bin immer sehr interessiert an neuen Techniken.
Es ist schon toll, was man aus dieser alten Kiste rausquetschen kann...
Gruß
Peter
- Dr. Irata
- Beiträge: 968
- Registriert: 24.08.2021 14:40
- Has thanked: 121 times
- Been thanked: 289 times
- Kontaktdaten:
Re: Tanz der Sprites
jetzt habe ich doch tatsächlich nach der langen Zeit noch einen relativ elementaren Fehler in der Routine gefunden, anbei jetzt der richtige Code:
Code: Alles auswählen
org 4096
dlist .by 117,117,117
.by 93,210,155
.by 93,0,156
.by 93,80,156
.by 93,160,156
.by 93,0,157
.by 93,80,157
.by 221,160,157
.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
display = 228
display99 = 230
;------ Speicher und Variablen für Player allgemein ----------
display1 = 232
display2 = 234
display3 = 236
display199 = 238
display299 = 240
display399 = 242
tmp1 = 1000
tmp2 = 1001
tmp3 = 1002
tmp4 = 1003
tmp5 = 1004
tmp6 = 1005
tmp7 = 1006
tmp8 = 1007
tmp9 = 1008
displayzw = 1009
ystore = 1011
xstore = 1012
beweg = 1013
randomp .by 00
;------ Variablen für die Warteschleifen -----------------------
delay = 1020
schleife1 = 1021
schleife2 = 1022
;------ Variablen für Player1 ----------------------------------
zaehler1 = 1100
display11 = 1102
display21 = 1104
display31 = 1106
tmp11 = 1108
tmp21 = 1109
tmp31 = 1110
tmp41 = 1111
tmp51 = 1112
tmp61 = 1113
tmp71 = 1114
tmp81 = 1115
tmp91 = 1116
displayzw1 = 1117
ystore1 = 1118
xstore1 = 1119
;------ Variablen für Player2 ----------------------------------
zaehler2 = 1120
display12 = 1122
display22 = 1124
display32 = 1126
tmp12 = 1128
tmp22 = 1129
tmp32 = 1130
tmp42 = 1131
tmp52 = 1132
tmp62 = 1133
tmp72 = 1134
tmp82 = 1135
tmp92 = 1136
displayzw2 = 1137
ystore2 = 1138
xstore2 = 1139
;------ Variablen für Player3 ----------------------------------
zaehler3 = 1140
display13 = 1142
display23 = 1144
display33 = 1146
tmp13 = 1148
tmp23 = 1149
tmp33 = 1150
tmp43 = 1151
tmp53 = 1152
tmp63 = 1153
tmp73 = 1154
tmp83 = 1155
tmp93 = 1156
displayzw3 = 1157
ystore3 = 1158
xstore3 = 1159
;---------------------------------------------------------------
player11 .by 170,170,0
.by 42,170,128
.by 10,170,160
.by 2,170,168
player12 .by 85,85,0
.by 21,85,64
.by 5,85,80
.by 1,85,84
player13 .by 170,170,0
.by 42,170,128
.by 10,170,160
.by 2,170,168
maske11 .by 0,0,255
.by 192,0,63
.by 240,0,15
.by 252,0,3
maske12 .by 0,0,255
.by 192,0,63
.by 240,0,15
.by 252,0,3
maske13 .by 0,0,255
.by 192,0,63
.by 240,0,15
.by 252,0,3
bewegung1 .by 3,3,3,4,4,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,6,7,7,7,7,7,7,8,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2
bewegung2 .by 5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
bewegung3 .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5
.proc main
mwa #39936 display ;--- hier fängt die Bildschirmadresse an 0,156 = 256x156
mwa #30720 display99
mwa #dlist 560
ldx #0 ;Bildschirm füllen
ldy #0
@ inc randomp
lda randomp
sta tmp1
#if .byte tmp1>#40
;jmp @-
#end
sta (display),y
sta (display99),y
iny
bne @-
inc display+1
inc display99+1
clc
inx
cpx #31
bne @-
;-------------------- Variablen Player1 init ---------
mva #0 display11
mva #80 display21
mva #160 display31
lda #170
sta display11+1
sta display21+1
sta display31+1
mva #0 zaehler1
ldy #34
sty ystore1
;-------------------- Variablen Player2 init ---------
mva #0 display12
mva #80 display22
mva #160 display32
lda #173
sta display12+1
sta display22+1
sta display32+1
mva #0 zaehler2
ldy #44
sty ystore2
;-------------------- Variablen Player3 init ---------
mva #0 display13
mva #80 display23
mva #160 display33
lda #165
sta display13+1
sta display23+1
sta display33+1
mva #0 zaehler3
ldy #44
sty ystore3
;--------------------------Hauptprogramm----------------------------
loop
jsr player1
jsr player2
jsr player3
mva #4 delay
jsr warte2
jmp loop
.endp
;--------------------------Subroutinen------------------------------
.proc warte2
mva #0 schleife1
mva #0 schleife2
@ inc schleife1
#if .byte schleife1<#255
jmp @-
#end
mva #0 schleife1
inc schleife2
#if .byte schleife2<delay
jmp @-
#end
rts
.endp
.proc player1
mwa display11 display1
mwa display21 display2
mwa display31 display3
mva tmp11 tmp1
mva tmp21 tmp2
mva tmp31 tmp3
mva tmp41 tmp4
mva tmp51 tmp5
mva tmp61 tmp6
mva tmp71 tmp7
mva tmp81 tmp8
mva tmp91 tmp9
mva displayzw1 displayzw
mva ystore1 ystore
mva xstore1 xstore
ldx zaehler1
lda bewegung1,x
sta beweg
jsr player.bewegung
inc zaehler1
#if .byte zaehler1=#79
mva #0 zaehler1
#end
mwa display1 display11
mwa display2 display21
mwa display3 display31
mva tmp1 tmp11
mva tmp2 tmp21
mva tmp3 tmp31
mva tmp4 tmp41
mva tmp5 tmp51
mva tmp6 tmp61
mva tmp7 tmp71
mva tmp8 tmp81
mva tmp9 tmp91
mva displayzw displayzw1
mva ystore ystore1
mva xstore xstore1
#if .byte ystore1<=#0
jsr player.restore
mva #0 display11
mva #80 display21
mva #160 display31
lda #170
sta display11+1
sta display21+1
sta display31+1
mva #0 zaehler1
ldy #34
sty ystore1
#end
rts
.endp
.proc player2
mwa display12 display1
mwa display22 display2
mwa display32 display3
mva tmp12 tmp1
mva tmp22 tmp2
mva tmp32 tmp3
mva tmp42 tmp4
mva tmp52 tmp5
mva tmp62 tmp6
mva tmp72 tmp7
mva tmp82 tmp8
mva tmp92 tmp9
mva displayzw2 displayzw
mva ystore2 ystore
mva xstore2 xstore
ldx zaehler2
lda bewegung3,x
sta beweg
jsr player.bewegung
inc zaehler2
#if .byte zaehler2=#79
mva #0 zaehler2
#end
mwa display1 display12
mwa display2 display22
mwa display3 display32
mva tmp1 tmp12
mva tmp2 tmp22
mva tmp3 tmp32
mva tmp4 tmp42
mva tmp5 tmp52
mva tmp6 tmp62
mva tmp7 tmp72
mva tmp8 tmp82
mva tmp9 tmp92
mva displayzw displayzw2
mva ystore ystore2
mva xstore xstore2
#if .byte ystore2<=#0
jsr player.restore
mva #0 display12
mva #80 display22
mva #160 display32
lda #173
sta display12+1
sta display22+1
sta display32+1
mva #0 zaehler2
ldy #44
sty ystore2
#end
rts
.endp
.proc player3
mwa display13 display1
mwa display23 display2
mwa display33 display3
mva tmp13 tmp1
mva tmp23 tmp2
mva tmp33 tmp3
mva tmp43 tmp4
mva tmp53 tmp5
mva tmp63 tmp6
mva tmp73 tmp7
mva tmp83 tmp8
mva tmp93 tmp9
mva displayzw3 displayzw
mva ystore3 ystore
mva xstore3 xstore
ldx zaehler3
lda bewegung2,x
sta beweg
jsr player.bewegung
inc zaehler3
#if .byte zaehler3=#79
mva #0 zaehler3
#end
mwa display1 display13
mwa display2 display23
mwa display3 display33
mva tmp1 tmp13
mva tmp2 tmp23
mva tmp3 tmp33
mva tmp4 tmp43
mva tmp5 tmp53
mva tmp6 tmp63
mva tmp7 tmp73
mva tmp8 tmp83
mva tmp9 tmp93
mva displayzw displayzw3
mva ystore ystore3
mva xstore xstore3
#if .byte ystore3<=#0
jsr player.restore
mva #0 display13
mva #80 display23
mva #160 display33
lda #165
sta display13+1
sta display23+1
sta display33+1
mva #0 zaehler3
ldy #44
sty ystore3
#end
rts
.endp
.proc player
bewegung #if .byte beweg=#7
jsr player.nachlinks
#end
#if .byte beweg=#3
jsr player.nachrechts
#end
#if .byte beweg=#5
jsr player.nachunten
#end
#if .byte beweg=#1
jsr player.nachoben
#end
#if .byte beweg=#2
jsr player.nachoben
jsr player.nachrechts
#end
#if .byte beweg=#4
jsr player.nachunten
jsr player.nachrechts
#end
#if .byte beweg=#8
jsr player.nachoben
jsr player.nachlinks
#end
#if .byte beweg=#6
jsr player.nachunten
jsr player.nachlinks
#end
rts
nachoben
ldy ystore
ldx xstore
jsr restore
mva display1 displayzw
#if .byte displayzw=#160
mva #80 display1
mva #160 display2
dec display2+1
mva #0 display3
#end
#if .byte displayzw=#80
mva #0 display1
mva #80 display2
mva #160 display3
dec display3+1
#end
#if .byte displayzw=#0
mva #160 display1
dec display1+1
mva #0 display2
mva #80 display3
#end
ldy ystore
jsr store
ldy ystore
ldx xstore
jsr print
jsr store
rts
nachunten
ldy ystore
ldx xstore
jsr restore
mva display3 displayzw
#if .byte displayzw=#160
mva #0 display3
inc display3+1
mva #80 display1
mva #160 display2
#end
#if .byte displayzw=#0
mva #80 display3
mva #0 display2
inc display2+1
mva #160 display1
#end
#if .byte displayzw=#80
mva #160 display3
mva #80 display2
mva #0 display1
inc display1+1
#end
ldy ystore
ldy ystore
ldx xstore
jsr print
jsr store
rts
nachrechts
ldy ystore
ldx xstore
inx
inx
inx
stx xstore
#if .byte xstore=#12
ldx #0
stx xstore
jsr restore
mva tmp2 tmp1
mva tmp3 tmp2
mva tmp5 tmp4
mva tmp6 tmp5
mva tmp8 tmp7
mva tmp9 tmp8
inc ystore
ldy ystore
iny
iny
lda (display1),y
sta tmp3
clc
ldy ystore
iny
iny
lda (display2),y
sta tmp6
clc
ldy ystore
iny
iny
lda (display3),y
sta tmp9
ldy ystore
#end
jsr print
jsr store
#if .byte ystore=#45
dey
#end
rts
nachlinks
ldy ystore
ldx xstore
dex
dex
dex
stx xstore
#if .byte xstore=#253
ldx #9
stx xstore
jsr restore
mva tmp2 tmp3
mva tmp1 tmp2
mva tmp5 tmp6
mva tmp4 tmp5
mva tmp8 tmp9
mva tmp7 tmp8
dec ystore
ldy ystore
lda (display1),y
sta tmp1
clc
ldy ystore
lda (display2),y
sta tmp4
clc
ldy ystore
lda (display3),y
sta tmp7
ldy ystore
#end
jsr print
jsr store
#if .byte ystore=#1
iny
#end
rts
print ;Player printen + Fusion Bildschirm
lda tmp1
and maske11,x
eor player11,x
sta (display1),y
inx
iny
lda tmp2
and maske11,x
eor player11,x
sta (display1),y
inx
iny
lda tmp3
and maske11,x
eor player11,x
sta (display1),y
ldx xstore
clc
ldy ystore
lda tmp4
and maske12,x
eor player12,x
sta (display2),y
inx
iny
lda tmp5
and maske12,x
eor player12,x
sta (display2),y
inx
iny
lda tmp6
and maske12,x
eor player12,x
sta (display2),y
ldx xstore
clc
ldy ystore
lda tmp7
and maske13,x
eor player13,x
sta (display3),y
inx
iny
lda tmp8
and maske13,x
eor player13,x
sta (display3),y
inx
iny
lda tmp9
and maske13,x
eor player13,x
sta (display3),y
rts
store ;Bildschirm in tmp sichern
sec
lda display1+1
sbc #36
sta display199+1
sec
lda display2+1
sbc #36
sta display299+1
sec
lda display3+1
sbc #36
sta display399+1
mva display1 display199
mva display2 display299
mva display3 display399
ldy ystore
lda (display199),y
sta tmp1
iny
lda (display199),y
sta tmp2
iny
lda (display199),y
sta tmp3
clc
ldy ystore
lda (display299),y
sta tmp4
iny
lda (display299),y
sta tmp5
iny
lda (display299),y
sta tmp6
clc
ldy ystore
lda (display399),y
sta tmp7
iny
lda (display399),y
sta tmp8
iny
lda (display399),y
sta tmp9
rts
restore ;tmp in Bildschirm printen (restore)
lda tmp1
sta (display1),y
iny
lda tmp2
sta (display1),y
iny
lda tmp3
sta (display1),y
clc
ldy ystore
lda tmp4
sta (display2),y
iny
lda tmp5
sta (display2),y
iny
lda tmp6
sta (display2),y
clc
ldy ystore
lda tmp7
sta (display3),y
iny
lda tmp8
sta (display3),y
iny
lda tmp9
sta (display3),y
rts
.endp
run main
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast