Seite 1 von 2

Charon

Verfasst: 05.10.2021 11:34
von Dr. Irata
Ich möchte mein erstes Projekt "Charon" nennen! Charon ist der erste Mond von Pluto - also ganz ähnlich wie Phobos der erste Mond vom Mars ist.
Hier werde ich nun pö a pö das Spiel entwickeln. Es wird also ein Shooter und soll dem Spiel Phobos sehr angelehnt werden.
Ich möchte es hier im Forum posten - wenn es erwünscht ist und niemanden nervt - und es soll komplett in Assembler programmiert werden.
Der Code wird komplett offen liegen und über einen regen Austausch mit Tips, Verbesserungen, Ideen bin ich dankbar... also wer Lust hat, der kann sich sehr gerne rege beteiligen.
Das Spiel möchte ich Schritt für Schritt entwickeln, alle Programmierklippen sollen dabei gelöst werden.

Ich programmiere auf meinem Mac unter Eclipse und WUDSN / MADS-Assembler.
Folgende Schritte stelle ich mir vor:
1. Ich nehme Graphics 0 mit 16 Farben. Dazu bearbeiten wir die Charakter entsprechend.
2. Eine erste Landschaft mit Feinscrolling wird erstellt.
3. Die Landschaft wird komplexer, verschiedene Items werden eingebunden.
4. PM kommt dazu (Raumschiff, Schüsse werden simuliert)
5. Kollisionsabfragen mit entsprechenden Aktionen
6. Die Landschaften werden komplexer - verschiedene Level mit Endgegner.
7. Evt. Sonderlevel, geheime Level etc.
8. Sound / Highscore
9. Evt. 2 Spieler-Modus
10. ....

Liebe Grüße
Peter

Re: Charon

Verfasst: 05.10.2021 12:42
von Kveldulfur
Hallo!

Kling sehr interessant. Also ich würde mich freuen, wenn man hier im Forum die Entwicklung miterleben kann und so selber ein wenig Assembler lernt. Gerade das Feinscrolling insteressiert mich... Naja, eigentlich alles ;-)

Grüße

Re: Charon

Verfasst: 06.10.2021 07:20
von Sleeπ
Ich bin jetzt keine Leuchte in Assembler, würde mich aber trotzdem freuen die Entstehung hier verfolgen zu können (und etwas davon zu lernen) ;-)

Re: Charon

Verfasst: 08.10.2021 11:59
von Dr. Irata
... es dauert ein wenig, da ich viel auf der Arbeit zu tun habe...

Ich habe jetzt neben der Arbeit versucht dieses kleine Basic-Programm:

Code: Alles auswählen

10 POKE 106,PEEK(106)-4
20 CB=PEEK(106)
30 GRAPHICS 0
40 CHRSET = CB*256
50 DIM CT(16)
60 FOR I=0 TO 15: CT(I)=17*I:NEXT I
70 FOR I=0 TO 15
80 FOR J=0 TO 7
90 POKE CHRSET+I*8+J,CT(I)
100 NEXT J: NEXT I
110 SCREEN=PEEK(88)+PEEK(89)*256
120 FOR I=0 TO 15: POKE SCREEN+I,I:NEXT I
130 POKE 756,CB
140 POKE 623,192
150 POKE 712,8
160 GOTO 160
In Assembler umzusetzen... das ist gar nicht so einfach wegen der Schleifen und der Multiplikationen usw.!!!!

Mein erster Ansatz (wirkt recht umständlich muss ich zugeben) war jetzt folgender:

Code: Alles auswählen

		org $4000
cb = 106		
chrset = 180		
ct	.by	0,17,34,51,68,85,102,119,136,153,170,187,204,221,238,255
ch	.by 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120
var1 = 182
		
start		clc
		lda cb
		sbc #4
		sta cb
		sta chrset+1
		ldy#0
lp1		ldx#0
		clc
lp2		lda ch,y
		sty var1
		adc var1
		tay
		lda ct,y
		sta (chrset),y
		inx
		cpx  #7
		bne lp2
		iny
		cpy #15
		bne lp1
		ldy #0
		ldx #0
		clc
lp3		tya
		sta (88),y
		iny
		cpy #15
		bne lp3
		
		lda cb
		sta 756
		lda #192
		sta 623
		lda #8
		sta 712
		
lp4		jmp lp4
		
		
		
		
		
		run start
				

leider tut sich noch nichts... liegt es daran, daß ich keinen Graphics 0-Befehl eingebracht habe? Muss ich erst noch die DL konfigurieren?
Wahrscheinlich hat der Code irgendein Denkfehler... am Sonntag gehe ich ihn nochmal konzentriert durch!

Re: Charon

Verfasst: 08.10.2021 12:32
von Irgendwer
Prodehl hat geschrieben:
08.10.2021 11:59

Code: Alles auswählen

			
start		clc
		lda cb
		sbc #4
... ein erster Hinweis (habe mir nur ganz flüchtig eben Deinen Beitrag angeschaut):

Für die Subtraktion "brauchst Du was zum Borgen". Die typische Sequenz sieht so aus:

Code: Alles auswählen

		
		sec
		sbc #value
sonst ziehst Du einen zu viel ab...

Re: Charon

Verfasst: 08.10.2021 22:36
von Dr. Irata
Danke für den Hinweis "sec" !!!

... ein wenig verschlankt, ein paar weitere Fehler noch korrigiert...
läuft ;-)

Code: Alles auswählen

		org $4000
cb = 106		
chrset = 180		
var1 = 182

start		lda cb
		sec
		sbc #16
		sta cb
		sta chrset+1
		ldx #0
lp1		txa
		asl
		asl
		asl
		sta chrset
lp2		lda var1
		sta (chrset),y
		iny
		cpy #7
		bne lp2
		ldy #0
		clc
		lda var1
		adc #17
		sta var1
		inx
		cpx #16
		bne lp1
lp3		tya
		sta (88),y
		iny
		cpy #16
		bne lp3
		lda cb
		sta 756
		lda #192
		sta 623
		lda #8
		sta 712
		
lp4		jmp lp4
		
		run start
				
				

ein paar Erklärungen:
Tatsächlich musste ich statt 4, 16 subtrahieren, um Chaos im Charakterset zu vermeiden. Die 3 ASL bedeuten Multiplikation mit 8. Wer die Multiplikation der um 16 Subtrahierten Speicherstelle mit 256 (siehe Basic-Programm) sucht, der findet sie in dem Ausdruck: sta chrset+1 ... denn mit x256 spreche ich ja das Hi-Byte an - also packe ich den Werte einfach in chrset+1 rein und nutze dann später die indirekt indizierte Speicherstelle sta (chrset),y
LG Peter

Als nächstes werden wir damit die Landschaft erstellen und das Feinscrolling aufsetzen...

Re: Charon

Verfasst: 09.10.2021 06:51
von pps
Da Du ja WUDSN nutzt...

Wie wäre es, wenn Du Deine einzelnen Routinen ein wenig eingrenzt mit .PROC oder .LOCAL?
Unten habe ich das mal für start gemacht. Was das bringt, siehst Du spätestens, wenn das Programm größer wird und mehrere Sprunglabels hat. Man kann im Outline und im Editor deutlich besser und schneller zu den einzelnen Teilen gehen.

Die loops habe ich auch mal etwas angepasst. Die @loops machen auch die outline etwas schmaler. @- springt zurück zum vorherigen @loop, @+ zum nächsten. Das lp1 könnte man auch mit einem @ nutzen, muss dann aber beim bne @-2 schreiben, @- würde nur zum alten lp2 springen.

Was auch sehr sinnvoll ist...
Einzelne Bereiche des Programms in eigene sources zu legen und in einem "Projekt-File" diese dann zusammenzufassen und dann dieses zu assemblieren. So kann man Grafik, Spiellogik, Arithmetik etc. in getrennten und kürzeren Dateien haben und auch einfacher in anderen Projekten wieder verwenden.
Prodehl hat geschrieben:
08.10.2021 22:36
Danke für den Hinweis "sec" !!!

... ein wenig verschlankt, ein paar weitere Fehler noch korrigiert...
läuft ;-)

Code: Alles auswählen

		org $4000
cb = 106		
chrset = 180		
var1 = 182

.proc start
		lda cb
		sec
		sbc #16
		sta cb
		sta chrset+1
		ldx #0
lp1		txa
		asl
		asl
		asl
		sta chrset
@		lda var1
		sta (chrset),y
		iny
		cpy #7
		bne @-
		ldy #0
		clc
		lda var1
		adc #17
		sta var1
		inx
		cpx #16
		bne lp1
@		tya
		sta (88),y
		iny
		cpy #16
		bne @-
		lda cb
		sta 756
		lda #192
		sta 623
		lda #8
		sta 712
		
lp4		jmp lp4
.endp		
		run start
				
				

ein paar Erklärungen:
Tatsächlich musste ich statt 4, 16 subtrahieren, um Chaos im Charakterset zu vermeiden. Die 3 ASL bedeuten Multiplikation mit 8. Wer die Multiplikation der um 16 Subtrahierten Speicherstelle mit 256 (siehe Basic-Programm) sucht, der findet sie in dem Ausdruck: sta chrset+1 ... denn mit x256 spreche ich ja das Hi-Byte an - also packe ich den Werte einfach in chrset+1 rein und nutze dann später die indirekt indizierte Speicherstelle sta (chrset),y
LG Peter

Als nächstes werden wir damit die Landschaft erstellen und das Feinscrolling aufsetzen...

Re: Charon

Verfasst: 09.10.2021 08:53
von Dr. Irata
Hey lieben Dank!
Die Anpassungen habe ich gleich mal übernommen. Komischerweise läuft der Loop nicht mit @-2 sondern mit @-1 ... nicht ganz logisch aber dann vielleicht doch, denn nach bne @- kommt wahrscheinlich für das Programm logisch bne @-1 und dann bne @-2 etc.
Mit den Proceduren und einzelnen Projekten ist sicherlich höchst sinnvoll, um Redundanzen zu vermeiden und den Code übersichtlicher zu gestalten - natürlich wird es dann für jemand, der den Code ganz normal im Atari Assembler nachvollziehen will schwieriger... außerdem programmiere ich erst seit der Fujiyama mit WUDSN und es gibt. wenig Dokumentation oder Beispielcodes wo man lernen kann... ich muss mir fast alles selber beibringen, daher ist es echt toll, daß einige Profis mich hier ein wenig begleiten... Danke dafür!! Danke für den Austausch!!
Ichdenke mit der Zeit werde ich mehr und mehr auf die Möglichkeiten des WUDSN zurückgreifen... vielleicht bekomme ich ja auf der JHV noch ein paar Anregungen und Nachhilfestunden ;-)

