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

Konfiguration, Anwendungen, Treiber und TSRs unter DOS
Antworten
Langer Don
HELP.COM-Benutzer
Beiträge: 45
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 Argument 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
Error: No address given!
Usage: C:\TOGGLE.EXE address [bitmask]
die BIOS Equipment Liste [1] auszugeben

Code: Alles auswählen

C:\>toggle 40:0010h
[0040:0010h] = 26h
und darin das Joystickbit umzuschalten.

Code: Alles auswählen

C:\>toggle 40:0010h 1000h
[0040:0010h] = 26h --> 1026h
Gebaut wird übrigens mit

Code: Alles auswählen

C:\>wmake toggle.exe
Makefile:

Code: Alles auswählen

CC=owcc
CFLAGS=-O2 -std=c89 -Wextra -mcmodel=c
LDFLAGS=-s -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 ( 1 < argc )
    if ( sscanf ( argv [ 1 ] , "%p" , & p ) ) {
      printf ( "[%ph] = %Xh" , p , * p ) ;
      if ( 2 < argc )
        if ( sscanf ( argv [ 2 ] , "%X" , & u ) )
          printf ( " --> %Xh\n" , * p ^= u ) , exit ( EXIT_SUCCESS ) ;
        else printf ( "\n" ) ,
             fprintf ( stderr , "Error: %s isn't a bitmask!\n" , argv [ 2 ] ) ;
      else printf ( "\n" ) , exit ( EXIT_SUCCESS ) ; }
    else fprintf ( stderr , "Error: %s isn't an address!\n" , argv [ 1 ] ) ;
  else fprintf ( stderr , "Error: no address given!\n" ) ;
  fprintf ( stderr , "Usage: %s address [bitmask]\n" , argv [ 0 ] ) ;
  return EXIT_FAILURE ; }
EDIT: Ausgabe von Toggle.exe etwas verschönert.
EDIT2: Noch schönere Ausgabe für Toggle.
EDIT3: So gefällt mir Toggle.
Zuletzt geändert von Langer Don am Mo 5. Sep 2022, 19:05, insgesamt 3-mal geändert.
GA‑H67A, i7‑2600K @ 1600MHz, 16GB, MCS9865, AU8820, RTL8111, USB‑FDD + SSD + HDD + AHCI‑BD, FreeDOS + Debian
mkarcher
LAN Manager
Beiträge: 204
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: 45
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, i7‑2600K @ 1600MHz, 16GB, MCS9865, AU8820, RTL8111, USB‑FDD + SSD + HDD + AHCI‑BD, FreeDOS + Debian
mkarcher
LAN Manager
Beiträge: 204
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 »

Langer Don hat geschrieben: Sa 21. Mai 2022, 19:58 Nebenbei konnte ich noch feststellen [1], dass Int 15|AH=84h von ASP4DOS.COM auch nicht implementiert wird.
Dass muss er eigentlich auch nicht. Ein echtes IBM-PC-kompatibles BIOS hat INT 15/84 implementiert zu haben, und spätestens wenn das Equipment-Bit für den Joystick gesetzt ist, hat diese Funktion zu funktionieren. Es kann aber gut sein, dass die Funktion irgendwann weggelassen wurde, weil sie eh fast keiner verwendet.
Langer Don
HELP.COM-Benutzer
Beiträge: 45
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 »

Und ich dachte sowas wäre auf einem ROM in der Gamecontrollerkarte gespeichert gewesen und wäre dann vom BIOS nur in den RAM geladen worden. Gilt das was Du dazu geschrieben hast für das Festplatten- und das VGA‑BIOS in analoger Weise?
GA‑H67A, i7‑2600K @ 1600MHz, 16GB, MCS9865, AU8820, RTL8111, USB‑FDD + SSD + HDD + AHCI‑BD, FreeDOS + Debian
mkarcher
LAN Manager
Beiträge: 204
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 »

Langer Don hat geschrieben: Mi 1. Jun 2022, 14:41 Und ich dachte sowas wäre auf einem ROM in der Gamecontrollerkarte gespeichert gewesen und wäre dann vom BIOS nur in den RAM geladen worden. Gilt das was Du dazu geschrieben hast für das Festplatten- und das VGA‑BIOS in analoger Weise?
Nein. Anders als Festplatten- und VGA-Karten haben Gameport-Karten kein BIOS, weil der Gameport-Treiber (ab irgendwann Mitte der 80er) im Mainboard-BIOS mit drin ist. Genauso wie die unterstützung für parallele Ports (Int 17) und serielle Ports (Int 14). Weiterhin ist im Mainboard-BIOS auch ein Grafikkarten-BIOS drin, aber nur für CGA- und MDA-Karten. Weil Herculeskarten im Textmodus MDA-kompatibel sind, geht das MDA-Karten-BIOS auch mit Herculeskarten.

Und das erklärt dann plötzlich, was im Setup/DIP-Switches (und Equipment-Wort) der Kram mit dem Video-Typ soll:
  • Typ 0 bedeutet: Es ist eine Grafikkarte mit eingenem BIOS vorhanden - bitte das CGA/MDA-BIOS im Mainboard-ROM deaktivieren.
  • Typ 1 bedeutet: Bitte das BIOS auf dem Mainboard für CGA-Betrieb aktivieren, aber standardmäßig einen 40-Zeichen-Modus verwenden, weil der angeschlossene Monitor (Farbfernseher?) so schlecht ist, dass 80 Zeichen unlesbar sind.
  • Typ 2 bedeutet: Bitte das BIOS auf dem Mainboard für CGA-Betrieb aktivieren, und standardmäßig 80 Zeichen pro Zeile verwenden.
  • Typ 3 bedeutet: Bitte das BIOS auf dem Mainboard für MDA-Betrieb aktivieren.
In einer Kombination MDA/CGA (die ja offiziell von IBM unterstützt ist), muss man per Hand im Equipment-Wort auf Typ 3 umstellen, wenn man die MDA aktivieren will, und per Hand auf Typ 1 oder 2 umstellen, wenn man die CGA aktivieren will. Das Mainboard-BIOS wechselt nicht anhand der Modus-Nummer automatisch die aktive Karte. Das DOS-Programm MODE kümmert sich darum, das Equipment-Wort richtig zu setzen.

In einer Dual-Konfiguration VGA/MDA muss kümmert sich das VGA-BIOS darum, beim Wechsel auf Mode 7 (MDA-Text) im Equipment-Wort Typ 3 einzutragen, und aufs Mainboard-BIOS durchzuschalten, und beim Wechsel in alle anderen Modi das Equipment-Wort auf Typ 2 (Kompatibilität zu CGA-Software) zu stellen, und seinen eigenen Code statt dem Mainboard-Code zu aktivieren.
Langer Don
HELP.COM-Benutzer
Beiträge: 45
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 »

Danke, das war sehr erhellend. Habs natürlich gleich ausprobiert

Code: Alles auswählen

C:\>toggle 40:0010h 10h
26h
36h

C:\>toggle 40:0010h 10h
36h
26h
und es schaltet tatsächlich um. Vom ersten bis zum zweiten 36h bewegt sich nur der Cursor, ohne dass Schrift erscheint, erst danach kommt sie wieder.

Mit

Code: Alles auswählen

C:\>toggle 40:0010h 20h
26h
6h
ist interessanterweise nichts passiert.
GA‑H67A, i7‑2600K @ 1600MHz, 16GB, MCS9865, AU8820, RTL8111, USB‑FDD + SSD + HDD + AHCI‑BD, FreeDOS + Debian
Langer Don
HELP.COM-Benutzer
Beiträge: 45
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 »

Mit Joykeys von Bret Johnson funktioniert der Joystick jetzt auch in Alleycat. Die über den Thread entstandene Alleycat.bat mit meinen Workarounds sieht so aus:

Code: Alles auswählen

@echo off
joykeys /k /ab:alt
alleycat
mode co80
joykeys /u
Die /k Option lässt Joykeys den Tastaturinterrupt statt des Puffers verwenden und war notwendig. Mit /ab:alt werden beide Buttons zu Alt, dem einzigen Specialkey in Alleycat. In Alleycat selbst wird die Frage nach einem Joystick dann natürlich verneint. Da mir Alleycat die Konsole in 40x25 hinterlässt, ein Aufruf von Mode um sie wiederherzustellen. Zuletzt wird Joykeys mit /u entladen.

Nebenbei sei bemerkt, dass sich mit

Code: Alles auswählen

joykeys /f /d /i
Interrupt 15h|AH=84h nachrüsten lässt, /f für FixBIOS, /d für Disable und /i für Bypass. Dann werden keine Tastatureingaben von Joykeys gemacht sondern nur der Interrupt bereitgestellt. Zusätzlich wird hier die Aufforderung beim Start, den Joystick in Mittelstellung zu bringen und eine Taste zu drücken, übersprungen. Das Equipmentwort bleibt von alledem unberührt.
GA‑H67A, i7‑2600K @ 1600MHz, 16GB, MCS9865, AU8820, RTL8111, USB‑FDD + SSD + HDD + AHCI‑BD, FreeDOS + Debian
Antworten