Treiber und die BIOS Equipment Liste, speziell Alley Cat mit Aureal Vortex und Joystick

Konfiguration, Anwendungen, Treiber und TSRs
Antworten
Langer Don
HELP.COM-Benutzer
Beiträge: 39
Registriert: Di 11. Jun 2019, 15:39

Treiber und die BIOS Equipment Liste, speziell Alley Cat mit Aureal Vortex und Joystick

Beitrag von Langer Don »

Hallo zusammen,

ist es normal, dass Treiber die BIOS Equipment Liste unberührt lassen oder sind das Bugs, kennt jemand die Hintergründe? Bei mir fügt weder der Aureal Vortex Treiber (ASP4DOS.COM) den Joystickport hinzu, noch der für die LogiLink PC0018 (GEMDOSIN.EXE) die parallelen/seriellen Ports. Und das USB-Diskettenlaufwerk (BIOS) ist auch nicht drin. 26h (siehe unten) dürfte wohl meinen x87+Maus+80x25Farbe [1].

Weil Alley Cat nach Interrupt 11h fragt um den Joystick auswählen zu können, habe ich mir die BIOS Equipment Liste einfach manuell angepasst [2]. In ALLEYCAT.EXE kann der Joystick dann zwar ausgewählt werden und das Spiel startet auch mit dem Feuerknopf, die Katze springt dann aber nur nach links, bei Stick rechts springt sie hoch und bei Stick unten läuft sie nach links, alles andere hat keinen Effekt. Kalibriert habe ich den Joystick mechanisch in Maniac Mansion wo er ohne solche Tricks einfach funktioniert. In Alley Cat habe ich das vorher auch schon und leider erfolglos probiert, nach rechts ging die Katze nie. Wo könnte denn da die Ursache liegen, bzw. was könnte ich noch probieren?

Besten Dank

[1] http://www.ctyme.com/intr/rb-0575.htm
[2] Standard C Programm und POSIX Makefile, konfiguriert für Open Watcom 1.9.
Ohne oder mit mehr als zwei Argumenten wird eine Hilfezeile ausgegeben. Mit einer 20-Bit-Adresse als Argument wird das an dieser Speicherstelle befindliche Wort ausgegeben. Oder mit einer weiteren 16-Bit breiten Bitmaske alterniert und gezeigt.
Also um eine Hilfezeile zu bekommen,

Code: Alles auswählen

C:\>toggle
Usage: C:\TOGGLE.EXE address [bitmask]
die BIOS Equipment Liste [1] auszugeben

Code: Alles auswählen

C:\>toggle 40:0010h
26h
und darin das Joystickbit umzuschalten.

Code: Alles auswählen

C:\>toggle 40:0010h 1000h
26h
1026h
Gebaut wird übrigens mit

Code: Alles auswählen

C:\>wmake toggle.exe
Makefile:

Code: Alles auswählen

CC=owcc
CFLAGS=-std=c89 -Wextra -mcmodel=c
LDFLAGS=-b DOS
.SUFFIXES:
.SUFFIXES: .exe .c
.c.exe:
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
toggle.c:

Code: Alles auswählen

# include <stdio.h>
# include <stdlib.h>
int main ( int argc , char * * argv ) {
        unsigned u , * p ;
        if ( argc == 3 || argc == 2 )
                if ( sscanf ( argv [ 1 ] , "%p" , & p ) ) {
                        printf ( "%Xh\n" , * p ) ;
                        if ( argc == 3 )
                                if ( sscanf ( argv [ 2 ] , "%X" , & u ) )
                                          printf ( "%Xh\n" , * p ^= u ) ;
                                else fprintf ( stderr , "%s isn't a bitmask!\n"
                                                , argv [ 2 ] )
                                        , exit ( EXIT_FAILURE ) ;
                } else fprintf ( stderr , "%s isn't an address!\n"
                                , argv [ 1 ] ) , exit ( EXIT_FAILURE ) ;
        else printf ( "Usage: %s address [bitmask]\n" , argv [ 0 ] ) ;
        return EXIT_SUCCESS ;
}
GA-H67A, i2600k, 16GB RAM, AU8820, MCS9865, RTL8111E, HDD + SSD + BD-RW, FreeDOS + Debian
mkarcher
Norton Commander
Beiträge: 108
Registriert: Fr 5. Jun 2020, 19:38

Re: Treiber und die BIOS Equipment Liste, speziell Alley Cat mit Aureal Vortex und Joystick

Beitrag von mkarcher »

Die Benutzung des BIOS, um auf Hardware wie Joysticks oder serielle Ports zuzugreifen ist bereits Ende der 80er aus der Mode gekommen, da die entsprechenden Routinen nur mäßig perfomant (Joystick) oder funktional sehr begrenzt (serieller Port) waren. Wer direkt auf die Hardware zugreifen will, braucht nicht nur die Information, wie viele serielle oder parallel Ports es gibt, sondern auch die Information, welche Basisadressen sie haben. Daher wird der Bereich 40:00 bis 40:10 mit den Basisadressen von einigen Programmen genutzt, die dort auch nachzählen können, wie viele Ports es gibt, aber für das Equipment-Wort (also den Rückgabewert von INT 11) interessiert sich keine Software. Daher machen sich moderne Treiber gar nicht mehr die Mühe, das Equipment-Wort zu aktualisieren.

Dein Joystick-Problem bei AlleyCat könnte an einem zu schnellen System liegen. Der PC-Joystick ist ja ein analoger Joystick, dessen Stellung irgendwie digitalisiert werden muss. Zu Zeiten des IBM-PCs waren vernünftige A/D-Wandler-ICs viel zu teuer, so dass hier stattdessen in Hardware die Potistellung im Joystick in ein Zeit umgewandelt wird. Der Prozessor muss pro Achse (X und Y jeweils von Joysticks 1 und 2) beobachten, wie lange es nach einem Anstoßen dauert, bis das entsprechende Statusbit zurück in den Ursprungszustand fällt. Typischerweise zählt Software, wie viele Iterationen in einer Schleife sie auf das Kippen des Bits wartet. Wenn die Schleife zu schnell läuft, dann kann es passieren, dass der Zähler in der Schleife überläuft, und die tatsächliche Position des Joysticks völlig falsch interpretiert wird. Zu Zeiten von AlleyCat waren durchaus noch 8-Bit-Zähler in der Joystick-Schleife üblich.

Abhilfe: Versuche AlleyCat mit deaktiviertem L1-Cache im Prozessor zu starten. Das kann das System so weit ausbremsen, dass der Joystick korrekt erfasst wird.
Langer Don
HELP.COM-Benutzer
Beiträge: 39
Registriert: Di 11. Jun 2019, 15:39

Re: Treiber und die BIOS Equipment Liste, speziell Alley Cat mit Aureal Vortex und Joystick

Beitrag von Langer Don »

Das ist ja wirklich krass wie langsam die CPU ohne Cache ist.

Code: Alles auswählen

C:\>cpucache off
Und ein CD dauert eine gefühlte Ewigkeit. Bei Alley Cat hats leider nicht geholfen.

Mit Slowdown hatte ich ein wenig mehr Erfolg. Also scheint es tatsächlich an der Geschwindigkeit zu liegen. Als AT mit Int 70h gehts mehr oder weniger, der Hund läuft dann zu langsam und so ganz isses auch nicht mit dem Joystick. Mit Strg-Z (möglicherweise Strg-Y) kann ich dann auch nicht mehr Beenden, der PC stürzt dann ab.

Code: Alles auswählen

C:\>slowdown /int70 /a alleycat.exe
Da muss ich mich wohl noch etwas mehr damit beschäftigen.

Nebenbei konnte ich noch feststellen [1], dass Int 15|AH=84h von ASP4DOS.COM auch nicht implementiert wird. In der Dosbox ist er da, zumindest wenn die richtigen Kernelmodule geladen sind, ansonsten nicht. – Der Joystick funkioniert auch in der Dosbox mit Alley Cat, auch wenns am eben genannten wie oben gezeigt wohl nicht liegt.

Vielen Dank für die Erklärung

[1] Watcom C Programm mit inline Assembler
Zeigt ob Int 15|AH=84h verfügbar ist.

Code: Alles auswählen

C:\>joystick
Interrupt 15|AH=84h is not available.
Übersetzten einfach mit dem Makefile von oben.

Code: Alles auswählen

C:\>wmake joystick.exe
joystick.c

Code: Alles auswählen

# include <stdio.h>
# include <stdlib.h>
int main ( ) {
        volatile int c = 0 ;
        int y = EXIT_SUCCESS ;
        __asm {
                xor dx , dx
                mov ah , 84h
                stc
                int 15h
                jnc asm_then
                mov c , -1
        asm_then:
        } ;
        printf ( "Interrupt 15h|AH=84h is " ) ;
        if ( c ) printf ( "not " ) , y = EXIT_FAILURE ;
        puts ( "available." ) ;
        return y ;
}
GA-H67A, i2600k, 16GB RAM, AU8820, MCS9865, RTL8111E, HDD + SSD + BD-RW, FreeDOS + Debian
Antworten