LOGARITMO IN BASE 10 CON MICRO ST62XX
|
Dalla seguente richiesta : " Dovrei far effettuare il calcolo del logaritmo in base 10 di un numero ad un ST 62xx ...ma non so come fare ..", é nato il seguente listato assembler:
Sono graditi commenti, miglioramneti o quant'altro per ridurre le approssimazioni del risultato.;LOGARITMO DI UN NUMERO COMPRESO TRA 10 e 65536 ;Versione 29-05-1999 By Vittorio Crapella ;SI ENTRA CON IL NUMERO IN DUE BYTE MSB e LSB ;SI ESCE CON RISULTATO APPROSSIMANTO IN TRE BYTE B1,B2B3 ;B1=unitalog ;B2=decimlog ;B3=centelog ;VARIABILI USATE: ;msb byte + significativo del numero ;lsb byte - significativo del numero ;rismsb byte risutato + sign. ;rislsb byte risutato - sign. ;unitalog unita logaritmo del numero ;decimlog decimi " " " ;centelog centesimi " " " ; Esempio: MSB+LSB = unitalog,decimlog centelog ; log 742 = 02h+E6h = 2, 8 7 ;cioé unitalog =2 decimlog =8 centelog=7 logari ldi wdog,254 ld a,msb jrnz clw ;se il numero minore di 10 ld a,lsb ;non fa il logaritmo cpi a,10 jrnc clw ret clw clr w divi ldi wdog,254 ;carico wdog clr rismsb ;azz. byte risultato MSB clr rislsb ;azzeramento risultato LSB ldn1 ld a,msb ;carico nel reg a il byte + significativo jrnz div ;se non e` zero salto ld a,lsb ;altrimenti prendo byte - significativo jrnz jpan jp incun jpan ld w,a jp ancora ;e vado a dividere div ld a,lsb ;prendo il byte - signif. suba ldi wdog,254 subi a,10 ;sottraggo 10 al numero jrc decn1 inc rislsb jrnz jpsu inc rismsb jpsu jp suba ;se a>= 10 continuo a sottrarre e inc risultato decn1 inc rislsb dec msb ;chiedo riporto al byte + significativo jrnz jpsu ;e se MSB non e` zero continuo a sottrarre ancora ldi wdog,254 subi a,10 ;sottraggo ancora jrc ok ;se vado sotto 0 cio` 255 o meno jrz okk_ ;anche se 0 salto inc rislsb ;incremento ancora il risultato jrnz jpan_ inc rismsb jpan_ jp ancora ;e continuo fino a che 10 > del numero okk_ inc rislsb ok ld a,rislsb ld lsb,a ld a,rismsb ld msb,a incun inc unitalog ;conta quante div. x 10 ld a,lsb cpi a,10 jrc ldaw ;se > 10 divide ancora ld w,a jp divi ldaw ld a,w ;prende nr prima dell'ultima div x 10 cpi a,10 jrnz cp15 clr decimlog ;il log e` solo intero senza decimali clr centelog ;per i numeri 10 100 1000 10000 ret cp15 cpi a,16 ;se >= 16 salta jrnc cpi84 subi a,4 jp caldiv cpi84 cpi a,85 jrc addi15 ;se minore di 84 +15 jp piu10 ;altrimenti +10 addi15 addi a,15 caldiv clr decimlog ;divide per dieci ldi wdog,255 cpi a,10 ;se a minore 10 salta jrc ok_ sub_ subi a,10 inc decimlog ldi wdog,255 cpi a,10 jrnc sub_ ok_ ld centelog,a ret ;FINE piu10 cpi a,89 jrc ad10 ;se minore 89 allora +10 add5 addi a,5 ;altrimenti solo +5 cpi a,100 jrc jpcal ldi a,99 jpcal jp caldiv ;divide e trova decimali ad10 addi a,10 jpca jp caldivRADICE QUADRATA CON MICRO ST62XX
;RADICE QUADRATA PER NUMERI DA 1 A 16129 ;SI ENTRA CON IL NUMERO IN 2 BYTE MSB-LSB ;SI ESCE CON IL RISULTATO NEL REGISTRO a ;Vers. 12-08-99 by i2viu sqr clr y ;usato per il risultato ld a,lsb ldi x,1 cpax cp a,x ;verifica se a è = o > di x jrnc subax ;se sì salta dec msb ;altrienti prestito da MSB inc msb ;se non è zero jrz rest ;se MSB=0 fine e salta dec msb subax sub a,x ;sottrae x da a inc y ;conta il numero di volte, sarà il risultato inc x ;rende x un numero dispari in aumento inc x jp cpax ;continua a sottrarre numeri dispari rest ld resto,a ;ha finito pertanto mette a nel resto ld a,y ;in a il risultato=y e ritorna ret
[Return] [ Le mie pagine ]