MFA Speicherkarte 64kb RAM/ROM mit Boot-ROM und Pagingfunktion

  • Speicher satt

    Ein Problem hat mich schon immer beim MFA gestört: Das Speicherbild bzw. der Umgang mit den verschiedenen Speicherkarten. Es gibt die Standard 8K-Karte die man in verschiedene Speicherbereiche einblenden konnte. Dann gab es irgendwann die 16K-Karte, und die Karten mit Boot-EPROM.

    Bei all diesen Karten musste jeweils genau darauf geachtet werden welche mit welcher kombiniert und an welchen Speicherbereich diese jeweils aktiv war.


    Eine Idee

    Die ersten Ideen einer flexibleren Speicherkarte waren relativ schnell geboren. Sie sollte die vollen 64KB abdecken und wenn möglich sogar mehr über ein noch zu entwerfendes Banking-Verfahren. Auch die Boot-Eprom-Funktion sollte irgendwie realisiert werden. Es wäre auch echt cool wenn man das System Inplace editieren könnte, denn gerade in meiner frühen Jugend habe ich da schon öfters ein paar Änderungen vorgenommen und dazu immer wieder Eproms brennen macht ja irgendwie keinen Spaß.


    Für die Auswahl des Paging-Bereiches kamen verschiedene Ideen in Frage. Allen voran über einen Out-Befehl. Doch hier wäre vermutlich irgendwann das Problem aufgetreten, dass es zu Überschneidungen bzw. Überlappung mit bestehenden Interfacekarten kommen könnte. Andere Alternativen mit PAL-Chips wurden ebenfalls verworfen, da aktuell weder entsprechende Programmierumgebung vorhanden ist, noch ausreichendes Know-How und der Charme des MFA hätte vermutlich darunter leiden können. Auch das jederzeitige Auslesen sollte irgendwie machbar sein.


    Heraus kam eine direkte 16-Bit Speicheradressierung die einstellbar ist. Durch das Schreiben in eine Speicherzelle wird die entsprechende Paging-Seite in einen einstellbaren Speicherbereich eingeblendet. Durch das Schreiben und Lesen in die Speicherzelle kann diese im Programmcode jederzeit wieder in Erfahrung gebracht werden.

    Auch eine Anzeige der aktuellen Paging-Seite wäre nett, und so kommt nun auch eine 7-Segment-Anzeige mit auf die Platine.


    Die erste Ideen-Skizze:


    Der erste Entwurf der Platine, der eher einem Prototyp gleicht. Denn dieser hatte 3 grobe Layout und Schaltungsfehler und war noch nicht so richtig perfekt.

    Peinlichkeit 1: Bei der Anzeige-LED zum aktiven ROM wurde doch glatt der Vorwiderstand vergessen.

    Peinlichkeit 2: Beim Verdrahten des 7486 habe ich das falsche Signal genommen und musste dann nachträglich ein paar Leitungen durch einen freien Inverter jagen und das Layout ein wenig "umorganisieren".


    Die überarbeitete Version der RAM/ROM-Paging-Karte


    Die fertige (korrigierte) RAM-Karte


    Die Frontblende mit Anzeige-LED und Schalter für das manuelle aktivieren des EPROMs


    Die Speicherkarte in Betrieb (hier Paging-Seite 7 ausgewählt)

    Funktionsbeschreibung der Karte

    Grundsätzliches

    Die Karte besteht im wesentlichen aus vier 32kb Speicher-Chips (27256 und 2 x 62256 o.ä.). Ein zusätzlicher 32KB RAM-Chip ist das Paging-RAM.


    Paging-Funktion

    Der zusätzliche Paging-RAM-Chip (IC4) wird in 8 jeweils 4kb-Seiten in den vorhandenen MFA-Speicherbereich 8000 - E000 eingeblendet. Der gewünschte Bereich ist dabei über den DIP-Schalter SW1 auswählbar. Achtung: F000 macht beim MFA wenig sinn, denn dieser Bereich ist ja vom System belegt, unter anderen der Stack.

    Die Auswahl der gewünschten Seite wird über einen Memory-Write-Befehl auf eine, über die Hex-Drehschalter (S1-S4) einstellbare, 16-Bit-Adresse vorgenommen. Über folgenden Code wird eine Seite des RAM-Paging aktiviert:

    Code
    MVI A,03h    ; Seite 3
    STA 0FE00h   ; In die per Schalter eingestellte Adress-Selektionsadresse schreiben

    Dadurch dass hier gleichzeitig geschrieben wird (Pageselektor-Chip IC11 und System-Speicher) kann jederzeit die gerade aktuell eingestellte Paging-Seite wieder in Erfahrung gebracht werden.


    Boot-Rom-Funktion

    Die Boot-ROM-Funktion bzw. das Abschalten des EPROM erfolgt, wie beim Original auch, durch einen Lesebefehl auf eine Adresse im Bereich 8000h - BFFFh. Ein aktives EPROM wird zusätzlich über die grüne LED an der Frontblende angezeigt.

    Da auch hier der untere Speicher parallel zur Verfügung wird, kann bei aktivem EPROM in den Speicher 0000h-7FFFh geschrieben werden. Dies kann man dafür nutzen, über ein den KMD+> - Befehl Copy den gesamten Bereich von 0000h-7FFFh in den Bereich 0000h zu kopieren und anschließend mit einem Lesebefehl auf Adresse >= 8000h das EPROM zu aktivieren. Nun befindet man sich dann mit dem MAT-System im RAM. Das hat den Vorteil, nun kann man Inline am Systemcode herumspielen.


    CP/M macht's vor

    Dadurch dass das gesamte MAT85+-System zur Verfügung steht, sind auch alle Floppy-Funktionen vorhanden. Somit kann man sein MAT85+-System, das man sich vorher auf Diskette gespeichert hat, nun im "Boot-Vorgang" in den Speicher laden, auf RAM umschalten und durchstarten. Da die Datei sich den Startbereich ja gemerkt hat, muss man dazu nicht mehr viel auswählen, außer dem gewünschten Dateinamen (sprich "OS"-Variante).


    Entdeckte Fehler

    Bei der ersten Inbetriebnahme ist nach dem Einschalten immer wieder das EPROM abgeschaltet worden und das System lief buchstäblich ins leere.

    Erst nach einiger Suche und Einzelschrittmodus des Startvorganges (waren schon einige Schritte die das System durchführt bevor da was passierte) ist ein "Bug" des Systems aufgefallen. Dazu ein Auszug dem dem MAT85-Quellcodes:

    Die Zeile 192 müsste meines Erachtens an seiner Stelle entfernt und nach der Zeile 212 wieder eingefügt werden. Denn nach der Initialisierung des Systemspeichers (ab Zeile 208 ERAM-BRAM) darf er gerne seine Breakpoint-Tabelle löschen. Direkt nach dem Einschalten eine noch nicht initialisierte Breakpoint-Tabelle zu löschen, macht zum einen wenig Sinn und kann durchaus zu Schreib-/Lesevorgängen in einen Speicher >=8000h führen. Dadurch wird aber "aus versehen" das Boot-Eprom abgeschaltet. Da aber das parallele RAM noch keinen vernünftigen Code enthält, geht das schief und das System bleibt hängen (man könnte auch von einem Blue-Screen reden, das wäre gegenüber dem MFA aber fast eine Beleidigung ... ;) )


    Erweiterungen

    Nichts ist perfekt, so auch diese RAM-Karte. Derzeit sind folgende Erweiterungen geplant:

    • Erweiterung auf 64KB Paging-RAM (Seiten 0-F)
      Dazu muss ich aber noch ein wenig Platz auf der Platine schaffen oder die 62256 in der, nur schwer erhältlichen, schmalen Gehäuseform wählen oder in SMD ausführen
    • Batteriepufferung
      Der komplette Speicher über eine Batterie (oder Akku) puffern. Ich verspreche auch, dass ich dafür keine Freileitungen verwende ... ::heilig:: MFA - Reaktivierung nach über 30 Jahren
      Das hätte den Vorteil, dass das Betriebssystem nicht immer neu gebootet werden muss, z.B. bei Anpassungen am Programmcode (Löschtaste sollte aber noch vorhanden sein)
    • EEPROM-Unterstützung
      Eventuelle Anpassungen zur Nutzung von EEPROM-Bausteinen

    Wenn jemand noch weitere Ideen hat, gerne her damit. Wenn diese umsetzbar sind, kann die Karte ja nur noch besser werden.


    ---


    Auch hier wieder wie gehabt: EAGLE-Projekt und CAM-Daten im Anhang.

    Aktuell habe ich hier noch 1 Platine übrig. Wenn auch hier jemand Interesse daran hat, einfach melden.

  • Das mit dem Paging hab ich nicht verstanden.

    Du hast 64kB RAM. Ueber einen 4kB Block legst du nochmal 8 4kB Bloecke, von denen du einen selektieren kannst.

    Hab ich das richtig verstanden? Wenn ja, wofuer? Reichen die 64kB nicht?


    Zu deiner Breakpoint Tabelle.

    BPTREM loescht ja nicht die Tabelle, sondern schreibt gesetzte Breakpoints zurueck (BreakPoinTREMove).

    Das ist schon sinnvoll, das am Anfang zu machen. Sonst laeufst du nach dem Reset evtl. auf einen deiner alten Breakpoint(s).


    Ausserdem ist es egal ob die Breakpoints geloescht werden, alleine der CALL Befehl schreibt die Ruecksprungadresse auf den Stack, der gerade auf 0xFC80 gesetzt wurde. Schon dadurch wird das EPROM abgeschaltet. Wenn du den MAT also aendern willst solltest du das CASINIT auch verlegen.

    Abgesehen davon wurde der MAT ja nicht fuer die EPROM Bootlogik geschrieben. Deshalb wuerde ich das nicht als Fehler ansehen, wenn du diese Funktion hinzufuegst, die einfach nicht vorgesehen ist.


    Aber sonst, mach weiter so. :thumbup:

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Ich les gerade auf deiner Webseite

    Zitat

    Peinlichkeit 2-4: der 7486 reagiert nicht zuverlässig auf Low-Input, deshalb wurde nachträglich auf High-Signal für die Adress-Selektion umgestellt

    Wie meinst du das?


    Ich seh Pulldown Widerstaende an TTL-Eingaengen immer sehr kritisch.

    Aus TTL-Eingaengen mit Low Signal fliesst immer ein Strom, der im Widerstand zu einem Spannungsabfall fuehrt und das Eingangssignal anhebt.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Das mit dem Paging hab ich nicht verstanden.

    Du hast 64kB RAM. Ueber einen 4kB Block legst du nochmal 8 4kB Bloecke, von denen du einen selektieren kannst.

    Hab ich das richtig verstanden? Wenn ja, wofuer? Reichen die 64kB nicht?

    Korrekt. In den per DIP-Schalter einstellbaren Bereich, können jeweils bis zu 8 verschiedene 4k-Blöcke eingeblendet werden.


    Ob man diese 32kb nun "braucht" oder nicht, lass ich mal dahin gestellt. Vorstellbar wäre z.B. den COPY oder COMPARE-Befehl zu erweitern bzw. zu patchen um damit auch 32kb-Bereiche transferieren oder vergleichen zu können. Auch beim EPROMmer könnte ich mir die Verwendung des Paging-Bereiches gut vorstellen.


    Aber gerade die MAT85-Programmteile nutzen den gleichen Speicherbereich (E000h). Ein formatieren der Floppy überschreibt z.B. den Speicherbereich für SPS-Programme. Wäre doch schön, wenn das Mini-DOS dafür einen Paging-Bereich verwendet anstatt des "Hauptspeichers". Könnte man mit Sicherheit irgendwie anpassen. Basic im MAT85+ ist auch so ein Kandidat, der Speicher in Anspruch nimmt und das ohne Rücksicht auf "Verluste".

    Das Wissen ist das einzige Gut, das sich vermehrt, wenn man es teilt. (Marie von Ebner-Eschenbach)

  • Sorry, ich hatte vergessen in meiner Beschreibung zu erwähnen, dass ich genau diesen Fall (zugriff vom System auf Speicher >= F000h) bereits über die EPROM-Abschaltlogik berücksichtigt habe. Korrekterweise muss der Lesebefehl im Adressbereich 8000h - BFFFh erfolgen um das EPROM abzuschalten.

    A15: 1

    A14: 0

    A13: X

    A12: X

    Aber danke für den Hinweis, ich werde das gleich noch ergänzen.

    Das Wissen ist das einzige Gut, das sich vermehrt, wenn man es teilt. (Marie von Ebner-Eschenbach)

  • Zu deiner Breakpoint Tabelle.

    BPTREM loescht ja nicht die Tabelle, sondern schreibt gesetzte Breakpoints zurueck (BreakPoinTREMove).

    Das ist schon sinnvoll, das am Anfang zu machen. Sonst laeufst du nach dem Reset evtl. auf einen deiner alten Breakpoint(s).


    Ausserdem ist es egal ob die Breakpoints geloescht werden, alleine der CALL Befehl schreibt die Ruecksprungadresse auf den Stack, der gerade auf 0xFC80 gesetzt wurde. Schon dadurch wird das EPROM abgeschaltet. Wenn du den MAT also aendern willst solltest du das CASINIT auch verlegen.

    Abgesehen davon wurde der MAT ja nicht fuer die EPROM Bootlogik geschrieben. Deshalb wuerde ich das nicht als Fehler ansehen, wenn du diese Funktion hinzufuegst, die einfach nicht vorgesehen ist.

    Das seh ich ein wenig anders.

    Im "Startvorgang" des MAT85 sind gesetzte Breakpoint meines Erachtens irrelevant. Denn das MAT85-System kann sich nicht selbst "Breakpointen". Breakpoints ermöglichen einen gesteuerten Ablauf eines Programmes. Dazu muss dieses durch GO, TRACE oder NEXT INSTRUCTION mit aktivierten Breakpoints kontrolliert gestartet werden. Denn nur so werden ggfl. Registerinhalte jeweils mit ausgegeben. Diese Funktion sehe ich beim MAT85-Startvorgang so nicht. Lasse mich aber gerne vom Gegenteil überzeugen.

    Das Wissen ist das einzige Gut, das sich vermehrt, wenn man es teilt. (Marie von Ebner-Eschenbach)

  • Pulldown sehe ich mittlerweile auch kritisch.... Deshalb kam ich ja in die Verlegenheit die Schaltung in dem Teilbereich anzupassen und diese späte Erkenntnis mit Fädeldraht zu verinnerlichen. :fp:

    Das Wissen ist das einzige Gut, das sich vermehrt, wenn man es teilt. (Marie von Ebner-Eschenbach)

  • Ein formatieren der Floppy überschreibt z.B. den Speicherbereich für SPS-Programme. Wäre doch schön, wenn das Mini-DOS dafür einen Paging-Bereich verwendet anstatt des "Hauptspeichers".

    Ok, sowas macht natuerlich Sinn.

    Ich hab mich nie richtig mit dem MAT beschaeftigt, daher sind mir solcge Details nicht bekannt.




    Deshalb kam ich ja in die Verlegenheit die Schaltung in dem Teilbereich anzupassen und diese späte Erkenntnis mit Fädeldraht zu verinnerlichen. :fp:

    Ich versteh's noch nicht.

    Mit Low-Input meinst du die Pulldowns? Und High-Signal sind Pullups?

    Aber das hattest du doch an deinem Prototyp geaendert. Im aktuellen Schaltplan sind es immer noch Pulldowns.





    Korrekterweise muss der Lesebefehl im Adressbereich 8000h - BFFFh erfolgen um das EPROM abzuschalten.

    Ok, dann funxt's. Ich hatte nicht jedes Gatter nachgezaehlt.




    Im "Startvorgang" des MAT85 sind gesetzte Breakpoint meines Erachtens irrelevant. Denn das MAT85-System kann sich nicht selbst "Breakpointen".

    Das ist natuerlich richtig.

    Fuer den MAT85 kann keine Breakpoints im EPROM setzen. Und mit der o.g. EPROM-Abschaltung ist die BPTREM Routine jetzt natuerlich stoerend.

    Nach einem Reset bleibt doch das erstellte Programm im Speicher. Dann wuerden der/die Breakpoints auch gesetzt bleiben. Die also zu deaktivieren ist m.E. ok.


    Trotzdem ist der MAT85 nicht fuer das Boot-Banking gebaut worden. Und bei nachtraeglichen Aenderungen/Erweiterungen musst du sowas dann selber korrigieren.

    Du kannst ja auch nicht den Motor deines Kfz tunen, und nach dem Unfall sagst du der Hersteller hat die Bremsen falsch dimensioniert. ;)

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Falls jemand die Karte nachbauen will bzw. auch zur Vervollständigung dieses Kartenentwurfes findet ihr die Konstruktionsdaten der Frontblende in verschiedenen Formaten im Anhang.