Return to Phobos

Moderator: Rockford

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

Re: Return to Phobos

Beitrag von Prodehl »

....
die letzten Tage habe ich wieder an der Explosion und speziell heute an den Schüssen rumgebastelt...
Ziele sind folgende:
1. Die Explosion muss noch genauer werden - hier sind noch Fehler bei der genauen Erkennung der Position der Items und eigentlich sollen die Explosionen auch während des Scrolling fortwährend laufen und nicht direkt komplett, was ja immer einen kleinen Stopp bedeutet.
2. Ich habe das blinken umgebaut und überwiegend aus dem VBI rausgeholt - funktioniert ganz gut - und habe jetzt 4 Schüsse zur Verfügung.
Diese sollen im Wechsel rechts und links laufen und auch durchaus gleichzeitig. Das ganze muss so gestaltet werden, daß auch hier der VBI entlastet wird, da ich ihn noch für Sound brauche.

zu 1: Das habe ich leider noch nicht hinbekommen. Die momentane Idee ist folgende: Ich brauche 12 Charakter für die Explosion und habe 4 Animationsphasen. Die lasse ich ständig laufen im Hintergrund und bei einem Treffer werden die 12 Charakter fürs Item mit den 12 Charaktern der Explosion überschrieben - das Scrolling geht dann automatisch weiter und ich muss mich nicht ums Timing kümmern. Da können dann auch mehrere Explosionen nebeneinander laufen - Problem ist dann nur der Start-/ und Endpunkt der Explosion.... dafür habe ich noch keine Lösung!

zu 2: Ich habe heute die Schüsse komplett umgebaut. Die Joystickabfrage (Strig0) und das Setzen der benötigten Parameter für den jeweiligen Schuss kann ich im Hauptprogramm machen - mache ich redundant im Feinscroll und an anderen Stellen. Aber die eigentliche Bewegung des Schusses geht quasi nur im VBI da sonst der Schuss viel zu langsam ist... und hier bekomme ich wieder ein Zeit- und Kapazitätsproblem im VBI. Ein Schuss kein Problem, 2 Schüsse geht auch noch ist aber tricky, 4 Schüsse unabhängig ... puh... da steigt mir der VBI aus. Da habe ich einfach zu viele Bedingungen und Abfragen.... das muss doch einfach und schlank gehen !!!!!
Meine letzte Idee ist nun folgende: Alle 4 Schüsse laufen ständig unabhängig mit einer relativ schlanken Routine ständig im Hintergrund im VBI von oben nach unten durch - kommt dann der Impuls (durch Strig0) für einen Schuss, verändere ich einfach die x und y- Parameter für den jeweiligen Schuss und er wird sichtbar (x) und startet in Höhe Abschuss vom Raumschiff (y).
Das will ich jetzt mal die Tage umsetzen...

Vielleicht hat ja jemand für beide Probleme auch die zündende und bessere Idee wie man es am besten macht, denn wenn ich mir die ganzen Spiele so anschaue, muss das doch eigentlich ganz easy sein!
Grüße
Peter

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

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Ich habe so eine Routine für Missiles zwar noch nicht geschrieben, stelle es mir aber wie folgt vor:

Code: Alles auswählen

missile	.byte $00, $00, $00, $00 	; vier Schüsse
..
..
..
	.proc Schuessebewegen
	ldy $00
lp	ldx missile,y				; Lade Y-Position Schuss 0-3
	cpx #$00					
	bne mv					; Wenn ungleich 0 muss der Missile bewegt werden
nx	iny					; Schussnr. hochzählen
	cpy #$04				; max. 4 sind vorhanden
	bne lp					; Wenn der letzte Schuss noch nicht bearbeitet, zurück
	rts					; Unterroutine für Schüsse beendet
	
mv	tya					; y retten
	pha					; Unterroutine um den Schuss einen Schritt zu bewegen
      ..
      ..
      ..
	pla					; y zurück holen
	tay
	jmp nx					; nächsten Schuss bearbeiten
	.end


Wenn nun im Hauptprogramm festgestellt wird, dass geschossen wurde, bereitet man einen freien Missile vor, indem man ihn an die richtige Position setzt und setzt sta missile,x auf den y-Wert des Schusses. Die Routine erkennt nun dass der Missile bewegt werden muss.
Man kann im Hauptprogramm die Kollision abfragen und dann auswerten."missile" sollte auf 0 gesetzt werden, wenn der Schuss den untern Rand erreicht hat oder ein Treffer erfolgte.

Ich hoffe Du kannst meinen Gedanken folgen und es hilft Dir weiter.

Janko

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

Re: Return to Phobos

Beitrag von Prodehl »

Hallo Janko und vielen Dank für deinen kreativen Lösungsansatz!
So ähnlich wie du es schreibst, habe ich es auch jetzt vor!
Allerdings möchte ich so wenig Abfragen und Bedingungen in die Missileroutine im VBI reinpacken wie möglich.
Rein theoretisch sollte es ja zu 4 Schüssen gleichzeitig kommen können, daher muss der VBI das auch zeitlich abarbeiten können - sonst macht es keinen Sinn. Dann kann das aber auch ständig im Hintergrund laufen und ich mache es nur jeweils (durch x-Positionierung) sichtbar.
Also alle 4 Missiles laufen ständig vom Bildschirmoberrand zum Unterrand - wenn der Unterrand erreicht wird, dann startet der Missile wieder von oben. Die X-Position wird auf 0 gesetzt - also sieht man die Missiles primär nicht. Die Joystickabfrage läuft im Hauptprogramm (das packe ich in die Feinscrollroutine, da ich hier noch Zeit habe und eh mit einer Warteschleife verzögern muss) - sobald der Feuerknopf gedrückt wurde kommt der entsprechende Werte in die y-Position und x-Position des jeweiligen Missile und er wird sichtbar. Läuft er nach ganz unten oder an den Boarderrand geht x auf Null und der Missile wird wieder unsichtbar - passiert eine Kollision mit einem Item startet die Explosionsroutine. Entsprechend läuft das mit den anderen drei Missiles....

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

Re: Return to Phobos

Beitrag von Prodehl »

... hier nun das erste Ergebnis:

Ich habe zunächst ein Missile umgesetzt. Die Routine im VBI sieht. nun extrem abgespeckt so aus:
rtp2bild.jpg
Alles andere läuft im Hauptprogramm. Die Joystickabfrage für den Schuss und das Setzen der Parameter.
Ich habe den Schuss zur Kontrolle noch sichtbar am linken Bildrand mitlaufen lassen und man sieht im Video sehr schön, daß der Schuss ständig läuft und wegen des schlanken Codes den VBI praktisch gar nicht belastet. Drückt man den Feuerknopf, wird die Position auf x und y verändert und der Schuss wird sichtbar bis der untere Rand erreicht ist - dann geht die x Position wieder auf den hier noch gerade sichtbaren Bereich am linken Rand. Beim finalen Spiel wandert der dann natürlich ganz raus. Es sind noch ein paar Fehler drin und die Kollisionsabfrage muss noch rein!
Außerdem muss noch eine intelligente Steuerung der 4 Schüsse rein, die einmal abgefeuert ja bis nach unten oder bis zur Kollision durchlaufen müssen.
Hier das kurze Video:#
rtp2video.MOV
(1.8 MiB) 31-mal heruntergeladen
Peter

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

Re: Return to Phobos

Beitrag von Prodehl »

Heute habe ich an den Schüssen gearbeitet und alle 4 Schüsse funktionieren jetzt gut. Der Hauptcode liegt im Hauptprogramm und der VBI ist schlank und wenig belastet. Leider habe ich schon das nächste massive Problem...
Aber hier erstmal der Code vom VBI und vom Hauptprogramm:

Code: Alles auswählen

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


								;vertical blank interrupt fr Joystick / PM

	.proc vbinter			
			pha
			txa
			pha
			tya
			pha
			mva #0 atract		;Bildschirmschoner aus
			
			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		sec
			lda xposp1 					;x-Position der Player setzen
			sta hposp0
			sbc #0
			sta hposp2
			adc #2
			sta hposp3
	
			ldy yposp1					;Player printen
			clc
			lda blink
			tax
			dey
			mva #0 lms2						
@			lda pm41,x
			sta (play4),y
			lda pm42,x
			sta (play3),y
			iny
			inx
			inc lms2
			lda lms2
			cmp #14
			bne @-
										;Schüsse laufen ständig 
						
			jsr schuesse
			mva m0pf kollm1
			mva m1pf kollm2
			mva m2pf kollm3
			mva m3pf kollm4
			mva #1 hitclr
			
			;-------------------------------------------------------------
			
			
			pla
			tay
			pla
			tax
			pla
			jmp xitvbv			;vb-interrupt wird über xitvbv beendet!!
	
	
			
	
	
	.endp

Code: Alles auswählen

			org $2000

			icl '../hardware.txt'
			icl 'header.txt'
			icl 'character.asm'
			icl 'lands.asm'	
        
	.proc dlist
		   	.by 112,112,112,100
			.by 30,75
:21			.by 36
:5			.by 4
			.by 65
			.wo dlist
	.endp


			icl 'pmg_vars.asm'
			
			.proc main
			
main1		mwa #dlist 560  
			mva #10 yposp1
			mva #120 xposp1
			mva #42 yposm1
			mva #0 xposm1
			mva #94 yposm2
			mva #49 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 #12 color3	;Schriftfarbe	
			mva #220 color1	;Gelb
			mva #153 color0	;Blau
			;mva #52 color0	;Rot
			mva #180 color2	; Grün
			mva #0 color4 ;Hintergrundfarbe
			lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1 \ sta feuer6
						
			; Player vorbereiten und initialisieren
			; Kollisionen:  4 = Grün   2 = Gelb
			lda ramtop
			sec
			sbc #16
			sta pmbase
			clc
			adc #3
			sta miss1+1						
			sta miss2+1
			sta miss3+1
			sta miss4+1
			adc #1
			sta play1+1
			adc #2
			sta play3+1
			adc #1
			sta play4+1
			lda #9
			sta play4
			lda #3
			sta play3
			
			mva #62 sdmctl
			mva #56 pcolr0
			mva #15 pcolr1
			mva #119 pcolr2
			mva #191 pcolr3
			mva #1 gprior
			mva #3 gractl
			mva #1 sizep0
			mva #1 sizep1
			mva #1 sizep2
			mva #0 sizem
			mva #0 rechts
			mva #2 hitclr
			mva #48 blink
			mva #40 p1pf
			mva #8 hposm0
			mva #8 hposm1
			mva #8 hposm2
			mva #8 hposm3
			mva #1 yschuss1
			mva #11 yschuss2
			mva #22 yschuss3
			mva #33 yschuss4
			mva #1 schussi

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
			sta (play3),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
			
			
			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
			
			
			
			
			#if .byte yschuss1>#207 .or .byte kollm1=#4
			ldy yschuss1
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #8 hposm0
			mva #1 hitclr
			#end
			#if .byte yschuss2>#207 .or .byte kollm2=#4
			ldy yschuss2
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #8 hposm1
			mva #1 hitclr
			#end
			#if .byte yschuss3>#207 .or .byte kollm3=#4
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #8 hposm2
			mva #1 hitclr
			#end
			#if .byte yschuss4>#207 .or .byte kollm4=#4
			ldy yschuss4
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #1 hitclr
			mva #8 hposm3
			#end
			
			lda blink2
			adc #59
			sta blink2
			#if .byte blink2>=#0 .and .byte blink2<#60
			mva #0 blink
			#end
			#if .byte blink2>=#60 .and .byte blink2<#120
			mva #14 blink
			#end
			#if .byte blink2>=#120 .and .byte blink2<=#180
			mva #28 blink
			#end
			#if .byte blink2>=#180 .and .byte blink2<=#255
			mva #42 blink
			#end
			clc
			lda kollp0
			cmp #1
			bcc @+
			
			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 schusslogik
			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
			mva #0 fuelzaehler				;Fuel zuende Neustart
			#end
			
			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 kollm1
			#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
			
			jsr schusslogik
 			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 #45 	; - 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 ----------------------------------
			; _____________________________________________________________________________________

								
			icl 'VBI.asm'
			; -------------------------------------------------------------------------------------

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

	.proc 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
	.endp
			; -------------------------------------------------------------------------------------

	.proc wartes
			clc
 		   	ldx delay ; Warteschleife
