;
; +-------------------------------------------------------------------------+
; | Purpose: Routine to convert a 16bit binary number in ASCII
; | |
; | INPUT : R2 (Lsb) and R3 (Msb) ( binary) |
; | |
; | OUPUT : 30h,31h,32h,33h,34h (internal RAM address) (ASCII) |
; | msb--^ ^------lsb |
; | |
; | Destroy all registers |
; | |
; | PROGRAMMER: Bruno Marcio Diogo Venancio ( [email]bruno.marcio@bol.com.br[/email] ) |
; | BRAZIL 07/19/2002 |
; | THIS CODE CAN BE FREELY DISTRIBUTED WITHOUT CHANGES |
; +-------------------------------------------------------------------------+
;
; Use example:
;
;START:
; MOV R2,#low(1234)
; MOV R3,#high(1234)
; LCALL BINTOASC
;
; in 30h until 34h of internal RAM will be :'0','1',' 2',','3','4' ( ASCII)
;
;
; The Routine Algorithm
;
;
; +-------+
; | START |
; +---+---+
; |
; +-------+
; | N | ( N= Number to be coverted)
; +-------+
; |
; +-------------+
; | POUT <- 0 | ( POUT = Output address )
; +-------------+
; |
; +--------+
; | P <- 0 | ( P= Table Index )
; +--------+
; |
; |
; +-----------> |
; | +-------------+ ( R = Register )
; | | R <- TAB(P) | ( Fetch a table number indexed by P )
; | +-------------+
; | |
; | +----------+
; | | C <- '0' | ( C= counter)
; | +----------+ ( counter <- 0 in ASCII)
; | |
; | +------> |
; | | +-----------+
; | | | N <- N-R | ( subtract the table number with R )
; | | +-----------+
; | | |
; | | N / \ Y
; | | +--< N<0? >-----------+
; | | | \ / |
; | | | \/ |
; | | | +--------------------+
; | | +-------+ | TABOUT (POUT) <- C |
; | | |C<- C+1| +--------------------+
; | | +-------+ |
; | | | +----------+
; | +-----+ | N <- N+R |
; | +----------+
; | |
; | +------------------+
; | | POUT <- POUT +1 |
; | +------------------+
; | |
; | /^\
; | / \
; | +----------+ N / \ S
; +---| P <- P+1 |-----------< TAB(P)=1? > ---------+
; +----------+ \ / |
; \ / |
; \ / |
; +-----+
; | END |
; +-----+
;
;
BINTOASC:
MOV R0,#30h ; R0 = POUT
MOV DPTR,#TAB ; R=TAB(P)
COM1:
CLR A ; P <- 0
MOVC A,@A+DPTR ; R <- TAB(P)
MOV R7,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R6,A
MOV R4,#'0' ; C <- '0'
SOMA: ; N <- N-R
CLR C ;
MOV A,R2 ;
SUBB A,R6 ;
MOV R2,A ;
MOV A,R3 ;
SUBB A,R7 ;
MOV R3,A ;
JC SAIDA ; If < 0 goto SAIDA
INC R4 ; If >0 then C <- C +1
SJMP SOMA ; goto SOMA
SAIDA:
MOV A,R4
MOV @R0,A ;TABOUT (POUT) <- C
MOV A,R2
ADD A,R6 ; N=N+R
MOV R2,A
MOV A,R3
ADDC A,R7
MOV R3,A
INC R0 ; PSAIDA=PSAIDA +1
CLR A
MOVC A,@A+DPTR
CJNE A,#1,INCREMENTA ; TAB(P) = 1 ?
RET ; If yes, END
INCREMENTA: ; If No, P <- P+1
INC DPTR
LJMP COM1 ; goto COM1
TAB:
DW 10000
DW 1000
DW 100
DW 10
DW 1