Charon

Moderator: Rockford

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

... hier der aktuelle Code:
Die Displaylist und den Header habe ich wegen der Kürze wieder ins Hauptprogramm integriert... ist dann auch leichter hier und für mich mit den Dateien zu handeln, als icl (include) habe ich dann nur noch die Character und Landschaft...
Mit der letzten Reihe bin ich noch nicht ganz zufrieden, das Feinscroll läuft jetzt aber echt gut!

der Hauptcode:

Code: Alles auswählen

			org $2000
			
ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8
sdlstl = $230 ;Start DisplayList
vscrol = $d405 ;vertikal scrol
wsync = $d40a 
RTCLOk = $0012
SETVBV   = $e45c
var1 = $a0
var2 = $a2
var3 = $a4
var4 = $a6
var5 = $a8
var6 = $b0
var7 = $b2
delay = $b4
			icl 'character.asm'
			icl 'lands.asm'	
        
dlist      	 	.byte 112,112,112,98
			.byte 30,75
			.byte 34,34,34,34,34,34,34,34,34,34,34,34
			.byte 34,34,34,34,34,34,34,34,34,34,2
			.byte 65,32,156
						
			.proc main
			
			jsr displaylist ;Subroutine Displaylist-Aufbau
						
start1			mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 (16 Farben) initialisieren
			mva #8 color4	;Hintergrundfarbe / Helligkeit festlegen			
			lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1
			mva <lands var6
			mva >lands var6+1
						
hauptprogramm
						
			jsr letztereihe 		;letzte Reihe (lands) Bildschirm1 printen (sichtbar)	
			jsr feinscroll 			;Feinscroll Bildschirm1 ausführen (sichtbar)
									
			mva #$30 var1			;var1 auf 30000 ($7530) setzen
			mva #$75 var1+1
			mva #$f0 var2			;var2 auf 30960 ($78f0) setzen
			mva #$78 var2+1
			
			jsr grobscroll			;Bildschirm1 kopieren + grobscroll
		
			mva #$18 var1			;var1 + var2 auf 31000 ($7918) setzen
			mva #$18 var2
			mva #$79 var1+1
			mva #$79 var2+1	
			
			jsr umschalten			;umschalten auf Bildschirm2 - Bildschirm2 wird sichtbar
			jsr letztereihe			;letzte Reihe (lands) Bildschirm2 printen (sichtbar)	
			jsr feinscroll			;Feinscroll Bildschirm2 ausführen (sichtbar)						

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

			jsr umschalten			;umschalten auf Bildschirm1 - Bildschirm1 wird sichtbar

			;Ende der Bildschirmausführung / Kontrolle Durchläufe

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

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



umschalten
			ldy #4
			mva sdlstl var5
			mva sdlstl+1 var5+1
			lda var1
			sta (var5),y
			iny
			lda var1+1
			sta (var5),y
			rts

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

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

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


Landschaft:
hier sind viele Zeilen erstmal dupliziert...

Code: Alles auswählen

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

