Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


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 

 Assemblerkurs für die OM-Mikrocontroller - Teil 4 Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 2.03.2018 1:12)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ----------------------------------------------------------------------------
' Assemblerkurs für die OM-Mikrocontroller - Teil 4
' In OCBASIC 1.11a für die Open-Macro von Dietmar Harlos am 28. Februar 2018
' ----------------------------------------------------------------------------

' Dieser Teil des Assemblerkurs verdeutlicht einige Fallstricke bei der
' Assemblerprogrammierung: Es werden die Unterschiede zwischen den zwei
' Adressierungsarten IMM und DIR erklärt und auf das 16-Bit Index-Register
' H:X eingegangen.

' ----------------------------------------------------------------------------

INCLUDE "omac.def"              'Definitionen für die Open-Macro

DIM variable BYTE               'eine Bytevariable im RAM
DEFINE konstante 123            'eine Konstante

' ----------------------------------------------------------------------------

' Das Hauptprogramm in OCBASIC:

' Auf der Seriellen Schnittstelle wird Folgendes ausgegeben:

' 43
' 34

variable=42                     'Variable auf Wert setzen.

PRINT asm                       'Assemblerroutine aufrufen und zurückgegebenen Wert auf
                                ' der Seriellen Schnittstelle ausgeben.

PRINT variable                  'Den zweiten in der Variable zurückgegebenen Wert ausgeben.

End2Host=ON                     'Nach Programmende in den Host-Modus
END                             'Programmende

' ----------------------------------------------------------------------------

FUNCTION asm INLASM             'Assemblerroutinen müssen durch das Schlüsselwort INLASM gekennzeichnet werden

' ----------------------------------------------------------------------------

' 1. Beispiel: Die zwei Adressierungsarten IMM und DIR

' Die Adressierungsarten "IMM 8-bit immediate (unmittelbar)" und "DIR 8-bit direkt" unterscheiden sich bei
' den OM-Controllern nur durch ein vorangestelltes Doppelkreuz, auch Number-Zeichen genannt (#). Das sorgt
' bei vielen Anfängern für Verwirrung. Es ist aber wichtig, die beiden Adressierungsarten auseinanderzuhalten,
' denn sie führen zu ganz unterschiedlichen Resultaten:

! lda #100                     'Lade Akkumulator (A) mit Wert 100
! lda 100                       'Vorsicht: Lade Akkumulator (A) mit Wert, der auf Adresse 100 steht

! lda #konstante               'Lade Akkumulator (A) mit Wert der Konstanten (123)
! lda konstante                 'Vorsicht: Lade Akkumulator (A) mit Wert, der auf Adresse 123 steht

! lda #variable                'Vorsicht: Lade Akkumulator (A) mit Adreßwert der Variable
! lda variable                  'Lade Akkumulator (A) mit Inhalt der Variable

' ----------------------------------------------------------------------------

! inca                          'erhöhe Akkumulator (A) um eins
! jsr FwPush                    'Byte auf dem Rechenstack speichern, Übergabe vom Byte im Akkumulator (A)

' ----------------------------------------------------------------------------

' 2. Beispiel: Das 16-Bit Index-Register H:X

' Die 6808-CPU besitzt ein 16-Bit Index-Register namens H:X, wobei H das höherwertige und X das niederwertige
' Byte ist. Wenn das H-Register null ist, arbeitet die CPU des OM-Controllers genauso wie die 6805-CPU der
' Original-C-Control (Version 1.1), denn die 6808-CPU ist objektcode- und quellcodekompatibel zur 6805-CPU.
' Beim Aufruf einer Anwender-Assemblerroutine setzt das OM-Betriebssystem das H-Register immer auf null.
' Im weiteren Programmverlauf muß der Anwender aber natürlich selber darauf achten, daß das H-Register einen
' sinnvollen Wert enthält, nachdem es benutzt wurde. Sicherheitshalber sollte ein CLRH-Befehl verwendet werden.

! ldhx #12345                  '16-Bit Index-Register H:X auf Wert setzen

! pusha                         'Inhalt vom Akkumulator (A) ins H-Register kopieren
! poph

! clrh                          'H-Register auf null setzen

! ldx #2                       'X-Register auf Wert 2 setzen
! lda tabelle1,x                'aus einer Tabelle lesen (Vorsicht: Adresse ist tabelle1 + h:x)
! sta variable                  'Speichern in der Variable

' ----------------------------------------------------------------------------

! rts                           'Rücksprung zum Betriebssystem

' ----------------------------------------------------------------------------

END FUNCTION

' ----------------------------------------------------------------------------

TABLE tabelle1 BYTE             'Eine Tabelle im Byte-Format
   122 95 34 211
END TABLE

' ----------------------------------------------------------------------------

INCLUDE "om_fw.pro"             'INCLUDE-Datei für Firmwareroutinen

' ---------------------------------------------------------------------------


Passender Link: Assemblerkurs für die OM-Mikrocontroller (Teil 4) als ZIP-Archiv

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten: