home *** CD-ROM | disk | FTP | other *** search
/ Best of German Only 1 / romside_best_of_german_only_1.iso / anwender / sim / sim51_04.arj / SIM51.DOC < prev    next >
Text File  |  1993-02-01  |  111KB  |  3,180 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.     ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  9.     █                                 █
  10.     █                                 █
  11.     █                                 █
  12.     █     ▄███▄      ██     ██▄    ▄██     ███████      ▄██     █
  13.     █      ▐█     ▀     ██     ██▐▄  ▄▌██     ██         ▄█ ██     █
  14.     █      ▐█        ██     ██ █▄▄█ ██     ██ ▄▄        ██     █
  15.     █     ▀███▄      ██     ██  ▀▀  ██     ██▀▀▀█▄    ██     █
  16.     █          █▌    ██     ██      ██        █▌      ██     █
  17.     █    ▄     █▌    ██     ██      ██     ▄     █▌      ██     █
  18.     █     ▀███▀      ██     ██      ██      ▀███▀    ██     █
  19.     █                                 █
  20.     █                                 █
  21.     █                  (c) 1991, 1992  W.Hennig     █
  22.     █                                 █
  23.     ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.              Dokumentation, Version 1.03
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.         Simulator / Debugger für 8051 CPU's auf einem PC
  50.  
  51.  
  52.  
  53.                         Esslingen im Januar 1992
  54.  
  55.  
  56.  
  57.  
  58.                           1
  59.  
  60.         Vorwort:
  61.         --------
  62.  
  63.     SIM51 wurde in Assembler geschrieben.  Das Programm dient zum  De-
  64.     buggen von Programmen für den 8051 und anderen CPUs der 8051 Fami-
  65.     lie. Dabei wird der 8051 auf dem PC simuliert.
  66.  
  67.     Ich begann 1988 mit der Programmierung von SIM51. Damals stand ich
  68.     vor  dem  Problem,  Software für 8044-BITBUS Rechnerkarten zu ent-
  69.     wickeln. Zum Testen mußte der erstellte Code geladen und ein Reset
  70.     ausgelöst werden. Dabei sieht man jedoch nur die Reaktion, wie ei-
  71.     ne leuchtende LED.  Wenn das Programm irgendwo hängt, ist der Feh-
  72.     ler schwer zu finden.
  73.  
  74.     Gerade bei einem Anfänger treten dazu oft kleine Fehler  auf,  die
  75.     beim Debuggen eines Programms leicht erkannt würden (wie z.B.  ein
  76.     vergessenes '#').
  77.  
  78.     Aus dieser Notlage entstand der Gedanke,  ein Programm zu  schrei-
  79.     ben, das den  8051 auf einem PC simuliert. Bei der  Simulation der
  80.     Hardwarebeschaltung sind natürlich Grenzen gesetzt. Hier wird  ein
  81.     Simulator einem echten Emulator immer unterlegen sein, jedoch kann
  82.     die Programmabarbeitung sehr gut verfolgt werden und SIM51 ist we-
  83.     sentlich billiger, einfach zu bedienen und schnell einsetzbar.
  84.  
  85.     Mein Ziel war es, viele Funktionen des 8051 komfortabel nachzubil-
  86.     den und eine übersichtliche Darstellung zu erreichen.
  87.  
  88.  
  89.     SIM51 bietet:
  90.  
  91.       - Fullscreen Darstellung wichtiger Speicherbereiche und aller
  92.         SFR in Fenstern.
  93.  
  94.       - Debuggen von Programmen mit Instruktion Step, Procedure Step
  95.         und Breakpoints.
  96.  
  97.       - Simulation der Hardwarefunktion verschiedener SFR wie:
  98.         Timer, Interrupts und serielle Schnittstelle.
  99.  
  100.       - Editierung sämtlicher 8051 Datenbereiche (IDATA, XDATA, CODE
  101.         und DATA)
  102.  
  103.       - Laden von Code aus HEX-, ABSOLUT oder Binär-Files
  104.  
  105.       - Integrierter Assembler und integrierter Disassembler, mit
  106.         Output auf Disk (File) oder Drucker
  107.  
  108.       - dazu einige Utilities wie  Suchen,  Füllen,  Vergleichen,
  109.           Kopieren,  Reset,  Eingabe-Learn-Buffer, Zyklus-Zähler ...
  110.  
  111.  
  112.     SIM51 ist erhältlich bei:    Werner Hennig-Roleff
  113.                     Sulzgrieser Str. 101
  114.                     73733 Esslingen
  115.                     0(049-)711/376718
  116.  
  117.  
  118.                           2
  119.  
  120.     Inhalt:
  121.     -------
  122.  
  123.     1. Hardware-Voraussetzung  ....................................  4
  124.  
  125.     2. Simulierte CPUs  ...........................................  4
  126.  
  127.     3. SIM51 - Arbeitsweise  ......................................  6
  128.       3.1  Bildschirm-Aufbau                       ...............  6
  129.       3.2  Code-Abarbeitung                        ...............  7
  130.       3.3  simmulierte Hardware                    ...............  8
  131.  
  132.     4. Bedienung von SIM51  ....................................... 10
  133.       4.1  Start von SIM51                         ............... 10
  134.       4.2  Befehlseingabe                          ............... 10
  135.       4.3  Editieren von Command-Line-Befehlen     ............... 11
  136.       4.4  Fehlermeldungen                         ............... 11
  137.       4.5  Editieren anderer Fenster               ............... 12
  138.       4.6  Befehlsübersicht                   .................... 13
  139.  
  140.     5. Befehle, ausführlich  ...................................... 14
  141.       5.1  Laden von Code                           L   .......... 14
  142.       5.2  Direktory-View                           L   .......... 17
  143.       5.3  Editieren der 8051 Speicherbereiche   Alt-?  .......... 17
  144.       5.4  Füllen                                   F   .......... 18
  145.       5.5  Kopieren                                 O   .......... 18
  146.       5.6  Suchen                                   S   .......... 19
  147.       5.7  Vergleichen                              C   .......... 20
  148.       5.8  CPU-Typ wählen (Mode)                    M   .......... 21
  149.       5.9  Reset                                    R   .......... 21
  150.       5.10 Debug-Start setzen                       D   .......... 22
  151.       5.11 Break-Punkte                           [F5]  .......... 23
  152.       5.12 Memory-Mapping                         [F6]  .......... 25
  153.       5.13 Extern Access                                .......... 27
  154.       5.14 sichere Konfiguration                    K   .......... 28
  155.       5.15 seriell IO Simulation                  [F7]  .......... 29
  156.           -1 HEX-Dump Mode                              .......... 31
  157.           -2 Status Infos im HEX-Dump Mode              .......... 32
  158.           -3 Terminal-Emulation Mode                    .......... 35
  159.           -4 Anzeige des Tx-Fensters während go         .......... 36
  160.           -5 Übertragungsformate                        .......... 37
  161.       5.16 Instruktion Step                       [F1]  .......... 40
  162.       5.17 Procedure Step                         [F2]  .......... 40
  163.       5.18 Go-Modus                                 G   .......... 41
  164.       5.19 Assembleraufruf                          A   .......... 43
  165.       5.20 Print Disassembled Code                  PD  .......... 46
  166.       5.21 Print HEX-Dump                           PH  .......... 47
  167.       5.22 Write Code                               W   .......... 47
  168.       5.23 Eingabe wiederholen                    [F3]  .......... 48
  169.       5.24 Eingabe-Lern-Modus                       X   .......... 49
  170.       5.25 Quit                                     Q   .......... 50
  171.       5.26 Hilfe-Funktion                         [F4]  .......... 51
  172.       5.27 Zyklus-Zähler                            Z   .......... 51
  173.  
  174.       6.1 Zugriff auf Dateien, Drucker             ............... 52
  175.  
  176.  
  177.  
  178.                           3
  179.  
  180.     1. Hardware-Voraussetzung:
  181.     --------------------------
  182.  
  183.     SIM51  ist lauffähig unter MSDOS auf allen IBM kompatiblen PCs (XT
  184.     oder AT).  Benötigt wird keine besondere Grafikkarte,  da SIM51 im
  185.     Text-Mode arbeitet. Jedoch sollten mindestens ca. 240 kByte freier
  186.     Arbeitsspeicher  vorhanden  sein.  Weiter  ist mindestens die DOS-
  187.     Version 2.0 erforderlich.
  188.  
  189.  
  190.     Der Code selbst umfaßt ca. 60 kByte, als Platz für die 8051 Daten-
  191.     und Code-Bereiche wird 131 kByte und für Hilfe-Texte  noch  einmal
  192.     ca.  43 kByte benötigt. Der EXE-File liegt in gepackter Ausführung
  193.     vor und entpackt sich selbst beim Laden.
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.     2. Simulierte CPUs:
  202.     ------------------
  203.  
  204.     Prinzipiell kann mit SIM51 Code aller CPUs der 8051 Familie debug-
  205.     ged werden.
  206.  
  207.     Für  die Typen 8051,  8052 und 8044 kann der spezifische Register-
  208.     satz eingeblendet  werden  (Mode-Befehl).  Gleichzeitig  wird  der
  209.     IDATA-Bereich  auf  die in der jeweiligen CPU verfügbare Größe be-
  210.     grenzt.  Die Register dieser CPUs werden auch in ihren  speziellen
  211.     Funktionen  unterstützt.  (serieller  Port  des 8044 noch nicht in
  212.     Version 1.03).
  213.  
  214.  
  215.     Wird Code für andere Typen (z.B. 80535, 80512,  ...) debugged,  so
  216.     werden lediglich die Register, die diese CPUs zusätzlich besitzen,
  217.     nicht unterstützt. Bei einem Zugriff erfolgt eine Warnung.
  218.  
  219.     Diese Register einfach als Speicherstelle anzusehen,  ergäbe wenig
  220.     Sinn, da sie alle spezielle Funktionen erfüllen. Deshalb wurde die
  221.     Lösung mit der Warnung realisiert. Läuft das Programm im Go-Modus,
  222.     so erfolgt dafür ein Stop, um die Warnung anzuzeigen. Der Anwender
  223.     kann darauf mit [F5] einen Break erzeugen und  selbst  einen  Wert
  224.     eingeben,  oder  mit [ESC] die Warnung quittieren,  um im Programm
  225.     fortzufahren.
  226.  
  227.     Das ist  zugegebenerweise  oft lästig. Eine  Erweiterung von SIM51
  228.     ist in Arbeit,  dauert aber sicher noch.  Bisweilen können für den
  229.     80552 und den 80535 mit dem Mode-Befehl  m 552  bzw. m 515 die zu-
  230.     sätzlichen Ports eingeblendet werden.
  231.     
  232.  
  233.     Für SIM51 ist es dasselbe,  ob Code für eine CPU mit oder ohne in-
  234.     ternen EPROM getestet werden  soll.  Beide  Prozessoren  verhalten
  235.     sich gleich.  Bis auf das interne Überschreiben des Port 0 Latches
  236.     beim externen Code-Fetch (siehe 5.13 Extern Access / Seite 27).
  237.  
  238.                           4
  239.  
  240.     grobe Übersicht über 8051-Familie:
  241.  
  242.     ╔════════════════════════════════════════════════════════════════╗
  243.     ║  ROM , ohne, EPROM│IDATA│CODE │ Ports  │Timer│ seriell│        ║
  244.     ║───────────────────┼─────┼─────┼────────┼─────┼────────┼────────║
  245.     ║  8051, 8031, 8751 | 128 | 4 k | P0-P3  | 2   | UART   |        ║
  246.     ║ 80154,  ?  ,  ?   | 128 | 4 k | P0-P3  | 2   | UART   |        ║
  247.     ╢  8052, 8032, 8752 | 256 | 8 k | P0-P3  | 3   | UART   |        ║
  248.     ║ 83451,80451,87451 | 128 | 4 k | P0-P6  | 2   | UART   |        ║
  249.     ║  8044, 8344, 8744 | 192 | 4 k | P0-P3  | 2   | SIU    |        ║
  250.     ║ 83152,  - ,   -   | 256 | 8 k | P0-P6  | 2   |UART+GSC| DMA    ║
  251.     ║ 80515,80535,  -   | 256 | 8 k | P0-P5  | 3+WD| UART   | A/D    ║
  252.     ║ 80517,80537,  -   | 256 | 8 k | P0-P8  | 4+WD| 2xUART |PWM, A/D║
  253.     ║ 83552,80552,87552 | 256 | 8 k | P0-P5  | 3+WD|UART+I²C|PWM, A/D║
  254.     ║ 83652,80652,  -   | 256 | 8 k | P0-P3  | 2   |UART+I²C|        ║
  255.     ║ 83654,  -  ,  -   | 256 |16 k | P0-P3  | 2   |UART+I²C|        ║
  256.     ║ 83751,  -  ,87751 |  64 | 2 k |P0,P1,P3| 1   | I²C    |        ║
  257.     ║   -  ,  -  ,87752 |  64 | 2 k |P0,P1,P3| 1   | I²C    |PWM, A/D║
  258.     ║ 83851,80851,  -   | 128 | 4 k | P0-P3  | 2   | UART   | EEPROM ║
  259.     ╚════════════════════════════════════════════════════════════════╝
  260.  
  261.  
  262.     UART = Universielle Asynchrone Schnittstelle für Receive/Transmit
  263.     SIU  = Seriell Interface Unit (eine Arte Co-Controller)
  264.     GSC  = Global Seriell Channel (wie SIU, noch universeller)
  265.     I²C  = Inter IC Bus
  266.     A/D  = Analog-Eingang mit Analog/Digital Wandler
  267.     PWM  = Pulsweitenmodulierter Ausgang
  268.     DMA  = Direkt Memory Access
  269.     WD  = Watchdog Timer
  270.  
  271.  
  272.  
  273.  
  274.     Es gibt noch weitere Typen.  Einige Typen  enthalten  bereits  ein
  275.     Programm  in  ihrem  internen  Code-Speicher  (z.B.  8052AH  einen
  276.     BASIC-Interpreter, der 8044 die DCM44-BITBUS Software). Anmerkung:
  277.     auch bei den ROM-losen Typen ist der Pin /EA auf GND zu legen. Nur
  278.     so wird der Code korrekt aus dem externen Eprom abgearbeitet.  Ich
  279.     konnte auch schon beobachten, das ein 8344 die DCM44-Firmware ent-
  280.     hielt.
  281.  
  282.  
  283.     C-MOS  Typen  enthalten bis auf einer zusätzlichen Power-Down Mög-
  284.     lichkeit dieselben Funktionen wie die Standard-Typen.  Die für die
  285.     Power-Down  Option  zuständigen Bits werden von SIM51 eingeblendet
  286.     und simuliert.
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.                           5
  299.  
  300.     3. SIM51 - Arbeitsweise:
  301.     ------------------------
  302.  
  303.     Nach dem Laden entpackt sich SIM51  selbst  (im  RAM).  SIM51  al-
  304.     lociert für die 8051 Daten- und Code-Bereiche Speicher. Ist zu we-
  305.     nig Speicher verfügbar, so wird die Installation abgebrochen.
  306.  
  307.  
  308.     SIM51 klinkt sich in den Tastaturinterrupt (INT 9) ein.  Der INT 9
  309.     wird von  SIM51  nur  ausgewertet,  um  einen  User-Break  während
  310.     ** execute ** zu realisieren,  ohne an Geschwindigkeit einzubüßen.
  311.     Bei Exit von SIM51 (Quit),  werden die Interrupt-Vektoren  wieder-
  312.     hergestellt.
  313.  
  314.  
  315.     File-Zugriffe  erfolgen  über die DOS Interrupts INT 3Ch ...  40h.
  316.     Hier wurde das Augenmerk nicht auf  die  Geschwindigkeit,  sondern
  317.     auf die einfache IO-Umleitung gelegt.  Anstelle in einen File kann
  318.     so beispielsweise eine Datei auch an den Drucker geleitet  werden,
  319.     indem  als Filename "PRN" eingegeben wird.  SIM51 läuft aus diesem
  320.     Grund aber erst ab DOS Version 2.0.
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.     3.1 ----- Bildschirm-Aufbau:
  328.  
  329.     SIM51 arbeitet als Fullscreen Debugger.  In laufend aktualisierten
  330.     Fenstern  werden  die Inhalte sämtlicher CPU-Register,  der Stack,
  331.     die aktive Registerbank, die nächsten 11 Befehle in disassemblier-
  332.     ter Form und 128 Byte wahlweise des IDATA-, XDATA-,  CODE-Bereichs
  333.     oder die gesendeten Daten (Terminal-Simulation) angezeigt. Zusätz-
  334.     lich werden die Flags, die Ports, der DPTR und der Instruktion Po-
  335.     inter dargestellt.
  336.  
  337.     Damit  erlaubt SIM51 das Betrachten sämtlicher Registerinhalte auf
  338.     einen Blick.  Wodurch die Abarbeitung von  Programmen  sehr  über-
  339.     sichtlich wird.
  340.  
  341.  
  342.     Zu jedem Fenster gibt es ON-Line Hilfs-Texte.  Sie enthalten neben
  343.     Bedienungshinweisen auch Informationen zu den 8051, 8052 bzw. 8044
  344.     CPUs.
  345.  
  346.  
  347.     Oberhalb der Befehls-Eingabezeile wird der Pfad auf  die  aktuelle
  348.     Direktory eingeblendet.
  349.  
  350.  
  351.     Aus  Geschwindigkeitsgründen  schreibt  SIM51  direkt in den Bild-
  352.     schirmspeicher.  Nur die Set-Cursor Funktion wird über den INT 10h
  353.     abgewickelt.
  354.  
  355.  
  356.  
  357.  
  358.                           6
  359.  
  360.     * untenstehend ist die Bildschirmaufteilung unter SIM51 skizziert:
  361.  
  362.     ┌────────────────────────────────────────────────────┬───────┐
  363.     │                                                    │       │
  364.     │              IDATA, XDATA,                         │       │
  365.     │                                                    │       │
  366.     │             CODE oder Tx-Terminal                  │       │
  367.     │                                                    │       │
  368.     │                                                    │   D   │
  369.     ├─────────────────────────────────┬───────────┬──────┘   a   │
  370.     │ Befehls-Eingabe                 │           │      .   t   │
  371.     ├─────────────────────────────────┤  Pointer  │      .   a   │
  372.     │                                 ├───────────┤   D  .       │
  373.     │                                 │ Flags     │   a  .       │
  374.     │                                 ├─────┬─────┤   t  .       │
  375.     │                                 │  R  │     │   a  .       │
  376.     │                                 │  e  │  S  │      .       │
  377.     │          disassembled           │  g  │  t  │      .       │
  378.     │             Code                │  i  │  a  ├──────────────┤
  379.     │                                 │  s  │  c  │              │
  380.     │                                 │  t  │  k  │    Ports     │
  381.     │                                 │  e  │     │              │
  382.     │                                 │  r  │     │              │
  383.     ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀    ▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀
  384.  
  385.  
  386.     In der untersten Zeile ist eine Menue-Zeile eingeblendet,  die die
  387.     Belegung der Funktionstasten mit Befehlen anzeigt.
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.     3.2 ----- Code-Abarbeitung:
  396.  
  397.     SIM51 lädt Code aus ABSOLUT-,  HEX- oder Binär-Files ins RAM.  Der
  398.     Code-Bereich des 8051 wird dazu im RAM emuliert, ebenso der XDATA-
  399.     und IDATA-Bereich. Der Instruktion Pointer wird auf den Anfang ge-
  400.     setzt (Reset-Zustand).
  401.  
  402.     Nun  kann der Code Schritt für Schritt (Instruktion Step) durchge-
  403.     arbeitet oder alternativ mit dem Go-Befehl gestartet werden. Dabei
  404.     kann eine Break-Adresse gesetzt werden.  Ein im Go-Modus laufendes
  405.     Programm kann jederzeit über die [F5]-Taste angehalten werden.
  406.  
  407.  
  408.     Jeder  Befehl  wird interpretiert und auf dem PC ausgeführt,  bzw.
  409.     das entsprechende 8051-Register oder  Datenbyte  manipuliert.  Bei
  410.     jedem  Stop (also nach jedem ISTEP oder nach einem BREAK) wird die
  411.     Anzeige in allen Fenstern  aktualisiert.  Während  der  Ausführung
  412.     wird  nur der Instruktion-Pointer und wenn aktiv der Zyklus-Zähler
  413.     und das Tx-Fenster aktualisiert. Es gibt aber auch einen Slow-Mode
  414.     (siehe Go),  bei dem nach jedem Befehl alle  Fenster  aktualisiert
  415.     werden.
  416.  
  417.  
  418.                           7
  419.  
  420.     3.3 ---- simmulierte Hardware:
  421.  
  422.  
  423.  
  424.     IDATA
  425.     SIM51  bildet das gesamte interne RAM nach.  Für gesetzte 8051 und
  426.     8044 Mode werden  Zugriffsversuche  auf  nicht  vorhandene  IDATA-
  427.     Adressen mit einer Warnung angezeigt.  Beim Lesezugriff kommt dann
  428.     #0FFh zurück.  Auch ein Stacküberlauf wird so beim 8051  und  8044
  429.     angezeigt.
  430.  
  431.  
  432.  
  433.     XDATA
  434.     Der XDATA-Bereich wird derart simmuliert, als ob (default) ein RAM
  435.     von 64kx8 vorhanden wäre. Irgendwelche angeschlossene Hardware wie
  436.     ein externer Timer,  externer Analog/Digital-Wandler, Port-Latches
  437.     (8255, 74245, ...) können natürlich nicht simmuliert werden.  Über
  438.     Memory-Mapping ([F6] - Taste), können XDATA-Speicherbereiche ande-
  439.     ren XDATA-Bereichen oder einem festen Wert zugeordnet werden.
  440.  
  441.     Eine Zuordnung zu einem anderen Bereich entspricht einer Mehrfach-
  442.     decodierung des gesteckten RAM's.  Ist z.B.  ein RAM 16kx8 vorhan-
  443.     den,  und die Adresse A15 wurde mit dem Chip-Select des RAMs  ver-
  444.     bunden,  so wird das RAM angesprochen mit den Adressen 0000...3FFF
  445.     und noch einmal mit 4000...7FFF.
  446.  
  447.     Ist für einen Bereich kein RAM vorhanden,  sollte hier bei Memory-
  448.     Mapping ein fester Wert zugeordnet werden (z.B. x8000-FFFF -> #0FF
  449.     für obiges Beispiel).  Beim Lesen kommt so immer #0FF zurück, beim
  450.     Schreiben wird eine Warnung ausgegeben (Break bei GO).  Liegt  auf
  451.     einer  XDATA-Adresse  ein  peripherer Baustein,  empfiehlt es sich
  452.     auch hier, einen festen Wert zuzuordnen.
  453.  
  454.  
  455.  
  456.     CODE
  457.     Der CODE-Bereich wird ebenfalls simmuliert,  als ob (default)  ein
  458.     externes  EPROM  von  64kx8 vorhanden wäre.  Auch der Code-Bereich
  459.     kann gemappt werden.  Code-Bereiche können anderen  Code-Bereichen
  460.     zugeordnet  werden  (mehrfach  decodiert  = kleines EPROM).  Code-
  461.     Bereich können aber auch XDATA-Bereichen zugeordnet  werden.  Dies
  462.     entspricht  einer  Code-Abarbeitung  aus dem RAM,  wie sie bei der
  463.     Hardware durch Verknüpfung von /RD mit /PSEN erreicht wird.
  464.  
  465.  
  466.  
  467.     DATA
  468.     Die SFR (spezial Funktion Register) der CPU werden alle  in  ihrer
  469.     Funktion  simmuliert  (beim 8044 serielle Schnittstelle noch nicht
  470.     in Ver. 1.02).
  471.  
  472.     * Das PSW hält die Flags wie in der realen CPU.
  473.  
  474.  
  475.  
  476.  
  477.  
  478.                           8
  479.  
  480.     * Die Timer laufen in dem in TMOD bzw.  T2CON gesetzten Mode.  Sie
  481.     werden  je Cyclus um 1 incrementiert.  Im Counter-Mode erfolgt die
  482.     Incrementierung bei jeder negativen Flanke an T0, T1 bzw. T2. Dazu
  483.     muß der Eingangspin (im Port-Fenster) auf 0 gesetzt  werden.  Dies
  484.     ist zu umständlich,  um so einen externen Takt zu simmulieren. Hat
  485.     man ein solches Problem,  kann man eventuell  die  Routine  einmal
  486.     durchsteppen,  um die Funktion zu kontrollieren,  und dann den Ti-
  487.     mer/Zähler editieren,  falls das Programm auf einem Timer-Überlauf
  488.     wartet. Bei jedem Timer-Überlauf wird natürlich, wenn enabled, ein
  489.     Interrupt ausgelöst.  T2EX und EXEN2 beim Timer2 (nur 8052) werden
  490.     ebenfalls simmuliert.
  491.  
  492.  
  493.     * Beim Anliegen  einer  Interrupt-Bedingung  wird  die  zugehörige
  494.     Interrupt-Routine  angesprungen  (wenn enabled).  Die Funktion ist
  495.     identisch jener in der echten CPU (Priorität wird auch berücksich-
  496.     tigt). Ein INT0 und ein INT1 können wieder nur durch Editieren des
  497.     Eingangspins im Port-Fenster ausgelöst werden.
  498.  
  499.  
  500.     !!! ---------------------------------------------------------- !!!
  501.      Befindet sich SIM51 im GO-Modus, so können mit den Funktions-
  502.      tasten die Port-Eingangspins geändert werden. Damit kann bei-
  503.      spielsweise ein INT0 erzeugt werden, der Timer im Count-Mode
  504.      incrementiert werden oder beim Timer2 reload/capture getrig-
  505.      gert werden.
  506.         Alt-F1 ändert P1.0 = T2      Ctrl-F1 ändert P3.0 = RxD
  507.         Alt-F2 ändert P1.1 = T2EX    Ctrl-F2 ändert P3.1 = TxD
  508.         Alt-F3 ändert P1.2           Ctrl-F3 ändert P3.2 = /INT0
  509.         Alt-F4 ändert P1.3           Ctrl-F4 ändert P3.3 = /INT1
  510.         Alt-F5 ändert P1.4           Ctrl-F5 ändert P3.4 = T0
  511.         Alt-F6 ändert P1.5           Ctrl-F6 ändert P3.5 = T1
  512.         Alt-F7 ändert P1.6           Ctrl-F7 ändert P3.6 = /WR
  513.         Alt-F8 ändert P1.7           Ctrl-F8 ändert P3.7 = /RD
  514.     !!! --------------------------------------------------------- !!!
  515.  
  516.  
  517.     Die serielle Schnittstelle des 8051 und 8052  laufen  relativ  zum
  518.     CPU-Zyklus.  Bis  ein  Zeichen  gesendet ist,  dauert es,  je nach
  519.     Baud-Rate,  entsprechend viele Zyklen.  Hier kann ein Durchsteppen
  520.     recht lange dauern. Es empfiehlt sich einen Break-Punkt zu setzen,
  521.     und  das Programm (das ja sicher eine Warteschleife hat) laufenzu-
  522.     lassen.
  523.  
  524.     SIM51 zählt nur die Zyklen aus, bis ein Zeichen gesendet bzw. emp-
  525.     fangen ist.  Die Pins RxD und TxD werden entgegen der  realen  CPU
  526.     nicht verändert. Auch dort würde übrigends das Latch von P3.1 beim
  527.     Senden nicht verändert, da das Senden über die alternative Funkti-
  528.     on von P3.1 erfolgt.
  529.  
  530.     ---> weiteres zur seriellen Simulation siehe 5.15 [F7] (Seite 27)
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.                           9
  539.  
  540.     4. Bedienung von SIM51:
  541.     -----------------------
  542.  
  543.  
  544.     4.1 ----- Start von SIM51:
  545.  
  546.     SIM51 kann auf drei Arten gestartet werden:
  547.  
  548.          SIM51              ohne Parameter
  549.  
  550.          SIM51 filename     der angebenen File wird geladen
  551.          SIM51 $filename    $ vorrangestellt = BIN-File laden
  552.  
  553.          SIM51 @keyFile     die in dem angegeben File enthaltenen Be-
  554.                 fehle werden nach dem Start abgearbeitet.
  555.                 (siehe Eingabe-Lern-Modus XT,XS,XW,XT)
  556.  
  557.  
  558.     Beim  Starten  ließt  SIM51  automatisch  die  Konfigurationsdatei
  559.     SIM51.CFG,  falls sie  im  aktuellen  Verzeichnis  vorhanden  ist.
  560.     SIM51.CFG  ist  bei der Auslieferung nicht auf der Disk enthalten.
  561.     Der Anwender kann sie selbst erstellen lassen  durch  Eingabe  von
  562.     'k'  bzw.  'KB',  um die momentane Einstellung von SIM51 abzuspei-
  563.     chern (siehe: sichere Konfiguration).  Beim Updaten einer  älteren
  564.     Version von SIM51,  bzw.  nachdem der Konfigurationsfile SIM51.CFG
  565.     verändert wurde,  bringt SIM51 eine Fehlermeldung.  Dies ist  kein
  566.     Grund  zur  Beunruhigung,  SIM51  arbeitet  wie bisher,  lediglich
  567.     SIM51.CFG muß neu erstellt werden.
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.     4.2 ----- Befehlseingabe:
  575.  
  576.     SIM51 wird über Tastatur-Eingaben gesteuert.  Es  gibt  Ein-Tasten
  577.     Befehle,  und solche, die in der "Command-Line" eingegeben werden.
  578.     Es wurde besonderes Augenmerk auf eine einfache und  schnelle  Be-
  579.     dienung gelegt.
  580.  
  581.  
  582.     Command-Line-Befehle  werden  mit  der Return-Taste eingeben.  Sie
  583.     können editiert werden,  und über die F3-Taste können zuvor einge-
  584.     gebene  Befehle  in die Command-Line zurückgeholt werden.  Es wird
  585.     meist nur ein Kennbuchstabe verwendet. Eine kurze Befehlsübersicht
  586.     ist über die [F4] (Help) einblendbar.
  587.  
  588.  
  589.     Ein-Tasten Befehle werden verwendet, zum Öffnen von Fenstern,  und
  590.     für  oft  benötigte Befehle.  Belegt sind die Funktionstasten [F1]
  591.     bis [F7].  Am unteren Rand des Bildschirms  ist  eine  Menueleiste
  592.     eingeblendet mit Informationen zu aktuell verfügbaren Eintastenbe-
  593.     fehlen. Dazu zählt auch der Wechsel in andere Fenster (Alt-?), ob-
  594.     wohl  dies  eigentlich zwei Tasten betrifft,  die gleichzeitig ge-
  595.     drückt werden müssen.
  596.  
  597.  
  598.                           10
  599.  
  600.     4.3 ----- Editieren von Command-Line-Befehlen:
  601.  
  602.      [F3]      holt den zuletzt eingegebenen Befehl in die Eingabe-
  603.            zeile zurück. Durch nochmaliges Drücken den Befehl
  604.            davor usw.
  605.  
  606.      [ESC]     löscht die Eingabezeile
  607.  
  608.      [INS]     schaltet zwischen Einfüg-Modus und Überschreib-Modus
  609.            um. (default: Einfüg-Modus). Im Einfüg-Modus werden
  610.            Zeichen, die rechts vom Cursor stehen - inclusive des
  611.            Zeichens unter dem Cursor - bei der Eingabe eines wei-
  612.            teren Zeichens nach rechts geschoben.
  613.  
  614.      [BS]      löscht das Zeichen links vom Cursor, und der Rest der
  615.            Eingabezeile rückt nach links auf.
  616.  
  617.      [DEL]     löscht das Zeichen unter dem Cursor, und der Rest der
  618.            Eingabezeile rückt nach links auf.
  619.  
  620.      [HOME]    der Cursor springt an den Anfang der Eingabezeile.
  621.  
  622.      [END]     der Cursor springt an das Ende der Eingabezeile.
  623.  
  624.      [LEFT]    der Cursor wird um ein Zeichen nach links gesetzt.
  625.  
  626.      [RIGHT]   der Cursor wird um ein Zeichen nach rechts gesetzt
  627.  
  628.      [CR]      übernimmt die Eingabezeile in den Befehls-Dispatcher.
  629.  
  630.  
  631.     Wird nach einem Leerzeichen ein weiteres  Leerzeichen  eingegeben,
  632.     so wird dies ignoriert.
  633.  
  634.  
  635.  
  636.  
  637.  
  638.     4.4 ----- Fehler-Meldungen:
  639.  
  640.     Erkennt  der  Befehls-Dispatcher einen Eingabe-Fehler,  so erfolgt
  641.     eine Fehlermeldung,  und  der  Cursor  zeigt  die  Stelle  in  der
  642.     Eingabe-Zeile, an der sich der Syntax-Fehler befindet.
  643.  
  644.     Auch andere Programm-Teile geben Fehlermeldungen aus.
  645.  
  646.  
  647.     Fehler-Meldungen  werden in der Zeile unter der Command-Line ange-
  648.     zeigt (blinkend hell).  Sie sind solange sichtbar,  bis eine Taste
  649.     gedrückt wird.  Die Funktion dieser Taste wird anschließend ausge-
  650.     führt.
  651.            Ausnahme: Wird bei einer  Fehlermeldung  die  Return-Taste
  652.     [CR] oder die [ESC]-Taste gedrückt, wird deren Funktion nicht aus-
  653.     geführt,  sondern nur die Fehlermeldung gelöscht.  Der fehlerhafte
  654.     String bleibt dann in der Command-Line stehen und kann  so  korri-
  655.     giert werden.
  656.  
  657.  
  658.                           11
  659.  
  660.     Tritt während  *** execute ***  ein Fehler auf, macht das Programm
  661.     nach dem Drücken von [ESC] anschließend weiter.  Wird dagegen [F5]
  662.     gedrückt, so stoppt die Befehlsabarbeitung.
  663.  
  664.  
  665.  
  666.  
  667.  
  668.     4.5 ----- Editieren anderer Fenster:
  669.  
  670.     Der Wechsel in andere Fenster erfolgt mit einem Ein-Tasten-Befehl.
  671.     Man drückt dazu gleichzeitig die ALT-Taste und einen  Kennbuchsta-
  672.     ben für das Fenster:
  673.  
  674.       d  ---> DATA-Fenster (Spezial Funktion Register der CPU)
  675.       i  ---> IDATA-Fenster
  676.       x  ---> XDATA-Fenster
  677.       c  ---> CODE-Fenster
  678.       t  ---> Terminal-Simulation-Fenster
  679.       r  ---> Register-Fenster
  680.       s  ---> Stack-Fenster
  681.       p  ---> Ports-Fenster
  682.       o  ---> pOinter-Fenster
  683.       f  ---> Flags-Fenster
  684.  
  685.  
  686.     Zurück  in  die  Command-Line  gelangt man aus jedem Fenster durch
  687.     Drücken von Carriage Return.
  688.  
  689.  
  690.     In den einzelnen Fenstern können alle leuchtend dargestellten Wer-
  691.     te editiert werden.  Erlaubt sind nur die  Eingabe  von  Hexwerten
  692.     (bzw.  0  oder 1 bei Bits).  Der Cursor kann mit den Keypad-Tasten
  693.     [LEFT], [RIGHT], [UP], [DOWN], [HOME] und [END] bewegt werden (bei
  694.     jedem Fenster nur die sinnvolle Richtungen aus obigen).
  695.  
  696.  
  697.     Mit der [TAB]-Taste kann bei IDATA,  XDATA und CODE zwischen ASCII
  698.     und HEX Darstellung hin- und hergesprungen werden.  Beim DATA- und
  699.     PORT-Fenster wird mit dem [TAB] zwischen Bit- und Byte-Darstellung
  700.     gewechselt. Denn, wird der Cursor innerhalb des DATA-Fensters auf-
  701.     und abbewegt und zeigt auf ein SFR,  dessen einzelne BIT's von be-
  702.     sonderen  Interesse  sind,  so  wird ein kleines Zusatzfensterchen
  703.     eingeblendet,  das die einzelnen Bits darstellt und dessen  Inhalt
  704.     ebenfalls editiert werden kann.  Neben der [TAB] Taste gelangt man
  705.     auch mit [LEFT] in diese "Bit-Fenster".
  706.  
  707.  
  708.     Im Fenster oben kann nur einer der folgenden Bereiche  dargestellt
  709.     werden: entweder IDATA,  XDATA, CODE oder Terminal-Tx. Der zuletzt
  710.     gewählte Bereich (vor Drücken von Carriage Return) bleibt  in  der
  711.     Anzeige.  Das  Tx-Fenster  kann nicht editiert werden,  der Cursor
  712.     springt deshalb gleich wieder zurück  in  die  Command-Line.  Hier
  713.     werden die Daten dargestellt,  die über die serielle Schnittstelle
  714.     des 8051 von der Software gesendet wurden  (Terminal-Simulation  -
  715.     siehe F7-Fenster).
  716.  
  717.  
  718.                           12
  719.  
  720.     4.6 ----- Befehlsübersicht:
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.     Eintasten-Befehle:
  728.  
  729.       [F1]   Instruktion Step  - Einzel-Schritt Befehlsabarbeitung
  730.       [F2]   Procedure Step    - wie [F1] jedoch CALLs komplett
  731.       [F3]   last Command      - Letzter Befehl in Eingabezeile
  732.       [F4]   Help              - Fenster mit Hilfs-Text einblenden
  733.       [F5]   Set Break         - Fenster zum Setzen von Break-Punkten
  734.       [F6]   Memory-Mapping    - Fenster zur Konfiguration
  735.       [F7]   Serieller I/O     - Fenster für seriell Port Simulation
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.     Command-Line-Befehle:
  745.  
  746.      a                        - Assembleraufruf
  747.      c tadr1-adr2,tadr3       - Vergleiche Speicherbereiche
  748.      d adr                    - Zeige Code ab Adresse (Debug Start)
  749.      f tadr1-adr2, byte       - Fülle Memory
  750.      g adr1, adr2             - starte Befehls-Simulation (Go)
  751.      gS adr1, adr2            - starte Befehls-Simulation (Go Slow)
  752.      k                        - sichere Konfiguration von SIM51
  753.      kB                       - sichere Konfig. und Break-Punkte
  754.      l file                   - Lade Code aus HEX- oder ABSOLUT-File
  755.      lb file                  - Lade Code aus BIN-File
  756.      m xx                     - Setze Mode: 8051, 8052 oder 8044
  757.      o tadr1-adr2, tadr3      - kOpiere Speicherbereich
  758.      pD adr1-adr2, file       - schreibe Disassembierten Code in File
  759.      pH tadr1-adr2, file      - schreibe HEX-Dump in File
  760.      q                        - zurück zu MSDOS (Quit)
  761.      r                        - Reset 8051 CPU
  762.      s tadr, xx               - suche nach String oder Byte
  763.      wH adr1-adr2, file       - schreibe Code als HEX-File
  764.      wA adr1-adr2, file       - schreibe Code als ABSOLUT-File
  765.      wB adr1-adr2, file       - schreibe Code als BINÄR-File
  766.      xT                       - starte Eingabe-Learn Modus (teach)
  767.      xS                       - stoppe Eingabe-Learn Modus
  768.      xW file                  - schreibe Eingabe-Learn Buffer in File
  769.      xX <file>                - führe Eingaben aus Learn Buffer aus
  770.      zS                       - Zyklus-Zähler starten und rücksetzen
  771.      zE                       - Zyklus-Zähler beenden (ausblenden)
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.                           13
  779.  
  780.     5. Befehle, Ausführlich:
  781.     ------------------------
  782.  
  783.     5.1 ----- Laden von Code
  784.  
  785.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  786.           █ l file                         █
  787.           █ lb file                        █
  788.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  789.  
  790.  
  791.     Für "file" wird dabei der Name des Files, der den zu ladenden Code
  792.     enthält angegeben (mit Extension). Befindet sich der File nicht in
  793.     der  aktuellen Direktory,  so ist die Pfadangabe (nach DOS-Regeln)
  794.     voranzustellen.   Beim  Aufruf  mit  L  wird  ein  Intel-Hex  oder
  795.     -Absolut-File und beim Aufruf mit LB wird ein Binär-File erwartet.
  796.  
  797.     Alternativ  können Files auch über ein Auswahlfenster geladen wer-
  798.     den.  Dazu wird der Ladeaufruf mit Jokerzeichen (*  und  ?),  oder
  799.     einfach nur l bzw. lb eingegeben. Die Verwendung des Jokerzeichens
  800.     muß nach den MSDOS Regeln gehandhabt werden.
  801.  
  802.  
  803.     Beispiele für erlaubte Aufrufe:
  804.  
  805.        l meinProg.hex      ; direkt geladen, wenn in aktueller DIR
  806.        l *.*               ; Auswahlfenster mit allen Files der ak-
  807.                  tuellen DIR
  808.        l                   ;  .... dasselbe wie l *.*
  809.        l a:*.*             ; Auswahlfenster: aktuelle DIR auf Disk A:
  810.        l c:\*.*            ; Auswahlfenster mit Stamm-DIR auf Disk C:
  811.        l \asm51\*.hex      ; Auswahlfenster: alle HEX-Files in \asm51
  812.        l ..\*.abs          ; Auswahlfenster: alle ABS-Files in vori-
  813.                  ger DIR
  814.  
  815.  
  816.     In dem Auswahlfenster werden alle passenden Files,  Unterverzeich-
  817.     nisse und weitere vorhandene Laufwerke  dargestellt.  Verzeichnis-
  818.     Namen  werden  in  großen  Buchstaben dargestellt und Filenamen in
  819.     Kleinen. ".." steht für voriges Verzeichnis.
  820.  
  821.     Mit den Cursor-Tasten kann ein File,  Unterverzeichnis oder  Lauf-
  822.     werk angewählt werden. Mit der Carriage Return Taste [CR] wird ein
  823.     angewählter File in die Eingabezeile übernommen und geladen.  Wird
  824.     die Escape Taste [ESC] gedrückt, so wird die Auswahl abgebrochen.
  825.  
  826.     Ist ein Unterverzeichnis angewählt,  so wird mit der Carriage  Re-
  827.     turn  Taste  in das Unterverzeichnis gewechselt und der Inhalt des
  828.     Unterverzeichnisses ins Auswahlfenster geladen.  Der Pfad auf die-
  829.     ses  nun dargestellte Unterverzeichnis wird oben im Auswahlfenster
  830.     angezeigt.  Genauso kann zu einem anderen Laufwerk gewechselt wer-
  831.     den.
  832.  
  833.     Über der Eingabezeile steht weiterhin der Pfad,  von dem aus SIM51
  834.     geladen wurde. Über dem Auswahlfenster steht der Pfadname des Ver-
  835.     zeichnisses, aus dem der File geladen wird. Nach der Übernahme des
  836.     Files oder einem Abbruch wird wieder der SIM51-Pfad eingestellt.
  837.  
  838.                           14
  839.  
  840.     ladbarer Code:
  841.     --------------
  842.     Der zu ladende File sollte assemblierten Code für den  8051  (oder
  843.     andere CPU's der 8051 Familie) in ABSOLUT-, HEX- oder BINÄR-Format
  844.     enthalten. SIM51 erkennt selbst, ob es sich um einen ABSOLUT- oder
  845.     HEX-File handelt (ausgewertet wird das 1.  Zeichen).  Ist es weder
  846.     ein HEX- oder ABSOLUT-File, wird dies beim Laden später als Fehler
  847.     interpretiert.  Wurde der Lader mit "lb" aufgerufen,  so wird  der
  848.     File als BINÄR-File eingelesen.
  849.  
  850.  
  851.  
  852.     Intel-HEX-Format  wird  zur  Datenübertragung  bei  vielen  EPROM-
  853.     Programmiergeräten verwendet.  Es  enthält  zeilenweise  Code  als
  854.     ASCII-Zeichen in folgender Darstellung:
  855.  
  856.           :zzAAAAtthhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhcc
  857.  
  858.     Jede  Zeile  wird eingeleitet durch ein ":" (Startzeichen für Zei-
  859.     le). Danach folgen Bytes in ASCII-HEX Darstellung:
  860.  
  861.            zz   = Anzahl der Code-Bytes in dieser Zeile
  862.            AAAA = Adresse des ersten Code-Bytes in dieser Zeile
  863.            tt   = Typ (00 = Code-Bytes in Zeile oder 01 = Ende-Flag)
  864.            hh   = einzelne Hex-Bytes
  865.            cc   = Check-Summe über diese Zeile
  866.  
  867.  
  868.  
  869.     Ein Intel-ABSOLUT-File besteht aus einer Aneinanderreihung von Re-
  870.     cords. Dieses Format wird vom ASM51-Assembler und C51-Compiler bei
  871.     allen Objekt-Dateien, Libaries und Absolut-Files verwendet.
  872.  
  873.  
  874.     Ein Record hat folgenden Aufbau:
  875.          ┌─────┬──────────┬────────────────────┬─────┐
  876.          │ Typ │  Length  │   ...  body  ...   │ CHK │
  877.          └─────┴──────────┴────────────────────┴─────┘
  878.  
  879.     Jeder Record schließt sich direkt an den Vorigen  an.  Der  Aufbau
  880.     des  Recordbody  ist je nach Record-Typ verschieden.  SIM51 wertet
  881.     folgende Record-Typen aus:
  882.  
  883.          02     Modul-Start (Kennung, daß für 8051-Familie)
  884.          04     Modul-End
  885.          06     dieser Record enthält Code in binärer Form
  886.  
  887.  
  888.  
  889.     Ein BINÄR-File enthält Code in der Form,  in der er  auch  in  den
  890.     Programmspeicher  geladen wird.  Der Offset im File entspricht der
  891.     Adresse im EPROM. Steht nur Code nahe der Adresse 0000, so ist der
  892.     File sehr kompakt.  Stünde in dem File  nur  Code  für  eine  hohe
  893.     Adresse,  so  müßten  alle niedereren Adressen mit 0FFh aufgefüllt
  894.     sein.
  895.  
  896.  
  897.  
  898.                           15
  899.  
  900.     Zur Erstellung eines Programms wird  üblicherweise  ein  Assembler
  901.     verwendet.  Professionelle  Assembler wie der ASM51 von Intel ver-
  902.     wenden getrennte Compiler und Linker:
  903.  
  904.          In einem ersten Schritt wird ein Objekt-File erstellt.
  905.  
  906.          Es folgt ein zweiter Schritt,  in dem der Objekt-File zu ei-
  907.          nem  Absolut-File  gelinkt  wird.  Es  können  auch  mehrere
  908.          Objekt-Files zusammengelinkt werden (für  modulare  Program-
  909.          mierung).
  910.  
  911.          Der  Absolut-File kann von vielen Anwendungen bereits direkt
  912.          geladen  werden.   Er  kann  neben  dem  Code  auch   Debug-
  913.          Informationen wie SFR-Definitonen enthalten.
  914.  
  915.          Viele  EPROM-Programmer  benötigen  jedoch Code im HEX- oder
  916.          BINÄR-Format.  Deshalb folgt dem Linken oft noch ein dritter
  917.          Schritt,  in  dem  der Absolutfile in einen HEX-File konver-
  918.          tiert wird.
  919.  
  920.  
  921.  
  922.     Professionelle Assembler kosten natürlich einiges,  es  gibt  aber
  923.     auch auf dem Sharewaremarkt einige Assembler für den 8051:
  924.  
  925.     ASM51  - Assembler von Intel mit RL51 = Linker, OH51 = Konverter
  926.     A51    - Assembler von Keil mit L51 = Linker, OHS51 = Konverter
  927.     C51  - C-Compiler von Keil GmbH, Kiem-Pauli-Weg 11, 8014 Neubiberg
  928.     ASS51  - Assembler (Shareware) von Wolfgang Spindler, Sputendorfer
  929.            Straße 7, 1501 Schenkenhorst (Dok. in Deutsch!!)
  930.     TASM   - Table-Assembler von Thomas N Anderson, Speech Technology
  931.                Inc., 837 Front Street South, Issaquah, WA 98027
  932.     A51    - Assembler (Shareware) von PseudoCorp, 716 Thimble Shoals
  933.                Blvd. Suite E, Newport News, VA 23606 (Englisch)
  934.     EASM51 - Assembler zum Lehrgang der Zeitschrift elektor
  935.  
  936.  
  937.     Der von dem C-Compiler erzeugte Objekt-File  kann  mit  jenen  der
  938.     A51- und ASM51-Assembler zusammengelinkt werden (kompatibel). Auch
  939.     verwenden der A51 und der ASM51 dieselbe Syntax im Source-File.
  940.  
  941.     Der ASS51 ist ein deutsches Sharewareprodukt! Erstellt werden Hex-
  942.     Files. Deutsche Dokumentation !!!
  943.  
  944.     Der  TASM  verwendet  eine etwas abweichende Syntax und kann keine
  945.     Objekt und Absolutfiles erstellen,  sondern nur  HEX-  und  Binär-
  946.     Files, dafür ist er aber wesentlich billiger. Die Anleitung ist in
  947.     Englisch. Der TASM ist auf dem Sharewaremarkt sehr bekannt,  da er
  948.     auch für andere  8-Bit Rechner wie den  Z80, 6502, 8048, 8085, ...
  949.     verwendtbar ist.
  950.  
  951.     Der  EASM51 erstellt einen eigen definierten HEX-Code.  Der EASM51
  952.     ist jedoch sehr günstig. Auf der SIM51-Diskette befindet sich dazu
  953.     von mir ein kleines Konvertierprogramm  EHEX.EXE, das den  EASM51-
  954.     HEX-File in einen Intel-HEX-File umwandelt.
  955.  
  956.  
  957.  
  958.                           16
  959.  
  960.     5.2 ----- Direktory-View
  961.  
  962.     Die  Lader-Funktion  kann  auch zum Anschauen einer beliebigen Di-
  963.     rektory verwendet werden, ohne SIM51 verlassen zu müssen.  Es wird
  964.     einfach
  965.  
  966.        l        eingegeben.
  967.  
  968.     Im  Auswahlfenster  wird  damit der Inhalt der aktuellen Direktory
  969.     angezeigt.  Es kann natürlich auch in Unterverzeichnisse  oder  zu
  970.     anderen Laufwerken gewechselt werden.  Das Auswahlfenster ist dar-
  971.     aufhin mit [ESC] zu verlassen.
  972.  
  973.  
  974.  
  975.  
  976.     5.3 ----- Editieren der 8051 Speicherbereiche
  977.  
  978.     Die Speicherbereiche des 8051 (IDATA,  XDATA und CODE)  können  in
  979.     den  jeweiligen  Fenstern direkt editiert werden,  das heißt,  der
  980.     dort angezeigte Wert kann durch einen neuen HEX-Wert überschrieben
  981.     werden.
  982.  
  983.     Mit ALT-I, ALT-X oder ALT-C wird dazu in das entsprechende Fenster
  984.     gewechselt. Mit den Cursor-Tasten und [End], [Home] und [Tab] kann
  985.     der Cursor zu der zu ändernden Stelle bewegt werden.
  986.  
  987.  
  988.     Wird ein neuer Wert für die links stehende Adresse eingegeben,  so
  989.     werden dadurch noch keine Daten geändert,  sondern es wird nur der
  990.     gewählte Adress-Bereich eingeblendet. Für einem IDATA-Bereich kön-
  991.     nen nur solche Adresswerte eingegeben werden, die in der gewählten
  992.     CPU verfügbar sind.  In der Mitte kann eine  Speicherstelle  durch
  993.     eingeben  eines  neuen Hexwertes geändert werden,  und ganz rechts
  994.     kann Text in ASCII-Darstellung eingegeben werden.
  995.  
  996.  
  997.     Der Bereich,  der beim Verlassen des Fensters mit  Carriage-Return
  998.     (oder ALT-D F S R P O) aktiv  war,   bleibt in der Anzeige.  Diese
  999.     Einstellung kann auch in SIM51.CFG  für  den  nächsten  Start  von
  1000.     SIM51 gespeichert werden (siehe Konfiguration).
  1001.  
  1002.  
  1003.     Den  Code-Bereich  wird  man sinnvoll nicht im CODE-Fenster ändern
  1004.     sondern über den integrierten Assembler (siehe Assembler).  Es sei
  1005.     denn,  man möchte eine Tabelle oder ASCII-Text einfügen. Üblicher-
  1006.     weise wird Code jedoch aus einem zuvor assemblierten File  geladen
  1007.     (siehe laden von Code)
  1008.  
  1009.  
  1010.     Ist ein XDATA-Bereich einem anderen XDATA-Bereich,  bzw. ein CODE-
  1011.     Bereich einem anderen CODE-Bereich oder  einem  XDATA-Bereich  zu-
  1012.     geordent,  so werden durch Editieren einer Speicherstelle alle zu-
  1013.     geordneten Bereiche geändert. Ist einem XDATA-Bereich ein Festwert
  1014.     zugeordnet,  so kann dieser Bereich nicht editiert werden (Fehler-
  1015.     meldung).
  1016.  
  1017.  
  1018.                           17
  1019.  
  1020.     5.4 ----- füllen
  1021.  
  1022.     Mit  dem "füllen" - Befehl können ganze Speicherbereiche mit einem
  1023.     angegebenen Byte gefüllt werden:
  1024.  
  1025.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1026.           █ f tadr1-adr2, byte             █
  1027.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1028.  
  1029.  
  1030.     wobei
  1031.  
  1032.        t     - den Speicherbereich kennzeichnet: x=XDATA, i=IDATA,
  1033.              c=CODE.
  1034.  
  1035.        adr1  - ist die Adresse des ersten zu überschreibende Bytes.
  1036.              (HEX-Zahl!)
  1037.  
  1038.        adr2  - ist die Adresse des letzten zu überschreibenden Bytes.
  1039.            adr2 muß größer oder gleich adr1 sein.
  1040.  
  1041.        byte  - ist der Hexwert, mit dem gefüllt werden soll
  1042.  
  1043.  
  1044.     Beispiel:    f i20-7F, 00      ; fülle IDATA von 20h bis 7Fh mit 0
  1045.  
  1046.  
  1047.  
  1048.  
  1049.     5.5 ----- kopieren
  1050.  
  1051.     Speicherbereiche können mit folgenden  Befehl  auf  einen  anderen
  1052.     Speicherbereich kopiert werden:
  1053.  
  1054.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1055.           █ o tadr1-adr2, byte             █
  1056.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1057.  
  1058.  
  1059.     wobei
  1060.  
  1061.        t     - den Speicherbereich kennzeichnet: x=XDATA, i=IDATA,
  1062.            c=CODE. Quell- und Ziel-Bereich dürfen dabei verschie-
  1063.            denen Typs sein.
  1064.  
  1065.        adr1  - ist die Adresse des ersten Quell-Bytes. (HEX-Zahl!)
  1066.  
  1067.        adr2  - ist die Adresse des letzten Quell-Bytes. adr2 muß
  1068.            größer oder gleich adr1 sein
  1069.  
  1070.        adr3  - ist die Ziel-Adresse für das erste Byte. Ist (adr2 -
  1071.            adr1) größer als (Memory-Top - adr3), so werden nur
  1072.            Bytes bis Memory-Top kopiert, der Rest wird ignoriert.
  1073.  
  1074.  
  1075.     Beispiel:    o i20-7F, x0     ; kopiere IDATA von 20h bis 7Fh nach
  1076.                      ; XDATA 0000h bis 005Fh)
  1077.  
  1078.                           18
  1079.  
  1080.     5.6 ----- suchen
  1081.  
  1082.  
  1083.  
  1084.     Ein  Speicherbereich  wird  nach einem Byte oder String durchsucht
  1085.     durch Eingabe folgenden Befehls:
  1086.  
  1087.  
  1088.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1089.           █ s tadr, ??                     █
  1090.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1091.  
  1092.  
  1093.  
  1094.     wobei
  1095.  
  1096.        t      - den Speicherbereich kennzeichnet: x=XDATA, i=IDATA,
  1097.             c=CODE.
  1098.  
  1099.        adr    - ist die Adresse für Suchen-Start. (HEX-Zahl!)
  1100.  
  1101.        ??     - hier steht ein Byte (HEX-Zahl), nach dem gesucht wer-
  1102.             den soll. Es können auch mehrere Bytes angegeben wer-
  1103.             den, die durch Kommas voneinander getrennt sind. Oder
  1104.             es wird ein String (in Hochkommas) eingegeben. Es
  1105.             sind auch gemischte Eingaben zulässig.
  1106.  
  1107.  
  1108.  
  1109.  
  1110.     Wird das Byte oder der String gefunden,  so wird er in dem zu  dem
  1111.     beim Aufruf angegebenen Typ gehörenden Fenster (IDATA,  XDATA oder
  1112.     CODE) an erster Position dargestellt.  Der String muß dabei  exakt
  1113.     passen (Groß-/Kleinbuchstaben).
  1114.  
  1115.  
  1116.     Beispiele:
  1117.      s c0, AA,55           ;suche im Code nach AAh 55h
  1118.      s c918, 'Copyright'   ;suche im Code ab Adresse 918h nach String
  1119.      s x0000,'end',0D,0A   ;suche in XDATA nach String, dem 0Dh 0Ah
  1120.                 folgen
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127.  
  1128.  
  1129.  
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138.                           19
  1139.  
  1140.     5.7 ----- vergleichen
  1141.  
  1142.  
  1143.  
  1144.     Ein Speicherbereich kann mit einem Anderen verglichen werden. Dazu
  1145.     wird eingegeben:
  1146.  
  1147.  
  1148.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1149.           █ c tadr1 - adr2, tadr3          █
  1150.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1151.  
  1152.  
  1153.  
  1154.     wobei
  1155.  
  1156.        t      - den Speicherbereich kennzeichnet: x=XDATA, i=IDATA,
  1157.             c=CODE. Die zu vergleichenden Bereiche können ver-
  1158.             schiedenen Typs sein.
  1159.  
  1160.        adr1   - ist die Start-Adresse des ersten Bereichs. (HEX-Zahl)
  1161.  
  1162.        adr2   - ist die letzte Adresse des ersten Bereichs. Wird adr2
  1163.             nicht angegeben, so vergleiche bis Top of Memory.
  1164.  
  1165.        adr3   - ist die Start-Adresse des zweiten Bereichs. Vergleich
  1166.             natürlich auch nur bis Top of Memory des zweiten Be-
  1167.             reichs.
  1168.  
  1169.  
  1170.  
  1171.  
  1172.     Wurde  ein  Unterschied festgestellt,  so stoppt der Vergleich und
  1173.     das verschiedene Byte wird als erstes Byte in dem Fenster  (IDATA,
  1174.     XDATA oder CODE) des ersten angegebenen Typs angezeigt.
  1175.  
  1176.  
  1177.     Beispiele:
  1178.        c x0-2FF, c7000      ; vergleiche XDATA von 0000h bis 02FFh
  1179.                   mit CODE 7000h bis 72FFh
  1180.  
  1181.        c i0, x100           ; vergleiche IDATA 00 bis IDATA-Top mit
  1182.                   XDATA ab 0100h)
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.                           20
  1199.  
  1200.     5.8 ----- CPU-Typ wählen
  1201.  
  1202.     Die  CPU-Typen  8051,  8052 und 8044 werden von SIM51 speziell mit
  1203.     ihren SFR (Register für Spezielle Funktionen)  unterstützt.  SIM51
  1204.     wird dazu mit den Mode-Befehl für die gewählte CPU konfiguriert:
  1205.  
  1206.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1207.           █ m ??                           █
  1208.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1209.  
  1210.  
  1211.     wobei:
  1212.          "m 51"         - wählt 8051 Mode
  1213.          "m 52"         - wählt 8052 Mode
  1214.          "m 44"         - wählt 8044 Mode
  1215.  
  1216.     Mit  dem Mode-Befehl wird der Bildschirm neu aufgebaut und ein Re-
  1217.     set durchgeführt.  Bereits geladener Code wird  jedoch  nicht  ge-
  1218.     löscht. Der Zyklus-Zähler wird gemäß dem Eintrag in SIM51.CFG ein-
  1219.     oder ausgeblendet, und falls aktiv, zurückgesetzt.
  1220.  
  1221.     Im  DATA-Fenster werden die für die aktuelle CPU gültigen SFR dar-
  1222.     gestellt.
  1223.  
  1224.     Der IDATA-Breich wird auf die für die gewählte CPU typische  Größe
  1225.     begrenzt.
  1226.           128 Byte      00 ... 7Fh       für 8051
  1227.           192 Byte      00 ... 0BFh      für 8044
  1228.           256 Byte      00 ... 0FFh      für 8052
  1229.  
  1230.  
  1231.     Zur Simulation einer anderen CPU (z.B. 80535) gibt man am zweckmä-
  1232.     ßigsten  m  52 ein um 256 Byte für den IDATA-Bereich zu aktivieren
  1233.     (siehe auch simulierte CPU's).
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239.     5.9 ----- reset
  1240.  
  1241.     Mit dem Befehl  "r"  wird ein Reset durchgeführt.
  1242.  
  1243.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1244.           █ r                              █
  1245.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1246.  
  1247.  
  1248.       der Instruktion Pointer wird mit 0000 geladen
  1249.       die SFR werden mit 00 geladen (soweit bei Reset initialisiert)
  1250.       der SP wird mit 07 geladen.
  1251.       die Interrupt-Logik wird zurückgesetzt.
  1252.       die serielle Logik wird zurückgesetzt.
  1253.       der Zyklus-Zähler wird auf 00000000 zurückgesetzt (wenn aktiv)
  1254.  
  1255.       IDATA, XDATA und CODE Bereiche werden nicht gelöscht.
  1256.       Nach dem Reset werden alle Bildschirm-Fenster aktuallisiert.
  1257.  
  1258.                           21
  1259.  
  1260.     5.10 ----- Debug-Start setzen
  1261.  
  1262.  
  1263.     Der folgende Befehl setzt den Instruktion-Pointer auf einen  neuen
  1264.     Wert:
  1265.  
  1266.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1267.           █ d adr                          █
  1268.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1269.  
  1270.  
  1271.     wobei:
  1272.        adr  -  ist die neue Adresse, mit der der InstPtr zu laden ist
  1273.  
  1274.  
  1275.  
  1276.     Beim nächsten Debug Befehl (ISTEP, PSTEP, Go) wird als nächste die
  1277.     eingegebene  und  nun  im Disassembler-Fenster invers dargestellte
  1278.     Code-Adresse abgearbeitet.  So können  also  Befehle  übersprungen
  1279.     werden,  ohne sie auszuführen.  Dasselbe könnte auch erreicht wer-
  1280.     den,  indem im POINTER-Fenster  der  Instruktion-Pointer  editiert
  1281.     wird.
  1282.  
  1283.  
  1284.  
  1285.  
  1286.     Sollen innerhalb des Codes an einer bestimmten Stelle nur einzelne
  1287.     Instruktionen übersprungen werden,  so kann einfach nur die Cursor
  1288.     [DOWN] Taste gedrückt werden.  Der Instruktion  Pointer  wird  wie
  1289.     sonst beim ISTEP auf die nächste Instruktion gesetzt, ohne die ak-
  1290.     tuelle Instruktion auszuführen.
  1291.  
  1292.  
  1293.  
  1294.  
  1295.     Im  Gegensatz  dazu kann mit der Cursor [UP] Taste der Instruktion
  1296.     Pointer eine Instruktion zurückgesetzt werden.  Dabei wird  jedoch
  1297.     nicht  die  im  Codespeicher  davor  liegende  Instruktion gesucht
  1298.     (rückwärts disassemblieren nicht möglich),  sondern aus einem  ei-
  1299.     gens  dafür installierten Buffer die zuvor durchlaufene Instrukti-
  1300.     on.  Durchlaufen heißt dabei,  daß die Instruktion zuvor angezeigt
  1301.     wurde (nicht nur im Go-Modus durchlaufen).
  1302.  
  1303.     Stand  der  Instruktion-Pointer  beispielsweise auf einem CALL und
  1304.     wurde dann ISTEP gedrückt,  so kommt man mit [UP]  wieder  zu  dem
  1305.     Aufruf des CALL's zurück (Returnadresse bleibt aber auf Stack, die
  1306.     Befehlsausführung wird nicht rückgängig).
  1307.  
  1308.     Der Codespur-Buffer faßt 256 Adressen.
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.                           22
  1319.  
  1320.     5.11 ----- Break-Punkte
  1321.  
  1322.  
  1323.  
  1324.     Mit  Drücken  der  [F5] - Taste wird ein Fenster geöffnet,  in dem
  1325.     Break-Punkte gesetzt werden können.
  1326.  
  1327.           █▀▀▀▀█
  1328.           █ F5 █
  1329.           █▄▄▄▄█
  1330.  
  1331.  
  1332.  
  1333.     Alle leuchtend dargestellten Eintragungen im Break-Fenster  können
  1334.     editiert  werden.  Es können bis zu 8 Break-Punkte gesetzt werden.
  1335.     Je Punkt sind folgende Eintragungen möglich:
  1336.  
  1337.  
  1338.  
  1339.          Nr.  Adr.   set  ist   Bedingung
  1340.           1   ....   ..   ..   .......... . ..........
  1341.  
  1342.  
  1343.       Adr.   ->  die Adresse, bei der ein Break erfolgen soll
  1344.  
  1345.       set    ->  die Anzahl des Auftretens der Break-Bedingung, nach
  1346.              der ein Break erfolgen soll.
  1347.  
  1348.       ist    ->  dieser Eintrag läßt sich nicht editieren, er wird
  1349.              jedoch beim Ändern des set-Wertes auf 00 gesetzt.
  1350.  
  1351.       Bedingung   -->  Zusatzbedingung, die neben der Breakadresse
  1352.                gelten muß, damit die Break-Bedingung erfüllt
  1353.                ist. Wenn nichts eingetragen wird, ist keine
  1354.                Zusatzbedingung gefordert.
  1355.  
  1356.  
  1357.  
  1358.  
  1359.  
  1360.  
  1361.     Breakbedingung:
  1362.     ---------------
  1363.     Wird bei der Programmabarbeitung im Go-Modus eine Breakadresse er-
  1364.     reicht,  ist der Break-Punkt aktiv (Set > 0) und die  Zusatzbedin-
  1365.     gung erfüllt, so wird der Ist-Wert erhöht. Ist danach der Ist-Wert
  1366.     gleich dem Set-Wert,  so ist die Breakbedingung erfüllt. Ein Break
  1367.     erfolgt, und der Ist-Wert wird wieder auf 00 gesetzt.
  1368.  
  1369.  
  1370.     Das heißt, die Programmabarbeitung wird angehalten,  und eine Mel-
  1371.     dung  erscheint auf dem Bildschirm,  die die Nummer des erreichten
  1372.     Break-Punktes angibt.  Nach  Quittierung  (siehe  Fehlermeldungen)
  1373.     verschwindet die Meldung wieder.
  1374.  
  1375.  
  1376.  
  1377.  
  1378.                           23
  1379.  
  1380.     Als  Zusatzbedingung  kann  der Vergleich zweier Operanten gesetzt
  1381.     werden. Sie werden angegeben durch eine Typ-Kennung und einen Hex-
  1382.     wert bzw. einer Mnemonic für ein SFR. Der Vergleich erfolgt auf
  1383.  
  1384.  
  1385.           <  kleiner,       >  größer,      =  gleich
  1386.  
  1387.  
  1388.  
  1389.     Als Typ-Kennungen werden dabei verwendet:
  1390.  
  1391.      i  =  IDATA       ; es folgt eine IDATA-Adresse
  1392.      x  =  XDATA       ; es folgt eine XDATA-Adresse
  1393.      d  =  DATA        ; es folgt eine DATA-Adresse
  1394.      b  =  BIT         ; es folgt eine BIT-Adresse
  1395.      #  =  IMMEDIATE   ; es folgt ein Festwert
  1396.      s  =  SFR         ; es folgt eine SFR-Mnemonic - DATA oder BIT
  1397.  
  1398.  
  1399.  
  1400.  
  1401.     Beispiele:
  1402.      0003  01 00  sINT1 = #1    ; Break bei Adresse 0003 wenn INT1=#1
  1403.  
  1404.      09FB  02 00  ..... . ..... ; Break bei Adresse 09FBh nach 2.Auf-
  1405.                       treten ohne Zusatz-Bedingung
  1406.  
  1407.      0B..  01 00  d20.. < sACC. ; Break bei Adresse 000Bh wenn DATA-
  1408.                       Adresse 20h kleiner als ACC ist.
  1409.  
  1410.  
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.                           24
  1439.  
  1440.     5.12 ----- Memory-Mapping:
  1441.  
  1442.  
  1443.     Mit Drücken der [F6] - Taste wird ein  Fenster  geöffnet,  in  dem
  1444.     Speicherbereiche Anderen zugeordnet werden können (mapping).
  1445.  
  1446.           █▀▀▀▀█
  1447.           █ F6 █
  1448.           █▄▄▄▄█
  1449.  
  1450.  
  1451.     Mit  Memory  Mapping kann die oft vorhandene Hardware-Option,  daß
  1452.     Speicherbereiche mehrfach decodiert sind,  RAM-Bereiche gar  nicht
  1453.     belegt  sind  oder  Code aus dem RAM abgearbeitet wird,  simuliert
  1454.     werden.
  1455.  
  1456.     Mehrfach decodiert heißt: einige RAM-Adressen werden über  mehrere
  1457.     CPU-Adressen  angesprochen,  wenn  ein kleineres RAM als 64kx8 ge-
  1458.     steckt wird und die CPU-Adressen  nicht  vollständig  ausdecodiert
  1459.     werden.
  1460.  
  1461.  
  1462.  
  1463.     Codeabarbeitung aus dem RAM kann auf realen Rechnerkarten erreicht
  1464.     werden,  indem  das  /RD  (Read  = XDATA-Lesesignal) und das /PSEN
  1465.     (Programm Speicher Enable = CODE-Lesesignal) über  ein  AND-Gatter
  1466.     verknüpft auf den /OE (Output Enable) Eingang eines RAM's geschal-
  1467.     ten werden. Dies ist nur sinnvoll in Verbindung mit einer Möglich-
  1468.     keit  Code  zu  laden  (beispielsweise  über die serielle Schnitt-
  1469.     stelle).  Dazu muß daneben natürlich ein CODE-Bereich  existieren,
  1470.     der von einem EPROM belegt ist und die Laderroutinen enthält.  Die
  1471.     Chip Selekts für das RAM und das EPROM müssen so decodiert werden,
  1472.     daß es keine Überschneidungen gibt.
  1473.  
  1474.  
  1475.  
  1476.     Die Möglichkeit einen CODE-Bereich einem XDATA-Bereich  zuzuordnen
  1477.     ergibt  in  der  aktuellen  Version von SIM51 nur dann einen Sinn,
  1478.     wenn ein zweiter PC vorhanden ist,  auf  dem  ein  Monitorprogramm
  1479.     istalliert  ist,  das  Code  über die serielle Schnittstelle laden
  1480.     kann.  Beide PC's werden dann über ein Null-Modem-Kabel  gekoppelt
  1481.     und  auf  dem SIM51 im [F7]-Fenster "Senden/Empfangen über PC-COM-
  1482.     Port" aktiviert (Achtung nicht zu schnell zuviel Daten senden).
  1483.  
  1484.     Der Lade-Befehl von SIM51 entspricht in seiner Konzeption dem Ein-
  1485.     stecken eines EPROM's.  Er ist von der Konzeption her  nicht  dazu
  1486.     gedacht,  einen Code,  der aus dem RAM abgearbeitet werden soll in
  1487.     den XDATA-Bereich zu laden.  Dennoch wird,  falls CODE  auf  einem
  1488.     XDATA-Bereich gemappt ist, auch der XDATA-Bereich mit dem Code ge-
  1489.     laden.  Es sei aber noch extra darauf hingewiesen, daß es kaum die
  1490.     Notwendigkeit gibt,  CODE- auf XDATA-Bereiche zu mappen,  und dann
  1491.     dennoch  zu  laden.  Anders sieht es aus,  wenn wirklich über eine
  1492.     Schnittstelle Code in den XDATA-Bereich geladen würde,  dann  kann
  1493.     Code-Mapping dazu dienen das so geladene Programm zu testen.
  1494.  
  1495.  
  1496.  
  1497.  
  1498.                           25
  1499.  
  1500.     Bereichen  des  XDATA-Speichers können feste Werte zugeordnet wer-
  1501.     den. Alle Schreibversuche auf diese Adresse führen zu keiner Ände-
  1502.     rung,  während beim Lesen der feste Wert zurückgegeben wird.  Dies
  1503.     entspricht  z.B.  einer  Nutzung  als IO-Bereich beim Einlesen von
  1504.     Jumperstellungen oder ähnlichem, oder der Option daß für einem Be-
  1505.     reich kein RAM gesteckt  ist  (Empfehlung:  #0FFh  zuordnen).  Ein
  1506.     Schreibversuch führt zu einer Fehlermeldung.  Wird ein Programm in
  1507.     Go-Modus abgearbeitet,  stoppt dazu die Abarbeitung  (weiter:  bei
  1508.     Quittierung mit [ESC], break: bei [F5]).
  1509.  
  1510.  
  1511.     Die  Einträge  in  die  Memory-Mapping  Tabelle für die XDATA- und
  1512.     CODE-Bereiche haben folgende Form:
  1513.  
  1514.          adr1 - adr2 -> tadr3
  1515.  
  1516.  
  1517.     wobei:
  1518.  
  1519.       adr1   - Startadresse des Bereichs, der zugeordnet werden soll.
  1520.  
  1521.       adr2   - letzte Adresse des Bereichs, der zugeordnet werden
  1522.            soll.
  1523.  
  1524.       t      - Typ auf den zugeordnet wird. (c=CODE, x=XDATA,
  1525.            #=Festwert)
  1526.  
  1527.      adr3    - Adresse des Grundbereichs, auf dem zugeordnet wird
  1528.            oder Byte (Konstante).
  1529.  
  1530.  
  1531.  
  1532.     XDATA-Bereiche können nur auf andere XDATA-Bereiche oder einen fe-
  1533.     sten  Wert  zugeordnet  werden.  CODE-Bereiche  auf  andere  CODE-
  1534.     Bereiche  oder  einem  XDATA-Bereich  (Festwert ergibt hier keinen
  1535.     Sinn,  da jeder Code in einem  EPROM  schon  einen  Festwert  dar-
  1536.     stellt).
  1537.  
  1538.  
  1539.  
  1540.     !Achtung:  Memory-Mapping  sollte vor dem Laden von Code erfolgen.
  1541.     Ansonsten wird eventuell zuvor schon geladener  Code  ausgeblendet
  1542.     (wird nicht in dem gemappten Grundbereich übertragen)!
  1543.  
  1544.  
  1545.  
  1546.     Beispiel:
  1547.  
  1548.      XDATA
  1549.        4000 - 7FFF -> x0000    ; mehrfach decodiert (RAM nur 16kx8)
  1550.        8000 - FFFF -> #0FF     ; unbelegt (A15 als Chip Select)
  1551.  
  1552.      CODE
  1553.        8000 - FFFF -> c0000    ; mehrfach decodiert (EPROM nur 32kx8)
  1554.  
  1555.  
  1556.  
  1557.  
  1558.                           26
  1559.  
  1560.     5.13 ----- Extern Access:
  1561.  
  1562.  
  1563.           █▀▀▀▀█    █▀▀▀▀█
  1564.           █ F6 █    █ F1 █
  1565.           █▄▄▄▄█    █▄▄▄▄█
  1566.  
  1567.  
  1568.  
  1569.     Die CPUs 8051,  8751,  8052,  8752,  8044, 8744 besitzen ein inte-
  1570.     griertes EPROM (bzw.  PROM),  jedoch kann über den Eingangspin /EA
  1571.     der  interne Programmspeicher abgeschaltet werden.  Damit wird der
  1572.     Code für alle Adressen extern gelesen,  wie bei  den  Typen  8031,
  1573.     8032 und 8344 ohnehin. Mit /EA=1 wird der Code nur für die Adresse
  1574.     0000...0FFF  bzw.  0000...1FFF  aus dem internen EPROM gelesen und
  1575.     für höhere Adressen von einem externen EPROM.
  1576.  
  1577.  
  1578.  
  1579.     Für die Programmierung des internen EPROM's  wird  ein  spezieller
  1580.     EPROMMER mit 40 poliger Fassung und Taktoszillator benötigt.  Dies
  1581.     ist relativ aufwendig,  so daß es  bei  der  Schaltungsentwicklung
  1582.     oder in Hobby-Bereich kaum eingesetzt wird.  Erst bei Serienferti-
  1583.     gung ist es von Interesse.
  1584.  
  1585.  
  1586.     Es gibt andererseits CPU's  mit  bereits  programmierten  internen
  1587.     EPROM. Diese Software wird als Firmware bezeichnet.
  1588.  
  1589.        - auf dem 8052AH:     BASIC - Interpreter
  1590.        - auf manchen 8051:   iRMX51 - Betriebssystem
  1591.        - auf 8044:           DCM44 = iRMX51 + RAC-Task (BITBUS)
  1592.  
  1593.  
  1594.  
  1595.     SIM51  unterstützt  die Option der internen Codeabarbeitung nicht,
  1596.     da der Code im internen Programmspeicher zwar vom Hersteller  ein-
  1597.     gebrannt wurde und somit festliegt, jedoch ist er urheberrechtlich
  1598.     geschützt.
  1599.  
  1600.     Der  Anwender  kann diese Programme,  soweit er sie besitzt selbst
  1601.     laden (aus einer CPU mit Hilfe eines kleinen Programm's  auslesen,
  1602.     oder als Absolut-File vom Hersteller beziehen).
  1603.  
  1604.  
  1605.  
  1606.     Im  Memory-Mapping  Fenster kann trotzdem mit der [F1] - Taste /EA
  1607.     zwischen 0 und 1 umgeschaltet werden. Dies hat unter SIM51 nur die
  1608.     eine Auswirkung, daß bei jedem Code-Fetch, der extern erfolgt, zu-
  1609.     vor 0FFh in das Latch von Port 0 geschrieben wird,  bei einem  in-
  1610.     ternen Fetch (/EA=1) jedoch nicht.
  1611.  
  1612.  
  1613.  
  1614.  
  1615.  
  1616.  
  1617.  
  1618.                           27
  1619.  
  1620.     5.14 ----- sichere Konfiguration
  1621.  
  1622.     Mit der Eingabe des folgenden Befehls wird die aktuelle Konfigura-
  1623.     tion von SIM51 in den File  SIM51.CFG  gesichert.
  1624.  
  1625.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1626.           █ k?                             █
  1627.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1628.  
  1629.  
  1630.     Wird  nur  k eingegeben,  so werden folgende Einstellungen gespei-
  1631.     chert:
  1632.  
  1633.        -   die CPU-Typ Auswahl (Mode)
  1634.        -   die aktuelle Anwahl für IDATA/XDATA/CODE/TxSIU - Fenster
  1635.        -   Extern Access
  1636.        -   Einstellungen des [F7]-Fensters
  1637.        -   Memory-Mapping Tabellen
  1638.        -   Port-Eingänge
  1639.        -   Zyklus-Zähler eingeblendet/ausgeblendet
  1640.  
  1641.  
  1642.     Wird   "KB"  eingegeben, so wird zusätzlich die Break-Punkt Tabel-
  1643.     le gespeichert.
  1644.  
  1645.  
  1646.     Beim Start von SIM51 wird automatisch ein sich  in  der  aktuellen
  1647.     Direktory befindender Konfigurationsfile gelesen.
  1648.  
  1649.  
  1650.     SIM51.CFG sollte nicht editiert werden. Wurde SIM51.CFG verändert,
  1651.     oder  ist  der Konfigurationsfile noch von einer alten Version von
  1652.     SIM51,  so erfolgt eine Fehlermeldung beim Leseversuch.  Dies  ist
  1653.     nicht  weiter tragisch für die Funktion von SIM51.  Die Fehlermel-
  1654.     dung kann quittiert werden.  SIM51 arbeitet dann mit den Grundein-
  1655.     stellungen:
  1656.  
  1657.      -   8051 - Mode
  1658.      -   IDATA - Fenster eingeblendet
  1659.      -   Extern Access: /EA=0
  1660.      -   [F7]-Fensters: 12 MHz, no 9th on Receive, Terminal-Emulation
  1661.          Mode, keine Simulation über PC-COM Port und beim 8044:
  1662.            ext.SCLK = 2.4 MHz, /CTS = /RTS
  1663.      -   kein Memory-Mapping eingetragen
  1664.      -   Port-Eingänge auf 0FFh
  1665.      -   Zyklus-Zähler ausgeblendet
  1666.      -   kein Break-Punkt gesetzt
  1667.  
  1668.  
  1669.     Nachdem  die  für das eigene Problem gewünschte Einstellung vorge-
  1670.     nommen wurde, kann diese gespeichert werden, wodurch der alte bzw.
  1671.     fehlerhafte Konfigurationsfile überschrieben wird.
  1672.  
  1673.  
  1674.     SIM51.CFG kann natürlich umkopiert oder auch gelöscht werden, wenn
  1675.     die Einstellungen nicht mehr automatisch  geladen  werden  sollen.
  1676.     Die Funktion von SIM51 selbst bleibt davon unberührt.
  1677.  
  1678.                           28
  1679.  
  1680.     5.15 ----- seriell IO Simulation
  1681.  
  1682.  
  1683.     Mit  Drücken  der [F7] - Taste wird ein Fenster zur Simulation der
  1684.     seriellen Schnittstelle geöffnet.
  1685.  
  1686.           █▀▀▀▀█
  1687.           █ F7 █
  1688.           █▄▄▄▄█
  1689.  
  1690.  
  1691.     Je nach Konfiguration öffent sich entweder ein Fenster  mit  "Hex-
  1692.     Dump" oder mit "Terminal-Emulation" Darstellung.
  1693.  
  1694.     In  der  "Hex-Dump"  Darstellung werder über die serielle Schnitt-
  1695.     stelle gesendeten Zeichen und die (eingegebenen) über die serielle
  1696.     Schnittstelle während des Programmablaufs zu empfangenden  Zeichen
  1697.     gezeigt.  In  dem Bereich in der Mitte sind Informationen über die
  1698.     Initialisierung der Schnittstelle enthalten.  Aus dieser  Darstel-
  1699.     lungsform der Seriell-Simulation-Fensters kann mit der [F10] Taste
  1700.     in die "Terminal-Emulation" Darstellung gewechselt werden.
  1701.  
  1702.     In  der  "Terminal-Emulation"  Darstellung werden nur die über die
  1703.     serielle Schnittstelle gesendeten Zeichen  dargestellt,  und  zwar
  1704.     so,  wie sie auf einem angeschlossenen Terminal erscheinen würden.
  1705.     Über die [F2] Taste kann in die Darstellungsform "Hex-Dump"  umge-
  1706.     schaltet werden.
  1707.  
  1708.  
  1709.     Über  die  [F2] und die [F10] Tasten kann also zwischen den beiden
  1710.     Darstellungsformen hin- und hergeschaltet werden.  Die Anwahl kann
  1711.     in  der  Konfiguration gespeichert werden.  (8044-Mode nur im HEX-
  1712.     Dump Mode)
  1713.  
  1714.  
  1715.  
  1716.  
  1717.     serielle Simulation:
  1718.     --------------------
  1719.     Empfang und Transmit läuft synchron  zur  Befehlsabarbeitung.  Das
  1720.     heißt,  das eine der eingestellten Baud-Rate entsprechende Zyklus-
  1721.     zahl verstreichen muß, bevor ein Zeichen übertragen wird.
  1722.  
  1723.     Das Zeichen wird für Empfang nach dieser Zeit nur aus dem im  Hex-
  1724.     Dump  Darstellung unten eingeblendeten Receive-Buffer (Rx-Fenster)
  1725.     in SBUFr eingetragen. Für Senden wird nach dieser Zeit das Zeichen
  1726.     aus SBUTt ins Tx-Fenster übertragen. Es werden während dieser Zeit
  1727.     jedoch nicht TxD und RxD verändert. Ein Programm,  das diese Pin's
  1728.     überprüft, wird hier nicht korrekt simuliert.
  1729.  
  1730.  
  1731.     Wahlweise  wird  das in der Simulation gesendete Zeichen neben dem
  1732.     Eintrag ins Tx-Fenster zusätzlich über die serielle  Schnittstelle
  1733.     des PC gesendet.  Dazu kann während die Hex-Dump Darstellung aktiv
  1734.     ist, mit der [F2] Taste ein PC COM-Port ausgewählt werden. Wählbar
  1735.     sind nur solche Port Numern,  die vom BIOS  des  PC  initialisiert
  1736.     wurden (= vorhandene, normale PC-UART Schnittstellen).
  1737.  
  1738.                           29
  1739.  
  1740.     Das  BIOS  verwaltet  bis zu vier serielle Schnittstellen.  Üblich
  1741.     sind folgende Adressen:
  1742.  
  1743.          COM1:    3F8...3FF,   IRQ 4
  1744.          COM2:    2F8...2FF,   IRQ 3
  1745.          COM3:    3E8...3EF,   IRQ 10
  1746.          COM4:    2E8...2EF,   IRQ 11
  1747.  
  1748.  
  1749.     SIM51 verwendet die Adressen, die im BIOS eingetragen sind.  SIM51
  1750.     installiert  eine Interruptroutine für die serielle Schnittstelle.
  1751.     Hier wird allerdings IRQ 4 für COM1 (..usw.) vorrausgesetzt.
  1752.  
  1753.  
  1754.  
  1755.     Zum Senden über die serielle PC-Schnittstelle wird diese von SIM51
  1756.     möglichst mit derselben Baudrate initialisiert,  mit der der  8051
  1757.     vom  zu testenden Programm initialisiert wurde.  Ist die Initiali-
  1758.     sierung auf dem 8051 nicht  eindeutig  (z.B.  Timer1-Überlauf  als
  1759.     Zeitbasis,  und  Timer1  nicht in Auto-Reload),  oder kann die PC-
  1760.     Schnittstelle die eingestellte Baudrate nicht  fahren  (z.B.  Syn-
  1761.     chron Mode), so wird default 9600 Baud, none Parity, 8 Bit/Zeichen
  1762.     und 1 stopbit eingestellt. Der default Wert wird auch eingestellt,
  1763.     wenn  beim 8052 verschiedene Baud-Raten für Senden und Empfang in-
  1764.     itialisiert sind.
  1765.  
  1766.     Über die serielle PC-Schnittstelle empfangene Zeichen  werden  von
  1767.     SIM51  automatisch ins Rx-Fenster eingetragen und der Receive wird
  1768.     gestartet.  Kommen über  die  serielle  Schnittstelle  Zeichen  zu
  1769.     schnell herein,  oder ist der Rx-Fenster Buffer voll,  so sind die
  1770.     Zeichen verloren.
  1771.  
  1772.     --> siehe auch Hex-Dump Darstellung und Terminal-Emulation
  1773.  
  1774.  
  1775.  
  1776.  
  1777.  
  1778.     Anmerkung:   Der BASIC-Interpreter wertet während seiner Initiali-
  1779.          sierung RxD aus. Er wartet,  bis in RxD eine negative Flanke
  1780.          auftritt,  dann  zählt  er die Zeit,  bis RxD wieder positiv
  1781.          wird.  Ein Benützer hat  nach  dem  Einschalten  des  BASIC-
  1782.          Rechners  auf  dem Terminal die SPACE-Taste (ASCII-Code 20h)
  1783.          zu drücken.  BASIC berechnet aus der low-Zeit für das SPACE-
  1784.          Zeichen  am  RxD-Pin  den  Vorladewert für RCAP2 (bei SPACE:
  1785.          Startbit + 5 Nullen). BASIC synchronisiert sich somit selbst
  1786.          mit einem angeschlossenen Terminal.
  1787.  
  1788.          Der BASIC-Interpreter wird auf SIM51 bei der Überprüfung von
  1789.          RxD warten (da ja niemand ein SPACE von einem Terminal  ein-
  1790.          gibt).  Soll der BASIC-Interpreter auf SIM51 laufen, muß der
  1791.          Anwender ihn "drüberlupfen" und dann selbst einen sinnvollen
  1792.          Wert in RCAP2 eintragen. Der maximale Wert,  für RCAP2,  mit
  1793.          dem BASIC noch läuft,  d.h.  seine Daten aus RxD rechtzeitig
  1794.          abholt,  ist 0FFFDh.  Das entspricht einer Baud Rate von 125
  1795.          000 Bit/s bei einem CPU-Takt von 12 MHz.
  1796.  
  1797.  
  1798.                           30
  1799.  
  1800.     5.15.1 HEX-Dump Mode:
  1801.     ---------------------
  1802.  
  1803.     Die gesendeten Daten werden in der Mitte des Tx-Fensters mit Ihren
  1804.     HEX-Wert  und rechts noch einmal mit ihrem ASCII-Wert dargestellt.
  1805.     Der HEX-Wert zeigt alle Steuerzeichen,  während rechts nur Zeichen
  1806.     größer asc32 dargestellt werden.
  1807.  
  1808.     Nach  dem Start von SIM51 ist das Tx-Fenster leer,  zur Kennzeich-
  1809.     nung sind in dem Feld für HEX-Darstellung  ".."  eingetragen.  Ist
  1810.     das Fenster vollgeschrieben, so wird sein Inhalt weitergescrolled.
  1811.     Bei  einem  Reset wird der Inhalt des Fensters nicht gelöscht (nur
  1812.     durch Quit und Neustart von SIM51 oder [F8]).  Das Tx-Fenster kann
  1813.     nicht editiert werden.
  1814.  
  1815.  
  1816.  
  1817.     In der unteren Bildschirmhälfte ist ein im Aufbau identisches Fen-
  1818.     ster für Receive (Rx) eingeblendet,  in das Daten eingetragen wer-
  1819.     den können, die empfangen werden sollen.
  1820.  
  1821.     Die Einträge im Receive-Fenster können editiert werden.  Der Wech-
  1822.     sel  zwischen HEX- und ASCII-Darstellung erfolgt mit der [TAB] Ta-
  1823.     ste. Zeichen können gelöscht werden,  indem in der HEX-Darstellung
  1824.     ein '..' eingetragen wird.
  1825.  
  1826.     Strings  aus  dem Transmit-Fenster können ins Receive- Fenster ko-
  1827.     piert werden.  Ein Wechsel ins Transmit-Fenster erfolgt  dazu  mit
  1828.     der [F3] Taste (copy). Dort wird der Cursor auf das erste Byte des
  1829.     zu kopierenden Strings bewegt, und dann [F1] (doCopy) gedrückt. Es
  1830.     wird der gesamte String ins Receive-Fenster kopiert,  und zwar mit
  1831.     seinem ersten Byte an die erste Stelle des Receive-Fensters.  Dort
  1832.     schon vorhandene Daten werden überschrieben.  Es werden alle Bytes
  1833.     aus dem Transmit-Fenster bis einschließlich dem letzten  Byte  vor
  1834.     einem  '..'  kopiert.  Hinter  dem  ins  Receive-Fenster kopierten
  1835.     String wird kein '..' gesetzt.  Dies muß der Anwender  selbst  ma-
  1836.     chen.
  1837.  
  1838.     Die  Kopierfunktion ist nicht sehr komfortabel,  aber ausreichend.
  1839.     Sie wurde eingeführt im Hinblick auf die BITBUS-Anwendung im 8044.
  1840.     Dort sendet ein Slave-Teilnehmer als Antwort auf  einem  Poll  von
  1841.     dem  Master-Teilnehmer eine Message (Frame) zurück,  die denselben
  1842.     Aufbau und größtenteils auch dieselben Daten enthält wie der Poll.
  1843.  
  1844.  
  1845.     Gestartet wird ein Empfang durch Drücken der [F1] Taste.  Der Sta-
  1846.     tus:    "started"   oder  "stopped"  wird im mittleren Bereich des
  1847.     F7-Fensters angezeigt.  Durch nochmaliges Drücken  von  [F1]  wird
  1848.     wieder der Empfang gestoppt. Mit dem Umschalten auf Start wird ein
  1849.     interner  Pointer  auf  den  Anfang  des Receive-Fensters gesetzt.
  1850.     Starten bedeutet, daß nachdem das F7-Fenster wieder verlassen wur-
  1851.     de, synchron zur Befehlsabarbeitung alle Daten bis zum ersten '..'
  1852.     empfangen.
  1853.  
  1854.     Wie in der realen CPU ist es Aufgabe des geladenen Programms,  die
  1855.     Daten aus SBUF abzuholen.  Geschieht dies nicht rechtzeitig, gehen
  1856.     wie in der realen CPU Daten verloren.
  1857.  
  1858.                           31
  1859.  
  1860.     Nach dem Empfang des gesamten  String's wird  der  Pointer  wieder
  1861.     gelöscht, und erst wieder beim nächsten Start initialisiert. SIM51
  1862.     geht  selbständig  wieder  in  den  Zustand  "stopped".   Die  ins
  1863.     Receive-Fenster eingetragenen Daten bleiben dort  dennoch  stehen.
  1864.     Wird einfach wieder [F1] gedrückt, können sie erneut gesendet wer-
  1865.     den.
  1866.  
  1867.  
  1868.     Wurde   das   F7-Fenster  betreten,   während  Receive  aktiv  ist
  1869.     (started), so ist das Byte, das gerade übertragen wird,  durch in-
  1870.     verse Darstellung hervorgehoben.  Durch Drücken von [F1] würde auf
  1871.     "stopped" umgeschalten und die inverse  Darstellung  verschwinden.
  1872.     Durch  nochmaliges Drücken von [F1] würde wieder auf "started" ge-
  1873.     schalten, jetzt wäre jedoch das erste Byte invers dargestellt,  da
  1874.     der Pointer zurückgesetzt wurde.
  1875.  
  1876.  
  1877.  
  1878.  
  1879.  
  1880.     5.15.2 Status-Infos im HEX-Dump Mode:
  1881.     -------------------------------------
  1882.     Ist  der  HEX-Dump Mode gewählt,  so sind in dem mittleren Fenster
  1883.     einige Informationen über die augenblickliche Initialisierung  der
  1884.     seriellen Schnittstelle, sowie der Einstellungen von SIM51 zur se-
  1885.     riellen Simulation, eingeblendet.
  1886.  
  1887.     Ganz  links  ist  entweder  "started" oder "stopped" eingeblendet.
  1888.     "Started" zeigt an, das SIM51 für die Simulation von Receive akti-
  1889.     viert ist.
  1890.  
  1891.  
  1892.     Vom Anwender kann nach Drücken von [F6] ein Wert für den  CPU-Takt
  1893.     eingegeben werden (zurück mit [CR] oder wenn Wert fertig geschrie-
  1894.     ben  ist).  Diese  Angabe  hat keinen Einfluß auf die Funktion von
  1895.     SIM51 oder die serielle Schnittstelle. Er dient nur der Berechnung
  1896.     der Baud Rate zur Information des Anwenders  und  natürlich  falls
  1897.     aktiv   zur  Einstellung  der  Baud-Rate  bei  der  seriellen  PC-
  1898.     Schnittstelle, falls ein COM-Port angewählt ist.
  1899.  
  1900.  
  1901.     Mit der [F2] Taste kann die serielle Schnittstelle  des  PC  akti-
  1902.     viert werden.  Ist ein COM-Port gewählt,  werden Zeichen,  die bei
  1903.     der Simulation von SIM51 ins Tx-Fenster übertragen werden, zusätz-
  1904.     lich über die serielle PC-Schnittstelle gesendet. Durch wiederhol-
  1905.     tes Drücken von [F2] wechselt die Wahl des COM-Ports,  der in  der
  1906.     Mitte  des Status-Fensters eingeblendet ist.  Ein "COM _" bedeutet
  1907.     dabei,  daß kein COM-Port angewählt ist.  Ist auf dem PC nur  eine
  1908.     serielle Schnittstelle vorhanden, so wechselt die Anzeige so immer
  1909.     nur zwischen "COM _" und COM 1.
  1910.  
  1911.  
  1912.     Die meisten anderen Eintragungen dienen zur Information des Anwen-
  1913.     ders, damit er die richtige Initialisierung der seriellen Schnitt-
  1914.     stelle  durch sein Programm überprüfen kann (natürlich sollten die
  1915.     Initialisierungsroutinen des eigenen  Programms  erst  durchlaufen
  1916.     werden).
  1917.  
  1918.                           32
  1919.  
  1920.     Für den 8051/52 Mode gibt es folgende Informationen:
  1921.  
  1922.       "synchron"/"assynchron"  zeigt an, ob in SCON synchrone oder
  1923.       assynchrone Übertragung gewählt wurde. Bei Synchron Mode ist
  1924.       der Takt über eine zweite Leitung synchron zu den Daten zu
  1925.       übertragen, bei assynchron Mode wird beim Empfang der Takt vom
  1926.       8051 intern mit einem DPLL aus den Daten abgeleitet.
  1927.  
  1928.       "8 Bit/Char"/"9 Bit/Char" gibt die entsprechende Auswahl in
  1929.       SCON wieder.
  1930.  
  1931.       "9th on" in der Zeile Transmit gibt die entsprechende Auswahl
  1932.       in SCON wieder. 9th on bedeutet, als 9tes Bit wird der Wert aus
  1933.       TB8 gesendet. Für die Zeile Receive kann mit [F5] umgeschaltet
  1934.       werden, ob als 9tes Bit eine 1, eine 0 oder ob kein 9tes Bit
  1935.       empfangen werden soll. Je nachdem, ob SM2 in SCON gesetzt ist,
  1936.       wird dadurch ein Frame-Error beim Empfang erkannt.
  1937.  
  1938.  
  1939.  
  1940.  
  1941.  
  1942.     Für den 8044 gibt es folgende Informationen:
  1943.  
  1944.       "synchron"/"assynchron" gibt den in SMD gewählten Mode an.
  1945.       Im Synchron Mode sind Datenraten bis 2.4 MBit/s möglich (bei
  1946.       12 MHz CPU-Takt). Der Schiebetakt SCLK muß extern zugeführt
  1947.       werden. Nach Drücken von [F9] kann ein Wert für SCLK eingege-
  1948.       ben werden. Anmerkung: die serielle Simulation funktioniert
  1949.       in SIM51 Ver. 1.01 noch nicht für 8044 Mode!
  1950.  
  1951.       Mit der [F5] Taste kann gewechselt werden zwischen /CTS=/RTS
  1952.       oder /CTS=/P1.7. Ist /CTS (Clear To Send) auf /P1.7 gesetzt,
  1953.       ist das Senden nur enabled, wenn bei Port 1 Bit 7 Input eine
  1954.       0 steht. Mit /CTS=/RTS wird immer gesendet.
  1955.  
  1956.       NRZI gibt an, ob Not-Return-to-Zero-Inverted Encoding/Decoding
  1957.       gewählt ist. Dies hat keinen Einfluß auf die Simulation unter
  1958.       SIM51. Bei der realen CPU unterstützt NRZI die Synchronisation
  1959.       des DPLL (Digital Phase Locked Loop) beim assynchronen Emp-
  1960.       fang. Denn das DPLL wird mit den Flanken des an SDATA empfan-
  1961.       genen Signals synchronisiert. Der 8044 arbeitet mit 0-Inser-
  1962.       tion, das heißt: nach 5 Bits wird beim Senden eine 0 eingefügt,
  1963.       beim Empfang wird sie wieder entfernt. Es treten also nie mehr
  1964.       als 5 Einsen hintereinander auf (6 Einsen signalisieren ein
  1965.       Flag, mehr Einsen einen Fehler bzw. Ruhezustand). Werden nun
  1966.       als Daten viele Bytes 00 gesendet, tritt trotz 0-Insertion lan-
  1967.       ge Zeit keine Flanke auf. NRZI arbeitet nun so, daß bei jedem
  1968.       zu sendenden Bit vom Wert 1 der Pegel an SDATA konstant bleibt
  1969.       und bei jeden Wert 0 der Pegel sich ändert. Wegen 0-Insertion
  1970.       tritt so unter NRZI spätestens nach 5 Bit's eine Flanke an
  1971.       SDATA auf, mit der das DPLL im Empfänger synchronisiert werden
  1972.       kann.
  1973.  
  1974.  
  1975.  
  1976.  
  1977.  
  1978.                           33
  1979.  
  1980.        LOOP gibt an, ob LOOP-Mode gewählt ist. In LOOP Mode wird
  1981.       gesendet an TxD und empfangen an RxD (ansonsten beides an
  1982.       SDATA). In LOOP Mode beträgt die maximale Datenrate 1.0 MBit/s
  1983.       Ist in SMD LOOP Mode gewählt, wird die SFR-Bezeichnung der
  1984.       Ports P3.0 und P3.1 entsprechend geändert.
  1985.  
  1986.       Für die Anzeige "Auto-Mode on" werden SMD und STS ausgewertet.
  1987.       Im Auto Mode antwortet der SIU selbständig auf einen Poll
  1988.       Dabei wird ein Teil des SDLC-Protokolls hardwaremäßig reali-
  1989.       siert. Auto-Mode wird von der CPU selbsttätig wieder verlassen,
  1990.       wenn ein Fehler auftritt.
  1991.  
  1992.       Preframe zeigt an, ob in SMD ein Preframe gewählt wurde. Dies
  1993.       hat nur insoweit Auswirkung auf die Simulation unter SIM51, daß
  1994.       das Senden erst die Dauer von 16 Bit später beginnt.
  1995.       Anmerkung: serielle Simulation noch nicht bei SIM51 Ver 1.01
  1996.  
  1997.       Bei Adress wird angegeben, ob Adress-Mode gewählt ist, also die
  1998.       Adresse aus STAD gesendet und beim Empfang mit STAD verglichen
  1999.       wird.
  2000.  
  2001.       Ctrl on/off gibt an, ob im Frame ein Control-Byte erwartet
  2002.       wird. Gesendet wird dann der Wert aus TCB. Beim Empfang wird
  2003.       das Control-Byte in RCB übertragen und im Auto Mode auch aus-
  2004.       gewertet.
  2005.  
  2006.       FCS on/off gibt bei der realen CPU an, ob ein Frame Check
  2007.       durchgeführt wird. Bei SIM51 keine Auswirkung, außer Übertra-
  2008.       gungsdauer 1 Byte länger. Anmerkung: noch nicht in Ver.1.01
  2009.  
  2010.       Test-Mode wird aktiv, wenn in das Latch von P3.1 (SDATA) eine 0
  2011.       geschrieben wird (bei Senden erscheinen zwar auch 0en am Aus-
  2012.       gang, jedoch über die multiplexed Funktion, sie stehen nicht im
  2013.       Latch. Die CPU-Pins P3.0 (I/O) und P3.1 werden dann beide hoch-
  2014.       ohmig.
  2015.       Ein Lesezugriff auf P3.1 ergibt im folgenden nicht den elektri-
  2016.       schen Zustand des (Eingangs-)Pins sondern das nächste Sende-
  2017.       Bit, wie es sonst an SDATA ausgegeben worden wäre. Ein Schreib-
  2018.       zugriff auf P3.0 setzt nicht das Latch, sondern wird als Emp-
  2019.       fangs-Bit, wie es an SDATA ankäme, übernommen.
  2020.  
  2021.  
  2022.     (Anmerkung: die Unterstützung des 8044 beschränkt sich bei SIM51
  2023.            bis jetzt = Ver 1.02 auf die Anzeige dieser Einstel-
  2024.            lungen, die Funktion der seriellen Schnittstelle wird
  2025.            für den 8044 noch nicht simuliert)
  2026.  
  2027.  
  2028.  
  2029.  
  2030.  
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.                           34
  2039.  
  2040.     5.15-3 Terminal-Emulation Mode:
  2041.     -------------------------------
  2042.  
  2043.     Bei  der  Terminal-Emulation  werden nur die darstellbaren Zeichen
  2044.     (asc32...asc255) gezeigt, wie sie auch auf einem Terminal erschei-
  2045.     nen würden.  Einige Steuerzeichen (asc00...asc31) werden ausgewer-
  2046.     tet  und  führen  zu  entsprechenden  Reaktionen bei der Terminal-
  2047.     Emulation:
  2048.  
  2049.      asc13  Carriage Return    -> der Cursor geht an den Zeilenanfang
  2050.      asc10  Line Feed          -> der Cursor geht eine Zeile tiefer
  2051.      asc08  Back Space         -> der Cursor geht ein Zeichen zurück
  2052.      asc09  Tab                -> Cursor auf nächste Tab-Position
  2053.      asc07  Bel                -> Klingelzeichen (zur Unterscheidung
  2054.                       zu Warnungen von SIM51 3 mal)
  2055.  
  2056.     Andere Steuerzeichen (wie auch Ctrl-S  und  Ctrl-Q)  werden  igno-
  2057.     riert.
  2058.  
  2059.  
  2060.  
  2061.     Eingabe (Rx):
  2062.     ------------
  2063.     Solange das F7-Fenster aktiv und Terminal-Mode gewählt ist, können
  2064.     in der unten hervorgehobenen Zeile Zeichen eingegeben werden.  Sie
  2065.     werden mit der [CR] Taste  in  den  im  HEX-Dump  Mode  sichtbaren
  2066.     Receive-Buffer  übernommen  und "StartReceive" gesetzt (siehe HEX-
  2067.     Dump Mode).  Eine Übernahme erfolgt auch beim  Verlassen  des  F7-
  2068.     Fensters.
  2069.  
  2070.  
  2071.     Die Eingabe-Kontrollzeile ist nicht als Teil des Terminal-Monitors
  2072.     zu  verstehen.  Sie kann nicht editiert werden,  und dient nur zur
  2073.     Kontrolle, um zu sehen, was man eingibt.  Ist lokales Echo gewählt
  2074.     (Umschalten  mit  [F9]),  so  werden die Zeichen auf dem Terminal-
  2075.     Fenster dargestellt.  Anderenfalls erst,  es vom  Anwenderprogramm
  2076.     als Echo zurückgeschrieben wurde.
  2077.  
  2078.     In  der  Eingabezeile werden Steuerzeichen nicht dargestellt.  Sie
  2079.     werden dennoch in den Receive-Buffer übertragen.  Hat man  während
  2080.     der Eingabe einen Fehler gemacht,  bleibt nur die Möglichkeit,  in
  2081.     den HEX-Dump Mode zu schalten ([F2] Taste),  dort  den  Fehler  im
  2082.     Rx-Buffer zu korrigieren,  und dann wieder zurückzuschalten ([F10]
  2083.     Taste). Bei der Receive-Simulation übertragen wird letztlich immer
  2084.     nur das,  was im Rx-Buffer steht (Darstellung im HEX-Dump  Modus).
  2085.     Aus diesem Grund dürfen über die Eingabezeile auch nicht mehr Zei-
  2086.     chen eingegeben werden, wie in den Rx-Buffer passen.
  2087.  
  2088.  
  2089.     Im  Terminal-Emulation  Mode können Steuerzeichen entweder in Ver-
  2090.     bindung mit der Control-Taste (Ctrl  und  Buchstaben  gleichzeitig
  2091.     drücken) oder mit der Alt-Taste (Alt drücken,  festhalten,  ASCII-
  2092.     Wert als Dezimalzahl eingeben, dann Alt wieder loslassen) eingege-
  2093.     ben werden.  Asc00 kann im Terminal-Modus nicht eingegeben werden.
  2094.     Einige Steuerzeichen können darüber hinaus durch ihre Funktionsta-
  2095.     sten direkt eingegeben werden.
  2096.  
  2097.  
  2098.                           35
  2099.  
  2100.     Übersicht über ASCII-Steuerzeichen:
  2101.  
  2102.     Zeichen:  Hex:  Dez:     übliche Bedeutung:
  2103.     ----------------------------------------------------------
  2104.     Ctrl-@    00      0
  2105.     Ctrl-A    01      1
  2106.     Ctrl-B    02      2
  2107.     Ctrl-C    03      3
  2108.     Ctrl-D    04      4
  2109.     Ctrl-E    05      5
  2110.     Ctrl-F    06      6
  2111.     Ctrl-G    07      7       BEL    (akustischer Alarm)
  2112.     Ctrl-H    08      8       BS     (Back Space)
  2113.     Ctrl-I    09      9       HT     (horizontal Tab)
  2114.     Ctrl-J    0A     10       LF     (Line Feed=Zeilenvorschub)
  2115.     Ctrl-K    0B     11       VT     (vertikal Tab)
  2116.     Ctrl-L    0C     12       FF     (Form Feed=Seitenvorschub)
  2117.     Ctrl-M    0D     13       CR     (Carriage Return=Zeilenanfang)
  2118.     Ctrl-N    0E     14       SO
  2119.     Ctrl-O    0F     15       SI
  2120.     Ctrl-P    10     16       DLE
  2121.     Ctrl-Q    11     17       DC1    (weiter Ausgabe)
  2122.     Ctrl-R    12     18       DC2
  2123.     Ctrl-S    13     19       DC3    (stoppe Ausgabe)
  2124.     Ctrl-T    14     20       DC4
  2125.     Ctrl-U    15     21       NAK
  2126.     Ctrl-V    16     22       SYN
  2127.     Ctrl-W    17     23       ETB
  2128.     Ctrl-X    18     24       CAN
  2129.     Ctrl-Y    19     25       EM
  2130.     Ctrl-Z    1A     26       SUB
  2131.     Ctrl-[    1B     27       ESC
  2132.     Ctrl-\    1C     28       FS
  2133.     Ctrl-]    1D     29       GS
  2134.     Ctrl-^    1E     30       RS
  2135.     Ctrl-_    1F     31       US
  2136.  
  2137.  
  2138.  
  2139.  
  2140.  
  2141.  
  2142.  
  2143.     5.15-4 Anzeige des Tx-Fensters während Go:
  2144.     ------------------------------------------
  2145.  
  2146.     Das  Tx-Fenster  kann  auch  im  Hauptfenster anstelle des IDATA-,
  2147.     XDATA- oder CODE-Fensters eingeblendet werden.  Es ist das einzige
  2148.     Fenster, das während der Code-Abarbeitung immer aktualisiert wird.
  2149.     Man  kann  so im Go-Modus beobachten,  wie serielle Daten über den
  2150.     Port geschrieben werden.
  2151.  
  2152.     Das Tx-Fenster wird in der Form dargestellt, die im F7-Fenster mit
  2153.     der [F2] oder [F10] Taste eingestellt wurde.
  2154.  
  2155.  
  2156.  
  2157.  
  2158.                           36
  2159.  
  2160.     Ist Terminal-Emulation gewählt (nicht im  8044  Mode),  so  können
  2161.     während  ein  Programm im Go-Mode abgearbeitet wird (** execute **
  2162.     ist aktiv) sogar Zeichen über die Tastatur eingegeben werden,  die
  2163.     dann  wie ansonsten im F7-Fenster über die Eingabezeile in den Rx-
  2164.     Buffer übertragen werden.  Wohlgemerkt geht dies nur  während  ein
  2165.     Programm gestartet ist,  ansonsten werden Eingaben über die Tasta-
  2166.     tur in die Eingabezeile von SIM51 übernommen.
  2167.  
  2168.     Bei Aktivierung einer seriellen PC-Schnittstelle  werden  von  der
  2169.     PC-Schnittstelle kommende Zeichen immer in den Rx-Buffer eingetra-
  2170.     gen (unabhängig von  ** execute **). Die Eingabe über die Tastatur
  2171.     ist zusätzlich.
  2172.  
  2173.  
  2174.  
  2175.  
  2176.  
  2177.  
  2178.     5.15-5 Übertragungsformate:
  2179.     ---------------------------
  2180.  
  2181.     Zur  Veranschaulichung und Verdeutlichung obiger Ausführungen wer-
  2182.     den hier die beim 8051/52 und beim 8044 verwendeten  Übertragungs-
  2183.     formate erläutert:
  2184.  
  2185.  
  2186.  
  2187.     8051/8052 Senden:
  2188.  
  2189.     Das  in SBUF geschriebene Byte wird in ein Transmit-Shift Register
  2190.     übernommen.  Mit dem Beschreiben von SBUF wird das Senden  gestar-
  2191.     tet.  Das  in SBUF geschriebene BYTE kann nicht zurückgelesen wer-
  2192.     den, da SBUF eigentlich aus zwei Registern besteht, und beim Lesen
  2193.     des SBUF-Receive Register gelesen wird.
  2194.  
  2195.  
  2196.     8051/8052 Empfang:
  2197.  
  2198.     Der  Empfang  erfolgt  über  ein  Receive-Shift   Register.   Nach
  2199.     8  x Shift wird das empfangene Byte aus dem Receive-Shift Register
  2200.     in SBUF übertragen; aber nur, wenn zuvor REN=1 und RI=0 waren. Ist
  2201.     SM2 = 1 dann muß zusätzlich das 9th-Bit 1 sein  (in  Mode  1,  das
  2202.     Stopbit = 1).
  2203.  
  2204.  
  2205.  
  2206.     8051/52 im Mode 0:     (8 Bit Shift, synchron)
  2207.     ------------------
  2208.     In  Mode  0  wird  der  Schiebetakt  direkt aus dem CPU-Systemtakt
  2209.     (= 1/12 des CPU-Taktes) abgeleitet.  Mit diesem  Takt  werden  die
  2210.     Bits  im  Transmit-Shift Register nach rechts durchgeschoben.  Der
  2211.     Übertrag aus dem LSB (LOW Bit) wird an RxD ausgegeben.  Es  bedarf
  2212.     also 8 Schiebetakte, bis ein Byte gesendet ist. Der Takt wird syn-
  2213.     chron dazu über TxD ausgegeben.  Der empfangende Teilnehmer am an-
  2214.     deren Ende der Leitung,  erhält beides: Daten an RxD und  Takt  an
  2215.     TxD. Das LSB wird zuerst übertragen.
  2216.  
  2217.  
  2218.                           37
  2219.  
  2220.     8051/52 im Mode 1,2,3:    (UART, assynchron)
  2221.     ----------------------
  2222.     Diese  Betriebsart  entspricht der Norm,  wie sie auch bei den se-
  2223.     riellen Schnittstellen beim PC und bei Terminals  verwendet  wird.
  2224.     Gesendet werden 1 Startbit, 8 Datenbits und 1 bis 2 Stopbits.
  2225.  
  2226.  
  2227.     Beispiel: Zeichen 'a' = ASCII 61 hex = 0110 0001 binär
  2228.  
  2229.         |Start|  B0 |  B1 |  B2 |  B3 |  B4 |  B5 |  B6 |  B7 |Stop |
  2230.     ────┐     ┌─────┐     |     |     |     ┌───────────┐     ┌──────
  2231.         └─────┘     └───────────────────────┘     |     └─────┘     |
  2232.         |  0  |  1  |  0  |  0  |  0  |  0  |  1  |  1  |  0  |  1  |
  2233.  
  2234.  
  2235.     In Ruhe ist der Ausgang (TxD) auf 1.  Das Senden eines Daten-Bytes
  2236.     beginnt immer mit einem Startbit.  Das Startbit ist eine 0.  Damit
  2237.     tritt zum Beginn eine negative Flanke auf, mit der der empfangende
  2238.     Teilnehmer sein DPLL synchronisiert und die Empfangslogik startet.
  2239.  
  2240.     Nach  dem  Startbit  werden die Datenbits durch das Transmit-Shift
  2241.     Register nach rechts durchgeschoben,  und so die  Daten  gesendet.
  2242.     Beim  8051/52  sind dies immer 8 Datenbits (B0..B7).  Das LSB wird
  2243.     zuerst gesendet.
  2244.  
  2245.     Danach sieht die Norm 1, 1½ oder 2 Stopbit's vor.  Das Stopbit ist
  2246.     eine 1. Mit dem Stopbit soll sichergestellt werden, daß, bevor das
  2247.     nächste Zeichen gesendet wird, der seriellen Ausgang eine minimale
  2248.     Zeit 1 ist, damit das nächste Startbit erkannt werden kann. Normal
  2249.     sendet der 8044 nur 1 Stopbit. Wahlweise kann er (im Mode 2 und 3)
  2250.     vor  dem  Stopbit  ein 9tes Bit senden.  Gesendet wird das Bit aus
  2251.     TB8. Wird TB8 auf 1 gesetzt, so werden praktisch 2 Stopbits gesen-
  2252.     det.
  2253.  
  2254.  
  2255.     In Mode 2 und 3 wird beim Empfang dieses 9te Bit in  RB8  übertra-
  2256.     gen.  Ist zusätzlich SM2 = 1, so wird das 9te Bit ausgewertet, und
  2257.     das empfangene Byte nur dann in SBUF übertragen,  wenn das 9te Bit
  2258.     1  ist.  Hier ergibt sich eine weitere Möglichkeit der Nutzung des
  2259.     9th Bit: der Aufbau eines Master-Slave-Bussystems. Dabei sind meh-
  2260.     rere Teilnehmer über eine serielle Leitung miteinander  verbunden.
  2261.     Es muß natürlich ein Protokoll vereinbart werden, z.B.:
  2262.  
  2263.          Zeichen,  die  von allen Teilnehmern empfangen werden sollen
  2264.          kennzeichnet der Master mit einer 1 als 9th Bit.  Der Master
  2265.          selbst  setzt sein SM2 = 0,  damit empfängt er alle Zeichen.
  2266.          Alle Slaves halten ihr SM2 auf 1.  Nachdem  der  Master  mit
  2267.          9th=1  eine Slave-Adresse gesendet hat,  setzt der angespro-
  2268.          chene Slave sein SM2 auf 0.  Daraufhin sendet der Master die
  2269.          für diesen Slave bestimmten Zeichen mit 9th = 0. Die anderen
  2270.          Slaves bekommen davon nichts mit, werden also auch nicht un-
  2271.          nötig  unterbrochen.  Slaves  dürfen natürlich nur auf einen
  2272.          Poll vom Master antworten.
  2273.  
  2274.  
  2275.  
  2276.  
  2277.  
  2278.                           38
  2279.  
  2280.     8044:
  2281.     -----
  2282.     Der 8044 verwendet nicht nur einen Buffer (beim  8051:  SBUF)  zur
  2283.     Datenübergabe  an den seriellen Port,  sondern das gesamte interne
  2284.     RAM ist als Dual Port RAM  ausgeführt.  Die  seriellen  Funktionen
  2285.     werden von einen speziellen Controller (SIU) ausgeführt.  Übertra-
  2286.     gen wird auch nicht nur jeweils 1 Byte, sondern mehrere Bytes hin-
  2287.     tereinander.  Eine solche Folge von Bytes wird eingeleitet von ei-
  2288.     nem Startflag und abgeschlossen von einem Ende-Flag.
  2289.  
  2290.     Mit  8044 Rechnern kann ein Feldbus-System nach dem SDLC Protokoll
  2291.     aufgebaut werden. Ein solches Feldbus-System wurde von Intel defi-
  2292.     niert (BITBUS), und die Firmware dazu ist im internen ROM des 8044
  2293.     bereits enthalten.  Ein Teilnehmer (der Master) erhält  dabei  die
  2294.     Kontrolle  über  den seriellen Bus.  Angeschlossen sind bis zu 255
  2295.     Slaves, die nur senden dürfen,  nachdem sie vom Master dazu aufge-
  2296.     fordert  wurden.  Jede  Folge von Bytes wird noch um eine (Slave-)
  2297.     Adresse und ein Control-Byte ergänzt.  Eine solche Datenfolge  mit
  2298.     Start- und Ende-Flag wird als Frame bezeichnet. Das SDLC-Protokoll
  2299.     sieht folgenden Frame-Aufbau vor:
  2300.  
  2301.     ┌──────┬──────┬──────┬──────┬───·········───┬──────┬──────┬──────┐
  2302.     │ Flag │Adress│Contr.│    I n f o r m a t i o n    │ FCS  │ Flag │
  2303.     └──────┴──────┴──────┴──────┴───·········───┴──────┴──────┴──────┘
  2304.  
  2305.  
  2306.     Je nach Initialisierung von SMD und STS können einzelne Teile weg-
  2307.     gelassen werden, oder noch ein Preframe hinzukommen.
  2308.  
  2309.     Praktisch  ist die Länge eines Frames begrenzt durch die Größe des
  2310.     internen RAM's.
  2311.  
  2312.     RBS hält einen Pointer mit der  Adresse  des  ersten  Bytes  eines
  2313.     freien Buffers.  RBL hält dessen Länge.  Beim Empfang wird vom SIU
  2314.     der Information-Block aus dem Frame in den Buffer übertragen.  Die
  2315.     empfangene Anzahl der Bytes in RFL.
  2316.  
  2317.     Zum Senden wird in TBS die Adresse des ersten Bytes einer Message,
  2318.     die im internen RAM steht, geladen. In TBL die Länge. Der SIU sen-
  2319.     det  selbständig  die  Message,  die CPU kann sich solange anderen
  2320.     Aufgaben widmen.
  2321.  
  2322.     Im Synchron Mode wird im Gegensatz zum 8051 der Takt nicht  intern
  2323.     gewonnen  und  dann ausgegeben,  sondern er muß beim sendenden wie
  2324.     beim empfangenden Teilnehmer extern zugeführt werden.
  2325.  
  2326.     Beim Senden wird der Wert aus STAD als Adresse in den Frame einge-
  2327.     tragen.  Beim Empfang wird das Adress-Byte aus dem Frame  mit  dem
  2328.     Wert in STAD verglichen,  nur wenn diese übereinstimmen (oder eine
  2329.     davon 0FFh ist), wird der restliche Frame empfangen.  Das Control-
  2330.     Byte definiert die Art des Frames: mit Information, ein Poll, eine
  2331.     Acknoledge,  Synchronisation,... Im Auto Mode kann der SIU auf be-
  2332.     stimmte Frame-Typen selbständig antworten: z.B.  mit einer  Ackno-
  2333.     ledge,  wenn ein Slave gepolled wird, und er keine Daten zu senden
  2334.     hat, oder mit den zu sendenden Daten,  wenn ein Transmitbuffer be-
  2335.     reits initialisiert ist.  Der Datenaustausch wird damit wesentlich
  2336.     schneller.
  2337.  
  2338.                           39
  2339.  
  2340.     5.16 ----- Instruktion Step (Single Step):
  2341.  
  2342.     Durch Drücken von [F1] wird der Befehl,  auf dem  der  Instruktion
  2343.     Pointer zeigt ausgeführt.
  2344.  
  2345.           █▀▀▀▀█
  2346.           █ F1 █
  2347.           █▄▄▄▄█
  2348.  
  2349.  
  2350.     Danach  wird  der  Inhalt  in den einzelnen Fenstern aktualisiert.
  2351.     Sind Timer gestartet,  so werden sie entsprechend der für die  In-
  2352.     struktion  benötigten  Zyklen  incrementiert.  Ist eine Interrupt-
  2353.     Bedingung eingetreten,  so wird nach Ausführung des Befehls  nicht
  2354.     die folgende Instruktion, sondern die Interrupt-Routine angesprun-
  2355.     gen.  Das  Erreichen von BREAK-Punkten wird nicht angezeigt,  auch
  2356.     wird der IST-Counter nicht erhöht.
  2357.  
  2358.     Die Ausführung eines Befehls kann übersprungen werden (nicht  aus-
  2359.     geführt),  wenn anstelle von [F1] die [Cursor DOWN] Taste gedrückt
  2360.     wird.
  2361.  
  2362.  
  2363.  
  2364.  
  2365.  
  2366.  
  2367.  
  2368.  
  2369.     5.17 ----- Procedure Step:
  2370.  
  2371.     Durch Drücken von [F2] wird wie beim Instruktion Step der  Befehl,
  2372.     auf  dem  der Instruktion Pointer zeigt,  ausgeführt.  Ist die In-
  2373.     struktion jedoch ein   CALL   oder    DJNZ  , so erfolgt erst wie-
  2374.     der ein Stop bei der Adresse nach dem CALL oder DJNZ.
  2375.  
  2376.           █▀▀▀▀█
  2377.           █ F2 █
  2378.           █▄▄▄▄█
  2379.  
  2380.  
  2381.     Intern wird ein Break (Nr. 0) auf die einem CALL oder DJNZ folgen-
  2382.     de Adresse gesetzt.  Kehrt die Abarbeitung nicht zu dieser Adresse
  2383.     zurück (kein RET), so stoppt die Abarbeitung damit nicht mehr.
  2384.  
  2385.     Ein  Break kann natürlich auch durch eine erfüllte Break-Bedingung
  2386.     (aus [F5]) oder einen User-Break erfolgen.  Dabei wird der interne
  2387.     Break 0 gelöscht.
  2388.  
  2389.     Die [F2] Taste ist identisch mit dem Befehl:
  2390.  
  2391.                  "g , folgendeAdresse"
  2392.  
  2393.  
  2394.  
  2395.  
  2396.  
  2397.  
  2398.                           40
  2399.  
  2400.     5.18 ----- Go-Modus:
  2401.  
  2402.     Die  Abarbeitung  kann  neben  [F1] und [F2] auch mit Go gestartet
  2403.     werden.
  2404.  
  2405.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2406.           █ g  startAdr, stopAdr           █
  2407.           █ gs startAdr, stopAdr           █
  2408.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2409.  
  2410.     wobei:
  2411.  
  2412.     startAdr    die Adresse angibt, bei der die Abarbeitung begonnen
  2413.             werden soll. Wird "startAdr" weggelassen, so beginnt
  2414.             die Abarbeitung bei der aktuellen Adresse (InstPtr).
  2415.  
  2416.     ,stopAdr   die Adresse angibt, bei der die Abarbeitung enden
  2417.            soll. Die Instruktion bei stopAdr wird dabei nicht
  2418.            mehr ausgeführt. Wird ",stopAdr" weggelassen, so "go
  2419.            forever" (= kein Stop mehr). Das vorangestellte
  2420.            Komma kennzeichnet die stopAdr.
  2421.  
  2422.  
  2423.     Es kann auch einfach nur "g" eingegeben werden, wenn bei der aktu-
  2424.     ellen Adresse gestartet werden soll mit Go Forever.
  2425.  
  2426.     Die Abarbeitung stoppt bei jedem gesetzten  Breakpunkt  oder  nach
  2427.     Drücken der [F5] Taste (User Break).  Eine angegebene Stop-Adresse
  2428.     wird als Break Nr 0 eingetragen.  Erfolgt ein Break (wenn auch bei
  2429.     einem anderen Punkt),  so wird der Break Nr.  0 gelöscht. Soll die
  2430.     Stop-Adresse bestehen bleiben,  so darf nach dem Break nicht  ein-
  2431.     fach   mit  "g"  weitergemacht  werden,   sondern  es  muß  erneut
  2432.     "g ,stopAdr"  eingegeben werden (Befehl rückholen mit [F3]).
  2433.  
  2434.  
  2435.  
  2436.     Wurde zum Aufruf des Go-Befehls  nur "g"  eingegeben,  so  erfolgt
  2437.     keine Aktualisierung der Bildschirmfenster mit Ausnahme:
  2438.  
  2439.            des Tx-Fensters    (wenn eingeblendet)
  2440.            des Zyklus-Zählers (wenn eingeblendet) sowie
  2441.            des Instruktion Pointers.
  2442.  
  2443.  
  2444.     Wurde  der  Befehl jedoch mit  "gs"  (Go Slow) aufgerufen,  so er-
  2445.     folgt nach jedem ausgeführten  Befehl  eine  Aktualisierung  aller
  2446.     Fenster. Dieser Modus ist natürlich sehr viel langsamer.
  2447.  
  2448.  
  2449.     Beispiele:
  2450.  
  2451.        g , 004B   ; starte ab Instruktion Pointer, halt bei 004Bh
  2452.        gs         ; starte ab Instruktion Pointer, kein Halt, slow
  2453.        g 0        ; starte ab 0000, kein Halt.  !Für Reset "r" und
  2454.               ; dann "g" eingeben (sonst SFR nicht zurückgesetzt.
  2455.        g 918, 920   ; starte bei 918h, halt bei 920h
  2456.  
  2457.  
  2458.                           41
  2459.  
  2460.     Während ** execute ** können mit Alt-F1..F8 die Port1 Eingänge ge-
  2461.     ändert werden (Ctrl-F1..F8 für P3).
  2462.  
  2463.     Solange  also  ein  Programm  läuft,  und  beispielsweise in einer
  2464.     Schleife auf einen INT0 Interrupt wartet, kann durch Betätigen der
  2465.     genannten Tasten der Zustand eines  Port-Eingangpins  von  Port  1
  2466.     oder  Port  3 verändert werden.  War der Pin-Eingang vorher auf 1,
  2467.     geht er au 0 und umgekehrt.  Für das Beispiel mit dem  INT0  müßte
  2468.     Ctrl-F3  = ändere P3.2 (INT0) gedrückt werden.  (Achtung: gibt nur
  2469.     Sinn, wenn ein Breakpunkt auf die INT0-Routine gesetzt ist,  da ja
  2470.     während  der Interrupt-Routine INT0 wieder weggenommen werden muß,
  2471.     damit nach dem RETI nicht erneut die Interrupt-Routine  angesprun-
  2472.     gen wird)
  2473.  
  2474.        Alt-F1  ändere  P1.0           Ctrl-F1  ändere  P3.0
  2475.        Alt-F2  ändere  P1.1           Ctrl-F2  ändere  P3.1
  2476.        Alt-F3  ändere  P1.2           Ctrl-F3  ändere  P3.2
  2477.        Alt-F4  ändere  P1.3           Ctrl-F4  ändere  P3.3
  2478.        Alt-F5  ändere  P1.4           Ctrl-F5  ändere  P3.4
  2479.        Alt-F6  ändere  P1.5           Ctrl-F6  ändere  P3.5
  2480.        Alt-F7  ändere  P1.6           Ctrl-F7  ändere  P3.6
  2481.        Alt-F8  ändere  P1.7           Ctrl-F8  ändere  P3.7
  2482.  
  2483.  
  2484.  
  2485.     Ist  die serielle Schnittstelle auf Terminal-Emulation eingestellt
  2486.     (nicht 8044), dann werden während  ** execute ** alle über die Ta-
  2487.     statur  eingegebene  Zeichen  in  den  Receive-Buffer  eingetragen
  2488.     (siehe F7).
  2489.  
  2490.  
  2491.  
  2492.  
  2493.  
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.  
  2512.  
  2513.  
  2514.  
  2515.  
  2516.  
  2517.  
  2518.                           42
  2519.  
  2520.     5.19 ----- Assembleraufruf:
  2521.  
  2522.     Durch Eingabe von "a" wird der integrierte Assembler aufgerufen.
  2523.  
  2524.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2525.           █ a                              █
  2526.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2527.  
  2528.  
  2529.     Der Cursor wechselt in das Disassembler-Fenster.  Nun kann Code in
  2530.     8051 Mnemonics eingegeben werden.
  2531.  
  2532.  
  2533.     Zurück in die  Command-Line  gelangt man wieder durch Drücken  von
  2534.     [Ctrl]+[Home] (Control- und Home-Taste gleichzeitig drücken).  Mit
  2535.     [CR] wird der geänderte Inhalt der Zeile in den  Code  übernommen,
  2536.     und  der  Cursor  springt in die nächste Zeile.  Befindet sich der
  2537.     Cursor ganz unten im Disassembler-Fenster, dann scrollt der Inhalt
  2538.     des Disassemble-Fensters nach oben. Bei [Ctrl] + [Home] wird eben-
  2539.     falls noch die Instruktion in der Cursor-Zeile geändert.
  2540.  
  2541.     Wird [Cursor DOWN] gedrückt,  so wird der alte  Inhalt  der  Zeile
  2542.     wiederhergestellt  (keine Übernahme) und der Cursor springt in die
  2543.     dann nächste Zeile.
  2544.  
  2545.     Mit [Cursor UP] kann der Cursor nur  innerhalb  des  Disassembler-
  2546.     Fensters eine Zeile nach oben bewegt werden, kein Scroll Down.
  2547.  
  2548.     Die  Zeile  kann  nur  im  Überschreib-Modus editiert werden.  Die
  2549.     [Cursor Right], [Cursor Left],  [End] und [Home] Tasten können zur
  2550.     Cursorbewegung verwendet werden.  Mit [ESC] werden alle rechts vom
  2551.     Cursor stehenden Zeichen gelöscht (inclusive Cursor Position).
  2552.  
  2553.     Groß- und Klein-Schreibung ist beliebig.  Bei  einer  fehlerhaften
  2554.     Eingabe  erfolgt ein Warnton,  und der Cursor zeigt auf die Stelle
  2555.     mit dem Fehler.
  2556.  
  2557.  
  2558.     Der integrierte Assembler ist kein voller Ersatz für  eine  Assem-
  2559.     bler,  denn er arbeitet nur mit absoluten Adressen,  nicht mit La-
  2560.     bels.  Code kann zwar mit dem Write-Befehl abgespeichert  und  mit
  2561.     Load  wieder geladen werden,  jedoch kann kein Code eingefügt wer-
  2562.     den,  da bestehender Code nicht verschoben werden kann.  Dies kann
  2563.     zwar  über den Copy-Befehl dennoch erreicht werden,  jedoch können
  2564.     dadurch enthaltene SMALL-JMP's fehlerhaft werden.
  2565.  
  2566.     Der integrierte Assembler kann dennoch erfolgreich zum Ändern  von
  2567.     Code und zum Erstellen kurzer Testprogramme eingesetzt werden.
  2568.  
  2569.  
  2570.     Es wird natürlich derselbe Befehlssatz und dieselben Mnemonics wie
  2571.     beim ASM51 (A51,  TASM) verwendet. Einige Eingaben, wo sie eindeu-
  2572.     tig sind,  wurden jedoch vereinfacht.  Da keine  Labels  verwendet
  2573.     werden, genügt es Adressen und Werte hinter einem '#' als HEX-Zahl
  2574.     ohne eine vorangestellte 0 einzugeben. Alle Eingaben sind außerdem
  2575.     HEX-Zahlen, obwohl nie ein  'h' nachgestellt wird.
  2576.  
  2577.  
  2578.                           43
  2579.  
  2580.     Abkürzungen  der  Mnemonic-Symbole  für  die SFR der gewählten CPU
  2581.     sind zulässig.  Auch Eingaben wie ACC.7 (für das höchste  Bit  des
  2582.     ACC) werden unterstützt.
  2583.  
  2584.  
  2585.  
  2586.  
  2587.     Befehlsatz für 8051 Familie:    (Abkürzungen: n = 0..7,  i = 0..1)
  2588.  
  2589.      ADD    A, Rn                   CLR    A
  2590.      ADD    A, direkt               CPL    A
  2591.      ADD    A, @Ri                  RL     A
  2592.      ADD    A, #data                RLC    A
  2593.      ADDC   A, Rn                   RR     A
  2594.      ADDC   A, direkt               RRC    A
  2595.      ADDC   A, @Ri                  SWAP   A
  2596.      ADDC   A, #data                XCHD   A, @Ri
  2597.      SUBB   A, Rn
  2598.      SUBB   A, direkt               ANL    A, Rn
  2599.      SUBB   A, @Ri                  ANL    A, direkt
  2600.      SUBB   A, #data                ANL    A, @Ri
  2601.      MUL    AB                      ANL    A, #data
  2602.      DIV    AB                      ANL    direkt, A
  2603.      DA     A                       ANL    direkt, #data
  2604.                     ORL    A, Rn
  2605.      INC    Rn                      ORL    A, direkt
  2606.      INC    direkt                  ORL    A, @Ri
  2607.      INC    @Ri                     ORL    A, #data
  2608.      INC    A                       ORL    direkt, A
  2609.      INC    DPTR                    ORL    direkt, #data
  2610.      DEC    Rn                      XRL    A, Rn
  2611.      DEC    direkt                  XRL    A, direkt
  2612.      DEC    @Ri                     XRL    A, @Ri
  2613.      DEC    A                       XRL    A, #data
  2614.                     XRL    direkt, A
  2615.      MOV    direkt, A               XRL    direkt, #data
  2616.      MOV    direkt, Rn
  2617.      MOV    direkt, direkt          CLR    C
  2618.      MOV    direkt, @Ri             CPL    C
  2619.      MOV    direkt, #data           SETB   C
  2620.      MOV    direkt, A               ANL    C, bit
  2621.      MOV    A, Rn                   ORL    C, bit
  2622.      MOV    Rn, A                   MOV    C, bit
  2623.      MOV    @Ri, A                  CLR    bit
  2624.      MOV    A, direkt               CPL    bit
  2625.      MOV    Rn, direkt              SETB   bit
  2626.      MOV    @Ri, direkt             ANL    C, /bit
  2627.      MOV    A, @Ri                  ORL    C, /bit
  2628.      MOV    Rn, #data               MOV    bit, C
  2629.      MOV    @Ri, #data
  2630.      MOV    A, #data                CALL   adr *)
  2631.                     ACALL  adr
  2632.      MOV    DPTR, #data16           LCALL  adr
  2633.      XCH    A, Rn                   RET
  2634.      XCH    A, direkt               RETI
  2635.      XCH    A, @Ri                  JMP    adr  *)
  2636.  
  2637.  
  2638.                           44
  2639.  
  2640.                                      SJMP   adr
  2641.      MOVC   A, @A+DPTR              AJMP   adr
  2642.      MOVC   A, @A+PC                LJMP   adr
  2643.                     JMP    @A+DPTR
  2644.      MOVX   A, @DPTR
  2645.      MOVX   @DPTR, A                JZ     adr
  2646.      MOVX   A, @Ri                  JC     adr
  2647.      MOVX   @Ri, A                  JB     bit, adr
  2648.                     JBC    bit, adr
  2649.      PUSH   direkt                  JNZ    adr
  2650.      POP    direkt   JNC    adr
  2651.                     JNB    bit, adr
  2652.      NOP
  2653.                     CJNE   A, direkt, adr
  2654.      DJNZ   Rn, adr                 CJNE   Rn, #data, adr
  2655.      DJNZ   direkt, adr             CJNE   A, #data, adr
  2656.                     CJNE   @Ri, #data, adr
  2657.  
  2658.       *) = SIM51 setzt für JMP oder CALL den jeweils kürzesten Opcode
  2659.            für  SJMP, AJMP, LJMP, ACALL oder LCALL ein
  2660.  
  2661.  
  2662.  
  2663.  
  2664.  
  2665.  
  2666.  
  2667.  
  2668.  
  2669.  
  2670.  
  2671.  
  2672.  
  2673.  
  2674.  
  2675.  
  2676.  
  2677.  
  2678.  
  2679.  
  2680.  
  2681.  
  2682.  
  2683.  
  2684.  
  2685.  
  2686.  
  2687.  
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693.  
  2694.  
  2695.  
  2696.  
  2697.  
  2698.                           45
  2699.  
  2700.     5.20 ----- Print Disassembled Code
  2701.  
  2702.  
  2703.     Der integrierte Disassembler kann dazu verwendet werden, disassem-
  2704.     blierten Code in einen File zu schreiben
  2705.  
  2706.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2707.           █ pD adr1 - adr2, fileName       █
  2708.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2709.  
  2710.  
  2711.     wobei:
  2712.  
  2713.       adr1      - Startadresse (HEX) für die Disassemblierung
  2714.       adr2      - letzte Adresse, dessen Opcode in den File ge-
  2715.               schrieben wird.
  2716.       fileName  - File in den der disassemblierte Code geschrieben
  2717.               wird.
  2718.  
  2719.  
  2720.  
  2721.     Der File-Name muß den MSDOS Richtlinien genügen. Wird für fileName
  2722.     'PRN' eingegeben, so wird der disassemblierte Code zum Drucker ge-
  2723.     schickt.
  2724.  
  2725.  
  2726.     Der  Code wird in einer solchen Anordnung in den file geschrieben,
  2727.     daß er direkt von ASM51  (Intel  Assembler)  reassembliert  werden
  2728.     kann. Dabei wird der Einfachheit halber jede Adresse als Label an-
  2729.     gegeben ohne Rücksicht, ob es sich um einen Einsprung handelt.
  2730.  
  2731.     Der  File  wird  eröffnet mit einer CSEG Direktive und beendet mit
  2732.     der END Direktive. Ist 8052 oder 8044 Mode gewählt, so werden noch
  2733.     die Direktiven zur 8051-Mode Abschaltung: $NOMOD51,  und zum  Ein-
  2734.     binden  der  gültigen  SFR-Definitions-Files:  $INCLUDE(reg**.pdf)
  2735.     eingefügt.
  2736.  
  2737.  
  2738.     SIM51 disassembliert Code, in der Reihenfolge,  wie er ihn vorfin-
  2739.     det (der Reihe nach).  Steht im Code eine Tabelle, kann SIM51 dies
  2740.     natürlich nicht wissen,  und würde sie  als  Code  interpretieren.
  2741.     Zweckmäßig schreibt sich der Anwender auch einen Hex-Dump des Code
  2742.     Speichers  in einen File,  um eventuell enthaltene Texte zu erken-
  2743.     nen. Für eine vollständige Disassemblierung eines Programms eignet
  2744.     sich besser der ebenfalls auf der SIM51-Diskette enthaltene Disas-
  2745.     sembler DIS51.EXE.  DIS51 ist ein  selbstständiges  Programm,  das
  2746.     ausgehend  von einer Liste von Einsprungadressen den Code schritt-
  2747.     weise durchgeht,  und nur "berührten" Code als  solchen  interpre-
  2748.     tiert, den Rest als Daten.
  2749.  
  2750.  
  2751.  
  2752.  
  2753.  
  2754.  
  2755.  
  2756.  
  2757.  
  2758.                           46
  2759.  
  2760.     5.21 ----- print Hex-Dump
  2761.  
  2762.  
  2763.     Der Inhalt der Speicherbereiche kann mit folgenden Befehl in einen
  2764.     File geschrieben werden:
  2765.  
  2766.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2767.           █ pH tadr1 - adr2, fileName      █
  2768.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2769.  
  2770.  
  2771.     wobei:
  2772.  
  2773.      t         - den Typ angibt, auf den sich die folgenden Adressen
  2774.              beziehen:  x = XDATA, i = IDATA, c = CODE
  2775.      adr1      - Startadresse für HEX-Dump
  2776.      adr2      - letztes in file zu listendes Byte
  2777.      fileName  - Files, in dem der HEX-Dump geschrieben werden soll.
  2778.  
  2779.  
  2780.     Wird  für  fileName    'PRN' eingegeben,  so wird der HEX-Dump zum
  2781.     Drucker geschickt.
  2782.  
  2783.     Der HEX-Dump wird in derselben  Form  erstellt,  wie  er  auch  in
  2784.     IDATA-, XDATA-, oder CODE - Fenster dargestellt ist.
  2785.  
  2786.     Befände  sich  das letzte Byte innerhalb einer Zeile,  so wird der
  2787.     Einfachheit halber die gesamte Zeile aufgelistet.
  2788.  
  2789.     Liegt adr2 oberhalb IDATA-Top (7Fh bei 8051,  0BFh bei  8044),  so
  2790.     wird wieder bei Adresse 0 begonnen.
  2791.  
  2792.  
  2793.  
  2794.  
  2795.  
  2796.     5.22 ----- write Code
  2797.  
  2798.     Code  kann  entweder im HEX-,  Absolut- oder Binär-Format in einen
  2799.     File geschrieben.
  2800.  
  2801.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2802.           █ w? adr1 - adr2, fileName       █
  2803.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2804.  
  2805.  
  2806.     Der Befehl  "wH adr1-adr2, fileName"  schreibt im HEX-Format,
  2807.     der Befehl  "wA adr1-adr2, fileName"  schreibt im Absolut-Format,
  2808.     der Befehl  "wB adr1-adr2, fileName"  schreibt im Binär-Format.
  2809.  
  2810.  
  2811.     wobei:
  2812.  
  2813.       adr1       - Startadresse des Code
  2814.       adr2       - letztes Byte des Codes
  2815.       fileName   - File, in dem der Code geschrieben werden soll.
  2816.  
  2817.  
  2818.                           47
  2819.  
  2820.     Wird für file  'PRN' eingegeben,  so wird der Code zum Drucker ge-
  2821.     schickt.  Dies ergibt aber bestenfalls beim HEX-Format einen Sinn,
  2822.     da der ABSOLUT- und Binär-File nicht lesbar sind.
  2823.  
  2824.     Ein so auf File geschriebener Code kann mit den Lade-Befehl wieder
  2825.     geladen werden. SIM51 kann so zur einfachen Korrektur eines nur im
  2826.     HEX- oder Absolut-Format vorhandenen Codes eingesetzt werden, oder
  2827.     zur Umwandlung eines HEX-Files in  einen  Absolut-File  und  umge-
  2828.     kehrt.  Dazu  wird der File geladen (Anfangs- und Endadressen mer-
  2829.     ken),  eventuell werden mit Hilfe des integrierten Assemblers Kor-
  2830.     rekturen vorgenommen,  und dann wird der Code mit dem Write-Befehl
  2831.     wieder in einem File geschrieben.
  2832.  
  2833.     Bei einem Binär-File werden alle unbenutzten Offset-Positionen mit
  2834.     0FFh gefüllt.
  2835.  
  2836.  
  2837.  
  2838.  
  2839.  
  2840.  
  2841.  
  2842.  
  2843.  
  2844.  
  2845.     5.23 ----- Eingabe wiederholen:
  2846.  
  2847.     Mit der [F3] - Taste kann die letzte Eingabe in  die  Command-Line
  2848.     zurückgeholt werden.
  2849.  
  2850.           █▀▀▀▀█
  2851.           █ F3 █
  2852.           █▄▄▄▄█
  2853.  
  2854.  
  2855.     Wird [F3] ein weiteres Mal gedrückt,  erscheint die Eingabe davor.
  2856.     Sind so nacheinander (in  umgekehrter  Reihenfolge)  alle  vorigen
  2857.     Eingabe erschienen, kommt als nächste wieder die vorige Eingabe.
  2858.  
  2859.     Wird  eine  Eingabe  ein zweites oder mehrere Male eingegeben,  so
  2860.     wird sie nicht mehrere Male in  die  Queue  eingetragen.  Sie  er-
  2861.     scheint aber nun als der zuletzt eingegebener String,  also weiter
  2862.     vorne in der Queue.
  2863.  
  2864.     Die Anzahl der Befehle,  die in der Queue gespeichert werden  kön-
  2865.     nen,  hängt  von  der Stringlänge der einzelnen Befehle ab (minde-
  2866.     stens 6 - bei Strings über voller  Command-Line  Länge).  Ist  die
  2867.     Queue voll, so wird der älteste Eintrag gelöscht.
  2868.  
  2869.  
  2870.  
  2871.  
  2872.  
  2873.  
  2874.  
  2875.  
  2876.  
  2877.  
  2878.                           48
  2879.  
  2880.     5.24 ----- Eingabe-Lern-Modus
  2881.  
  2882.     SIM51  kann sich in einem Lern-Modus eine Reihe von Tastatureinga-
  2883.     ben merken, um sie später wiederholt abzuarbeiten.
  2884.  
  2885.  
  2886.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2887.           █ xT                             █
  2888.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2889.  
  2890.     Mit  xT  (Teach) wird der Lern-Modus gestartet.  Der Eingabe-Lern-
  2891.     Buffer wird damit zurückgesetzt.  Alle nun folgenden Eingaben über
  2892.     die Tastatur werden in dem Eingabe-Lern-Buffer eingetragen.
  2893.  
  2894.  
  2895.  
  2896.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2897.           █ xS                             █
  2898.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2899.  
  2900.     Mit  xS  (Stop) wird der Lern-Modus beendet.  Ab nun werden  keine
  2901.     Eingaben  mehr  in den Eingabe-Lern-Buffer eingetragen.  Der  xS -
  2902.     Befehl selbst wird nicht in dem Eingabe-Lern-Buffer eingetragen.
  2903.  
  2904.  
  2905.  
  2906.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2907.           █ xW fileName                    █
  2908.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2909.  
  2910.     Mit  xW  (Write) wird der Lern-Modus beendet (wenn noch aktiv) und
  2911.     der Inhalt des Eingabe-Learn-Buffers in den angegebenen  File  ge-
  2912.     schrieben.
  2913.  
  2914.  
  2915.  
  2916.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2917.           █ xX fileName                    █
  2918.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2919.  
  2920.     Mit    xX  (eXecute) wird der Lern-Modus beendet (wenn noch aktiv)
  2921.     und die Einträge aus dem  Eingabe-Learn-Buffer  abgearbeitet.  Ist
  2922.     ein File-Name mit angegeben, so wird zuvor der Inhalt des Files in
  2923.     den Eingabe-Learn-Buffer geladen (alter Inhalt überschrieben).
  2924.  
  2925.  
  2926.  
  2927.     Dieselbe Funktion wie  xX fileName  kann auch schon beim Start von
  2928.     SIM51 erzielt werden, indem SIM51 aufgerufen wird mit:
  2929.  
  2930.                 SIM51 @fileName
  2931.  
  2932.  
  2933.     Der  Lern-Modus  wird schon vorzeitig gestoppt,  wenn der Eingabe-
  2934.     Lern-Buffer voll ist.
  2935.  
  2936.  
  2937.  
  2938.                           49
  2939.  
  2940.     Tritt bei der Abarbeitung mit xX ein Fehler auf, so wird die Abar-
  2941.     beitung gestoppt, wenn die Fehlermeldung mit irgendeiner Taste au-
  2942.     ßer Carriage Return [CR] quittiert wird.  Zu Beachten  ist  dabei,
  2943.     daß  bei  allen Tasten außer [CR] und [ESC] die Funktion der Taste
  2944.     (nach der Fehlermeldung) ausgeführt wird (siehe 4.3).
  2945.  
  2946.  
  2947.  
  2948.     Der Eingabe-Lern File kann mit einem ASCII Editor  betrachtet  und
  2949.     auch editiert werden. Jedoch ist es komfortabler und sicherer, die
  2950.     Teach-Option  zu  verwenden,  und  den File von SIM51 erstellen zu
  2951.     lassen.
  2952.  
  2953.     Tasteneinträge werden in eckige Klammern  gesetzt.  Das  Carriage-
  2954.     Return  [CR]  am  Ende  jeder  Zeile dient gleichwohl als Eingabe-
  2955.     Befehl (es wird also kein Zeichen [CR] im  File  auftreten).  Eine
  2956.     einzelne  Zeile  kann  so  sehr  lang  sein,  wenn  sie aus vielen
  2957.     Eintasten-Befehlen besteht.  Demgegenüber wird nach jedem Command-
  2958.     Line-Befehl  eine neue Zeile begonnen.  (am besten: einen File er-
  2959.     stellen und 'mal anschauen)
  2960.  
  2961.  
  2962.  
  2963.     folgende Zeichen werden verwendet:
  2964.  
  2965.     [F1]..[F9]                                - Funktionstasten
  2966.  
  2967.     [HOME] [END] [UP] [DOWN] [LEFT] [RIGHT]   - Cursorbewegung und
  2968.     [BS] [DEL] [TAB] [ESC] [INS]                Editier-Tasten
  2969.  
  2970.     [A-I] [A-X] [A-C] [A-D] [A-R] [A-F]       - Fenster-Umschalten mit
  2971.     [A-P] [A-O] [A-S] [A-T]                     [Alt] + Kennbuchstabe
  2972.  
  2973.     desweiteren ASCII - Zeichen
  2974.  
  2975.  
  2976.  
  2977.  
  2978.  
  2979.  
  2980.  
  2981.     5.25 ----- Quit:
  2982.  
  2983.     SIM51 wird beendet (exit zu DOS) wenn "q" eingegeben wird.
  2984.  
  2985.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  2986.           █ q                              █
  2987.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  2988.  
  2989.  
  2990.     Alle gesetzten Interrupts werden restauriert.  Da dies nötig  ist,
  2991.     kann  SIM51  auch  nicht über Ctrl-C abgebrochen werden.  Nach der
  2992.     Eingabe von q erfolgt keine Sicherheitsabfrage  "wirklich  verlas-
  2993.     sen?", also Vorsicht.
  2994.  
  2995.  
  2996.  
  2997.  
  2998.                           50
  2999.  
  3000.     5.26 ----- Hilfe-Funktion [F4]:
  3001.  
  3002.     Zu  jedem  Fenster gibt es einen speziellen Hilfstext mit Informa-
  3003.     tionen zu der Hardware und zur Bedienung von SIM51.
  3004.  
  3005.           █▀▀▀▀█
  3006.           █ F4 █
  3007.           █▄▄▄▄█
  3008.  
  3009.  
  3010.      *  zum Aufruf iat einfach [F4] zu drücken
  3011.      *  für die nächste Seite ist [Space] oder (Cursor-) [Down] zu
  3012.         drücken
  3013.      *  zurück: wieder [F4] drücken.
  3014.  
  3015.  
  3016.     Ist bloß eine Hilfs-Text Seite vorhanden, bleibt [Space] natürlich
  3017.     ohne Funktion.
  3018.  
  3019.  
  3020.  
  3021.  
  3022.  
  3023.  
  3024.  
  3025.  
  3026.  
  3027.  
  3028.     5.27 ----- Zyklus-Zähler:
  3029.  
  3030.     Mit dem Zyklus-Zähler kann komfortabel die Anzahl der  Zyklen  und
  3031.     damit die Zeit für die Abarbeitung einer Routine gezählt werden.
  3032.  
  3033.           █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  3034.           █ z?                             █
  3035.           █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  3036.  
  3037.  
  3038.     Mit    zS    (Start)  wird  der Zyklus-Zähler eingeblendet und auf
  3039.     00000000 gesetzt. War er schon eingeblendet, wird er nur zurückge-
  3040.     setzt.
  3041.  
  3042.     Mit  zE  (End) wird der Zyklus-Zähler wieder ausgeblendet.
  3043.  
  3044.  
  3045.     Die Einstellung: eingeblendet oder ausgeblendet wird im Konfigura-
  3046.     tionsfile gespeichert.  Beim Start von SIM51 und bei  jedem  Mode-
  3047.     Befehl,  wird  der Zyklus-Zähler gemäß der Eintragung in SIM51.CFG
  3048.     ein- oder ausgeblendet.
  3049.  
  3050.     Außerdem wird der Zyklus-Zähler bei jedem Reset auf  00000000  ge-
  3051.     setzt.
  3052.  
  3053.     Gezählt werden die CPU-Zyklen als 32 stellige HEX-Zahl. Ein Zyklus
  3054.     dauert 12 CPU-Takte, bei 12 MHz sind das genau 1 µs.
  3055.  
  3056.  
  3057.  
  3058.                           51
  3059.  
  3060.     6.1 ----- Zugriff auf Dateien, Drucker:
  3061.  
  3062.  
  3063.     Ein-/Ausgaben  in  Dateien (Files) erfolgen über handleorientierte
  3064.     DOS-System-Aufrufe (Int 21h - Funktionen 3Ch...42h). Damit verbun-
  3065.     den ist die Möglichkeit eine Eingabe/Ausgabe an  einem  unter  DOS
  3066.     vorinstallierten  Gerät  (Device) vorzunehmen.  Bei der Angabe des
  3067.     File-Namens ist einfach der unter DOS vordefinierte Gerätename an-
  3068.     zugeben (ohne ":", also "LPT1" und nicht "LPT1:").
  3069.  
  3070.  
  3071.     Tritt bei einem Zugriff auf einer Datei oder einem Gerät ein  Feh-
  3072.     ler auf, so erscheint eine Fehlermeldung, und der Anwender wird zu
  3073.     einer Eingabe von
  3074.  
  3075.        "W"    für Wiederholen (Zugriff noch einmal versuchen)   oder
  3076.        "A"    für Abbrechen aufgefordert.
  3077.  
  3078.  
  3079.     Häufige Fehler sind:  Diskette nicht eingelegt (Laufwerk A:)
  3080.                  Drucker nicht bereit
  3081.                  Schreibgeschützte Disk oder File
  3082.  
  3083.  
  3084.  
  3085.  
  3086.     (Anmerkung: SIM51 legt den DOS Critical Error Handler auf eine ei-
  3087.     gene Routine um,  die nicht die Art des Fehlers auswertet. Der An-
  3088.     wender hat also selbst zu bedenken, welche Funktion er gerade aus-
  3089.     führen wollte: ob der Drucker betroffen ist,  oder eines der Lauf-
  3090.     werke  und  wie  der  Fehler behebbar ist - beispielsweise Drucker
  3091.     einschalten und "W" drücken.)
  3092.  
  3093.  
  3094.  
  3095.  
  3096.  
  3097.     Untenstehend sind unter DOS die vordefinierten Geräte-Namen  ange-
  3098.     geben, sowie eine Anmerkung zu ihrer Anwendung unter SIM51:
  3099.  
  3100.         CON      - unter SIM51 nicht zulässig, da Bildschirmfenster
  3101.                überschrieben würden.
  3102.  
  3103.         AUX      - AUX = COM1 ist 1. serielle Schnittstelle, COM2 die
  3104.         COM1       2. usw. Mit  "WH 0-FFF, COM1" könnte beispielswei-
  3105.         COM2       se der Code im Intel-Hex Format an einem an COM1
  3106.                angeschlossenen Eprommer gesendet werden. Das Le-
  3107.                sen von einer seriellen PC-Schnittstelle ist etwas
  3108.                problematisch (siehe unten).
  3109.  
  3110.         PRN      - PRN = LPT1 ist 1. parallele Schnittstelle, LPT2
  3111.         LPT1       die 2. usw. Ausgabe von Hex-Dumps (Befehl "PH
  3112.         LPT2       ...") und disassemblierten Code (Befehl PD ...)
  3113.                an einem Drucker ist hier sinnvoll.
  3114.  
  3115.         NUL      - nicht sinnvoll
  3116.  
  3117.  
  3118.                           52
  3119.  
  3120.     Bei  der  Ausgabe  an Druckern ist zu beachten,  daß viele Drucker
  3121.     über einen internen Buffer verfügen,  und empfangene Zeichen  erst
  3122.     nach dem Erhalt eines Carrige Returns ausdrucken.
  3123.  
  3124.  
  3125.     Eine  Eingabe vom Drucker ist nicht sinnvoll.  Von einer seriellen
  3126.     Schnittstelle kann eine Eingabe erwartet werden, wenn ein entspre-
  3127.     chendes Gerät angeschlossen ist, das hier sinnvolle Daten sendet.
  3128.  
  3129.  
  3130.     Schwierigkeiten macht das Einlesen von  seriellen  Schnittstellen:
  3131.     Die  MSDOS-Funktionen versuchen den gesamten übergebenen Buffer zu
  3132.     füllen, bevor sie zum aufrufenden Programm zurückkehren. Die Länge
  3133.     der über COM-Port empfangenen Datei ist jedoch nicht bekannt.  Die
  3134.     MSDOS-Funktion wartet immer noch, auch wenn die Datei schon längst
  3135.     empfangen wurde.  Für jedes Zeichen wird nur eine vom BIOS festge-
  3136.     legte TimeOut-Zeit gewartet.  Nach Überschreiten dieser Zeit trägt
  3137.     die MSDOD-Funktion einfach ein 0 ein, bringt aber keine Fehlermel-
  3138.     dung.
  3139.  
  3140.     Hier  wurde die MSDOS-Funktion von einer eigenen Funktion in SIM51
  3141.     abgefangen:
  3142.             Wird eine Eingabe von einem  COM-Port  aufgerufen,  so
  3143.     erscheint zuerst eine Meldung für den Anwender, daß er die Eingabe
  3144.     mit  der [ESC] Taste abbrechen kann.  Wurde noch kein Zeichen emp-
  3145.     fangen,  so wird für immer gewartet (es könnte ja  sein,  daß  das
  3146.     sendende  Gerät  erst  eingeschalten werden muß).  Wurde schon ein
  3147.     Zeichen empfangen, kehrt die Funktion zur aufrufenden Funktion zu-
  3148.     rück,  und übergibt die bereits empfangenen Daten.  Es  könnte  ja
  3149.     sein, daß die Ende-Kennung (z.B. bei einem HEX- oder Absolut-File)
  3150.     schon da ist, wenn nicht, wird die aufrufende Funktion erneut ver-
  3151.     suchen, noch mehr zu lesen.
  3152.  
  3153.     Verwendet  werden  die BIOS-Funktionen des Interrupts 14h.  Leider
  3154.     arbeiten diese ohne Interrupt.
  3155.  
  3156.     Achtung: Baudrate vor dem Start von SIM51  über  DOS-Mode  Befehle
  3157.     einstellen.  Nicht  über  [F2] Taste im Seriell Simulation-Fenster
  3158.     den gleichen Port für die serielle Simulation wählen!
  3159.  
  3160.  
  3161.  
  3162.  
  3163.  
  3164.  
  3165.  
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171.  
  3172.  
  3173.  
  3174.  
  3175.  
  3176.  
  3177.  
  3178.  
  3179.                           53
  3180.