|
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 0363De 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. |