Return to Phobos

Moderator: Rockford

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Return to Phobos

Beitrag von Prodehl »

Wo stehe ich gerade?
Die Steuerung des Raumschiffs ist fertig und ich habe am Wochenende den ersten Missile als "Schuss" fertig gestellt.
Jetzt kommt Schuss 2 - also wie bei Phobos soll das Raumschiff abwechselnd links und rechts schiessen können. Das werde ich nächste Woche implementieren und dann den Code hier hochladen.
Das ist gar nicht so unkompliziert zu programmieren und ich habe beschlossen, daß ich auf die erweiterten Möglichkeiten vom MADS Crossassembler zurückgreife und if - Bedingungen in den Code mit einbeziehe. Das macht den Code lesbarer und auch einfacher für mich zu programmieren...
Die Compabilität zu den alten Assemblern nimmt natürlich ab... ich hoffe ihr könnt auch zukünftig den Code nachvollziehen!
Wer aktuell in Assembler programmieren will sollte tatsächlich auf die Umgebung Eclipse mit WUDSN und MADS-Assembler zurückgreifen!
LG
Peter

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Player und Schüsse funktionieren jetzt

Beitrag von Prodehl »

Sooooo .... ich habe heute die Schüsse des Raumschiffes drin!
Dabei habe ich mir ganz schön die Programmierfinger verbogen, denn zwei Missiles so zu programmieren, das sie abwechselnd aus dem rechten bzw. linken "Schussrohr" des Raumschiffes loslaufen und je nach Schusslänge auch durchaus gleichzeitig zu sehen sind ... also zur richtigen Zeit jeweils sperren und freigeben etc. war ganz schön tricky... aber es läuft jetzt. Der Code dafür sieht recht umständlich aus und ich habe mehrere Hilfsvariablen benutzen müssen - es läuft auch noch nicht komplett fehlerfrei - je nach Höhe des Raumschiffes mehr oder weniger gut! Hier muss ich noch ein wenig den Code verfeinern...

Hier der Code für den Header:

Code: Alles auswählen

var1 = $a0
var2 = $a2
var3 = $a4
var4 = $a6
var5 = $a8
var6 = $b2
var7 = $b4
lms1 = $b6
lms2 = $b8
lmslo = $a0
lmshi = $a2
delay = $b0

play1 = $92
play2 = $94
play3 = $96
play4 = $98

miss1 = $c0
miss2 = $c2
miss3 = $c4
miss4 = $c6
rechts = $c8
links = $c9
xposp1 = $ca
yposp1 = $cb
joyst1 = $cc
kollp0 = $cd

xposm1 = $ce
yposm1 = $cf
xposm2 = $d0
yposm2 = $d1
kollm1 = $d2
kollm2 = $d3

feuer1 = $d4
feuer2 = $d5
yposm1hilf = $d6
feuer3 = $d7
feuer4 = $d8
yposm2hilf = $d9
feuer5 = $da
Und hier der Programmcode:

Code: Alles auswählen

			



			org $2000
			
			icl '../hardware.txt'
			icl '../header.txt'
			icl 'character.asm'
			icl 'lands.asm'	
        
dlist   		.byte 112,112,112,100
			.byte 30,75
			.byte 36,36,36,36,36,36,36,36,36,36,36,36
			.byte 36,36,36,36,36,36,36,36,36,4,112
			.byte 65,32,156
			
pm1			.byte 0,24,60,36,36,126,126,255,219,219,129,129,129,0

mi1			.byte 15,15,15,15
mi2			.byte 12,12,12,12
mi3			.byte 12,12,12,12

mi4			.byte 12,12,12,12
			
			
						
			.proc main
			
main1		jsr displaylist ;Subroutine Displaylist-Aufbau
			mva #33 yposp1
			mva #120 xposp1
			mva #42 yposm1
			mva #0 xposm1
			mva #94 yposm2
			mva #100 xposm2
						
Start1		mva #>chr chbas ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 (16 Farben) initialisieren
			mva #0 color4	;Hintergrundfarbe / Helligkeit festlegen		
			lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1
			mva <lands var6
			mva >lands var6+1
			mva #0 kollp0
			
			; Player vorbereiten und initialisieren

			lda ramtop
			sec
			sbc #16
			sta pmbase
			clc
			adc #3
			sta miss1+1
			adc #1
			sta play1+1
			
			mva #62 sdmctl
			mva #220 pcolr0
			mva #220 pcolr1
			mva #122 pcolr2
			mva #122 pcolr3
			mva #1 gprior
			mva #3 gractl
			mva #1 sizep0
			mva #1 sizep1
			mva #0 sizem
			mva #0 rechts
			mva #2 hitclr
			
			
						
main2		
			ldy #255				;Speicher Player 1 leeren
			lda #0
			sta play1
@			sta (play1),y
			dey
			bpl @-
			clc
			ldy yposp1					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			iny
			inx
			cpx #14
			bne @-
			
			clc
			ldy #0
			ldx #0
@			lda mi1,x
			sta (miss1),y
			iny
			inx
			cpx #2
			bne @-
			lda xposm1
			sta p0pf
			lda xposm2
			sta p1pf
			ldx #>vbinter			;VB-Interrupt VektorHi
			ldy #<vbinter			;VB-Interrupt VektorLo
			lda #7					;Deferred Mode mit lda #7 festlegen
			jsr setvbv				;Vektor für die eigene Routine über setvbv eintragen
			
			
						
hauptprogramm
			
			clc
			lda kollp0
			cmp #1
			bcc @+
			jsr kollision
			jmp start1
@			
				
			jsr letztereihe 		;letzte Reihe (lands) Bildschirm1 printen (sichtbar)	
			jsr feinscroll 			;Feinscroll Bildschirm1 ausführen (sichtbar)
									
			mva #$30 var1			;var1 auf 30000 ($7530) setzen
			mva #$75 var1+1
			mva #$f0 var2			;var2 auf 30960 ($78f0) setzen
			mva #$78 var2+1
			
			jsr grobscroll			;Bildschirm1 kopieren + grobscroll
		
			mva #$18 var1			;var1 + var2 auf 31000 ($7918) setzen
			mva #$18 var2
			mva #$79 var1+1
			mva #$79 var2+1	
			
			mva #1 delay
 			jsr wartes
			
			jsr umschalten			;umschalten auf Bildschirm2 - Bildschirm2 wird sichtbar	
			jsr letztereihe
			jsr feinscroll			;Feinscroll Bildschirm2 ausführen (sichtbar)						

			mva #$08 var2			;var1 auf 29960 ($7508) setzen
			mva #$75 var2+1
			mva #$18 var1			;var2 auf 31000 ($7918) setzen
			mva #$79 var1+1
				
			jsr grobscroll			;;Bildschirm2 kopieren + grobscroll
			
			mva #$30 var1			;var1 + var2 auf 30000 ($7530) setzen
			mva #$30 var2
			mva #$75 var1+1
			mva #$75 var2+1

			mva #1 delay
 			jsr wartes
			jsr umschalten			;umschalten auf Bildschirm1 - Bildschirm1 wird sichtbar
			

			;Ende der Bildschirmausführung / Kontrolle Durchläufe

			sec
			lda #38 				; - 36 = Anzahl der Durchläufe
			sbc var6+1
			bpl @+
							
			jmp start1						;Stop hier

@		 	jmp hauptprogramm	 			;weiter
			
			.endp
			
			; _____________________________________________________________________________________
			;
			; ---------------------------- S U B R O U T I N E N ----------------------------------
			; _____________________________________________________________________________________

			

			
								;vertical blank interrupt für Joystick / PM

vbinter			
			pha
			txa
			pha
			clc					;Kollision Player 0 Abfragen
			lda p0pf
			cmp #1
			bcc @+
			mva #1 kollp0
@			mva #2 hitclr

			clc					;Joystickabfragen Player1
			lda stick0
			cmp #15				;keine Joystickaktion
			bcs @+
			cmp #14
			bcs nachob
			cmp #13
			bcs nachun
			cmp #11
			bcs nachli
			cmp #10
			bcs nachliob
			cmp #9
			bcs nachliun
			sec
			cmp #7
			bcs nachre
			cmp #6
			bcs nachreob
			cmp #5
			bcs nachreun
@			jmp write

nachre		clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
@			jmp write

nachreun
			clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
@			jmp nachun

nachreob
			clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
@			jmp nachob

nachli		sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
@			jmp write

nachliun
			sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
@			jmp nachun

nachliob
			sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
@			jmp nachob

nachob
			dec yposp1
			clc
			ldy yposp1					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			iny
			inx
			cpx #14
			bne @-
			
			
			jmp write

nachun
			
			inc yposp1
			clc
			ldy yposp1					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			iny
			inx
			cpx #14
			bne @-
			
			jmp write
			
@			clc
write		
			lda xposp1 
			sta hposp0
			;---------- Abfrage Feuerknopf und Routine Schuss links-------
			#if .byte strig0<#1 .and .byte feuer3=#0
			#if .byte feuer5=#0 .or .byte feuer5>#180
			mva #1 feuer1
			mva #1 feuer3
			mva xposp1 p0pf
			lda yposp1
			adc #9
			sta feuer2
			#end
			#end
			#if .byte feuer1=#1		
			ldy feuer2
			lda #0
			sta (miss1),y
			iny
			sty feuer2
			iny
			lda #3
			sta (miss1),Y
			#if .byte feuer2=#210
			mva #0 feuer1
			mva #0 feuer2
			lda #0
			dey
			sta (miss1),y
			iny
			sta (miss1),y
			#end
			#end
			;-------------------------------------------------------------

			;---------- Abfrage Feuerknopf und Routine Schuss links-------		
			#if .byte strig0<#1 .and feuer3=#1
			#if .byte feuer2=#0 .or .byte feuer2>#180
			mva #1 feuer4
			mva #0 feuer3
			lda xposp1 
			adc #13
			sta p1pf
			lda yposp1
			adc #9
			sta feuer5
			#end
			#end
			#if .byte feuer4=#1		
			ldy feuer5
			lda #0
			sta (miss1),y
			iny
			sty feuer5
			iny
			lda #12
			sta (miss1),Y
			#if .byte feuer5=#210
			mva #0 feuer4
			mva #0 feuer5
			lda #0
			dey
			sta (miss1),y
			iny
			sta (miss1),y
			#end
			#end
			;-------------------------------------------------------------
@			
			pla
			tax
			pla
			jmp xitvbv			;vb-interrupt wird über xitvbv beendet!!



			; -------------------------------------------------------------------------------------

kollision
			
			lda #22
			sta delay
			jsr wartes
			rts
			
			
			


			; -------------------------------------------------------------------------------------


umschalten
			ldy #4 				;Bildschirme umschalten von unsichtbar auf sichtbar	
			mva sdlstl var5
			mva sdlstl+1 var5+1
			lda var1
			sta (var5),y
			iny
			lda var1+1
			sta (var5),y
			rts

			; -------------------------------------------------------------------------------------

wartes		
			clc
 		   	ldx delay ; Warteschleife
st  		lda RTCLOK+2    
wa   		cmp RTCLOK+2    
        	beq wa    
        	dex            
        	bpl st 
        	rts
        	
        	; -------------------------------------------------------------------------------------
        	
feinscroll
			ldy #1
			mva #0 delay
@			jsr wartes
			sty vscrol
			iny
			cpy #8
			bne @-			
			rts
        	
        	; --------------------------------------------------------------------------------------
        	
grobscroll	
			;Den Bildschirm um eins hoch / Grobscrolling um eine Zeile

			ldx #22
@			ldy #$28
			clc
@			mva (var1),y (var2),y
			dey
			bpl @-
			clc
			lda var1
			adc #$28
			sta var1
			bcc @+
			inc var1+1
@			clc
			lda var2
			adc #$28
			sta var2
			bcc @+
			inc var2+1			
@			clc
			dex
			bpl @-3
			rts
			
			; -------------------------------------------------------------------------------
			
displaylist
			; initialisiere die Displaylist
			mva sdlstl var5
			mva sdlstl+1 var5+1
			ldy #0
			clc
@			lda dlist,y
			sta (var5),y
			iny
			cpy #34
			bne @-
			rts
			
			; ---------------------------------------------------------------------------------------
			
letztereihe
			;Die letzte Reihe printen 
			;Start der letzten Reihe bei var1 - Line 22
			lda var1
			adc #112
			sta var1
			inc var1+1
			inc var1+1
			inc var1+1
			ldy #0
			clc
			
			
			
			lda (var6),y ;Boarder1 holen
			sta var5 	;Boarderanzahl in var5 speichern
			lda var6
			adc #1
			sta var6
			ldy #0
			lda var6+1
			adc #0
			sta var6+1			
			lda (var6),y
			ldy var5
			
			
						
@			sta (var1),y ;Boarder1 printen
			dey
			bpl @-			
			clc
			lda var6
			adc #1
			sta var6
			ldy #0
			lda var6+1
			adc #0
			sta var6+1	
						
			lda (var6),y ;Rand Boarder1 holen
			inc var5	;Zeilenzähler eins weiter
			ldy var5
			sta (var1),y ;Rand Boarder1 printen
			clc
			lda var6
			adc #1
			sta var6
			ldy #0
			lda var6+1
			adc #0
			sta var6+1	
						
			lda(var6),y ;leer holen
			tax
			lda #0
			ldy var5			