st  		lda RTCLOK+2    
wa   		cmp RTCLOK+2    
        	beq wa    
        	dex            
        	bpl st 
        	rts
        .endp
        
        
    .proc warte2
    		
 			clc
@			dec delay1
 			lda delay1
 			cmp #1
 			bne @-
  
  
    		rts

    	.endp
    	
        	; -------------------------------------------------------------------------------------
        	
	.proc feinscroll
			ldy #1
			mva #0 delay
			mva #255 delay1
@			jsr wartes
			
			sty vscrol
			iny
			cpy #8
			bne @-	
			
				
			rts
        .endp	
        	; --------------------------------------------------------------------------------------
   
   .proc schusslogik
   
   
   			#if .byte strig0=#0 
   			asl schussi
			#end
			
			#if .byte schussi=#2
			lda xposp1 
			sta hposm0
			lda #0
			ldy yschuss1
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss1
			asl schussi
			#end
			
			#if .byte schussi=#8
			lda xposp1 
			adc #12
			sta hposm1
			lda #0
			ldy yschuss2
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss2
			asl schussi
			#end
			
			#if .byte schussi=#32
			lda xposp1 
			sta hposm2
			lda #0
			ldy yschuss3
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss3
			asl schussi
			#end
			
			#if .byte schussi=#128
			lda xposp1
			adc #12 
			sta hposm3
			lda #0
			ldy yschuss4
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss4
			mva #1 schussi
			#end
			
   			rts
   
    	.endp
    	
    	   ; -------------------------------------------------------------------------------------- 	
	.proc 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
	.endp		
			; -------------------------------------------------------------------------------
	
	.proc 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
			tax				;Boarderanzahl 1 in x speichern
			jsr var6up
			lda (var6),y	;Boarderart 1 holen
			sta var7		;abspeichern in var7
@			iny
			sta (var1),y 	;Boarder1 printen
			dex
			bpl @-	
			jsr var6up
			lda (var6),y	;Boarderanzahl 2 holen
			tax
			jsr var6up
			lda (var6),y	;Boarderart 2 holen
			ldy var5
@			iny			 
			sta (var1),y 	;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
			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
			#if .byte var5=#99
			jmp *
			#end
			jsr var6up
			#if .byte var5=#50	;Öltank printen
			ldx #11
			clc
@			mva tankol,x pr1,x
			dex
			bpl @-
			#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
			
			#if .byte var5=#51	;Rakete printen
			ldx #11
			clc
@			mva rakete,x pr1,x
			dex
			bpl @-	
			#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			;Rakete printen
			#end
			
			#if .byte var5=#52	;Alien printen
			ldx #11
			clc
@			mva alien,x pr1,x
			dex
			bpl @-	
			#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			;Alien printen
			#end
			#if .byte var5=#53	;TNT printen
			ldx #11
			clc
@			mva tnt,x pr1,x
			dex
			bpl @-	
			#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			;TNT 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
	.endp
			; --------------------------------------------------------------------------------------
			
	.proc 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 pr1
			sta (var2),y	;1
			
			lda pr2
			iny
			sta (var2),y	;2
			
			lda pr3
			iny
			sta (var2),y	;3
			clc
			lda var2
			adc #41
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			dey
			
			lda pr4
			sta (var2),y	;4
			dey
			
			lda pr5
			sta (var2),y	;5
			dey
			
			lda pr6
			sta (var2),y	;6
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			
			lda pr7
			sta (var2),y	;7
			
			lda pr8
			iny
			sta (var2),y	;8
			
			lda pr9
			iny
			sta (var2),y	;9 
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			
			lda pr10
			sta (var2),y	;10
			dey
			
			lda pr11
			sta (var2),y	;11
			dey

			lda pr12
			sta (var2),y	;12
			tya
			rts
	.endp
			; ------------------------------------------------------------------------------


	.proc 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
			ldx #11
			clc
@			mva expl1,x pr1,x
			dex
			bpl @-	
			jsr fuel.fuelex
			tay
			iny
expl22		
			mva #80 var5
			mva tank1pos var2
			mva tank1pos+1 var2+1
			mva #1 delay
			jsr wartes
			ldx #11
			clc
@			mva expl2,x pr1,x
			dex
			bpl @-	
			jsr fuel.fuelex
			tay
			iny
			
expl33		
			mva #92 var5
			mva tank1pos var2
			mva tank1pos+1 var2+1
			mva #1 delay
			jsr wartes
			ldx #11
			clc
@			mva expl3,x pr1,x
			dex
			bpl @-	
			jsr fuel.fuelex
			tay
			iny
expl44		
			mva #104 var5
			mva tank1pos var2
			mva tank1pos+1 var2+1
			mva #1 delay
			jsr wartes
			ldx #11
			clc
@			mva expl4,x pr1,x
			dex
			bpl @-	
			jsr fuel.fuelex
			tay
			iny
			rts
	.endp
			; ------------------------------------------------------------------------------
	.proc schuesse
	
			ldy yschuss1
			iny
			iny
			lda #1
			sta (miss1),Y
			sty yschuss1
			lda #0
			dey
			dey
			sta (miss1),Y
			mva m0pf kollm1
			
			ldy yschuss2
			iny
			iny
			lda #4
			sta (miss1),Y
			sty yschuss2
			lda #0
			dey
			dey
			sta (miss1),Y
			mva m1pf kollm2
			
			ldy yschuss3
			iny
			iny
			lda #16
			sta (miss1),Y
			sty yschuss3
			lda #0
			dey
			dey
			sta (miss1),Y
			mva m2pf kollm3
			
			ldy yschuss4
			iny
			iny
			lda #64
			sta (miss1),Y
			sty yschuss4
			lda #0
			dey
			dey
			sta (miss1),Y
			mva m3pf kollm4
			rts
	
	
	
	.endp
	
	.proc 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
	.endp
			; ------------------------------------------------------------------------------
			
			
			run main
und noch ein kleines Video:
rtp2.MOV
(2.43 MiB) 24-mal heruntergeladen

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

Re: Return to Phobos

Beitrag von Prodehl »

und nun das Problem:

Es sind die Kollisionen...
Die Missiles laufen ja im VBI und erkennen dort auch die Kollisionen. Wenn jetzt im Hauptprogramm die Abfragen kommen und die verschiedenen Aktionen der jeweiligen Kollision, ist der Missile ja bevor überhaupt was passiert im VBI schon ein paar Zeilen weitergegangen und hat dann schon ganz andere Kollisionen gemacht bzw. die eigentliche Aktion kommt im Hauptprogramm zu spät.... ich habe heute einige Stunden mit allen möglichen Varianten experimentiert aber keine gute Lösung gefunden. Programmiere ich die ganze Schusslogik im Hauptprogramm, laufen die Missiles zu langsam und ruckeln.
Programmiere ich alles im VBI dann verbrauche ich dort wieder zu viel Zeit. Ich fürchte aber es geht nicht anders...
Oder übersehe ich da etwas??
LG
Peter

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

Re: Return to Phobos

Beitrag von Kveldulfur »

Hi!

Evtl. geht ja ein Gemisch?
Im VBI wird die Kollision erkannt und der Missile ausgeblendet. Du setzt eine Variable Kollision auf true und merkst Dir die Position der Kollision.
Im Hauptprogramm erkennst Du nun die Kollision und die Position und kümmerst Dich um die weitere Logik.

Wenn die Animation der Kollision minimal verzögert kommt, sollte das kein Problem sein. Der Schuss ist weg und somit optisch kollidiert.

Grüße
Janko

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

Re: Return to Phobos

Beitrag von Prodehl »

Hallo Janko,
wo kommst du nochmal her?? Vielleicht sollten wir mal ein Projekt zusammen machen, ich glaube wir ticken ganz ähnlich.
Ich habe mir natürlich auch nebenher Gedanken gemacht, wie ich das lösen kann und bin auf den gleichen Ansatz gekommen.

Die Schüsse müssen gut laufen und die Kollisionen müssen stabil klappen, sonst geht ja der Spielspass flöten. Also habe ich mir jetzt gesagt: VBI erstmal egal, ich muss da noch mehr Code reinpacken.
Das habe ich jetzt auch umgesetzt und es jetzt so zunächst gelöst:
Die Missiles laufen ja ständig im VBI unsichtbar und ich biege nur die x- und y-Position jeweils um, wenn der Feuerknopf gedrückt wird. Für die Abfolge der Schüsse nehme ich eine Extravariable, da steht eine 1 drin, die mit dem Befehl ASL bitweise verschoben wird. Das steuert die Schüsse in der Folge rechts links rechts links. Diese Schusslogik findet im Hauptprogramm statt.
Damit die Schüsse schneller laufen, incrementiere ich sie im VBI 2x - das Problem dabei ist, daß dann 2 verschiedene Kollisionen stattfinden können. Eine gewollte und eine ungewollte. Dafür halte ich 4x2 Variablen bereit und packe die jeweilige Kollisionsart in diese Variable rein - für alle 4 Schüsse. Das läuft auch ständig im VBI. Sobald eine Kollision eines Missiles stattfindet, biege ich den x-Vektor dieses Missiles im VBI weg, damit dann keine weiteren Kollisionen stattfinden können und die ersten Ereignisse überschreiben können. Dieser Aufwand muss wohl im VBI sein, vielleicht kann ich den Code noch etwas optimieren. Alles andere muss dann im Hauptprogramm erfolgen. Wahrscheinlich muss ich im VBI auch noch die jeweiligen x und y-Positionen retten!

Das System ist zunehmend sensibel finde ich. Nach diesen Änderungen bekomme ich ab und zu ein unangenehmes Ruckeln rein - mal ja und mal nicht. Habe noch nicht rausgefunden woher das kommt.... ich dachte erst an der Lände des VBI, aber wenn ich den Emulator auf 60 Hz umstelle, läuft es stabiler - dann kann es ja nicht an der Codelänge im VBI liegen.

Ganz schön kompliziert so ein Shooter....... ich glaube als nächstes Projekt mache ich mal ein feines Jump ´n Run - Spiel ;-)
Gruß
Peter

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

Re: Return to Phobos

Beitrag von Prodehl »

