NitrOS9-Board: Unterschied zwischen den Versionen

Aus
Wechseln zu: Navigation, Suche
(Memory MAP)
(Memory MAP)
Zeile 149: Zeile 149:
 
Das NitrOS9 Level 2 hat bestimmte Anforderungen an die Hardware. Neben den Mindestanforderungen von 128K RAM sollte auch das Banking bestimmten Anforderungen entsprechen. Der Grund ist die Multitasking Fähigkeit von NitrOS9, das erfordert eine blitzschnelle Umschaltung zwischen verschiedenen Speicherbelegungen (Memory Maps).
 
Das NitrOS9 Level 2 hat bestimmte Anforderungen an die Hardware. Neben den Mindestanforderungen von 128K RAM sollte auch das Banking bestimmten Anforderungen entsprechen. Der Grund ist die Multitasking Fähigkeit von NitrOS9, das erfordert eine blitzschnelle Umschaltung zwischen verschiedenen Speicherbelegungen (Memory Maps).
  
 +
Der '''physikalische Adressraum''' hat eine Größe von 2MB. Dem gegenüber steht eine CPU die nur 64K adressieren kann ('''logischer Adressraum'''). Diese Diskrepanz wird gelöst durch den Einsatz einer MMU von Motorola (MC6829).
  
Der Physikalische Adressraum hat eine Größe von 2MB. Dem gegenüber steht eine CPU die nur 64K adressieren kann. Diese Diskrepanz wird gelöst durch den Einsatz einer MMU von Motorola (MC6829).
 
  
 +
Der Physikalische Adressraum hat eine Größe von 2MB und ist in 1024 Seiten (Pages) zu je 2K (Page $000 bis $3FF) unterteilt.
  
Das bedeutet Platz ohne Ende:
+
Die MMU splittet den logischen Adressraum (64K) auf in 32 Blöcke zu je 2K. Jeder dieser 2K großen Blöcke kann nun irgendwo im physikalischen Adressraum liegen (in 2K Schritten). Es erfolgt also eine Zuordnung von Block zu Page.
  
Jeder Task kann die gesamten 64K voll RAM haben (kein einziges Byte verschwendet für ROM oder IO)
+
Es sind 32 Blöcke die einem der 1024 Pages zugeordnet werden. Dazu gibt es 32 Zeiger zu je 10 Bit (zwei Bytes), also insgesamt 64 Bytes, die eine ganze Speicherbelegung (Memory Map) beschreiben.
beim Aufruf einen OS9 Service oder eines Interrupts wird automatisch in den System Task#0 geschaltet
 
Jeder Task kann zusätzlichen RAM anfordern über einen Banking Bereich
 
man kann gemeinsame RAM Bereiche haben mit anderen Tasks
 
es braucht keinen IO und keinen ROM Bereich (das handelt das OS9)
 
der Speicher ist geschützt
 
das OS und die IO sind geschützt
 
es gibt 4 Tasks (Speicher Belegungen) - 0: System, 1: DMA, 2,3: User
 
man könnte es erweitern auf bis zu 32 Tasks, es lassen sich bis zu 8 MMU ganz einfach kaskadieren
 
  
 
+
Die '''Memory MAP''' ermöglicht einen sehr flexiblen Zugriff auf den gesamten physikalischen Adressraum. Zudem kann das Block Mapping dynamisch verändert werden, sodass die CPU stets die gerade wichtigen Teile des physikalischen Adressraum im Zugriff hat.
 
 
 
 
 
 
 
 
Der physikalische Adressraum hat eine Größe von 2MB und ist in 1024 "Pages" unterteilt.
 
 
 
 
 
 
 
Der Adressraum der CPU hat natürlich nur 64K und ist in 32 Blöcken zu je 2K aufgeteilt.
 
 
 
 
 
 
 
Jeder dieser 32 Blöcke kann auf jede Page verschoben werden.
 
 
 
So erhält die CPU einen sehr flexiblen Zugriff auf den gesamten physikalischen Adressraum von 2MB.
 
 
 
 
 
 
 
Die CPU sieht also 32 Speicher Blöcke, wo jeder dieser Blöcke irgendwo im physikalischen Adressraum liegen kann.
 
 
 
Dazu braucht es 32 Zeiger mit 10 Bit Breite um diese Speicher Map zu beschreiben.
 
 
 
