#$K+  KC-Emulator

Zum Programm
Vorwort
Erforderliche Hard- und Software
Kommandozeile
Bedienung
Datei laden
Installieren
Deinstallieren
Markieren, Kopieren und Einfügen
Emulator-Optionen
Computertyp wählen
Benutzerdefinierten Computer erstellen
Dokumentation zu den emulierten Computern
Z9001
HC900, KC85/2,3,4
Z1013
HC-BASIC
Hilfe KCEMU © h#s (03/98)

#$+K  Vorwort
Vor gar nicht so langer Zeit habe ich auf einem Kleincomputer, dem KC85/4, programmiert. Eigentlich war er gar nicht so schlecht, aber dann kamen die PC's mit einer Übermacht an Taktfrequenz und Speicherausbau. Den Durchbruch machten grafische Benutzeroberflächen - aber Grafik, das hatte der KC aus Mühlhausen den PCs schon lange voraus!
Nun gibt es bereits Dutzende von Emulatoren für "West"-Computer - für den Ostteil ist das Angebot schon eher mager. Einerseits wohl wegen der geringen Verbreitung und der kürzeren Vergangenheit. Andererseits machte das KC-Bildformat 320x256 Sorgen auf dem PC. Es sind eben ein paar Zeilen zuviel für den sonst so gern benutzten Spielemodus 13h (320x200), auf den die "West"-Computer besser passen.
Nun kam Michael auf die Idee, einen Emulator für Windows zu schreiben, um das Problem Bildformat zu umgehen. Und wenn wir einmal dabei sind, wollte ich, daß der KC bis ins kleinste Detail emuliert wird! Keine Modifikationen an Betriebssystem-ROMs, sondern vollständige Emulation - auch der Peripherie (Tastatur, Kassette, Module...). Es sollte so auch möglich sein, ein neues Betriebssystem für den KC hiermit zu entwickeln und zu debuggen.
Soweit ist das Programm noch nicht gediehen (Geduld und Schweiß sind der Preis). Ein wirklich externer (Hardware?)-Debugger erblickte bereits das Licht der Welt.
Na, und noch etwas: Alle DDR-Computer basierten auf dem U880: warum nicht gleich alle in einem Programm erledigen? Nun, es gibt ja auch noch die Eigenbau-Computer: der AC1, der Hübler-PC usw. Hm, und Windows bietet mit dem DLL-Konzept eine Variante, einen Eigenbau-PC in Software zu gießen.

#$+K  Hard- und Software-Erfordernisse
Dieses Programm benötigt mindestens Windows 3.1 im Standard-Modus - demzufolge einen AT286 oder besser. Es ist 16bittrig und arbeitet daher auch unter WinOS2 und (vielleicht) WINE.
Die Emulation erfolgt stets so, daß Windows möglichst wenig behindert wird. Die "Taskumschaltung" erfolgt quasi präemptiv, nach Ablauf einer vorgegebenen Anzahl von KC-Takten (sie werden exakt mitgezählt).
Auch abstürzende U880-Programme können Windows nichts anhaben. Im Laufe der Programmentwicklung unvermeidliche Schutzverletzungen haben nichts damit zu tun.
Das Blinken (funktioniert bereits) erfordert einen 256-Farben-Modus unter Windows, da dies per Palettenumschaltung zeit- und speichersparend realisiert wird. Mit mehr oder weniger Farben gibt's erst mal kein Blinken, basta. (Das Problem sollten die Grafikkartenhersteller lösen, nicht immer nur ich!)
Die Modulschaltung des KC's wird z.Z. durch Speicherschaufeln realisiert. Ein VxD, welches zumindest unter Windows Enhanced Mode liefe, realisiert die Modulschaltung künftig unter Zuhilfenahme der Paging-Einheit des 386er Prozessors.
Die Speicherung von Setup-Daten erfolgt z.Z. in der Registry.
Es ist nicht erforderlich, diese Software zu installieren. Der entsprechende Menüpunkt legt nur die Schlüssel in der Registry an. (Der entgegengesetzte Menüpunkt löscht diese Einträge, nichts weiter)
Zur Zeit funktioniert NICHT:
- Tasteneingaben am KC85/1, KC87 und Z1013 (macht diese praktisch unbenutzbar :-(
- Modulschaltungen (außer Umschaltung Pixel/Farbe am KC85/4)
- Ein/Ausgabe-Steuerung (außer KC85/4 Bildmodusumschaltung)
- Bremsfunktion

Dieses Programm besteht aus:
KCEMU.EXE	das Programm inklusive Betriebssystem-ROMs als Ressourcen
KCEMU.HLP	diese Hilfedatei
KCEMU.386	der Treiber für die Paging-Steuerung
Optional:
KCEMU.DLL	Benutzerdefinierter Virtueller Computer

#$+K  Kommandozeile
Zur Zeit wird keine Kommandozeile akzeptiert. Geplant:
* Dateiname (.KCC, .SSS u.ä.) startet neues Fenster mit Programm
* Schalter, der den Start in ein vorhandenes Fenster umlenkt

Das Programm unterstützt bereits Drag-n-Drop. (Unter Windows95 kommen systembedingt nur kurze Dateinamen an.)

#$+K Datei laden
Das Laden erfolgt z.Z. durch simples Hineinkopieren der Daten in den KC-Adreßraum. Bei BASIC-Programmen werden diverse, festliegende Arbeitszellen angepaßt. So kann nach dem Starten von BASIC ein solches Programm geladen werden.
Es erfolgt z.Z. noch keine Emulation des Kassetten-Interfaces.
Ein Programm zum Einlesen von KC-Programmen über eine Soundkarte ist in Arbeit. Es wird in dieses Projekt eingebunden.
Speichern ist z.Z. nicht implementiert.
Das Speichern und Laden des gesamten Computer-Zustandes ist geplant, jedoch nicht mal ansatzweise realisiert. (Ach, hätte man sowas schönes am KC gehabt...)

#$K+ Installieren
Es ist nicht erforderlich, diese Software zu installieren. Der entsprechende Menüpunkt legt nur die Schlüssel in der Registry an. (Der entgegengesetzte Menüpunkt löscht diese Einträge, nichts weiter.)
Sobald Einträge in der Registry vorhanden sind, speichert KCEMU beim Beenden automatisch die Fensterpositionen für normale und maximierte Größe sowie einige Einstellungen. Das Programm "auf die Schnelle" ausprobieren ist somit völlig rückwirkungsfrei.
Der Inhalt der Registry kann mit (3.x) REGEDIT /v oder (95) REGEDIT angezeigt werden. Folgende Punkte:
HKEY_CLASSES_ROOT
 KCEMU = KC-Emulator
  config
   kctyp = 3 0 4 1 0          (KC-Typ, MenüCheck, 3 Optionen)
   placement = 1 15 13 7 6    (Fensterstatus, NormalPosition, MaxPosition)
  shell
   open
    command = D:\USER\MICHAEL\KCEMU\KCEMU.EXE %1
 .KCC = KCEMU

Übrigens ist dieser Menüpunkt auch dazu verwendbar, bei laufendem KCEMU die Einstellungen zu speichern. Bei Absturz kann nämlich KCEMU nicht speichern...

#$K+ Deinstallieren
Dieser Menüpunkt löscht die von Installieren gemachten Einträge aus der Registry. Das Löschen der Dateien obliegt der Verantwortung des "Systemadministrators" - was für ein Schlachtwort!. (Und das ist doch nicht SOO schwer, oder?)

#$+K  Markieren, Kopieren und Einfügen
Obwohl das Markieren von Bereichen mit der Maus inzwischen korrekt funktioniert, erfolgt beim Kopieren nur die Ablage einer geräteunabhängigen Bitmap (.BMP, ganzes Bild) in die Zwischenablage. Kein Text (kommt später). Einfügen soll später Text (Tastendrücke) einfügen, genauso wie bei einem DOS-Fenster.
Die rechte Maustaste öffnet ein Kontextmenü, mit der das Einstellen eines linken und rechten Textrandes erfolgen kann. Damit kann ein umgebrochener Satz in einem Stück in die Zwischenablage genommen werden (künftig). Ein Strichkiller sollte sich in diesem Modus automatisch zuschalten.
Vorgabe ist das Markieren rechteckicker Bereiche (wie im DOS-Fenster). Z.Z. keine Möglichkeit für Tastaturbedienung.

#$+K  Argument-Eingabe
Bis zu 3 Hexzahlen können hier eingegeben werden, die Anfangs-, End- und Startadresse darstellen. Startadresse wird z.Z. nicht unterstützt. Als Vorgabe stehen die Adressen, wie die Datei normalerweise geladen wird. Wird nur eine Adresse angegeben, wird bis zum DOS-Dateiende geladen.

#$+K  Emulator-Optionen
Mit diesem Dialog kann das Verhalten unter bestimmten Windows-Situationen festgelegt werden. Die Taktfrequenzanzeige in Prozent richtet sich nach dem einprogrammiertem nominellen Wert, und diese ist beim Z 1013 auf 2 MHz festgelegt.
Folgende Frequenzen:
Z9001, KC85/1, KC87:	2.5 MHz
HC900, KC85/2..4:	1.75 MHz
Z1013:	2 MHz
Alle Options-Parameter werden automatisch gespeichert, sofern installiert wurde.

#$+K  Computertyp wählen
Nun, wer die Wahl hat, hat die Qual. Benutzbar ist eigentlich nur der KC85/3; dem KC85/4 fehlt das BASIC, auch wenn's im Menü steht, und den anderen die Tastatureingabe. Das CAOS 3.4 ist eine Eigenentwicklung; die "Versionsnummer" sollte auf ein Mittelding zwischen /3 und /4 hindeuten.

#$+K  Benutzerdefinierten Computer erstellen
Die zu erstellende DLL wird als "Treiber" (.DRV) entwickelt. Wichtig ist dabei nicht die Endung, sondern das Vorhandensein einer einzigen exportierten Funktion namens DriverProc(). KCEMU.EXE wird künftig eine Reihe exportierter Eintrittspunkte aufweisen, um seine Standardfunktionen nutzen zu können.
Zur Zeit ist die Entwicklung eines solchen Treibers nicht möglich

#$+K  Z9001 - Überblick
Speicheraufteilung des KC 87:
   0.. 2FFh	Arbeitsspeicher Betriebssystem	
 300..3FFFh	RAM	
4000..7FFFh	1. RAM-Erweiterungsmodul	
8000..BFFFh	2. RAM-Erweiterungsmodul	
C000..E7FFh	HC-BASIC- (analog KC 85) oder ROM-Modul	
E800..EBBFh	Farbattributspeicher (nur bei installierter Farboption)	
EC00..EFBFh	Bildspeicher 40x24 Zeichen	
F000..FFFFh	Betriebssystem-ROM	
Kanaladressen:
80h	CTC	
88h	PIO 1	
90h	PIO 2 (Tastatur)	
98h	Frei	
A8h	Druckerschnittstelle für K 6303	
B0h	Druckerschnittstelle für K 6311	
B8h	Frei	
C8h	Ein/Ausgabe-Modul	
D0h	Programmiermodul (EPROM?)	
D8h	Frei	
E0h	Spracheingabe-Modul	
F0h	Frei	
F8h	ADU-Modul	
Wichtige Systemadressen:
 1Dh	Systemzeit Stunden
 1Eh	Systemzeit Minuten
 1Fh	Systemzeit Sekunden
 5Bh	Beginn des FCB (Dateisteuerblock)
202h	Interruptadresse für CTC
211h..2FFh	Frei für Anwender
Unterprogramme des Betriebssystems:
0 INIT	Systeminitialisierung
1 CONSI	Zeicheneingabe von Tastatur
2 CONSO	Ausgabe Zeichen auf Bildschirm
3 READI	Eingabe Zeichen von (Lochband-)Leser
4 PUNO	Ausgabe Zeichen auf (Lochband-)Stanzer
5 LISTO	Ausgabe Zeichen auf Drucker
6 GETST	Spielhebelabfrage (Joystick)
7 GETIO	Eingabe eines E/A-Bytes
8 SETIO	Ausgabe eines E/A-Bytes
9 PRNST	Ausgabe nullterminierte Zeichenkette
10 RCONB	Eingabe Zeichenkette
11 CTST	Abfrage Tastaturstatus
12 RETVN	Ausgabe Versionsnummer
13 OPENR	Datei zum Lesen öffnen
14 CLOSR	Datei zum Lesen schließen
15 OPENW	Datei zum Schreiben öffnen
16 CLOSW	Datei zum Schreiben schließen
17 GETCU	Ausgabe Cursor-Adresse
18 SETCU	Neubelegen Cursorposition
19	unbelegt
20 READS	Einmaliges Lesen eines Blockes
21 WRITS	Einmaliges Schreiben eines Blockes
22 SETTI	Stellen der Systemuhr
23 GETTI	Abfrage Systemuhr
24 PRITI	Ausgabe Systemzeit
25 INITA	Initialisierung Tastatur
26 SETDM	Einrichten Puffer READS/WRITS
27 GETM	Test auf RAM oder ROM IN 1K-Schritten
28 SETM	Zuweisung RAM/ROM
29 DCU	Cursor löschen
30 SCU	Cursor setzen
31 COEXT	Komprimierten String konvertieren
32	unbelegt
33 RRAND	Lesen eines einzelnen Blockes von Kassette
FCB-Struktur:
 0- 7	Dateiname	
 8-10	Dateityp (Endung)	
11-14	interne Verwendung	
   15	Blocknummer nach dem Lesen	
   16	zu lesende bzw. schreibende Block-Nummer	
17-18	Anfangsadresse Datei	
19-20	Endadresse	
21-22	Startadresse	
   23	Systembyte 0=ungeschützt, 1=Geschützte Datei	

#$+ K Z9001 UP 0 INIT
Systeminitialisierung
Aktion: Neustart

#$+ K Z9001 UP 1 CONSI
Zeicheneingabe von Tastatur
PA: A=ASCII-Zeichen

#$+ K Z9001 UP 2 CONSO
Ausgabe Zeichen auf Bildschirm
PE: E=Zeichen

#$+ K Z9001 UP 3 READI
Eingabe Zeichen von (Lochband-)Leser
PA: A=Zeichen

#$+ K Z9001 UP 4 PUNO
Ausgabe Zeichen an (Lochband-)Stanzer
PE: E=Zeichen

#$+ K Z9001 UP 5 LISTO
Ausgabe an Drucker
PE: E=Zeichen

#$+ K Z9001 UP 6 GETST
Spielhebelabfrage (Joystick)
PA: C=Spielhebel 1, B=Spielhebel 2

#$+ K Z9001 UP 7 GETIO
Eingabe eines E/A-Bytes
PA: A

#$+ K Z9001 UP 8 SETIO
Ausgabe eines E/A-Bytes
PE: E.

#$+ K Z9001 UP 9 PRNST
Ausgabe nullterminierte Zeichenkette
PE:DE=Anfangsadresse String

#$+ K Z9001 UP 10 RCONB
Eingabe Zeichenkette
PE: DE=Zieladresse Puffer

#$+ K Z9001 UP 11 CTST
Abfrage Tastaturstatus
PA: A=0: Kein Tastendruck, A=1: Taste gedrückt

#$+ K Z9001 UP 12 RETVN
Ausgabe Versionsnummer
PA: BC=Versionsnummer

#$+ K Z9001 UP 13 OPENR
Datei zum Lesen öffnen
keine Angaben

#$+ K Z9001 UP 14 CLOSR
Datei zum Lesen schließen
keine Angaben

#$+ K Z9001 UP 15 OPENW
Datei zum Schreiben öffnen
keine Angaben

#$+ K Z9001 UP 16 CLOSW
Datei zum Schreiben schließen
keine Angaben

#$+ K Z9001 UP 17 GETCU
Ausgabe Cursor-Adresse
PE: D=Zeile, E=Spalte, BC=Adresse im Bildspeicher

#$+ K Z9001 UP 18 SETCU
Neubelegen Cursorposition
PE: D=Neue Zeile, E=Neue Spalte

#$+ K Z9001 UP 20 READS
Einmaliges Lesen eines Blockes
PE: FCB-Struktur von 128 Byte vom Kassette zur aktuellen DMA-Adresse

#$+ K Z9001 UP 21 WRITS
Einmaliges Schreiben eines Blockes
PE: FCB AB 5CH

#$+ K Z9001 UP 22 SETTI
Stellen der Systemuhr
PE: im BCD-Format A=Stunden, B=Minuten, C=Sekunden

#$+ K Z9001 UP 23 GETTI
Abfrage Systemuhr
PA: (in BCD?) A=Stunden, B=Minuten, C=Sekunden

#$+ K Z9001 UP 24 PRITI
Ausgabe Systemzeit
PE: DE=Zieladresse STD:MIN:SEK

#$+ K Z9001 UP 25 INITA
Initialisierung Tastatur
(Grundinit Register I)

#$+ K Z9001 UP 26 SETDM
Einrichten Puffer READS/WRITS
PE: DE=Pufferadresse (Standard 80h)

#$+ K Z9001 UP 27 GETM
Test auf RAM oder ROM IN 1K-Schritten
PE: DE=zu prüfende Adresse,
PA: A=0 ROM, A=1 RAM

#$+ K Z9001 UP 28 SETM
Zuweisung RAM/ROM
(Schreibschutz Anfangsadresse=DE für RAM)

#$+ K Z9001 UP 29 DCU
Cursor löschen
keine Angaben

#$+ K Z9001 UP 30 SCU
Cursor setzen
PE: BC=Cursor-Position

#$+ K Z9001 UP 31 COEXT
Komprimierten String konvertieren
PE: DE=Stringlänge (Ausblenden aller Steuerzeichen und NUL anfügen)
    BC =Zieladresse

#$+ K Z9001 UP 33 RRAND
Lesen eines einzelnen Blockes von Kassette
PE: Block-Nr=Byte 32 im FCB

#$+K  Z1013
Keine Online-Dokumentation verfügbar! (Ich kann ja nicht hexen! Der Scanner braucht Zeit...)

#$+K  HC-BASIC
Keine Online-Dokumentation verfügbar! (Ich kann ja nicht hexen! Der Scanner braucht Zeit...)