Return to Phobos
Moderator: Rockford
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
....
die letzten Tage habe ich wieder an der Explosion und speziell heute an den Schüssen rumgebastelt...
Ziele sind folgende:
1. Die Explosion muss noch genauer werden - hier sind noch Fehler bei der genauen Erkennung der Position der Items und eigentlich sollen die Explosionen auch während des Scrolling fortwährend laufen und nicht direkt komplett, was ja immer einen kleinen Stopp bedeutet.
2. Ich habe das blinken umgebaut und überwiegend aus dem VBI rausgeholt - funktioniert ganz gut - und habe jetzt 4 Schüsse zur Verfügung.
Diese sollen im Wechsel rechts und links laufen und auch durchaus gleichzeitig. Das ganze muss so gestaltet werden, daß auch hier der VBI entlastet wird, da ich ihn noch für Sound brauche.
zu 1: Das habe ich leider noch nicht hinbekommen. Die momentane Idee ist folgende: Ich brauche 12 Charakter für die Explosion und habe 4 Animationsphasen. Die lasse ich ständig laufen im Hintergrund und bei einem Treffer werden die 12 Charakter fürs Item mit den 12 Charaktern der Explosion überschrieben - das Scrolling geht dann automatisch weiter und ich muss mich nicht ums Timing kümmern. Da können dann auch mehrere Explosionen nebeneinander laufen - Problem ist dann nur der Start-/ und Endpunkt der Explosion.... dafür habe ich noch keine Lösung!
zu 2: Ich habe heute die Schüsse komplett umgebaut. Die Joystickabfrage (Strig0) und das Setzen der benötigten Parameter für den jeweiligen Schuss kann ich im Hauptprogramm machen - mache ich redundant im Feinscroll und an anderen Stellen. Aber die eigentliche Bewegung des Schusses geht quasi nur im VBI da sonst der Schuss viel zu langsam ist... und hier bekomme ich wieder ein Zeit- und Kapazitätsproblem im VBI. Ein Schuss kein Problem, 2 Schüsse geht auch noch ist aber tricky, 4 Schüsse unabhängig ... puh... da steigt mir der VBI aus. Da habe ich einfach zu viele Bedingungen und Abfragen.... das muss doch einfach und schlank gehen !!!!!
Meine letzte Idee ist nun folgende: Alle 4 Schüsse laufen ständig unabhängig mit einer relativ schlanken Routine ständig im Hintergrund im VBI von oben nach unten durch - kommt dann der Impuls (durch Strig0) für einen Schuss, verändere ich einfach die x und y- Parameter für den jeweiligen Schuss und er wird sichtbar (x) und startet in Höhe Abschuss vom Raumschiff (y).
Das will ich jetzt mal die Tage umsetzen...
Vielleicht hat ja jemand für beide Probleme auch die zündende und bessere Idee wie man es am besten macht, denn wenn ich mir die ganzen Spiele so anschaue, muss das doch eigentlich ganz easy sein!
Grüße
Peter
die letzten Tage habe ich wieder an der Explosion und speziell heute an den Schüssen rumgebastelt...
Ziele sind folgende:
1. Die Explosion muss noch genauer werden - hier sind noch Fehler bei der genauen Erkennung der Position der Items und eigentlich sollen die Explosionen auch während des Scrolling fortwährend laufen und nicht direkt komplett, was ja immer einen kleinen Stopp bedeutet.
2. Ich habe das blinken umgebaut und überwiegend aus dem VBI rausgeholt - funktioniert ganz gut - und habe jetzt 4 Schüsse zur Verfügung.
Diese sollen im Wechsel rechts und links laufen und auch durchaus gleichzeitig. Das ganze muss so gestaltet werden, daß auch hier der VBI entlastet wird, da ich ihn noch für Sound brauche.
zu 1: Das habe ich leider noch nicht hinbekommen. Die momentane Idee ist folgende: Ich brauche 12 Charakter für die Explosion und habe 4 Animationsphasen. Die lasse ich ständig laufen im Hintergrund und bei einem Treffer werden die 12 Charakter fürs Item mit den 12 Charaktern der Explosion überschrieben - das Scrolling geht dann automatisch weiter und ich muss mich nicht ums Timing kümmern. Da können dann auch mehrere Explosionen nebeneinander laufen - Problem ist dann nur der Start-/ und Endpunkt der Explosion.... dafür habe ich noch keine Lösung!
zu 2: Ich habe heute die Schüsse komplett umgebaut. Die Joystickabfrage (Strig0) und das Setzen der benötigten Parameter für den jeweiligen Schuss kann ich im Hauptprogramm machen - mache ich redundant im Feinscroll und an anderen Stellen. Aber die eigentliche Bewegung des Schusses geht quasi nur im VBI da sonst der Schuss viel zu langsam ist... und hier bekomme ich wieder ein Zeit- und Kapazitätsproblem im VBI. Ein Schuss kein Problem, 2 Schüsse geht auch noch ist aber tricky, 4 Schüsse unabhängig ... puh... da steigt mir der VBI aus. Da habe ich einfach zu viele Bedingungen und Abfragen.... das muss doch einfach und schlank gehen !!!!!
Meine letzte Idee ist nun folgende: Alle 4 Schüsse laufen ständig unabhängig mit einer relativ schlanken Routine ständig im Hintergrund im VBI von oben nach unten durch - kommt dann der Impuls (durch Strig0) für einen Schuss, verändere ich einfach die x und y- Parameter für den jeweiligen Schuss und er wird sichtbar (x) und startet in Höhe Abschuss vom Raumschiff (y).
Das will ich jetzt mal die Tage umsetzen...
Vielleicht hat ja jemand für beide Probleme auch die zündende und bessere Idee wie man es am besten macht, denn wenn ich mir die ganzen Spiele so anschaue, muss das doch eigentlich ganz easy sein!
Grüße
Peter
- Kveldulfur
- Beiträge: 624
- Registriert: 17.08.2021 02:32
- Has thanked: 239 times
- Been thanked: 163 times
- Kontaktdaten:
Re: Return to Phobos
Hallo!
Ich habe so eine Routine für Missiles zwar noch nicht geschrieben, stelle es mir aber wie folgt vor:
Wenn nun im Hauptprogramm festgestellt wird, dass geschossen wurde, bereitet man einen freien Missile vor, indem man ihn an die richtige Position setzt und setzt sta missile,x auf den y-Wert des Schusses. Die Routine erkennt nun dass der Missile bewegt werden muss.
Man kann im Hauptprogramm die Kollision abfragen und dann auswerten."missile" sollte auf 0 gesetzt werden, wenn der Schuss den untern Rand erreicht hat oder ein Treffer erfolgte.
Ich hoffe Du kannst meinen Gedanken folgen und es hilft Dir weiter.
Janko
Ich habe so eine Routine für Missiles zwar noch nicht geschrieben, stelle es mir aber wie folgt vor:
Code: Alles auswählen
missile .byte $00, $00, $00, $00 ; vier Schüsse
..
..
..
.proc Schuessebewegen
ldy $00
lp ldx missile,y ; Lade Y-Position Schuss 0-3
cpx #$00
bne mv ; Wenn ungleich 0 muss der Missile bewegt werden
nx iny ; Schussnr. hochzählen
cpy #$04 ; max. 4 sind vorhanden
bne lp ; Wenn der letzte Schuss noch nicht bearbeitet, zurück
rts ; Unterroutine für Schüsse beendet
mv tya ; y retten
pha ; Unterroutine um den Schuss einen Schritt zu bewegen
..
..
..
pla ; y zurück holen
tay
jmp nx ; nächsten Schuss bearbeiten
.end
Wenn nun im Hauptprogramm festgestellt wird, dass geschossen wurde, bereitet man einen freien Missile vor, indem man ihn an die richtige Position setzt und setzt sta missile,x auf den y-Wert des Schusses. Die Routine erkennt nun dass der Missile bewegt werden muss.
Man kann im Hauptprogramm die Kollision abfragen und dann auswerten."missile" sollte auf 0 gesetzt werden, wenn der Schuss den untern Rand erreicht hat oder ein Treffer erfolgte.
Ich hoffe Du kannst meinen Gedanken folgen und es hilft Dir weiter.
Janko
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Hallo Janko und vielen Dank für deinen kreativen Lösungsansatz!
So ähnlich wie du es schreibst, habe ich es auch jetzt vor!
Allerdings möchte ich so wenig Abfragen und Bedingungen in die Missileroutine im VBI reinpacken wie möglich.
Rein theoretisch sollte es ja zu 4 Schüssen gleichzeitig kommen können, daher muss der VBI das auch zeitlich abarbeiten können - sonst macht es keinen Sinn. Dann kann das aber auch ständig im Hintergrund laufen und ich mache es nur jeweils (durch x-Positionierung) sichtbar.
Also alle 4 Missiles laufen ständig vom Bildschirmoberrand zum Unterrand - wenn der Unterrand erreicht wird, dann startet der Missile wieder von oben. Die X-Position wird auf 0 gesetzt - also sieht man die Missiles primär nicht. Die Joystickabfrage läuft im Hauptprogramm (das packe ich in die Feinscrollroutine, da ich hier noch Zeit habe und eh mit einer Warteschleife verzögern muss) - sobald der Feuerknopf gedrückt wurde kommt der entsprechende Werte in die y-Position und x-Position des jeweiligen Missile und er wird sichtbar. Läuft er nach ganz unten oder an den Boarderrand geht x auf Null und der Missile wird wieder unsichtbar - passiert eine Kollision mit einem Item startet die Explosionsroutine. Entsprechend läuft das mit den anderen drei Missiles....
So ähnlich wie du es schreibst, habe ich es auch jetzt vor!
Allerdings möchte ich so wenig Abfragen und Bedingungen in die Missileroutine im VBI reinpacken wie möglich.
Rein theoretisch sollte es ja zu 4 Schüssen gleichzeitig kommen können, daher muss der VBI das auch zeitlich abarbeiten können - sonst macht es keinen Sinn. Dann kann das aber auch ständig im Hintergrund laufen und ich mache es nur jeweils (durch x-Positionierung) sichtbar.
Also alle 4 Missiles laufen ständig vom Bildschirmoberrand zum Unterrand - wenn der Unterrand erreicht wird, dann startet der Missile wieder von oben. Die X-Position wird auf 0 gesetzt - also sieht man die Missiles primär nicht. Die Joystickabfrage läuft im Hauptprogramm (das packe ich in die Feinscrollroutine, da ich hier noch Zeit habe und eh mit einer Warteschleife verzögern muss) - sobald der Feuerknopf gedrückt wurde kommt der entsprechende Werte in die y-Position und x-Position des jeweiligen Missile und er wird sichtbar. Läuft er nach ganz unten oder an den Boarderrand geht x auf Null und der Missile wird wieder unsichtbar - passiert eine Kollision mit einem Item startet die Explosionsroutine. Entsprechend läuft das mit den anderen drei Missiles....
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
... hier nun das erste Ergebnis:
Ich habe zunächst ein Missile umgesetzt. Die Routine im VBI sieht. nun extrem abgespeckt so aus:
Alles andere läuft im Hauptprogramm. Die Joystickabfrage für den Schuss und das Setzen der Parameter.
Ich habe den Schuss zur Kontrolle noch sichtbar am linken Bildrand mitlaufen lassen und man sieht im Video sehr schön, daß der Schuss ständig läuft und wegen des schlanken Codes den VBI praktisch gar nicht belastet. Drückt man den Feuerknopf, wird die Position auf x und y verändert und der Schuss wird sichtbar bis der untere Rand erreicht ist - dann geht die x Position wieder auf den hier noch gerade sichtbaren Bereich am linken Rand. Beim finalen Spiel wandert der dann natürlich ganz raus. Es sind noch ein paar Fehler drin und die Kollisionsabfrage muss noch rein!
Außerdem muss noch eine intelligente Steuerung der 4 Schüsse rein, die einmal abgefeuert ja bis nach unten oder bis zur Kollision durchlaufen müssen.
Hier das kurze Video:#
Peter
Ich habe zunächst ein Missile umgesetzt. Die Routine im VBI sieht. nun extrem abgespeckt so aus:
Alles andere läuft im Hauptprogramm. Die Joystickabfrage für den Schuss und das Setzen der Parameter.
Ich habe den Schuss zur Kontrolle noch sichtbar am linken Bildrand mitlaufen lassen und man sieht im Video sehr schön, daß der Schuss ständig läuft und wegen des schlanken Codes den VBI praktisch gar nicht belastet. Drückt man den Feuerknopf, wird die Position auf x und y verändert und der Schuss wird sichtbar bis der untere Rand erreicht ist - dann geht die x Position wieder auf den hier noch gerade sichtbaren Bereich am linken Rand. Beim finalen Spiel wandert der dann natürlich ganz raus. Es sind noch ein paar Fehler drin und die Kollisionsabfrage muss noch rein!
Außerdem muss noch eine intelligente Steuerung der 4 Schüsse rein, die einmal abgefeuert ja bis nach unten oder bis zur Kollision durchlaufen müssen.
Hier das kurze Video:#
Peter
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Heute habe ich an den Schüssen gearbeitet und alle 4 Schüsse funktionieren jetzt gut. Der Hauptcode liegt im Hauptprogramm und der VBI ist schlank und wenig belastet. Leider habe ich schon das nächste massive Problem...
Aber hier erstmal der Code vom VBI und vom Hauptprogramm:
und noch ein kleines Video:
Aber hier erstmal der Code vom VBI und vom Hauptprogramm:
Code: Alles auswählen
;@com.wudsn.ide.asm.mainsourcefile=r2phobos.asm
;vertical blank interrupt fr Joystick / PM
.proc vbinter
pha
txa
pha
tya
pha
mva #0 atract ;Bildschirmschoner aus
clc ;Kollisionen abfragen
lda p0pf
cmp #1
bcc @+
mva #1 kollp0
@
clc ;Joystickabfragen Player1
lda stick0
cmp #15 ;keine Joystickaktion
bcs @+
cmp #14
bcs nachob
cmp #13
bcs nachun
cmp #11
bcs nachli
cmp #10
bcs nachliob
cmp #9
bcs nachliun
sec
cmp #7
bcs nachre
cmp #6
bcs nachreob
cmp #5
bcs nachreun
@ jmp write
nachre clc
lda xposp1
cmp #192
bcs @+
inc xposp1
@ jmp write
nachreun
clc
lda xposp1
cmp #192
bcs @+
inc xposp1
@ jmp nachun
nachreob
clc
lda xposp1
cmp #192
bcs @+
inc xposp1
@ jmp nachob
nachli sec
lda xposp1
cmp #49
bcc @+
dec xposp1
@ jmp write
nachliun
sec
lda xposp1
cmp #49
bcc @+
dec xposp1
@ jmp nachun
nachliob
sec
lda xposp1
cmp #49
bcc @+
dec xposp1
@ jmp nachob
nachob
dec yposp1
clc
ldy yposp1 ;verticale Startpos. Player 1 + füllen
ldx #0
@ lda pm1,x
sta (play1),y
iny
inx
cpx #14
bne @-
jmp write
nachun
inc yposp1
clc
ldy yposp1 ;verticale Startpos. Player 1 + füllen
ldx #0
@ lda pm1,x
sta (play1),y
iny
inx
cpx #14
bne @-
jmp write
clc
write sec
lda xposp1 ;x-Position der Player setzen
sta hposp0
sbc #0
sta hposp2
adc #2
sta hposp3
ldy yposp1 ;Player printen
clc
lda blink
tax
dey
mva #0 lms2
@ lda pm41,x
sta (play4),y
lda pm42,x
sta (play3),y
iny
inx
inc lms2
lda lms2
cmp #14
bne @-
;Schüsse laufen ständig
jsr schuesse
mva m0pf kollm1
mva m1pf kollm2
mva m2pf kollm3
mva m3pf kollm4
mva #1 hitclr
;-------------------------------------------------------------
pla
tay
pla
tax
pla
jmp xitvbv ;vb-interrupt wird über xitvbv beendet!!
.endp
Code: Alles auswählen
org $2000
icl '../hardware.txt'
icl 'header.txt'
icl 'character.asm'
icl 'lands.asm'
.proc dlist
.by 112,112,112,100
.by 30,75
:21 .by 36
:5 .by 4
.by 65
.wo dlist
.endp
icl 'pmg_vars.asm'
.proc main
main1 mwa #dlist 560
mva #10 yposp1
mva #120 xposp1
mva #42 yposm1
mva #0 xposm1
mva #94 yposm2
mva #49 xposm2
mva #0 tank1x
mva #0 tank1y
mva #151 fuelzaehleritem
mva #0 fuelzaehler
jsr text
Start1 mva #>chr chbas ;HighByte Character Pointer auf $2000 setzen
mva #192 gprior ;GTIA Modus 3
mva #12 color3 ;Schriftfarbe
mva #220 color1 ;Gelb
mva #153 color0 ;Blau
;mva #52 color0 ;Rot
mva #180 color2 ; Grün
mva #0 color4 ;Hintergrundfarbe
lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1 \ sta feuer6
; Player vorbereiten und initialisieren
; Kollisionen: 4 = Grün 2 = Gelb
lda ramtop
sec
sbc #16
sta pmbase
clc
adc #3
sta miss1+1
sta miss2+1
sta miss3+1
sta miss4+1
adc #1
sta play1+1
adc #2
sta play3+1
adc #1
sta play4+1
lda #9
sta play4
lda #3
sta play3
mva #62 sdmctl
mva #56 pcolr0
mva #15 pcolr1
mva #119 pcolr2
mva #191 pcolr3
mva #1 gprior
mva #3 gractl
mva #1 sizep0
mva #1 sizep1
mva #1 sizep2
mva #0 sizem
mva #0 rechts
mva #2 hitclr
mva #48 blink
mva #40 p1pf
mva #8 hposm0
mva #8 hposm1
mva #8 hposm2
mva #8 hposm3
mva #1 yschuss1
mva #11 yschuss2
mva #22 yschuss3
mva #33 yschuss4
mva #1 schussi
main2 mva <lands var6
mva >lands var6+1
mva #0 kollp0
ldy #255 ;Speicher Player 1 leeren
lda #0
sta play1
@ sta (play1),y
sta (play4),y
sta (play3),y
dey
bpl @-
clc
ldy yposp1 ;verticale Startpos. Player 1 + füllen
ldx #0
@ lda pm1,x
sta (play1),y
iny
inx
cpx #14
bne @-
clc
ldy #0
ldx #0
ldx #>vbinter ;VB-Interrupt VektorHi
ldy #<vbinter ;VB-Interrupt VektorLo
lda #7 ;Deferred Mode mit lda #7 festlegen
jsr setvbv ;Vektor für die eigene Routine über setvbv eintragen
hauptprogramm
#if .byte yschuss1>#207 .or .byte kollm1=#4
ldy yschuss1
dey
lda #0
sta (miss1),y
iny
sta (miss1),y
mva #8 hposm0
mva #1 hitclr
#end
#if .byte yschuss2>#207 .or .byte kollm2=#4
ldy yschuss2
dey
lda #0
sta (miss1),y
iny
sta (miss1),y
mva #8 hposm1
mva #1 hitclr
#end
#if .byte yschuss3>#207 .or .byte kollm3=#4
dey
lda #0
sta (miss1),y
iny
sta (miss1),y
mva #8 hposm2
mva #1 hitclr
#end
#if .byte yschuss4>#207 .or .byte kollm4=#4
ldy yschuss4
dey
lda #0
sta (miss1),y
iny
sta (miss1),y
mva #1 hitclr
mva #8 hposm3
#end
lda blink2
adc #59
sta blink2
#if .byte blink2>=#0 .and .byte blink2<#60
mva #0 blink
#end
#if .byte blink2>=#60 .and .byte blink2<#120
mva #14 blink
#end
#if .byte blink2>=#120 .and .byte blink2<=#180
mva #28 blink
#end
#if .byte blink2>=#180 .and .byte blink2<=#255
mva #42 blink
#end
clc
lda kollp0
cmp #1
bcc @+
mva #0 kollp0
@
jsr letztereihe ;letzte Reihe (lands) Bildschirm1 printen (sichtbar)
jsr feinscroll ;Feinscroll Bildschirm1 ausführen (sichtbar)
mva #$30 var1 ;var1 auf 30000 ($7530) setzen
mva #$75 var1+1
mva #$E4 var2 ;var2 auf 31460 ($7AE4) setzen
mva #$7A var2+1
jsr grobscroll ;Bildschirm1 kopieren + grobscroll
mva #$0C var1 ;var1 + var2 auf 31500 ($7B0C) setzen
mva #$0C var2
mva #$7B var1+1
mva #$7B var2+1
jsr schusslogik
jsr umschalten
inc fuelzaehleritem
lda fuelzaehler
tax
lda fuelzaehleritem
sta 31043,x
sta 32543,x
#if .byte fuelzaehleritem=#155
mva #151 fuelzaehleritem
inc fuelzaehler
#end
#if .byte fuelzaehler>#200
mva #0 fuelzaehler
#end
#if .byte fuelzaehler=#20
mva #52 color3
#end
#if .byte fuelzaehler>#34 .and .byte fuelzaehler<#200
;jmp main1
mva #0 fuelzaehler ;Fuel zuende Neustart
#end
jsr letztereihe
jsr feinscroll ;Feinscroll Bildschirm2 ausführen (sichtbar)
mva #$08 var2 ;var1 auf 29960 ($7508) setzen
mva #$75 var2+1
mva #$0C var1 ;var2 auf 31500 ($7B0C) setzen
mva #$7B var1+1
#if .byte kollges=#4
mva #15 color3
sec
lda fuelzaehler
sbc #10
sta fuelzaehler
tax
mva #151 fuelzaehleritem
clc
lda fuelzaehleritem
@ sta 31043,x
sta 32543,x
inx
cpx #36
bne @-
jsr kollitem
mva #0 kollm1
#end
mva #$08 var2 ;var1 auf 29960 ($7508) setzen
mva #$75 var2+1
mva #$0C var1 ;var2 auf 31500 ($7B0C) setzen
mva #$7B var1+1
jsr grobscroll ;;Bildschirm2 kopieren + grobscroll
mva #$30 var1 ;var1 + var2 auf 30000 ($7530) setzen
mva #$30 var2
mva #$75 var1+1
mva #$75 var2+1
jsr schusslogik
jsr umschalten ;umschalten auf Bildschirm1 - Bildschirm1 wird sichtbar
inc fuelzaehleritem
lda fuelzaehler
tax
lda fuelzaehleritem
sta 31043,x
sta 32543,x
#if .byte fuelzaehleritem=#155
mva #151 fuelzaehleritem
inc fuelzaehler
#end
;Ende der Bildschirmausführung / Kontrolle Durchläufe
sec
lda #45 ; - 36 = Anzahl der Durchläufe - auf 4 beschränkt, da die Landschaft noch rudimentär ist und sich dann wiederholen soll
sbc var6+1
bpl @+
jmp start1 ;Stop hier
@
jmp hauptprogramm ;weiter
.endp
; _____________________________________________________________________________________
;
; ---------------------------- S U B R O U T I N E N ----------------------------------
; _____________________________________________________________________________________
icl 'VBI.asm'
; -------------------------------------------------------------------------------------
.proc kollision
ldx #0
clc
@ inx
cpx #255
bcc @-
rts
.endp
; -------------------------------------------------------------------------------------
.proc umschalten
ldy #4 ;Bildschirme umschalten von unsichtbar auf sichtbar
mva sdlstl var5
mva sdlstl+1 var5+1
lda var1
sta (var5),y
iny
lda var1+1
sta (var5),y
rts
.endp
; -------------------------------------------------------------------------------------
.proc wartes
clc
ldx delay ; Warteschleife
st lda RTCLOK+2
wa cmp RTCLOK+2
beq wa
dex
bpl st
rts
.endp
.proc warte2
clc
@ dec delay1
lda delay1
cmp #1
bne @-
rts
.endp
; -------------------------------------------------------------------------------------
.proc feinscroll
ldy #1
mva #0 delay
mva #255 delay1
@ jsr wartes
sty vscrol
iny
cpy #8
bne @-
rts
.endp
; --------------------------------------------------------------------------------------
.proc schusslogik
#if .byte strig0=#0
asl schussi
#end
#if .byte schussi=#2
lda xposp1
sta hposm0
lda #0
ldy yschuss1
sta (miss1),y
lda yposp1
adc #9
sta yschuss1
asl schussi
#end
#if .byte schussi=#8
lda xposp1
adc #12
sta hposm1
lda #0
ldy yschuss2
sta (miss1),y
lda yposp1
adc #9
sta yschuss2
asl schussi
#end
#if .byte schussi=#32
lda xposp1
sta hposm2
lda #0
ldy yschuss3
sta (miss1),y
lda yposp1
adc #9
sta yschuss3
asl schussi
#end
#if .byte schussi=#128
lda xposp1
adc #12
sta hposm3
lda #0
ldy yschuss4
sta (miss1),y
lda yposp1
adc #9
sta yschuss4
mva #1 schussi
#end
rts
.endp
; --------------------------------------------------------------------------------------
.proc grobscroll
;Den Bildschirm um eins hoch / Grobscrolling um eine Zeile
ldx #22
@ ldy #$28
clc
@ lda (var1),y
sta itemex
#if .byte itemex=#68
jsr fuel
#end
sta (var2),y
dey
bpl @-
clc
lda var1
adc #$28
sta var1
bcc @+
inc var1+1
@ clc
lda var2
adc #$28
sta var2
bcc @+
inc var2+1
@ clc
dex
bpl @-3
rts
.endp
; -------------------------------------------------------------------------------
.proc letztereihe
;Die letzte Reihe printen
;Start der letzten Reihe bei var1 - Line 22
;in Var6 (+1) wird die Position von lands gespeichert
;in Var5 gehen Infos der Boarderanzahl rein
;in y ist der Zähler für letzte Reihe
;x wird als Zähler fürs printen benutzt
lda var1+1
;sta var8+1
;sta var7+1
lda var1
;sta var8
;sta var7
adc #112
sta var1
inc var1+1
inc var1+1
inc var1+1
ldy #0
clc
lda (var6),y ;Boarderanzahl 1 holen
sta var5
tax ;Boarderanzahl 1 in x speichern
jsr var6up
lda (var6),y ;Boarderart 1 holen
sta var7 ;abspeichern in var7
@ iny
sta (var1),y ;Boarder1 printen
dex
bpl @-
jsr var6up
lda (var6),y ;Boarderanzahl 2 holen
tax
jsr var6up
lda (var6),y ;Boarderart 2 holen
ldy var5
@ iny
sta (var1),y ;printen
dex
bpl @-
sty var5 ;Zeilenzähler sichern
jsr var6up
lda (var6),y ;Rand Boarder2 holen
inc var5 ;Zeilenzähler eins weiter
ldy var5
sta (var1),y ;Rand Boarder1 printen
jsr var6up
lda(var6),y ;leer holen
tax
lda #0
ldy var5
@ iny
sta (var1),y ;leer printen
dex
bpl @-
sty var5 ;Zeilenzähler sichern
jsr var6up
lda(var6),y ;Rand Boarder3 holen
ldy var5
iny
sty var5
sta (var1),y ;Rand Boarder3 printen
jsr var6up
lda(var6),y ;Boarder4 holen
tax ;Boarderanzahl in x speichern
jsr var6up
lda (var6),y
ldy var5
@ iny
sta (var1),y ;Boarder4 printen
dex
bpl @-
sty var5 ;Zeilenzähler sichern
jsr var6up
lda(var6),y ;Boarder5 holen
tax ;Boarderanzahl in x speichern
jsr var6up
lda (var6),y
ldy var5
@ iny
sta (var1),y ;Boarder5 printen
dex
bpl @-
jsr var6up
lda (var6),y ;Sonderitem holen
sta var5 ;Item in Var5 speichern
#if .byte var5=#99
jmp *
#end
jsr var6up
#if .byte var5=#50 ;Öltank printen
ldx #11
clc
@ mva tankol,x pr1,x
dex
bpl @-
#if .byte tank1x=#0
mva var1 tank1y
mva var1+1 tank1y+1
sec
lda tank1y
sbc #120
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
#end
lda (var6),y ;Startposition des Items in y speichern
sta tank1x
tay
jsr fuel ;Fueltank printen
#end
#if .byte var5=#51 ;Rakete printen
ldx #11
clc
@ mva rakete,x pr1,x
dex
bpl @-
#if .byte tank1x=#0
mva var1 tank1y
mva var1+1 tank1y+1
sec
lda tank1y
sbc #120
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
#end
lda (var6),y ;Startposition des Items in y speichern
sta tank1x
tay
jsr fuel ;Rakete printen
#end
#if .byte var5=#52 ;Alien printen
ldx #11
clc
@ mva alien,x pr1,x
dex
bpl @-
#if .byte tank1x=#0
mva var1 tank1y
mva var1+1 tank1y+1
sec
lda tank1y
sbc #120
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
#end
lda (var6),y ;Startposition des Items in y speichern
sta tank1x
tay
jsr fuel ;Alien printen
#end
#if .byte var5=#53 ;TNT printen
ldx #11
clc
@ mva tnt,x pr1,x
dex
bpl @-
#if .byte tank1x=#0
mva var1 tank1y
mva var1+1 tank1y+1
sec
lda tank1y
sbc #120
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
#end
lda (var6),y ;Startposition des Items in y speichern
sta tank1x
tay
jsr fuel ;TNT printen
#end
jsr var6up
mva #0 vscrol
sec
lda tank1y
sbc #40
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
lda tank1x
tay
mva #0 var5
rts
var6up clc
lda var6
adc #1
sta var6
ldy #0
lda var6+1
adc #0
sta var6+1
rts
.endp
; --------------------------------------------------------------------------------------
.proc fuel
sec ;Routine um den Öltank zu printen - es werden 12 Character meanderförmig geprinten 3x4 Matrix
lda var1
sbc #160
sta var2
lda var1+1
sbc #0
sta var2+1
fuelex lda pr1
sta (var2),y ;1
lda pr2
iny
sta (var2),y ;2
lda pr3
iny
sta (var2),y ;3
clc
lda var2
adc #41
sta var2
lda var2+1
adc #0
sta var2+1
dey
lda pr4
sta (var2),y ;4
dey
lda pr5
sta (var2),y ;5
dey
lda pr6
sta (var2),y ;6
clc
lda var2
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
lda pr7
sta (var2),y ;7
lda pr8
iny
sta (var2),y ;8
lda pr9
iny
sta (var2),y ;9
clc
lda var2
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
lda pr10
sta (var2),y ;10
dey
lda pr11
sta (var2),y ;11
dey
lda pr12
sta (var2),y ;12
tya
rts
.endp
; ------------------------------------------------------------------------------
.proc kollitem ;Kollisionsroutine
;var8 unveränderter Bildschirmanfang
lda yschuss1 ;in Gr.0 -32 (sichtbarer Bereich ab 32 und /8
sec
sbc #32
clc
ror
clc
ror
clc
ror
sta yschuss1 ;y-Position in das x-Register schreiben
tax
dex ; und einen abziehen
lda xschuss1 ;x-Position -48 (sichtbarer Bereich)und /4
sec
sbc #48
clc
ror
clc
ror
tay ;in y geht die x-Position
sec
mva var1 var2 ;holen der Bildschirmadresse -> var2
mva var1+1 var2+1
clc
@ lda var2 ;jetzt die y-Position auf die richtige Höhe stellen
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
dex
bpl @- ;die y-Position steht in x - Addition von x Zeilen
@ dey ;die korrekte x-Position einstellen
lda (var2),y ;linken Rand checken
sta var8
iny
iny
lda (var2),y ;rechten Rand checken
sta var9
dey
dey
#if .byte var8=#0 .and .byte var9>#0 ;Position nach rechts anpassen
iny
#end
#if .byte var8>#0 .and .byte var9=#0 ;Position nach links anpassen
dey
#end
lda (var2),y ;2. Durchgang der Anpassung um letzte
sta var8 ;Fehler zu beseitigen
iny
iny
lda (var2),y
sta var9
dey
dey
#if .byte var8=#0 .and .byte var9>#0
iny
#end
#if .byte var8>#0 .and .byte var9=#0
dey
#end
lda (var2),y ;Korrektur der y-Position
sta var8 ;in var8 aktuelle BS-Position
sec
lda var2 ;eins drüber - bleibt wenn var2 zu tief
sbc #40
sta var2
lda var2+1
sbc #0
sta var2+1
lda (var2),y ;lade Bildschirminhalt eins drüber
sta var9 ;das geht in var9 rein
#if .byte var8>#0 .and .byte var9=#0 ;alte Position var2
clc ;wiederherstellen
lda var2
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
#end
#if .byte var8=#0 .and .byte var9=#0 ;alte Position var2
clc ;eins runter
lda var2
adc #80
sta var2
lda var2+1
adc #0
sta var2+1
#end
lda (var2),y ;2. Durchgang der Anpassung um letzte
sta var8 ;Fehler zu beseitigen
sec
lda var2
sbc #40
sta var2
lda var2+1
sbc #0
sta var2+1
lda (var2),y
sta var9
#if .byte var8>#0 .and .byte var9=#0
clc
lda var2
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
#end
#if .byte var8=#0 .and .byte var9=#0
clc
lda var2
adc #80
sta var2
lda var2+1
adc #0
sta var2+1
#end
;ab hier stimmt die Position des Items (meistens)
;in der Variable y für x-Position
;und in var2 für die y-Position
expl11
mva var2 tank1pos ;y-Position für Explosion1
mva var2+1 tank1pos+1
ldx #11
clc
@ mva expl1,x pr1,x
dex
bpl @-
jsr fuel.fuelex
tay
iny
expl22
mva #80 var5
mva tank1pos var2
mva tank1pos+1 var2+1
mva #1 delay
jsr wartes
ldx #11
clc
@ mva expl2,x pr1,x
dex
bpl @-
jsr fuel.fuelex
tay
iny
expl33
mva #92 var5
mva tank1pos var2
mva tank1pos+1 var2+1
mva #1 delay
jsr wartes
ldx #11
clc
@ mva expl3,x pr1,x
dex
bpl @-
jsr fuel.fuelex
tay
iny
expl44
mva #104 var5
mva tank1pos var2
mva tank1pos+1 var2+1
mva #1 delay
jsr wartes
ldx #11
clc
@ mva expl4,x pr1,x
dex
bpl @-
jsr fuel.fuelex
tay
iny
rts
.endp
; ------------------------------------------------------------------------------
.proc schuesse
ldy yschuss1
iny
iny
lda #1
sta (miss1),Y
sty yschuss1
lda #0
dey
dey
sta (miss1),Y
mva m0pf kollm1
ldy yschuss2
iny
iny
lda #4
sta (miss1),Y
sty yschuss2
lda #0
dey
dey
sta (miss1),Y
mva m1pf kollm2
ldy yschuss3
iny
iny
lda #16
sta (miss1),Y
sty yschuss3
lda #0
dey
dey
sta (miss1),Y
mva m2pf kollm3
ldy yschuss4
iny
iny
lda #64
sta (miss1),Y
sty yschuss4
lda #0
dey
dey
sta (miss1),Y
mva m3pf kollm4
rts
.endp
.proc text
ldx #0
lda #52
jsr prte
inx
lda #45
jsr prte
inx
lda #54
jsr prte
inx
lda #31
jsr prte
inx
lda #52
jsr prte
inx
lda #49
jsr prte
inx
lda #0
jsr prte
inx
lda #54
jsr prte
inx
lda #50
jsr prte
inx
lda #0
jsr prte
inx
lda #51
jsr prte
inx
lda #47
jsr prte
inx
lda #50
jsr prte
inx
lda #42
jsr prte
inx
lda #50
jsr prte
inx
lda #53
jsr prte
inx
lda #0
jsr prte
inx
lda #55
jsr prte
inx
lda #34
jsr prte
inx
lda #32
jsr prte
inx
lda #34
jsr prte
inx
lda #34
jsr prte
inx
lda #0
jsr prte
inx
lda #51
jsr prte
inx
lda #45
jsr prte
inx
lda #54
jsr prte
inx
lda #45
jsr prte
inx
lda #52
jsr prte
inx
lda #0
jsr prte
inx
lda #51
jsr prte
inx
lda #52
jsr prte
inx
lda #50
jsr prte
inx
lda #44
jsr prte
inx
lda #45
jsr prte
inx
lda #47
jsr prte
inx
lda #48
jsr prte
inx
lda #0
jsr prte
ldx #0 ;Fuel
lda #46
jsr prte2
inx
lda #31
jsr prte2
inx
lda #45
jsr prte2
inx
lda #48
jsr prte2
ldx #10 ;Score
lda #53
jsr prte2
inx
lda #43
jsr prte2
inx
lda #50
jsr prte2
inx
lda #52
jsr prte2
inx
lda #45
jsr prte2
inx
lda #0
jsr prte2
inx
lda #160
jsr prte2
inx
lda #32
jsr prte2
inx
lda #32
jsr prte2
inx
lda #32
jsr prte2
ldx #23 ;Ships
lda #53
jsr prte2
inx
lda #47
jsr prte2
inx
lda #33
jsr prte2
inx
lda #51
jsr prte2
inx
lda #53
jsr prte2
inx
lda #0
jsr prte2
inx
lda #28
jsr prte2
inx
lda #29
jsr prte2
inx
lda #0
jsr prte2
inx
lda #28
jsr prte2
inx
lda #29
jsr prte2
inx
lda #0
jsr prte2
inx
lda #28
jsr prte2
inx
lda #29
jsr prte2
ldx #0
fuellauf
clc
lda fuelzaehleritem
@ jsr prte3
inx
cpx #36
bne @-
rts
prte sta 30923,x
sta 32423,x
rts
prte2 sta 31003,x
sta 32503,x
rts
prte3 sta 31043,x
sta 32543,x
rts
.endp
; ------------------------------------------------------------------------------
run main
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
und nun das Problem:
Es sind die Kollisionen...
Die Missiles laufen ja im VBI und erkennen dort auch die Kollisionen. Wenn jetzt im Hauptprogramm die Abfragen kommen und die verschiedenen Aktionen der jeweiligen Kollision, ist der Missile ja bevor überhaupt was passiert im VBI schon ein paar Zeilen weitergegangen und hat dann schon ganz andere Kollisionen gemacht bzw. die eigentliche Aktion kommt im Hauptprogramm zu spät.... ich habe heute einige Stunden mit allen möglichen Varianten experimentiert aber keine gute Lösung gefunden. Programmiere ich die ganze Schusslogik im Hauptprogramm, laufen die Missiles zu langsam und ruckeln.
Programmiere ich alles im VBI dann verbrauche ich dort wieder zu viel Zeit. Ich fürchte aber es geht nicht anders...
Oder übersehe ich da etwas??
LG
Peter
Es sind die Kollisionen...
Die Missiles laufen ja im VBI und erkennen dort auch die Kollisionen. Wenn jetzt im Hauptprogramm die Abfragen kommen und die verschiedenen Aktionen der jeweiligen Kollision, ist der Missile ja bevor überhaupt was passiert im VBI schon ein paar Zeilen weitergegangen und hat dann schon ganz andere Kollisionen gemacht bzw. die eigentliche Aktion kommt im Hauptprogramm zu spät.... ich habe heute einige Stunden mit allen möglichen Varianten experimentiert aber keine gute Lösung gefunden. Programmiere ich die ganze Schusslogik im Hauptprogramm, laufen die Missiles zu langsam und ruckeln.
Programmiere ich alles im VBI dann verbrauche ich dort wieder zu viel Zeit. Ich fürchte aber es geht nicht anders...
Oder übersehe ich da etwas??
LG
Peter
- Kveldulfur
- Beiträge: 624
- Registriert: 17.08.2021 02:32
- Has thanked: 239 times
- Been thanked: 163 times
- Kontaktdaten:
Re: Return to Phobos
Hi!
Evtl. geht ja ein Gemisch?
Im VBI wird die Kollision erkannt und der Missile ausgeblendet. Du setzt eine Variable Kollision auf true und merkst Dir die Position der Kollision.
Im Hauptprogramm erkennst Du nun die Kollision und die Position und kümmerst Dich um die weitere Logik.
Wenn die Animation der Kollision minimal verzögert kommt, sollte das kein Problem sein. Der Schuss ist weg und somit optisch kollidiert.
Grüße
Janko
Evtl. geht ja ein Gemisch?
Im VBI wird die Kollision erkannt und der Missile ausgeblendet. Du setzt eine Variable Kollision auf true und merkst Dir die Position der Kollision.
Im Hauptprogramm erkennst Du nun die Kollision und die Position und kümmerst Dich um die weitere Logik.
Wenn die Animation der Kollision minimal verzögert kommt, sollte das kein Problem sein. Der Schuss ist weg und somit optisch kollidiert.
Grüße
Janko
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Hallo Janko,
wo kommst du nochmal her?? Vielleicht sollten wir mal ein Projekt zusammen machen, ich glaube wir ticken ganz ähnlich.
Ich habe mir natürlich auch nebenher Gedanken gemacht, wie ich das lösen kann und bin auf den gleichen Ansatz gekommen.
Die Schüsse müssen gut laufen und die Kollisionen müssen stabil klappen, sonst geht ja der Spielspass flöten. Also habe ich mir jetzt gesagt: VBI erstmal egal, ich muss da noch mehr Code reinpacken.
Das habe ich jetzt auch umgesetzt und es jetzt so zunächst gelöst:
Die Missiles laufen ja ständig im VBI unsichtbar und ich biege nur die x- und y-Position jeweils um, wenn der Feuerknopf gedrückt wird. Für die Abfolge der Schüsse nehme ich eine Extravariable, da steht eine 1 drin, die mit dem Befehl ASL bitweise verschoben wird. Das steuert die Schüsse in der Folge rechts links rechts links. Diese Schusslogik findet im Hauptprogramm statt.
Damit die Schüsse schneller laufen, incrementiere ich sie im VBI 2x - das Problem dabei ist, daß dann 2 verschiedene Kollisionen stattfinden können. Eine gewollte und eine ungewollte. Dafür halte ich 4x2 Variablen bereit und packe die jeweilige Kollisionsart in diese Variable rein - für alle 4 Schüsse. Das läuft auch ständig im VBI. Sobald eine Kollision eines Missiles stattfindet, biege ich den x-Vektor dieses Missiles im VBI weg, damit dann keine weiteren Kollisionen stattfinden können und die ersten Ereignisse überschreiben können. Dieser Aufwand muss wohl im VBI sein, vielleicht kann ich den Code noch etwas optimieren. Alles andere muss dann im Hauptprogramm erfolgen. Wahrscheinlich muss ich im VBI auch noch die jeweiligen x und y-Positionen retten!
Das System ist zunehmend sensibel finde ich. Nach diesen Änderungen bekomme ich ab und zu ein unangenehmes Ruckeln rein - mal ja und mal nicht. Habe noch nicht rausgefunden woher das kommt.... ich dachte erst an der Lände des VBI, aber wenn ich den Emulator auf 60 Hz umstelle, läuft es stabiler - dann kann es ja nicht an der Codelänge im VBI liegen.
Ganz schön kompliziert so ein Shooter....... ich glaube als nächstes Projekt mache ich mal ein feines Jump ´n Run - Spiel
Gruß
Peter
wo kommst du nochmal her?? Vielleicht sollten wir mal ein Projekt zusammen machen, ich glaube wir ticken ganz ähnlich.
Ich habe mir natürlich auch nebenher Gedanken gemacht, wie ich das lösen kann und bin auf den gleichen Ansatz gekommen.
Die Schüsse müssen gut laufen und die Kollisionen müssen stabil klappen, sonst geht ja der Spielspass flöten. Also habe ich mir jetzt gesagt: VBI erstmal egal, ich muss da noch mehr Code reinpacken.
Das habe ich jetzt auch umgesetzt und es jetzt so zunächst gelöst:
Die Missiles laufen ja ständig im VBI unsichtbar und ich biege nur die x- und y-Position jeweils um, wenn der Feuerknopf gedrückt wird. Für die Abfolge der Schüsse nehme ich eine Extravariable, da steht eine 1 drin, die mit dem Befehl ASL bitweise verschoben wird. Das steuert die Schüsse in der Folge rechts links rechts links. Diese Schusslogik findet im Hauptprogramm statt.
Damit die Schüsse schneller laufen, incrementiere ich sie im VBI 2x - das Problem dabei ist, daß dann 2 verschiedene Kollisionen stattfinden können. Eine gewollte und eine ungewollte. Dafür halte ich 4x2 Variablen bereit und packe die jeweilige Kollisionsart in diese Variable rein - für alle 4 Schüsse. Das läuft auch ständig im VBI. Sobald eine Kollision eines Missiles stattfindet, biege ich den x-Vektor dieses Missiles im VBI weg, damit dann keine weiteren Kollisionen stattfinden können und die ersten Ereignisse überschreiben können. Dieser Aufwand muss wohl im VBI sein, vielleicht kann ich den Code noch etwas optimieren. Alles andere muss dann im Hauptprogramm erfolgen. Wahrscheinlich muss ich im VBI auch noch die jeweiligen x und y-Positionen retten!
Das System ist zunehmend sensibel finde ich. Nach diesen Änderungen bekomme ich ab und zu ein unangenehmes Ruckeln rein - mal ja und mal nicht. Habe noch nicht rausgefunden woher das kommt.... ich dachte erst an der Lände des VBI, aber wenn ich den Emulator auf 60 Hz umstelle, läuft es stabiler - dann kann es ja nicht an der Codelänge im VBI liegen.
Ganz schön kompliziert so ein Shooter....... ich glaube als nächstes Projekt mache ich mal ein feines Jump ´n Run - Spiel
Gruß
Peter
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Code: Alles auswählen
;Schüsse 1-4 laufen incl. Kollisionsabfragen
lda #1
ldy yschuss1
iny
sta (miss1),Y
mva m0pf kollm1
lda #1
iny
sta (miss1),y
mva m0pf kollm12
sty yschuss1
lda #0
dey
dey
sta (miss1),Y
iny
sta (miss1),y
lda #4
ldy yschuss2
iny
sta (miss1),Y
mva m1pf kollm2
lda #4
iny
sta (miss1),y
mva m1pf kollm22
sty yschuss2
lda #0
dey
dey
sta (miss1),Y
iny
sta (miss1),y
lda #16
ldy yschuss3
iny
sta (miss1),Y
mva m2pf kollm3
lda #16
iny
sta (miss1),y
mva m2pf kollm32
sty yschuss3
lda #0
dey
dey
sta (miss1),Y
iny
sta (miss1),y
lda #64
ldy yschuss4
iny
sta (miss1),Y
mva m3pf kollm4
lda #64
iny
sta (miss1),y
mva m3pf kollm42
sty yschuss4
lda #0
dey
dey
sta (miss1),Y
iny
sta (miss1),y
mva #1 hitclr
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
brauche Rat!
Ich habe jetzt mal rumexperimentiert, aber dieses Bildschirmruckeln ist blöd, da es auch dann ab und zu Fehler in der Landschaft produziert. Ich kann es auch kaum reproduzieren... manchmal ruckelt es stark und manchmal gar nicht.
Heute habe ich dann auf 2 Schüsse verzichtet und somit den Code im VBI deutlich reduziert - das Ruckeln ist weg.
Auch habe ich die komplizierten If Then Or Schleifen weggelassen und es nativ programmiert - in der Hoffnung, daß es stabiler läuft.
Fazit: Weniger Code im VBI stabilisiert das System, aber auch mit 2 Schüssen scheine ich nicht viel Luft zu haben, was seltsam anmutet... habe ich mich verrechnet? Ich war von ca. 1500 Befehlen - also 7000-8000 Taktzyklen ausgegangen.
Mit 4 Schüssen verbrauche ich 610 Befehle, mit 2S Schüssen nur 380 Befehle - also noch viel Luft nach oben.
Woran hängt es dann?
Schafft der Rechner zwar die 610 Befehle ohne dass er abstürzt aber mit zunehmender Belastung des VBI wird das System instabil??? So bekomme ich keinen vernünftigen Sound mehr rein...
Oder habe ich irgendwo einen Denkfehler?? Muss ich ganz gezielt WSYNC einsetzen (alle Versuche machte es eher schlechter).
Ist meine Lösung mit dem Fein-/Grobscroll mit 2 Bildschirmen zu instabil???
Wie bloß haben die Jungs das früher programmiert und die Shooter so schön hinbekommen??
Für Ideen bin ich echt dankbar!
Gruß
Peter
Heute habe ich dann auf 2 Schüsse verzichtet und somit den Code im VBI deutlich reduziert - das Ruckeln ist weg.
Auch habe ich die komplizierten If Then Or Schleifen weggelassen und es nativ programmiert - in der Hoffnung, daß es stabiler läuft.
Fazit: Weniger Code im VBI stabilisiert das System, aber auch mit 2 Schüssen scheine ich nicht viel Luft zu haben, was seltsam anmutet... habe ich mich verrechnet? Ich war von ca. 1500 Befehlen - also 7000-8000 Taktzyklen ausgegangen.
Mit 4 Schüssen verbrauche ich 610 Befehle, mit 2S Schüssen nur 380 Befehle - also noch viel Luft nach oben.
Woran hängt es dann?
Schafft der Rechner zwar die 610 Befehle ohne dass er abstürzt aber mit zunehmender Belastung des VBI wird das System instabil??? So bekomme ich keinen vernünftigen Sound mehr rein...
Oder habe ich irgendwo einen Denkfehler?? Muss ich ganz gezielt WSYNC einsetzen (alle Versuche machte es eher schlechter).
Ist meine Lösung mit dem Fein-/Grobscroll mit 2 Bildschirmen zu instabil???
Wie bloß haben die Jungs das früher programmiert und die Shooter so schön hinbekommen??
Für Ideen bin ich echt dankbar!
Gruß
Peter
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
hier das Video mit 2 Schüssen:
und das Video mit 4 Schüssen:
in beiden Fällen wird die Kollision noch nicht richtig erkannt und die Explosion läuft nicht richtig... aber das muss ich ja noch anpassen!
und das Video mit 4 Schüssen:
in beiden Fällen wird die Kollision noch nicht richtig erkannt und die Explosion läuft nicht richtig... aber das muss ich ja noch anpassen!
- Kveldulfur
- Beiträge: 624
- Registriert: 17.08.2021 02:32
- Has thanked: 239 times
- Been thanked: 163 times
- Kontaktdaten:
Re: Return to Phobos
Hallo Peter,
hier mal ein theoretischer Ansatz, ohne Gewähr auf Richtigkeit
Der ATARI läuft zwar mit ca. 1,79Mhz, aber den größten Teil ist die CPU blockiert, damit die Grafik dargestellt werden kann.
Die meiste "freie" Zeit hat der ATARI wenn das Bild gerade fertig aufgebaut wurde und ein neuer Aufbau vorbereitet wird. Das ist dann auch die Zeit des VBI. Also je mehr Code im VBI ausgeführt wird, desto weniger kann der ATARI außerhalb des VBI bearbeiten.
Der VBI wird alle 1/50 Sekunde aufgerufen. Das heißt alles im VBI wird alle 20ms erneut ausgeführt.
Die Frage ist somit, muss wirklich alles immer 50x die Sekunde abgearbeitet werden? Kann man vllt. Code aufteilen, so dass im 1. VBI Teil A, im 2. VBI Teil B und im 3. VBI Teil C bearbeitet wird, und dann wieder von vorne? Nur wichtiger Code wird jedes Mal ausgeführt.
Beispiel Scrolling im VBI:
1. VBI - Feinscolling +1 im sichtbaren Bereich und 256 Byte im ausgeblendeten wird verschoben.
2. VBI - Feinscolling +1 im sichtbaren Bereich und weitere 256 Byte im ausgeblendeten wird verschoben.
3. VBI - Feinscolling +1 im sichtbaren Bereich und weitere 256 Byte im ausgeblendeten wird verschoben.
4. VBI - Feinscolling +1 im sichtbaren Bereich und die letzen 256 Byte im ausgeblendeten wird verschoben.
5. VBI - Feinscolling +1 die letzte Zeile wird aus den Daten erzeugt
6. VBI - Feinscolling +1 Objekte werden entfernt, die bereits abgeschossen wurden
7. VBI - Feinscolling +1 Punktestand und Fuel etc. werden ausgegeben/aktualisiert
8. VBI - Feinscolling wieder zurücksetzen und umblenden
Hoffentlich habe ich jetzt nicht zu viel Mist erzählt und Du kannst damit etwas anfangen
Grüße
Janko
hier mal ein theoretischer Ansatz, ohne Gewähr auf Richtigkeit
Der ATARI läuft zwar mit ca. 1,79Mhz, aber den größten Teil ist die CPU blockiert, damit die Grafik dargestellt werden kann.
Die meiste "freie" Zeit hat der ATARI wenn das Bild gerade fertig aufgebaut wurde und ein neuer Aufbau vorbereitet wird. Das ist dann auch die Zeit des VBI. Also je mehr Code im VBI ausgeführt wird, desto weniger kann der ATARI außerhalb des VBI bearbeiten.
Der VBI wird alle 1/50 Sekunde aufgerufen. Das heißt alles im VBI wird alle 20ms erneut ausgeführt.
Die Frage ist somit, muss wirklich alles immer 50x die Sekunde abgearbeitet werden? Kann man vllt. Code aufteilen, so dass im 1. VBI Teil A, im 2. VBI Teil B und im 3. VBI Teil C bearbeitet wird, und dann wieder von vorne? Nur wichtiger Code wird jedes Mal ausgeführt.
Beispiel Scrolling im VBI:
1. VBI - Feinscolling +1 im sichtbaren Bereich und 256 Byte im ausgeblendeten wird verschoben.
2. VBI - Feinscolling +1 im sichtbaren Bereich und weitere 256 Byte im ausgeblendeten wird verschoben.
3. VBI - Feinscolling +1 im sichtbaren Bereich und weitere 256 Byte im ausgeblendeten wird verschoben.
4. VBI - Feinscolling +1 im sichtbaren Bereich und die letzen 256 Byte im ausgeblendeten wird verschoben.
5. VBI - Feinscolling +1 die letzte Zeile wird aus den Daten erzeugt
6. VBI - Feinscolling +1 Objekte werden entfernt, die bereits abgeschossen wurden
7. VBI - Feinscolling +1 Punktestand und Fuel etc. werden ausgegeben/aktualisiert
8. VBI - Feinscolling wieder zurücksetzen und umblenden
Hoffentlich habe ich jetzt nicht zu viel Mist erzählt und Du kannst damit etwas anfangen
Grüße
Janko
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Hi Janko,
erst einmal vielen Dank für den wirklich kreativen Ansatz.
Ich dachte wirklich in dem Moment, als ich es gelesen hatte: Das ist es. Und habe es gerade mal mit einfacher Teilung des VBI umgesetzt... so einfach geht es leider nicht. Es ruckelt mindestens genauso und die Steuerung und die Missiles laufen abgehackt.
Vielleicht kann man das noch besser umsetzten, wird aber richtig kompliziert... der VBI, gesteuert durch das Hauptprogramm geht nicht gut, aber.... er läßt sich steuern und aufrufen durch den DLI und dann kann ich den VBI in Portionen teilen und jeweils aufrufen.
Und dann fiel mir noch folgendes ein: Warum nicht einfach den VBI2 durch den VBI1 aufrufen und dann VBI3 durch VBI2 usw..... das habe ich gerade mal umgesetzt und einen schönen Systemabsturz erwartet... aber siehe da: Es funktioniert. Und läuft flüssig und mit 4 Schüssen ganz ohne ruckeln!!
Wie cool !! Ok, die Steuerung ist natürlich etwas träger und die Missiles laufen etwas langsamer runter - das muss ich noch anpassen. Aber zumindest ist das wohl die Lösung der Probleme. Hurra!!!!!
Gruß
Peter
... Danke für die notwendige Inspiration!!
erst einmal vielen Dank für den wirklich kreativen Ansatz.
Ich dachte wirklich in dem Moment, als ich es gelesen hatte: Das ist es. Und habe es gerade mal mit einfacher Teilung des VBI umgesetzt... so einfach geht es leider nicht. Es ruckelt mindestens genauso und die Steuerung und die Missiles laufen abgehackt.
Vielleicht kann man das noch besser umsetzten, wird aber richtig kompliziert... der VBI, gesteuert durch das Hauptprogramm geht nicht gut, aber.... er läßt sich steuern und aufrufen durch den DLI und dann kann ich den VBI in Portionen teilen und jeweils aufrufen.
Und dann fiel mir noch folgendes ein: Warum nicht einfach den VBI2 durch den VBI1 aufrufen und dann VBI3 durch VBI2 usw..... das habe ich gerade mal umgesetzt und einen schönen Systemabsturz erwartet... aber siehe da: Es funktioniert. Und läuft flüssig und mit 4 Schüssen ganz ohne ruckeln!!
Wie cool !! Ok, die Steuerung ist natürlich etwas träger und die Missiles laufen etwas langsamer runter - das muss ich noch anpassen. Aber zumindest ist das wohl die Lösung der Probleme. Hurra!!!!!
Gruß
Peter
... Danke für die notwendige Inspiration!!
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
... heute habe ich eine Menge experimentiert mit den VBI´s.... folgendes kann ich nun berichten:
Zeit bleibt Zeit und das kann man nicht ändern. Teile ich den langen VBI in 2 VBI´s, dann läuft das System stabil und rund, aber man merkt die Einbuße der Geschwindigkeit. Die Joysticksteuerung wird etwas träger und ich muss die x- und y-Verschiebung des Raumschiffes anpassen (Werte verdoppeln). Dadurch läuft es noch gut aber nicht mehr ganz so flüssig.
Gleiches gilt für die Missiles... auch hier musste ich die Geschwindigkeit verdoppeln, da sonst die Missiles zu langsam runterlaufen.
Ich kann noch weitere VBI´s einbauen und so weiter "teilen" - Thema Musik, das wird alles andere aber logischerweise weiter verlangsamen... hier gibt es also ganz klar Grenzen!!
Ich lass das jetzt erst einmal so und mache weiter. Am Ende schaue ich, daß ich noch ein wenig Code vom VBI ins Hauptprogramm packe... vielleicht experimentiere ich auch noch mit dem DLI - aber der ist ja noch zeitkritischer.
Immerhin kann man eines sagen: Einen VBI durch einen anderen VBI aufzurufen geht einfach und gut, man kann da direkt den Vektor umbiegen und muss nicht erst durch setvbv durchspringen... anbei das vorläufige Listing des VBI:
Ich hoffe ich nerve oder langweile hier keinen mit meinem Projekt - allerdings, muss man ja auch nicht lesen ...
Mein Zwischenfazit bislang:
1. Ich lerne jeden Tag den Atari besser kennen und werde immer sicherer in Assembler.
2. Es gibt unglaublich viele Möglichkeiten und aber auch Tücken - mein Respekt gegenüber den Programmierern von damals ist deutlich gestiegen - toll, was die aus der Kiste rausgeholt haben!
3. Wir haben ganz klare Limitationen hinsichtlich Zeit und Größe des Programmes - es geht vieles aber nicht alles und man muss sein Projekt wirklich sehr gut planen.
4. Und genau das macht es aus... sich ständig neuen Herausforderungen ausgesetzt sehen, grübeln grübel grübeln und Lösungen finden und umsetzen. Und genau darum haben die meisten alten Programme auch so viel Charme - nämlich weil da so viel Arbeit, Hirnschmalz und Liebe drinsteckt....
5. Mein Projekt wird wohl noch einige Monate verschlingen, denn es soll gut und spielbar werden... und dann freue ich mich schon auf das nächste schöne Projekt, wo ich viele Dinge primär ganz anders plane....
Gruß
Peter
Zeit bleibt Zeit und das kann man nicht ändern. Teile ich den langen VBI in 2 VBI´s, dann läuft das System stabil und rund, aber man merkt die Einbuße der Geschwindigkeit. Die Joysticksteuerung wird etwas träger und ich muss die x- und y-Verschiebung des Raumschiffes anpassen (Werte verdoppeln). Dadurch läuft es noch gut aber nicht mehr ganz so flüssig.
Gleiches gilt für die Missiles... auch hier musste ich die Geschwindigkeit verdoppeln, da sonst die Missiles zu langsam runterlaufen.
Ich kann noch weitere VBI´s einbauen und so weiter "teilen" - Thema Musik, das wird alles andere aber logischerweise weiter verlangsamen... hier gibt es also ganz klar Grenzen!!
Ich lass das jetzt erst einmal so und mache weiter. Am Ende schaue ich, daß ich noch ein wenig Code vom VBI ins Hauptprogramm packe... vielleicht experimentiere ich auch noch mit dem DLI - aber der ist ja noch zeitkritischer.
Immerhin kann man eines sagen: Einen VBI durch einen anderen VBI aufzurufen geht einfach und gut, man kann da direkt den Vektor umbiegen und muss nicht erst durch setvbv durchspringen... anbei das vorläufige Listing des VBI:
Code: Alles auswählen
.proc vbinter
pha
txa
pha
tya
pha
mva #0 atract ;Bildschirmschoner aus
clc ;Kollisionen abfragen
lda p0pf
cmp #1
bcc @+
mva #1 kollp0
@
clc ;Joystickabfragen Player1
lda stick0
cmp #15 ;keine Joystickaktion
bcs @+
cmp #14
bcs nachob
cmp #13
bcs nachun1
cmp #11
bcs nachli
cmp #10
bcs nachliob
cmp #9
bcs nachliun
sec
cmp #7
bcs nachre
cmp #6
bcs nachreob
cmp #5
bcs nachreun
@ jmp write
nachun1 jmp nachun
nachre clc
lda xposp1
cmp #192
bcs @+
inc xposp1
inc xposp1
@ jmp write
nachreun
clc
lda xposp1
cmp #192
bcs @+
inc xposp1
inc xposp1
@ jmp nachun
nachreob
clc
lda xposp1
cmp #192
bcs @+
inc xposp1
inc xposp1
@ jmp nachob
nachli sec
lda xposp1
cmp #49
bcc @+
dec xposp1
dec xposp1
@ jmp write
nachliun
sec
lda xposp1
cmp #49
bcc @+
dec xposp1
dec xposp1
@ jmp nachun
nachliob
sec
lda xposp1
cmp #49
bcc @+
dec xposp1
dec xposp1
@ jmp nachob
nachob
dec yposp1
clc
ldy yposp1 ;verticale Startpos. Player 1 + füllen
ldx #0
@ lda pm1,x
sta (play1),y
iny
inx
cpx #14
bne @-
jmp write
nachun
inc yposp1
clc
ldy yposp1 ;verticale Startpos. Player 1 + füllen
ldx #0
@ lda pm1,x
sta (play1),y
iny
inx
cpx #14
bne @-
jmp write
clc
write sec
lda xposp1 ;x-Position der Player setzen
sta hposp0
sbc #0
sta hposp2
adc #2
sta hposp3
ldy yposp1 ;Player printen
clc
lda blink
tax
dey
mva #0 lms2
@ lda pm41,x
sta (play4),y
lda pm42,x
sta (play3),y
iny
inx
inc lms2
lda lms2
cmp #14
bne @-
mwa #vbinter2 $224
pla
tay
pla
tax
pla
jmp xitvbv ;vb-interrupt wird über xitvbv beendet!!
.endp
.proc vbinter2
pha
txa
pha
tya
pha
;Schüsse 1-4 laufen incl. Kollisionsabfragen
lda #1
ldy yschuss1
iny
iny
sta (miss1),Y
mva m0pf kollm1
lda #1
iny
sta (miss1),y
mva m0pf kollm12
sty yschuss1
lda #0
dey
dey
dey
sta (miss1),Y
iny
iny
sta (miss1),y
lda #4
ldy yschuss2
iny
iny
sta (miss1),Y
mva m1pf kollm2
lda #4
iny
sta (miss1),y
mva m1pf kollm22
sty yschuss2
lda #0
dey
dey
dey
sta (miss1),Y
iny
iny
sta (miss1),y
lda #16
ldy yschuss3
iny
iny
sta (miss1),Y
mva m2pf kollm3
lda #16
iny
sta (miss1),y
mva m2pf kollm32
sty yschuss3
lda #0
dey
dey
dey
sta (miss1),Y
iny
iny
sta (miss1),y
lda #64
ldy yschuss4
iny
iny
sta (miss1),Y
mva m3pf kollm4
lda #64
iny
sta (miss1),y
mva m3pf kollm42
sty yschuss4
lda #0
dey
dey
dey
sta (miss1),Y
iny
iny
sta (miss1),y
mva #1 hitclr
#if .byte kollm1>#0 .or .byte kollm12>#0
mva hposm0 xschuss
mva yschuss1 yschuss
mva #8 hposm0
mva kollm1 kollges
mva kollm12 kollges2
#end
#if .byte kollm2>#0 .or .byte kollm22>#0
mva #8 hposm1
mva kollm2 kollges
mva kollm22 kollges2
#end
#if .byte kollm3>#0 .or .byte kollm32>#0
mva #8 hposm2
mva kollm3 kollges
mva kollm32 kollges2
#end
#if .byte kollm4>#0 .or .byte kollm42>#0
mva #8 hposm3
mva kollm4 kollges
mva kollm42 kollges2
#end
mwa #vbinter $224
pla
tay
pla
tax
pla
jmp xitvbv ;vb-interrupt wird über xitvbv beendet!!
.endp
Mein Zwischenfazit bislang:
1. Ich lerne jeden Tag den Atari besser kennen und werde immer sicherer in Assembler.
2. Es gibt unglaublich viele Möglichkeiten und aber auch Tücken - mein Respekt gegenüber den Programmierern von damals ist deutlich gestiegen - toll, was die aus der Kiste rausgeholt haben!
3. Wir haben ganz klare Limitationen hinsichtlich Zeit und Größe des Programmes - es geht vieles aber nicht alles und man muss sein Projekt wirklich sehr gut planen.
4. Und genau das macht es aus... sich ständig neuen Herausforderungen ausgesetzt sehen, grübeln grübel grübeln und Lösungen finden und umsetzen. Und genau darum haben die meisten alten Programme auch so viel Charme - nämlich weil da so viel Arbeit, Hirnschmalz und Liebe drinsteckt....
5. Mein Projekt wird wohl noch einige Monate verschlingen, denn es soll gut und spielbar werden... und dann freue ich mich schon auf das nächste schöne Projekt, wo ich viele Dinge primär ganz anders plane....
Gruß
Peter
- DjayBee
- Beiträge: 628
- Registriert: 17.08.2021 04:02
- Has thanked: 387 times
- Been thanked: 177 times
- Kontaktdaten:
Re: Return to Phobos
Hi Peter,
deine Berichte sind spannend, auch wenn ich noch nie ein Spiel geschrieben habe.
Zu deinen permanenten Zeitproblemen im VBI folgende Idee, die aber evtl. auch vollkommen sinnlos ist:
Das Hauptprogramm ist nach meinem Verständnis üblicherweise eine Dauerschleife.
So ungefähr:
Wenn du jetzt die Dinge, die nicht innerhalb des VBI, sondern nur je einmal pro VBI ablaufen sollen, in eine diese Unterroutinen legst und dort verifizierst, dass sie nur einmal je VBI ausgeführt wird, solltest du eine ganze Menge Zeit zur Verfügung haben.
deine Berichte sind spannend, auch wenn ich noch nie ein Spiel geschrieben habe.
Zu deinen permanenten Zeitproblemen im VBI folgende Idee, die aber evtl. auch vollkommen sinnlos ist:
Das Hauptprogramm ist nach meinem Verständnis üblicherweise eine Dauerschleife.
So ungefähr:
Code: Alles auswählen
main jsr tue_dieses
jsr tue_jenes
jsr mach_was_tolles
jmp main
Code: Alles auswählen
tue_jenes
lda RTCLOK+2 ; wird im Stage 1 VBI automatisch inkrementiert
cmp letztes_mal
bne mach_weiter
rts
mach_weiter
sta letztes_mal
; Mach all die tollen Dinge, für die im VBI keine Zeit ist
rts
letztes_mal
.byte $00
-
- Beiträge: 489
- Registriert: 17.08.2021 21:16
- Wohnort: Reutlingen
- Has thanked: 456 times
- Been thanked: 142 times
- Kontaktdaten:
Re: Return to Phobos
Hi.
Ich finde es auch interessant wie das Spiel entsteht. Und stark ist auch das Peter es gleich in Assembler angeht. Aber learning by doing, wie man so schön sagt. Durchhaltevermögen ist ja scheinbar da.
Ich habe heute von Cas ein paar Zong-Hefte bekommen und durchgeblättert. Da sind immer Berichte/Kurs zu Assembler drin. Interessant könnte die Ausgabe 3-4/94 sein. Da geht es um Scrolling in Assembler. Am Ende wird ein Beispiel vorgestellt in dem in einer Landschaft rumgescrollt wird. Zwar rechts/links, aber besser wie nix . In der nächsten Ausgabe sollte das weiter entwickelt werden, aber die habe ich nicht. Gibt es aber bestimmt irgendwo online. Disketten gab es auch dazu. In einer Ausgabe war auch eine PM-Routine drin, aber nur auf Diskette.
Kannst ja mal nachlesen. Vielleicht hilft ja das eine oder andere was.
Gruß
Wolfgang
Ich finde es auch interessant wie das Spiel entsteht. Und stark ist auch das Peter es gleich in Assembler angeht. Aber learning by doing, wie man so schön sagt. Durchhaltevermögen ist ja scheinbar da.
Ich habe heute von Cas ein paar Zong-Hefte bekommen und durchgeblättert. Da sind immer Berichte/Kurs zu Assembler drin. Interessant könnte die Ausgabe 3-4/94 sein. Da geht es um Scrolling in Assembler. Am Ende wird ein Beispiel vorgestellt in dem in einer Landschaft rumgescrollt wird. Zwar rechts/links, aber besser wie nix . In der nächsten Ausgabe sollte das weiter entwickelt werden, aber die habe ich nicht. Gibt es aber bestimmt irgendwo online. Disketten gab es auch dazu. In einer Ausgabe war auch eine PM-Routine drin, aber nur auf Diskette.
Kannst ja mal nachlesen. Vielleicht hilft ja das eine oder andere was.
Gruß
Wolfgang
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
... Ihr Lieben,
vielen Dank für die Rückmeldungen und vielen Ideen. Das tut gut und spornt an... und alle Ideen und Tips sind mehr als willkommen.
Zong Hefte .... ich suche mal!
Schönen Abend allen!
Gruß
Peter
vielen Dank für die Rückmeldungen und vielen Ideen. Das tut gut und spornt an... und alle Ideen und Tips sind mehr als willkommen.
Zong Hefte .... ich suche mal!
Schönen Abend allen!
Gruß
Peter
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Was macht mein kleines Projekt?
In den letzten Wochen hatte ich sehr viel an verschiedenen Dingen programmiert und experimentiert... und mich ein wenig verrannt. Ich bin dann mal einen Schritt zurückgegangen und habe eine etwas ältere aber stabil funktionierende Version genommen und da weitergearbeitet.
Ich kann jetzt nicht das ganze Programm komplett ändern, möchte es aber fertigstellen und es funktioniert dann nach den ursprünglichen Kriterien.
Ich habe nicht 4 sondern nur 2 Schüsse und die laufen abwechselnd und nicht zugleich. Das war das ursprüngliche Konzept und dabei bleibt es jetzt.
Der VBI ist etwas schlanker geworden, aber noch recht voll. Da passt nicht mehr viel rein, braucht es aber auch nicht.
Die Schüsse funktionieren jetzt und auch die leidliche Kollision funktioniert zu 98% ohne Fehler. Es gibt jetzt einen ständigen Hintergrundsound, die Explosion der Items funktioniert stabil und mit Sound und die Schüsse laufen jetzt auch mit Sound.
Am Sound werde ich später noch arbeiten und vielleicht implementiere ich noch die xSFX Engine ins Programm. Die jetzige Engine ist brutal einfach und mini... geht aber zunächst.
Bevor ich dann mit der Landschaftsgestaltung weitermache und dann noch die nächsten Features reinbringe, will ich nochmal die Explosion angehen. Das gefällt mir noch nicht, da eine Explosion immer zu einem kleinen Programmstop führt.
Meine Idee dafür sieht folgendermaßen aus:
Im Moment printet das Programm hintereinander mit kleiner Warteschleife die 4 Explosionsphasen über das Item bis es weg ist... Phase 4 ist alles 0 also weg.
Die Lösung soll so sein: Die Explosion wird erkannt, das Item wird mit dem ersten Explosionscharakterset überschrieben, dann wird der erste Explosionscharakterset während das Programm weiterläuft mit den 3 weiteren Phasen überschrieben und so läuft die Explosion weiter während das ganze Programm weiterläuft.
Theorie glasklar, Umsetzung nicht ganz einfach, da auch das ganze Timing stimmen muss.....
Zum Glück habe ich seit einer Woche Freund Omikron in den Knochen und bin entsprechend zuhause und finde etwas Zeit das zu programmieren....
Gruß
Peter
In den letzten Wochen hatte ich sehr viel an verschiedenen Dingen programmiert und experimentiert... und mich ein wenig verrannt. Ich bin dann mal einen Schritt zurückgegangen und habe eine etwas ältere aber stabil funktionierende Version genommen und da weitergearbeitet.
Ich kann jetzt nicht das ganze Programm komplett ändern, möchte es aber fertigstellen und es funktioniert dann nach den ursprünglichen Kriterien.
Ich habe nicht 4 sondern nur 2 Schüsse und die laufen abwechselnd und nicht zugleich. Das war das ursprüngliche Konzept und dabei bleibt es jetzt.
Der VBI ist etwas schlanker geworden, aber noch recht voll. Da passt nicht mehr viel rein, braucht es aber auch nicht.
Die Schüsse funktionieren jetzt und auch die leidliche Kollision funktioniert zu 98% ohne Fehler. Es gibt jetzt einen ständigen Hintergrundsound, die Explosion der Items funktioniert stabil und mit Sound und die Schüsse laufen jetzt auch mit Sound.
Am Sound werde ich später noch arbeiten und vielleicht implementiere ich noch die xSFX Engine ins Programm. Die jetzige Engine ist brutal einfach und mini... geht aber zunächst.
Bevor ich dann mit der Landschaftsgestaltung weitermache und dann noch die nächsten Features reinbringe, will ich nochmal die Explosion angehen. Das gefällt mir noch nicht, da eine Explosion immer zu einem kleinen Programmstop führt.
Meine Idee dafür sieht folgendermaßen aus:
Im Moment printet das Programm hintereinander mit kleiner Warteschleife die 4 Explosionsphasen über das Item bis es weg ist... Phase 4 ist alles 0 also weg.
Die Lösung soll so sein: Die Explosion wird erkannt, das Item wird mit dem ersten Explosionscharakterset überschrieben, dann wird der erste Explosionscharakterset während das Programm weiterläuft mit den 3 weiteren Phasen überschrieben und so läuft die Explosion weiter während das ganze Programm weiterläuft.
Theorie glasklar, Umsetzung nicht ganz einfach, da auch das ganze Timing stimmen muss.....
Zum Glück habe ich seit einer Woche Freund Omikron in den Knochen und bin entsprechend zuhause und finde etwas Zeit das zu programmieren....
Gruß
Peter
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
der Code im Hauptprogramm:
Code: Alles auswählen
org $2000
icl '../hardware.txt'
icl 'header.txt'
icl 'character.asm'
icl 'lands.asm'
icl 'pmg_vars.asm'
icl 'VBI.asm'
.proc main
main1 mwa #dlist 560
mva #151 fuelzaehleritem
mva #0 fuelzaehler
mva #10 store1
mva #170 store3
mva #16 sound12
jsr text
Start1
jsr variablensetzen
jsr pmvorbereiten
ldy #0
ldx #0
ldx #>vbinter ;VB-Interrupt VektorHi
ldy #<vbinter ;VB-Interrupt VektorLo
lda #7 ;Deferred Mode mit lda #7 festlegen
jsr setvbv ;Vektor für die eigene Routine über setvbv eintragen
hauptprogramm
;jsr kollplayer
jsr soundschuss
jsr blinken
jsr letztereihe ;letzte Reihe (lands) Bildschirm1 printen (sichtbar)
jsr feinscroll ;Feinscroll Bildschirm1 ausführen (sichtbar)
jsr grobscroll ;Bildschirm1 kopieren + grobscroll
jsr umschalten
jsr incfuelzaehler
jsr kollmissile
;Ende der Bildschirmausführung / Kontrolle Durchläufe
sec
lda #45 ; - 36 = Anzahl der Durchläufe - auf 4 beschränkt, da die Landschaft noch rudimentär ist und sich dann wiederholen soll
sbc var6+1
bpl @+
jmp start1 ;Stop hier
@ jmp hauptprogramm ;weiter
.endp
; ---------------------------- S U B R O U T I N E N ----------------------------------
.proc kollplayer
clc
lda kollp0
cmp #1
bcc @+
mva #0 kollp0
@ rts
.endp
.proc kollision
ldx #0
clc
@ inx
cpx #255
bcc @-
rts
.endp
.proc umschalten
ldy #4 ;Bildschirme umschalten von unsichtbar auf sichtbar
mva sdlstl var5
mva sdlstl+1 var5+1
lda var1
sta (var5),y
iny
lda var1+1
sta (var5),y
rts
.endp
.proc wartes
clc
ldx delay ; Warteschleife
st lda RTCLOK+2
wa cmp RTCLOK+2
beq wa
dex
bpl st
rts
.endp
.proc warte2
clc
@ dec delay1
lda delay1
cmp #1
bne @-
rts
.endp
.proc feinscroll
ldy #1
mva #0 delay
mva #255 delay1
@ jsr wartes
sty vscrol
iny
cpy #8
bne @-
inc schussi
#if .byte schussi=#1
mwa #$7508 var2 ;var1 auf 29960 ($7508) setzen
mwa #$7b0C var1
#end
#if .byte schussi=#2
mwa #$7530 var1 ;var1 auf 30000 ($7530) setzen
mwa #$7AE4 var2 ;var2 auf 31460 ($7AE4) setzen
#end
rts
.endp
.proc schusslogik
#if .byte strig0=#0
asl schussi
#end
#if .byte schussi=#2
lda xposp1
sta hposm0
lda #0
ldy yschuss1
sta (miss1),y
lda yposp1
adc #9
sta yschuss1
asl schussi
mva #1 schussi
#end
#if .byte schussi=#8
lda xposp1
adc #12
sta hposm1
lda #0
ldy yschuss2
sta (miss1),y
lda yposp1
adc #9
sta yschuss2
mva #1 schussi
#end
rts
.endp
.proc grobscroll
;Den Bildschirm um eins hoch / Grobscrolling um eine Zeile
ldx #22
@ ldy #$28
clc
@ lda (var1),y
sta itemex
#if .byte itemex=#68
jsr fuel
#end
sta (var2),y
dey
bpl @-
clc
lda var1
adc #$28
sta var1
bcc @+
inc var1+1
@ clc
lda var2
adc #$28
sta var2
bcc @+
inc var2+1
@ clc
dex
bpl @-3
#if .byte schussi=#1
mwa #$7530 var1 ;var1 + var2 auf 30000 ($7530) setzen
mwa #$7530 var2
#end
#if .byte schussi=#$2
mwa #$7b0C var1 ;var1 + var2 auf 31500 ($7B0C) setzen
mwa #$7b0C var2
mva #0 schussi
#end
rts
.endp
.proc letztereihe
;Die letzte Reihe printen
;Start der letzten Reihe bei var1 - Line 22
;in Var6 (+1) wird die Position von lands gespeichert
;in Var5 gehen Infos der Boarderanzahl rein
;in y ist der Zähler für letzte Reihe
;x wird als Zähler fürs printen benutzt
clc
lda var1+1
;sta var8+1
;sta var7+1
lda var1
;sta var8
;sta var7
adc #112
sta var1
inc var1+1
inc var1+1
inc var1+1
ldy #0
clc
lda (var6),y ;Boarderanzahl 1 holen
sta var5
tax ;Boarderanzahl 1 in x speichern
jsr var6up
lda (var6),y ;Boarderart 1 holen
sta var7 ;abspeichern in var7
@ iny
sta (var1),y ;Boarder1 printen
dex
bpl @-
jsr var6up
lda (var6),y ;Boarderanzahl 2 holen
tax
jsr var6up
lda (var6),y ;Boarderart 2 holen
ldy var5
@ iny
sta (var1),y ;printen
dex
bpl @-
sty var5 ;Zeilenzähler sichern
jsr var6up
lda (var6),y ;Rand Boarder2 holen
inc var5 ;Zeilenzähler eins weiter
ldy var5
sta (var1),y ;Rand Boarder1 printen
jsr var6up
lda(var6),y ;leer holen
tax
lda #0
ldy var5
@ iny
sta (var1),y ;leer printen
dex
bpl @-
sty var5 ;Zeilenzähler sichern
jsr var6up
lda(var6),y ;Rand Boarder3 holen
ldy var5
iny
sty var5
sta (var1),y ;Rand Boarder3 printen
jsr var6up
lda(var6),y ;Boarder4 holen
tax ;Boarderanzahl in x speichern
jsr var6up
lda (var6),y
ldy var5
@ iny
sta (var1),y ;Boarder4 printen
dex
bpl @-
sty var5 ;Zeilenzähler sichern
jsr var6up
lda(var6),y ;Boarder5 holen
tax ;Boarderanzahl in x speichern
jsr var6up
lda (var6),y
ldy var5
@ iny
sta (var1),y ;Boarder5 printen
dex
bpl @-
jsr var6up
lda (var6),y ;Sonderitem holen
sta var5 ;Item in Var5 speichern
#if .byte var5=#99
jmp *
#end
jsr var6up
#if .byte var5=#50 ;Öltank printen
ldx #11
clc
@ mva tankol,x pr1,x
dex
bpl @-
#if .byte tank1x=#0
mva var1 tank1y
mva var1+1 tank1y+1
sec
lda tank1y
sbc #120
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
#end
lda (var6),y ;Startposition des Items in y speichern
sta tank1x
tay
jsr fuel ;Fueltank printen
#end
#if .byte var5=#51 ;Rakete printen
ldx #11
clc
@ mva rakete,x pr1,x
dex
bpl @-
#if .byte tank1x=#0
mva var1 tank1y
mva var1+1 tank1y+1
sec
lda tank1y
sbc #120
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
#end
lda (var6),y ;Startposition des Items in y speichern
sta tank1x
tay
jsr fuel ;Rakete printen
#end
#if .byte var5=#52 ;Alien printen
ldx #11
clc
@ mva alien,x pr1,x
dex
bpl @-
#if .byte tank1x=#0
mva var1 tank1y
mva var1+1 tank1y+1
sec
lda tank1y
sbc #120
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
#end
lda (var6),y ;Startposition des Items in y speichern
sta tank1x
tay
jsr fuel ;Alien printen
#end
#if .byte var5=#53 ;TNT printen
ldx #11
clc
@ mva tnt,x pr1,x
dex
bpl @-
#if .byte tank1x=#0
mva var1 tank1y
mva var1+1 tank1y+1
sec
lda tank1y
sbc #120
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
#end
lda (var6),y ;Startposition des Items in y speichern
sta tank1x
tay
jsr fuel ;TNT printen
#end
jsr var6up
mva #0 vscrol
sec
lda tank1y
sbc #40
sta tank1y
lda tank1y+1
sbc #0
sta tank1y+1
lda tank1x
tay
mva #0 var5
rts
var6up clc
lda var6
adc #1
sta var6
ldy #0
lda var6+1
adc #0
sta var6+1
rts
.endp
.proc fuel
sec ;Routine um den Öltank zu printen - es werden 12 Character meanderförmig geprinten 3x4 Matrix
lda var1
sbc #160
sta var2
lda var1+1
sbc #0
sta var2+1
fuelex lda pr1
sta (var2),y ;1
lda pr2
iny
sta (var2),y ;2
lda pr3
iny
sta (var2),y ;3
clc
lda var2
adc #41
sta var2
lda var2+1
adc #0
sta var2+1
dey
lda pr4
sta (var2),y ;4
dey
lda pr5
sta (var2),y ;5
dey
lda pr6
sta (var2),y ;6
clc
lda var2
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
lda pr7
sta (var2),y ;7
lda pr8
iny
sta (var2),y ;8
lda pr9
iny
sta (var2),y ;9
clc
lda var2
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
lda pr10
sta (var2),y ;10
dey
lda pr11
sta (var2),y ;11
dey
lda pr12
sta (var2),y ;12
tya
rts
.endp
.proc kollitem
;var8 unveränderter Bildschirmanfang
lda yschuss1 ;in Gr.0 -32 (sichtbarer Bereich ab 32 und /8
sec
sbc #32
clc
ror
clc
ror
clc
ror
sta yschuss1 ;y-Position in das x-Register schreiben
tax
dex ; und einen abziehen
lda xschuss1 ;x-Position -48 (sichtbarer Bereich)und /4
sec
sbc #48
clc
ror
clc
ror
tay ;in y geht die x-Position
sec
mva var1 var2 ;holen der Bildschirmadresse -> var2
mva var1+1 var2+1
clc
@ lda var2 ;jetzt die y-Position auf die richtige Höhe stellen
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
dex
bpl @- ;die y-Position steht in x - Addition von x Zeilen
@ dey ;die korrekte x-Position einstellen
lda (var2),y ;linken Rand checken
sta var8
iny
iny
lda (var2),y ;rechten Rand checken
sta var9
dey
dey
#if .byte var8=#0 .and .byte var9>#0 ;Position nach rechts anpassen
iny
#end
#if .byte var8>#0 .and .byte var9=#0 ;Position nach links anpassen
dey
#end
lda (var2),y ;2. Durchgang der Anpassung um letzte
sta var8 ;Fehler zu beseitigen
iny
iny
lda (var2),y
sta var9
dey
dey
#if .byte var8=#0 .and .byte var9>#0
iny
#end
#if .byte var8>#0 .and .byte var9=#0
dey
#end
lda (var2),y ;Korrektur der y-Position
sta var8 ;in var8 aktuelle BS-Position
sec
lda var2 ;eins drüber - bleibt wenn var2 zu tief
sbc #40
sta var2
lda var2+1
sbc #0
sta var2+1
lda (var2),y ;lade Bildschirminhalt eins drüber
sta var9 ;das geht in var9 rein
#if .byte var8>#0 .and .byte var9=#0 ;alte Position var2
clc ;wiederherstellen
lda var2
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
#end
#if .byte var8=#0 .and .byte var9=#0 ;alte Position var2
clc ;eins runter
lda var2
adc #80
sta var2
lda var2+1
adc #0
sta var2+1
#end
lda (var2),y ;2. Durchgang der Anpassung um letzte
sta var8 ;Fehler zu beseitigen
sec
lda var2
sbc #40
sta var2
lda var2+1
sbc #0
sta var2+1
lda (var2),y
sta var9
#if .byte var8>#0 .and .byte var9=#0
clc
lda var2
adc #40
sta var2
lda var2+1
adc #0
sta var2+1
#end
#if .byte var8=#0 .and .byte var9=#0
clc
lda var2
adc #80
sta var2
lda var2+1
adc #0
sta var2+1
#end
#if .byte kollges=#1
sec
lda var2
sbc #80
sta var2
lda var2+1
sbc #0
sta var2+1
#end
#if .byte kollges=#8
sec
lda var2
sbc #80
sta var2
lda var2+1
sbc #0
sta var2+1
#end
;ab hier stimmt die Position des Items (meistens)
;in der Variable y für x-Position
;und in var2 für die y-Position
expl11
mva var2 tank1pos ;y-Position für Explosion1
mva var2+1 tank1pos+1
mva #96 audf1
mva #32 audc1
mva #222 audf2
mva #32 audc2
inc audc1
inc audc2
ldx #11
clc
@ mva expl1,x pr1,x
dex
bpl @-
jsr fuel.fuelex
inc audc1
inc audc2
tay
iny
expl22
mva tank1pos var2
mva tank1pos+1 var2+1
ldx #11
clc
@ mva expl2,x pr1,x
dex
bpl @-
inc audc1
mva #1 delay
jsr wartes
inc audc2
inc audc1
jsr fuel.fuelex
tay
iny
expl33
ldx #11
clc
@ mva expl3,x pr1,x
dex
bpl @-
mva tank1pos var2
mva tank1pos+1 var2+1
inc audc2
inc audc1
mva #1 delay
jsr wartes
jsr fuel.fuelex
inc audc1
inc audc2
tay
iny
expl44
ldx #11
clc
@ mva expl4,x pr1,x
dex
bpl @-
mva tank1pos var2
mva tank1pos+1 var2+1
inc audc1
inc audc2
mva #1 delay
jsr wartes
inc audc1
inc audc2
jsr fuel.fuelex
tay
iny
rts
.endp
.proc incfuelzaehler
inc fuelzaehleritem
lda fuelzaehler
tax
lda fuelzaehleritem
sta 31043,x
sta 32543,x
#if .byte fuelzaehleritem=#155
mva #151 fuelzaehleritem
inc fuelzaehler
#end
#if .byte fuelzaehler>#200
mva #0 fuelzaehler
#end
#if .byte fuelzaehler=#20
mva #52 color3
#end
#if .byte fuelzaehler>#34 .and .byte fuelzaehler<#200
;jmp main1
mva #0 fuelzaehler ;Fuel zuende Neustart
#end
mva #0 audc1
rts
.endp
.proc text
ldx #0
lda #52
jsr prte
inx
lda #45
jsr prte
inx
lda #54
jsr prte
inx
lda #31
jsr prte
inx
lda #52
jsr prte
inx
lda #49
jsr prte
inx
lda #0
jsr prte
inx
lda #54
jsr prte
inx
lda #50
jsr prte
inx
lda #0
jsr prte
inx
lda #51
jsr prte
inx
lda #47
jsr prte
inx
lda #50
jsr prte
inx
lda #42
jsr prte
inx
lda #50
jsr prte
inx
lda #53
jsr prte
inx
lda #0
jsr prte
inx
lda #55
jsr prte
inx
lda #34
jsr prte
inx
lda #32
jsr prte
inx
lda #34
jsr prte
inx
lda #34
jsr prte
inx
lda #0
jsr prte
inx
lda #51
jsr prte
inx
lda #45
jsr prte
inx
lda #54
jsr prte
inx
lda #45
jsr prte
inx
lda #52
jsr prte
inx
lda #0
jsr prte
inx
lda #51
jsr prte
inx
lda #52
jsr prte
inx
lda #50
jsr prte
inx
lda #44
jsr prte
inx
lda #45
jsr prte
inx
lda #47
jsr prte
inx
lda #48
jsr prte
inx
lda #0
jsr prte
ldx #0 ;Fuel
lda #46
jsr prte2
inx
lda #31
jsr prte2
inx
lda #45
jsr prte2
inx
lda #48
jsr prte2
ldx #10 ;Score
lda #53
jsr prte2
inx
lda #43
jsr prte2
inx
lda #50
jsr prte2
inx
lda #52
jsr prte2
inx
lda #45
jsr prte2
inx
lda #0
jsr prte2
inx
lda #160
jsr prte2
inx
lda #32
jsr prte2
inx
lda #32
jsr prte2
inx
lda #32
jsr prte2
ldx #23 ;Ships
lda #53
jsr prte2
inx
lda #47
jsr prte2
inx
lda #33
jsr prte2
inx
lda #51
jsr prte2
inx
lda #53
jsr prte2
inx
lda #0
jsr prte2
inx
lda #28
jsr prte2
inx
lda #29
jsr prte2
inx
lda #0
jsr prte2
inx
lda #28
jsr prte2
inx
lda #29
jsr prte2
inx
lda #0
jsr prte2
inx
lda #28
jsr prte2
inx
lda #29
jsr prte2
ldx #0
fuellauf
clc
lda fuelzaehleritem
@ jsr prte3
inx
cpx #36
bne @-
rts
prte sta 30923,x
sta 32423,x
rts
prte2 sta 31003,x
sta 32503,x
rts
prte3 sta 31043,x
sta 32543,x
rts
.endp
.proc pmvorbereiten
; Player vorbereiten und initialisieren
; Kollisionen: 4 = Grün 2 = Gelb
mva #10 yposp1
mva #120 xposp1
mva #42 yposm1
mva #0 xposm1
mva #94 yposm2
mva #49 xposm2
mva #0 tank1x
mva #0 tank1y
lda ramtop
sec
sbc #16
sta pmbase
clc
adc #3
sta miss1+1
sta miss2+1
sta miss3+1
sta miss4+1
adc #1
sta play1+1
adc #2
sta play3+1
adc #1
sta play4+1
lda #9
sta play4
lda #3
sta play3
mva #62 sdmctl
mva #56 pcolr0
mva #15 pcolr1
mva #119 pcolr2
mva #191 pcolr3
mva #1 gprior
mva #3 gractl
mva #1 sizep0
mva #1 sizep1
mva #1 sizep2
mva #0 sizem
mva #0 rechts
mva #2 hitclr
mva #48 blink
mva #40 p1pf
mva #8 hposm0
mva #8 hposm1
mva #8 hposm2
mva #8 hposm3
mva #1 yschuss1
mva #11 yschuss2
mva #22 yschuss3
mva #33 yschuss4
mva #0 schussi
mva <lands var6
mva >lands var6+1
mva #0 kollp0
ldy #255 ;Speicher Player 1 leeren
lda #0
sta play1
@ sta (play1),y
sta (play4),y
sta (play3),y
dey
bpl @-
clc
ldy yposp1 ;verticale Startpos. Player 1 + füllen
ldx #0
@ lda pm1,x
sta (play1),y
iny
inx
cpx #14
bne @-
rts
.end
.proc blinken
lda blink2
adc #59
sta blink2
#if .byte blink2>=#0 .and .byte blink2<#60
mva #0 blink
ldx #1
lda #0
ldy #2
mva #250 store1
jsr sound1
#end
#if .byte blink2>=#60 .and .byte blink2<#128
mva #14 blink
ldx #1
lda #0
ldy #2
mva #234 store1
jsr sound1
#end
#if .byte blink2>=#128 .and .byte blink2<=#192
mva #28 blink
ldx #1
lda #0
ldy #2
mva #218 store1
jsr sound1
#end
#if .byte blink2>=#192 .and .byte blink2<=#255
mva #42 blink
ldx #1
lda #0
ldy #2
mva #202 store1
jsr sound1
#end
rts
.endp
.proc schuesse
#if .byte yschuss1>#207
ldy yschuss1
dey
lda #0
sta (miss1),y
iny
sta (miss1),y
mva #8 hposm0
mva #1 hitclr
#end
#if .byte yschuss2>#207
ldy yschuss2
dey
lda #0
sta (miss1),y
iny
sta (miss1),y
mva #8 hposm1
mva #1 hitclr
#end
#if .byte yschuss3>#207
dey
lda #0
sta (miss1),y
iny
sta (miss1),y
mva #8 hposm2
mva #1 hitclr
#end
#if .byte yschuss4>#207
ldy yschuss4
dey
lda #0
sta (miss1),y
iny
sta (miss1),y
mva #1 hitclr
mva #8 hposm3
#end
rts
.endp
.proc kollmissile
#if .byte kollges=#4
mva #15 color3
sec
lda fuelzaehler
sbc #10
sta fuelzaehler
tax
mva #151 fuelzaehleritem
clc
lda fuelzaehleritem
@ sta 31043,x
sta 32543,x
inx
cpx #36
bne @-
jsr kollitem
mva #0 kollges
#end
#if .byte kollges=#8
jsr kollitem
lda #0
sta kollges
#end
#if .byte kollges=#1
jsr kollitem
lda #0
sta kollges
#end
rts
.endp
.proc variablensetzen
mva #>chr chbas ;HighByte Character Pointer auf $2000 setzen
mva #192 gprior ;GTIA Modus 3
mva #12 color3 ;Schriftfarbe
mva #220 color1 ;Gelb
mva #153 color0 ;Blau
;mva #52 color0 ;Rot
mva #180 color2 ; Grün
mva #0 color4 ;Hintergrundfarbe
lda #0 \ tax \ sta var3 \ sta var4 \ sta var6 \ sta var7 \ sta var6+1 \ sta feuer6
rts
.end
.proc dlist
.by 112,112,112,100
.by 30,75
:21 .by 36
:5 .by 4
.by 65
.wo dlist
.endp
.proc sound1
;x Register - Stimme
;Akkumulator - Distorsion
;y Register - Volumen
;Store2 - Frequenz
pha
txa
asl
tax
lda store1
sta audf1,x
sty store1
lda #0
sta audctl
lda #3
sta skctl
pla
asl
asl
asl
asl
clc
adc store1
sta audc1,x
rts
.endp
.proc sound2
;x Register - Stimme
;Akkumulator - Distorsion
;y Register - Volumen
;Store2 - Frequenz
pha
txa
asl
tax
lda store3
sta audf2,x
sty store2
lda #0
sta audctl
lda #3
sta skctl
pla
asl
asl
asl
asl
clc
adc store2
sta audc2,x
rts
.endp
.proc soundschuss
#if .byte sound12<#16 .and .byte sound12>#0
ldx #2
lda #1
ldy sound12
mva #2 store2
dec sound12
dec sound12
jsr sound2
clc
lda store3
adc #10
sta store3
#end
#if .byte sound12>=#15
mva #0 audc2
mva #0 audf2
ldx #0
lda #0
ldy #0
mva #170 store3
mva #0 store2
jsr sound2
mva #16 sound12
mva #170 store3
#end
rts
.end
run main
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
endlich klappt die Explosion...
... heute habe ich es endlich hinbekommen!!
Die Explosion läuft animiert sauber durch während das Programm weiterscrollt... daran arbeite ich jetzt tatsächlich seit Wochen.
Eine Idee war ja, daß die Explosion ständig im VBI animiert läuft und man beim Auslösen der Explosion einfach die ständig animierten Charakter auf das Item printet. So kann man letztlich. auch alles animieren wenn es die Zeit zuläßt. Ds habe ich prinzipiell umgesetzt, das Problem dabei ist natürlich, dass die Explosion nie vorbei ist und das explodierende Item quasi explodierend aus dem Bildschirm läuft... fand ich nicht so die beste Lösung.
Darum habe ich ja alle 4 Explosionsphasen hintereinander laufen lassen mit kleiner Warteschleife, was dann ganz gut aussieht, was aber immer einen kleinen Ruckler erzeugt... auch blöd.
Gestern habe ich mir nochmal Caverns of Mars 1, 2 und Phobos angeschaut.. und tatsächlich war natürlich Caverns of Mars 1 noch relativ einfach gebaut... man sieht den enormen Fortschritt von CoM 2 und dann zu Phobos...
Und hallo... in CoM 1 hat der Programmierer wohl ähnliche Probleme gehabt mit der Explosion, denn er macht es genauso und animiert sie ständig bis sie nach oben rausläuft... bei Phobos hat er es gelöst... dort läuft die Explosion sauber aber relativ langsam...
Mein Lösung nun:
Mein Hauptprogramm habe ich mittlerweile relativ übersichtlich, da laufen ständig ein paar Subroutinenaufrufe .. also der Aufbau der letzten Reihe, Fein- und Grobscroll, Umschalten der Bidlschirme und Sound / Blinken. / Kollision. Der VBI läuft ja eh durch.
Wenn nun eine Kollision stattfindet, dann ruft das Programm die entsprechende Subroutine auf, hier wird die genaue Position für die Explosion berechnet und korrigiert und dann laufen die 4 Phasen der Explosion hintereinander ab. Zwischen den einzelnen Phasen rufe ich nun einfach die Subroutinen für Feinscroll / Grobscroll / Umschalten und letzte Reihe jeweils auf (also das ganze Hauptprogramm) und das jedes Mal vor den einzelnen Explosionsphasen... zwischendurch muss ich nur noch die y-Position um 40 Einheiten korrigieren (weil er ja um eine Zeile scrollt) und das war es (fast).
Das muss ich insgesamt 8 x machen, daher läuft die Explosion recht langsam durch, aber es funktioniert...
Was für ein tricky-Aufwand für diesen scheinbar simplen Effekt.......
Morgen lade ich das mal als mov-Datei hoch!
LG und gute Nacht
Peter
P.s. Es gibt noch viel zu tun, aber so langsam muss ich mir Gedanken für mein nächstes Projekt machen... Ideen für ein schönes Spiel welcome!!
Die Explosion läuft animiert sauber durch während das Programm weiterscrollt... daran arbeite ich jetzt tatsächlich seit Wochen.
Eine Idee war ja, daß die Explosion ständig im VBI animiert läuft und man beim Auslösen der Explosion einfach die ständig animierten Charakter auf das Item printet. So kann man letztlich. auch alles animieren wenn es die Zeit zuläßt. Ds habe ich prinzipiell umgesetzt, das Problem dabei ist natürlich, dass die Explosion nie vorbei ist und das explodierende Item quasi explodierend aus dem Bildschirm läuft... fand ich nicht so die beste Lösung.
Darum habe ich ja alle 4 Explosionsphasen hintereinander laufen lassen mit kleiner Warteschleife, was dann ganz gut aussieht, was aber immer einen kleinen Ruckler erzeugt... auch blöd.
Gestern habe ich mir nochmal Caverns of Mars 1, 2 und Phobos angeschaut.. und tatsächlich war natürlich Caverns of Mars 1 noch relativ einfach gebaut... man sieht den enormen Fortschritt von CoM 2 und dann zu Phobos...
Und hallo... in CoM 1 hat der Programmierer wohl ähnliche Probleme gehabt mit der Explosion, denn er macht es genauso und animiert sie ständig bis sie nach oben rausläuft... bei Phobos hat er es gelöst... dort läuft die Explosion sauber aber relativ langsam...
Mein Lösung nun:
Mein Hauptprogramm habe ich mittlerweile relativ übersichtlich, da laufen ständig ein paar Subroutinenaufrufe .. also der Aufbau der letzten Reihe, Fein- und Grobscroll, Umschalten der Bidlschirme und Sound / Blinken. / Kollision. Der VBI läuft ja eh durch.
Wenn nun eine Kollision stattfindet, dann ruft das Programm die entsprechende Subroutine auf, hier wird die genaue Position für die Explosion berechnet und korrigiert und dann laufen die 4 Phasen der Explosion hintereinander ab. Zwischen den einzelnen Phasen rufe ich nun einfach die Subroutinen für Feinscroll / Grobscroll / Umschalten und letzte Reihe jeweils auf (also das ganze Hauptprogramm) und das jedes Mal vor den einzelnen Explosionsphasen... zwischendurch muss ich nur noch die y-Position um 40 Einheiten korrigieren (weil er ja um eine Zeile scrollt) und das war es (fast).
Das muss ich insgesamt 8 x machen, daher läuft die Explosion recht langsam durch, aber es funktioniert...
Was für ein tricky-Aufwand für diesen scheinbar simplen Effekt.......
Morgen lade ich das mal als mov-Datei hoch!
LG und gute Nacht
Peter
P.s. Es gibt noch viel zu tun, aber so langsam muss ich mir Gedanken für mein nächstes Projekt machen... Ideen für ein schönes Spiel welcome!!
- Kveldulfur
- Beiträge: 624
- Registriert: 17.08.2021 02:32
- Has thanked: 239 times
- Been thanked: 163 times
- Kontaktdaten:
Re: Return to Phobos
Hallo!
Schön zu sehen, dass Du Deine Probleme lösen kannst.
Ich habe bei meiner Programmierung nun auch zum 3. Mal restrukturiert. Dafür lernt man aber immer mehr über den ATARI und durch den Lernfortschritt wird das Programm auch kürzer und somit optimierter.
Wie im Interrupt-Thread vorgeschlagen, lasse ich in meiner Hauptschleife den Hintergrund am Anfang weiß setzten und zum Schluß wieder schwarz. Die Schleife wird immer direkt hinter einem VBI gestartet. Solange ich kein weiß auf dem Bildschirm sehe, ist die Hauptroutine schnell genug
Da es bei mir kein Scrolling gibt, habe ich da natürlich einen Vorteil.
Grüße
Janko
Schön zu sehen, dass Du Deine Probleme lösen kannst.
Ich habe bei meiner Programmierung nun auch zum 3. Mal restrukturiert. Dafür lernt man aber immer mehr über den ATARI und durch den Lernfortschritt wird das Programm auch kürzer und somit optimierter.
Wie im Interrupt-Thread vorgeschlagen, lasse ich in meiner Hauptschleife den Hintergrund am Anfang weiß setzten und zum Schluß wieder schwarz. Die Schleife wird immer direkt hinter einem VBI gestartet. Solange ich kein weiß auf dem Bildschirm sehe, ist die Hauptroutine schnell genug
Da es bei mir kein Scrolling gibt, habe ich da natürlich einen Vorteil.
Grüße
Janko
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Das mit der Schleife ist gut… werde ich beim nächsten Projekt auch so machen… was programmierst du eigentlich, Janko?
- Kveldulfur
- Beiträge: 624
- Registriert: 17.08.2021 02:32
- Has thanked: 239 times
- Been thanked: 163 times
- Kontaktdaten:
Re: Return to Phobos
Ich, ja... naja ist nur so ein Spiel wo Du eine Figur steuerst und Münzen einsammeln musst. Auf Zeichensatzgrafik basierend ohne Feinscrolling und so..
Aber ich habe z.B. einen horizontalen und vertikalen Textscroller im Menü, um diese Techniken zu testen.
Dabei nutze ich die empfohlen Displaylist-Methode, wo ich die Displaylist nach 7 Schritte des Feinscrollings manipuliere und so keinen Speicher umkopieren muss.
Funktioniert echt Sahne
Mein Wunsch ist es am Software-Wettbewerb teilzunehmen, auch wenn es nur der letzte Platz werden wird
Deshalb veröffentliche ich auch nichts von meinem Spiel, weil dies leider untersagt ist.
Ist aber auch noch viel zu programmieren. Mal sehen, ob ich es überhaupt fertig bekomme.
Grüße
Janko
Aber ich habe z.B. einen horizontalen und vertikalen Textscroller im Menü, um diese Techniken zu testen.
Dabei nutze ich die empfohlen Displaylist-Methode, wo ich die Displaylist nach 7 Schritte des Feinscrollings manipuliere und so keinen Speicher umkopieren muss.
Funktioniert echt Sahne
Mein Wunsch ist es am Software-Wettbewerb teilzunehmen, auch wenn es nur der letzte Platz werden wird
Deshalb veröffentliche ich auch nichts von meinem Spiel, weil dies leider untersagt ist.
Ist aber auch noch viel zu programmieren. Mal sehen, ob ich es überhaupt fertig bekomme.
Grüße
Janko
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Also ich würde wohl auch am Software-Wettbewerb teilnehmen, mein Spiel ist ja nicht fertig und "veröffentlicht", insofern sollte das kein Problem sein. Auch stammt der Code komplett von mir, wie man gut nachvollziehen kann... sollte die Kommision dennoch damit "Probleme" haben, dann wäre es auch kein Drama!
Ich werde mal bei Zeiten Sascha fragen, wie die das sehen... spätestens auf der NOMAM werde ich sie ja sehen.
Ansonsten wäre ich wirklich sehr sehr interessiert an dem Scrollcode mit der D-List von dir, denn das will ich auf jeden Fall beim nächsten Mal umsetzen und müsste das Rad nicht komplett neu herleiten...
Mein Scrollen verbrät halt richtig CPU Power ... das merkt man dann durchasu
Ich werde mal bei Zeiten Sascha fragen, wie die das sehen... spätestens auf der NOMAM werde ich sie ja sehen.
Ansonsten wäre ich wirklich sehr sehr interessiert an dem Scrollcode mit der D-List von dir, denn das will ich auf jeden Fall beim nächsten Mal umsetzen und müsste das Rad nicht komplett neu herleiten...
Mein Scrollen verbrät halt richtig CPU Power ... das merkt man dann durchasu
- Kveldulfur
- Beiträge: 624
- Registriert: 17.08.2021 02:32
- Has thanked: 239 times
- Been thanked: 163 times
- Kontaktdaten:
Re: Return to Phobos
Hallo!
Ich habe einmal die von mir genutzte Routine separiert und als eigenes Programm hier eingefügt.
Die Systemkonstanten müssen jedoch im selben Pfad liegen und inkludiert werden.
Ich hoffe, dass der Quellcode nachvollziehbar ist. Sicherlich kann man hier noch optimieren.
Grüße
Janko
Ich habe einmal die von mir genutzte Routine separiert und als eigenes Programm hier eingefügt.
Die Systemkonstanten müssen jedoch im selben Pfad liegen und inkludiert werden.
Code: Alles auswählen
icl 'Systemkonstanten.asm'
; ########################################################################################################
; ### Speicherbereiche und Variabeln definieren
; Bildschirmspeicher ab $3000
org $3000
ScrMem01 .byte " "
ScrMem02 .byte " "
ScrMem03 .byte " "
ScrMem04 .byte " "
ScrMem05 .byte " "
ScrMem06 .byte " "
ScrMem07 .byte " "
ScrMem08 .byte " "
ScrMem09 .byte " "
ScrMem10 .byte " "
ScrMem11 .byte " "
ScrMem12 .byte " "
ScrMem13 .byte " "
ScrMem14 .byte " "
ScrMem15 .byte " "
ScrMem16 .byte " "
ScrMem17 .byte " "
ScrMem18 .byte " "
ScrMem19 .byte " "
ScrMem20 .byte " "
ScrMem21 .byte " "
ScrMem22 .byte " "
ScrMem23 .byte " "
ScrMem24 .byte " "
; # Displaylist ab $3400 definieren
org $3400
DPList .byte $70,$70,$70 ; 24 leere Scanzeilen (der normale obere Block)
.byte $42,<ScrMem01,>ScrMem01 ; Die oberen 2 Zeilen werden nicht gescrollt
.byte $42,<ScrMem02,>ScrMem02
VScrollStart .byte $62,<ScrMem03,>ScrMem03
.byte $62,<ScrMem04,>ScrMem04
.byte $62,<ScrMem05,>ScrMem05
.byte $62,<ScrMem06,>ScrMem06
.byte $62,<ScrMem07,>ScrMem07
.byte $62,<ScrMem08,>ScrMem08
.byte $62,<ScrMem09,>ScrMem09
.byte $62,<ScrMem10,>ScrMem10
.byte $62,<ScrMem11,>ScrMem11
.byte $62,<ScrMem12,>ScrMem12
.byte $62,<ScrMem13,>ScrMem13
.byte $62,<ScrMem14,>ScrMem14
.byte $62,<ScrMem15,>ScrMem15
.byte $62,<ScrMem16,>ScrMem16
.byte $62,<ScrMem17,>ScrMem17
.byte $62,<ScrMem18,>ScrMem18
.byte $62,<ScrMem19,>ScrMem19
.byte $62,<ScrMem20,>ScrMem20
.byte $62,<ScrMem21,>ScrMem21
.byte $42,<ScrMem22,>ScrMem22
.byte $42,<ScrMem23,>ScrMem23 ; Die unteren 2 Zeilen werden ebenfalls
.byte $42,<ScrMem24,>ScrMem24 ; nicht gescrollt
.byte $41,<DPList,>DPList ; JVB, und die Displaylist wieder starten
; # Scrollschema, um weniger berechnen zu müssen
DPScroll .word ScrMem03, ScrMem04, ScrMem05, ScrMem06, ScrMem07
.word ScrMem08, ScrMem09, ScrMem10, ScrMem11, ScrMem12
.word ScrMem13, ScrMem14, ScrMem15, ScrMem16, ScrMem17
.word ScrMem18, ScrMem19, ScrMem20, ScrMem21, ScrMem22
.word ScrMem03, ScrMem04, ScrMem05, ScrMem06, ScrMem07
.word ScrMem08, ScrMem09, ScrMem10, ScrMem11, ScrMem12
.word ScrMem13, ScrMem14, ScrMem15, ScrMem16, ScrMem17
.word ScrMem18, ScrMem19, ScrMem20, ScrMem21
VScrollFine .byte $00 ; Finescrolling hier festhalten
VScrollPos .byte $02 ; Position des Zeigers für DPScroll
VScrollNext .byte $00 ; Temporäre-Variable
StoryPos .word Story ; Zeiger innerhalb des Textes
; $FE = Zeilenende oder 40 Zeichen ausgeben
; $FF = Text von vorne ausgeben
; 0123456789012345678901234567890123456789
Story .byte "Hier kommt die Textausgabe:",$FE
.byte $FE
.byte "Eine volle 40er Zeile benoetigt kein $FE"
.byte "am Ende",$FE
.byte $FE,$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte $FE,$FE,$FE,$FE,$FE,$FF
; ############################################################################
; # VSync
; #
.proc WaitVSync
lda RTCLOK+2
Loop cmp RTCLOK+2
beq Loop
rts
.end
; ########################################################################################################
; ### VBI - Routine zum Scrollen
.proc VBI
jsr VScroller
jmp XITVBV
; ### Unterroutinen im VBI
VScroller ; ######## Vertikaler Freinscroller im mittleren Titelbereich ########
inc VScrollFine
lda VScrollFine
cmp #$08
beq @+ ; Wenn Feinscolling bei 8 dann Grobscrolling
sta VSCROL
rts
@ ; ######## Vertikales Grobscrolling durch Displaylist-Manipulation
lda #$00 ; Feinscrolling auf 0 setzen
sta VScrollFine
sta VSCROL
ldx VScrollPos ; 20 Zeilen werden gescrollt
cpx #$28 ; Danach wieder auf 0 setzen
bcc @+
ldx #$00
stx VScrollPos
@ txa ; Damit X und Y nicht von 0 zählen
clc ; müssen, wird er Endwert für X
adc #$28 ; berechnet. Nun kann man direkt
sta VScrollNext ; hiermit vergleichen
ldy #$00 ; Y auf Null setzen, jedoch zählt
; Y immer drei Schritte hoch
@ iny ; pro Durchgang (Befehl, LOMEM, HIMEM)
lda DPScroll,x ; LO-Wert holen
sta VScrollStart,y ; und in der Displaylist setzen
inx
iny
lda DPScroll,x ; HI-Wert holen
sta VScrollStart,y ; und in der Displaylist setzen
iny
inx
cpx VScrollNext ; Alle Zeilen abgearbeitet?
bcc @-
; -- Ab hier kommt die Textausgabe
; -- Die natürlich vereinfacht werden kann
; -- Wichtig ist, dass der Text ab der Adresse
; -- Ausgabe1 bzw. Ausgabe2 augegeben wird
dex ; Zurück zur letzten Zeile
dex
lda DPScroll,x ; LO und HI müssen für die
sta Ausgabe1+1 ; Ausgabe der letzten Zeile
sta Ausgabe2+1 ; zwei Mal im Programmcode
inx ; übertragen werden
lda DPScroll,x ; Page 0 ist dann nicht
sta Ausgabe1+2 ; notwendig
sta Ausgabe2+2
inc VScrollPos ; Die Position fürs nächste scrollen
inc VScrollPos ; setzen
ZeileAusgeben lda StoryPos ; Nun den Zeiger innerhalb des
sta Textzeile+1 ; Textes setzen
lda StoryPos+1 ; und wieder ohne Page 0 direkt
sta Textzeile+2 ; im Programmcode speichern
ldx #$00
Textzeile lda $ffff,x ; Die Adresse zur Ausgabe wird manipuliert
cmp #$FE ; $FE signalisiert, dass die restlichen Zeichen
beq Zeilenende ; Leerzeichen sein sollen.
cmp #$FF ; $FF signalisiert, dass der Text von vorne
beq Textende ; ausgegeben werden soll.
Ausgabe1 sta $ffff,x
inx
cpx #$28 ; max. 40 Zeichen ausgeben
bcc Textzeile
stx TextNext+1 ; X-Zähler merken
Weiter clc
lda StoryPos
TextNext adc #$ff ; Die X gemachten Schritte werden nun auf den
sta StoryPos ; Gesamtzeiger addiert
lda StoryPos+1
adc #$00
sta StoryPos+1
rts ; Fertig mit dem Grobscrolling und der Zeilenausgabe
Zeilenende inx ; Rest Leerzeichen ausgeben
stx TextNext+1 ; X+1 abspeichern
dex ; Nun X wieder einen zurück, um die Ausgabe richtig
; zu starten
lda #" " ; restlichen Leerzeichen ausgeben
Ausgabe2 sta $ffff,x
inx
cpx #$28 ; bis max. 40 Stück
bcc Ausgabe2
jmp Weiter
Textende lda #<Story ; Text soll von vorne ausgegeben werden
sta StoryPos ; Hierfür den Zeiger wieder auf den
lda #>Story ; Anfang des Textes setzen
sta StoryPos+1
jmp ZeileAusgeben
.end
; ########################################################################################################
; ### Hauptprogramm
.proc main
lda #<DPList ; Displaylist laden
sta SDLSTL
lda #>DPList
sta SDLSTL+1
jsr WaitVSync
ldy #<VBI ; VBI für einrichten
ldx #>VBI
lda #7
jsr SETVBV
jsr WaitVSync
Loop jmp Loop
.end
; ########################################################################################################
run main
Grüße
Janko
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
... habs gleich mal ausprobiert... sehr geil!! Läuft echt flüssig!
Ich schau mir den Code noch ganz genau an, vielleicht kann ich das etwas umbauen und bei mir noch nutzen....
Vielen Dankfür den schönen Code!!
LG Peter
Ich schau mir den Code noch ganz genau an, vielleicht kann ich das etwas umbauen und bei mir noch nutzen....
Vielen Dankfür den schönen Code!!
LG Peter
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
... nochmal zum Grobscrollcode:
Der Graphikbildschirm hat im Textmodus 24 Zeilen a 40. Jede Zeile in der Displaylist bekommt also eine 2 eingeschrieben (die ersten 24 Scanlines bleiben leer).
Die erste Zeile hat dabei nicht den Wert 2 sondern 66 (64+2) - wobei die 64 einen Adressbefehl darstellt - nämlich den des Bildschirmanfanges. Es folgen dann die 23 nächsten Zeilen mit dem Wert 2 und danach kommt noch der Sprungbefehl mit Adresse des Displaylistanfanges.
Nun möchten wir folgendes machen: In jede Zeile schreibe ich statt einer 2 eine 66 (alles dezimal) rein mit der jeweiligen um eine Zeile höheren Adresse für den Bildschirm:
66 64 156 (40000)
66 104 156 (40040)
66 144 156 (40080)
66 184 156
66 224 156
.......... usw
am Ende wieder der Sprungbefehl für den Start der Displaylist.
Als nächstes (mein Grobscroll) kopiere ich einfach die Displaylist um - verschiebe also alle Zeilen um eins nach oben:
66 104 156
66 144 156
66 184 156
66 224 156
66 08 157
.....
66 64 156
Sprungbefehl Displaylistanfang
die letzte Zeile vor dem Sprungbefehl müsste dann wohl immer die vorherige erste sein.
Damit bekomme ich ein fortlaufendes Grobscroll des gesamten Bildschirmes.
Will ich jetzt einen Shooter damit machen, überschreibe ich einfach die komplette erste Zeile der Displaylist mit den neuen Landschaftsdaten (meine "letzte Reihe") - anschließend wird die erste Reihe durch Umsortierung der Displaylist letzte Reihe.
Theoretisch könnte ich auch ganz einfach 24 verschiedene Displaylist mit entsprechend versetzten Zeilen vorbereiten und dann einfach nur jeweils von Displaylist 1 zu 2 zu 3 zu .... zu 24 umschalten.
Die Displaylist wird dann noch so aufgebaut, daß der entsprechende Graphicmodus plus Feinscroll mit drin ist, der Grobscroll wird entsprechend immer einmal nach 7 Feinscrollaktionen durchgeführt.
So habe ich die Theorie verstanden.... das möchte ich demnächst mal umsetzen.
Habe ich das korrekt verstanden??
Liebe Grüße
Peter
Der Graphikbildschirm hat im Textmodus 24 Zeilen a 40. Jede Zeile in der Displaylist bekommt also eine 2 eingeschrieben (die ersten 24 Scanlines bleiben leer).
Die erste Zeile hat dabei nicht den Wert 2 sondern 66 (64+2) - wobei die 64 einen Adressbefehl darstellt - nämlich den des Bildschirmanfanges. Es folgen dann die 23 nächsten Zeilen mit dem Wert 2 und danach kommt noch der Sprungbefehl mit Adresse des Displaylistanfanges.
Nun möchten wir folgendes machen: In jede Zeile schreibe ich statt einer 2 eine 66 (alles dezimal) rein mit der jeweiligen um eine Zeile höheren Adresse für den Bildschirm:
66 64 156 (40000)
66 104 156 (40040)
66 144 156 (40080)
66 184 156
66 224 156
.......... usw
am Ende wieder der Sprungbefehl für den Start der Displaylist.
Als nächstes (mein Grobscroll) kopiere ich einfach die Displaylist um - verschiebe also alle Zeilen um eins nach oben:
66 104 156
66 144 156
66 184 156
66 224 156
66 08 157
.....
66 64 156
Sprungbefehl Displaylistanfang
die letzte Zeile vor dem Sprungbefehl müsste dann wohl immer die vorherige erste sein.
Damit bekomme ich ein fortlaufendes Grobscroll des gesamten Bildschirmes.
Will ich jetzt einen Shooter damit machen, überschreibe ich einfach die komplette erste Zeile der Displaylist mit den neuen Landschaftsdaten (meine "letzte Reihe") - anschließend wird die erste Reihe durch Umsortierung der Displaylist letzte Reihe.
Theoretisch könnte ich auch ganz einfach 24 verschiedene Displaylist mit entsprechend versetzten Zeilen vorbereiten und dann einfach nur jeweils von Displaylist 1 zu 2 zu 3 zu .... zu 24 umschalten.
Die Displaylist wird dann noch so aufgebaut, daß der entsprechende Graphicmodus plus Feinscroll mit drin ist, der Grobscroll wird entsprechend immer einmal nach 7 Feinscrollaktionen durchgeführt.
So habe ich die Theorie verstanden.... das möchte ich demnächst mal umsetzen.
Habe ich das korrekt verstanden??
Liebe Grüße
Peter
- Kveldulfur
- Beiträge: 624
- Registriert: 17.08.2021 02:32
- Has thanked: 239 times
- Been thanked: 163 times
- Kontaktdaten:
Re: Return to Phobos
Hallo Peter!
Deine Idee direkt umzukopieren, also ohne eine Tabelle, macht die Routine noch etwas smarter.
Hier ein Update:
Grüße
Janko
Deine Idee direkt umzukopieren, also ohne eine Tabelle, macht die Routine noch etwas smarter.
Hier ein Update:
Code: Alles auswählen
icl 'Systemkonstanten.asm'
; ########################################################################################################
; ### Speicherbereiche und Variabeln definieren
; Bildschirmspeicher ab $3000
org $3000
ScrMem01 .byte " "
ScrMem02 .byte " "
ScrMem03 .byte " "
ScrMem04 .byte " "
ScrMem05 .byte " "
ScrMem06 .byte " "
ScrMem07 .byte " "
ScrMem08 .byte " "
ScrMem09 .byte " "
ScrMem10 .byte " "
ScrMem11 .byte " "
ScrMem12 .byte " "
ScrMem13 .byte " "
ScrMem14 .byte " "
ScrMem15 .byte " "
ScrMem16 .byte " "
ScrMem17 .byte " "
ScrMem18 .byte " "
ScrMem19 .byte " "
ScrMem20 .byte " "
ScrMem21 .byte " "
ScrMem22 .byte " "
ScrMem23 .byte " "
ScrMem24 .byte " "
; # Displaylist ab $3400 definieren
org $3400
DPList .byte $70,$70,$70 ; 24 leere Scanzeilen (der normale obere Block)
.byte $42,<ScrMem01,>ScrMem01 ; Die oberen 2 Zeilen werden nicht gescrollt
.byte $42,<ScrMem02,>ScrMem02
VScrollStart .byte $62,<ScrMem03,>ScrMem03
.byte $62,<ScrMem04,>ScrMem04
.byte $62,<ScrMem05,>ScrMem05
.byte $62,<ScrMem06,>ScrMem06
.byte $62,<ScrMem07,>ScrMem07
.byte $62,<ScrMem08,>ScrMem08
.byte $62,<ScrMem09,>ScrMem09
.byte $62,<ScrMem10,>ScrMem10
.byte $62,<ScrMem11,>ScrMem11
.byte $62,<ScrMem12,>ScrMem12
.byte $62,<ScrMem13,>ScrMem13
.byte $62,<ScrMem14,>ScrMem14
.byte $62,<ScrMem15,>ScrMem15
.byte $62,<ScrMem16,>ScrMem16
.byte $62,<ScrMem17,>ScrMem17
.byte $62,<ScrMem18,>ScrMem18
.byte $62,<ScrMem19,>ScrMem19
.byte $62,<ScrMem20,>ScrMem20
.byte $62,<ScrMem21,>ScrMem21
.byte $42,<ScrMem22,>ScrMem22
.byte $42,<ScrMem23,>ScrMem23 ; Die unteren 2 Zeilen werden ebenfalls
.byte $42,<ScrMem24,>ScrMem24 ; nicht gescrollt
.byte $41,<DPList,>DPList ; JVB, und die Displaylist wieder starten
; # Scrollschema, um weniger berechnen zu müssen
VScrollFine .byte $00 ; Finescrolling hier festhalten
VScrollLast .byte 57 ; Anzahl wieviele Schritte X gehen muss = (20*3)-3
StoryPos .word Story ; Zeiger innerhalb des Textes
; $FE = Zeilenende oder 40 Zeichen ausgeben
; $FF = Text von vorne ausgeben
; 0123456789012345678901234567890123456789
Story .byte "Hier kommt die Textausgabe:",$FE
.byte $FE
.byte "Eine volle 40er Zeile benoetigt kein $FE"
.byte "am Ende",$FE
.byte $FE,$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte " # #",$FE
.byte $FE,$FE,$FE,$FE,$FE,$FF
; ############################################################################
; # VSync
; #
.proc WaitVSync
lda RTCLOK+2
Loop cmp RTCLOK+2
beq Loop
rts
.end
; ########################################################################################################
; ### VBI - Routine zum Scrollen
.proc VBI
jsr VScroller
jmp XITVBV
; ### Unterroutinen im VBI
VScroller ; ######## Vertikaler Freinscroller im mittleren Titelbereich ########
inc VScrollFine
lda VScrollFine
cmp #$08
beq @+ ; Wenn Feinscolling bei 8 dann Grobscrolling
sta VSCROL
rts
@ ; ######## Vertikales Grobscrolling durch Displaylist-Manipulation
lda #$00 ; Feinscrolling auf 0 setzen
sta VScrollFine
sta VSCROL
lda VScrollStart+1 ; Die Zeile die oben verschwindet
sta Ausgabe1+1 ; und unten mit neuen Text erscheint
sta Ausgabe2+1 ; muss zwischen gespeichert werden
lda VScrollStart+2 ; Hier noch das Hi-Byte
sta Ausgabe1+2
sta Ausgabe2+2
ldx #$00 ; Nun alle Zeilen umkopieren
@ lda VScrollStart+4,x ; aber nur die Angabe der
sta VScrollStart+1,x ; Speicheradresse
lda VScrollStart+5,x
sta VScrollStart+2,x
inx ; 3 Schritte weiter
inx
inx
cpx VScrollLast ; Alle Zeilen abgearbeitet?
bcc @-
lda Ausgabe1+1 ; Nun die gemerkte 1. Zeile
sta VScrollStart+1,x ; unten noch anfügen
lda Ausgabe1+2
sta VScrollStart+2,x
; -- Ab hier kommt die Textausgabe
; -- Die natürlich vereinfacht werden kann
; -- Wichtig ist, dass der Text ab der Adresse
; -- Ausgabe1 bzw. Ausgabe2 augegeben wird
ZeileAusgeben lda StoryPos ; Nun den Zeiger innerhalb des
sta Textzeile+1 ; Textes setzen
lda StoryPos+1 ; und wieder ohne Page 0 direkt
sta Textzeile+2 ; im Programmcode speichern
ldx #$00
Textzeile lda $ffff,x ; Die Adresse zur Ausgabe wird manipuliert
cmp #$FE ; $FE signalisiert, dass die restlichen Zeichen
beq Zeilenende ; Leerzeichen sein sollen.
cmp #$FF ; $FF signalisiert, dass der Text von vorne
beq Textende ; ausgegeben werden soll.
Ausgabe1 sta $ffff,x
inx
cpx #$28 ; max. 40 Zeichen ausgeben
bcc Textzeile
stx TextNext+1 ; X-Zähler merken
Weiter clc
lda StoryPos
TextNext adc #$ff ; Die X gemachten Schritte werden nun auf den
sta StoryPos ; Gesamtzeiger addiert
lda StoryPos+1
adc #$00
sta StoryPos+1
rts ; Fertig mit dem Grobscrolling und der Zeilenausgabe
Zeilenende inx ; Rest Leerzeichen ausgeben
stx TextNext+1 ; X+1 abspeichern
dex ; Nun X wieder einen zurück, um die Ausgabe richtig
; zu starten
lda #" " ; restlichen Leerzeichen ausgeben
Ausgabe2 sta $ffff,x
inx
cpx #$28 ; bis max. 40 Stück
bcc Ausgabe2
jmp Weiter
Textende lda #<Story ; Text soll von vorne ausgegeben werden
sta StoryPos ; Hierfür den Zeiger wieder auf den
lda #>Story ; Anfang des Textes setzen
sta StoryPos+1
jmp ZeileAusgeben
.end
; ########################################################################################################
; ### Hauptprogramm
.proc main
lda #<DPList ; Displaylist laden
sta SDLSTL
lda #>DPList
sta SDLSTL+1
jsr WaitVSync
ldy #<VBI ; VBI für die Musik einrichten
ldx #>VBI
lda #7
jsr SETVBV
jsr WaitVSync
Loop jmp Loop
.end
; ########################################################################################################
Janko
- DjayBee
- Beiträge: 628
- Registriert: 17.08.2021 04:02
- Has thanked: 387 times
- Been thanked: 177 times
- Kontaktdaten:
Re: Return to Phobos
So hatte ich es in meinem Posting gemeint und so habe hinterher auch Lars verstanden (der im Gegensatz zu mir praktische Erfahrung darin hat).
Weiterhin viel Erfolg
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Die letzten Tage habe ich die Schranken programmiert.
Eine Schranke war recht einfach zu machen und kostet mich auch nur einen zusätzlichen Charakter in der schon recht vollen Tabelle. Dieser Charakter wird dann im VBI mit 8 einfachen kurzen Befehlen ständig verändert und im Hauptprogramm wird das dann zusätzlich per Random gemischt und ein - / ausgeschaltet. Diese Schranke kann ich beliebig dick machen. Ich habe es als Sonderitem in den Aufbau der Landschaft integriert und kann die Schranke jetzt also irgendwo frei platzieren.
Die 2. Schranke ist auch fertig. Dies ist eine Laufschranke jeweils von rechts nach links und umgekehrt, sowie in Kombination ... das war jetzt zwar nicht schwerer zu programmieren, braucht aber etliche Programmschritte, weil ich es mit ROL und ROR mache, dabei 14 Charakter benötige und jedes Charakter ja 8 Bits hat. Der Rechner macht also bei dieser Schranke ständig 112 Befehlszyklen, was ich leider nicht mehr ohne Ruckeln so einfach in den VBI unterbekomme. Ich habe es also ins Hauptprogramm integriert und wenn alles läuft... also Schranke Scroll usw. ruckelt es ein wenig... das Problem habe ich noch nicht gelöst und werde es wohl so hinnehmen.
Man sieht auf jeden Fall, daß der Rechner mit dem Gesamtkonstrukt so langsam hinsichtlich der Kapazität an der Grenze ist... zumindest so wie ich es aufgebaut habe. Das Folgeprogramm werde ich anders konstruieren müssen...
Nun baue ich noch viel Landschaft und dann das Endlevel, dann müssen noch die Kollisionsabfragen für das Raumschiff geschaltet werden, Bonusschiffe für erreichten Score, die ganzen kleinen Fehler noch raus und fertig bin ich mit dem Projekt! Hier noch eine kleine Demo mit den beiden Schranken...
Liebe Grüße und ein schönes WE
Peter
Eine Schranke war recht einfach zu machen und kostet mich auch nur einen zusätzlichen Charakter in der schon recht vollen Tabelle. Dieser Charakter wird dann im VBI mit 8 einfachen kurzen Befehlen ständig verändert und im Hauptprogramm wird das dann zusätzlich per Random gemischt und ein - / ausgeschaltet. Diese Schranke kann ich beliebig dick machen. Ich habe es als Sonderitem in den Aufbau der Landschaft integriert und kann die Schranke jetzt also irgendwo frei platzieren.
Die 2. Schranke ist auch fertig. Dies ist eine Laufschranke jeweils von rechts nach links und umgekehrt, sowie in Kombination ... das war jetzt zwar nicht schwerer zu programmieren, braucht aber etliche Programmschritte, weil ich es mit ROL und ROR mache, dabei 14 Charakter benötige und jedes Charakter ja 8 Bits hat. Der Rechner macht also bei dieser Schranke ständig 112 Befehlszyklen, was ich leider nicht mehr ohne Ruckeln so einfach in den VBI unterbekomme. Ich habe es also ins Hauptprogramm integriert und wenn alles läuft... also Schranke Scroll usw. ruckelt es ein wenig... das Problem habe ich noch nicht gelöst und werde es wohl so hinnehmen.
Man sieht auf jeden Fall, daß der Rechner mit dem Gesamtkonstrukt so langsam hinsichtlich der Kapazität an der Grenze ist... zumindest so wie ich es aufgebaut habe. Das Folgeprogramm werde ich anders konstruieren müssen...
Nun baue ich noch viel Landschaft und dann das Endlevel, dann müssen noch die Kollisionsabfragen für das Raumschiff geschaltet werden, Bonusschiffe für erreichten Score, die ganzen kleinen Fehler noch raus und fertig bin ich mit dem Projekt! Hier noch eine kleine Demo mit den beiden Schranken...
Liebe Grüße und ein schönes WE
Peter
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
... jetzt habe ich mal in meiner Feinscroll-Routine mit vcount "gespielt" und siehe da - wenn man das timing richtig setzt ist das unangenehme Ruckeln weg. Und plötzlich habe ich auch wieder Optionen im VBI. Ich kann jetzt die Laufschranke in den VBI integrieren und es läuft super flüssig! Und da geht noch viel mehr Code rein... cool!!
Das timing läuft natürlich anders auf 50 Hz (PAL) als auf 60 Hz ... ich frage das jetzt beim Programmstart durch das Register PAL ab und ändere entsprechend den Wert für das timing. Jetzt läuft das Programm flüssig bei 50 und 60 Hz!
Das timing läuft natürlich anders auf 50 Hz (PAL) als auf 60 Hz ... ich frage das jetzt beim Programmstart durch das Register PAL ab und ändere entsprechend den Wert für das timing. Jetzt läuft das Programm flüssig bei 50 und 60 Hz!
- pps
- Beiträge: 534
- Registriert: 18.06.2021 23:05
- Has thanked: 115 times
- Been thanked: 208 times
- Kontaktdaten:
Re: Return to Phobos
Wenn Du das Timing wirklich korrekt auch auf umgebauten Rechnern haben möchtest (PAL ANTIC im NTSC ATARI), solltest Du nicht über das PAL Register gehen. Man sollte dann in einer kleinen Routine zählen, wie viele VCOUNTs möglich sind. 60 Hz Maschinen schaffen weniger, als 50 Hz Maschinen. Mindestens bis 155 sollte es gehen, dann hast Du ein Gerät mit 50 Hz. Ist der höchste VCOUNT Wert kleiner, hast Du ein 60 Hz Gerät.
Über das PAL Register weiß man aber zuverlässig, ob die Farben angepasst werden müssen.
- Kveldulfur
- Beiträge: 624
- Registriert: 17.08.2021 02:32
- Has thanked: 239 times
- Been thanked: 163 times
- Kontaktdaten:
Re: Return to Phobos
Hallo!
Das mit dem Zählen ist ein super Hinweis. Habe bis jetzt nur das PAL-Register abgefragt gehabt.
Würdest Du auch so zählen?
Grüße
Janko
Edit: Hab den Code noch einmal geändert gehabt
Das mit dem Zählen ist ein super Hinweis. Habe bis jetzt nur das PAL-Register abgefragt gehabt.
Würdest Du auch so zählen?
Code: Alles auswählen
@ lda VCOUNT ; Anzahl der VCounts zählen
cmp VCOUNT ; Bei über 155 Schritten
beq @- ; hat man 50Hz, darunter
bcc @- ; hat man 60Hz
cmp #$9b
bcs IS_50hz
IS_60Hz lda #$01
jmp @+
IS_50hz lda #$00
@ sta is60Hz
Janko
Edit: Hab den Code noch einmal geändert gehabt
- pps
- Beiträge: 534
- Registriert: 18.06.2021 23:05
- Has thanked: 115 times
- Been thanked: 208 times
- Kontaktdaten:
Re: Return to Phobos
Das sieht auf den ersten Blick gut aus.
EDIT: Auf den zweiten aber dann doch wohl nicht.
Nutze am besten eine temporäre Variable zum zählen und vor allem setze am Anfang VCOUNT auf 0.
So mache ich das meist:
EDIT: Auf den zweiten aber dann doch wohl nicht.
Nutze am besten eine temporäre Variable zum zählen und vor allem setze am Anfang VCOUNT auf 0.
So mache ich das meist:
Code: Alles auswählen
;50Hz or 60 Hz?
mva #0 vcount
@ lda vcount
beq w
sta temp
jmp @-
w
lda temp
cmp #$9b
bmi ntsc
;PAL
mva #0 sixtyhz
rts
ntsc
mva #1 sixtyhz
rts
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Guten Morgen in die Gemeinde,
ich habe jetzt alle Schranken und Hindernisse fertig und bin dabei die Landschaft zu erweitern. Ich würde mal sagen, daß ich jetzt insgesamt die Hälfte der Landschaft kreiert habe. Mit dem ganzen Programmcode bin ich jetzt bei ca. 24kB ... da scheint noch etwas Luft, aber ich muss jetzt noch ein paar Sachen ändern. Ich starte mit dem Code jetzt nicht bei $2000, sondern bei $400.
Auch musste ich ein paar Variablen umdeklarieren, da der Code da sonst reingrätscht. Ich habe noch freie Slots unterhalb $400 gefunden und benutzt.
Ein etwas größerer Part wird noch die Displaylist samt Bildschirm sein. Das fängt bei mir ja bei $7530 (30000) an, entweder schiebe ich das nach ganz vorne - also direkt hinter die Charakter, oder soweit nach hinten wie es geht - da brauche ich ca. 2kB an Platz.
Jetzt ist es nämlich so, wenn mein Programm in die $7530 Speicherbereiche reingeht, kommt es zu einem kompletten fatalen Absturz - was ja logisch ist.
Vielleicht lege ich die DL und den Bildschirm etwa bei 47000 hin, dann habe ich noch massig Platz für das Programm.
Bei meinem nächsten Projekt werde ich vorher mir ganz genau Gedanken machen, wie ich den Speicher optimal nutze...
LG
Peter
ich habe jetzt alle Schranken und Hindernisse fertig und bin dabei die Landschaft zu erweitern. Ich würde mal sagen, daß ich jetzt insgesamt die Hälfte der Landschaft kreiert habe. Mit dem ganzen Programmcode bin ich jetzt bei ca. 24kB ... da scheint noch etwas Luft, aber ich muss jetzt noch ein paar Sachen ändern. Ich starte mit dem Code jetzt nicht bei $2000, sondern bei $400.
Auch musste ich ein paar Variablen umdeklarieren, da der Code da sonst reingrätscht. Ich habe noch freie Slots unterhalb $400 gefunden und benutzt.
Ein etwas größerer Part wird noch die Displaylist samt Bildschirm sein. Das fängt bei mir ja bei $7530 (30000) an, entweder schiebe ich das nach ganz vorne - also direkt hinter die Charakter, oder soweit nach hinten wie es geht - da brauche ich ca. 2kB an Platz.
Jetzt ist es nämlich so, wenn mein Programm in die $7530 Speicherbereiche reingeht, kommt es zu einem kompletten fatalen Absturz - was ja logisch ist.
Vielleicht lege ich die DL und den Bildschirm etwa bei 47000 hin, dann habe ich noch massig Platz für das Programm.
Bei meinem nächsten Projekt werde ich vorher mir ganz genau Gedanken machen, wie ich den Speicher optimal nutze...
LG
Peter
- Kveldulfur
- Beiträge: 624
- Registriert: 17.08.2021 02:32
- Has thanked: 239 times
- Been thanked: 163 times
- Kontaktdaten:
Re: Return to Phobos
Hallo!
Kann man "Return to Phobos" überhaupt dann noch via eines DOS starten, wenn Du den Bereich <$2000 nutzt?
Das DOS liegt normal an dieser Stelle. Auch einige Speeder haben sich in dem Bereich einquartiert.
Ich habe mein Programm so geschrieben, dass man mit "Escape" ins DOS zurück kehrt
Habe dafür mein Programm testweise auf eine ATR geschrieben mit DOS 2.5 und über das DOS geladen.
Grüße
Janko
Kann man "Return to Phobos" überhaupt dann noch via eines DOS starten, wenn Du den Bereich <$2000 nutzt?
Das DOS liegt normal an dieser Stelle. Auch einige Speeder haben sich in dem Bereich einquartiert.
Ich habe mein Programm so geschrieben, dass man mit "Escape" ins DOS zurück kehrt
Habe dafür mein Programm testweise auf eine ATR geschrieben mit DOS 2.5 und über das DOS geladen.
Grüße
Janko
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Laden von Dos … daran habe ich gar nicht gedacht… das werde ich entsprechend noch anpassen, damit man das Spiel normal von Diskette laden kann!
- Dr. Irata
- Beiträge: 937
- Registriert: 24.08.2021 14:40
- Has thanked: 110 times
- Been thanked: 268 times
- Kontaktdaten:
Re: Return to Phobos
Jetzt habe ich das Programm etwas umgestellt ...
Programmstart jetzt bei 2048 ($800), Bildschirmausgabe statt 30000 jetzt bei 41000 ($A028).
Ich weiß gar nicht, warum ich bei 30000 den Bildschirmstart gesetzt habe... dadurch habe ich für das ganze Programm 15 kB mehr zur Verfügung....
Da passt noch Landschaft rein, Programmcode und Sound...
Programmstart jetzt bei 2048 ($800), Bildschirmausgabe statt 30000 jetzt bei 41000 ($A028).
Ich weiß gar nicht, warum ich bei 30000 den Bildschirmstart gesetzt habe... dadurch habe ich für das ganze Programm 15 kB mehr zur Verfügung....
Da passt noch Landschaft rein, Programmcode und Sound...
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast