summaryrefslogtreecommitdiffstats
path: root/doc/report/z80uPC_nostyle.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/report/z80uPC_nostyle.tex')
-rw-r--r--doc/report/z80uPC_nostyle.tex460
1 files changed, 460 insertions, 0 deletions
diff --git a/doc/report/z80uPC_nostyle.tex b/doc/report/z80uPC_nostyle.tex
new file mode 100644
index 0000000..569e665
--- /dev/null
+++ b/doc/report/z80uPC_nostyle.tex
@@ -0,0 +1,460 @@
+\documentclass[a4paper, 11pt]{article}
+
+% draftwatermark
+\usepackage{draftwatermark}
+\SetWatermarkText{\tt DRAFT}
+\SetWatermarkLightness{.8}
+\SetWatermarkScale{10}
+
+% urls
+\usepackage{url}
+
+% figures
+\usepackage{array}
+\usepackage{float}
+\usepackage{wrapfig}
+
+% tables
+\usepackage{booktabs}
+\usepackage{tabu}
+
+% margins
+\usepackage{graphicx}
+
+% source code
+\usepackage{xcolor}
+\usepackage{listings}
+\lstdefinestyle{customc}{
+ belowcaptionskip=1\baselineskip,
+ breaklines=true,
+ frame=L,
+ xleftmargin=\parindent,
+ language=C,
+ showstringspaces=false,
+ basicstyle=\footnotesize\ttfamily,
+ keywordstyle=\bfseries\color{green!40!black},
+ commentstyle=\color{purple!40!black},
+ identifierstyle=\color{blue},
+ stringstyle=\color{orange},
+}
+
+\lstdefinestyle{customasm}{
+ belowcaptionskip=1\baselineskip,
+ frame=L,
+ numbers=left,
+ numberstyle=\ttfamily,
+ xleftmargin=\parindent,
+ language=[x86masm]Assembler,
+ basicstyle=\footnotesize\ttfamily,
+ commentstyle=\color{gray},
+}
+
+% language (set correct hypenation)
+\usepackage[italian]{babel}
+\usepackage{textgreek}
+
+% to fix macros
+\usepackage{xspace}
+% commands
+% macro for project name
+\newcommand{\prj}{Z80\textmu PC\xspace}
+
+% invert signal (not, active low)
+\newcommand{\inv}[1]{\(\overline{\mbox{#1}}\)}
+
+% metadata
+\title{\prj Single Board \\ Computer Development }
+\author{Naoki Pross}
+
+% document
+\begin{document}
+
+\maketitle
+\begin{abstract}
+
+ Lo Zilog Z80 \`e un processore a 8 bit che fu introdotto nel 1976 ed ebbe
+ un grandissimo successo nel mondo dell'elettronica e dell'informatica
+ dagli anni 70 a 90. In memoria di questo pioniere dell'industria dei
+ sistemi informatici questo progetto documenta la realizzazione di un
+ microcomputer a scopo generico a base di esso. L'obiettivo primario
+ dunque \`e di realizzare una scheda simile ad una motherboard dei
+ computers venduti all'epoca completa di RAM, ROMs, interfacce seriali e
+ altri circuiti di supporto. Successivamente per l'aspetto software il
+ progetto deve implementare i drivers per ogni circuito presente sulla
+ scheda in modo da semplificare la programmazione. L'obiettivo opzionale
+ del progetto, una volta terminata la costruzione hardware, \`e di
+ realizzare una kernel monolitica che offre funzioni minimali simili ad un
+ sistema UNIX, quali processi, filesystem, memory management e drivers.
+
+\end{abstract}
+
+\break
+\tableofcontents
+\break
+
+%-----------------------------------------------------------------------------
+\section{Hardware}
+
+\subsection{Specifiche tecniche dello Z80}
+Lo Z80 \`e un processore molto minimalistico se paragonato a ci\`o che si
+trova oggi sul mercato dei microcontrollori. Per il progetto \prj la CPU in
+uso \`e il modello originale Zilog Z8400 che non dispone di moduli aggiuntivi
+integrati come i modelli SoC odierni. La scelta di una CPU tanto semplice \`e
+la conseguenza del design didattico del progetto, inoltre senza alcun
+dispositivo interno lo Z8400 si presenta con un address space completamente
+vuoto, ad eccezzione del punto d'inizio e i vettori di reset.
+
+Lo Z80 utilizza I/O paralleli sia per la lina a 16 degli indizzi che per la
+linea dati a 8 bit e dispone di 6 registri 8 bit ad utilizzo generico
+combinabili in coppie per ottenere un valore a 16 bit. Per il controllo dei
+dispositivi esterni, come lettura e scrittura esso possiede delle linee di
+controllo dedicate come {\tt\inv{RD}}, {\tt\inv{WR}}, {\tt\inv{MREQ}}, ecc. In
+quanto instruction set, lo Z80 ha 158 istruzioni possibili di cui 78 sono un
+sottoinsieme dello 8080A, architettate per poter mantere una
+retrocompatiblit\`a.
+
+\begin{table}[ht]\centering
+\caption{Riassunto delle specifiche}
+
+\begin{tabular}{ l l }
+ \toprule
+ Dimensione Indirizzi & 16 bit \\
+ Dimensione Dati (word) & 8 bit \\
+ Spazio Indirizzabile & 64 KB \\
+ Registri Generici 8 bit & 6 ({\tt A..F}) \\
+ Registri 16 bit & 2 ({\tt SP, PC}) \\
+ Clock speed & 8 MHz, 6MHz, 4MHz, 2.5MHz \\
+ \bottomrule
+\end{tabular}
+\end{table}
+
+\subsection{Componenti e modello di design}
+Il minimo necessario per far funzionare uno Z80 sono una {\tt RAM} ed una
+{\tt ROM}, ma avendo a disposizione altri dispositivi I/O lo \prj dispone
+anche di una porta seriale, di una porta parallela e di un counter timer;
+Hardware che si presenta normalmente all'interno di microcontrollori odierni.
+
+\begin{table}[h!]\centering
+\caption{Lista dei componenti}
+\begin{tabular}{ >{\tt}p{.1\textwidth} >{\tt\bfseries}p{.2\textwidth} >{\footnotesize}p{.6\textwidth} }
+ \toprule
+ ROM & M28C64 & EEPROM da 8KB x 8 bit (64K) per il BIOS / Bootloader /
+ OS installata doppia per avere 16KB \\
+ RAM & HM62256B & SRAM da 32KB x 8bit (256K) \\
+ CTC & Z8430 & Counter timer circuit ufficiale di Zilog a 4 canali
+ programmabili \\
+ PIO & Z8420 & Parallel input/output controller di Zilog per avere un
+ intefaccia digitale con due porte da 8 bit \\
+ MMU & M4-32/32-15JC & CPLD programmabile che implementa una memory
+ management unit semplificata in grado di gestire i
+ 5 bit pi\`u significativi della linea di indirizzi \\
+ USART & TL16C550C & Interfaccia USART per poter comunicare utilizzando il
+ protocollo RS232 \\
+ \bottomrule
+\end{tabular}
+\end{table}
+
+Il design dello \prj \`e costruito sulla falsa riga di un Arduino o di un
+EasyPIC con l'aggiunta di funzionalit\`a a scopo didattico quali; la
+possiblit\`a di cambiare la velocit\`a di clock tra 4MHz, 200Hz o manuale
+(mediante un bottone sulla scheda) e una serie di display a 7 segmenti per
+vedere in tempo reale i valori sui bus degli indirizzi e dei dati.
+\begin{center}
+\begin{tabular}{ >{\bfseries}r p{.8\textwidth} }
+ 0Hz & Il clock manuale \`e un bottone che permette di creare
+ le pulsazioni, per poter analizzare ogni istruzione \\
+ 200Hz & Mediante un classico circuito con un LM555 si ha un clock
+ per eseguire i programmi a velocit\`a rallentata \\
+ 4MHz & Clock per esecuzione a velocit\`a piena (normale)
+\end{tabular}
+\end{center}
+
+\subsection{Schema a blocchi}
+\begin{figure}[H]
+ \centering
+ \includegraphics[width=\textwidth]{res/block_diagram}
+ \caption{Schema a blocchi del \prj}
+\end{figure}
+
+% TODO
+\subsubsection{Implementazione dei generatori di clocks}
+
+\subsubsection{Uscite verso l'esterno (DIN 41612)}
+Per poter estendere lo \prj a lato \`e presente un connettore {\tt DIN 41612}
+per poter interfacciare schede di estensione della funzionali\`a siccome il
+progetto lascia liberi la maggior parte dei 16KB dell'\emph{i/o space}, ovvero
+la parte di address space in cui \`e previsto di mappare dispositivi esterni.
+\begin{table}[H]
+\caption{Mappatura dei segnali nel connettore DIN 41612}
+\vspace{5pt}
+\resizebox{\textwidth}{!}{\begin{tabu}{l l l l l l l l l l l l l l l l}
+ \toprule
+ 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 \\
+ \midrule
+ \rowfont{\tt}
+ GND & GND & VCC & VCC & D0 & D1 & D2 & D3 & D4 & D5 & D6 & D7 & A0 & GND & A2 & A1 \\
+ \\
+ \toprule
+ 17 & 18 & 19 & 20 & 21 & 22 & 23 & 24 & 25 & 26 & 27 & 28 & 29 & 30 & 31 & 32 \\
+ \midrule
+ \rowfont{\tt}
+ A4 & A3 & A6 & A5 & A8 & A7 & A10 & A9 & 12 & A11 & A14 & A13 & & A15 & & \\
+ \\
+ \toprule
+ 33 & 34 & 35 & 36 & 37 & 38 & 39 & 40 & 41 & 42 & 43 & 44 & 45 & 46 & 47 & 48 \\
+ \midrule
+ \rowfont{\tt}
+ \inv{RD} & & & \inv{WR} & & GND & & \inv{M1} & & GND & \inv{INT} & \inv{RST} & \inv{MREQ} & \inv{NMI} & \inv{HALT} & \inv{IORQ}\\
+ \\
+ \toprule
+ 49 & 50 & 51 & 52 & 53 & 54 & 55 & 56 & 57 & 58 & 59 & 60 & 61 & 62 & 63 & 64 \\
+ \midrule
+ \rowfont{\tt}
+ \inv{RFSH} & \inv{WAIT} & GND & & \inv{BUSREQ} & & \inv{BUSACK} & & CLK & & & & VCC & VCC & GND & GND\\
+\end{tabu}}
+\end{table}
+
+% TODO
+\subsection{Address space}
+L'address space dello z80 \`e in grado di indirizzare 64 KB; la met\`a di
+questi \`e assegnata alla RAM e un quarto \`e della ROM. La ROM \`e minore
+della RAM perch\'e \`e intesa per essere un bootloader piuttosto che un vero e
+proprio OS.
+% TODO: redraw with xfig
+\begin{figure}[H]
+\centering
+\includegraphics[height=8cm]{res/addrspace}
+\end{figure}
+
+\subsection{Memory management unit}
+Alcuni modelli sucessori dello Z8400 implementavano ina MMU (Memory Management
+Unit) SoC che permetteva di ampliare la dimensione dell'address space,
+permettendo quindi di mappare pi\`u memorie o dispositivi separati negli stessi
+indirizzi. Lo \prj per\`o cerca di imitare un architettura pi\`u simile ad un
+computer X86 in cui la MMU viene utilizzata per la gestione delle \emph{pagine}
+di memoria. Il concetto di pagine (pages in inglese) \`e necessario per sistemi
+con un supporto per il multitasking. La conseguenza di questo design implica
+per\`o che sia introdotto anche il concetto di \emph{virtual address space}
+siccome, potendo reindirizzare a piacimento gli indirizzi, diventa possibile e
+conveniente offrire ai programmi eseguiti la stessa struttura di memoria
+indipendentemente dalla loro vera locazione in memoria.
+
+La struttura designata per il progetto \`e la seguente. \`E resa possibile
+solamente l'esecuzione di 2 programmi semi-paralleli, perch\`e
+l'implementazione di uno scheduler \`e troppo complessa con il CTC a
+disposizione. Si pu\`o quindi avviare due programmi ma solamente uno \`e in
+esecuzione ed utilizza il 100\% del tempo della CPU. Purtroppo le limitazioni
+di questo design non permettono di offrire funzionalit\`a importanti della
+kernel, ma in un futuro si potrebbe risolvere il problema estendendo la
+piattaforma. Infatti grandi spazi dell'iospace sono stati lasciati liberi per
+l'aggiunta di dispositivi esterni.
+
+\begin{figure}[h!]
+ \centering
+ \includegraphics[height=5cm]{res/mmu_ram_map}
+\end{figure}
+
+I due programmi in `esecuzione' sono salvati nella RAM alle locazioni {\tt
+0xB000} e {\tt 0xD0000} con 8 KB di RAM per uno. Per passare da un programma
+all'altro la kernel offre delle system calls che modificano la \emph{page
+table} all'interno della MMU in maniera da mappare l'indirizzo {\tt B000} o
+{\tt D000} a {\tt 0000}.
+
+\begin{figure}[h!]
+\centering
+\begin{minipage}[c]{.45\textwidth} \centering
+ \includegraphics[width=\linewidth]{res/mmu_addr}
+\end{minipage}%
+\begin{minipage}[c]{.45\textwidth} \centering
+\begin{verbatim}
+ Example program running
+ at address 0xB000
+
+ Virtual address
+ LD (#0x1200), #0xFE
+
+ Real Instruction
+ LD (#0xC200), #0xFE
+\end{verbatim}
+\end{minipage}
+\end{figure}
+
+Naturalmente ci\`o significa che il programma non ha l'accesso all'iospace,
+perci\`o per le operazioni con i dispositivi \`e necessario implementare un
+driver nella kernel. Nel caso in cui si volesse creare dei drivers userspace la
+kernel dovr\`a mettere a disposizione delle system calls che permettano di
+modificare la page table in maniera indiretta.
+
+\break
+%-----------------------------------------------------------------------------
+\section{Software}
+\subsection{Organizzazione del codice sorgente C}
+Il codice sorgente dell'intero progetto \`e contenuto nella cartella {\tt
+sw/z80}.
+\begin{itemize}
+ \item {\tt arch} -- Contiene headers e codice essenziale che descrive la
+ configurazione del dispositivo (es: gli indirizzi dei dispositivi).
+ \item {\tt drivers} -- Contiene il codice per i drivers dei vari
+ dispositivi, il tutto viene compilato in una libreria statica.
+ \item {\tt kernel} -- Contiene il codice della kernel monolitica del progetto.
+ \item {\tt libc} -- Contiene delle implementazioni parziali di alcune
+ funzioni della standard library. Non pi\`u utilizzata.
+ \item {\tt tests} -- Contiene delle test units per controllare
+ individualmente parti del progetto.
+\end{itemize}
+
+\subsection{C Toolchain}
+Per compilare il codice per lo \prj \`e necessario utilizzare un \emph{cross
+compiler} che sia in grado di compilare per l'architettura dello z80. Per
+questo progetto si \`e scelto di utilizzare SDCC (Small Device C Compiler),
+siccome \`e un progetto ancora in sviluppo attivo ed \`e utilizzato anche per
+compilare in molte altre piattaforme. Per compilare un codice sorgente in un
+object con SDCC per lo Z80 si utilizza il seguente comando:
+\begin{verbatim}
+$ sdcc -mz80 -pedantic --no-std-crt0 <crt0> \
+ --allow-unsafe-read \
+ -I. -c <source_file> -o <object_file>
+\end{verbatim}
+In cui {\tt <source\_file>} \`e il documento con il codice sorgente e {\tt
+<object\_file>} \`e il nome dell'object (solitamente lo stesso del sorgente con
+l'estensione {\tt .o}). La flag {\tt --allow-unsafe-read} \`e permessa
+solamente nella compilazione per Z80 e serve ad indicare al compiler che le
+letture da locazioni arbitrarie di memoria sono ammesse (normalmente non lo
+sono). Per linkare gli objects e generare un eseguibile si utilizza
+\begin{verbatim}
+$ sdcc -mz80 --no-std-crt0 <crt0> \
+ --code-loc=<addr> <objects> -o <hexfile>
+
+$ makebin -s <rom_size> -yo 1 -ya 1 <hexfile> <binary>
+\end{verbatim}
+Le flags {\tt -yo 1 -ya 1} specificano rispettivamente il numero di banchi di
+ROM e di RAM.
+
+\subsection{CRT0 per lo Z80}
+In C il CRT0 \`e un insieme di routines che vengono eseguite prima del codice C
+che servono ad inizializzare il sistema. Nel caso dello \prj \`e utilizzato per
+inizializzare lo stack pointer e per indicare al linker come organizzare i
+settori dell'eseguibile. Un esempio di crt0 utilizzato per il progetto:
+
+\lstset{escapechar=@,style=customasm}
+\begin{lstlisting}
+ .module crt0
+ .area _HEADER (ABS)
+
+;; Reset vectors
+ .org 0
+ jp init
+
+ ; the instruction 0xff (not written)
+ ; resets to this location
+ .org 0x38
+ jp init
+
+;; main code
+ .org 0x100
+ .globl _main
+
+init:
+ ;; Set stack pointer directly above top of memory.
+ ld sp,#0xffff
+
+ ;; Start of the program
+ call _main
+ jp _exit
+
+_exit:
+ halt
+ jp _exit
+
+;; Ordering of segments for the linker.
+ .area _HOME
+ .area _CODE
+ .area _INITIALIZER
+ .area _GSINIT
+ .area _GSFINAL
+
+ .area _DATA
+ .area _INITIALIZED
+ .area _BSEG
+ .area _BSS
+ .area _HEAP
+\end{lstlisting}
+
+Il CRT0 essendo scritto in assembly deve essere compilato prima utilizzando un
+assembler per lo Z80, per esempio quello fornito in SDCC.\@
+\begin{verbatim}
+$ sdasz80 -o <crt0.s>
+\end{verbatim}
+
+Quindi l'argomento {\tt --no-std-crt0 <crt0>} per il compiler descritto
+precedente non \`e assolutamente necessario ma \`e consigliato siccome permette
+di avere un controllo maggiore del contenuto dell'eseguibile.
+
+\subsection{Codice sorgente VHDL}
+Il codice sorgente in VHDL per la CPLD utilizzata come address decoder e MMU,
+\`e contenuto nella cartella {\tt sw/cpld}. La toolchain utilizzata \`e quella
+offerta da Lattice.
+
+% TODO
+\subsubsection{Programmazione della MMU}
+
+
+\break
+%-----------------------------------------------------------------------------
+\section*{Glossario Tecnico}
+{\def\arraystretch{1.4}
+\begin{tabular}{ >{\bfseries}p{.35\linewidth} p{.65\linewidth} }
+
+ Address Space & In informatica l'\emph{address space} \`e un intervallo di
+ indirizzi che possono corrispondere a indirizzi in rete, regioni di un
+ dispositivo, di una memoria o di un qualsiasi altro dispositivo fisico o
+ logico. Per questo progetto \emph{address space} si riferisce
+ all'intervallo indirizzabile dal processore, ovvero \(2^{16}\) locazioni
+ siccome il sistema dispone di un bus a 16 bit. \\
+
+ Virtual Address Space & Il virtual address space \`e un livello di
+ astrazione che estende l'address space utilizzato nelle architetture
+ moderne (X86 / 64). In un sistema senza VAS, i programmi caricati in
+ memoria `vedono' l'indirizzo in cui si trovano e devono perci\`o essere
+ caricati in una regione di memoria continua. In un sistema con VAS invece
+ al programma figura sempre di avere l'intero address space disponibile per
+ se, e la MMU si occupa di traslare gli indirizzi virtuali in indirizzi
+ reali prima che essi raggiungano l'hardware. \\
+
+ Registro & Un registro \`e un dispositivo di memoria in cui \`e possibile
+ pu\`o leggere e/o scrivere un certo valore. Normalmente in un computer /
+ microcontrollore la dimensione della memoria \`e data dall'architettura,
+ dunque 8, 16, 32 o 64 bits. In questo documento viene viene comunemente
+ utilizzato per riferirsi ad una memoria di un dispositivo fisico come la
+ CPU o un IC seriale. \\
+
+ Toolchain & Da Wikipedia \cite{wiki:toolchain}: In ambito software, una
+ toolchain è l'insieme dei programmi (tools) usati nello sviluppo di un
+ prodotto (tipicamente un altro programma o sistema di programmi). I tool
+ possono essere utilizzati in catena, in modo tale che l'output di ciascun
+ tool rappresenti l'input per il successivo, ma il termine è utilizzato in
+ maniera più estesa per riferirsi, più in generale, a qualunque insieme di
+ tool di sviluppo collegati tra loro. \\
+
+ Stack Pointer,\newline Program Counter & Lo Stack Pointer \`e un registro a
+ 16 bit in cui \`e salvato l'indirizzo della fine (pi\`u in alto, ultimo
+ inserito) dello stack. Il program counter, un altro registro a 16 bit
+ contiene l'indirizzo da cui leggere della prossima istruzione da
+ eseguire.\\
+
+\end{tabular}}
+
+\begin{thebibliography}{2}
+\bibitem{wiki:toolchain}
+ \url{https://it.wikipedia.org/wiki/Toolchain}
+
+\bibitem{z80book}
+ \textbf{Paolo Di Leo},
+ Z80 Microcomputer didattico,
+ Gennaio 2016,
+ Libri SANDIT,
+ {\tt ISBN 978-88-6928-142-6}
+
+\end{thebibliography}
+
+\end{document}