Guest User

Untitled

a guest
Jul 2nd, 2018
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;MDT 2012
  2. ;Viktor Kåll, 34256
  3. ;5.3.2012
  4.  
  5.  
  6. /*==========================================================================
  7.   Assemblerprogram för konvertering av decimala tal binär form. Talet får
  8.   av högst 3 decimala siffror som skall kodas med ASCII-tecken. Består av
  9.   subrutinen Dec2Bin, som utför konverteringen, och ett testprogram som
  10.   huvudprogram.
  11.  ==========================================================================*/
  12.     .include "m16def.inc"
  13.  
  14.         ;Definierering av register
  15.     .def ResL = r0           ;Resultatregister låg byte
  16.         .def ResH = r1           ;Resultatregister hög byte
  17.         .def Zero = r2           ;Nollregister
  18.     .def MResL = r3      ;Mellan resultat låg
  19.     .def MResH = r4      ;Mellan resultat hög
  20.         .def temp = r16          ;Arbetsregister
  21.         .def C10 = r17           ;Register för konstenten 10
  22.         .def minus = r18         ;Ascii-värdet för minus-tecknet
  23.         .def plus = r19          ;Ascii-värdet för plus-tecknet
  24.     .def isNeg = r20     ;0 om talet är positivt, 1 om negativt
  25.        
  26.  
  27.         ;Datasegment
  28.         .dseg
  29.         .org SRAM_START
  30. AscNr:  .byte 5                  ;Reservera 4 byte för det decimala talet
  31. TvKompl: .byte 2
  32. TBelopp: .byte 2
  33.        
  34.         ;Avbrottsvektor
  35.         .cseg                    ;Kodsegment
  36.         .org 0x0000              ;Avbrottsvektorerna börjar i 0x0000
  37.         jmp Reset                ;Vektor vid initiering
  38.    
  39.         .org 0x002A              ;Den första adressen i programmet
  40. ;---------------------------------------------------------------------------
  41. ; Programmet startar här med intialisering av stackpekaren och insättning
  42. ; av det decimala talet 473 i form av ASCII-tecken i teckenbufferten  i SRAM.
  43. ; Teckenräckan avslutas med ett NULL-tecken.
  44. ;---------------------------------------------------------------------------
  45. Reset:  ldi temp, LOW(RAMEND)  
  46.         out SPL, temp
  47.         ldi temp, HIGH(RAMEND)
  48.         out SPH, temp            ;Stackpekaren initialiserad
  49.         ldi ZL, LOW(AscNr)
  50.         ldi ZH, HIGH(AscNr)      ;Z pekar nu på teckenbufferten
  51.     ldi YL, LOW(TvKompl)
  52.     ldi YH, HIGH(TvKompl)
  53.         ldi temp, '-'
  54.         st  Z, temp              ;Sätt in förtecken i bufferten
  55.         ldi temp, 7
  56.         std Z+1, temp            ;Sätt in siffran 7
  57.         ldi temp, 5                
  58.         std Z+2, temp            ;Sätt in siffran 5
  59.         ldi temp, 4
  60.         std Z+3, temp            ;Sätt in siffran 4
  61.         ldi temp, 0
  62.         std Z+4, temp            ;Avsluta med NULL-tecken
  63.         rcall Dec2Bin            ;Omvandla till binär form
  64. Forever:
  65.         rjmp Forever             ;Vänta här för evigt
  66.    
  67. ;--------------------------------------------------------------------------
  68. ; Dec2Bin, omvandlar ett maximalt tresiffrigt decimaltal till binär form
  69. ; Anropas med Z pekande på den mest signf. siffran i SRAM. Resultat i R1:R0
  70. ;--------------------------------------------------------------------------
  71. Dec2Bin:
  72.     clr ResL
  73.     clr ResH                  ;Nolla resultatregistren
  74.     clr MResL
  75.     clr MResH
  76.     clr Zero                  ;Zero nollas
  77.     clr IsNeg
  78.     ldi C10, 10               ;C10 = 10
  79.     ldi minus, 0x2D           ;minustecken = 2D (Ascii)
  80.     ldi plus, 0x2B            ;plustecken = 2B (Ascii)
  81. Loop:  
  82.     ld temp,Z+                ;Hämta siffran från RAM
  83.     cp temp, plus
  84.     breq Loop         ;Ignorera plustecken
  85.     cp temp, minus
  86.     breq IsNegative       ;Talet skall negeras om ett minustecken hittas
  87.     cp temp, Zero             ;= NULL-tecken?
  88.     brne Mult                 ;Multiplicera om inte NULL
  89.  
  90.     cpi IsNeg, 1
  91.     breq Negate               ;Negerar talet om IsNeg är ett
  92.  
  93.     st Y+, ResL       ;Om talet är positivt sparas det i både
  94.     st Y+, ResH       ;TvKompl och TBelopp
  95.     st Y+, ResL
  96.     st Y+, ResH
  97.     ret                        
  98. Mult:  
  99.     mul ResL, C10             ;Multiplicera med 10
  100.     andi temp, 0b00001111     ;Maskera bitar i ASCII -> BCD
  101.     add ResL, temp            ;Addera BCD-värdet till lägre byten
  102.     adc ResH, Zero            ;Carry till högre byten
  103.     rjmp Loop                 ;Fortsätt med nästa decimala siffra
  104. IsNegative:
  105.     ldi IsNeg, 1          ;Talet skall negeras!
  106.     rjmp Loop                 ;Fortsätt med nästa decimala siffra
  107. Negate:
  108.     mov MResL, ResL       ;Skapar ett mellanresultat av resultatet
  109.     mov MResH, ResH
  110.     com ResL          ;Invertera resultatet
  111.     com ResH
  112.     ldi temp, 1
  113.     add ResL, temp        ;Addera 1 till resultatet
  114.     adc ResH, Zero
  115.     st Y+, ResL       ;Spara resultatet i TvKompl
  116.     st Y+, ResH
  117.     ldi temp, 0b10000000
  118.     or MResH, temp        ;Ändra förtecknet på mellanresultatet
  119.     st Y+, MResL          ;Spara svaret i TBelopp
  120.     st Y+, MResH
  121.     ret
Add Comment
Please, Sign In to add comment