An dieser Stelle ganz liebe Grüße auch. an Peter alias JAC ;)

P.s. meine Tastatur prellt manchmal 🙈😂

Re: Charon

Verfasst: 09.10.2021 19:18
von Kveldulfur
Hallo!

Als ich das erste Script von Dir, was nicht lief, nachprogrammieren wollte, ist mir aufgefallen dass Du die Speicherzellen Dezimal schreibst. Ausserdem haben bestimmte Speicherzellen wohl feste Namen. 106 ist RAMTOP und wäre Hexadezimal $6A
Also wäre besser

RAMTOP EQU $6A

Desweiteren nutzt Du die Adresse 88, das wäre SAVMSC $58.

Ich denke, dass man die festen Namen zur besseren Lesbarkeit nutzen sollte.

Als letztes wäre es sehr gut, wenn man sich von Anfang an angewöhnt immer Kommentare im Quellcode zu schreiben.
Je größer und länger ein Programm wird, desto schwerer findet man sich sonst zurecht.

Grüße

Re: Charon

Verfasst: 10.10.2021 00:03
von Dr. Irata
danke für die Hinweise, ich werde das zu berücksichtigen versuchen... sicherlich alles sinnvoll was du sagst, mit Hexadezimalist für mich. schon eher gewöhnungsbedürftig!
Ich hoffe morgen ein wenig Zeit fürs Feinscrolling zu finden...

Re: Charon

Verfasst: 10.10.2021 11:36
von Dr. Irata
ich habe das entsprechend des kleinen Rüffels angepasst:

Code: Alles auswählen

		org $4000
ramtop = $6a		
savmsc = $58
chbas = $2f4
gprior = $26f
color4 = $2c8
chrset = 180		
var1 = 182

start 		lda ramtop	;Ramtop verändern
		sec
		sbc #16
		sta ramtop
		sta chrset+1
		ldx #0
		
lp1		txa	;Charakter neu definieren
		asl
		asl
		asl
		sta chrset
lp2		lda var1
		sta (chrset),y
		iny
		cpy #7
		bne lp2
		ldy #0
		clc
		lda var1
		adc #17
		sta var1
		inx
		cpx #16
		bne lp1
		
lp3		tya	;Die ersten 16 Charakter auf den Bildschirm bringen
		sta (savmsc),y
		iny
		cpy #16
		bne lp3
		
		lda ramtop	;Basisadresse Zeichensatz neu festlegen
		sta chbas
		lda #$c0	;GTIA Modus 3 (16 Farben) initialisieren
		sta gprior
		lda #8	;Hintergrundfarbe / Helligkeit festlegen
		sta color4
		
lp4		jmp lp4
		
		run start
				
Es macht Sinn gleich von Anfang an zu dokumentieren und ein paar Remarks in den Programmcode einzubinden. Man kann es ja durchaus sparsam aber effektiv gestalten.
Die Systemvariablen zu benennen mach Sinn, da der Code sich dann ebenfalls klarer und verständlicher liest. Warum in Haxedezimal? Gerade bei Adressen über 255 (also 16 Bit) läßt sich damit viel besser arbeiten, da in Hexadezimal hier gleich das Hi / Low-Byte angezeigt werden.
Sinnvoll bzw. unabdingbar für jeden Programmierer erscheint mir "Das Atari Profibuch", was mir glücklicherweise (neu) vorliegt!

Allen einen schönen Sonntag!
Gruß Peter

Re: Charon

Verfasst: 10.10.2021 18:37
von pps
Noch ein Vorschlag zu den Systemvariablen.

Um nicht alles selbst immer wieder neu machen zu müssen, kann man auch eine "header" Datei einbinden, die schon jemand gemacht hat. Ich persönlich nutze da eine von Graph2Font erzeugte "header" Datei, die ich mittlerweile um einige Adressen ergänzt und auch einige angepasst habe. Diese Datei binde ich immer in meine Quellcodes mit ein.

Dies geschieht am besten gleich am Anfang des Quellcodes via:

Code: Alles auswählen

	icl '../atari.hea'
Wenn Du Deinen Code auf mehrere Dateien aufteilst, bindest Du sie dann so ein:

Code: Alles auswählen

	icl 'display/showmenu.asm'	;ingame menu
	icl 'display/copyrestore.asm'	;copy and restore routines
	icl 'calc/arithmetics.asm'	;arithmetics
	icl 'calc/leveltables.asm'	;create level tables
	icl 'logic/throwout.asm'	;trow someone out
	icl 'sound/sound.asm'		;sound routines
	icl 'display/gamemenu.asm'	;gamemenu
Dies ist ein Teil aus dem Source meines Spiels, das demnächst bei SikorSoft erscheint.

Damit Du auch beim Editieren dieser "Unter Dateien" mal eben schnell den gesamten Code assemblieren kannst, muss der WUDSN die "Haupt Datei" kennen. Direkt am Anfang jeder dieser eingebundenen Sources einfach den Link zur "Haupt Datei" schreiben und man kann immer den kompletten Code assemblieren ohne erst zu dieser Datei wechseln zu müssen:

Code: Alles auswählen

;arithmetics and conversations2screen of "runfast"
;	@com.wudsn.ide.asm.mainsourcefile=../runfast_disc.asm
Die erste Zeile ist nur eine Kurze Beschreibung, was die Datei halt so macht und kann natürlich auch weggelassen werden., das @com ist die wichtige Zeile für WUDSN.

Re: Charon

Verfasst: 12.10.2021 22:59
von Dr. Irata
folgendes Problem bzw. Überlegungen:
Mit relativ viel Aufwand habe ich jetzt ein altes Listing von BASIC auf Assembler konvertiert, wo man mit GR.0 16 Farben darstellen kann.
Dies wollte ich für die Erstellung von Landschaften und anderen Charaktern nehmen, das Raumschiff und die Schüsse wollte ich mit PM-Grafik erstellen.
Nun habe ich gesehen, daß Thomas Schulz in seinem tollen Vortrag vor ein paar Jahren sich wohl einen eigenen Bitmap Editor programmiert hat, in einen der schönen Tutoriels von Peter Dell sah ich, wie er virtuos mit Eclipse (was ich ja auf Mac auch nutze) und GrafX2 Bitmap-Grafiken erstellt... diesen Weg kann ich mit meinem Mac so nicht gehen. Ich bekomme zwar GrafX2 mit CrossOver auf meinem Mac zum laufen, aber es ist kompliziert und schlecht zu nutzen... wie das in Eclipse eingebunden werden soll... keine Ahnung. Es bleibt fast nur per Hand die Bitmaps selber zu programmieren oder ich programmiere mir auch direkt eine Art Bitmap Editor selber... gibt es noch alternativer Ideen ????
Bin für alle Vorschläge sehr offen!
Gruß Peter

Re: Charon

Verfasst: 13.10.2021 01:25
von Mathy
Hallo Peter

Frag doch mal den Thomas ob Du dir seinen Source Code mal kurz borgen kannst...

Tschüß

Mathy

Re: Charon

Verfasst: 14.10.2021 11:31
von Dr. Irata
Jetzt habe ich ein wenig überlegt und echt gezaudert wie ich es am besten mache... und mich entschieden den eingeschlagenen Weg für dieses erste Projekt beizubehalten nach dem Motto: Die Grafik muss noch nicht perfekt sein!! GTIA Modus 4 mit Farben und höherer Auflösung etc. mache ich später.
Ich bleibe bei GTIA 3 mit 16 Farben und habe dann nicht die perfekte Auflösung, aber für den Start hier wird es mehr als ausreichen. Rom ist auch nicht an einem Tag erbaut worden und es bleibt viel Zeit für die Lernkurve und für weitere Projekte....
Auch wie ich die Charakter umbiege und umändere... ich mache das jetzt direkt per Hand und bringe es direkt in den Assemblercode rein, um Platz zu sparen:

Code: Alles auswählen

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8

			org $2000
			
			.byte %00000000
			.byte %00000000
			.byte %00000000
			.byte %00000000
			.byte %00000000
			.byte %00000000
			.byte %00000000
			.byte %00000000
			
			.byte %11110000
			.byte %11110000
			.byte %11111111
			.byte %11111111
			.byte %11111111
			.byte %11111111
			.byte %11110000
			.byte %11110000
			
			.byte %11111111
			.byte %11111111
			.byte %11111111
			.byte %11111111
			.byte %11111111
			.byte %11111111
			.byte %11111111
			.byte %11111111
			
			.byte %00001111
			.byte %00001111
			.byte %11111111
			.byte %11111111
			.byte %11111111
			.byte %11111111
			.byte %00001111
			.byte %00001111
			
			.byte %11110000
			.byte %11110000
			.byte %11110000
			.byte %11110000
			.byte %11110000
			.byte %11110000
			.byte %11110000
			.byte %11110000
			
			.byte %00001111
			.byte %00001111
			.byte %00001111
			.byte %00001111
			.byte %00001111
			.byte %00001111
			.byte %00001111
			.byte %00001111
			
			.proc main
			
			lda #32 ;HighByte Character Pointer auf $2000 setzen
			sta ch
						
			ldy #5
loop			tya ;Die ersten 6 Charakter printen
			sta (savmsc),y
			dey
			bpl loop
			
			lda #192	;GTIA Modus 3 (16 Farben) initialisieren
			sta gprior
			lda #8	;Hintergrundfarbe / Helligkeit festlegen
			sta color4
			
			jmp *
			
			.endp
			
			run main
			

Entsprechend fahre ich jetzt fort und werde noch etliche weitere Charakter definieren für die Landschaft in noch weiteren Farben und für Gebäude bzw. Items. Das Raumschiff und die Schüsse werden mittels PM definiert.
Dann kommt ein Programmblock Feinscrolling, dann ein größerer Block für die Landschaft damit man das Feinscrolling testen kann und die Steuerung der PM mit Kollisionsabfragen usw...... so die nächsten Schritte!

Gruß Peter

Re: Charon

Verfasst: 14.10.2021 15:09
von Dr. Irata
... jetzt habe ich es noch ein wenig "eleganter" gemacht und vor die erste .byte %....... Definition das "label" chr vorgesetzt und unten dann die direkte lda #32 durch lda #>chr ersetzt! Das liest sich besser und ich werde das so auch später für die Landschaften so verwenden. Wichtig dabei ist allerdings, dass die neuen Charakter an $2000 anfangen - also an einer Speicherstelle die gerade durch 256 teilbar ist. Alles andere macht "Salat"!

Re: Charon

