Commodore 64 Game Network

Scopo: creare un network tra più postazioni di Commodore 64 con costi e programmazione minima.

Interfacciamento:

Il Commodore 64 ed altri modelli ad 8-bit sono equipaggiati con due chip 6522 Versatile Interface Adapters, dove ognuno provvede un semplice uso di una "porta" seriale per comunicazioni; se configurata correttamente può trasmettere un dato da un registro ad un'altra porta seriale.

Utilizzando queste porte, una in ingresso ed un'altra in uscita si potrà inviare dati tra uno o più computers con porte simili.

Segue lo scheda di collegamento di una porta (user port del C64). Questo schema usa 2 plug RJ11 femmina, cavo per collegamento ad un'altro C64 e connettore per user-port Commodore.

netpins.gif (4467 byte)

Pin - Descrizione                      Direzione dati
 4  - Serial Port Counter dal CIA #1   [in]
 5  - Serial Port dal CIA #1           [in]
 6  - Serial Port Counter dal CIA # 2  [out]
 7  - Serial Port dal CIA # 2          [out]
 A  - Massa                            [in]
 K  - Parallel Port B Bit # 6*         [in]
 L  - Parallel Port B Bit # 7*         [out]
 N  - Ground                           [out]
* Questa connessione (1-bit) non è realmente necessaria in questo progetto
  ma potrebbe essere utile in futuro, o servire come linea di collegamento
  minore (disponibile per l'utente).

L'ordine inverso dei collegamenti di ingresso-uscita è necessario se si usano cavi telefonici standard non modificati.

Foto dei componenti necessari:

netcomp.jpg (10256 byte)

Il blocco connettori a sinistra è aperto per mostrare i collegamenti (che devono essere sbucciati il più vicino possibile ai terminali del plug, in modo da permettere il funzionamento con un collegamento alla max. lunghezza), il blocco connettori a destra è completamente saldato ed assemblato.

La seguente foto mostra tre connettori con relativi collegamenti, esempio di come dovrebbe essere un collegamento tra tre postazioni:

netlink.jpg (10830 byte)


PROTOCOLLO DI COMUNICAZIONE

Esempio in assembler di comunicazione seriale:
 
INVIO DATO:
 
SETUPINVIO    LDA #%01111111
              STA $DD0D        ;azzera tutti gli interrupts
              LDA LDA#$04
              STA $DD04        ;imposta lo-byte del timer ad un valore alto
              LDA #$00
              STA $DD05        ;imposta hi-byte del timer ad un valore alto
              LDA #%01000000
              STA $DD0E        ;imposta il registro di controllo del timer
              SEI              ;imposta l'interrupt disabilitato
LOOPINVIO      LDA [DATA]
              STA $DD0C        ;invia il dato
              LDA #%00001000
ATTFINEINVIO  BIT $DD0D
              BEQ ATTFINEINVIO ;controllo se sta ancora inviando
              [PIU' DATI DA INVIARE?]
              [SE SI,] JMP/BEQ LOOPINVIO
FINEINVIO     CLI
              RTS
 
 
RICEZIONE DATO:
 
SETUPRIC      LDA #%01111111
              STA $DD0D        ;azzera tutti gli interrupts
              LDA $DC0E
              AND #$10111111
              STA $DC0E        ;ingresso serial port a vel.clock esterno...
ATTDATOIN     LDA $DC0D
              AND #%00001000
              BEQ ATTDATOIN    ;attende il bit di "dato arrivato"
              LDA $DC0C        ;preleva il dato arrivato
              [SALVA DATO RICEVUTO]
              [PIU' DATI DA RICEVERE?]
              [SE SI,] JMP/BEQ ATTDATOIN
FINERIC       LDA #%10000001
              STA $DC0D        ;riabilita interrupts
              RTS
 
 

Qesto progetto è rivolto ai giochi stile arcade, quindi l'ordine dei processi è importante per ottimizzare le temporizzazioni; le postazioni dovrebbero essere numerate da 0 fino all'ultima in ordine per determinare il primo che trasmette-prima postazione... in esecuzione, ogni postazione dovrebbe ritrasmettere il dato nel loop, in modo che la prossima postazione possa ottenere il suo turno per trasmettere la sua mossa.

L'ideale sarebbe che i vari processi dei turni delle postazioni siano il più simultanei possibile, qundi più postazioni saranno collegate e più il gioco sarà lento.

Esempio dei processi (se questo modo è all'avvio del loop):


cbmsx.gif (1543 byte)