
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
' =========================================================================== ' Demoprogramm: Etwas Stringverarbeitung, zusätzlich mit BIN ' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 7. März 2026 ' Um BIN$ ergänzt von Dietmar Harlos am 29. März 2026. ' =========================================================================== ' Es können Zeichenketten an den String angehängt werden und es lassen sich ' vorzeichenbehaftete 16-Bit-Zahlen im ASCII-Code einfügen. Die Ausgabe ' findet hier in diesem Demoprogramm auf der Seriellen Schnittstelle statt. ' Das läßt sich aber anpassen, da die Subroutine in BASIC erstellt wurde. ' Im "Demoprogramm: Zum Palindrom-Tag" wird gezeigt, wie ein String von der ' Seriellen Schnittstelle gelesen werden kann: ' http://ccintern.dharlos.de/forum/lesen.php?eintrag=17539 ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi DEFINE string &h2aa 'Buffer an 1. Adresse hinter dem USER-RAM 'Nullterminierter String mit 255 Bytes DIM w WORD DIM offset BYTE 'Offset im String DIM temp1 BYTE 'für STR DIM temp2 BYTE 'für STR DEFINE OmOsTemp OSTEMP DEFINE OmOsCnfg &h7e 'diverse Flags zur Konfiguration des OS ' --- Hauptprogramm --------------------------------------------------------- PrintSpc=ON 'SPACE vor einem dezimalen PRINT End2Host=ON 'Bei Programmende gleich in den Host-Modus wechseln PRINT "Etwas Stringverarbeitung mit BIN$" POKE string,0 'String löschen w=1 STR w SYS Add2String : INLINE "=%",0 BIN w w=&h8000 STR w SYS Add2String : INLINE "=%",0 BIN w w=&haaaa SYS Add2String : INLINE " $",0 PrintHex=ON STR w SYS Add2String : INLINE "=%",0 BIN w PrintString 'Es erscheint: "1=%0000000000000001 -32768=%1000000000000000 $aaaa=%1010101010101010" PRINT "Programmende." END ' --- Subroutinen und Funktionen -------------------------------------------- ' Den String ausgeben ' In OCBASIC, damit vom Anwender anpaßbar. ' Es wäre auch ein "PrintString adr" möglich, mit dessen Hilfe verschiedene ' Strings ausgegeben werden können. PROCEDURE PrintString offset=0 WHILE PEEK(string+offset) PUT PEEK(string+offset) ADD offset,1 WEND RETURN END PROCEDURE ' Die folgende Routine muß folgendermaßen aufgerufen werden: ' SYS Add2String : INLINE "Text an String anhängen",0 PROCEDURE Add2String INLASM ! jsr suche0 #add2string_loop ! ldhx PCADR ! lda ,x ! aix #1 ! sthx PCADR ! clrh ! ldx offset ! sta string,x ! inc offset ! tsta ! bne add2string_loop ! rts END PROCEDURE ' Die folgende Routine muß folgendermaßen aufgerufen werden: ' STR 12345 PROCEDURE STR (16bitvalue) INLASM ! jsr suche0 ! jsr FwPop 'Rueckgabe eines Words auf OSTEMP:A ! ldx OSTEMP ' PRINT-Routine fuer vorzeichenbehaftete 16-Bit-Zahlen ' mit Unterstuetzung fuer PrintHex und PrintSpc ' von Dietmar Harlos am 9. Juni 2006 ' angepaßt am 7. März 2026 #print16bit ! sta temp2 'Lowbyte ! stx temp1 'Highbyte ! brclr #0,OmOsCnfg,print16_1 'fPrintHex ! ldx #16 'PrintHex ! bra print16_4 #print16_1 ! brclr #1,OmOsCnfg,print16_2 'fPrintSpc ! lda #" " 'PrintSpc ! jsr PutChar2String #print16_2 ! brclr #7,temp1,print16_3 ! lda #"-" 'negative Zahl ! jsr PutChar2String ! com temp1 'oder einfach jsr negate_a ! neg temp2 ! blo print16_3 ! inc temp1 #print16_3 ! ldx #10 #print16_4 ! clr OmOsTemp 'Man koennte die MOD-10-Berechnung mit der Routine #print16_5 'fuer 16-Bit-Division durchfuehren, aber die ist ! inc OmOsTemp 'langsamer und benoetigt vor allem mehr temporaeren ! lda temp1 'Speicher, der in dieser Routine fuer den Hardware- ! clrh 'stack gebraucht wird. Deshalb hier eine Division ! div 'fuer 16-Bit durch 8-Bit. ! sta temp1 ! lda temp2 ! div 'a=h:a\x, a:result, h:remainder ! pushh ! sta temp2 ! ora temp1 ! bne print16_5 #print16_6 ! popa ! add #"0" ! cmp #"9" ! bls print16_7 ! add #&h27 'Erweiterung fuer hexadezimale Ausgabe #print16_7 ! jsr PutChar2String ! dbnz OmOsTemp,print16_6 '! stc '! rts ! clra 'nullterminierter String ! jsr PutChar2String ! rts END PROCEDURE ' Die folgende Routine muß folgendermaßen aufgerufen werden: ' BIN -32768 PROCEDURE BIN (16bitvalue) INLASM ! jsr suche0 ! jsr FwPop 'Rueckgabe eines Words auf OSTEMP:A ! pusha 'LSB auf den Hardwarestack ! mov #16,temp1 '16 Stellen #Bin_loop ! lda #"0" 'ASC("0") ! lsl 1,sp 'Niederwertigstes Byte ! rol OSTEMP 'Höherwertigstes Byte ! bcc Bin_NoCarry 'Carry gesetzt? ! inca 'Dann ASC("1") #Bin_NoCarry ! jsr PutChar2String ! dbnz temp1,Bin_loop ! popa 'LSB wieder entfernen ! clra 'nullterminierter String ! jsr PutChar2String ! rts END PROCEDURE ' Hilfsroutine PROCEDURE suche0 INLASM ! clrh ! clrx #suche0_loop ! lda string,x ! beq suche0_ende ! aix #1 'damit der Code nicht hängen kann ! bra suche0_loop #suche0_ende ! stx offset ! rts END PROCEDURE ' Hilfsroutine PROCEDURE PutChar2String (Byte in A) INLASM ! clrh 'erforderlich ! ldx offset ! sta string,x ! incx ! stx offset ! rts END PROCEDURE ' --------------------------------------------------------------------------- ' Die Firmware-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_fw.pro" ' --- Programmende --------------------------------------------------------- Passender Link: Infosite zu den OM-Mikrocontrollern Meine Homepage: http://ccintern.dharlos.de/ |
| Antwort schreiben |