Verfasst: 14.10.2021 15:40
von Dr. Irata
... mit copy / paste und finden / ersetzen war das jetzt recht schnell erledigt und ich habe insgesamt 128 Charakter neu definiert in 16 Farben.
Zur besseren Übersicht habe ich das jetzt tatsächlich von binär in hexa umgeschrieben!

Code: Alles auswählen

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8


			org $2000
			
chr			.byte 0,0,0,0,0,0,0,0
			.byte $f0,$f0,$ff,$ff,$ff,$ff,$f0,$f0
			.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
			.byte $0f,$0f,$ff,$ff,$ff,$ff,$0f,$0f
			.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
			.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
			.byte $0,$0,$0,$0,$ff,$ff,$ff,$ff
			.byte $ff,$ff,$ff,$ff,0,0,0,0
			.byte $f0,$f0,$f0,$f0,$ff,$ff,$ff,$ff
			.byte $ff,$ff,$ff,$ff,$f0,$f0,$f0,$f0
			.byte $0f,$0f,$0f,$0f,$ff,$ff,$ff,$ff
			.byte $ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f
			
			.byte $b0,$b0,$bb,$bb,$bb,$bb,$b0,$b0
			.byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb
			.byte $0b,$0b,$bb,$bb,$bb,$bb,$0b,$0b
			.byte $b0,$b0,$b0,$b0,$b0,$b0,$b0,$b0
			.byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
			.byte $0,$0,$0,$0,$bb,$bb,$bb,$bb
			.byte $bb,$bb,$bb,$bb,0,0,0,0
			.byte $b0,$b0,$b0,$b0,$bb,$bb,$bb,$bb
			.byte $bb,$bb,$bb,$bb,$b0,$b0,$b0,$b0
			.byte $0b,$0b,$0b,$0b,$bb,$bb,$bb,$bb
			.byte $bb,$bb,$bb,$bb,$0b,$0b,$0b,$0b
			
			.byte $e0,$e0,$ee,$ee,$ee,$ee,$e0,$e0
			.byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee
			.byte $0e,$0e,$ee,$ee,$ee,$ee,$0e,$0e
			.byte $e0,$e0,$e0,$e0,$e0,$e0,$e0,$e0
			.byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
			.byte $0,$0,$0,$0,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,0,0,0,0
			.byte $e0,$e0,$e0,$e0,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,$e0,$e0,$e0,$e0
			.byte $0e,$0e,$0e,$0e,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,$0e,$0e,$0e,$0e
			
			.byte $d0,$d0,$dd,$dd,$dd,$dd,$d0,$d0
			.byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd
			.byte $0d,$0d,$dd,$dd,$dd,$dd,$0d,$0d
			.byte $d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
			.byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
			.byte $0,$0,$0,$0,$dd,$dd,$dd,$dd
			.byte $dd,$dd,$dd,$dd,0,0,0,0
			.byte $d0,$d0,$d0,$d0,$dd,$dd,$dd,$dd
			.byte $dd,$dd,$dd,$dd,$d0,$d0,$d0,$d0
			.byte $0d,$0d,$0d,$0d,$dd,$dd,$dd,$dd
			.byte $dd,$dd,$dd,$dd,$0d,$0d,$0d,$0d
			
			.byte $c0,$c0,$cc,$cc,$cc,$cc,$c0,$c0
			.byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc
			.byte $0c,$0c,$cc,$cc,$cc,$cc,$0c,$0c
			.byte $c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0
			.byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
			.byte $0,$0,$0,$0,$cc,$cc,$cc,$cc
			.byte $cc,$cc,$cc,$cc,0,0,0,0
			.byte $c0,$c0,$c0,$c0,$cc,$cc,$cc,$cc
			.byte $cc,$cc,$cc,$cc,$c0,$c0,$c0,$c0
			.byte $0c,$0c,$0c,$0c,$cc,$cc,$cc,$cc
			.byte $cc,$cc,$cc,$cc,$0c,$0c,$0c,$0c
			
			.byte $a0,$a0,$aa,$aa,$aa,$aa,$a0,$a0
			.byte $aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa
			.byte $0a,$0a,$aa,$aa,$aa,$aa,$0a,$0a
			.byte $a0,$a0,$a0,$a0,$a0,$a0,$a0,$a0
			.byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
			.byte $0,$0,$0,$0,$aa,$aa,$aa,$aa
			.byte $aa,$aa,$aa,$aa,0,0,0,0
			.byte $a0,$a0,$a0,$a0,$aa,$aa,$aa,$aa
			.byte $aa,$aa,$aa,$aa,$a0,$a0,$a0,$a0
			.byte $0a,$0a,$0a,$0a,$aa,$aa,$aa,$aa
			.byte $aa,$aa,$aa,$aa,$0a,$0a,$0a,$0a
			
			.byte $90,$90,$99,$99,$99,$99,$90,$90
			.byte $99,$99,$99,$99,$99,$99,$99,$99
			.byte $09,$09,$99,$99,$99,$99,$09,$09
			.byte $90,$90,$90,$90,$90,$90,$90,$90
			.byte $09,$09,$09,$09,$09,$09,$09,$09
			.byte $0,$0,$0,$0,$99,$99,$99,$99
			.byte $99,$99,$99,$99,0,0,0,0
			.byte $90,$90,$90,$90,$99,$99,$99,$99
			.byte $99,$99,$99,$99,$90,$90,$90,$90
			.byte $09,$09,$09,$09,$99,$99,$99,$99
			.byte $99,$99,$99,$99,$09,$09,$09,$09
			
			.byte $80,$80,$88,$88,$88,$88,$80,$80
			.byte $88,$88,$88,$88,$88,$88,$88,$88
			.byte $08,$08,$88,$88,$88,$88,$08,$08
			.byte $80,$80,$80,$80,$80,$80,$80,$80
			.byte $08,$08,$08,$08,$08,$08,$08,$08
			.byte $0,$0,$0,$0,$88,$88,$88,$88
			.byte $88,$88,$88,$88,0,0,0,0
			.byte $80,$80,$80,$80,$88,$88,$88,$88
			.byte $88,$88,$88,$88,$80,$80,$80,$80
			.byte $08,$08,$08,$08,$88,$88,$88,$88
			.byte $88,$88,$88,$88,$08,$08,$08,$08
			
			.byte $70,$70,$77,$77,$77,$77,$70,$70
			.byte $77,$77,$77,$77,$77,$77,$77,$77
			.byte $07,$07,$77,$77,$77,$77,$07,$07
			.byte $70,$70,$70,$70,$70,$70,$70,$70
			.byte $07,$07,$07,$07,$07,$07,$07,$07
			.byte $0,$0,$0,$0,$77,$77,$77,$77
			.byte $77,$77,$77,$77,0,0,0,0
			.byte $70,$70,$70,$70,$77,$77,$77,$77
			.byte $77,$77,$77,$77,$70,$70,$70,$70
			.byte $07,$07,$07,$07,$77,$77,$77,$77
			.byte $77,$77,$77,$77,$07,$07,$07,$07
			
			.byte $60,$60,$66,$66,$66,$66,$60,$60
			.byte $66,$66,$66,$66,$66,$66,$66,$66
			.byte $06,$06,$66,$66,$66,$66,$06,$06
			.byte $60,$60,$60,$60,$60,$60,$60,$60
			.byte $06,$06,$06,$06,$06,$06,$06,$06
			.byte $0,$0,$0,$0,$66,$66,$66,$66
			.byte $66,$66,$66,$66,0,0,0,0
			.byte $60,$60,$60,$60,$66,$66,$66,$66
			.byte $66,$66,$66,$66,$60,$60,$60,$60
			.byte $06,$06,$06,$06,$66,$66,$66,$66
			.byte $66,$66,$66,$66,$06,$06,$06,$06
			
			.byte $50,$50,$55,$55,$55,$55,$50,$50
			.byte $55,$55,$55,$55,$55,$55,$55,$55
			.byte $05,$05,$55,$55,$55,$55,$05,$05
			.byte $50,$50,$50,$50,$50,$50,$50,$50
			.byte $05,$05,$05,$05,$05,$05,$05,$05
			.byte $0,$0,$0,$0,$55,$55,$55,$55
			.byte $55,$55,$55,$55,0,0,0,0
			.byte $50,$50,$50,$50,$55,$55,$55,$55
			.byte $55,$55,$55,$55,$50,$50,$50,$50
			.byte $05,$05,$05,$05,$55,$55,$55,$55
			.byte $55,$55,$55,$55,$05,$05,$05,$05
			
			.byte $40,$40,$44,$44,$44,$44,$40,$40
			.byte $44,$44,$44,$44,$44,$44,$44,$44
			.byte $04,$04,$44,$44,$44,$44,$04,$04
			.byte $40,$40,$40,$40,$40,$40,$40,$40
			.byte $04,$04,$04,$04,$04,$04,$04,$04
			.byte $0,$0,$0,$0,$44,$44,$44,$44
			.byte $44,$44,$44,$44,0,0,0,0
			.byte $40,$40,$40,$40,$44,$44,$44,$44
			.byte $44,$44,$44,$44,$40,$40,$40,$40
			.byte $04,$04,$04,$04,$44,$44,$44,$44
			.byte $44,$44,$44,$44,$04,$04,$04,$04
			
			.byte $30,$30,$33,$33,$33,$33,$30,$30
			.byte $33,$33,$33,$33,$33,$33,$33,$33
			.byte $03,$03,$33,$33,$33,$33,$03,$03
			.byte $30,$30,$30,$30,$30,$30,$30,$30
			.byte $03,$03,$03,$03,$03,$03,$03,$03
			.byte $0,$0,$0,$0,$33,$33,$33,$33
			.byte $33,$33,$33,$33,0,0,0,0
			.byte $30,$30,$30,$30,$33,$33,$33,$33
			.byte $33,$33,$33,$33,$30,$30,$30,$30
			.byte $03,$03,$03,$03,$33,$33,$33,$33
			.byte $33,$33,$33,$33,$03,$03,$03,$03
			
			.byte $20,$20,$22,$22,$22,$22,$20,$20
			.byte $22,$22,$22,$22,$22,$22,$22,$22
			.byte $02,$02,$22,$22,$22,$22,$02,$02
			.byte $20,$20,$20,$20,$20,$20,$20,$20
			.byte $02,$02,$02,$02,$02,$02,$02,$02
			.byte $0,$0,$0,$0,$22,$22,$22,$22
			.byte $22,$22,$22,$22,0,0,0,0
			.byte $20,$20,$20,$20,$22,$22,$22,$22
			.byte $22,$22,$22,$22,$20,$20,$20,$20
			.byte $02,$02,$02,$02,$22,$22,$22,$22
			.byte $22,$22,$22,$22,$02,$02,$02,$02
			
			.byte $10,$10,$11,$11,$11,$11,$10,$10
			.byte $11,$11,$11,$11,$11,$11,$11,$11
			.byte $01,$01,$11,$11,$11,$11,$01,$01
			.byte $10,$10,$10,$10,$10,$10,$10,$10
			.byte $01,$01,$01,$01,$01,$01,$01,$01
			.byte $0,$0,$0,$0,$11,$11,$11,$11
			.byte $11,$11,$11,$11,0,0,0,0
			.byte $10,$10,$10,$10,$11,$11,$11,$11
			.byte $11,$11,$11,$11,$10,$10,$10,$10
			.byte $01,$01,$01,$01,$11,$11,$11,$11
			.byte $11,$11,$11,$11,$01,$01,$01,$01
			
			
			.proc main
			
			lda #>chr ;HighByte Character Pointer auf $2000 setzen
			sta ch
						
			ldy #127