lands			.byte 9,2,1,20,10,9,2
			.byte 9,2,1,18,10,11,2
			.byte 9,2,1,17,10,12,2
			.byte 9,2,1,16,10,13,2
			.byte 9,2,1,15,10,15,2
			.byte 9,2,1,14,10,16,2
			.byte 9,2,1,13,10,17,2
			.byte 10,2,1,12,10,17,2
			.byte 11,2,1,11,10,18,2
			.byte 12,2,1,10,10,17,2
			.byte 13,2,1,10,10,15,2
			.byte 14,2,1,10,10,14,2
			.byte 14,2,1,10,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 12,2,1,12,10,14,2
			.byte 11,2,1,12,10,15,2
			.byte 13,2,1,11,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 12,2,1,12,10,14,2
			.byte 11,2,1,12,10,15,2
			
			.byte 9,2,1,20,10,9,2
			.byte 9,2,1,18,10,11,2
			.byte 9,2,1,17,10,12,2
			.byte 9,2,1,16,10,13,2
			.byte 9,2,1,15,10,15,2
			.byte 9,2,1,14,10,16,2
			.byte 9,2,1,13,10,17,2
			.byte 10,2,1,12,10,17,2
			.byte 11,2,1,11,10,18,2
			.byte 12,2,1,10,10,17,2
			.byte 13,2,1,10,10,15,2
			.byte 14,2,1,10,10,14,2
			.byte 14,2,1,10,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 12,2,1,12,10,14,2
			.byte 11,2,1,12,10,15,2
			.byte 13,2,1,11,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 12,2,1,12,10,14,2
			.byte 11,2,1,12,10,15,2
			
			.byte 9,2,1,20,10,9,2
			.byte 9,2,1,18,10,11,2
			.byte 9,2,1,17,10,12,2
			.byte 9,2,1,16,10,13,2
			.byte 9,2,1,15,10,15,2
			.byte 9,2,1,14,10,16,2
			.byte 9,2,1,13,10,17,2
			.byte 10,2,1,12,10,17,2
			.byte 11,2,1,11,10,18,2
			.byte 12,2,1,10,10,17,2
			.byte 13,2,1,10,10,15,2
			.byte 14,2,1,10,10,14,2
			.byte 14,2,1,10,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 12,2,1,12,10,14,2
			.byte 11,2,1,12,10,15,2
			.byte 13,2,1,11,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 12,2,1,12,10,14,2
			.byte 11,2,1,12,10,15,2
			
			.byte 9,2,1,20,10,9,2
			.byte 9,2,1,18,10,11,2
			.byte 9,2,1,17,10,12,2
			.byte 9,2,1,16,10,13,2
			.byte 9,2,1,15,10,15,2
			.byte 9,2,1,14,10,16,2
			.byte 9,2,1,13,10,17,2
			.byte 10,2,1,12,10,17,2
			.byte 11,2,1,11,10,18,2
			.byte 12,2,1,10,10,17,2
			.byte 13,2,1,10,10,15,2
			.byte 14,2,1,10,10,14,2
			.byte 14,2,1,10,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 12,2,1,12,10,14,2
			.byte 11,2,1,12,10,15,2
			.byte 13,2,1,11,10,14,2
			.byte 13,2,1,11,10,14,2
			.byte 12,2,1,12,10,14,2
			.byte 11,2,1,12,10,15,2
die Charaktertabelle noch unverändert zu den Vorgängerversionen:

Code: Alles auswählen