@			iny			 
			sta (var1),y ; leer printen
			dex
			bpl @-
			
			
			
			sty var5 ;Zeilenzähler sichern
			clc
			lda var6
			adc #1
			sta var6
			ldy #0
			lda var6+1
			adc #0
			sta var6+1	
						
			lda(var6),y ;Rand Boarder2 holen
			ldy var5
			iny
			sty var5
			sta (var1),y ;Rand Boarder2 printen
			clc
			lda var6
			adc #1
			sta var6
			ldy #0
			lda var6+1
			adc #0
			sta var6+1	
			
			
						
			lda(var6),y ;Boarder2 holen
			tax 	;Boarderanzahl in x speichern
			clc
			lda var6
			adc #1
			sta var6
			ldy #0
			lda var6+1
			adc #0
			sta var6+1	
			lda (var6),y
			ldy var5
@			iny
			sta (var1),y	;Boarder2 printen
			dex
			bpl @-
			clc
			lda var6
			adc #1
			sta var6
			ldy #0
			lda var6+1
			adc #0
			sta var6+1
			mva #0 vscrol
			rts
			
			; ------------------------------------------------------------------------------
			
			
			run main
zu zu implementierende Landschaft (lands.asm) und Die Charaktertabelle (character.asm) sind noch unverändert!

Wenn erwünscht (für die, die nicht mit Eclipse arbeiten) kann ich auch eine kurze mov -Datei hochstellen ....

Gruß
Peter

Benutzeravatar
Kveldulfur
Beiträge: 198
Registriert: 17.08.2021 02:32
Has thanked: 61 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Sind diese "Grafikfehler" bei Dir auch, oder habe ich den Programmcode falsch übernommen?
Phobo1.png
Phobo1.png (5.75 KiB) 4027 mal betrachtet
Grüße

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

nimm mal für lands.asm diesen Code:

Code: Alles auswählen

;@com.wudsn.ide.asm.mainsourcefile=test1.asm
		

lands		.byte 8,2,8,19,10,9,2
			.byte 9,2,8,18,10,12,2
			.byte 9,2,8,17,10,13,2
			.byte 9,2,8,16,10,14,2
			.byte 9,2,8,15,10,16,2
			.byte 9,2,8,14,10,17,2
			.byte 9,2,8,13,10,17,2
			.byte 10,2,8,12,10,17,2
			.byte 11,2,8,11,10,18,2
			.byte 12,2,8,10,10,17,2
			.byte 13,2,8,10,10,15,2
			.byte 14,2,8,10,10,14,2
			.byte 14,2,8,10,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 8,2,8,19,6,8,2
			.byte 9,2,8,18,10,11,2
			.byte 9,2,8,17,10,12,2
			.byte 9,2,8,16,10,13,2
			.byte 9,2,8,15,10,15,2
			.byte 9,2,8,14,10,16,2
			.byte 9,2,8,13,10,17,2
			.byte 10,2,8,12,10,17,2
			.byte 11,2,8,11,10,18,2
			.byte 12,2,8,10,10,17,2
			.byte 13,2,8,10,10,15,2
			.byte 14,2,8,10,10,14,2
			.byte 14,2,8,10,10,14,2 ;34
			
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 12,2,8,10,10,17,2
			.byte 13,2,8,10,10,15,2
			.byte 14,2,8,10,10,14,2
			.byte 14,2,8,10,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 11,2,8,12,10,15,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 12,2,8,12,10,14,2 ;68
	
du hast wohl noch den älteren Code für lands.asm
... bislang habe ich nur eine Testlandschaft drin, die sich dann wiederholt. Daran werde ich jetzt aber relativ zeitnah dran arbeiten.
Vorher muss ich aber noch etwas am Player arbeiten und die Kollisionen müssen noch rein!

Benutzeravatar
Kveldulfur
Beiträge: 198
Registriert: 17.08.2021 02:32
Has thanked: 61 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Perfekt! Danke.

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

IMG_3928.MOV
(3 MiB) 69-mal heruntergeladen
soo ich habe den Antrieb drin und die Blinklichter…

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

... da meine Frau bis Donnerstag auf Achse ist und ich heute erst ab 15 Uhr zu arbeiten anfange, habe ich ein wenig Zeit zu programmieren...

Den Antrieb vom Raumschiff habe ich etwas angepasst und dabei festgestellt, dass der VBI so langsam ausgereizt ist.
Daher habe ich jetzt noch schnell die Kollisionsabfragen für das Raumschiff und die beiden Schüsse in den VBI programmiert. Die beiden Schüsse laufen wie gewohnt nach ganz unten durch wenn keine Barriere im Weg ist, treffen die Schüsse auf die Landschaft, verschwinden sie einfach. Wenn bestimmte Ziele getroffen werden, passiert eine bestimmte Aktion.... das folgt dann bald!
Ich habe jetzt einen Player für das Raumschiff und einen für den Antrieb benutzt, zwei Missile für die beiden Schüsse und zwei Missile fürs Blinken. Das läuft jetzt recht stabil, ab und zu passiert mal ein kleiner Grafikfehler, den ich noch nicht entdeckt habe. Später.....
Ich bin mir aber noch nicht so ganz sicher, ob ich das nochmal umprogrammieren muss... vielleicht baue ich später das Blinken um und nutze dafür einen Player - die beiden gesparten Missile nutze ich dann für 4 statt 2 Schüsse. Auch mit dem Aufbau der Schüsse bin ich nicht so ganz zufrieden, das muss ich nochmal grundsätzlich umprogrammieren, damit alles etwas schlanker und besser läuft...
Aber so wie es jetzt ist, funktioniert schon alles recht gut und ich baue jetzt erstmal die Landschaft aus.
Auch hier muss ich etwas umprogrammieren, denn der Aufbau der letzten Reihe (hier wird ja die Landschaft kontinuierlich aus den Datensätzen gebildet) beinhaltet noch nicht die Items, die das Raumschiff abschießen soll/muss.
Das gehe ich jetzt als nächstes an!
Gruß
Peter

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

... die Character habe ich angepasst - ein erstes "Item" ist fertig, nämlich der FUEL-Tank
... die Landschaft habe ich etwas erweitert: Statt 7 Bytes sind jetzt 9 Bytes pro Reihe hinterlegt, die letzten beiden Bytes legen in einer Reihe fest, welches Item an welcher Position geprintet wird - drei Tanks habe ich bereits integriert in die Landschaft, die ich entsprechend auch vergrößert habe...
... die letzte Reihe habe ich entsprechend angepasst, die Items werden jetzt erkannt (sofern in der Landschaft hinterlegt) und geprintet...
Gruß und ein schönes WE
Bildschirmfoto 2021-11-19 um 19.42.18.png

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

sehr schwierig..

Beitrag von Prodehl »

Am WE wollte ich mal kurz die Schusskollision weiter entwickeln und die entsprechende Explosion des Items (der Öltank) einfügen.
Leider habe ich hier massive Schwierigkeiten auf mehreren Ebenen bekommen.
Zunächst wollte ich die Kollisionsabfrage im VBI machen und im Hauptprogramm dann die weiteren Schritte der Erkennung der genauen Position und dann die Explosion einfügen. Beides funktionierte zunächst nicht so richtig und ich dachte, es müsse auch in den VBI komplett mit rein.
Das habe ich dann auch umgesetzt - und dabei feststellen müssen, daß er die Kollision nicht immer erkennt - ein Muster habe ich dabei nicht evaluieren können... dann kam noch die Schwierigkeit, die genaue Position des Tanks mit dem Missile zu koordinieren. Das ist in meinem Programm nicht so einfach, da der Missile eine volle Positionsauflösung hat und die Landschaft aus Charactern (8bit) aufgebaut ist. Ich muss also die x- und y-Position der Missiles zunächst umrechnen (teilen durch 8 in y und teilen durch 4 in x) und kämpfe noch mit einem Rundungsfehler.... das Teilen durch 8 geht mit drei ROR-Anweisungen!
Am Ende ist das Timing und wohl auch der Zusatzcode im VBI zu lang und gestern endlich kam der Durchbruch, wo ich es stabil geschafft habe, den Code für die Explosion im Hauptprogramm unterzubringen - im VBI gibt es zu viele Timing-Probleme.
Mein nächstes Projekt werde ich ganz anders strukturieren - das steht schon fest. Auch werde ich dann wohl mit einer ganz anderen Auflösung und Matrix arbeiten - das bringt zwar mehr Probleme was Speicher und Scrolling angeht, erleichtert aber mutmaßlich viele andere Dinge....

Ich frage mich auch zunehmend, ob es Sinn macht, den Code hier reinzustellen, denn der wird immer umfangreicher und unübersichtlicher trotz der Kommentare. Hier hätte ich gerne ein kurzes Feedback...

Liebe Grüße
Peter

Benutzeravatar
Kveldulfur
Beiträge: 198
Registriert: 17.08.2021 02:32
Has thanked: 61 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Moin!

Spontan würde ich vorschlagen auf Github den Quellcode zu posten. Dort lägen dann immer alle aktuellen Files die Du nutzt und man kann jederzeit sich dieses herunterladen. Jedoch kenne ich mich mit Github nicht aus, ob und wie schwer es ist dort den Code hochzuladen.

Ansonsten hätte ich schon Interesse an den Quellcode. Die Kollision und vorallem die Identifizierung des getroffenen Objekts würden mich sehr interessieren :-)

Der Quellcode kann nicht genug Remarks enthalten... dass merkt man aber erst, wenn man selber nach 3-4 Monaten etwas sucht :mrgreen:

Grüße
Janko

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

... mit Github kenne ich mich auch nicht so aus ...ich denke mal darüber nach!
Mit den Remarks hast du absolut Recht! Da muss ich noch viel mehr machen!!

Das Objekt nach der Kollision zu identifizieren geht jetzt ganz gut! Du hast ja die x- und y-Position des Missile zum Zeitpunkt des Treffers. Diese Werte auslesen und sichern.
Wenn du - so wie in diesem Projekt - mit Graphics 0 arbeitest (Zeile hat 40 Character a 8 Bit und Spalte hat 24 Character a 8 Bit), dann musst du für die x-Position des Missile zunächst 48 subtrahieren und dann mittels <clc ror clc ror> durch 4 teilen. Die y-Position des Missile (oder Players) bestimmst du für die Kollision indem du zunächst 32 subtrahierst und dann durch 8 teilst <clc ror clc ror clc ror>
... das Problem nun ist: Man weiß gar nicht, ob du den linken, rechten Rand oder die Mitte des Objektes getroffen hast... entsprechend hast du nie eine ganz genaue horizontale Position... das Problem habe ich noch nicht gelöst -> man müsste hier die Umgebung des Treffers abfragen bis eine Leerstelle kommt und dann hat man die genaue Position des Objektes ...

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Ich habe jetzt tatsächlich gerade eben mir die Mühe gemacht die Ränder abzufragen und entsprechend dann die Position zu korrigieren:

Code: Alles auswählen

			dey
			lda (var2),y
			sta var8
			iny
			iny
			lda (var2),y
			sta var9
			dey
			dey
			
			#if .byte var8=#0 .and .byte var9>#0
			iny
			#end
			#if .byte var8>#0 .and .byte var9=#0
			dey
			#end
		
			lda #45
			sta (var2),y
			iny
			sta (var2),y
			iny
			sta (var2),y
in var2 steht die Bildschirmadresse mit bereits korrekter y-Position
in y steht die x-Position beim Treffer des Missiles nach Korrektur (-48 /4)
in var8 geht der rechte Rand rein
in var9 geht der linke Rand rein
entsprechend verschiebe ich die x-Position um eins nach rechts oder links - oder gar nicht (mein Objekt ist 3 breit).
Lda#45 ist nur eine Hilfszahl - später baue ich hier die Explosion rein!!

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

jetzt habe ich noch den y-Wert - also die vertikale Position der Kollision abgefragt und entsprechend korrigiert.
Die Position am Item - also da wo die Explosion des Items bei Kollision mit dem Schuss stattfinden soll ist jetzt immer definiert und an gleicher Stelle - dafür habe ich jetzt tatsächlich erheblich Zeit und Code verwendet und frage mich natürlich, ob das nicht viel viel einfacher geht... bestimmt!! Aber egal, dieser Code und die entsprechende Logik stammt von mir und - hurra - funktioniert tadellos! Nach ca. 4 Tagen verzweifelten Kampfes ;-)
Der Subroutinencode:

Code: Alles auswählen

		kollitem
							;var8 unveränderter Bildschirmanfang 			
			lda yschuss1	;in Gr.0 -32 (sichtbarer Bereich ab 32 und /8
			sec
			sbc #32
			clc
			ror
			clc
			ror
			clc
			ror
			sta yschuss1	;y-Position in das x-Register schreiben
			tax	
			dex				; und einen abziehen
									
			lda xschuss1	;x-Position -48 (sichtbarer Bereich)und /4
			sec
			sbc #48
			clc
			ror
			clc
			ror
			tay				;in y geht die x-Position
			sec
			mva var1 var2		;holen der Bildschirmadresse -> var2
			mva var1+1 var2+1
			clc
@			
			lda var2		;jetzt die y-Position auf die richtige Höhe stellen
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			dex
			bpl @-			;die y-Position steht in x - Addition von x Zeilen
@			
			dey				;die korrekte x-Position einstellen
			lda (var2),y	;linken Rand checken
			sta var8		
			iny
			iny
			lda (var2),y	;rechten Rand checken
			sta var9
			dey
			dey
			
			#if .byte var8=#0 .and .byte var9>#0	;Position nach rechts anpassen 
			iny
			#end
			#if .byte var8>#0 .and .byte var9=#0	;Position nach links anpassen
			dey
			#end
			
			lda (var2),y		;2. Durchgang der Anpassung um letzte 
			sta var8			;Fehler zu beseitigen
			iny
			iny
			lda (var2),y
			sta var9
			dey
			dey
			
			#if .byte var8=#0 .and .byte var9>#0
			iny
			#end
			#if .byte var8>#0 .and .byte var9=#0
			dey
			#end
			
			lda (var2),y		;Korrektur der y-Position
			sta var8			;in var8 aktuelle BS-Position
			sec
			lda var2			;eins drüber - bleibt wenn var2 zu tief
			sbc #40
			sta var2
			lda var2+1
			sbc #0
			sta var2+1
			lda (var2),y		;lade Bildschirminhalt eins drüber
			sta var9			;das geht in var9 rein
			
			#if .byte var8>#0 .and .byte var9=#0	;alte Position var2 
			clc										;wiederherstellen
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
			#if .byte var8=#0 .and .byte var9=#0	;alte Position var2
			clc										;eins runter
			lda var2
			adc #80
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
			
			lda (var2),y		;2. Durchgang der Anpassung um letzte 
			sta var8			;Fehler zu beseitigen
			sec
			lda var2
			sbc #40
			sta var2
			lda var2+1
			sbc #0
			sta var2+1
			lda (var2),y
			sta var9
			
			#if .byte var8>#0 .and .byte var9=#0
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
			#if .byte var8=#0 .and .byte var9=#0
			clc
			lda var2
			adc #80
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
								;ab hier stimmt die Position des Items
								;in der Variable y für x-Position
								;und in var2 für die y-Position 
			lda #45
			sta (var2),y
			iny
			sta (var2),y
			iny
			sta (var2),y
			
			
			mva #2 hitclr
			
			mva #0 kollm1	


			rts
Dieser Code funktioniert auch für alle Kollisionen und steht entsprechend als Subroutine...
was folgt jetzt:
Bislang habe ich ja nur eine Dreierreihe als Simulation der Explosion geprintet - jetzt kommt die komplette Überschreibung des Items und dann die Animation dieser Explosionswolke...
Ich überlege noch, ob ich das folgendermaßen mache:
Entweder printe ich hintereinander verschiedene Werte in das Gebiet des Items - so daß es animiert aussieht.
Oder ich lösche das Items komplett und überlagere das Gebiet mit Player4, der selber eine Animation einer explodierenden Wolke darstellt. Problem hierbei ist, wenn ich mehrere Explosionen gleichzeitig darstellen muss.

Benutzeravatar
Kveldulfur
Beiträge: 198
Registriert: 17.08.2021 02:32
Has thanked: 61 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Ich habe mal gehört (gefährliches Halbwissen), dass man Berechnungen möglichst vermeiden sollte.

So würde man eine Tabelle mit 40 Werten nehmen wo immer der erste Wert für Gr. 0 -X drin steht. Also z.B. 48, 52, 56, 60... und nun vergleicht man den X-Wert des Missels mit der Tabelle. Bei Position 5 ein Match also ist im X-Wert eine 5 für Gr. 0.
Das gleiche macht man im Y-Bereich und erhält eine Wandlung der X/Y- Spriteposition zu X/Y-Gr.0-Position.
Eine Schleife mit einem kleinem Vergleich soll wohl schneller sein also eine Berechnung.

Aber wie gesagt, ich weiß es selbst nicht wirklich.

Grüße
Janko

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Hi Janko,
vielen Dank für diesen Hinweis - in der Tat habe ich über genau so eine Tabelle auch nachgedacht und hätte das auch so gemacht. Teilen durch 4 bzw. 8 erschien mir aber machbar durch einfache Bitrotation und funktioniert auch ganz gut. Die Größe der Tabelle hat mich etwas abgeschreckt!!

Was dann heute als echter Pferdefuss noch auftrat war dann die Tatsache, dass mein Item (also zB der Tank) ja deutlich breiter ist, als mein Schuss und ich also gar nicht so genau weiß, wo mein Schuss gelandet ist - es sei denn (fällt mir gerade zur Sekunde als Idee ein) ich gestalte die Oberfläche des Items von der Farbe her unterschiedlich - dann bekomme ich einen jeweils anderen Wert für die Kollision und kann das auch nutzen... nun ja, jetzt habe ich die entsprechenden Abfragen aufwendig programmiert und es funktioniert stabil - lass ich jetzt mal!!

Für das nächste Projekt werde ich das direkt etwas anders konzipieren....

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

... weiter gehts mit meinem Projekt!
Ich stelle auf Gr. 7 mit 4 Farben um und werde zunächst die Landschaft anpassen müssen.
Hier mal ein erstes Video mit dem Vergleich: Neu links und Alt rechts....
Die Landschaft links ist natürlich hinsichtlich Form und Farbe noch nicht angepasst, sehr schön kann man hier aber den direkten Vergleich sehen zwischen Gr.0 40x24 Textgrafik (980 Bit) zu Gr.7 40x80 Bitmapgrafik (3200)

scrolvergleich.mov
(1.14 MiB) 51-mal heruntergeladen

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Vorweihnachtszeit = viel Arbeit = wenig Zeit zum programmieren...
Aber ich habe heute mich um die Farben gekümmert und bin dabei das Programm auf die neue Grafik umzustellen.

Das wird jetzt recht aufwendig, da doch einiges an Code komplett neu muss.
Ich will den Bildschirm in 16x16 Byte Blöcken einteilen, dabei brauche ich dann für einen kompletten Bildschirm nur einen Speicherbedarf von 200 Byte bei einer Auflösung von 160x80 mit 4 Farben. Das schafft die CPU noch ganz gut zu scrollen und sieht flüssig aus.
Die Matrix wird dann praktisch 20x10 sein und in dieser Matrix sind dann die Bildschirmdaten hinterlegt, die auf den sichtbaren Bildschirm zu printen sind. Beim Printen passiert direkt das scrolling... mit einem Interrupt kann ich z.B. ständig die Matrix ändern und so Teile des Bildschirms animieren... so der Plan! Hoffentlich überlaste ich den Rechner damit nicht ;-)
Wir werden sehen.... wenn es geht, könnte das recht cool werden...

Anbei noch der aktuelle Stand, wo aber die Landschaft noch nicht wesentlich angepasst ist - hier läuft zunächst noch eine Testlandschaft, die sich wiederholt. Auch die Items sind noch nicht angepasst. Viel Arbeit noch ;-) aber ich habe ja Zeit....

LG und ein frohes Fest uns allen!!
Peter
rtp2.MOV
(1.94 MiB) 44-mal heruntergeladen

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

... gerade habe ich nun die FUEL-Tanks optisch angepasst und die komplette Animation der Explosion generiert.
Dafür brauche ich 3x12 = 36 Charakter!
Nun grübel ich allerdings schon seit Tagen, wie ich diese Explosion am besten umsetze. Eine richtig einfache Lösung habe ich noch nicht gefunden - ein denkbarer Ansatz, den ich gerade verfolge ist relativ aufwendig zu programmieren.
Vorweg: Einfach die Charakter ändern geht nicht, denn dabei würden sich ja dann z.B. alle Tanks entsprechend animieren - also explodieren und nicht nur der, der getroffen wurde.
Es hilft nichts: Ich muss die Kollision abfragen, die ganz genaue Position des getroffenen Tanks bestimmen, diesen dann mit der ersten Explosionssequenz überschreiben, beim scrolling muss ich die Position des Tanks entsprechend weiterschreiben, damit die 2. und 3. und dann 4. Sequenz der Explosion auf die entsprechende Stelle geschrieben werden kann. Das muss ja auch 2-4 x zugleich auf dem Bildschirm ablaufen können, denn man kann ja mehr als immer nur einen Tank bzw. Item treffen.
Vielleicht hat jemand hier noch eine bessere Idee...

Hier noch eine mov-Datei mit dem aktuellen Stand...
Sobald ich den Code für die Explosion drin habe, kommen die nächsten Items und dann baue ich die Landschaft weiter. Dann stelle ich auch wieder den aktuellen Code rein!
Allen eine frohe Weihnacht und bis bald!
Gruß
Peter
IMG_4114.MOV
(2.83 MiB) 29-mal heruntergeladen

Benutzeravatar
pps
Beiträge: 99
Registriert: 18.06.2021 23:05
Has thanked: 11 times
Been thanked: 40 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von pps »

Da Du nun doch den Charmode nutzt...

Für die Explosionen nutze nicht einfach 36 Zeichen, sondern nutze nur die Zeichen, die für denTank nötig sind. Die Explosion wird dann erzeugt, indem die entsprechenden Zeichen mit dem neuen Werten direkt verändert werden. So äußerst Du Platz im Font für möglichst viele Sachen.

Aber Du musst dann natürlich mehr Dinge kopieren.
PP´s of STARSOFTBerlin__________github|meine Webseite

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

hmmmm....
also ein Tank besteht bei mir aus 4 Reihen a 3 Character - also insgesamt 12 Character für den Öltank.
Der Öltank ist das größte Item - die Explosion muss also auch 12 Character haben, animiert 3x12 also 36.
Klar könnte ich das mit 12 machen und die Phasen reinkopieren - gute Idee - das Problem ist dann aber wenn ich (und das kommt vor) zwei oder sogar 3 Items abballere, die dann auch in unterschiedlichen Phasen explodieren und dabei auch noch hochgescrollt werden müssen weil das Spiel ja weiterläuft.
Da hänge ich gerade....
Jede Lösung erscheint von nicht unerheblichen Programmieraufwand. Da warte ich noch auf die Eingebung, wie ich das viel leichter lösen kann ...

Benutzeravatar
Kveldulfur
Beiträge: 198
Registriert: 17.08.2021 02:32
Has thanked: 61 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Ich weiß nicht wieviel Platz Du noch in Deinem Char-Set hast, aber Du könntest festlegen, dass nur 4 Tanks gleichzeitig vorhanden sein dürfen und vergibst für jeden Tank dann seine eigenen Zeichensequenz. So musst Du 48 Zeichen für 4 Tanks vorhalten, kannst dann aber jeden der 4 Tanks einzeln animieren.

Grüße
Janko

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

daran habe ich auch schon gedacht, aber ich werde nicht nur Tanks haben, sondern noch weitere Items - und dann wird es irgendwann knapp im Zeichensatz! Ich habe ja nur 128...

Benutzeravatar
Kveldulfur
Beiträge: 198
Registriert: 17.08.2021 02:32
Has thanked: 61 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Ja, aber wenn nur 4 Items gleichzeitig sichtbar sind, kannst Du mit den Zeichen auch andere Items darstellen. Je nach Scrollposition.

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Die letzten Tage habe ich immer wieder an der Explosion gearbeitet - und dabei festgestellt, daß es viel viel schwieriger ist, als gedacht.
Die Animation für eine Explosion ist zunächst völlig ausreichend, da mein Raumschiff gar nicht so oft hintereinander schießen kann - zwei Tanks gleichzeitig zur Explosion zu bringen ist dabei fast unmöglich.
Dann habe ich viel mit dem Timing experimentiert und entweder läuft die Explosion zu schnell ab und man sieht die Phasen gar nicht, oder zu langsam, wenn ich es in den Code aufwendig in verschiedenen Phasen zwischen Feinscroll und Grobscroll integriere. Die Explosion in den VBI zu bringen läuft auch zu schnell - hier könnte man mit ein wenig Programmieraufwand das Zeittiming für die Explosion vielleicht noch besser hinbekommen.
Ich habe es jetzt aber erstmal einfacher gelöst: Die Explosion mit der Animation läuft direkt hintereinander ab mit einem kleinen Zeitdelay, was man leider dann im Spiel merkt, da es während der animierten Explosion zu einem kleinen Stop kommt. Ich lasse das jetzt aber erstmal so und mache endlich mit den anderen Items weiter und vor allem baue ich jetzt die Landschaft weiter aus...
Gruß
Peter
phobos.MOV
(3.09 MiB) 25-mal heruntergeladen

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

