Home | Computer | Foto-album | Grappig | Interessant | Projecten | Links | Gastenboek
Index | Commodore 64 | 8085 Emulator | Aedit | Linux scripts
Gebruiksaanwijzing 8085 EMULATOR versie 4.73
Download de 8085 emulator diskette image hier!
(ingepakt met pkzip; slechts 30 kb!)
Deze (voor Commodore 64 geschreven) emulator doet de 8085 microprocessor na, en ook gedeeltelijk het CT-systeem (een computer met terminal waarbij programma's in assembly kunnen worden ingevoerd) en de microtrainer (programma's kunnen in de vorm van hexadecimale opcodes m.b.v. een simpel 24-toetsenbordje en LED-displaytje ingevoerd worden) die wij op school gebruikten (MTS Deventer afd. Technische ComputerKunde Gorssel). De emulator is zeer gebruiksvriendelijk. Een aantal veel gebruikte routines van het CT-systeem en de microtrainer zijn ook opgenomen in de emulator, zelfs de 6 7-segment-displays ontbreken niet! Assembly programma's kunnen stap voor stap uitgevoerd worden, vertraagd en/of met het laten zien van de inhoud van alle registers tijdens het uitvoeren van een programma. (Je ziet de waarden dus veranderen!). Een programma kan elk moment gestopt worden, waarbij men weer terug in de assembler kan en later het programma weer kan vervolgen.

De commando's.
De emulator beschikt over de volgende één-letter-commando's (waarbij geen spatie achter het commando getypt dient te worden):

A         Assembleren.
Een programma kan hierbij in assembly ingevoerd worden. (bijv. AC000 LXI H,1234) Na het indrukken van RETURN wordt automatisch het volgende adres berekend en op het scherm gezet voor de invoer van het eventueel volgend assembly-statement (hier dus: *C003). Na de laatste regel kan twee keer op return gedrukt worden om terug te komen in de monitor.
C         Verander de kleur van het display.
Maak er bijv. een LCD-display van i.p.v. een LED-display. Of een blauw LED-display. Mogelijkheden genoeg!
D         Disassembleren.
De syntaxis kent verschillende vormen, nl:

1. D                Disassembleer vanaf adres xx00, waarbij xx gelijk
                    is aan PCH. (dus als PC=1234, disassembleer dan vanaf 1200)
                    tot (PC). In dit geval dus van 1200 t/m 1233.

2. DC000            Disassembleer vanaf C000

3. DC000 C040       Disassembleer vanaf C000 t/m C040

Achter de RST's staan de bijbehorende functies. Tijdens het disassembleren kan op een willekeurige toets gedrukt worden om het disassembleren tijdelijk te stoppen. De RUN/STOP-toets kan ingedrukt worden om in de monitor terug te komen.

FC000 CFFF 00       Vul (Fill) geheugenplaatsen C000 t/m CFFF met 00.
G         Start (Go) een programma waarvan het startadres in (PC) staat.
GC000     Start een programma welke op C000 begint.
          (gelijk aan de JMP-instructie) Het programma moet hierbij eindigen
          op een RST, niet op RET!
H         Hulp-menu
J         Jump naar subroutine, start een subroutine welke dus eindigt op RET.
          (gelijk aan de CALL-instructie) Zelfde syntaxis als G.
L         Laad een kudde bytes van disk.
Syntaxis:

L"naam",08
Laad file 'naam' van drive 08 op origineel startadres. (L"DEMO",08)
Dus geen 8 tikken, maar 08

L"naam",08,C400
Laad file 'naam' van drive 08 op opgegeven startadres C400 bijvoorbeeld.

M         Geeft hex- en asciidump van opgegeven geheugenadressen.
          (Zelfde syntaxis als bij D, ook de werking van spatiebalk en
          RUN/STOP-toets is hetzelfde) Hexwaarden zijn m.b.v. de cursortoetsen
          te editen. Op het scherm worden de geheugenadressen in regels van 8
          bytes weergegeven, op de printer in regels van 16 bytes.

P         Volgende uitvoer zal naar printer gaan (device 04). Tik nu
          bijv. DC000 C00F, en de uitvoer gaat naar de printer!
          Alles wat op het scherm reversed zou worden weergegeven wordt
          op de printer normaal weergegeven.

R         Toon de inhoud van alle registers. De waarde van het statusflag-
          register wordt zowel binair als hexadecimaal weergegeven.
          M.b.v. de cursortoetsen kunnen de waarden veranderd worden en
          met een druk op RETURN bevestigd worden.

S         Save een stuk geheugen naar disk.

Syntaxis: S"naam",drivenr.,beginadres,eindadres+1

LET OP: Wil je bijv. C000 t/m C27F saven, tik dan:

          S"naam",08,C000,C280          (C27F+1=C280)

T         Transfer (verplaats) een stuk geheugen. (kopiëren)

Syntaxis: TC000 C07F C600

          Hierbij wordt de inhoud van C000 t/m C07F gekopieerd naar C600 t/m C67F.

X         Verlaat de emulator. (eXit). Je komt dan in C64-basic.

