Assembler/BASIC: Upper + Lower String Funktionen
von mp-one » Mo 18. Mai 2009, 13:47Hallo Assembler-Freunde,
ich habe für ein Programm, an dem ich gerade bastele, Assembler-Routinen zum Aufruf aus BASIC (X=USR...) heraus geschrieben, die zur Konvertierung von Strings in Groß- und Kleinbuchstaben dienen sollen. Die Routinen funktionieren soweit. Ich bin nicht so ganz sattelfest in Assembler und habe bestimmt einiges "durch die Brust ins Auge" programmiert. Ich traue mich aber trotzdem mal, sie hier zu posten . Vielleicht könnt Ihr mal einen Blick drauf werfen und ggf. Optimierungsvorschläge machen. Ist evtl. ja auch für andere ASM-Freunde interessant.
Die Routine holt erst die Adresse des Strings vom Stack, prüft dann für jedes Zeichen, ob es >96 ist und falls ja, wird 32 durch ausmaskieren von Bit 5 abgezogen. Das geänderte Zeichen wird dann wieder zurückgeschrieben. Das geht solange, bis entweder ATASCII #0 (Stringende) oder 255 Durchläufe erreicht sind. Die LOWER-Routine macht fast das Gleiche, nur wird auf <91 geprüft und dann durch Setzen von Bit 5 mit ORA $5B 32 addiert.
Bei Gelegenheit will ich die Routine noch für eine Länge von bis zu 65535 umschreiben. Aber da muss ich mich noch in die 16-Bit-Additionen reinfuchsen.
Gruß,
Michael
ich habe für ein Programm, an dem ich gerade bastele, Assembler-Routinen zum Aufruf aus BASIC (X=USR...) heraus geschrieben, die zur Konvertierung von Strings in Groß- und Kleinbuchstaben dienen sollen. Die Routinen funktionieren soweit. Ich bin nicht so ganz sattelfest in Assembler und habe bestimmt einiges "durch die Brust ins Auge" programmiert. Ich traue mich aber trotzdem mal, sie hier zu posten . Vielleicht könnt Ihr mal einen Blick drauf werfen und ggf. Optimierungsvorschläge machen. Ist evtl. ja auch für andere ASM-Freunde interessant.
- Code: Alles auswählen
* UPPERCASE 255
* KONVERTIERT STRING IN GROSSBUCHST.
* FUER STRINGS BIS 255 ZEICHEN
* ERSTELLT:18.05.2009
* GEANDERT:18.05.2009
* ASSEMBLER: ATMAS II
SADR EQU $CB STRING ADRESSE
ORG $0600 Startadresse
PLA Anzahl Param. vom Stack holen
PLA Adresse des Strings :H
STA SADR+1 speichern
PLA Adresse des Strings :L
STA SADR speichern
LDY #$0
START LDA (SADR),Y HOLE ZEICHEN
CMP #$00 STRING-ENDE erreicht?
BEQ EXIT JA: ENDE
CMP #$60 >96 : KLEINBUCHSTABEN?
BMI CONT NEIN: nächstes Zeichen
AND #$DF JA: -32
STA (SADR),Y ZEICHEN SPEICHERN
CONT INY
CPY #$FF 255 ERREICHT?
BNE START
EXIT RTS
Die Routine holt erst die Adresse des Strings vom Stack, prüft dann für jedes Zeichen, ob es >96 ist und falls ja, wird 32 durch ausmaskieren von Bit 5 abgezogen. Das geänderte Zeichen wird dann wieder zurückgeschrieben. Das geht solange, bis entweder ATASCII #0 (Stringende) oder 255 Durchläufe erreicht sind. Die LOWER-Routine macht fast das Gleiche, nur wird auf <91 geprüft und dann durch Setzen von Bit 5 mit ORA $5B 32 addiert.
Bei Gelegenheit will ich die Routine noch für eine Länge von bis zu 65535 umschreiben. Aber da muss ich mich noch in die 16-Bit-Additionen reinfuchsen.
Gruß,
Michael