ich war fleißig, auch wenn man es vielleicht nicht so sehr sieht!!
Zunächst habe ich die Explosion implementiert, die Landschaft und die Charakter weiter ausgebaut - hier fehlen noch ein paar Landschaftsteile.
Dann habe ich die Anzeige mit Titel, Score, Fuel incl. Laufleiste für den Fuel implementiert.
Ich musste den Aufbau der letzten Reihe erweitern, was mich viel Schweiß gekostet hat - das war nötig weil ich die Randbegrenzung komplettieren wollte / musste. Danach hatte ich ganz unerklärliche Ruckelartefakte - daran habe ich jetzt fast 2 Tage gesessen... ich dachte schon, daß die CPU langsam an die Grenze kommt und der VBI Störartefakte reinhaut... alles musste runterreduziert werden, ohne Erfolg. Am Ende war es die Displaylist. Eine kleine Anpassung und der Ruckler war wieder raus ... omG !!!!
Programmieren ist manchmal wie ein Krimi.
Jetzt baue ich so langsam die Landschaft weiter aus - wie man sieht auf dem Video gibt es noch eine Menge an kleineren Fehlern. Warum nur bekomme ich diesen grünen Balken links zusätzlich rein...
Der Code wird immer länger und unübersichtlicher trotz Dokumentation... noch komme ich aber klar! Aber jetzt bloß keine zu lange Pause machen.
Ich stelle gerne den gesamten Code hier online und wer möchte kann selber daran rumfummeln... ob jemand da aber noch durchsteigt .. keine Ahnung!!
Jetzt noch eine kleine mov - Datei - und wie gesagt: Bei Interesse stelle ich den Code hier rein!
Es ist noch viel zu tun.... ;-)
rtp.MOV
(2.31 MiB) 33-mal heruntergeladen

Benutzeravatar
pps
Beiträge: 99
Registriert: 18.06.2021 23:05
Has thanked: 11 times
Been thanked: 40 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von pps »

Mach das mal mit dem Code. Dann kann ich Dir vielleicht helfen dass Du wieder einen einfacheren Durchblick bekommst.
PP´s of STARSOFTBerlin__________github|meine Webseite

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

here we go... ;)

Hauptprogramm:

Code: Alles auswählen

			



			org $2000
			
			icl '../hardware.txt'
			icl '../header.txt'
			icl 'character.asm'
			icl 'lands.asm'	
        
dlist   	.byte 112,112,112,100
			.byte 30,75
			.byte 36,36,36,36,36,36,36,36,36,36,36,36
			.byte 36,36,36,36,36,36,36,36,36,4,4,4,4,4
			.byte 65,32,156
			
pm1			.byte 0,24,60,36,36,126,126,255,219,219,129,129,129,0

pm41		.byte 0,28,28,8,8,0,4,0,0,0,0,0,0,0
			.byte 0,28,28,24,8,8,4,4,0,0,4,0,8,0
			.byte 0,28,24,28,24,8,4,8,8,4,0,0,0,0
			
mi1			.byte 3,3,3,3			
mi2			.byte 12,12,12,12
mi3			.byte 12,12,12,12
mi4			.byte 12,12,12,12
			
			.proc main
			
main1		jsr displaylist ;Subroutine Displaylist-Aufbau
			mva #30 yposp1
			mva #120 xposp1
			mva #42 yposm1
			mva #0 xposm1
			mva #94 yposm2
			mva #100 xposm2
			mva #0 tank1x
			mva #0 tank1y
			mva #151 fuelzaehleritem
			mva #0 fuelzaehler
			jsr text
						
Start1		mva #>chr chbas ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 
			mva #15 color3	;Schriftfarbe	
			mva #218 color1	;Gelb
			mva #154 color0	;Blau
			mva #52 color2	;Rot
			mva #180 color2	; Grün
			mva #0 color4 ;Hintergrundfarbe
			lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1
						
			; Player vorbereiten und initialisieren
			lda ramtop
			sec
			sbc #16
			sta pmbase
			clc
			adc #3
			sta miss1+1
			adc #1
			sta play1+1
			adc #3
			sta play4+1
			lda #9
			sta play4
			mva #62 sdmctl
			mva #56 pcolr0
			mva #56 pcolr1
			mva #142 pcolr2
			mva #142 pcolr3
			mva #1 gprior
			mva #3 gractl
			mva #1 sizep0
			mva #1 sizep1
			mva #0 sizem
			mva #0 rechts
			mva #2 hitclr
			mva #48 blink

main2		mva <lands var6
			mva >lands var6+1
			mva #0 kollp0
			ldy #255				;Speicher Player 1 leeren
			lda #0
			sta play1
@			sta (play1),y
			sta (play4),y
			dey
			bpl @-
			clc
			ldy yposp1					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			;lda pm41,x
			;sta (play4),y
			iny
			inx
			cpx #14
			bne @-
			clc
			ldy #0
			ldx #0
@			lda mi1,x
			sta (miss1),y
			iny
			inx
			cpx #2
			bne @-
			lda xposm1
			sta p0pf
			lda xposm2
			sta p1pf
			ldx #>vbinter			;VB-Interrupt VektorHi
			ldy #<vbinter			;VB-Interrupt VektorLo
			lda #7					;Deferred Mode mit lda #7 festlegen
			jsr setvbv				;Vektor für die eigene Routine über setvbv eintragen
									
hauptprogramm
			
			clc
			lda kollp0
			cmp #1
			bcc @+
			jsr kollision
			mva #0 kollp0
@			jsr letztereihe 		;letzte Reihe (lands) Bildschirm1 printen (sichtbar)	
			jsr feinscroll 			;Feinscroll Bildschirm1 ausführen (sichtbar)		
			mva #$30 var1			;var1 auf 30000 ($7530) setzen
			mva #$75 var1+1
			mva #$E4 var2			;var2 auf 31460 ($7AE4) setzen
			mva #$7A var2+1
			jsr grobscroll			;Bildschirm1 kopieren + grobscroll
			mva #$0C var1			;var1 + var2 auf 31500 ($7B0C) setzen
			mva #$0C var2
			mva #$7B var1+1
			mva #$7B var2+1	
			jsr umschalten
			inc fuelzaehleritem
			lda fuelzaehler
			tax
			lda fuelzaehleritem
			sta 31043,x
			sta 32543,x
			#if .byte fuelzaehleritem=#155
			mva #151 fuelzaehleritem
			inc fuelzaehler
			#end
			#if .byte fuelzaehler>#200
			mva #0 fuelzaehler
			#end
			#if .byte fuelzaehler=#20
			mva #52 color3
			#end
			#if .byte fuelzaehler>#34 .and .byte fuelzaehler<#200
			jmp main1				;Fuel zuende Neustart
			#end
			mva #0 kollm1
			mva #0 kollm2			;umschalten auf Bildschirm2 - Bildschirm2 wird sichtbar	
			jsr letztereihe
			jsr feinscroll			;Feinscroll Bildschirm2 ausführen (sichtbar)						
			mva #$08 var2			;var1 auf 29960 ($7508) setzen
			mva #$75 var2+1
			mva #$0C var1			;var2 auf 31500 ($7B0C) setzen
			mva #$7B var1+1
			#if .byte kollges=#4
			mva #15 color3
			sec
			lda fuelzaehler
			sbc #10
			sta fuelzaehler	
			tax
			mva #151 fuelzaehleritem
			clc
			lda fuelzaehleritem
@			sta 31043,x
			sta 32543,x
			inx
			cpx #36
			bne @-
			jsr kollitem
			mva #0 kollges
			#end
			mva #$08 var2			;var1 auf 29960 ($7508) setzen
			mva #$75 var2+1
			mva #$0C var1			;var2 auf 31500 ($7B0C) setzen
			mva #$7B var1+1
			jsr grobscroll			;;Bildschirm2 kopieren + grobscroll
			mva #$30 var1			;var1 + var2 auf 30000 ($7530) setzen
			mva #$30 var2
			mva #$75 var1+1
			mva #$75 var2+1
			;mva #1 delay
 			jsr umschalten			;umschalten auf Bildschirm1 - Bildschirm1 wird sichtbar
			inc fuelzaehleritem
			lda fuelzaehler
			tax
			lda fuelzaehleritem
			sta 31043,x
			sta 32543,x
			#if .byte fuelzaehleritem=#155
			mva #151 fuelzaehleritem
			inc fuelzaehler
			#end
			
			;Ende der Bildschirmausführung / Kontrolle Durchläufe
			sec
			lda #40	; - 36 = Anzahl der Durchläufe - auf 4 beschränkt, da die Landschaft noch rudimentär ist und sich dann wiederholen soll
			sbc var6+1
			bpl @+
			jmp start1			;Stop hier
@	 	
			jmp hauptprogramm	 			;weiter
			
			.endp
			
			; _____________________________________________________________________________________
			;
			; ---------------------------- S U B R O U T I N E N ----------------------------------
			; _____________________________________________________________________________________

								
								;vertical blank interrupt für Joystick / PM

vbinter			
			pha
			txa
			pha
			mva #0 atract			;Bildschirmschoner aus
			inc blink
			lda blink2
			adc #20
			sta blink2
			clc					;Kollisionen abfragen
			lda p0pf
			cmp #1
			bcc @+
			mva #1 kollp0
@			
			clc					;Joystickabfragen Player1
			lda stick0
			cmp #15				;keine Joystickaktion
			bcs @+
			cmp #14
			bcs nachob
			cmp #13
			bcs nachun
			cmp #11
			bcs nachli
			cmp #10
			bcs nachliob
			cmp #9
			bcs nachliun
			sec
			cmp #7
			bcs nachre
			cmp #6
			bcs nachreob
			cmp #5
			bcs nachreun
@			jmp write
nachre		clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
@			jmp write
nachreun
			clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
@			jmp nachun
nachreob
			clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
@			jmp nachob
nachli		sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
@			jmp write
nachliun
			sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
@			jmp nachun
nachliob
			sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
@			jmp nachob
nachob
			dec yposp1
			clc
			ldy yposp1					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			iny
			inx
			cpx #14
			bne @-
			jmp write
nachun
			inc yposp1
			clc
			ldy yposp1					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			iny
			inx
			cpx #14
			bne @-
			jmp write
			clc
write		
			lda xposp1 					;Blinkabschnitt
			sta hposp0
			adc #2
			sta hposp3
			#if .byte blink<#64			;Blink links
			ldy yposm3
			lda #0
			sta (miss1),y
			mva hposp0 xposm3
			ldy yposp1
			lda #48
			iny 
			iny
			iny
			iny
			iny
			iny
			sta (miss1),y
			mva xposp1 p2pf
			mva xposp1 xposm3
			sty yposm3
			#end
			#if .byte blink>#63 .and .byte blink<#128	;Blink rechts
			ldy yposm3
			lda #0
			sta (miss1),y
			ldy yposp1
			lda #192
			iny 
			iny
			iny
			iny
			iny
			iny
			sta (miss1),y
			lda xposp1
			adc #13
			sta p3pf
			mva xposp1 xposm3
			sty yposm3
			#end
			#if .byte blink>#127 .and .byte blink<#192	;Blink links
			ldy yposm3
			lda #0
			sta (miss1),y
			mva hposp0 xposm3
			ldy yposp1
			lda #48
			iny 
			iny
			iny
			iny
			iny
			iny
			sta (miss1),y
			mva xposp1 p2pf
			mva xposp1 xposm3
			sty yposm3
			#end
			#if .byte blink>#191 .and .byte blink<#255	;Blink rechts
			ldy yposm3
			lda #0
			sta (miss1),y
			ldy yposp1
			lda #192
			iny 
			iny
			iny
			iny
			iny
			iny
			sta (miss1),y
			lda xposp1
			adc #13
			sta p3pf
			mva xposp1 xposm3
			sty yposm3
			#end
						
			;---------- Abfrage Feuerknopf und Routine Schuss links-------
			
			#if .byte strig0<#1 .and .byte feuer3=#0
			#if .byte feuer5=#0 .or .byte feuer5>#180
			mva #1 feuer1
			mva #1 feuer3
			mva xposp1 p0pf
			mva xposp1 xschuss1
			lda yposp1
			adc #9
			sta feuer2
			#end
			#end
			#if .byte feuer1=#1		
			ldy feuer2
			iny
			iny
			lda #0
			sta (miss1),y
			sty feuer2
			iny
			iny
			lda #3
			sta (miss1),Y
			mva m0pf kollm1
			#if .byte kollm1=#4
			mva kollm1 kollges
			mva feuer2 yschuss1
			#end
			#if .byte kollm1>#2
			mva #211 feuer2
			#end
			#if .byte feuer2>#210
			mva #0 feuer1
			mva #0 feuer2
			lda #0
			sta (miss1),y
			#end
			#end
			
			;-------------------------------------------------------------

			;---------- Abfrage Feuerknopf und Routine Schuss rechts-------		
			#if .byte strig0<#1 .and feuer3=#1
			#if .byte feuer2=#0 .or .byte feuer2>#180
			mva #1 feuer4
			mva #0 feuer3
			lda xposp1 
			adc #13
			sta p1pf
			sta xschuss1
			lda yposp1
			adc #9
			sta feuer5
			#end
			#end
			#if .byte feuer4=#1		
			ldy feuer5
			iny
			iny
			lda #0
			sta (miss1),y
			sty feuer5
			iny
			iny
			lda #12
			sta (miss1),Y
			mva m1pf kollm2
			mva m1pf kollm2
			#if .byte kollm2=#4
			mva kollm2 kollges
			mva feuer5 yschuss1
			#end
			#if .byte kollm2>#1
			mva #211 feuer5
			#end
			#if .byte feuer5>#210
			mva #0 feuer4
			mva #0 feuer5
			lda #0
			dey
			sta (miss1),y
			iny
			sta (miss1),y
			#end
			#end
			;-------------------------------------------------------------
			ldy yposp1	
			clc
			#if .byte blink2>#0 .and .byte blink2<#75
			ldx #0
			#end
			#if .byte blink2>#75 .and .byte blink2<#160
			ldx #14
			#end
			#if .byte blink2>#160 .and .byte blink2<#255
			ldx #28
			#end
			dey
			mva #0 lms2
