domenica 11 gennaio 2009

Atari Breakout : circuito punteggi - bozza

In Breakout sono presenti 8 file di mattoni per 14 colonne. Partendo dal basso verso l'alto:

  • fila 1 e 2 = 1 punto ogni mattone
  • fila 3 e 4 = 3 punti ogni mattone
  • fila 5 e 6 = 5 punti ogni mattone
  • fila 7 e 8 = 7 punti ogni mattone
Per completare il gioco è richiesto di abbattere due muri; abbattuto completamente il primo (448 punti), si ottiene il secondo muro, per un punteggio complessivo di 896 punti. Non sono previsti altri muri dopo il secondo (?!?).



Schema 1a

Guardando lo Schema 1a, troviamo sei contatori BCD 9310 (location N6, M6, L6, H6, J6, K6), i primi tre utilizzati per memorizzare il punteggio del Player 2 , ed i secondi tre per memorizzare il punteggio del Player 1. Sullo schema ho suddiviso le sezioni di ciascun Player.
Ciascuna tripletta di contatori collegati in cascata sono utilizzati per memorizzare i valori delle unità, decine e centinaia dei rispettivi punteggi; è quindi da escludere la possibilità di veder memorizzato e visualizzato un punteggio superiore a 999. I contatori sono azzerati (punteggio=000) all'inizio della partita, ovvero alla pressione del pulsante Start Player il segnale /Start Game va basso azzerando i contatori.

L'incremento dei contatori avviene tramite il segnale Count1 per il giocatore 1 e Count2 per il giocatore 2. Count1-2 è un treno di impulsi generato dal contatore 74192 (location N9) ogni volta che la palla colpisce i mattoni posti nella :

  • prima e seconda fila genera 1 singolo impulso
  • terza e quarta fila genera 3 impulsi
  • quinta e sesta fila genera 5 impulsi
  • settima e ottava fila genera 7 impulsi



Schema 1b

Guardando lo schema 1b , il segnale che indica che è avvenuto l'abbattimento di un mattone è il Brick Hit. L'assegnazione dei diversi punti per le diverse file di mattoni avviene caricando sul contatore N9 i valori presettati agli ingressi pin# 15, pin# 1, pin 10# e pin# 9.

Con riferimento allo schema 1a, quando il giocatore 1 raggiunge il punteggio di 448 punti, il contatore delle unità segnerà 8 alzando il segnale D1, il contatore delle decine segnerà 4 alzando il segnale G1, ed il contatore delle centinaia segnerà 4 alzando il segnale K1.

D1,G1 eK1 vanno alla porta NAND (location M4), la cui uscita è posta alta quando il punteggio è diverso da 448, per poi andare bassa al raggiungimento dei 448;questa uscita va all'ingresso di una porta OR (location E4) e con il segnale /BP HIT (segnale che va basso quando viene colpito dalla palla il bordo superiore dello schermo o la racchetta) attiva o meno l'uscita della porta OR che funge da clock/trigger del flip-flop F4 ; in dettaglio quando il punteggio è diverso da 448 l'uscita OR è sempre alta, e va bassa solo quando il punteggio è uguale a 448 e contemporaneamente avviene un rimbalzo della palla (segnale /BP HIT).

Ho detto che l'uscita della porta OR (location E4) va al clock del flip-flop F4; questo flip-flop ha il compito di ricostituire (o ricostruire) interamente il muro quando questo è stato completamente abbattuto. Va precisato che l'abbattimento del muro è detectato dalla logica della scheda unicamente andando a testare il punteggio : se questo è uguale a 448 , allora significa che non vi è rimasto più nessun mattone.

Ad ogni modo, il flip-flop è resettato all'inizio del gioco dal segnale /Start Game che andando basso pone le uscite Q=bassa e /Q=alta; abbiamo detto che quando il punteggio è uguale a 448 (quindi nessun mattone presente) ed avviene un rimbalzo della palla, la porta OR E4 va bassa, tenendo quindi basso il segnale di clock del flip-flop; la porta OR torna alta quando è terminata la fase di rimbalzo (segnale /BP HIT nuovamante alto) : il passaggio da basso ad alto dell'uscita della porta OR e quindi del segnale di clock del flip-flop, fa sì che la sua l'uscita /Q sia bassa.

