home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
emulator
/
spectrum
/
spectrum.txt
< prev
Wrap
Text File
|
1987-04-21
|
20KB
|
384 lines
ZX-SPECTRUM Emulator V1.0
=========================
1. Einleitung
-------------
Wozu ein ZX-Spectrum Emulator? - Nun, wer diesen Computer höchstens dem Namen
nach kennt, kann obige Frage berechtigt stellen. Der mindestens ebenso
erfolgreiche Nachfolger des legendären ZX-81 ist ein 8-Bit Rechner mit 48 kB
Hauptspeicher, 256 x 192 Pixel Grafikschirm in 16 Farben (max. 2 Farben pro
Zeichenposition) und Pieps-Sound. Hoffnungslos veraltet also für einen
verwöhnten ST-User.
Wer aber, wie der Autor, seinerzeit seine ersten Programmierfrustrationen am
ZX-81 erlebte, und dann hoffnungsvoll auf den ZX-SPECTRUM wechselte, wird
dieses Gerät für immer wohlwollend im Gedächtnis behalten. Umfangreiches
Basic, nahezu unerschöpflicher Speicher (für ZX-81 Verhältnisse), üppige
Farbenpracht und sogar die Möglichkeit Töne zu erzeugen. Binnen kürzester
Zeit brach eine Softwareflut über diesen Rechner herein, weil er äußerst
einfach und komfortabel zu programmieren war. Etliche der heute am ST-Sektor
bekannten Software-Firmen haben sich damals am Spectrum erste Lorbeeren
geholt. Kurzum: Er ist es schon wert, in Erinnerung behalten zu werden, der
alte "Specci" und der Autor hofft durch die Übertragung auf den Atari ST noch
lange ab und zu einen Blick auf ihn werfen zu können. (Sollte ja schließlich
auch am TT und vielleicht auch noch am SF - so müßte der Nachfolger des TT
logischerweise heißen - noch funktionsfähig sein). Und mag sein, daß es noch
ein paar Leutchen gibt, die ähnlich empfinden... Ihnen ist dieser Emulator
gewidmet!
Der Autor möchte an dieser Stelle ganz besonders Christoph Zwerschke, dem
Verfasser des superben ZX-81-Emulators für den ST, seinen Dank aussprechen.
Erst angesichts dieser Demonstration der prinzipiellen Machbarkeit eines
ZX-Emulators war meine Motivation wieder einmal groß genug, um die schon
jahrelang angesammelten Pläne endlich in die Tat umzusetzen. Gerne gebe ich
auch zu, im Werke meines Vorbildes mich ein wenig belehrt zu haben. Nach einem
halben Jahr zäher Optimierungen und Ringen um jeden Taktzyklus, immer wieder
unterbrochen von grausamen Abstürzen und wunderlichen Effekten am Bildschirm
kann an der Eigenständigkeit dieses Programmierepos nicht gezweifelt werden.
Ein riesiges Danke auch an meine Frau (die nun endlich aufatmen kann) für ihr
Verständnis und die seelische Unterstützung in dieser Zeit.
2. Leistung der Emulation
-------------------------
Der ZX-SPECTRUM wird erstaunlich vollständig emuliert. Der einzige wirklich
erwähnenswerte Unterschied zum Original ist, daß das Hardware-Blinken
(FLASH), das der Spectrum als Video-Attribut zur Verfügung stellt, aus
Geschwindigkeitsgründen (vielleicht am TT dann) nicht unterstützt wird.
Stattdessen werden Zeichen mit dem FLASH-Attribut invers dargestellt. Am
deutlichsten zu merken beim Cursor im ZX-Basic, der am Original blinkt, beim
Emulator aber bloß invertiert ist. Damit läßt sich leben.
Ansonsten kann aber mit folgenden Features aufgewartet werden:
- Die zugrundeliegende Emulation des Z80-Prozessors unterstützt sämtliche
Opcodes, auch die Operationen mit den Indexregister-Hälften und andere
'nichtoffizielle' Z80-Befehle, und die vollständige Interruptlogik des
Z80 (Interrupt-Mode 2 wird in vielen Programmen am Spectrum verwendet).
- Die Video-Emulation stellt alle 16 Farben des Spectrum (8 Farbtöne in
jeweils zwei Intensitäten) sowohl am Farbmonitor, als auch am monochromen
Monitor (in Graustufen) dar.
- Die I/O-Operationen für Tastatur, Lautsprecher und BORDER-Farbe (Farbe
des Bildschirmrandes) werden originalgetreu umgesetzt. Ein am
Joystick-Port des ST angeschlossener Joystick wird als KEMPSTON- und
IF2-kompatibler Joystick (zwei Standards am Spectrum) emuliert.
- Das Kassetten-Handling des Spectrum wird vollständig auf Disk umgelenkt.
Bei Angabe eines Dateinamens beim Laden (LOAD "name"), und beim Speichern
(SAVE "name") ist dieser Vorgang transparent. Das Laden des erstbesten
Programmes vom Band via LOAD "", ist natürlich für Disks sinnlos - es
erscheint ein Fileselektor, aus welchem eines der vorhandenen Programme
ausgewählt werden kann.
3. Start des Emulators
----------------------
Es werden die Dateien SPECCI.PRG und SPECCI.DAT in einem beliebigen
Verzeichnis auf Diskette oder Festplatte benötigt. Nach Starten von
SPECCI.PRG erscheint ein Titelschirm während die Datei SPECCI.DAT nachgeladen
wird und die Initialisierung des Emulators durchgeführt wird. Dies dauert ein
wenig, weil umfangreiche Tabellen im Speicher angelegt werden. Es sollten
auch mindestens ca. 800 kB Speicher frei sein, also auf ST's mit 512 kB Ram
oder 1040ern mit zuvielen installierten Accessories läuft die Emulation nicht
(es erscheint eine Alertbox).
Geschrieben und getestet wurde der Emulator auf einem 1040 STF mit 1 Mb
Speicher und TOS 1.0. Er sollte aber zumindest am ST unter jeder TOS-Version
laufen und sich auch mit Festplatten vertragen. Solange bloß genug
Hauptspeicher vorhanden ist...
Falls der Emulator am Farbmonitor verwendet wird, bitte zuerst in die niedrige
Auflösung schalten (ansonsten erscheint eine Alertbox). In der monochromen
Auflösung werden die Farben durch Graustufen ersetzt.
Nach geglückter Initilisierung beginnt der normale Spectrum-Bootvorgang,
gefolgt von der Einschaltmeldung: der ST ist jetzt ein nahezu originaler
ZX-SPECTRUM. (Bis auf die Geschwindigkeit allerdings, I did my best... am TT
sollte die Emulation ca. so schnell wie das Original sein - mal sehen).
4. Bedienung des Emulators
--------------------------
Die Belegung der Spectrum-Tastatur wurde so getreu wie möglich auf den ST
Übertragen. Folgende Tabelle zeigt die Belegung der Spectrum-Tasten, die am
ST entweder nicht als solche existieren oder anders belegt sind:
ZX-SPECTRUM entspricht am ST Bemerkung
-----------------------------------------------------------------------
Symbol-Shift Alternate oder Umschalt-Taste am Spectrum
rechte Shift-Taste
Caps-Shift Linke Shift-Taste temporäre Umschaltung Groß/Klein
Z Y Weil Spectrum englische Tastatur hat,
Y Z wurde dies auch am ST beibehalten
Zwecks Komfort wurden einige oft verwendeten ZX-Shift-Kombinationen auf
eine der sonst unbenutzten ST-Tasten gelegt, wie aus nachstehender Tabelle
hervorgeht:
ST-Taste entspricht am ZX-SPECTRUM Bemerkung
-----------------------------------------------------------------------
Control Caps-Shift+Symbol-Shift EXTENDED-MODE
F1 Caps-Shift+1 EDIT
F2,CapsLock Caps-Shift+2 CAPS LOCK
F3,Tab Caps-Shift+3 TRUE VIDEO
F4,Esc Caps-Shift+4 INVERSE VIDEO
Cursor links Caps-Shift+5 Cursor nach links
Cursor runter Caps-Shift+6 Cursor nach unten
Cursor rauf Caps-Shift+7 Cursor nach oben
Cursor rechts Caps-Shift+8 Cursor nach rechts
F9 Caps-Shift+9 GRAPHICS-MODE
Delete,BS Caps-Shift+0 DELETE
F10 Caps-Shift+Space BREAK (Programmabbruch)
< Symbol-Shift+O ; (Strichpunkt)
~ Symbol-Shift+P " (Hochkomma)
ß Symbol-Shift+C ? (Fragezeichen)
ö Symbol-Shift+L = (Ist gleich)
ä Symbol-Shift+Z : (Doppelpunkt)
ü Symbol-Shift+2 @ (Absatz)
Emulator-Steuertasten:
ST-Taste Wirkung Bemerkung
-----------------------------------------------------------------------
F6 Reset Entspricht Reset-Knopf beim Spectrum 1)
Help Tasten-Hilfe ZX-Tastaturschablone wird eingeblendet 2)
Undo Farbschaltung Umschaltung farblos-Farbdarstellung 3)
Insert Unterbrechung Erscheint Alert DESKTOP|RESET|CONTINUE
Shift-F6 Desktop Emulator beenden (ohne Abfrage)
1) Eine Kopie des ZX-Roms wird in den Rom-Bereich des Emulators geschrieben
der Z80-Emulator zurückgesetzt und beginnt wieder bei PC=0.
2) Am Farbmonitor wird nur ein Viertel der Schablone auf einmal eingeblendet,
mehrmaliges Drücken von HELP zeigt die restlichen Viertel.
Jede Taste außer HELP kehrt zur Emulation zurück, die Taste wird gleich
übernommen.
3) Der Display-File des Spectrum besteht aus Pixeldaten und Attributdaten.
Bei 'farbloser' Darstellung werden die Attributdaten nicht beachtet -
die Emulation wird etwas schneller.
5) Laden und Speichern von Programmen
-------------------------------------
Programme, Speicherbereiche, Strings und Arrays werden genauso wie am
Original gespeichert: SAVE "name" [CODE, DATA, SCREEN$]. "name" sollte
allerdings nur aus maximal acht Zeichen bestehen (am Spectrum sind 10 Zeichen
möglich).
Das Laden funktioniert analog, mit einer Ausnahme: Weist am Original der
Befehl LOAD "" (Leerstring) an, das nächste am Band daherkommende Programm zu
laden, so ist dies im Diskbetrieb nicht anwendbar. STATTDESSEN ERSCHEINT EINE
AUSWAHL-MASKE. Je nachdem, ob der Ladebefehl für Programme, CODE-Files oder
Variablen war, erscheint nur die Liste der vorhandenen Dateien des jeweiligen
Typs.
Erläuterungen zur Dateiauswahlmaske:
Noramlerweise wird versucht die Datei INHALT.INF im aktuellen Ordner
einzulesen, welche die Namen und Headerdaten aller Spectrum-Dateien in diesem
Verzeichnis enthält. Sollte das File INHALT.INF nicht vorhanden sein (wie
gesagt, für jedes Verzeichnis separat), so wird das Verzeichnis nach
Spectrum-Dateien 'durchgescannt', was einige Zeit dauern kann. Am Schluß wird
versucht, die Datei INHALT.INF zu schreiben, was eventuell zum System-Alert
'Disk schreibgeschützt' führen kann - also am besten Disketten nicht mit
Schreibschutz einlegen.
Angezeigt werden der Dateiname, die Länge in Bytes und die Startadresse (bei
Typen CODE,DATA) bzw. Auto-Start-Zeile (bei Basic-Programmen).
Die Auswahl einer Datei erfolgt mit den Cursortasten 'Up' und 'Down' und
'Return' zum Abschluß. Am oberen Bildschirmrand ist der aktuelle Pfad
angezeigt und kann editiert werden. Hat man einen neuen Pfad eingegeben
(nicht mit 'Return' abschließen!) so kann mit Lese.INF (F1) das
Inhaltsverzeichnis eingelesen werden.
Das Inhaltsverzeichnis wird beim Speichern von Programmen, nicht automatisch
aktualisiert, sondern muß mittels Rescan (F2) neu erzeugt werden.
Mit der Taste 'Escape' kann die Dateiauswahl verlassen werden, ohne etwas zu
laden (Spectrum 'Tape Loading Error').
6. Interna
----------
Der Spectrum-Emulator krempelt die Systemvektoren- und Werte ziemlich um.
VBL-Routinen werden abgeschalten, Tastatur und Timer-Vektoren manipuliert und
der Soundchip umprogrammiert. Bus- und Adressfehler werden abgefangen und der
Illegal-Vektor für die Interrupt-Simulation des Z80 verwendet. Daher ist es
auch durchaus möglich, daß das Programm sich mit anderen im Speicher
liegenden Vektorverbiegern nicht verträgt.
7. Verlassen des Emulators
--------------------------
Durch Drücken von Shift-F6 wird ohne Abfrage sofort zum Desktop
zurückgekehrt. Dabei werden sämtliche Systemwerte, die verändert wurden
(Vektoren, Farbpalette, Soundregistereinstellung etc.) auf die alten Werte
zurückgesetzt.
8. Zum Abschluß einige Spectrum-Dokumentationen
-----------------------------------------------
Speicheraufteilung (Adressbereich: 0-65535)
--------------------------------------------------------------------------
00000-16383 ROM
16384-22527 Display-File (Pixeldaten)
22528-23295 Attribut-File (Farben und Attribute, zeichenorienteiert)
23296-23551 Drucker-Buffer (beliebter temporärer Speicher)
23552-23733 System-Variablen
23734-23754 Systembereich für I/O
23755- Basic-Programm-Speicher + Variablen
Am oberen Speicherende jede Menge Systembereiche, Stacks und User-Grafik.
Interessante Systemvariablen (Worte sind im Low-High-Format!):
Adresse Länge Name Beschreibung
--------------------------------------------------------------------------
23561 1 REPDEL Zeit in 1/50 Sekunden für Tastatur-Repeat
23562 1 REPPER Verzögerung in 1/50 Sekunden zwischen Repeats
23606 2 CHARS Zeiger auf Zeichensatzadresse - 256
23609 1 PIP Länge des Tastaturklicks (man versuche z.B. 10)
23627 2 VARS Zeiger auf Variablen-Bereich des Programms
23635 2 PROG Zeiger auf Programm-Bereich (normalerweise 23755)
23672 3 FRAMES 3 Byte Zähler (Low - High). Alle 20ms inkrementiert
23692 1 SCRCT Anzahl der Scrolls des Screens bevor die Frage
"scroll?" erscheint.
23730 2 RAMTOP Adresse der letzten Speicherstelle für Basic
23732 2 P-RAMT Adresse der physikalisch letzten Speicherstelle
Interessante Systemaufrufe
--------------------------------------------------------------------------
RANDOMIZE USR 3280 Scroll um eine Zeile nach oben
PRINT 65536-USR 7962 Freier Speicher
RANDOMIZE USR 0 Soft-Reset des Spectrum
9. Last but not least
---------------------
Das war's. Allen jenen, die den Spectrum überhaupt nicht kennen, seinen die
Programme "demo1" und "tutor" zum Aufruf empfohlen.
Würdigungen, Lob, sowie Anregungen und Kommentare bitte an folgende
Adresse:
Christian Gandler
Paletzgasse 17/3/14
A-1160 Wien
Viel Spaß und Ciao!
cg, 17.03.91
Version 1.1 vom 14/05/1991
--------------------------
Einige Mängel (und auch Fehler) wurden behoben, die Betriebssicherheit erhöht.
Außerdem unterstützt der Emulator nunmehr das berüchtigte Interface I und die
Microdrives.
Im Detail sind es folgende Änderungen gegenüber der Version 1.0:
- Trap 7 Vektor wurde beim Verlassen des Emulators nicht rückgesetzt.
- Fileselektor liest INHALT.INF problemlos ein (In V1.0 war mitunter
mehrmaliges Drücken von F1 notwendig). Weiters bleibt die Seite der Liste
aktiv für den nächsten Aufruf. Der Bildschirm-Modus wird nicht mehr
umgeschalten, beim Verlassen des Selektors.
- Beim Laden aus Anwendungen heraus, erschien in V1.0 automatisch der File-
selektor. Numehr werden der Reihe nach alle Dateien des Typs 'Code' ange-
boten, was in der Regel früher oder später zum Erfolg führt. Durch
Gedrückthalten von 'Control' oder 'Alternate' beim Aufruf der Ladeoperation
erscheint der Fileselektor wie gewohnt.
- Bei Unterbrechung via 'Insert' werden jetzt alle Z80-Register angezeigt.
- Geringfügige Beschleunigung der Emulation
- Interface 1 & Microdrives:
--------------------------
Der Autor setzt voraus, daß der Leser dieser Zeilen Bescheid weiß, was mit
Interface I' und 'Microdrive' gemeint ist, weil für alle, die damit nichts
anfangen können, ein mehrseitiger Exkurs notwendig wäre. Darum nur für alte
Sinclair-Hasen folgende Erläuterungen:
Durch Gedrückthalten von 'Control' oder 'Alternate' während des
Emulatorstarts vom Desktop (bis zum Ertönen eines Glockenschlags) wird
der Spectrum mit dem Interface I ausgestattet. Es stehen dann also die
fingerverstauchenden Kommandos wie LOAD *"m";1;"name" zur Verfügung.
Damit ein Microdrive angesprochen werden kann, ist aber noch ein wenig
Vorarbeit nötig. Zunächst muß auf irgendeine Weise - zum Beispiel mit
einem kleinen Basic-Programm (ST) eine Datei namens :MD1 (statt der '1'
auch 2...8, je nachdem unter welcher Nummer das Microdrive verwendet
werden soll) erzeugt werden, die genau 132240 Bytes Länge hat. Das ist
der benötigte Platz für 254 Sektoren zu 512 Bytes plus Verwaltungsbuffer
von 8192 Bytes. In GFA-Basic z.B. könnte so ein Programm so ausschauen:
OPEN #"o",#2,"\SPECTRUM\:MD1"
x$=SPACE$(8192)
PRINT #2;X$;
X$=SPACE$(512)
FOR i=1 TO 254
PRINT #2;x$;
NEXT i
CLOSE #2
Diese Datei muß wie angedeutet im selben Verzeichnis angelegt werden, in
dem sich der Emulator (SPECCI.PRG) befindet.
Vom Emulator aus muß das Microdrive wie am Original zunächst formatiert
werden, bevor es verwendet werden kann. Dies geschieht wie gewohnt mit
dem Kommando FORMAT "m";1;"name".
Es stehen ab jetzt sämtliche Microdrive-Kommandos zur Verfügung.
Außerdem kann ein Drucker über RS232-Kommandos betrieben werden (auch
wenn er am Centronics-Port hängt). Beispiel: FORMAT "t",9600: LIST *t
-> sendet ein Basic-Listing an den Drucker (oder was immer an der RS232
oder Centronics-Schnittstelle hängt).
Version 1.2 vom 02/06/1991
--------------------------
Der Emulator ist jetzt wirklich getester Weise voll harddisk-fähig und läuft
am Mega STE 4 mit 16 MHz und eingeschaltenem Cache ohne Probleme (und rund
doppelt so schnell wie am 1040).
TT-Version vom 23/07/1991
-------------------------
Wie zu erwarten, konnte ich nicht eher ruhig schlafen, bevor nicht eine
Version des Emulators für den Atari TT programmiert war...
Aufgrund der verschiedenen Prozessor-Architektur des 68030 waren etliche
Änderungen im Algorithmus notwendig, sodaß ich eine eigene Version für den TT
entwickelte, um den Sourcecode nicht allzu unübersichtlich werden zu lassen.
Am TT muß die Datei SPECCITT.DAT in SPECCI.DAT unbenannt werden, um den
Emulator einzurichten (Originale Datei SPECCI.DAT - die ST-Version - vorher
löschen!). Der Emulator läuft am TT in der niedrigen und hohen ST-Auflösung,
wobei der Cache des 68030 eingeschaltet bleiben kann.
Nebenbei habe ich nun auch die Flash-Attribute des Spectrum emuliert, weil der
TT genügend Rechenleistung dafür hat. Die UNDO-Taste schaltet jetzt zwischen
drei verschiedenen Bildschirmmodi um:
1) Flash wird emuliert (Nach Aufruf aktiv)
2) Flash-Attribute invers dargestellt
3) Attributlose Darstellung
Leider ist der Sound am TT relativ leise, weil der Lautsprecher nicht mehr im
Monitor integriert ist.
Puncto Geschwindigkeit läßt sich sagen, daß sie im Durchschnitt der des
Originals gleicht. Allerdings wirklich nur im Durchschnitt - manche Programme
laufen mit 70%, andere dafür wieder mit 200% ab. Dies liegt daran, daß die
verschiedenen Z80-Befehle unterschiedlich beschleunigt werden - ein generelles
Problem der Prozessor-Emulation.
Noch konnte ich den Emulator mangels TT-Ram noch nicht in diesem schnellen Ram
ablaufen lassen, aber vermutlich dürfte die Geschwindigkeits-Steigerung dann
fast schon zu hoch sein.
Somit lege ich nun endlich die Entwicklung des ZX-Spectrum-Emulators (bis auf
Widerruf) zu den Programmier-Akten (=Backups) und Ihnen das fertige Ding unter
Ihre Sammlung.
Falls Sie ein Spectrum-Freak waren (sind?), schreiben Sie mir doch, ob Ihnen
die Emulation gefällt - würde mich freuen!
Tschüß!