014
22.01.2009, 17:36 Uhr
jmueller
|
> ...nicht korrekter Emulation von Speicherbereichen die nicht dekodiert werden Und was wird deiner Meinung nach vom Datenbus gelesen, wenn kein Schaltkreis ein Signal liefert und sonst auch keine Pull-Up/Down-Widerstände da sind?
Also ein Fehler ist in der Emulation drin: Die in den Einstellungen angegebene RAM-Größe (17 und 33 KByte) wird ignoriert, d.h., beim BCS3 wird der RAM nur bis 3FFF emuliert. Das ist aber für das Anzeigeproblem erstmal unerheblich.
Ich habe nun einfach mal den Emulator so umprogrammiert, dass nicht belegte Speicherbereiche statt FF das Byte 00 liefern. Und schon geht die Anzeige bei SE 3.1, aber nicht mehr die von SE 2.4! Konkret erscheint bei jedem LIST "-16984B", und man kann auch keine BASIC-Zeilen mehr eingeben!
Daraufhin habe ich nun durchgebuggt und einen Fehler im SE3.1-ROM gefunden: An 0200 wird der Speicher getestet, und zwar wird ab 3FDE jede Speicherzelle zuerst mit FF beschrieben und verglichen und anschließend das Gleiche mit 00. Wenn einer der beiden Vergleiche fehlschlägt, bricht die Schleife ab und merkt sich in 3C04 den aktuellen Wert, d.h. "RAM-Ende + 1". Wenn nun aber diese Speicherzelle zufällig FF liefert (so wie in JKCEMU V 0.2), schlägt der erste Vergleich nicht fehlt, sondern erst der zweite. In dem Fall wird aber der Adresszeiger (HL) vor dem Schleifenabbruch nocheinmal inkrementiert, d.h., in 3C04 wird "RAM-Ende + 2" hineingeschrieben.
Für die Anzeige/Berechnung der freien Bytes wird dann mit der Routine auf 03A9 von "<Wert in 3C04> - 1" abwärts die Null-Bytes gezählt, und fängt dann statt bei RAM-Ende bei RAM-Ende + 1 an. Da dieses Byte aber FF und nicht 00 hat, kommt nur 1 Byte als frei zustande.
Beim BASIC-SE 2.4 wird mit der Routine ab 031D das RAM-Ende ermittelt und in 3C00 eingetragen. Hier ist kein Bug drin. Für die Anzeige der freien Bytes beim LIST zählt das Unterprogramm ab 02FE die Anzahl der 00-Bytes hinter dem BASIC-Programm. Wenn nun der nicht belegte Speicherbereich hinter dem RAM zufällig 00 liefert, wird das mitgezählt. Die negative Zahl kommt dann durch einen Überlauf zustande (mehr als 32767 freie Bytes).
Insoweit gesehen, sind sowohl BASIC-SE 2.4 als auch 3.1 fehlerhaft. Mich würde nun interessieren, welches Byte der Original-BCS3 von unbelegten Speicherbereichen liest. 00 und FF können es jedenfalls nicht sein, denn sonst würde ja jeweils eine BASIC-Version nicht richtig funktionieren. Und Pull-Up- oder Pull-Down-Widerstände kann ich auf dem Schaltplan nicht finden.
Ich lasse jetzt in der BCS3-Emulation von nicht belegten Speicherbereichen einfach 0x0F lesen und schon geht es mit SE 2.4 und SE 3.1. Des weiteren werde ich auch die Einstellmöglichkeit für 33K RAM entfernen, da bei dieser nämlich bei beiden BASIC-Varianten ein Überlauf auftritt und die Eingabe von BASIC-Zeilen nicht möglich ist.
Gruß Jens |