; ; +-------------------------------------------------------------------------+ ; | 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 ( bruno.marcio@bol.com.br ) | ; | 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 ;------------------------------- Cut here 8<---------------------------