Benchmarko Logo
Benchmarko Logo
Home
Projekte
CPCEMU
Software
Download
Kontakt
Links

Englisch Französisch Spanisch
 
zurück

CPCEMU - Interna

7. Interne Informationen zu CPCEMU

Dieses Kapitel soll ein paar Hintergrundinformationen liefern und die Frage beantworten, WARUM muß ich jetzt dies und das machen. Auch wird das leistungsfähige Debug-Menü erklärt und die Datenformate zu den Disketten-Abbildern und den Snapshots aufgeführt.
Ich gebe hier also Informationen, die Sie als Anwender von CPCEMU nicht unbedingt wissen müssen. Allerdings können sie manchmal ganz nützlich sein.
Ich habe diese Informationen absichtlich an das Ende, noch nach den geschützten Warenzeichen gesetzt, damit die relative "relative Bedeutungslosigkeit" deutlich wird.
Wenn Sie keinen Spaß an unverständlichen Sätzen und unstrukturierten Informationen haben, dann lesen Sie nicht weiter! Springen Sie direkt zum Anhang.

 

WARNUNG: Weiterlesen auf eigene Gefahr!

 

7.1 Inhaltsverzeichnis zu Kapitel 7

7.2 Interne Übersicht über die Leistungsmerkmale von CPCEMU
7.2.1 Die Z80-CPU (Der Prozessor)
7.2.2 Das Gate-Array (Der "Hilfsprozessor")
7.2.3 Das PAL (Programmable Logic Array)
7.2.4 Der CRTC 6845 (Cathode Ray Tube Controller)
7.2.5 Die PIO 8255 (Programmable Input-Output)
7.2.6 Der PSG (Programmable Sound Generator)
7.2.7 Der FDC (Floppy Disc Controller)
7.2.8 Die Centronics-Druckerschnittstelle
7.3 Das Debug-Menü
Aufbau des Debug-Menüs
Vorbemerkungen
Übersicht über die Kommandos
Registermanipulationen
7.4 Die Speicherverwaltung
7.4.1 Noch einmal zur EMS-Konfiguration
7.4.2 Realisierung des Bankings
7.5 ROM-Modifikationen
7.5.1 ROM-Bypass für die Kassette
7.5.2 Modifikationen am AMSDOS-ROM
7.6 Verschiedenes
7.6.1 Noch einmal: Die Konfigurationsdatei
7.6.2 Der parallele Adapter
7.6.3 CPCTRANS
7.7 Aufbau einiger CPCEMU-Dateien
7.7.1 Disketten-Abbilder
7.7.2 Snapshot-Dateien
7.7.3 AMSDOS-Header
7.7.4 Poke-Datenbank
7.8 Interne History

 


 

7.2 Interne Übersicht über die Leistungsmerkmale von CPCEMU

Wie kompatibel ist CPCEMU wirklich?

 

7.2.1 Die Z80-CPU (Der Prozessor)

  • Es werden alle Z80-Befehle emuliert, auch sogenannte illegale Befehle.
  • Es gibt eine langsame Z80-Emulation in C und eine schnelle Emulation in Assembler von Jürgen Weber.
  • Durch die COCPU-Technik, bei der jeder Befehl von den beiden Emulationsarten gleichzeitig ausgeführt wird und danach die Register verglichen werden, wurden zahlreiche Fehler gefunden. Natürlich wurde dies nur während der Programmentwicklung benutzt. Die langsame Z80-Emulation können Sie vom Debug-Menü aus aktivieren.
  • Nur dem Emulator bekannte Zusatzbefehle der Form ED FC xx, darunter auch der User-Break ED FC FC USER &BCFC.
  • kein exaktes Timing der Befehle aber Zeit-Kalibrierung im Ectzeit-Modus

 

7.2.2 Das Gate-Array (Der "Hilfsprozessor")

  • alle 32 Farben des CPC (27 verschiedene)
  • alle 3 Bildschirmmodi (X x Y x Farben):
    • Modus 0 = 160x200x16
    • Modus 1 = 320x200x4
    • Modus 2 = 640x200x2
  • einfache Multi-Modes
  • ROM-Banking (16KB OS, 16KB BASIC, 16KB AMSDOS, und sonstige Zusatzroms)
  • Farbbalken flimmern

 

7.2.3 Das PAL (Programmable Logic Array)

Das PAL ist zwar logisch über die gleiche Adresse wie das Gate-Array zu programmieren, hardwaretechnisch aber davon getrennt.

  • RAM-Banking (128 KB, bis zu 576 KB), mit EMS oder konventionellem Speicher.
  • Mit emuliertem EMS ist es recht flott, da die die Umschaltung per Hardware geschieht. Sie können eine Dk'tronics kompatible Speichererweiterung mit bis zu 576 KB RAM benutzen.
  • Ohne EMS ist RAM Banking sehr langsam, da Speicherblöcke vertauscht werden müssen. Außerdem haben Sie ohne EMS höchstens 128 KB RAM zur Verfügung.

 

7.2.4 Der CRTC 6845 (Cathode Ray Tube Controller)

  • Bildschirmstart, -offset für Hardware-Scrolling
  • verschiedene Bildschirmgrößen von 0x0 bis 80x25 mittels CRTC-Register 1 und 6
  • unterschiedliche Zeichengrößen (1..7) mit CRTC-Register 9
  • für Multi-Modes werden noch einige andere Register benötigt.
  • Overscan wird noch nicht unterstützt.

 

7.2.5 Die PIO 8255 (Programmable Input-Output)

  • Tastatur (über den PSG)
  • VSYNC-Emulation: Bit zwischen zwei Interrupts während des Bildaufbaus gesetzt, die Position legen Sie fest.
  • Kassetten besonders schnell durch ROM-Bypass der den Zugriff auf beliebige DOS-Dateien ermöglicht.
  • VSYNC-Bit ist zu lange gesetzt
  • Kassetten-Bits werden nicht emuliert, somit können Sie die meisten Kassetten-Kopierprogramme nicht einsetzen, die direkt auf die Ports zugreifen

 

7.2.6 Der PSG AY 3-8912 (Programmable Sound Generator)

  • Entweder über den PC Lautsprecher (schrecklich, da 3 Kanäle auf einen gemischt werden müssen und die Lautstärke nicht geändert werden kann), eine GUS-Soundkarte oder eine Soundblaster-Karte. Von der Soundblaster-Karte wird entweder der digitale Teil benutzt, was perfekten Sound mit Geräuschen ergibt oder nur der Adlib-kompatible FM-Teil ohne Geräusche.
  • keine Digital-Sounds möglich oder zu langsam.

 

7.2.7 Der FDC 765 (Floppy Disc Controller)

  • Alle notwendigen FDC-Kommandos, um die Laufwerke A und B zu steuern (dazu gehören Sektor lesen/schreiben, Spur suchen/formatieren, Sektor-ID lesen, ...)
  • Sehr flexible Disketten-Formate (bis zu 18 Sektoren pro Spur).
  • Darunter auch doppelseitige Formate, z.B. VORTEX.
  • Komplizierte kopiergeschützte Formate werden intern nicht verarbeitet.

 

7.2.8 Die Centronics-Druckerschnittstelle

  • Druckerausgabe auch mit 8-Bit-Druckerpatch, wird auf die durch PRINTER definierte Datei umgeleitet.

 


 