;@com.wudsn.ide.asm.mainsourcefile=test.asm
chr			.he 0,0,0,0,0,0,0,0
			.he f0,f0,ff,ff,ff,ff,f0,f0
			.he ff,ff,ff,ff,ff,ff,ff,ff
			.he 0f,0f,ff,ff,ff,ff,0f,0f
			.he f0,f0,f0,f0,f0,f0,f0,f0
			.he 0f,0f,0f,0f,0f,0f,0f,0f
			.he 0,0,0,0,ff,ff,ff,ff
			.he ff,ff,ff,ff,0,0,0,0
			.he f0,f0,f0,f0,ff,ff,ff,ff
			.he ff,ff,ff,ff,f0,f0,f0,f0
			.he 0f,0f,0f,0f,ff,ff,ff,ff
			.he ff,ff,ff,ff,0f,0f,0f,0f
			
			.he e0,e0,ee,ee,ee,ee,e0,e0
			.he ee,ee,ee,ee,ee,ee,ee,ee
			.he 0e,0e,ee,ee,ee,ee,0e,0e
			.he e0,e0,e0,e0,e0,e0,e0,e0
			.he 0e,0e,0e,0e,0e,0e,0e,0e
			.he 0,0,0,0,ee,ee,ee,ee
			.he ee,ee,ee,ee,0,0,0,0
			.he e0,e0,e0,e0,ee,ee,ee,ee
			.he ee,ee,ee,ee,e0,e0,e0,e0
			.he 0e,0e,0e,0e,ee,ee,ee,ee
			.he ee,ee,ee,ee,0e,0e,0e,0e
			
			.he d0,d0,dd,dd,dd,dd,d0,d0
			.he dd,dd,dd,dd,dd,dd,dd,dd
			.he 0d,0d,dd,dd,dd,dd,0d,0d
			.he d0,d0,d0,d0,d0,d0,d0,d0
			.he 0d,0d,0d,0d,0d,0d,0d,0d
			.he 0,0,0,0,dd,dd,dd,dd
			.he dd,dd,dd,dd,0,0,0,0
			.he d0,d0,d0,d0,dd,dd,dd,dd
			.he dd,dd,dd,dd,d0,d0,d0,d0
			.he 0d,0d,0d,0d,dd,dd,dd,dd
			.he dd,dd,dd,dd,0d,0d,0d,0d
			
			.he c0,c0,cc,cc,cc,cc,c0,c0
			.he cc,cc,cc,cc,cc,cc,cc,cc
			.he 0c,0c,cc,cc,cc,cc,0c,0c
			.he c0,c0,c0,c0,c0,c0,c0,c0
			.he 0c,0c,0c,0c,0c,0c,0c,0c
			.he 0,0,0,0,cc,cc,cc,cc
			.he cc,cc,cc,cc,0,0,0,0
			.he c0,c0,c0,c0,cc,cc,cc,cc
			.he cc,cc,cc,cc,c0,c0,c0,c0
			.he 0c,0c,0c,0c,cc,cc,cc,cc
			.he cc,cc,cc,cc,0c,0c,0c,0c
			
			.he b0,b0,bb,bb,bb,bb,b0,b0
			.he bb,bb,bb,bb,bb,bb,bb,bb
			.he 0b,0b,bb,bb,bb,bb,0b,0b
			.he b0,b0,b0,b0,b0,b0,b0,b0
			.he 0b,0b,0b,0b,0b,0b,0b,0b
			.he 0,0,0,0,bb,bb,bb,bb
			.he bb,bb,bb,bb,0,0,0,0
			.he b0,b0,b0,b0,bb,bb,bb,bb
			.he bb,bb,bb,bb,b0,b0,b0,b0
			.he 0b,0b,0b,0b,bb,bb,bb,bb
			.he bb,bb,bb,bb,0b,0b,0b,0b
			
			.he a0,a0,aa,aa,aa,aa,a0,a0
			.he aa,aa,aa,aa,aa,aa,aa,aa
			.he 0a,0a,aa,aa,aa,aa,0a,0a
			.he a0,a0,a0,a0,a0,a0,a0,a0
			.he 0a,0a,0a,0a,0a,0a,0a,0a
			.he 0,0,0,0,aa,aa,aa,aa
			.he aa,aa,aa,aa,0,0,0,0
			.he a0,a0,a0,a0,aa,aa,aa,aa
			.he aa,aa,aa,aa,a0,a0,a0,a0
			.he 0a,0a,0a,0a,aa,aa,aa,aa
			.he aa,aa,aa,aa,0a,0a,0a,0a
			
			.he 90,90,99,99,99,99,90,90
			.he 99,99,99,99,99,99,99,99
			.he 09,09,99,99,99,99,09,09
			.he 90,90,90,90,90,90,90,90
			.he 09,09,09,09,09,09,09,09
			.he 0,0,0,0,99,99,99,99
			.he 99,99,99,99,0,0,0,0
			.he 90,90,90,90,99,99,99,99
			.he 99,99,99,99,90,90,90,90
			.he 09,09,09,09,99,99,99,99
			.he 99,99,99,99,09,09,09,09
			
			.he 80,80,88,88,88,88,80,80
			.he 88,88,88,88,88,88,88,88
			.he 08,08,88,88,88,88,08,08
			.he 80,80,80,80,80,80,80,80
			.he 08,08,08,08,08,08,08,08
			.he 0,0,0,0,88,88,88,88
			.he 88,88,88,88,0,0,0,0
			.he 80,80,80,80,88,88,88,88
			.he 88,88,88,88,80,80,80,80
			.he 08,08,08,08,88,88,88,88
			.he 88,88,88,88,08,08,08,08
			
			.he 70,70,77,77,77,77,70,70
			.he 77,77,77,77,77,77,77,77
			.he 07,07,77,77,77,77,07,07
			.he 70,70,70,70,70,70,70,70
			.he 07,07,07,07,07,07,07,07
			.he 0,0,0,0,77,77,77,77
			.he 77,77,77,77,0,0,0,0
			.he 70,70,70,70,77,77,77,77
			.he 77,77,77,77,70,70,70,70
			.he 07,07,07,07,77,77,77,77
			.he 77,77,77,77,07,07,07,07
			
			.he 60,60,66,66,66,66,60,60
			.he 66,66,66,66,66,66,66,66
			.he 06,06,66,66,66,66,06,06
			.he 60,60,60,60,60,60,60,60
			.he 06,06,06,06,06,06,06,06
			.he 0,0,0,0,66,66,66,66
			.he 66,66,66,66,0,0,0,0
			.he 60,60,60,60,66,66,66,66
			.he 66,66,66,66,60,60,60,60
			.he 06,06,06,06,66,66,66,66
			.he 66,66,66,66,06,06,06,06
			
			.he 50,50,55,55,55,55,50,50
			.he 55,55,55,55,55,55,55,55
			.he 05,05,55,55,55,55,05,05
			.he 50,50,50,50,50,50,50,50
			.he 05,05,05,05,05,05,05,05
			.he 0,0,0,0,55,55,55,55
			.he 55,55,55,55,0,0,0,0
			.he 50,50,50,50,55,55,55,55
			.he 55,55,55,55,50,50,50,50
			.he 05,05,05,05,55,55,55,55
			.he 55,55,55,55,05,05,05,05
			
			.he 40,40,44,44,44,44,40,40
			.he 44,44,44,44,44,44,44,44
			.he 04,04,44,44,44,44,04,04
			.he 40,40,40,40,40,40,40,40
			.he 04,04,04,04,04,04,04,04
			.he 0,0,0,0,44,44,44,44
			.he 44,44,44,44,0,0,0,0
			.he 40,40,40,40,44,44,44,44
			.he 44,44,44,44,40,40,40,40
			.he 04,04,04,04,44,44,44,44
			.he 44,44,44,44,04,04,04,04
			
			.he 30,30,33,33,33,33,30,30
			.he 33,33,33,33,33,33,33,33
			.he 03,03,33,33,33,33,03,03
			.he 30,30,30,30,30,30,30,30
			.he 03,03,03,03,03,03,03,03
			.he 0,0,0,0,33,33,33,33
			.he 33,33,33,33,0,0,0,0
			.he 30,30,30,30,33,33,33,33
			.he 33,33,33,33,30,30,30,30
			.he 03,03,03,03,33,33,33,33
			.he 33,33,33,33,03,03,03,03
			
			.he 20,20,22,22,22,22,20,20
			.he 22,22,22,22,22,22,22,22
			.he 02,02,22,22,22,22,02,02
			.he 20,20,20,20,20,20,20,20
			.he 02,02,02,02,02,02,02,02
			.he 0,0,0,0,22,22,22,22
			.he 22,22,22,22,0,0,0,0
			.he 20,20,20,20,22,22,22,22
			.he 22,22,22,22,20,20,20,20
			.he 02,02,02,02,22,22,22,22
			.he 22,22,22,22,02,02,02,02
			
			.he 10,10,11,11,11,11,10,10
			.he 11,11,11,11,11,11,11,11
			.he 01,01,11,11,11,11,01,01
			.he 10,10,10,10,10,10,10,10
			.he 01,01,01,01,01,01,01,01
			.he 0,0,0,0,11,11,11,11
			.he 11,11,11,11,0,0,0,0
			.he 10,10,10,10,11,11,11,11
			.he 11,11,11,11,10,10,10,10
			.he 01,01,01,01,11,11,11,11
			.he 11,11,11,11,01,01,01,01
			
