Tanz der Sprites

Moderator: Rockford

Antworten
Benutzeravatar
Dr. Irata
Beiträge: 890
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 263 times
Kontaktdaten:

Tanz der Sprites

Beitrag von Dr. Irata »

.... und damit es übersichtlicher wird, beginne ich von ganz vorne und nenne es Tanz der Sprites!

Das kleine Programm wird dann folgendes erzeugen:
TdS.MOV
(1.64 MiB) 74-mal heruntergeladen

Gruß

Peter

Benutzeravatar
Dr. Irata
Beiträge: 890
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 263 times
Kontaktdaten:

Re: Tanz der Sprites

Beitrag von Dr. Irata »

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

Benutzeravatar
Dr. Irata
Beiträge: 890
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 263 times
Kontaktdaten:

Re: Tanz der Sprites

Beitrag von Dr. Irata »

Part 1 - die Displaylist:

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

Benutzeravatar
pps
Beiträge: 511
Registriert: 18.06.2021 23:05
Has thanked: 112 times
Been thanked: 204 times
Kontaktdaten:

Re: Tanz der Sprites

Beitrag von pps »

$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.
PP´s of STARSOFTBerlin__________github|meine Webseite

Benutzeravatar
Dr. Irata
Beiträge: 890
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 263 times
Kontaktdaten:

Re: Tanz der Sprites

Beitrag von Dr. Irata »

... 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 ;-)

Benutzeravatar
pps
Beiträge: 511
Registriert: 18.06.2021 23:05
Has thanked: 112 times
Been thanked: 204 times
Kontaktdaten:

Re: Tanz der Sprites

Beitrag von pps »

Ich habe es ja nur erwähnt, damit es nochmal da steht ;)
PP´s of STARSOFTBerlin__________github|meine Webseite

Benutzeravatar
Dr. Irata
Beiträge: 890
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 263 times
Kontaktdaten:

Re: Tanz der Sprites

Beitrag von Dr. Irata »

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		
Ich habe jetzt die Variablen etwas angepasst und in die unkritische Page 6 gesetzt, außerdem startet das Programm bei $2000
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

Benutzeravatar
LarsImNetz
Beiträge: 149
Registriert: 24.08.2021 18:27
Has thanked: 105 times
Been thanked: 79 times
Kontaktdaten:

Re: Tanz der Sprites

Beitrag von LarsImNetz »

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:
demo-15-sprites-multicolor.mp4
(1.65 MiB) 76-mal heruntergeladen
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. :D

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

Benutzeravatar
Dr. Irata
Beiträge: 890
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 263 times
Kontaktdaten:

Re: Tanz der Sprites

Beitrag von Dr. Irata »

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

Benutzeravatar
Dr. Irata
Beiträge: 890
Registriert: 24.08.2021 14:40
Has thanked: 110 times
Been thanked: 263 times
Kontaktdaten:

Re: Tanz der Sprites

Beitrag von Dr. Irata »

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

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast