Merge branch 'master' of ichibi:/home/git/Repositories/pato-z80-home-computer
This commit is contained in:
commit
3db972995a
2
assets/README.md
Normal file
2
assets/README.md
Normal file
@ -0,0 +1,2 @@
|
||||
# Assets
|
||||
This folder contains all the media assets for presenting Pat80 to the web, print and other media
|
BIN
assets/media/pat80-banner-colour-raster.png
Normal file
BIN
assets/media/pat80-banner-colour-raster.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
assets/media/pat80-banner-colour.xcf
Normal file
BIN
assets/media/pat80-banner-colour.xcf
Normal file
Binary file not shown.
BIN
assets/media/pat80-banner.xcf
Normal file
BIN
assets/media/pat80-banner.xcf
Normal file
Binary file not shown.
0
assets/worklog/en/.gitkeep
Normal file
0
assets/worklog/en/.gitkeep
Normal file
25
assets/worklog/ita/01-intro.md
Normal file
25
assets/worklog/ita/01-intro.md
Normal file
@ -0,0 +1,25 @@
|
||||
È l'inizio degli anni 80. Nelle sale spopolano i Ghostbusters, La Storia Infinita ed E.T. Per i Goonies e Ritorno al futuro bisogna aspettare ancora un po'. La radio suona Girls Just Want To Have Fun di Cyndi Lauper e gli Iron Maiden rilasciano Aces High. Nelle case degli italiani cominciano a comparire i primi Commodore 64, collegati all'onnipresente TV color in sala, magari litigandosi l'unica entrata RF del televisore con un fiammante VHS. Per il NES, invece, bisognerà aspettare ancora un bel po'.
|
||||
|
||||
È cominciata la rivoluzione degli Home Computers. I calcolatori non sono più costosissimi ed ingombranti apparecchi riservati ad istituzioni e grosse aziende, ma arrivano nelle case di tutti, in formati compatti e convenienti, a cifre inferiori al mezzo milione di lire. Il software è distribuito prevalentemente su audiocassetta o come listati BASIC da inserire attraverso la tastiera, comprando in edicola i magazines per gli appassionati di home computers.
|
||||
|
||||
Solo pochi anni prima sarebbe stato impossibile, per gran parte delle persone, procurarsi un computer, tanto che gli appassionati col pallino dell'elettronica tentavano di costruirsene uno. Gli "homebrew computers" (computer "fatti in casa") sono i veri responsabili dell'inizio di questa rivoluzione, con tutta la letteratura collegata, come i capolavori Build your own Z80 computer di Steve Ciarcia, The Cheap Video cookbook di Don Lancaster o la bibbia di programmazione assembly Programming the Z80 di Rodnay Zaks.
|
||||
|
||||
Ho sempre desiderato poter vivere sulla mia pelle la rivoluzione informatica di quegli anni, ma non ne ho avuto la possibilità: non ero ancora nato, e non si può tornare indietro nel tempo.
|
||||
|
||||
... oppure sì? Magari con un po' di fantasia! Immaginiamo di essere un appassionato di elettronica desideroso di avere un computer tutto suo. Immaginiamo di riuscire a procurarci un processore. Magari lo Zilog Z80, progettato dall'italiano Federico Faggin e rilasciato nel '76, superiore in molti aspetti al diffusissimo MOS 6502 che dava vita all'Apple II.
|
||||
|
||||
Allora, avete voglia di seguirmi in questo viaggio di fantasia che mi porterà a progettare e costruire il:
|
||||
|
||||
[LOGO PAT80 COLOR]
|
||||
|
||||
L'idea è quella di progettare e costruire un computer da zero, come avrebbe fatto un appassionato a cavallo tra gli anni 70 ed 80. Ispirarmi alle soluzioni esistenti, ma mai copiare e mai inseguire la compatibilità con qualche sistema preesistente. Questo comporterà che io, che non ho mai toccato l'Assembly, scriva un sistema operativo da zero. Probabilità di successo dell'intera impresa: 0%. Ma il calabrone, che non sa di non poter volare, vola lo stesso :"D
|
||||
|
||||
Qui Babbo Natale è passato in anticipo, ed ha portato un pacco pieno di... integrati! Ma cosa conterrà la scatolina in cima? Ha 40 pin, ha fatto la storia dell'informatica ma viene prodotto tutt'ora! Molti di voi avranno intuito chi è... ma per gli altri, dovrete aspettare una settimana! 😛
|
||||
|
||||
|
||||
Bio:
|
||||
|
||||
Io sono Daniele Verducci, classe '86, professione sviluppatore Android. Conosco Java, Kotlin, linguaggi di alto livello. Per me C o GoLang sono linguaggi di basso livello. L'assembly è aramaico. Elettronicamente, so cos'è un Arduino e ho seguito il corso di elettronica di Andre LaMothe. Sono quasi completamente fuori dalla mia area di competenza, quindi abbiate pazienza se gli aggiornamenti del progetto non saranno frequenti o se rimarrò incagliato, per periodi più o meno lunghi, su qualche problema prima di capire come risolverlo. L'idea è proprio di imparare qualcosa di nuovo, e di farlo insieme!
|
||||
|
||||
Sono un appassionato dell'open source, per cui, anche se la macchina non sarà mai in grado di far girare Linux, gli schemi ed i sorgenti del sistema operativo scritto ad hoc saranno rilasciati tutti con licenza GPL v3.
|
||||
|
@ -1,175 +0,0 @@
|
||||
/* ************** EEPROM PROGRAMMER ******************
|
||||
|
||||
HARDWARE:
|
||||
|
||||
CORRISPONDENZA PIN EEPROM Atmel AT28C64B -> ARDUINO MEGA 2560
|
||||
(Compatibile con eeprom fino a 16 bit di address bus. In caso di altre eeprom collegare secondo datasheet)
|
||||
NB: Nel caso della eeprom da 8k, ci sono solo 12 address bus, quindi gli altri 4 pin provenienti dall'Arduino
|
||||
vengono lasciati disconnessi
|
||||
|
||||
Arduino VCC 11 38 40 44 10 42 12 9 8 7 6 5
|
||||
Eeprom 28 27 26 25 24 23 22 21 20 19 18 17 16 15
|
||||
____________________________________________________________________
|
||||
| |
|
||||
| |
|
||||
|_ |
|
||||
|_) Atmel AT28C64B |
|
||||
| |
|
||||
| |
|
||||
|____________________________________________________________________|
|
||||
|
||||
Eeprom 1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
||||
Arduino 46 36 34 32 30 28 26 24 22 2 3 4 GND
|
||||
|
||||
|
||||
|
||||
|
||||
CORRISPONDENZA FUNZIONALE:
|
||||
|
||||
Address bus (A0...A15): 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52
|
||||
|
||||
Data bus (D0...D7): 2, 3, 4, 5, 6, 7, 8, 9
|
||||
|
||||
Control bus:
|
||||
/OE 10
|
||||
/WE 11
|
||||
/CE 12
|
||||
|
||||
*/
|
||||
|
||||
const byte ROM_DATA[] = {0x76, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00};
|
||||
|
||||
|
||||
const byte ADDR_BUS[] = {52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22};
|
||||
const byte DATA_BUS[] = {9, 8, 7, 6, 5, 4, 3, 2};
|
||||
const byte CTRL_BUS_OE = 10;
|
||||
const byte CTRL_BUS_WE = 11;
|
||||
const byte CTRL_BUS_CE = 12;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(57600);
|
||||
for(int pin=0; pin < 16; pin++) {
|
||||
pinMode(ADDR_BUS[pin], OUTPUT);
|
||||
}
|
||||
setDataBusAs(INPUT);
|
||||
pinMode(CTRL_BUS_OE, OUTPUT);
|
||||
pinMode(CTRL_BUS_WE, OUTPUT);
|
||||
pinMode(CTRL_BUS_CE, OUTPUT);
|
||||
digitalWrite(CTRL_BUS_OE, HIGH); //Active low
|
||||
digitalWrite(CTRL_BUS_WE, HIGH); //Active low
|
||||
digitalWrite(CTRL_BUS_CE, HIGH); //Active low
|
||||
|
||||
delay(1000);
|
||||
|
||||
//readRom(8192);
|
||||
writeRom();
|
||||
verifyRom();
|
||||
}
|
||||
|
||||
void writeRom() {
|
||||
digitalWrite(CTRL_BUS_OE, HIGH);
|
||||
setDataBusAs(OUTPUT);
|
||||
Serial.print("Starting to write ROM... ");
|
||||
for (int i=0; i<sizeof(ROM_DATA); i++) {
|
||||
writeIntToAddressBus(i);
|
||||
delayMicroseconds(5); // Address hold time (tAH)
|
||||
digitalWrite(CTRL_BUS_CE, LOW);
|
||||
digitalWrite(CTRL_BUS_WE, LOW);
|
||||
writeByteToDataBus(ROM_DATA[i]);
|
||||
delayMicroseconds(5); // Data setup time (tDS)
|
||||
digitalWrite(CTRL_BUS_WE, HIGH);
|
||||
digitalWrite(CTRL_BUS_CE, HIGH); //Active low
|
||||
delayMicroseconds(5); // Data hold time (tDH)
|
||||
}
|
||||
setDataBusAs(INPUT);
|
||||
Serial.println("Done.");
|
||||
}
|
||||
|
||||
void verifyRom() {
|
||||
Serial.print("Starting to verify ROM... ");
|
||||
digitalWrite(CTRL_BUS_WE, HIGH); //Active low
|
||||
char output[50] = {};
|
||||
for (int i=0; i<sizeof(ROM_DATA); i++) {
|
||||
writeIntToAddressBus(i);
|
||||
delayMicroseconds(5);
|
||||
digitalWrite(CTRL_BUS_OE, LOW); //Active low
|
||||
digitalWrite(CTRL_BUS_CE, LOW); //Active low
|
||||
delayMicroseconds(5);
|
||||
byte readData = getData();
|
||||
if(readData != ROM_DATA[i]) {
|
||||
sprintf(output, "Error at addr %04x: expected %02x, found %02x", i, ROM_DATA[i], readData);
|
||||
Serial.println(output);
|
||||
}
|
||||
|
||||
while(true){}
|
||||
digitalWrite(CTRL_BUS_OE, HIGH); //Active low
|
||||
digitalWrite(CTRL_BUS_CE, HIGH); //Active low
|
||||
delayMicroseconds(5);
|
||||
}
|
||||
Serial.println("Done.");
|
||||
}
|
||||
|
||||
void readRom(int bytes) {
|
||||
digitalWrite(CTRL_BUS_WE, HIGH); //Active low
|
||||
char output[50] = {};
|
||||
for (int i=0; i<bytes; i++) {
|
||||
writeIntToAddressBus(i);
|
||||
delayMicroseconds(5);
|
||||
digitalWrite(CTRL_BUS_OE, LOW); //Active low
|
||||
digitalWrite(CTRL_BUS_CE, LOW); //Active low
|
||||
delayMicroseconds(5);
|
||||
byte readData = getData();
|
||||
sprintf(output, "0x%02x ", readData);
|
||||
Serial.print(output);
|
||||
digitalWrite(CTRL_BUS_OE, HIGH); //Active low
|
||||
digitalWrite(CTRL_BUS_CE, HIGH); //Active low
|
||||
delayMicroseconds(5);
|
||||
}
|
||||
Serial.println("Done.");
|
||||
}
|
||||
|
||||
unsigned int getData() {
|
||||
setDataBusAs(INPUT);
|
||||
unsigned int data = 0;
|
||||
for(int pin=0; pin < 8; pin++) {
|
||||
byte b = digitalRead(DATA_BUS[pin]) ? 1 : 0;
|
||||
data = (data << 1) + b; // Shifta di 1 e aggiunge il bit corrente. Serve per ricostruire il numero da binario
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
void setDataBusAs(byte mode){
|
||||
for(int pin=0; pin < 8; pin++) {
|
||||
pinMode(DATA_BUS[pin], mode);
|
||||
}
|
||||
}
|
||||
|
||||
void writeByteToDataBus(byte j) {
|
||||
setDataBusAs(OUTPUT);
|
||||
for (int n=0; n<8; n++)
|
||||
{
|
||||
if((0x01&j) < 0x01)
|
||||
{
|
||||
digitalWrite(DATA_BUS[n],LOW);
|
||||
} else {
|
||||
digitalWrite(DATA_BUS[n],HIGH);
|
||||
}
|
||||
j>>=1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void writeIntToAddressBus(int j) {
|
||||
for (int n=0; n<16; n++)
|
||||
{
|
||||
if((0x01&j) < 0x01)
|
||||
{
|
||||
digitalWrite(ADDR_BUS[n],LOW);
|
||||
} else {
|
||||
digitalWrite(ADDR_BUS[n],HIGH);
|
||||
}
|
||||
j>>=1;
|
||||
}
|
||||
}
|
||||
|
||||
void loop() {}
|
Loading…
x
Reference in New Issue
Block a user