... jetzt gehe ich die Player an... ;-)

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

... jetzt habe ich doch noch ein wenig mit der letzten Reihe experimentiert und hin und her programmiert - kleine Fehler lassen mich einfach so lange nicht los, bis ich es "habe" ... die Lösung war mal wieder die Displaylist!!
Habe es folgendermaßen geändert:

Code: Alles auswählen

dlist   .byte 112,112,112,100
	.byte 30,75
	.byte 36,36,36,36,36,36,36,36,36,36,36,36
	.byte 36,36,36,36,36,36,36,36,36,4,112
	.byte 65,32,156
weil meine Frau die braune Farbe nicht so mag, habe ich die Farbtabelle auch noch angepasst:

Code: Alles auswählen

	mva #192 gprior	;GTIA Modus 3 (16 Farben) initialisieren
	mva #170 color4	;Hintergrundfarbe / Helligkeit festlegen	
jetzt noch vor jeder "jsr umschalten" Routine die Warteschleife anspringen:

Code: Alles auswählen

	mva #1 delay
 	jsr wartes
	jsr umschalten			;umschalten auf Bildschirm1 - Bildschirm1 wird sichtbar
und jetzt läuft der Feinscroll wirklich perfekt!! Bin echt mehr als zufrieden!


Liebe Grüße
Peter

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

Ein paar wohl bekannte Vorabüberlegungen zur PM-Graphik:
Hier habe ich mal die wichtigsten Register zusammengetragen:

SDMCTL $22F 559 - kontrolliert den direkten Speicherzugriff des Antic auf den Computer - Schattenregister von DMACTL ($D400,54272)
-> 3E. (62) oder 3A (58)
=32 DMA für DL ein/aus + 2 Anzeigefeld 40 Zeichen + 28 Bit 2,3,4
Bit 2: Missile ein/aus
Bit 3: Player+Missile ein/aus
Bit 4: 0 zweizeilig / 1 einzeilig

HPOSP0-3 $$D000/$D003 53248-53251 - horizontale Position der Player
sichtbar zwischen $30-$D0(48-208)

SIZEP0-P3 $D008-0B 53256-53259
Breite der Player: 0,2 normal 1 doppelt 3 vierfach

PCOLR0-3 $2C0 - $2C3 (704-707)
Playerfarbe

PMBAS $D407 54279
Beginn Speicherbereich PM
1kB Grenze (2 zeilig) 2kB Grenze (1 zeilig)
Peek(106)-16 -> Poke 54279

GRACTL $D01D 53277
kontrolliert PM /+Joystick für PM
Bit 0 (1) = Missiles ein/aus
Bit 1 (2) = Player an/aus
Bit 2 (4) = Drücken der Knöpfe wird gespeichert

HITCLR $D01E 53278 = beliebiger Wert löscht alle Kollisionsregister

PRIOR $D01B 53275 Rangfolge der Player

VDELAY $D01C 53276 Verschiebung der PM wenn zweizeilig über eine Zeile

Wenn man mehrere Farben für einen Player haben möchte, dann muss man Player überlagern, oder gibt es da noch andere Wege???
Gruß

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

next Problem......

Beitrag von Prodehl »

... alles in Assembler ist irgendwie viel viel schwieriger!
Nun ist es die Geschwindigkeit!!
Ich habe den Player erstellt (also das Raumschiff) und wollte nun mal kurz die Joysticksteuerung nur nach rechts und links einbinden... und plopp da ist schon die nächste Hürde! Noch habe ich keine vernünftige Lösung.
Sobald ich eine Joystickabfrage z.B. nach rechts mache und den HPOSP0 Wert - also den horizontalen Werte - für Player 1 erhöhe ist der Player komplett weg. Wenn ich den maximal sichtbaren Wert abfange, dann springt der Player sofort von der aktuellen Position zur Position ganz nach rechts... ich sehe keine Bewegung. Alles mal kurz in Basic nachprogrammiert - und natürlich passiert das auch hier, wenn man den Wert in Basic von 1 Inkrement auf 0,1 verkleinert, dann geht es, es ist also ein Zeitproblem. Der Assembler ist definitiv zu schnell.... und ich habe es noch nicht hinbekommen das Abfragetiming so zu machen, dass man eine schöne flüssige Bewegung des Players sieht...
Wer hat da Erfahrung und die passende Idee??
LG Peter

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

Re: Charon

Beitrag von pps »

Im VBI oder DLI den player setzen. Im normalen Programmcode nur die Abfrage machen und die neue Position speichern.
PP´s of STARSOFTBerlin__________github|meine Webseite

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

Also im normalen Code die Joystickabfrage machen und den neuen x-Werte in eine Variable abspeichern, im DLI oder VBI dann entsprechend den neuen x-Wert in die HPOSP0 einspeichern?

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

Re: Charon

Beitrag von pps »

Genau so wird es klappen.

Wenn es dann noch zu schnell ist, auch die Abfrage nur im interrupt machen.
PP´s of STARSOFTBerlin__________github|meine Webseite

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

ich biege also die Vektoren $200 und $201 auf meine Assemblerroutine für die Speicherung der HPOSP0 z.B.
schreibe in NMIEN 192 und schon wird der Interrupt ausgelöst über mein Programm welches mit RTI beendet wird?
Ich hätte erwartet, daß das dann noch schneller läuft...
Evt. baue ich die gesamte Routine - also incl. Joystickabfrage in den Code mit ein??!!

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

lieber den VBI nehmen oder DLI?? Oder egal??

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

Re: Charon

Beitrag von pps »

Ob im DLI oder VBI hängt davon ab, wo Du am meisten Zeit übrig hast.