@						
			lda pm41,x
			sta (play4),y
			iny
			inx
			inc lms2
			lda lms2
			cmp #14
			bne @-
			mva #2 hitclr
			pla
			tax
			pla
			jmp xitvbv			;vb-interrupt wird über xitvbv beendet!!

			; -------------------------------------------------------------------------------------

kollision
			ldx #0
			clc
@			inx
			cpx #255
			bcc @-
			rts
			
			; -------------------------------------------------------------------------------------

umschalten
			ldy #4 				;Bildschirme umschalten von unsichtbar auf sichtbar	
			mva sdlstl var5
			mva sdlstl+1 var5+1
			lda var1
			sta (var5),y
			iny
			lda var1+1
			sta (var5),y
			rts

			; -------------------------------------------------------------------------------------

wartes		
			clc
 		   	ldx delay ; Warteschleife
st  		lda RTCLOK+2    
wa   		cmp RTCLOK+2    
        	beq wa    
        	dex            
        	bpl st 
        	rts
        	
        	; -------------------------------------------------------------------------------------
        	
feinscroll
			ldy #1
			mva #0 delay
@			jsr wartes
			sty vscrol
			iny
			cpy #8
			bne @-			
			rts
        	
        	; --------------------------------------------------------------------------------------
        	
grobscroll	
			;Den Bildschirm um eins hoch / Grobscrolling um eine Zeile

			ldx #22
@			ldy #$28
			clc
@			lda (var1),y 
			sta itemex
			#if .byte itemex=#68
			jsr fuel
			#end
			sta (var2),y
			dey
			bpl @-
			clc
			lda var1
			adc #$28
			sta var1
			bcc @+
			inc var1+1
@			clc
			lda var2
			adc #$28
			sta var2
			bcc @+
			inc var2+1			
@			clc
			dex
			bpl @-3
			rts
			
			; -------------------------------------------------------------------------------
			
displaylist
			; initialisiere die Displaylist
			mva sdlstl var5
			mva sdlstl+1 var5+1
			ldy #0
			clc
@			lda dlist,y
			sta (var5),y
			iny
			cpy #34
			bne @-
			rts
			
			; ---------------------------------------------------------------------------------------
			
letztereihe
			;Die letzte Reihe printen 
			;Start der letzten Reihe bei var1 - Line 22
			;in Var6 (+1) wird die Position von lands gespeichert
			;in Var5 gehen Infos der Boarderanzahl rein
			;in y ist der Zähler für letzte Reihe
			;x wird als Zähler fürs printen benutzt
			
			lda var1+1
			;sta var8+1
			;sta var7+1
			lda var1
			;sta var8
			;sta var7
			adc #112
			sta var1
			inc var1+1
			inc var1+1
			inc var1+1
			ldy #0
			clc
			lda (var6),y 	;Boarderanzahl 1 holen
			sta var5 		;Boarderanzahl 1 in var5 speichern
			jsr var6up
			lda (var6),y	;Boarderart 1 holen
			ldy var5		;Zeilenzählen in y übertragen
@			sta (var1),y 	;Boarder1 printen
			dey
			bpl @-			
			jsr var6up
			adc #0
			sta var6+1
			lda (var6),y	;Boarderanzahl 2 holen
			tax
			jsr var6up
			lda (var6),y	;Boarderart 2 holen
			ldy var5
@			iny			 
			sta (var1),y 	;leer printen
			dex
			bpl @-
			sty var5		;Zeilenzähler sichern
			jsr var6up
			lda (var6),y 	;Rand Boarder2 holen
			inc var5		;Zeilenzähler eins weiter
			ldy var5	
			sta (var1),y 	;Rand Boarder1 printen
			jsr var6up
			inc var5
			lda(var6),y 	;leer holen
			tax
			lda #0
			ldy var5			
@			iny			 
			sta (var1),y 	;leer printen
			dex
			bpl @-
			sty var5 		;Zeilenzähler sichern
			jsr var6up
			lda(var6),y 	;Rand Boarder3 holen
			ldy var5
			iny
			sty var5
			sta (var1),y 	;Rand Boarder3 printen
			jsr var6up
			lda(var6),y 	;Boarder4 holen
			tax 			;Boarderanzahl in x speichern
			jsr var6up
			lda (var6),y
			ldy var5
@			iny
			sta (var1),y	;Boarder4 printen
			dex
			bpl @-
			sty var5 		;Zeilenzähler sichern
			jsr var6up
			lda(var6),y 	;Boarder5 holen
			tax 			;Boarderanzahl in x speichern
			jsr var6up
			lda (var6),y
			ldy var5
@			iny
			sta (var1),y	;Boarder5 printen
			dex
			bpl @-
			jsr var6up
			lda (var6),y	;Sonderitem holen
			sta var5		;Item in Var5 speichern
			jsr var6up
			#if .byte var5=#56	;Öltank printen
			#if .byte tank1x=#0
			mva var1 tank1y
			mva var1+1 tank1y+1
			sec
			lda tank1y
			sbc #120
			sta tank1y
			lda tank1y+1
			sbc #0
			sta tank1y+1
			#end
			lda (var6),y		;Startposition des Items in y speichern
			sta tank1x
			tay
			jsr	fuel			;Fueltank printen
			#end
			jsr var6up
			mva #0 vscrol
			sec
			lda tank1y
			sbc #40
			sta tank1y
			lda tank1y+1
			sbc #0
			sta tank1y+1
			lda tank1x
			tay
			mva #0 var5
			rts
						
var6up		clc
			lda var6
			adc #1
			sta var6
			ldy #0
			lda var6+1
			adc #0
			sta var6+1
			rts
			
			; --------------------------------------------------------------------------------------
			
fuel		sec				;Routine um den Öltank zu printen - es werden 12 Character meanderförmig geprinten 3x4 Matrix
			lda var1
			sbc #160
			sta var2
			lda var1+1
			sbc #0
			sta var2+1
fuelex		lda var5
			sta (var2),y	;1
			inc var5
			lda var5
			iny
			sta (var2),y	;2
			inc var5
			lda var5
			iny
			sta (var2),y	;3
			clc
			lda var2
			adc #41
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			dey
			inc var5
			lda var5
			sta (var2),y	;4
			dey
			inc var5
			lda var5
			sta (var2),y	;5
			dey
			inc var5
			lda var5
			sta (var2),y	;6
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			inc var5
			lda var5
			sta (var2),y	;7
			inc var5
			lda var5
			iny
			sta (var2),y	;8
			inc var5
			lda var5
			iny
			sta (var2),y	;9 
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			inc var5
			lda var5
			sta (var2),y	;10
			dey
			inc var5
			lda var5
			sta (var2),y	;11
			dey
			inc var5
			lda var5
			sta (var2),y	;12
			tya
			rts
			
			; ------------------------------------------------------------------------------


