Jeder, der einmal mit ATARIs Jaguar-Controller gespielt hat, wird dessen gute Handhabung im Vergleich zum Joystick zu schätzen wissen. Mit Hilfe eines kleinen Programmes wird die Nutzung des Pads auch auf dem Falcon und STE möglich, da beide mit den neuen Joystick-Ports bereits ausgerüstet sind.
Von einigen neueren Spielen wie dem Falcon/STE-Spiel Dynabuster+1 werden die Jaguar-Pads bereits unterstützt, aber das Programm ermöglicht auch die Nutzung des Pads anstelle des Joysticks in vielen anderen Spielen wie z.B. dem Falcon-Spiel Z0DIAX2.
Die Grundidee des Programmes ist sehr einfach: Das Jaguar-Pad wird abgefragt, und die Steuerbewegungen werden an die Joystick-Abfrage als Joystick-Bewegungen übergeben.
Es wird also ein Programm benötigt, das im Hintergrund parallel zu dem jeweiligen Spiel arbeitet, und das ohne den Spielablauf und die Geschwindigkeit merklich zu beeinträchtigen. Es ist sicher einleuchtend, daß man dafür einen Interrupt benutzen muß. Es bietet sich der VBL an, da eine Joystick-Bewegung von Seiten eines Spieles sowieso nur bei jedem VBL auf den Bildschirm umgesetzt wird. Leider hat die Nutzung des VBL den Nachteil, daß die meisten Spiele einfach alle VBL-Interrupt-Vektoren ausklinken und nur noch ihre eigenen Routinen anspringen, wodurch die Pad-Abfrage natürlich ausgeschaltet wird. Ein anderer einfach zu nutzender, aber weniger oft gesperrter Interrupt ist der Timer C. Auch der Timer C wird von einigen professionellen Spielen abgeschaltet, so daß eine Nutzung des Pads nur noch mit bedeutend komplizierteren Mechanismen (wenn es überhaupt noch möglich ist!) funktionieren würde. Aber bei vielen Spielen funktioniert unser Programm, hier heißt es: Einfach ausprobieren!
Da das Programm - bzw. die Interrupt-Routine - resident im Speicher bleiben muß, wird zunächst einmal aus der Basepage der benötigte Speicher ermittelt, der am Programmende durch das Programm im Speicher belegt bleiben soll. Nun wird per XBIOS-Funktion Kbdvbase() die Joystick-Routine ermittelt, die später die Bewegungen erhalten soll. Als nächstes wird auch schon die Interrupt-Routine im Supervisor-Modus in den Timer C eingeklinkt. Dabei wird der alte Vektor gerettet, damit er nach der Pad-Abfrage doch noch ausgeführt werden kann.
Der komplizierteste Teil des Programmes ist die Interrupt-Routine. Hier wird dem Port A die Nachricht zur Abfrage des Pad-Zustandes gesendet, und anschließend werden die angekommenen Steuerbewegungen in das Format der Joystick-Routine umgesetzt. Um die so ermittelten Steuerungsdaten an die Joystick-Routine zu übermitteln, benutzt man einfach einen kleinen Trick. Die Joystick-Abfrageroutine, deren Adresse aus der Betriebssystem-Vektortabelle mittels Kbdvbase() ermittelt wird, wird von der Interruptroutine aufgerufen. Diese Joystick-Routine des Spieles merkt dabei aber nicht, daß sie gar nicht vom Betriebssystem aufgerufen wurde und setzt die Bewegungen des Pads um. Das Programm springt nun einfach an die oben ermittelte Adresse der Joystick-Routine, die inzwischen vom jeweiligen Spiel auf eine eigene umgebogen wurde.
Es wird nur der Paddleport A abgefragt und nur der Joystick 1 umgesteuert. Außerdem kann das Programm nur durch Reset beendet werden und unterstützt noch nicht das XBRA-Verfahren, um die Vektorenverbiegung zu kennzeichnen. Erweiterungsmöglichkeiten sind z.B., den Timer C-Interrupt durch bestimmte Ereignisse oder Tasten (z.B. Alt-Help) wieder zuzulassen oder die Routine neu zu setzen, falls sie von einem Spiel ausmaskiert wurde.
Das Programm wurde mit dem Pure-Assembler entwickelt, dürfte aber auch mit allen anderen Assemblern funktionieren.
[1] Erhältlich für 20,- DM bei:
The Sirius Lab,
Ruelzheimer Str. 30a,
76756 Bellheim
[2] Erhältlich als ST-Computer-PD Nr. 725 oder als Vollversion für 10,- DM und Rückporto bei:
Ulrich Haar,
Am Schützenholz 29,
29643 Neuenkirchen
; *********************************************
; * Benutzung des JAGPADS als Joystick-Ersatz *
; * (c)1995 by MAXON Computer *
; * Autor: Michael Haar *
; *********************************************
init_prg;
movea.l 4(SP), A0 ; Länge des Programms...
move.l #$100, D0
add.l 12(A0), D0
add.l 20(A0), D0
add.l 28(A01, D0
move.l D0, prglen ; ...berechnen,
move.w #34, -(SP) ; Mittels Kbdvbase...
trap #14
addq.l #2, SP
movea.1 D0, A0
add.l #24, A0
move.l A0, joyvec ; ...Joystickvector holen,
pea install_rout ; Neuen Interrupt...
move.w #38, -(SP)
trap #14
addq.l #6, SP ; ...installieren,
clr.w -(SP) ; TSR
move.l prglen, -(SP)
move.w #49, -(SP)
trap #1
intr_rout:
movem.l D0/A0-A1, -(SP)
lea joydata, A0 ; neue Joystickdaten hierhin
move.w #$FFEE, $FFFF9202 ; Hallo Joypad,
move.w $FFFF9202, D0 ; sag wie du stehst!
asr.w #8, D0 ; Steuerdaten...
not.b D0
move.b D0, 2(A0) ; ... aufbereiten
move.w #$FFDD, $FFFF9202 ; PS:
move.w $FFFF9200, D0 ; Wie geht■s dem Button?
not.b D0 ; Zu den Steuerdaten. .
andi.b #2, D0
lsl.b #6. D0
or.b D0, 2(A0) ; ...dazu.
pea joydata ; Aufruf der Joystickroutine...
movea.l joyvec, A1
movea.l (A1), A1
jsr (A1)
addq.l #4, SP ; ...mit neuen Steuerdaten.
movea.l old_timer_c, A0 ; Timer C - Routine
jsr (A0) ; des Systems anspringen.
movem.l (SP)+, D0/A0-A1
rts
install_rout:
move.l $400, old_timer_c ; Timer C retten
move.l #intr_rout, $400 ; und neueetzen!
rts
prglen: DS.l 1
joyvec: DS.l 1
joydata: DS.b 3
old_timer_c: DS.l 1