Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Demoprogramm: CODEPTR - Adresse von Tabellen oder von Code bestimmen Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von das |_ Team, Homepage - 21.09.2020 2:56)
 Als Antwort auf Demoprogramm: CODEPTR - Adresse von Tabellen oder von Code bestimmen von Dietmar - 19.09.2020 18:36
das |_ Team nutzt:  CC1-Unit V1.1, CC1-M-Unit V1.1, CC1-Station V1.1, Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
Hallo liebes Forum,

eine alternative Methode, um Adressen von Tabellen oder von Code zur Laufzeit des Programms und im Programm selbst zu bestimmen, möchten wir hier vorstellen. Genutzt wird der Umstand, dass der BASIC-Kompiler für jeden Sprungbefehl die Adresse des zugehörigen #Codelabel bzw. TABelle im Tokencode direkt hinter hinter diesem Sprungbefehl ablegt. Befindet sich nun aber z.B. ein Sprungbefehl "GOTO (Codelabel)" in bekanntem Abstand vor einer Tabelle (weil wir ihn dort absichtlich hingeschrieben haben), so kann man die Adresse mittels LOOKTAB und dem passenden negativen Leseindex in eine Variable übernehmen, und beliebig weiter verarbeiten.

Das nachfolgende Beispielprogramm veranschaulicht das Prinzip






' ===========================================================================
' Demoprogramm: CODEPTRL - Adresse von Tabellen oder von Code bestimmen
' In OCBASIC 1.11a fuer Open-Maxi von Dietmar Harlos am 10. September 2020
' ===========================================================================
' Alternative Methode mittels LOOKTAB, von "das |_ Team" verwendbar unter GPL.
'
' Manchmal ist es nuetzlich, die Adresse von Tabellen oder von Code zu kennen.
' Zum Beispiel fuer den PEEK-Befehl. Leider existiert in OCBASIC keine
' CODEPTR-Funktion, die so etwas ermoeglichen würde. Aber wie es trotzdem geht
' wird hier in diesem Beispielprogramm demonstriert.

'  Im Folgenden die wichtigsten Unterschiede zum Beispielprogramm aus
'  der Vorlage in http://ccintern.dharlos.de/forum/neu.php?eintrag=17083

' - den Code-Labeln oder/und Tabellen brauchen keine INLASM Funktionen voran
'   gestellt werden, um die gewuenschten Bereiche zu markieren.

' - die Auswahl der zu bestimmenden Code-Label oder/und Tabellen kann nunmehr
'   zentral in der Tabelle "Adressen" erfolgen. (Und bei Bedarf zusaetzlich
'   in der DEFINE-Sektion zu Beginn des Quelltextes

' - Die LOOKTAB-Methode ohne Assembler eignet sich gleichermasssen fuer
'   die Open-Maxi, die Open-Macro, C-Control 1.1,  1.2, sowie 2.xx, sofern
'   keine OM-spezifischen Bezeichner verwendet werden: (ADD, PEEK, UPROGBASE,
'   PrintSPC, PrintHEX, End2HOST), usw.
'
' - Der Overhead in der Adresstabelle belegt 4 Bytes pro Label/Tabelle.
'   Bei Bedarf koennte dies aber noch auf 3 Bytes gesenkt werden.

' - Mit der LOOKTAB-Methode werden die Adressen im Adressraum der VM bestimmt,
'   fuer welchen der Compiler den Tokencode erzeugt. Um hieraus die physikalischen
'   Adressen des Programmspeichers zu berechnen, muesste man auf die virtuellen
'   Asdressen den Offset fuer das jeweilige Zielsystem addieren.

'   Die LOOKTAB-Methode mit negativem Leseindex auf die "Automatische Tabelle"
'   kommt auch mit der Firmware-Erweiterung 'Lbit' zum Einsatz. Beispielsweise
'   bei Registrierung des "User Interface Programm" (UIP) als Plugin zur Laufzeit.
'   Siehe Screenshot bei: http://ccintern.dharlos.de/forum/neu.php?eintrag=17085

'   (Ergaenzgung der Vorlage durch "das |_ Team", am 21.September 2020)

' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"        'Definitionen fuer die Open-Maxi

DEFINE ptr_ENDE      -5   '
DEFINE ptr_Tabelle1  -3   '  Definitionen fuer automatische Adresstabelle (s.u.)
DEFINE ptr_START     -1   ' /

DIM a BYTE
DIM w WORD


' --- Hauptprogramm ---------------------------------------------------------
#START
PRINT " CODEPTR (LOOKTAB-METHODE)"

PrintSpc=ON               'Dezimale Zahlen mit fuehrendem Leerzeichen ausgeben
End2Host=ON               'Bei Programmende gleich in den Host-Modus wechseln

PRINT

w=LOOKTABWORD(Adressen,ptr_Tabelle1)     'Adresse von tabelle1 ermitteln

PrintHex=ON               'Und Adresse und einige Bytes ausgeben
PRINT "Tabelle: $";w;
ADD w,UPROGBASE
PRINT ", ($";w;") ";     'VM-Adresse, (physikalische Adresse)
PrintHex=OFF
FOR a=0 TO 4
  PRINT PEEK(w+a);
NEXT a
PRINT



w=LOOKTABWORD(Adressen,ptr_START) 'Startadresse dieses Programms ermitteln

PrintHex=ON               'Adresse und einige Bytes aus PRINT-Anweisung ausgeben
PRINT "Label:   $";w;
ADD w,UPROGBASE
PRINT ", ($";w;") ";      'VM-Adresse, (physikalische Adresse)
PrintHex=OFF
FOR a=0 TO 21
  PUT PEEK(w+a)
NEXT a
PRINT ".."
PRINT

'Weiteres Anwendungsbeispiel: Laenge des Programms berechnen...

'Mittels LOOKTAB-Methode:
w=LOOKTABWORD(Adressen,ptr_ENDE): PRINT "Bytes:";w - LOOKTABWORD(Adressen,ptr_START)

'...auf den OM-Controllern kann man hierfuer auch PEEKW verwenden:
'    PRINT PEEKW(UPROGBASE+2)


'--- "Automatische Tabelle" mit den vom Compiler berechneten Startadressem... ---
 END:GOTO ENDE               ' -5  (usw., kann vom Anwender ergaenzt werden)    '
 END:GOTO tabelle1           ' -3  (Lies: "LOOKTAB-Leseindex minus drei"        '
 END:GOTO START              ' -1  (Lies: "LOOKTAB-Leseindex minus eins"        '
 TABLE Adressen TABEND       '                                                  '
'----------------------------|--------------------------------------------------                                                 '


' --- Tabellen --------------------------------------------------------------

TABLE tabelle1 BYTE
  4 3 2 1 0
END TABLE

#ENDE


Bild: Beispielanwendung zur LOOKTAB-Methode. Das 'Lbit' - User Interface Plugin.



Passender Link: http://visit.ghn-sensorik.de/L-Team/Lvm/Userhost.htm

Meine Homepage: http://visit.ghn-sensorik.de/L-Team/

 Antwort schreiben

Bisherige Antworten:

Re: Demoprogramm: CODEPTR - Adresse von Tabellen oder von Code bestimmen (von Dietmar - 21.09.2020 3:53)