Assembler-Library

Der IOM-MPF hat eine Z80-CTC, eine Z80-PIO und eine 8251 USART an Bord, im EPROM sind allerdings nur je ein Demo-Programm vorhanden. Das vorliegende Library-EPROM enthält Treiberprogramme für alle drei Bausteine, zusätzlich ein Empfangsprogramm für Intel-HEX und Binärdateien. Die Interrupt-Vektortabelle für alle möglichen Interrupts sowie die entsprechenden Interrupt Serviceroutinen mit optionalem Callback sind ebenfalls vorhanden. Im Einzelnen sind folgende Module implementiert: 
8251 USART

Intialisierung
mit Setzen des Betriebsmodus und der Baudrate. Alle möglichen Varianten sind als EQUates im Definitionsfile vorhanden 
Zeichen empfangen
mit Fehlerprüfung, und wenn vorhanden, Rücksetzung. Der Fehlerstatus wird zurückgegeben. Es wird nicht auf Bereitschaft gewartet. 
Zeichen senden
ohne auf Bereitschaft zu warten, der Status wird zurückgegeben.
RTS und DTR
einzeln setzen und rücksetzen
Interruptbetrieb
ist nicht möglich, die dazu benötigten Leitungen RxReady und TxEmpty sind nicht angeschlossen.
Z80-CTC

Initialisierung
der einzelnen Timer mit setzen des Betriebsmodus und der Taktrate sowie optional die Adresse einer Benutzer-Interrupt Routine. Die möglichen Beriebsarten und einige Intervall-Zeiten (1,5,10,20,30 mS) sind als EQUates vordefiniert. Ein bereits laufender Timer kann gestoppt werden.
Wahlweiser Interruptbetrieb
aller vier Zähler. Die integrierten Interrupthandler stellen über definierte Adressen je einen Zähler bereit, woraus die Applikation sieht, ob und vieviele Interrupts seit dem letzten Lesen aufgetreten sind. Optional kann eine vom Benutzer definierte Routine aufgerufen werden.
Z80-PIO

Initialisierung
beider Kanäle (nur einer pro Aufruf) mit Betriebsmodus, Interrupt-Maske (nur Modus 3) und optional der Adresse einer Benutzerfunktion. Alle Moduskombinationen sind als EQUates vordefiniert. Die Funktion erlaubt auch das Stoppen der Interrupts.
Wahlweiser Interruptbetrieb
beider Kanäle. Die integrierten Interrupthandler stellen über definierte Adressen je einen Zähler bereit, woraus die Applikation sieht, ob und vieviele Interrupts seit dem letzten Lesen aufgetreten sind. Optional kann eine vom Benutzer definierte Routine aufgerufen werden.
Utilities

Sperren der Interrupts
und Rückgabe, ob sie freigegeben waren. Dadurch kann der Aufrufer entscheiden, ob er die Interrupts vor Rückkehr wieder freigeben soll.
Abfrage des DIP-Schalters
auf dem IOM-Board mit Angabe der Bitmaske. Die Funktion liefert den aktuellen Schalterstatus sowie die Information, ob sich an den Bits, die durch die Maske spezifiziert sind,  etwas verändert hat.
Konvetierungsroutinen
binär <-> HEX ASCII, binär <-> dezimal ASCII, Anzahl Stellen und führende Nullen  (nur dezimal) konfigurierbar. Zeichen nach Grosschrift wandeln.
Division
16 durch 8 Bit, gibt Modulus zurück.
Zeichen testen
ob es darstellbar und druckbar ist. Führt Uppercase-Konvertierung durch. Nicht darstellbare Zeichen werden durch SPACE ersetzt.
Zeichen testen
ob es güitiges Dezimal oder HEX Format hat.
Statische Zeichenketten
(nur gleiche Zeichen) auf dem Display an beliebiger Position ausgeben (analog der Anzeige bei Tape-Load). Kann während zeitkritischen Prozessen als Fortschrittsanzeige verwendet werden (z.B. RCV-HEX).
Tastatur und Display
abfragen bzw. aktualisieren, analog zur Monitorfunktion SCAN1. Der auszugebende Text wird aus einem wählbaren Buffer gelesen. Ctrl-G schaltet den Sytem-Beeper ein und aus.
Textzeilen-Editor
mit blinkendem Cursor, wählbarer Bufferadresse, ohne Scrolling. Unterstützt Text, Dezimal- und HEX Eingabemodi, Cursor links und rechts (Pfeiltasten) und Zeilenanfang und -Ende (CTRL-A/Z), Insert/Overwrite (Ctrl-K). Backup Funktion, mit Ctrl-U kann der Initaltext wiederhergstellt werden, Ctrl-Y löscht die Zeile. Initialisieren des Buffers wählbar. Die Funktion wartet nicht auf eine Eingabe, Init- und Wiederholmodus sind über Parameter wählbar. Liefert die zuletzt gedrückte Taste, damit der Aufrufer z.B. Control-Tasten auswerten kann.
SHIFT und CONTROL
Tasten einzeln abfragen durch direktes Einlesen der entsprechenden PPI Ports. Funktioniert auch mit laufenden Interrupts.
BEEP- und TONE
Routinen analog denen im Monitor, diese können jedoch auch bei laufenen Interrupts aufgerufen werden

Die Library muss an Adressen xx00 assembliert werden, sie enthält Sprünge über I/O Adressen, die bei Interruptbetrieb Abstürze verursachen (siehe unten).

Interrupt-Betrieb mit dem IOM-MPF und dem PRT-MPF

Die Monitor-Routinen dürfen bei laufenden Interrupts generell nicht aufgerufen werden, unregelmässige Abstürze sind die Folge.
Im Manual des IOM wird erwähnt, dass auf dem Printermodul ein Design-Fehler existiert, der verhindert, dass Interrupts funktionieren. Das Signal M1 des Z80 wird bei der Dekodierung der I/O Ports nicht berücksichtigt. Dies führt dazu, dass das Printerboard bei einem Interrupt-Acknowledge Zyklus seine Daten auf den Bus legt und die vom Gerät, das den Interrupt angefordert hat, verfälscht, sofern die ausgeführte Adresse beim Auftreten des Interrupts xxCA oder xxCB (die Portadressen des Printerboards) sind. Die einzige Lösung des Problems ist, entweder die Speisung der Druckerkarte zu unterbrechen oder sämtliche OpCodeadressen, die mit CA oder CB enden, zu überspringen. Das Einfügen von NOPs, wie im IOM-Manual beschrieben, funktioniert nicht zuverlässig.

Aber das ist nur die halbe Wahrheit. Der gleiche Fehler existiert auch beim IOM. Hier betrifft es die 8251 USART und den DIP-Schalter. Die USART ist standardmässig nicht bestückt, darum wurde es vielleicht nicht beachtet.
Auch hier fehlt M1 und für den DIP-Schalter /RD zur Decodierung der I/O Adressen. Für CTC und PIO spielt dies keine Rolle, da diese die Decodierung mit M1 selbst erledigen. Anders beim USART und dem DIP Schalter. Diese legen frisch-fröhlich ihre Daten auf den Bus, sobald ein Interrupt-ACK Zyklus im Adressbereich xx60 - xx6F (der 8251 belegt IO-Adressen 60 und 61, der DIP Schalter 6C) ausgeführt wird. Der USART dürfte dies eigentlich bei inaktivem /RD nicht tun. Das Datenblatt des 8251 gibt keine Auskunft über das Verhalten, wenn /CS akiv und /RD UND /WR inaktiv sind, was ja bei einem INTACK der Fall ist. Möglicherweise ist dies ein verbotener Zustand. Im Anwenderprogramm darf zwischen xx60 und xx6F kein Code sein, der mit Interrupts unterbrochen werden kann. Dies ist auch der Grund, warum die CTC Demo des original IOM EPROMs abstürzt. Nach Verschieben in einen nicht betroffenen Adressbereich oder bei entferntem USART funktionierts.

Dienstprogramme

Programmauswahl im Menu, erste Zeile
Programmauswahl im Menu, zweite Zeile
EPROM Menu
Das Menuprogramm erlaubt das Starten von Programmen im IOM und PRT ROM mit nur einem Tastendruck. Standardmässig liegt es im freien EPROM Sockel des PRT-MPF an 7000. Der Aufruf des Menus geschieht mit G 7000 (oder CTRL-B mit gepatchtem Monitor, siehe unten). Basic/Forth Kalt- und Warmstart sind ebenfalls im Menu enthalten, für den Fall, dass der gepatchte Monitor verwendet wird und dadurch CTRL-B dieses nicht mehr startet. Die angezeigten Programme variieren, je nachdem, ob das IOM Board vorhanden ist oder nicht.

Text Zeileneditor
Die Suchfunktion
Eingabe Zeilenbereich für Drucken
Ausdruck auf dem MPF-Printer
Text Editor
Ein einfacher Editor für Texte mit blinkendem Cursor. Unterstützt verschiedene Funktionen wie Copy/Paste (zeilenweise), Einfügen/Ueberschreiben (aktiver Modus duch Form des Cursors erkennbar), Cursorbewegung links/rechts, Sprung an Zeilen/Text Anfang oder Ende oder an definierbare Zeilennummer, Textsuche, backup/restore einer Zeile, einfügen/löschen von Zeilen, drucken eines Zeilenbereichs und natürlich Laden und Speichern von bzw. auf Band oder USART, falls ein IOM vorhanden ist. Als Textspeicher wird automatisch das RAM des IOM, sofern vorhanden, verwendet, ansonsten jenes des MPF.

Die Stopp-Uhr
Stopp-Uhr
mit Anzeige von Hundetstel-Sekunden (nur im Stop-Modus). Verwendet CTC Interrupts als Zeitbasis. Das Programm muss an Adressen xx00 assembliert und geladen werden, andernfalls erfolgen Abstürze. Es enthält Sprünge über I/O Adressen, die im Interruptbetrieb Probleme verursachen (siehe oben).

Receive-BIN, Eingabe der Startadresse
Receive-BIN, Uebertragung beendet
Receive-BIN, Verhindern des Ueberscheiben des System-RAM
Receive-BIN
Empfangen Binärdateien. Dies erlaubt das Erstellen von Programmen für den MPF externen Tools. Im HEX Modus ist die Baudrate auf 1200 fixiert, damit ein Betrieb ohne Handshake möglich ist, . Das Programm prüft die HEX-Checksummen und verifiziert die geschriebenen Daten.
Empfangen von Binärdateien. Dies erlaubt das Erstellen von Programmen für den MPF mit externen Tools. Die Baudrate ist auf 4800 fixiert, damit ein Betrieb ohne Handshake möglich ist. Das Programm erfragt beim Start die Ladeadresse, ohne Eingabe wird F000 verwendet. Danach warten auf das erste Datenbyte. Sobald erkannt,  wird ein Timeout aktiv. Läuft dieser ab, beendet das Empfangen und Start/Endadressen werden ausgegeben. Während des Empfangens werden die Daten verifiziert und ein Ueberschreiben des Systembereichs geprüft. Tritt ein Fehler auf, erfolgt eine entsprechende Fehlermeldung mit Adresse.

Receive-HEX wartet auf erstes Byte
Receive-HEX, Uebertragung beendet
Receive-HEX, Zeilen-Checksummenfehler
Receive-HEX
Dieses Programm enspricht funktionell dem Receive-BIN mit der Ausnahme, dass Intel-HEX Dateien empfangen werden. Die Daten werden an die Adressen, die in der HEX Datei definiert sind, geladen, Gaps sind unterstützt. Die Zeilen-Checksummen werden geprüft, ebenso wie Ueberscheiben des Systembereichs und Verifizierung. Durch den höheren Software Aufwand und die daruch längeren Laufzeiten ist die Baudrate auf 1200 fixiert, um einen Betrieb ohne Handshake zu ermöglichen. Nach Erkennen eines Ende-Records werden Start- und Endadressen angezeigt, bei einem Fehler eine entsprechende Meldung mit Adresse.

Send-BIN, Eingabe von Start- und Endadresse
Send-BIN, Uebertragung beendet
Send-BIN
Erlaubt das Senden eines beliebigen Speicherbereichs über die serielle Schnittstelle auf dem IOM Board. Die Baudrate ist 4800 bps. Verwendet RTS/CTS Handshake.

Aufruf des SAVE Programms aus Basic
SAVE wartet auf RTS des Empfängers oder sendet
Aufruf des LOAD Programms aus Basic
LOAD wartet auf Daten oder empfängt
Basic Load/Save
Diese Routinen ermöglichen das Laden/Spechern von Basic-Programmen über die serielle Schnittstelle des IOM Boards mit 4800 bps und RTS/CTS Handshake.  Der Aufruf geschieht über CALL Befehle im Basic. Nach Beenden oder bei Abbruch erfolgt ein Sprung zum Basic Warmstart an 2020. Da der benutzte Systembereich des Basic nirgends dokumentiert ist, wird nebst dem Sourcecode sicherheitshalber der gesamte Bereich von FB00 bis FEFF gespeichert bzw. zurückgeladen.

Anzeige der Interrupt-Zähler in HEX und Dezimal
Zeileneditor mit Text, HEX und Dezimaleingabe
Die Verdrahtung zur Visualisierung der Interrupts
Library Test
Testprogramm zum Debuggen der Library-Routinen. Bei freigegebenen Interrupts (SW-8 ON) laufen vier Interrupts simultan (3x Timer, 1x PIO). Über Timer-Callbackfunktionen werden PA0-PA3 des PIO im Interrupt-Kontext geschaltet, PB0-PB3 im Mainloop durch Abfrage der Interrupt-Zähler. Der PIO Pin PB7 ist als Eingang konfiguriert und löst einen Interrupt bei positiver Flanke aus. Dieser wird über PA3 im Interrupt-Kontext signalisiert, über PB3 im Mainloop-Kontext.
Mit den DIP-Schaltern können USART Echo, Anzeige der Interrupt-Zähler in HEX und Dezimal sowie der Zeileneditor mit Druckerausgabe ein- und ausgeschaltet werden, um das Verhalten mit verschiedenen Interruptlasten zu testen. Ebenso ist eine Kalibrierfunktion für die Delay-Routine enthalten.
Das Programm muss an Adressen xx00 assembliert und geladen werden, andernfalls erfolgen Abstürze. Es enthält Sprünge über I/O Adressen, die im Interruptbetrieb Probleme verursachen (siehe oben).

Monitor Patch

Der Drucker druckt bei jedem Einschalten des Systems die Zeile *** MPF-I-PLUS ***. Dies ist reine Papierverschwendung. Dieser Ausdruck wurde entfernt.
Normalerweise startet CTRL-B das Programm im ROM an 2000, Basic oder FORTH. Dies wurde durch einen Sprung nach 7000, das ROM-Menu auf dem PRT-MPF, ersetzt. Ist das ROM nicht vorhanden, wird CTRL-B ignoriert. CTRL-C, Basic Warmstart, ist nicht mehr verfügbar. Dieser ist im ROM-Menu integriert.

ROM Images

Image für das 2732 EPROM im freien Steckplatz U6 auf dem PRT-MPF mit dem Menuprogramm, dem Text-Editor und den Libraryroutinen, damit diese Programme auch ohne die Library auf dem IOM lauffähig sind.

Image für das 2732 EPROM in U5 auf dem IOM-MPF mit Receive-BIN, Receive-Hex, Send-BIN, Basic Load/Save, Stopp-Uhr und den Library-Routinen Die Original-Demoprogramme sind nicht mehr enthalten.

Original 2764 EPROM Image des MPF-1P Monitors und Assemblers

Original 2764 EPROM Image des MPF-1P Basic. Es existieren zwei Versionen, die ältere hat ein Problem mit der Druckerausgabe, zudem funktionieren die SON/SOFF Befehle nicht.
Die neuere Version hat diese Probleme nicht mehr, der READY Prompt ist aber, vermutlich aus Platzgründen, nicht mehr vorhanden

2764 EPROM Image des MPF-1P Forth

Original 2732 EPROM Image der IOM-MPF Erweiterung mit Demoprogrammen für PIO, CTC und USART. Die CTC Demos funktionieren nicht mit bestücktem USART, bedingt durch Hardwarefehler auf dem IOM Board.

2732 EPROM Image des PRT-MPF Druckers, enthält nebst den Druckroutinen den Disassembler und den Memory-Dump.

Entwicklungstools

PsPad Progammier Editor
Ausagbe des ASL-Assemblers in PsPad
Fehleranzeige des ASL Assemblers, mit direktem Strung zu Zeile und Spalte
Die Library und Dienstprogramme wurden anfänglich mit CP/Ms M80/LINKZ/RELHEX auf einem Kaypro II entwickelt. Spätere Versionen dann unter Windows XP mit dem ASL Assembler. Als Editor/IDE dient  PsPad, ASL lässt sich elegant einbinden. Die Kommunikation mit dem  MPF-1P geschieht aus PsPad mit TeraTerm und der dazugehörigen Makrosprache.