loop			tya ;Die Charakter printen
			sta (savmsc),y
			dey
			bpl loop
			
			lda #192	;GTIA Modus 3 (16 Farben) initialisieren
			sta gprior
			lda #8	;Hintergrundfarbe / Helligkeit festlegen
			sta color4
			
			jmp *
			
			.endp
			
			run main
			

Damit baue ich jetzt die Landschaft.... falls die Charakter nicht reichen definiere ich mir einfach noch ein paar weitere ;-)

Re: Charon

Verfasst: 14.10.2021 20:43
von pps
Damit es noch übersichtlicher wird, kann man auch so schreiben:

Code: Alles auswählen

.he 00 fe fc fd 01 0a
Es gibt auch:

Code: Alles auswählen

.by $ff
und auch

Code: Alles auswählen

.wo $e477

Re: Charon

Verfasst: 14.10.2021 21:09
von Dr. Irata
gleich geändert... ja cool! MADS ist cool!!
Danke!

Re: Charon

Verfasst: 17.10.2021 13:11
von Dr. Irata
ich habe jetzt nochmal ein wenig mit dem Aufbau von WUDSN /MADS experimentiert und entsprechend den Code angepasst:

Code: Alles auswählen

			org $2000
			
			icl '../header.txt'
			icl 'character.asm'
			
			.proc main
			
			mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 (16 Farben) initialisieren
			mva #8 color4	;Hintergrundfarbe / Helligkeit festlegen
			
			;Die Charakter printen	
			ldy #127 
@			tya 
			sta (savmsc),y
			dey
			bpl @-
			
			
			jmp *
			
			.endp
			
			run main
			
			
die Charachterdatei sieht dann so aus:

Code: Alles auswählen

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

chr			.byte 0,0,0,0,0,0,0,0
			.byte $f0,$f0,$ff,$ff,$ff,$ff,$f0,$f0
			.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
			.byte $0f,$0f,$ff,$ff,$ff,$ff,$0f,$0f
			.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
			.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
			.byte $0,$0,$0,$0,$ff,$ff,$ff,$ff
			.byte $ff,$ff,$ff,$ff,0,0,0,0
			.byte $f0,$f0,$f0,$f0,$ff,$ff,$ff,$ff
			.byte $ff,$ff,$ff,$ff,$f0,$f0,$f0,$f0
			.byte $0f,$0f,$0f,$0f,$ff,$ff,$ff,$ff
			.byte $ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f
			
			.byte $b0,$b0,$bb,$bb,$bb,$bb,$b0,$b0
			.byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb
			.byte $0b,$0b,$bb,$bb,$bb,$bb,$0b,$0b
			.byte $b0,$b0,$b0,$b0,$b0,$b0,$b0,$b0
			.byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
			.byte $0,$0,$0,$0,$bb,$bb,$bb,$bb
			.byte $bb,$bb,$bb,$bb,0,0,0,0
			.byte $b0,$b0,$b0,$b0,$bb,$bb,$bb,$bb
			.byte $bb,$bb,$bb,$bb,$b0,$b0,$b0,$b0
			.byte $0b,$0b,$0b,$0b,$bb,$bb,$bb,$bb
			.byte $bb,$bb,$bb,$bb,$0b,$0b,$0b,$0b
			
			.byte $e0,$e0,$ee,$ee,$ee,$ee,$e0,$e0
			.byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee
			.byte $0e,$0e,$ee,$ee,$ee,$ee,$0e,$0e
			.byte $e0,$e0,$e0,$e0,$e0,$e0,$e0,$e0
			.byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
			.byte $0,$0,$0,$0,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,0,0,0,0
			.byte $e0,$e0,$e0,$e0,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,$e0,$e0,$e0,$e0
			.byte $0e,$0e,$0e,$0e,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,$0e,$0e,$0e,$0e
			
			.byte $d0,$d0,$dd,$dd,$dd,$dd,$d0,$d0
			.byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd
			.byte $0d,$0d,$dd,$dd,$dd,$dd,$0d,$0d
			.byte $d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
			.byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
			.byte $0,$0,$0,$0,$dd,$dd,$dd,$dd
			.byte $dd,$dd,$dd,$dd,0,0,0,0
			.byte $d0,$d0,$d0,$d0,$dd,$dd,$dd,$dd
			.byte $dd,$dd,$dd,$dd,$d0,$d0,$d0,$d0
			.byte $0d,$0d,$0d,$0d,$dd,$dd,$dd,$dd
			.byte $dd,$dd,$dd,$dd,$0d,$0d,$0d,$0d
			
			.byte $c0,$c0,$cc,$cc,$cc,$cc,$c0,$c0
			.byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc
			.byte $0c,$0c,$cc,$cc,$cc,$cc,$0c,$0c
			.byte $c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0
			.byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
			.byte $0,$0,$0,$0,$cc,$cc,$cc,$cc
			.byte $cc,$cc,$cc,$cc,0,0,0,0
			.byte $c0,$c0,$c0,$c0,$cc,$cc,$cc,$cc
			.byte $cc,$cc,$cc,$cc,$c0,$c0,$c0,$c0
			.byte $0c,$0c,$0c,$0c,$cc,$cc,$cc,$cc
			.byte $cc,$cc,$cc,$cc,$0c,$0c,$0c,$0c
			
			.byte $a0,$a0,$aa,$aa,$aa,$aa,$a0,$a0
			.byte $aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa
			.byte $0a,$0a,$aa,$aa,$aa,$aa,$0a,$0a
			.byte $a0,$a0,$a0,$a0,$a0,$a0,$a0,$a0
			.byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
			.byte $0,$0,$0,$0,$aa,$aa,$aa,$aa
			.byte $aa,$aa,$aa,$aa,0,0,0,0
			.byte $a0,$a0,$a0,$a0,$aa,$aa,$aa,$aa
			.byte $aa,$aa,$aa,$aa,$a0,$a0,$a0,$a0
			.byte $0a,$0a,$0a,$0a,$aa,$aa,$aa,$aa
			.byte $aa,$aa,$aa,$aa,$0a,$0a,$0a,$0a
			
			.byte $90,$90,$99,$99,$99,$99,$90,$90
			.byte $99,$99,$99,$99,$99,$99,$99,$99
			.byte $09,$09,$99,$99,$99,$99,$09,$09
			.byte $90,$90,$90,$90,$90,$90,$90,$90
			.byte $09,$09,$09,$09,$09,$09,$09,$09
			.byte $0,$0,$0,$0,$99,$99,$99,$99
			.byte $99,$99,$99,$99,0,0,0,0
			.byte $90,$90,$90,$90,$99,$99,$99,$99
			.byte $99,$99,$99,$99,$90,$90,$90,$90
			.byte $09,$09,$09,$09,$99,$99,$99,$99
			.byte $99,$99,$99,$99,$09,$09,$09,$09
			
			.byte $80,$80,$88,$88,$88,$88,$80,$80
			.byte $88,$88,$88,$88,$88,$88,$88,$88
			.byte $08,$08,$88,$88,$88,$88,$08,$08
			.byte $80,$80,$80,$80,$80,$80,$80,$80
			.byte $08,$08,$08,$08,$08,$08,$08,$08
			.byte $0,$0,$0,$0,$88,$88,$88,$88
			.byte $88,$88,$88,$88,0,0,0,0
			.byte $80,$80,$80,$80,$88,$88,$88,$88
			.byte $88,$88,$88,$88,$80,$80,$80,$80
			.byte $08,$08,$08,$08,$88,$88,$88,$88
			.byte $88,$88,$88,$88,$08,$08,$08,$08
			
			.byte $70,$70,$77,$77,$77,$77,$70,$70
			.byte $77,$77,$77,$77,$77,$77,$77,$77
			.byte $07,$07,$77,$77,$77,$77,$07,$07
			.byte $70,$70,$70,$70,$70,$70,$70,$70
			.byte $07,$07,$07,$07,$07,$07,$07,$07
			.byte $0,$0,$0,$0,$77,$77,$77,$77
			.byte $77,$77,$77,$77,0,0,0,0
			.byte $70,$70,$70,$70,$77,$77,$77,$77
			.byte $77,$77,$77,$77,$70,$70,$70,$70
			.byte $07,$07,$07,$07,$77,$77,$77,$77
			.byte $77,$77,$77,$77,$07,$07,$07,$07
			
			.byte $60,$60,$66,$66,$66,$66,$60,$60
			.byte $66,$66,$66,$66,$66,$66,$66,$66
			.byte $06,$06,$66,$66,$66,$66,$06,$06
			.byte $60,$60,$60,$60,$60,$60,$60,$60
			.byte $06,$06,$06,$06,$06,$06,$06,$06
			.byte $0,$0,$0,$0,$66,$66,$66,$66
			.byte $66,$66,$66,$66,0,0,0,0
			.byte $60,$60,$60,$60,$66,$66,$66,$66
			.byte $66,$66,$66,$66,$60,$60,$60,$60
			.byte $06,$06,$06,$06,$66,$66,$66,$66
			.byte $66,$66,$66,$66,$06,$06,$06,$06
			
			.byte $50,$50,$55,$55,$55,$55,$50,$50
			.byte $55,$55,$55,$55,$55,$55,$55,$55
			.byte $05,$05,$55,$55,$55,$55,$05,$05
			.byte $50,$50,$50,$50,$50,$50,$50,$50
			.byte $05,$05,$05,$05,$05,$05,$05,$05
			.byte $0,$0,$0,$0,$55,$55,$55,$55
			.byte $55,$55,$55,$55,0,0,0,0
			.byte $50,$50,$50,$50,$55,$55,$55,$55
			.byte $55,$55,$55,$55,$50,$50,$50,$50
			.byte $05,$05,$05,$05,$55,$55,$55,$55
			.byte $55,$55,$55,$55,$05,$05,$05,$05
			
			.byte $40,$40,$44,$44,$44,$44,$40,$40
			.byte $44,$44,$44,$44,$44,$44,$44,$44
			.byte $04,$04,$44,$44,$44,$44,$04,$04
			.byte $40,$40,$40,$40,$40,$40,$40,$40
			.byte $04,$04,$04,$04,$04,$04,$04,$04
			.byte $0,$0,$0,$0,$44,$44,$44,$44
			.byte $44,$44,$44,$44,0,0,0,0
			.byte $40,$40,$40,$40,$44,$44,$44,$44
			.byte $44,$44,$44,$44,$40,$40,$40,$40
			.byte $04,$04,$04,$04,$44,$44,$44,$44
			.byte $44,$44,$44,$44,$04,$04,$04,$04
			
			.byte $30,$30,$33,$33,$33,$33,$30,$30
			.byte $33,$33,$33,$33,$33,$33,$33,$33
			.byte $03,$03,$33,$33,$33,$33,$03,$03
			.byte $30,$30,$30,$30,$30,$30,$30,$30
			.byte $03,$03,$03,$03,$03,$03,$03,$03
			.byte $0,$0,$0,$0,$33,$33,$33,$33
			.byte $33,$33,$33,$33,0,0,0,0
			.byte $30,$30,$30,$30,$33,$33,$33,$33
			.byte $33,$33,$33,$33,$30,$30,$30,$30
			.byte $03,$03,$03,$03,$33,$33,$33,$33
			.byte $33,$33,$33,$33,$03,$03,$03,$03
			
			.byte $20,$20,$22,$22,$22,$22,$20,$20
			.byte $22,$22,$22,$22,$22,$22,$22,$22
			.byte $02,$02,$22,$22,$22,$22,$02,$02
			.byte $20,$20,$20,$20,$20,$20,$20,$20
			.byte $02,$02,$02,$02,$02,$02,$02,$02
			.byte $0,$0,$0,$0,$22,$22,$22,$22
			.byte $22,$22,$22,$22,0,0,0,0
			.byte $20,$20,$20,$20,$22,$22,$22,$22
			.byte $22,$22,$22,$22,$20,$20,$20,$20
			.byte $02,$02,$02,$02,$22,$22,$22,$22
			.byte $22,$22,$22,$22,$02,$02,$02,$02
			
			.byte $10,$10,$11,$11,$11,$11,$10,$10
			.byte $11,$11,$11,$11,$11,$11,$11,$11
			.byte $01,$01,$11,$11,$11,$11,$01,$01
			.byte $10,$10,$10,$10,$10,$10,$10,$10
			.byte $01,$01,$01,$01,$01,$01,$01,$01
			.byte $0,$0,$0,$0,$11,$11,$11,$11
			.byte $11,$11,$11,$11,0,0,0,0
			.byte $10,$10,$10,$10,$11,$11,$11,$11
			.byte $11,$11,$11,$11,$10,$10,$10,$10
			.byte $01,$01,$01,$01,$11,$11,$11,$11
			.byte $11,$11,$11,$11,$01,$01,$01,$01
			
