MultiJoy aktuální zprávy...

Radek Štěrba, raster/c.p.u., 2007

A jsme tu opět s naším (zdá se) nekonečným seriálem k problematice MultiJoye, i když dnes bych rád pokračoval dílem definitivně posledním.

Kdo četl povídání v minulém čísle, týkající se programového řízení MultiJoye - přesněji zvětšení doporučené prodlevy mezi zápisem na $D300 (PORTA) a následným čtením jeho stavu na alespoň 30 taktů, si nemusí rvát vlasy, protože tohle doporučení zůstává v platnosti. Co se ale trošku mění, je ta zdůvodňující omáčka okolo.

Abychom jen nevytasili další hypotézu, dobrotivý Robert P. ke mně přinesl logický analyzátor a podívali jsme se tomu konečně pořádně na zoubek (přesněji na zoubky průběhů logických jedniček a nul putujících z PIA obvodu do MultiJoye a nazpátek). Takže, celý problém je v tom, že při změně stavu PIA výstupů dochází k opožděnému náběhu logických jedniček o cca 4.5us, zatímco bity, které mají přejít do nulových úrovní, reagují takřka okamžitě. V praxi se to projevuje tak, že např. při změně výběru sledovaného joysticku číslo 4 na číslo 5 (což se vybírá změnou binární kombinace z 011 na 100) se dolní dva bity vynulují okamžitě, zatímco třetí bit naběhne na jedničku se zpožděním. V důsledku toho se na joystickovém portu nejprve objeví na 4.5us vybraný joystick č.0 (000), a teprve pak požadovaná kombinace pro joystick číslo 5 (100).

(Poznámka: Binární hodnoty jsou oproti číslům joysticků o 1 posunuté, protože joysticky se symbolicky číslují od 1.)

IO demultiplexer v MultiJoy tedy dostane správnou hodnotu až o 4.5us později, a tím se opozdí výběr správného joysticku. K dalšímu zpoždění též o cca 4.5us pak dochází na zpáteční cestě z obdobného důvodu. Směry joysticků, které nejsou právě použity, nejsou nikam zapojeny a k náběhům logických jedniček dojde též opožděně. Celkově tak dochází ke zpoždění cca 9us - to odpovídá přibližně 16 taktům procesoru 6502. A tohle je právě ten skutečný důvod pro dostatečně dlouhou pauzu mezi zápisem a následným čtením registru PORTA.

Zkoušeli jsme hledat způsob, jakým by šlo v MultiJoyi přechody na logické jedničky urychlit. Ze strany výstupu z PIA obvodu toto nijak harwareově zvenčí (na joystickovém portu) ovlivnit nelze. Přesto je tu jedna možnost, a to pomoci si softwareově přidáním zápisu inicializační hodnoty #$ff do registru PORTA vždy po přečtení stavu každého joysticku. Výstup z PIA obvodu se tím pádem vždy před výběrem následujícího joysticku nejprve nastaví na samé jedničky, a pak při zápisu skutečné hodnoty pro požadovaný joystick přejdou právě jen ty nulové bity na nulu. Mezi touto #$ff inicializací a skutečnou hodnotou pro PORTA samozřejmě též musí být prodleva cca 8 taktů, aby se všechny jedničkové bity měly čas nastavit, ale to je zaručeno tím, že inicializaci provádíme už po přečtení stavu, po kterém většinou následuje zpracování všech akcí pro příslušného hráče.

Co se týče urychlení signálů v opačném směru, stačí zapojit na směrové joystickové vstupy 4 pull-up odpory (osvědčilo se nám 10K), čímž zpětné zpoždění téměř zmizelo. U tlačítkového vstupu není pull-up odpor potřeba, neboť i bez něj reaguje dostatečně rychle (jeho stav nesleduje obvod PIA, ale GTIA, která jej využívá např. i pro světelnou pistoli).

Výše zmíněným vylepšením programového ovládání i hardware úpravami v MultiJoyi lze tedy odezvy minimalizovat, přesto však jednoznačně doporučujeme stále dodržovat po zápisu do PORTA před jeho následným čtením prodlevu alespoň 30 taktů.

Vylepšená část kódu pro výběr joysticku tedy vypadá takto:

    lda #N     ;N=číslo joysticku 0-15
    asl @      ;posun o 4 bity
    asl @
    asl @
    asl @
    sta $d300  ;PORTA
    ldx #$06   ;prodleva 30 taktů
WAI dex
    bne WAI
    lda $d300  ;PORTA
    and #$0f
    ;Nyní je v A stav páky
    lda $d010  ;TRIG0
    ;Nyní je v A stav tlačítka
    lda #$ff   ;inicializace všech
    sta $d300  ;PORTA výstupů na 1
    ;...Akce pro hráče N...

Dodatek:
Když už hovoříme o těch úpravách v MultiJoy hardware, je možné též trošku vylepšit zapojení tím způsobem, aby u MultiJoye8 požadavek na joystick 9-16 nevracel stavy joysticků 1-8. K tomu lze pěkně využít povolovací signály /E1 /E2 použitého obvodu 74ALS138, které místo pevného připojení k zemi zapojíme na pin 4 Atari joystickového portu 2. Při požadavku na joystick 9-16 bude pin 4 jedničkový, což všechny výstupy demultiplexeru nastaví na 1, a tedy nebude vybrán žádný z joysticků.