7.3 Das Debug-Menü

Von sowas hätte ich damals auf dem CPC nur geträumt! Es wird der komplette CPU-Zustand des Z80 angezeigt und Sie können ihn modifizieren. Der Speicher kann "gedumped", disassembliert oder modifiziert werden, Speicherauszüge (Programme) lassen sich laden oder speichern.

Und das Interessanteste:
Sie können die Code-Ausführung im Single-Step-Mode verfolgen! (Ähnlich wie bei einem richtigen Debugger).

 

Aufbau des Debug-Menüs:


R)un T)race S)tep  A)ssem D)ump I)nput  L)oad saV)e  fiN)d  F)ast Q)uit
AF=0000 BC=0000 DE=0000 HL=0000 IX=0000 IY=0000 SP=0000 PC=0000 IR=0000
AF'=0000 BC'=0000 DE'=0000 HL'=0000 IFF1=0 IFF2=0 IMD=0  NZ NC PO P
0000 : 01 89 7F       LD BC,&7F89
f->

In der ersten Zeile werden die verfügbaren Kommandos angezeigt (die Großbuchstaben). In den beiden nächsten Zeilen stehen die aktuellen Inhalte der Register. Darunter steht der disassemblierte aktuelle Befehl an Position PC. In der letzten Zeile wartet ein Prompt auf Ihre Eingabe. ("f" zeigt an, daß Sie gerade die Fast-CPU benutzen.)

 

Vorbemerkungen

  • In eckige Klammern eingeschlossene Parameter sind optional [opt.].
  • Zahleneingaben alle hexadezimal, z.B. <Adresse> = 0000 bis ffff.
  • "<ret>" zeigt an, daß Sie in einem speziellen Modus sind und <RETURN> drücken sollen, um fortzufahren. <String><RETURN> verläßt diesen Modus (d.h. z.B. b<RETURN>).
  • Kommandos bestehen aus einem Buchstaben, meistens gefolgt von einer optionalen Adresse. Zwischen Kommando-Buchstabe und dieser Adresse muß dann ein Leerzeichen oder Tab stehen.
  • Ohne Angabe einer Adresse wird als Standard-Wert PC (Programmzähler) angenommen.

 

Übersicht über die Kommandos

R)un:
r [<Adresse>] : startet die Emulation ab PC oder der optional angegebenen Adresse. Beispiele:
  • f-> r startet die Emulation ab PC
  • f-> r 100 setzt PC auf 0x100 und startet die Emulation
T)race (Trace into):
t [<Adresse>] : führt wirklich nur den aktuellen Befehl aus. Benutzen Sie <RETURN> um fortsetzen oder <string><RETURN>, um zurück in den normalen Modus zu wechseln.
Alle Einzelschrittbefehle werden von der Slow-CPU ausgeführt (selbst wenn "-f->" angezeigt wird), da in der Fast-CPU kein Zähler mehr existiert.
S)tep (Step over):
s [<Adresse>] : führt den aktuellen Befehl aus, eigentlich alle Befehle, bis PC auf dem direkt nachfolgenden Befehl steht, was z.B. bei einem "Ret" recht lange dauern kann. In diesem Fall hilft (wie immer) F10.
Alle Einzelschrittbefehle werden von der Slow-CPU ausgeführt (selbst wenn "-f->" angezeigt wird), da in der Fast-CPU kein Zähler mehr existiert.
A)ssemble (eigentlich Disassemble):
a [<Adresse>] : disassembliert die nächsten 16 Befehle. Benutzen Sie <RETURN> um fortsetzen oder <string><RETURN>, um zurück in den normalen Modus zu wechseln.
D)ump:
d [<Adresse>] : zeigt einen Hex-Ascii-Speicherauszug der nächsten 256 Bytes ab PC oder Adresse an. Benutzen Sie <RETURN> um fortsetzen oder <string><RETURN>, um zurück in den normalen Modus zu wechseln.
I)nput (Speicherstellen modifizieren):
i [<Adresse>] : zeigt die Speicherstelle mit aktuellem Inhalt an, der durch <RETURN> bestätigt oder durch <hexzahl><RETURN> verändert werden kann. Verlassen wird der Input-Modus mit einer ungültigen Zahl, z.B. -1<RETURN>.
L)oad (Laden eines Programms):
l [<Adresse>] : fragt nach dem Dateinamen <Name> und lädt dann die Datei <Name> aus dem Verzeichnis TAPE_PATH nach <Adresse> Ein AMSDOS-Header wird erkannt. Siehe Anhang "Aufbau des AMSDOS-Headers". Falls Sie bei dem Dateinamenprompt nur <RETURN> eingeben, erscheint das schon bekannte Dateiauswahl-Menü. Beispiele:
  • f-> l<RETURN> demo<RETURN> :
    lädt Datei "demo" an den aktuellen PC
  • f-> l a000<RETURN> myprog<RETURN> :
    lädt Datei "myprog2" nach 0xA000
saV)e (Speichern eines Programms):
v [<Adresse>] : fragt nach dem Dateinamen <Name> und der Länge des Speicherbereichs. Dieser wird dann ab <Adresse> (oder eben PC) abgespeichert, und zwar im Verzeichnis TAPE_PATH als Binärdatei, d.h. mit AMSDOS-Header. Siehe Anhang "Aufbau des AMSDOS-Headers". Beispiel:
  • f-> v<RETURN> demo<RETURN> 4000<RETURN> :
    speichert "demo" ab PC mit der Länge 0x4000.
fiN)d (Suchen einer Bytefolge):
n : Wie bei I)nput muß zuerst eine Bytefolge eingegeben werden, nach der gesucht werden soll. Dabei kann "??" (oder "?") als Platzhalter für ein beliebiges Byte eingesetzt werden. Das macht natürlich nur Sinn innerhalb einer Bytefolge.
Es werden dann die gerade aktiven 64KB Speicher durchsucht und alle Adressen ausgegeben, wo diese Bytefolge beginnt.
F)ast (Z80-Emulationsart wählen):
f : Wechselt zwischen der schnellen Z80-Emulation (entwickelt in Assembler von Jürgen Weber, Standardeinstellung) und der langsamen (in C geschriebenen).
Das Prompt-Symbol wechselt dann zwischen "-f->" für schnell (fast) und "-s->" für langsam (slow).
Alle r, s, t-Kommandos beziehen sich dann auf die gewählte Z80-Emulationsart.
Q)uit (Beenden des Programms):
q : beendet den Emulator.

 

Registermanipulationen

Neben den Buchstabenkommandos gibt es auch Befehle zum Setzen der Register mit der Syntax: "<Register>=<Hex-Wert>" Beispiele:

  • af=345 : setzt Register AF auf 0x0345
  • pc=a000 : setzt Programmzähler auf 0xA000

Sie können auch einfach "<Register><Leerzeichen><Hex-Wert>" schreiben. Alle Z80-Register lassen sich verändern, also AF, BC, DE, HL, IX, IY, SP, PC, IR, AF', BC', DE', HL', zusätzlich IFF1, IFF2 und IMD.

 


 

7.4 Die Speicherverwaltung

 

7.4.1 Noch einmal zur EMS-Konfiguration

Sie brauchen einen Expanded Memory Manager nach dem LIM 4.0 Standard (LIM EMS 4.0). Dieser Memory-Manager muß sogenannte erweiterte EMS-Seiten bieten. CPCEMU benötigt 6 solcher Seiten an zusammenhängenden Adressen.
Falls EMS benutzt wird, erscheint beim Start des Programms die Meldung "EMS xxx Bytes ok".
Unter OS/2 2.x wurde Ihnen vorgeschlagen, die folgenden Einstellungen zu benutzen:

EMS_FRAME_LOCATION = auto
EMS_HIGH_OS_MAP_REGION = 32 (oder mehr)
EMS_LOW_OS_MAP_REGION = 0   (oder mehr)

Was bedeuten die Einstellungen?

Die Low-Region bezeichnet EMS-Seiten im konventionellen Speicher. Falls CPCEMU dortige EMS-Seiten benutzen soll, müssen mindestens 6*16KB = 84KB vorhanden sein.
Die High-Region bezeichnet EMS-Seiten im Speicher oberhalb von 640K, der zum Standard-Rahmen von 64KB hinzugenommen wird, muß also mindestens 2*16KB = 32KB sein.

Unter DOS wurde Ihnen vorgeschlagen, folgende Zeilen in CONFIG.SYS zu benutzen:

DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE 1024
...

Die 1024 kann auch vergrößert oder verkleinert werden, je nach Hauptspeicher Ihres Rechners.

Erläuterungen:

EMM386 bietet zahlreiche zusätzliche Seiten im konventionellen Speicher. Die Untergrenze dieser Seiten kann mit der Option /B=<Segment> geändert werden (Standard ist 4000).
Mit /P<Nummer>=<Segment> soll es auch möglich sein, einzelnen physikalischen Seiten andere Segmente zuzuweisen.

 

7.4.2 Realisierung des Bankings

Banking wird auf einigen Heimcomputern benutzt, die RAM und ROM an der gleichen Adresse haben. Lesezugriffe adressieren das ROM, Schreibzugriffe das RAM.

Der Amstrad CPC hat 64K RAM und 16K ROM im Bereich 0-3FFF und ein weiteres ROM an C000-FFFF:

0 RAM 0000-3fff
1 RAM 4000-7fff
2 RAM 8000-bfff
4 RAM c000-ffff
L ROM 0000-3fff
U ROM c000-ffff

Die wesentliche Idee ist, verschiedene Segmente zum Lesen und Schreiben zu haben. Bei jedem Lesezugriff wird ein Lese-Offset zu der gewünschten Adresse addiert, das gleiche wird mit einem Schreib-Offset für das Schreiben gemacht.


          Zustand 0           Zustand 1

block 5   M       L   c          0       <
block 4   M    W  C   c          C   c    | vertauscht beim
block 3   M    W  8 b c       W  8 a c    | Zustandswechsel
block 2   M    W  4 b c       W  4 a c    |
block 1   M    W  0 b         W  L a c   <
block 0   M       U b         W  U a

(M = konventioneller Speicher oder physikalische EMS-Seiten)

a = unteres ROM an, oberes ROM an
b = unteres ROM aus, oberes ROM an
c = unteres ROM an, oberes ROM aus
W = unteres ROM aus, oberes ROM aus
  • Um zwischen den beiden Zuständen zu wechsen, müssen nur die Blöcke "0" und "L" vertauscht werden.
  • Für RAM Banking muß eine neue "0" mit der alten vertauscht werden. UROM Auswahl geschieht durch Kopieren des neuen ROMs nach "U".
  • Mit EMS Speicher wird das gesamte Banking von der Hardware (oder deren Emulation) übernommen. Dieses erhöht die Geschwindigkeit besonders in BASIC und CP/M Plus.

Jetzt verstehen Sie, warum 6 zusammenhängende physikalische EMS-Seiten notwendig sind und der Standard-Rahmen mit 4 Seiten nicht reicht.

 


 

7.5 ROM-Modifikationen

 

7.5.1 ROM-Bypass für die Kassette

Nach dem Befehl "|TAPE", oder wenn Sie das AMSDOS-ROM ausgeschaltet haben, wird die "Kassette" angesprochen. Kassettenzugriffe werden dabei in Dateizugriffe auf die einzelnen Dateien eines speziellen Verzeichnisses umgeleitet.
Realisiert wird diese Umleitung mittels eines "ROM-Bypass".

Durch "TAPE_BYPASS=1" schalten Sie den ROM-Bypass der TAPE-Vektoren ein. Falls ein bekanntes ROM vom CPC 464/664/6128 gefunden wurde, wird das ROM automatisch modifiziert.
Der Bypass ist nötig, wenn Sie Kassetten-Dateien benutzen möchten.

Es wurden Spezialbefehle eingeführt, die eine bestimmte Funktion des Emulators aufrufen. Diese Befehle werden direkt in das ROM eingetragen, so daß das Patchen der RAM-Vektoren auch weiterhin möglich ist. Als Befehle wurden eingeführt:

ED FC xx USER &BCxx (nur gültig für einige RAM-Vektoren)

Entspricht einem Call-Befehl zu einer internen Funktion, wobei für xx folgende Werte gültig sind:

65 CASSETTE INIT (BC65)
77 CASSETTE IN OPEN (BC77)
7A CASSETTE IN CLOSE
7D CASSETTE IN ABANDON
80 CASSETTE IN CHAR
83 CASSETTE IN DIRECT
86 CASSETTE RETURN
89 CASSETTE TEST EOF
8C CASSETTE OUT OPEN
8F CASSETTE OUT CLOSE
92 CASSETTE OUT ABANDON
95 CASSETTE OUT CHAR
98 CASSETTE OUT DIRECT
9B CASSETTE CATALOG

Zusätzlich gibt es noch den User-Break-Befehl "ED FC FC USER &BCFC", der die Emulation sofort anhält.

 

7.5.2 Modifikationen am AMSDOS-ROM

  • Durch "AMSDOS_DISABLE=1" verbieten Sie die Initialisierung des AMSDOS.

    Dann werden die Kassetten-kompatiblen Befehle nicht von AMSDOS gepatched. (Es werden also weiterhin die TAPE-Vektoren verwendet.) Das ist nötig, wenn ein Programm zwischendurch das AMSDOS-ROM initialisiert, aber ohne |TAPE-Befehl von Kassette weiterladen soll. (Realisiert durch "POKE &CCF2,&18: POKE &CCF3,&05" im AMSDOS-ROM.) Die Sektorbefehle bleiben unbeeinflußt, sie gehen immer auf Diskette.

  • "AMSDOS_SPEEDUP=1" führt eine AMSDOS-ROM-Modifikation durch, bei der die Motor-Wartezeiten minimiert werden, um einen schnelleren Disk-Zugriff zu ermöglichen. (Die Sachen werden ja von DOS gesteuert, somit brauchen wir die Warteschleifen nicht.)

    Folgende Speicherstellen im AMSDOS-ROM werden verändert:

    • POKE &C5D4,&01 : Zeit für Motor-Hochlauf
    • POKE &C5D8,&01 : Zeit bei Spur-Formatieren
    • POKE &C5D9,&01 : kürzer warten
    • POKE &C5DA,&01 : kürzer warten
    • POKE &C602,&01 : nur 1 Versuch bei Fehler
    • POKE &C784,&01 : schnelles Spur suchen
    • POKE &C7E2,&01 : schnelles Spur suchen

 


 