und die Headerdatei:

Code: Alles auswählen

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8
sdlstl = $230 ;Start DisplayList
vscrol = $d405 ;vertikal scrol
wsync = $d40a 
Dabei nutze ich jetzt mehr die Möglichkeiten dieses Systems! Die Headerdatei habe ich ins Hauptverzeichnis geschoben und als txt abgespeichert - diese werde ich noch erweitern und sie steht allen Programmen dann zur Verfügung.
Die ganzen Characterdaten und später auch die Daten für die Landschaft kommen in eigene Dateien, damit der eigentliche Code besser lesbar und programmierbar wird.
Ich möchte zunehmend die Möglichkeiten von MADS nutzen, da die Befehle sinnvoll sind. Falls Fragen sind... einfach raus damit! Falls Verbesserungsvorschläge und Anregungen unserer "Profis" kommen... sehr sehr gerne!!

Damit habe ich jetzt Punkt 1 fertig und gehe direkt zu Punkt 2 über!!

LG und einen schönen Sonntag
Peter

Re: Charon

Verfasst: 22.10.2021 00:51
von Dr. Irata
es geht weiter...

Ich habe lange rumüberlegt wie ich das scrolling mache... so wie in meinem Basic-Listing mit 2 Bildschirmen und dann entsprechend umschalten der Displaylist - oder einfach den Bildschirm komplett grobscrollen um jeweils eine Zeile nach oben und dann das Feinscrolling dazu reinbauen... ich habe mich jetzt mal zunächst für Variante 2 entschieden und zuerst eine Routine fürs Grobscrollen des gesamten Bildschirmes nach oben um eine Zeile (und dann die Wiederholungen) geschrieben. Der Code ist relativ simple und bedarf noch der eleganten Anpassung wenn alles läuft.
Danach habe ich mir überlegt, wie ich die Landschaft aufbaue. Ich benötige 7 Bytes für eine Zeile und arbeite das dann im Code ab: Charakter xy x mal printen, Randcharakter xy 1 mal printen, 0 (also leer) x mal printen, Randcharakter yx 1 mal printen, Charakter yx y mal printen! Also 5 Schritte. Diese Routine bedarf sicherlich noch der Verfeinerung, läuft aber jetzt.
Dazu kommt die erste Landschaft für einen kompletten Bildschirm (muss noch schöner gemacht werden) und das wiederhole ich jetzt unendlich mal...
Listing:

Code: Alles auswählen

org $2000
			
			icl '../header.txt'
			icl 'character.asm'
			icl 'lands.asm'
			

			
			.proc main
			
			
			mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 (16 Farben) initialisieren
			mva #8 color4	;Hintergrundfarbe / Helligkeit festlegen
			ldx #0
			
lp1			mva savmsc var1
			mva savmsc+1 var1+1
			
						
						
			;Die letzte Reihe printen
			lda var1
			adc #32
			sta var1
			inc var1+1
			inc var1+1
			inc var1+1
			
			ldy lands,x ;Boarder1 holen
			
			sty var4
			inx
			lda lands,x

			iny
@			sta (var1),y ;Boarder1 printen
			dey
			bpl @-
			
			inx
			lda lands,x ;Rand Boarder1 holen
			ldy var4
			iny
			sty var4
			sta (var1),y ;Rand Boarder1 printen
			
			inx
			clc
			lda lands,x ;leer holen
			sta var3
			dec var3
			adc var4
			sta var4
			lda #0
@			ldy var4 ; leer printen
			sta (var1),y
			dey
			sty var4
			ldy var3
			dey
			sty var3
			bpl @-
			
			lda lands,x ;line counter refresh
			adc var4
			sta var4
			
			inx
			lda lands,x ;Rand Boarder2 holen
			ldy var4
			iny
			sty var4
			sta (var1),y ;Rand Boarder2 printen
			
			inx
			lda lands,x ;Boarder2 holen
			sta var3
			dec var3
			adc var4
			sta var4
			inx
			lda lands,x
@			ldy var4 ; Boarder2 printen
			sta (var1),y
			dey
			sty var4
			ldy var3
			dey
			sty var3
			bpl @-
			stx var3
						
			
			
bs			mva savmsc var1
			mva savmsc var2
			mva savmsc+1 var1+1
			mva savmsc+1 var2+1
			
			;Den Bildschirm um eins hoch

			ldx #21
@			mva var1+1 var2+1
			clc
			lda var1
			sta var2
			adc #$28
			sta var1
			bcc @+
			inc var1+1
			
@			ldy #$28
@			mva (var1),y (var2),y
			dey
			bpl @-
			
			dex
			bpl @-2
			
			ldx var3
			inx
			cpx #147
			bne lp3
			
						
			jmp main
			
lp3			jmp lp1
			
			.endp
			
			run main
			
			
und hier noch der code für lands:

Code: Alles auswählen

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

lands			.byte 9,2,3,20,6,9,2
			.byte 9,2,8,18,10,11,2
			.byte 9,2,8,17,10,12,2
			.byte 9,2,8,16,10,13,2
			.byte 9,2,8,15,10,15,2
			.byte 9,2,8,14,10,16,2
			.byte 9,2,8,13,10,17,2
			.byte 10,2,8,12,10,17,2
			.byte 11,2,8,11,10,18,2
			.byte 12,2,8,10,10,17,2
			.byte 13,2,8,10,10,15,2
			.byte 14,2,8,10,10,14,2
			.byte 14,2,8,10,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
der Header:

Code: Alles auswählen

ch = $2f4 ;High byte character set pointer
savmsc = $58
gprior = $26f
color4 = $2c8
sdlstl = $230 ;Start DisplayList
vscrol = $d405 ;vertikal scrol
wsync = $d40a 
var1 = $a0
var2 = $a2
var3 = $a4
var4 = $a6
character bleibt gleich...

kommende Probleme:
Die Daten der Landschaft bei >255 abrufen - da muss ich etwas tricksen
Feinscrolling reinmachen (als nächstes)

Chaos

Verfasst: 23.10.2021 09:09
von Dr. Irata
jetzt habe ich gestern den ganzen Abend vergeblich versucht das Feinscrolling zu fixen... und entweder es geht gar nicht oder es macht Chaos... noch habe ich keine Idee warum!! Vielleicht vertragen sich die beiden Routinen (Grobscrolling - eine Zeile hoch / Feinscrolling nicht).
Ich habe die Displaylist aufgebaut für Graphics 0 - die Zeilen auf 50 gesetzt damit Feinscrolling geht .... dann kommt aber Chaos! Noch weiss ich nicht, wo der Denkfehler ist....
Ich denke der Code muss komplett überarbeitet werden und vielleicht muss ich doch mit zwei Bildschirmen arbeiten und den Bildschirm über die Daten scrollen lassen...
puhhhh

hier der nicht funktionierende Code:

Code: Alles auswählen

org $2000
			
			icl '../header.txt'
			icl 'character.asm'
			icl 'lands.asm'
			icl 'dlist.asm'
			

			
			.proc main
			
			mva sdlstl var5
			mva sdlstl+1 var5+1
			
			ldy #0
			clc
@			lda dlist,y
			sta (var5),y
			iny
			cpy #32
			bne @-
			
			
			mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 (16 Farben) initialisieren
			mva #8 color4	;Hintergrundfarbe / Helligkeit festlegen
			
			
			
start		ldx #0
			clc
lp1			mva savmsc var1
			mva savmsc+1 var1+1
			
						
						
			;Die letzte Reihe printen
			lda var1
			adc #32
			sta var1
			inc var1+1
			inc var1+1
			inc var1+1
			
			ldy lands,x ;Boarder1 holen
			
			sty var4
			inx
			lda lands,x

			iny
@			sta (var1),y ;Boarder1 printen
			dey
			bpl @-
			
			inx
			lda lands,x ;Rand Boarder1 holen
			ldy var4
			iny
			sty var4
			sta (var1),y ;Rand Boarder1 printen
			
			inx
			clc
			lda lands,x ;leer holen
			sta var3
			dec var3
			adc var4
			sta var4
			lda #0
@			ldy var4 ; leer printen
			sta (var1),y
			dey
			sty var4
			ldy var3
			dey
			sty var3
			bpl @-
			
			lda lands,x ;line counter refresh
			adc var4
			sta var4
			
			inx
			lda lands,x ;Rand Boarder2 holen
			ldy var4
			iny
			sty var4
			sta (var1),y ;Rand Boarder2 printen
			
			inx
			lda lands,x ;Boarder2 holen
			sta var3
			dec var3
			adc var4
			sta var4
			inx
			lda lands,x
@			ldy var4 ; Boarder2 printen
			sta (var1),y
			dey
			sty var4
			ldy var3
			dey
			sty var3
			bpl @-
			stx var3
						
			
			
			mva savmsc var1
			mva savmsc var2
			mva savmsc+1 var1+1
			mva savmsc+1 var2+1
			
			;Feinscroll
			
			ldx #0
			
@			stx vscrol
			inx
			cpx #7
			bne @-
			
			
			
			;Den Bildschirm um eins hoch
			
			
			ldx #21
@	

			mva var1+1 var2+1
			clc
			lda var1
			sta var2
			adc #$28
			sta var1
			bcc @+
			inc var1+1
			
@			ldy #$28
@			mva (var1),y (var2),y
			dey
			bpl @-
			
			dex
			bpl @-2
			
			ldx var3
			inx
			cpx #147
			bne lp3
			

			
						
			jmp start
			



lp3
			
			
			
			jmp lp1
			
			.endp
			
			run main
			
			
die Displaylist:

Code: Alles auswählen

; Displaylist Graphics 0

dlist	.byte 112,112,112,114,64,156
		.byte 50,50,50,50,50,50,50,50,50,50,50,50
		.byte 50,50,50,50,50,50,50,50,50,50,50
		.byte 65,32,156
		
vielleicht hat ja irgendeiner die zündende Idee...
LG
Peter

Re: Charon

Verfasst: 23.10.2021 09:52
von Dr. Irata
... es liegt an der Displayliste... statt 50 muss 34 rein... glaube ich

Re: Charon

Verfasst: 23.10.2021 18:23
von pps
Also gerade bei DL ist es einfacher in HEX zu arbeiten.
Man sieht da deutlich, ob man spezielle Befehle oder einfache Grafikzeilen setzt.

z. B. :
$02 für Gfx 0 Zeile
$42 LMS +Gfx 0
$12 Hscrol + Gfx 0
$22 Vscrol + Gfx 0
$52 LMS + Hscrol + Gfx 0
$4F LMS + Gfx 8
$5E LMS + Hscrol + Gfx 15
$10 2 leere scan lines
$70 8 leere scanines
$F0 DLI + 8 leere scan lines
$80 DLI + 1 leere scan line
$C2 DLI + LMS + Gfx 0
etc.

... hoffe ich habe da jetzt aus dem Gedächtnis heraus nix vertauscht ;)

Re: Charon

Verfasst: 24.10.2021 17:06
von Kveldulfur
Hallo!

Ich habe folgendes geändert, damit eine Ausgabe kommt:

In charon.asm

Code: Alles auswählen

	.proc main
			
	mva sdlstl var5
	mva sdlstl+1 var5+1
	mva savmsc smemory 		; Bildschirmspeicheradresse in Displaylist eintragen
	mva savmsc+1 smemory+1


und in dlist.asm

Code: Alles auswählen

;@com.wudsn.ide.asm.mainsourcefile=charon.asm
; Displaylist Graphics 0

dlist	.byte $70,$70,$70,$62
smemory	.word $0000
	.byte $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
	.byte $22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
	.byte $41
	.word dlist
Ist aber immer noch ein Grobscrolling...

Re: Charon

Verfasst: 24.10.2021 21:44
von pps
Für das Feinscrollen muss natürlich auch an der richtigen Stelle (DLI am besten) das passende Hscrol oder Vscrol Register verändert werden ($D404 bzw. $D405).

Code: Alles auswählen

	.proc main
			
	mwa sdlstl var5
	mwa savmsc smemory 		; Bildschirmspeicheradresse in Displaylist eintragen
 
Das geht auch und macht den Source kürzer.

Re: Charon

Verfasst: 25.10.2021 00:13
von Dr. Irata
Lieben Dank für die interessanten Anregungen, die ich ab Montag in den Code einzubauen versuche.
Inzwischen habe ich den Fehler im Code gefunden (ein # fehlte) und die Displaylist entsprechend auch geändert (die Zeilen müssen von 2 auf $20 gesetzt werden) - damit wird dann der Vertikalfeinscroll aktiviert. Danach kann man im Register $d405 Werte von 0-7 eintragen, was den Feinscroll dann auslöst.
Den Code habe ich jetzt und es funktioniert... recht gut ... aber.... nicht perfekt. Feinscroll und Grobscroll laufen zeitlich ganz unterschiedlich und so musste ich Warteschleifen fürs Feinscroll einbauen, da das viel schneller abläuft. Dann geht es wirklich schön flüssig... leider... auch nicht perfekt. Ab und zu ruckelt es im Bildschirm.... ich optimiere den Code noch ein wenig und stelle es mal hier rein. Ich denke es ist. ein Zeitproblem und die Lösung wird folgende sein:
Ich arbeite doch mit zwei Bildschirmen, jede Scrollausführung passiert im nicht sichtbaren Bildschirm, sobald die Aktion vollendet ist, wird umgeschaltet in den sichtbaren Bereich usw. - ich denke das löst das kleine Ruckelproblem!
Vielleicht probiere ich den Code fürs Grobscrolling auch in den VBI zu packen, das könnte allerdings zeitkritisch werden...
LG
Peter

Re: Charon

Verfasst: 25.10.2021 00:18
von Dr. Irata
65680664407__0FD1F5A6-4902-4A70-9339-BEA8F306C72B.MOV
(2.25 MiB) 100-mal heruntergeladen

Re: Charon

Verfasst: 25.10.2021 00:35
von Mathy
.
Hallo Leute

Ich kenne mich mit Assembler nicht aus, kann mich aber aus Magazine aus USA erinnern das man beim Feinscrolling immer sieben (bin mir nicht ganz sicher, scheint mir aber Sinn zu machen) mal fein scrollen sollte und dann ein Mal grob. Ob das bei horizontales oder vertikales Scrolling oder beides gilt, kann Ich mich leider nicht erinnern. Ich vermute mal für beides.

Tschüß

Mathy

Re: Charon

Verfasst: 25.10.2021 09:15
von Dr. Irata
Hallo Mathy,
das ist ganz korrekt.
Im Register $D405 (für vertikal Feinscrolling) steht normalerweise 0. Ein normaler Character hat ja 8x8 Bit, wenn du nun z.B. eine 1 in das Register schreibst, dann scrolled der Rechner alle Zeichen einer Bildschirmzeile um ein Bit hoch... das macht man 7 x und dann setzt man es wieder auf 0 - damit fliegt wieder alles runter auf die Normalposition, wenn man jetzt ein Grobscrolling ausführt, ist der Ablauf einmal durchgeführt und fertig.
Das geht aber nur, wenn man vorher die DL ändert:
Wenn man sich jetzt die Displaylist für z.B. Gr.0 anschaut, dann startet die mit 3x 112 (Dezimal) - also 3 Leerzeilen mit der Höhe 8 Scanlines. Danach kommt 66,64,156
66 ist zusammengesetzt aus 64+2 - dabei bedeutet 64 Sprungbefehl und 2 bedeutet eine normale 8 Scanline Textzeile mit 8 Bit. Nach dem Sprungbefehl kommt 64,156 = 64+256*156 = 40000 --> hier steht der physikalische Ort der Bildschirmadresse. Änder ich diesen Sprungvektor, biege ich den Bildschirmstart woanders hin. Mit Änderung der Speicherstellen DL+5 und DL+6 (DL ist der Start der Displaylist) kann ich also in quasi Echtzeit zwischen beliebigen Bildschirmen wechseln. Nun kommen in der DL 23x die 2 - für die restlichen Zeilen und dann der Rücksprungbefehl zum Anfang der Displayliste (64,32,156 = 39968).
Die verschiedenen möglichen Anweisungen sind quasi in diesem einen Byte codiert, wobei hier Bit 6 wenn es gesetzt wird (64 Dezimal) bedeutet es wird ein Sprung ausgeführt zum nachfolgeden Vektor. In Bit 5 z.B. codiert man VSCROL - also wenn es gesetzt wird (Dezimal 32) kann dies Zeile mit Änderung des VSCROL-Register D405 fein gescrolled werden. Wenn ich jetzt also z.B. alle Zeile von Gr.0 von 2 auf 32+2 (also34) setze (DL+4 muss auf 64+2+32=98 Dezimal), dann kann ich alle 24 Zeile auf einmal scrollen. Das geht auch in Basic und hat nichts mit Assembler primär zu tun.

Re: Charon

Verfasst: 25.10.2021 12:50
von mp-one

Re: Charon

Verfasst: 26.10.2021 10:49
von Dr. Irata
Danke für den Link! Ich hatte mir die Seite vor Wochen schon mal angeschaut und war beeindruckt davon… leider findet man viele wichtigen include- Dateien nicht und dann läuft der Code natürlich nicht, was echt schade ist!!
LG Peter

Re: Charon

Verfasst: 26.10.2021 11:06
von mp-one
Hi Peter,

hattest du mal die GitHub-Repos dazu gecheckt?

https://github.com/playermissile

Unter "scrolling_tutorial -> View Code" sollten die Sourcen zu finden sein.

Grüße,

Michael

Re: Charon

Verfasst: 26.10.2021 18:20
von Dr. Irata
Danke Michael... gefunden!

Die Beispiele dort sind echt super und umfassend... eigentlich findet man da fast alles, was man für so einen Shooter braucht.... aber.... ich habe jetzt ja meinen eigenen Code geschrieben und möchte den auch primär verwenden. Das Feinscrolling läuft auch schon ganz gut und die Ruckler muss ich jetzt noch entfernen. Bislang habe ich auch alles hinbekommen und daraus lernt man ja immer am meisten!!
Meine Erkenntnis jetzt und hier: Das Feinscrolling ganz sauber zu programmieren ist ganz nicht so einfach und bedarf eines echt sauberen Codes mit gutem und richtigen Timing, ich denke die Ruckler kommen dadurch zustande, da mein Scrolling noch nicht mit dem VBI syncronisiert ist... so passiert es halt, daß das Programm auch mal scrollen will, während der VBI läuft und den Bildschirm kurz ausschaltet... also Lösung:
Entweder die Routine komplett während des VBI laufen lassen (wahrscheinlich zu lang), oder das ganze Scrolling im Hintergrund laufen zu lassen und den Bildschirm einfach umschalten wenn das Scrolling fertig ist. Das versuche ich als nächstes... jedenfalls ist es echt echt viel leichter ein Spiel zu programmieren, wo der Bildschirm fix ist :-)

Re: Charon

Verfasst: 28.10.2021 19:52
von Dr. Irata
... jetzt habe ich den eigenen Code mit Feinscrolling fertig und eigentlich läuft er... manchmal perfekt ganz ohne Ruckler, dann wieder kommen gleichmäßige Ruckler rein... kann mir das nicht erklären!!
Ich stelle mal den kompletten Code rein mit "includes" und zwei mov. Dateien wo man den Unterschied sieht. Vielleicht hat ja einer ne Idee... mit wsync bekomme ich es nicht gelöst!!

der Hauptcode:

Code: Alles auswählen

					org $2000
			
			icl '../header.txt'
			icl 'character.asm'
			icl 'lands.asm'
			icl 'dlist.asm'
			

			
			.proc main
			
			mva sdlstl var5
			mva sdlstl+1 var5+1
			
			
			
			ldy #0
			clc
@			lda dlist,y
			sta (var5),y
			iny
			cpy #34
			bne @-
			
			
			mva #>chr ch ;HighByte Character Pointer auf $2000 setzen
			mva #192 gprior	;GTIA Modus 3 (16 Farben) initialisieren
			mva #8 color4	;Hintergrundfarbe / Helligkeit festlegen
			
			
			
start		ldx #0
			clc
lp1			mva savmsc var1
			mva savmsc+1 var1+1
			
						
						
			;Die letzte Reihe printen
			lda var1
			adc #152
			sta var1
			inc var1+1
			inc var1+1
			inc var1+1
			
			ldy lands,x ;Boarder1 holen
			
			sty var4
			inx
			lda lands,x

			iny
@			sta (var1),y ;Boarder1 printen
			dey
			bpl @-
						inx
			lda lands,x ;Rand Boarder1 holen
			ldy var4
			iny
			sty var4
			sta (var1),y ;Rand Boarder1 printen
			inx
			clc
			lda lands,x ;leer holen
			sta var3
			dec var3
			adc var4
			sta var4
			lda #0
@			ldy var4 ; leer printen
			sta (var1),y
			dey
			sty var4
			ldy var3
			dey
			sty var3
			bpl @-
			
			lda lands,x ;line counter refresh
			adc var4
			sta var4
			
			inx
			lda lands,x ;Rand Boarder2 holen
			ldy var4
			iny
			sty var4
			
			sta (var1),y ;Rand Boarder2 printen
						inx
			lda lands,x ;Boarder2 holen
			sta var3
			dec var3
			adc var4
			sta var4
			inx
			lda lands,x
@			ldy var4 ; Boarder2 printen
			
			sta (var1),y
			dey
			sty var4
			ldy var3
			dey
			sty var3
			bpl @-
			stx var3
			
				
			
			
			mva savmsc var1
			mva savmsc var2
			mva savmsc+1 var1+1
			mva savmsc+1 var2+1
			
			;Feinscroll
			mva #4 delay
			jsr wartes
			
			
			
			mva #1 vscrol
			mva #2 delay
			jsr wartes
			
			
			mva #2 vscrol
			mva #2 delay
			jsr wartes
			
			
			mva #3 vscrol
			mva #2 delay
			jsr wartes
			
			mva #4 vscrol
			mva #2 delay
			jsr wartes
			
			
			mva #5 vscrol
			mva #2 delay
			jsr wartes
			
			
			mva #6 vscrol
			mva #2 delay
			jsr wartes
			
			
			mva #7 vscrol
			mva #2 delay
			jsr wartes
			
			mva #0 vscrol		
			
			
			
			
			
			;Den Bildschirm um eins hoch
			
				
			ldx #22
@	
			
			mva var1+1 var2+1
			clc
			lda var1
			sta var2
			adc #$28
			sta var1
			bcc @+
			inc var1+1
			
@			ldy #$28
@			mva (var1),y (var2),y
			dey
			bpl @-
			dex
			bpl @-2
			ldx var3
			inx
			cpx #147
			bne lp3
			
			

			
						
			jmp start
			




lp3			 
			
			
			
			
			
			jmp lp1
			
			.endp
			
wartes		
			clc
 		   	ldx delay ; Warteschleife
st  		lda RTCLOK+2    
wa   		cmp RTCLOK+2    
        	beq wa    
        	dex            
        	bpl st 
        	rts
			
			
			run main


der Header im Oberverzeichnis:

Code: Alles auswählen

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
var1 = $a0
var2 = $a2
var3 = $a4
var4 = $a6
var5 = $a8
delay = $b0
die "dlist":

Code: Alles auswählen

dlist				
			
        	
        .byte 112,112,112,98,64,156
		.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
lands:

Code: Alles auswählen

lands		.byte 9,2,2,20,6,9,2
			.byte 9,2,8,18,10,11,2
			.byte 9,2,8,17,10,12,2
			.byte 9,2,8,16,10,13,2
			.byte 9,2,8,15,10,15,2
			.byte 9,2,8,14,10,16,2
			.byte 9,2,8,13,10,17,2
			.byte 10,2,8,12,10,17,2
			.byte 11,2,8,11,10,18,2
			.byte 12,2,8,10,10,17,2
			.byte 13,2,8,10,10,15,2
			.byte 14,2,8,10,10,14,2
			.byte 14,2,8,10,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
			.byte 13,2,8,11,10,14,2
			.byte 13,2,8,11,10,14,2
			.byte 12,2,8,12,10,14,2
			.byte 11,2,8,12,10,15,2
character:

Code: Alles auswählen

		

chr			.byte 0,0,0,0,0,0,0,0
			.byte $f0,$f0,$ff,$ff,$ff,$ff,$f0,$f0
			.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
			.byte $0f,$0f,$ff,$ff,$ff,$ff,$0f,$0f
			.byte $f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0
			.byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
			.byte $0,$0,$0,$0,$ff,$ff,$ff,$ff
			.byte $ff,$ff,$ff,$ff,0,0,0,0
			.byte $f0,$f0,$f0,$f0,$ff,$ff,$ff,$ff
			.byte $ff,$ff,$ff,$ff,$f0,$f0,$f0,$f0
			.byte $0f,$0f,$0f,$0f,$ff,$ff,$ff,$ff
			.byte $ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f
			
			.byte $b0,$b0,$bb,$bb,$bb,$bb,$b0,$b0
			.byte $bb,$bb,$bb,$bb,$bb,$bb,$bb,$bb
			.byte $0b,$0b,$bb,$bb,$bb,$bb,$0b,$0b
			.byte $b0,$b0,$b0,$b0,$b0,$b0,$b0,$b0
			.byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
			.byte $0,$0,$0,$0,$bb,$bb,$bb,$bb
			.byte $bb,$bb,$bb,$bb,0,0,0,0
			.byte $b0,$b0,$b0,$b0,$bb,$bb,$bb,$bb
			.byte $bb,$bb,$bb,$bb,$b0,$b0,$b0,$b0
			.byte $0b,$0b,$0b,$0b,$bb,$bb,$bb,$bb
			.byte $bb,$bb,$bb,$bb,$0b,$0b,$0b,$0b
			
			.byte $e0,$e0,$ee,$ee,$ee,$ee,$e0,$e0
			.byte $ee,$ee,$ee,$ee,$ee,$ee,$ee,$ee
			.byte $0e,$0e,$ee,$ee,$ee,$ee,$0e,$0e
			.byte $e0,$e0,$e0,$e0,$e0,$e0,$e0,$e0
			.byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
			.byte $0,$0,$0,$0,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,0,0,0,0
			.byte $e0,$e0,$e0,$e0,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,$e0,$e0,$e0,$e0
			.byte $0e,$0e,$0e,$0e,$ee,$ee,$ee,$ee
			.byte $ee,$ee,$ee,$ee,$0e,$0e,$0e,$0e
			
			.byte $d0,$d0,$dd,$dd,$dd,$dd,$d0,$d0
			.byte $dd,$dd,$dd,$dd,$dd,$dd,$dd,$dd
			.byte $0d,$0d,$dd,$dd,$dd,$dd,$0d,$0d
			.byte $d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
			.byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
			.byte $0,$0,$0,$0,$dd,$dd,$dd,$dd
			.byte $dd,$dd,$dd,$dd,0,0,0,0
			.byte $d0,$d0,$d0,$d0,$dd,$dd,$dd,$dd
			.byte $dd,$dd,$dd,$dd,$d0,$d0,$d0,$d0
			.byte $0d,$0d,$0d,$0d,$dd,$dd,$dd,$dd
			.byte $dd,$dd,$dd,$dd,$0d,$0d,$0d,$0d
			
			.byte $c0,$c0,$cc,$cc,$cc,$cc,$c0,$c0
			.byte $cc,$cc,$cc,$cc,$cc,$cc,$cc,$cc
			.byte $0c,$0c,$cc,$cc,$cc,$cc,$0c,$0c
			.byte $c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0
			.byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
			.byte $0,$0,$0,$0,$cc,$cc,$cc,$cc
			.byte $cc,$cc,$cc,$cc,0,0,0,0
			.byte $c0,$c0,$c0,$c0,$cc,$cc,$cc,$cc
			.byte $cc,$cc,$cc,$cc,$c0,$c0,$c0,$c0
			.byte $0c,$0c,$0c,$0c,$cc,$cc,$cc,$cc
			.byte $cc,$cc,$cc,$cc,$0c,$0c,$0c,$0c
			
			.byte $a0,$a0,$aa,$aa,$aa,$aa,$a0,$a0
			.byte $aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa
			.byte $0a,$0a,$aa,$aa,$aa,$aa,$0a,$0a
			.byte $a0,$a0,$a0,$a0,$a0,$a0,$a0,$a0
			.byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
			.byte $0,$0,$0,$0,$aa,$aa,$aa,$aa
			.byte $aa,$aa,$aa,$aa,0,0,0,0
			.byte $a0,$a0,$a0,$a0,$aa,$aa,$aa,$aa
			.byte $aa,$aa,$aa,$aa,$a0,$a0,$a0,$a0
			.byte $0a,$0a,$0a,$0a,$aa,$aa,$aa,$aa
			.byte $aa,$aa,$aa,$aa,$0a,$0a,$0a,$0a
			
			.byte $90,$90,$99,$99,$99,$99,$90,$90
			.byte $99,$99,$99,$99,$99,$99,$99,$99
			.byte $09,$09,$99,$99,$99,$99,$09,$09
			.byte $90,$90,$90,$90,$90,$90,$90,$90
			.byte $09,$09,$09,$09,$09,$09,$09,$09
			.byte $0,$0,$0,$0,$99,$99,$99,$99
			.byte $99,$99,$99,$99,0,0,0,0
			.byte $90,$90,$90,$90,$99,$99,$99,$99
			.byte $99,$99,$99,$99,$90,$90,$90,$90
			.byte $09,$09,$09,$09,$99,$99,$99,$99
			.byte $99,$99,$99,$99,$09,$09,$09,$09
			
			.byte $80,$80,$88,$88,$88,$88,$80,$80
			.byte $88,$88,$88,$88,$88,$88,$88,$88
			.byte $08,$08,$88,$88,$88,$88,$08,$08
			.byte $80,$80,$80,$80,$80,$80,$80,$80
			.byte $08,$08,$08,$08,$08,$08,$08,$08
			.byte $0,$0,$0,$0,$88,$88,$88,$88
			.byte $88,$88,$88,$88,0,0,0,0
			.byte $80,$80,$80,$80,$88,$88,$88,$88
			.byte $88,$88,$88,$88,$80,$80,$80,$80
			.byte $08,$08,$08,$08,$88,$88,$88,$88
			.byte $88,$88,$88,$88,$08,$08,$08,$08
			
			.byte $70,$70,$77,$77,$77,$77,$70,$70
			.byte $77,$77,$77,$77,$77,$77,$77,$77
			.byte $07,$07,$77,$77,$77,$77,$07,$07
			.byte $70,$70,$70,$70,$70,$70,$70,$70
			.byte $07,$07,$07,$07,$07,$07,$07,$07
			.byte $0,$0,$0,$0,$77,$77,$77,$77
			.byte $77,$77,$77,$77,0,0,0,0
			.byte $70,$70,$70,$70,$77,$77,$77,$77
			.byte $77,$77,$77,$77,$70,$70,$70,$70
			.byte $07,$07,$07,$07,$77,$77,$77,$77
			.byte $77,$77,$77,$77,$07,$07,$07,$07
			
			.byte $60,$60,$66,$66,$66,$66,$60,$60
			.byte $66,$66,$66,$66,$66,$66,$66,$66
			.byte $06,$06,$66,$66,$66,$66,$06,$06
			.byte $60,$60,$60,$60,$60,$60,$60,$60
			.byte $06,$06,$06,$06,$06,$06,$06,$06
			.byte $0,$0,$0,$0,$66,$66,$66,$66
			.byte $66,$66,$66,$66,0,0,0,0
			.byte $60,$60,$60,$60,$66,$66,$66,$66
			.byte $66,$66,$66,$66,$60,$60,$60,$60
			.byte $06,$06,$06,$06,$66,$66,$66,$66
			.byte $66,$66,$66,$66,$06,$06,$06,$06
			
			.byte $50,$50,$55,$55,$55,$55,$50,$50
			.byte $55,$55,$55,$55,$55,$55,$55,$55
			.byte $05,$05,$55,$55,$55,$55,$05,$05
			.byte $50,$50,$50,$50,$50,$50,$50,$50
			.byte $05,$05,$05,$05,$05,$05,$05,$05
			.byte $0,$0,$0,$0,$55,$55,$55,$55
			.byte $55,$55,$55,$55,0,0,0,0
			.byte $50,$50,$50,$50,$55,$55,$55,$55
			.byte $55,$55,$55,$55,$50,$50,$50,$50
			.byte $05,$05,$05,$05,$55,$55,$55,$55
			.byte $55,$55,$55,$55,$05,$05,$05,$05
			
			.byte $40,$40,$44,$44,$44,$44,$40,$40
			.byte $44,$44,$44,$44,$44,$44,$44,$44
			.byte $04,$04,$44,$44,$44,$44,$04,$04
			.byte $40,$40,$40,$40,$40,$40,$40,$40
			.byte $04,$04,$04,$04,$04,$04,$04,$04
			.byte $0,$0,$0,$0,$44,$44,$44,$44
			.byte $44,$44,$44,$44,0,0,0,0
			.byte $40,$40,$40,$40,$44,$44,$44,$44
			.byte $44,$44,$44,$44,$40,$40,$40,$40
			.byte $04,$04,$04,$04,$44,$44,$44,$44
			.byte $44,$44,$44,$44,$04,$04,$04,$04
			
			.byte $30,$30,$33,$33,$33,$33,$30,$30
			.byte $33,$33,$33,$33,$33,$33,$33,$33
			.byte $03,$03,$33,$33,$33,$33,$03,$03
			.byte $30,$30,$30,$30,$30,$30,$30,$30
			.byte $03,$03,$03,$03,$03,$03,$03,$03
			.byte $0,$0,$0,$0,$33,$33,$33,$33
			.byte $33,$33,$33,$33,0,0,0,0
			.byte $30,$30,$30,$30,$33,$33,$33,$33
			.byte $33,$33,$33,$33,$30,$30,$30,$30
			.byte $03,$03,$03,$03,$33,$33,$33,$33
			.byte $33,$33,$33,$33,$03,$03,$03,$03
			
			.byte $20,$20,$22,$22,$22,$22,$20,$20
			.byte $22,$22,$22,$22,$22,$22,$22,$22
			.byte $02,$02,$22,$22,$22,$22,$02,$02
			.byte $20,$20,$20,$20,$20,$20,$20,$20
			.byte $02,$02,$02,$02,$02,$02,$02,$02
			.byte $0,$0,$0,$0,$22,$22,$22,$22
			.byte $22,$22,$22,$22,0,0,0,0
			.byte $20,$20,$20,$20,$22,$22,$22,$22
			.byte $22,$22,$22,$22,$20,$20,$20,$20
			.byte $02,$02,$02,$02,$22,$22,$22,$22
			.byte $22,$22,$22,$22,$02,$02,$02,$02
			
			.byte $10,$10,$11,$11,$11,$11,$10,$10
			.byte $11,$11,$11,$11,$11,$11,$11,$11
			.byte $01,$01,$11,$11,$11,$11,$01,$01
			.byte $10,$10,$10,$10,$10,$10,$10,$10
			.byte $01,$01,$01,$01,$01,$01,$01,$01
			.byte $0,$0,$0,$0,$11,$11,$11,$11
			.byte $11,$11,$11,$11,0,0,0,0
			.byte $10,$10,$10,$10,$11,$11,$11,$11
			.byte $11,$11,$11,$11,$10,$10,$10,$10
			.byte $01,$01,$01,$01,$11,$11,$11,$11
			.byte $11,$11,$11,$11,$01,$01,$01,$01
			

Re: Charon

Verfasst: 28.10.2021 19:54
von Dr. Irata
die beiden mov

Re: Charon

Verfasst: 30.10.2021 12:24
von Dr. Irata
Ich habe jetzt versucht den Code etwas zu verschlanken beim Grobscroll in der Hoffnung, daß es nicht mehr ruckelt... ohne Erfolg.
Die mögliche Lösung, den Grobscroll in einem nicht sichtbaren 2. Bildschirm zu machen und dann die Displaylist einfach jeweils umzuschalten, wäre wohl die Lösung und wollte ich heute umsetzen - da fiel mir aber zufällig auf, daß ich in den Einstellungen des Emulators NTSC 60 Hz eingestellt habe - also die etwas zeitaufwendigere Version des Bildschirmaufbaus - umgestellt auf PAL 50 Hz... und schon ist das gelegentliche Flackern komplett weg. Der Atari hat jetzt einfach etwas mehr Zeit und Power für den Code...
Nun kann ich weitermachen!
Zunächst werde ich jetzt den Aufbau der letzten Reihe - also der Landschaft komplett umprogrammieren, da ich ja aktuell nur 255 Informationen lesen kann (7 pro Zeile - also ca. 36 Zeilen) ... das würde ja nur für 1,5 Bildschirmlängen reichen und ich plane ein Landschaft mit 120-150 Bildschirmlängen - also ein Spiel, was ca. 10-15 Minuten am Stück durchscrollen könnte. Das ist auch der Grund, warum ich den Aufbau der letzten Zeile so "kompliziert" mache... einfach um Informationen / Platz zu sparen. Ich brauche so nur 7 statt 40 Byte pro Zeile. Später wird noch etwas dazukommen wegen der PM.
Danach programmiere ich den ersten Player - also das Raumschiff mit entsprechender Joystickabfrage, Steuerung und Kollisionsabfrage... mal sehen was da so alles an "Problemen" auf mich zukommt ;-)
LG Peter

update: Theorie und Praxis... was auf dem iMac funktioniert hat auf dem MacBook keinen positiven Einfluss... trotz 50 Hz ruckelt es noch... ich muss es wohl doch mit 2 Bildschirmen machen ...

Re: Charon

Verfasst: 30.10.2021 14:21
von Kveldulfur
Hallo!

Wenn das ganze so zeitkritisch ist, würde ich es auch einmal auf echter Hardware testen. Nicht das Du nachher ein Spiel rein für den Emulator geschrieben hast.

Grüße
Janko

Re: Charon

Verfasst: 01.11.2021 17:37
von Dr. Irata
neues update:

Ich habe jetzt wegen der Probleme mit dem Grobscroll (also Verschieben des kompletten Bildschirmes um eine Zeile nach unten) die Routine umprogrammiert bzw. erweitert:
Ich nutze jetzt 2 Bildschirme - die letzte Zeile und das feinscroll geschieht auf dem sichtbaren Bildschirm, dann wird alles auf den unsichtbaren Bildschirm kopiert und zwar so, daß automatisch auch der grobscroll mit drin ist, anschließend schalte ich den unsichtbaren Bildschirm in der Displaylist auf sichtbar und das wiederholt sich dann ...
Das hat mich den halben Montag gekostet und funktioniert jetzt sauber und ganz ohne "ruckeln".
Ich werde jetzt den Code noch verfeinern und dann hier reinsetzen, wenn erwünscht!

LG
Peter

Re: Charon

Verfasst: 02.11.2021 15:02
von Kveldulfur
Prodehl hat geschrieben:
01.11.2021 17:37
Ich werde jetzt den Code noch verfeinern und dann hier reinsetzen, wenn erwünscht!
Ja, natürlich. Sonst kann man ja den Fortschritt nicht nachvollziehen. :)