Y         Schakel TRACE aan/uit. Als TRACE aan is hoef je niet de
          shift-toets te gebruiken om de inhoud van de registers te zien.

Z         Schakel de controle over TRACE aan/uit

*         Gelijk aan A. Na het disassembleren kun je dus ook m.b.v.
          de cursortoetsen statements veranderen.

<-        Voor het invoeren van teksten.

Voorbeeld:
          <- C100 test

tik dan:
          MC100 C107

en zie:
          :C100 54 45 53 54 24 00 00 00 TEST$@@@

          Er wordt dus een $ achter gezet, omdat deze het einde van
          een string aangeeft. (Voor de STROUT-routine op 1291.)

$         Geeft een directory

?         geef info over:

1. Welke opcode hoort bij opgegeven instructie?
2. Welke instructie hoort bij opgegeven opcode?

Voorbeelden:
intikken:      antwoord:
?21            21 LXI H,....
?DE            DE SBI ..
?STA 1234      32 STA 1234
?CALL 0363     CD CALL 0363
De emulator zoekt zelf wel uit of het een hexadecimaal cijfer is, of een statement! NB: Het CT-systeem en de microtrainer staan vol met allerlei subroutines. De 3 belangrijkste die ik gevonden heb van het CT-systeem en 5 belangrijke subroutines van de microtrainer worden ook door de emulator herkend en geëmuleerd!
(Daar op bv. adres 05F1 bij de C64 het schermgeheugen zit heb ik diverse trucjes toegepast om toch de routines uitvoerbaar te maken.) De drie routines van het CT-systeem zijn:
Adres     Label

1113      GETKEY
          Stop 'de-waarde-van-de-op-dit-moment-ingedrukte-toets' in de accumulator.
          Wordt er op dat moment geen toets ingedrukt, dan wordt de
          accu gevuld met 00. Anders met de ASCII-waarde van de betreffende toets.

1291      STROUT (string out)
          In het registerpaar (BC) bevindt zich het startadres van
          een stuk tekst in ASCII-vorm. Het einde van de tekst moet
          aangegeven worden met een $. (de waarde 24 hex) Er wordt
          ook (geen) rekening gehouden met LineFeeds. Als er ergens
          0D staat wordt er slechts een CarriageReturn gegeven, maar
          geen LineFeed. Je bent dus verplicht om ook een 0A te gebruiken.

13A3      CHROUT (character out)
          Stuur een karakter naar het scherm.
          Het karakter staat in ASCII-code in register C.
De 5 routines van de Microtrainer:
02B7      OUTPT Stuur 'iets' naar het display.
          In (HL) dient zich het beginadres te bevinden van de data,
          bit 0 van de accumulator bepaalt of het adresveld (4 digits)
          of het dataveld (2 digits) betreft.
          (resp. A=00 en A=01) Bij de microtrainer wordt ook bit 0 van
          register B gebruikt om te bepalen of er een decimale punt
          weergegeven moet worden. Deze optie vond ik wat overbodig,
          dus heb ik deze maar weggelaten.

Voorbeeldprogrammaatje:
*C000 3E 00    MVI A,00      ;kies adresveld
*C002 06 00    MVI B,00      ;geen dec. punt (geen invloed op emulator)
*C004 21 10 C0 LXI H,C010    ;begin van de 4 databytes op C010
*C007 CD B7 02 CALL 02B7     ;zet 't op 't display
*C00A C7       RST 0         ;stop

:C010 08 00 08 05 00 00 00 00 8@85@@@@
Op het display komt dus "8085" te staan, want de codes daarvoor staan in C010 t/m C013.
De codetabel:
Waarde     MicroTr.-toets C64 equivalent  Display char.
00 t/m 0F  "0" t/m "F"    "0" t/m "F"     0 t/m F
10         "EXEC"         "X"             H
11         "NEXT"         "RETURN"        L
12         "GO"           "G"             P
13         "SUBST MEM"    "M"             I
14         "EXAM REG"     "R"             r
15         "SINGLE STEP"  "S"             <spatie>

02E7      RDKBD
          Wacht op een toets, en zet het resultaat in de accumulator.
          Voor een goede werking dient interrupt 5.5 gereset te zijn (bit 0),
          en de interrupt-enable-flag (bit 3) geset te zijn.

De interrupt-mask is een 8-bits register:

Bit 7..4  Ongebruikt, don't care
Bit 3     Interrupt Enable  (0=disabled/1=enabled)
Bit 2     RST 7.5           (0=enabled/1=disabled)
Bit 1     RST 6.5           (0=enabled/1=disabled)
Bit 0     RST 5.5           (0=enabled/1=disabled)

Voorbeeld:

*C000 3E 08    MVI A,08    08 is binair 00001000
*C002 30       SIM         SetInterruptMask; kopieer Accu naar Int.Mask
*C003 CD E7 02 CALL 02E7   Wacht op een toets
*C006 C7       RST 0       Accu bevat nu waarde van ingedrukte toets.

0363 UPDAD  update addressfield. Inhoud van (DE) gaat naar adresveld.
036E UPDDT  update datafield. Inhoud van accumulator gaat naar dataveld.
05F1 DELAY  De inhoud van (DE) wordt teruggeteld naar 0000. Een wachtlus dus.
Extra opcodes.
Er zijn 10 opcodes die geen funktie hebben op de 8085 microprocessor. 8 Opcodes daarvan heb ik een nuttige funktie gegeven in mijn emulator, nl. het oproepen van de 8 subroutines. Hier volgt een overzicht:
       instr.  CT-syst.
Opc.   lengte  /microtr   syntaxis

08       1       1113     GETKEY       Precies hetzelfde als CALL 1113

10       3       1291     STROUT C700  String van C700 op scherm.
                                       De inhoud van (BC) blijft intact

18       1       13A3     CHROUT       Precies hetzelfde als CALL 13A3

28       1       02B7     OUTPT        Precies hetzelfde als CALL 02B7

38       1       02E7     RDKBD        Wacht op een toets, zet het
                                       resultaat in de accumulator

CB       3       0363     UPDAD 1234   Zet '1234' op ADDRESSfield

D9       2       036E     UPDDT 56     Zet '56' op DATAfield

DD       3       05F1     DELAY 6000   Tel van 6000 terug naar 0000.
                                       De inhoud van (DE) blijft intact.
Trace
Dit is best wel een spectaculaire optie. Het kan namelijk voorkomen dat je net een routine geschreven hebt, waar een onverklaarbare fout in blijkt te zitten. Daarom is het handig om TIJDENS het uitvoeren van het programma de inhoud van ALLE registers te bekijken. Behalve dit is het ook mogelijk om het programma tijdelijk te stoppen, even de monitor in om evt. het programma en/of de inhoud van bepaalde registers wijzigen, en het daarna weer te vervolgen, of om het programma te vertragen! De volgende vier toetsen worden gebruikt bij het tracen (Tijdens het uitvoeren):
SHIFT     Stop het tonen van de registers. Hierdoor loopt het te testen
          programma sneller, handig wanneer er een wachtlus in voorkomt
          of zo. Bij het loslaten van SHIFT wordt het tracen weer vervolgd.
          (Je kan ook de SHIFT-LOCK toets gebruiken)

C=        Stop tijdelijk het programma. Zo kun je even op je gemak
          de inhoud van de registers lezen en even nadenken. Zodra
          je C= loslaat gaat 't programma weer verder.

CTRL      Stop het programma en ga terug naar de monitor. Nu kun je de
          monitor gebruiken, en het
          programma eventueel weer
          vervolgen met "G" en RETURN. (in de PC staat namelijk het
          adres waar
          't programma gestopt is)

SPATIE    Vertraging, zolang de spatiebalk ingedrukt wordt.
De CTRL-toets is eigenlijk overbodig, want precies hetzelfde kan bereikt worden met de RUN-STOP-toets. (user break) Dit komt omdat dit er later bijgekomen is. De funktie van de SHIFT-toets kan ook geinverteerd worden, zodat er NIET getraced wordt bij het indrukken van SHIFT, en andersom! Het toggelen van funktie van de SHIFTTOETS-funktie gebeurt met het commando "Y".
De CTRL- SHIFT- en C= toetsen kunnen ook op non-actief gesteld worden wat het tracen betreft, want het kan erg lastig worden als je m.b.v. de subroutine GETKEY op 1113 een karakter wil inlezen welke in combinatie met bv. de SHIFT-toets wordt ingetikt. Daarom zijn deze toetsen uitschakelbaar, met het commando "Z".

Direct mode.
Alle opcodes kunnen ook als commando uitgevoerd worden. Met andere woorden: Men kan een instructie intikken zonder "A" en zonder adres ervoor, welke dan onmiddelijk na het drukken op return uitgevoerd wordt!
Voorbeeld ==> intikken:

MVI A,45

Het resultaat:

  PC  SZ-H-P-C  AF   BC   DE   HL   SP
;C000 00000010 4502 0000 0000 0000 8000   (enige afwijkingen zijn mogelijk)
De inhoud van alle registers worden getoond, en in de accumulator blijkt dus ook 45 te staan.
De RST (Restart) functies
De 8 RST-opcodes hebben in deze emulator elk een functie.
Hier volgt een overzicht:

RST 0     Normale restart.
RST 1     Net als RST 0, alleen wordt de PC teruggezet naar zijn beginwaarde.
RST 2     Trace aan. Na deze instructie gaat het programma gewoon verder.
RST 3     Trace uit. Na deze instructie gaat het programma gewoon verder.
RST 4     Restart emulator. De 8085-emulator wordt opnieuw opgestart. De
          ProgramCounter krijgt dus ook zijn standaardwaarde C000.
RST 5     6510-crash! De 6510 microprocessor krijgt een illegale
          opcode (02) voorgeschoteld, waarna de microprocessor vastloopt.
RST 6     Commodore 64 reset. Er wordt een reset gegeven waarbij een
          eventueel aanwezige PowerCartridge wordt geactiveerd.
RST 7     Het scherm wordt schoongemaakt waarna een RST 0 volgt.
Tot zover de instructies. Dit programma heb ik geschreven van 11 t/m 20 juli 1989.

© 1989-2002 Martin Meijerink.   Last update: