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 fr 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 fr immer wohlwollend im Ged„chtnis behalten. Umfangreiches Basic, nahezu unersch”pflicher Speicher (fr ZX-81 Verh„ltnisse), ppige Farbenpracht und sogar die M”glichkeit T”ne zu erzeugen. Binnen krzester 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 fr 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 Abstrzen 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) fr ihr Verst„ndnis und die seelische Untersttzung 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 Verfgung stellt, aus Geschwindigkeitsgrnden (vielleicht am TT dann) nicht untersttzt 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 untersttzt 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 fr 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 natrlich fr 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 durchgefhrt 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 geglckter 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 zurckgesetzt und beginnt wieder bei PC=0. 2) Am Farbmonitor wird nur ein Viertel der Schablone auf einmal eingeblendet, mehrmaliges Drcken von HELP zeigt die restlichen Viertel. Jede Taste aužer HELP kehrt zur Emulation zurck, 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 fr 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, fr 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 schreibgeschtzt' fhren 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 fr 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 Drcken von Shift-F6 wird ohne Abfrage sofort zum Desktop zurckgekehrt. Dabei werden s„mtliche Systemwerte, die ver„ndert wurden (Vektoren, Farbpalette, Soundregistereinstellung etc.) auf die alten Werte zurckgesetzt. 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 fr 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 fr 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 fr 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. Wrdigungen, 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 untersttzt der Emulator nunmehr das berchtigte Interface I und die Microdrives. Im Detail sind es folgende Žnderungen gegenber der Version 1.0: - Trap 7 Vektor wurde beim Verlassen des Emulators nicht rckgesetzt. - Fileselektor liest INHALT.INF problemlos ein (In V1.0 war mitunter mehrmaliges Drcken von F1 notwendig). Weiters bleibt die Seite der Liste aktiv fr 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 frher oder sp„ter zum Erfolg fhrt. Durch Gedrckthalten von 'Control' oder 'Alternate' beim Aufruf der Ladeoperation erscheint der Fileselektor wie gewohnt. - Bei Unterbrechung via 'Insert' werden jetzt alle Z80-Register angezeigt. - Geringfgige 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 fr alle, die damit nichts anfangen k”nnen, ein mehrseitiger Exkurs notwendig w„re. Darum nur fr alte Sinclair-Hasen folgende Erl„uterungen: Durch Gedrckthalten 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 Verfgung. 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 fr 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 Verfgung. 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 fr den Atari TT programmiert war... Aufgrund der verschiedenen Prozessor-Architektur des 68030 waren etliche Žnderungen im Algorithmus notwendig, sodaž ich eine eigene Version fr den TT entwickelte, um den Sourcecode nicht allzu unbersichtlich 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 gengend Rechenleistung dafr 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 dafr 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 drfte 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 - wrde mich freuen! Tschž!