Code: Alles auswählen

							;Schüsse 1-4 laufen incl. Kollisionsabfragen
			lda #1			
			ldy yschuss1
			iny
			sta (miss1),Y
			mva m0pf kollm1
			lda #1
			iny
			sta (miss1),y
			mva m0pf kollm12
			sty yschuss1
			lda #0
			dey
			dey
			sta (miss1),Y
			iny
			sta (miss1),y
			
			lda #4			
			ldy yschuss2
			iny
			sta (miss1),Y
			mva m1pf kollm2
			lda #4
			iny
			sta (miss1),y
			mva m1pf kollm22
			sty yschuss2
			lda #0
			dey
			dey
			sta (miss1),Y
			iny
			sta (miss1),y
			
			lda #16			
			ldy yschuss3
			iny
			sta (miss1),Y
			mva m2pf kollm3
			lda #16
			iny
			sta (miss1),y
			mva m2pf kollm32
			sty yschuss3
			lda #0
			dey
			dey
			sta (miss1),Y
			iny
			sta (miss1),y
			
			lda #64	
			ldy yschuss4
			iny
			sta (miss1),Y
			mva m3pf kollm4
			lda #64
			iny
			sta (miss1),y
			mva m3pf kollm42
			sty yschuss4
			lda #0
			dey
			dey
			sta (miss1),Y
			iny
			sta (miss1),y
			
			mva #1 hitclr

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

brauche Rat!

Beitrag von Prodehl »

Ich habe jetzt mal rumexperimentiert, aber dieses Bildschirmruckeln ist blöd, da es auch dann ab und zu Fehler in der Landschaft produziert. Ich kann es auch kaum reproduzieren... manchmal ruckelt es stark und manchmal gar nicht.

Heute habe ich dann auf 2 Schüsse verzichtet und somit den Code im VBI deutlich reduziert - das Ruckeln ist weg.
Auch habe ich die komplizierten If Then Or Schleifen weggelassen und es nativ programmiert - in der Hoffnung, daß es stabiler läuft.
Fazit: Weniger Code im VBI stabilisiert das System, aber auch mit 2 Schüssen scheine ich nicht viel Luft zu haben, was seltsam anmutet... habe ich mich verrechnet? Ich war von ca. 1500 Befehlen - also 7000-8000 Taktzyklen ausgegangen.
Mit 4 Schüssen verbrauche ich 610 Befehle, mit 2S Schüssen nur 380 Befehle - also noch viel Luft nach oben.
Woran hängt es dann?
Schafft der Rechner zwar die 610 Befehle ohne dass er abstürzt aber mit zunehmender Belastung des VBI wird das System instabil??? So bekomme ich keinen vernünftigen Sound mehr rein...
Oder habe ich irgendwo einen Denkfehler?? Muss ich ganz gezielt WSYNC einsetzen (alle Versuche machte es eher schlechter).
Ist meine Lösung mit dem Fein-/Grobscroll mit 2 Bildschirmen zu instabil???
Wie bloß haben die Jungs das früher programmiert und die Shooter so schön hinbekommen??
Für Ideen bin ich echt dankbar!
Gruß
Peter

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

Re: Return to Phobos

Beitrag von Prodehl »

hier das Video mit 2 Schüssen:
rtp2s.mov
(2.98 MiB) 34-mal heruntergeladen
und das Video mit 4 Schüssen:
rtp4s.mov
(2.98 MiB) 27-mal heruntergeladen
in beiden Fällen wird die Kollision noch nicht richtig erkannt und die Explosion läuft nicht richtig... aber das muss ich ja noch anpassen!

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

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo Peter,

hier mal ein theoretischer Ansatz, ohne Gewähr auf Richtigkeit ;-)

Der ATARI läuft zwar mit ca. 1,79Mhz, aber den größten Teil ist die CPU blockiert, damit die Grafik dargestellt werden kann.
Die meiste "freie" Zeit hat der ATARI wenn das Bild gerade fertig aufgebaut wurde und ein neuer Aufbau vorbereitet wird. Das ist dann auch die Zeit des VBI. Also je mehr Code im VBI ausgeführt wird, desto weniger kann der ATARI außerhalb des VBI bearbeiten.

Der VBI wird alle 1/50 Sekunde aufgerufen. Das heißt alles im VBI wird alle 20ms erneut ausgeführt.

Die Frage ist somit, muss wirklich alles immer 50x die Sekunde abgearbeitet werden? Kann man vllt. Code aufteilen, so dass im 1. VBI Teil A, im 2. VBI Teil B und im 3. VBI Teil C bearbeitet wird, und dann wieder von vorne? Nur wichtiger Code wird jedes Mal ausgeführt.

Beispiel Scrolling im VBI:
1. VBI - Feinscolling +1 im sichtbaren Bereich und 256 Byte im ausgeblendeten wird verschoben.
2. VBI - Feinscolling +1 im sichtbaren Bereich und weitere 256 Byte im ausgeblendeten wird verschoben.
3. VBI - Feinscolling +1 im sichtbaren Bereich und weitere 256 Byte im ausgeblendeten wird verschoben.
4. VBI - Feinscolling +1 im sichtbaren Bereich und die letzen 256 Byte im ausgeblendeten wird verschoben.
5. VBI - Feinscolling +1 die letzte Zeile wird aus den Daten erzeugt
6. VBI - Feinscolling +1 Objekte werden entfernt, die bereits abgeschossen wurden
7. VBI - Feinscolling +1 Punktestand und Fuel etc. werden ausgegeben/aktualisiert
8. VBI - Feinscolling wieder zurücksetzen und umblenden

Hoffentlich habe ich jetzt nicht zu viel Mist erzählt und Du kannst damit etwas anfangen :-)

Grüße
Janko

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

Re: Return to Phobos

Beitrag von Prodehl »

Hi Janko,
erst einmal vielen Dank für den wirklich kreativen Ansatz.
Ich dachte wirklich in dem Moment, als ich es gelesen hatte: Das ist es. Und habe es gerade mal mit einfacher Teilung des VBI umgesetzt... so einfach geht es leider nicht. Es ruckelt mindestens genauso und die Steuerung und die Missiles laufen abgehackt.
Vielleicht kann man das noch besser umsetzten, wird aber richtig kompliziert... der VBI, gesteuert durch das Hauptprogramm geht nicht gut, aber.... er läßt sich steuern und aufrufen durch den DLI und dann kann ich den VBI in Portionen teilen und jeweils aufrufen.

Und dann fiel mir noch folgendes ein: Warum nicht einfach den VBI2 durch den VBI1 aufrufen und dann VBI3 durch VBI2 usw..... das habe ich gerade mal umgesetzt und einen schönen Systemabsturz erwartet... aber siehe da: Es funktioniert. Und läuft flüssig und mit 4 Schüssen ganz ohne ruckeln!!
Wie cool !! Ok, die Steuerung ist natürlich etwas träger und die Missiles laufen etwas langsamer runter - das muss ich noch anpassen. Aber zumindest ist das wohl die Lösung der Probleme. Hurra!!!!!
Gruß
Peter

... Danke für die notwendige Inspiration!!

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

Re: Return to Phobos

Beitrag von Prodehl »

... heute habe ich eine Menge experimentiert mit den VBI´s.... folgendes kann ich nun berichten:

Zeit bleibt Zeit und das kann man nicht ändern. Teile ich den langen VBI in 2 VBI´s, dann läuft das System stabil und rund, aber man merkt die Einbuße der Geschwindigkeit. Die Joysticksteuerung wird etwas träger und ich muss die x- und y-Verschiebung des Raumschiffes anpassen (Werte verdoppeln). Dadurch läuft es noch gut aber nicht mehr ganz so flüssig.
Gleiches gilt für die Missiles... auch hier musste ich die Geschwindigkeit verdoppeln, da sonst die Missiles zu langsam runterlaufen.
Ich kann noch weitere VBI´s einbauen und so weiter "teilen" - Thema Musik, das wird alles andere aber logischerweise weiter verlangsamen... hier gibt es also ganz klar Grenzen!!
Ich lass das jetzt erst einmal so und mache weiter. Am Ende schaue ich, daß ich noch ein wenig Code vom VBI ins Hauptprogramm packe... vielleicht experimentiere ich auch noch mit dem DLI - aber der ist ja noch zeitkritischer.

Immerhin kann man eines sagen: Einen VBI durch einen anderen VBI aufzurufen geht einfach und gut, man kann da direkt den Vektor umbiegen und muss nicht erst durch setvbv durchspringen... anbei das vorläufige Listing des VBI:

Code: Alles auswählen

.proc vbinter			
			pha
			txa
			pha
			tya
			pha
			mva #0 atract		;Bildschirmschoner aus
			
			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 nachun1
			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
nachun1		jmp nachun
nachre		clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
			inc xposp1
@			jmp write
nachreun
			clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
			inc xposp1
@			jmp nachun
nachreob
			clc
			lda xposp1
			cmp #192
			bcs @+
			inc xposp1
			inc xposp1
@			jmp nachob
nachli		sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
			dec xposp1
@			jmp write
nachliun
			sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
			dec xposp1
@			jmp nachun
nachliob
			sec
			lda xposp1
			cmp #49
			bcc @+
			dec xposp1
			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		sec
			lda xposp1 					;x-Position der Player setzen
			sta hposp0
			sbc #0
			sta hposp2
			adc #2
			sta hposp3
	
			ldy yposp1					;Player printen
			clc
			lda blink
			tax
			dey
			mva #0 lms2						
@			lda pm41,x
			sta (play4),y
			lda pm42,x
			sta (play3),y
			iny
			inx
			inc lms2
			lda lms2
			cmp #14
			bne @-
						
			mwa #vbinter2 $224
					
			pla
			tay
			pla
			tax
			pla
			
			jmp xitvbv			;vb-interrupt wird über xitvbv beendet!!
	
	
			
	
	
	.endp
	
	.proc vbinter2			
			
			pha
			txa
			pha
			tya
			pha
									;Schüsse 1-4 laufen incl. Kollisionsabfragen
			lda #1			
			ldy yschuss1
			iny
			iny
			sta (miss1),Y
			mva m0pf kollm1
			lda #1
			iny
			
			sta (miss1),y
			mva m0pf kollm12
			sty yschuss1
			lda #0
			
			dey
			dey
			dey
			sta (miss1),Y
			iny
			iny
			sta (miss1),y
			
			lda #4			
			ldy yschuss2
			iny
			iny
			sta (miss1),Y
			mva m1pf kollm2
			lda #4
			iny
			
			sta (miss1),y
			mva m1pf kollm22
			sty yschuss2
			lda #0
			dey
			dey
			dey
			sta (miss1),Y
			iny
			iny
			sta (miss1),y
			
			lda #16			
			ldy yschuss3
			iny
			iny
			sta (miss1),Y
			mva m2pf kollm3
			lda #16
			iny
			sta (miss1),y
			mva m2pf kollm32
			sty yschuss3
			lda #0
			dey
			dey
			dey
			sta (miss1),Y
			iny
			iny
			sta (miss1),y
			
			lda #64	
			ldy yschuss4
			iny
			iny
			sta (miss1),Y
			mva m3pf kollm4
			lda #64
			iny
			sta (miss1),y
			mva m3pf kollm42
			sty yschuss4
			lda #0
			dey
			dey
			dey
			sta (miss1),Y
			iny
			iny
			sta (miss1),y
			
			mva #1 hitclr		
			
			#if .byte kollm1>#0 .or .byte kollm12>#0
			mva hposm0 xschuss
			mva yschuss1 yschuss
			mva #8 hposm0
			mva kollm1 kollges
			mva kollm12 kollges2
			#end
			
			#if .byte kollm2>#0 .or .byte kollm22>#0
			mva #8 hposm1
			mva kollm2 kollges
			mva kollm22 kollges2
			#end
			
			#if .byte kollm3>#0 .or .byte kollm32>#0
			mva #8 hposm2
			mva kollm3 kollges
			mva kollm32 kollges2
			#end
			
			#if .byte kollm4>#0 .or .byte kollm42>#0
			mva #8 hposm3
			mva kollm4 kollges
			mva kollm42 kollges2
			#end

			mwa #vbinter $224
			
			pla
			tay
			pla
			tax
			pla
			jmp xitvbv			;vb-interrupt wird über xitvbv beendet!!
	
	.endp
