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.
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:
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:
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):