Hallo Besucher, der Thread wurde 14k mal aufgerufen und enthält 73 Antworten

letzter Beitrag von MasterAT am

Minigame programmieren

  • Also heute war ein zienlich erfolgreicher Tag :hammer:


    - Mein Multicolorspielersprite funktioniert, habe eigenen Schuss und einen Gegnersprite auch schon fertig,
    - Joysticksteuerung funktioniert auch schon (habe nur noch nicht diagonale Steuerung drin, aber das ist ja kein Problem, außerdem fehlt noch
    Begrenzung nach oben und unten, sowie links und rechts, ist aber auch nicht doll...)
    - eine scrollroutine, die (zum Testen) erstmal wilde Buchstaben durch die erste Zeile schießt geht auch schon...
    - Joysticksteuerung und Scroll sind aber viiiieeel zu schnell, muss mal sehen, wie ich das etwas langsamer hin kriege, vielleicht entsprechende
    Routinen nur alle X- mal anspringe, aber in der mainloop Geschwindigkeit beibehalten, mal sehen, habe da keine Erfahrung...
    - Dann muss ich ein Charset bearbeiten und entsprechende Zeichen durch die neu geschaffenen erserzen, dann fliegen vielleicht statt Buchstaben schon die ersten Gesteine :-)


    Na gut, melde mich ja wieder, wenn ich was nicht hinkriege :thumbsup:

  • Das mit der Geschwindigkeit regelt man üblicherweise darüber, dass das Update der Grafik mit dem Rasterstrahl synchronisiert ist, plus Zähler die Frames zählen, für Aktionen, die nur alle n Frames passieren sollen.


    Wenn Du Dich noch nicht mit Rasterinterrupts beschäftigen möchtest, dann kannst Du das auch erstmal über eine Schleife lösen, die darauf wartet, dass $d012 einen bestimmten Wert erreicht.

  • Vielen Dank schon mal für den Tipp, habe mir das mal ein bisschen angesehen...


    Also $Do12 zählt praktisch die Rasterzeilen, habe folgende Warteschleife im Netzt gefunden, verstehe sie aber nicht zu 100% (Schleife mit einem jsr aufrufen):

    SQL
    1. warten
    2. ldy #$00
    3. lda $d012
    4. cmp #$00
    5. bne warten
    6. iny
    7. cpy #$03
    8. bne warten+2
    9. rts


    Also, y soll gleich 0 sein, dann wird der Wert aus $D012 gelesen (also die Rasterzeile), diese mit 0 verglichen, erst wenn diese 0 ist, soll es weitergehen. dann wird y um 1 erhöht und dann mit 3 verglichen. Jetzt verstehe ich nicht, was das "bne warten+2" bedeutet...

  • Danke, jetzt kapier ich es:
    Die ersten 5 Zeilen sind also hauptsächlich dafür da, dass die Warteschlange immer genau gleich lang ist, daher wird hier dafür gesorgt, dass in $D012 eine 0 drin steht, bevor es weitergeht. Dann erst wird für y gezählt (bis 3 )also haargenau 3 mal wird in $D012 bis 0 gezählt...


    Cool, habe ich gecheckt, danke auch noch mal mit dem +2 Hinweis, wäre ich nie drauf gekommen... Aber woher weiß man eigentlich immer, welche Befehle wie viel Bytes einnehmen?

  • Das steht in jeder Befehlssatz-Dokumentation zum 6502-Prozessor, z.B. auch hier:


    http://unusedino.de/ec64/technical/aay/c64/



    Die Seite ist für C64-Programmierer sowieso Pflicht, wie ich finde ;). Als Faustregel kann man sich merken, damit man nicht ständig nachschlagen muss: Befehle ohne Parameter (wie NOP, BRK, SEI, CLI, RTS etc.) oder Befehle mit nur einem Register als Parameter (wie ASL A oder LSR A) belegen 1 Byte, da sie nicht auf Speicherstellen zugreifen müssen. Befehle, die eine 8-Bit-Zahl als Parameter (wie LDA #$30) haben oder auf die Zeropage zugreifen (wie z.B. STA $35) benötigen 2 Bytes, logisch, da ja noch ein Byte als Parameter zum Befehl hinzumuss. Und Befehle mit 16-Bit-Parameter (wie JMP $8000, CMP $D012 usw.) dann halt 3 Bytes. Damit komme ich zumindest immer sehr gut klar.

  • Ich habe jetzt die Verzögerung drin und das Programm läuft super! Habe noch einen kleinen Fehler gefixt, der erst jetzt auffiehl, wo das Programm in normaler Geschwindigkeit lief... Habe außerdem angefangen weiter am Charscroll zu arbeiten, schließlich soll er ja nicht nur in einzelnen Zeilen, sondern über dem ganzen Schirm laufen... Muss da noch etwas nachdenken, wie ich das am besten mache...

  • Habe gerade größte Probleme mit meinem Turbo Assembler:
    Ich möchte schreiben "lda 1265,x" und "sta 1264,x"
    Der Turbo-Assembler erhöht, sobald ich die Zeile verlasse, einfach den Wert um 1, also macht daraus "lda 1266,x und sta 1265,x"
    Habe es mit anderen Zahlen am Ende probiert, komischerweise ändert er ein 1,2 und 3 nicht, alles über 3 erhöht sich immer um eins. Habe schon versucht einfach Zahlen einzugeben, die 1 unter dem liegt, was man eingeben möchte, bei "lda 1265,x" hats funktiniert, aber bei "sta 1264,x" nicht, da wurde trotzdem 1265 draus...


    Habe es auch schon mit anderen Versionen probiert, ging auch nicht! Woran liegt das?

  • fenris64: Interessantes Phänomen. Hat der TASS im RR-ROM auch. Ein Workaround wäre es die Zahlen anders auszudrücken. Zum Beispiel könnte man eine Konstante für die Adresse der Zeile definieren. Und das auch noch so, dass man besser sieht, wie die Zustande kommt. So lässt sich die Zeile einfacher ändern:


  • Zitat

    Habe gerade größte Probleme mit meinem Turbo Assembler:
    Ich möchte schreiben "lda 1265,x" und "sta 1264,x"
    Der Turbo-Assembler erhöht, sobald ich die Zeile verlasse, einfach den Wert um 1, also macht daraus "lda 1266,x und sta 1265,x"
    Habe es mit anderen Zahlen am Ende probiert, komischerweise ändert er ein 1,2 und 3 nicht, alles über 3 erhöht sich immer um eins. Habe schon versucht einfach Zahlen einzugeben, die 1 unter dem liegt, was man eingeben möchte, bei "lda 1265,x" hats funktiniert, aber bei "sta 1264,x" nicht, da wurde trotzdem 1265 draus...


    Habe es auch schon mit anderen Versionen probiert, ging auch nicht! Woran liegt das?


    wow, krass ... das ist anscheinend wirklich ein bis dato unbekannter bug im turbo assembler (vermutlich weil so wenige coder mit dezimalzahlen arbeiten...). ich reporte den mal ... :)

  • Ok, habe wieder eine Frage:
    Habe einen BNE- Befehl im Programm, jetzt erscheint die Fehlermeldung "branch out of range". Habe gelesen, dass man darauf achten muss, dass in einen gültigen Adressbereich verzweigt, aber wo ist der? Dürfen BNE- Befehl und Sprungziel nicht zu weit entfernt liegen? Wenn ja, wie weit und wie berechnet man das?

  • Habe es auch schon mit anderen Versionen probiert, ging auch nicht! Woran liegt das?


    Abspeichern als seq-file und wiedereinlesen desselben nach einem Kaltstart kann helfen.
    Das passiert oft, wenn Du Labels deklarierst und später wieder löscht.

  • Also, ich habe wieder eine Frage:
    Und zwar würde ich gerne den Multicolormodus für die Char- Zeichen einschalten. Habe gelesen, dass dies mit Bit 4 der Adresse $D016 gemacht wird. (Multifarbe 1 und 2 dann in $d022 und $D023 schreiben).


    In Asm dachte ich dann, dass man einfach nur lda #16, sta $D016 machen muss (also Bit4 anschalten) und damit den Multicolormodus einschaltet und nur noch Zahlen für die Farben in D022 und D023 speichern muss, aber es passiert nichts... Wie verwendet man den Multicolormodus dann?
    Und noch eine Frage: Ich habe schon gelesen, dass man einen eigenen Zeichensatz erstellen muss, irgendwo in den Speicher schreiben muss und während eines Iterrupts dann diesen über den originalen Zeichensatz schreiben muss. Wenn ich jetzt Charpad für die Erstellung von Chars verwende, wie wird der Satz dann abgespeichert? Brauche ich nicht die Werte? Oder wird es irgendwie in einem Commodore- Format gespeichert, welches ich dann in ein D64 packen muss?