`include	"defines.v"

// USARE TAB di 3 caratteri!

/* -----------------------------------------------------------------------------------------------------------------------------
Questo � il "mio" PDP-8, sviluppato in pochi giorni sulla traccia del Sacro Libro, in versione uProgrammata, che mi
sembra assai pi� interessante. E' stato provato pochissimo ma le funzioni presenti sono state verificate quasi tutte.

Chiudo oggi 3 marzo 2013 sera la prima versione; chiss� se ci sar� mai una ulteriore edizione. Per arrivare almeno a un PDP base
restano da fare:

1) allungare la uROM, oggi � di 64 word, per farla di 128 bisogna aumentare il uPC ecc.

2) mancano le locazioni autoincrementanti

3) manca del tutto l'istruzione IOT e relativi accessori + scheda seriale

4) manca il sistema di interrupt

5) mancano i comandi manuali (pannello utente)

6) resta da estendere la TTL-izzazione, in vista di una futura impossibile costruzione fisica a integrati discreti

Tutto fatto con Active HDL Student Edition. Non provato con Xilinx.

04.03.2013
----------
- scoperto che i registri non funzionavano bene perch� caricavano i dati mentre ancora il registro delle uIs non era stabile. 
  Cambiata la logica: adesso carico il uIR sul fronte di salita di sysclk e i registri su quello di discesa.
  Ancora non ho cambiato AC e flip-flop LINK e OVERFLOW (ma penso che dovrei)
- Aggiunte locazioni 10-17 autoincrementanti

05.03.2013
----------
- fatto sistema di interrupt, simulato da una variabile int_req. Mancano ancora le istruzioni IOT (codice 6000). Per adesso 
  qualunque 6XXX fa ION. Ricorda che OS/8 non usa int.

09.03.2013
----------
- completa revisione delle istruzioni OP GR1 e GR2. Il nuovo sistea ha reso possibile la combinazione di pi� comandi nella
  stessa oeprazione. Si sono liberate cos� anche alcune posizioni nel mux dei qualificatori

- TEST ISTRUZIONI 1 (maindec-8e-d0ab-pb) fino alla parte di MQ (che non c'� - addr=4766). 
  
- TEST ISTRUZIONI 2 (maindec-8e-d0bb-pb): passato fino PC=4211 dove iniziano i test IOT (strano non sia fallito prima, 
  c'erano altre 6xxx)

- TEST BASICO JMP-JMS (MAINDEC-8E-D0IB-PB): test palloso perch� prima salva il loader, quindi con enorme perdita di tempo.
  Poi gira molto a lungo senza errori, direi superato con successo.

NOTA: riguarda sempre il file prodotto dal convertitore di formato (che � fatto come � fatto) e confrontalo con il doc pdf.

10.03.2013 - Implementata una prima struttura per le IOT; ION e IOF sono fatte ma non chiamate correttamente

13.03.2013 - Implememtate ION e IOF via IOP

14.03.2013 - Aggiunto FF run/halt

18.03.2013 - Stasera in treno il "mio" PDP ha eseguito le sue prime istruzioni su hw Nexis2!

19.03.2013 - Oggi abbiamo eseguito con successo (in simulazione) tutto il test istruzioni 1 (MAINDEC-8I-D01C-D.pdf)
				 Anche in hardware ha eseguito le prime istruzioni di detto test
				 Ho dovuto rifare il progetto che non so perch� si era incasinato tutto				 

20.03.2013 - Passa i test 1 e 2 ma il 2 si ferma ai test interrupt. Ho verificato
				 cosa accade (vedi sotto) e la cosa mi convince.
				 ...............................................................................................
					Test MAINDEC istruz. 2 dove si bloccava al test interrupt:				 
							JMP	I .+1
							STR			/ RUBOUT CHARACTER
							TSF			/ setta flag
							TLS			/ carica RUBOUT in UART
							TSF			/ attendi che sia uscito
							JMP	.-1	/ penso lo scopo sia provocare un IRQ
							CLA
							TAD	BACK1	/ FLAG IS 1
							DCA	2		/ mette indirizzo di BACK1+1 (SZA) in loc 0002
							ION
							NOP			/ GO TO LOC 0000
							HLT 			/(arriva qui se...) NO INTERRUPT
					OUT1,	,-1
					BACK1,,+1
							SZA			/ RETURN FROM LOC 0001
							HLT			/ AC SHOULD BE 0
											/ CONFIDENCE CHECK

					/ penso che in pratica predisponga la RETI e torni con RUBOUT in AC
					STR,	0				/ indirizzo di ritorno
							TAD	JMPIX	/ 5402 (JMP I 2) -> AC - 
							DCA	1		/ 5402 -> 1
							DCA	2		/ 0 -> 2
							DCA	3		/ 0 -> 3
							TAD	K0377	/ rubout (377=FFh) -> AC
							ISZ	STR	/ incrementa ind di ritorno (compensa un JMS I nel codice in chiamata)
							JMP 	I STR	/ ritorna
					JMPIX,5402
							
					0000	?
					0001	5402 			/ (JMP I 2) in pratica salta alla 0000, dove suppongo ci sta l'indirizzo lasciato all'INT
					0002	0000			/ quindi arriva INT, mette l'indirizzo di ritorno alla 0000, fa JMP 0 e quindi
											/ in pratica farebbe una RETI
											/ ma il codice chiamante poi ci mette l'indirizzo di rit
											/ dall'interrupt che vuole lui (SZA sopra)
					0003	0000				 
				 ...............................................................................................
				 Sono riuscito a incorporare il file del test nell'inizializzazione hw della FPGA
				 Test hw (test 1) riuscito quasi tutto; ho rivisto il flag overflow che era cloccato male
				 Passa il test 1 in quasi tutto. Al momento si ferma alla 502 e alla 4224 perch� manca uno SWREG
				 decente. Grandissima soddisfazione!!!

21.03.2013 - UART funzionante sia in RX che in TX

22.03.2013 - sistemata gestione INT enable FF; test istruzioni n.2 eseguito un giro completo. Ho dovuto 
				 riguardare l'UART (flag tastiera usciva settato dal reset)
				 Test istruzioni 2 passato tutto (in simulazione). Immensa soddisfazione!!!!

24.03.2013 - ho avuto molti problemi dall'hw: simulazione OK, hw KO. Alla fine, dopo una ripulitura generale 
             sembra funzioni ma non mi fido troppo. Ho fatto un trucchetto che mette lo sw a 7777 dopo il 
				 primo fetch. Adesso passa sia il test 1 e che senza problemi, in hw e in simulazione.
				 Tra le varie cose:
				 - ho effettuato un test mentale sui timing della simulazione; mi sembra tutto molto pulito
				   Il uProgr stabilizza la uIstr al posedge e i vari latch e la memoria latchano sul negedge
				 - ho separato due clock bufferizzati che atraversano tutto(clk e clk_n),
  				   per una migliore sincronicit�
				 - ho caricato tutti gli ingressi (sw e btn) per evitare strani effetti (?)
				 - ho spostato tutte le macro e le opzioni in defines.v
				 - ho trasformato i registri principali 74175 con codice verilog (de-TTL)
				 - ho fatto dei nuovi flip flop + razionali
				 - ho provato l'UART in uscita completamente (va a 9600 baud)
				 NOTA: il PC iniziale per adesso pu� essere impostato solo dal codice
				 --------------------------------------------------------------------------------------------------
				 FOCAL: ho creato il file coe del Focal, dovrebbe essere quasi OK. Il listato sorgente
				 non sembra 100% aderente. Il Focal sembra partire ed emette "?03.10 CR/LF *". L'UART emette 
				 solo qualcuno dei caratteri (da rivedere)
				 Corretta la UART (vedi nota su buffer in loco); adesso in simulazione sembra emettere
				 il mitico messaggio come richiesto. Domani vedremo in hw cosa succede.

26.02.2013 - Verificato il GIBE.BAS (convertitore da bin a coe) Era fatto male e produceva casini se il
             nastro conteneva caratteri dopo trailer. Corretto, non richiede pi� neppure di mettere la
				 lunghezza del file, la mette in auto. Speravo fosse il problema del Focal ma non � cos�.
				 
				 Provato il test JMP-JMS (MAINDEC-8E-D0IB-PB.bin). Risultato OK in hw. Nota: se lo fermo e lo
				 resetto non va pi�. Penso che il problema sia strutturale: il test dovrebbe essere rilanciato
				 dalla loc. 0600 e non 0200, se no la memoria non viene inizializzata correttamente. Insomma OK!
				 
				 Provato il test "adder" (MAINDEC-8E-D0CC-PB.bin) ma non va, perch� usa le istruzioni dell'8e.
				 
				 Provato il test "random DCA" (maindec-8e-d0gc-pb.bin). Esito positivo!
28.03.2013 - Provato il test "random ISZ". Non andava poi ho scoperto che il flag della teletype non va
             settato al reset, se no appena uno abilita l'int... zac! Va subito nella isr prima che
				 il sw abbia potuto finire le inizializzazioni.
				 Eseguiti anche test Memory Address (doc a comune ...-D1B0 tra MAINDEC-08-D1B1 w ...B2). 
				 Non ho ben capito la logica del primo blocco (B1); la dic dice che parte da 0000 ma � impossibile.
				 L'ho fatto partire da 0004 (il B2 da 7400). Tutto OK anche in hw.
30.03.2013 - Mille tentativi ma il FOCAL non va (emette ?03.01 e non reagisce ai comandi). Basta, ci rinuncio!
				 Provato test random JMP-JMS, risultato OK.
31.03.3013 - Modificata logica SWREG
				 Test Teletype parte 1 (MAINDEC-08-D2PE-D) passate routines 0 e 1 (altre richiedono nastri di test)
			    Errore, KCC e KPC non azzeravano acc.
				 Scoperto che file FOCAL ha una word errata (indirizzo 7557, deve essere 0000). Non ho capito il
				 perch�). Focal non va lo stesso.
				 Non so perch� ma in hw non funziona pi� niente.
02.04.2013 - Modificata logica start/stop ma anora risultati non OK (non fa passo passo, almeno non sempre,
             indicazioni confuse, in simul sembra OK).
				 FOCAL dopo correzione (e TTY messa con MSB forzato a 1) � perlomeno stabile: parte e fa
             il suo bravo *, se riparte fa ?00.00 come dovuto, prende caratteri ma sembra non capirli.
             quando il buffer � pieno rif� il prompt.
04.04.2013 - stanco delle incongruenze ho bufferizzato Led e sw e ora sembra funzionare bene il passo passo. 
				 FOCAL per� diventato instabile, va in stop senza ragione apparente.

05.04.2013 - Dopo un numero incredibile di prove ho trovato un punto critico insolubile. Il comportamento cambia
				 inaspettatamente se passo il parametro disp_sel (anche costante) al mux display_selector 
				 (file datapath.v) o se invece lo metto direttamente nel mux.

				 Esempio
			    -------
				 La chiamata � in questo stesso file, qui sotto:
				 
				 datapath DP (.....
					 .disp_sel(4'b0001), // <<<<<=======================
					 ..........
					 );			 	 
				 
				 il mux � in datapath.v:
				 
				 module datapath (....disp_sel....);
				 	 input [3:0] disp_sel;
					........
					 mux9in_12w display_selector ( .select(disp_sel),....

				 Come descritto sopra NON VA.
				 Se per� cambio mettendo il parametro direttamente nel mux, allora VA:
					mux9in_12w display_selector ( .select(4'b0001),....
				 
				 La differenza tra VA e NON VA non � semplice da descrivere anche perch� non riesco
				 a capire cosa accade dentro quando non va, ma quando non va il funzionamento di tutta 
				 la logica sembra incoerente.

07.04.2013 - ho fatto un programmino di test, assemblato a mano, per testare la seriale. Risultato positivo.

				 Grazie al source di ODT ho scoperto cosa impediva il funzionamento di ODT e EDIT: per chiss� 
				 quale ragione avevo messo un CLA all'interno di ISZ. Eliminato, ora ODT e ED sembrano OK, 
				 ma FOCAL continua a fare le bizze.

				 Rifatti di nuovo i test Istruzioni 1 (D01C) e 2 (D02B), esito positivo ma solo se rimuovo
				 il diabolico mux nel DP di cui sopra.
				 
				 Ho compreso anche che il mux non viene (giustamente) sintetizzato quando si mette una selezione
				 costante, ma non spiega il comportamento enormemente diverso tra costante diretta o nella funzione
				 chiamante.
				 
				 POI CRASH FISCO DEL MIO PC! (queste note sono postume).
				 
				 Seguono su altro PC prove varie di OS8 su SIMH.

11.04.2013 - PC riparato, ripresa dei lavori. GRANDIOSO! Il FOCAL inizia a funzionare! Eseguiti anche alcuni 
             piccoli programmi. Forse ancora non 100% ma..... CARAMBA!
				 
				 Non va senza mux in DP, pensavo di avere trovato il problema (mancavano dei case nel mux)
				 situazione che potrebbe portare al latching, ma fa casino uguale.
				 
				 Anche col mux va tutto bene finch� non tento il SS, fa qualche passo e s'inguaia.
				 
				 Scoperta: i problemi sono due:
				 - il SS: sembra dovuto al fatto che cloccavo il RUN FF con clk_n; con clk il SS sembra OK;
				 - il mux: � un problema indipendente che si manifesta in varie maniere, a seconda della
				 "gravit�" del disturbo che induce. Levandolo, anche il FOCAL ne risente positivamente. Il
				 test lo puopi fare cos�:
				 - LIVELLO 1 - OK se Focal esegue qualche operazione, tipo TYPE 2+2
				 - LIVELLO 2 - OK se tenendo premuto CR escono sulla TTY solo gli asterischi e non caratteri
				   spuri
				 Solo schiantando a massa panel_led di ritorno da DP ottengo di passare LEV1 e 2.
				 Con panel_led = PCBUS passo LEV1 ma LEV2 comincia a dare degli "8" spuri.
				 
				 RISULTATO: direi che la logica sia praticamente OK, resta forse qualche timing critico da 
				 capire. Comunque un gran bel passo avanti, direi che siamo quasi alla meta. 
				 
				 Con panel_data=0 ha funzionato anche il mitico test della serpolina:
					W
					C-FOCAL,1969

					08.01 F I=0,.5,15; T "*",!; F J=0,30+15*FSIN(I)*FEXP<-.1*I>; T " "
					*GO
					*
															 *
																	 *
																			*
																			 *
																			*
																	 *
															  *
														*
												  *
												*
												 *
													*
														 *
															  *
																  *
																	 *
																	 *
																	*
																*
															*
														*
													  *
													  *
													  *
														 *
															*
															  *
																 *
																 *
																 *
																*
12.04.2013 - Varie prove per capirci qualcosa con risultati scarsi. Per� ora va. Ho fatto quanto
				 segue:
				 - nuovo accumulatore (va come il vecchio)
				 - ripuliture generali
				 - spostamento del mux in CU
				 - eliminazione dei buffer sui clock
				 Risultato che adesso sembra andare perfettamente e mi permette anche di visualizzare
				 PC e IR. Ripetuto + volte il test della serpolina.
16.04.2013 - Inizio modifiche per aggiungere memory extension. Allargo a 50 bit la lunghezza della microistruzione.
			    Implementate istruzioni CIF, CDF, RIF, RDF, RIB, da provare meglio. FOCAL va ancora, sembra (sim).

17.04.2013 - Finita implementazione, test (D1GB) non da errori ma nemmeno produce BELL periodico. Da approfondire.
				 FOCAL parte ma i caratteri battuti non corrispondono:	
					54>50
					45>41
					48>44
					49>45
					4D>49
18.04.2013 - modifico TTY per comprendere anche il caso KRB = KCC + KRS. Per� adesso FOCAL neppure arriva pi� al '*'
			    Controllo al simulatore e noto che probabilmente AC latcha sul fronte errato di clk. Corretto, molte cose
				 saranno da ritestare.

19.04.2013 - continuano i problemi misteriosi anche se con qualche progresso. Revisionati vari punti, spostati tutti
			     i latch sul fronte negativo, eliminato il 3-state da INBUS (messo un OR). Il 3-state sembra non piacergli
				  per niente. Sembra invece gradire molto due uOP aggiunte: la 14 che da tempo a memmout di settarsi
				  e la 64 che invece sembra dare agio all'ALU di stabilizzare le uscite prima di latcharne il contenuto in AC.
				  Con entrambe FOCAL funziona; con una sola delle due, no. Altre note:
				  - adesso funziona anche il mux del display
				  - eseguito di nuovo test D01C (istruzioni 1), mi ha permesso di scoprire che serviva la uOP 64
				  - da testare di bel nuovo il ext
				  - nel memext ha dimostrato di preferire l'implementazione behavioral su db_out mentre con la arch non va

21.04.2013 - Forse siamo a una svolta. I problemi misteriosi potrebbero avere due origini:
				 1) ritardo nella memoria nel tirar fuori il dato; ogni assegnazione a MA deve essere seguita da un ciclo
				    in pi� come wait (solo due punti dove si assegna a MA, una sola uOP in pi� � necessaria)
				 2) tempi della logica troppo lenti; in molti casi i dati all'uscita dell'ALU si stabilizzano troppo tardi.
				    Rimedio: ho dimezzato la f del clk, tanto non abbiamo fretta...
			    Ho eliminato le uOP aggiunte il 19 (#14 e#64), mentre confermo la #12 mentre la # � sempre seguita da un ciclo
				 che garantisce il tempo di accesso sicuro.
					 +-----------------+-------+------+-------+--------+
					 | TEST EFFETTUATI |	 SA	| SWR  | Esito | CODICE |
					 +-----------------+-------+------+-------+--------+
					 | Focal			    | 0200	| 7777 |  OK   |  AJAE  |
					 +-----------------+-------+------+-------+--------+
					 | Test Istr 1     | 0151	| 7777 |  OK   |  D01C  |
					 +-----------------+-------+------+-------+--------+
					 | Test Istr 2B    | 0201	| xxxx |  OK   |  D02B  |
					 +-----------------+-------+------+-------+--------+
					 | Test ISZ p.1a   | 0037	| 0000 |  OK   |  D07B  |
					 +-----------------+-------+------+-------+--------+
					 | Test ISZ p.2a   | 0037	| 0001 |  OK   |  D07B  | 
					 +-----------------+-------+------+-------+--------+
					 | Test Memadr low | 0004	| 4000 |  OK   |  D1B1  | (SA corretto, errato nel manuale)
					 +-----------------+-------+------+-------+--------+
					 | Test Memadr hi  | 7400	| 4000 |  OK   |  D1B2  |
					 +-----------------+-------+------+-------+--------+
					 | Test JMP-JMS    | 0200	| xxxx |  OK   |  D01B  | Ci mette circa 2 secondi invece di 10 per ogni loop
					 +-----------------+-------+------+-------+--------+
					 | Test DCA        | 0200	| 0000 |  OK   |  D0GC  | 
					 +-----------------+-------+------+-------+--------+

22.04.2013 - Ottime notizie, il mem ext MC8 funziona. Quindi si aggiunge questa riga alla tabella:
					 +-----------------+-------+------+-------+--------+
					 | Test Ext Memory | 0200	| 0003 |  OK   |  D1GB  | 
					 +-----------------+-------+------+-------+--------+
				 C'erano due problemi, abbastanza facili da scovare, avendo il sorgente, grazie alla possibilit� di mettere 
				 breakpoint, eseguire in passo passo e esaminare i registri.
				 1) avevo misinterpretato: si deve usare il DF solo se l'istruzione � AND, TAD, ISZ e DCA, non per JMP-JMS;
				    aggiunto controllo.
				 2) mancava l'inibizione degli INT dopo l'istruzione CIF, fino al prossimo JMP-JMS (inh_INT). Per scoprirlo 
				    ho dovuto ricostruire pagina del listato che era sbiadita; trascrivo il lavoro fatto:
					 
					   0677 6201 	CDF 0
						0700 6041	TSF
						0701 4422	JMS I XTP /SET TTY FLAG
						0702 3027	DCA LOOP
						0703 4423	JMS I XSTKS
						0704 6212	CIF 10
						0705 6001	ION
						0706 7000	NOP
						0707 5310	JMP .+1
						0710 7402	HLT
					 
				 Aggiunto controllo che int sia disabilitato prima di eseguire ION
					 +-----------------+-------+------+-------+--------+
					 | Editor          | 0200	| 0000 |  OK   |  ESAB  | 
					 +-----------------+-------+------+-------+--------+
					 | ODT             | 0200	| 0000 |  OK   |  C0C1  | 
					 +-----------------+-------+------+-------+--------+
					 | Focal69		    | 0200	| 7777 |  OK   |  AJAE  |
					 +-----------------+-------+------+-------+--------+
23.04.2013 - Da oggi abbiamo l'ASSEMBLER! (palbart.c, ricompilato in Visual C++ 2008). Sembra funzionare benissimo.
             (Provato su mio uart.pal). Esempio di output:
				 
    1       0200  *200
    2 00200 5227  START,  JMP START0              /ERA CLA CLL
    3 00201 6046  START1, TLS                     /TLS TO SET PRINTER FLAG
    4 00202 1250                  TAD BUFF        /SET UP BUFFER SPACE
    5 00203 3251                  DCA BUFFPT         
    6 00204 4213                  JMS CRLF        /RETURN CARRIAGE
    7 00205 1651  CHRTYP,         TAD I BUFFPT    /GET A CHARACTER
    8 00206 7450                  SNA             /IS IT ALL ZEROS?
    9 00207 7402                  HLT             /YES: STOP.
   10 00210 4221                  JMS TYPE        /NO: TYPE OUT THE CHARACTER
   11 00211 2251                  ISZ BUFFPT      /INCREMENT BUFFER POINTER
   12 00212 5205                  JMP CHRTYP      /TYPE ANOTHER CHARACTER
   13             
   14                             / * * * TYPE CRLF
   15 00213 0000  CRLF,           0               /CARRIAGE RETURN & LINE FEED
   16 00214 1252                  TAD K215        /TYPE CR FIRST
   17 00215 4221                  JMS TYPE           
   18 00216 1253                  TAD K212        /TYPE LINE FEED
   19 00217 4221                  JMS TYPE           
   20 00220 5613                  JMP I CRLF         
   21             
   22                             / * * * TYPE A CHARACTER
   23 00221 0000  TYPE,           0               /SUBROUTINE TO TYPE CHARACTER
   24 00222 6041                  TSF             /PRINTER READY YET?
   25 00223 5222                  JMP .-1         /NO: CHECK AGAIN.
   26 00224 6046                  TLS             /YES: TYPE CHARACTER
   27 00225 7200                  CLA             /CLEAR ASCII FROM AC
   28 00226 5621                  JMP I TYPE      
   29                                             
   30 00227 7300  START0,         CLA CLL                 
   31 00230 1250                  TAD BUFF        /SET UP BUFFER SPACE
   32 00231 3251                  DCA BUFFPT      
   33 00232 6031  LISN,           KSF             /KEYBOARD STRUCK YET?
   34 00233 5232                  JMP .-1         /NO: CHECK AGAIN
   35 00234 6036                  KRB             /YES: READ CHARACTER.
   36 00235 6046                  TLS             /ACKNOWLEDGE IT ON PRINTER
   37 00236 3651                  DCA I BUFFPT    /STORE CHARACTER�
   38 00237 1651                  TAD I BUFFPT    /CHECK FOR TERMINAL $.
   39 00240 1254                  TAD MDOLAR      
   40 00241 7450                  SNA             
   41 00242 5245                  JMP DONE        /CHARACTER IS A $.
   42 00243 2251                  ISZ BUFFPT      /CHARACTER IS NOT A $.
   43 00244 5232                  JMP LISN        /GET ANOTHER CHARACTER.
   44 00245 7300  DONE,   CLA CLL                 /STORE 0 IN LAST LOCATLON.
   45 00246 3651                  DCA I BUFFPT    
   46 00247 5201                  JMP START1      /ERA HLT
   47             
   48 00250 0260  BUFF,           0260
   49 00251 0000  BUFFPT,         0
   50 00252 0215  K215,           215
   51 00253 0212  K212,           212
   52 00254 7534  MDOLAR,         7534
   53             $

      No detected errors
...................................................................................

             IMPORTANTE - Aggiunte istruzioni Gruppo 3 (MQ), primo test passato:
					 +-----------------+-------+------+-------+--------+
					 | Test 8E parte 1 | 0200	| 7777 |  OK   |  D0AB  |
					 +-----------------+-------+------+-------+--------+

24.04.2013 - Ovviamente queste non sono sufficienti a fare un 8E. Anche lasciando da parte l'extended arithmetic KE8-E,
				 mancano ancora le istruzioni estese su INT e forse qualche altra cosa. Per� non so se vale la pena di 
				 perderci tempo, mi sembra che non siano molto usate nei vari software (dubbio: non � che se trova GR3 OK
				 capisce che gira su 8E e usa INT avanzato?).
				 
				 Il test istruzioni 2 viene eseguito fino alla 4211 dove va giustamente in errore.
					 +-----------------+-------+------+-------+--------+
					 | Test 8E parte 2 | 0200	| 7777 |  FAIL |  D0BB  | (va OK fino alla 4211)
					 +-----------------+-------+------+-------+--------+
					 | Focal69		    | 0200	| 7777 |  OK   |  AJAE  | (riprovato)
					 +-----------------+-------+------+-------+--------+
             				 
--------------------------------------------------
Riepilogo dei test "ufficiali" della DEC (vecchio)
--------------------------------------------------
- ISTRUZIONI 1 (MAINDEC-8I-D01C-PB) OK (simul+hw) (confermato OK 7.4.2013)	
- ISTRUZIONI 2 (MAINDEC-8I-D02B-PB) OK (simul+hw) (confermato OK 7.4.2013)
- RANDOM AND   (MAINDEC-8E-D0DB-PB) KO x (deve farlo: non eseguiamo istruzioni 8e)
- RANDOM DCA   (maindec-8e-d0gc-pb) OK
- ADDER        (MAINDEC-8E-D0CC-PB) KO x (deve farlo: non eseguiamo istruzioni 8e)
- JMP-JMS      (MAINDEC-8E-D0IB-PB) OK
- RANDOM ISZ   (maindec-08-d07b-pb) OK (simul+hw)
- MEMORY ADDR  (MAINDEC-08-D1B1) OK (simul+hw)
					(MAINDEC-08-D1B2) OK (simul+hw)
- RANDOM JMPJMS(MAINDEC-08-D05B-PB) OK (hw)
- TELETYPE		(MAINDEC-08-D2PE-D) routines 0 e 1 OK

--------------------------------------------------
18 Aprile 2026 - 13 anni dopo
--------------------------------------------------
- ripreso in mano progetto
- con aiuto di ChatGPT sono riuscito incredibilmente a rimetterlo in funzione E SENZA l'odiato ambiente di Xilinx
  ma usando strumenti opensource ()
- brew install icarus-verilog
- brew install surfer
Uso:
	iverilog -g2012 -DSIMULATION -o pdp8.out \
		PDP_top.v PDP_cpu.v Datapath.v Main_comps.v "74 series.v" \
		Teletype.v uart.v brg.v blk_ram16kx12.v ipcore_dir/RAM.v \
		PDP_simulation.v
		(produce pdp8.out)
	
	vvp pdp8_sim (produce pdp8.vcd)
   vvp pdp_sim | tee sim.log

	
	surfer pdp8.vcd (lancia ambiente grafico)
----------------------------------------------------------------------------------------------------------------------------- */

module PDP_top (
	clk, sw, Led, btn,
	seg, dp, an,
	RsTx, RsRx,
	pc_display, ac_display,
	switch_register, break_addr, addrld_button_level, brkset_button_level,
	exam_button_level, deposit_button_level, extaddr_button_level,
	panel_addr_display, panel_md_display
);

	input  clk;
	input  [7:0] sw;
	output [7:0] Led;
	input  [3:0] btn;
	output [6:0] seg;
	output dp;
	output [3:0] an;
	output RsTx;
	input  RsRx;
	output [11:0] pc_display;
	output [11:0] ac_display;
	input  [11:0] switch_register;
	input  [11:0] break_addr;
	input  addrld_button_level;
	input  brkset_button_level;
	input  exam_button_level;
	input  deposit_button_level;
	input  extaddr_button_level;
	output [11:0] panel_addr_display;
	output [11:0] panel_md_display;

	wire [11:0] panel_data;
	wire clk2;
	wire reset;

`ifndef SIMULATION
	wire clkdisp;
	wire [3:0] btn_deb;
`endif

`ifdef SIMULATION
	assign reset = btn[0];
`else
	assign reset = btn[0] | btn[1] | btn[3];
`endif

`ifndef SIMULATION
	debounce deb (
		.inp(btn),
		.clk(clkdisp),
		.reset(reset),
		.outp(btn_deb)
	);
`endif

	ff_div2 DIV (.clk(clk), .Q(clk2));

	control_unit CU (
		.clk(clk2),
		.clk_n(~clk2),
		.reset(reset),
		.Txd(RsTx),
		.Rxd(RsRx),
`ifdef SIMULATION
		.btn(btn),
`else
		.btn(btn_deb),
`endif
		.swx(sw),
		.Led(Led),
		.panel_led(panel_data),
		.pc_display(pc_display),
		.ac_display(ac_display),
		.switch_register(switch_register),
		.break_addr(break_addr),
		.addrld_button_level(addrld_button_level),
		.brkset_button_level(brkset_button_level),
		.exam_button_level(exam_button_level),
		.deposit_button_level(deposit_button_level),
		.extaddr_button_level(extaddr_button_level),
		.panel_addr_display(panel_addr_display),
		.panel_md_display(panel_md_display)
	);

endmodule