kollitem					;Kollisionsroutine
							;var8 unveränderter Bildschirmanfang 			
			lda yschuss1	;in Gr.0 -32 (sichtbarer Bereich ab 32 und /8
			sec
			sbc #32
			clc
			ror
			clc
			ror
			clc
			ror
			sta yschuss1	;y-Position in das x-Register schreiben
			tax	
			dex				; und einen abziehen
			lda xschuss1	;x-Position -48 (sichtbarer Bereich)und /4
			sec
			sbc #48
			clc
			ror
			clc
			ror
			tay				;in y geht die x-Position
			sec
			mva var1 var2		;holen der Bildschirmadresse -> var2
			mva var1+1 var2+1
			clc
@			lda var2		;jetzt die y-Position auf die richtige Höhe stellen
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			dex
			bpl @-			;die y-Position steht in x - Addition von x Zeilen
@			dey				;die korrekte x-Position einstellen
			lda (var2),y	;linken Rand checken
			sta var8		
			iny
			iny
			lda (var2),y	;rechten Rand checken
			sta var9
			dey
			dey
			#if .byte var8=#0 .and .byte var9>#0	;Position nach rechts anpassen 
			iny
			#end
			#if .byte var8>#0 .and .byte var9=#0	;Position nach links anpassen
			dey
			#end
			lda (var2),y		;2. Durchgang der Anpassung um letzte 
			sta var8			;Fehler zu beseitigen
			iny
			iny
			lda (var2),y
			sta var9
			dey
			dey
			#if .byte var8=#0 .and .byte var9>#0
			iny
			#end
			#if .byte var8>#0 .and .byte var9=#0
			dey
			#end
			lda (var2),y		;Korrektur der y-Position
			sta var8			;in var8 aktuelle BS-Position
			sec
			lda var2			;eins drüber - bleibt wenn var2 zu tief
			sbc #40
			sta var2
			lda var2+1
			sbc #0
			sta var2+1
			lda (var2),y		;lade Bildschirminhalt eins drüber
			sta var9			;das geht in var9 rein
			#if .byte var8>#0 .and .byte var9=#0	;alte Position var2 
			clc										;wiederherstellen
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
			#if .byte var8=#0 .and .byte var9=#0	;alte Position var2
			clc										;eins runter
			lda var2
			adc #80
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
			lda (var2),y		;2. Durchgang der Anpassung um letzte 
			sta var8			;Fehler zu beseitigen
			sec
			lda var2
			sbc #40
			sta var2
			lda var2+1
			sbc #0
			sta var2+1
			lda (var2),y
			sta var9
			#if .byte var8>#0 .and .byte var9=#0
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
			#if .byte var8=#0 .and .byte var9=#0
			clc
			lda var2
			adc #80
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			#end
								;ab hier stimmt die Position des Items (meistens)
								;in der Variable y für x-Position
								;und in var2 für die y-Position 
expl11		
			mva var2 tank1pos		;y-Position für Explosion1
			mva var2+1 tank1pos+1
			mva #68 var5
			jsr fuelex
			tay
			iny
expl22		
			mva #80 var5
			mva tank1pos var2
			mva tank1pos+1 var2+1
			mva #1 delay
			jsr wartes
			jsr fuelex
			tay
			iny
expl33		
			mva #92 var5
			mva tank1pos var2
			mva tank1pos+1 var2+1
			mva #1 delay
			jsr wartes
			jsr fuelex
			tay
			iny
expl44		
			mva #104 var5
			mva tank1pos var2
			mva tank1pos+1 var2+1
			mva #1 delay
			jsr wartes
			jsr fuelex
			tay
			iny
			rts

			; ------------------------------------------------------------------------------

text		ldx #0
			lda #52
			jsr prte
			inx
			lda #45
			jsr prte
			inx
			lda #54
			jsr prte
			inx
			lda #31
			jsr prte
			inx
			lda #52
			jsr prte
			inx
			lda #49
			jsr prte
			inx
			lda #0
			jsr prte
			inx
			lda #54
			jsr prte
			inx
			lda #50
			jsr prte
			inx
			lda #0
			jsr prte
			inx
			lda #51
			jsr prte
			inx
			lda #47
			jsr prte
			inx
			lda #50
			jsr prte
			inx
			lda #42
			jsr prte
			inx
			lda #50
			jsr prte
			inx
			lda #53
			jsr prte
			inx
			lda #0
			jsr prte 
			inx
			lda #55
			jsr prte 
			inx
			lda #34
			jsr prte 
			inx
			lda #32
			jsr prte 
			inx
			lda #34
			jsr prte 
			inx
			lda #34
			jsr prte 
			inx
			lda #0
			jsr prte 
			inx
			lda #51
			jsr prte 
			inx
			lda #45
			jsr prte 
			inx
			lda #54
			jsr prte 
			inx
			lda #45
			jsr prte 
			inx
			lda #52
			jsr prte 
			inx
			lda #0
			jsr prte 
			inx
			lda #51
			jsr prte 
			inx
			lda #52
			jsr prte 
			inx
			lda #50
			jsr prte 
			inx
			lda #44
			jsr prte 
			inx
			lda #45
			jsr prte 
			inx
			lda #47
			jsr prte 
			inx
			lda #48
			jsr prte 
			inx 
			lda #0
			jsr prte			
			
			ldx #0		;Fuel
			lda #46
			jsr prte2
			inx
			lda #31
			jsr prte2
			inx
			lda #45
			jsr prte2
			inx
			lda #48
			jsr prte2
			
			ldx #10		;Score
			lda #53
			jsr prte2
			inx
			lda #43
			jsr prte2
			inx
			lda #50
			jsr prte2
			inx
			lda #52
			jsr prte2
			inx
			lda #45
			jsr prte2
			inx
			lda #0
			jsr prte2
			inx
			lda #160
			jsr prte2
			inx
			lda #32
			jsr prte2
			inx
			lda #32
			jsr prte2
			inx
			lda #32
			jsr prte2
			ldx #23		;Ships
			lda #53
			jsr prte2
			inx
			lda #47
			jsr prte2
			inx
			lda #33
			jsr prte2
			inx
			lda #51
			jsr prte2
			inx
			lda #53
			jsr prte2
			inx 
			lda #0
			jsr prte2
			inx
			lda #28
			jsr prte2
			inx
			lda #29
			jsr prte2
			inx 
			lda #0
			jsr prte2
			inx
			lda #28
			jsr prte2
			inx
			lda #29
			jsr prte2
			inx 
			lda #0
			jsr prte2
			inx
			lda #28
			jsr prte2
			inx
			lda #29
			jsr prte2
			ldx #0
fuellauf	
			clc
			lda fuelzaehleritem
@			jsr prte3
			inx
			cpx #36
			bne @-
			rts
prte		sta 30923,x
			sta 32423,x
			rts
prte2		sta 31003,x
			sta 32503,x
			rts
prte3		sta 31043,x
			sta 32543,x
			rts

			; ------------------------------------------------------------------------------
			
			
			run main
lands:

Code: Alles auswählen

;@com.wudsn.ide.asm.mainsourcefile=test.asm
		

			; Aufbau der letzten Reihe:
			; Boarder1  Boarder2 Rand1(gelb) Mitte(Leerraum) Rand2(gelb) Boarder3 Boarder4 Item(z.B. Öltank - Charakter 56)
			; Beispiel: 3,2,4,1,5,22,6,4,2,1,1,56,11
			; 3x BoarderArt 2 printen / 4x BoarderArt 1 printen / 1x RandArt 1 printen / 22 Leerzeichen printen
			; 1x RandArt 6 printen, 4x BoarderArt 2 printen, 1x BoarderArt 1 printen, Öltank (56) an Stelle 11 printen
			; Die Routine "letztereihe" verarbeitet dies kontinuierlich nach jedem Feinscroll/Grobscroll


lands		.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,2,4,2,10,22,11,4,2,1,2,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0	;22
			.byte 6,1,5,2,10,16,11,4,1,1,1,56,9
			.byte 6,1,5,1,10,13,11,2,2,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 12,1,3,2,7,9,11,2,1,6,1,56,14
			.byte 13,1,3,1,7,8,11,2,1,6,1,0,0
			.byte 13,1,4,1,7,7,11,2,1,6,1,0,0
			.byte 13,1,5,1,10,6,11,2,1,6,1,0,0
			.byte 13,1,4,1,8,7,11,2,1,6,1,0,0
			.byte 17,1,0,8,0,7,11,2,1,6,1,0,0
			
			
			
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0	;22
			.byte 6,1,5,2,10,16,11,4,1,1,1,56,9
			.byte 6,1,5,1,10,13,11,2,2,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 12,1,3,2,7,9,11,2,1,6,1,56,14
			.byte 13,1,3,1,7,8,11,2,1,6,1,0,0
			.byte 13,1,4,1,7,7,11,2,1,6,1,0,0
			.byte 13,1,5,1,10,6,11,2,1,6,1,0,0
			.byte 13,1,4,1,8,7,11,2,1,6,1,0,0
			.byte 17,1,0,8,0,7,11,2,1,6,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0	;22
			.byte 6,1,5,2,10,16,11,4,1,1,1,56,9
			.byte 6,1,5,1,10,13,11,2,2,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 6,1,5,1,10,13,11,2,1,6,1,0,0
			.byte 12,1,3,2,7,9,11,2,1,6,1,56,14
			.byte 13,1,3,1,7,8,11,2,1,6,1,0,0
			.byte 13,1,4,1,7,7,11,2,1,6,1,0,0
			.byte 13,1,5,1,10,6,11,2,1,6,1,0,0
			.byte 13,1,4,1,8,7,11,2,1,6,1,0,0
			.byte 17,1,0,8,0,7,11,2,1,6,1,0,0
			.byte 1,1,4,1,10,22,11,4,1,1,1,0,0
character:

Code: Alles auswählen

 ;@com.wudsn.ide.asm.mainsourcefile=test2.asm
		
		
		

chr			.byte 0,0,0,0,0,0,0,0
			.byte 255,255,255,255,255,255,255,255	;1 Color 2 (grün - alternativ)
			.byte 170,255,255,255,255,255,255,255
			.byte 255,255,255,255,255,255,255,170
			.byte 128,224,248,248,248,248,224,128
			.byte 2,11,47,47,47,47,11,2
			.byte 170,255,255,255,255,255,255,170		;6
			.byte 128,224,224,248,248,248,254,254
			.byte 254,254,248,248,248,224,224,128
			.byte 254,254,248,248,248,224,224,170
			.byte 128,128,128,128,128,128,128,128
			.byte 2,2,2,2,2,2,2,2
			.byte 254,254,254,254,254,254,254,254		;12
			.byte 191,191,191,191,191,191,191,191
			.byte 0,0,0,0,0,0,0,0
			.byte $e0,$e0,$ee,$ee,$ee,$ee,$e0,$e0	
			.byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee
			.byte $0e,$0e,$ee,$ee,$ee,$ee,$0e,$0e
			.byte $e0,$e0,$e0,$e0,$e0,$e0,$e0,$e0
			.byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
			.byte $0,$0,$0,$0,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,0,0,0,0
			.byte $e0,$e0,$e0,$e0,$ee,$ee,$ee,$ee
			.byte 0,0,255,255,255,255,0,0			;Fuel lauf	- 123
			.byte 0,0,63,63,63,63,0,0				;F
			.byte 0,0,15,15,15,15,0,0				;U 	- 25
			.byte 0,0,3,3,3,3,0,0					;U
			.byte 0,0,0,0,0,0,0,0					;E	- 27
			.byte 1,4,4,21,85,81,64,64				;28 -> Schiff klein
			.byte 64,16,16,84,85,69,1,1				;29 -> Schiff klein
			.byte 0,0,0,0,0,0,$f0,$f0				;L
			
			.byte 136,136,136,136,136,136,136,168	;31 -> U
			.byte 32,136,136,136,168,136,136,32		;32	-> 0
			.byte 32,32,32,32,32,32,32,32
			.byte 168,8,8,168,168,128,128,168		;34 -> 2
			.byte 170,2,2,170,170,2,2,170			;33 -> 5 
			.byte 128,136,136,170,170,8,8,8			;36 -> 4
			.byte 170,128,128,170,170,2,2,170
			.byte 128,128,128,170,130,130,130,170	;38 -> 6
			.byte 168,8,8,42,42,8,8,8
			.byte 170,130,130,170,170,130,130,170	;40 -> 8
			.byte 170,130,130,170,170,2,2,2			;41 -> 9
			.byte 160,136,136,160,160,136,136,160	;42 -> B
			.byte 40,128,128,128,128,128,128,40		;43 -> C
			.byte 160,136,136,136,136,136,136,160	;44 -> D
			.byte 168,128,128,168,168,128,128,168	;45	-> E
			.byte 168,128,128,168,168,128,128,128	;46 -> F
			.byte 136,136,136,168,168,136,136,136	;47 -> H
			.byte 128,128,128,128,128,128,128,170	;48 -> L
			.byte 130,130,162,162,138,138,138,130	;49 -> N
			.byte 32,136,136,136,136,136,136,32		;50 -> O
			.byte 160,136,136,168,160,128,128,128	;51 -> P
			.byte 160,136,136,168,160,136,136,136	;52 -> R
			.byte 40,128,128,168,168,8,8,160		;53 -> S
			.byte 168,168,32,32,32,32,32,32			;54 -> T
			.byte 0,0,8,32,32,32,32,8					;55 -> c
tank		.byte 0,0,0,0,15,15,53,53				;56 -> Fuel Tank
			.byte 0,0,255,255,255,255,185,185
			.byte 0,0,192,192,252,252,111,111
			.byte 239,239,111,111,239,239,107,107
			.byte 185,185,185,185,185,185,169,169
			.byte 55,55,53,53,55,55,55,55
			.byte 15,15,0,0,0,0,2,2
			.byte 255,255,136,136,136,136,170,170
			.byte 252,252,128,128,128,128,160,160
			.byte 32,32,168,168,8,8,42,42
			.byte 8,8,170,170,8,8,42,42				
			.byte 2,2,10,10,8,8,42,42				;67
expl1		.byte 0,0,0,32,32,8,5,1					;68
			.byte 0,0,0,2,24,85,154,102
			.byte 0,0,64,64,0,0,66,72
			.byte 80,144,160,84,152,100,100,170
			.byte 101,153,153,86,102,106,153,153
			.byte 5,9,134,22,25,41,22,150
			.byte 166,25,25,41,86,6,5,9
			.byte 154,102,102,149,153,90,101,166
			.byte 89,84,100,164,104,80,144,144
			.byte 64,6,8,0,0,0,0,0
			.byte 150,153,89,20,2,0,0,0
			.byte 17,1,0,2,8,0,0,0					;79
expl2		.byte 0,0,0,0,0,0,0,0					;80
			.byte 0,0,0,0,0,0,0,0
			.byte 0,0,0,0,0,0,0,0
			.byte 4,16,128,128,64,64,64,160
			.byte 20,90,89,165,150,90,105,101
			.byte 8,8,1,1,1,2,6,5
			.byte 1,2,2,1,1,8,8,32
			.byte 149,153,170,102,85,105,24,20
			.byte 96,64,128,144,16,0,0,0
			.byte 0,0,0,0,0,0,0,0
			.byte 8,2,0,0,0,0,0,0
			.byte 0,0,0,0,0,0,0,0					;91
expl3		.byte 0,0,0,0,0,0,0,0					;92
			.byte 0,0,0,0,0,0,0,0		
			.byte 0,0,0,0,0,0,0,0		
			.byte 0,0,0,0,0,0,0,0		
			.byte 0,0,0,2,24,89,102,150
			.byte 0,0,0,0,2,0,0,0		
			.byte 0,0,2,0,0,0,0,0		
			.byte 169,89,90,36,0,0,0,0
			.byte 0,0,0,128,0,0,0,0		
			.byte 0,0,0,0,0,0,0,0		
			.byte 0,0,0,0,0,0,0,0		
			.byte 0,0,0,0,0,0,0,0					;103

expl4		.byte 0,0,0,0,0,0,0,0					;104
			.byte 0,0,0,0,0,0,0,0	
			.byte 0,0,0,0,0,0,0,0	
			.byte 0,0,0,0,0,0,0,0	
			.byte 0,0,0,0,0,0,0,0	
			.byte 0,0,0,0,0,0,0,0	
			.byte 0,0,0,0,0,0,0,0					
			.byte 0,0,0,0,0,0,0,0	
			.byte 0,0,0,0,0,0,0,0	
			.byte 0,0,0,0,0,0,0,0	
			.byte 0,0,0,0,0,0,0,0	
			.byte 0,0,0,0,0,0,0,0	
			
			.byte 15,15,0,0,0,0,2,2
			.byte 255,255,136,136,136,136,170,170
			.byte 252,252,128,128,128,128,160,160
			.byte 32,32,168,168,8,8,42,42
			.byte 8,8,170,170,8,8,42,42
			.byte 2,2,10,10,8,8,42,42			
			.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f 	;F	- 132
			.byte $f0,$f0,0,0,$f0,0,0,0				;F
			.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f	;U 	- 134
			.byte $0f,$0f,$0f,$0f,$0f,$0f,$ff,$ff	;U
			.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f 	;E	- 136
			.byte $f0,$f0,0,0,$f0,0,$f0,$f0			;E
			.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f	;L	- 138
			.byte 0,0,0,0,0,0,$f0,$f0				;L
			.byte $44,$44,$44,$44,$40,$40,$40,$40
			.byte $04,$04,$04,$04,$44,$44,$44,$44
			.byte $44,$44,$44,$44,$04,$04,$04,$04
			.byte $30,$30,$33,$33,$33,$33,$30,$30	;143
			.byte $33,$33,$33,$33,$33,$33,$33,$33
			.byte $03,$03,$33,$33,$33,$33,$03,$03
			.byte $30,$30,$30,$30,$30,$30,$30,$30
			.byte $03,$03,$03,$03,$03,$03,$03,$03
			.byte $0,$0,$0,$0,$33,$33,$33,$33
			.byte $33,$33,$33,$33,0,0,0,0
			.byte $30,$30,$30,$30,$33,$33,$33,$33
			.byte $33,$33,$33,$33,$30,$30,$30,$30
			.byte $03,$03,$03,$03,$33,$33,$33,$33
			.byte $33,$33,$33,$33,$03,$03,$03,$03
			.byte $20,$20,$22,$22,$22,$22,$20,$20	;154
			.byte $22,$22,$22,$22,$22,$22,$22,$22
			.byte $02,$02,$22,$22,$22,$22,$02,$02
			.byte $20,$20,$20,$20,$20,$20,$20,$20
			.byte $02,$02,$02,$02,$02,$02,$02,$02
			.byte $0,$0,$0,$0,$22,$22,$22,$22
			.byte $22,$22,$22,$22,0,0,0,0
			.byte $20,$20,$20,$20,$22,$22,$22,$22
			.byte $22,$22,$22,$22,$20,$20,$20,$20
			.byte $02,$02,$02,$02,$22,$22,$22,$22
			.byte $22,$22,$22,$22,$02,$02,$02,$02
			.byte $10,$10,$11,$11,$11,$11,$10,$10	;165
			.byte $11,$11,$11,$11,$11,$11,$11,$11
			.byte $01,$01,$11,$11,$11,$11,$01,$01
			.byte $10,$10,$10,$10,$10,$10,$10,$10
			.byte $01,$01,$01,$01,$01,$01,$01,$01
			.byte $0,$0,$0,$0,$11,$11,$11,$11
			.byte $11,$11,$11,$11,0,0,0,0
			.byte $10,$10,$10,$10,$11,$11,$11,$11
			.byte $11,$11,$11,$11,$10,$10,$10,$10
			.byte $01,$01,$01,$01,$11,$11,$11,$11
			.byte $11,$11,$11,$11,$01,$01,$01,$01
			.byte $10,$10,$11,$11,$11,$11,$10,$10	;176
			.byte $11,$11,$11,$11,$11,$11,$11,$11
			.byte $01,$01,$11,$11,$11,$11,$01,$01
			.byte $10,$10,$10,$10,$10,$10,$10,$10
													;184 Fuel-Tank
			;.byte 0,0,0,0,15,15,53,53			
			;.byte 0,0,255,255,255,255,185,185
			;.byte 0,0,192,192,252,252,111,111
			;.byte 239,239,111,111,239,239,107,107
			;.byte 185,185,185,185,185,185,169,169
			;.byte 55,55,53,53,55,55,55,55			;190
			;.byte 15,15,0,0,0,0,2,2					;191
			;.byte 255,255,136,136,136,136,170,170	;192
			;.byte 252,252,128,128,128,128,160,160
			;.byte 32,32,168,168,8,8,42,42
			;.byte 8,8,170,170,8,8,42,42				
			;.byte 2,2,10,10,8,8,42,42
			
header:

Code: Alles auswählen

var1 = $a0
var2 = $a2
var3 = $a4
var4 = $a6
var5 = $a8
var6 = $b2
var7 = $b4
lms1 = $b6
lms2 = $b8
lmslo = $a0
lmshi = $a2
delay = $b0

play1 = $92
play2 = $94
play3 = $96
play4 = $98

miss1 = $c0
miss2 = $c2
miss3 = $c4
miss4 = $c6
rechts = $c8
links = $c9
xposp1 = $ca
yposp1 = $cb
joyst1 = $cc
kollp0 = $cd

xposm1 = $ce
yposm1 = $cf
xposm2 = $d0
yposm2 = $d1
xposm3 = $dc
yposm3 = $dd
kollm1 = $d2
kollm2 = $d3

feuer1 = $d4
feuer2 = $d5
yposm1hilf = $d6
feuer3 = $d7
feuer4 = $d8
yposm2hilf = $d9
feuer5 = $da
feuer6 = $db
blink = $de
blink2 = $df
ysonder = $e0
xschuss1 = $e1
yschuss1 = $e2
xschuss2 = $e4
yschuss2 = $e5
var8 = $e7
var9 = $e8
kollges = $f0
explosion1 = $f1
itemex = $f2
tank1exp = $f4
tank1pos = $f6
tank1x = $f8
tank1y = $fa
exp1 = $1900
exp2 = $1902
exp3 = $1904
exp4 = $1906
fuelzaehler = $1908
fuelzaehleritem = $1909
hardware:

Code: Alles auswählen

LINZBS   = $0000
CASINI   = $0002
RAMLO    = $0004
TRAMSZ   = $0006
TSTDAT   = $0007
WARMST   = $0008
BOOT?    = $0009
DOSVEC   = $000a
DOSINI   = $000c
APPMHI   = $000e
POKMSK   = $0010
BRKKEY   = $0011
RTCLOK   = $0012
BUFADR   = $0015
ICCOMT   = $0017
DSKFMS   = $0018
DSKUTL   = $001a
PTIMOT   = $001c
PBPNT    = $001d
PBUFSZ   = $001e
PTEMP    = $001f
ICHIDZ   = $0020
ICDNOZ   = $0021
ICCOMZ   = $0022
ICSTAZ   = $0023
ICBALZ   = $0024
ICPTLZ   = $0026
ICBLLZ   = $0028
ICAX1Z   = $002a
ICAX2Z   = $002b
ICAX3Z   = $002c
ICAX4Z   = $002c
ICAX5Z   = $002e
ICAX6Z   = $002f
STATUS   = $0030
CHKSUM   = $0031
BUFRLO   = $0032
BUFRHI   = $0033
BFENLO   = $0034
BFENHI   = $0035
CRETRY   = $0036
DRETRY   = $0037
BUFRFL   = $0038
RECVDN   = $0039
XMTDON   = $003a
CHKSNT   = $003b
NOCKSM   = $003c
BPTR     = $003d
FTYPE    = $003e
FEOF     = $003f
FREQ     = $0040
SOUNDR   = $0041
CRITIC   = $0042
FMZSPG   = $0043
ZDRVA    = $0045
ZSBA     = $0047
ERRNO    = $0049
CKEY     = $004a
CASSBT   = $004b
DSTAT    = $004c
ATRACT   = $004d
DRKMSK   = $004e
COLRSH   = $004f
TMPCHR   = $0050
HOLD1    = $0051
LMARGN   = $0052
RMARGN   = $0053
ROWCRS   = $0054
COLCRS   = $0055
DINDEX   = $0057
SAVMSC   = $0058
OLDROW   = $005a
OLDCOL   = $005b
OLDCHR   = $005d
OLDADR   = $005e
NEWROW   = $0060
NEWCOL   = $0061
LOGCOL   = $0063
ADRESS   = $0064
MLTTMP   = $0066
SAVADR   = $0068
RAMTOP   = $006a
BUFCNT   = $006b
BUFSTR   = $006c
BITMSK   = $006e
SHFAMT   = $006f
ROWAC    = $0070
COLAC    = $0072
ENDPT    = $0074
DELTAR   = $0076
DELTAC   = $0077
ROWINC   = $0079
COLINC   = $007a
SWPFLG   = $007b
HOLDCH   = $007c
INSDAT   = $007d
COUNTR   = $007e

; hardware shadow registers
VDSLST   = $0200
VPRCED   = $0202
VINTER   = $0204
VBREAK   = $0206
VKEYBD   = $0208
VSERIN   = $020a
VSEROR   = $020c
VSEROC   = $020e
VTIMR1   = $0210
VTIMR2   = $0212
VTIMR4   = $0214
VIMIRQ   = $0216
CDTMV1   = $0218
CDTMV2   = $021a
CDTMV3   = $021c
CDTMV4   = $021e
CDTMV5   = $0220
VVBLKI   = $0222
VVBLKD   = $0224
CDTMA1   = $0226
CDTMA2   = $0228
CDTMF3   = $022a
SRTIMR   = $022b
CDTMF4   = $022c
INTEMP   = $022d
CDTMF5   = $022e
SDMCTL   = $022f
SDLSTL   = $0230
SSKCTL   = $0232
SPARE    = $0233
LPENH    = $0234
LPENV    = $0235
BRKKY    = $0236
CDEVIC   = $023a
CCOMND   = $023b
CAUX1    = $023c
CAUX2    = $023d
TEMP     = $023e
ERRFLG   = $023f
DFLAGS   = $0240
DBSECT   = $0241
BOOTAD   = $0242
COLDST   = $0244
DSKTIM   = $0246
LINBUF   = $0247
GPRIOR   = $026f
PADDL0   = $0270
PADDL1   = $0271
PADDL2   = $0272
PADDL3   = $0273
PADDL4   = $0274
PADDL5   = $0275
PADDL6   = $0276
PADDL7   = $0277
STICK0   = $0278
STICK1   = $0279
STICK2   = $027a
STICK3   = $027b
PTRIG0   = $027c
PTRIG1   = $027d
PTRIG2   = $027e
PTRIG3   = $027f
PTRIG4   = $0280
PTRIG5   = $0281
PTRIG6   = $0282
PTRIG7   = $0283
STRIG0   = $0284
STRIG1   = $0285
STRIG2   = $0286
STRIG3   = $0287
CSTAT    = $0288
WMODE    = $0289
BLIM     = $028a
TXTROW   = $0290
TXTCOL   = $0291
TINDEX   = $0293
TXTMSC   = $0294
TXTOLD   = $0296
TMPX1    = $029c
HOLD3    = $029d
SUBTMP   = $029e
HOLD2    = $029f
DMASK    = $02a0
TMPLBT   = $02a1
ESCFLG   = $02a2
TABMAP   = $02a3
LOGMAP   = $02b2
INVFLG   = $02b6
FILFLG   = $02b7
TMPROW   = $02b8
TMPCOL   = $02b9
SCRFLG   = $02bb
HOLD4    = $02bc
HOLD5    = $02bd
SHFLOK   = $02be
BOTSCR   = $02bf
PCOLR0   = $02c0
PCOLR1   = $02c1
PCOLR2   = $02c2
PCOLR3   = $02c3
COLOR0   = $02c4
COLOR1   = $02c5
COLOR2   = $02c6
COLOR3   = $02c7
COLOR4   = $02c8

; IO space
RUNAD    = $02e0
INITAD   = $02e2
RAMSIZ   = $02e4
MEMTOP   = $02e5
MEMLO    = $02e7
DVSTAT   = $02ea
CBAUDL   = $02ee
CBAUDH   = $02ef
CRSINH   = $02f0
KEYDEL   = $02f1
CH1      = $02f2
CHACT    = $02f3
CHBAS    = $02f4
CHAR     = $02fa
ATACHR   = $02fb
CH       = $02fc
FILDAT   = $02fd
DSPFLG   = $02fe
SSFLAG   = $02ff
DDEVIC   = $0300
DUNIT    = $0301
DCOMND   = $0302
DSTATS   = $0303
DBUFLO   = $0304
DBUFHI   = $0305
DTIMLO   = $0306
DUNUSE   = $0307
DBYTLO   = $0308
DBYTHI   = $0309
DAUX1    = $030a
DAUX2    = $030b
TIMER1   = $030c
ADDCOR   = $030e
CASFLG   = $030f
TIMER2   = $0310
TEMP1    = $0312
TEMP2    = $0314
TEMP3    = $0315
SAVIO    = $0316
TIMFLG   = $0317
STACKP   = $0318
TSTAT    = $0319
HATABS   = $031a
IOCB0    = $0340
IOCB1    = $0350
IOCB2    = $0360
IOCB3    = $0370
IOCB4    = $0380
IOCB5    = $0390
IOCB6    = $03a0
IOCB7    = $03b0
PRNBUF   = $03c0
CASBUF   = $03fd

; GTIA write locations
HPOSP0   = $d000
HPOSP1   = $d001
HPOSP2   = $d002
HPOSP3   = $d003
HPOSM0   = $d004
HPOSM1   = $d005
HPOSM2   = $d006
HPOSM3   = $d007
SIZEP0   = $d008
SIZEP1   = $d009
SIZEP2   = $d00a
SIZEP3   = $d00b
SIZEM    = $d00c
GRAFP0   = $d00d
GRAFP1   = $d00e
GRAFP2   = $d00f
GRAFP3   = $d010
GRAFM    = $d011
COLPM0   = $d012
COLPM1   = $d013
COLPM2   = $d014
COLPM3   = $d015
COLPF0   = $d016
COLPF1   = $d017
COLPF2   = $d018
COLPF3   = $d019
COLBK    = $d01a
PRIOR    = $d01b
VDELAY   = $d01c
GRACTL   = $d01d
HITCLR   = $d01e
CONSOL   = $d01f

; GTIA read locations
M0PF     = $d000
M1PF     = $d001
M2PF     = $d002
M3PF     = $d003
P0PF     = $d004
P1PF     = $d005
P2PF     = $d006
P3PF     = $d007
M0PL     = $d008
M1PL     = $d009
M2PL     = $d00a
M3PL     = $d00b
P0PL     = $d00c
P1PL     = $d00d
P2PL     = $d00e
P3PL     = $d00f
TRIG0    = $d010
TRIG1    = $d011
TRIG2    = $d012
TRIG3    = $d013
PAL      = $d014

; POKEY write locations
AUDF1    = $d200
AUDC1    = $d201
AUDF2    = $d202
AUDC2    = $d203
AUDF3    = $d204
AUDC3    = $d205
AUDF4    = $d206
AUDC4    = $d207
AUDCTL   = $d208
STIMER   = $d209
SKREST   = $d20a
POTGO    = $d20b
SEROUT   = $d20d
IRQEN    = $d20e
SKCTL    = $d20f

; POKEY read locations
POT0     = $d200
POT1     = $d201
POT2     = $d202
POT3     = $d203
POT4     = $d204
POT5     = $d205
POT6     = $d206
POT7     = $d207
ALLPOT   = $d208
KBCODE   = $d209
RANDOM   = $d20a
SERIN    = $d20d
IRQST    = $d20e
SKSTAT   = $d20f

; PIA
PORTA    = $d300
PORTB    = $d301
PACTL    = $d302
PBCTL    = $d303

; ANTIC write locations
DMACTL   = $d400
CHACTL   = $d401
DLISTL   = $d402
DLISTH   = $d403
HSCROL   = $d404
VSCROL   = $d405
PMBASE   = $d407
CHBASE   = $d409
WSYNC    = $d40a
NMIEN    = $d40e
NMIRES   = $d40f

; ANTIC read locations
VCOUNT   = $d40b
PENH     = $d40c
PENV     = $d40d
NMIST    = $d40f
 NMIEN_DLI = $80
 NMIEN_VBI = $40

; vector tables
EDITRV   = $e400
SCRENV   = $e410
KEYBDV   = $e420
PRINTV   = $e430
CASETV   = $e440
DISKIV   = $e450
DSKINV   = $e453
CIOV     = $e456
SIOV     = $e459
SETVBV   = $e45c
SYSVBV   = $e45f
XITVBV   = $e462
SIOINV   = $e465
SENDEV   = $e468
INTINV   = $e46b
CIOINV   = $e46e
BLKBDV   = $e471
WARMSV   = $e474
COLDSV   = $e477
RBLOKV   = $e47a
CSOPIV   = $e47d
Gruß Peter

Benutzeravatar
pps
Beiträge: 99
Registriert: 18.06.2021 23:05
Has thanked: 11 times
Been thanked: 40 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von pps »

Hallo Peter,

ich habe nur ein paar kleine Dinge geändert und auch 2, 3 Hinweise hinzugefügt. Ich denke der Unterschied ist schnell zu sehen und Du kannst das selbst nach Deinem Gutdünken ausweiten. Aber das Teilen und in Prozeduren packen hilft ungemein bei größeren Projekten. Wie man ein Label in einer anderen Prozedur ansprechen kann, sieht man bei einigen jsr fuel.fuelex aufrufen.

Bei "go lucky" und "runfast" habe ich da auch ordentlich Code in halbwegs übersichtliche Dateien packen können. So konnte ich auch viel Code von "go lucky" direkt bei "runfast" wieder verwenden. Das hat die Entwicklung enorm beschleunigt.
r2phobos.zip
(11.15 KiB) 25-mal heruntergeladen
Viel Spaß beim weitercoden ;) Ich hoffe, Dir das nun ein wenig leichter gemacht zu haben.
Ralf

