floor(n/d) | = floor(m*n/2^p) |
= floor((m*n/2^W)/2^s) |
unsigned short ns=Val; int W=16; int m,c,d,u; m=0; c=0; d=0; u=0; if (ns>32767) {printf("Attention négatif "); ns=-ns; } Magic=8389; s=7; // d=1000 m=floor((Magic*ns>>W)>>s); // if (m>10) alors dépassement affichage ns-=1000*m; Magic=5243; s=3; // d=100 c=floor((Magic*ns>>W)>>s); ns-=100*c; Magic=52429; s=3; // d=10 d=floor((Magic*ns>>W)>>s); u=ns-10*d; printf("Conversion magic number : m=%d c=%d d=%d u=%d\n", m,c,d,u); |
; Convertit un "Word" hexa en "4 chars Décimaux + signe" .text ConvDec .macro Var SETC SXM LACC Var BCND positif?, GEQ ZAC SUB Var SACL Var LACC #02Dh B evitneg? positif? LACC #02Bh evitneg? SACL signe CLRC SXM ; pas de sign extension SPM 0 ;PM=00, no shift after multiplication, qqun le modifie par ailleurs ! ; Magic=8389; s=7; // d=1000 ; m=floor((Magic*ns>>W)>>s); LT M8389 MPY Var SPH tmp LACC tmp,9 ;16-7=9 SACH tmp ;ie 7 LSR ; ici on aurait du checker le dépassement de m>9! ; ns-=1000*m; LACC Var LT tmp MPY #1000 SPAC ;Subtract PREG from ACC SACL Var LACC tmp ADD #030h ; table de charactères : chiffres SACL millier ; ecrit char : millier ; Magic=5243; s=3; // d=100 ; c=floor((Magic*ns>>W)>>s); LT M5243 MPY Var SPH tmp LACC tmp,13 ;16-3=13 SACH tmp ;ie 3 LSR ; ns-=100*c; LACC Var LT tmp MPY #100 SPAC ;Subtract PREG from ACC SACL Var LACC tmp ADD #030h ; table de charactères : chiffres SACL centaine ; ecrit char : centaine ; Magic=52429; s=3; // d=10 ; d=floor((Magic*ns>>W)>>s); LT M52429 MPYU Var ;MPY unsigned SPH tmp LACC tmp,13 ;16-3=13 SACH tmp ;ie 3 LSR ; ns-=10*m = u LACC Var LT tmp MPY #10 SPAC ;Subtract PREG from ACC SACL Var LACC tmp ADD #030h ; table de charactères : chiffres SACL dizaine ; ecrit char : dizaine LACC Var ADD #030h ; table de charactères : chiffres SACL unite ; ecrit char : unité SETC SXM ; remet le sign extension .endm |