# @ # @@@@@@@@ @ @@@@@@@@ @@@@@@@@ @ @@@@@@@@ @ @@@@@@@@ @ @ @ @ @ @ @ @ @ @@@@@@@@ @ @ @ @ @ @@@@@@@@ @ @ @ @ @ @ @ @ @ @ @ @ @@@@@@@@ @ @ @ @@@@@@@@ @ @@@@@@@@ @ @ (TM) ZX-SPECTRUM EMULATOR V2.0 ========================= 1. EINLEITUNG Dieses Programm emuliert einen SINCLAIR ZX-Spectrum/48 Computer, einen Z80-Rechner mit integriertem Basic, 48 KB RAM, ausgestattet mit Joystick (Kempston, Interface 2) und optional Interface 1 mit bis zu 8 Microdrives. Ben”tigt wird ein Atari ST mit mindestens 1 MB Speicher (2 sind von Vorteil) und Monochrombildschirm 640x400 bzw. Farbbildschirm 320x200. Eine Festplatte ist nicht erforderlich, jedoch empfehlenswert. Eine eigene Version fr den Atari TT (bzw. Atari Falcon) ist includiert. Auf Rechnern mit 8 MHz kann man die Emulation allerdings nicht unbedingt empfehlen, da die Geschwindigkeit dazu nicht ganz ausreicht. Nichtsdestotrotz ist bei gewissen Spectrum-Programmen und bei optimaler Einstellung aller Emulations-Schalter auch auf diesen Rechnern eine annehmbare Bedienung m”glich, sodaá sich das typische Spectrum-Feeling einstellt. Interessanter wird es erst ab den ST-Modellen mit 16 MHz+Cache. Hier kann man schon eindeutig von "Emulation" sprechen. Manche Spectrum-Programme laufen auf diesen Rechnern schon schneller als am Original, n„mlich all jene die intensiven Gebrauch von den Blockbefehlen LDIR/LDDR machen. Die durchschnittliche Ablaufgeschwindigkeit der emulierten Programme betr„gt ~60% des Originals. Auf den 68030-Rechnern (TT/Falcon) ist eine nahezu "original-schnelle" Emulation m”glich. Die Version 1.2 dieses Programmes ist seit Mitte 1991 auf dem "Markt" - die nun vorliegende Fassung ist stark erweitert und verbessert. Fr alle jene, welche das Programm schon kennen zun„chst eine kurze Zusammenfassung der Neuerungen gegenber der Version 1.2 - alle brigen m”gen bitte bei Kapitel 2 weiterlesen. !! Neu in V2.0: !! - Umfangreiche Setup-M”glichkeiten, welche sowohl die Konfiguration vom Desktop aus erlauben, als auch w„hrend laufender Emulation die Žnderung von Emulations-Schaltern, Pfaden, Farben etc. gestatten. - Emulation ca. 10% schneller, erh”hte Kompatibilit„t (v.a. IM2, Keyboard) - Integrierter Z80-Monitor/Disassembler, JEDERZEIT erreichbar via ESC - Laden und Speichern von SNA-Dateien (RAM-Snapshots), optional versehen mit allen Emulations-Switches, sodaá jedes Programm wieder mit den Schalterstellungen eingeladen werden kann, die am optimalsten sind. - Emulator-Shell, viele Tools, An/Ein-Bindung eigener Programme, Treiber - NMI-Ausl”sung, Externe ROM-Dateien verwenden, Speichern Screen,... Man sieht: es hat sich allerhand getan! Eine detailierte Beschreibung und komplette Auflistung aller Neuerungen werden ab Kapitel 4 gegeben. 2. DIE ENTSTEHUNGSGESCHICHTE Es war einmal vor langer Zeit, als der Autor bei einem Kurzbesuch in London auf die folgenreiche Idee kam, sich unbedingt noch eines der neu auf dem Markt befindlichen kleinen schwarzen Sch„chtelchen als Souvenir mitzunehmen. Das Ger„t war beschriftet mit "ZX81" und stammte von der Firma SINCLAIR. Wahre Wunderdinge hatte man davon geh”rt. Nun ja - die Geschichte ber den heroischen Kampf mit flackernden Bildschirmen und der "Rubout"-Folientaste, w„re ein eigenes Kapitel wert, aber da es hier ja nicht um den "ZX81" geht, sogleich zum Fazit: die Begeisterung war entflammt fr das Programmieren an sich, die ersten Gehversuche in Maschinensprache faszinierten... und als sich ein neuer Rechner als Nachfolger ankndigte, "ZX-SPECTRUM" genannt, war er schon gekauft. Dieser bot auch wahrlich fantastische Features: ppiges BASIC, 16 Farben und Tonausgabe, 48 KB Speicher und war viermal schneller als der ZX81! Das Cassetten-Interface - im Gegensatz zu seinem Vorg„nger - war beindruckend komfortabel und schnell, sodaž dem Abspeichern eigener Werke keine Schwerarbeit vorausgehen mužte. Und das Beste: Ein echter Grafikmodus mit 256x192 Pixeln Aufl”sung fr "realit„tsnahe" Bilder... Man merkt schon: diese Ausfhrungen sollen, in Anbetracht heutiger Mažst„be, ironisch gemeint sein; aber fr den Autor war dieses Ger„t damals eine wahre Offenbarung. Schnell war auch gute Entwicklungssoftware (Editor, Assembler) erh„ltlich, sodaž der Faszination "Z80-Maschinencode" gehuldigt werden konnte und respektable Anwendungen realisiert wurden. Der "ZX-SPECTRUM" mužte im Jahre 1985 einem Atari-ST weichen, doch die Zuneigung zum alten "Specci" blieb. So ist es nicht weiter verwunderlich, daž der Gedanke an eine Nachbildung des Spectrum auf dem Atari l„ngere Zeit im Hinterkopf arbeitete. Einige Experimente dahingehend scheiterten aber 1987 noch an der unzureichenden Erfahrung mit dem ST. Dann wurde der Autor langsam aber sicher zum Atari-Insider, die Idee mit der Spectrum-Emulation geriet jedoch einigermažen ins Vergessen. Erst das Erscheinen eines "ZX81"-Emulators fr den Atari-ST im Jahr 1990 von Christoph Zwerschke ("Hallo Christoph, danke fr die lobende Erw„hnung meines Emulators in Deiner Version 2.00!. Deiner ist wirklich Spitze!!!") berzeugte von der prinzipiellen Machbarkeit einer solchen Emulation und brachte den Stein wieder ins Rollen. Da nun auch die Erfahrung vorhanden war, dauerte es nicht allzulange, bis sich die ersten Erfolgserlebnisse einstellten. Dann folgte jedoch die lange Durststrecke, die zu berwinden war auf der Spur von kurios-spektakul„ren Totalcrashs und mysteri”sen Verhaltensst”rungen des ZX-Atari oder Atari-Spectrum. Das Ergebnis wurde als Version 1.2 bereits einigermažen ausgereift der staunenden ™ffentlichkeit pr„sentiert. Das war im Juni 1991 nach fast einj„hriger Entwicklungszeit. Mittlerweile sind (fast genau) zwei Jahre ins Land gegangen und der Autor hatte - angeregt durch Vorschl„ge von Usern und eigenen Ideen - reichlich Gelegenheit dann und wann an der Leistungsf„higkeit, Optimierung und Erweiterung des Emulators zu feilen, bis das ganze Ding eine sch”ne runde Angelegenheit geworden ist. 3. SCHNELLEINSTIEG FšR DEN EILIGEN BENUTZER 3.1 INSTALLATION Um m”glichst viel auf die Emulator-Diskette zu quetschen, sind alle Dateien komprimiert abgelegt. Daher gibt es ein Installations-Programm, welches die gesamte Arbeit erledigt. Starten Sie also zun„chst "INSTALL.PRG" von der Diskette. Alle weiteren Informationen und Angaben finden Sie dort. Wenn Sie eine Diskettenversion des Emulators erstellen, so werden dafr vier doppelseitig formatierte Disketten ben”tigt. Nach beendeter Installation haben Sie die Option den Emulator sogleich zu starten oder erst das Setup-Utility aufzurufen, mit dem die pers”nliche Konfiguration vorgenommen werden kann. 3.2 LEISTUNGSšBERBLICK Wie schon erw„hnt wird der ZX-Spectrum einigermažen komplett nachgebildet. Tastatur, Bildschirm, Border-Darstellung, Kassetten-Interface und Ton-Ausgabe - alles funktioniert ebenso wie am Original. Auch ein Joystick-Interface wird nachgebildet, sodaž die meisten Spiele mit einem am Joystick-Port des Atari angeschlossenen Joystick zusammenarbeiten. Als Option ist die Emulation des berhmt-berchtigten Interface-1 mitsamt Microdrives m”glich. Der ZX-Printer wird allerdings NICHT emuliert, dafr k”nnen ber die RS232-Emulation des Interface-1 Daten auf die Druckerschnittstelle des Atari umgelenkt werden. Der Emulator ben”tigt in seiner Grundversion die niedrige oder hohe ST-Bildschirmaufl”sung. In der niedrigen Aufl”sung l„uft er vollst„ndig in Farbe, in der hohen Aufl”sung werden passende "Graustufen" verwendet, um die Farben zu unterscheiden. Fr Programmierer ist eine Schnittstelle implementiert, ber die der Emulator mit einigem Programmier-Aufwand an jede beliebige Grafikaufl”sung anpassbar ist (siehe Anhang). 3.3 AUFRUF Die einfachste Art und Weise den Emulator zu starten ist ein Doppelklick auf das Icon von "SPECCI.PRG". Dieses Programm tut nichts anderes als ein hbsches Bildchen anzuzeigen und die Datei "SPECCI.DAT", welche trotz ihres Namens eine echte Programmdatei ist, nachzuladen. K„mpft man mit sehr knappem Speicher, so kann man "SPECCI.DAT" unbenennen in "SPECCI.PRG", das spart ca. 30 kB. Eine weitere M”glichkeit den Emulator zu starten besteht via Start von "SPSETUP.PRG". Dies gibt Gelegenheit noch einige Emulations-Schalter umzusetzen und dann direkt "SPECCI.PRG" nachzuladen (via SHEL_WRITE!). Ist vor allem gedacht zur Einstellung des IF1-Schalters, welcher als einziger nicht zur Laufzeit ver„nderbar ist. Besitzer von TOS-Versionen ab 2.5 oder alternativer Desktops k”nnen den Emulator auch ber SNA-Dateien starten, indem sie ihn als Applikation anmelden, die SNA bzw. SNX-Dateien ausfhren kann. (Siehe Kapitel 5). 3.4 BEDIENUNG Nach dem Start des Emulators beginnt der normale Spectrum-Bootvorgang, der mit der Meldung "(c) 1982 Sinclair Research Ltd." endet. Der Atari ist nummehr zum ZX-Spectrum mutiert. Die "Alternate"-Taste und die rechte Shift-Taste sind als "Symbol-Shift" umfunktioniert und die "Control"-Taste simuliert "EXTENDED-Mode". CapsLock und linke Shift-Taste wirken wie zu erwarten. "Backspace" und "Delete" ergeben beide Delete am Spectrum (CAPS-SHIFT+"0"). Die BREAK-Tastenkombination (Abbrechen von Basic- Programmen) - Caps-Shift+Space - wurde auf die Taste F10 gelegt. Die brigen Tasten sind entsprechend der Spectrum-Tastatur gemappt. Das bedeutet, daž z.B. das Zeichen "@" durch Symbol-Shift+"2" (also Alternate+"2") erh„ltlich ist und nicht al  Atari. Eine Zusammenstellung ist im Anhang aufgelistet. Fr alle Non-Sinclair-Compatibles: der Spectrum verwendet ein Keywort-System zur Eingabe von Befehlen. Wenn der Cursor ein "K" anzeigt, wird die n„chste Taste als Keywort interpretiert. Drckt man z.B. jetzt die Taste "S", so erscheint sofort das Wort "SAVE", oder die Taste "P" ergibt "PRINT". Die Entscheidungen, wann ein Keywort und wann normale Zeichen erzeugt werden sollen, trifft der Spectrum ganz von selber aufgrund der Syntax. Sollten „rgere Probleme mit diesem System auftreten, so kann eventuell das Programm "KEYWORDS.PRG" Erleichterung schaffen (siehe Kaptitel 8). Folgende Tasten am Atari sind mit Emulator-Steuerfunktionen belegt: ESC, F5, F6, F7, F8, HELP, UNDO, INSERT, CLR/HOME Bis auf F6 und F7 sind alle diese Tasten im Prinzip frei konfigurierbar d.h. sie k”nnen bestimmten Programmen zugeordnet werden, die der Benutzer sich selbst schreiben k”nnte. Etliche solcher externen Programme sind bereits enthalten, sodaž man diese nur mehr nach dem pers”nlichen Geschmack zuordnen braucht. Siehe dazu Kapitel 7 und 8. Per Default, d.h. wenn keine eigenen Zuordnungen getroffen werden, gilt: ESC ....... ruft den integrierten Z80-Monitor/Disassembler auf F5 ........ ruft die SNA-Support-Auswahl auf (Spezial-Laden und Speichern) F8 ........ bewirkt nichts HELP ...... bewirkt nichts (in V1.2 integrierte Hilfe-Maske wurde entfernt) UNDO ...... schaltet zwischen den 4 Sets von Emulations-Schaltern um INSERT .... bringt ein Alert "DESKTOP|ZX-RESET|CONTINUE" CLR/HOME .. bewirkt nichts F6 ........ ist "fest-verdrahtet" mit einer "RESET"-Funktion, exakt wie ein Reset-Schalter am Spectrum wirken wrde. "Alternate" mit F6 l”st einen NMI aus, der allerdings im Standard-ROM einem Reset gleichkommt. "Shift-F6" beendet den Emulator sofort und kehrt zum Desktop zurck. F7 ....... ist ebenfalls fest belegt mit einer Funktion zum Abschalten der Sound-Emulation, was bei manchen Programmen sehr n”tig ist, um nicht zu nerven. Fungiert als Tri-State-Schalter zwischen 'normale Emulation', 'Interrupt' und 'abgeschalten' (siehe Kapitel 4.5 und 7). 3.5 LADEN UND SPEICHERN VON PROGRAMMEN Um eines der mitgelieferten Spectrum-Programme zu starten, ist wie am Spectrum einzugeben: LOAD "" d.h. die Taste "J", welche das Keywort "LOAD" ergibt, gefolgt von zweimal "Symbol-Shift P" (Alternate P). Leichter ist das Hochkomma aber auch ber die Tilde "~" erh„ltlich (die Taste rechts neben der "Return"-Taste). Es erscheint ein File-Selektor, der alle verfgbaren Spectrum-BASIC-Programme anzeigt. Sollte die Liste leer sein, so kann mit der Taste "F2" eine Suche nach ladbaren Programmen gestartet werden. Nach Auswahl des gewnschten Programmes mit den Pfeiltasten kann es mit "Return" geladen werden. Wenn der Name bekannt ist, kann natrlich auch anstelle von LOAD "" gleich LOAD "name" eingegeben werden. Zum Speichern eines Programmes ist exakt so vorzugehen wie am Spectrum, also SAVE "name" oder SAVE "name" CODE adr,len. Eine andere Variante Programme in den Spectrum zu laden sind Snapshot-Dateien. Fr den Augenblick gengt es zu wissen, daž mit der Taste F5 eine Liste aller ladbaren SNApshot-Dateien erscheint von denen man eine ausw„hlen und mit "Return" laden kann. 3.6 VERLASSEN DES EMULATORS Beendet wird der Emulator durch Drcken von "Shift-F6", wobei keine Sicherheitsabfrage mehr erfolgt. Je nach pers”nlicher Konfiguration gibt es noch weitere M”glichkeiten zum Beenden. Bei installiertem "SPSETUP.PRG" existiert der Button "QUIT" zum Beenden. In der Default-Konfiguration kann durch "INSERT" eine Emulator-Unterbrechung (Alert) aufgerufen werden, welche die M”glichkeit bietet, zum Desktop zurckzukehren. 4. DIE EMULATION IM DETAIL 4.1 DIE CPU-EMULATION Der ZX-Spectrum enth„lt einen Z80A-Prozessor, der mit 3.5 MHz getaktet ist und - als 8-Bit-Baustein - ber einen Adressbereich von 64k verfgt. Die unteren 32k teilt er sich mit einem anderen Baustein, dem sogenannten ULA-Chip, welcher fr die gesamte I/O zust„ndig ist (v.a. also Bildschirmausgaben). Daher laufen Programme in diesem Bereich mit deutlich unter 3.5 MHz ab. Warum ich dies alles erw„hne? Weil hervorgestrichen werden muž, daž der Emulator den Z80 hinsichtlich des Geschwindigkeitsverhaltens NICHT emuliert, da die Emulationsgeschwindigkeit selbst auf dem Atari TT (im Durchschnitt) h”chstens die Original- Geschwindigkeit des ZX-Spectrum erreicht (wrde erst auf 68040-Systemen Sinn machen). Warum, das will ich versuchen hier zu erl„utern: Der Z80-Prozessor hat mit dem 680xx leider sehr wenig gemeinsam. Dies beginnt bei der umgedrehten Reihenfolge mit der Wortgr”žen in den Speicher gestellt werden (Z80: Low-Byte auf niedrigerer Adresse, 680xx: Low-Byte auf der h”heren Adresse) ber die fehlende direkte Zugriffsm”glichkeit auf das h”herwertige Byte eines Registerwortes beim 680xx, bis zur ziemlich unterschiedlichen Behandlung der Status-Flags. Alles zusammen ergibt einen sehr hohen Aufwand, um einen einzigen Z80-Befehl in ad„quate 680xx-Befehle umzusetzen. Es war daher notwendig, gewisse Abstriche zu machen, um die Geschwindigkeit der Emulation ertr„glich zu halten. Der Emulator verzichtet auf die Nachbildung des N- und des H-Flags des Z80. Dies hat zur Folge, daž der Befehl DAA (ein Spezialbefehl des Z80 bei Addition und Subtraktion von BCD-Zahlen) nicht korrekt emuliert wird. Im Rom des Spectrum kommt dieser Befehl genau einmal vor - die Emulation tr„gt dem Rechnung, sodaž er dort korrekt abl„uft, aber es ist nicht m”glich dies fr die Benutzung in anderen Programmen zu garantieren - in ca. 50% der Anwendungen klappt es, die brigen liefern durch die Beschr„nkung fehlerhafte Counter o.„., die statt kontinuierlich aufw„rts oder abw„rts zu z„hlen (z.B. Score-Anzeige) immer wieder springen und von vorne beginnen.- Desweiteren wird das R-Register des Z80 nicht exakt emuliert, da sonst bei jeder Opcode-Emulation ein zus„tzlicher Befehl eingeschoben werden mžte, was deutlich Zeit kostet. In den meisten F„llen gengt die Art wie das R-Register simuliert wird v”llig. Zuguterletzt wird auch die Parity-Funktion des P/V-Flags nicht emuliert, ebenfalls aufgrund von zu hohem Rechenzeitverlust. Da es aber nur sehr wenige Programme gibt, die damit arbeiten (haupts„chlich Kopierschutz-Mechanismen), ist das nicht weiter tragisch. Nun aber zu den erfreulicheren Leistungen: s„mtliche Opcodes des Z80 werden emuliert, auch die "Inoffiziellen" mit den Indexregister-H„lften und SLL. Soweit eigene Experimente gezeigt haben fhren auch einige der ED-Befehle, die als unbelegt deklariert sind zur Ausfhrung von bereits existierenden ED-Befehlen z.B. ED54 zu 'neg' (ED44) oder ED55 zu 'retn' (ED45). Der Emulator behandelt diese auch so, jedoch drfte es wahrscheinlich kein einziges Programm geben, das dies verwendet. Die Flags C, S, Z und V werden fr alle Befehle exakt emuliert, auch die nichtverwendeten Bits des Flag-Registers (Bit 3 und Bit 5) werden mitgeschleppt. Nachbildung des Z80-Interrupt-Mechanismus ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ein eigenes Thema ist die Simulation des Z80-Interruptsystems. 50 mal in der Sekunde wird der Emulations-Code (quasi der Micro-Code des Z80) unterbrochen und anhand des emulierten IFF (Interrupt-Flip-Flop) getestet, ob die Z80-Interrupts freigegeben sind. Falls nein, ist nichts zu tun, ansonsten muž die Verarbeitung NACH dem gerade in Bearbeitung befindlichen 'Micro-Code' unterbrochen werden, um zur Z80-Interrupt-Routine zu verzweigen. Dazu wird an das Ende des 'Micro-Codes' eine ILLEGAL- Instruktion des 680xx gesetzt und die Abarbeitung fortgesetzt. Beim Erreichen des ILLEGAL-Befehls l”st der 680xx automatisch eine Exception aus und verzweigt zu einer dafr zust„ndigen Behandlungsroutine, in welcher der emulierte Z80-Program-Counter auf den Stack gerettet und auf die dem Interruptmode entsprechende Z80-Interruptroutine gerichtet wird. Nachdem der ILLEGAL-Befehl im Microcode wieder entfernt wurde, wird die Z80-Emulation (mit gel”schtem IFF) durch Verarbeitung des ersten Micro-Codes der Z80-Interrupt-Routine fortgesetzt. Durch diesen Mechanismus wird einerseits das Interrupt-Verhalten des Z80 einigermažen exakt nachgebildet, andererseits braucht der Emulator dafr nur sehr wenig Rechenzeit, weil der Vorgang (680xx-)interrupt-gesteuert ist. 4.2 DIE VIDEO-EMULATION Wird am ZX-Spectrum die Bildschirm-Darstellung vollst„ndig von einem eigenen ULA-Baustein erledigt (ULA = Uncomitted-Logic-Array), d.h. der Z80 braucht nur das Video-Ram mit den entsprechenden Daten versorgen, so muž der Emulator sich auch noch darum kmmern, daž die Screen-Daten des ZX-Spectrum auf den Atari-Bildschirm gelangen. Die Art wie der Spectrum-Bildschirm organisiert ist macht dies nicht gerade zu einer Nebenbesch„ftigung = erfordert einen recht hohen "Transformationsaufwand". Gerade in diesem Bereich der Emulation war sehr viel Tuning und Optimierung notwendig, um den Emulator brauchbar zumachen. Zu Beginn implementierte ich das Ganze auf die naheliegendste Art: ein VBL-Task brachte zyklisch die Screendaten auf den Atari-Schirm. Da aber ein VBL-Interrupt dafr zeitlich nicht gengt, mužte der Bildschirm "h„ppchenweise" im Verlaufe mehrere VBL's aufgebaut werden. Trotz totaler Optimierung auf Neuzeichnen nur bei tats„chlichen Žnderungen, war ich damit einfach nie zufrieden - es brauchte zu lange und die Portionierung des Bildschirms machte sich deutlich bemerkbar. Der 680xx war auch st„ndig blož damit besch„ftigt, festzustellen, ob sich im Bildschirmspeicher des Spectrum irgendwelche Žnderungen ereignet haben. So beschlož ich das Problem "an der Wurzel" zu packen: Der Z80 weis ja genau, wann er ein Byte in den Bildschirm des Spectrum schreibt, sodaž es der Emulator ja auch gleich auf den Atari-Schirm bertragen kann. Das heižt, es mužten alle Opcodes des Z80, die schreibend auf das ZX-Ram zugreifen k”nnen, darauf berwacht werden, ob die Zieladresse im ZX-Videoram liegt. Falls ja, wird sofort eine Routine aktiviert, welche die Žnderung auch gleich im Video-Ram des Atari nachbildet. Da ein Byte Žnderung im ZX-Videoram bis zu 32 Bytes Žnderung im Atari-Videoram mit ca. 300 Instruktionen des 680xx notwendig machen k”nnen, wurde auch ein šberprfung miteingebaut, ob sich der neue Wert berhaupt vom alten unterscheidet (z.B. wenn via CLS der Bildschirm gel”scht wird, sind meistens ohnehin 70% des Bildschirms bereits korrekt besetzt). Diese Methode funktioniert hervorragend, vor allem ist die Darstellung absolut frei von den Effekten des Nachhinkens, so wie bei der VBL-Methode. Das einzige Kriterium fr das korrekte Funktionieren ist, SŽMTLICHE M™GLICHE Z80-Befehle, die Ram ver„ndern k”nnen zu "trappen". Darunter befinden sich auch solche, von denen man zun„chst gar nicht auf die Idee kommen wrde, daž sie dafr Verwendung finden k”nnten den ZX-Bildschirm zu beschreiben z.B. die PUSH-Operationen (Stack-Pointer im Videoram) oder Befehle die ein Bit setzen oder l”schen oder gar CALL-Befehle, die ja ebenfalls ein internes PUSH zur Folge haben. Nun wollte ich aber nicht unbedingt die Emulations-Geschwindigkeit unn”tig herabsetzen, um Befehle zu trappen, die ohnehin nur 0.5% aller Programme am Spectrum dazu mižbrauchen, um Screen-Ausgaben durchzufhren (dies bleibt ebenfalls einer 68040-Version vorbehalten, sollte Atari jemals einen solchen Rechner auf den Markt bringen.- W„re vielleicht ein Anreiz fr Atari, oder?). Der Kompromiž war, daž die wichtigsten Befehle "getrappt" sind, die Exoten aber aužer Acht gelassen wurden. So kann es hin und wieder vorkommen, daž die Ausgaben eines Programmes nicht sichtbar werden, doch dies sollte die Ausnahme sein. Ein paar mal "UNDO" gedrckt stellt den Schirm wieder komplett dar. Der Spectrum kennt acht Farben: schwarz, blau, rot, magenta, grn, zyan, gelb und weiž in jeweils zwei Intensit„ten (wobei die "Farbe" Schwarz keinen Unterschied zwischen den Intensit„ten zeitigt). Zus„tzlich gibt es "Blinken" (FLASH), bei dem zyklisch die Vorder- und Hintergrundfarbe eines 8x8-Bit-Zeichens getauscht wird. All dies wird exakt emuliert. Als zus„tzlicher Luxus ist die M”glichkeit gegeben, die Farbpalette selbst abzustimmen. Am Monochrom-Bildschirm werden die Farben durch verschiedene Graumuster (2x2-Raster) dargestellt, die eine passable Darstellung bieten. Einige Emulations-Schalter k”nnen die Flash-Emulation bzw. die Darstellung der Farben beeinflussen, was nicht im Sinne einer Emulation, jedoch im Interesse einer schnelleren Bildschirmdarstellung ist (siehe Kapitel 7). 4.2.1 BORDER Die BORDER-Emulation basiert auf unterster Z80-Hardware-Ebene d.h. auf der OUT-Emulation, wodurch sie im Prinzip exakt ist. Der grože Unterschied zum Original ist, daž eine Borderfarben-Žnderung dort praktisch keine Prozessor-Zeit in Anspruch nimmt, weil die ULA dies so nebenbei mit der normalen Bildschirmdarstellung miterledigt. Der Emulator muž jedoch eine nicht unbetr„chliche Anzahl von Bildschirm-Bytes neubeschicken - w„hrend der Zeit ruht die Z80-Emulation natrlich. Dies macht sich normalerweise nicht bemerkbar, nur bei Programmen, die aus Gag 500 Mal mit der BORDER-Farbe 'wackeln' (Streifen oder sogar Bilder im Border-Bereich erzeugen), kommt der Emulator natrlich nicht nach; und was am Spectrum auf diese Weise 1/2 Sekunde braucht, dauert am Emulator nahezu ewig. Um dem einigermažen zu entgegnen, kann die Methode der BORDER-Emulation eingestellt werden. Entweder wird jeder OUT-Befehl sofort dargestellt (was zu oben beschrieben Effekt fhren kann) oder man kann die BORDER-Farbe zyklisch (z.B. alle 1/10 Sek.) interrupt-gesteuert aktualisieren lassen, wodurch auch mit solchen Effekten kein Rechenzeitverlust mehr eintritt. Selbstverst„ndlich zeichnet der Emulator die BORDER ohnehin nur dann neu, wenn berhaupt eine Žnderung der Farbe stattgefunden hat. Die Einstellung erfolgt mit dem Setup-Programm. 4.3 DIE KEYBOARD-EMULATION Ein etwas unkomplizierteres Thema ist die Emulation der ZX-Tastatur. Im wesentlichen ist hier eine Tabelle im Einsatz, die fr jeden Tastencode des Atari entsprechende Bits in emulierten I/O-Portadressen l”scht oder setzt. Die eigentliche Auswertung wird dann dem (emulierten) Spectrum berlassen. Nur die Emulator-Steuertasten werden seperat behandelt. Ein Problem bietet blož der Atari-Tastatur-Prozessor: Experimente haben gezeigt, daž er darauf programmiert wurde, nicht mehr als zwei gleichzeitig gedrckte Tasten zu melden d.h. drckt man die Taste "A" so sendet er ein Paket, drckt man zus„tzlich die Taste "S", meldet er auch dies noch, bet„tigt man nun aber noch andere Tasten dazu, so werden sie dem Prozessor nicht mehr mitgeteilt. Ausnahmen sind nur die Umschalt-Tasten, von denen man beliebig viele gleichzeitig gedrckt halten kann (LShift, RShift, Alternate, Control, Caps und auch ESC und TAB). Dies hat zur Folge, daž die Emulation hier hardware-bedingt (bzw. firmeware-bedingt) nicht 100% kompatibel sein kann, weil am Spectrum auch mehr als zwei Tasten gleichzeitig erkannt werden k”nnen. Zum Beispiel liefert IN 65022 fr jede Kombination der Tastenreihe "A-G" andere Werte, am Emulator jedoch ist nach zwei gleichzeitig gedrckten Tasten Schluž. Alles aber halb so schlimm - es gibt ohnehin fast kein Programm, das diese M”glichkeiten nutzt. 4.4 JOYSTICK-EMULATION Der Emulator hat gleich mehrere Joystick-Emulationen eingebaut. Er imitiert sowohl einen Joystick des Typs Kempston (Port 31), als auch das Vorhandensein eines Interface-2, welches zwei Joysticks (Tastensimulation 1-5 oder 6-0) kennt. Alle Werte werden gleichzeitig gesetzt, sodaž fr nahezu jedes Programm das Richtige dabei ist. Einstellungen sind keine erforderlich. In Programmen sollten Sie also immer entweder KEMPSTON- oder INTERFACE-2 Joystick einstellen, wenn danach gefragt wird. 4.5 SOUND-EMULATION Die Tonausgabe am Spectrum erfolgt ber einen Lautsprecher, dem durch st„ndiges software-gesteuertes An- und Abschalten die gewnschten Frequenzen entlockt werden. Der Emulator bertr„gt dieses rohe Vorgehen auf den armen Soundchip des Atari, indem er die Lautst„rke abwechselnd ausschaltet und auf Maximum setzt. Da der Emulator aber nicht mit derselben Geschwindigkeit wie der Spectrum l„uft, ist der erzeugte Ton stets (mal mehr, mal weniger) zu tief. In dem Maže, indem der Emulator an die 100%-Leistung herankommt, pažt auch der Ton. Mit der Taste F7 kann (unabh„ngig von der Setup-Einstellung) die Art der Sound-Emulation umgeschalten werden: Wechsel zwischen: - Jedes OUT wird sofort zum Atari-Soundchip bertragen - Interruptgesteuerte šbertragung der Sounddaten - Soundemulation abschalten (= kein Ton mehr) Die interruptgesteuerte Methode garantiert eine konstante Prozessor- Belastung unabh„ngig vom verwendeten Programm und eine gleichbleibende Qualit„t des Tons, die aber geringer ist, als bei der direkten Methode. Bei Einstellung einer sehr hohen Abtastrate, tritt sogar eine Geschwindigkeits- Einbuže im Vergleich zur direkten Methode ein, was aber bei sehr schnellen Rechnern eventuell als "Bremse" verwendet werden kann. (Im Augenblick sowieso ein illusorischer Gedanke). 4.6 TAPE-SUPPORT-EMULATION Der alte Specci war in der Lage seine Programme und Daten via Kassetten-Recorder zu laden oder zu speichern. Der Emulator untersttzt diese Operationen, lenkt sie aber automatisch auf Diskette oder Festplatte des Atari um. Dies bedingt natrlich einige Unterschiede zum Original. Zum ersten sind am Spectrum 10 Zeichen lange Dateinamen erlaubt, w„hrend das TOS mit 8 Zeichen Namen plus 3 Zeichen Extension arbeitet. Zweitens ist es im Diskettenbetrieb natrlich nicht m”glich mit dem Befehl LOAD "" das n„chste am Band daherkommende Programm zu laden. Schliežlich sollte aber auch die Emulation einen gewissen Fortschritt im Dateihandling bringen, wenn schon Diskette oder Festplatte zur Verfgung stehen. Deswegen wurde dafr ein eigener Fileselektor geschaffen, der in der Lage ist Spectrum-Dateien zu erkennen, Informationen dazu anzuzeigen und per Cursor-Tasten auszuw„hlen und zu laden. Immer wenn mit LOAD "" ein Programm geladen werden soll, erscheint dieser Auswahl-Bildschirm. Dieser wurde als VT52-Applikation, die ber Tastatur zu steuern ist realisiert. Gegenber der Alternative einfach die GEM-Fileselectorbox zu verwenden, hatte diese Methode einige Vorteile: Man braucht keine speziellen Extensions fr die Spectrum-Dateien, man braucht nicht zur Maus greifen nachdem man per Tastatur LOAD "" eingetippt hat und aužerdem k”nnen Informationen wie Dateil„nge, Startadresse oder Startzeile zu jeder Spectrum-Datei angezeigt werden, was der Autor am Spectrum stets sehr vermižte.- Der Selektor speichert diese Informationen in einer Datei namens "INHALT.INF" (welche fr jeden Ordner separat angelegt wird). Dies wurde deswegen eingefhrt, damit er sie nicht bei jedem Aufruf neu ermitteln muž. Wird keine Datei "INHALT.INF" im aktuellen Programm-Ordner gefunden, so startet automatisch ein "Scan" nach ladbaren Spectrum-Dateien in diesem Verzeichnis. Dies kann einige Zeit dauern, weil jede einzelne Datei ge”ffnet und auf "Spectrum" berprft werden muž. Da man aber normalerweise nur selten den Datenbestand „ndert, braucht dieser Prozess nur sporadisch durchgefhrt werden, wenn man die Anzeige wieder auf Letztstand bringen will. Mit der Taste "F2" kann man einen Suchlauf manuell starten, um die Datei "INHALT.INF" auf Stand zu bringen (nicht vergessen Disketten ohne Schreibschutz einzulegen, wenn "INHALT.INF" erzeugt werden soll, da sonst das Systemalert "Diskette schreibgeschtzt" erscheint). Fr jeden der verschiedenen Datentypen des ZX-Spectrum (Programm, Bytes,Numerisches Array und Zeichen-Array) existiert ein eigener Anzeige-Schirm, der mit dem entsprechenden LOAD-Befehl erreicht wird. Zum Beispiel ruft LOAD "" CODE den Fileselektor fr "Bytes" auf. Wenn die Tape-Schnittstelle aus Machinensprache-Programme angesprochen wird, so ist es dem Emulator nicht m”glich, eindeutig zu bestimmen, welche Datei geladen werden soll. Daher versucht er der Reihe nach alle in Frage kommenden Dateien (aus seiner Liste) der Applikation anzubieten, was frher oder sp„ter zum Erfolg fhren sollte. H„lt man w„hrend dieses Prozesses die Alternate-Taste gedrckt, so erscheint der Fileselektor und man kann die Datei selbst ausw„hlen. Speichern aus MC-Anwendungen heraus ist in den meisten F„llen nicht erfolgreich, sofern nicht die dafr vorgesehenen ROM-Routinen verwendet werden. BREAK (Taste F10) ist natrlich jederzeit so wie am Spectrum m”glich, sofern die Applikation dies nicht unterbindet. FORMAT DER ERZEUGTEN DATEIEN Der Emulator legt die Tape-Dateien genauso wie der Spectrum ab, zun„chst 17 Bytes Header, dann der Datenbereich. Der Einfachkeit halber werden Header und Daten in einer Datei zusammengefažt. Der Header liegt gleich am Beginn und hat denselben Aufbau, wie der Tape-Header: Byte 0 Typ der Datei: 0=BASIC, 1=Num.Array, 2=Char.Array, 3=Bytes Byte 1 - Byte 10 enthalten den Programmnamen, mit Spaces aufgefllt Byte 11 und Byte 12: Anzahl der Bytes im Datenblock (Lo-Hi) Byte 13 und Byte 14: Ladeadresse im Speicher bzw. Startzeile BASIC Byte 15 und Byte 16: Nur fr BASIC; Programml„nge minus Variablen Der Programmname entspricht dem beim LOAD-Befehl einzugebenden String, die gesamte Datei wird am Atari vom TOS unter dem auf Grožbuchstaben gewandelten Programmnamen abgelegt d.h. SAVE "NAME" und SAVE "name", welches am Spectrum verschiedene Programme w„ren, erzeugen am Atari physikalisch dieselbe Datei. Beim Laden holt sich der Emulator jedoch den zu vergleichenden Namen aus dem Header, sodaž "NAME" und "name" sehr wohl von Bedeutung sind. 4.7 INTERFACE-1 EMULATION Das Interface-1 ist eine Zusatzplatine fr den Spectrum (von Sinclair), die ihm eine RS232-Schnittstelle und eine Netzwerk-Schnittstelle spendiert, sowie den Anschluž von 'Microdrives' als Massenspeicher erlaubt (Kein Kommentar hierzu - wer sich nicht auskennt, braucht es jetzt auch nicht mehr). Die Netzwerk-Schnittstelle wird NICHT emuliert. Die RS232-Schnittstelle wird untersttzt, sodaž man vom Emulator aus z.B. von einem Original-Spectrum Dateien empfangen, oder welche an ihn senden k”nnte. Weiters kann man dadurch ein ZX-Basic-Listing direkt auf einem am Atari h„ngenden Drucker schicken. Im Setup kann eingestellt werden, wohin die RS232-Daten des Emulators geschickt werden sollen: Atari RS232 und/oder Atari Centronics-Anschluž. Die BREAK-Taste wird abgefragt, so wie am Original. Zum Empfang von Daten wird immer die serielle Schnittstelle verwendet. Es werden stets die RS232-Einstellungen des Systems genommen, d.h. der Emulator stellt selbst keine neuen Werte ein, insbesondere bleibt der Befehl FORMAT #"b";baudrate des Spectrum ohne Effekt. Ich habe problemlos Dateien vom Spectrum mit 9600 Baud vom Emulator aus empfangen k”nnen, hingegen in der umgekehrten Richtung keine konstanten Ergebnisse erzielt, was aber nicht am Emulator, sonder eher am Kabel und/oder Atari-Betriebssystem liegen drfte. Bis jetzt konnte ich keine klare Antwort darauf finden, denn alles schien mehr oder weniger Glckssache oder von der Mondphase abh„ngig. Es wird jedenfalls vom Emulator her die RS232-Schnittstelle bers BIOS angesprochen und sonst keinerlei eigene Routinen verwendet. Anzumerken ist noch, daž mit eingeschaltetem IF1 die Emulation sprbar langsamer wird, weil erstens zus„tzlicher šberwachungscode ausgefhrt werden muž und zweitens das ROM-Paging am Emulator nur durch Kopieren der Roms im Speicher nachvollzogen werden kann, was bei 8192 Bytes, die bei manchen Befehlen dutzende Male herumgeschoben werden mssen, auf die Geschwindigkeit drckt. 4.8 MICRODRIVE-EMULATION Auch diese allerniedlichsten Dinger werden untersttzt. Allerdings nur der Kompatibilit„t zu bestehenden Programmen halber, denn sehr grožen Sinn macht die Verwendung von Microdrives nicht, weil Laden und Speichern von normalen Tape-Files ohnehin zig-Male schneller ist, als am Original. Die Emulation der Drives (wie brigens auch die RS232-Emulation, s.o.) fužt daher auch nicht auf I/O-Ebene, sondern nur auf šberwachen des Program-Counter auf bestimmte Adressen in den ZX-Roms. Wer ber das Betriebssystem (oder die HOOK-Codes aus MC-Programmen) auf die MD zugreift, hat keinerlei Probleme, nur die direkte Programmierung versagt garantiert. Microdrives werden einfach als Dateien gehandhabt, die in sich die Struktur eines Microdrive-Cartrige nachbilden. Die Namen dieser Dateien (bis zu acht Microdrives werden untersttzt) k”nnen frei vergeben werden, wobei an jeden automatisch eine Zahl "1" bis "8" angeh„ngt wird. Wer also unbedingt auch einmal das Hochgefhl erleben will, wenn die Syntax-Prfung die Eingabe von LOAD *"m";1;"name" schluckt, der tue folgendes: - Das Setup-Programm aufrufen und unter "MORE OPTIONS" im Feld 'MD-Pfad' den Pfad und den Namen fr eine Microdrive-Datei einstellen. Dann den Button "ANLEGEN" anklicken und die gewnschten Drives ausw„hlen. Die Dateien werden nun angelegt und (falls gewnscht) gleich "formatiert". - Im ersten Setup-Dialog den Schalter 'IF1' ankreuzen. - Den Emulator mit eingeschaltetem IF1-Switch starten ("IF1 aktiv!" sollte beim Start kurz zu sehen sein). - Schon k”nnen alle MD-Operationen durchgefhrt werden, als da sind: FORMAT ( z.B. FORMAT "m";1;"cartr_1" ) CAT ( z.B. CAT 1) SAVE ( z.B. SAVE *"m";1;"program" LINE 1 ) LOAD ( z.B. LOAD *"m";1;"program" ) ERASE ( z.B. ERASE "m";1;"program" ) OPEN ( z.B. OPEN #4;"m";1;"seqfile" ) CLOSE ( z.B. CLOSE #4 ) INPUT ( z.B. INPUT #4;name$ ) PRINT ( z.B. PRINT #4;name$ ) 4.9 RESTRIKTIONEN DER EMULATION Hier sollen noch einmal all die bereits erw„hnten Beschr„nkungen und systembedingten Unexaktheiten der Emulation kurz zusammengefažt werden und einige weitere Eigenheiten des Spectrum, die nicht emuliert werden, erw„hnt werden: - Statusflags Half-Carry (H) und Subtraktion (N) ( -> DAA) - R-Register nicht exakt, sondern nur prinzipiell - Parity-Funktion des P/V-Flags - Screen-Emulation trappt nicht alle Opcodes - Tastatur firmeware-bedingt nicht 100% nachbildbar - Interface-1 nur auf Systemebene, nicht auf Prozessor-Ebene, emuliert. - Geschwindigkeitsverhalten (relativ und absolut) nicht emuliert 5. SNA-SUPPORT 5.1 DER STANDARD SNA-SNAPSHOT Man muž nun endlich bekennen: Es existieren auch noch andere Spectrum-Emulatoren auf dieser Welt. Fr den Commodore Amiga wurde einer der ersten geschrieben und dieser verwendete ein Verfahren zum Laden und Speichern von Spectrum-Programmen, welches SNA-Format ("SNApshot") heižt. Es drfte von irgendeinem der in sp„teren Jahren des Spectrum auf den Markt gekommenen Freezer stammen, die in der Lage waren, per NMI-Interrupt jedes laufende Programm zu unterbrechen und auf Kassette, Micro-Drive oder Diskette zu sichern. Dies wurde als "Snapshot" bezeichnet, weil es den gesamten Zustand des Spectrum (Prozessor-Register, Prozessor-Status und gesamten RAM-Inhalt) schnappschuž-artig festzuhalten in der Lage war. Solcherart gespeicherte Programme konnten sp„ter wieder eingeladen und exakt dort fortgesetzt werden, wo sie unterbrochen wurden. Ein fr den PC erschienener Emulator namens "jpp" hat dieses Verfahren ebenfalls implementiert, sodaž es eigentlich eine Art "Standard" fr Spectrum- Emulatoren (klingt ja irre!) geworden ist. Im Emulator integriert befinden sich nun Routinen, die das Speicher und Laden von Programmen im SNA-Format beherrschen. DER INTEGRIERTE SNA-SUPPORT BILDSCHIRM Da darauf Bedacht genommen werden wollte, daž die Emulatordatei nicht zu grož wird, damit auch Anwender mit nur 1 Mb Speicher nicht in Probleme kommen, ist im Emulator selbst nur eine sehr spartanische Bedienerfhrung zum Laden und Speichern von SNA-Dateien enthalten, die gerade den Zweck erfllt. Fr alle, die mehr als 1 Mb besitzen, gibt es ein externes Programm, welches eine wesentlich komfortablere Bedienung bietet (siehe dazu Kapitel 8). Doch nun zur Erl„uterung der internen Funktion: Mit der Taste "F5" gelangt man jederzeit in den "SNA-Support"-Screen. Dieser erlaubt die Eingabe eines Dateinamen fr eine SNA-Datei die entweder geladen werden soll oder in die ein Snapshot des aktuellen Programmes gesichert werden soll. Wird nur ein Dateiname eingegeben, so wird der aktuelle SNA-Pfad (aus dem Setup) verwendet, wird ein Pfad angegeben, so wird dieser verwendet. Nach Eingabe des Namens entscheidet "Return" fr Laden oder "F5"fr Sichern. Zur Verdeutlichung: Eingabe Name, F5 (ohne "Return" zu drcken) schreibt einen Snapshot. Eingabe Name, "Return" liest einen Snapshot. Ein "Feature" ist doch noch drinnen: Wenn kein Name angegeben wird d.h. die Eingabezeile leer gelassen wird, so wird automatisch der Name "temp.sna" verwendet. Dies hat den Vorteil, daž man sehr schnell mal zwischendurch einen Snapshot von einem Spiel ablegen kann (z.B. wenn man mehrere Varianten eines Levels probieren m”chte) indem man einfach zweimal hintereinander "F5" drckt. Dies sichert den Snapshot unter "temp.sna". Will man dann sp„ter zu diesem Spielstand zurckkehren drckt man blož "F5" und "Return" und schon wird "temp.sna" eingeladen. LADEN VON SNA-DATEIEN VIA TAPE-FILESELEKTOR Nachtr„glich wurde in V2.0 der Tape-Fileselektor dahingehend erweitert, daž er auch Snapshot-Dateien erkennen und anzeigen kann. Diese werden in der Liste der Programme gefhrt und man erkennt sie an der angezeigten L„nge von 49179 Bytes. Somit kann man durch Eingabe von LOAD "" Snapshots auch ber den Tape-Fileselektor laden. Als kleines Feature wird aber, wenn man eine Snapshot-Datei auf diese Weise l„dt, nach dem Laden zun„chst in den Monitor verzeigt, sodaž man vor der Ausfhrung noch etwas manipulieren kann. 5.2 ERWEITERTES SNAPSHOT-FORMAT Der Einbau der Snapshot-Untersttzung wurde gleich genutzt, um ein eigenes "erweitertes" Snapshot-Format, ich habe es "SNX"-Format ("SNapshot- eXtended") getauft, zu kreieren, welches aber nur fr diesen Emulator Gltigkeit hat. Es bietet den Vorteil, daž zus„tzliche Informationen ber die wichtigsten Emulator-Einstellungen mit abgespeichert werden, sodaž jedes Programm speziell angepažt werden kann. So ist es z.B. in manchen Programmen absolut unn”tig, daž FLASH emuliert wird (kostet immerhin 5% Rechenzeit), andere machen Probleme mit der BORDER-Darstellung, wenn sie wie wild damit "wackeln" und damit den Emulator ins Schwitzen bringen, sodaž die Einstellung "BORDER im Interrupt darstellen" angebracht ist. Beim Einladen des Snapshots werden dann die Emulator-Schalter auf die gesicherten Werte gesetzt. Zus„tzlich wird in diesem Format komprimiert abgespeichert, w„hrend das Standard-Format immer 49152 Bytes belegt, egal wie grož das eigentliche Programm ist. Es ist zwar nur die simpelste aller Komprimierungsmethoden, aber sie hat den Vorteil, daž sie kaum Zeit braucht und bei Programmen, die nur einen Teil des Speichers belegen sehr effizient ist. Wer eigene Speicher-Routinen schreiben will, die besser komprimieren, ist ja mit der M”glichkeit beliebige externe Programme einzubinden bestens bedient (siehe Kapitel 8). Im Anhang befindet sich eine genaue Beschreibung des SNA und SNX-Formats. Die Entscheidung, in welchem Format SNA oder SNX gearbeitet werden soll, kann im Setup eingestellt werden. Da das Setup auch zur Laufzeit verfgbar ist (bei entsprechender Konfiguration des Emulators) kann man auch bequem hin und herschalten. Beim Laden erkennt der Emulator das Format unabh„ngig von der Einstellung selbstst„ndig. Mit dem Standardformat erzeugte Snapshots sollten ohne Probleme auch von den anderen Spectrum-Emulatoren geladen werden k”nnen und vice versa. Da in diversen Mailboxen solche Dateien verfgbar sind, steht einem Datenaustausch zwischen verschiedenen Emulatoren nichts mehr im Wege. 5.3 AUTOSTART VON SNA-PROGRAMMEN Beim Start des Emulators werden zwei Prfungen bezglich automatischem Start einer SNA-Datei vorgenommen: Wenn im eingestellten SNA-Pfad (von Set 1) eine Datei namens 'AUTO.SNA' vorhanden ist, so wird diese sofort eingeladen und ausgefhrt. Damit kann man bei jedem Emulatorstart (und auch nach Reset) sofort eine Spectrum-Applikation starten (z.B. ein Auswahlmen oder eine Erweiterung des ZX-Betriebssystems). Diese Prfung wird nur vorgenommen, wenn der Setup-Schalter 'AUTO' entsprechend eingestellt ist d.h. man braucht nicht die Datei 'AUTO.SNA' l”schen, wenn man das Laden verhindern will, sondern es gengt den Schalter im Setup-Programm abzudrehen. Wenn die Kommandozeile einen Dateinamen enth„lt, so wird dieser als SNA- Datei interpretiert und die betreffende Datei zu starten versucht. Dies ist gedacht, um dem Desktop den Emulator als Anwendung fr SNA-Dateien unterjubeln zu k”nnen, wodurch man sehr bequem Spectrum-Programme durch Anklicken eines Ikons am Desktop oder in einem Fenster starten k”nnte. Also schnell ein Ikon fr 'Jet-Set-Willy' gezeichnet und los gehts! 6. DER INTEGRIERTE Z80-MONITOR Einen Tastendruck entfernt - in der Grundeinstellung mit "Esc" - ist jederzeit ein Z80-Disassembler/Monitor erreichbar. Dieser macht es sehr einfach in Programmen zu schnffeln, nach Byte-Folgen zu suchen und Patches durchzufhren. Die Bedienung wurde in "Hot-Keyboard"- Technik realisiert d.h. es ist fast nie erforderlich "Return" zu drcken, sondern der Monitor reagiert unmittelbar auf Tastendrcke. Alle Zahleingaben sind in Hexadezimal durchzufhren, wobei nach Eingabe der erforderlichen Stellen ein Auto-Return durchgefhrt wird. Jeder Befehl kann durch "Esc" vorzeitig abgebrochen werden, solange noch Parameter eingegeben werden. Auch die Ausgaben sind alle in Hex, bis auf den Offset in disassemblierten Befehlen mit den Index-Registern z.B. 'ld a,(ix+11)': hier ist die '11' dezimal angezeigt, und bei den Befehlen mit BOOLSCHER Algebra (AND, OR, XOR), bei denen Konstanten bin„r ausgegeben werden z.B. 'xor a,%10000000'. Monitor-Befehle im Einzelnen: ----------------------------- ESC w„hrend eines Kommandos: Abbruch des aktuellen Kommandos. ESC als erste Eingabe nach '>'-Prompt: VERLASSEN des Monitors, OHNE šbernahme etwaiger Register-Žnderungen (-> 'X'). H Hilfe. Kleine Befehlsbersicht wird angezeigt. A adr Einstellen der Startadresse fr D,L,M,F-Kommandos D Disassemblieren ab adr L Hexdump ab adr, rechts im Text-Format (ZX-Code) SPACE,Return Fortsetzung von D oder L, jeweils eine Zeile M B Žndern (Modify) Speicher ab adr byteweise M W Žndern Speicher ab adr wortweise ($1234 wird als $3412 abgelegt!) M A Žndern Speicher ab adr in Ascii (Texteingabe) M K Žndern Speicher ab adr mit konstantem Wert: Wird leer ausgel”st, wird die Konstante verwendet, ansonsten die Eingabe. F B w1 w2 .. Suche nach Hex-String ab adr; Abschluss der Werteingabe mit . Es werden die Adressen von gefundenen Stellen angezeigt, wobei jeweils nach 7 Vorkommen eine neue Zeile verwendet wird und auf Best„tigung mit oder Abbruch mit gewartet wird. F A text Suche nach Text ab adr. R Z80-Register anzeigen. X Register „ndern. Es werden zuerst die aktuellen Register-Werte angezeigt. Nun kann der Reihe nach jedes Register ge„ndert werden. (Leerausl”sung) beh„lt den aktuellen Wert und springt zum n„chsten Register; verl„žt die Maske vorzeitig, wenn keine weiteren Žnderungen mehr zu machen sind. Bei dem Eingabefeld fr Interrupt-Mode sind Werte 0 bis 2 erlaubt, '+' oder '-' fr den Status. G Fortsetzen des Programmes ab adr. Wenn adr nicht eingegeben wird, so wird der aktuelle PC verwendet. Eventuell ver„nderte Register werden gesetzt. U adr Es wird ein Break-Point auf adr gesetzt und ein G aus- gefhrt. Beim Erreichen des Breakpoints wird der Monitor aktiviert. Sollte auf den Breakpoint nicht aufgelaufen werden, so wird er beim n„chsten Aufruf des Monitors automatisch gel”scht. Z Anzeige des ZX-Screens. Nochmals 'Z' kehrt zurck. S Der ZX-Screen wird im ZX-Format (17 Bytes Header + 6912 Bytes Screendaten unter 'name' auf Platte gesichert. Wenn Name leer ausgel”st wird, wird der Defaultname 'zxsc' verwendet. Wenn der Name keinen Pfad enth„lt, so wird in den aktuellen Programm-Pfad gesichert. Der Screen kann dann direkt via LOAD "name" SCREEN$ vom Emulator aus geladen werden. Das Zusatzprogramm "ZX_BILD.PRG" erlaubt das Laden von ZX-Screens und kann diese als DOODLE- oder Degas-Datei abspeichern (siehe Kapitel 8.6). V Rcksetzen des Monitors: CLS und adr=PC. 7. DIE PERS™NLICHE KONFIGURATION Mithilfe des beigefgten Programmes "SPSETUP.PRG" kann der Emulator an den eigenen Geschmack angepažt werden. Im Einzelnen sind folgende Einstellungen m”glich: Eigenes ROM verwenden ===================== Der Schalter ROM muž angew„hlt sein. In der Zeile darber befindet sich der Pfad zur ROM-Datei, die anstelle des Default-ROM's geladen werden soll. Durch einen Mausklick auf diese Zeile kann ber den Fileselektor eine ROM-Datei gew„hlt werden. Dies muž eine Datei mit entweder 16384 Bytes (Hauptrom) oder mit 16384+8192 (Hauptrom + Interface-1-Rom) Bytes L„nge sein. Config-Button: Spezialtasten definieren und Programmen zuordnen =============================================================== Die Tasten "Escape", "F5", "F8", "Home", "Help" und "Insert" k”nnen mit eigenen "Funktionen" belegt werden. Dies ist so implementiert, daž einfach externe Programme gestartet werden, die den Tasten zugeordnet werden. Wie im Kapitel 8 beschrieben, sind auf diese Weise komplexe, interaktive Einflužnahmen auf den Emulator-Lauf m”glich. Zur optimalen Ausnutzung ist eine residente Einbindung dieser Zusatzprogramme m”glich, wodurch das Nachladen beim Aktivieren entf„llt und man den Eindruck einer fest im Emulator integrierten Funktion erh„lt. Nach Klick auf den Button "Config" erscheint ein Dialog, der die Zuordnung der definierbaren Tasten anzeigt. Die Check-Box auf der linken Seite des Programm-Namens aktiviert oder deaktiviert das entsprechende Programm, welches h„ndisch einzutasten ist. Ein Mausklick auf den Programm-Namen ”ffnet eine weitere Box, in der n„here Einstellungen get„tigt werden k”nnen, als da sind: - Farbpalette umschalten, wenn das Programm aktiviert wird: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Erl„uterung: Die Systempalette wie vor dem Start des Emulators wird w„hrend der Emulation durch eine eigene Palette ersetzt. Mit dieser Einstellung wird entschieden, ob beim Aufruf des Programmes die Systempalette wieder rckgesetzt wird oder ob es mit der Spectrum-Palette gestartet wird. - Programm im ZX-Modus d.h. mit laufendem Emulator aktivieren: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Erl„uterung: W„hrend der Emulation sind viele der System-Vektoren auf eigene Routinen umgelenkt bzw. deaktiviert. Insbesondere der Tastatur-Interrupt und der Timer B und C sind ver„ndert. Daher sollte diese Einstellung normalerweise deaktiviert sein. Spezielle Programme k”nnen jedoch diese Option ver- wenden, um in das Emulatorgeschehen einzugreifen. - Programm resident in den Speicher laden: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Erl„uterung: Bestimmt, ob das Programm beim Emulatorstart resident im Speicher verankert wird oder ob es bei jedem Aufruf neu von Platte/Diskette geladen wird. Insbesondere fr Betrieb mit Diskette brauchbar. Allerdings mssen die Programme auch Residenz-f„hig sein d.h. insbesondere bei Initialisierung ihrer Daten (Resourcen) darauf Bedacht nehmen. - Return des Programmes auswerten: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Erl„uterung: Mit diesem Schalter wird eingestellt, ob das Programm einen Return-Wert fr den Emulator liefert. Programme die Werte liefern, mssen sich an die dafr vorgesehene Schnittstelle halten (siehe Anhang)! Die Check-Boxen auf der rechten Seite des Programm-Namens gelten nur fr den sobenannten "Shell"-Modus des Emulators, bei welchem dieser von einem Shell-Programm gestartet wird. Bei angekreuzer Box kehrt der Emulator zur Shell zurck, wenn die entsprechende Taste gedrckt wird. Alle anderen Einstellungen haben in dieser "Betriebsart" keine Bedeutung, sondern das Shell-Programm hat die volle Entscheidung was passieren soll, wenn der Emulator mit der Taste x zurckkehrt. Im Prinzip kann man den Spectrum- Emulator in diesem Modus als Unterprogramm auffassen, das eben mal den ZX-Spectrum nachmacht und mit definierten Werten zurckkehrt. Im Anhang findet sich eine genaue "Schnittstellen"-Definition fr das Shell-Programm. Vier verschiedene Settings einstellen ===================================== Um bequem mehrere Einstellungen der Emulations-Schalter zur Verfgung zu haben, k”nnen vier verschiedene Sets definiert werden, zwischen denen dann in Runtime per Tastendruck (Default: UNDO) umgeschalten werden kann. Die Sets k”nnen durch Klicken auf die Set-Nummern in der Titelzeile einzeln angew„hlt werden - das gerade bearbeitete Set ist invers dargestellt. Die Beschreibung der einzelnen Schalter: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IF1 Interface-1 eingschalten (nur im Set 1 anw„hlbar) VBL Screendarstellung im Vertical-Blank-Interrupt statt direkt. Ein versteckter Dialog ”ffnet sich durch Anklicken des Strings "VBL". Der Emulator verwendet hiervon aber nur die Einstellung der VBL-Sequenz-Folge. Ein externer Video-Treiber k”nnte auf die anderen Werte (Anzahl Zeilen/VBL, "intelligent") eventuell sinnvoll verwerten. Die Darstellung im VBL bringt im Prinzip nur als Tuning-Maž- nahme bei 8 MHz-ST's etwas. FLASH Flash (Blinken) emulieren oder nur invers darstellen ATTRIBUTES Attribute darstellen oder nur Pixeldaten darstellen R-REGISTER R-Register simulieren oder konstant lassen X-SNA Speichern im Extended-SNA Format oder im Standard-SNA Format 100 INT/S Verdopplung der Interruptfrequenz einschalten. Bringt oft eine deutlich bessere Steuerbarkeit von Programmen, bei Verlust von ein wenig Emulationsgeschwindigkeit. TAUSCH Z-Y Wen es nervt, daž die Tasten Z und Y am Atari gerade umgekehrt belegt sind, kann dem durch Aktivieren dieser Option abhelfen. RS232-OUTPUT Hier kann man Einstellen an welche Schnittstelle(n) der serielle Output via IF1 gehen soll. AUTO-SNA Bestimmt, wann die Datei AUTO.SNA geladen werden soll, nur bei Start des Emulators, nach Reset oder gar nicht. SOUND Methode der Sound-Emulation; bei Option "Interrupt" kann noch zus„tzlich die Abtastrate eingestellt werden - einfach auf die Box "INTERR." klicken. BORDER Methode der Border-Emulation; wie bei SOUND Z80-ILLEGAL Verhalten beim Auftreffen auf einen illegalen Z80-Befehl EMU-ERROR Verhalten beim Auftreten eines Emulator-Fehlers (Bus-Error oder Adress-Error). Der Fall sollte eigentlich nie auftreten. Einstellen der Farbpalette ========================== Im "MORE OPTIONS" Dialog kann im Feld "Farbpalette" die Farbpalette (was sonst!) eingestellt werden, die in der 320x200-Aufl”sung verwendet wird. Einige mehr oder weniger sinnvolle Optionen sind w„hlbar, wenn man einen Mausklick auf das Feld ausfhrt. In Low-Res erscheint dann ein kleines Men, in der hohen ST-Aufl”sung kann man (aber nur in der "Runtime"-Betriebsart, siehe weiter unten) Schwarz/Weiž vertauschen, die Darstellung also invertieren. Einstellen der Emulator-Pfade ============================= In selbem Dialog sind auch die Felder zur Einstellung aller Systempfade. Man kann sie entweder eintippen oder durch Klick auf die Felder via File-Selektor ausw„hlen. Einstellen von ein paar Hardware-Konstanten =========================================== Ebenfalls im "MORE OPTION" Dialog findet man die Eingabe fr den Wert, den der Spectrum als Interrupt-Mode-2 Hardware-Vektor generiert. Der Standardwert dafr ist $ff, aber da es offenbar nicht unbedingt so sein muž, habe ich den Wert einfach wartbar gemacht. In verschiedenen Serien des Spectrum unterscheidet sich auch der Pegel an Bit 6 der Portleitungen bei Input. Dies ist das sogenannte EAR-Bit, d.h. der Pegel am EAR-Eingang des Kassetten-Interface. Manche „ltere Spectrum-Programme haben durch fehlendes Ausmaskieren der irrelevanten Bits bei IN-Operationen Probleme mit der Erkennung von Tasten, weil sie fix davon ausgehen, daž der EAR-Pegel auf 0 steht. Deswegen ist dieser Wert einstellbar. ZUR BEACHTUNG ============= Alle Einstellungen im "MORE OPTIONS" Dialog sind Set-bezogen, gelten also nur fr das gerade bearbeitete Set. Dies hat den Vorteil, daž man via Tastendruck auch die Palette oder die Systempfade "switchen" kann, aber die Konsequenz, daž man die gewnschten Einstellungen fr jedes Set abermals durchfhren muž. Was das Programm "SPSETUP" sonst noch kann: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Das Programm ist "runtime"-f„hig, d.h. man kann es seinerseits als externes Programm konfigurieren, welches zur Laufzeit des Emulators per Tastendruck aufgerufen werden kann. Hierfr sind folgende Einstellungen im Config-Dialog vorzunehmen: resident egal, Atari-Modus, MIT Return, Palette egal Vom Emulator aus aktiviert bietet es ein paar andere Buttons an, welche die ROM-Einstellungsboxen berblenden: NMI ausl”sen, RESET ausl”sen, Laden und Speichern von/als SNA/SNX, Speichern des aktuellen Screen-Inhaltes und Speichern/Laden beliebiger Bl”cke des Z80-Adressraumes sowie Beenden des Emulators. Aužerdem befindet sich ein Knopf "SICHERN" im unteren Bereich, mit welchem die gesamten Einstellungen, die der Emulator im Speicher gerade hat in die Datei "SPECCI.DAT" permanent ablegt werden k”nnen. In der Titelzeile erscheint beim Aufruf vom Emulator zus„tzlich ein Set mit der Bezeichnung "T", welches das Arbeits-Set darstellt, eine Kopie des gerade aktuellen Sets. Werte die hier ver„ndert werden haben nur tempor„re Auswirkung bis zum n„chsten Umschalten von Sets im Zuge des Ladens von SNX-Dateien oder ber die eingestellte Spezialtaste. Hiermit kann man also experimentieren ohne sich die Sets zu verstellen. 8. DIE ZUSATZ-PROGRAMME 8.1 ALLGEMEINES ZUR EINBINDUNG VON EXTERNEN PROGRAMMEN Die meisten der unten angefhrten Programme sind in GFA-BASIC geschrieben - meiner erkl„rte Lieblingssprache neben Assembler. Ein "Quantensprung" an Komfort war die Entdeckung, wie man Programme resident in den Speicher laden und von dort beliebig oft starten kann. Leider spielte das GFA-Compilat nicht ganz mit, doch mit einem kleinen Patch, der automatisch durchgefhrt werden kann, liež sich dies beheben. Die Patch-Routine steht im Programm selbst und wird beim ersten residenten Aufruf ausgefhrt, sodaž nachfolgende Aufrufe klappen. 8.2 KEYWORDS.PRG Beendet den Krampf mit der Suche nach dem verflixten Keywort im ZX-Basic. Dieses Programm ist gedacht als residenter Ersatz fr z.B. die HELP-Funktion. Es werden alle Zeichen und Token des Spectrum aufgelistet und es kann mit den Cursortasten durch die Liste gescrollt werden. Mit "Return" wird das Zeichen unterm Cursor an den Spectrum-Emulator 'geschickt' (in Systemvariable LAST_K gepatcht). Mit "F1" kann die Anzeigeart (nach Code oder alphabetisch) umgeschaltet werden. "ESC" verl„žt die Anzeige ohne šbernahme des Zeichens. Einstellungen im Setup: resident egal, Atari-Modus, ohne Return, Palette egal Das Programm kann man auch vom Desktop aus starten (nur Anzeige). 8.3 SPSHELL.PRG Emulator-Shell, welches die Zusatzprogramme unter einer GEM-Menleiste vereinigt und den Zugriff auf Accessories vom Emulator aus erlaubt. Ben”tigt die Datei "SPSHELL.INF", welche die Liste der einzubindenden Programme und ihrer Aufrufparameter enth„lt. Siehe auch Anhang. 8.4 ZXF.PRG Ein Ersatzprogramm fr den sehr spartanisch gehaltenen SNA-Support-Screen des Emulators (dieser wurde aus Speicherplatzgrnden - damit auch Benutzer mit 1 Mb den Emulator noch laden k”nnen - so einfach gehalten). Ist also sinnvoller Weise auf die Taste F5 zu legen. Nach Aufruf werden alle SNA-Dateien im aktuellen Verzeichnis angezeigt. Mit den Cursortasten kann das Verzeichnis und sogar das Laufwerk gewechselt werden. Eine Datei kann aus der Liste ausgew„hlt oder ein Dateiname eingegeben werden. Drckt man "Return" so wird die Datei geladen, mit "F5" wird das aktuelle ZX-Ram unter dem angegebenen Namen gespeichert. Die Endung ".SNA" oder ".SNX" wird automatisch an den Namen angeh„ngt, sollte sie nicht angegeben werden. Um eine Datei ohne Extension zu erzeugen (beim Speichern) muž der Name mit einem abschlieženden Punkt eingegeben werden. Wird eine bestehende Datei berschrieben, so erscheint zuvor eine Warnung. Einstellungen im Setup: ~~~~~~~~~~~~~~~~~~~~~~~ resident egal, Atari-Modus, Return AUSWERTEN, Palette egal 8.5 ZX_TAST.PRG Eine neue, hbsch gestylte Anzeige der Original-ZX-Tastatur. Diese Version bietet in Farbe eine sehr realistische Darstellung, allerdings in vier Teilen. Grundlage ist eine Resource-Datei, die mit einem Resource-Editor bearbeitet werden kann. 8.6 ZX_BILD.PRG Ein Programm mit dem ZX-Screens (Dateil„nge 6912 Bytes) geladen und angezeigt werden k”nnen (in 640x400/2 und 320x200/16). Die rechte Maustaste bringt ein Pop-Up-Men zur Anzeige, welches erlaubt, die dargestellten Screens im Degas-Format oder Doodle-Format abzuspeichern. Das Programm ist nicht komplett ausgebaut, die Paletten-Option ist nicht implementiert. Es kann als Ausgangsbasis fr eigene Entwicklungen dienen. Einstellungen im Setup: ~~~~~~~~~~~~~~~~~~~~~~~ resident egal, Atari-Modus, ohne Return, Palette restaurieren 8.7 ZXH.PRG Dies ist die ausgelagerte Hilfe-Funktion aus V1.2! Zeigt eine ZX-Spectrum Tastaturschablone an. Je nach Bildschirmaufl”sung eventuell in mehreren Ausschnitten, die man mit der "HELP"-Taste durchbl„ttert. Beenden mit jeder anderen Taste. Einstellungen im Setup: ~~~~~~~~~~~~~~~~~~~~~~~ resident, Atari oder ZX-Modus, ohne Return, Palette nicht restaurieren Wird das Programm im ZX-Modus betrieben, so wird die Taste mit der die Schablone verlassen wird, gleich an den Spectrum-Emulator bergeben. 8.8 ZXS.PRG Ein Programm, das die im Emulator integrierte Umschaltung zwischen den einzelnen Konfigurations-Sets (via UNDO) nachbildet, wodurch diese Funkion auf jede andere freie Taste gelegt werden kann, um die Taste UNDO fr andere Aufgaben einzusetzen. Einstellungen im Setup: ~~~~~~~~~~~~~~~~~~~~~~~ resident egal, Atari-Modus, ohne Return, Palette nicht restaurieren 8.9 ZXM.PRG, ZXU.PRG Diese beiden Programme demonstrieren, wie einfach man von externen Programmen aus, in das Emulator-Geschehen eingreifen kann. Natrlich schadet eine genaue Kenntnis des ZX-Spectrum nicht. Dann sind der Anwendungen keine Grenze gesetzt. So wird in ZXU.GFA die Eingabe des Befehls LOAD "" simuliert, um auf Tastendruck in den Fileselektor zu gelangen. Dazu werden einige der ZX-Systemvariablen ermittelt und manipuliert. Auch auf die Werte der Z80-Register kann problemlos zugegriffen werden, um ihren Inhalt anzuzeigen, auszuwerten oder zu manipulieren. Das Beispielprogramm ZXM.GFA gibt die wichtigsten Z80-Register aus und bietet die M”glichkeit eines RESET, indem es den Program-Counter auf 0 setzt. W„hrend ZXU.PRG einen gewissen vorteilhaften Effekt gibt, soll ZXM.PRG wirklich nur ein Beispiel bieten, anhand dessen der Zugriff auf die Z80-Register erl„utert wird. ZXU.PRG: resident, ohne Return, Atari-Modus, Palette nicht restaurieren ZXM.PRG: resident, ohne Return, Atari-Modus, Palette egal 9. THE FINAL FRONTIER Dies ist die l„ngste Anleitung, die ich je geschrieben habe. Ich hoffe, daž sie nicht zu lang geworden ist. Im Anhang sind Informationen, die nur fr jene von Interesse sind, die am Emulator herumbasteln wollen. Bleiben noch ein paar Fragen anzuschneiden: - Wie kriegt man Spectrum-Programme auf den Atari ? Wer noch einen funktionstchtigen Spectrum besitzt, der mit einem RS232-Interface ausgerstet ist, kann mit einem entsprechenden Kabel, einem Empfangs-Programm auf Atari-Seite und einigen Spectrum-Kenntnissen problemlos Dateien fr den Emulator bertragen und aufbereiten. Das Format der "Tape"-Dateien des Emulators ist ja ident mit dem des Spectrum. Kopiergeschtzte Software ist ohne fundierte Hack-Ausbildung und Programmieraufwand leider nicht zu bertragen. Die relativ simpelste L”sung w„re ein modifiertes Spectrum-ROM, welches per NMI den gesamten RAM-Inhalt per RS232-Leitung an den Atari schickt. Dort kann daraus eine Snapshot-Datei erzeugt werden. Ich pers”nlich habe diese Methode im Einsatz und kann auf Anfrage gerne n„here Informationen geben. In England hat jemand ein Programm entwickelt, das ber ein Spezialkabel, welches einen Kassettenrecorder an den Centronicsport des Atari koppelt, direkt von Original-Sinclair-Kassetten lesen kann. Obwohl ich es zwar besitze, konnte ich es noch nicht testen, aber es funktioniert angeblich gut. Die letzte M”glichkeit an Programme im Snapshot-Format heranzukommen, w„re die "Emulator"-Abteilung diverser Mailboxen. Da fr Amiga und PC mindestens drei verschiedene Spectrum-Emulatoren existieren, die dieses Format untersttzen, ist gewiss eine grože Anzahl solcher Programme erh„ltlich. Man probiere z.B. an ein in den USA existierendes Archiv atari.umich.edu heranzukommen. - Anfragen, Wnsche und Probleme Ich bin gerne bereit auf alle erdenklichen an mich herangetragenen Fragen einzugehen, ALLERDINGS NUR DANN, wenn mir dadurch keine Kosten erwachsen. Der Emulator ist Public-Domain, daher kann ich keine Service-Leistungen dafr erbringen. Das Mindeste w„re Ersatz fr Porto und Disketten. Eine angemessene Zuwendung fr ben”tigten Arbeitsaufwand wrde mich noch mehr motivieren. Wer die Source-Files des Emulators haben m”chte (Assembler, GFA-Basic, Resource-Dateien, Tools etc.), dem muž ich jedoch eine "Gebhr" von 50 DM abverlangen. Selbstverst„ndlich werden auch reine Beifallskundgebungen und Anregungen gerne gesehen, denn das ist ja schliežlich das Einzige, womit ein Public-Domain Autor seine Mhe belohnt sehen kann (und will). Zum Schluž m”chte ich allerdings noch ein Thema anschneiden, welches ich eher ungern behandle - das problematische Kapitel Copyright: Im Emulator befindet sich eine Kopie des Spectrum-Rom und des Interface-1 Rom. Natrlich w„re es fr mich am einfachsten gewesen, ich h„tte es dem Anwender berlassen, sich die Rom-Dateien zu beschaffen und sie mithilfe eines Patch-Programmes in den Emulator zu integrieren. Doch erstens schien es mir unzumutbar, vorauszusetzen, jeder Interessierte, selbst wenn ehemaliger Spectrum-User, h„tte diese M”glichkeit (die alten Specci's liegen meist defekt unter irgendwelchem Ger”ll in irgendeiner Abstellkammer herum und selbst wenn jemand noch einen funktionstchtigen besitzt, so kann er ohne Interface-1 die Rom-Datei nicht bertragen), zweitens wird der Emulator nicht kommerziell vertrieben (schon gar nicht die Rom-Dateien als solche) und letztlich denke ich, daž der Emulator den Bekanntheitsgrad des Spectrum nur heben kann, weil diese Zeit doch schon "copyrights-verj„hrend" lang zurck liegt - und das sollte doch auch im Interesse derjenigen sein, die das Copyright des Roms besitzen (die Firma Armstrad, nehme ich an). Wenn einer heutzutage noch einen Spectrum-Emulator startet, so muž doch eine grože Portion Nostalgie die Ursache sein und diese sollte durch Probleme mit dem Beschaffen von Komponenten nicht schon im Ansatz abgewrgt werden. Somit viel Spaž mit dem Emulator! Christian Gandler Paletzgasse 17/3/14 1160 Wien / Vienna ™STERREICH / AUSTRIA LONG LIVE SPECCI ! ( & ATARI !) Wien, am 20.7.93 ---------------------------------------------------------------------------- 10. ANHANG A: ZUSAMMENFASSUNG EMULATOR-TASTEN ================================== ST-Taste(n) entspricht am ZX-SPECTRUM Bemerkung ----------------------------------------------------------------------- Control Caps-Shift+Symbol-Shift EXTENDED-MODE Alternate Symbol-Shift fr die roten Symbole F1 Caps-Shift+1 EDIT (Zeile editieren) 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) Alternate-4 Symbol-Shift+4 $ (Dollar) Alternate-5 Symbol-Shift+5 % (Prozent) Control-LShift-P EXTENDED-MODE-Shift-P ½ (Copyright) Emulator-Steuertasten (Standard-Belegung) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Taste Aktion ----------------------------------------------------------------------- F5 SNA-Datei laden oder speichern F6 Reset des Z80 Shift-F6 Beenden des Emulators Alternate-F6 NMI (Non-Maskable-Interrupt) ausl”sen F7 Sound-Modus togglen F8 Rckkehr zur Shell Esc Z80-Monitor/Disassembler aufrufen Help Hilfe-Schirm anzeigen Insert Emulator-Unterbrechung mit Men (Alert/Setup) Undo Umschalten zwischen den Sets Home (nicht belegt) B: EINIGE ZX-SPECTRUM INTERNA ============================= Speicheraufteilung (Adressbereich: 0-65535) -------------------------------------------------------------------------- 00000-16383 ROM 16384-22527 Display-File (Pixeldaten) 22528-23295 Attribut-File (Farben und Attribute, zeichenorientiert) 23296-23551 Drucker-Buffer (beliebter tempor„rer Speicher) 23552-23733 System-Variablen (Auszug siehe unterhalb) 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 -------------------------------------------------------------------------- 23560 1 LAST_K Neu gedrckte Taste (wenn Bit 5 von Flags gesetzt) 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. Kann man "patchen", um eigene Fonts zu installieren. 23609 1 PIP L„nge des Tastaturklicks (man versuche z.B. 10) 23608 1 RASP L„nge des Warntones. 23610 1 ERR_NR BASIC Fehler-Nummer - 1. Beginnt mit 255 (-1). Register IY zeigt in BASIC stets auf diese Adresse 23611 1 FLAGS Flags zur Steuerung des BASIC-Systems 23613 2 ERR_SP Adresse am Stack, an der die Return-Adresse des Betriebssystems bei Fehlern liegt. 23624 1 BORDCR Borderfarbe * 8; enth„lt auch die die Attribute des unteren Screen-Bereichs (Eingabebereich). 23627 2 VARS Zeiger auf Variablen-Bereich des Programms 23635 2 PROG Zeiger auf Programm-Bereich (normalerweise 23755) 23559 1 DF_SZ Anzahl der Zeilen im Eingabe-Bereich des Screens. Beliebte Art, um den Spectrum crashen zu lassen, bei BREAK ins Programm: DF_SZ auf 0 setzen. 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. 23728 2 NMI-ADD Adresse zu der beim NMI gesprungen wird; ist im Original-ROM nicht funktionsf„hig, aber es gengt ein Patch auf Adresse $006D von $20 auf $28. 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 Freien Speicher anzeigen RANDOMIZE USR 0 Soft-Reset des Spectrum C: INFORMATIONEN FšR PROGRAMMIERER ================================== DAS SNAPSHOT-FORMAT ------------------- #Byte Inhalt Kommentar -------------------------------------------------------------------- 0 I Register 1 L' Register 2 H' Register 3 E' Register 4 D' Register 5 C' Register 6 B' Register 7 F' Register 8 A' Register 9 L Register 10 H Register 11 E Register 12 D Register 13 C Register 14 B Register 15 IY unteres Byte 16 IY oberes Byte 17 IX unteres Byte 18 IX oberes Byte 19 Bit 2 enth„lt IFF2 andere Bits irrelevant 20 R Register 21 Flag-Register 22 A Register 23 SP unteres Byte 24 SP oberes Byte 25 Interrupt-Modus 0, 1 oder 2 26 Border-Farbe 0..7 27..49178 48 kB RAM-Dump Nach dem Laden der Register muž das Programm mit einer RETN-Instruktion gestartet werden d.h. der PC liegt auf dem Stack (im RAM-Dump). DAS ERWEITERTE SNAPSHOT-FORMAT ------------------------------ #Byte Inhalt Kommentar -------------------------------------------------------------------- 0..3 "XSNA" Kennung fr Emulator Extended SNA 4,5 Headerl„nge #Bytes im nachfolgenden Header 6..32 Register wie in SNA-Standardformat 33..42 Emulator-Schalter if1sw bis im2hw des Setup-Bereichs ab 43: 2 Bytes Count Anzahl Bytes im Block ***) 1 Byte Flag Kennung ob "komprimierter" Block entweder (Flag = $ff): 1 Byte Fll-Byte Count mal zu wiederholendes Byte oder (Flag = 0): Count Bytes Daten ohne Komprimierung ***) Optimierung, wenn Anzahl Bytes im Block <= 16 !!! Das erste Byte des Count enth„lt eine Wert >= $E0, der folgendermažen zu interpretieren ist: das untere Nibble enth„lt den Byte-Count - 1, das obere Nibble ist $E fr unkomprimierten Block, $F fr komprimierten Block. Das zweite Count-Byte entf„llt dann, ebenso das Flag-Byte!!! Die Bl”cke ab dem 43. Byte wiederholen sich fr den gesamten RAM-Dump. EMULATOR PATCH-BEREICHE FšR ROM ------------------------------- Das Spectrum-ROM ist in der Programmdatei "SPECCI.DAT" ab Position 34 gepatcht (L„nge: 16384 Bytes). Unmittelbar darauf folgen die 8192 Bytes fr das Interface-1-ROM. EINBINDUNG EIGENER SCREEN-TREIBER --------------------------------- In der Initialisierungsphase des Emulators wird nach einer Datei namens "ZXVID.TRB" im Emulatorpfad gesucht. Ist eine solche vorhanden, so wird sie als Video-Treiber interpretiert und eingeladen. Sie muž ein ausfhrbares Programm sein, welches komplett adressunabh„ngig geschrieben ist d.h. nur PC-relative Adressierungen verwendet. Sie muž folgenden Aufbau haben: { 28 Bytes Programm-Header einer ausfhrbaren Datei } vdrv_hdr equ * bra.w v_install ; Installierung +0 ds.l 1 ; De-Installierung +4 ds.l 1 ; Einzelbyte mit Attribut +8 ds.l 1 ; Einzelbyte ohne Attribut +12 ds.l 1 ; BORDER-Darstellung +16 ds.l 1 ; ganzen Schirm aufbauen +20 ds.l 1 ; VBL-Task (w„hrend Laden) +24 Im ersten Langwort steht ein Sprungbefehl zur Installations-Prozedur. Dieser werden vom Emulator folgende Parameter in Registern bergeben: a1 .... Zeiger auf ZX-Screen im Emulator-Ram (= Daten zum Darstellen) a0 .... Zeiger auf einen Buffer, den der Treiber eventuell verwenden kann d0 .... L„nge des Buffers, der zur Verfgung steht a4 .... Zeiger auf Emulator-Variablen, die zur Darstellung ben”tigt werden: 0(a4) enth„lt den Schalter fr Attribut-Darstellung (0=Nein) 1(a4) enth„lt den Schalter fr Flash-Darstellung (0=Nein) 2(a4) enth„lt den aktuellen Flash-Zustand (0=Normal, $FF=Invers) Die Installations-Routine muž diese Werte sichern, alle notwendigen Initialisierungen vornehmen und den Header-Block korrekt ausfllen d.h. Zeiger zu den entsprechenden Procedures eintragen. Als Rckgabewert muž das Register d0.w gesetzt werden: 0 = OK, korrekt installiert 1 = Falsche Bildschirm-Aufl”sung Alle brigen Werte signalisieren sonstige Fehler Der Rcksprung erfolgt mit einem normalen RTS-Befehl. Register brauchen von der Initialisierungs-Routine nicht gesichert werden. Die Runtime-Procedures mssen jedoch alle verwendeten Register sichern! Fr eine genaue Beschreibung ist ein Beispiel-Treiber als Source auf der Diskette (Ordner "TREIBER"), welcher fr die mittlere ST-Aufl”sung (nicht sonderlich sinnvoll, aber soll ja nur Demo sein) konzipiert wurde. Anhand dessen sollte fr den erfahrenen Programmierer ersichtlich sein, wie die Sache angegangen werden muž. START VIA EMULATOR-SHELL ------------------------ Wenn der Emulator in der Kommandozeile den String "/s" entdeckt, so versucht er ein Shell-Programm zu starten. An dieses Shell-Programm wird die Kontrolle abgegegeben, sodaž die Shell den Emulator im weiteren wie ein Unterprogramm aufrufen kann. Auf diese Weise l„žt sich im Prinzip eine beliebig komplexe "Schale" um den Emulator legen z.B. w„re ein eigener Desktop oder ein GEM-Fenster am (Multi-TOS-)Desktop denkbar, von dem aus der Emulator gesteuert wird. Hinter dem String "/s" kann der Pfad des Shell-Programmes angegeben werden, z.B. "/sG:\SPECCI\SPSHELL.PRG". Wenn kein Name angegeben ist, so wird der unter der Taste "F8" im Konfig-Dialog des Setup-Programmes angegebene Name herangezogen. Das mitgelieferte Programm "SPSHELL.PRG" ist ein gutes Beispiel fr ein Shell-Programm. Wenn es vom Desktop aufgerufen wird, so tr„gt es den String "/s" gefolgt von seinen eigenen Namen, welchen es ber die Funktion SHEL_READ in Erfahrung bringt, in eine Kommandozeile ein und bergibt diese der Funktion SHEL_WRITE, mit der es den Emulator (SPECCI.DAT) startet. Dann beendet es sich. SHEL_WRITE startet nun sofort SPECCI.DAT, dieser findet in seiner Kommandozeile den String "/sSPSHELL.PRG" und startet das Shell-Programm erneut. Jetzt erkennt dieses aber die Situation, daž es vom Emulator aus gestartet wurde, und beginnt seine eigentliche Arbeit als Interface zum Emulator. Dies mag alles etwas verwirrend klingen, aber es funktioniert jedenfalls tadellos. KOMMUNIKATION MIT EXTERNEN PROGRAMMEN ------------------------------------- Grundlage zur Kommunikation ist die Bekanntgabe von speziellen Adressen im Emulator, welche zahlreiche ben”tigte Informationen enthalten. Diese Adressen werden extern aufgerufenen Programmen ber die Kommandozeile mitgeteilt. Hier der Aufbau derselben: #Byte Inhalt Kommentar -------------------------------------------------------------------- 0 '½' Spezielle Kennung (vom Emulator aufgerufen) 1 64 Anzahl der nachfolgenden Bytes 2..9 HHHHHHHH Adresse Setup-Daten 10..17 HHHHHHHH Adresse Z80-Adressraum im Atari 18..25 HHHHHHHH Adresse Emulator-Variablen 26..33 HHHHHHHH Adresse Atari-Screenbuffer 34..41 HHHHHHHH Adresse fr Return-Wert 42..49 0000000H Nummer des aktives Sets 0..3 Dabei steht H fr ein Hexadezimales-Zeichen im Ascii-Format, also "0" bis "9" und "A" bis "F". Die "Kennung" im Byte 0 dient dazu, daž das Programm feststellen kann, ob es vom Emulator aufgerufen wurde, wodurch es u.U. sich anders verhalten kann, als wenn es vom Desktop aus aktiviert wird. Der Zeiger auf die Setup-Daten... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...zeigt auf folgende Struktur: #Byte Inhalt Kommentar -------------------------------------------------------------------- 0..7 'ZXSP2.00' ID-String, mit Emulator Versions-Nummer 8..807 800 Bytes Setup-Daten wie folgt: 160 Bytes Daten Set #1 160 Bytes Daten Set #2 160 Bytes Daten Set #3 160 Bytes Daten Set #4 160 Bytes Daten aktives Set (Arbeits-Kopie) Die Setup-Daten enthalten folgende Werte: Name L„nge Beschreibung ------------------------------------------------------------------------ prgpfad 35 Pfad fr Programm-Dateien, null-terminiert mdrpfad 35 Pfad fr Microdrive-Daten, null-terminiert mdid 7 Dateiname Microdrive (ohne Nummer), null-t. snapfad 35 Pfad fr SNA/SNA-Dateien, null-terminiert spalett 32 16 Worte Farbpaletten-Werte 320x200 illsw 1 Schalter Z80-Illegal: 0=Alert, 1=Monitor, 2=Ignore errsw 1 Schalter Emu-Fehler : 0=Alert, 1=Monitor, 2=Reset sna_sw 1 Schalter SNA-Format : 0=SNA, 1=SNX autosw 1 Schalter AUTO.SNA: Bit 0=bei Start, Bit 1=bei RESET vblsw 1 Schalter VBL-Darstellung: Bit 7 gesetzt=ON vblseq 1 Sequenzfolge VBL-Darstellung, bit-codiert if1sw 1 Schalter Interface 1: 0=nicht emuliert, 1=emuliert flashsw 1 Schalter FLASH: 0=nicht emuliert, 1=emuliert attrsw 1 Schalter Attribute: 0=keine Attribute, 1=Attribute zy_sw 1 Schalter Tasten Z-Y: 0=Tausch ZY, 1=kein Tausch ZY r_sw 1 Schalter R-Register:0=R nicht emuliert, 1=R emuliert Das Bit 7 wird als Wert fr das EAR-Bit verwendet. int_sw 1 Schalter Interruptfrequenz: 0=50Hz, 1=100Hz rs232sw 1 Schalter RS232-Umlenkung: Bit 0=RS232, Bit 1=CENTR. sndsw 1 Schalter Sound-Emulation: Unters Nibble: 0=OFF,1=Direkt,2=Interr. Oberes Nibble: Frequenz 0..4 fr Mode 2 bordsw 1 Schalter Border Emulation: 0=OFF,1=Direkt,2=Interr. im2hw 1 Wert fr IM2-Hardware Vektor 0..255 free 1 UNBENUTZT rom_load 1 Schalter externes ROM: 0=Nicht laden, 1=Laden rom_pfad 36 Pfad fr externe ROM-Datei, null-terminiert cnfg_e 1 Konfigurations-Byte externe Programme: Bit 0: Taste ESC Bit 1: Taste F5 Bit 2: Taste F8 Bit 3: Taste CLR/HOME Bit 4: Taste INSERT Bit 5: Taste HELP Bit 6: Taste UNDO Bit 7: nicht verwendet cnfg_s 1 Konfigurations-Byte Shell-Modus (Bits wie cnfg_e) esc_prg 14 Name/Einstellungen fr Programm auf Taste ESC Bytes 0..12 enthalten den Namen Byte 13 enth„lt Parameter fr Start: Bit 0: Farbpalette restaurieren Bit 1: Resident laden Bit 2: Im ZX-Modus starten Bit 3: Return auswerten Bit 7: Durch linken Mausklick aktivierbar f5_prg: 14 Name/Einstellungen fr Programm auf Taste F5 f8_prg 14 Name/Einstellungen fr Programm auf Taste F8 clr_prg 14 Name/Einstellungen fr Programm auf Taste CLR/HOME ins_prg 14 Name/Einstellungen fr Programm auf Taste INSERT help_prg 14 Name/Einstellungen fr Programm auf Taste HELP undo_prg 14 Name/Einstellungen fr Programm auf Taste UNDO Der Zeiger auf den ZX-Adressraum... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...zeigt auf den Speicherbereich im Atari-Ram, ab dem der emulierte Adressbereich des ZX-Spectrum Z80-Prozessors beginnt. Die ersten 16384 Bytes sind der ROM-Bereich. Der Zeiger auf die Emulator-Variablen... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...zeigt auf einen Datenbereich der unter anderem auch die Werte der emulierten Z80-Register enth„lt: Offset Name L„nge Beschreibung -------------------------------------------------------------------- -14 request BYTE Request-Typ Unterbrechung (Scan-Code Taste) Anhand dieses Wertes kann ein extern aufger. Programm feststellen, mit welcher Taste es aktiviert wurde. -13 shell BYTE Wenn Shell-Modus=1, Wenn Desktop-Modus=0 -12 lstkey BYTE letzte Taste im Spectrum-Modus -11 SPECTRUM BYTE Spectrum-Mode: 0=AUS $ff=AN -10 zeropage LONG Zeiger auf Z80-Adressraum im Atari -6 fcount BYTE Z„hler fr FLASH-Darstellung -5 bcount BYTE Z„hler fr BORDER-Darstellung -4 attr_sw BYTE Runtime-Kopie des attrsw-Schalters -3 flash_sw BYTE Runtime-Kopie des flashsw-Schalters -2 fmode BYTE Flash-Zyklus ($ff=INVERS) -1 BYTE (dzt. nicht verwendet) -> 0 z80_regs 40 BY Emulierte Z80-Register in dieser Reihenfolge: 0 _H BYTE H-Register 1 _L BYTE L-Register 2 _D BYTE D-Register 3 _E BYTE E-Register 4 _B BYTE B-Register 5 _C BYTE C-Register 6 _XH BYTE Obere H„lfte IX-Register 7 _XL BYTE Untere H„lfte IX-Register 8 _YH BYTE Obere H„lfte IY-Register 9 _YL BYTE Untere H„lfte IY-Register 10 _I BYTE I-Register 11 _R BYTE R-Register 12 _A BYTE Akkumulator 13 _A' BYTE Alternativer Akku 14 _H' BYTE Alternatives H-Register 15 _L' BYTE Alternatives L-Register 16 _D' BYTE Alternatives D-Register 17 _E' BYTE Alternatives E-Register 18 _B' BYTE Alternatives B-Register 19 _C' BYTE Alternatives C-Register 20 _SF BYTE S-Bit (Sign) des Statusregisters 21 _ZF BYTE Z-Bit (Zero) des Statusregisters 22 _U1F BYTE Unused Bit des Statusregisters 23 _HF BYTE H-Bit (Half-Carry) des Statusregisters 24 _U2F BYTE Unused Bit des Statusregisters 25 _VF BYTE V-Bit (Overflow) des Statusregisters 26 _NF BYTE N-Bit des Statusregisters 27 _CF BYTE C-Bit (Carry) des Statusregisters 28 _SF' BYTE S-Bit (Sign) des alt. Statusregisters 29 _ZF' BYTE Z-Bit (Zero) des alt. Statusregisters 30 _U1F' BYTE Unused Bit des alt. Statusregisters 31 _HF' BYTE H-Bit (Half-Carry) alt. des Statusregisters 32 _U2F' BYTE Unused Bit des alt. Statusregisters 33 _VF' BYTE V-Bit (Overflow) des alt. Statusregisters 34 _NF' BYTE N-Bit des alt. Statusregisters 35 _CF' BYTE C-Bit (Carry) des alt. Statusregisters 36 _SP WORD SP-Register (Stack-Pointer) HI-LO 38 _PC WORD PC-Register (Program-Counter) HI-LO 40 iff WORD Z80 Interruptflipflop(s): 40 iff1 BYTE Interruptflipflop 1; $ff=enabled, $00=disabl. 41 iff2 BYTE Interruptflipflop 2; Speicher fr iff1 42 intmode WORD Z80 Interruptmodus: IM0=-1, IM1=0, IM2=1 44 akt_bc WORD Aktuelle Border-Farbe SOLL 46 old_bc WORD Aktuelle Border-Farbe IST 48 old_a7 LONG Interner Speicher fr a7 52 brk_flg BYTE Merker Breakpoint fr Monitor 53 mon_flg BYTE Monitoraufruf: 0=User, 1=BREAK, 2=Illegal 54 r_bit7 BYTE Bit 7 vom R-Register 55 new_requ BYTE Neuer Request. Durch Setzen dieses Wertes ist es einem extern aufgerufenen Programm m”glich nach Rckkehr zum Emulator die Ausfhrung des zugeordneten Programmes (Scancode der Taste) zu veranlassen (siehe -14 request). 56 ports 12 BY Soft-Ports des Z80: 56 WORD Fller, damit Offset > 0 wird! 58 port_b0 BYTE Wert fr Bit 0 der Port-Adresse 59 port_b1 BYTE Wert fr Bit 1 der Port-Adresse 60 port_b2 BYTE Wert fr Bit 2 der Port-Adresse 61 port_b3 BYTE Wert fr Bit 3 der Port-Adresse 62 port_b4 BYTE Wert fr Bit 4 der Port-Adresse 63 port_b5 BYTE Wert fr Bit 5 der Port-Adresse 64 port_b6 BYTE Wert fr Bit 6 der Port-Adresse 65 port_b7 BYTE Wert fr Bit 7 der Port-Adresse 66 port_31 BYTE Wert fr Port 31 (Kempston Joystick) 67 port_xx BYTE unbenutzt Der Zeiger auf den Atari-Screenbuffer... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...zeigt auf einen Speicherbereich in den der zuletzt angezeigte Spectrum- Screen im Atari 32K-Format abgelegt wurde. Sehr praktisch fr jedes externe Programm, das den Spectrum-Screen in irgendeiner Form ben”tigt (Hardcopy drucken, Speichern als IMG-Datei, ...). Der Zeiger auf eine Return-Adresse... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...dient zur Kommunikation mit dem Emulator. Durch Eintragen von bestimmten Werten kann man den Emulator zu verschiedenen Aktionen bewegen, nachdem die Kontrolle wieder an ihn abgegeben wurde: (zx_ret.w) Aktion nach Rckkehr ------------------------------------------------------------------ 0 DARF NICHT SEIN!! 1 Emulator beenden (Desktop) 2 ZX-Reset durchfhren 3 SNA laden (Pfad auf (Screenbuffer) nullterm.) 4 SNA sichern (Pfad auf (Screenbuffer) nullterm.) 5 NMI ausl”sen 99 Abbruch aller Set-Ver„nderungen (SPSETUP) Immer wenn mit einem Return-Wert ungleich 99 beendet wird, so MUSS auf der Speicherstelle (zx_ret+2.w) die Nummer des aktiven Sets eingetragen sein, wofr Werte zwischen 0 und 4 erlaubt sind! Werte zwischen 0 und 3 bewirken ein Kopieren des entsprechenden Sets in den Arbeitsbereich (und Anpassen abh„ngiger Variablen), bevor die Emulation fortgesetzt wird. Der Wert 4 bewirkt, daž die Arbeitskopie der Sets nicht berschrieben wird bei der Rckkehr zum Emulator. Wenn ein externes Programm als Lieferant eines Rckgabe-Wertes deklariert ist, so MUSS unbedingt auch ein von Null verschiedener Wert (inklusive Wert fr aktives Set) geliefert werden. An einem Wert Null erkennt der Emulator einen fehlgeschlagenen Aufruf des Programms. Als ABBRUCH-Wert kann 99 verwendet werden - in diesem Falle passiert nach der Rckkehr zum Emulator keinerlei Auswertung, sondern die Emulation wird unverzglich fortgesetzt. Die Nummer des aktuellen Schalter-Sets... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...fr alle externen Programme die's brauchen k”nnen, wie zum Beispiel das Setup-Programm "SPSETUP.PRG".