PS: Die erste Zeile in den ausgelagerten Dateien sorgt dafür, dass man dort direkt das gesamte Programm assemblieren kann.
PP´s of STARSOFTBerlin__________github|meine Webseite

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Guten Morgen Ralf,
vielen Dank für deine Mühe und Arbeit.
Größere Abschnitte sinnvoll auszulagern macht auf jeden Fall Sinn - also auch der VBI.
An der DList muss ich noch ein wenig rumschrauben... wahrscheinlich kommt da auch noch ein Interrupt rein.

Der VBI ist zu lang, da muss ich noch kürzen... was unheimlich aufwendig als Code geworden ist, ist das Blinken des Raumschiffes. Das muss viel einfacher gehen. Auch mit den Schüssen bin ich nicht so ganz zufrieden - ich wollte es so programmieren, das die Schüsse nur abwechselnd ausgelöst werden können, vielleicht muss ich da noch einen anderen Weg gehen.
Das Printen der letzten Reihe (ist nicht im VBI) ist zu aufwendig, das muss ich auch ändern, ich habe da auch schon eine gute Idee.
Ein großer Knackpunkt ist auch die genaue Kollisionserkennung... da habe ich richtig viel Code reingesteckt und es läuft immer noch nicht 100% ig richtig. Das werde ich auch komplett umbauen. Eigentlich geht es da ja hauptsächlich um die korrekte x-Position des getroffenen Items - sowohl die x als auch die y-Position habe ich beim printen - vielleicht speicher ich das einfach zwischen und greife dann bei der Kollision darauf zurück und muss nur die y-Position ändern - die habe ich ja aber zum Zeitpunkt der Kollision........
Jetzt baue ich aber zunächst die Landschaft weiter aus und die anderen Items, damit ich die Landschaft befüllen kann - dann kümmere ich mich um die Codeverbesserungen und Fehlerbereinigungen.
Ideen und Codefehler-/Optimierungsvorschläge sind auf jeden Fall gerne gesehen!

Für mich dient dieses Projekt in erster Linie, um Spaß beim programmieren zu haben und um zu lernen... wenn ich meine Anfänge im August 2021 ("Hallo Welt") mit dem Fortschritt jetzt vergleiche, dann bin ich mehr als zufrieden!
LG Peter

Benutzeravatar
Sleeπ
Beiträge: 906
Registriert: 18.06.2021 20:58
Has thanked: 11 times
Been thanked: 107 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Sleeπ »

Prodehl hat geschrieben:
06.01.2022 10:04
... wenn ich meine Anfänge im August 2021 ("Hallo Welt") mit dem Fortschritt jetzt vergleiche, dann bin ich mehr als zufrieden!
Das kannst Du auch sein! Respekt. :-) Wenn ich überlege wie oft ich mit Assembler schon angefangen habe und dann hängen geblieben bin... :roll:
Sleeπ

Benutzeravatar
Kveldulfur
Beiträge: 198
Registriert: 17.08.2021 02:32
Has thanked: 61 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Ich nutze in meinem Programm viele Subroutinen und würde Deine "Blinkroutine" entsprechend so ändern:

Code: Alles auswählen

blinklinks		ldy yposm3
			lda #0
			sta (miss1),y
			mva hposp0 xposm3
			lda yposp1
			clc
			adc #6
			tay
			lda #48
			sta (miss1),y
			mva xposp1 p2pf
			mva xposp1 xposm3
			sty yposm3
	
			rts
			
blinkrechts		ldy yposm3
			lda #0
			sta (miss1),y
			lda yposp1
			clc
			adc #6
			tay
			lda #192
			sta (miss1),y
			lda xposp1
			clc
			adc #14
			sta p3pf
			mva xposp1 xposm3
			sty yposm3
			
			rts			
			
write		
			lda xposp1 					;Blinkabschnitt
			sta hposp0
			adc #2
			sta hposp3
			#if .byte blink<#64			;Blink links
			jsr blinklinks
			#end
			#if .byte blink>#63 .and .byte blink<#128	;Blink rechts
			jsr blinkrechts
			#end
			#if .byte blink>#127 .and .byte blink<#192	;Blink links
			jsr blinklinks
			#end
			#if .byte blink>#191 .and .byte blink<#255	;Blink rechts
			jsr blinkrechts
			#end
Bei mir funktioniert es.

Ist jetzt nur ein Beispiel, wie man den Code kürzen kann.

Grüße
Janko

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Hallöle...
das baue ich später gleich mal ein und probiere es aus!! Supi!
LG

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

... ich habe beide Änderungen eingebaut und noch den kleinen zusätzlichen Fehler beseitigt, der mich schon die ganze Zeit nervt - nämlich daß durch den Blinker immer mal wieder ein paar Bits auf dem Screen stehenbleiben - bei der Abfrage statt > und < einfach ein >= und <= ersetzt und schon ist es weg - logisch.
Ansonsten finde ich die neue Blinkerroutine schlanker und strukturierter... supi. Auch den VBI auszulagern macht Sinn. Der VBI muss aber noch ein wenig schlanker werden, ein paar Sachen sollen da ja noch rein und die Sounds fehlen ja auch noch komplett.
Außerdem muss ich den Aufbau der letzten Reihe noch optimieren..das hatte ich schon vorgestern deutlich besser und schlanker umgesetzt, aber nachts um 1:30 war dann mit meiner Konzentration Schluss und den einen Fehler habe ich einfach nicht wegbekommen und es wurde immer schlimmer, so daß ich auf meine alte Routine zurückgegangen bin und diese dann erweitert habe. Auch muss ich mir Gedanken machen, wie ich das so gestalte, daß ich die letzte Reihe einfacher konstruieren kann... so ist es ganz schön mühsam... vielleicht baue ich mit extra dafür ein kleines Programm welches übersichtlicher die Landschaft bauen läßt...

... gerade noch einen kleinen Bug in der Routine der letzten Reihe fixiert... da war ein inc var5 zu viel... jetzt läuft es ganz ohne Fehler 8-)
Zuletzt geändert von Prodehl am 06.01.2022 17:38, insgesamt 1-mal geändert.

Benutzeravatar
Kveldulfur
Beiträge: 198
Registriert: 17.08.2021 02:32
Has thanked: 61 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Kveldulfur »

Ich habe die komplette Joystickabfrage und Bewegung des Players ausserhalb des VBI.
Als erstes wird der Joystick abgefragt, dann die neue Position berechnet.
Nun warte ich auf einen VSync (also dass das Bild gerade nicht aufgebaut wird) und positioniere meinen Player.

Code: Alles auswählen

; ############################################################################
; # VSync
; # 
		.proc WaitVSync
		
		lda VCOUNT
		cmp #$68
		bcc @+1
		
@		lda VCOUNT
		cmp #$68
		bcs @-
		
@		lda VCOUNT
		cmp #$68
		bcc @-
		
		rts
		
		.end
Die Routine schaut, welche Bildschirmzeile gerade aufgebaut wird. Ist der Wert kleiner $68 warte ich auf darauf, dass dieser Wert überschritten wird. Ist der Wert bereits über $68, warte ich erst einmal, dass dieser kleiner $68 ist.

Der Wert $68 kommt daher, dass mein Spielfeld nicht bis nach ganz unten reicht und ich somit mehr Zeit für die Playerdarstellung habe.

Vielleicht kannst Du das irgendwie nutzen?

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Hallo Janko,
das schaue ich mir mal später an.... das würde natürlich den VBI deutlich entlasten.
Liebe Dank!!

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

Ich habe jetzt die anderen Items programmiert und dabei leider feststellen müssen, daß ich zu leichtfertig mit der Anzahl der Charakter umgegangen bin, denn plötzlich war b ei 128 Schluß... also ran ans Werk, optimieren und umprogrammieren. Danach ging es an die restlichen Items und danach habe ich die Landschaft weiter ausgebaut...
Nun werde ich die nächsten Tage und Wochen weiter an der Landschaft arbeiten, dann kommen noch Kollisionsabfragen und Aktionen auf die Kollisionen und weitere Items, die aktiv und animiert sind... danach Sound - ein noch riesiger Brocken! Das Projekt wächst und macht Spass...

Ein kleiner aktueller Stand anbei:
rtp2.MOV
(2.04 MiB) 36-mal heruntergeladen

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

... ich war trotz wenig Zeit nicht untätig!
Bevor ich den Sound angehe, gibt es noch etliches an Code Bereinigung!
Der VBI muss schlanker und ich habe zunächst mit dem Blinker des Raumschiffes begonnen.
Für den Blinker hatte ich ursprünglich 2 Missiles benutzt und die im VBI aufwendig abwechselnd blinken lassen. Dadurch habe ich aber auch nur noch 2 Missiles für die Schüsse übrig.
Ich habe das jetzt umprogrammiert und nehme zum blinken einfach einen weiteren Player, der am Raumschiff das Blinken übernimmt. Dadurch kann ich noch eine weitere Farbe ins Raumschiff bringen.
Der ganze Code wird dadurch schon etwas schlanker. Anschließend habe ich fast den gesamten Blinkcode aus dem VBI ins Hauptprogramm gezogen und die ganzen zeitaufwendigen IF - Abfragen sind jetzt im Hauptcode.
Jetzt kann ich den Code für die Schüsse umbauen - damit war ich noch nie so richtig zufrieden - außerdem sollen jetzt alle 4 Missiles als Schüsse benutzbar werden - auch den Code versuche ich wenn es geht auszulagern....
Liebe Grüße
Peter

Online
Benutzeravatar
Prodehl
Beiträge: 279
Registriert: 24.08.2021 14:40
Has thanked: 14 times
Been thanked: 52 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Prodehl »

... die letzten Tage konnte ich endlich meinen Atari-Raum einrichten - noch ist es nicht fertig, aber ich habe schon mal meinen 130 XE aufgebaut, die Fujinet drangehängt, mit meinem Netzwerk verbunden und dann direkt mit meinem Mac das Programm retrun2phobos.xex gestartet... und es läuft. Das war der erste Test meines Programmes auf einem original Atari-Rechner.
rtp2.1.jpg
rtp2.2.jpg

wosch
Beiträge: 69
Registriert: 17.08.2021 21:16
Wohnort: Reutlingen
Has thanked: 57 times
Been thanked: 12 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von wosch »

Cool.
Sowas übers Netzwerk zu machen hat schon was :D
Gruß
Wolfgang

Benutzeravatar
Sleeπ
Beiträge: 906
Registriert: 18.06.2021 20:58
Has thanked: 11 times
Been thanked: 107 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von Sleeπ »

Sehr praktisch - programmieren auf dem Äpfelchen und testen direkt auf originaler Hardware ohne die Dateien erst hin-und herzukopieren. 8-)
Sleeπ

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast