Index of /atarilibrary/atari_cd04/DEBUGGER/TMON202/SYMBOL

      Name                    Last modified       Size  Description

[DIR] Parent Directory 11-May-2007 21:03 - [TXT] CHANGES 18-May-1993 14:47 9k [DIR] C_SOURCE/ 11-May-2007 21:03 - [DIR] SYMBOL/ 11-May-2007 21:03 - [DIR] TEMPLMON/ 11-May-2007 21:03 - [DIR] WATCHDOG/ 11-May-2007 21:03 -

                       ********************************
                       * Resident Symbol Driver V1.22 *
                       ********************************
                       *    Public-Domain-Software    *
                       *       (Stand 18.05.93)       *
                       ********************************


Unter der Voraussetzung, daá die Dateien

     README             (diese Datei)
     CHANGES            (bisherige Žnderungen am Symbol-Treiber)
     C_SOURCE\
        SHOWSYMB.C      (ein Beispielprogramm in C)
        SHOWSYMB.H      (die Definitionen der Symbol-Strukturen)
        SHOWSYMB.PRJ    (die TurboC/PureC-Projektdatei)
        SUBROUT.S       (die Assembler-C-Schnittstelle)
     SYMBOL.122\
        SYMBOL.PRG      (Resident Symbol Driver - der eigentliche Treiber)
        SYSTEM.SMB      (die System-Symboltabelle im gepackten Format (s.u.))
        SYSTEM.S        (die System-Symboltabelle als ASCII-Datei)
        SYSTEM.SRC      (die System-Symboltabelle als TurboAss-Datei)
        SYM2SMB.PRG     (Konvertierer TurboAss *.SYM => *.SMB)
     TEMPLMON.MOD\
        CHANGES         (Žnderungen am Templemon-Modul)
        DEUTSCH\
           TMONMODS.EXE (Templemon-Modul zur Symboltabellen-Verwaltung)
        ENGLISH\
           TMONMODS.EXE (Templemon-Modul (Texte in Englisch))
     WATCHDOG.111\
        README          (README zum Shareware-Programm WATCHDOG)
        CHANGES         (Žnderungen von WATCHDOG)
        WATCHDOG.ACC    (Steueraccessory von WATCHDOG)
        WATCHDOG.RSC    (Resourcedatei fr das Accessory)
        WDOG_TSR.PRG    (speicherresidenter Teil von WATCHDOG)
        BEISPIEL.TOS    (Beispielprogramm; n„heres siehe WATCHDOG\README)
        BEISPIEL.C      (Source-Code zum Beispielprogramm)

unver„ndert  kopiert  werden,  darf  dieses  Programm fr private Anwender frei
kopiert  und  benutzt werden. Kommerzielle Nutzung in jeder Form (dies schlieát
auch den Vertrieb ber Public-Domain-Sammeldisketten oder „hnliches ein), ist

                          ****************************
                          **   NICHT GESTATTET !!   **
                          ****************************


Hinweis / Copyright:
====================

Fr  eventuelle  auftretende  Probleme  oder  Datenverluste,  die bei Benutzung
dieses Programmes entstehen, wird keine Haftung bernommen.

Aufgrund  der  Funktionsweise  kann es  zu St”rungen  beim Betrieb  mit anderen
Programmen kommen. Da ich nicht in der Lage bin, Tests ber die Vertr„glichkeit
mit allen vorhandenen Programmen zu machen, w„re ich jedem dankbar, der mir ein
Problem beschreiben k”nnte. Dazu brauche ich allerdings die Sicherheit, daá der
Fehler nur im Zusammenhang mit dem betreffenden Programm auftritt und nicht der
Seiteneffekt  eines  anderen  Programmes ist. Deshalb  sollte  man  vorher alle
anderen Programme  entfernen und  versuchen, die  Bedingungen, unter  denen der
Fehler auftrat,  wiederherzustellen.  Wenn der Fehler dann immer noch auftritt,
so bitte ich die betreffende Person,  sich mit mir schriftlich in Verbindung zu
setzen.

Fr Fragen, Wnsche, Verbesserungen oder Probleme wenden Sie sich bitte an:

                               Robert Federle
                                Rungestr. 3
                             W-8900 Augsburg 22


Wozu ist der Symbol-Treiber berhaupt gedacht?
==============================================

Dieses  Programm  installiert  fr  jedes  geladene  Programm  zus„tzlich  eine
Symboltabelle  im  Speicher,  falls  das  Programm eine solche Tabelle besitzt.
Damit  ist  es  nun  m”glich,  in  Verbindung mit einem entsprechend angepaáten
Debugger  (z.B. Templemon)  Accessories  und speicherresidente Programm wie ein
normales Programm zu debuggen.

Der   Treiber   installiert   sich   resident  im  Speicher  und  verbiegt  den
GEMDOS-Vektor (TRAP  #1) nach dem XBRA-Verfahren.

Auáerdem  wird  in  der  Cookie-Jar-Tabelle  ein  Cookie  mit  dem Namen "SYMB"
angelegt,  dessen  Parameter  ein  Zeiger  auf  die  Schnittstellen-Struktur
SymbolCookie (siehe unten) ist.

Folgende GEMDOS-Funktionsaufrufe werden abgefangen:

              PEXEC, PTERM0, PTERM, PTERMRES und MFREE.

Wenn nun ein Programm mit PEXEC (0, ...) oder PEXEC (3, ...) gestartet wird, so
wird  aus  dem  Dateikopf  ermittelt,  ob  eine  Symboltabelle  an das Programm
angeh„ngt ist. Dann wird ein Speicherblock angefordert, der groá genug ist, die
Tabelle  sowie  Zusatzinformationen  aufzunehmen.  Diese Tabelle wird ber eine
Struktur  in  die verkettete Liste eingeh„ngt. Danach wird das Programm mit dem
Modus  3  geladen,  die  Daten  aus der Basepage geholt und dann PEXEC (4, ...)
ausgefhrt.

Wenn  ein  Programm beendet wird, so wird die zugeh”rige Struktur aus der Liste
ausgeh„ngt  und  der  Speicher  fr  das  Programm  sowie fr die Symboltabelle
freigegeben.

Der  MFREE-Aufruf  wird  nur deshalb abgefangen, um auch das Debuggen von ACCs,
die  mit  Hilfe  von  Cham„leon  nachgeladen wurden, zu erm”glichen. Diese ACCs
werden  mittels PEXEC (3, ...) geladen, jedoch niemals mit PTERM o.„. beendet!!
Aus   diesem   Grund   wird  bei einem MFREE-Aufruf geprft, ob es sich bei der
bergebenen   Adresse   um   die   Basepage   eines   im  Speicher befindlichen
Programms handelt.


Die erkannten Symbol-Tabellen-Formate:
======================================

Der Symbol-Treiber  ist  prinzipiell in der Lage, alle bekannten Symbol-Formate
einzulesen  und zu verarbeiten. Jedoch sind viele Firmen nicht in der Lage, fr
ihre  Compiler/Assembler bestehende Symbol-Formate weiter zu verwenden, weshalb
es so viele verschiedene (und meiner Meinung nach unn”tige) Formate gibt.

Die derzeit erkannten Formate sind:


1. DRI-Format #1 (z.B. Alcyon C, TurboAss)
==========================================

Dieses Format ist am h„ufigsten anzutreffen, da es eines der ersten Formate war
und  sich  deshalb  zu einem Standard entwickelt hat. Die Symbol-Namen sind auf
maximal 8 Zeichen beschr„nkt.


2. DRI-Format #2 (z.B. TurboC/PureC)
====================================

Dieses Format unterscheidet sich vom DRI-Format #1 nur geringfgig. Anscheinend
waren  einige Programmierer nicht zufrieden mit der vorhandenen Implementation,
weshalb  sie  im  Gegensatz  zur  Original-Definition  die BSS-Symbole segment-
relativ machten (Original: Offset immer zum TEXT-Segment-Anfang).


3. GST-Format (z.B. TurboAss, GNU-C (ab V2.0))
==============================================

Dieses  Format  ist aus dem DRI-Format entstanden, mit der Idee, die Anzahl der
Zeichen  pro  Symbol  zu  erh”hen.  Mit  diesem  Format  sind bis zu 22 Zeichen
m”glich.


4. Sozobon-Format (Erweitertes Format ab V2.0)
==============================================

Bis zur Version 2.0 benutzte dieser Public-Domain C-Compiler das DRI-Format. Ab
der V2.0 wurden einige Ver„nderungen vorgenommen, um theoretisch beliebig lange
Symbol-Namen  zu  erm”glichen. Dennoch ist das Symbol-Format noch kompatibel zu
dem  DRI-Format  (d.h.  es kommt zu keiner Fehlermeldung beim Einsatz mit einem
Linker, der nur das DRI-Format kennt), was man vom GST-Format nicht sagen kann.


Zuknftige Erweiterungen:
=========================

Da die Benutzer der PureC-Compiler derzeit nur das DRI-Format verwenden k”nnen,
ist  eine  šbernahme  der  internen  Debug-Informationen  geplant,  wodurch die
Original-Namen  eingesetzt werden k”nnen.  Dies ist allerdings von der Koopera-
tionsbereitschaft der PureC-Entwickler abh„ngig.


Die verwendeten Strukturen:
===========================

Die  Liste  der  im Speicher befindlichen Symbol-Strukturen ist ber den Cookie
"SYMB"  erreichbar. Der Cookie-Parameter stellt dabei einen Zeiger auf folgende
Struktur dar:

typedef struct SYMBOLCOOKIE
{
    WORD    Version;                 /* Aktuelle Versionsnummer des Treibers */
    WORD    Revision;                /* Aktuelle Revisionsnr. des Treibers */
    SymbolHeader    *First;          /* Zeiger auf die 1. Struktur oder NULL */
    long    (*GetSymbolName) ();     /* Adresse in Symbolnamen umwandeln */
    long    (*GetSymbolValue) ();    /* Symbolname in Adresse umwandeln */
    long    (*AddSymbolTable) ();    /* Symboltabelle hinzufgen */
    long    (*RemoveSymbolTable) (); /* Symboltabelle entfernen */
} SymbolCookie;

oder in Assembler:

SymbolCookie:
    Version            EQU 0
    Revision           EQU 2
    First              EQU 4
    GetSymbolName      EQU 8
    GetSymbolValue     EQU 12
    AddSymbolTable     EQU 16
    RemoveSymbolTable  EQU 20


Die Struktur fr jede Symbol-Tabelle hat folgendes Format:

typedef struct SYMBOLHEADER
{
    char    ProgramName [13];   /* Programmname (groá, 0-terminiert) */

    char    reserved;           /* reserviert */

    WORD    SymbolCount;        /* Anzahl der Symbole (TEXT, DATA, BSS) */
    WORD    FirstData;          /* Index des ersten DATA-Symbols */
    WORD    FirstBss;           /* Index des ersten BSS-Symbols */

    void    *SymbolValues;      /* Zeiger auf die Werte-Offset-Tabelle */
    void    *SymbolNames;       /* Zeiger auf die Namens-Offset-Tabelle */
    Symbol  *SymbolData;        /* Zeiger auf die Symboldaten */

    LONG    FirstAddress;       /* TEXT-Segment-Start */
    LONG    LastAddress;        /* BSS-Segment-Start + BSS-Segment-GrӇe */
    BASPAG  *Basepage;          /* Zeiger auf die Basepage des Programms */

    struct SYMBOLHEADER *Next;  /* Zeiger auf die n„chste Struktur */

} SymbolHeader;

oder in Assembler:

    ProgramName:   ds.b 13
    reserved:      ds.b 1

    SymbolCount:   ds.w 1
    FirstData:     ds.w 1
    FirstBss:      ds.w 1

    SymbolValues:  ds.l 1
    SymbolNames:   ds.l 1
    SymbolData:    ds.l 1

    FirstAddress:  ds.l 1
    LastAddress:   ds.l 1
    Basepage:      ds.l 1

    Next:          ds.l 1


Bei  den Offsettabellen SymbolValues und SymbolNames handelt es sich jeweils um
16-Bit  groáe  Eintr„ge,  die  relativ  zu  den  Symboldaten  ab  SymbolData zu
verstehen sind.


Die Symboldaten werden in einem eigenen Format im Speicher abgelegt:

typedef struct SYMBOL
{
    LONG    Value;              /* Wert des Symbols */
    BYTE    Type;               /* Typ-Byte / GrӇen-Byte des Symbols */
    BYTE    Name [];            /* Symbolname (0-terminiert) */
} Symbol;

oder in Assembler:

Symbol:
    Value:   ds.l 1
    Type:    ds.b 1
    Name:    ds.b 1 ; bis zu 22 Zeichen + 1 Null-Byte

Die  Bits  7  bis  5 von Type bestimmen den Typ des Symbols. Wenn Bit 7 gesetzt
ist,  so handelt es sich um ein DATA-Symbol. Bit 6 ist fr TEXT-Symbole und Bit
5  fr BSS-Symbole zust„ndig. Wenn alle 3 Bits gesetzt sind, so handelt es sich
um ein System-Symbol aus einer Symboldatei.

Die restlichen Bits 6-0 geben an, wie groá die aktuelle Struktur in Bytes ist.


Beispieladressierung:
=====================

Jeder   Eintrag   in   der  Offset-Tabelle  gibt an, ab welcher Position in den
Symboldaten das zugeh”rige Symbol steht. Z.B.:

    SymbolData = $10000, Offset = $246  =>  Symboldaten stehen bei $10246

Um z.B. das erste DATA-Symbol zu erreichen, sind folgende Schritte n”tig:

In C: (Pointer zeigt auf die Symbol-Struktur)

    WORD    Index, Offset;
    Symbol  *SymbolPointer;

    Index = Pointer->FirstData;
    Offset = (Pointer->SymbolValues) [Index];
    SymbolPointer = (Symbol *) ((LONG) Pointer->SymbolData + (LONG) (Offset);

oder in Assembler: (A0 zeigt auf die Symbol-Struktur)

    move.w  FirstData(A0),D0        ; 1. Index der DATA-Symbole holen
    add.w   D0,D0                   ; mal 2 (wegen WORD)
    movea.l SymbolValues(A0),A1     ; Zeiger auf die Werte-Offsets holen
    move.w  0(A1,D0.w),D0           ; Offset holen
    movea.l SymbolData(A0),A1       ; Zeiger auf die Symbol-Daten holen
    adda.w  D0,A1                   ; Offset addieren


Die Funktionen-Schnittstelle:
=============================

Der  Cookie-Wert zeigt auf die Schnittstellen-Struktur vom Typ SymbolCookie. In
diese  Struktur  sind  die  Adressen  von 4 Routinen eingetragen, mit denen die
internen Routinen aufgerufen werden k”nnen.

Allen  Routinen  ist gemeinsam, daá sie nur die Register ver„ndern, die fr die
Parameterbergabe  ben”tigt  werden.  Die  restlichen  Register  werden von den
Routinen vorher gerettet.

Folgende Routinen stehen derzeit zur Verfgung:

******************
* GetSymbolName: *
****************************************************
* IN:  D0.l: Adresse, zu der der Name gesucht wird *
* OUT: D0.l: = 0: Symbol gefunden                  *
*                 A0.l: Zeiger auf Symboldaten     *
*                 A1.l: Zeiger auf die Struktur    *
*            <>0: Symbol nicht gefunden            *
****************************************************

Diese  Routine  wird  eingesetzt, um zu einer bekannten Adresse einen passenden
Symbolnamen  zu suchen, falls ein Symbol mit einem entsprechenden Wert in einem
der im Speicher befindlichen Programm existiert.

Die  Adresse,  zu  der  der Symbolwert gesucht wird, wird in D0 bergeben. Nach
Aufruf  der Routine gibt D0 an, ob das Symbol gefunden wurde (D0.l = 0) oder ob
ein  passendes  Symbol  nicht  existiert  (D0.l <> 0). Nach einer erfolgreichen
Suche  zeigt  A0  auf  die interne Symbolstruktur (siehe unten), wohingegen das
Register  A1  auf  die  zugeh”rige Symboltabellenstruktur zeigt. Somit kann man
herausbekommen, in welchem Programm die Adresse liegt.


*******************
* GetSymbolValue: *
**********************************************************************
* IN:  A0.l: Zeiger auf Symbolnamen                                  *
*      A1.l: Zeiger auf Programmnamen oder NULL fr alle Programme   *
*            Der Programmname kann auch den Allquantor '*' enthalten *
* OUT: D0.l: = 0: Symbol gefunden                                    *
*                 A0.l: Zeiger auf Symboldaten                       *
*                 A1.l: Zeiger auf die Struktur                      *
*            <>0: Symbol nicht gefunden                              *
**********************************************************************

Diese  Routine  stellt  das  Gegenstck  zu  GetSymbolName  dar, indem zu einem
gegebenen Symbolnamen der zugeh”rige Symbolwert gesucht wird.

Hierzu  wird  in A0 ein Zeiger auf den 0-terminierten Symbolnamen und in A1 ein
Zeiger  auf  den  Programmnamen  bergeben.  Wenn in A1 der Wert NULL bergeben
wird,  so  wird  zuerst  die  Symboltabelle des aktuellen Programms durchsucht.
Sollte  dabei  kein  Treffer  erzielt werden, so wird die Tabelle vom Anfang an
durchsucht.

Wenn  in  A1  ein  Zeiger  ungleich  NULL  bergeben  wird  oder wenn der in A0
bergebene  String  das Format 'Programmname:Symbolname' besitzt, so werden nur
die Symboltabellen der Programme untersucht,  auf die der Programmname paát. Da
im  Programmnamen  auch  der  Wildcard '*' zugelassen ist, kann man somit auch
Programme debuggen, die aus mehreren Teilen bestehen (z.B. ein vektorverbiegen-
des, residentes Programm zusammen mit seinem Steueraccessory).

In  D0  wird  nach  dem  Aufruf  wieder  der  Erfolg (D0.l = 0) oder Misserfolg
(D0.l <> 0) gemeldet. Die Register A0 und A1 enthalten nach einer erfolgreichen
Suche die entsprechenden Zeiger (n„heres siehe GetSymbolName).


*******************
* AddSymbolTable: *
************************************************
* IN:  A0.l: Zeiger auf den Programmnamen      *
*      A1.l: Zeiger auf die Basepage oder NULL *
* OUT: D0.l: = 0: Tabelle geladen              *
*            <>0: Fehler aufgetreten           *
************************************************

Mit  dieser Funktion kann nachtr„glich eine Symboltabelle in die verkette Liste
eingeh„ngt werden. Hierzu wird in A0 ein Zeiger auf den Programmnamen und in A1
ein Zeiger auf die Basepage im Speicher oder der Wert  NULL  bergeben.  A0 muá
dabei auch den Pfad enthalten,  wenn das Programm nicht im  aktuellen Directory
steht.

Der Wert NULL hat fr das Register  A1  eine besondere Bedeutung:  hiermit wird
angezeigt,  daá es sich  bei dem  Pfadnamen in  A0 um den Namen  einer fertigen
Symboltabelle handelt, die nur eingelesen werden muá.

Als  Ergebnis  erh„lt  man  in D0 entweder den Wert 0 (= Tabelle konnte geladen
werden),  den Wert  1  (= ein Fehler ist aufgetreten) oder den  Wert  2  (= der
Treiber ist gerade durch einen anderen Prozess belegt).


**********************
* RemoveSymbolTable: *
*******************************************
* IN:  A0.l: Zeiger auf Programmnamen     *
* OUT: D0.l: = 0: Tabelle entfernt        *
*            <>0: Programm nicht gefunden *
*******************************************

Mit  dieser  Routine kann eine Symboltabelle aus der verketten Liste ausgeh„ngt
werden.   Hierzu   bergibt   man  in  A0  einen  Zeiger  auf den eigentlichen
Programmname (z.B. "EDITOR.PRG").

Als  Ergebnis  erh„lt  man in D0 entweder den Wert 0 (= Tabelle konnte entfernt
werden),  den Wert 1 (= Programm konnte nicht gefunden werden) oder den  Wert 2
(= der Treiber ist gerade durch einen anderen Prozess belegt).


Beispielprogramm:
=================

Im  Ordner C_SOURCE findet sich der Sourcecode fr ein Programm, mit dem die im
Speicher  befindlichen  Strukturen  angezeigt  werden  k”nnen.  Dieses Programm
demonstriert   auáerdem  die  Anwendung  der  internen  Funktionen  und  stellt
zus„tzlich eine Schnittstelle fr PureC-Programm dar (siehe SUBROUT.S).


Utilities:
==========

Die Datei SYSTEM.SMB enth„lt alle Definitionen bis einschlieálich TOS 3.01, die
fr  die Betriebssystemvariablen und Hardwareadressen n”tig sind (entnommen aus
dem  Atari  Profibuch  ST/STE/TT  von  Jankowski/Rabich/Reschke  aus dem Sybex-
Verlag. Diese Datei sollte in den Auto-Ordner des Bootlaufwerks kopiert werden,
da  der  Symbol-Treiber  beim  Hochfahren  des Rechners diese Datei automatisch
l„dt.

Das Format einer solchen Symboldatei muá wie folgt aussehen:

typedef struct
{
    LONG    Size;          /* GrӇe der Symboldaten in Bytes */
    WORD    Count;         /* Anzahl der folgenden Symbole */
    Symbol  Data [Size];   /* Symboldaten */
} SymbolFile;

Bei  den  Symboldaten muá man darauf achten, daá jedes Symbol aus einer geraden
Anzahl an Bytes besteht. Notfalls muá man ein Fllbyte am Schluá hinzufgen und
die GrӇe der Symbolstruktur (Definition siehe oben) anpassen.

Die  Dateiextension  fr  die  Symboldateien des Resident Symbol Drivers sollte
SMB lauten, damit es nicht zu einer Verwechslung mit den TurboAss-Symboldateien
*.SYM kommt.

Damit  die  Erstellung  einer  Symboldatei einfacher ist, kann man das Programm
SYM2SMB.PRG  benutzen,  das  eine  Symboldatei  des TurboAss  von ä-Soft in das
ben”tigte Symbolformat konvertiert.

***************************************************************************
* Achtung! Die Symboldateien tauchen in der Programmbersicht nicht auf!! *
***************************************************************************