; Area Definition and Entry Point
;
AREA SW, CODE, READONLY
ARM
EXPORT __main
IMPORT serial_init
IMPORT serial_get
IMPORT serial_put
IMPORT mjono
__main
; alusta sarjaportti
bl serial_init
ldr r7, =mjono ; haetaan merkkijonon osoite rekisteriin r7
mov r5, #0 ; alustetaan laskuri (indeksi)
mov r6, #0 ; alustetaan nolla entterille
tallen
bl serial_get ; haetaa merkin r0:aan
strb r0, [r7, r5] ; tallennetaan r0 + laskuri
cmp r0, #0x0D ; vertaillaan r0 vs 0
strbeq r6, [r7, r5] ; nolla enterin tilalle viimeiseksi merkiksi
beq done ; jos tulee enter -> pois
cmp r5, #80 ; verrataan r5 vs 80
bge done ; jos r5 <=80 -> pois
add r5, r5, #1 ; kasvatetaan indeksiä yhdellä
bne tallen ; jos eivät olleet yhtäsuuret palataan alkuun
done
mov r10, r5 ; tallenetaan viimeisen merkin indeksi
mov r5, #0 ; alustetaan laskuri (indeksi)
mov r8, #65 ; ladataan iso A
mov r9, #90 ; ladataan iso Z
mov r4, #32 ; tarvittavan siirron koko pienestä isoon
tulos
ldrb r0, [r7, r5] ; lataa merkin r7:n + laskurin muistipaikka
sub r5, r5, #32 ; vähennetään laskurista 32 (ison ja pienen kirjaimen ero 32 desimaalia)
cmp r0, r8 ; verrataan alarajaa
blt jep ; jos on alle ison A:n niin tulostaa suoraan
addge r6, r0, r4 ; muutetaan isoksi ja tallennetaan r6:seen
cmp r0, r9 ; verrataan ylärajaan
movle r0, r6 ; jos pienempi tai yhtäsuuri kuin Z niin muunnettu pieni kirjain r0:n paikalle
jep bl serial_put ; tulostus
cmp r5, r10 ; ollaanko lopussa
beq done2 ; lopussa -> pois
b tulos ; ei lopussa -> alkuun
done2
; ohjelman suoritus päättyi
forever
b forever
END