\documentclass[final, ms, a4paper, 11pt]{memoir}

\usepackage[a4paper, inner=3cm, outer=3cm, marginpar=0pt]{geometry}
\usepackage[explicit]{titlesec}
\usepackage{csvsimple}
\usepackage{wrapfig}
\usepackage{graphicx}
\usepackage{xcolor} %

% set line height
\renewcommand{\baselinestretch}{1}
% font hyphenation
\usepackage{everysel}
\EverySelectfont{%
\fontdimen2\font=0.6em % interword space
\fontdimen3\font=0.2em % interword stretch
\fontdimen4\font=0.1em % interword shrink
\fontdimen7\font=0.9em % extra space
\hyphenchar\font=`\-% to allow hyphenation
}


% set section style
% \newcommand{\secstyle}[2]{[ #2 ] \textcolor{red!50!black}{\MakeUppercase{#1}}}
% \renewcommand*\thesection{\arabic{section}} % hide chapter

\newcommand\ddate{01.01.1970}
\titleformat{\section}
  {\normalfont}{- \ddate{}:}{1em}
  {\textcolor{red!50!black}{\MakeUppercase{#1}} -}
% monochrome
% \titleformat{\section}
%   {\normalfont}{\thesection}{1em}{\MakeUppercase{#1}}

\begin{document}
\noindent {\Large Z80 Single Board Computer: Note e Diario di Lavoro} \\\\
\noindent SAM Bellinzona 2016/2017 \\
\noindent REF: Daniele Kamm \\
\noindent PIF: Naoki Pross \\
\vspace{5mm}

\renewcommand\ddate{30.01.2017}
\section{Perch\`e uno Z80?}
Originariamente questo progetto era un esperimento per costruire una
cartridge per il GameBoy Classic (DMZ-01) che conteneva dell'hardware
aggiuntivo che avrebbe potuto interfacciare dell'hardware esterno con la CPU
del GameBoy. Successivamente per\`o il progetto si \`e rivelato pi\`u
complicato del previsto a causa della complessa struttura del GB (GameBoy) e
la difficolt\`a per ritrovare l'hardware stesso. Quindi sotto consiglio del
docente ho cambiato il progetto in un Single Board Computer dato che sono
interessato in informatica di basso livello e la CPU del GB era basata sul
processore Z80 con un instruction set e assembly simile.

\renewcommand\ddate{09.02.2017}
\section{Hardware}
Dopo una ricerca abbastanza intensiva dal magazzino della scuola abbiamo trovato
i seguenti componenti principali del che utilizzer\`o per costruire il computer.
\begin{table}[h!] \centering
\begin{tabular}{ l l l l }
    Z8400AB1 (Z80ACPU) & Zilog   & x1 & CPU \\
    Z8420AB1 (Z80APIO) & Zilog   & x1 & Port Interface \\
    Z8430AB1 (Z80ACTC) & Zilog   & x1 & Timer Clock \\
    M28C64             & ST      & x2 & EEPROM \\
    HM62256B           & HITACHI & x1 & SRAM \\
    TL16C550C          & TI      & x1 & Seriale (UART / RS232) \\
\end{tabular}
\end{table}

Tutti gli altri componenti secondati come porte logiche e circuiti combinatori
integrati saranno indicati in una lista finale nella documentazione riassuntiva.

\renewcommand\ddate{13.02.2017}
\section{Address space}
\begin{wrapfigure}{R}{.35\linewidth} \centering
    \includegraphics[width=.9\linewidth]{res/addrspace.pdf}
\end{wrapfigure}
Come prima cosa dopo aver deciso il processore (Z80) \`e necessario definire
l'address space per decidere come collegare l'hardware. Si vede chiaramente che
la RAM usa la maggior parte dell'address space mentre la rom \`e solamente di
16KB, ma questo non \`e un problema perch\`e ho intenzione di aggiungere delle
interfacce esterne per poter collegare dispositivi di memoria come per esempio
le uSD. Dunque questa EEPROM vicina al processore sar\`a utilizzata unicamente
per il bootloader e per un sistema operativo molto basilare.

% \renewcommand\ddate{23.02.2017}
% \section{Banchi di memoria e paging della RAM}

\renewcommand\ddate{06.03.2017}
\section{Schede normate e clock secondari}
In seguito ad una discussione ho deciso di implementare il circuito su un PCB di
dimensioni standard, come per esempio l'Eurocard (IEEE 1101.10) in maniera da
poter montare tutte le schede su un rack. Cos\`i facendo si avrebbe dei
connettori standard sul retro che si potrebbero utilizzare per le periferiche
esterne. Alternativamente si potrebbe utilizzare una struttura simile al PC/104
permettendo di interfacciare delle periferiche specifiche per computer ancora
diponibili sul mercato. Il connettore standard per PC/104 \`e un header 32x2,
quindi con 64 pin mappato come indicato sotto, con un opzionale estensione che
pu\`o aumentare il connettore a 146
pins\footnote{http://pinouts.ru/Slots/Pc104\_pinout.shtml}.

\begin{tabular}
\csvautotabular{res/pc104conn.csv}
\end{tabular}

\renewcommand\ddate{07.03.2017}
\section{Tastiera Misteriosa}
Nello stesso luogo in cui avevo trovato lo Z80 stesso ho trovato anche una
tastiera con un connettore mai visto. Il connettore era composto da 19 pin, di
cui 16 erano collegati all'interno della tastiera. Inizialmente pensavo che la
tastiera contenesse gi\`a un driver che generava degli interrupt, come una
qualsiasi tastiera moderna, con l'unica differenza che il bus di comunicazione
era parallelo. Ma dopo una ricerca rapida senza risultati ho deciso di aprire la
tastiera per analizzare il layout. Inaspettatamente ho scoperto che l'intero PCB
non \`e altro che una griglia 9x9 con i 18 fili che portano al connettore.
Questo hardware probabilmente era per un C64 Commodore 64 che aveva il resto
della logica programmata nella ROM o sulla scheda madre.

Per utilizzare l'hardware in questo stato \`e dunque necessario attivare i
primi 9 bit del connettore e successivamente leggere i seguenti 9 mascherando il
tasto interessato. Qui sotto ho preso un esempio che ho trovato online per
dimostrare il concetto in assembly.

\begin{centering}\begin{verbatim}
; This program waits until the key "S" was pushed.
; Start with SYS 49152

*=$c000                  ; startaddress 

PRA  =  $dc00            ; CIA#1 (Port Register A)
DDRA =  $dc02            ; CIA#1 (Data Direction Register A)

PRB  =  $dc01            ; CIA#1 (Port Register B)
DDRB =  $dc03            ; CIA#1 (Data Direction Register B)


start    sei             ; interrupts deactivated

         lda #%11111111  ; CIA#1 port A = outputs 
         sta DDRA             

         lda #%00000000  ; CIA#1 port B = inputs
         sta DDRB             

         lda #%11111101  ; testing column 1 (COL1) of the matrix
         sta PRA
            
loop     lda PRB
         and #%00100000  ; masking row 5 (ROW5) 
         bne loop        ; wait until key "S" 

         cli             ; interrupts activated

ende     rts             ; back to BASIC
\end{verbatim}\end{centering}

\renewcommand\ddate{16.03.2017}
\section{Visualizzare e i dati}
Avendo messo un ``clock-stepper'' probabilmente \`e utile poter anche
visualizzare i valori esadecimali sul bus di dati e di indirizzi, dunque ho
pensato di aggiungere dei display a 7 segmenti collegati alle 8 e 16 linee dei
due bus, 

\end{document}
