/* This C language subroutine converts and ascii string to a floating point value. The Run Time Library for the C Language. Gordon A. Sterling (617) 461 - 3076 DSP Development Tools Engineering Created on 12/12/92 Updated on 5/94 by AS #include
double strtod(char *p, char **ptr); */ #include "lib_glob.h" #include "sdl_glob.h" .SEGMENT/CODE Code_Space_Name; .FILE RTL_FILENAME; .GLOBAL _strtod, ___strtodDD, ___strtodDP, ___strtodPD, ___strtodPP; ___strtodDP: R0=pm_dm_pptr; JUMP (PC, strtod_core) (DB); pm_ptr=dm_strtod; pm_lnt=0; ___strtodPD: R0=dm_pm_pptr; JUMP (PC, strtod_core) (DB); pm_ptr=pm_strtod; pm_lnt=0; ___strtodPP: R0=pm_pm_pptr; JUMP (PC, strtod_core) (DB); pm_ptr=pm_strtod; pm_lnt=0; _strtod: ___strtodDD: R0=dm_dm_pptr; JUMP (PC, strtod_core) (DB); pm_ptr=dm_strtod; pm_lnt=0; strtod_core: R2=MR2F; put(R2); R2=MR1F; put(R2); R2=MR0F; put(R2); R2=dma_i; put(R2); put(R3); put(R5); put(R6); put(R7); put(R9); put(R10); put(R11); put(R13); put(R14); put(R15); R1=restore_state; R8=PASS R8, dma_i=R8; /* Hold ptr ptr */ IF EQ R0=PASS R1; /* If NULL, just rts */ pm_mdf=R0; /* Just to store ptr */ JUMP (pm_0, pm_ptr) (DB); pm_lnt=0; dm_lnt=0; set_ptr: pm_ptr=pm_mdf; JUMP (pm_0, pm_ptr) (DB); dm_lnt=0; pm_lnt=0; restore_state: FETCH_RETURN get(R15,1); get(R14,2); get(R13,3); get(R11,4); get(R10,5); get(R9,6); get(R7,7); get(R6,8); get(R5,9); get(dma_i,11); get(R2,12); MR0F=R2, get(R2,13); MR1F=R2, get(R2,14); MR2F=R2, get(R3,10); RETURN (DB); RESTORE_STACK RESTORE_FRAME dm_dm_pptr: R8=dm_ptr; /* Get pointer used */ JUMP (PC, restore_state) (DB); R8=R8-1; /* Decrement ptr */ DM(dm_0, dma_i)=R8; /* Write out pointer */ pm_pm_pptr: R8=pm_ptr; /* Get pointer used */ JUMP (PC, restore_state) (DB); R8=R8-1, pm_ptr=dma_i; /* Decrement ptr */ PM(pm_0, pm_ptr)=R8; /* Write out pointer */ pm_dm_pptr: R8=dm_ptr; /* Get pointer used */ JUMP (PC, restore_state) (DB); R8=R8-1, pm_ptr=dma_i; /* Decrement ptr */ PM(pm_0, pm_ptr)=R8; /* Write out pointer */ dm_pm_pptr: R8=pm_ptr; /* Get pointer used */ JUMP (PC, restore_state) (DB); R8=R8-1; /* Decrement ptr */ DM(dm_0, dma_i)=R8; /* Write out pointer */ dm_strtod: R12=R12-R12, dm_ptr=R4; /* Pt to str, Clr out acc regs*/ R13=R13-R13, R7=R12; /* Clr out LSW acc, Used for sign val*/ R10=32; /* 32 = ASC(' ') */ R9=13; /* 13 = ASC('/n') */ R8=9; /* 9 = ASC('/r') */ clean_spaces: R11=DM(dm_ptr,dm_1); /* Read character */ COMP(R11,R10); /* Compare to ' ' */ IF EQ JUMP (PC, clean_spaces); /* Remove more spaces*/ COMP(R11,R9); /* Compare to '/n' */ IF GT JUMP (PC, acc_sign); /* Check for number */ COMP(R11,R8); /* Compare to '/r' */ IF GE JUMP (PC, clean_spaces); /* Remove more spaces*/ acc_sign: R10=43; /* 43 = ASC('+') */ R9=45; /* 45 = ASC('-') */ COMP(R11,R10); /* Compare to '+' */ IF EQ R7=R7-R7, R11=DM(dm_ptr,dm_1); /* Sign is pos*/ COMP(R11,R9); /* Compare to '-' */ IF EQ R7=R7-1, R11=DM(dm_ptr,dm_1); /* Sign is neg*/ acc_num: dm_mdf=R7; /* Hold sign for now */ R10=46; /* 46 = ASC('.') */ R9=101; /* 101 = ASC('e') */ R8=69; /* 69 = ASC('E') */ R7=57; /* 57 = ASC('9') */ R6=48; /* 48 = ASC('0') */ F14=0x40240000; /* MSW of 10.0 */ acc_int: COMP(R11,R10); /* Compare to '.' */ IF EQ JUMP (PC, acc_fract); /* Accumulate fraction*/ COMP(R11,R9); /* Compare to 'e' */ IF EQ JUMP (PC, acc_exp); /* Get exponent */ COMP(R11,R8); /* Compare to 'E' */ IF EQ JUMP (PC, acc_exp); /* Get exponent */ COMP(R11,R7); /* Compare to '9' */ IF GT JUMP (PC, non_num); /* Not a number, end */ COMP(R11,R6); /* Compare to '0' */ IF LT JUMP (PC, non_num); /* Not a number, end it*/ CALL (PC, ___lib_dmult) (DB); /* Multiply sum by 10.0*/ R15=R15-R15; /* Zero out LSW of 10.0 */ NOP; /* DEAD CYCLE */ CALL (PC, ___lib_itod) (DB); /* Convert number to dbl*/ R12=PASS R0, R13=R1; /* Hold sum */ R0=R11-R6; /* Convert number to int*/ CALL (PC, ___lib_dadd) (DB); /* Add to sum */ R11=PASS R14; /* Hold MSW of 10.0 */ R14=PASS R0, R15=R1; /* Copy num for add */ JUMP (PC, acc_int) (DB); /* Get next character */ R12=PASS R0, R13=R1; /* Copy current sum */ R14=PASS R11, R11=DM(dm_ptr,dm_1);/* Copy MSW of 10.0 */ acc_fract: R14=0x3ff00000; /* MSW of 1.0 */ R15=0; /* LSW of 1.0 */ get_nextfract: R11=DM(dm_ptr,dm_1); COMP(R11,R9); /* Compare to 'e' */ IF EQ JUMP (PC, acc_exp); /* Get exponent */ COMP(R11,R8); /* Compare to 'E' */ IF EQ JUMP (PC, acc_exp); /* Get exponent */ COMP(R11,R7); /* Compare to '9' */ IF GT JUMP (PC, non_num); /* Not a number, end */ COMP(R11,R6); /* Compare to '0' */ IF LT JUMP (PC, non_num); /* Not a number, end it*/ CALL (PC, ___lib_itod) (DB); /* Convert number to dbl*/ R0=R11-R6; /* Convert to num first */ R10=0x3fb99999; /* Load MSW of 0.1 */ R1=0x9999999a; /* Load LSW of 0.1 */ R11=R0; /* Hold MSW of num */ CALL (PC, ___lib_dmult) (DB); /* Multiply fract by .1*/ R4=PASS R12, R5=R13; /* Hold sum */ R13=PASS R1, R12=R10; /* Copy number */ CALL (PC, ___lib_dmult) (DB); /* Multiply num by fract*/ R14=PASS R0, R15=R1; /* Hold fractional part */ R13=R13-R13, R12=R11; /* Copy current number */ R10=PASS R14, R11=R15; /* Hold current fract */ CALL (PC, ___lib_dadd) (DB); /* Add to current sum*/ R14=PASS R0, R15=R1; /* Move for add */ R12=PASS R4, R13=R5; /* Copy old sum */ JUMP (PC, get_nextfract) (DB);/* Get next number*/ R12=PASS R0, R13=R1; /* Copy current sum */ R14=PASS R10, R15=R11; /* Copy current fract */ acc_exp: R8=R8-R8, R11=DM(dm_ptr,dm_1);/* Used for exp sign, Rd 1st expr part*/ R10=43; /* 43 = ASC('+') */ R9=45; /* 45 = ASC('-') */ COMP(R11,R10); /* Compare to '+' */ IF EQ R8=R8-R8, R11=DM(dm_ptr,dm_1);/* Sign is positive*/ COMP(R11,R9), R9=dm_0; /* Compare to '-', clr sum*/ IF EQ R8=R8-1, R11=DM(dm_ptr,dm_1);/* Sign is negative*/ R10=10; /* Used for multiply */ get_next_exp: COMP(R11,R7); /* Compare to '9' */ IF GT JUMP (PC, got_exp); /* Not a number, end */ COMP(R11,R6); /* Compare to '0' */ IF LT JUMP (PC, got_exp); /* Not a number, end it*/ R11=R11-R6; /* Get number */ JUMP (PC, get_next_exp) (DB); /* Get next number*/ R9=R9*R10 (SSI); /* Mult sum by 10 */ R9=R9+R11, R11=DM(dm_ptr,dm_1); /* Add to sum */ got_exp: R10=PASS R12, R11=R13; /* Hold old sum */ R14=0x40240000; /* Hold MSW 10 */ R6=0x3fb99999; /* Hold MSW of .1 */ R7=0x9999999a; /* Hold LSW of .1 */ R8=PASS R8, R15=dm_0; /* Test for sign of exp, Hold LSW 10*/ IF LT R14=PASS R6, R15=R7;/* Use .1 since sign is-*/ R0=PASS R14, R1=R15; /* Copy to output regs */ R9=R9-1; /* Decrement by one */ LCNTR=R9, DO compute_exp UNTIL LCE; CALL (PC, ___lib_dmult) (DB); NOP; compute_exp: R12=PASS R0, R13=R1; CALL (PC,___lib_dmult) (DB); /* Multiply sum by exp*/ R12=PASS R0, R13=R1; /* Copy exp value */ R14=PASS R10, R15=R11; /* Copy old sum */ JUMP (PC, set_ptr); /* Return NOW! */ non_num: R7=dm_mdf; /* Get held sign bit */ R7=PASS R7; /* Test for negative */ JUMP (PC, set_ptr) (DB); IF LT R12=BSET R12 BY 31;/* Set sign bit */ R0=PASS R12, R1=R13; pm_strtod: R12=R12-R12, pm_ptr=R4; /* Pt to str, Clr out acc regs*/ R13=R13-R13, R7=R12; /* Clr out LSW acc, Used for sign value R10=32; /* 32 = ASC(' ') */ R9=13; /* 13 = ASC('/n') */ R8=9; /* 9 = ASC('/r') */ clean_pspaces: R11=PM(pm_ptr,pm_1); /* Read character */ COMP(R11,R10); /* Compare to ' ' */ IF EQ JUMP (PC, clean_pspaces);/* Remove more spaces*/ COMP(R11,R9); /* Compare to '/n' */ IF GT JUMP (PC, acc_psign); /* Check for number */ COMP(R11,R8); /* Compare to '/r' */ IF GE JUMP (PC, clean_pspaces); /* Remove more spaces*/ acc_psign: R10=43; /* 43 = ASC('+') */ R9=45; /* 45 = ASC('-') */ COMP(R11,R10); /* Compare to '+' */ IF EQ R7=R7-R7, R11=PM(pm_ptr,pm_1);/* Sign is positive*/ COMP(R11,R9); /* Compare to '-' */ IF EQ R7=R7-1, R11=PM(pm_ptr,pm_1);/* Sign is negative*/ acc_pnum: dm_mdf=R7; /* Hold sign for now */ R10=46; /* 46 = ASC('.') */ R9=101; /* 101 = ASC('e') */ R8=69; /* 69 = ASC('E') */ R7=57; /* 57 = ASC('9') */ R6=48; /* 48 = ASC('0') */ F14=0x40240000; /* MSW of 10.0 */ acc_pint: COMP(R11,R10); /* Compare to '.' */ IF EQ JUMP (PC, acc_pfract); /* Accumulate fraction*/ COMP(R11,R9); /* Compare to 'e' */ IF EQ JUMP (PC, acc_pexp); /* Get exponent */ COMP(R11,R8); /* Compare to 'E' */ IF EQ JUMP (PC, acc_pexp); /* Get exponent */ COMP(R11,R7); /* Compare to '9' */ IF GT JUMP (PC, non_num); /* Not a number, end */ COMP(R11,R6); /* Compare to '0' */ IF LT JUMP (PC, non_num); /* Not a number, end it*/ CALL (PC, ___lib_dmult) (DB); /* Multiply sum by 10.0*/ R15=R15-R15; /* Zero out LSW of 10.0 */ NOP; /* DEAD CYCLE */ CALL (PC, ___lib_itod) (DB); /* Convert number to dbl*/ R12=PASS R0, R13=R1; /* Hold sum */ R0=R11-R6; /* Convert number to int*/ CALL (PC, ___lib_dadd) (DB); /* Add to sum */ R11=PASS R14; /* Hold MSW of 10.0 */ R14=PASS R0, R15=R1; /* Copy num for add */ JUMP (PC, acc_pint) (DB); /* Get next character */ R12=PASS R0, R13=R1; /* Copy current sum */ R14=PASS R11, R11=PM(pm_ptr,pm_1);/* Copy MSW of 10.0*/ acc_pfract: R14=0x3ff00000; /* MSW of 1.0 */ R15=0; /* LSW of 1.0 */ get_nextpfract: R11=PM(pm_ptr,pm_1); COMP(R11,R9); /* Compare to 'e' */ IF EQ JUMP (PC, acc_pexp); /* Get exponent */ COMP(R11,R8); /* Compare to 'E' */ IF EQ JUMP (PC, acc_pexp); /* Get exponent */ COMP(R11,R7); /* Compare to '9' */ IF GT JUMP (PC, non_num); /* Not a number, end */ COMP(R11,R6); /* Compare to '0' */ IF LT JUMP (PC, non_num); /* Not a number, end it*/ CALL (PC, ___lib_itod) (DB); /* Convert number to dbl*/ R0=R11-R6; /* Convert to num first */ R10=0x3fb99999; /* Load MSW of 0.1 */ R1=0x9999999a; /* Load LSW of 0.1 */ R11=R0; /* Hold MSW of num */ CALL (PC, ___lib_dmult) (DB); /* Multiply fract by .1*/ R4=PASS R12, R5=R13; /* Hold sum */ R13=PASS R1, R12=R10; /* Copy number */ CALL (PC, ___lib_dmult) (DB); /* Multiply num by fract*/ R14=PASS R0, R15=R1; /* Hold fractional part */ R13=R13-R13, R12=R11; /* Copy current number */ R10=PASS R14, R11=R15; /* Hold current fract */ CALL (PC, ___lib_dadd) (DB); /* Add to current sum*/ R14=PASS R0, R15=R1; /* Move for add */ R12=PASS R4, R13=R5; /* Copy old sum */ JUMP (PC, get_nextpfract) (DB); /* Get next number*/ R12=PASS R0, R13=R1; /* Copy current sum */ R14=PASS R10, R15=R11; /* Copy current fract */ acc_pexp: R8=R8-R8, R11=PM(pm_ptr,pm_1); /* Used for exp sign, Rd 1st expr part*/ R10=43; /* 43 = ASC('+') */ R9=45; /* 45 = ASC('-') */ COMP(R11,R10); /* Compare to '+' */ IF EQ R8=R8-R8, R11=PM(pm_ptr,pm_1);/* Sign is positive*/ COMP(R11,R9); /* Compare to '-' */ IF EQ R8=R8-1, R11=PM(pm_ptr,pm_1);/* Sign is negative*/ R9=0; /* Clear sum */ R10=10; /* Used for multiply */ get_next_pexp: COMP(R11,R7); /* Compare to '9' */ IF GT JUMP (PC, got_exp); /* Not a number, end */ COMP(R11,R6); /* Compare to '0' */ IF LT JUMP (PC, got_exp); /* Not a number, end it*/ R11=R11-R6; /* Get number */ JUMP (PC, get_next_pexp) (DB); /* Get next number*/ R9=R9*R10 (SSI); /* Mult sum by 10 */ R9=R9+R11, R11=PM(pm_ptr,pm_1); /* Add to sum */ .ENDSEG;