daily pastebin goal
17%
SHARE
TWEET

Untitled

a guest Jul 2nd, 2018 127 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
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top