ndr-nkc.de ndr-nbc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
NKC Emulator
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
8088 Section
Baugruppen
Downloads
 
Bussysteme
Stromversorgung
Input / Output
Grafikkarten
Speicherkarten
Massenspeicher
Weitere Baugruppen
 
Projekte
 
Dokumentation
Datenblätter
Glossar
Portraits
Links

Impressum

 

Grundprogramm 3.0

Entwicklungsgrund

Das Grundprogramm für den Z80 Prozessor ist für den Anfang recht angenehm und für Einsteiger gut geeignet. Recht schnell stören aber einige Dinge, wie zum Beispiel die umständliche Navigation im Menü. Man kann sich leicht vorstellen, dass mit dem NKC mehr erreicht werden kann.

Der Hauptgrund für den Beginn der Entwicklung war also der Wunsch nach einem einseitigen Menü, das einfacher zu bedienen sein sollte. Inzwischen ist das Grundprogramm gut 30 Jahre alt, da wurde es Zeit, mal wieder etwas zu machen.

Features

  • Einseitenmenü mit Eintastenbedienung
  • Keine zeitraubende Einschaltmeldung
  • Bildschirmpositionen und Schriftgrößen vereinheitlicht
  • Bedienung wahlweise in deutsch oder englisch
  • Verbesserter Hexdump mit Checksumme
  • Verbesserte zweispaltige Symbolanzeige
  • Darstellungsfehler bei UMRANDE beseitigt
  • Codeoptiomierungen in Umfang und Geschwindigkeit
  • Rücksprungmöglichkeit zu FLOMON
  • Vergrößerte Ausgabe- und Eingabebuffer
  • Wahlweise Unterstützung CAS oder IOE mit VDIP1
  • AutoFlip Modus abschaltbar
  • Hinweis

    Das neue Grundprogramm funktioniert zusammen mit dem BASIC ROM und dem GOSI ROM aber leider nicht mit EZASS, weil in diesem ROM verschiedene Adressen des originalen Grundprogramms 2.0 direkt angesprungen werden. Dies betrifft insbesondere die Symbolverwaltung und einige andere Routinen, für die keine Vektoren im Startbereich des GP vorgesehen sind.

    Update

    Inzwischen existiert eine neue erweiterte Version des Grundprogramms, welches auch mit dem EZASS ROM eingesetzt werden kann. Die neue Version kann unter folgendem Link abgerufen werden.
  • Z80 Grundprogramm Version 3.1
  • Download

    Quelltext Grundprogramm mit USB Unterstützung
    Der Quelltext ist zur direkten Verwendung mit dem tabellengesteuerten Crossassembler TASM formatiert.
    Die Include-Datei dient zum einfachen Einbinden von eigenem Testcode.
    Download SOURCE
    Binärdateien Das Archiv enthält 4 Versionen des ROM's
    - Basisadresse 2000h in deutsch und englisch (zur Verwendung in Verbindung mit FLOMON)
    - Basisadresse 0000h in deutsch und englisch (zur Verwendung auf ROA64)
    Download ROMS
    TASM Das Archiv enthält den Table Driven Assembler
    Betrieb des Assemblers erfolgt unter DOS oder in einer Eingabeaufforderung. Im Archiv ist eine Anleitung vorhanden.
    Zum Übersetzen von Quellcodes werden am besten entsprechende Batch-Dateien angelegt.
    Download TASM


    Einsatz des Grundprogramms

    Das GP kann in verschiedenen Szenarien mit dem NDR Z80 Computer eingesetzt werden.
    Entsprechend des geplanten Einsatzzweckes muss das GP neu übersetzt werden.
  • auf der Baugruppe BANKBOOT ab Adresse 0000h ohne EFLOMON
  • auf der Baugruppe BANKBOOT ab Adresse 2000h zusammen mit EFLOMON
         dazu wählt man im FLOMON Menü den Punkt 3 "Go Bank 2000h"
  • auf einer ROA64 ab Adresse 0000h ohne BANKBOOT
         beim Z80 müssen auf der ROA alle Adressjumper geöffnet sein
  • Analyse des Quelltextes

    Schon bei der Beschäftigung mit der Hauptroutine ab dem Label START fiel auf, dass das GP durchgehend nicht optimal codiert ist. Haptsächlich liegt das daran, dass zur Erstellung ein Makroassembler genutzt wurde, der immer nach dem gleichen Schema arbeitet.

    Bei einigen Konstrukten werden recht eigensinnige und sehr umständliche Codierungen mit Manipulation des Stackpointers verwendet. Die umfangreichen Möglichkeiten des Z80 wurden bei Weitem nicht ausgenutzt.

    Anfangsprobleme

    Das GP füllt das EPROM vollständig bis zur Adresse 1FFE aus. An eine Erweiterung ohne gleichzeitige Einsparungen an anderen Stellen war also nicht zu denken. Es sollten aber auch keine essentiellen Funktionen entfernt werden, da die Kompatibilität weitestgehend erhalten bleiben sollte. Es musste also Speicherplatz eingespart werden, ohne die Funktion zu beeinflussen.

    Um überhaupt erst mal ein wenig Platz für weitere Entwicklungen zu bekommen, bagann ich mit leichten Optimierungen des Quellcodes bevor die Algorithmen näher betrachtet wurden.
  • Umwandeln der absoluten Sprungbefehle in relative Sprungbefehle
  • Ersetzen aller DEC B; JR NZ,label Folgen mit DJNZ label
  • Ersetzen von LD A,0 gegen XOR A an einigen Stellen
  • Entfernen der Routine TOUPPER, war eine Kopie von UPPER
  • Entfernen der Copyright-Meldung bei Start des Grundprogramms
  • Duch diese Maßnahmen konnte ich zunächst über 400 Bytes im EPROM freiräumen um mit der Umsetzung der geplanten Maßnahmen zu beginnen. Weitere Optimierungen bin ich erst mal nicht angegangen, da der gewonnene Platz für die Umsetzung des Hauptmenüs locker ausreichen und nach der Umsetzung weiterer Platz frei werden würde.

    Umsetzung

    Compilerschalter

    Am Anfang des Quelltextes sind verschiedene Compilerschalter untergebracht, mit denen man das Verhalten des neuen Grundprogramms beeinflussen kann.

    optLANG - Wahl der Sprache

    Menüpunkte und Meldungen können wahlweise in deutsch oder englisch übersetzt werden. Es ist zu beachten, dass die deutschen Texte etwas länger sind.

    optSAVE - Wahl der Speicherbaugruppe

    Gestattet das wahlweise Einbinden der Routinen für die Baugruppe CAS oder für IOE mit VDIP1. Es ist möglich, keine der Routinen einzubinden.

    optJUMP - Zusätzlicher Menüpunkt

    Gestattet das Einbinden eines zusätzlichen Menüpunktes für den Rücksprung nach EFLOMON oder für den direkten Start von Floppy.

    optFLIP - Programmausführung ohne Autoflip

    Gestattet das optionale Abschalten der AutoFlip-Funktion. Dabei entfällt auch die Meldung „F=Flip M=Menue“ nach der Ausführung von Programmen. Der Rücksprung ins Hauptmenü erfolgt mit beliebigem Tastendruck.

    optIncludeTest - Einbinden von Testroutinen

    Erstellt einen neuen Menüpunkt und bindet vorbereitete Testroutinen ein, welche in einer Include-Datei vorliegt. Eigene Erweiterungen lassen sich so leicht testen.

    optIncludeOpts - klarschriftliches Einbinden der Optionen

    Führt die Stellungen der Compilerschalter klarschriftlich am Ende des ROMs auf.

    Speichern auf USB

    Vor längerer Zeit hatte ich mal ein VDIP1 Modul erstanden, mit dem sich durch einen Mikroprozessor gesteuert recht einfach auf USB Devices zugreifen lässt. Neben Memory-Sticks lassen sich darüber auch Drucker ansteuern und eine Kommunikation mit einem Hostcomputer aufbauen. Das VDIP1 verfügt über zwei USB Schnittstellen und kann mit dem Mikroprozessor wahlweise über eine serielle Schnittstelle, SPI oder über den Datenbus angesteuert werden.
    Da die CAS Baugruppe bei mir und wohl auch den meisten anderen nicht mehr eingesetzt wird, habe ich mich dazu entschieden auf die CAS Routinen des GP zu verzichten und statt dessen die Unterstützung für VDIP1 einzubauen. Mit einem Compilerschalter kann gesteuert werden, ob die ungeänderten CAS Routinen oder die neuen USB Routinen übersetzt werden sollen.

    Das VDIP1 Modul

    Ich habe mich nach kurzem Studium der Referenz des VDIP1 Moduls für den Anschluss per SPI (serial Programming Interface) Schnittstelle entschieden, da so nur wenige Signale benötigt werden und die Baugruppe IOE noch für andere Zwecke genutzt werden kann.
  • Baugruppe IOE mit VDIP1 Modul (nach dieser Bauanleitung)
  • Mögliche Formate sind FAT12, FAT16, FAT32
  • Die Sektorgröße muss 512 Byte betragen
  • Die Clustergröße ist zwischen 512 Byte und 32 kByte wählbar
  • Einschränkung auf kurze Dateinamen im 8.3 Format
  • Unterstützt wird nur die erste Partition auf einem Laufwerk
  • So die Theorie, in der Praxis war die Verbindung mit dem Modul schwieriger als erwartet. Mein relativ altes Modul hatte noch den Firmwarestand 2.08, der mit Fehlern behaftet war und zunächst keinen meiner Memory Sticks lesen wollte. Mit einer 16 Mbyte großen Partition im FAT Format gelang dann das Aufspielen der aktuellen Firmware VDAP 3.68 ohne den sonst notwendigen Programmer.

    Hinweise zum Format

    Ein einfaches Formatieren eines bereits partitionierten Sticks führt nicht immer zum Erfolg. Um einen Stick sicher mit dem VDIP1 Modul nutzen zu können, sollte man die Partition entfernen und neu einrichten. Bei der Formatierung mit FAT32 muss unbedingt auf die Sektorgröße von 512 Byte geachtet werden. Folgende Formate habe ich getestet:
  • 2 GB NoName Stick mit 16 MB Partition FAT12 Format, Clustergröße 4 KB
  • 2 GB NoName Stick mit 512 MB Partition FAT32 Format, Clustergröße 512 Byte
  • 2 GB NoName Stick mit 2 GB Partition FAT32 Format, Clustergröße 32 KB
  • 32 GB Kinkston Data Traveler SE6 Stick mit 32 GB Partition FAT32 Format
  • TCM USB Card Reader mit 4 GB SD Karte
  • USB Festplatte WD6400BEV mit 32 GB Partition FAT32 Format, Clustergröße 32 KB
  • USB Festplatte WD6400BEV mit 640 GB Partition FAT32
  • Mitsumi USB Diskettenlaufwerk 061M mit 1,44 MB Diskette FAT Formatierung
  • Um Laufwerke mit Partitionen über 32 GByte mit FAT32 zu formatieren kann unter Windows zum Beispiel das Zusatzprogramm Fat32Formatter zum Einsatz kommen.

    Integration ins Grundprogramm

    Beim Starten des GP wird das USB Modul zunächst nicht initialisiert, da dies den Start besonders bei nicht eingesteckten Speicherstick extrem verlängern würde. Die Initialisierung findet statt, wenn erstmals auf einen Datenträger zugegriffen wird. Beim Aufruf von „speichern USB“, „laden USB“ oder „USB Inhalt“ wird dann „Init USB …“ angezeigt und das Modul zurückgesetzt. Falls kein Speichermedium erkannt wird, werden die Funktionen abgebrochen und zum Hauptmenü zurückgesprungen. Die beiden Routinen RI zum Lesen von CAS und PO zum Scheiben auf CAS haben im USB-Betrieb keine Funktion.

    Bedienung

    Hier gehe ich nur auf die Routinen ein, die gegenüber dem alten Grundprogramm in wichtigen Teilen verändert wurden. Die anderen Routinen erklären sich entweder von selbst oder sind ausreichend an anderer Stelle beschrieben.

    FLOMON Start / FLOPPY Start

    FLOMON Start

    Wenn das Grundprogramm mit FLOMON auf der Baugruppe BANKBOOT eingesetzt wird, dann gelangt man hierüber in das FLOMON Menü zurück. Falls das Grundprogramm selbst auf Adresse 0000 übersetzt ist, dann erfolgt ein Neustart des Grundprogramms.

    FLOPPY Start

    Springt zurück nach FLOMON und startet sofort den Bootvorgang von Floppy Disk.

    Laden von USB

    Dient zum Laden von Daten von einem Datenträger. Es wird immer der komplette Inhalt der Datei geladen und ab der angegebenen Zieladresse abgelegt. Es findet keine Kontrolle gegen das Überschreiben von geschützten Speicherbereichen statt.

    Eingabe des Dateinamens

    Der eingegebene Dateiname wird automatisch auf das 8.3 Format gebracht. Gültige Eingaben sind
    TEST.BIN                -->     TEST.BIN
    TEST                    -->     TEST
    HALLO WELT.TXT          -->     HALLO
    SEHRLANGERNAME.TXT      -->     SEHRLANG.ERN

    Eingabe der Zieladresse

    Adresse, an welche die Datei geladen werden soll. Die Eingabe kann wie jede andere Adressangabe dezimal, hexadezimal oder als Symbol erfolgen.

    Speichern auf USB

    Dient zum Speichern eines Bereiches in eine Datei auf dem Datenträger. Bereits vorhandene Dateien werden ohne Rückfrage überschrieben.

    Eingabe des Dateinamens

    Der eingegebene Dateiname wird automatisch auf das 8.3 Format gebracht.

    Eingabe der Startadresse

    Anfang des zu speichernden Bereiches. Die Eingabe kann wie jede andere Adressangabe dezimal, hexadezimal oder als Symbol erfolgen.

    Eingabe der Dateilänge

    Im Gegensatz zu anderen Routinen wird hier nicht die Endadresse angegeben sondern die Größe des zu speichernden Bereiches. Die Eingabe kann ebenfalls dezimal, hexadezimal oder als Symbol erfolgen.

    USB Inhaltsverzeichnis

    Listet alle Dateien und Ordner im Wurzelverzeichnis des eingesteckten Datenträgers auf. Unterverzeichnisse werden zwar angezeigt aber vom GP nicht unterstützt. Die Anzeige erfolgt in 3 Spalten zu 16 Zeilen ohne Sortierung. Die Anzahl der Dateien ist abhängig vom Format des Datenträgers nicht begrenzt. Nach jeder Bildschirmseite kann mit CR eine weitere Seite angezeigt werden, mit M gelangt man zurück zum Hauptmenü.

    USB Fehlermeldungen

    Fehler beim Zugriff auf einen USB-Datenträger werden mit Abkürzungen gemeldet. Folgende Fehlercodes können möglicherweise auftreten.
    ND       No Disk             Kein Datenträger erkannt
    DF       Disk Full           Datenträger ist voll
    FN       Filename Invalid    Ungültiger Dateiname
    CF       Command Failed      anderer Fehler
    

    HEXDUMP

    Ich fand den HEXDUMP (Speicherauszug) schon immer nicht besonders gut lesbar. Eine getrennte Darstellung des Speicherinhaltes und der ASCII-Zeichen ist deutlich besser lesbar. Durch die andere Aufteilung werden jetzt doppelt so viele Speicherstellen angezeigt.
  • Getrennte Anzeige von HEX-Bytes und ASCII-Zeichen
  • 256 Bytes Anzeige auf einer Seite
  • 128 Bytes Schrittweite beim Blättern
  • Berechnung einer Prüfsumme pro Zeile
  • Codeoptimierungen

    In allen Routinen wurden die unnötigen und komplizierten Konstrukte, die aus der Verwendung des Makro Assemlers entstanden, überarbeitet und gegen kürzere und gleichzeitig schnellere Routinen ersetzt. Gleichzeitig sind diese Routinen übersichtlicher und kommen ohne Manipulation des Stackpointers aus.