7.6 Verschiedenes

 

7.6.1 Noch einmal: Die Konfigurationsdatei

Wie Sie vielleicht noch wissen, werden Kommentare durch ein Semikolon ";" eingeleitet, der Rest der Zeile wird dann ignoriert. Blanks, Tabs, Newlines, ";" dienen als Trennsymbole und können beliebig zwischen Schlüsselwörtern und Werten eingesetzt werden.

Die meisten Definitionen besitzen die syntaktische Form

<Schlüsselwort> "=" <Wert> {T}

Dabei ist {T} eine Folge von mindestens einem Trennsymbol.

Beispiel:

ROM_PATH = ".\ROM"
  • Eine <Zahl> kann dezimal, hexadezimal (0x) oder binär (%) angegeben werden.
  • <Pfad-Name> darf bis zu 80 Zeichen,
  • <Dateiname> darf bis zu 20 Zeichen lang sein.

Hier noch einige Ergänzungen zu ausgewählten Schlüsselwörtern:

BREAK_MASK = <Zahl> (3)

Nur für Debugging-Zwecke.

Einige Ereignisse unterbrechen die normale Emulation. Mit dieser Maske verbieten Sie solche Ereignisse.

Nicht unüberlegt verändern!

Lassen Sie alle Bits gesetzt, bis auf diejenigen, deren Ereignisse Sie verbieten wollen.
b2 = 0 -> verbietet Anzeigen von Port-Fehlern (mit 3)
Die Bedeutung der Bits kann sich in Zukunft ändern!

 

7.6.2 Der parallele Adapter

Zuerst einmal der Aufbau des Adapters, jetzt mit Funktionsweise:


PC  D-SUB   Cent.   CPC           Funktion
--------------------------------  ---------------------------
GND    19 ---- 19   GND           GND
BUSY   11 <--- 1    -STROBE       Synchro (Daten verfügbar)
 ACK   10 <--- 8    D6            |
PE     12 <--- 7    D5            | Daten
SELECT 13 <--- 6    D4            |
 ERROR 15 <--- 5    D3            |
D0      2 ---> 11   BUSY          Synchro (empfangsbereit)

 

Richtung CPC->PC

Für diese Richtung ist der Adapter normalerweise gedacht. Im Prinzip funktioniert das Senden auf dem CPC genauso, wie das Ausdrucken auf einen Drucker. Wenn der PC Nicht-BUSY anlegt, legt der CPC ein Nibble (Teil eines Bytes auf 4 Bits) auf den Port, setzt STROBE als Zeichen, daß etwas da ist und löscht es danach wieder. Der PC braucht also nur BUSY zu löschen (mittels D0), auf STROBE zu warten (über BUSY) dann das Nibble übernehmen (über die Einabeleitungen Drucker->PC) und BUSY zu setzen.

Frage: Warum kann man denn nicht 8 Bits auf einmal übertragen?

Antwort:

  1. Der PC-Druckerport müßte auf Eingabe programmiert werden, das geht nicht mit jedem und
  2. Der CPC hat nur einen 7-Bit Druckerport

 

Richtung PC->CPC

Ich habe mir gedacht, daß es auch möglich sein müßte, Daten in die andere Richtung zu verschicken. Leider hat der CPC am Druckerport nur ein einziges Eingangssignal, nämlich das BUSY-Signal. Es würde also nichts bringen, einen besseren Adapter für diese Richtung bauen zu wollen. Also kann man auch gleich den Adapter nehmen, den man schon hat, und ein geschicktes Protokoll entwickeln.

Immerhin funktioniert eine serielle Schnittstelle auch nur mit einer Datenleitung für jede Richtung.

Doch: Bei seriellen Schnittstellen wird die Synchronisation normalerweise mit einem Quarz erreicht. Es muß auf beiden Seiten exakt dieselbe Übertragungsrate eingestellt sein (z.B. 1200 Baud).

Softwaremäßig ist das schlecht zu realisieren.

Was tun?

Die Idee ist, den Geschwindigkeitsvorteil des PC gegenüber dem CPC auszunutzen. Jedes Byte wird in 8 Bit zerlegt und seriell übertragen, indem der PC den Zustand der BUSY-Leitung richtig setzt.

Während dieser 8 Bit gibt der CPC die Geschwindigkeit vor und der PC muß sich danach richten. Der CPC schreibt die Bit-Anforderung mit einem Assembler-Befehl. Der PC muß jetzt schnell reagieren, und die BUSY-Leitung entsprechend des nächsten Bits setzen, denn schon mit dem übernächsten Assembler-Befehl wird der CPC dieses lesen wollen. Damit nicht immer die Interrupts ausgeschaltet bleiben müssen, erfolgt zuvor für jedes Byte ein "Verbindungsaufbau". Der CPC sagt "Schick mir mal was rüber!" und der PC antwortet "Na gut, ich warte jetzt, bis Du was haben willst", indem er das BUSY-Signal wechselt. Die ganze Geschichte ist durch Timer abgesichert, damit kein Computer hängt, weil er auf irgendein Signal wartet, was dummerweise nicht kommt. Sie können die Programme also immer durch ESC bzw CTRL-BREAK abbrechen.

 

7.6.3 CPCTRANS

Eine noch nicht erwähnte Option ist "/d 0" und "/d 1". Bei 1 wird der Double-Step Modus gesetzt, d.h. 80-Spur-Laufwerke springen immer 2 Spuren weiter, wenn sie 40-Spur Disketten bearbeiten. Die Option sollte unnötig sein, da CPCTRANS bei 5.25" 360KB Formaten auf 80 Spur-Laufwerken automatisch Double-Step einschaltet.

Normalerweise ist es ganz einfach, mit dem BIOS Sektoren zu lesen und zu schreiben. Leider ist das BIOS aber nicht in der Lage, B-Seiten von Disketten mit Kopfseite=0 zu verarbeiten.

Deshalb mußte ich die FDC-Routinen selber programmieren, wobei der Floppy-Teil des MINIX-Source-Codes als Vorlage diente. Leider enthält der MINIX-Code einige Fehler, und das Timing wurde an den kritischen Stellen durch simple Warteschleifen realisiert, die vermutlich für einen 8086 Prozessor ausreichten.

 


 

7.7 Aufbau einiger CPCEMU-Dateien

 

7.7.1 Disketten-Abbilder

Disketten-Abbilder bestehen aus einem 0x100-Byte langen Disketten-Informationsblock und für jede Spur aus einem 0x100-Byte langen Spur-Informationsblock, an den sich die Daten der Spur (zu jedem Sektor) anschließen. Das neue erweiterte Disketten-Format ist hauptsächlich für kopiergeschützte Disketten gedacht. Änderungen für das erweiterten Format habe ich mit "*E*" gekennzeichnet (aus unserem "Extended DISK Format Proposal, Rev.5").

 

Der Disketten-Informationsblock
Byte (Hex): Bedeutung:
00 - 21 "MV - CPCEMU Disk-File\r\nDisk-Info\r\n"
(als Kennung nur "MV - CPC" erforderlich)

*E* -- "EXTENDED CPC DSK File\r\n\Disk-Info\r\n"
(als Kennung nur "EXTENDED" erforderlich)
22 - 2F unbenutzt (0)

*E* -- DSK-Ersteller (Name des Utilities)
(keine abschließende \0!)
30 Anzahl Spuren (40, 42, vielleicht 80)
31 Anzahl Köpfe (1 oder 2)
32 - 33 Spurgröße (einschließlich 0x100-Bytes Spur-Info)
Bei 9 Sektoren * 0x200 Bytes + 0x100 Byte Spur-Info also 0x1300.

*E* -- unbenutzt (0)
34 - FF unbenutzt (0)

*E* -- High-Bytes der Spurgrößen für alle Spuren
(genauso berechnet wie 32-33 beim normalen Format).
  • Für einseitige Formate enthält die Spurtabelle nur die Spurgrößen einer Seite, ansonsten alternierend für zwei Seiten.
  • Spurgröße=0 bedeutet, der Track ist unformatiert.
  • Spurgröße wird berechnet aus Tabelleneintrag * 256.
  • Beachten Sie, daß die 256-Bytes der Spur-Info mit eingeschlossen sind.

 

Der Spur-Informationsblock (für jede Spur)
Byte (Hex) Bedeutung:
00 - 0C Track-Info\r\n
0D - 0F unbenutzt (0)
10 Spur-Nummer (0 bis Spuranzahl-1)
11 Kopf-Nummer (0 oder 1)
12 - 13 unbenutzt (0)
Format-Spur-Parameter:
14 BPS (Bytes pro Sektor) (2 für 0x200 Bytes)
15 SPT (Sektoren pro Spur) (9, max. 18 möglich)
16 GAP#3 Format (Lücke beim Formatieren: 0x4E)
17 Filling-Byte (Füllbyte beim Formatieren: 0xE5)
Sektor-Information (jeweils für jeden Sektoren):
18+i Spurnummer (Sektor-ID-Information)
19+i Kopfnummer (Sektor-ID-Information)
1A+i Sektornummer (Sektor-ID-Information)
1B+i BPS (Sektor-ID-Information)
1C+i Status 1 Fehlercode (0)
1D+i Status 2 Fehlercode (0)
1E+i,1F+i unbenutzt (0)

*E* -- Sektorlänge in Bytes (Little-Endian-Notation).
Dies ermöglicht verschieden große Sektoren auf einer Spur.
Die Länge wird berechnet aus (0x0080 << wirkliche_BPS).

Anmerkungen:

  • In der Reihenfolge der Sektor-IDs müssen nach der Spur-Info die Sektordaten kommen. Es dürfen keine Spuren, Sektoren ausgelassen werden.
  • Bei doppelseitigen Formaten alternieren die Spuren, z.B. Spur 0 Kopf 0, Spur 0 Kopf 1, Spur 1 ...
  • CPCTRANS dient zum Kopieren von CPC-Disketten in dieses Format.

 

7.7.2 Snapshot-Dateien

Snapshot-Dateien bestehen aus einem 0x100-Byte Header mit angehängtem Speicherauszug.

Der Snapshot Header:

Byte (Hex) Bedeutung:
00 - 07 "MV - SNA" (als Kennung)
08 - 0F unbenutzt (0)
10 Snapshot Version (2, früher 1)
11 - 1A Z80-Register AF, BC, DE, HL, R, I
1B - 1C Z80-Flags IFF0, IFF1 (0=disabled, 1=enabled)
1D - 24 Z80-Register IX, IY, SP, PC
25 Z80 Interrupt Modus IMD (0 - 2)
26 - 2D Z80-Register AF', BC', DE', HL'
2E Gate Array: Ink-Nummer-Register
2F - 3F Gate Array: Ink-Wert-Register (0, 1, ..., 15, 16)
40 Gate Array: Multi-Konfigurations-Register
41 Gate Array: RAM-Konfigurations-Register
42 CRTC: Adreß-Register
43 - 54 CRTC: Daten-Register (0, 1, ..., 17)
55 Upper ROM Nummer
56 - 59 PIO: Port A, Port B, Port C, Port CTRL
5A PSG: Adreß-Register
5B - 6A PSG: Daten-Register (0, 1, ..., 15)
6B - 6C Speicherauszug-Größe (64K oder 128K)
Die folgenden Parameter existieren erst ab Version 2.0:
6D CPC Typ, auf dem der Speicherauszug generiert wurde
(0=CPC 464, 1=CPC 664, 2=CPC 6128, 3 = unbekannt)
6E Interrupt-Nummer (0..5), der zuletzt aufgetretene
Interrupt während eines Bildaufbauzyklus.
6F - 74 6 Multi-Modes, d.h. Bildschirmmodi (0..2) während der
Interrupts 0..5.
75 - FF unbenutzt (0), evtl. später für Emulator-Konfiguration

 

7.7.3 AMSDOS-Header

Byte (Hex) Bedeutung:
00 User (0 , mögliche Werte 0-15)
01 - 0F Dateiname+Endung (evtl. mit Nullen aufgefüllt)
10 Blocknummer (0)
11 Letzter-Block-Flag (0)
12 Datei-Typ (0=BASIC, 1=geschütztes BASIC, 2=Binär,...)
13 - 14 Blocklänge (0)
15 - 16 Ladeadresse (0-FFFF)
17 Erster-Block-Flag (0)
18 - 19 Logische Länge (0-FFFF)
1A - 1B Einsprungadresse (0-FFFF)
1C - 3F Frei für den Benutzer (0)
40 - 42 wirkliche Dateilänge (1-FFFFFF)
43 - 44 Prüfsumme über Bytes 00-42
45 - 7F unbenutzt (zufällige Werte aus dem Sektorpuffer)

Anmerkungen:

  • Der Header wird jeder nicht-ASCII-Datei vorangestellt. Er wird anhand der Prüfsumme erkannt.
  • Bytes 00 - 3F stammen aus der "Kassettenzeit", in der Dateien in Blöcke aufgeteilt wurden.
  • Unbedingt notwendig sind die Bytes 12, 15-16, 1A-1B, 40-42, 43-44.

 

7.7.4 Poke-Datenbank

Ein Eintrag (ein Poke, eine Zeile) besteht aus 7 Teilen, jeder Teil in Anführungsstrichen eingeschlossen und mittels Komma abgetrennt:

  1. Folgenummer (1 Zeichen 0-F):
    Der erste Eintrag besitzt die Nummer 0 und kann ausgewählt werden. Falls ein Programm mehrere Pokes gleichzeitig benötigt, müssen die Folgeeinträge mit 1,2,... numeriert werden.
  2. Programmname (bis 20 Zeichen)
  3. Beschreibung (bis 20 Zeichen)
  4. Typ (1 Zeichen):
    Für was für eine Programmversion der Poke ist ("t"=Tape, "d"=disk, "a"=all), wird im Moment noch ignoriert.
  5. Adresse des Pokes (4 Zeichen, hexadezimal):
    Die Speicherstelle, die geändert werden soll.
  6. Byte für den Poke (2 Zeichen, hexadezimal oder "??"):
    Bei "??" soll der Benutzer einen Wert eingeben, z.B. gewünschte Anzahl der Leben.
  7. Altes Byte (2 Zeichen, hexadezimal oder "??"):
    Dies ermöglicht festzustellen, ob der Poke korrekt eingesetzt werden kann. Falls das Byte an der Adresse damit nicht übereinstimmt, wird eine Warnung ausgegeben. Bei "??" findet keine Überprüfung statt.

