home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / emulator / zx80 / z80.doc < prev    next >
Encoding:
Text File  |  1992-07-26  |  157.3 KB  |  3,150 lines

  1. Sinclair ZX Spectrum Emulator V1.41 - 27/7/92  -  door G.A. Lunter
  2.  
  3.  
  4.  
  5. INHOUD:
  6.  
  7.         1.    INLEIDING
  8.         1.1   Inleiding
  9.         1.2   Over de emulator
  10.         1.3   Over de documentatie
  11.         1.4   Sourcecode, extra utilities en registratie
  12.         1.5   Puntjes op de i
  13.         1.6   Bedankt!
  14.  
  15.         2.    KENMERKEN VAN DE SPECTRUM
  16.         2.1   Het toetsenbord
  17.         2.2   Spectrum en joysticks
  18.         2.3   De SamRam en het Sam Operating System
  19.         2.4   Basic uitbreiding van de SamRam
  20.         2.5   De kraaksoftware van de SamRam
  21.         2.6   De ingebouwde schermeditor
  22.         2.7   De ingebouwde Z80 disassembler
  23.  
  24.         3.    DE EMULATOR
  25.         3.1   Overzicht
  26.         3.2   Command line syntax
  27.         3.3   Hoe goed is de Emulator?
  28.         3.4   Scherm emulatie
  29.         3.5   Geluid emulatie
  30.         3.6   Toetsenbord emulatie
  31.         3.7   Het hoofdmenu van de Emulator
  32.         3.8   De Tape interface en Real Mode
  33.         3.9   Overzetten van Spectrum programma's
  34.         3.10  Overzetten vanaf Spectrum floppy's
  35.         3.11  Welke programma's zijn te gebruiken op de Emulator?
  36.         3.12  De utility Convert
  37.         3.13  De utility ConvZ80
  38.         3.14  De utility DISCiPLE
  39.         3.15  Een digitale joystick voor de PC
  40.  
  41.         4.    TECHNISCHE INFORMATIE
  42.         4.1   Overzicht hardware kenmerken standaard Spectrum
  43.         4.2   Overzicht hardware kenmerken Interface 1
  44.         4.3   Overzicht hardware kenmerken SamRam
  45.         4.4   Interne opbouw van de Emulator
  46.         4.5   De werking van de Emulator
  47.         4.6   Onofficiële en extra instructies
  48.         4.7   Beveiligingsmethoden op de Spectrum
  49.         4.8   Tips en truuks
  50.         4.9   Struktuur van een .Z80 programmabestand
  51.         4.10  De sourcecode van de Spectrum Emulator
  52.  
  53.  
  54.  
  55.  
  56. 1. INLEIDING
  57.  
  58.  
  59. 1.1 Inleiding
  60.  
  61.            Sinds Alan Turing dit in de 50er jaren bewees weten we,
  62.         dat elke computer in essentie precies even krachtig is. Van
  63.         de ZX-80 tot de Cray, van een programmeerbare rekenmachine
  64.         tot de duurste '486, in feite kunnen ze precies hetzelfde.
  65.         De een is alleen wat sneller dan de ander, heeft meer of
  66.         minder geheugen, andere input/output apparaten, maar het
  67.         zijn manifestaties van een en dezelfde abstractie: de
  68.         Computer.
  69.  
  70.            Wat dit betekent is, dat je (in principe) een programma
  71.         dat op computer A draait, zo op computer B kunt zetten.
  72.         Natuurlijk is er wel een vertaalslag nodig, maar elke
  73.         elementaire instructie van computer A is te beschrijven in
  74.         de elementaire instructies van computer B. Programma's die
  75.         deze vertaalslag uitvoeren worden emulatoren genoemd.
  76.         Emulatoren zijn interpreters van niet-eigen machinecode, net
  77.         zoals GWBASIC een interpreter is van de code die BASIC heet,
  78.         die niet zonder meer herkend wordt door de 8088 processor.
  79.  
  80.            Emuleren is overigens wat anders dan simuleren, hoewel
  81.         het verschil subtiel is. Simuleren is de werkelijkheid
  82.         nabootsen, maar deze nabootsing is echt iets anders dan
  83.         de werkelijkheid. Een voorbeeld is het model dat het KNMI
  84.         gebruikt voor het weer. Een storm kan door dit model worden
  85.         gerepresenteerd en gesimuleerd, maar dat maakt de
  86.         gesimuleerde storm nog geen werkelijkheid: het zal in de
  87.         computer waarop het model loopt nergens hard waaien. Simuleren
  88.         is ook vaak niet perfect: de gesimuleerde storm gaat na verloop
  89.         van tijd afwijken van wat er in de werkelijkheid gebeurd.
  90.  
  91.            Emuleren is een nieuwe werkelijkheid creëren. Vanuit het
  92.         oogpunt van het programma, dat oorspronkelijk geschreven was
  93.         voor computer A, maakt het absoluut niet uit of dit
  94.         programma echt loopt op computer A, of dat het loopt op de
  95.         emulator, die loopt op computer B. Het programma 'ziet' zelf
  96.         geen enkel verschil. Een buitenstaander ziet ook geen
  97.         verschil: bij gelijke inputs produceert het programma op
  98.         computer A dezelfde output als het programma + de emulator
  99.         op computer B. Er is dus geen enkel functioneel verschil
  100.         tussen computer A en B. Als je de emulator opstart op
  101.         computer B dan LIJKT computer B niet alleen op A, dan IS
  102.         computer B computer A geworden!
  103.  
  104.            (Je kunt theoretisch nog volhouden dat nergens 'in'
  105.         computer B de computer A 'gematerialiseerd' is, 'werkelijkheid'
  106.         is geworden. Computer B reageert wel hetzelfde, maar is toch
  107.         van een afstand bekeken duidelijk anders dan computer A.
  108.         De functionaliteit is dan wel aanwezig, maar de 'geest' van
  109.         computer A is afwezig. Inderdaad, je zou niet verwachten
  110.         dat weldenkende mensen op zo'n manier zouden redeneren.
  111.         Dit soort redeneringen kom je echter vaak tegen, in een
  112.         andere (maar niet fundamenteel andere) context, namelijk het
  113.         zogenaamde lichaam-geest probleem. Maar we dwalen af!)
  114.  
  115.            In de praktijk zijn de zaken natuurlijk minder zwart-wit.
  116.         Computer B moet veel sneller zijn dan computer A, anders
  117.         worden programma's te traag om praktisch bruikbaar te zijn.
  118.         Computer B moet ook meer geheugen hebben dan computer A:
  119.         heel het geheugen van computer A (zowel Rom als Ram als
  120.         eventueel geheugen verstopt in de randapparatuur) moet erin
  121.         passen, samen met de emulator. Verder moet, als het even kan,
  122.         computer B meer input en output mogelijkheden hebben dan
  123.         computer A. De beeldschermresolutie van A moet bijvoorbeeld
  124.         kleiner zijn dan die van B. Als aan deze voorwaarden is
  125.         voldaan, kun je computer A niet alleen theoretisch maar ook
  126.         praktisch heel goed emuleren op B.
  127.  
  128.            Het koppel Sinclair ZX Spectrum 48K / IBM PC voldoet aan
  129.         deze praktische voorwaarden. Een PC is veel sneller dan een
  130.         ZX Spectrum, heeft veel meer geheugen tot zijn beschikking,
  131.         heeft dezelfde geluidsmogelijkheden en heeft veel meer
  132.         grafische mogelijkheden. Vandaar dat ik op het idee kwam een
  133.         Spectrum Emulator voor de PC te schrijven.
  134.  
  135.  
  136. 1.2 Over de emulator
  137.  
  138.            Deze Spectrum Emulator emuleert de gewone ZX Spectrum,
  139.         met de Interface 1. Alles wordt op het allerlaagste niveau
  140.         geëmuleerd, wat betekend dat er geen veranderingen in de ROM
  141.         nodig waren, en dat alle programma's zonder problemen op de
  142.         Emulator draaien. Alle ins en out, alle timing-rariteiten,
  143.         alle Z80 instructies, zowel gewone als onofficiële, het
  144.         beeldscherm, het geluid, het toetsenbord, de RS232 (COM)
  145.         interface, en niet te vergeten de tape interface: alles is
  146.         aanwezig.
  147.  
  148.            Deze emulator is natuurlijk om te beginnen leuk speelgoed
  149.         voor ZX Spectrum fanaten die nu een PC hebben. Maar de
  150.         emulator is ook erg leuk voor alle andere mensen die een
  151.         redelijk snelle PC of AT hebben. Je krijgt dan toegang tot
  152.         de enorm uitgebreide verzameling van ZX Spectrum spellen,
  153.         waarvan er letterlijk duizenden en nog eens duizenden zijn
  154.         gemaakt. Vele van deze spellen zijn kwalitatief heel erg
  155.         goed, en kunnen ook tegenwoordig nog de vergelijking met het
  156.         gemiddelde PC-spel gemakkelijk doorstaan.
  157.  
  158.  
  159. 1.3 Over de documentatie
  160.  
  161.            En dan nu de eigenlijke documentatie. Deze bestaat uit
  162.         drie delen. Het eerste gedeelte, dat begint met hoofdstuk
  163.         2, behandelt in het kort de Spectrum. Dit gedeelte is
  164.         speciaal bedoeld voor die mensen die (vrijwel) geen
  165.         ervaring met de ZX Spectrum hebben. De Spectrum is een vrij
  166.         eigenzinnige machine; vooral het toetsenbord is nogal
  167.         ongebruikelijk ingedeeld. Als dit toetsenbord wordt geëmu-
  168.         leerd op een afwijkend toetsenbord, zoals bijvoorbeeld dat
  169.         van een PC of AT, is dat dus extra problematisch. In dit
  170.         deel worden ook de uitbreidingen van de SamRam software
  171.         beschreven, zoals de ingebouwde disassembler, de extra
  172.         commando's en de ramdisk.
  173.  
  174.            Het tweede deel van de documentatie (hoofdstuk 3) gaat
  175.         over de emulator zelf. Het overzetten van programma's van
  176.         de Spectrum naar de PC komt aan bod. Ook de mogelijkheden
  177.         van communicatie tussen de Spectrum en de 'buitenwereld'
  178.         (lees: de PC) worden besproken.
  179.  
  180.            Het laatste hoofdstuk behandelt de technische details
  181.         van de Emulator, met een uitgebreide beschrijving van vele
  182.         bekende en minder bekende hardware kenmerken van de
  183.         Spectrum, die van belang zijn voor de juiste emulatie van
  184.         vele van de ingewikkelder Spectrum programma's.
  185.  
  186.  
  187. 1.4 Sourcecode, extra utilities en registratie
  188.  
  189.            Dit is een shareware-programma. Dit programma mag vrij
  190.         verspreid worden, mits het pakket VOLLEDIG en ONGEWIJZIGD
  191.         wordt gelaten. Niets is zo vervelend een half programma te
  192.         krijgen, of een niet goed werkend programma omdat er
  193.         ondeskundige wijzigingen in zijn aangebracht. Laat dit dus
  194.         achterwege! Het programma wordt verspreid in de vorm van een
  195.         zichzelf uitpakkend archiefbestand. Heeft de het bestand
  196.         dat je kreeg niet de naam SPEC140.ARJ dan heeft iemand er
  197.         aan zitten morrelen!
  198.  
  199.            De Spectrum Emulator mag een tijdje gratis uitgeprobeerd
  200.         worden, laten we zeggen een maand. Als je na deze periode
  201.         overtuigd bent van de kwaliteit van het programma en het
  202.         programma langer wil gebruiken, moet je je registreren.
  203.         Registratie kost f 25,--, en hiervoor ontvang je de utili-
  204.         ties Convert, ConvZ80, DISCIPLE en Z80dump, en de sourcecode
  205.         van de Spectrum Emulator. Bovendien krijg je de geregistreerde
  206.         versie van Z80.EXE waarmee je Spectrum-programma's direct
  207.         van cassette in kunt laden. Bovendien word je op de hoogte
  208.         gehouden van eventuele nieuwe updates.
  209.  
  210.            Met Convert kun je allerhande Spectrum-formaten omzetten
  211.         in gangbare PC-formaten, bijvoorbeeld Spectrum schermpjes
  212.         naar .GIF formaat, Spectrum BASIC naar ASCII en omgekeerd,
  213.         enzovoorts. Het programma Z80dump is een kleine utility om
  214.         de header van een .Z80 bestand te bekijken. Met DISCIPLE
  215.         kunnen Spectrum DISCiPLE diskettes worden gelezen, en met
  216.         ConvZ80 tenslotte kunnen de .Z80 bestanden worden omgezet in
  217.         .SP bestanden (gebruikt door VGASPEC, een Spaanse Spectrum
  218.         emulator) en .SNA bestanden (gebruikt door JPP) en omgekeerd.
  219.         Zie de paragrafen 3.12 en 3.13 voor een uitgebreidere
  220.         beschrijving van Convert en ConvZ80.
  221.  
  222.            Voor bedrijven, winkels, scholen e.d. is registratie ook
  223.         verplicht als men besluit het programma te gaan gebruiken.
  224.         Net als particulieren mag men het programma 1 maand uitpro-
  225.         beren en testen. Registratie kost nu echter f 100,-- per
  226.         kopie. Men ontvangt na registratie ook bovengenoemde extra
  227.         programma's en bestanden, en ontvangt ook de nieuwe updates.
  228.         Bovendien wordt men telefonisch ondersteund bij eventuele
  229.         problemen.
  230.  
  231.            Verkoop van de shareware-versie van de Spectrum Emulator
  232.         aan derden is nadrukkelijk NIET TOEGESTAAN! Wel is het in
  233.         principe mogelijk geregistreerde versies te verkopen,
  234.         waarbij de koper dan meteen geregistreerd gebruiker wordt.
  235.         Indien men geïnteresseerd is in het verkopen van de Spectrum
  236.         Emulator wordt men verzocht hierover kontakt met de auteur
  237.         op te nemen.
  238.  
  239.            Registratie vindt plaats door het verschuldigde bedrag
  240.         (25 of 100 gulden) over te maken op:
  241.  
  242.                 giro 5945263
  243.         t.n.v.  G.A. Lunter
  244.                 Aweg 11a
  245.                 9718 CT  Groningen
  246.  
  247.         Vermeld duidelijk je adres, en welk floppy-formaat gewenst
  248.         wordt (3,5'' of 5.25''). Je kunt ook een getekende Eurocheque
  249.         of girobetaalkaart opsturen naar bovenstaand adres. Zet dan
  250.         in een begeleidend briefje je volledige adres en het
  251.         gewenste floppy-formaat.
  252.  
  253.  
  254. 1.5 Puntjes op de i
  255.  
  256.         1. Uiteraard garandeer ik niet dat de Emulator helemaal goed
  257.            werkt. Eventuele rampen ten gevolge van fouten in de
  258.            Emulator zijn het risico van de gebruiker.
  259.         2. De Spectrum ROM zit in de Emulator ingebouwd. De ROM is
  260.            een auteursrechtelijk beveiligd stuk software. Ik ga er
  261.            van uit dat gebruikers van de Spectrum Emulator in het
  262.            bezit zijn van een Sinclair ZX Spectrum. Zo niet dan mag
  263.            de Spectrum Emulator 'Z80' niet gebruikt worden!!
  264.         3. Sinclair Research blijft te allen tijde copyright-houder
  265.            van de ROM, ook indien men zich registreert voor de Emulator.
  266.         4. De auteur van de Spectrum Emulator blijft eigenaar hiervan
  267.            en van de broncodes en van de machinecode voor de SamRam,
  268.            ook als men zich registreert.
  269.  
  270.  
  271. 1.6 Bedankt!
  272.  
  273.            De Spectrum Emulator is het resultaat van een lange tijd
  274.         zeer intensief werken met de ZX Spectrum. Johan Muizelaar en
  275.         ik hebben samen in die tijd de Spectrum heel goed leren kennen.
  276.         Johan heeft tijdens het maken van de Spectrum Emulator veel
  277.         opbouwende kritiek geleverd, en als het programma er
  278.         professioneel en 'af' uitziet is dat helemaal zijn verdienste!
  279.  
  280.            En dan zijn er nog een heleboel mensen die, ook door te
  281.         reageren nadat de Spectrum Emulator uitkwam, hebben
  282.         meegeholpen aan (deze versie van) de Spectrum Emulator. Zonder
  283.         deze mensen was de Emulator ongetwijfeld een minder groot
  284.         succes geworden.
  285.  
  286.         Rudy Biesma, voor het debuggen van DISCiPLE.EXE,
  287.         Ronald Gorter en Peter Kelders, voor het vinden van enkele
  288.            bugs,
  289.         Leonard en Johan Monderman, voor het testen van de Spectrum
  290.            Emulator op vele spelletjes,
  291.         Dick Pluim, voor het geheel belangeloos ter beschikking stel-
  292.            len van zijn BBS als Support-BBS voor de Emulator,
  293.         De Spectrum gebruikers groep in Groningen voor de enthousiaste
  294.            reakties, en met name Tonnie Stap die mij de essentiële
  295.            informatie over het DISCiPLE schijfformaat leverde,
  296.         Dhr. T.J.H.M. Trum, voor het mij opmerkzaam maken op een
  297.            storende fout in de documentatie, en een nog veel
  298.            storender fout in het introscherm,
  299.         Martin van der Werff, die de macro's in EMUL.8 subtiel
  300.            aanpaste zodat ze ook in A86 versie 3.20 werkten,
  301.         Ruud Zandbergen voor zijn prima uitgewerkte idee voor een
  302.            digitale joystickinterface voor de PC, die nu ook
  303.            ondersteund wordt door de Emulator,
  304.         en verder alle andere geregistreerde gebruikers voor hun
  305.            vele brieven.
  306.  
  307.  
  308.  
  309.  
  310.  
  311. 2. KENMERKEN VAN DE SPECTRUM
  312.  
  313.  
  314. 2.1 Het toetsenbord.
  315.  
  316.            Om in BASIC te werken op de Spectrum, zul je moeten
  317.         wennen aan het toetsenbord. Dit is sterk afwijkend van de
  318.         meeste toetsenborden. Dit komt door het gebruik van
  319.         Keywords, waar Sir Clive, ver terug in het verleden (in '82
  320.         ergens) zo gek op was. Het werkt inderdaad ook wel snel en
  321.         makkelijk, maar niet voordat je er veel tijd en moeite in
  322.         gestoken hebt om ze te leren. Op een PC of AT toetsenbord
  323.         zijn de keywords helemaal lastig, want ze staan natuurlijk
  324.         niet op de toetsen voorgedrukt.
  325.  
  326.            De spectrum heeft één toets die op geen enkele andere
  327.         computer voorkomt, namelijk de Symbol Shift. (De rode
  328.         shifttoets op de Spectrum). De CTRL en de ALT toetsen nemen
  329.         op de Emulator de functie van Symbol Shift waar.
  330.  
  331.            Hieronder staat een lijst met de verschillende keywords,
  332.         plus hoe ze ingetikt moeten worden. Hier staat K voor een
  333.         gewoon keyword (witgedrukt op het originele Spectrum
  334.         toetsenbord). Dit moet in 'K' mode ingetikt worden, dus als
  335.         de cursor een K is. Dit is altijd het geval aan het begin
  336.         van een statement.
  337.  
  338.            Een E staat voor 'E' mode. Deze mode wordt bereikt door
  339.         de symbol-shift en de gewone shift tegelijk even in te
  340.         drukken. De cursor verandert dan van een K (of een L,C of G)
  341.         in een E. Hierna wordt de lettertoets ingedrukt die erachter
  342.         staat aangegeven.
  343.  
  344.            Een SE staat ook voor 'E' mode, maar nu moet de
  345.         lettertoets tegelijk met de symbol-shift ingedrukt worden.
  346.         Een S tenslotte staat voor symbol-shift (De letter moet in
  347.         K, L of C mode met ALT of CTRL ingetikt worden)
  348.  
  349.            Ook de 1 letter karakters staan soms ergens anders dan
  350.         waar ze 'horen' te staan, oftewel waar ze staan op het PC
  351.         toetsenbord. (zie tabel hieronder). Sommige toetsen op het
  352.         PC toetsenbord zijn echter geëmuleerd, zoals de grijze + en
  353.         -, en de karakters , . / < > / ; : ' " _ en =. De karakters
  354.         die overblijven zijn de karakters die op het PC toetsenbord
  355.         met Shift en een cijfertoets bereikbaar zijn. De volgorde op
  356.         het PC toetsenbord is !@#$%^&*() ,op het Spectrum
  357.         toetsenbord is het !@#$%&'()_ .De meeste veranderde tekens
  358.         zijn op een makkelijker manier direct in te tikken; alleen
  359.         de & en de tekens ( en ) zijn 1 plaats naar links
  360.         opgeschoven. De & wordt niet zo vaak gebruikt, maar bij de (
  361.         en de ) moet je even oppassen; dat doe je snel fout. Zie de
  362.         tweede tabel.
  363.  
  364.         Keyw.    Code | Keyw.    Code | Keyw.    Code | Keyw     Code
  365.  
  366.         ABS      E g    DIM      K d    LPRINT   E c    RND      E t
  367.         ACS      SE w   DRAW     K w    MERGE    SE t   RUN      K r
  368.         AND      S y    ERASE    SE 7   MOVE     SE 6   SAVE     K s
  369.         ASN      SE q   EXP      E x    NEW      K a    SCREEN$  SE k
  370.         AT       S i    FLASH    SE v   NEXT     K n    SGN      E f
  371.         ATN      SE e   FN       SE 2   NOT      S s    SIN      E q
  372.         ATTR     SE l   FOR      K f    OPEN #   SE 4   SQR      E h
  373.         BEEP     SE z   FORMAT   SE 0   OR       S u    STOP     S a
  374.         BIN      E b    GO SUB   K h    OUT      SE o   STR$     E y
  375.         BORDER   K b    GO TO    K g    OVER     SE n   TAB      E p
  376.         BRIGHT   SE b   IF       K u    PAPER    SE c   TAN      E e
  377.         CAT      SE 9   IN       SE i   PAUSE    K m    THEN     S g
  378.         CHR$     E u    INK      SE x   PEEK     E o    TO       S f
  379.         CIRCLE   SE h   INKEY$   E n    PI       E m    USR      E l
  380.         CLEAR    K x    INPUT    K i    PLOT     K q    VAL      E j
  381.         CLOSE #  SE 5   INT      E r    POINT    SE 8   VAL$     SE j
  382.         CLS      K v    INVERSE  SE m   POKE     K o    VERIFY   SE r
  383.         CODE     E i    LEN      E k    PRINT    K p    <=       S q
  384.         CONTINUE K c    LET      K l    RANDOMIZE K t   >=       S e
  385.         COPY     K z    LIST     K k    READ     E a    <>       S w
  386.         COS      E w    LLIST    E v    REM      K e
  387.         DATA     E d    LN       E z    RESTORE  E s    DEC      SE q
  388.         DEF FN   SE 1   LOAD     K j    RETURN   K y    HEX      SE w
  389.  
  390.  
  391.         Karakter   Spectrum kbrd   Op PC keyboard
  392.  
  393.         &          S 6             ALT (of CTRL) 6
  394.         '          S 7             ALT 7 of '/"
  395.         (          S 8             ALT 8
  396.         )          S 9             ALT 9
  397.         _          S 0             ALT 0 of SHFT _/-
  398.         <          S r             ALT r of SHFT </,
  399.         >          S t             ALT t of SHFT >/,
  400.         ;          S o             ALT o of :/;
  401.         "          S p             ALT p of SHFT "/'
  402.         ^          S h             ALT h
  403.         -          S j             ALT j of _/-
  404.         +          S k             ALT k of SHFT +/= of GREY +
  405.         =          S l             ALT l of +/=
  406.         :          S z             ALT z of SFHT :/;
  407.         ?          S c             ALT c of SHFT ?//
  408.         /          S v             ALT v of ?//
  409.         *          S b             ALT b of GREY PRTSC/*
  410.         ,          S n             ALT n of </,
  411.         .          S m             ALT m of >/.
  412.  
  413.            Nog een belangrijke opmerking: De Spectrum heeft geen
  414.         aparte Break-toets. Hiervoor gebruikt men Shift-Spatiebalk.
  415.         Een BASIC programma kan dus met Shift-Spatie afgebroken
  416.         worden. Met de combinatie CTRL-BREAK kun je de Emulator
  417.         verlaten.
  418.  
  419.  
  420. 2.2 Spectrum en joysticks
  421.  
  422.            Voor de Spectrum zijn in de loop der tijden zeer veel
  423.         programma's geschreven, en ook veel spelletjes. Toen de
  424.         Spectrum net was uitgekomen, waren er geen joysticks
  425.         verkrijgbaar. De oudere spellen werken dus alleen met het
  426.         toetsenbord. Voor de besturing werden vaak de cursor-toetsen
  427.         gebruikt, dwz de toetsen 5 t/m 8. Deze toetsen hadden de
  428.         volgende functies: 5 links, 6 onder, 7 boven, 8 rechts.
  429.  
  430.            Later kwamen de joystick-interfaces. Sinclair kwam zelf
  431.         met een zeer eenvoudige interface, de Sinclair Joystick.
  432.         Deze gebruikte de toetsen 1 t/m 5, en 6 t/m 0. Een pro-
  433.         gramma dat de Sinclair Joystick ondersteunt, is dus ook
  434.         met het toetsenbord te besturen! De meeste PC-spelletjes
  435.         die van het toetsenbord gebruik maken, gebruiken de
  436.         spatiebalk als vuurtoets. Bij de Spectrum wordt meestal de
  437.         0 toets gebruikt; dit is ook de vuurtoets bij cursor-
  438.         besturing.
  439.  
  440.            Omdat veel programma's al werkten met de cursortoetsen
  441.         voor de besturing, kwam Protek met een interface die de
  442.         joystick de cursortoetsen liet besturen. Een protek joystick
  443.         optie bij een programma is dus equivalent aan een cursor
  444.         optie. Ook een AGF-joystick werkt met dezelfde cursortoetsen.
  445.  
  446.            De enige joystick die echt opgang heeft gemaakt en niet
  447.         met het toetsenbord werkte, is de Kempston joystick. Deze
  448.         joystick geeft zijn informatie door via IN-poort 31.
  449.  
  450.            De geëmuleerde Spectrum joystick wordt bestuurd met de
  451.         pijltjestoetsen op het PC toetsenbord, of met een analoge IBM
  452.         joystick (die op joystickpoort A aangesloten moet worden), of
  453.         met een digitale joystick. Als een digitale joystick wordt
  454.         gebruikt, moet deze op een speciale manier aangesloten worden;
  455.         hoe dit precies moet kun je lezen in paragraaf 3.15.
  456.  
  457.           Je kunt een cursor-, sinclair- of kempstonjoystick laten
  458.         emuleren; de meeste spelletjes zijn op deze manier te
  459.         besturen met de gewone pijltjestoetsen of een echte joystick.
  460.         Welke joystickstandaard je wilt gebruiken kun je bij het
  461.         opstarten aangeven (standaard is cursor, met -j1, -j2 en -k
  462.         worden respectievelijk Sinclair 1 (toetsen 1-5), Sinclair 2
  463.         (toetsen 6-0) en Kempston ingesteld), maar je kunt de keuze
  464.         ook via het hoofdmenu veranderen: F10, en dan menukeuze
  465.         "Change Settings", of direct via F4.
  466.  
  467.            Als joystick-vuurtoets kunnen vier toetsen van het
  468.         PC-toetsenbord gebruikt worden. Allereerst 5, 0 en . op het
  469.         cijferblokje. Omdat je vingers elkaar op dat blokje al snel
  470.         in de weg zitten, kun je ook de TAB-toets als vuurtoets
  471.         gebruiken.
  472.  
  473.            In de BASIC regel-editor van de Spectrum kun je je cursor
  474.         besturen met Shift en de cursor-toetsen. Om het programmeren
  475.         in BASIC makkelijker te maken kan de Emulator dit ook
  476.         automatisch voor je doen: als de joystick-emulatie op Cursor
  477.         staat, en je drukt op NumLock, dan wordt er automatisch op
  478.         Shift gedrukt als je op een pijltjestoets drukt.
  479.  
  480.  
  481.  
  482. 2.3 De SamRam en het Sam Operating System
  483.  
  484.            De SamRam is een hardware uitbreiding die ik heb gemaakt
  485.         voor mijn Spectrum. Het bestaat uit drie delen; een 32K
  486.         statische RAM uitbreiding, geschakeld in het romgebied; een
  487.         electronische schakelaar voor het schakelen van een 32K
  488.         dynamische ram-bank bovenin het geheugen en een Kempston
  489.         joystick interface.
  490.  
  491.            De Emulator ondersteunt de SamRam. Alles is geëmuleerd.
  492.         Voor een gedetailleerde beschrijving van de SamRam hardware,
  493.         zie hoofdstuk 4. Normaal emuleert de Emulator de standaard
  494.         Spectrum met interface 1. Als je de Emulator echter opstart
  495.         met optie -s wordt ook de SamRam geëmuleerd. Het grote
  496.         voordeel van de SamRam is vooral dat je elk programma kunt
  497.         onderbreken. Op de Emulator is dit voordeel minder
  498.         duidelijk, maar ook dan is de SamRam handig wegens de
  499.         ingebouwde disassembler die je op elk punt tijdens elk
  500.         programma kunt aanroepen. Een belangrijke mogelijkheid van
  501.         de SamRam is dat elk programma naar tape geschreven kan
  502.         worden, in een voor gewone Spectrums leesbaar formaat.
  503.         Zie paragraaf 2.5 voor een uitleg hiervan.
  504.  
  505.            De SamRam software, het Sam Operating System, bestaat
  506.         grofweg uit twee delen. Ten eerste zijn er een paar
  507.         commando's toegevoegd aan het standaard Spectrum BASIC
  508.         arsenaal. Ten tweede, het belangrijkste, is er de
  509.         kraaksoftware, waarmee programma's gestopt en weggesaved
  510.         kunnen worden. Hierbij zitten ook een kleine scherm-editor
  511.         en een disassembler.
  512.  
  513.            De kraaksoftware wordt geactiveerd door een NMI,
  514.         geëmuleerd door een druk op F9. Er verschijnt een menu met
  515.         ikonen; de uitleg staat hieronder. Als nogmaals op NMI
  516.         gedrukt wordt, terwijl de kraaksoftware nog aktief is, heeft
  517.         dit een reset van de Spectrum tot gevolg. Een 'geneste'
  518.         aanroep van de kraaksoftware is dus niet mogelijk.
  519.  
  520.  
  521. 2.4 Basic uitbreiding van de SamRam
  522.  
  523.            Er zijn vier commando's toegevoegd aan de normale BASIC
  524.         commando's, te weten *RS, *MOVE, *SAVE en *SPECTRUM. Syntax:
  525.         (I0, I1 etc. stelt een integer expressie voor)
  526.  
  527.            *RS I0,I1,I2,....,In
  528.            *MOVE I0,I1,I2
  529.            *SAVE I0,I1,I2
  530.            *SPECTRUM
  531.  
  532.            *RS stuurt bytes naar de Interface-1 RS232 poort. Dit is
  533.         vooral gemakkelijk om even snel een printer te
  534.         initialiseren, zonder daarvoor apart een RS232 kanaal te
  535.         hoeven openen met bijvoorbeeld OPEN #3;"b", FORMAT "b",9600.
  536.  
  537.            *MOVE is een geheugenblok-verplaats routine. I0 is het
  538.         begin van het geheugenblok, I1 is het adres waar het blok
  539.         naartoe moet en I2 is de lengte van het blok. *MOVE gebruikt
  540.         LDIR of LDDR als het blok omlaag resp. omhoog verschoven
  541.         moet worden, om ervoor te zorgen dat overlappende blokken
  542.         niet gaan 'interfereren'.
  543.  
  544.            *SAVE is hetzelfde als *MOVE, behalve dat tijdens de LDIR
  545.         of de LDDR de shadowrom van de SamRam is ingeschakeld. Ik
  546.         gebruik *SAVE altijd als ik een update van de shadowrom wil
  547.         installeren. Dit lukt echter niet op de Emulator, omdat de
  548.         Emulator een ROM-poke altijd onderschept. *SAVE is wel te
  549.         gebruiken om een kopie van de shadowrom in de RAM te zetten,
  550.         om hem te bekijken met een disassembler. Dit kan
  551.         bijvoorbeeld met het commando *SAVE 0,32768,16384. De SamRam
  552.         shadowrom kan nu bekeken worden vanaf adres #8000.
  553.  
  554.            *SPECTRUM is een zeer eenvoudig commando; het schakelt de
  555.         SamRam uit en start de standaard spectrum op.
  556.  
  557.            Buiten deze 4 commando's zijn er ook nog enkele andere
  558.         faciliteiten ingebouwd, te weten een ramdisk van 25K, een
  559.         snelsave/snellaad routine en decimaal/hexadecimaal conversie
  560.         functies. De snellaad routines zijn in de Emulator niet te
  561.         gebruiken, omdat de gebruikte OUT-instructies naar adres 31
  562.         (bankswitch) teveel tijd kosten.
  563.  
  564.            De ramdisk routines zijn echter prima te gebruiken. De
  565.         syntax is gelijk aan die, gebruikt bij de Spectrum 128. Alle
  566.         cassette statements zijn te gebruiken, zoals LOAD, SAVE,
  567.         MERGE en VERIFY. Na het keyword moet een uitroepteken
  568.         geplaatst worden. Voorbeelden:
  569.  
  570.         SAVE !"a"               Zet een basic programma in ramdisk
  571.                                 onder de naam 'a'
  572.         SAVE !"scherm" SCREEN$  Save een scherm onder de naam
  573.                                 'scherm'
  574.         MERGE !"a"              Merge een programma uit de ramdisk
  575.         LOAD !"scherm" CODE     Laad een codeblok uit de ramdisk
  576.  
  577.            De foutmeldingen bij gebruik van de ramdisk zijn gelijk
  578.         aan die bij gebruik van de tape. "R Tape loading error" zal
  579.         echter nooit optreden. Als een programma niet gevonden
  580.         wordt, verschijnt de errormelding "8 End of file".
  581.  
  582.            Andere commando's voor gebruik met de ramdisk zijn:
  583.  
  584.         CAT !                   Geeft een inhoudsopgave van de
  585.                                 ramdisk met aantal vrije bytes.
  586.         FORMAT !                Maakt de ramdisk helemaal leeg
  587.         ERASE !"naam"           Verwijdert de file 'naam' uit
  588.                                 de ramdisk.
  589.  
  590.            Nog een paar opmerkingen betreffende de ramdisk:
  591.  
  592.         - Als een file gevonden wordt, maar het is niet van het
  593.           gevraagde type, dan wordt ook error 8 gegeven
  594.         - CAT ! geeft bij elke file een extensie, gekozen uit de
  595.           volgende vier:
  596.           .COD voor code files en schermen
  597.           .BAS voor basic programma's
  598.           .CHR voor character array's
  599.           .NMB voor number array's
  600.         - Bij ERASE ! mag geen type (CODE, DATA, SCREEN$ of LINE)
  601.           gegeven worden.
  602.  
  603.            Tenslotte zijn er de hexadecimaal conversie functies, te
  604.         weten DEC en HEX. Deze zitten onder de toetsen q en w (zie
  605.         de tabel hierboven). Als de SamRam ingeschakeld is ben je dus
  606.         de functies ACS en ASN, die normaal onder SE q en SE w zitten,
  607.         kwijt. De functies HEX en DEC kunnen getallen van 0 tot 65535
  608.         aan. Ze worden als volgt gebruikt:
  609.  
  610.            DEC "hexadecimaal getal"     geeft een getal
  611.            HEX getal                    geeft een string
  612.  
  613.  
  614.  
  615. 2.5 De kraaksoftware van de SamRam
  616.  
  617.            Zoals gezegd wordt de kraaksoftware van de SamRam
  618.         opgestart met een druk op NMI. Een NMI wordt geëmuleerd
  619.         wanneer op F5 gedrukt wordt. Er verschijnt een window met
  620.         ikonen, en een aanwijspijltje. Er zijn 8 ikonen, die hier-
  621.         onder een voor een, van linksboven naar rechtsonder,
  622.         behandeld worden.
  623.  
  624.            Helemaal linksboven in de hoek staat een pijl met een N
  625.         erin. De N is geschreven in de gewone Spectrum
  626.         karakterset. Met deze optie keer je terug naar de normale
  627.         Spectrum, dus met de standaard Spectrum ROM ingeschakeld.
  628.  
  629.            Daarnaast staat precies zo'n pijl, maar dan met een E
  630.         erin, geschreven in de SamRam karakterset. Deze optie doet
  631.         precies hetzelfde als N, alleen keer je terug naar de
  632.         extended Spectrum, dus met ingeschakelde SamRom.
  633.  
  634.            Hier weer naast staat de optie 'disassembler', een loepje
  635.         met 'mc' van machinecode erin. Deze optie wordt hieronder in
  636.         een apart hoofdstuk uitgelegd. De disassembler is ook te
  637.         activeren met een druk op D.
  638.  
  639.            Helemaal rechts staat de ikoon voor de schermeditor. Zie
  640.         hieronder voor een uitleg hiervan. De schermeditor is ook op
  641.         te roepen met een druk op 1.
  642.  
  643.            Linksonder staat de optie voor scherm 2. Scherm 1 is het
  644.         scherm, zoals deze op het beeld stond bij de NMI; scherm 2
  645.         wordt bewaard als je uit de kraaksoftware terugkeert, en kan
  646.         een volgende keer opnieuw gebruikt worden. Deze optie is
  647.         gemaakt om makkelijk schermpjes uit programma's te kunnen
  648.         vissen.
  649.  
  650.            Hiernaast staat de 'print scherm' optie. Deze heb ik voor
  651.         mijzelf gemaakt; het stuurt een kopie van het scherm via de
  652.         RS232 poort naar de printer, in het STAR GEMINI-10X formaat.
  653.         Ik ondersteun lekker geen andere printers. De 'scherm print'
  654.         optie zit onder de P toets. Om een Spectrum schermpje op een
  655.         andere printer dan de STAR GEMINI-10X af te drukken, of om
  656.         een schermpje in een PC-tekenprogramma binnen te halen, kun
  657.         je het volgende doen:
  658.  
  659.           1-  Leid de RS232 output om naar disk
  660.           2-  Als het huidige scherm bewaard moet worden, terwijl je
  661.               in BASIC zit, is het voldoende SAVE *"b" SCREEN$ te
  662.               typen.
  663.           3-  Anders: Als het scherm dat je wil bewaren zichtbaar is,
  664.               druk op F5 voor NMI, type '2' en daarna '1' (scherm 1
  665.               opslaan). Druk op ALT F6 om de Spectrum te resetten.
  666.               Typ in BASIC:
  667.  
  668.                  CLEAR 32000
  669.                  OUT 31,11
  670.                  SAVE *"b" CODE 51200,6912
  671.  
  672.               (De CLEAR is ervoor om de stack naar beneden te halen,
  673.               met de OUT wordt de bovenste RAM-bank omgeschakeld, en
  674.               met het SAVE-statement wordt het schermpje, dat op
  675.               adres 51200 of #c800 is opgeslagen, weggeschreven)
  676.           3'- In plaats van de procedure beschreven bij 3 is het ook
  677.               mogelijk in te tikken:
  678.               PAUSE 0: SAVE *"b" SCREEN$
  679.               (De pause 0 zorgt ervoor dat de Spectrum op een toets
  680.               wacht). Druk daarna op F9, type '2' en daarna '3' (voor
  681.               schermen verwisselen), druk dan op 'E' om terug te gaan
  682.               naar BASIC, en druk op een toets.
  683.  
  684.            Als het plaatje in een PC programma geladen moet worden is
  685.         er een andere methode, die een .GIF bestand oplevert. Het op
  686.         het moment van wegschrijven van het .Z80 bestand zichtbare
  687.         scherm kan met de utility CONVERT direct omgezet worden. Zie
  688.         paragraaf 3.12 voor meer informatie hierover.
  689.  
  690.            Naast deze optie zit de optie 'save programma', de belang-
  691.         rijkste optie op mijn gewone Spectrum. Ook voor de Emulator is
  692.         deze optie handig: elk .Z80 bestand kan eenvoudig op tape
  693.         gezet worden. Dit gaat als volgt: laad het programma in als
  694.         .Z80 bestand en druk op een geschikt punt op F5, NMI.
  695.         Eventueel kun je eerder een laadschermpje in de buffer voor
  696.         scherm twee zetten, met de hierboven beschreven methode. Als
  697.         je op 'S' van 'save programma' drukt, krijg je een window te
  698.         zien waarin je drie dingen kan instellen: of het programma
  699.         moet opstarten met SamRam of met de gewone Spectrum ROM, of er
  700.         een laadscherm bijgesaved moet worden en of het programma naar
  701.         tape of microdrive geschreven moet worden. Van deze opties is
  702.         alleen de tweede van belang; de eerste is alleen belangrijk
  703.         voor mijn eigen Spectrum, en de microdrive wordt niet
  704.         ondersteund zodat hier überhaupt niet naar geschreven kan
  705.         worden. Nadat je een filenaam hebt ingetikt wordt het
  706.         programma naar tape geschreven. Dit zou dan weer op een gewone
  707.         Spectrum ingeladen kunnen worden.
  708.  
  709.            Belangrijke opmerking: de instellingen kunnen worden
  710.         veranderd door op de ikonen te klikken met het pijltje. Het
  711.         aktieve ikoon wordt dan helder, met BRIGHT 1. Op CGA en
  712.         Hercules is dit echter niet zichtbaar!
  713.  
  714.            Tenslotte zit helemaal rechtsonder de overige opties,
  715.         vijf in totaal, in een menu onder de toetsen A t/m E:
  716.  
  717.            A: Directory.
  718.         Hiermee krijgt men een inhoudsopgave van de microdrive op
  719.         het scherm. In de huidige versie van geen belang.
  720.            B: Save normaal
  721.            C: Save snel
  722.            D: Keuze opslaan
  723.         Met bovenstaande drie opties is de snelheid van het tape-
  724.         systeem in te stellen, en eventueel op te slaan in de
  725.         battery backed-up CMOS RAM. Standaard staat de SamRam van de
  726.         Emulator ingesteld op normale save-snelheid; de snelle save
  727.         werkt niet wegens het gebruik in de snelle save routine van
  728.         zeer trage OUT-instructies naar poort 31. Deze opties hebben
  729.         dus geen functie in de Emulator.
  730.            E: Basic.
  731.         Met deze optie wordt het lopende programma onderbroken,
  732.         worden enkele belangrijke systeemvariabelen op de juiste
  733.         waarde gezet (Voor de liefhebbers: de stack wordt schoon-
  734.         gemaakt; ERRSP wordt gereset, DFSZ wordt 2, IY wordt op
  735.         23610 en de interrupt mode op 1 gezet.) en wordt naar de
  736.         BASIC ROM gesprongen. Met deze optie kun je de Spectrum
  737.         soms weer tot leven brengen als 'ie gecrasht is.
  738.  
  739.  
  740. 2.6 De ingebouwde schermeditor.
  741.  
  742.            Met de ingebouwde schermeditor kunnen schermpjes
  743.         aangepast worden. De editor is speciaal gemaakt om enigszins
  744.         verminkte laadschermpjes weer op te kalefateren. Voor de
  745.         emulator is de editor niet bijzonder handig. Ik zal
  746.         hieronder in het kort de commando's uit de doeken doen.
  747.  
  748.            In de editor kun je met de cursor in de vorm van een
  749.         plus-teken aanwijzen waar een bepaalde bewerking moet worden
  750.         uitgevoerd. Deze cursor is met de cursortoetsen (5 t/m 8),
  751.         of met de pijltjestoetsen op het PC toetsenbord (die immers
  752.         de cursortoetsen emuleren) te verplaatsen. De volgende
  753.         toetsaanslagen zijn mogelijk:
  754.  
  755.            H: Haal de kleur op van de plaats waar de cursor nu
  756.         staat, en zet dit in het geheugen. Deze opgeslagen kleur kan
  757.         gebruikt worden bij de volgende opdracht:
  758.            Z: Zet de kleur die in het geheugen staat op het scherm.
  759.            G: Haal ('Get') een karakter van het scherm.
  760.            P: Zet ('Put') een karakter op het scherm.
  761.         Met bovenstaande vier opties kunnen stukken van het scherm
  762.         bijvoorbeeld leeggemaakt worden, of een andere kleur gegeven
  763.         worden.
  764.            R: Verwijder ('remove') alle beeldscherminformatie die
  765.         niet te zien is. Als de Paper en Ink kleur hetzelfde zijn,
  766.         is de beeldscherminformatie niet te zien. Deze optie haalt
  767.         deze onnodige informatie van het scherm.
  768.            L: Bekijk ('look') het scherm, door alle kleurinformatie
  769.         er (tijdelijk!) af te halen. Zo is te zien wat voor een
  770.         onzichtbare informatie op het scherm staat.
  771.            T: Ga terug naar het hoofdmenu. Doet hetzelfde als een
  772.         druk op EDIT (=Shift 1, of ESC in de Emulator).
  773.            B: Verander border-kleur
  774.            V: Wis beeldscherm (Het Basic CLS commando zit op de V
  775.         toets.)
  776.  
  777.            Als je in de scherm-editor op nul (0) drukt, wordt het
  778.         teken onder de cursor uitvergroot linksboven in beeld gezet,
  779.         en kun je het pixel voor pixel veranderen. De cursor is nu
  780.         weer met de toetsen 5 t/m 8 te verplaatsen. Een druk op nul
  781.         zet een pixel op de plaats als er geen stond, en haalt er
  782.         een weg als er wel een stond. Met Enter of Edit (of ESC) kom
  783.         je weer op het gewone scherm van de editor.
  784.  
  785.            In deze mode zijn er twee extra commando's: met C wis je
  786.         het blokje; alle pixels gaan uit, en met I inverteer je het
  787.         blokje.
  788.  
  789.  
  790. 2.7 De ingebouwde Z80 disassembler
  791.  
  792.            Het belangrijkste in de SamRam software is eigenlijk de
  793.         disassembler, althans, deze gebruik ik het meest. Deze
  794.         disassembler lijkt wat zijn uiterlijk betreft nogal op MONS,
  795.         maar is wat mogelijkheden betreft wat simpeler: je kunt bij-
  796.         voorbeeld niet single-steppen.
  797.  
  798.            Nadat in het hoofdmenu op D is gedrukt, verschijnt het
  799.         scherm van de disassembler in beeld. Deze bestaat uit drie
  800.         delen. Bovenaan staan de eerste 8 instructies gedisassembelt
  801.         vanaf de geheugenpointer, vanaf hier genoemd MP. Daaronder
  802.         staat de waarde van de stack pointer, kortweg SP, met daar-
  803.         achter de eerste negen adressen op de stack. Daar weer onder
  804.         staat de waarde van de Program Counter of PC (Vergelijkbaar
  805.         met de IP van de 8088/86). Op dit punt is het programma
  806.         gestopt toen op NMI (F5) werd gedrukt.
  807.  
  808.            Naast de PC staan de drie MP-geheugens. Hierin kunnen tot
  809.         drie pointers worden opgeslagen, die weer snel opgeroepen
  810.         kunnen worden. Vooral handig om even te stoppen met het
  811.         disassemblen van een hoofdroutine, de huidige plaats op te
  812.         slaan, en even een subroutine disassemblen. Als dit gebeurd
  813.         is, kan de draad weer snel opgepikt worden door de oude MP
  814.         terug te vragen.
  815.  
  816.            Hieronder staan 24 adressen, met de inhoud van de
  817.         adressen, van 11 voor de MP tot 12 na de MP. Onder deze hele
  818.         zaak staat een underscore als cursor te wachten op input.
  819.         Er kunnen nu eenlettercommando's ingegeven worden.
  820.  
  821.            Als er bytes of adressen als operand gegeven moeten
  822.         worden, gebeurt dit in het default type, dus of decimaal of
  823.         hexadecimaal. Het default type is bij het begin hex, zodat
  824.         alle bytes en adressen op het scherm in hex gegeven worden.
  825.         Met een druk op #, dus op ALT-3 wissel je tussen hex en
  826.         decimaal. Als het default type dec is, verschijnen ook alle
  827.         getallen op het beeld in decimale notatie.
  828.  
  829.            Met $ en # kun je het default type omzeilen. Dus:
  830.  
  831.         ffff    =       65535 decimaal, als def.type hex is
  832.         8000    =       32768 dec. als def.type hex is
  833.         8000    =       8000 dec. als def.type dec is
  834.         81de    =       error als def.type dec is
  835.         $8000   =       8000 dec, ongeacht het def.type
  836.         #8000   =       32768 dec, ongeacht het def.type
  837.         #32768  =       error, ongeacht def.type
  838.  
  839.            Als je een getal in moet voeren, zijn er ook nog de
  840.         volgende drie mogelijkheden. Met een druk op Enter op een
  841.         lege regel wordt de bewerking/actie afgebroken, en een 'm'
  842.         representeert de huidige waarde van de memory pointer.
  843.         Als de regel begint met " (aanhalingstekens), dan is de
  844.         waarde van het getal de ascii waarde van het teken dat
  845.         direct achter het aanhalingsteken staat. Dus: "0
  846.         representeert de waarde #30 ($48); "A de waarde $65.
  847.  
  848.            Hieronder volgt een korte beschrijving van alle
  849.         commando's van de disassembler:
  850.  
  851.            Q: Met Q wordt de memory-pointer 1 kleiner; je verschuift
  852.         een adres naar boven.
  853.  
  854.            A: Met A doe je precies het tegenovergestelde: de
  855.         memory-pointer wordt 1 groter, je verschuift een adres naar
  856.         beneden.
  857.  
  858.            <ENTER>: Met een druk op de Enter- of Return-toets
  859.         verschuif je 1 instructie naar beneden. Dit heeft dus
  860.         hetzelfde effect als 1 tot 4 keer op A drukken. De 8 regels
  861.         disassembly bovenaan het scherm schuiven 1 regel naar boven;
  862.         de bovenste instructie verdwijnt uit het beeld.
  863.  
  864.            M: Met M kun je de memory-pointer instellen. Er moet een
  865.         getal ingetikt worden (zie opm. hierboven)
  866.  
  867.            P: (Put). Hierachter moet een getal ingevoerd worden.
  868.         Dit getal wordt opgeslagen in de eerste van de drie memory
  869.         pointer geheugenplaatsen. Meestal gebruik je 'm' (zie opm.
  870.         hierboven) om de huidige waarde van de memory pointer op
  871.         te slaan. De twee laatst ingevoerde waarden schuiven 1
  872.         plaats naar rechts, en de waarde in het derde geheugen
  873.         verdwijnt.
  874.  
  875.            G: (Get). Hierachter verwacht de disassembler een cijfer
  876.         van 1 tot 3. Hiermee wordt de waarde van een van de drie
  877.         memory pointer geheugenplaatsen in de actieve memory pointer
  878.         gezet.
  879.  
  880.            B: (Byte). De disassembler vraagt nu om een byte. Deze
  881.         zal, op de plaats van de memory pointer, in het geheugen
  882.         gepoked worden, en de memory pointer wordt 1 plaats
  883.         doorgeschoven.
  884.  
  885.            I: (Insert). Deze optie is hetzelfde als optie B, alleen
  886.         blijft de disassembler bytes vragen en achter elkaar in het
  887.         geheugen zetten, totdat een Enter gegeven wordt op een lege
  888.         regel.
  889.  
  890.            #: Hiermee wordt het default type veranderd: Was het Hex,
  891.         dan is het nu decimaal, en omgekeerd. Alle adressen worden
  892.         nu ook in het default type op het scherm gezet.
  893.  
  894.            F: (Find). De ingebouwde zoek-optie. Je kunt nu tot
  895.         maximaal tien bytes invoeren, waarna de disassembler vanaf
  896.         de memory-pointer zal zoeken totdat de gevraagde byte of
  897.         rij bytes gevonden wordt. Als de byte of de rij bytes niet
  898.         gevonden wordt, zal het zoeken stoppen op adres 0. De gege-
  899.         vens moeten regel voor regel ingevoerd worden. Is bijvoor-
  900.         beeld een byte ingevoerd, dan moet een enter gegeven
  901.         worden, waarna vervolgd kan worden met het invoeren van
  902.         gegevens. Bij een druk op enter op een lege regel, of als er
  903.         al tien bytes zijn ingevoerd, zal het zoeken beginnen. Er
  904.         zijn vier verschillende typen gegevens bij deze optie.
  905.         Ten eerste kun je gewoon een byte invoeren, hexadecimaal of
  906.         decimaal volgens de normale regels. Als het getal dat je
  907.         invoert groter is dan 255 (#FF), wordt een woord
  908.         verondersteld. Er wordt dan gezocht naar de twee bytes die
  909.         samen het woord vormen, met de lsb voorop, en daarachter de
  910.         msb (most significant byte). Je kunt ook een string karakters
  911.         invoeren. Als de eerste karakter " is, wordt de rest van de
  912.         regel verondersteld een string te zijn, en wordt hiernaar
  913.         gezocht. (Dus niet afsluiten met ". Als je "tekst" intikt,
  914.         wordt naar tekst" gezocht!)
  915.            Tenslotte is er het gegeven 'x'. Dit is een speciaal
  916.         geval; het betekent 'alle gegevens'. Met een of meer x'en
  917.         kun je dus 'gaten' in je zoekstring maken. Dit maakt het
  918.         zoeken een stuk flexibeler.
  919.  
  920.            Voorbeelden: (voor een komma moet je een enter lezen:)
  921.  
  922.         "Tekst          Zoekt naar de string: Tekst
  923.         #cd, x, #00     Zoekt naar een Call instructie (#cd) naar
  924.                         een routine in de onderste 256 bytes. (#0000
  925.                         tot #00FF)
  926.         x, #8101        Zoekt naar de rij bytes #01,#81, en als deze
  927.                         gevonden zijn wijst de memory-pointer 1 byte
  928.                         voor dit woord.
  929.         #0081           Zoekt naar de byte #81, NIET naar het woord
  930.                         #0081! (Een woord is pas een woord als het
  931.                         groter dan 255 is)
  932.  
  933.           N: (Next). Hiermee wordt verder gezocht naar de laatst
  934.         ingevoerde zoekstring.
  935.  
  936.           $: Hiermee krijg je een pagina disassembly op je scherm.
  937.         In deze mode zijn de volgende toetsaanslagen mogelijk:
  938.           $: Terug naar hoofdscherm disassembler.
  939.           7 of Shift 7 (Cursor omhoog, dus): Ga een bladzijde terug.
  940.         De disassembler onthoudt de adressen van de laatste acht
  941.         pagina's; je kunt dus maximaal acht pagina's terug.
  942.           Q: Een byte terug
  943.           A: Een byte vooruit.
  944.           Z: Maak een hardcopy van het scherm. Deze optie stuurt het
  945.         scherm naar de RS232 poort, in ASCII formaat.
  946.           Elke andere toets heeft tot gevolg dat je een scherm
  947.         verder gaat.
  948.  
  949.           K: (List). Je komt in dezelfde mode als met '$' het geval
  950.         is. Je krijgt echter geen disassembly, maar een geheugendump
  951.         met ascii-codes op het scherm. Deze optie is vooral
  952.         gemakkelijk voor het snel zoeken naar tekst in een
  953.         programma.
  954.  
  955.           C: (Clear). Hiermee zijn stukken geheugen te wissen, of te
  956.         vullen met bytes. De disassembler komt met de prompts 'First',
  957.         'Last' en 'With'. Hierachter moeten respectievelijk het
  958.         eerste en laatste adres, en de bytewaarde ingevuld worden
  959.         waarmee de adressen moeten worden opgevuld. Het laatste
  960.         adres is inclusief!
  961.  
  962.           D: (Dump). Dump een disassembly naar de RS232 poort. De
  963.         disassembler komt met de prompts 'First' en 'Last',
  964.         waarachter het eerste en het laatste adres dat moet worden
  965.         gedisassembled moet worden ingevuld. ('Last' weer
  966.         inclusief). Met deze optie kun je gemakkelijk een disassem-
  967.         bly naar de PC 'porten', door de RS232-output om te leiden
  968.         naar een bestand. (In deze file wordt het einde van de regel,
  969.         op de normale Spectrum manier, aangegeven door CR's. Om dit in
  970.         het voor PC's gebruikelijke formaat met CR/LF's om te zetten
  971.         kun je CONVERT gebruiken.)
  972.  
  973.           R: (Registers). Deze optie is op twee verschillende
  974.         manieren te gebruiken. Als je achter 'R' op enter drukt,
  975.         krijg je de registers te zien, zoals die waren toen er op
  976.         NMI gedrukt werd. Als je een registernaam intikt, te kiezen
  977.         uit A,B,C,D,E,H,L,A',B',C',D',E',H',L',I,R (de 8 bit
  978.         registers) en AF,BC,DE,HL,AF',BC',DE',HL',IX,IY,SP,PC (de
  979.         16 bit registers en registerparen), kun je de waarde van dat
  980.         register veranderen.
  981.  
  982.           V: (Verplaats). De disassembler vraagt 'From', 'To' en
  983.         'Length'. Al naar gelang de richting waarin verschoven wordt
  984.         (naar boven of naar beneden in het geheugen), zal een LDIR
  985.         of een LDDR instructie gebruikt worden om het geheugenblok
  986.         te verplaatsen.
  987.  
  988.           Ten slotte zijn er nog drie instructies die voor gebruik
  989.         op de emulator niet zo belangrijk zijn. Het zijn S (Save), L
  990.         (Load) en H (Header read). Ik laat het aan de lezer over om
  991.         uit te zoeken hoe ze precies werken.
  992.  
  993.  
  994.  
  995.  
  996.  
  997. 3. DE EMULATOR
  998.  
  999.  
  1000. 3.1 Overzicht
  1001.  
  1002.            In deze paragraaf zal ik proberen een kort overzicht van
  1003.         het functioneren en het bedienen van de Emulator te geven.
  1004.         Meer gedetailleerde informatie staat verderop in het
  1005.         hoofdstuk.
  1006.  
  1007.            Standaard staat de Emulator zo ingesteld, dat bijna alle
  1008.         programma's op de hoogst mogelijke snelheid gedraaid worden.
  1009.         Deze snelheid kan, indien gewenst, met tot iets meer dan een
  1010.         factor 4 teruggebracht worden. De emulatie van de Spectrum is
  1011.         bijna perfect, maar er zijn enkele aspecten die onder controle
  1012.         van de gebruiker staan en die de emulatie nog beter maken, ten
  1013.         koste van de snelheid. Dit zijn de R-register emulatie en de
  1014.         LDIR-emulatie, beide belangrijk bij (erg goed) beveiligde
  1015.         programma's.
  1016.  
  1017.            De instellingen kunnen gewijzigd worden in het hoofdmenu,
  1018.         dat tevoorschijn komt met een druk op F10. De meeste
  1019.         functietoetsen hebben een functie; een overzicht staat in
  1020.         een hulp-schermpje dat je oproept met F1.
  1021.  
  1022.            Een Reset van de Spectrum wordt gegenereerd met ALT-F6,
  1023.         en een NMI met F5. Dat laatste is alleen handig als je de
  1024.         SamRam gebruikt (zie 2.4).
  1025.  
  1026.            De Emulator ondersteunt de Spectrum tape interface. Als
  1027.         je een voldoende snelle computer hebt waar de Emulator op
  1028.         zo'n 100% of sneller loopt, kun je in Real mode alle
  1029.         programma's (ook snellaad!) inladen. Op alle computers
  1030.         kunnen programma's ingeladen worden die op de gewone manier
  1031.         zijn gesaved; hiervoor hoeft de Emulator niet in Real mode
  1032.         te staan.
  1033.  
  1034.            De Emulator wordt in Real mode gezet met F7. In deze mode
  1035.         wordt het beeldscherm niet meer periodiek bijgewerkt, en
  1036.         kan ook het toetsenbord niet meer gebruikt worden. Hier
  1037.         staat tegenover dat de Emulator heel gelijkmatig loopt,
  1038.         waardoor van snellaad en -save gebruik gemaakt kan worden, en
  1039.         muziekjes beter klinken.
  1040.  
  1041.            De output naar het geëmuleerde RS232 kanaal van de
  1042.         Interface-I, en de input hier vandaan, kan worden gekoppeld
  1043.         met PC-randapparatuur en bestanden. Dit gaat ook via het
  1044.         hoofdmenu. Op deze manier kunnen Spectrum programma's
  1045.         communiceren met de PC-omgeving.
  1046.  
  1047.            Niet onbelangrijk: er is ook voor joystick emulatie
  1048.         gezorgd. Met de PC-pijltjestoetsen bestuur je de Spectrum
  1049.         joystick. Dit kun je ook doen met een analoge IBM-joystick
  1050.         of een digitale joystick; in het laatste geval moet er een
  1051.         kleine hardware-interface gebouwd worden. De Spectrum
  1052.         joystick die je bestuurt kun je kiezen uit Cursor, Kempston,
  1053.         en Sinclair 1,2.
  1054.  
  1055.  
  1056. 3.2 Command line syntax
  1057.  
  1058.         De Sinclair ZX Spectrum Emulator moet als volgt opgestart worden:
  1059.  
  1060.         Z80 [{/|-}opties ...] [filenaam[.Z80]]
  1061.  
  1062.         In woorden: de opties moeten beginnen met een / of een -, en
  1063.         er mogen meerdere van zijn (niet gescheiden door spaties,
  1064.         anders moet er weer een / of - voor.) Ze mogen ook weggelaten
  1065.         worden. Na de opties mag de naam van een .Z80 bestand gegeven
  1066.         worden, dat direct zal worden ingeladen. Hierbij is de extensie
  1067.         .Z80 niet nodig.
  1068.  
  1069.            In plaats van een .Z80 bestand kan ook alleen een pad naar
  1070.         een directory met .Z80 bestanden opgegeven worden. Als je dit
  1071.         doet zal de Emulator bij het opstarten je de mogelijkheid
  1072.         geven uit de bestanden te kiezen en er eentje in te laden.
  1073.  
  1074.            Met de opties kunnen alle dingen ingesteld worden die ook
  1075.         in het hoofdmenu te wijzigen zijn plus enkele andere die na
  1076.         het opstarten vastliggen. De volgende opties zijn mogelijk:
  1077.  
  1078.          -h        Hercules graphics
  1079.          -x        Extended Hercules graphics
  1080.          -c        CGA graphics
  1081.          -e        EGA/VGA graphics
  1082.          -p        Plantronics graphics
  1083.          -q        Plantronics (grijstinten)
  1084.          -n        Standaard Spectrum (zonder IF1)
  1085.          -s        Spectrum met SamRam
  1086.          -jk       Kempston joystick (ipv Cursor)
  1087.          -j1, -j2  Sinclair joystick 1,2 (ipv Cursor)
  1088.          -kk       Gebruik geen digitale of analoge joystick
  1089.          -kz       Gebruik Digitale Zandbergen joystick
  1090.          -d        Dubbele interruptfrequentie
  1091.          -l        LDIR/LDDR emulatie
  1092.          -f        Snellere FLASH emulatie
  1093.          -r        R register emulatie
  1094.          -w        16K IF1 bankswitch
  1095.          -2        Emuleer Issue-2 Spectrum
  1096.          -g        Geen geluid
  1097.          -bN       Tape I/O via LPTn
  1098.          -yl, -yh  Lage, hoge video sync.
  1099.          -aN       Spec RS232 output naar LPTn
  1100.          -oN       Spec RS232 output naar COMn
  1101.          -iN       COMn naar Spec RS232 input
  1102.          -tF       Spec RS232 output naar file F
  1103.          -uF       File F naar Spec RS232 input
  1104.          -znnn.n   Maak rel. snelheid nnn.n%
  1105.          -?        Hulppagina
  1106.  
  1107.  
  1108.            Met de optie -h maakt de Emulator gebruik van de hercules
  1109.         kaart om het spectrum scherm af te beelden. Als een hercules
  1110.         interface aanwezig is, en deze wordt gedetecteerd, is deze
  1111.         optie niet nodig; het programma zal dan automatisch hercules
  1112.         gebruiken. Ook de opties -c en -e, voor respectievelijk CGA
  1113.         en EGA, zijn meestal niet nodig; in bijna alle gevallen zal
  1114.         de software de betreffende grafische kaart kunnen detecteren.
  1115.         Merk op dat er geen aparte VGA-optie is. EGA biedt de resolutie
  1116.         en alle kleuren die nodig zijn om het ZX Spectrum beeldscherm
  1117.         volledig te laten zien. Met een hogere resolutie en/of meer
  1118.         kleuren wordt niks gewonnen.
  1119.  
  1120.            De optie -x zorgt er ook voor dat het spectrum scherm op
  1121.         Hercules wordt afgebeeld. De herculeskaart wordt nu echter
  1122.         iets anders, op een niet-standaard manier ingesteld, zodat
  1123.         de resolutie 384*84 pixels wordt, in plaats van de gewone
  1124.         348*90 pixels. Hierdoor kan er een veel mooiere (en grotere)
  1125.         afbeelding gemaakt worden. Het kan echter zijn dat de
  1126.         monitor deze mode niet aankan; daarom wordt standaard de
  1127.         mode behorende bij optie -h gebruikt.
  1128.  
  1129.           De plantronics videokaart wordt in de meeste gevallen niet
  1130.         bij het opstarten herkend, omdat er vaak ook CGA aanwezig
  1131.         is. Voor het gebruik van deze videokaart zijn de opties -p
  1132.         en -q nodig. Optie -p is de standaard; op monochroom moni-
  1133.         toren is het resultaat met -q vaak mooier.
  1134.  
  1135.           Met de optie -n wordt de emulator in zijn meest
  1136.         uitgeklede vorm opgestart. De emulator heeft nu ongeveer
  1137.         200K vrij geheugen nodig. (64K voor de Spectrum en 136K voor
  1138.         de emulator en data). Normaal wordt de emulator opgestart
  1139.         als gewone Spectrum met interface 1. In deze vorm heeft de
  1140.         emulator zo'n 240K geheugen nodig. Met de optie -s wordt,
  1141.         indien mogelijk, de meest complete Spectrum opgestart, met
  1142.         interface 1 en SamRam. De emulator heeft dan zo'n 272K vrij
  1143.         geheugen nodig. Als er onvoldoende vrij geheugen
  1144.         beschikbaar is, zal de emulator eerst proberen een
  1145.         standaard spectrum op te starten. Als dit ook niet lukt
  1146.         keert de emulator naar DOS terug.
  1147.  
  1148.           De opties -jk, -j1 en -j2 besturen de joystick-emulatie.
  1149.         Standaard zijn de PC-pijltjestoetsen en de eventuele IBM
  1150.         analoge joystick of de digitale joystick 'aangesloten' op de
  1151.         cursortoetsen en de 0 als vuurtoets. Veel spelletjes werken
  1152.         (ook) samen met de Kempston of de Sinclair joysticks. Met
  1153.         optie -jk wordt de Kempston-joystick geëmuleerd, met optie
  1154.         -j1 en -j2 worden respectievelijk de Sinclair joystick 1 en
  1155.         2 (resp. toetsen 1-5 en 6-0) gebruikt.
  1156.  
  1157.           Een analoge IBM joystick wordt, indien deze is aangesloten,
  1158.         herkend en werkt dan verder als Spectrum Cursor, Kempston of
  1159.         Sinclair joystick. Als dit niet de bedoeling is, of het
  1160.         programma denkt een joystick te zien terwijl er geen is
  1161.         aangesloten kan optie -kk worden gebruikt. Ook een digitale
  1162.         joystick (zie paragraaf 3.15) zal worden herkend. Mocht dit
  1163.         niet goed gaan dan kan een digitale joystick geforceerd worden
  1164.         herkend met optie -kz.
  1165.  
  1166.           Met de optie -d wordt er tweemaal zo vaak een software
  1167.         Z80 interrupt gegenereerd. Het is voor het geëmuleerde
  1168.         programma nu net alsof er niet 50 keer maar 100 keer per
  1169.         seconde een interrupt voorkomt. Sommige spellen worden
  1170.         hierdoor sneller. Ook reageert het toetsenbord sneller,
  1171.         omdat de Spectrum ROM het toetsenbord via interrupts
  1172.         afscant. Wees echter voorzichtig met deze optie; er zijn
  1173.         spellen die door gebruik van deze optie juist langzamer
  1174.         worden; sommige lopen zelfs helemaal in de soep en crashen.
  1175.         Als je echter wat in Spectrum BASIC wil doen, is het sterk
  1176.         aan te raden deze optie te gebruiken, vooral op wat
  1177.         langzamere computers, omdat het toetsenbord dan veel beter
  1178.         reageert. Ook is het nuttig om bij elk spel even te proberen
  1179.         welk effect deze optie heeft.
  1180.  
  1181.            De optie -l heeft tot gevolg dat de Emulator de LDIR en
  1182.         LDDR instructies beter gaat emuleren. Door goed beveiligde
  1183.         programma's zoals programma's die van SPEEDLOCK gebruik maken,
  1184.         worden ongewone eigenschappen van de LDIR instructie gebruikt.
  1185.         (Zie hoofdstuk 4 voor details.) Met de -l optie worden deze
  1186.         programma's goed uitgevoerd. Zonder deze optie kunnen sommige
  1187.         programma's echter beduidend sneller lopen (probeer b.v.
  1188.         Jetset Willy en Manic Miner).
  1189.  
  1190.            De Z80 LDIR en LDDR instructies worden relatief snel uit-
  1191.         gevoerd door de emulator (als optie -l niet aktief is). Als
  1192.         je een programma draait dat veel van de LDIR instructie ge-
  1193.         bruikt maakt, en je bovendien een snelle computer hebt, kan
  1194.         het zijn dat het programma veel te snel gaat lopen. (B.v.
  1195.         Jetset Willy). Ook dan is optie -l te gebruiken, alleen dan
  1196.         om de emulator te vertragen.
  1197.  
  1198.            Als in de command line -f staat, wordt de FLASH functie
  1199.         van de spectrum 2 keer zo snel als normaal geëmuleerd. Op
  1200.         langzame computers is deze optie handig om een natuurlijker
  1201.         lijkende Flash te krijgen.
  1202.  
  1203.            De optie -r is bijna nooit nodig. Sommige
  1204.         beveiligingsmethoden berusten op het decoderen van
  1205.         programma's met behulp van het refresh-register. Om deze
  1206.         programma's goed te kunnen draaien, moet het refresh-
  1207.         register na elke instruktie verhoogd worden. Dit resulteert
  1208.         in een vertraging van bijna 30%. Niet gebruiken dus, deze
  1209.         optie, tenzij het noodzakelijk is (zoals bij veel programma's
  1210.         die van snellaad gebruik maken!)
  1211.  
  1212.            In een gewone Spectrum met Interface 1 beslaat het ROM
  1213.         gebied van deze interface de volle 16K, hoewel er maar een
  1214.         8K ROM in de interface zit. De bovenste 8K van de 16K bevat
  1215.         dezelfde informatie als de onderste 8K, maar wordt nooit
  1216.         gebruikt. Om de Interface 1 wat sneller te laten omschakelen
  1217.         schakel ik normaalgesproken alleen de onderste 8K in. Dit
  1218.         is met optie -w te veranderen. (Er zou een programma kunnen
  1219.         zijn die dit controleert....!)
  1220.  
  1221.            Sommige oude programma's, zoals Spinads en Scrambler, gaan
  1222.         ervan uit dat als je geen toets indrukt, poort 254 de waarde
  1223.         255 teruggeeft. Dit gebeurde op Issue-2 Spectrum, terwijl op
  1224.         Issue-3 Spectrums de waarde 191 wordt teruggegeven. Om deze
  1225.         problemen op te vangen maakt optie -2 van de Emulator een
  1226.         Issue-2 Spectrum.
  1227.  
  1228.            De optie -g zorgt ervoor dat de Spectrum OUT instructies
  1229.         voor de luidspreker onderschept worden. Een programma zal
  1230.         dus geen geluid kunnen maken.
  1231.  
  1232.            Met optie -bN, met N=1,2,3,4 wordt aangegeven aan welke
  1233.         parallelle printerpoort de cassette-interface is aangesloten.
  1234.         Zie paragraaf 3.8 voor uitgebreide uitleg over loaden en
  1235.         saven van programma's.
  1236.  
  1237.            Vanaf versie 1.30 zijn de optie -yl en -yh toegevoegd,
  1238.         die staan voor lage en hoge video synchronisatie. Deze opties
  1239.         hebben te maken met een subtiel verschil tussen de manier waarop
  1240.         de gewone Spectrum en de Spectrum Emulator de informatie in het
  1241.         beeldschermgeheugen presenteren. Bij de modernste Spectrum
  1242.         spellen, zoals Uridium en Ghosts & Goblins, geeft dit verschil
  1243.         aanleiding tot een onrustig beeld, of flikkerende 'sprites'.
  1244.         Als dit gebeurt is -yl vaak voldoende om het tegen te gaan. Ik
  1245.         ben nog geen spel tegengekomen die -yh nodig had, maar voor de
  1246.         volledigheid heb ik 'm er toch maar bijgedaan. Zie hoofdstuk 4,
  1247.         paragraaf 5, voor een meer technische beschrijving van deze
  1248.         optie.
  1249.  
  1250.            Met optie -a wordt de output van de Spectrum naar het
  1251.         Spectrum RS232 kanaal (het "b" of "t" kanaal van de inter-
  1252.         face 1) omgeleid naar een parallelle poort van de PC.
  1253.         Bijvoorbeeld -a2 leidt de output om naar LPT2. Standaard
  1254.         (dus zonder opgegeven omleiding) wordt de output omgeleid
  1255.         naar LPT1.
  1256.  
  1257.            Optie -o is net zo'n optie; alleen wordt nu de informatie
  1258.         naar de betreffende COM-poort gestuurd. Zorg er wel voor dat
  1259.         de poort goed staat ingesteld, doe dit anders door middel
  1260.         van het MODE commando. Voorbeeld: met -o2 wordt de output
  1261.         van het SAVE *"b" SCREEN$ commando (alleen met Interface 1)
  1262.         naar COM2 gestuurd.
  1263.  
  1264.            Voor optie -i geldt hetzelfde, alleen nu wordt de COM-
  1265.         poort voor input gebruikt. Zorg ook nu dat de betreffende
  1266.         poort juist staat ingesteld.
  1267.  
  1268.            De opties -t en -u spreken voor zich. Als het bestand dat
  1269.         gespecificeerd is bij optie -u niet bestaat zal er een
  1270.         errormelding volgen; als het bestand bij optie -t bestaat,
  1271.         zal deze verwijderd worden. Voorbeelden:
  1272.            -t output.txt
  1273.            -u c:\myfile.fil
  1274.         De spatie tussen de optie en de filenaam is niet nodig.
  1275.  
  1276.            Op erg snelle computers kan de Spectrum Emulator zo snel
  1277.         lopen, dat spelletjes volkomen onspeelbaar worden, het
  1278.         toetsenbord onhandelbaar, melodietjes onhoorbaar, enzovoorts.
  1279.         Hoewel eigenaren van dit soort computers ongetwijfeld geld
  1280.         genoeg hebben om gewoon een ZX Spectrum te kopen, en dus de
  1281.         Spectrum Emulator helemaal niet nodig hebben, kom ik deze
  1282.         mensen toch tegemoet met de optie -z. Als deze optie gegeven
  1283.         wordt, met achter de -z de snelheid van de Spectrum in
  1284.         procenten, relatief ten opzichte van de gewone Spectrum, dan
  1285.         zal de Emulator proberen deze snelheid zo goed mogelijk te
  1286.         benaderen. B.v. op een gewone PC heeft het hoopvolle '-z100.0'
  1287.         geen zin, en wordt de Emulator in de snelste stand gezet. Aan
  1288.         de andere kant wordt met '-z 0' de traagste stand gekozen.
  1289.         Maar voor 80486-computers en snelle '386-computers is '-z 100'
  1290.         een aan te raden instelling.
  1291.            De optie -z werkt alleen in de geregistreerde versie van de
  1292.         Spectrum Emulator.
  1293.  
  1294.            Als een filenaam gegeven is, wordt deze file als Spectrum
  1295.         programma ingeladen en uitgevoerd. Voor meer informatie over
  1296.         het bewaren van Spectrum programma's zie in dit hoofdstuk
  1297.         paragraaf 7, over het hoofdmenu van de Emulator. De struktuur
  1298.         van een .Z80 bestand wordt beschreven in hoofdstuk 4.
  1299.  
  1300.            Bijna alle instellingen die bij het opstarten gemaakt
  1301.         zijn kunnen tijdens de uitvoering van het programma
  1302.         gewijzigd worden. Alleen de scherm-mode opties en de
  1303.         configuratie van de Spectrum (Interface 1, SamRam) liggen
  1304.         vanaf het opstarten van de Emulator vast.
  1305.  
  1306.  
  1307. 3.3 Hoe goed is de Emulator?
  1308.  
  1309.            Deze versie emuleert de volledige standaard Spectrum,
  1310.         met alle standaard I/O mogelijkheden (geluid, toetsenbord,
  1311.         beeldscherm, cassette i/o), de Interface 1 zonder microdrive
  1312.         en netwerk (dus alleen de software en de RS232 aansluiting),
  1313.         en de SamRam met bijbehorende software.
  1314.  
  1315.            Het is natuurlijk duidelijk dat programma's die meer
  1316.         hardware vragen dan wat hierboven staat niet zullen werken.
  1317.         Gelukkig zijn er maar weinig van zulke programma's. Bijna
  1318.         alle programma's gaan uit van een standaard Spectrum, zonder
  1319.         extra hardware.
  1320.  
  1321.            Nu is de vraag: hoeveel Spectrum programma's, die genoeg
  1322.         hebben aan de gewone Spectrum met eventueel een Interface 1,
  1323.         werken op de Spectrum Emulator. Ik heb de emulator uitgebreid
  1324.         getest en geprobeerd op een heleboel programma's, en tot nu
  1325.         toe werkten ze vrijwel allemaal goed. Uitzonderingen zijn:
  1326.         Fireman, die raar doet als je aan de linkerkant van iets
  1327.         afvalt, en Tomahawk, waarvan de speedlock-loader crasht,
  1328.         waarschijnlijk door een vreemd gebruik van de Z80 flags. Op
  1329.         deze kleine probleempjes na werken vrijwel alle programma's
  1330.         die draaien op een gewone Spectrum (met eventueel interface 1)
  1331.         ook op de Emulator, inclusief de programma's die voor
  1332.         beveiligingsdoeleinden gebruik maken van het R register.
  1333.  
  1334.            (Overigens: het probleem 'Fireman' is opgelost, maar de
  1335.         oplossing implementeren zou betekenen dat veel andere
  1336.         programma's langzamer gaan lopen. Dit is onacceptabel.)
  1337.  
  1338.            Nog een ander aspect is van belang, namelijk de snelheid.
  1339.         De Z80 emulator, die een belangrijk onderdeel is van de
  1340.         Spectrum emulator, is (vrijwel) optimaal. HET KAN NIET
  1341.         SNELLER! De Z80 emulator is de snelste die mogelijk is voor
  1342.         de PC. Alle andere emulatoren (in de vorm van CP/M, ZX81
  1343.         en ZX Spectrum emulatoren) die ik heb gezien waren allemaal
  1344.         duidelijk langzamer dan deze.
  1345.  
  1346.            Op mijn PC, een Philips P3105 met V20 (=8 bits bus) en
  1347.         8 MHz klok, loopt de emulator op ongeveer 19.5% van de
  1348.         snelheid van een normale Spectrum. Dit komt overeen met
  1349.         een Z80 klokfrequentie van .195*3.5 MHz = ongeveer 700 kHz.
  1350.         Deze frequentie is inclusief de ondersteunende software, dus
  1351.         beeldscherm emulatie, keyboard emulatie etc. Met deze
  1352.         snelheid zijn zeker niet alle programma's bruikbaar, maar
  1353.         een heleboel lopen, soms met enige aanpassingen, op een heel
  1354.         aanvaardbare snelheid. Zie hoofdstuk 3.11 voor suggesties.
  1355.         Op een 12 MHz NEC Powermate 1+ (AT) loopt de emulator op 62%.
  1356.         Dit lijkt weinig, maar het blijkt dat de vertraging
  1357.         nauwelijks opvalt. Vanaf een 12 MHz AT heb je gewoon het
  1358.         gevoel dat je op een Spectrum zit te werken (of te spelen).
  1359.         Op 25 MHz AT's en 80386's loopt de Emulator meestal ruim
  1360.         boven de 100%, maar vertragen is nog niet echt nodig. Op
  1361.         snelle 386's en alle 486's is vertragen een must. Ik heb
  1362.         de Spectrum Emulator één keer op dik 400% zien lopen. Mooi
  1363.         gezicht, dat wel, maar spelen wil niet meer zo. Hier is de
  1364.         vertraagoptie -z een must (en een geregistreerde versie dus
  1365.         ook!)
  1366.  
  1367.            Twee concurrerende Spectrum emulatoren wil ik hier bij
  1368.         name noemen: VGASPEC en JPP. De eerste werkt, zoals de naam
  1369.         al zegt, alleen met VGA-kaarten. Hij is een flink stuk
  1370.         trager dan Z80, en loopt ook op veel programma's vast die
  1371.         wel goed op Z80 lopen. Het enige voordeel van VGASPEC is dat
  1372.         het geluid minder 'rasperig' klinkt dan dat van Z80, maar
  1373.         daar moet je nog eens een flink stuk snelheid voor
  1374.         inleveren. (Z80 kan ook dit mooie geluid produceren, in Real
  1375.         Mode, maar dan kan er niet van het toetsenbord gebruik
  1376.         gemaakt worden.)
  1377.  
  1378.            De tweede, JPP, is op het moment dat ik dit schrijf nog
  1379.         in de ontwikkelingsfase. JPP kan nog niet met alle Spectrum
  1380.         programma's overweg, en lijdt ook nog aan een aantal bugs.
  1381.         De interne organisatie is radicaal anders dan die van Z80:
  1382.         JPP maakt gebruik van registers die alleen de '386 processor
  1383.         heeft. Het resultaat van de ontegenzeggelijk vernuftige
  1384.         opbouw is echter niet dat JPP sneller is dan Z80. Verder
  1385.         verfrist JPP het beeldscherm niet vaak genoeg, zodat
  1386.         bewegende poppetjes zich schokkerig over het beeld bewegen.
  1387.  
  1388.  
  1389. 3.4 Scherm emulatie
  1390.  
  1391.            Het spectrum beeldscherm is opgebouwd uit een bit-mapped
  1392.         beeldschermgeheugen van 6144 bytes, en 768 bytes kleuren-
  1393.         attributen. 1 kleurenbyte specificeert de kleur van 1 blokje
  1394.         van 8 schermbytes, van 64 puntjes dus.
  1395.  
  1396.            Op de PC komt geen van de beeldschermformaten hiermee ook
  1397.         maar enigszins overeen. Om het Spectrumscherm op een PC
  1398.         grafisch scherm af te beelden zal dus een vertaalslag nodig
  1399.         zijn. Dit is nogal traag, dus het is voordelig niet telkens
  1400.         het hele scherm naar PC-formaat te 'vertalen'. Alleen als er
  1401.         veranderingen optreden zal deze verandering op het scherm
  1402.         gezet worden; anders gebeurt er niets.
  1403.  
  1404.            Het beeldscherm wordt elke keer als een interrupt gegeven
  1405.         wordt bekeken op veranderingen. Hierdoor is het voor het
  1406.         programma of het beeldscherm 50 keer per seconde afgebeeld
  1407.         wordt. Sommige programma's maken hier gebruik van,
  1408.         bijvoorbeeld de beroemde Monty-spellen: de 'sprites' worden
  1409.         telkens uitgewist en weer opgebouwd, maar het programma
  1410.         zorgt ervoor dat als het beeldscherm 'langskomt' de sprite
  1411.         keurig op het beeld staat. Bij deze spellen is het dus ook
  1412.         van belang wat de fase is tussen de 50 Hz Z80 interrupt en
  1413.         het opbouwen van het beeld. Deze fase is met de opties -yl
  1414.         en -yh te regelen.
  1415.  
  1416.            De Spectrum heeft 8 kleuren, als je de bright kleuren
  1417.         meerekent 16. Deze 16 kleuren kunnen niet in alle modes
  1418.         allemaal afzonderlijk worden weergegeven. Als de emulator
  1419.         bijvoorbeeld gebruikt maakt van CGA kunnen er maar 4 kleuren
  1420.         worden weergegeven. De bright kleuren hebben dan dezelfde
  1421.         intensiteit als de gewone kleuren, en de 8 kleuren zijn
  1422.         verdeeld in 4 groepen van 2 kleuren. Dit kan problemen geven
  1423.         bij sommige programma's, maar meestal kun je duidelijk zien
  1424.         wat er gebeurt. Alleen met een EGA of VGA kaart kunnen alle
  1425.         16 kleuren afgebeeld worden.
  1426.  
  1427.            Als standaard Hercules gebruikt wordt is het probleem nog
  1428.         groter, want in dat geval zijn de streepjespatronen voor
  1429.         kleuren 2-3 en 4-5 bijna niet uit elkaar te houden. Daarom
  1430.         kan beter gebruik gemaakt worden van Extended Hercules. In
  1431.         deze mode wordt elke Spectrum pixel opgebouwd uit 4 Hercules
  1432.         pixels. In dat geval zijn alle 8 kleuren onderscheidbaar.
  1433.  
  1434.            De rand van het scherm, de border, kan ook een kleur
  1435.         krijgen. Deze wordt 1 keer per interrupt op het scherm
  1436.         gezet, omdat het anders veel te langzaam zou worden.
  1437.         Het gevolg is dat er geen patronen in de border geschreven
  1438.         kunnen worden. Echter, als je EGA of VGA gebruikt, en de
  1439.         Emulator staat in Real-mode, dan worden de patronen wel in
  1440.         de overscan geschreven. Bij het saven en laden in Real mode
  1441.         zie je dus wel de bekende strepen in de border. (In externe
  1442.         mode, zie paragraaf 3.8 over de Tape interface, zie je ze
  1443.         ook, maar dan worden ze door de Emulator zelf gegenereerd,
  1444.         en niet door een Spectrum programma.)
  1445.  
  1446.  
  1447. 3.5 Geluid emulatie
  1448.  
  1449.            De Spectrum heeft heel simpele geluidsmogelijkheden; je
  1450.         kunt de luidspreker eigenlijk alleen maar aan of uit zetten.
  1451.         Dit komt echter precies overeen met wat een standaard PC aan
  1452.         geluidsmogelijkheden aan boord heeft; ook de PC kan de
  1453.         luidspreker slechts aan of uit zetten. Dit komt dus mooi
  1454.         overeen.
  1455.  
  1456.            In mijn SamRam zit een bieper ingebouwd, die aan en uit
  1457.         gezet kan worden. Deze is ook geëmuleerd. (Zie hoofdstuk 4
  1458.         voor details over de aansturing van de bieper).
  1459.  
  1460.  
  1461. 3.6 Toetsenbord emulatie
  1462.  
  1463.            Bij het indrukken en loslaten van een toets op het PC
  1464.         toetsenbord stuurt het toetsenbord een code naar de PC. De
  1465.         Emulator houdt intern bij welke toetsen zijn ingedrukt en
  1466.         welke niet, en vertaalt deze informatie naar de Spectrum
  1467.         toetsenbord matrix. Ook enkele niet op de Spectrum
  1468.         voorkomende toetsen worden geëmuleerd:
  1469.  
  1470.         - komma, punt, kleiner/groter dan, deelstreep, vraagteken,
  1471.           asterisk (op PrtSc), dubbele punt en puntkomma, dubbele
  1472.           en enkele aanhalingstekens, plus en min, = en underscore,
  1473.           backspace en CapsLock (wordt geëmuleerd als Shift-2).
  1474.  
  1475.            De escape toets wordt als EDIT (Shift-1) geëmuleerd. EDIT
  1476.         wordt namelijk op de Spectrum vaak gebruikt als een soort
  1477.         escape toets. De ALT en CTRL toetsen worden beide als
  1478.         Symbol Shift geëmuleerd.
  1479.  
  1480.            Dan de pijltjestoetsen. De pijltjestoetsen op het
  1481.         cijferblokje (8,4,6 en 2) worden geëmuleerd als de
  1482.         cursortoetsen op de Spectrum (5,6,7 en 8). In de regeleditor
  1483.         van de Spectrum moeten de cursortoetsen samen met Shift
  1484.         ingedrukt worden; als je NumLock indrukt wordt samen met 1
  1485.         van de cursortoetsen direct ook de Shift toets ingedrukt.
  1486.  
  1487.            De pijltjestoetsen kunnen ook gebruikt worden als
  1488.         joystickbesturing, voor spelletjes. Normaal worden de
  1489.         pijltjestoetsen geëmuleerd als de cursortoetsen, maar je
  1490.         kunt ze ook laten functioneren als een van de Sinclair
  1491.         joysticks (toetsen 1 t/m 5, of 6 tot en met 0) of een
  1492.         Kempston joystick (IN-poort 31). De mogelijkheden kunnen
  1493.         met de opties -j1, -j2 en -jk ingesteld worden, en ook via
  1494.         het hoofdmenu veranderd worden. Als vuurtoets worden de
  1495.         toetsen 5, 0 en . op het cijferblokje, en de TAB-toets
  1496.         gebruikt.
  1497.  
  1498.            Omdat het toetsenbord van de Spectrum in een matrix is
  1499.         geschakeld, kan er, als er meer dan 2 toetsen tegelijk
  1500.         worden ingedrukt, foute informatie binnenkomen. Zoals van
  1501.         alle eigenschappen van de Spectrum wordt ook hier door
  1502.         sommige programma's gebruik van gemaakt. (B.v. Zynaps: Door
  1503.         alle cursortoetsen in te drukken pauzeert het programma,
  1504.         maar eigenlijk checkt Zynaps op een toets in de rij 1-4).
  1505.         Ook deze 'fout' wordt geëmuleerd. Als je nu bijvoorbeeld op
  1506.         Shift, B en V tegelijk drukt, lijkt het voor de Spectrum of
  1507.         je ook de spatiebalk indrukt, en reageert de Spectrum door
  1508.         een 'Break into Program' error te geven.
  1509.  
  1510.            Tenslotte een aantal toetsen die een speciale functie
  1511.         hebben voor de emulator, en die niet direct gekoppeld
  1512.         zijn aan een Spectrum toets of toetsencombinatie. De eerste
  1513.         is Ctrl-Break. Hiermee keer je terug naar DOS.
  1514.  
  1515.            Dan de functietoetsen. Met een druk op F1 verschijnt
  1516.         een hulpschermpje, waarin in het kort alle ongewone
  1517.         toetsen staan uitgelegd. Met F2 wordt het huidige Spectrum
  1518.         programma geSAVEd, en met F3 wordt een .Z80 bestand
  1519.         ingeladen. Met F4 spring je direct naar het submenu waar de
  1520.         instellingen van de Emulator veranderd kunnen worden.
  1521.  
  1522.            De functietoets F5 genereert een NMI. (In de vorige
  1523.         versies van de Emulator deed F1 dit.) Als de SamRam is
  1524.         opgestart wordt de kraaksoftware hiermee aktief; zonder
  1525.         SamRam heeft een NMI een reset tot gevolg, of helemaal
  1526.         niets. Als je op ALT-F6 drukt, genereer je een gewone Z80
  1527.         reset. (Het indrukken van ALT voorkomt dat je per ongeluk de
  1528.         Emulator reset.) Met functietoets F7 zet je de Emulator in
  1529.         Real-mode (zie paragraaf 3.8 over de cassette-interface.)
  1530.  
  1531.            Tenslotte functietoets F10. Hiermee aktiveer je het
  1532.         hoofdmenu van de Emulator. Vanuit elk submenu kun je met F10
  1533.         altijd direct weer naar het hoofdmenu terugkeren. (Dit is
  1534.         handiger dan ESC gebruiken; hiermee ga je slechts een niveau
  1535.         hoger.) Vanuit het hoofdmenu kun je programma's laden en
  1536.         saven (ook met functietoetsen F2 en F3), instellingen
  1537.         veranderen (ook met functietoets F4), en terugkeren naar
  1538.         DOS. Voor een uitgebreidere beschrijving zie de volgende
  1539.         paragraaf.
  1540.  
  1541.            Nog een praktische tip m.b.t. het gebruik van het
  1542.         toetsenbord in de Emulator op trage PC's. Op de PC is het
  1543.         genoeg een toets heel licht en heel kort aan te slaan om
  1544.         hem door te laten komen. Het toetsenbord is namelijk
  1545.         interruptgestuurd. Bij de Spectrum gebeurt het
  1546.         toetsenscannen door polling. Dit gaat op de gewone Spectrum
  1547.         erg goed, maar omdat de geëmuleerde Spectrum soms vrij
  1548.         langzaam is, geeft dat toch enkele problemen. Je moet de
  1549.         toetsen vrij nadrukkelijk indrukken, en ook nadrukkelijk
  1550.         loslaten (dus niet gelijk de volgende toets indrukken) om
  1551.         de Spectrum tijd te geven even bij te komen. Als je een
  1552.         Basic programma intikt in de Emulator is optie -d, dubbele
  1553.         interruptsnelheid, handig om te gebruiken. Omdat de toets
  1554.         scan routine interruptgestuurd is, maakt deze optie het
  1555.         toetsenbord een stuk sneller.
  1556.  
  1557.  
  1558. 3.7 Het hoofdmenu van de Emulator
  1559.  
  1560.            Dit menu wordt opgeroepen met een druk op F10. Je hebt
  1561.         hier 8 opties: terug naar emulator, naar Real-mode, een
  1562.         programma laden of saven, de RS232 input of output omleiden,
  1563.         andere instellingen veranderen, naar DOS shellen of stoppen.
  1564.  
  1565.            De meeste van deze mogelijkheden kunnen ook direct worden
  1566.         opgeroepen door een functietoets: F2 voor saven, F3 voor
  1567.         laden, F4 voor het veranderen van instellingen, en F7 voor
  1568.         Real mode. Met F1 verschijnt een hulpscherm waar de speciale
  1569.         toetsen (onder andere deze functietoetsen) kort worden
  1570.         uitgelegd.
  1571.  
  1572.            De Real mode wordt uitgelegd in paragraaf 3.8, waar ook
  1573.         de tape interface wordt behandeld.
  1574.  
  1575.            Als je het programma wegschrijft op disk, wordt de gehele
  1576.         inhoud van het Spectrum geheugen (48K) plus alle registers
  1577.         en dergelijke van de Z80 weggeschreven. Je bevriest het
  1578.         programma dus, en je kunt verdergaan waar je gebleven was
  1579.         door het programma weer in het geheugen te laden. Ook enkele
  1580.         instellingen van de Emulator worden in de .Z80 file opgeslagen.
  1581.         Dit zijn de instelling van de interruptsnelheid (dubbel of
  1582.         gewoon), of de Emulator een Issue-2 of een Issue-3 Spectrum
  1583.         emuleert, de instelling van de videosynchronisatie (hoog,
  1584.         normaal of laag) en welke joystickinterface geëmuleerd wordt.
  1585.  
  1586.            Als de menukeuze Laad programma gekozen wordt, moet je
  1587.         een bestandsnaam intikken. Geef je een Return op een lege
  1588.         regel, dan verschijnt een lijst van alle .Z80 files die in
  1589.         de huidige directory staan, gesorteerd op voorletter. Met de
  1590.         pijltjestoetsen, PgUp, PgDn, Home en End kun je door deze
  1591.         lijst lopen. Als je op een lettertoets drukt springt de
  1592.         keuzebalk naar het eerste programma dat met die letter
  1593.         begint, om het zoeken in een uitgebreide lijst programma's
  1594.         te vergemakkelijken. Als je deze lettertoets nog een keer
  1595.         indrukt springt de balk naar het volgende programma,
  1596.         enzovoorts. Als het programma ingeladen is, en de
  1597.         instellingen die in de .Z80 file zijn opgeslagen komen niet
  1598.         overeen met de instellingen van de Emulator, dan zal een
  1599.         tabel met de nieuwe instellingen verschijnen. Met een druk
  1600.         op een toets worden de instellingen gewijzigd; als op de
  1601.         ESCape toets gedrukt wordt worden de instellingen niet
  1602.         veranderd.
  1603.  
  1604.            Met de optie Save programma bewaar je alleen het normale,
  1605.         standaard Spectrum geheugen. De inhoud van de ramdisk van
  1606.         de SamRam wordt niet bewaard; ook de 'stand' van de ROMs
  1607.         niet. Je kunt dus alleen programma's bewaren die in het
  1608.         normale geheugen zitten; als je op NMI gedrukt hebt, en je
  1609.         bent bezig in bijvoorbeeld de disassembler, kun je dat niet
  1610.         bewaren. (Bewaard dus ook geen programma's die misschien
  1611.         bezig zijn met de Interface-I; deze lopen dan vast als je ze
  1612.         opnieuw inlaadt.)
  1613.  
  1614.            Met "Change Settings" kun je verschillende
  1615.         instellingen van de Spectrum Emulator wijzigen. Je kunt de
  1616.         dubbele interruptsnelheid, de LDIR-emulatie, de R-register
  1617.         emulatie en de snelle flash aan- of uitzetten; je kunt het
  1618.         geluid van de geëmuleerde Spectrum aan- of uitzetten, de
  1619.         snelheid van de emulator veranderen, de 'video-synchronisa-
  1620.         tie-mode' wijzigen om flikkerende sprites rustig te krijgen,
  1621.         de Issue-2 of Issue-3 emulatie instellen, en je kunt hier de
  1622.         joystick-emulatie kiezen, uit Cursor, Sinclair 1 en 2, en
  1623.         Kempston. Tenslotte kan de LPT-poort gekozen worden die voor
  1624.         tape i/o gebruikt wordt. De instellingen die je hier kunt
  1625.         maken zijn ook door 'switches' bij het opstarten van de
  1626.         Emulator te maken. Zie paragraaf 3.2 voor een uitgebreidere
  1627.         uitleg van de functies van de verschillende instellingen.
  1628.  
  1629.            Via de menu-keuzes "Redirect RS232 input" en "Redirect
  1630.         RS232 output" is de geëmuleerde RS232-poort te koppelen aan
  1631.         verschillende PC input/ouput kanalen. Je kunt de poort
  1632.         koppelen aan een diskfile, maar ook aan een COM-poort, zodat
  1633.         je bijvoorbeeld een verbinding met een echte Spectrum kunt
  1634.         maken via de Interface-I RS232 poort, of je kunt de output
  1635.         omleiden naar de printerpoort (LPT). Als de in- of uitvoer
  1636.         gekoppeld wordt aan een diskfile komt achter de filenaam
  1637.         een tellertje te staan, dat aangeeft hoeveel bytes er al
  1638.         gelezen of geschreven zijn.
  1639.  
  1640.            Bij output naar de Spectrum RS232 poort (en dus naar
  1641.         disk, COM of LPT) wordt gebruik gemaakt van een
  1642.         output-buffer van 256 bytes. Als er iets fout gaat
  1643.         (bijvoorbeeld de printer staat uit terwijl je toch iets
  1644.         print) is het handig deze buffer schoon te kunnen maken. Dit
  1645.         kan door na "Redirect RS232 output" te kiezen "Clear output
  1646.         buffer". Eventueel in de buffer achtergebleven tekens zullen
  1647.         nu niet verzonden worden.
  1648.  
  1649.            Als er bij het lezen van de Spectrum RS232 poort iets
  1650.         fout gaat moet je opnieuw beginnen. De zendende partij moet
  1651.         dan opnieuw zijn boodschap versturen. Als er een disk-file
  1652.         gebruikt wordt als input, is dit te bewerkstelligen met de
  1653.         keuze "Reset Disk Input". Als deze functie gekozen wordt,
  1654.         begint het lezen van de aktieve disk-file weer van voren af
  1655.         aan. Deze mogelijkheid verschijnt alleen in het menu
  1656.         "Redirect RS232 input" als er inderdaad een file aan de
  1657.         input is gekoppeld.
  1658.  
  1659.  
  1660. 3.8 De Tape interface en Real Mode
  1661.  
  1662.            Vanaf versie 1.40 is het dan eindelijk zover: op iedere
  1663.         PC kunnen nu direct Spectrum programma's van cassette
  1664.         ingeladen worden!
  1665.  
  1666.            Allereerst is er natuurlijk een hardware interface nodig
  1667.         om de cassetterecorder aan te kunnen sluiten op de PC.
  1668.         Hiervoor wordt een klein schakelingetje gebruikt dat wordt
  1669.         aangesloten op een LPT-poort. Er zijn twee schema's, een
  1670.         hele simpele en een iets ingewikkelder met een OpAmp. De
  1671.         eerste is gevoelig voor de instelling van het volume maar
  1672.         werkt in het algemeen uitstekend. De tweede kan in zeldzame
  1673.         gevallen problemen geven (als aan de ingangen van de LPT-
  1674.         poort erg kleine pull-up weerstanden hangen). De schema's
  1675.         staan in het Spectrum-programma DIAGRAMS.Z80. In dit
  1676.         programma is ook een klein testprogrammaatje opgenomen,
  1677.         waarmee de simpele cassette-interface afgeregeld kan worden.
  1678.  
  1679.            De Emulator moet weten aan welke printerpoort de
  1680.         interface is gekoppeld. Dit kun je bij het opstarten aangeven
  1681.         met optie -bN, waar N=1,2,3,4 de printerpoort aangeeft, of
  1682.         via het hoofdmenu.
  1683.  
  1684.            Er zijn twee manieren van inladen; deze noem ik (vrij
  1685.         willekeurig) extern en intern. Bij de eerste manier is het
  1686.         in feite een kleine routine in de Emulator die het
  1687.         eigenlijke inladen bewerkstelligt. Hierdoor werkt dit op
  1688.         elke computer, ongeacht of deze nu bloedsnel of tergend
  1689.         traag is, maar kan het geen snellaad aan. Alleen programma's
  1690.         die op de normale manier zijn gesaved kunnen zo worden
  1691.         ingeladen.
  1692.  
  1693.            Bij tweede manier, die ik de 'interne' manier noem,
  1694.         is het de geëmuleerde Spectrum zelf die het programma aan
  1695.         het laden is. Het enorme voordeel hiervan is dat de
  1696.         Emulator in deze mode ook in staat is snellaad programma's
  1697.         in te laden. Hiervoor is nodig dat de Emulator zo'n beetje
  1698.         'real time' loopt. Deze manier is dus alleen bruikbaar op
  1699.         snelle computers. Als je deze manier gebruikt moet de
  1700.         Emulator in de zgn. Real mode staan. Deze kun je aanzetten
  1701.         door op F7 te drukken. In deze mode wordt het beeldscherm
  1702.         niet meer bijgewerkt; hierdoor kan de Z80-emulator onafge-
  1703.         broken en soepeltjes doorwerken, wat noodzakelijk is bij
  1704.         tijdkritische zaken als het inladen en het saven van
  1705.         programma's. Nadeel is wel dat ook het toetsenbord niet meer
  1706.         gebruikt kan worden. Ook timing-interrupts worden niet meer
  1707.         gegenereerd als de Z80 in DI staat; als de Z80 interrupts
  1708.         ge-enabled zijn, worden deze wel gegenereerd.
  1709.  
  1710.            Hoe gaat het inladen nu precies? Als je een gewoon
  1711.         programma wilt inladen is het het makkelijkst van de externe
  1712.         manier gebruik te maken. Typ eenvoudig LOAD "", en je ziet
  1713.         een windowtje op het scherm verschijnen. In dit window staat
  1714.         het type van het in te laden blok (0=header, 255=datablok,
  1715.         en iets anders is iets anders), de plaats waar dit blok in
  1716.         het geheugen zal worden gezet en de lengte ervan. Als je een
  1717.         EGA of VGA kaart gebruikt moet de border nu gaan knipperen,
  1718.         en je moet het programma op de gewone manier in kunnen
  1719.         laden. Tape loading errors worden op de gebruikelijke manier
  1720.         gemeld. Een druk op een willekeurige toets geldt als een
  1721.         Break. Als je geen EGA of VGA videokaart hebt zie je niets
  1722.         gebeuren. Na het inladen (met of zonder tape-error) van elk
  1723.         datablokje (=header of echt datablok) moet het windowtje
  1724.         verdwijnen (en evt. weer verschijnen). Gebeurt dit niet dan
  1725.         weet je zeker dat er iets mis is gegaan.
  1726.  
  1727.            Het wordt ingewikkelder als er snellaad gebruikt wordt.
  1728.         Deze programma's kunnen alleen in Real mode worden
  1729.         ingeladen. Zet eventueel de R-register emulatie en de
  1730.         LDIR-emulatie aan (vele met snellaad gesavede programma's
  1731.         zijn beveiligd) en stel de snelheid van de Emulator zo dicht
  1732.         mogelijk bij de 110% in. (Iets meer dan 100%, want de
  1733.         IN-instructie die nogal vaak gebruikt wordt is relatief
  1734.         traag.) Typ LOAD "", en druk op F7 om naar Real mode te
  1735.         gaan. Vanaf nu wordt het beeldscherm niet meer bijgewerkt.
  1736.         Als je een EGA of VGA videokaart gebruikt kun je aan de
  1737.         border zien hoe het met het laden gaat; in andere gevallen
  1738.         kun je tijdens de pauzes tussen de blokken door op de 'U'
  1739.         van Update Screen drukken om te kijken hoe het laden
  1740.         verloopt. Als het programma helemaal is ingeladen druk je op
  1741.         'B' van Back to Normal Mode, en je kunt beginnen.
  1742.  
  1743.            Een truuk die je kunt gebruiken als je de Emulator niet
  1744.         helemaal op de 110% kunt krijgen, is het vertragen van de
  1745.         cassetterecorder. Als de computer niet sneller wil, moet het
  1746.         bandje maar trager! Hoe ver je hiermee kunt gaan heb ik niet
  1747.         uitgeprobeerd, maar als je op 90% loopt moeten met deze truuk
  1748.         toch heel wat snellaad programma's ingeladen kunnen worden.
  1749.  
  1750.            Het saven van programma's gaat op een zelfde manier. Ook
  1751.         hier kun je gebruik maken van de Real mode, maar dit heeft
  1752.         alleen zin als je een snelsave-programma hebt. Meestal is
  1753.         het het eenvoudigst en het best om gebruik te maken van de
  1754.         externe save-routine. Als je van de interne routine gebruikt
  1755.         wilt maken, in Real mode, moet de snelheid ongeveer 100%
  1756.         zijn (dus geen 110% zoals bij het laden!)
  1757.  
  1758.            Bij sommige videokaarten is het mogelijk dat tijdens het
  1759.         laden er storing ('ruis') op de monitor verschijnt, vooral
  1760.         als er strepen in de overscan verschijnen. Dit is niet erg,
  1761.         maar is helaas niet te voorkomen.
  1762.  
  1763.            Er is nog een heel interessant punt met betrekking tot de
  1764.         SamRam. Origineel is deze interface als 'kraakkastje'
  1765.         gebouwd. Je kon er programma's heel makkelijk mee kopiëren,
  1766.         door het programma in te laden en het in het normale
  1767.         Spectrum formaat (dus geen snellaad) te saven. Maar met de
  1768.         SamRam is het nu ook mogelijk elk .Z80 programma weer naar
  1769.         tape te saven! Dit gaat als volgt: start de Emulator op met
  1770.         optie -s, om de SamRam te emuleren. Laad het Spectrum
  1771.         programma in de geëmuleerde Spectrum via het hoofdmenu, en
  1772.         druk op F5, NMI. Kies optie 'S', en druk vervolgens nogmaals
  1773.         op 'S'. Nu kun je een filenaam invoeren. Als je nu op Enter
  1774.         drukt, wordt het programma op tape gezet, in een formaat dat
  1775.         ook voor gewone Spectrums begrijpelijk is. (Je kunt ook
  1776.         laadschermpjes toevoegen; zie hiervoor paragraaf 2.5 waar
  1777.         deze manier van saven uitgebreider wordt behandeld.)
  1778.  
  1779.         HET SPREEK VOOR ZICH DAT DEZE MOGELIJKHEID NIET GEBRUIKT MAG
  1780.               WORDEN VOOR HET ILLEGAAL KOPIEREN VAN SOFTWARE!
  1781.  
  1782.  
  1783. 3.9 Overzetten van Spectrum programma's
  1784.  
  1785.            Om de Emulator echt goed te kunnen gebruiken, zul je
  1786.         Spectrum programma's moeten overzetten naar de PC. Een groot
  1787.         nadeel is dat de standaard interfaces van de PC niet
  1788.         standaard zijn op de Spectrum (RS232, diskdrive), en dat de
  1789.         enige standaard interface van de Spectrum niet standaard is
  1790.         op de PC (Cassette interface). Op een van beide computers zal
  1791.         dus een interface geïnstalleerd moeten worden. Er zijn twee
  1792.         veel voorkomende Spectrum-interfaces, waarmee het
  1793.         gemakkelijk is Spectrum programma's over te zetten naar de
  1794.         PC, namelijk de Interface-I en de DISCiPLE disk interface.
  1795.         Bij het geregistreerde Emulator-pakket zit een utility voor
  1796.         het lezen van Snapshots en gewone bestanden van DISCiPLE
  1797.         schijven. Een korte uitleg van dit programma staat in
  1798.         paragraaf 3.14, en meer algemene opmerkingen betreffende disk
  1799.         interfaces voor de Spectrum staan in paragraaf 3.10 hieronder.
  1800.         Voor bezitters van een Interface-I staat in deze paragraaf
  1801.         uitgelegd hoe je programma's moet overzetten.
  1802.  
  1803.            Verder zijn er nog een aantal Spectrum emulators voor de
  1804.         PC, zoals VGASPEC en JPP. De door deze programma's gebruikte
  1805.         formaten zijn verschillend van het formaat van .Z80
  1806.         bestanden, maar voor geregistreerde gebruikers bestaat er
  1807.         een utility die de formaten .SP en .SNA in .Z80 bestanden
  1808.         kan omzetten, en omgekeerd. Zie paragraaf 3.13.
  1809.  
  1810.            De interface 1 bestaat onder andere uit een RS232
  1811.         interface. Een nul-modem kabel tussen de Spectrum en de PC is
  1812.         dan nog het enige dat je nodig hebt. Ikzelf gebruik een
  1813.         eenrichtings nulmodemkabel, met de volgende aansluitingen:
  1814.  
  1815.           Spectrum                                  'AT'      'PC'
  1816.           (9 pens)                                (9 pens)  (25 pens)
  1817.  
  1818.             3 TxD   ------------------------- RxD     2         3
  1819.  
  1820.             4 DSR   ------------------------- DTR     4        20
  1821.  
  1822.                                         +---- CTS     7         4
  1823.                                         +---- RTS     8         5
  1824.  
  1825.             7 GND   ------------------------- GND     5         7
  1826.  
  1827.         (Pennen 8 en 7, of 4 en 5, moeten dus verbonden worden!) Met
  1828.         deze kabel kun je data van de Spectrum naar de PC versturen,
  1829.         niet andersom.
  1830.  
  1831.            Heb je het programma gestopt, en weet je hoe je het
  1832.         opnieuw kunt starten, dan kun je het programma overzenden.
  1833.         Zie hiervoor het programma SAVESPEC.BAS dat ook bij de
  1834.         emulator te vinden is. Dit programma zal op de gewone
  1835.         Spectrum ingetikt of -geladen moeten worden. Dit gaat op de
  1836.         volgende manier. Start de emulator op met
  1837.  
  1838.         Z80 /u savespec.bas
  1839.  
  1840.         De input van de geëmuleerde RS232 poort is nu verbonden met
  1841.         het bestand savespec.bas. Tik op de geëmuleerde Spectrum in:
  1842.  
  1843.         LOAD *"b"
  1844.  
  1845.         Het basic-programma wordt nu via de (geëmuleerde) RS232
  1846.         poort ingeladen. Druk op ENTER om een listing te krijgen, en
  1847.         tik het programma in de Spectrum in. Als je een echte (2-
  1848.         richtings) nulmodemkabel hebt, kun je ook de RS232 output
  1849.         van de emulator omleiden naar COM1, en LOAD *"b" op de
  1850.         Spectrum intikken, en SAVE *"b" op de emulator.
  1851.  
  1852.            Laat het programma lopen (op de echte Spectrum). Het
  1853.         programma maakt een stukje machinecode aan op adres 23296,
  1854.         en schrijft het dan weg naar cassette met het SAVE-commando.
  1855.  
  1856.            Laad nu het programma in dat overgezet moet worden, en
  1857.         stop het. Laad het stukje code dat je met het BASIC-
  1858.         programmaatje geproduceerd hebt, in op een veilig adres. Het
  1859.         mooiste is als het in de gewone RAM geladen wordt, maar je
  1860.         bent nooit zeker dat je het niet over iets belangrijks
  1861.         heenlaadt. De veiligste manier is het laden van de code in het
  1862.         scherm. Typ:
  1863.  
  1864.         LOAD "RS232" CODE 16384
  1865.  
  1866.         en laad de code in. Typ nu (op de gewone Spectrum nog
  1867.         steeds):
  1868.  
  1869.         OPEN #3,"b": RANDOMIZE USR 16384: RANDOMIZE USR adres
  1870.  
  1871.         Als je het programma in RAM hebt ingeladen, moet je
  1872.         het adres van de eerste RAND USR natuurlijk veranderen.
  1873.         In bovenstaande regel is 'adres' het startadres van het
  1874.         programma. Ook kun je natuurlijk ipv RANDOMIZE USR adres
  1875.         gebruiken:
  1876.  
  1877.         GOTO xxxx
  1878.  
  1879.         als het programma een BASIC-programma is, of vanuit BASIC
  1880.         wordt opgestart. Druk echter nog niet op ENTER, de PC moet
  1881.         nog klaar staan. Stel met het commando MODE com1:96,n,8,1
  1882.         (of com2, natuurlijk) de RS232 COM-poort in op de juiste
  1883.         baudrate, en typ:
  1884.  
  1885.         GETRS filenaam.z80
  1886.  
  1887.         (GETRS.COM wordt bijgeleverd bij de emulator). Gebruik de
  1888.         optie /2 als je van COM2 gebruik maakt, etc. De PC is nu
  1889.         klaar voor ontvangst. Druk bij de Spectrum op ENTER, en het
  1890.         zenden begint. Op het scherm verschijnt nu een tellertje dat
  1891.         het aantal overgezonden bytes aangeeft. Na ongeveer 1 minuut
  1892.         (bij 9600 baud) zijn de 49182 bytes overgestuurd, en kan het
  1893.         programma gedraaid worden met de Emulator.
  1894.  
  1895.            De met SAVESPEC.BAS overgezonden .Z80 bestanden zijn
  1896.         altijd 49182 bytes lang. Om ze om te zetten in het gewone,
  1897.         gecomprimeerde .Z80 formaat moet je ze inladen in de
  1898.         Emulator en direct weer wegschrijven.
  1899.  
  1900.            In plaats van op bovenbeschreven manier is het natuurlijk
  1901.         ook mogelijk om met SAVE *"b" CODE x,y meteen blokken code
  1902.         over de RS232 verbinding te sturen, en ze met een dergelijk
  1903.         statement direct in de Emulator te laden, om ze daarna in
  1904.         definitieve vorm op schijf te krijgen (als .Z80 bestand).
  1905.         Dit is ook bruikbare methode; ik vind de eerste, met
  1906.         SAVESPEC.BAS het gemakkelijkst, maar als je een beetje weet
  1907.         hoe het programma dat je wilt overzetten in elkaar steekt
  1908.         kun je het ook op de laatste manier sneller overzetten.
  1909.  
  1910.  
  1911. 3.10 Overzetten vanaf Spectrum floppy's
  1912.  
  1913.            Bij de introduktie in 1982 was de Spectrum een zeer kale
  1914.         machine: de cassette-interface was de enige manier om
  1915.         programma's op te slaan. In die tijd had men de floppy-drive
  1916.         al uitgevonden, maar het prijskaartje dat eraan hing (het
  1917.         kostenplaatje dat erbij hoorde) was zo hoog dat ze alleen in
  1918.         professionele systemen gebruikt werden. Later kwam Sinclair,
  1919.         als vanouds, met een redelijk werkend maar goedkoop
  1920.         alternatief: de microdrive.
  1921.  
  1922.            Er zijn echter ook 'echte' disk-interfaces gemaakt voor
  1923.         de ZX Spectrum, en enkele waren redelijk populair, zoals de
  1924.         DISCiPLE, de Discovery, en BetaDisk. Zoals hierboven al
  1925.         gezegd is zit bij het geregistreerde Emulator pakket een
  1926.         leesprogramma voor DISCiPLE schijven (zie 3.14), dus
  1927.         bezitters van de DISCiPLE interface hebben het gemakkelijk.
  1928.  
  1929.            Ook voor de Betadisk-interface is een conversieprogramma
  1930.         geschreven, door J.L. Bezemer. Het programma heet BDDE; de
  1931.         huidige versie gaat onder de naam BDDE10A rond op BBS'en.
  1932.         Het programma is voorzien van een goede handleiding.
  1933.         Waarschijnlijk is het programma op elk redelijk gesorteerd
  1934.         BBS op te halen; het staat in ieder geval op het Spectrum
  1935.         Emulator Support BBS (zie de README).
  1936.  
  1937.            Voor de Discovery bestaat er bij mijn weten nog geen
  1938.         conversieprogramma. Als ik tegen dergelijke programma's
  1939.         aanloop zal ik zorgen dat ze in ieder geval op het support
  1940.         BBS verschijnen.
  1941.  
  1942.  
  1943.  
  1944. 3.11 Welke programma's zijn te gebruiken op de Emulator?
  1945.  
  1946.            Een antwoord op deze vraag is makkelijk te geven: Op een
  1947.         of twee uitzonderingen na werken alle programma's die ik tot
  1948.         nu toe heb geprobeerd naar behoren (en ik heb meer dan
  1949.         duizend Spectrum programma's..). Als de Emulator echter op
  1950.         een gewone PC wordt gebruikt is de snelheid te laag voor
  1951.         echt flitsende aktiespellen. Deze spellen zijn eigenlijk
  1952.         alleen leuk te spelen vanaf een 12 MHz AT of sneller. Maar er
  1953.         zijn programma's die wel goed op PC's te gebruiken zijn.
  1954.  
  1955.            Sommige programma's hebben tijdens de uitvoering vrijwel
  1956.         niets te doen. Ze vullen de tijd met HALT instructies, of
  1957.         met interruptgestuurd geluid. Deze programma's kunnen met
  1958.         toepassing van de optie -d, dubbele interruptsnelheid, goed
  1959.         speelbaar blijken, zelfs op gewone, vrij langzame PC's
  1960.         (zoals de mijne). Een voorbeeld is Splitting Images, een
  1961.         spel dat in de normale uitvoering al razendsnel is, en ook
  1962.         nog interruptgestuurd is, zodat het op de Emulator heel goed
  1963.         speelbaar is.
  1964.  
  1965.            Een andere klasse spellen, die echter helaas niet zo vaak
  1966.         voorkomt, is het Jetset Willy type. Jetset Willy gebruikt
  1967.         bijna 80% van de speeltijd de LDIR instructie, en dit is de
  1968.         enige instructie die geëmuleerd sneller is dan het
  1969.         origineel. Het gevolg is dat Jetset Willy op mijn vrij
  1970.         langzame PC sneller loopt dan de originele Spectrum versie!
  1971.         Zeer goed speelbaar, dus. Ook Manic Miner valt in deze
  1972.         categorie. Ook sommige flightsimulatoren blijken de LDIR
  1973.         instructie vaak te gebruiken; deze worden ook sneller dan
  1974.         normaal.
  1975.  
  1976.            Ten slotte is er de categorie spellen die niet snel
  1977.         hoeven te zijn, zoals adventures. The Hobbit, een
  1978.         klassieker, is bijvoorbeeld goed te spelen, als je niet let
  1979.         op de oer-trage fill-routine (die op de normale Spectrum al
  1980.         tergend langzaam was...). Ook de Adventure A t/m E
  1981.         adventures zijn goede voorbeelden. Deze adventures, die in
  1982.         de begintijd van de Spectrum uitkwamen, zijn text-only en
  1983.         zeer snel, dus prima om te emuleren.
  1984.  
  1985.            Zelf heb ik een bescheiden PCtje, en in de tijd dat ik
  1986.         begon met de Spectrum Emulator waren AT's nog heel wat, en
  1987.         een 16 MHz AT was helemaal onbereikbaar snel. Tegenwoordig
  1988.         heeft elke zich enigszins respecterende compuyup minstens
  1989.         zo'n 16 MHz machine, en eigenlijk liever een '386. Vele
  1990.         computergebruiker hebben razendsnelle machines (en draaien
  1991.         Windows om hier in godsnaam toch maar niks van te merken).
  1992.         Voor deze computerbezitters kan ik kort zijn: alle Spectrum
  1993.         spellen zijn uitstekend speelbaar. Let alleen op voor Manic
  1994.         Miner en Jetset Willy, die hebben echt optie -l
  1995.         (LDIR-emulatie) nodig om niet helemaal bovenaards snel te
  1996.         lopen.
  1997.  
  1998.  
  1999.  
  2000. 3.12 De utility Convert
  2001.  
  2002.            De gebruikte formaten van gegevensoverdracht bij de
  2003.         Spectrum zijn niet compatibel met die, gebruikt in de
  2004.         PC-wereld. Om toch wat zinnigs met de Spectrum te kunnen
  2005.         doen, zul je Spectrum-formaten en PC-formaten in elkaar
  2006.         moeten kunnen overzetten. Dit is precies wat de utility
  2007.         Convert doet.
  2008.  
  2009.            Het kan op een aantal manieren werken. Ten eerste kan
  2010.         het een Spectrum BASIC programma in ASCII omzetten, zodat
  2011.         het bijvoorbeeld in GWBASIC geladen kan worden. Het zal
  2012.         dan nog niet direct uitgevoerd kunnen worden, maar het
  2013.         kan in ieder geval bewerkt worden. Ook kan een ASCII-
  2014.         bestand makkelijk worden uitgeprint.
  2015.  
  2016.            Wat Convert in deze mode doet, is vergelijkbaar met wat
  2017.         de Spectrum doet als je een LIST-commando geeft. Het is
  2018.         zelf precies na te doen met de Emulator, mits je er wat
  2019.         tijd voor neemt:
  2020.  
  2021.                 Z80 /tbasic.txt
  2022.                 OPEN #3,"t":REM open kanaal 3 voor RS232 text output
  2023.                 LIST #3:REM stuur de listing naar kanaal 3
  2024.  
  2025.            De Emulator stuurt nu de gegevens van het RS232 kanaal
  2026.         door naar het bestand BASIC.TXT.
  2027.  
  2028.            Convert kan ook het omgekeerde; dus het omzetten van
  2029.         ASCII naar Spectrum BASIC. Dit kan de Spectrum niet
  2030.         standaard, en het kan je een hoop intikwerk schelen! Ook
  2031.         listings die je op bovenstaande manier, via het RS232-tekst
  2032.         kanaal "t", naar een file hebt geschreven kunnen terugver-
  2033.         taald worden, ondanks het feit dat de Interface-I er
  2034.         standaard na elke 80 karakters een CR/LF tussenvoegt.
  2035.         Deze mogelijkheid van CONVERT is handig als je in grote
  2036.         BASIC-programma's veranderingen wilt aanbrengen. De gewone
  2037.         Spectrum line-editor is niet de handigste...!
  2038.  
  2039.            Dan kan Convert ook nog Spectrum schermpjes omzetten in
  2040.         het zogenaamde GIF formaat. GIF staat voor Graphic
  2041.         Interchange Format, en in elk goed tekenprogramma zijn dit
  2042.         soort bestanden wel in te laden en te bewerken. Ook zijn er
  2043.         vele (public domain) print-programma's die GIF plaatjes uit
  2044.         kunnen printen.
  2045.  
  2046.            Tenslotte kan Convert in een ASCII-file de CR's omzetten
  2047.         in CR/LF's. Het eerste is standaard bij tekstoverdracht
  2048.         tussen Spectrum programma's, terwijl de PC ook een Line Feed
  2049.         (LF) na elke CR verwacht.
  2050.  
  2051.            De conversiemode van Convert wordt gekozen door het
  2052.         formaat van de input- en dat van de outputfile op te geven.
  2053.         Convert zoekt dan zelf uit wat hij moet doen om de bestanden
  2054.         te vertalen. De input- en outputmode kunnen gekozen worden
  2055.         uit de volgende mogelijkheden:
  2056.  
  2057.         Inmode:  A: Ascii- pure tekst
  2058.                  B: Bytes- pure code of schermdata
  2059.                  S: Save *"b" formaat - code, schermdata of BASIC
  2060.                  Z: .Z80 bestand
  2061.  
  2062.         Outmode: C: Ascii, met als lijnovergang CR [.TXT]
  2063.                  L: Ascii, met CR/LF (PC standaard) [.TXT]
  2064.                  B: Bytes- pure code of schermdata [.BIN]
  2065.                  S: Save *"b" formaat - 'bytes' (code) [.SAV]
  2066.                  P: Save *"b" formaat - 'program' (BASIC) [.SAV]
  2067.                  G: GIF formaat (Graphics Interchange Format) [.GIF]
  2068.  
  2069.         In het onderstaande tabelletje staan de mogelijke
  2070.         combinaties. Een 'v' staat voor een goede combinatie, een
  2071.         spatie voor een illegale, en een 'x' voor een combinatie
  2072.         waarbij er niks zou gebeuren.
  2073.  
  2074.                in: C   L   B   S   P   G
  2075.          uit:
  2076.           A        v   v       v   v
  2077.  
  2078.           B                x   v       v
  2079.  
  2080.           S        v   v   v   x   x   v
  2081.  
  2082.           Z                v           v
  2083.  
  2084.            Indien als outputmode .GIF wordt gekozen, moet de inputfile
  2085.         precies 6912 bytes lang zijn (of 6912+9 voor SAVE *"B"),
  2086.         behalve indien als input een .Z80 bestand gebruikt wordt.
  2087.  
  2088.            Een .Z80 bestand kan worden omgezet in een bestand van
  2089.         precies 48K lang: de exacte geheugeninhoud van de Spectrum
  2090.         die in het .Z80 bestand zit opgeslagen. De registers e.d.
  2091.         gaan verloren bij deze conversie.
  2092.  
  2093.            De utility Convert zit niet bij de ongeregistreerde
  2094.         versie van de Emulator. Als je je registreert krijg je het
  2095.         programma toegestuurd. Lees de file README.DOC voor details
  2096.         over het registreren voor de Spectrum Emulator, of lees de
  2097.         inleiding, paragraaf 4.
  2098.  
  2099.  
  2100.  
  2101. 3.13 De utility ConvZ80
  2102.  
  2103.            Net als Convert is ConvZ80 een utility die alleen bij het
  2104.         geregistreerde pakket zit inbegrepen. Met ConvZ80 kunnen
  2105.         'snapshots' van de Spectrum emulatoren VGASPEC en JPP
  2106.         omgezet worden in de .Z80 bestanden van Z80, en omgekeerd.
  2107.  
  2108.            ConvZ80 werkt heel simpel: je geeft twee bestandsnamen met
  2109.         extensies .Z80, .SP (voor VGASPEC) of .SNA (voor JPP), en
  2110.         ConvZ80 zet het bestand om in het gewenste formaat.
  2111.  
  2112.            VGASPEC is een Spectrum emulator die alleen op AT's
  2113.         werkt, zoals de naam al doet vermoeden een VGA-kaart nodig
  2114.         heeft, en flink wat trager is dan Z80. Positief is dat
  2115.         VGASPEC een minder 'rasperig' geluid geeft dan Z80. Dit komt
  2116.         door de fundamenteel andere manier waarop de auteur van
  2117.         VGASPEC zijn Z80 emulator in elkaar heeft gezet. Het grote
  2118.         verschil in snelheid heeft hier ook mee te maken.
  2119.  
  2120.            JPP werkt alleen op '386 computers en hoger. JPP is ook
  2121.         langzamer dan Z80, en doet ook op andere punten in meer of
  2122.         mindere mate onder voor Z80.
  2123.  
  2124.  
  2125. 3.14 De utility DISCIPLE
  2126.  
  2127.            Voor de Spectrum zijn een aantal diskinterfaces ontwikkelt.
  2128.         De meest populaire is de zogenaamde DISCiPLE disk interface.
  2129.         Deze standaard gebruikt gewone 3,5 inch diskettes. Met de
  2130.         alleen voor geregistreerde gebruikers beschikbare utility
  2131.         DISCIPLE kunnen deze diskettes gelezen worden.
  2132.  
  2133.            Op een DISCiPLE disk kunnen gewone bestanden staan, zoals
  2134.         BASIC, CODE, DATA en SCREEN$ files, en zogenaamde Snapshots.
  2135.         Door op een knopje op de diskinterface te drukken wordt de
  2136.         inhoud van het Spectrum geheugen automatisch in zo'n bestand
  2137.         opgeslagen.
  2138.  
  2139.            De utility DISCIPLE kan gewone bestanden van disk afhalen
  2140.         en omzetten in bestanden die in de Emulator geladen kunnen
  2141.         worden alsof ze met SAVE *"b" bewaard waren. Een van disk
  2142.         geladen BASIC programma kan dus aan de RS232 input van de
  2143.         Emulator gekoppeld worden, waarna het met LOAD *"b" ingeladen
  2144.         kan worden.
  2145.  
  2146.            De Snapshots kunnen worden omgezet in .Z80 bestanden, die
  2147.         weer in de Emulator geladen kunnen worden. Op deze manier
  2148.         kunnen programma's dus erg snel en eenvoudig overgezet worden
  2149.         van Spectrum naar PC.
  2150.  
  2151.            Het programma is menugestuurd en eenvoudig van opzet, zodat
  2152.         bediening volkomen voor zich spreekt zodat ik er hier niets
  2153.         over hoef te zeggen.
  2154.  
  2155.  
  2156. 3.15 Een digitale joystick voor de PC
  2157.  
  2158.            Als er al een joystick op de PC kan worden aangesloten, is
  2159.         dit standaard een analoge. Analoge joysticks zijn niet zo
  2160.         handig in het gebruik, en bovendien werden voor de Spectrum
  2161.         alleen digitale joysticks gebruikt. Dus je hebt waarschijnlijk
  2162.         nog een digitale joystick in de kast staan. Deze kun je vrij
  2163.         eenvoudig op de PC aansluiten met een eenvoudig schakelingetje
  2164.         dat is ontworpen door Ruud Zandbergen. Ik ben zo vrij deze
  2165.         digitale joystick interface voor de PC de 'Zandbergen
  2166.         Interface' te dopen. Als deze interface op de analoge
  2167.         joystickingangen van de PC wordt aangesloten zal de Emulator
  2168.         deze automatisch herkennen.
  2169.  
  2170.            De beschrijving van de interface volgt nu.
  2171.  
  2172.         Benodigdheden voor de digitale joystickinterface:
  2173.  
  2174.         1 x 9 pens D plug, male
  2175.         1 x 15 pens D plug, male
  2176.         4 x 1KΩ , ¼ Watt weerstandjes
  2177.         1 x 47 Ω, ¼ Watt weerstandje
  2178.         stukje 7-aderig kabel (onafgeschermd)
  2179.  
  2180.         Alles kan ondergebracht worden in de 15-pens plug. Let er op
  2181.         dat de weerstandjes geen contact maken met andere blootliggende
  2182.         aansluitingen.
  2183.  
  2184.  
  2185. 15 pen male  (pc)                           9 pen male (joystick)
  2186.  
  2187.  
  2188. 1+9  >──────────┬───────────┬────────────┬─────────────┬──> 7 (5V)
  2189.                ┌┴┐         ┌┴┐          ┌┴┐           ┌┴┐
  2190.      4 x 1 KΩ  │ │ ¼ Watt  │ │          │ │           │ │
  2191.                └┬┘         └┬┘          └┬┘           └┬┘
  2192. 3    >──────────┴──> 4 (up) │            │             │
  2193.                             │            │             │
  2194. 6    >──────────────────────┴──> 3 (dwn) │             │
  2195.                                          │             │
  2196. 13   >───────────────────────────────────┴──> 1 (rght) │
  2197.                                                        │
  2198. 11   >─────────────────────────────────────────────────┴──> 2 (lft)
  2199.                      ┌────────────────────┐
  2200. 2    >───────────────┤    47 Ω ¼ Watt     ├───────────────> 6 (fire)
  2201.                      └────────────────────┘
  2202. 4+5+14  >─────────────────────────────────────────────────> 8 (0V)
  2203.  
  2204.  
  2205.         4+5+14 betekend: verbind pen 4, 5 en 14 door. Voor pen 1 en 9
  2206.         geldt hetzelfde.
  2207.  
  2208.            Op deze interface kunnen alle gewone digitale joysticks
  2209.         aangesloten worden, met of zonder autofire (dus de joysticks
  2210.         die ook op een Kempston Joystickinterface passen, of op een
  2211.         Commodore 64/Amiga of Atari). De joysticks die bij de Spectrum
  2212.         +2 of +3 horen werken helaas niet, de pen-layout is iets
  2213.         anders. Dit is gemakkelijk aan te passen.
  2214.  
  2215.            De digitale joystickinterface heeft een analoge PC-joystick-
  2216.         interface nodig waarop twee analoge joystick op kunnen worden
  2217.         aangesloten (op één plug!). Dit is bij de meeste kaarten wel
  2218.         het geval, maar niet altijd (bijvoorbeeld bij sommige multi
  2219.         in-out kaarten). Bekijk de documentatie van de kaart om te
  2220.         zien of de joystickpoort geschikt is. De joystickpoort van
  2221.         een Soundblaster werkt prima. Een analoge joystick werkt in
  2222.         principe op elke joystickpoort. Denk er aan dat bij
  2223.         aanwezigheid van meerdere joystick-poorten in een PC
  2224.         conflicten kunnen optreden. Een van beide moet dan
  2225.         uitgeschakeld worden.
  2226.  
  2227.            Een aantal pc-spellen gaan moeilijk doen als de digitale
  2228.         joystick-interface aangesloten is. Het resultaat is traag
  2229.         werkende of vastlopende programma's. Verwijder in dat geval
  2230.         de connector van de joystickpoort (en niet alleen de
  2231.         joystick!).
  2232.  
  2233.  
  2234.  
  2235.  
  2236. 4. TECHNISCHE INFORMATIE
  2237.  
  2238.  
  2239. 4.1 Overzicht hardware kenmerken standaard spectrum
  2240.  
  2241.            De Spectrum is qua hardware een zeer eenvoudige machine.
  2242.         Afgezien van het echte 'computer' gedeelte, dus de
  2243.         microprocessor, de ROM en de RAM, en natuurlijk de (zeer
  2244.         simpel gehouden) video logica, is er slechts een cassette
  2245.         interface, een bijzonder eenvoudige geluids interface, en
  2246.         een toetsenbord interface. Samen vormen deze elementen de
  2247.         totale standaard ZX Spectrum!
  2248.  
  2249.            De communicatie tussen deze i/o devices verloopt via
  2250.         slechts 1 poort, te weten poort 254. (Eigenlijk kunnen deze
  2251.         devices via elke even poort bestuurd worden, want ook de
  2252.         adresdecoderings logica is erg simpel. Er wordt namelijk
  2253.         maar op 1 adreslijn, A0, gedecodeerd)
  2254.  
  2255.            Als poort 254 voor output gebruikt wordt, heeft de
  2256.         verstuurde byte de volgende betekenis:
  2257.  
  2258.         Bit:  7   6   5   4   3   2   1   0
  2259.             +---+---+---+---+---+---+---+---+
  2260.             |   |   |   | E | M |  border   |
  2261.             +---+---+---+---+---+---+---+---+
  2262.  
  2263.            De hoogste 3 bits hebben geen betekenis. De laagste drie
  2264.         vormen samen de border kleur. Bit 3 geeft de MIC-output aan.
  2265.         De emulator maakt geen gebruik van deze bit. Bit 4 geeft de
  2266.         output naar de luidspreker aan. Een 1 betekent luidspreker
  2267.         aan, een 0 uit.
  2268.  
  2269.            Als van poort 254 gelezen wordt, wordt tevens naar de
  2270.         hoogste 8 bits van het in-adres gekeken. Een 0 op zo'n
  2271.         adreslijn geeft aan welke rij toetsen bekeken moet worden.
  2272.         Een 0 op één van de laagste 5 bits van de teruggekregen
  2273.         waarde geeft aan in welke kolom van de gevraagde rij een
  2274.         toets werd ingedrukt. In de laagste 5 bits staan nullen als
  2275.         de corresponderende toets (of een van de corresponderende
  2276.         toetsen, als meerdere adreslijnen laag gemaakt zijn)
  2277.         ingedrukt zijn. Concreet:
  2278.  
  2279.         IN:    Leest toetsen: (van bit 0 tot en met bit 4)
  2280.  
  2281.         #FEFE  SHIFT, Z, X, C, V     #EFFE  0, 9, 8, 7, 6
  2282.         #FDFE  A, S, D, F, G         #DFFE  P, O, I, U, Y
  2283.         #FBFE  Q, W, E, R, T         #BFFE  ENTER, L, K, J, H
  2284.         #F7FE  1, 2, 3, 4, 5         #7FFE  SPACE, SYM SHFT, M, N, B
  2285.  
  2286.            Dus: Als IN #BFFE de waarde 190 teruggeeft, (binair
  2287.         10111110), was de ENTER-toets ingedrukt. Bit 6 geeft bij het
  2288.         INnen van poort 254 de waarde van de EAR-ingang aan. Door
  2289.         dit bitje ontvangt de Spectrum zijn informatie bij het laden
  2290.         van programma's van tape. Bij een Issue-2 Spectrum is de
  2291.         waarde van dit bit 1 als er geen signaal op de EAR-ingang
  2292.         staat. Vanaf de Issue-3 Spectrum wordt er een andere ULA in
  2293.         de Spectrum toegepast, die tot gevolg heeft dat deze bit bij
  2294.         geen signaal op 0 staat. Sommige oude programma's gaan er
  2295.         vanuit dat als je geen toets indrukt poort 254 de waarde 255
  2296.         heeft; deze werken dus niet goed op een Issue-3 Spectrum.
  2297.         (Voorbeelden van deze programma's zijn Spinads en
  2298.         Scrambler.) Als je optie -2 geeft bij het opstarten emuleert
  2299.         de Spectrum Emulator een Issue-2 Spectrum, en werken deze
  2300.         programma's ook.
  2301.  
  2302.            Het is niet verboden bij het lezen van poort 254 meerdere
  2303.         adreslijnen (van de bovenste byte) tegelijk nul te maken. Een
  2304.         IN van adres #00FE levert bijvoorbeeld het resultaat van alle
  2305.         rijen. Hiermee is snel te kijken of een toets is ingedrukt (De
  2306.         laagste 5 bits zijn dan niet allemaal 1).
  2307.  
  2308.            Als je een in-operatie uitvoert, en je specificeert een
  2309.         niet-bestaand in/out adres, dan vraag je eigenlijk
  2310.         informatie op van een 'zwevende' bus. Normaal zou dit de
  2311.         waarde 255 terug moeten geven. Dit gebeurt ook vaak, maar
  2312.         niet altijd. Naast de Z80 is namelijk ook de ULA constant
  2313.         bezig uit het geheugen te lezen. Dit gebeurt parallel met
  2314.         de Z80. De ULA en Z80 bussen zijn gescheiden door middel van
  2315.         weerstandjes, zodat ze elkaar niet hinderen, maar wel van
  2316.         elkaars bus gebruik kunnen maken. Hierdoor kan het gebeuren,
  2317.         dat als je van de Z80 bus leest, en niemand zet hier wat op,
  2318.         je eigenlijk de ULA-bus uitleest. De ULA leest uit het
  2319.         beeldschermgeheugen, dus het INnen van niet-bestaande
  2320.         adressen geeft soms beeldscherminformatie (in gelijke
  2321.         verhoudingen uit het ATTR- en het bit-mapped gebied).
  2322.  
  2323.            Ik nam aan dat geen enkel programma van zoiets vreemds
  2324.         gebruik zou maken, maar dat bleek wel zo te zijn. Arkanoid
  2325.         leest van poort #FF, en als hij een tijdje alleen 255's
  2326.         terugkrijgt, weet het programma dat de ULA bezig is in de
  2327.         beeldterugslagtijd. Hiermee wordt het spel gesynchroniseerd
  2328.         met de 50 Hz frequentie waarmee het beeld wordt opgebouwd!
  2329.         Om Arkanoid goed te laten werken heb ik dit rare gedrag van
  2330.         niet-bestaande in-poorten toch maar geëmuleerd. De helft van
  2331.         de tijd krijgt het programma op IN's van niet-bestaande
  2332.         adressen de waarde 255 terug, en de andere helft een
  2333.         willekeurig mix van 255's, attribuutbytes en schermbytes.
  2334.         Op deze manier werkt Arkanoid ook op de Emulator goed.
  2335.  
  2336.  
  2337. 4.2 Overzicht hardware kenmerken Interface 1
  2338.  
  2339.            De Interface 1 is eigenlijk veel gecompliceerder dan de
  2340.         Spectrum. Ik zal er hier niet uitvoerig op ingaan, en alleen
  2341.         de details vermelden die van belang zijn voor de Emulator.
  2342.         De Emulator ondersteunt geen Microdrive, en ook het netwerk
  2343.         wordt niet ondersteund. Alleen de seriële (RS-232) poort
  2344.         wordt geheel geëmuleerd.
  2345.  
  2346.            De Interface 1 kent drie i/o poorten, die alledrie als
  2347.         input- en als outputkanaal gebruikt worden. De eerste is
  2348.         poort #E7, dec. 231. Deze poort wordt gebruikt om data van
  2349.         en naar de Microdrive te transporteren. Het lezen van of
  2350.         schrijven naar deze poort, terwijl de Microdrive niet draait
  2351.         (of draait zonder een (geformatteerde) cartridge erin) leidt
  2352.         tot de beruchte 'Interface 1 crash' of 'IN 0 crash' (het
  2353.         lezen poort 0 heeft namelijk hetzelfde resultaat). De
  2354.         interface 1 blijft dan wachten tot er data van de Microdrive
  2355.         komt, en tot die tijd houdt hij de Spectrum stil door de WAIT
  2356.         lijn laag (=aktief) te maken. De hele boel loopt dan dus vast,
  2357.         en er is alleen met een reset uit te komen. De emulator meldt
  2358.         deze crash als een 'IN 0 crash'. Deze poort wordt verder
  2359.         niet gebruikt, omdat de Microdrive niet geëmuleerd is.
  2360.  
  2361.            De tweede poort van de Interface 1 is poort #EF, dec.
  2362.         239. Dit is een zeer belangrijke poort. Via deze poort wordt
  2363.         de RS232, Microdrive en het Netwerk gestuurd. De layout van
  2364.         deze poort is:
  2365.  
  2366.         BIT   7   6    5       4       3       2       1       0
  2367.             +---+---+------+-------+-------+-------+-------+-------+
  2368.         READ|   |   |      | busy  |  dtr  |  gap  | sync  | write |
  2369.             |   |   |      |       |       |       |       | prot. |
  2370.             +---+---+------+-------+-------+-------+-------+-------+
  2371.         WRITE   |   | wait |  cts  | erase | r/_w  | comms | comms |
  2372.             |   |   |      |       |       |       |  clk  | data  |
  2373.             +---+---+------+-------+-------+-------+-------+-------+
  2374.  
  2375.            De bits DTR en CTS zijn voor de RS232 poort. Deze twee
  2376.         bits, DTR en CTS, worden op dit moment gebruikt in de
  2377.         emulator. De andere bits zijn voor het functioneren van het
  2378.         netwerk en de microdrive. Deze zijn zo geëmuleerd, dat de
  2379.         Interface 1 software ziet dat er geen Microdrive aan de
  2380.         interface zit. Tenslotte poort #F7:
  2381.  
  2382.         BIT      7     6   5   4   3   2   1      0
  2383.             +--------+---+---+---+---+---+---+---------+
  2384.         READ| txdata |   |   |   |   |   |   |   net   |
  2385.             |        |   |   |   |   |   |   |  input  |
  2386.             +--------+---+---+---+---+---+---+---------+
  2387.             |        |   |   |   |   |   |   |   net   |
  2388.         WRITE        |   |   |   |   |   |   | output/ |
  2389.             |        |   |   |   |   |   |   | rxdata  |
  2390.             +--------+---+---+---+---+---+---+---------+
  2391.  
  2392.            Zoals gezegd bepaalt COMMS DATA de functie van bit 0
  2393.         output. Net output en input worden niet gebruikt in de
  2394.         Emulator; TXDATA en RXDATA echter wel. De Emulator
  2395.         'onderschept' elke OUT naar poort #F7, en bouwt intern de te
  2396.         versturen byte op. Bij elke IN van poort #F7 gebeurt precies
  2397.         het tegenovergestelde. De Emulator heeft de byte, en geeft
  2398.         het bit voor bit door aan het geëmuleerde Spectrumprogramma
  2399.         via poort #F7.
  2400.  
  2401.  
  2402. 4.3 Overzicht hardware kenmerken SamRam
  2403.  
  2404.            De SamRam is een vrij eenvoudig apparaat. Naast een 32K
  2405.         statische CMOS RAM zit er alleen wat adresdecoderings en
  2406.         in/out logica, en een NMI aanstuur schakelingetje in. De
  2407.         communicatie met de SamRam gaat via poort 31. Als van deze
  2408.         poort gelezen wordt, geeft de SamRam de stand van de
  2409.         joystick terug. Dit komt overeen met het gewone Kempston
  2410.         joystick protocol, die ook op poort 31 zit. Als naar deze
  2411.         poort geschreven wordt, ligt de zaak wat ingewikkelder.
  2412.         De informatie wordt dan aangeboden aan een 74ls259 chip,
  2413.         een 'programmable latch'. De poortlayout is als volgt:
  2414.  
  2415.         BIT   7   6   5   4   3   2   1   0
  2416.             +---+---+---+---+---+---+---+---+
  2417.         WRITE   |   |   |   |   adres   |bit|
  2418.             +---+---+---+---+---+---+---+---+
  2419.  
  2420.            Met 'adres' wordt 1 van de acht uitgangen van de 74ls259
  2421.         aangegeven. De waarde van 'bit' geeft de nieuwe waarde van
  2422.         de gespecificeerde uitgang aan. De acht uitgangen hebben
  2423.         allemaal een verschillende functie. In onderstaande tabel
  2424.         staan de uitgangen, bijbehorende OUT-waarden en het
  2425.         resultaat:
  2426.  
  2427.         OUT 31,   | UITGANG | RESULTAAT
  2428.         ----------+---------+---------------------------------------
  2429.             0     |    0    | Write protect CMOS RAM aan
  2430.             1     |    "    | Schrijven in CMOS RAM toegestaan
  2431.             2     |    1    | CMOS RAM aan (voor bank, zie 6/7)
  2432.             3     |    "    | CMOS RAM uit (standaard spectrum)
  2433.             4     |    2    | -
  2434.             5     |    "    | Maak '259 inaktief, reageert niet meer
  2435.             6     |    3    | CMOS bank 0 inschakelen (standaard 'ROM')
  2436.             7     |    "    | CMOS bank 1 inschakelen (schaduw 'SamRom')
  2437.             8     |    4    | Schakel interface 1 aan
  2438.             9     |    "    | Schakel interface 1 uit
  2439.            10     |    5    | Schakel ram bank 0 in (32768-65535)
  2440.            11     |    "    | Schakel ram bank 1 in (32768-65535)
  2441.            12     |    6    | Bieper uit
  2442.            13     |    "    | Bieper aan
  2443.            14     |    7    | -
  2444.            15     |    "    | -
  2445.  
  2446.            De standaardwaarden bij aanschakelen, na een RESET en na
  2447.         een NMI zijn de even waarden. Alle uitgangen zijn dus
  2448.         inaktief, of laag. (Dus: Write protect aan, CMOS RAM aan,
  2449.         etc.)
  2450.  
  2451.            In mijn originele SamRam is voor een schrijfoperatie in
  2452.         de CMOS RAM ook nog het omzetten van een schakelaartje
  2453.         nodig. Dit om te voorkomen dat de inhoud door een crash
  2454.         verloren gaat. Bij de Emulator is het sowieso onmogelijk te
  2455.         schrijven in de ROM, zodat een OUT 31,1 geen effect heeft.
  2456.  
  2457.            Uitgang 1 spreekt voor zich; het *SPECTRUM commando doet
  2458.         een OUT 31,3 om de standaard Spectrum in te schakelen. Druk
  2459.         na zo'n commando op NMI om terug te keren naar de SamRam, of
  2460.         tik OUT 31,2 in.
  2461.  
  2462.            Uitgang 3 is een buitenbeentje. Een OUT 31,5 zorgt
  2463.         ervoor dat de Chip Select lijn van de '259 nooit meer aktief
  2464.         kan worden. Hierdoor worden alle OUT operaties onmogelijk.
  2465.         Alleen een reset kan de '259 weer normaal krijgen. Een OUT
  2466.         31,4 heeft dus nooit effect: Of uitgang 3 was al laag, en
  2467.         dan was OUT 31,4 niet nodig, of uitgang 3 is hoog, en dan
  2468.         komt de OUT 31,4 nooit bij de chip aan.
  2469.  
  2470.            Uitgang 4 wordt door de SamRam software nooit gebruikt.
  2471.         Een OUT 31,9 zorgt er voor (in mijn echte Spectrum) dat de
  2472.         interface 1 nooit een M1 signaal te zien krijgt. Dit signaal
  2473.         gebruikt de interface 1 om te zien of hij zich in moet
  2474.         schakelen. Dit gebeurt dan dus niet meer.
  2475.  
  2476.             Uitgang 5 is simpel: deze schakelt de bovenste 32K
  2477.         dynamische rambank om. Zorg er bij het experimenteren met
  2478.         deze OUT-waarden wel voor dat de stack in de onderste 16K
  2479.         zit (van ongeveer 25000 tot 32767 zijn mogelijke waarden),
  2480.         anders is er na de OUT opeens de stack weg, wat niet
  2481.         bevorderlijk is voor het correct functioneren van de
  2482.         Spectrum.
  2483.  
  2484.  
  2485. 4.4 Interne opbouw van de Emulator
  2486.  
  2487.         Hieronder de geheugenindeling van de Emulator in werking:
  2488.  
  2489.              +--------+
  2490.              |        |     Het hoofdmenu van de Emulator, en onder-
  2491.              |   C    |     steunende routines
  2492.              |  prog  |
  2493.              |        |
  2494.              +--------+
  2495.              |        |     Het hoofdprogramma. Vanuit hier wordt de
  2496.              |        |     Emulator opgestart. Hier zitten ook de
  2497.              |  Main  |     video, de interrupt, de disk i/o en een
  2498.              |        |     groot deel van de Z80 IN/OUT emulatie
  2499.              |        |     routines.
  2500.              |        |
  2501.              +--------+
  2502.              | stack  |     1K
  2503.              +--------+
  2504.              |        |
  2505.              |   E    |     De Z80 emulator. Het is een brij van
  2506.              |   M    |     een heleboel korte routinetjes, met
  2507.              |   U    |     heel veel vrije tussenruimte. Dit is
  2508.              |   L    |     vooral met het oog op de snelheid
  2509.              |   A    |     gedaan. (Vergeleken met de 'compacte'
  2510.              |   T    |     versie is deze 2x zo snel!) Op disk
  2511.              |   O    |     neemt dit deel 22K in beslag.
  2512.              |   R    |     64K
  2513.              |        |
  2514.              +--------+
  2515.              |        |     De standaard Spectrum ROM. Deze zit
  2516.              |        |     ingebouwd in de Emulator; de andere
  2517.              |  ROM   |     ROMs worden eventueel ingeladen.
  2518.              |        |
  2519.              |        |
  2520.              +--------+     Tot hier zat alles in Z80.EXE. Hier-
  2521.                             onder is het gewoon gealloceerd RAM.
  2522.              +--------+
  2523.              |        |
  2524.              | extra  |     Hier zitten de 2 banken van de CMOS
  2525.              | ROMs   |     SamRam ROM, en de 8K interface 1 ROM.
  2526.              |        |     40K (de file ROMS.BIN) (Alleen als de
  2527.              |        |     if.1 en/of SamRam opgestart zijn)
  2528.              +--------+
  2529.              | scherm |     Hiermee kan gekeken worden of er ver-
  2530.              | buffer |     anderingen zijn in het scherm. 8K
  2531.              +--------+
  2532.              |        |
  2533.              | 32K    |     Hier wordt de inhoud van de niet-
  2534.              | dyn.   |     aktieve 32K Ram-bank in opgeslagen
  2535.              | RAM-   |     (alleen als SamRam opgestart is)
  2536.              | bank   |     32K
  2537.              |        |
  2538.              +--------+
  2539.              |        |
  2540.              |        |     Dit is het domein van de Z80 emu-
  2541.              |Spectrum|     lator. De eerste 16K is 'ROM',
  2542.              |segment |     daarna is 6912 bytes 'scherm'
  2543.              |        |     en daarna ongeveer 40K vrije
  2544.              |        |     RAM.
  2545.              |        |     64K
  2546.              +--------+
  2547.  
  2548.  
  2549. 4.5 De werking van de Emulator
  2550.  
  2551.            De 8088/8086 instructieset is een uitbreiding op de 8080
  2552.         set. Deze laatste stond ook model bij het ontwerp van de
  2553.         Z80. Bijna alle Z80 instructies hebben een equivalent in de
  2554.         8088/8086 instructieset. Hierdoor waren er wat de
  2555.         instructieset betrof vrij weinig kunstgrepen nodig bij het
  2556.         maken van de Emulator. De laagste 8 bits van de 8086 flags
  2557.         komen (bijna) overeen met de flagbits van de Z80. Ook hier
  2558.         waren dus weinig tijdvretende conversies nodig.
  2559.  
  2560.             Er waren echter ook uitzonderingen. De DAA (Decimal
  2561.         Adjust Accumulator) instructie heeft bijvoorbeeld geen
  2562.         evenbeeld bij de 8088/86. De Z80 houdt zelf bij of er een
  2563.         conversie voor optellen dan wel aftrekken nodig is; de 8088
  2564.         doet dit niet en kent dus verschillende instructies voor
  2565.         deze operaties: DAA en DAS, Decimal Adjust after Addition
  2566.         en Decimal Adjust after Substraction. Na elke optel of
  2567.         aftrek instructie zet de Z80 een flagje. Dit zou de Emulator
  2568.         ook moeten doen dus. Deze flag is echter alleen van
  2569.         praktische betekenis als het optellen of aftrekken betrekking
  2570.         had op de accumulator (het A register). In alle andere
  2571.         gevallen zet de Emulator dit flagje dus niet. Dit scheelt
  2572.         weer flink in snelheid, en tot nu toe werken alle programma's
  2573.         die ik heb geprobeerd naar behoren.
  2574.  
  2575.            Ook de overflow flag heeft bij de 8088/8086 een aparte
  2576.         plaats gekregen, in de hoge byte van het flagregister. Bij
  2577.         de Z80 heeft 1 flag 2 functies, namelijk de
  2578.         Pariteit/Overflow flag. De flag op deze plaats bij de
  2579.         8088/8086 heeft alleen de Pariteit functie. De overflow flag
  2580.         moet dus na elke berekening in de pariteitsflag gezet
  2581.         worden. Dit kost helaas wat tijd, maar is onvermijdelijk.
  2582.  
  2583.           In Sabre Wulf heb ik een programmeerfout, en een Z80
  2584.         rariteit, ontdekt tijdens het debuggen van de Emulator. Het
  2585.         bleek dat de buffel, die in de gang boven de startgrot heen
  2586.         en weer zou moeten lopen, in een hoekje bleef staan en zich
  2587.         telkens omkeerde. De fout bleek te zitten in de volgende
  2588.         instructies in Sabre Wulf:
  2589.  
  2590.                 AD86    DD CB 06 7E        BIT 7,(IX+6)
  2591.                 AD89    F2 8F AD           JP P,#AD8F
  2592.  
  2593.         Een programmeerfoutje van Ultimate! In de tweede regel is
  2594.         natuurlijk een JR Z bedoeld, het doet hetzelfde en het is
  2595.         korter. Het boek van Rodnay Zaks, Programming the Z80, zegt
  2596.         dat de BIT instructie de P flag op een ongedefiniëerde
  2597.         waarde zet. Blijkbaar zet de BIT-instructie de P flag naar
  2598.         gelang bit 7 van het argument! Dat is de reden dat
  2599.         bovenstaande constructie werkt.
  2600.  
  2601.            De meeste Z80 registers zitten tijdens de uitvoering in
  2602.         de 8088 registers: in AL, CX, DX, SI, DI en BP zitten
  2603.         respectievelijk de Z80 register A, BC, HL, DE, PC en SP. De
  2604.         flags zitten in AH. De overige registers, I, R, IX, IY en
  2605.         de 'exchanged registers' AF', BC', DE' en HL' worden gewoon
  2606.         als geheugenvariabelen opgeslagen.
  2607.  
  2608.            Het BX register, waar logischerwijs DE zou moeten zitten,
  2609.         wordt gebruikt om de jumpvector naar de nieuwe instructie te
  2610.         berekenen. Hiervoor gebruik ik de volgende drie instructies:
  2611.  
  2612.            MOV BH,[DI]          ;Haal opcode in BH
  2613.            XOR BL,BL            ;Maak BL leeg
  2614.            JMP BX               ;Spring naar emulatieroutine
  2615.  
  2616.            Het zal nu duidelijk zijn dat de emulator een volledig
  2617.         64K segment nodig heeft, en dat het daar maar een deel van
  2618.         gebruikt. De benodigde 'INC DI' om de program counter (PC)
  2619.         op te hogen zit aan het begin van de emulatieroutine. Dit is
  2620.         gedaan om nog een kleine snelheidswinst te behalen: soms is
  2621.         deze 'INC DI' namelijk niet nodig, denk aan de return (RET)
  2622.         instructie.
  2623.  
  2624.            Het R register van de Spectrum Emulator werkt normaal als
  2625.         een random-generator. Zo wordt dit register ook meestal
  2626.         gebruikt. In feite doet de Z80 het volgende: bij elke
  2627.         instructie wordt het R register met 1 verhoogd. Bij
  2628.         instructies die met een 'shift' beginnen, dat wil zeggen met
  2629.         DD, FD, CB of ED, wordt het R register met twee verhoogd. En,
  2630.         verrassing: bij DDCB en FDCB instructies wordt het R register
  2631.         ook met twee verhoogd! De onofficiële NOP-instructie DD00
  2632.         verhoogt het R register met twee; de instructie DDDD00
  2633.         verhoogt het met drie, enzovoorts. Een LDI verhoogt R met
  2634.         twee, en een LDIR verhoogt R met 2 x BC, net zoals een LDDR
  2635.         enzovoorts. En om het verhaal compleet te maken: een LD R,A /
  2636.         LD A,R achter elkaar heeft hetzelfde effect als A met twee
  2637.         ophogen (afgezien van de verandering van het R register, en
  2638.         afgezien van het feit dat het met-één-ophogen alleen betrekking
  2639.         heeft op de laagste 7 bits; bit 8 van het R register verandert
  2640.         nooit. Dit heeft te maken met de opbouw van de tijdens de
  2641.         ontwikkeling van de Z80 gangbare geheugenchips die 128 x 128 =
  2642.         16 Kbit konden onthouden en [dus] een refreshcyclus ter lengte
  2643.         128 kenden). Deze functionaliteit heeft de Emulator ook als de
  2644.         R register emulatie aanstaat; dit is belangrijk voor beveiligde
  2645.         programma's.
  2646.  
  2647.            De Z80 kent, net als de 8088, interrupts. Bij de Spectrum
  2648.         wordt er 50 keer per seconde een interrupt gegeven. De
  2649.         interrupts zijn dus niet programmeerbaar, zoals bij PC's het
  2650.         geval is. Het zou erg veel tijd kosten als de Emulator na
  2651.         iedere instructie zou moeten controleren of er een interrupt
  2652.         uitgevoerd moet worden. Dit levert per Z80 instructie twee
  2653.         8088 instructies extra op, wat flink zou vertragen. Dit
  2654.         gebeurt dus niet: de Z80 emulator trekt zich nergens wat van
  2655.         aan, en sjeest lekker door. Maar natuurlijk moeten
  2656.         interrupts wel geëmuleerd worden! Dit wordt op de volgende
  2657.         manier opgelost.
  2658.  
  2659.            De beeldscherm emulatie van de Spectrum Emulator is
  2660.         (8088)-interrupt gestuurd. Nadat het beeldscherm is
  2661.         opgebouwd, wordt de 8088 in Debug mode gezet, en wordt de
  2662.         Z80-emulator gesinglestept, net zolang totdat het einde van
  2663.         de Z80 instructie is bereikt. Dan zorgt de interrupt routine
  2664.         ervoor dat de Z80 interrupt gegenereerd wordt (of een reset,
  2665.         of een NMI, indien nodig). Op deze manier kent de
  2666.         geëmuleerde Z80 toch interrupts, hoewel de Z80 emulator hier
  2667.         niet veel tijd aan kwijt is.
  2668.  
  2669.            Het opbouwen van het beeldscherm op de echte Spectrum
  2670.         gebeurt met een frequente van 50 Hz. Het opbouwen zelf heeft
  2671.         ook tijd nodig, ongeveer 1/100 seconde. Bij de Spectrum
  2672.         Emulator gebeurt het anders: 50 keer per seconde (effectief)
  2673.         wordt er een 'snapshot' van het beeldschermgeheugen gemaakt,
  2674.         en afgebeeld. Dit subtiele verschil is voor sommige
  2675.         programma's belangrijk: sommige spellen bouwen het
  2676.         beeldscherm synchroon met de 50 Hz interrupt op, zodat ze
  2677.         bijvoorbeeld de sprites periodiek kunnen wissen en opnieuw
  2678.         kunnen tekenen, terwijl het wissen gebeurt in de tijd dat het
  2679.         beeldscherm niet 'langskomt'. Voor deze spellen is de fase
  2680.         tussen de Z80 interrupt en het opbouwen van het beeldscherm
  2681.         belangrijk. Omdat de echte Spectrum en de Spectrum Emulator
  2682.         het beeldscherm anders afbeelden is er geen eenduidig juiste
  2683.         oplossing voor deze fase. Sommige spellen hebben een iets
  2684.         andere fase nodig dan andere, bijvoorbeeld BC's Quest for
  2685.         Tires werkt alleen goed met de standaard fase, terwijl
  2686.         Ghosts & Goblins alleen goed werkt als het beeldscherm iets
  2687.         later na de Z80-interrupt afgebeeld wordt.
  2688.  
  2689.            Deze fase kan worden veranderd met de opties -yl en -yh.
  2690.          Met -yl, 'Lage Video Synchronisatie', komt de
  2691.          beeldschermopbouw iets later na de Z80-interrupt, en met
  2692.          Hoge Video Synchronisatie komt hij iets eerder.
  2693.  
  2694.  
  2695. 4.6 Onofficiële en extra instructies
  2696.  
  2697.            De Z80 kent een heleboel onofficiële instructies:
  2698.         instructies die je op een bepaalde plaats, vanwege de
  2699.         regelmaat, zou verwachten, maar waarvan niet is opgegeven
  2700.         dat ze daar ook werkelijk zitten, omdat er een andere
  2701.         (meestal kortere) variant is, die precies hetzelfde doet.
  2702.         Een voorbeeld van dit soort onofficiële instructies is de
  2703.         instructie
  2704.  
  2705.         ED 6B n n               LD HL,(nn)
  2706.  
  2707.            Deze instructie werkt prima, maar wordt niet gebruikt
  2708.         omdat er een variant is, namelijk
  2709.  
  2710.         2A n n                  LD HL,(nn)
  2711.  
  2712.            Ik kan zo snel geen voordeel van de eerste instructie
  2713.         bedenken, maar voor de zekerheid heb ik hem toch maar
  2714.         geëmuleerd.
  2715.  
  2716.            Een tweede, belangrijker soort onofficiële instructies
  2717.         vormen die, die een operatie uitvoeren op alleen de bovenste
  2718.         of de onderste helft van een indexregister. Een voorbeeld is
  2719.  
  2720.         DD 44                   LD B,IXh
  2721.  
  2722.            Met deze instructie wordt het hoogste deel van het IX
  2723.         register gekopieerd naar het B register. De logica achter
  2724.         deze onofficiële instructies komt naar voren, als je bedenkt
  2725.         wat de normale betekenis is van opcode 44:
  2726.  
  2727.         44                      LD B,H
  2728.  
  2729.            De opcode DD is dus alleen een shift instructie: Na DD
  2730.         wordt het H register geïnterpreteerd als IXh, het L register
  2731.         als IXl, het HL registerpaar als IX en (HL) als (IX+d),
  2732.         waarbij d een 8 bit verplaatsing (met teken) aangeeft. (Behalve
  2733.         overigens bij JP (HL), wat gewoon JP (IX) wordt. Een logischer
  2734.         mnemonic zou ook JP HL geweest zijn.) Iets dergelijks geldt
  2735.         voor de FD opcode, die hetzelfde effect heeft als de DD opcode
  2736.         alleen dan voor het IY indexregister.
  2737.  
  2738.            Verder zijn er nog 8 onofficiële CB-instructies, nl. CB30
  2739.         tot en met CB37, b.v.
  2740.  
  2741.         CB 30                   SLL B           ;Shift Left Logical
  2742.  
  2743.         Deze instructie voert een gewone shift naar links uit, met bit
  2744.         7 naar de Carry, zoals gebruikelijk. Het ongebruikelijke zit
  2745.         in bit 0: deze wordt altijd 1! Vanaf versie 1.25 zijn deze 8
  2746.         instructies goed geëmuleerd: Bounder en Enduro Racer maken er
  2747.         gebruik van.
  2748.  
  2749.            Hoewel ZiLOG deze soort onofficiële instructies niet
  2750.         ondersteunt, blijken ze op alle Z80's te werken. Machinetaal
  2751.         programma's op de Spectrum maken dan ook veel gebruik van
  2752.         deze instructies. Het was dan ook belangrijk dat deze
  2753.         instructies goed geëmuleerd zouden worden. Hier heb ik veel
  2754.         tijd en moeite in gestoken, en ik heb nu alle gebruikelijke
  2755.         onofficiële instructies geëmuleerd. Mocht iemand meer
  2756.         vreemde onofficiële instructies kennen, laat mij het dan
  2757.         weten, dan bouw ik ze alsnog in!
  2758.  
  2759.            De overige onofficiële instructies, zoals ED 00 en andere
  2760.         niet-bestaande ED-instructies, doen gewoon niets. Dit zou
  2761.         wel eens anders kunnen zijn dan de Z80 doet, maar ik weet
  2762.         hier gewoon te weinig vanaf. Ik ben trouwens ook nog nooit
  2763.         een programma tegengekomen dat gebruik maakte van deze
  2764.         niet-bestaande ED-instructies. Mocht iemand echter
  2765.         interessante onofficiële ED-instructies kennen, dan hoor ik
  2766.         dat graag.
  2767.  
  2768.            De Emulator kent ook een aantal opcodes, die op een
  2769.         gewone Z80 geen effect hebben. Deze heb ik ingebouwd om
  2770.         bepaalde speciale zaken te regelen, zoals communicatie met
  2771.         de 'buitenwereld' etc. De opcodes zijn:
  2772.  
  2773.         ED F9           FastPrint
  2774.         ED FA           LD A,RAMBANK:(HL)
  2775.         ED FB           LD RAMBANK:(HL),A
  2776.         ED FC           GET RS232 byte
  2777.         ED FD           SEND RS232 byte
  2778.         ED FE           LD ACTIVE_ROM:(HL),A
  2779.         ED FF           Keer terug naar DOS
  2780.  
  2781.            De extra opcodes zijn vooral bedoeld om de SamRam te
  2782.         versnellen. Voor sommige dingen moest er vaak een rambank
  2783.         omgeschakeld worden. Dit is op de gewone Spectrum een kwestie
  2784.         van microseconden, op de geëmuleerde Spectrum moeten hele
  2785.         lappen geheugen verschoven worden. Zo moest voor elk karakter
  2786.         dat de SamRam op het scherm zette, de ROM twee maal
  2787.         omgeschakeld worden. Door opcode ED F9 hoeft dit niet meer.
  2788.  
  2789.            Opcode ED F9 is equivalent aan de Z80 instructies
  2790.                 LD A,(DE)
  2791.                 LD (HL),A
  2792.                 INC E
  2793.                 INC H
  2794.         met dien verstande dat de eerste instructie zijn informatie
  2795.         haalt uit de standaard SamRam ROM, dus de ROM waar de
  2796.         karakterset zit opgeslagen, en niet de op dat moment aktieve
  2797.         ROM.
  2798.  
  2799.            Met opcodes ED FA en ED FB kan snel een byte in de op dat
  2800.         moment niet-aktieve 32K dynamische RAM-bank gelezen of
  2801.         geschreven worden. Hiervoor waren anders twee omschakelingen
  2802.         van de 32K Rambanken nodig, iets dat erg veel tijd nam.
  2803.  
  2804.            De opcodes ED FC en ED FD staan in de interface 1 ROM.
  2805.         Met deze opcodes is de gegevensoverdracht over de
  2806.         geëmuleerde RS232 poort veel sneller; anders duurde het vele
  2807.         tientallen OUT's per verstuurde byte, nu gaat het in 1 in-
  2808.         structie. Deze veranderingen zijn de enige die ik in de twee
  2809.         standaard ROM's heb gemaakt. In de standaard Spectrum ROM is
  2810.         helemaal niets veranderd, in de interface 1 ROM dus alleen
  2811.         deze twee dingen. Onderaan dit hoofdstuk staan de precieze
  2812.         veranderingen.
  2813.  
  2814.            Met opcode ED FE kan een byte in de dan aktieve ROM
  2815.         veranderd worden. De verandering is semi-permanent, dat wil
  2816.         zeggen dat de verandering stand houdt, maar niet wordt
  2817.         weggeschreven in de file ROMS.BIN. Een volgende keer is de
  2818.         verandering dus verdwenen.
  2819.  
  2820.            De laatste opcode, ED FF, wordt nooit gebruikt. Ik heb
  2821.         hem helemaal in het begin toegevoegd voor het debuggen, en
  2822.         ik heb hem voor de grap maar laten zitten. Je kunt de
  2823.         Emulator dus verlaten door in Spectrum BASIC in te
  2824.         tikken:
  2825.  
  2826.         POKE 40000,237:POKE 40001,255:RANDOMIZE USR 40000
  2827.  
  2828.         Veranderingen in de Interface 1 ROM:
  2829.  
  2830.         ADRES: OUD: NIEUW:           ADRES: OUD: NIEUW:
  2831.  
  2832.         0B9E   ED   ED               0D2A   37   ED
  2833.         0B9F   5B   FC               0D2B   F3   FD
  2834.         0BA0   C3   F5               0D2C   CE   18
  2835.         0BA1   5C   C3               0D2D   00   10
  2836.         0BA2   21   34
  2837.         0BA3   20   0C               0D4C   FB   00
  2838.  
  2839.         0D20   FB   00
  2840.  
  2841.  
  2842. 4.7 Beveiligingsmethoden op de Spectrum
  2843.  
  2844.            Ook voor de Spectrum zijn, om de kopieerwoede van de
  2845.         gebruikers wat tegen te gaan, door de jaren heen
  2846.         verscheidene beveiligingsmethoden ontwikkeld. Het begon
  2847.         allemaal met de bekende Horace-spelletjes, die met een
  2848.         simpele POKE 23659,0 waren 'beveiligd'. Hier was simpel
  2849.         omheen te komen door het programma niet met LOAD "", maar
  2850.         met MERGE "" in te laden. Het laatste commando doet het
  2851.         BASIC-programma namelijk niet automatisch starten.
  2852.  
  2853.            Daarna kwamen de programma's die alleen met LOAD waren in
  2854.         te laden, en niet met MERGE. Ook hier was omheen te komen.
  2855.  
  2856.            Tenslotte, (en nu sla ik enkele jaren over) kwamen de
  2857.         snelladers, met als hoogtepunt SPEEDLOCK, samen met
  2858.         LENSLOCK. Dit waren ingenieuze vondsten, die zeer moeilijk
  2859.         te kraken waren (op de conventionele manier, wel te
  2860.         verstaan). Het kostte mij weken om SPEEDLOCK te kraken. Nu
  2861.         met de SamRam zou het een kwestie van minuten zijn.
  2862.  
  2863.            Om SPEEDLOCK te gebruiken op de Emulator, moet je de -r
  2864.         en de -l optie gebruiken. De -r optie zorgt ervoor dat na
  2865.         elke instructie het R-register met 1 verhoogd wordt. Dit
  2866.         doet de Z80 ook, maar wordt eigenlijk nooit gebruikt, alleen
  2867.         soms voor een simpele willekeurige-getallen-generator. Als
  2868.         je de -r optie niet gebruikt, wordt de inhoud van het R-
  2869.         register bij de Emulator bepaald door een eenvoudige random-
  2870.         generator.
  2871.  
  2872.            De -l optie zorgt ervoor dat een LDIR of LDDR instructie
  2873.         niet ineens wordt afgeraffeld. De instructie wordt nu stapje
  2874.         voor stapje gedaan, precies zoals de Z80 het zelf ook doet.
  2875.         Als de LDIR-instructie zichzelf nu overschrijft, doet de
  2876.         Emulator precies hetzelfde als de Z80. Je moet er maar op
  2877.         komen! SPEEDLOCK maakte gebruik van deze mogelijkheid,
  2878.         waarschijnlijk om krakers zand in de ogen te strooien.
  2879.  
  2880.  
  2881. 4.8 Tips en Truuks
  2882.  
  2883.         - Het bekijken van de SamRam ROM
  2884.  
  2885.           Druk op NMI (=F9), druk op 'D' (=disassembler), en typ
  2886.         '$'. Je ziet nu de eerste bladzijde van de SamRam ROM. Voor
  2887.         verdere uitleg over de disassembler, zie hoofdstuk 2.7.
  2888.  
  2889.         - Het bekijken van de Shadow SamRam ROM
  2890.  
  2891.           Typ in Spectrum BASIC in: *SAVE 0,32768,16384. Ga naar de
  2892.         disassembler, typ 'M:8000', en '$'.
  2893.  
  2894.         - Het bekijken van de Interface 1 ROM
  2895.  
  2896.           Ga naar de disassembler. Typ 'M:5B00' en 'I'. Je kunt nu
  2897.         data invoeren. Typ de volgende hexbytes in, na elke byte op
  2898.         Enter drukken:
  2899.  
  2900.                 F3 21 0C 5B E5 21 00 00 E5 C3 08 00 21 00 00
  2901.                 11 00 80 01 00 40 ED B0 CD 00 07 FB C9
  2902.  
  2903.         Typ weer 'M:5B00' en '$' om de code te bekijken. Druk weer
  2904.         op '$', en dan op EDIT (=Shift 1) of ESC om naar het
  2905.         hoofdmenu te gaan. Druk op 'E', en typ in Spectrum BASIC in:
  2906.                 RANDOMIZE USR 23296
  2907.            De interface 1 ROM staat nu op adres 32768, hex 8000,
  2908.         klaar om bekeken te worden.
  2909.  
  2910.         - Het 'vangen' van schermpjes met de SamRam software
  2911.  
  2912.            Druk op NMI (F9) zodra het schermpje dat je wil vangen
  2913.         zichtbaar is. Druk op '2', en dan op '1' (Sla scherm 1 op).
  2914.         Druk nogmaals op F9, of op ALT-F9 (reset). Tik in Spectrum
  2915.         BASIC in:
  2916.  
  2917.                 CLEAR 32000:OUT 31,11:*move 51200,16384,6912
  2918.  
  2919.            Het schermpje wordt nu verplaatst van adres 51200 in de
  2920.         2e rambank naar het beeldschermgeheugen. Typ OUT 31,10 om de
  2921.         gewone bank weer in te schakelen.
  2922.  
  2923.            Schermpjes kunnen worden omgezet in .GIF bestanden. Dit
  2924.         is beschreven in hoofdstuk 2. Als je een Spectrum-schermpje om
  2925.         wil zetten in GIF-formaat kan dat ook eenvoudiger: de utility
  2926.         CONVERT is in staat om het schermpje in een .Z80 bestand te
  2927.         vertalen in een .GIF bestand. Het enige dat je hoeft te doen is
  2928.         dus het Spectrum-programma op het juiste moment te stoppen en
  2929.         weg te schrijven (en je registreren om de utility CONVERT te
  2930.         krijgen!)
  2931.  
  2932.  
  2933. 4.9 Struktuur van een .Z80 programmabestand
  2934.  
  2935.            Alle informatie van een lopend Spectrum programma kan
  2936.         worden opgeslagen in een .Z80 bestand. Een volgende keer kan
  2937.         dit bestand dan weer worden ingeladen, en kan vanaf dat punt
  2938.         worden verdergegaan.
  2939.  
  2940.            Zo'n .Z80 bestand bestaat uit informatie over de
  2941.         registers, en andere 'omgevingsvariabelen', en 48K Spectrum
  2942.         geheugen. De data in het Spectrum geheugen wordt een beetje
  2943.         verkort opgeslagen: herhalingen van 1 bytewaarde worden met
  2944.         een code opgeslagen.
  2945.  
  2946.         Offset: Lengte: Omschrijving:
  2947.  
  2948.         0       1       A register
  2949.         1       1       F register
  2950.         2       2       BC register paar (LSB, dus C, eerst)
  2951.         4       2       HL register paar
  2952.         6       2       Program counter
  2953.         8       2       Stack pointer
  2954.         10      1       Interrupt register
  2955.         11      1       Refresh register (Bit 7 geen betekenis)
  2956.         12      1       Bit 0  : Bit 7 van het R register
  2957.                         Bit 1-3: Border kleur
  2958.                         Bit 4  : 1=SamRom ingeschakeld
  2959.                         Bit 5  : 1=Datablok verkort opgeslagen
  2960.                         Bit 6-7: Geen betekenis
  2961.         13      2       DE register paar
  2962.         15      2       BC' register paar
  2963.         17      2       DE' register paar
  2964.         19      2       HL' register paar
  2965.         21      1       A' register
  2966.         22      1       F' register
  2967.         23      2       IY register
  2968.         25      2       IX register
  2969.         27      1       Interrupt flipflop, 0=DI, anders EI
  2970.         28      1       IFF2
  2971.         29      1       Bit 0-1: Interrupt mode (0, 1 of 2)
  2972.                         Bit 2  : 1=Issue 2 emulatie
  2973.                         Bit 3  : 1=Dubbele interruptsnelheid
  2974.                         Bit 4-5: 1=Hoge video synchronisatie
  2975.                                  3=Lage video synchronisatie
  2976.                                  0,2=Normaal
  2977.                         Bit 6-7: 0=Cursor/Protek/AGF joystick
  2978.                                  1=Kempston joystick
  2979.                                  2=Sinclair 1 joystick
  2980.                                  3=Sinclair 2 joystick
  2981.  
  2982.  
  2983.            Voor de eerste sharewareversie gebruikte ik een formaat
  2984.         voor de .Z80 bestanden waarin het datablok niet verkort werd.
  2985.         Het .Z80 bestand was dus altijd precies 49182 bytes lang. De
  2986.         flagbyte 12 had altijd de waarde 0 of 255, en omdat de utility
  2987.         SAVESPEC.BAS nog altijd zo'n soort .Z80 bestand produceert kan
  2988.         ook versie 1.40 nog overweg met dit formaat. Dus: als byte 12
  2989.         nul of 255 is, is het datablok NIET verkort opgeslagen (en
  2990.         moet de flagbyte als effectief 1 gelezen worden, dat wil
  2991.         zeggen bit 7 van R is 1, border 0, etc.)
  2992.  
  2993.            Tot versie 1.30 zat er in byte 29 altijd een 0, 1 of 2.
  2994.         Vanaf versie 1.40 hebben bits 2-7 ook betekenis gekregen.
  2995.         Omdat ze in de vorige versies altijd de waarde nul hadden,
  2996.         zijn .Z80 bestanden die met de oude versie bewaard zijn ook
  2997.         goed te gebruiken in versie 1.40 van de Emulator.
  2998.  
  2999.            Na het 30-byte blokje volgt het werkelijke codeblok. Als
  3000.         het rijtje "ED ED xx yy" in de code voorkomt, met xx en yy
  3001.         willekeurige waarden, wordt dit omgezet in xx keer de byte
  3002.         yy. Dus:
  3003.  
  3004.                 ED 00 44 ED ED 05 00 02
  3005.  
  3006.         wordt terugvertaald in:
  3007.  
  3008.                 ED 00 44 00 00 00 00 00 02
  3009.  
  3010.            Als er in de originele file al rijtjes ED ED voorkomen,
  3011.         worden deze omgezet in ED ED 02 ED, in overeenstemming met
  3012.         bovenstaande interpretatie. Ook moet er worden gelet op
  3013.         rijtjes als
  3014.  
  3015.                 ED 00 00 00 00 00 00 88 ...
  3016.  
  3017.         die zonder speciale behandeling vertaald zou worden in
  3018.  
  3019.                 ED ED ED 06 00 88 ...
  3020.  
  3021.         wat bij terugvertaling iets heel verkeerds zou opleveren.
  3022.         Routines voor dit eenvoudige codeer- en decodeer algoritme
  3023.         zijn te vinden in de sourcefiles DISCIPLE.C, CONVZ80.8 en
  3024.         MISC.8.
  3025.  
  3026.  
  3027. 4.10 De sourcecode van de Spectrum Emulator
  3028.  
  3029.            De sourcecode is niet bij het shareware-pakket
  3030.         bijgeleverd, omdat het het pakket erg groot zou maken, en
  3031.         omdat er (helaas) veel mensen zijn die er toch niet in
  3032.         geïnteresseerd zijn. Omdat ik het zelf wel altijd leuk vind
  3033.         om de source van een mooi programma te kunnen bekijken vind
  3034.         ik het wel zo netjes om anderen nu ook een blik in mijn
  3035.         keuken te gunnen. Daarom krijgen geregistreerde gebruikers
  3036.         de sourcecode opgestuurd. In deze paragraaf wil ik uitleggen
  3037.         wat globaal de functies zijn van de routines in de veertien
  3038.         verschillende sourcefiles.
  3039.  
  3040.            De Spectrum Emulator is bijna helemaal geschreven in
  3041.         assembleertaal. Hiervoor heb ik de shareware-assembler A86
  3042.         gebruikt. Deze is niet compatibel met de Microsoft
  3043.         assembler: de macro-taal wijkt vooral nogal af, en er zijn
  3044.         in A86 handige afkortingen ingebouwd die in MASM niet
  3045.         aanwezig zijn. Meestal kan hiervoor wel een macro geschreven
  3046.         worden, maar soms niet.
  3047.  
  3048.            De segment-opbouw van de Emulator is als volgt: eerst
  3049.         komen de segmenten XTRA_TEXT, _DATA en _BSS die bij de
  3050.         C-sourcefile xtra.c horen, dan komt het segment STARTUP
  3051.         waarin alle code zit dit niet bij xtra.c of de z80-emulator
  3052.         horen, vervolgens het segment EMULATOR waarin de
  3053.         z80-emulator zit, en tenslotte EDOC waarin de Spectrum-ROM
  3054.         zit.
  3055.  
  3056.            De routines in xtra.c zorgen voor de communicatie met de
  3057.         gebruiker, via het hoofdmenu. Er zit weinig interessante
  3058.         code bij, eigenlijk. De ingang bestaat uit de routine ENTRY,
  3059.         die aangeroepen wordt vanuit de assemblyroutines. De routine
  3060.         ENTRY krijgt bij aanroep als parameter een 'aktie-code' die
  3061.         vertelt wat de reden van de aanroep is: een druk op F10
  3062.         of een DI/HALT crash bijvoorbeeld.
  3063.  
  3064.            In de file z80.8 zijn de meeste geheugenvariabelen
  3065.         gedeclareerd. De opstartroutine zit hierin, die nogal veel
  3066.         te doen heeft en dus ook redelijk wat ruimte inneemt. Hierna
  3067.         komen nog wat kleine routinetjes, en ten slotte zit hierin
  3068.         de routine die het bestand Z80.EXE bij de eerste keer
  3069.         opstarten inpakt.
  3070.  
  3071.            De kleine routinetjes die eerst allemaal in z80.8 zaten,
  3072.         maar er later uit moesten omdat A86 alleen sourcefiles tot
  3073.         64K aankan, zitten nu in de file misc.8. De RS232-emulatie
  3074.         routines zitten hier, de routines voor het inpakken van .Z80
  3075.         bestanden, de toetsenbord-afhandeling en de code voor het
  3076.         maken van het introscherm.
  3077.  
  3078.            De videoroutines zitten zoals te verwachten was in de
  3079.         file video.8. Het eerste blok routines zorgt voor de
  3080.         herkenning van de verschillende videokaarten en de
  3081.         initialisatie daarvan, en wordt 'bestuurd' door de routine
  3082.         INIT_VIDEO. Daarna volgt het blok routines die voor de
  3083.         werkelijke video-emulatie van het Spectrum-beeldscherm
  3084.         zorgen, en die begint met de routine VIDEO_UPDATE. Deze
  3085.         routine kijkt of er veranderingen zijn opgetreden sinds de
  3086.         laatste bijwerking door het huidige beeldschermgeheugen te
  3087.         vergelijken met een 'schaduw'-schermgeheugen, en als die er
  3088.         zijn wordt deze op het beeldscherm gezet. Deze routines zijn
  3089.         geoptimaliseerd op snelheid en niet op grootte, vandaar dat
  3090.         er nogal wat routines zijn die erg op elkaar lijken. De
  3091.         video-routines maken, ook weer met het oog op snelheid,
  3092.         gebruik van grote tabellen om eenvoudige maar tijdrovende
  3093.         bit-manipulaties snel te kunnen uitvoeren. Deze tabellen
  3094.         zitten in de file vidtab.8.
  3095.  
  3096.            De routines om met de C procedures te kunnen samenwerken
  3097.         zitten in het bestand cif.8 (C-interface). De eerste
  3098.         belangrijke routine in dit bestand, ENTER_C, zorgt ervoor
  3099.         dat de gewone DOS-omgeving weer in ere wordt hersteld (alle
  3100.         omgeleide vectoren, zoals bijvoorbeeld van het toetsenbord
  3101.         en de timer worden teruggezet) en roept de routine _ENTRY
  3102.         aan, en initialiseert tenslotte alle vectoren weer voor de
  3103.         emulator. Daarna komen een groot aantal routines die door
  3104.         het C programma gebruikt worden, zoals het lezen van het
  3105.         toetsenbord, het printen op het beeldscherm, het werken
  3106.         met de diskdrive en ander klein grut. Meestal zijn ze vrij
  3107.         kort: ze bestaan uit een aanroep van een DOS-functie of een
  3108.         functie die al in een andere assembly-file is gedefinieerd.
  3109.  
  3110.            In de file tables.8 zitten wat tabellen voor de
  3111.         z80-emulator en de toetsenbord routine. Niet erg
  3112.         interessant, dus ik zal er niet teveel woorden aan vuil
  3113.         maken.
  3114.  
  3115.            Verder met de interessantere bronbestanden: die van de
  3116.         z80-emulator. De complete z80-emulator wordt gevormd door de
  3117.         bestanden emul.8, ddfd.8, dd.8, fd.8, cb.8 en ed.8.
  3118.            In de eerste zitten om te beginnen enkele macro's,
  3119.         waarvan JX de belangrijkste is. Deze macro staat aan het
  3120.         eind van elke stukje code dat een Z80-instructie emuleert.
  3121.         De macro is een afkorting voor de instructies MOV BH,[DI] /
  3122.         XOR BL,BL / JMP BX, en vervolgens vijf NOP's. Deze
  3123.         instructies halen de volgende Z80 opcode op, en springen
  3124.         naar de juiste emulatie-routine. De vijf NOP's zijn bedoeld
  3125.         om ruimte open te houden voor het invoegen van de instructie
  3126.         INC BYTE ES:[RR], waarbij RR staat voor de geheugenplaats
  3127.         waar de waarde van het R-register is opgeslagen.
  3128.            De rest van de file emul.8 bestaat uit emulatieroutines
  3129.         voor de gewone z80-opcodes, dus alle behalve de opcodes die
  3130.         beginnen met DD, FD, ED of CB.
  3131.  
  3132.            In de files dd.8 en fd.8 zitten de routines voor de
  3133.         z80-instructies met een dd- of fd-prefix. Alleen voor de
  3134.         instructies die iets met het H, L of HL register doen heeft
  3135.         de DD of FD prefix effect. Doet een instructie niets met
  3136.         deze registers dan heeft de prefix geen invloed.
  3137.         Bijvoorbeeld 00 is NOP, maar DD 00 is ook NOP, en DD DD 00
  3138.         ook. Daarom zijn in deze file ook alle instructies die niets
  3139.         met het H/L register doen ongewijzigd uit emul.8
  3140.         overgenomen.
  3141.  
  3142.            De emulatie-routines voor instructies met een CB-prefix
  3143.         zitten natuurlijk in cb.8. Dit is een vreselijk saaie file,
  3144.         omdat de instructies met een CB-prefix zo op elkaar lijken.
  3145.         De routines voor instructies met een DDCB of FDCB prefix
  3146.         tenslotte zitten in ddfd.8.
  3147.  
  3148.  
  3149. <*** Einde Z80.Doc ***>
  3150.