Ich hoffe ich nerve oder langweile hier keinen mit meinem Projekt - allerdings, muss man ja auch nicht lesen ... ;-)


Mein Zwischenfazit bislang:

1. Ich lerne jeden Tag den Atari besser kennen und werde immer sicherer in Assembler.
2. Es gibt unglaublich viele Möglichkeiten und aber auch Tücken - mein Respekt gegenüber den Programmierern von damals ist deutlich gestiegen - toll, was die aus der Kiste rausgeholt haben!
3. Wir haben ganz klare Limitationen hinsichtlich Zeit und Größe des Programmes - es geht vieles aber nicht alles und man muss sein Projekt wirklich sehr gut planen.
4. Und genau das macht es aus... sich ständig neuen Herausforderungen ausgesetzt sehen, grübeln grübel grübeln und Lösungen finden und umsetzen. Und genau darum haben die meisten alten Programme auch so viel Charme - nämlich weil da so viel Arbeit, Hirnschmalz und Liebe drinsteckt....
5. Mein Projekt wird wohl noch einige Monate verschlingen, denn es soll gut und spielbar werden... und dann freue ich mich schon auf das nächste schöne Projekt, wo ich viele Dinge primär ganz anders plane....

Gruß
Peter

Benutzeravatar
DjayBee
Beiträge: 132
Registriert: 17.08.2021 04:02
Has thanked: 50 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von DjayBee »

Hi Peter,
deine Berichte sind spannend, auch wenn ich noch nie ein Spiel geschrieben habe.

Zu deinen permanenten Zeitproblemen im VBI folgende Idee, die aber evtl. auch vollkommen sinnlos ist:

Das Hauptprogramm ist nach meinem Verständnis üblicherweise eine Dauerschleife.
So ungefähr:

Code: Alles auswählen

main	jsr tue_dieses
	jsr tue_jenes
	jsr mach_was_tolles
	jmp main
Wenn du jetzt die Dinge, die nicht innerhalb des VBI, sondern nur je einmal pro VBI ablaufen sollen, in eine diese Unterroutinen legst und dort verifizierst, dass sie nur einmal je VBI ausgeführt wird, solltest du eine ganze Menge Zeit zur Verfügung haben.

Code: Alles auswählen

tue_jenes
	lda RTCLOK+2	; wird im Stage 1 VBI automatisch inkrementiert
	cmp letztes_mal
	bne mach_weiter
	rts
mach_weiter
	sta letztes_mal
; Mach all die tollen Dinge, für die im VBI keine Zeit ist
	rts
	
letztes_mal
	.byte	$00

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

Re: Return to Phobos

Beitrag von wosch »

Hi.
Ich finde es auch interessant wie das Spiel entsteht. Und stark ist auch das Peter es gleich in Assembler angeht. Aber learning by doing, wie man so schön sagt. Durchhaltevermögen ist ja scheinbar da.

Ich habe heute von Cas ein paar Zong-Hefte bekommen und durchgeblättert. Da sind immer Berichte/Kurs zu Assembler drin. Interessant könnte die Ausgabe 3-4/94 sein. Da geht es um Scrolling in Assembler. Am Ende wird ein Beispiel vorgestellt in dem in einer Landschaft rumgescrollt wird. Zwar rechts/links, aber besser wie nix :mrgreen: . In der nächsten Ausgabe sollte das weiter entwickelt werden, aber die habe ich nicht. Gibt es aber bestimmt irgendwo online. Disketten gab es auch dazu. In einer Ausgabe war auch eine PM-Routine drin, aber nur auf Diskette.

Kannst ja mal nachlesen. Vielleicht hilft ja das eine oder andere was.

Gruß
Wolfgang

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

Re: Return to Phobos

Beitrag von Prodehl »

... Ihr Lieben,
vielen Dank für die Rückmeldungen und vielen Ideen. Das tut gut und spornt an... und alle Ideen und Tips sind mehr als willkommen.
Zong Hefte .... ich suche mal!
Schönen Abend allen!
Gruß
Peter

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

Re: Return to Phobos

Beitrag von Prodehl »

Was macht mein kleines Projekt?
In den letzten Wochen hatte ich sehr viel an verschiedenen Dingen programmiert und experimentiert... und mich ein wenig verrannt. Ich bin dann mal einen Schritt zurückgegangen und habe eine etwas ältere aber stabil funktionierende Version genommen und da weitergearbeitet.
Ich kann jetzt nicht das ganze Programm komplett ändern, möchte es aber fertigstellen und es funktioniert dann nach den ursprünglichen Kriterien.
Ich habe nicht 4 sondern nur 2 Schüsse und die laufen abwechselnd und nicht zugleich. Das war das ursprüngliche Konzept und dabei bleibt es jetzt.
Der VBI ist etwas schlanker geworden, aber noch recht voll. Da passt nicht mehr viel rein, braucht es aber auch nicht.
Die Schüsse funktionieren jetzt und auch die leidliche Kollision funktioniert zu 98% ohne Fehler. Es gibt jetzt einen ständigen Hintergrundsound, die Explosion der Items funktioniert stabil und mit Sound und die Schüsse laufen jetzt auch mit Sound.
Am Sound werde ich später noch arbeiten und vielleicht implementiere ich noch die xSFX Engine ins Programm. Die jetzige Engine ist brutal einfach und mini... geht aber zunächst.

Bevor ich dann mit der Landschaftsgestaltung weitermache und dann noch die nächsten Features reinbringe, will ich nochmal die Explosion angehen. Das gefällt mir noch nicht, da eine Explosion immer zu einem kleinen Programmstop führt.
Meine Idee dafür sieht folgendermaßen aus:
Im Moment printet das Programm hintereinander mit kleiner Warteschleife die 4 Explosionsphasen über das Item bis es weg ist... Phase 4 ist alles 0 also weg.
Die Lösung soll so sein: Die Explosion wird erkannt, das Item wird mit dem ersten Explosionscharakterset überschrieben, dann wird der erste Explosionscharakterset während das Programm weiterläuft mit den 3 weiteren Phasen überschrieben und so läuft die Explosion weiter während das ganze Programm weiterläuft.
Theorie glasklar, Umsetzung nicht ganz einfach, da auch das ganze Timing stimmen muss.....
Zum Glück habe ich seit einer Woche Freund Omikron in den Knochen und bin entsprechend zuhause und finde etwas Zeit das zu programmieren....

Gruß
Peter

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

Re: Return to Phobos

Beitrag von Prodehl »

der Code im Hauptprogramm:

Code: Alles auswählen

		org $2000

			icl '../hardware.txt'
			icl 'header.txt'
			icl 'character.asm'
			icl 'lands.asm'	
			icl 'pmg_vars.asm'
			icl 'VBI.asm'
			
			.proc main
			
main1		mwa #dlist 560  
			mva #151 fuelzaehleritem
			mva #0 fuelzaehler
			mva #10 store1
			mva #170 store3
			mva #16 sound12
			jsr text
						
Start1		
			jsr variablensetzen			
			jsr pmvorbereiten
			ldy #0
			ldx #0
			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
			
			;jsr kollplayer
			
			jsr soundschuss
			jsr blinken
			jsr letztereihe 		;letzte Reihe (lands) Bildschirm1 printen (sichtbar)	
			jsr feinscroll 			;Feinscroll Bildschirm1 ausführen (sichtbar)		
			jsr grobscroll			;Bildschirm1 kopieren + grobscroll
			jsr umschalten
			jsr incfuelzaehler
			jsr kollmissile
			
			;Ende der Bildschirmausführung / Kontrolle Durchläufe
			sec
			lda #45 	; - 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 ----------------------------------

	.proc kollplayer
			
			clc
			lda kollp0
			cmp #1
			bcc @+
			mva #0 kollp0
@			rts
	.endp	
	.proc kollision
			ldx #0
			clc
@			inx
			cpx #255
			bcc @-
			rts
	.endp	
	.proc 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
	.endp	
	.proc wartes
			clc
 		   	ldx delay ; Warteschleife
st  		lda RTCLOK+2    
wa   		cmp RTCLOK+2    
        	beq wa    
        	dex            
        	bpl st 
        	rts
        .endp        
    .proc warte2
    		
 			clc
@			dec delay1
 			lda delay1
 			cmp #1
 			bne @-
  
  
    		rts

    	.endp       	
	.proc feinscroll
			ldy #1
			mva #0 delay
			mva #255 delay1
@			jsr wartes
			sty vscrol
			iny
			cpy #8
			bne @-	
			inc schussi
			
			#if .byte schussi=#1
			mwa #$7508 var2			;var1 auf 29960 ($7508) setzen
			mwa #$7b0C var1	
			#end
			#if .byte schussi=#2
			mwa #$7530 var1			;var1 auf 30000 ($7530) setzen
			mwa #$7AE4 var2			;var2 auf 31460 ($7AE4) setzen
			#end
				
			rts
        .endp	  
   	.proc schusslogik
   
   
   			#if .byte strig0=#0 
   			asl schussi
   			
			#end
			
			#if .byte schussi=#2
			lda xposp1 
			sta hposm0
			
			lda #0
			ldy yschuss1
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss1
			asl schussi
   			mva #1 schussi
   			
			#end
			
			#if .byte schussi=#8
			lda xposp1 
			adc #12
			sta hposm1
			lda #0
			ldy yschuss2
			sta (miss1),y
			lda yposp1
			adc #9
			sta yschuss2
			mva #1 schussi
			#end
   			rts
   
    	.endp
	.proc 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
			#if .byte schussi=#1
			mwa #$7530 var1			;var1 + var2 auf 30000 ($7530) setzen
			mwa #$7530 var2
			#end
			#if .byte schussi=#$2
			mwa #$7b0C var1			;var1 + var2 auf 31500 ($7B0C) setzen
			mwa #$7b0C var2
			mva #0 schussi
			#end
			
			rts
	.endp				
	.proc 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
			clc
			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
			tax				;Boarderanzahl 1 in x speichern
			jsr var6up
			lda (var6),y	;Boarderart 1 holen
			sta var7		;abspeichern in var7
@			iny
			sta (var1),y 	;Boarder1 printen
			dex
			bpl @-	
			jsr var6up
			lda (var6),y	;Boarderanzahl 2 holen
			tax
			jsr var6up
			lda (var6),y	;Boarderart 2 holen
			ldy var5
@			iny			 
			sta (var1),y 	;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
			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
			#if .byte var5=#99
			jmp *
			#end
			jsr var6up
			#if .byte var5=#50	;Öltank printen
			ldx #11
			clc
