|
BCD_to_BIN ; function converts BCD R6|R7 to BIN R8|R9 (421 cycles)
mov #8,R11 ; LOOP COUNTER ( 8 DIGITS )
clr R8
clr R9
clr R10
BCD_to_BIN_SHFT4:
mov #4,R14 ; loop counter
BCD_to_BIN_SHFT41:
rla R7 ; SHIFT LEFT DIGIT INTO R10
rlc R6
rlc R10
dec R14
jnz BCD_to_BIN_SHFT41
add R10,R9 ; XN+10XN+1
adc R8
clr R10
dec R11 ; THROUGH ?
jz BCD_to_BIN_END ; YES
MPY10:
rla R9 ; NO, MULTIPLICATION WITH 10
rlc R8
push R8 ; push doubled value to later add
push R9
rla R9
rlc R8
rla R9
rlc R8 ; now multiplyed by 8
add @SP+,R9
addc @SP+,R8 ; push with add
jmp BCD_to_BIN_SHFT4 ; NEXT DIGIT
BCD_to_BIN_END:
ret ; RESULT IS IN R8|R9
BIN_to_BCD ; converts binary R8|R9 to BCD R6|R7 (271 cycles)
mov #32,R14 ; LOOP COUNTER
clr R6 ; 0 –> RESULT MSD
clr R7 ; 0 –> RESULT LSD
BIN_to_BCD_loop:
rla R9 ; Binary MSB to carry
rlc R8
dadd R7,R7 ; RESULT x2 LSD
dadd R6,R6 ; MSD
dec R14 ; THROUGH?
jnz BIN_to_BCD_loop
ret
; а в теле программы :
call #BCD_to_BIN ; function converts BCD R6|R7 to BIN R8|R9
push R8
push R9 ; load readed and converted values onto stack
mov @R6+,R7 ; ENX_XD to R7
mov @R6,R6 ; ENX_XL to R6
call #BCD_to_BIN ; function converts BCD R6|R7 to BIN R8|R9
sub @SP+,R9
subc @SP+,R8 ; substract with poping
call #BCD_to_BIN
и тд
Отняло 1130 циклов!!!
Сам помню, что где-то выдел такой финт, но не мог вспомнить где :)
Спасибо.
E-mail: info@telesys.ru