Prüfen und in Betriebnahme des RAM Zugriffs

Dieser Abschnitt widmet sich der Anbindung, bzw. der Prüfung ob der Hauptspeicher richtig angesprochen werden kann. Eine Abhängigkeit ist, dass das GAL 22V10 richtig programmiert ist - bedeutet dass das im GAL 22V10 abgelegte Regelwerk richtig ist.
Dazu soll wieder in einer Endlosschleife verpackt folgende Schritte vollzogen werden.
Erwarte dass ein Benutzer am Laptop eine Taste drückt
schicke den Buchstaben den der Benutzer Dir vom Laptop geschickt hat gerade wieder zurück
Mach das ganze gerade nochmal
Der GAL 22V10 wird während diesen Vorgängen wiederkehrende Signale erzeugen, die u.a. das EEPROM selektieren und einen der beiden RAM Bausteine. Neben der Ausgabe an der seriellen Schnittstelle, werden auch diese Chip-Select Signale des GALs geprüft um zu verifizieren, dass zu bestimmten Zeiten (während des Programmablaufs) die richtigen Speicher-ICs (Speicherchips) angesprochen werden.

Stackpointer in Gang bringen

Bisherige Programme sind recht linear programmiert worden. Das bedeutet dass die abzuarbeitenden einzelnen Befehle nacheinander in den Speicher geschrieben worden sind. Die Programme nutzten zwar Sprungbefehle um zu bestimmten Stellen wieder hinzuspringen, jedoch ist ein solches Vorgehen als Spaghetti-Programmierung bekannt.
Ein Art des Programmaufbaus ist es wiederkehrende Anweisungen so aufzubereiten und abzulegen, dass diese zu verschiedenen Zeitpunkten, von verschiedenen Positionen parametrisiert und angesprungen werden können. Haben diese wiederkehrende Anweisungen ihre Arbeit getan, veranlassen diese den Mikroprozessor an der Stelle fortzufahren, bevor diese wiederkehrenden Anweisungen angesprungen worden sind.
Der Begriff der hier in der Softwareentwicklung genutzt wird, ist Funktionales und / oder strukturiertes Programmieren. In der strukturierten Programmierung wird eine Gesamtaufgabe soweit zerlegt (Arbeitsschritte) definiert, dass diese einzelne Arbeitsschritt als "Prozedur" angelegt werden kann. Erhält die Prozedur gar "Übergabeparameter" so kann dieser Arbeitsschritt in sich vom "tun" her etwas variiert werden. Es verhält sich in Abhängigkeit der Parametrisierung entsprechend anders. 
Geht man einen Schritt weiter und definiert für diese Prozedur eine Art "Ergebnis-Auffang"-Behälter (was letztenendes ein Speicherbereich ist), so wandelt sich die Prozedur zu einer Funktion. Ein exaktes equivalent zu den Funktionen aus der Mathematik.
Die Fähigkeit einer Prozedur/Funktion, den Prozessor zu veranlassen da fortzufahren bevor es die Prozedur/Funktion angesprungen hat, ist ein Ergebnis von vorbereitenden Maßnahmen des Prozessors selbst.
Die vorbereitenden Maßnahmen sind
Bereitlegen von Informationen in definierten Speicherstellen (Parametrisierung; entweder in internen Registern des Prozessors A,B,DE,HL etc.. oder in Speicherstellen im RAM Speicher → Parameterübergabe an Funktion
Abspeichern der Adresse des nächsten Befehls der nach dem "zurückkehren" aus der Funktion bearbeitet werden soll → Stackspeicher beschreiben (PUSH PC+x nach Adresse auf die der Stackpointer zeigt)
und letztenendes den Programmablaufpfad mit der Adresse des Speichers konfigurieren, an dem die Funktion/Prozedur definiert ist → Programmzähler setzen (CALL Kommando) –> das ist der Funktionsaufruf selbst.
Recht viel Blabla, jedoch essentiell um "wiederverwertbaren" Programm Code sinnvoll im Speicher anzulegen. Das alles machen eigentlich nur zwei Anweisungen. Diese sind
Lade die Adresse im RAM Speicher, ab der der Bereich fort an als Stack Speicher bezeichnet wird, in die Speicherstelle, mittels der dieser Stackspeicher gefunden werden kann. LD HL,$3FFF als beispiel.
Setze den Stackpointer: LD SP,HL
das war es.
Getestet kann das ganze, in dem der bisherige Spagetti Code auseinandergeplückt wird. Als Bespiel hier das senden eines Zeichens über die serielle Schnittstelle:

; ser_TXbyte - transmits one byte via ASIC1;
;Uses A, B; Reg B: = input value to be transmitted; 
Retval: = none
ser_TXbyte:
 IN0 A, (STAT1)
 AND A, $ 02
 CP A, $ 02
 JP NZ, ser_TXbyte
 LD A , B
 OUT0 (TDS1), A
 RET 
   

Testergebnis zum Test des Stackpointers:

 
Auf diesem Bild sieht man zwischen dem roten und dem gelben Signal an bestimmten Stellen einen Pfeil eingezeichnet. Hier wird hervorgehoben dass an dieser Stelle das rote Signal den RAM Chip aktiviert, um eine Adresse in den Stackspeicher zu schreiben. Die anderen gelben Stellen, an denen 0 Volt gezeigt werden (Line nten) ist das Signal für das EEPROM (da wo die Programmanweisungen letztenendes - in diesem Fall hier - gespeichert sind. Das violette Signal welches da so halb im Kommen ist, ist der Buchstabe von der Tastatur der vom CAPRI Z180 zurück zum Laptop geschickt wird. Man sieht hier auch wieviel im Hintergrund abgeht, bevor etwas auf der "Anwendungsebene" passiert. Wobei wir hier das violette Signal nur kurzfristig als Anwendungsebene verstehen sollten. Später, wird dieses violette Signal ebenso nur eine "Ebene" der Programmtiefe sein. Ziemlich abstrakt das ganze hier.
Der erste Pfeil zeigt den "Sprung" in die Funktion "warte auf ein Zeichen vom Laptop" und der zweite Pfeil ist die Anweisung merke Dir wo Du weitermachen willst, bevor Du das "empfangene" Zeichen wieder an das Laptop zurück schickst.
Das rote Signal zeigt vier mal solche Pulse - dem entspricht die Anzahl der CALL Anweisungen im Programm links gezeigt. (Wobei der erste CALL etwas macht, was es nur einmal zu tun gilt - dient aber der Messungen am Oszilloskop und der testerei hier des CAPRI Z180 CPU Module.)