Konvertierung 9 Stellen BCD zu 36 Bit BIN

Konvertierung bcd2bin für 36 bit

Operandenhighlow
Stellen 8-0 in bcdr12r13
Ergebnisshighlow
binärer Wertr12r13
Fehler r15 != 0 r15


Zur Nutzung des Unterprogramm sind auch die Unterprogramme add36u und div361836 notwendig.

;
; UP Konvertierung bcd nach bin für 9 Stellen Dezimal
;
bcd2bin:
;
;               im Aufruf       intern  
; Wert BCD:     R12 | R13       R4 | R5	Stellen [8:0]
;               Rückgabe        intern
; Wert Bin:     R12 | R13       R4 | R5	(High | Low)
; Fehler:             R15            r7 != 0
;
; Dezimal: 100000000
; HEX:     0x5F5E100    (Assembler kann nur 32 Bit!)
;
                mov     r6,     r4
                mov     r7,     r5
                xor     r4,     r4              ; high
                xor     r5,     r5              ; low
                lhi     r8,     0x5F5E100 >> 27
                ori     r8,     (0x5F5E100 >> 18) & 0x1ff
                lhi     r9,     (0x5F5E100 >> 9) & 0x1ff
                ori     r9,     0x5F5E100 & 0x1ff
;
; Wert der höchsten Stelle nach r10
;
bin_z:          xor     r10,    r10             ; Zahl in der aktuellen Stelle
                mov     r12,    r10
                mov     r13,    r6
                movi    r14,    4               ; eine Stelle links
                trap    25                      ; sll36 oberen 4 Bit nach r12
                mov     r10,    r12             ; höchste Stelle nach r10
                mov     r12,    r6
                mov     r13,    r7
                movi    r14,    4               ; eine Stelle links
                trap    25                      ; sll36
                slei    r10,    9
                mov     r6,     r12             ; reststellen high
                mov     r7,     r13             ; reststellen low
                beqzc   bin_err
;
; Test auf Ende der Konvertierung bei r8|r9 = 1
;
                mov     r12,    r8
                or      r12,    r9
                seqi    r12,    1
                mov     r12,    r4
                bnezc   bin_end
;
; 10 er Potenz entsprechend Anzahl in r10 zu r4|r5 addieren
;
                mov     r13,    r5
bstelle:        beqz    r10,    bfertig         ; Stelle ist 0
                mov     r14,    r8
                mov     r15,    r9
                jals    addu36                  ; 10 Potenz addieren
                addi    r10,    -1
                j       bstelle
;
bfertig:        mov     r4,     r12
                mov     r5,     r13
;
; 10 Potenz durch 10 und Ende bei 1
;
                mov     r12,    r8
                mov     r13,    r9
                movi    r15,    10
                jals    div3618
                mov     r8,     r12
                mov     r9,     r13
                j       bin_z
;
; Einer Stelle aus r10 noch zu r4|r5 addieren
;
bin_end:        mov     r12,    r4
                mov     r13,    r5
                xor     r14,    r14
                mov     r15,    r10
                jals    addu36
                mov     r4,     r12
                mov     r5,     r13
                xor     r7,     r7               ; Kein Fehler bei der Konvertierung
                jrs     r11
;
; Eine Stelle der BCD Zahl war groesser als 9
;
bin_err:        movi    r7,     1
                jrs     r11
;


Testprogramm mit dezimaler E/A: Ass-Quelle, Liste, Protokoll
SPHO-Format Start mit "G" im Monitor.

Testprogramm mit dezimaler E/A und HEX Kontrolle: Ass-Quelle, Liste, Protokoll
SPHO-Format Start mit "G" im Monitor.

Include Datei für beide Programme: spartan_equ.inc

UPs bcd2bin, bin2bcd, d361836u, sub36 und addu36 als Macro

Include Dateien für die Macros: bcd2binm.inc, bin2bcdm.inc, d361836um.inc, sub36m.inc, addu36m.inc

Testprogramm mit dezimaler E/A und HEX Kontrolle: Ass-Quelle, Liste, SPHO-Format Start mit "G" im Monitor.


SpartanMC