Il passaggio dallo stato alto a quello basso dell'uscita /Q del flip-flip collegata all'ingresso di trigger del multivibratore 9602 (location F3) fa sì che l'uscita FPD1 del multivibratore vada allo stato alto per poi tornare basso; l'inverso dicasi per l'uscita negata /FPD1.


Schema 1c

Il passaggio di stato dei segnali FPD1 e /FPD1 determinano secondo lo schema 1C il ripristino della memoria L3 e di conseguenza il ripristino dell'intero muro.

Lo stesso concetto fin qui espresso per il Player 1 vale per il Player 2

Due muri o tre ?

Considerando che il rispistino del secondo muro avviene solo quando il punteggio è uguale a 448 , il quale alla fine di tutta la catena setta il flip-flop F4, considerando che nussun altro segnale resetta il flip-flop (se non il segnale di inizio nuovo gioco), considerando che al secondo muro il punteggio non può che essere superiore a 448 punti, si direbbe che sia impossibile per il flip-flop F4 resettarsi per poi settarsi nuovamente, e quindi impossibile un ripristino del terzo muro.

E' piuttosto ipotizzabile che durante il gioco in modalità due giocatori si venga a creare una condizione non prevista, tale per cui l'indicazione a schermo del turno di gioco del Player 1 venga erroneamente attribuita al Player 2, e quindi il punteggio del Player 1 venga visualizzato come punteggio del Player 2 : il secondo muro del primo giocatore diverrebbe il famigerato terzo muro ma del secondo giocatore.

Il tutto però potrebbe essere un bug nella gestione della rappresentazione a video dei punteggi e turno dei giocatori; rimane comunque impossibile lo scambio "fisico" dei punteggi tra i giocatori.

Una cosa è sicura : per quanti muri ci siano, il punteggio visualizzato non potrà mai superare i 999 punti.

sabato 10 gennaio 2009

Atari Breakout : Working PCB - Aggiornamento 8

Fortunatamente le supposizioni pensate nel precedente post erano corrette . Sostituito il multivibratore (location N8) , come per incanto i punteggi...punteggiano che è un amore. (per la cronaca il 9602 è stato sostituito con un CMOS 74HC4538)
Sostituito anche l'ampli audio LM380, quindi il sonoro è ok (se alzate il volume del video , oltre che il sottofondo dei cartoni animati di mio figlio, sentite anche i vari tic e tac di Breakout).

Ora la scheda
FUNZIONA !


video

lunedì 5 gennaio 2009

Atari Breakout : not working PCB - Aggiornamento 7

Nel post precedente, ho ipotizzato che il problema per il quale non viene incrementato il punteggio è (probabilmente) dovuto al malfunzionamento del multivibratore 9602 (location N8).
Di seguito tenterò di spiegare - più che altro a me stesso - come sono giunto a questa conclusione; nel frattempo sto aspettando l'integrato di ricambio.

Il blocco che si occupa dei punteggi è grosso modo diviso in quattro sezioni :


  1. sezione di "memorizzazione" dei punteggi - tre contatori per il Player 1 e tre per il Player 2

  2. sezione di visualizzazione a video dei punteggi

  3. sezione di azzeramento punteggi a inizio partita

  4. sezione che si occupa di incrementare il punteggio (ovvero incrementa il valore dei contatori "memoria")

Considerando che all'accensione della scheda sono visualizzati su schermo valori random dei punteggi e considedrando che ad inizio partita tali valori vengono correttamente azzerati, è da presumere che le prime tre sezioni funzionino correttamente, e che sia la quarta ad avere problemi.


La quarta sezione è formata da un multivibratore (9602 location N8) configurato in modo tale che generi un singolo impulso ("one-shoot") della durata immagino inferiore di poco al microsecondo. Questo impulso permette di caricare su un contatore (74192 location N9) il valore da cui incominciare a contare; siccome tale contatore è configurato per il conto alla rovescia, una volta raggiunto l'underflow l'uscita /Borrow del contatore , attraverso tre porte AND , genera un impulso (Count 1 per il punteggio del Player 1 e Count 2 per il punteggio del Player 2) che è inviato ai contatori della sezione 1 (memorizzazione punteggi).

Al contatore 74192 arrivano correttamente tutti i segnali (due di sincronia orizzontale e lo Start Game) ad eccezione dell'impulso one-shoot generato da multivibratore; simulando tale impulso, il contatore incomincia a contare, incrementando la memoria punteggi e sul video viene visualizzato il nuovo punteggio (a riprova del funzionamento di tutta la catena).

