O.K.
Kurze Eiführung:
Das ist ein Unterprogramm der mit call Hex_Dec aufgerufen wird. Es gibt 4 Register mit 32 Bits, sie müssen (wegen FSR) so wie im Code nacheinander liegen (die absolute Adressen sind nicht wichtig). In erstes Register "A" wird die bin Zahl eingeschrieben und im "D" befindet sich die umgewandelte dec Zahl. A3 und D3 sind MSB und A0 und D0 sind LSB. Die "B" und "C" sind Hifsregister. Wachrscheinlich nicht alle aufgelisteten Register (ausser A,B,C,D und Flags) sind nötig, aber ich habe es bloss aus meinem Programm schnell kopiert. Schau mal bitte, was in dem Unterprogramm vorkommt. Ich Glaube, dass alle DTmpX, FTmp und TTmp nicht und Unterprogramm Copy DC auch nicht, aber das ist ein Teil grösseres Programms und kann noch kleiner gemacht werden.
MfG
Code:
#define _RP0 STATUS,RP0
#define _C STATUS,C
#define _Z STATUS,Z
#define _DC STATUS,DC
#define _Fcra Flags,0
#define _Fcrp Flags,1
#define _Fdca Flags,2
#define _Ferr Flags,3
A3 EQU 0x20
A2 EQU 0x21
A1 EQU 0x22
A0 EQU 0x23
B3 EQU 0x24
B2 EQU 0x25
B1 EQU 0x26
B0 EQU 0x27
C3 EQU 0x28
C2 EQU 0x29
C1 EQU 0x2A
C0 EQU 0x2B
D3 EQU 0x2C
D2 EQU 0x2D
D1 EQU 0x2E
D0 EQU 0x2F
Flags EQU 0x30
DTmp1 EQU 0x31
DTmp2 EQU 0x32
DTmp3 EQU 0x33
DTmp4 EQU 0x34
ATmp EQU 0x35
FTmp EQU 0x36
HTmp EQU 0x37
RTmp EQU 0x38
TTmp EQU 0x39
Hex_Dec call CClr ;Hex>A, D>Dec
call DClr
movlw 1
movwf C0
movlw 0x20 ;32 bit Hex > 32 bit Dec (8 digits)
movwf HTmp
HexDecL btfsc A0,0
call AddDC
call CopyCB
call AddCB
call ARotRb
decfsz HTmp,1
goto HexDecL
return
CClr clrf C0
clrf C1
clrf C2
clrf C3
return
DClr clrf D0
clrf D1
clrf D2
clrf D3
return
CopyCB movf C0,0
movwf B0
movf C1,0
movwf B1
movf C2,0
movwf B2
movf C3,0
movwf B3
return
CopyDC movf D0,0
movwf C0
movf D1,0
movwf C1
movf D2,0
movwf C2
movf D3,0
movwf C3
return
AddCB movlw B0 ;C+B>C
movwf FSR
goto AddR
AddDC movlw C0 ;D+C>D
movwf FSR
AddR bcf _Ferr ;add two register
bcf _Fcrp
movlw 4 ;4 bytes long
movwf ATmp
AddRL bcf _Fdca
bcf _Fcra
movf INDF,0
movwf RTmp
movlw 4
addwf FSR,1
btfss _Fcrp
goto AddRN
movlw 1
addwf INDF,1
call DecCor
AddRN movf RTmp,0
addwf INDF,1
call DecCor
btfss _Fdca
goto AddCor1
movlw 6
addwf INDF,1
AddCor1 btfss _Fcra
goto AddCor2
movlw 0x60
addwf INDF,1
btfsc _C
bsf _Fcra
AddCor2 movf INDF,0
andlw 0xF0
sublw 0xA0
btfss _Z
goto AddCor3
movf INDF,0
andlw 0x0F
clrf INDF
addwf INDF,1
bsf _Fcra
AddCor3 bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
movlw 5
subwf FSR,1
decfsz ATmp,1
goto AddRL
btfsc _Fcra
bsf _Ferr
return
DecCor btfsc _DC ;decimal correction (equ DAW)
bsf _Fdca
btfsc _C
bsf _Fcra
movf INDF,0
andlw 0x0F
sublw 9
btfss _C
bsf _Fdca
movf INDF,0
andlw 0xF0
sublw 0x90
btfss _C
bsf _Fcra
return
ARotRb movlw A3 ;rotate A register 1 bit right
movwf FSR
RRotRb movlw 4 ;rotate 4 bytes
movwf ATmp
bcf _Fcrp
btfsc A0,0
bsf _Fcrp
RRotRbL bcf _Fcra
btfsc INDF,0
bsf _Fcra
bcf _C
btfsc _Fcrp
bsf _C
rrf INDF,1
bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
incf FSR,1
decfsz ATmp,1
goto RRotRbL
return
Lesezeichen