Beispiel:

"0","Devils Crown","inf oxygen","t","863b","00","??"
"1","","","t","863c","00","??"
"2","","","t","863d","00","??"

Der "unendliche-Sauerstoff"-Poke für das Programm "Devils Crown" besteht aus drei Teilen. Alte Werte sind nicht bekannt, deshalb ist altes Byte=‘??‘. Name und Beschreibung brauchen in Folgeeinträgen nicht wiederholt zu werden.

 

7.8 Interne History

Z80EMU (nur ein Z80 mit kaum CPC)

v1.0 (1991)
erste Version in Pascal (nur eine Z80-Emulation)
v1.2 (12.8.1992 - 16.8.1992)
erste Version in C (mit TPTC umgewandelt). Z80-Probleme: P-Flag bei ADD HL..., DAA, ldir; Z-Flag bei BIT... Z,S-Flags bei Rotate; ROMs möglich
v1.3 (18.8.1992)
Port-Adressierung im Lo-Byte war falsch. Neues Speichermanagement mit 128 KB RAM, 32 KB ROM
v2.0 (18.8.1992 - 22.8.1992)
Implementierung der COCPU-Technik, um Fehler zu finden (mit separatem Speicher für die COCPU). Z80-Probleme: H-Flag gesetzt nach AND... ; CPI... setzt N-Flag. Bildschirmfarben Farben Blau und Gelb (vorher schwarzweiß)
v2.1 (25.8.1992 - 27.8.1992)
Alle Pens, Farben des CPCs in allen Modi; nur auf den sichtbaren Bildschirm wird geschrieben. COCPU-Fehler: Alle (ix+zz) mit negativer Distanz waren falsch! Vergessen, "signed char" zu nehmen.
v2.2 (30.8.1992 - 3.9.1992)
Neue Keyboard-Routine, Farbänderung ohne Flackern (Warten auf HSYNC). Einführung eines "Not-ROM" mit COPYMATE.
v2.3 (15.9.1992 - 19.9.1992)
FDC-Emulation zum Laden von Sektoren. COCPU-Fehler: LD XH... war LD H...
v2.3b (19.9.1992)
Screen-Update nur auf Blöcken 0..3 (nicht 4..7); Port FCxx gleich wie FBxx (für CP/M Plus). Da wußte ich noch nicht, daß OUTI... das B-Register pre-dekrementiert.
v2.4 test (25.10.1992)
Nur R-Register-Emulation, falls gewünscht (per "DEFINE"); Screen-Update jetzt jeden n-ten Interrupt und nicht für jedes Byte einzeln, was in den Speicher geschrieben wird. (Noch sehr langsam, da in C). Neue Speicherverwaltung mit Blöcken nur ab Segmentstart.
v2.5 test (31.10.1992)
Geänderte Speicherzuweisung. Endlich Hardware-Scrolling und verschiedene Bildschirmgrößen möglich.
v2.6 test (5.11.1992)
Neue Keyboard-Routine von Arnt Gulbrandsen, endlich alle Tasten erreichbar; Screen-Update in Assembler.
v2.7 test
Versucht, die schnelle Emulation von Jürgen Weber einzubinden, klappt noch nicht.
v2.8
Verbesserter Screen-Update: Nur Bereiche, die sich verändert haben, werden auf den Bildschirm gebracht.
v2.9
Timer-Handler mit 300 Interrupts. Fast-Emulation läuft, wenn kein ROM (Banking) benötigt wird.

CPCEMU (endlich ein CPC)

v0.2 (23.12.1992), Nachfolger von Z80EMU v2.9
Nach nahezu 4 Stunden mit dem Turbo-Debugger endlich den Grund gefunden, warum sich die fast-Emulation aufhängte: ES anstatt DS gepushed.
v0.3 (28.12.1992 - 29.12.1992)
N-Flag bei INI,OUTI setzen. CPI im fast-Z80 setzte falsche Flags. RL(HL) benutzte Read-Segment(DS) anstatt Write-Segment(ES). LD A,R produziert jetzt Zufallszahlen; Alle Kassettenroutinen bis auf CASSETTE IN CHAR.
v0.4 (1.1.1993)
IN A,(n): A nach b8..b15 (anstatt B); RAM-Konfiguration 0xc3: 0,3,2,7 (für CP/M Plus). KC-Compact (ein CPC-Kompatibler aus der ehem.DDR) benutzt Port EE00 - EE3D, nur wofür?
v0.5 (28.1.1993 - 8.2.1993)
INIR,... R-Register-Erhöhung abhängig von B, nicht von BC. Endlich CASSETTE IN CHAR (falscher Patch beim CPC 6128 eingetragen).
v0.6 (23.3.1993 - 24.5.1993)
Jemand hat Jürgen darauf aufmerksam gemacht, daß die OUTI-Befehle das B-Register pre-dekrementieren! C-Teile jetzt auch im 386er-Code (mit Borland C++ v3.1) Disetten-Abbilder jetzt mit Endung ".DSK". CPCREAD.PAS korrigiert (vergessen, Kopfseite mit 0 zu initialisieren) und in CPCREAD.C umgewandelt. PIO-8255-PORT-Adressierung flexibilisiert (kann auch lesen, wenn Port auf Ausgabe geschaltet ist...)
v0.7 (26.7.1993 - 29.8.1993) (inoffiziell)
Source völlig überarbeitet, modularisiert. Konfigurationsdatei eingeführt, jetzt mehrere ROMs möglich. Änderung des Firmennamens von Schneider auf Amstrad. (Können Sie jetzt selber einstellen.) Fehler im RAM-Banking beseitigt. Neue Dokumentation in Deutsch.
v0.8 (30.8.1993 - 9.9.1993)
Slow-Emulation: Parity-Befehle durch Tabelle nicht nur für die Parität beschleunigt. Z80: ED xx mit illegalem xx wird ignoriert. Neue Dokumentation jetzt auch in Englisch.
v0.8a (10.9.1993 - 15.9.1993)
Fataler Fehler in der Fast-Emulation: Wenn ein DD CB xx - Befehl ausgeführt wurde und gerade ein Interrupt auftrat, wurde der Befehl ignoriert!
v0.8b (16.9.1993 - 21.9.1993)
"real"-VSYNC eingebaut, falls "VSYNC_CT" = 0. PIO Port A Problem korrigiert: OUT &F400,xx mit Port A im Eingabemodus wurde ignoriert. Neue Joystickroutine von Martin Zacho.
v0.8c (22.9.1993 - 13.12.1993)
Dokumentation mit "ispell" überprüft. Emulation startete nicht, falls "USE_JOYSTICK=1" und kein Joystick angeschlossen war (PUSH AX an falscher Stelle). Slow-Emulation: DAA korrigiert (Klammern fehlten seit v0.8). Falscher Patch für CPC 664 in der Interrupt-Routine. Dieser Patch ersetzte EI durch NOP, um das EI-Problem zu umgehen (Interrupts erst einen Befehl später erlauben). Jetzt für alle CPCs.
v0.8d (14.12.1993 - 29.12.1993)
FDC-Emulation für doppelseitige Formate umgeschrieben. CPCTRANS ersetzt altes CPCREAD und erlaubt Lesen von VORTEX-Disketten mit dem Patch 720KB.COM. Außerdem können Disketten-Abbilder jetzt auf Diskette zurückgeschrieben werden. Neues Datei-Auswahl bei F3; einige Port-Adressen Aliases eingeführt, z.B. &7000 - &7f00, um das Gate Array anzusprechen, &0c00,&1c00,&2c00,&3c00,&bc00 für den CRTC. R-Register Emulation eingeschaltet.
v0.9 alpha (30.12.1993 - 20.1.1994)
EMS Speichernutzung möglich durch spezielle EMS/UMB-Konfiguration. Konfigurationsdatei um Binärzahlen erweitert. RAM-Banking Adressierung korrigiert: Der Emulator akzeptierte &d0-&ff als &c0-&c7. Jetzt bis zu 576 KB RAM mit EMS.
v0.9b (21.1.1994 - 31.1.1994)
EMS-Benutzung vereinfacht durch erweitertes EMS (oder LIM EMS 4.0) mit mehr als 4 physikalischen EMS Seiten. Dateiauswahl jetzt auch bei "l" (Debug Menü), RUN".
v0.9c (1.2.1994 - 29.4.1994)
Bißchen schrecklicher PC-Lautsprecher Sound (Ausschalten mit F4). Dateiauswahl auch bei "v"; korrigierte englische Dokumentation; Soundblaster-Sound (noch verbesserungswürdig); neues CPCTRANS mit Kommandozeilen-Parameter und direktem FDC-Zugriff; paralleler Adapter getestet und die Software verbessert. Fast-Z80: inc/dec (hl), (ix+n) für RAM unter ROM korrigiert. Jetzt mit Bild hoch/runter übergroße Bildschirme verschieben; Teil von Overscan-Bildschirmen wird angezeigt. Jetzt möglich: 64K-Sschnappschüsse.
v0.9d (30.4.1994 - 12.5.1994)
Interrupts während DI werden nicht mehr vergessen, und sie werden nicht mehr direkt nach einem EI-Befehl erlaubt. Neue Farb-Funktionen: ohne Schnee unter OS/2. Fast-Z80: beschleunigtes Code-Holen.
v1.0 (13.5.1994 - 20.5.1994)
Verbesserter Screen-Part: Jetzt auch andere Zeichengrößen von 1 bis 8 möglich. Dateiauswahl auch bei SAVE , Schnellauswahl durch Drücken von Anfangsbuchstaben. Verbessertes CPCTRANS mit Verify-Option. Neues Setup-Menü, wenn Sie F7 drücken. Darin können Sie z.B. Farbflimmern unterdrücken.
v1.0a (21.5.1994 - 9.6.1994)
Setup-Menü verbessert: jetzt neben den Cursor-Tasten auch direkte Eingaben möglich. Nahezu deutsche Tastenbelegung, einfache Verzögerungsoption (delay). Kein "Müll" mehr bei verkleinertem Bildschirm (d.h. die Teile vom größeren Bildschirm werden korrekt gelöscht). Fast-Z80-Teil verbessert: schnellere RRA,RLA, ..., schnellere CP xx Befehle. Weitere illegale Befehle eingefügt (ED xx). Außerdem fehlten die undokumentierten Befehle LD D,XH und LD YL,YH (im CoZ80-Modus aufgefallen)! CPDR,CPIR mit BC=0 korrigert (0 heißt nämlich auf einem Z80 65536, aber es ist 0 bei dem 80x86-REPE-Präfix!). DAA-Flags korrigiert. Neue Software für den parallelen Adapter: Jetzt auch Senden zum CPC möglich. Dank an Bernd Schmidt, der anmerkte, daß ein Interrupt das R-Register um 1 erhöht. Außerdem konnte mit seiner Hilfe die Emulation des PIO-Port-C Registers verbessert werden.
v1.1a (10.6.1994 - 16.8.1994)
Eine neue Ära von CPCEMU hat begonnen: Amstrad hat die ROMs freigegeben! Ein guter Anlaß, die Dokumentation umzuschreiben... Änderungen an der Konfigurationsdatei: ROM_BLOCKS -> ROM_BLOCK, DISC_BYPASS -> DISABLE_ADOS, keine Leerzeichen mehr vor und nach "=" nötig. Änderungen am Sound-Teil, Grafik-Teil: vertikale Größe durch VGA-CRTC. Joystick-Kalibrierung jetzt im Setup-Menü, TAPE-Routinen beim Speichern verbessert. FDC-Teil verbessert: jetzt läuft auch COPYMATE. Wechseln von Nicht-DATA-Disketten ohne "Read Error" möglich (es wurde immer Spur 0 gesucht). Eine weitere Verzögerung in CPCTRANS, ich hoffe, Sie müssen jetzt nicht mehr die Turbo-Taste betätigen; Formatieren von Disketten-Abbildern. Nochmal PIO-Port-C korrigiert: er wird nach OUT &F700,n gelöscht. Größere Änderungen an der Konfigurations-Datei: Jetzt mit bedingter Konfiguration (#IFCPC, #ENDIF). Einige Schlüsselwörter verändert (VSYNC_CT -> /, DISC_PATH -> /, SNAP_PATH -> SNAPSHOT, DRV_A -> DRIVE_A, DRV_B -> DRIVE_B).
Laden von Programmen aus ZIP-Archiven. Sie brauchen PKUNZIP dazu.
v1.1b (17.8.1994 - 2.9.1994)
Multi-Modes eingeführt, d.h. verschiedene Bildschirmmodi gleichzeitig. Dazu wird der Bildschirmaufbau in bis zu 6 Teile zerlegt, es erfolgt also eine teilweise Auffrischung bei jedem Interrupt. Klappt noch nicht immer. Jetzt möglich: 128K Snapshots, zusätzlich für Multi-Modes erweitert. CPCPARA verbessert: jetzt können Sie Binärdateien mit Header kopieren. Vollkommen neugeschriebene, hoffentlich besser verständliche Dokumentation. Erkennung des CPC 6128 Plus eingebaut. Noch mehr Port-Aliases eingebaut.
v1.2 (3.9.1994 - )
Diese Version wurde veröffentlicht. Es wurden hauptsächlich ein paar Änderungen an dem Hilfesystem vorgenommen.
v1.2a (27.9.1994 - ) (war verfügbar als UPD12A.ZIP)
Datei-Auswahl: Nur die verfügbaren Laufwerke werde angezeigt. Und: Mit dem Treiber ANSI.SYS war der Hintergrund von Texten manchmal schwarz. TMP_PATH: Ein Laufwerk ohne Pfad angeben.
DOS-Shell (F7): CPCEMU wird vorher ins XMS, EMS oder auf Festplatte ausgelagert, somit haben Sie viel Speicher im DOS-Shell. (Diese Neuerung wurde vom Public Domain Program SWAP300.ZIP von Marty Del Vecchio übernommen.)
Bildschirm-Auffrischung konnte falsch sein, wenn die Bildschirmbreite nicht durch 4 teilbar war.
Eine andere CPCEMU-Version für noch höhere Geschwindigkeit: C2.EXE. Diese Version benutzt eine andere Speicherverwaltung mit zwei 64KB EMS-Fenstern für Lesen bzw. Schreiben. Aber es funktioniert nur mit EMS.
Die ROMs sind auch © von Locomotive Software, nicht nur von Amstrad.
v1.2b ( )
Auf Soundblaster Pro Karten wurde kein Stereo-Sound ausgegeben, obwohl es angezeigt wurde. Falls keine Soundblaster-Karte gefunden wurde, gab es überhaupt keinen Sound, bis USE_SB=0 geändert wurde. Schneller-Z80: Einige Wort-Zugriffe in Byte-Zugriffe umgeändert. Ist zwar ein bischen langsamer, aber der Computer hängt sich nicht bei jedem Zugriff an 0xffff auf.
Schneller-Z80: Problem bei EI HALT DI korrigiert: Bei einem Interrupt wurde die Adresse von HALT 'gepushed' anstatt der von DI. Englische Dokumentation korrigiert.
Verbessertes CPCPARA und PCPARA v1.1: Adapter-Test, wesentlich höhere Geschwindigkeit CPC->PC: Etwa 1600 Bytes pro Sekunde, von Diskette lesend! (486/66), Statistik. Jetzt kannst Du 16KB in 10 Sekunden übertragen! Dank an Klaus Weber, der anmerkte, das es zu langsam war. In PCPARA wurde nach jedem empfangenen Halbbyte mittels DELAY(1) eine Millisekunde gewartet. Dies ist überflüssig.
v1.2c (28.2.1995 - ) (war verfügbar als UPD12C.ZIP)
Teile von CPCEMU umgeschrieben in C++. Dies erlaubt Inline-Funktionen und bessere Schnittstellen, um den Überblick behalten zu können.
v1.2d (16.3.1995 - ) (nur für Leser der "Mailing List")
Schneller-Z80: Interne Änderungen, die unsichtbar für den Benutzer bleiben, außer einer kleinen Geschwindigkeitssteigerung. Alle Variablen werden jetzt im DATA-Segment anstatt im CODE-Segment gehalten.
Endlich der unbedingt notwendige Modus für schnelle Computer eingeführt: "Realtime-CPC" (auswählbar im Setup-Menü oder mit REALTIME=1).
v1.3 (16.4.1995 - )
Poke-Datenbank zum einfachen "Poken", französische Dokumentation, FDC-Format-Befehl (Re-formatieren von Disketten-Abbildern derselben Größe), neues Menüsystem mit Mausunterstützung (MOUSE=1), Disketten-Abbilder mit read-only DOS Attribut einlegen (als read-only), Debug-Menü: Suchfunktion "find" eingebaut.
v1.3a (30.4.1995 - ) (war verfügbar als UPD13A.ZIP)
Mit Version v1.3 lief Boulder Dash nicht mehr, obwohl es mit v1.2 noch funktionierte. Der Interrupt Modus 2 des Z80 wurde falsch simuliert (PUSH/POP vergessen). Auch in der langsamen Z80-Emulation funktionierte es wegen eines ähnliche Fehlers nicht.
CPCTRANS: Option -f 6 erlaubt.
v1.3b (20.5.1995 - ) (war verfügbar als UPD13B.ZIP)
Einige Benutzer beschwerten sich, daß der Soundblaster-Sound seit Version 1.3 nicht mehr funktionierte.
v1.4a0 (21.3.1996 (v1.3c); veröffentlicht in der c't 6/97)
GUS-Soundunterstützung von Ulrich Doewich; On-Line-Hilfe in Deutsch, Englisch, Französisch und Spanisch; komplette französische Dokumentation dank Jean-Pierre MARQUET;
Unterstützung für 2 Joysticks; VESA-Videomodes für hohe Auflösungen;
Setup-Menü und Konfigurationsdatei überarbeitet;
Konfigurationen laden und speichern vom Setup-Menü aus; verbesserte FDC-Routinen für Fremdformate; Erweitertes Disketten-Format;
Benutzerdefinierte Farben und Tasten;
CPCTRANS überarbeitet; neues SNA2GIF (v1.1);
Schnelle Z80-Emulation: manchmal wurde nach einem Reset der Bildschirm nicht komplett gelöscht (Problem bei HALT);
v1.4a1 (4.4.1996)
v1.4a2 (5.7.1996)
v1.5b0 (8.6.1998; veröffentlicht in der c't 12/98)
  • perfekter Soundblaster-Sound von Ulrich Doewich (dagitaler Sound mit Geräuschen); teilweise spanische Dokumentation v1.3-v1.4 dank Ismael Salvador Igual;
  • Autostart von BASIC-Programmen aus Disketten-Abbildern;
  • 4DOS-Beschreibungen bei der Datei-Auswahl; die Online-Hilfe erlaubt jetzt Themen mit Leerzeichen (und Sonderzeichen);
  • Pfade in Konfigurationen werden jetzt relativ abgespeichert;
  • Datenrate bei CPCTRANS v2.3g setzen;
  • SNA2GIF v1.2: benutzerdefinierbare Farbpalette, bessere Autoskalierung;
  • CPCPARA v1.2: schnelles Senden abschaltbar (z.B. für Vortex);
  • Poke-Datenbank erweitert; erlaubt die Benutzung der VESA-Videomodi, auch wenn sie nicht vom VESA-BIOS angezeigt werden (wird für einige Noname S3 Virge Karten mit Standard-S3-BIOS benötigt);
  • Die Batchdateien CPCxxx.BAT benutzen eine Konfigurationsdatei unter %TMP (dadurch kann CPCEMU auf einer CD-ROM aufgerufen werden und trotzdem die Konfiguration modifizieren);
v1.5b1
  • Vollständige spanische Dokumentation v1.5 dank Gerardo Briseño;
  • Vollständige Französische Dokumentation v1.5 dank Jean-Pierre MARQUET;
  • Problem mit dem Joystick behoben (er funktionierte mit v1.5b0 nicht);
  • Dateiauswahl: Jetzt bis zu 1500 Verzeichnis-Einträge (vorher 500); direkte Druckerport-Ansteuerung bei PRINTER=""; vorzeitiges VSYNC-Löschen wieder beseitigt (Platoon reagierte bei v1.5b0 auf keine Eingabe);
  • Mit EMS konnten Sie keinen 128K-Schnappschuß laden, der eine RAM-Konfiguration ungleich &C0 hatte (z.B. &C2 in CP/M Plus);
  • CPCPARA v1.2: das Flag, um schnelles Senden auszuschalten, hatte "negative Logik";

CPCEMU wurde in C++ und Assembler geschrieben. Zum Kompilieren wurden Borland C 3.1 mit 386er Optimierung und TASM benutzt. Zur Fehlersuche habe ich den Turbo Debugger benutzt.

Die Farben wurden mit dem Programm VGAMETER von J. Stephen Shattuck, Jr. ausgewählt, indem sie mit denen eines CPCs verglichen wurden, der an einen Scart-Fernseher angeschlossen war.

 


 

(Ab hier dürfen Sie wieder gefahrlos weiterlesen...)

 

Kapitel 8. Anhang

 

© Marco Vieth, Mai 1998



Marco Vieth, 19.04.2008 12:12:47