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.
MfGCode:#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







Zitieren

Lesezeichen