@			mva tankol,x pr1,x
			dex
			bpl @-
			#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
			
			#if .byte var5=#51	;Rakete printen
			ldx #11
			clc
@			mva rakete,x pr1,x
			dex
			bpl @-	
			#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			;Rakete printen
			#end
			
			#if .byte var5=#52	;Alien printen
			ldx #11
			clc
@			mva alien,x pr1,x
			dex
			bpl @-	
			#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			;Alien printen
			#end
			#if .byte var5=#53	;TNT printen
			ldx #11
			clc
@			mva tnt,x pr1,x
			dex
			bpl @-	
			#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			;TNT 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
	.endp				
	.proc 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 pr1
			sta (var2),y	;1
			
			lda pr2
			iny
			sta (var2),y	;2
			
			lda pr3
			iny
			sta (var2),y	;3
			clc
			lda var2
			adc #41
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			dey
			
			lda pr4
			sta (var2),y	;4
			dey
			
			lda pr5
			sta (var2),y	;5
			dey
			
			lda pr6
			sta (var2),y	;6
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			
			lda pr7
			sta (var2),y	;7
			
			lda pr8
			iny
			sta (var2),y	;8
			
			lda pr9
			iny
			sta (var2),y	;9 
			clc
			lda var2
			adc #40
			sta var2
			lda var2+1
			adc #0
			sta var2+1
			
			lda pr10
			sta (var2),y	;10
			dey
			
			lda pr11
			sta (var2),y	;11
			dey

			lda pr12
			sta (var2),y	;12
			tya
			rts
	.endp	
	.proc 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
			#if .byte kollges=#1
			sec
			lda var2
			sbc #80
			sta var2
			lda var2+1
			sbc #0
			sta var2+1
			#end
			#if .byte kollges=#8
			sec
			lda var2
			sbc #80
			sta var2
			lda var2+1
			sbc #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 #96 audf1
			mva #32 audc1
			mva #222 audf2
			mva #32 audc2
			inc audc1
			inc audc2
			ldx #11
			clc
@			mva expl1,x pr1,x
			dex
			bpl @-	
			jsr fuel.fuelex
			inc audc1
			inc audc2
			tay
			iny
expl22		
			mva tank1pos var2
			mva tank1pos+1 var2+1
			ldx #11
			clc
@			mva expl2,x pr1,x
			dex
			bpl @-	
			
			inc audc1
			mva #1 delay
			jsr wartes
			inc audc2
			inc audc1
			jsr fuel.fuelex
			
			tay
			iny
expl33		
			ldx #11
			clc
@			mva expl3,x pr1,x
			dex
			bpl @-	
			mva tank1pos var2
			mva tank1pos+1 var2+1
			inc audc2
			inc audc1
			mva #1 delay
			jsr wartes
			jsr fuel.fuelex
			inc audc1
			inc audc2
			tay
			iny
expl44		
			ldx #11
			clc
@			mva expl4,x pr1,x
			dex
			bpl @-	
			mva tank1pos var2
			mva tank1pos+1 var2+1
			inc audc1
			inc audc2
			mva #1 delay
			jsr wartes
			inc audc1
			inc audc2
			jsr fuel.fuelex
			tay
			iny
			
			rts
	.endp	
	.proc incfuelzaehler
	
			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
			mva #0 fuelzaehler				;Fuel zuende Neustart
			#end
			mva #0 audc1
			rts
	
	
	
	.endp
	.proc 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
	.endp	
	.proc pmvorbereiten
	
			; Player vorbereiten und initialisieren
			; Kollisionen:  4 = Grün   2 = Gelb
			
			mva #10 yposp1
			mva #120 xposp1
			mva #42 yposm1
			mva #0 xposm1
			mva #94 yposm2
			mva #49 xposm2
			mva #0 tank1x
			mva #0 tank1y
			
			lda ramtop
			sec
			sbc #16
			sta pmbase
			clc
			adc #3
			sta miss1+1						
			sta miss2+1
			sta miss3+1
			sta miss4+1
			adc #1
			sta play1+1
			adc #2
			sta play3+1
			adc #1
			sta play4+1
			lda #9
			sta play4
			lda #3
			sta play3
			
			mva #62 sdmctl
			mva #56 pcolr0
			mva #15 pcolr1
			mva #119 pcolr2
			mva #191 pcolr3
			mva #1 gprior
			mva #3 gractl
			mva #1 sizep0
			mva #1 sizep1
			mva #1 sizep2
			mva #0 sizem
			mva #0 rechts
			mva #2 hitclr
			mva #48 blink
			mva #40 p1pf
			mva #8 hposm0
			mva #8 hposm1
			mva #8 hposm2
			mva #8 hposm3
			mva #1 yschuss1
			mva #11 yschuss2
			mva #22 yschuss3
			mva #33 yschuss4
			mva #0 schussi

			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
			sta (play3),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 @-
			
			rts
			
	.end	
	.proc blinken
	
	
			lda blink2
			adc #59
			sta blink2
			#if .byte blink2>=#0 .and .byte blink2<#60
			mva #0 blink
			ldx #1
			lda #0
			ldy #2
			mva #250 store1
			jsr sound1
			#end
			#if .byte blink2>=#60 .and .byte blink2<#128
			mva #14 blink
			ldx #1
			lda #0
			ldy #2
			mva #234 store1
			jsr sound1
			#end
			#if .byte blink2>=#128 .and .byte blink2<=#192
			mva #28 blink
			ldx #1
			lda #0
			ldy #2
			mva #218 store1
			jsr sound1
			#end
			#if .byte blink2>=#192 .and .byte blink2<=#255
			mva #42 blink
			ldx #1
			lda #0
			ldy #2
			mva #202 store1
			jsr sound1
			#end
			
	
			rts
	.endp
	.proc schuesse
			
			#if .byte yschuss1>#207 
			ldy yschuss1
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #8 hposm0
			mva #1 hitclr
			#end
			#if .byte yschuss2>#207
			ldy yschuss2
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #8 hposm1
			mva #1 hitclr
			#end
			#if .byte yschuss3>#207
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #8 hposm2
			mva #1 hitclr
			#end
			#if .byte yschuss4>#207 
			ldy yschuss4
			dey
			lda #0
			sta (miss1),y
			iny
			sta (miss1),y
			mva #1 hitclr
			mva #8 hposm3
			#end
			
			rts
	.endp			
	.proc kollmissile
	
			#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
			#if .byte kollges=#8
			jsr kollitem
			lda #0 
			sta kollges
			#end
			#if .byte kollges=#1
			jsr kollitem
			lda #0 
			sta kollges
			#end
			rts
			
	.endp
	.proc variablensetzen
	
			mva #>chr chbas ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 
			mva #12 color3	;Schriftfarbe	
			mva #220 color1	;Gelb
			mva #153 color0	;Blau
			;mva #52 color0	;Rot
			mva #180 color2	; Grün
			mva #0 color4 ;Hintergrundfarbe
			lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1 \ sta feuer6
			rts
	.end
	.proc dlist

		   	.by 112,112,112,100
			.by 30,75
:21			.by 36
:5			.by 4
			.by 65
			.wo dlist
	.endp
	.proc sound1
					;x Register - Stimme
					;Akkumulator - Distorsion
					;y Register - Volumen
					;Store2 - Frequenz
			pha
			txa
			asl
			tax
			lda store1
			sta audf1,x
			sty store1
			lda #0
			sta audctl
			lda #3
			sta skctl
			pla
			asl 
			asl 
			asl 
			asl 
			clc
			adc store1
			sta audc1,x
			
			rts
			
	.endp
	.proc sound2
					;x Register - Stimme
					;Akkumulator - Distorsion
					;y Register - Volumen
					;Store2 - Frequenz
			pha
			txa
			asl
			tax
			lda store3
			sta audf2,x
			sty store2
			lda #0
			sta audctl
			lda #3
			sta skctl
			pla
			asl 
			asl 
			asl 
			asl 
			clc
			adc store2
			sta audc2,x
			
			rts
			
	.endp
	.proc soundschuss
			#if .byte sound12<#16 .and .byte sound12>#0
			ldx #2
			lda #1
			ldy sound12
			mva #2 store2
			dec sound12
			dec sound12
			
			jsr sound2
			clc
			lda store3
			adc #10
			sta store3
			#end
			
			#if .byte sound12>=#15
			mva #0 audc2
			mva #0 audf2
			
			ldx #0
			lda #0
			ldy #0
			mva #170 store3
			mva #0 store2
			jsr sound2
			mva #16 sound12
			mva #170 store3
			#end
			rts
	.end

			run main

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

Re: Return to Phobos

Beitrag von Prodehl »

rtp2.1.MOV
(2.72 MiB) 28-mal heruntergeladen
leider knackt mein Joystick so laut ;-)

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

endlich klappt die Explosion...

Beitrag von Prodehl »

... heute habe ich es endlich hinbekommen!!

Die Explosion läuft animiert sauber durch während das Programm weiterscrollt... daran arbeite ich jetzt tatsächlich seit Wochen.
Eine Idee war ja, daß die Explosion ständig im VBI animiert läuft und man beim Auslösen der Explosion einfach die ständig animierten Charakter auf das Item printet. So kann man letztlich. auch alles animieren wenn es die Zeit zuläßt. Ds habe ich prinzipiell umgesetzt, das Problem dabei ist natürlich, dass die Explosion nie vorbei ist und das explodierende Item quasi explodierend aus dem Bildschirm läuft... fand ich nicht so die beste Lösung.
Darum habe ich ja alle 4 Explosionsphasen hintereinander laufen lassen mit kleiner Warteschleife, was dann ganz gut aussieht, was aber immer einen kleinen Ruckler erzeugt... auch blöd.

Gestern habe ich mir nochmal Caverns of Mars 1, 2 und Phobos angeschaut.. und tatsächlich war natürlich Caverns of Mars 1 noch relativ einfach gebaut... man sieht den enormen Fortschritt von CoM 2 und dann zu Phobos...
Und hallo... in CoM 1 hat der Programmierer wohl ähnliche Probleme gehabt mit der Explosion, denn er macht es genauso und animiert sie ständig bis sie nach oben rausläuft... bei Phobos hat er es gelöst... dort läuft die Explosion sauber aber relativ langsam...

Mein Lösung nun:
Mein Hauptprogramm habe ich mittlerweile relativ übersichtlich, da laufen ständig ein paar Subroutinenaufrufe .. also der Aufbau der letzten Reihe, Fein- und Grobscroll, Umschalten der Bidlschirme und Sound / Blinken. / Kollision. Der VBI läuft ja eh durch.
Wenn nun eine Kollision stattfindet, dann ruft das Programm die entsprechende Subroutine auf, hier wird die genaue Position für die Explosion berechnet und korrigiert und dann laufen die 4 Phasen der Explosion hintereinander ab. Zwischen den einzelnen Phasen rufe ich nun einfach die Subroutinen für Feinscroll / Grobscroll / Umschalten und letzte Reihe jeweils auf (also das ganze Hauptprogramm) und das jedes Mal vor den einzelnen Explosionsphasen... zwischendurch muss ich nur noch die y-Position um 40 Einheiten korrigieren (weil er ja um eine Zeile scrollt) und das war es (fast).
Das muss ich insgesamt 8 x machen, daher läuft die Explosion recht langsam durch, aber es funktioniert...

