Konvertierung 36 Bit BIN zu 11 Stellen BCD

Konvertierung bin2bcd für 36 bit

Operandenhighlow
binärer Wertr12r13
Ergebnisshighlow
Stellen 10+9 in bcdr13
Stellen 8-0 in bcdr14r15


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

;
; UP Konvertierung bin nach bcd für 36 Bit
;
bin2bcd:
;
;               im Aufruf       intern  
; Wert Bin:     R12 | R13       R4 | R5 (High | Low)
;               Rückgabe        intern
; Wert BCD:     R13             R5      Stellen [10:9]
;               R14 | R15       R6 | R7 Stellen [8:0]
;
; 2^36 =   68719476736
; Größter Subtrahend damit:
; Dezimal: 10000000000
; HEX:     0x2540BE400	(Assembler kann nur 32 Bit!)
;
                xor     r10,    r10             ; Stellen [10:9]
                xor     r6,     r6              ; Stellen [8:0] high
                xor     r7,     r7              ; Stellen [8:0] low
                lhi     r8,     0x2540BE40 >> 23
                ori     r8,     (0x2540BE40 >> 14) & 0x1ff
                lhi     r9,     (0x2540BE40 >> 5) & 0x1ff
;
; Altes Ergebnis um 4 Bit nach links schieben
;
dez_zyk:        mov     r12,    r10
                mov     r13,    r6
                movi    r14,    4               ; eine Stelle links
                trap    25                      ; sll36
                mov     r10,    r12             ; nur Stellen [10:9]
                mov     r12,    r6
                mov     r13,    r7
                movi    r14,    4               ; eine Stelle links
                trap    25                      ; sll36
                mov     r6,     r12             ; Stellen [8:0] high
                mov     r7,     r13             ; Stellen [8:0] low
;
; Test auf Ende der Konvertierung bei r8|r9 = 1
;
                mov     r12,    r8
                or      r12,    r9
                seqi    r12,    1
                mov     r12,    r4
                bnezc   dez_end
;
; Nächste Stelle Ermitteln
;
                mov     r13,    r5
stelle:         mov     r14,    r8
                mov     r15,    r9
                jals    sub36                   ; 10 Potenz abziehen
                bnez    r14,    fertig          ; liess sich nicht mehr abziehen
                mov     r4,     r12
                mov     r5,     r13
                addi    r7,     1
                j       stelle
;
; 10 Potenz durch 10 und Ende bei 1
;
fertig:         mov     r12,    r8
                mov     r13,    r9
                movi    r15,    10
                jals    div3618
                mov     r8,     r12
                mov     r9,     r13
                j       dez_zyk
;
; Einer Stelle aus r5 noch in r7 eiblenden
;
dez_end:        addu    r7,     r5
                mov     r5,     r10
                jrs     r11
;


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

Include Datei für das Programm: spartan_equ.inc

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

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

Testprogramm: Ass-Quelle, Liste, SPHO-Format Start mit "G" im Monitor.


SpartanMC