Detto così sembrerebbe proprio che il multivibratore non funzioni... andando ad analizzare i segnali in ingresso, ne troviamo tre: il segnale Brick Hit, un altro segnale posto fisso a +5V, ed il segnale di /Attract utilizzato per disabilitare il multivibratore.

Potrebbe essere che uno di questi tre segnali non sia correttamente generato (o manchi del tutto), e che quindi il multivibratore fallisca nel suo lavoro ? Sembrerebbe proprio di no : il +5V c'è, il Brick Hit anche , così come l' /Attract ( anche perchè questi ultimi due segnali sono utilizzati da altre parti, ad esempio il Brick Hit fa cambiare di direzione la palla nel momento in cui il mattone è colpito, e l' /Attract è utilizzato , manco a dirlo, nella fase di Attract Mode).

Tutta questa bella zuppa per dire che il 9602 sembra fritto !

Aspettiamo il ricambio e vedremo...

venerdì 2 gennaio 2009

Atari Breakout : not working PCB - Aggiornamento 6

La più importante novità :

ora è giocabile!



Ma andiamo con ordine...

Dopo aver upgradato la scheda alla revisione F, è stato possibile giocare alla prima partita; tuttavia dopo aver mancato la pallina con la racchetta, il gioco non ritornava in modalità Wait Serve, ma la palla continuava a rimbalzare nella parte superiore del muro , abbattendo quasi tutti i mattoni prima di poter passare dalle brecce del muro per andare nella zona inferiore dello schermo per poter essere colpita dalla racchetta; anche quando il muro era completamente abbattuto, la palla continuava a viaggiare per il campo di gioco: una volta uscita dalla parte inferiore dello schermo, si ripresentava a video per poi scomparire nuovamente.

Sembrava che la circuiteria non riconscesse come si deve il missing ball.

Siccome il missing ball , e quindi l'attivazione del Wait Serve fa capo alla parte di circuito che avevo modificato nell'upgrade, ho subito pensato a qualche errore di collegamento da parte mia.

Andando a rivedere il lavoro svolto, ho trovato un altra diversità nei collegamenti della pcb rispetto allo schema originale Schema 1. Sullo Schema 1, il gate H2 ha il pin#12 collegato al segnale 128H, mentre sulla pcb il medesimo pin è collegato al segnale 8H' ; in questo modo è impossibile il riconoscimento del missing ball, ovvero il circuito non riesce a detectare in modo corretto che la palla ha raggiunto la parte inferiore dello schermo.



Schema 4

Dopo aver effettuato anche questa modifica, le varie fasi di gioco si svolgono in maniera corretta , potendo così giocare una intera partita !

Comunque la scheda non è ancora pienamente a posto : sebbene i mattoni colpiti dalla palla scompaiano, il punteggio non viene aggiornato, ma rimane a zero. Da una rapida verifica sembrerebbe mancare il segnale al pin#9 del multivibtatore N8, la cui uscita abilita il contatore utilizzato per incrementare il punteggio.

giovedì 1 gennaio 2009

Atari Breakout : not working PCB - Aggiornamento 5

Avendo verificato che gli schemi di Breakout sono una revisione successiva rispetto alla scheda, ho deciso (forse discutibilmente) di apportare tali aggiornamenti.
Pertanto ho modificato la pcb secondo quanto riportato nello Schema 1.
Gli effetti si sono fatti sentire: ora all'accensione l' Attract Mode funziona perfettamente, e la pallina rimbalza che è una meraviglia e il Serve Led si spegne dopo due,tre secondi.

Atari Breakout : not working PCB - Aggiornamento 4


  • Risolto il problema della tensione di alimentazione troppo bassa; ora è a 5,01 volt su ciascun componente. Banalmente il cavo di alimentazione della pcb era di sezione troppo piccola e l'effetto della sua resistenza incominciava a farsi sentire. Ma la scheda continua a fare i soliti capricci...

  • Risolta l'incongruenza tra gli schemi dei collegamenti dei vari ICs riportati sullo schematico, ed i collegamenti verificati sulla pcb : quest'ultima è la revisione "E" , lo schema cartaceo è la revisione "F". Il sottostante schema 3 è stato ricavato direttamente dalla pcb


Schema 3

Questo dovrebbe evitare la tracciatura delle pareti destra e sinistra del campo di gioco quando il monitor ha il segnale di sincronia orizzontale attivo.