Fehlverhalten im alten 400/800 OS-A

Moderator: Rockford

Antworten
Benutzeravatar
Olix
Beiträge: 1057
Registriert: 17.08.2021 07:06
Has thanked: 127 times
Been thanked: 448 times
Kontaktdaten:

Fehlverhalten im alten 400/800 OS-A

Beitrag von Olix »

Jetzt hatte ich endlich meine Haunted House Portierung fertig programmiert und wollte natürlich, das Spielchen auch auf allen Systemen lauffähig haben. XL/XE in PAL und NTSC funktioniert. Als ROM-Version (passt noch auf ein 8K EPROM) läuft das Programm sogar noch mit 16K auf einem 600 XL. Also dachte ich mir, das sollte ja sogar noch auf einem 400er laufen. Ich habe mich auch ganz brav daran gehalten, keine OS-Routinen anzuspringen sondern nur offizielle Einsprung-Vektoren zu nutzen.

Trotzdem lief das Programm nicht unter PAL OS-A.
Seltsamerweise lief das Programm aber unter NTSC OS-B, aber wiederum nicht unter NTSC OS-A. Dafür aber mit dem Altirra OS for 400/800 .

Anscheinend gibt es irgendein Verhalten des OS-A, welches sich sowohl von OS-B als auch von den XL/XE OS unterscheidet. Also begann das lange Suchen:

Recht schnell war klar, dass meine DLIs nicht angesprungen werden, sehr wohl aber meine VBI Routine.
Also mal alles mögliche ausprobiert und dann kam ich zum Ergebnis, dass DLI kein Problem ist, solange ich nicht auch meinen VBI nutze. Aber warum?

Also weiter gesucht und letztendlich die Lösung gefunden:

In meinem Programm schalte ich zunächst den DLI scharf und danach dann den VBI:

Code: Alles auswählen

*        EINSCHALTEN DLI
         LDA #64           ZUR SICHERHEIT DLI
         STA NMIEN         ERST ABSCHALTEN
         LDA #DLI1:L       DEN VEKTOR AUF
         STA VDSLST        DIE DLI ROUTINE 
         LDA #DLI1:H       SETZEN 
         STA VDSLST+1
         LDA #192
         STA NMIEN         ERST JETZT EINSCHALTEN

*        EINSCHALTEN VBI
         LDY #VBI:L        VBI VECTOR AUF EIGENE
         LDX #VBI:H        ROUTINE SETZEN
         LDA #6            ALS IMMEDIATE VBI
         JSR SETVBV

Dann habe ich mal das Einschalten des VBI nicht über die Systemroutine SETVBV vorgenommen sondern durch direktes Ändern des VBI Vektors:

Code: Alles auswählen

*        EINSCHALTEN VBI OHNE SETVBV
         LDA TIMER
LOOPT1   CMP TIMER         WARTE BIS IN VBI, UM AUFRUF WÄHREND
         BEQ LOOPT1        ADRESSÄNDERUNG ZU VERMEIDEN
         LDY #VBI:L        VBI VECTOR AUF EIGENE
         STY $222
         LDX #VBI:H        ROUTINE SETZEN
         STX $223
Und siehe da, jetzt ging es auf einmal.

Sollte möglicherweise die SETVBV-Routine das DLI-Bit in NMIEN löschen?
Also wieder die ursprüngliche Routine mit SETVBV verwendet aber am Ende nochmals gezielt VBI und DLI eingeschaltet:

Code: Alles auswählen

 
        LDA #192
        STA NMIEN
Und siehe da: Jetzt läuft das Ganze auch unter PAL und NTSC OS-A

Was haben ich daraus gelernt:

Um auch nach unten zur 400/800er Reihe kompatibel zu bleiben sollte zuerst der VBI eingeschaltet werden und erst dann der DLI, oder zumindest nach dem Aufruf der SETVBV Routine nochmals zur Sicherheit auch DLI in NMIEN eingeschaltet werden.

Benutzeravatar
Olix
Beiträge: 1057
Registriert: 17.08.2021 07:06
Has thanked: 127 times
Been thanked: 448 times
Kontaktdaten:

Re: Fehlverhalten im alten 400/800 OS-A

Beitrag von Olix »

Kleine Ergänzung:

Ich habe mir mal die SETVBV Routine im OS-A und OS-B angeschaut und meinen Verdacht hat sich nun bestätigt.
Die Routine unter OS-A ändert NMIEN. Es deaktiviert zunächst den VBI und den DLI durch einschreiben von 0 und nach dem Setzen der Vektoren wird dann nur der VBI wieder eingeschaltet durch Schreiben von $40 (64) in NMIEN - Die SETVBV Routine unter OS-B arbeitet dagegen ohne Änderungen an NMIEN vorzunehmen:

SETVBV - OS-A:

Code: Alles auswählen

    E912: 0A                ASL
    E913: 8D 2D 02          STA $022D
    E916: A9 00             LDA #$00
    E918: 8D 0E D4          STA NMIEN
    E91B: 8A                TXA
    E91C: AE 2D 02          LDX $022D
    E91F: 9D 17 02          STA VIMIRQ+1,X
    E922: 98                TYA
    E923: 9D 16 02          STA VIMIRQ,X
    E926: A9 40             LDA #$40
    E928: 8D 0E D4          STA NMIEN
    E92B: 2C 0F D4          BIT NMIST
    E92E: 50 0D             BVC $E93D
    E930: A9 E9             LDA #$E9
    E932: 48                PHA
    E933: A9 3D             LDA #$3D
    E935: 48                PHA
    E936: 08                PHP
    E937: 48                PHA
    E938: 48                PHA
    E939: 48                PHA
    E93A: 6C 22 02          JMP (VVBLKI)
    E93D: 60                RTS
SETVBV - OS-B:

Code: Alles auswählen

    E8ED: 0A                ASL
    E8EE: 8D 2D 02          STA $022D
    E8F1: 8A                TXA
    E8F2: A2 05             LDX #$05
    E8F4: 8D 0A D4          STA WSYNC
    E8F7: CA                DEX
    E8F8: D0 FD             BNE $E8F7
    E8FA: AE 2D 02          LDX $022D
    E8FD: 9D 17 02          STA VIMIRQ+1,X
    E900: 98                TYA
    E901: 9D 16 02          STA VIMIRQ,X
    E904: 60                RTS

slx
Beiträge: 136
Registriert: 18.06.2021 23:16
Has thanked: 94 times
Been thanked: 12 times
Kontaktdaten:

Re: Fehlverhalten im alten 400/800 OS-A

Beitrag von slx »

Olix hat geschrieben:
20.05.2023 12:22
Ich habe mir mal die SETVBV Routine im OS-A und OS-B angeschaut und meinen Verdacht hat sich nun bestätigt.
Die Routine unter OS-A ändert NMIEN. Es deaktiviert zunächst den VBI und den DLI durch einschreiben von 0 und nach dem Setzen der Vektoren wird dann nur der VBI wieder eingeschaltet durch Schreiben von $40 (64) in NMIEN - Die SETVBV Routine unter OS-B arbeitet dagegen ohne Änderungen an NMIEN vorzunehmen:
Ich frage mich, ob das der "Killer" meiner DLI-Programmier-Ambitionen auf Atari 800 (ohne XL) in den 80ern war. Das hat damals nie so funktioniert, wie ich es mir vorgestellt habe und für tieferes Nachforschen, wie Ihr es hier vorgeführt habt, hat mir als Teenager das Verständnis gefehlt.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast