083
28.03.2024, 16:52 Uhr
Ordoban
|
Ich hab mich mal mit dem Emulator und MUTOS beschäftigt. Um MUTOS zum laufen zu bekommen gibt es 5 Probleme zu lösen:
1. Disk-Image Das Einlesen des Disk-Images bringt eine Exception. Das liegt am Disk-Image, ich habe aber keine Möglichkeit das zu reparieren. Deshalb ein Patch im Emulator.
Quellcode: | diff --git a/src/a7100emulator/Tools/FloppyImageParser.java b/src/a7100emulator/Tools/FloppyImageParser.java index 707820a..28e1e12 100644 --- a/src/a7100emulator/Tools/FloppyImageParser.java +++ b/src/a7100emulator/Tools/FloppyImageParser.java @@ -342,7 +342,7 @@ disk.checkAndAddDiskGeometry(cylinderNumber, headNumber, sectorNumber, sectorSizeBytes); - if (!BitTest.getBit(flags, 5) && !BitTest.getBit(flags, 6)) { + if (!BitTest.getBit(flags, 5) /*&& !BitTest.getBit(flags, 6)*/) { int dataBlockSize = (buffer[pos++] & 0xFF) | ((int) buffer[pos++]) << 8; int encoding = buffer[pos++]; switch (encoding) {
|
Danach bootet der zwar von Diskette, läuft aber beim Start in einen Trap.
2. Die KES-Initialisierung ist fehlerhaft. Die echte KES liest beim ersten Wakeup nach dem Reset nur WUP und CCB ein, setzt dann das Fertig-Flag im CCB und sonst nichts. Der Emulator liest die ganze Kette bis zum IOPB ein, und führt diesen aus. Da zu diesem Zeitpunkt weder CIB noch IOPB initialisiert sind schlägt das Fehl, die Simulierte KES schreibt die Fehlernummer in den Hauptspeicher, und überschreibt damit irgendwas wichtiges vom MUTOS. Beim SCP erwischt der dabei anscheinend nichts wichtiges.
Quellcode: | diff --git a/src/a7100emulator/components/modules/KES.java b/src/a7100emulator/components/modules/KES.java index 44a5f96..5f87b82 100644 --- a/src/a7100emulator/components/modules/KES.java +++ b/src/a7100emulator/components/modules/KES.java @@ -156,7 +156,6 @@ case 0x00: // RESET_OFF // System.out.println("RESET OFF"); - readWUB = true; interruptWaiting = false; break; case 0x01: @@ -165,6 +164,7 @@ startOperation(); break; case 0x02: + readWUB = true; // WUB wird nur einmal nach dem Reset eingelesen // RESET // System.out.println("RESET"); break; @@ -223,6 +223,8 @@ int off = mms16.readMemoryWord(INIT_WUB_ADDRESS + 2); ccbAddress = (seg << 4) + off; readWUB = false; + mms16.writeMemoryByte(ccbAddress + 0x01, 0x00); // nach Reset nur RDY-Flag setzen + return; // sonst nichts, da CIB und IOPB moch nicht initialisiert sind. } for (int i = 0; i < 30; i++) { if (i < 16) {
|
Damit läuft der nicht mehr in den Trap, kommt aber immer noch nicht in den Login.
3. Die Tastatur-Initialisierung schlägt manchmal fehl. MUTOS meldet beim Start Console Data 00D8 Timer 2 NOT found. und lädt in einer Endlosschleife Dateien von der Diskette. Schaut man sich den MUTOS-Quelltext an, dann findet man das hier: (/usr/sys/io/cons_NOBIOS.c)
Quellcode: | if(constyp != 5) { outb(cons->c_control,DTRON); delay(10); outb(cons->c_control,0); delay(10); outb(cons->c_control,SRESET); outb(cons->c_control,SMODE); outb(cons->c_control,0x17); if((inb(cons->c_control)&0xf) != 0x5) a = 0x0; } else { cons->c_control = cons->c_ocontrol; cons->c_data = cons->c_odata; } if(Stand == 0) printf("Console Data %x Timer %d %s.\n",cons->c_data,cons->c_tunit,a?"found":"NOT found"); consali = a;
|
MUTOS resettet/initialisiert den UART zur Tastatur, und erwartet dann den Status "Sendebereit, Empfangsbuffer leer" (= 0x5). Durch den Reset des UART wird allerdings auch eine Aktion in der Tastatur ausgelöst, und die schreibt etwas in den Empfangsbuffer. Dadurch wird (inb(cons->c_control)&0xf) == 0x7, und MUTOS erkennt die Tastaur als fehlerhaft. Das passiert nicht immer, sondern ist von mehreren Faktoren abhängig. Es macht z.B. einen Unterschied, ob 2 oder 3 OPS aktiviert sind, oder ob man beim Starten schnell genug das Disketten-Image auswählen kann oder mit "B" booten muss. Einen wirklichen Fix für dieses Problem habe ich nicht gefunden, man kann aber auf die Boot-Meldung achten, und eventuell direkt nochmal von vorn beginnen.
Damit kommt man wieder ein Stückchen weiter, MUTOS gibt ein "s" aus, und hängt dann fest. Madir hatte schon in #026 geschrieben, dass MUTOS auf ein Interrupt wartet. Das kann ich bestätigen.
4. Keine Konsolen-Ausgabe Bis zur Login-Meldung benutzt MUTOS eine kleine interne Ausgabe-Routine (mit Polling), danach den Konsolen-Treiber. Der Konsolen-Treiber verlangt nach jedem Zeichen ein Interrupt. Der quittiert den Interrupt im KGS aber nur gelegentlich, vermutlich wenn der Ausgabebuffer leer ist. Ich verstehe nicht, wie das Interrupt-System beim MUTOS funktioniert. Ich denke, dass MUTOS einen Interrupt-Modus benutzt, den der Emulator nicht unterstützt. Level triggered mode? Edge triggered mode? Ich habe die Beschreibung vom 8259 gelesen, aber ich verstehe nicht alles. Als eine vorläufige, aber inkorrekte Lösung hätte ich das hier:
Quellcode: | diff --git a/src/a7100emulator/components/ic/K580WN59A.java b/src/a7100emulator/components/ic/K580WN59A.java index 39a49b5..887245f 100644 --- a/src/a7100emulator/components/ic/K580WN59A.java +++ b/src/a7100emulator/components/ic/K580WN59A.java @@ -202,6 +202,10 @@ //System.out.println("Interrupt Anfrage " + id + " akzeptiert!"); irr |= (1 << id); } + if (!BitTest.getBit(ocw1, 7) && id==2) { + irr |= (1 << 7); + } } /**
|
Dadurch wird immer, wenn ein Timer-Interrupt (2) ausgelöst wird, auch ein KGS-Interrupt (7) gesetzt. Das ist total bescheuert - aber funktioniert. Jetzt kommt man bis zum single user login, danach hängt der wieder fest.
5. CPU-Bugs Ich habe am letzten Stück eine ganze Weile gesucht. Schließlich bin ich auf die Idee gekommen, meine eigenen CPU-Bugfixes zu probieren: https://gitlab.com/Stefan311/a7100-emulator/-/commit/5fc5728aa073e97645bcdf220366ed0366ed6214
Und siehe da: läuft.
Das ganze ist alles andere als perfekt. Durch den irren Interrupt-Hack ist die Textausgabe sehr langsam. Die Tastatureingabe ist auch nicht gut, der verliert oft Tasten.
Mein Ziel ist es MUTOS auf dem A7100 von der IDE-Festplatte booten zu lassen. Um den Bootprozess von MUTOS zu verstehen, und um IDE-Bootcode komfortabel testen zu können, ist der Emulator eine große Hilfe. Der Emulator hat mir schon bei dem SCP-Bootcode sehr geholfen. Also einmal ein riesen Danke an Madir! -- Gruß Stefan |