Joystick

z1013-joystickanschluss-vp.jpg
Anschluss nach practic 1/88 und Brosig-Monitor.

Der Anschluss eines Spielhebels (Joystick) wurde schon früh von Amateuren erdacht und veröffentlicht. Bereits in practic 1/87, S. 30-31 wurde der Selbstbau von Joysticks beschrieben. Es gab diverse Artikel zu diesem Thema:

Für die Hardware und die die Abfrage per Software gibt es leider keinen einheitlichen Standard. Die Variante nach practic 1/88 kann als Standard angesehen werden.

Manche Spiele unterstützen deshalb alle bekannten Varianten, wie z.B. Labirinto (http://overthehill.de/Z1013/index.htm).

Im einfachsten Fall wird eine fünfpolige Diodenbuchse an der Tastatur angebracht und die Schalter des Spielhebels werden den entsprechend programmierten Tastaturkontakten parallel geschaltet (practic 1/87).

Eleganter ist die Nutzung von USER-Port A der PIO, das über den Steckverbinder X4 zugänglich ist. Dann ist der Anschluss von zwei Spielhebeln gleichzeitig möglich. In JU+TE 6/87 gab es eine erste Variante (Bild links). In practic 4/87 wurde eine erweiterte Anschluss-Variante vorgestellt (Bild Mitte), im nächsten Heft 1/88 erschien die verbreitetste Variante (Bild rechts, praktischer Aufbau s. Bild ganz oben). Nach practic 4/87 werden beide Sticks parallel abgefragt und die Aktionstaste aktiviert alle Richtungen. Die spätere Variante (1/88) nutzt PA5/PA6, um die Sticks zu multiplexen, und hat zusätzlich noch einen 1-Bit Soundausgang.

JU+TE practic 4/87 practic 1/88

Letztere Schaltung hat den Vorteil, dass die industriell gefertigten Spielhebel des Z9001/KC87 angeschlossen werden konnten. Zusätzlich ist der Code zur Abfrage dieses Anschlusses im bekannten Brosig-Monitor enthalten und kann per Sprungverteiler aufgerufen werden.

FFBBH - JMP GETST

  Abfrage der Joysticks und Übergabe des Er-
  gebnisses in BC (B-links,C-rechts) mit folgen-
  den Bit-Bedeutungen (Belegung mit 1):
    Bit 0 - links
        1 - rechts
        2 - runter
        3 - hoch
        4 - Aktionstaste
     Z-Flag=1, wenn keine Betätigung vorliegt
    CY-Flag=1, wenn Spielhebel nicht angeschlossen
                    ;Joystickabfrage, Joystickmodul nach 'practic'
                    ;
3E CF       GETST:      LD      A,0CFH                  ;PIO Mode 2
0E 1F                   LD      C,1FH
D3 01                   OUT     1, A
79                      LD      A,C
D3 01                   OUT     1, A
3E 20                   LD      A,20H                   ;linker Joystick
D3 00                   OUT     0, A
DB 00                   IN      A, 0
A1                      AND     A, C
37                      SCF
C8                      RET     Z                       ;Cy=1 --> kein Modul
2F                      CPL
A1                      AND     A, C
47                      LD      B,A
3E 40                   LD      A,40H                   ;rechter Joystick
D3 00                   OUT     0, A
DB 00                   IN      A, 0
2F                      CPL
A1                      AND     A, C
4F                      LD      C,A
B0                      OR      B                       ;Z=0 --> keine Taste gedrueckt
C9                      RET

Wenn nur ein Joystick genutzt werden soll, kann er auch direkt am USER-Port angeschlossen werden:

USER-Port                           9pol. Joystickbuchse

+5V (A1) -------------------------------- +5V    (7)
A0  (A4) -------------------------------- LEFT   (3)
A1  (B4) -------------------------------- RIGHT  (4)
A2  (C4) -------------------------------- DOWN   (2)
A3  (A3) -------------------------------- UP     (1)
A4  (B3) -------------------------------- Taste  (6)
0V  (A5) -------------------------------- 0V     (8)

Bei einem solchen Anschluss können westliche Joysticks ohne Änderungen genutzt werden. Eventuell ist es bei einigen Typen nötig, die Leitungen A0..A4 am Z1013 mit 10k-Widerständen gegen +5V abzublocken.

In meinem Monitor ist zusätzlich die INKEY-Routine um die Joystick-Abfrage erweitert worden:

Im Brosigmonitor ist eine Joystickroutine für die Hardware nach 'practic 1/88' enthalten. Diese nutzend, wurde eine kurze Routine geschrieben, die die Nutzung des linken Joysticks parallel zu den Tasten zur Cursorsteuerung und zu SPACE ermöglicht. Viele Spiele sind damit ohne Änderung mit dem Joystick nutzbar. Leider sind Joystick- und Druckerhardware beide für den USER-PORT 0 bestimmt. Deshalb kann nur mit einem von beiden gearbeitet werden. Ist ein Joystickmodul angeschlossen, muss dieses mit @I 1 initialisiert werden. Mit jedem Monitorreset geht diese Zuordnung verloren und muss wiederholt werden.

Es wurden ca. 50 Spiele probiert (im Simulator, mit Monitor 2.02). Da waren fünf Spiele dabei, die den Spielhebel unterstützt haben:

JU+TE 6/87: aladin.z80, galactica.z80, labyrinth.z80
practic 4/87: ladder_8_4.z80 (Stick 2)
practic 1/88: schiessbude_1_0.z80 (Stick 1)

Die rühmliche Ausnahme ist Labirinto.z80 (von 2015), welches alle Varianten unterstützt :-)