Wenn Du den DLI nutzt denke dran, die verwendeten Register vorher zu retten und dann diese vor dem RTI zurück zu schreiben. Sonst hast Du Fehler, die Du Dir nicht erklären kannst.

Nutzt Du in Deiner Routine nur den Akku und das X Register, sieht die DLI Routine dann etwa so aus:

Code: Alles auswählen

DLI

   pha
   txa
   pha
   
   Nun Deine Routine... 
   
   pla
   tax
   pla
   rti
Initialisiert wird der DLI, wie oben von Dir beschrieben.

Code: Alles auswählen

   mwa #DLI $200
Allerdings wird er nur ausgelöst, wenn es auch in der DL einen entsprechenden Eintrag (eine Zeile mit +$80) gibt.
PP´s of STARSOFTBerlin__________github|meine Webseite

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

reicht MVA DLI $200 aus? Muss nicht das HiByte von DLI noch in $201?

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

Re: Charon

Beitrag von pps »

Deshalb ist es ja auch ein mwa ;)
PP´s of STARSOFTBerlin__________github|meine Webseite

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

oh ja … übersehen 🙈💪

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

Neues update:

Also der Displaylistinterrupt lief irgendwie nicht... schwarzer Bidlschirm!
Ich habe es jetzt im VBI gemacht! Zunächst habe ich nur den Part des Codes in den VBI gepackt, der den neuen Wert in die horizontale Position des Players schreibt. Das geht, ist aber ruckelig.... logischerweise!
Also habe ich das Programm angepasst und komplett in den VBI gestackt. Und nun läuft die Steuerung echt flüssig und gut. Dabei habe ich zunächst nur die Bewegung nach rechts und links programmiert. Die Bewegung vertikal ist etwas aufwendiger und mache ich im Anschluß. Den Code stelle ich gleich rein.
Dabei habe ich den Header etwas verändert und nehme einen aus dem Netz (von mir noch mit meinen Variablen erweitert), da hier alle (!!) Adressen drin sind!

Nun mache ich mir folgende Gedanken:
Auch die ganze Bewegung in vertikaler Richtung muss in den VBI. Am besten auch noch die Kollisionsabfrage und die Schüsse... nun mache ich mir natürlich echte Sorgen, ob das vom Zeittiming passt.
Im VBI bekomme ich ca. 8900 Maschinenzyklen unter, mein jetziges Programm im VBI benötigt ca. 120 Taktzyklen. Jeder Befehl braucht so ca. 1-6 Taktzyklen... ist 1 Taktzyklus identisch mit einem Maschinenzyklus? Wieviele Assemblerbefehle bekomme ich dann in den VBI rein ohne Probleme?? Wenn man mal im Schnitt 2-3 Taktzyklen pro Befehl im Schnitt annimmt, wären das ja ca. 3500 Befehle... ne Menge, wenn das stimmt! Oder habe ich mich verrechnet??

Nun der Header:

Code: Alles auswählen

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

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

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

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

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

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

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

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

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

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

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

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

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

miss1 = $c0
miss2 = $c2
miss3 = $c4
miss4 = $c6
rechts = $c8
links = $c9
posp1 = $ca
posp2 = $cb
joyst1 = $cc
Und hier der Code:

Code: Alles auswählen

			org $2000
			
			icl '../hardware.txt'
			icl 'character.asm'
			icl 'lands.asm'	
        
dlist   		.byte 112,112,112,100
			.byte 30,75
			.byte 36,36,36,36,36,36,36,36,36,36,36,36
			.byte 36,36,36,36,36,36,36,36,36,4,112
			.byte 65,32,156
			
pm1			.byte 24,60,36,36,126,126,255,219,219,129,129,129
			
			
						
			.proc main
			
			jsr displaylist ;Subroutine Displaylist-Aufbau
						
Start1			mva #>chr chbas ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 (16 Farben) initialisieren
			mva #170 color4	;Hintergrundfarbe / Helligkeit festlegen		
			lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1
			mva <lands var6
			mva >lands var6+1
			
			; Player vorbereiten und initialisieren

			lda ramtop
			sec
			sbc #16
			sta pmbase
			clc
			adc #4
			sta play1+1
			mva #62 sdmctl
			mva #120 posp1
			mva #220 pcolr0
			mva #193 gprior
			mva #3 gractl
			mva #1 sizep0
			mva #0 rechts
			
			ldy #255				;Speicher Player 1 leeren
			lda #0
			sta play1
