Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;MDT 2012
- ;Viktor Kåll, 34256
- ;5.3.2012
- /*==========================================================================
- Assemblerprogram för konvertering av decimala tal binär form. Talet får
- av högst 3 decimala siffror som skall kodas med ASCII-tecken. Består av
- subrutinen Dec2Bin, som utför konverteringen, och ett testprogram som
- huvudprogram.
- ==========================================================================*/
- .include "m16def.inc"
- ;Definierering av register
- .def ResL = r0 ;Resultatregister låg byte
- .def ResH = r1 ;Resultatregister hög byte
- .def Zero = r2 ;Nollregister
- .def MResL = r3 ;Mellan resultat låg
- .def MResH = r4 ;Mellan resultat hög
- .def temp = r16 ;Arbetsregister
- .def C10 = r17 ;Register för konstenten 10
- .def minus = r18 ;Ascii-värdet för minus-tecknet
- .def plus = r19 ;Ascii-värdet för plus-tecknet
- .def isNeg = r20 ;0 om talet är positivt, 1 om negativt
- ;Datasegment
- .dseg
- .org SRAM_START
- AscNr: .byte 5 ;Reservera 4 byte för det decimala talet
- TvKompl: .byte 2
- TBelopp: .byte 2
- ;Avbrottsvektor
- .cseg ;Kodsegment
- .org 0x0000 ;Avbrottsvektorerna börjar i 0x0000
- jmp Reset ;Vektor vid initiering
- .org 0x002A ;Den första adressen i programmet
- ;---------------------------------------------------------------------------
- ; Programmet startar här med intialisering av stackpekaren och insättning
- ; av det decimala talet 473 i form av ASCII-tecken i teckenbufferten i SRAM.
- ; Teckenräckan avslutas med ett NULL-tecken.
- ;---------------------------------------------------------------------------
- Reset: ldi temp, LOW(RAMEND)
- out SPL, temp
- ldi temp, HIGH(RAMEND)
- out SPH, temp ;Stackpekaren initialiserad
- ldi ZL, LOW(AscNr)
- ldi ZH, HIGH(AscNr) ;Z pekar nu på teckenbufferten
- ldi YL, LOW(TvKompl)
- ldi YH, HIGH(TvKompl)
- ldi temp, '-'
- st Z, temp ;Sätt in förtecken i bufferten
- ldi temp, 7
- std Z+1, temp ;Sätt in siffran 7
- ldi temp, 5
- std Z+2, temp ;Sätt in siffran 5
- ldi temp, 4
- std Z+3, temp ;Sätt in siffran 4
- ldi temp, 0
- std Z+4, temp ;Avsluta med NULL-tecken
- rcall Dec2Bin ;Omvandla till binär form
- Forever:
- rjmp Forever ;Vänta här för evigt
- ;--------------------------------------------------------------------------
- ; Dec2Bin, omvandlar ett maximalt tresiffrigt decimaltal till binär form
- ; Anropas med Z pekande på den mest signf. siffran i SRAM. Resultat i R1:R0
- ;--------------------------------------------------------------------------
- Dec2Bin:
- clr ResL
- clr ResH ;Nolla resultatregistren
- clr MResL
- clr MResH
- clr Zero ;Zero nollas
- clr IsNeg
- ldi C10, 10 ;C10 = 10
- ldi minus, 0x2D ;minustecken = 2D (Ascii)
- ldi plus, 0x2B ;plustecken = 2B (Ascii)
- Loop:
- ld temp,Z+ ;Hämta siffran från RAM
- cp temp, plus
- breq Loop ;Ignorera plustecken
- cp temp, minus
- breq IsNegative ;Talet skall negeras om ett minustecken hittas
- cp temp, Zero ;= NULL-tecken?
- brne Mult ;Multiplicera om inte NULL
- cpi IsNeg, 1
- breq Negate ;Negerar talet om IsNeg är ett
- st Y+, ResL ;Om talet är positivt sparas det i både
- st Y+, ResH ;TvKompl och TBelopp
- st Y+, ResL
- st Y+, ResH
- ret
- Mult:
- mul ResL, C10 ;Multiplicera med 10
- andi temp, 0b00001111 ;Maskera bitar i ASCII -> BCD
- add ResL, temp ;Addera BCD-värdet till lägre byten
- adc ResH, Zero ;Carry till högre byten
- rjmp Loop ;Fortsätt med nästa decimala siffra
- IsNegative:
- ldi IsNeg, 1 ;Talet skall negeras!
- rjmp Loop ;Fortsätt med nästa decimala siffra
- Negate:
- mov MResL, ResL ;Skapar ett mellanresultat av resultatet
- mov MResH, ResH
- com ResL ;Invertera resultatet
- com ResH
- ldi temp, 1
- add ResL, temp ;Addera 1 till resultatet
- adc ResH, Zero
- st Y+, ResL ;Spara resultatet i TvKompl
- st Y+, ResH
- ldi temp, 0b10000000
- or MResH, temp ;Ändra förtecknet på mellanresultatet
- st Y+, MResL ;Spara svaret i TBelopp
- st Y+, MResH
- ret
Add Comment
Please, Sign In to add comment