Dieses Set aus 32 Zeiger wird als TASK bezeichnet.
 
 
 
 
 
 
 
Eine MMU verwaltet 4 Tasks, also 4 x 32 Zeiger auf den physikalischen Adressraum.
 
 
 
Man kann bis zu 8 MMU kaskadieren um bis zu 32 Tasks zu haben.
 
 
 
 
 
 
 
Um von einer Speicher Map zu einer anderen zu schalten, muss man nur die Tasknummer in die MMU schreiben.
 
 
 
So macht Multitasking richtig Spaß ...
 
 
 
 
 
 
 
Die MMU kann aber noch mehr.
 
 
 
Sie erkennt automatisch einen Reset, einen IRQ oder einen SWI Befehl.
 
 
 
Und sie wechselt automatisch in den System Task.
 
 
 
Die CPU legt noch brav die Register und Rücksprungadresse auf den Stack ...
 
 
 
... dann schaltet die MMU um auf Task#0 und die CPU fetched den Vektor für IRQ oder SWI.
 
 
 
 
 
 
 
Dazu gibt es "priviligierten Code".
 
 
 
Nur der Task#0 "sieht" die MMU Register.
 
 
 
Daher kann kein User Task und auch nicht der DMA die Speicherkonfiguration verändern.
 
 
 
Der Speicher ist perfekt geschützt.
 
 
 
Ein User Programm kann das System nicht zerstören.
 
 
 
Es läuft in seiner virtuellen Speicher Welt die das OS eingestellt hat und kommt nicht heraus.
 
 
 
 
 
 
 
 
 
 
 
Das geht schon in die Richtung, die beim PC erst seit dem Intel 386 funktionieren.
 
 
 
Der ist natürlich 16/32 Bit breit, und hat das ganze Paging voll integriert in der CPU.
 
  
  
Zeile 242: Zeile 166:
  
 
<br />
 
<br />
 +
 
=== Speicher Management (MMU) ===
 
=== Speicher Management (MMU) ===
  

Version vom 20. Mai 2022, 10:24 Uhr

6309EP Board
OS9 Board


Mikro Computer Board

Das Ziel ist ein vollständiges Computer System auf Basis einer MC6809 bzw. einer HD6309 CPU mit NitrOS9 als Betriebssystem.



Die ByteMachine

Aller Anfang ist schwer, deswegen waren meine ersten Schritte der Nachbau eines funktionierenden CPU Boards: die ByteMachine

Im GITHUB gibt es das Projekt die ByteMachine von dem GIT User c0pperdragon. Die ByteMachine besticht durch ihre grandiose Einfachheit kombiniert mit enorm großer Flexibilität.


Die ByteMachine besteht aus drei Komponenten:

  • CPU Board
  • Mainboard: SRAM, EEPROM, Taktgenerator, Reset Signal, 8 LED und 8 digitale Eingänge
  • optionales IO Board: serielle Schnittstelle und SD Karte


Jede 8 Bit CPU benötigt dieselben Komponenten für ein lauffähiges System. Daher macht es Sinn, die gemeinsamen Komponenten auf ein eigenes Board zu legen. Das CPU Board macht nur die Anpassung für das Mainboard der ByteMachine. Das IO Board ist optional und wird ggf. auf das Mainboard gesteckt.


Das Mainboard der ByteMachine hat zwei Schnittstellen, eine zum CPU Board und eine zum IO Board. Das CPU Board sowie das optionale IO Board werden einfach auf das Mainboard aufgesteckt. Man kann die CPU aber auch einfach in ein Steckbrett setzen und die Verbindung zum Mainboard über Steckdrähte herstellen.


Die Schnittstelle zwischen CPU Board und Mainboard ist eine Stiftleiste mit 34 Pins. Über die Schnittstelle wird das CPU Board versorgt mit Strom, Takt und Reset. Das CPU Board kontrolliert die restlichen Komponenten über die Schnittstelle. Jede CPU benötigt eine minimale Anpassung um Kompatibilität zur Mainboard Schnittstelle herzustellen.


Das IO Board ist optional. Es bietet eine serielle Schnittstelle und den Anschluss einer SD Karte. Allerdings hat das IO Board keinerlei 'Intelligenz': Sowohl die serielle Schnittstelle als auch die SD Karte werden nur über digitale IO getrieben (Soft UART und SD-Card Bit-Bang). Das IO Board wird einfach auf das Mainboard aufgesteckt, dazu dienen sie Stiftleisten auf der rechten Seite: 8 digitale Ausgänge, 8 digitale Eingänge und Stromversorgung.


Für die ByteMachine existieren 4 CPU Boards im GITHUB:

  • W65C02 mit 10 bis 16 MHz
  • W65C816 mit 10 bis 16 MHz
  • Z84C00
  • i8088

Es existieren Schaltbilder, Doku und Platinen Layout für jedes CPU Board. Außerdem gibt es im ROM des Mainboard für jede CPU ein Testprogramm. Das Testprogramm zeigt über die LED des Mainboard an, dass die Hardware richtig funktioniert. Es braucht nur ein EPROM am Mainboard, denn jede CPU hat ihren eigenen Speicherbereich in dem 512K großen EPROM Speicher.

Wenn man eine neue CPU an das Mainboard der Bytemachine anschließen möchte, dann genügen ein Steckbrett und ein paar Verbindungsdrähte. Das macht dieses Konzept so wunderbar flexibel.


CPU Board

Auf dem NitrOS9 Board läuft eine Motorola CPU 6809 mit 3MHz. Alternativ kann auch eine Hitachi 6309 verwendet werden, diese CPU ist PIN kompatibel und Binärcode kompatibel. Hitachi hat aber viele Verbesserungen im Design der 6309 einfließen lassen. Die 6309 ist schneller, hat mehr Register, kann 32 Bit Operationen ausführen und hat zusätzliche Befehle.

Die 6309 gibt es in verschiedenen Versionen. Je nach 'Speed-Grade' der CPU ist die maximale (interne) Taktfrequenz 1, 1.5, 2 oder 3 MHz. Zudem gibt die Typen P und EP, der Unterschied ist die Taktsteuerung. Die P Typen erzeugen den Takt intern aus einem 4 fachen Grundtakt (12MHz für eine 3MHz 6309P). Die EP Typen brauchen einen externen Takt, den man mit externer Elektronik bilden muss. Bei beiden Typen steuert die CPU die äußere Beschaltung mit zwei Taktleitungen: E und Q. Die Takte E und Q sind 90° phasenverschoben. Das E Signal ist ähnlich dem PHI2 bei der 6502 CPU, man erkennt aus dem Signal die Gültigkeit der Daten am Adressbus.


Basierend auf der Doku des W65C02 Board für die ByteMachine, habe ich drei CPU Boards entwickelt. Eines für die 6309P, eines für die 6309EP und eines wo man beide CPU Typen (P und EP) verwenden kann:



Die CPU Boards laufen extrem stabil. Die Taktfrequenz ist sehr flexibel, die 63C09P läuft stabil mit 1, 2, oder 3 MHz. Versuche die CPU zu übertakten sind erfolgreich, bei 4 MHz ist keine Erwärmung feststellbar und es läuft seit einigen Tagen fehlerfrei durch. Eine 63B09EP läuft tadellos mit 2,5 MHz.


IO Boards

Das Mainboard der Byte Machine stellt 8 digitale Ausgänge und 8 digitale Eingänge zur Verfügung. Im GitHub existiert zudem ein aufsteckbares IO Board, das eine serielle Schnittstelle sowie den eine SD Karte bietet (IOexpander).

Leider ist sowohl die serielle Schnittstelle als auch die SD Karte nur an den digitalen IO des Mainboard angeschlossen. Es gibt keinerlei Hardware Unterstützung. Die serielle Schnittstelle ist eine reine Software basierte Lösung (Soft-UART). Die SD Karte wird ebenso per Bit-Bang bedient, was es extrem langsam macht und die Software ist sehr aufwendig.


Deswegen habe ich eigene IO Boards entwickelt:

  • IO Test Board mit 15 LED (zum Test des IO Port und Software Entwicklung)
  • UART Board auf Basis eines TL16C550 (serielle Kommunikation bis 115200Bd)
  • Nano IO Board mit UART und SD Card auf Basis eines Arduino Nano



Alle diese IO Boards verwenden einen IO Port zum Anschluss auf einem CPU Board. Es braucht dazu spezielle, erweiterte CPU Boards, die Standard CPU Boards der Byte Machine haben keinen IO Port. Die IO Ports werden einfach auf den neuen CPU Boards aufgesteckt, quasi als dritte Ebene.


Das IO Test Board hat 15 LED, mit einem geeigneten Test Programm kann damit die korrekte Funktion des IO Port überprüfen.

Die LED-0 bis 7 zeigen den Zustand der Datenleitungen D0 bis D7 bei einem Schreibzugriff auf einen IO Bereich IO-0.

Die LED IO-0 bis IO-6 zeigen den letzten Zugriff auf den zugehörigen IO-Bereich. Bei einem Lesezugriff wird die LED ausgeschaltet und bei einem Schreibzugriff eingeschaltet.



Erweiterte CPU Boards

Die erweiterten CPU Boards stecken auf dem Byte Machine Mainboard, genau wie die Basis CPU Boards. Aber sie bieten erweiterte Funktionalität die über eine reine CPU Funktion hinaus geht:

  • IO Port zum Anschluss von bis zu 8 IO Boards
  • optional: Banking Funktion um den ganzen Mainboard Speicher zugreifen zu können
  • optional: Speicher Management (MMU) um den Adressraum über einem MB verwalten zu können
  • optional: Interrupt Managment
  • optional: DMA Funktionalität


Es sind folgende CPU Boards in Entwicklung:

  • W65C02 mit 16MHz und Banking (4 x 16K in einem MB)
  • 6309 CPU mit MMU 6829 (32 x 2K in zwei MB)



Auf diese erweiterten CPU Boards können die IO Boards aufgesteckt werden. Damit hat man eine schnelle serielle Kommunikation und einen effizienten Zugriff auf eine SD Karte.

Das 6309 Board mit der MMU hat eine hoch effiziente Speicher Verwaltung, einen Adressraum von 2 MB und separate IO Bereiche. Zusammen mit dem Nano IO Board hat man eine Verbindung zur Außenwelt (Terminal) und einen 'Massenspeicher'. Damit ist es schon eine gute Basis, auf der man problemlos ein NitrOS9 Level II implementieren kann.


Die Hardware

Die Hardware ist wie im vorhergehenden Kapitel beschrieben:

  • ein Byte Machine Mainboard mit 512K RAM und 512K EPROM
  • ein erweitertes CPU Board (6309 + MMU)
  • ein Nano IO Board mit serieller COM und SD Karte


Sobald das System läuft wird es davon eine Single Board Version geben (NitrOS9 SBC).


Memory MAP

Das NitrOS9 Level 2 hat bestimmte Anforderungen an die Hardware. Neben den Mindestanforderungen von 128K RAM sollte auch das Banking bestimmten Anforderungen entsprechen. Der Grund ist die Multitasking Fähigkeit von NitrOS9, das erfordert eine blitzschnelle Umschaltung zwischen verschiedenen Speicherbelegungen (Memory Maps).

Der physikalische Adressraum hat eine Größe von 2MB. Dem gegenüber steht eine CPU die nur 64K adressieren kann (logischer Adressraum). Diese Diskrepanz wird gelöst durch den Einsatz einer MMU von Motorola (MC6829).


Der Physikalische Adressraum hat eine Größe von 2MB und ist in 1024 Seiten (Pages) zu je 2K (Page $000 bis $3FF) unterteilt.

Die MMU splittet den logischen Adressraum (64K) auf in 32 Blöcke zu je 2K. Jeder dieser 2K großen Blöcke kann nun irgendwo im physikalischen Adressraum liegen (in 2K Schritten). Es erfolgt also eine Zuordnung von Block zu Page.

Es sind 32 Blöcke die einem der 1024 Pages zugeordnet werden. Dazu gibt es 32 Zeiger zu je 10 Bit (zwei Bytes), also insgesamt 64 Bytes, die eine ganze Speicherbelegung (Memory Map) beschreiben.

Die Memory MAP ermöglicht einen sehr flexiblen Zugriff auf den gesamten physikalischen Adressraum. Zudem kann das Block Mapping dynamisch verändert werden, sodass die CPU stets die gerade wichtigen Teile des physikalischen Adressraum im Zugriff hat.



Speicher Management (MMU)

Das NitrOS9 Level 2 hat bestimmte Anforderungen an die Hardware. Neben den Mindestanforderungen von 128K RAM sollte auch das Banking bestimmten Anforderungen entsprechen. Der Grund ist die Multitasking Fähigkeit von NitrOS9, das erfordert eine blitzschnelle Umschaltung zwischen verschiedenen Speicherbelegungen (Memory Maps).


Der Physikalische Adressraum hat eine Größe von 2MB. Dem gegenüber steht eine CPU die nur 64K adressieren kann. Diese Diskrepanz wird gelöst durch den Einsatz einer MMU von Motorola (MC6829).


Das bedeutet Platz ohne Ende:

Jeder Task kann die gesamten 64K voll RAM haben (kein einziges Byte verschwendet für ROM oder IO) beim Aufruf einen OS9 Service oder eines Interrupts wird automatisch in den System Task#0 geschaltet Jeder Task kann zusätzlichen RAM anfordern über einen Banking Bereich man kann gemeinsame RAM Bereiche haben mit anderen Tasks es braucht keinen IO und keinen ROM Bereich (das handelt das OS9) der Speicher ist geschützt das OS und die IO sind geschützt es gibt 4 Tasks (Speicher Belegungen) - 0: System, 1: DMA, 2,3: User man könnte es erweitern auf bis zu 32 Tasks, es lassen sich bis zu 8 MMU ganz einfach kaskadieren




Der physikalische Adressraum hat eine Größe von 2MB und ist in 1024 "Pages" unterteilt.


Der Adressraum der CPU hat natürlich nur 64K und ist in 32 Blöcken zu je 2K aufgeteilt.


Jeder dieser 32 Blöcke kann auf jede Page verschoben werden.

So erhält die CPU einen sehr flexiblen Zugriff auf den gesamten physikalischen Adressraum von 2MB.


Die CPU sieht also 32 Speicher Blöcke, wo jeder dieser Blöcke irgendwo im physikalischen Adressraum liegen kann.

Dazu braucht es 32 Zeiger mit 10 Bit Breite um diese Speicher Map zu beschreiben.

Dieses Set aus 32 Zeiger wird als TASK bezeichnet.


Eine MMU verwaltet 4 Tasks, also 4 x 32 Zeiger auf den physikalischen Adressraum.

Man kann bis zu 8 MMU kaskadieren um bis zu 32 Tasks zu haben.


Um von einer Speicher Map zu einer anderen zu schalten, muss man nur die Tasknummer in die MMU schreiben.

So macht Multitasking richtig Spaß ...


Die MMU kann aber noch mehr.

Sie erkennt automatisch einen Reset, einen IRQ oder einen SWI Befehl.

Und sie wechselt automatisch in den System Task.

Die CPU legt noch brav die Register und Rücksprungadresse auf den Stack ...

... dann schaltet die MMU um auf Task#0 und die CPU fetched den Vektor für IRQ oder SWI.


Dazu gibt es "priviligierten Code".

Nur der Task#0 "sieht" die MMU Register.

Daher kann kein User Task und auch nicht der DMA die Speicherkonfiguration verändern.

Der Speicher ist perfekt geschützt.

Ein User Programm kann das System nicht zerstören.

Es läuft in seiner virtuellen Speicher Welt die das OS eingestellt hat und kommt nicht heraus.



Das geht schon in die Richtung, die beim PC erst seit dem Intel 386 funktionieren.

Der ist natürlich 16/32 Bit breit, und hat das ganze Paging voll integriert in der CPU.


Inbetriebnahme

Voraussetzung ist ein sauber funktionierendes Byte Machine mit 12NHz Quarz. Die Funktion des Mainboard kann man mit jedem CPU Board testen (Knight Rider Testcode).


Das OS9 Board mit MMU wird bestückt. Das GAL 22v10 muss mit dem korrekten JEDEC beschrieben werden (zB. mit einem TL866 Programmer). Die CPU sollte ein C Typ sein (63C09P), sonnst muss man die Frequenz des Quarz entsprechend anpassen



Das Betriebssystem

Zum Einsatz kommt NitrOS9 Level II. Die Basis dafür ist der Quellcode des NitrOS9 für den Tandy CoCo-III. Das NitrOS9 wird angepasst auf die im vorigen Kapitel beschriebene Hardware Plattform (NitrOS9 SBC).



News

  • 29.04.2022 -- Layout des OS9 Board
  • 13.03.2022 -- Aufbau und erste Versuche mit der ByteMachine


Downloads



Links