@			sta (play1),y
			dey
			bpl @-
			clc
			ldy #80					;verticale Startpos. Player 1 + füllen
			ldx #0
@			lda pm1,x
			sta (play1),y
			iny
			inx
			cpx #12
			bne @-
			
			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 letztereihe 		;letzte Reihe (lands) Bildschirm1 printen (sichtbar)	
			jsr feinscroll 			;Feinscroll Bildschirm1 ausführen (sichtbar)
									
			mva #$30 var1			;var1 auf 30000 ($7530) setzen
			mva #$75 var1+1
			mva #$f0 var2			;var2 auf 30960 ($78f0) setzen
			mva #$78 var2+1
			
			jsr grobscroll			;Bildschirm1 kopieren + grobscroll
		
			mva #$18 var1			;var1 + var2 auf 31000 ($7918) setzen
			mva #$18 var2
			mva #$79 var1+1
			mva #$79 var2+1	
			
			mva #1 delay
 			jsr wartes
			
			jsr umschalten			;umschalten auf Bildschirm2 - Bildschirm2 wird sichtbar	
			jsr letztereihe
			jsr feinscroll			;Feinscroll Bildschirm2 ausführen (sichtbar)						

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

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

			;Ende der Bildschirmausführung / Kontrolle Durchläufe

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

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

			

			
								;vertical blank interrupt für Joystick / PM

vbinter			
			pha
			txa
			pha
			sec					;Abfrage Joystick
			lda stick0
			cmp #8
			bcs @+
			jmp nachre
@			clc
			lda stick0
			cmp #15
			bcs @+
			sec
			lda stick0
			cmp #12
			bcs @+
			jmp nachli
@			clc
			jmp write
nachre		clc
			lda posp1
			cmp #192
			bcs @+
			inc posp1
@			jmp write
nachli		sec
			lda posp1
			cmp #49
			bcc @+
			dec posp1
@			clc
write		lda posp1 
			sta hposp0
			pla
			tax
			pla
			jmp xitvbv			;vb-interrupt wird über xitvbv beendet!!



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

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

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

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

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



Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

Ich habe nochmal nachgeschaut und es scheint tatsächlich so zu sein:

Der Atari 6502 Prozessor arbeitet mit einer Taktfrequenz von 1,77 MHz (PAL-System), somit dauert ein Taktzyklus beim Atari also ca. 0,56 Mikrosekunden.
Die Befehle benötigen 1-7 Taktzyklen, also rechne ich mal schlecht im Schnitt 5 Taktzyklen pro Befehl im Durchscnitt, also 2,8 Mikrosekunden.

Der VBI dauert beim PAL-System 4500 Mikrosekunden. Mir stehen also im Schnitt ca. 1600 Befehle im VBI zur Verfügung.
Damit kann man schon ne Menge machen, für die rechts / links - Steuerung habe ich gerade mal 36 Befehle gebraucht. Mit 1600 Befehlen müsste ich eigentlich alles gut im VBI unterbringen... hoffe, ich habe mich nicht verrechnet!!
LG Peter

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

Ich habe jetzt Player 1 (mein Raumschiff) mit der kompletten Steuerung incl. Kollisionsabfrage ausgestattet, die Steuerung läuft jetzt sehr schön im vertikal blank interrupt und ich hoffe noch genügen Zeit zu haben, um die ganzen Missiles dort auch unterzubringen.
Ich möchte dabei alle 4 Missiles verwenden, so daß maximal 4 Schüsse gleichzeitig sichtbar sind und entsprechend zum Ziel laufen können.
Bei der Erstellung des ersten Missile kam dann das nächste Problem: Ich habe es nicht so richtig hinbekommen und das lag tatsächlich an der scheinbaren Kompliziertheit, gepaart mit eigenem Unwissen und wie ich finde für mich nicht so ganz klarer Erklärung wie die Dinger funktionieren in sämtlichen Büchern/Quellen..... für den Profi vielleicht unverständlich, aber ein paar Dinge muss man einfach wissen, weil sie zwar sinnvoll sein mögen (aus Sicht des Atari-Konstrukteurs damals) - dennoch recht uneingänglich wirken!
Jetzt weiß ich auch, warum ich damals immer einen Bogen um die PM-Grafik gemacht habe. Für alle, die auch Schwierigkeiten damit haben folgende Erklärungen:
Ich poste das hier mal in Dezimal und in Assembler braucht man natürlich nicht Poke sondern schreibt das einfach in die Speicherstelle rein.

