Posts by Acorn

    Ich glaube, die Idee hatte ich in der damaligen Boulderdash Diskussion mal erklärt, Doublebuffer für das Farbram. Da ging es darum, ob man BD mit Farbram scrollen kann. Der Trick besteht darin, die Charzeile ein zweites Mal auszugeben und auf einen zweiten Zeichensatz umzuschalten, damit hat man dann zwei zusätzliche Farben. Auch da war peiselulli mit ein Beispiel von der Partie.

    Version 3.2 war die letzte Version ohne GTK und ist für mich die beste Version zum Coden, man kann diese auch auf Deutsch umstellen. Zum Zocken nehme ich am liebsten Denise, dank FreeSync ruckeln Spiele mit Scrolling sehr, sehr selten, was bei Vice nicht der Fall ist. Als Alternative wäre noch Hoxs64 zu nennen, das noch aktiv weiterentwickelt wird und auch einen Monitor bietet.

    Nach langer Zeit mal wieder auf was gestoßen, bei Version 7.7 und 7.8 geht kein bedingtes Assemblieren mehr, wenn darin ’!FOR !END’ vorkommt und der Code dabei nicht erzeugt wird.


    Code
    1. SPEED = 0
    2. !IF SPEED{
    3. !FOR ZEILE = 0 TO 880 STEP 40
    4. !FOR SPALTE = 0 TO 38
    5. LDA $0401+SPALTE+ZEILE
    6. STA $0400+SPALTE+ZEILE
    7. !END SPALTE
    8. !END ZEILE
    9. }

    Ich halte diese Formulierung für diskutabel. Meine Meinung: Doch, es funktioniert auf einem serienmäßigen C64, aber man braucht noch das Modul dazu.

    Man sollte bei der REU aber auch nicht unterschlagen das diese die Fähigkeiten des C64 stark erweitert. Der zusätzliche Speicher ist schon fast nebensächlich im Verhältnis zum DMA-Transfer. Die 1541 ermöglicht dagegen nur den schnelleren Datenaustausch, aber keine direkte Beschleunigung des C64.

    Ich habe eine paar ganz einfache Regeln, die jeder kapiert.


    1. AND #%00000000 ist zum Löschen / ORA #%11111111 ist zum Setzen / EOR #%11111111 ist zum Umkehren von Bits.

    2. Es werden nur die Bits verändert die man angibt, alle anderen bleiben erhalten.

    3. Zum Befehl immer binäre #%XXXXXXXX verwenden, damit hat man die Bits im Blick.


    Spiele die ich in guter Erinnerung habe und noch nicht genannt wurden. Diese Spiele habe ich auch deutlich länger und häufiger gespielt.


    Deluxe Galaga -> Hi-Score Duelle mit Freunden

    Wings of Death -> Guter 2D Shooter

    Battle Squadron -> Dito aber zwei Spieler gleichzeitig

    Pang -> Zwei Spieler im Team

    Rocket Ranger -> Verboten

    Volfied -> Hi-Score jagt mit Freunden

    Amber -> Lange Nächte mit Freunden um die Weltherrschaft

    Battle Isle -> Neuland und fesselnd zugleich

    Subtrade -> Mule mit cooler Grafik

    Kid Chaos -> Extrem guter Plattformer mit guter Musik

    Rodland -> Plattformer zu zweit

    PP-Hammer -> Lieblings Spiel meiner Nichte

    Twinworld -> Action Plattformer wo zwei Spieler abwechseln zusammen spielen

    Cadaver -> Action Rätsel Adventure

    Simon the Sorcerer -> AGA Adventure

    Sobald die update_screen Routine einen Hardscroll ausführt, wird der erste Interrupt zu spät ausgeführt, so weit, so gut. Das Problem kann man sehr einfach lösen, man gibt den Interrupt einfach durch CLI bei u1: wieder frei. So kann der erste Interrupt rechtzeitig ausgeführt werden und springt nach beenden zurück zum Kopieren.

    Ich bin etwas verwundert oder auch erstaunt, weil man die Adresse $00 in der Regel nie ändert muss. Nach dem Einschalten des C64 hat der Kernal beide Port-Register vom 6510 sinnvoll gesetzt. In Adresse $00 steht $2F und in Adresse $01 steht $37 und es gibt selten einen Grund $00 zu ändern. Daher eine Frage, das Programm wird ganz normal von Disk/Tape geladen und gestartet.

    Das bestätigt meine Tests, an Routine selber liegt es nicht. Folgende Fehler wären daher möglich, die Routine liegt an einer anderen Adresse und der Aufruf endet in einen Absturz. Die Basic-Pointer stimmen nicht mehr und deshalb stützt das Basic-Programm ab, weil diese jetzt im ROM liegen.

    Ich gehe mal davon aus, das am Ende noch ein RTS in der Routine steht.


    Aber nachdem einmal der code unten aufgerufen wurde, hängt die Kiste bei Aufruf einer Kernal Routine (z.B. LOAD in $FFD5) oder rts ins Basic.

    Jemand eine Idee? In Docs habe ich dazu wenig gefunden, entweder ist es so völlig einfach oder totaler Unfug dass ich dazu kaum was finde...

    An der Routine selber kann es nicht liegen, vielleicht wird die Routine vom Basic-Programm überschrieben.


    Musst Du nicht noch den Interrupt abschalten?

    Hat er doch und den könnte man sogar an lassen.

    Die Soft-Scroll Routine funktioniert nicht, weil die unbenutzten Bits 6 und 7 im Register $D016 immer auf 1 stehen. Deshalb wird nach $C0 einfach wieder $C6 ausgelesen und die Hard-Scroll Routine wird nie ausgeführt. Man müsste nach $D016 erst ein AND #$07 ausführen damit SBC #$02 überhaupt ein Unterlauf erzeugen kann. Aber bei einem Unterlauf steht $FE im Akku und den kann man nicht einfach nach $D016 schreiben. Deshalb muss nach SBC #$02 noch zweiter AND #$07, erst jetzt kann man den Wert zurück nach $D016 schreiben.

    Code
    1. SEC ; Carry setzen
    2. LDA $D016 ; Pixelposition auslesen
    3. AND #%00000111 ; Bits für Unterlauf maskieren
    4. SBC #$02 ; Neue Pixelposition berechnen
    5. AND #%00000111 ; Bits von Unterlauf maskieren
    6. ; ORA #%00010000               ; Nur bei Multicolor nötig
    7. STA $D016 ; Steuerregister-X schreiben
    8. BCC HARD_SCROLL ; Unterlauf prüfen

    Den Vorschlag von Hoogo, das ganze in eine Variable zu packen hat den Vorteil, das man weitere Zeilen mit einer anderen Geschwindigkeit verwenden kann.

    Code
    1. SEC ; Carry setzen
    2. SOFT_SCROLL LDA #$00 ; Pixelposition auslesen
    3. SBC #$02 ; Neue Pixelposition berechnen
    4. AND #%00000111 ; Bits maskieren
    5. STA SOFT_SCROLL+1 ; Pixelposition merken
    6. ; ORA #%00010000 ; Nur bei Multicolor nötig
    7. STA $D016 ; Steuerregister-X schreiben
    8. BCC HARD_SCROLL ; Unterlauf prüfen

    Schau doch mal unter den Menüpunkt -> Konfiguration -> Steuerung -> Pulldown-Menü Tastatur, ob überhaupt Tasten definiert sind. Es könnte ja sein das gar keine Tasten belegt sind, warum auch immer.

    Ab dem 68010 ist das Auslesen des SR-Registers privilegiert und führt in der Regel zu einer Exception mit Absturz. Mit dem verlinkten Programm wird diese Exception abgefangen und der entsprechende Befehl wird gepatch. Eine weitere Neuerung ist das VBR-Register, damit kann die Vector-Base verschieben. Ohne echtes Fast-Ram ist der nutzen aber nur minimal, wie der Quit-Key bei WHD-Load. Es gibt keinen echten, merkbaren Geschwindigkeitsschub beim 68010, und die Nachteile überwiegen.