PRACTIC 01/88: Unterstütztung für 2 Joysticks ist nicht nimmer implementiert. Die Pins PA5/PA6 wird nicht immer korrekt gesetzt. Manchmal werden auch die Pin 567 als 0 erwartet. Mein alter Joystick hatte daher pull down Widerstände.

Wir verweisen auf die Z1013-Software-Datenbank. Dort sind die Programme mit Joystick gesondert vermerkt.

http://z1013.mrboot.de/software-database/db/index.html

von Bert:

Bei den Programmen mit Joystickabfragen wird oft der Ausgangsport A mit 0 initialisiert. Damit dürfte die Art des Widerstandes egal sein. Wichtig ist, das auf den nicht genutzten Pins eine '0' zurückgelesen wird. Die wenigsten Programme machen eine Bitabfrage, i.d.R. wird der gelesene Port mit einem Byte verglichen.

Statistik:
practic 1/88: 20 Spiele
ju+te 6/87: 4 Spiele
practic 4/87: 2 Spiele

Bemerkungen:

  • kein Spiel nutzt den Einsprung FFBBh des Brosigmonitors
  • alle Spiele unterstützen maximal einen Joystick
  • eigentlich alle Spiele nach practic 1/88 nutzen den Stick, der mit PA6 aktiviert wird (außer Labirinto.z80)
  • die Endung „+prJ“ wird oft für Spiele mit dem Joystick nach practic 1/88 verwendet
  • wall+j.z80: Joy-hoch ist links, Joy-runter ist hoch und Joy-links ist runter. Da hat offenbar jemand die Pins verdreht. Mit wall+prj.z80 funktioniert alles. nettes Feature: Soundausgabe auf PA0
  • schiessbude_1_0.z80: Joy-hoch ist links, Joy-rechts ist rechts, der selbe Programmierer wie von wall+j.z80
  • C.FUSSGAENGER.z80 reagiert irgendwie gar nicht auf Eingaben, weder Joystick noch Tastatur

von Hobi:

mind 2 Spiele nutzen den Sprungverteiler: AUTO-3D -J, MAUS-J. Plus einige KC-BASIC Varianten nutzen den Sprungverteiler, wobei ich kein Programm gefunden habe, dass die Joystick-Funktion benutzt.

Bei den Programmen mit Joystickabfragen wird oft der Ausgangsport A mit 0 initialisiert. Die Pull-Down Widerstände sind bei der CMOS PIO notwendig. Nicht alle Programme initialisieren die PIO korrekt, zB gibt es Programme, die nur auf 8-Bit Eingabe schalten.

Beim „Original“-Z1013 hatte ich das „vergessen“ und wie du schon oben beschrieben hast, kaum Probleme bemerkt. Vielleicht es daran, dass das Verhalten von NMOS und CMOS geringfügig unterschiedlich ist. In meinen alten Programmen hatte ich lediglich OUT 1,CF_BIT_IO und OUT 1,1F_Lower_bits_input. Danach waren automatisch die obersten Bits0. Diese schlampige Programmierung hat sich jetzt gerächt. Es ist noch ein XOR A, OUT 0,A notwendig.

Bei den Programmen in der SW-Datenbank habe ich die korrekte Initialisierung nachgeholt. Auf den Kassetten (bzw. z.B. Krull Z1013 Software) ist es noch falsch gemacht worden.