yes, i see no reason why i cannot share. Here, enjoy this.

typedef Int32 fNum;


#define abs(a) (((a)>0)?(a):(-a))
#define sign(a) ((a>0)?(1):(-1))
#define MAKE_FNUM_const(val)
(sign(val)*((((Int32)(abs(val)))<<16)|((UInt32)(((abs(val))-(UInt32)(abs(val)))*65536))))


//use the above macro to generate constant fNum values, like so
//
// a=fNum_div(a,MAKE_FNUM_const(5.1));
//
// this divides "a" by 5.1




asm fNum fNum_mul(fNum a,fNum b){       //return a*b
        
        SMULL R2,R3,R1,R0
        
        MOV   R0,R2,LSR #16
        ORR   R0,R0,R3,LSL #16
        BX    LR
        
}

asm fNum fNum_div(fNum num,fNum denom){ //return num/denom
        
        CMP   R1,#0     //no division by zero please!
        MVNEQ R0,#0     //if so, return max possible number
        BXEQ  LR        //and bail out
        
        STMFD SP!,{R4-R8,LR}
        
        MOV   R7,#0
        
        ANDS  R12,R0,#0x80000000
        EORNE R7,R7,#1
        RSBNE R0,R0,#0
        
        ANDS  R12,R1,#0x80000000
        EORNE R7,R7,#1
        RSBNE R1,R1,#0
        
        //now just unsigned division of R0 by R1
        
        
        //divide R3,R2 by r1
        
        MOV R3,R0,LSR #15
        MOV R2,R0,LSL #17
        
        MOV R0,#0
        MOV R8,#32
        
loop:
        
        CMP   R3,R1
        ORRCS R0,R0,#0x80000000
        SUBCS R3,R3,R1
        MOV   R0,R0,ROR #31
        
        MOV   R3,R3,LSL #1
        ORR   R3,R3,R2,LSR #31
        MOV   R2,R2,LSL #1
        
        
        SUBS R8,R8,#1
        BNE  loop
        
        //MOV  R0,R0,ROR #31
        
        CMP   R7,#0
        RSBNE R0,R0,#0
        
        LDMFD SP!,{R4-R8,PC}
}

asm Int16 fNum_toInt16(fNum a){ //return integer part of a
        
        MOV R0,R0,LSR #16
        BX  LR
        
}

asm fNum fNum_fromInt16(Int16 a){       //return integer part of a
        
        MOV R0,R0,LSL #16
        BX  LR
        
}


asm char* fNum_toString(char* s, fNum a){
        
        STMFD  SP!,{R4-R6,LR}
        
        ANDS   R12,R1,#0x80000000
        MOVNE  R12,#'-'
        STRNEB R12,[R0],#1
        RSBNE  R1,R1,#0
        
        MOV    R4,R0            //new char*
        MOV    R5,R1            //new fNum
        
        MOV    R1,R1,LSR #16
        LDR    R6,[R9,#-8]
        MOV    LR,PC
        LDR    PC,[R6,#0x790]
        
        MOV    LR,PC
        LDR    PC,[R6,#0x798]
        
        ADD    R0,R4,R0
        MOV    R12,#'.'
        STRB   R12,[R0],#1
        
        BIC    R5,R5,#0xFF000000
        BIC    R5,R5,#0x00FF0000
        MOV    R12,#0x2700                      //10000=0x2710
        ORR    R12,R12,#0x10
        MUL    R1,R12,R5
        MOV    R1,R1,LSR #16
        
        MOV    LR,PC
        LDR    PC,[R6,#0x790]
        
        LDMFD SP!,{R4-R6,PC}
}



--
Best Regards, Dmitry Grinberg
Software Engineer, http://PalmPowerups.com
(847) 226 9295
AIM: hacker19180
MSN: [EMAIL PROTECTED]
ICQ: 165589894
Y! IM: dmitrygr2003

--
For information on using the PalmSource Developer Forums, or to unsubscribe, 
please see http://www.palmos.com/dev/support/forums/

Reply via email to