Ich brauche SDMCTL. (559) - hiemit kann der Grafikchip auf den Speicher zugreifen. Z.B. Poke 559,62
Die horizontale Positionen der Missiles stehen in den Stellen 53252-53255. für Missile 1-4
Die Farben der Missile orientieren sich an den Farben der Player - sind also prinzipiell jeweils gleich und werden in den Stellen 704-707 gesetzt.
Mit GPRIOR (Poke 623) kann ich die Player und Missiles manipulieren (Vordergrund / Hintergrund) - zB Poke 623,1 -> zeigt alle Player und Missile
Wir brauchen noch GRACTL (Poke 53277) - schaltet Player und Missile (sowie Feuerknopfspeicherung) ein und aus -> Bit 0 und 1 (also Poke 53277,3) und schon zeigt er alle Player und Missiles an (wenn Daten hinterlegt sind).

Soweit alles easy... jetzt kommt der Knacker:
Die PMBASE (54279)... hier startet die Basisadresse für die Daten der PM-Grafik. Die PMBASE ist nur als HI-BYTE anzusprechen und kann die 1024 bzw. 2048 Grenze (einzeilig / zweizeilig) nicht überspringen.
Man könnte also sinnvollerweise RAMTOP (106) auslesen (z.B. steht da 160 -> 256*160=40960) .... wenn ich jetzt z.B. 16 abziehe und entsprechend 144 in die PMBASE schreibe, dann beginnt mein PM-Speicher bei 144*256=36864. Ich könnte auch tiefer gehen, aber 144*256 funktioniert gut und sinnvoll, der PM-Speicher ist dann relativ knapp unterhalb des Bildschirmspeichers.
Der erste Player fängt dann bei PMBASE + 1024 an, der 2. jeweils +256!
Wo aber sind die Missiles??
Diese fangen alle (!!!) bei PMBASE+768 an. Das ist wichtig und ein wenig verwirrend... wenn man es nicht weiß und auch nirgends gut erklärt.
Der Trick an der Sache ist folgender: In Jedem Byte von PMBASE+768 bis PMBASE+1023 stecken alle Missiles zugleich - nämlich in jeweils Bit 0,1 Missile 1 in Bit 2,3 für Missile 2 Bit 4,5 Missile 3 und Bit 6,7 Missile 4.
Je nachdem was ich in die Bits reinschreibe, stelle ich Teile der Missiles dar oder auch nicht. Die jeweilig y-Position ist dann logischerweise wie der Player zwischen PMBASE+768 und PMBASE+1023. Daher kann man auch alle 4 Missiles wie einen Player betrachten, der nur quasr auseinandergerissen werden kann - und natürlich entsprechend auch wie ein gemeinsamer Player 5 benutzt werden kann.
Für Missile 1 zB schreibe ich eine 3 in den Speicher, für Missile 2 eine 12, 48 für Missile 3 und 192 für Missile 4 ---- will ich auf einer Höhe beispielsweise Missile 1 und 3 abbilden, dann kommt 51 in den Speicher .... usw.
Die x-Positionen lassen sich entsprechend separat steuern, auch die ganzen Kollisionsabfragen - mit einem Poke kann man das aber dann auch zusammenlegen !
Gruß

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

Re: Charon

Beitrag von pps »

Wichtig noch daran zu denken, dass sich alle benötigten PM Adressen (also PMBASE+x) nochmals ändern, wenn man nicht 1-zeilige Player, sondern 2-zeilige Player nutzt.
PP´s of STARSOFTBerlin__________github|meine Webseite

Benutzeravatar
Prodehl
Beiträge: 292
Registriert: 24.08.2021 14:40
Has thanked: 15 times
Been thanked: 56 times
Kontaktdaten:

Re: Charon

Beitrag von Prodehl »

Hallo in die Runde...
dies wird der letzte Post in Sachen "Charon" sein... ich schließe das Thema.
Ich entwickele hier ein Spiel, was sehr stark dem alten Klassiker Phobos entspringt.
Charon - auch ein Mond im Sonnensystem hat mich irgendwie vom Namen nie richtig überzeugt und ich werde ab sofort das Projekt umbenennen in:

Return to Phobos

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast