
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo OMICRO INLASM / Assembler Experten, im 2-ten Programm unten habe ich ein Baisc-Programm incl. Assemblerteil das ursprünglich für die MUNIT 1.1 entwickelt wurde auf die OMICRO übertragen. Dieses Programm habe ich anschliessend auf Inline Assembler für die OMICRO übertragen, s.unten 1-tes Prog. Erst war es naheliegend bei Inline Assembler dabei ebenfalls den jsr Befehl zu nehmen. Leider kam dabei immer die Fehler-Meldung "Fuer Warten ist die Definition von UPROGBASE erforderlich" Im gleichen Verzeichnis, in welchem ich diese Programme habe, ist auch die neueste OM.DEF Datei vom 14.04.2010. In dieser Datei findet sich auch die angefragte Definition define UPROGBASE &hf47e ' An dieser Adresse beginnt der virtuelle Adress- ' raum des Tokencodes. Diese Definition wird nur ' fuer Assemblerbefehle mit absoluter Adressierung ' benoetigt (JSR, JMP, LDA label,x ...), aber ' nicht fuer die optimaleren relativen Sprung- ' befehle (BRA, BEQ, BRCLR ...). Ausserdem ermoeg- ' licht diese Definition, dass Labels per SYS ' statt GOSUB aufgerufen werden koennen, was beim ' Aufruf von Assemblerroutinen etwas Zeit spart. Was mache ich ev. falsch, sodass beim Basic Compilieren die erwähnte Fehlermeldung auftritt. Nachdem es mit jsr nicht funktionierte, habe ich bsr (dank des Hinweises in der OM.DEF Datei) benutzt und damit funktioniert das Programm nun. Freundliche Grüsse Joe Fenk ##### Hinweise zum Erlernen von Assembler #### Gute Links/Hinweise zum erlernen von Assembler: 1. ccintern.harlos.de/download_area//AS05-Assembler//ZIP Archiv///as05.zip//ASSEMBLE.txt ==> alle 5 Programmbeispiele sehr empfehlenswert 2. www.wolfgang-back.com/PDF/Assembler.pdf 4. Buch Messen steuern regeln mit dem C-Control BASIC System; Burkhard kainka; S. 167 3. Manual und Databook zu MC68HC908QY4A von Freescale 4. i-tip.de/ProjektHC08/ProjektHC08.html 5. wiesolator.gotdns.org/sites/wieselsworld-online/index.htm 6. und einige Wochen übrige Zeit In letzter Zeit habe ich mich in Assembler sowie Inline Assembler auf der MUNIT1.1 und OMICRO eingearbeitet. Es gab dabei einige Stolpersteine. Bei Assembler mit MUNIT: Fehler 1: Am Ende des Ass-Programms nach dem rts, hatte ich die RETURN Taste vergessen, deshalb nun am Ende von jedem Ass-Programmteil der Hinweis; in der sehr guten Assembler-Anleitung von D. Harlos ist natürlich darauf hingewiesen! Fehler 2: Doppelpunkt hinter Label vergessen Bei Inline Assembler mit OMICRO: Fehler 1: Statt zum Beispiel lda #24 muss man lda 24 ohne "#" eingeben Fehler 2: Vor einem Label muss das Zeichen "#" eingefügt werden u. nachdem Label darf kein ":" folgen. ######### 1-tes Prog: Inline Assembler Programmteil ##################################################### ' * 1_OM_BAC4.BAS als Beispiel fuer ININE ASSEMBLER ' * nun mit subroutine Warteschleife bsr da mit jsr die Fehlermeldung: Fuer warten ist die Definition von UPROGBASE erforderlich ' * Sa. 15.05.2010 von JFenk neu eingegeben und angepasst auf OMICRO ' * Vorlage LEDON.BAS von Wolfgang Backes LEDON1.S19, 31 Sysbytes ' * ohne subroutine bsr folgt ' * PortA; Bit 3=Port 4 = LED gruen = AUS = ca. 2,5usec; EIN = ca. 3,4usec und ' * PortA; Bit 4=Port 5 = LED rot = AUS = ca. 3,4usec; EIN = ca. 2,5usec ' * mit subroutine bsr folgt ' * PortA; Bit 3=Port 4 = LED gruen = AUS = ca. 78msec; EIN = ca. 78msec und ' * PortA; Bit 4=Port 5 = LED rot = AUS = ca. 78msec; EIN = ca. 78msec ' * 126 Basic-Bytes; 0 Sys-Bytes; 0 RAM-Bytes Print "Rote LED an Port5 u gruene LED an Port 4 werden abwechselnd schnell EIN/AUS geschaltet" BLINKEN END FUNCTION BLINKEN INLASM ! lda 24 ' der AKKU wird mit Dez 24 = BIN 00011000 geladen; damit Port 4 und 5 angesprochen ! sta $04 ' die Richtung des Ports 4 und 5: Ausgang #Nochmal: ! bclr 03,$00 ' bitclear (ausschalten 1000) von Bit 4 im A-port Port4 ! bset 04,$00 ' bitset (einschalten 10000) von Bit 5 im A-port Port5 ! bsr Warten ' Zeile 22 statt jsr, bsr eingefuegt; jump subroutine = Verzweigung zu Warten: Fehlermeldung: Fuer Warten ist die Definition von UPROGBASE erforderlich ! bset 03,$00 ' bitset (einschalten) von Bit 4 im A-port Port 4 ! bclr 04,$00 ' bitclear (ausschalten) von Bit 5 im A-port Port 5 ! bsr Warten ' Zeile 22 stat jsr, bsr eingefuegt; jump subroutine = Verzweigung zu Warten: Fehlermeldung: Fuer Warten ist die Definition von UPROGBASE erforderlich ! bra Nochmal ' branch always = Immer zur Label Nochmal #Warten ! lda #255 ' der AKKU wird mit $FF geladen #loop1 ! ldx #255 ' das X-Register wird mit $FF geladen #loop2 ! decx ' X wird um eins verkleinert - decrementiert ! bne loop2 ' branch not equal- wenn nicht 0, dann loop2 ! deca ' AKKU um eins verkleinern ! bne loop1 ' branch not equal nach loop1 ! rts ' return to subroutine - hier nach blinken ' RETURN Taste muss betaetigt sein, sonst funktioniert es nicht END FUNCTION #### 2-tes Prog: ab hier das Programm mit Assmebler mittels Sys&HFD00 ## ' * 1_OM_BACS.BAS ' * Sa. 15.05.2010 von JFenk neu eingegeben und angepasst auf OMICRO ' * Assembler mit Sys Aufruf; mit Warteschleifen im Assemblerteil ' * Vorlage LEDON.BAS von Wolfgang Backes LEDON1.S19, 31 Sysbytes ' * Schaltzeiten ohne Wartezeiten im Assemblerteil ' * PortA; Bit 3=Port 4 = LED gruen = AUS = ca. 2,5usec; EIN = ca. 3,4usec und ' * PortA; Bit 4=Port 5 = LED rot = AUS = ca. 3,4usec; EIN = ca. 2,5usec ' * Schaltzeiten mit Wartezeiten im Assemblerteil ' * PortA; Bit 3=Port 4 = LED gruen = AUS = ca. 78msec; EIN = ca. 78msec und ' * PortA; Bit 4=Port 5 = LED rot = AUS = ca. 78msec; EIN = ca. 78msec ' * 96 Basic-Bytes; 31 Sys-Bytes; 0 RAM-Bytes Print "Rote LED an Port5 u gruene LED an Port 4 werden abwechselnd schnelle EIN/AUS geschaltet" SYS &HFD00 ' Assembleraufruf fuer Blinken der LEDs END SYSCODE "1_OM_BAC.S19" ### dazu hier der Assmbler Programmteil ### org $FD00 aport equ $00 ; in Register 0 ist der Wert des Byteports A apdir equ $04 ; in Register 4 wird die Richtung festgelegt lda #255 ; der AKKU wird mit Dez 24 = BIN 00011000 geladen sta apdir ; die Richtung des Ports 4 und 5: Ausgang blinken: bclr #03,aport ; bitclear (ausschalten 1000) von Bit 4 im A-port Port4 bset #04,aport ; bitset (einschalten 10000) von Bit 5 im A-port Port5 jsr pause ; jump subroutine = Verzweigung zur Pause bset #03,aport ; bitset (einschalten) von Bit 4 im A-port Port 4 bclr #04,aport ; bitclear (ausschalten) von Bit 5 im A-port Port 5 jsr pause ; jump subroutine = Verzweigung zur Pause bra blinken ; branch always = Immer zur Subroutine blinken pause: lda #255 ; der AKKU wird mit $FF geladen loop1: ldx #255 ; das X-Register wird mit $FF geladen loop2: decx ; X wird um eins verkleinert - decrementiert bne loop2 ; branch not equal- wenn nicht 0, dann loop2 deca ; AKKU um eins verkleinern bne loop1 ; branch not equal nach loop1 rts ; return to subroutine - hier nach blinken ; RETURN Taste muss betaetigt sein, sonst funktioniert es nicht |
| Antwort schreiben |