Was für ein tricky-Aufwand für diesen scheinbar simplen Effekt.......
Morgen lade ich das mal als mov-Datei hoch!
LG und gute Nacht
Peter

P.s. Es gibt noch viel zu tun, aber so langsam muss ich mir Gedanken für mein nächstes Projekt machen... Ideen für ein schönes Spiel welcome!!

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

Re: Return to Phobos

Beitrag von Prodehl »

rtp2.2.MOV
(5.97 MiB) 29-mal heruntergeladen

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

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Schön zu sehen, dass Du Deine Probleme lösen kannst.
Ich habe bei meiner Programmierung nun auch zum 3. Mal restrukturiert. Dafür lernt man aber immer mehr über den ATARI und durch den Lernfortschritt wird das Programm auch kürzer und somit optimierter.
Wie im Interrupt-Thread vorgeschlagen, lasse ich in meiner Hauptschleife den Hintergrund am Anfang weiß setzten und zum Schluß wieder schwarz. Die Schleife wird immer direkt hinter einem VBI gestartet. Solange ich kein weiß auf dem Bildschirm sehe, ist die Hauptroutine schnell genug :-)
Da es bei mir kein Scrolling gibt, habe ich da natürlich einen Vorteil.

Grüße
Janko

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

Re: Return to Phobos

Beitrag von Prodehl »

Das mit der Schleife ist gut… werde ich beim nächsten Projekt auch so machen… was programmierst du eigentlich, Janko?

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

Re: Return to Phobos

Beitrag von Kveldulfur »

Ich, ja... naja ist nur so ein Spiel wo Du eine Figur steuerst und Münzen einsammeln musst. Auf Zeichensatzgrafik basierend ohne Feinscrolling und so..

Aber ich habe z.B. einen horizontalen und vertikalen Textscroller im Menü, um diese Techniken zu testen.
Dabei nutze ich die empfohlen Displaylist-Methode, wo ich die Displaylist nach 7 Schritte des Feinscrollings manipuliere und so keinen Speicher umkopieren muss.
Funktioniert echt Sahne :-)

Mein Wunsch ist es am Software-Wettbewerb teilzunehmen, auch wenn es nur der letzte Platz werden wird :oops:
Deshalb veröffentliche ich auch nichts von meinem Spiel, weil dies leider untersagt ist.
Ist aber auch noch viel zu programmieren. Mal sehen, ob ich es überhaupt fertig bekomme.

Grüße
Janko

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

Re: Return to Phobos

Beitrag von Prodehl »

Also ich würde wohl auch am Software-Wettbewerb teilnehmen, mein Spiel ist ja nicht fertig und "veröffentlicht", insofern sollte das kein Problem sein. Auch stammt der Code komplett von mir, wie man gut nachvollziehen kann... sollte die Kommision dennoch damit "Probleme" haben, dann wäre es auch kein Drama!

Ich werde mal bei Zeiten Sascha fragen, wie die das sehen... spätestens auf der NOMAM werde ich sie ja sehen.
Ansonsten wäre ich wirklich sehr sehr interessiert an dem Scrollcode mit der D-List von dir, denn das will ich auf jeden Fall beim nächsten Mal umsetzen und müsste das Rad nicht komplett neu herleiten... ;-)

Mein Scrollen verbrät halt richtig CPU Power ... das merkt man dann durchasu :D

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

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Ich habe einmal die von mir genutzte Routine separiert und als eigenes Programm hier eingefügt.
Die Systemkonstanten müssen jedoch im selben Pfad liegen und inkludiert werden.

Code: Alles auswählen

		icl 'Systemkonstanten.asm'
		
; ########################################################################################################
; ### Speicherbereiche und Variabeln definieren

; Bildschirmspeicher ab $3000
		org $3000

ScrMem01	.byte "                                        "
ScrMem02	.byte "                                        "
ScrMem03	.byte "                                        "
ScrMem04	.byte "                                        "
ScrMem05	.byte "                                        "
ScrMem06	.byte "                                        "
ScrMem07	.byte "                                        "
ScrMem08	.byte "                                        "
ScrMem09	.byte "                                        "
ScrMem10	.byte "                                        "
ScrMem11	.byte "                                        "
ScrMem12	.byte "                                        "
ScrMem13	.byte "                                        "
ScrMem14	.byte "                                        "
ScrMem15	.byte "                                        "
ScrMem16	.byte "                                        "
ScrMem17	.byte "                                        "
ScrMem18	.byte "                                        "						
ScrMem19	.byte "                                        "						
ScrMem20	.byte "                                        "						
ScrMem21	.byte "                                        "						
ScrMem22	.byte "                                        "						
ScrMem23	.byte "                                        "						
ScrMem24	.byte "                                        "

; # Displaylist ab $3400 definieren

		org $3400

DPList		.byte $70,$70,$70  			; 24 leere Scanzeilen (der normale obere Block)   
		.byte $42,<ScrMem01,>ScrMem01		; Die oberen 2 Zeilen werden nicht gescrollt					  
		.byte $42,<ScrMem02,>ScrMem02						  
VScrollStart	.byte $62,<ScrMem03,>ScrMem03						  
		.byte $62,<ScrMem04,>ScrMem04						  
		.byte $62,<ScrMem05,>ScrMem05						  
		.byte $62,<ScrMem06,>ScrMem06						  
		.byte $62,<ScrMem07,>ScrMem07						  
		.byte $62,<ScrMem08,>ScrMem08						  
		.byte $62,<ScrMem09,>ScrMem09						  
		.byte $62,<ScrMem10,>ScrMem10						  
		.byte $62,<ScrMem11,>ScrMem11						  
		.byte $62,<ScrMem12,>ScrMem12						  
		.byte $62,<ScrMem13,>ScrMem13						  
		.byte $62,<ScrMem14,>ScrMem14						  
		.byte $62,<ScrMem15,>ScrMem15						  
		.byte $62,<ScrMem16,>ScrMem16						  
		.byte $62,<ScrMem17,>ScrMem17						  
		.byte $62,<ScrMem18,>ScrMem18						  
		.byte $62,<ScrMem19,>ScrMem19						  
		.byte $62,<ScrMem20,>ScrMem20						  
		.byte $62,<ScrMem21,>ScrMem21						  
		.byte $42,<ScrMem22,>ScrMem22						  
		.byte $42,<ScrMem23,>ScrMem23		; Die unteren 2 Zeilen werden ebenfalls						  
		.byte $42,<ScrMem24,>ScrMem24		; nicht gescrollt				  
		.byte $41,<DPList,>DPList 		; JVB, und die Displaylist wieder starten

; # Scrollschema, um weniger berechnen zu müssen

DPScroll	.word ScrMem03, ScrMem04, ScrMem05, ScrMem06, ScrMem07 
		.word ScrMem08, ScrMem09, ScrMem10, ScrMem11, ScrMem12
		.word ScrMem13, ScrMem14, ScrMem15, ScrMem16, ScrMem17
		.word ScrMem18, ScrMem19, ScrMem20, ScrMem21, ScrMem22
		.word ScrMem03, ScrMem04, ScrMem05, ScrMem06, ScrMem07 
		.word ScrMem08, ScrMem09, ScrMem10, ScrMem11, ScrMem12
		.word ScrMem13, ScrMem14, ScrMem15, ScrMem16, ScrMem17
		.word ScrMem18, ScrMem19, ScrMem20, ScrMem21
		
VScrollFine	.byte $00				; Finescrolling hier festhalten						
VScrollPos	.byte $02				; Position des Zeigers für DPScroll
VScrollNext 	.byte $00				; Temporäre-Variable

StoryPos	.word Story				; Zeiger innerhalb des Textes	
		
		;  $FE  = Zeilenende oder 40 Zeichen ausgeben
		;  $FF  = Text von vorne ausgeben

		;      0123456789012345678901234567890123456789
Story		.byte "Hier kommt die Textausgabe:",$FE
		.byte $FE
		.byte "Eine volle 40er Zeile benoetigt kein $FE"
		.byte "am Ende",$FE
		.byte $FE,$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "         #             #",$FE
		.byte "         #             #",$FE
		.byte "          #             #",$FE
		.byte "           #             #",$FE
		.byte "            #             #",$FE
		.byte "            #             #",$FE
		.byte "            #             #",$FE
		.byte "           #             #",$FE
		.byte "          #             #",$FE
		.byte "         #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "       #             #",$FE
		.byte "      #             #",$FE
		.byte "       #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "       #             #",$FE
		.byte "       #             #",$FE
		.byte "      #             #",$FE
		.byte "       #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte $FE,$FE,$FE,$FE,$FE,$FF

		
; ############################################################################
; # VSync
; # 
		.proc WaitVSync
		
		lda RTCLOK+2
Loop	   	cmp RTCLOK+2  
        	beq Loop
		
		rts
		
		.end
		
; ########################################################################################################
; ### VBI - Routine zum Scrollen

		.proc VBI

		jsr VScroller

		jmp XITVBV
		
; ### Unterroutinen im VBI
		
VScroller	; ######## Vertikaler Freinscroller im mittleren Titelbereich ########
		inc VScrollFine
		lda VScrollFine
		cmp #$08
		beq @+				; Wenn Feinscolling bei 8 dann Grobscrolling

		sta VSCROL		
		rts

@		; ######## Vertikales Grobscrolling durch Displaylist-Manipulation
		lda #$00			; Feinscrolling auf 0 setzen
		sta VScrollFine
		sta VSCROL

		ldx VScrollPos			; 20 Zeilen werden gescrollt 
		cpx #$28			; Danach wieder auf 0 setzen
		bcc @+
		ldx #$00
		stx VScrollPos
		
@		txa				; Damit X und Y nicht von 0 zählen
		clc				; müssen, wird er Endwert für X
		adc #$28			; berechnet. Nun kann man direkt
		sta VScrollNext			; hiermit vergleichen
		
		ldy #$00			; Y auf Null setzen, jedoch zählt 
						; Y immer drei Schritte hoch
@		iny				; pro Durchgang (Befehl, LOMEM, HIMEM)
		lda DPScroll,x			; LO-Wert holen
		sta VScrollStart,y		; und in der Displaylist setzen
		inx
		iny
		lda DPScroll,x			; HI-Wert holen
		sta VScrollStart,y		; und in der Displaylist setzen
		iny
		inx
		
		cpx VScrollNext			; Alle Zeilen abgearbeitet?
		bcc @-
		
		; -- Ab hier kommt die Textausgabe 
		; -- Die natürlich vereinfacht werden kann
		; -- Wichtig ist, dass der Text ab der Adresse
		; -- Ausgabe1 bzw. Ausgabe2 augegeben wird
		
		dex				; Zurück zur letzten Zeile
		dex
		lda DPScroll,x			; LO und HI müssen für die
		sta Ausgabe1+1			; Ausgabe der letzten Zeile
		sta Ausgabe2+1			; zwei Mal im Programmcode
		inx				; übertragen werden
		lda DPScroll,x			; Page 0 ist dann nicht
		sta Ausgabe1+2			; notwendig
		sta Ausgabe2+2
		
		inc VScrollPos			; Die Position fürs nächste scrollen 						
		inc VScrollPos			; setzen

ZeileAusgeben	lda StoryPos			; Nun den Zeiger innerhalb des
		sta Textzeile+1			; Textes setzen
		lda StoryPos+1			; und wieder ohne Page 0 direkt
		sta Textzeile+2			; im Programmcode speichern
		
		ldx #$00
Textzeile	lda $ffff,x			; Die Adresse zur Ausgabe wird manipuliert		
		cmp #$FE			; $FE signalisiert, dass die restlichen Zeichen
		beq Zeilenende			;     Leerzeichen sein sollen.
		cmp #$FF			; $FF signalisiert, dass der Text von vorne
		beq Textende			;     ausgegeben werden soll.
Ausgabe1	sta $ffff,x
		inx
		cpx #$28			; max. 40 Zeichen ausgeben
		bcc Textzeile			
		stx TextNext+1			; X-Zähler merken
		
Weiter		clc
		lda StoryPos	
TextNext	adc #$ff			; Die X gemachten Schritte werden nun auf den
		sta StoryPos			; Gesamtzeiger addiert
		lda StoryPos+1
		adc #$00
		sta StoryPos+1

		rts				; Fertig mit dem Grobscrolling und der Zeilenausgabe
		
Zeilenende	inx				; Rest Leerzeichen ausgeben
		stx TextNext+1			; X+1 abspeichern
		dex				; Nun X wieder einen zurück, um die Ausgabe richtig
						; zu starten
		lda #" "			; restlichen Leerzeichen ausgeben
Ausgabe2	sta $ffff,x			
		inx
		cpx #$28			; bis max. 40 Stück
		bcc Ausgabe2
		
		jmp Weiter

Textende	lda #<Story			; Text soll von vorne ausgegeben werden	
		sta StoryPos			; Hierfür den Zeiger wieder auf den 
		lda #>Story			; Anfang des Textes setzen
		sta StoryPos+1
		
		jmp ZeileAusgeben
		
		.end
		

; ########################################################################################################
; ### Hauptprogramm

		.proc main

		lda #<DPList			; Displaylist laden
	        sta SDLSTL
		lda #>DPList
		sta SDLSTL+1
		
		jsr WaitVSync

		ldy #<VBI			; VBI für einrichten
		ldx #>VBI
		lda #7 			
		jsr SETVBV 
		
		jsr WaitVSync
		
Loop		jmp Loop
		
		.end

; ########################################################################################################
		run main
Ich hoffe, dass der Quellcode nachvollziehbar ist. Sicherlich kann man hier noch optimieren.

Grüße
Janko

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

Re: Return to Phobos

Beitrag von Prodehl »

... habs gleich mal ausprobiert... sehr geil!! Läuft echt flüssig!
Ich schau mir den Code noch ganz genau an, vielleicht kann ich das etwas umbauen und bei mir noch nutzen....
Vielen Dankfür den schönen Code!!
LG Peter

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

Re: Return to Phobos

Beitrag von Prodehl »

... nochmal zum Grobscrollcode:

Der Graphikbildschirm hat im Textmodus 24 Zeilen a 40. Jede Zeile in der Displaylist bekommt also eine 2 eingeschrieben (die ersten 24 Scanlines bleiben leer).
Die erste Zeile hat dabei nicht den Wert 2 sondern 66 (64+2) - wobei die 64 einen Adressbefehl darstellt - nämlich den des Bildschirmanfanges. Es folgen dann die 23 nächsten Zeilen mit dem Wert 2 und danach kommt noch der Sprungbefehl mit Adresse des Displaylistanfanges.

Nun möchten wir folgendes machen: In jede Zeile schreibe ich statt einer 2 eine 66 (alles dezimal) rein mit der jeweiligen um eine Zeile höheren Adresse für den Bildschirm:
66 64 156 (40000)
66 104 156 (40040)
66 144 156 (40080)
66 184 156
66 224 156
.......... usw
am Ende wieder der Sprungbefehl für den Start der Displaylist.

Als nächstes (mein Grobscroll) kopiere ich einfach die Displaylist um - verschiebe also alle Zeilen um eins nach oben:
66 104 156
66 144 156
66 184 156
66 224 156
66 08 157
.....
66 64 156
Sprungbefehl Displaylistanfang

die letzte Zeile vor dem Sprungbefehl müsste dann wohl immer die vorherige erste sein.
Damit bekomme ich ein fortlaufendes Grobscroll des gesamten Bildschirmes.
Will ich jetzt einen Shooter damit machen, überschreibe ich einfach die komplette erste Zeile der Displaylist mit den neuen Landschaftsdaten (meine "letzte Reihe") - anschließend wird die erste Reihe durch Umsortierung der Displaylist letzte Reihe.
Theoretisch könnte ich auch ganz einfach 24 verschiedene Displaylist mit entsprechend versetzten Zeilen vorbereiten und dann einfach nur jeweils von Displaylist 1 zu 2 zu 3 zu .... zu 24 umschalten.
Die Displaylist wird dann noch so aufgebaut, daß der entsprechende Graphicmodus plus Feinscroll mit drin ist, der Grobscroll wird entsprechend immer einmal nach 7 Feinscrollaktionen durchgeführt.

So habe ich die Theorie verstanden.... das möchte ich demnächst mal umsetzen.
Habe ich das korrekt verstanden??
Liebe Grüße
Peter

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

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo Peter!

Deine Idee direkt umzukopieren, also ohne eine Tabelle, macht die Routine noch etwas smarter.

Hier ein Update:

Code: Alles auswählen

		icl 'Systemkonstanten.asm'
		
; ########################################################################################################
; ### Speicherbereiche und Variabeln definieren

; Bildschirmspeicher ab $3000
		org $3000

ScrMem01	.byte "                                        "
ScrMem02	.byte "                                        "
ScrMem03	.byte "                                        "
ScrMem04	.byte "                                        "
ScrMem05	.byte "                                        "
ScrMem06	.byte "                                        "
ScrMem07	.byte "                                        "
ScrMem08	.byte "                                        "
ScrMem09	.byte "                                        "
ScrMem10	.byte "                                        "
ScrMem11	.byte "                                        "
ScrMem12	.byte "                                        "
ScrMem13	.byte "                                        "
ScrMem14	.byte "                                        "
ScrMem15	.byte "                                        "
ScrMem16	.byte "                                        "
ScrMem17	.byte "                                        "
ScrMem18	.byte "                                        "						
ScrMem19	.byte "                                        "						
ScrMem20	.byte "                                        "						
ScrMem21	.byte "                                        "						
ScrMem22	.byte "                                        "						
ScrMem23	.byte "                                        "						
ScrMem24	.byte "                                        "

; # Displaylist ab $3400 definieren

		org $3400

DPList		.byte $70,$70,$70  			; 24 leere Scanzeilen (der normale obere Block)   
		.byte $42,<ScrMem01,>ScrMem01		; Die oberen 2 Zeilen werden nicht gescrollt					  
		.byte $42,<ScrMem02,>ScrMem02						  
VScrollStart	.byte $62,<ScrMem03,>ScrMem03						  
		.byte $62,<ScrMem04,>ScrMem04						  
		.byte $62,<ScrMem05,>ScrMem05						  
		.byte $62,<ScrMem06,>ScrMem06						  
		.byte $62,<ScrMem07,>ScrMem07						  
		.byte $62,<ScrMem08,>ScrMem08						  
		.byte $62,<ScrMem09,>ScrMem09						  
		.byte $62,<ScrMem10,>ScrMem10						  
		.byte $62,<ScrMem11,>ScrMem11						  
		.byte $62,<ScrMem12,>ScrMem12						  
		.byte $62,<ScrMem13,>ScrMem13						  
		.byte $62,<ScrMem14,>ScrMem14						  
		.byte $62,<ScrMem15,>ScrMem15						  
		.byte $62,<ScrMem16,>ScrMem16						  
		.byte $62,<ScrMem17,>ScrMem17						  
		.byte $62,<ScrMem18,>ScrMem18						  
		.byte $62,<ScrMem19,>ScrMem19						  
		.byte $62,<ScrMem20,>ScrMem20						  
		.byte $62,<ScrMem21,>ScrMem21						  
		.byte $42,<ScrMem22,>ScrMem22						  
		.byte $42,<ScrMem23,>ScrMem23		; Die unteren 2 Zeilen werden ebenfalls						  
		.byte $42,<ScrMem24,>ScrMem24		; nicht gescrollt				  
		.byte $41,<DPList,>DPList 		; JVB, und die Displaylist wieder starten

; # Scrollschema, um weniger berechnen zu müssen

VScrollFine	.byte $00				; Finescrolling hier festhalten						
VScrollLast 	.byte 57				; Anzahl wieviele Schritte X gehen muss = (20*3)-3

StoryPos	.word Story				; Zeiger innerhalb des Textes	
		
		;  $FE  = Zeilenende oder 40 Zeichen ausgeben
		;  $FF  = Text von vorne ausgeben

		;      0123456789012345678901234567890123456789
Story		.byte "Hier kommt die Textausgabe:",$FE
		.byte $FE
		.byte "Eine volle 40er Zeile benoetigt kein $FE"
		.byte "am Ende",$FE
		.byte $FE,$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "         #             #",$FE
		.byte "         #             #",$FE
		.byte "          #             #",$FE
		.byte "           #             #",$FE
		.byte "            #             #",$FE
		.byte "            #             #",$FE
		.byte "            #             #",$FE
		.byte "           #             #",$FE
		.byte "          #             #",$FE
		.byte "         #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "       #             #",$FE
		.byte "      #             #",$FE
		.byte "       #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte "       #             #",$FE
		.byte "       #             #",$FE
		.byte "      #             #",$FE
		.byte "       #             #",$FE
		.byte "        #             #",$FE
		.byte "        #             #",$FE
		.byte $FE,$FE,$FE,$FE,$FE,$FF

		
; ############################################################################
; # VSync
; # 
		.proc WaitVSync
		
		lda RTCLOK+2
Loop	   	cmp RTCLOK+2  
        	beq Loop
		
		rts
		
		.end
		
; ########################################################################################################
; ### VBI - Routine zum Scrollen

		.proc VBI

		jsr VScroller

		jmp XITVBV
		
; ### Unterroutinen im VBI
		
VScroller	; ######## Vertikaler Freinscroller im mittleren Titelbereich ########
		inc VScrollFine
		lda VScrollFine
		cmp #$08
		beq @+				; Wenn Feinscolling bei 8 dann Grobscrolling

		sta VSCROL		
		rts

@		; ######## Vertikales Grobscrolling durch Displaylist-Manipulation
lda #$00			; Feinscrolling auf 0 setzen
		sta VScrollFine
		sta VSCROL

		lda VScrollStart+1		; Die Zeile die oben verschwindet 
		sta Ausgabe1+1			; und unten mit neuen Text erscheint
		sta Ausgabe2+1			; muss zwischen gespeichert werden

		lda VScrollStart+2		; Hier noch das Hi-Byte
		sta Ausgabe1+2		
		sta Ausgabe2+2			
		
		ldx #$00			; Nun alle Zeilen umkopieren
@		lda VScrollStart+4,x		; aber nur die Angabe der 
		sta VScrollStart+1,x		; Speicheradresse
		lda VScrollStart+5,x	
		sta VScrollStart+2,x
		inx				; 3 Schritte weiter
		inx
		inx
		cpx VScrollLast			; Alle Zeilen abgearbeitet?
		bcc @-
		
		lda Ausgabe1+1			; Nun die gemerkte 1. Zeile
		sta VScrollStart+1,x		; unten noch anfügen
		lda Ausgabe1+2
		sta VScrollStart+2,x		
		
		; -- Ab hier kommt die Textausgabe 
		; -- Die natürlich vereinfacht werden kann
		; -- Wichtig ist, dass der Text ab der Adresse
		; -- Ausgabe1 bzw. Ausgabe2 augegeben wird
		
ZeileAusgeben	lda StoryPos			; Nun den Zeiger innerhalb des
		sta Textzeile+1			; Textes setzen
		lda StoryPos+1			; und wieder ohne Page 0 direkt
		sta Textzeile+2			; im Programmcode speichern
		
		ldx #$00
Textzeile	lda $ffff,x			; Die Adresse zur Ausgabe wird manipuliert		
		cmp #$FE			; $FE signalisiert, dass die restlichen Zeichen
		beq Zeilenende			;     Leerzeichen sein sollen.
		cmp #$FF			; $FF signalisiert, dass der Text von vorne
		beq Textende			;     ausgegeben werden soll.
Ausgabe1	sta $ffff,x
		inx
		cpx #$28			; max. 40 Zeichen ausgeben
		bcc Textzeile			
		stx TextNext+1			; X-Zähler merken
		
Weiter		clc
		lda StoryPos	
TextNext	adc #$ff			; Die X gemachten Schritte werden nun auf den
		sta StoryPos			; Gesamtzeiger addiert
		lda StoryPos+1
		adc #$00
		sta StoryPos+1

		rts				; Fertig mit dem Grobscrolling und der Zeilenausgabe
		
Zeilenende	inx				; Rest Leerzeichen ausgeben
		stx TextNext+1			; X+1 abspeichern
		dex				; Nun X wieder einen zurück, um die Ausgabe richtig
						; zu starten
		lda #" "			; restlichen Leerzeichen ausgeben
Ausgabe2	sta $ffff,x			
		inx
		cpx #$28			; bis max. 40 Stück
		bcc Ausgabe2
		
		jmp Weiter

Textende	lda #<Story			; Text soll von vorne ausgegeben werden	
		sta StoryPos			; Hierfür den Zeiger wieder auf den 
		lda #>Story			; Anfang des Textes setzen
		sta StoryPos+1
		
		jmp ZeileAusgeben
		
		.end
		

; ########################################################################################################
; ### Hauptprogramm

		.proc main

		lda #<DPList			; Displaylist laden
	        sta SDLSTL
		lda #>DPList
		sta SDLSTL+1
		
		jsr WaitVSync

		ldy #<VBI			; VBI für die Musik einrichten
		ldx #>VBI
		lda #7 			
		jsr SETVBV 
		
		jsr WaitVSync
		
Loop		jmp Loop
		
		.end

; ########################################################################################################
Grüße
Janko

Benutzeravatar
DjayBee
Beiträge: 132
Registriert: 17.08.2021 04:02
Has thanked: 50 times
Been thanked: 21 times
Kontaktdaten:

Re: Return to Phobos

Beitrag von DjayBee »

Prodehl hat geschrieben:
25.02.2022 13:56
So habe ich die Theorie verstanden.... das möchte ich demnächst mal umsetzen.
Habe ich das korrekt verstanden??
So hatte ich es in meinem Posting gemeint und so habe hinterher auch Lars verstanden (der im Gegensatz zu mir praktische Erfahrung darin hat).

Weiterhin viel Erfolg

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

Re: Return to Phobos

Beitrag von Prodehl »

Die letzten Tage habe ich die Schranken programmiert.
Eine Schranke war recht einfach zu machen und kostet mich auch nur einen zusätzlichen Charakter in der schon recht vollen Tabelle. Dieser Charakter wird dann im VBI mit 8 einfachen kurzen Befehlen ständig verändert und im Hauptprogramm wird das dann zusätzlich per Random gemischt und ein - / ausgeschaltet. Diese Schranke kann ich beliebig dick machen. Ich habe es als Sonderitem in den Aufbau der Landschaft integriert und kann die Schranke jetzt also irgendwo frei platzieren.
Die 2. Schranke ist auch fertig. Dies ist eine Laufschranke jeweils von rechts nach links und umgekehrt, sowie in Kombination ... das war jetzt zwar nicht schwerer zu programmieren, braucht aber etliche Programmschritte, weil ich es mit ROL und ROR mache, dabei 14 Charakter benötige und jedes Charakter ja 8 Bits hat. Der Rechner macht also bei dieser Schranke ständig 112 Befehlszyklen, was ich leider nicht mehr ohne Ruckeln so einfach in den VBI unterbekomme. Ich habe es also ins Hauptprogramm integriert und wenn alles läuft... also Schranke Scroll usw. ruckelt es ein wenig... das Problem habe ich noch nicht gelöst und werde es wohl so hinnehmen.
Man sieht auf jeden Fall, daß der Rechner mit dem Gesamtkonstrukt so langsam hinsichtlich der Kapazität an der Grenze ist... zumindest so wie ich es aufgebaut habe. Das Folgeprogramm werde ich anders konstruieren müssen...
Nun baue ich noch viel Landschaft und dann das Endlevel, dann müssen noch die Kollisionsabfragen für das Raumschiff geschaltet werden, Bonusschiffe für erreichten Score, die ganzen kleinen Fehler noch raus und fertig bin ich mit dem Projekt! Hier noch eine kleine Demo mit den beiden Schranken...
Liebe Grüße und ein schönes WE
Peter

rtp4.3..mov
(1.07 MiB) 16-mal heruntergeladen

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

Re: Return to Phobos

Beitrag von Prodehl »

... jetzt habe ich mal in meiner Feinscroll-Routine mit vcount "gespielt" und siehe da - wenn man das timing richtig setzt ist das unangenehme Ruckeln weg. Und plötzlich habe ich auch wieder Optionen im VBI. Ich kann jetzt die Laufschranke in den VBI integrieren und es läuft super flüssig! Und da geht noch viel mehr Code rein... cool!!

Das timing läuft natürlich anders auf 50 Hz (PAL) als auf 60 Hz ... ich frage das jetzt beim Programmstart durch das Register PAL ab und ändere entsprechend den Wert für das timing. Jetzt läuft das Programm flüssig bei 50 und 60 Hz!

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

Re: Return to Phobos

Beitrag von pps »

Prodehl hat geschrieben:
05.03.2022 00:29
Das timing läuft natürlich anders auf 50 Hz (PAL) als auf 60 Hz ... ich frage das jetzt beim Programmstart durch das Register PAL ab und ändere entsprechend den Wert für das timing. Jetzt läuft das Programm flüssig bei 50 und 60 Hz!
Wenn Du das Timing wirklich korrekt auch auf umgebauten Rechnern haben möchtest (PAL ANTIC im NTSC ATARI), solltest Du nicht über das PAL Register gehen. Man sollte dann in einer kleinen Routine zählen, wie viele VCOUNTs möglich sind. 60 Hz Maschinen schaffen weniger, als 50 Hz Maschinen. Mindestens bis 155 sollte es gehen, dann hast Du ein Gerät mit 50 Hz. Ist der höchste VCOUNT Wert kleiner, hast Du ein 60 Hz Gerät.

Über das PAL Register weiß man aber zuverlässig, ob die Farben angepasst werden müssen.
PP´s of STARSOFTBerlin__________github|meine Webseite

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

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Das mit dem Zählen ist ein super Hinweis. Habe bis jetzt nur das PAL-Register abgefragt gehabt.

Würdest Du auch so zählen?

Code: Alles auswählen

@		lda VCOUNT			; Anzahl der VCounts zählen
		cmp VCOUNT			; Bei über 155 Schritten			
		beq @-				; hat man 50Hz, darunter
		bcc @-				; hat man 60Hz
		cmp #$9b
		bcs IS_50hz
		
IS_60Hz		lda #$01			
		jmp @+
IS_50hz		lda #$00		
@		sta is60Hz

Grüße
Janko

Edit: Hab den Code noch einmal geändert gehabt

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

Re: Return to Phobos

Beitrag von pps »

Das sieht auf den ersten Blick gut aus.

EDIT: Auf den zweiten aber dann doch wohl nicht.

Nutze am besten eine temporäre Variable zum zählen und vor allem setze am Anfang VCOUNT auf 0.
So mache ich das meist:

Code: Alles auswählen

;50Hz or 60 Hz?
	mva #0 vcount
@	lda vcount
	beq w
	sta temp
	jmp @-
w
	lda temp
	cmp #$9b
	bmi ntsc
;PAL
	mva #0 sixtyhz
	rts
ntsc
	mva #1 sixtyhz
	rts
PP´s of STARSOFTBerlin__________github|meine Webseite

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

Re: Return to Phobos

Beitrag von Prodehl »

Guten Morgen in die Gemeinde,
ich habe jetzt alle Schranken und Hindernisse fertig und bin dabei die Landschaft zu erweitern. Ich würde mal sagen, daß ich jetzt insgesamt die Hälfte der Landschaft kreiert habe. Mit dem ganzen Programmcode bin ich jetzt bei ca. 24kB ... da scheint noch etwas Luft, aber ich muss jetzt noch ein paar Sachen ändern. Ich starte mit dem Code jetzt nicht bei $2000, sondern bei $400.
Auch musste ich ein paar Variablen umdeklarieren, da der Code da sonst reingrätscht. Ich habe noch freie Slots unterhalb $400 gefunden und benutzt.
Ein etwas größerer Part wird noch die Displaylist samt Bildschirm sein. Das fängt bei mir ja bei $7530 (30000) an, entweder schiebe ich das nach ganz vorne - also direkt hinter die Charakter, oder soweit nach hinten wie es geht - da brauche ich ca. 2kB an Platz.
Jetzt ist es nämlich so, wenn mein Programm in die $7530 Speicherbereiche reingeht, kommt es zu einem kompletten fatalen Absturz - was ja logisch ist.
Vielleicht lege ich die DL und den Bildschirm etwa bei 47000 hin, dann habe ich noch massig Platz für das Programm.
Bei meinem nächsten Projekt werde ich vorher mir ganz genau Gedanken machen, wie ich den Speicher optimal nutze...
LG
Peter

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

Re: Return to Phobos

Beitrag von Kveldulfur »

Hallo!

Kann man "Return to Phobos" überhaupt dann noch via eines DOS starten, wenn Du den Bereich <$2000 nutzt?
Das DOS liegt normal an dieser Stelle. Auch einige Speeder haben sich in dem Bereich einquartiert.

Ich habe mein Programm so geschrieben, dass man mit "Escape" ins DOS zurück kehrt :-)
Habe dafür mein Programm testweise auf eine ATR geschrieben mit DOS 2.5 und über das DOS geladen.

Grüße
Janko

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

Re: Return to Phobos

Beitrag von Prodehl »

Laden von Dos … daran habe ich gar nicht gedacht… das werde ich entsprechend noch anpassen, damit man das Spiel normal von Diskette laden kann!

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

Re: Return to Phobos

Beitrag von Prodehl »

Jetzt habe ich das Programm etwas umgestellt ...
Programmstart jetzt bei 2048 ($800), Bildschirmausgabe statt 30000 jetzt bei 41000 ($A028).
Ich weiß gar nicht, warum ich bei 30000 den Bildschirmstart gesetzt habe... dadurch habe ich für das ganze Programm 15 kB mehr zur Verfügung....
Da passt noch Landschaft rein, Programmcode und Sound...

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast