/* This routine configures the C runtime environemt */ /* */ /* Updated on 5/94 by AS */ /* */ #include "lib_glob.h" #include "020_glob.h" #include "sig_glob.h" .EXTERN _errno; .EXTERN ___lib_stack_space, ___lib_stack_length; .EXTERN ___lib_heap_space; .EXTERN ___lib_exit_table, ___lib_int_table; .EXTERN ___lib_rand_seed; /*This used to be EXTERNed ___lib_xrand_seed;*/ .EXTERN ___lib_setup_args; .SEGMENT/CODE Code_Space_Name; .FILE RTL_FILENAME; .GLOBAL ___lib_setup_environment; ___lib_setup_environment: CALL (PC, ___lib_setup_stacks); CALL (PC, ___lib_setup_errno); CALL (PC, ___lib_setup_heaps); CALL (PC, ___lib_setup_rand); CALL (PC, ___lib_setup_ints); CALL (PC, ___lib_setup_exit); CALL (PC, ___lib_setup_args); RTS; ___lib_setup_rand: ram_lreg = 0; RTS (DB); ram_ireg = ___lib_rand_seed; rammem(ram_ireg, ram_0) = 1; /* These two lines are removed until fract is re-installed in the library */ /* ram_ireg = ___lib_xrand_seed; */ /* rammem(ram_ireg, ram_0) = 1; */ ___lib_setup_exit: ram_lreg=0; ram_ireg=___lib_exit_table; LCNTR=32, DO zero_exit_table UNTIL LCE; zero_exit_table: rammem(ram_ireg,ram_1)=0; RTS; ___lib_setup_ints: R2=1; /*Mask defaults*/ R1=___lib_sure_rts; /*Default functions*/ ram_ireg=___lib_int_table; LCNTR=37, DO default_int_table UNTIL LCE; R0=NOT R2, ram_lreg=dm_0; R2=ASHIFT R2 BY 1; rammem(defl_mask,ram_ireg)=R0; rammem(next_mask,ram_ireg)=R0; rammem(curr_func,ram_ireg)=R1; rammem(next_func,ram_ireg)=R1; rammem(defl_func,ram_ireg)=R1; rammem(defl_disp,ram_ireg)=R1; default_int_table: MODIFY(ram_ireg,6); RTS; ___lib_setup_errno: ram_lreg=0; RTS (DB); ram_ireg=_errno; rammem(ram_ireg,ram_0)=0; ___lib_setup_stacks:PX=PM(___lib_stack_space); R0=PX2; /* Done b'cse of 48 bit/32 bit memory */ PX=PM(___lib_stack_length); R2=PX2; /* Done b'cse of 48 bit/32 bit memory */ R1=R0+R2, B7=R0; R1=R1-1, L7=R2; I7=R1; B6=B7; RTS (DB); I6=I7; L6=L7; ___lib_setup_heaps: pm_ptr = ___lib_heap_space; pm_lnt = 0; loop_thru_heaps: PX=PM(0, pm_ptr); R0=PX2; /* Done b'cse of 48 bit/32 bit memory */ R0=PASS R0, dm_lnt=dm_0; IF EQ RTS (DB); PX = PM(1, pm_ptr); R0 = PX2; /* Done b'cse of 48 bit/32 bit memory */ R0=LSHIFT R0 by 16; /* sign extend short #*/ PX = PM(4, pm_ptr); R1 = PASS R0, R0=PX2; /* Done b'cse of 48 bit/32 bit memory */ IF GT JUMP (PC, pm_heap) (DB); PX = PM(3, pm_ptr); R1=PX2; /* Done b'cse of 48 bit/32 bit memory */ dm_ptr = R1; MODIFY(pm_ptr, 5); R2=3; R1=R1+R2; R2=5; R0=R0-R2, R2=pm_ptr; DM(dm_ptr, dm_1)= 0; DM(dm_ptr, dm_1) = R1; DM(dm_ptr, dm_1) = R1; /*Dummy write*/ JUMP (PC, loop_thru_heaps) (DB); DM(dm_ptr, dm_1) = R0; DM(dm_ptr, dm_0) = 0; pm_heap: MODIFY(pm_ptr, 5); R2=pm_ptr; R3=3; R1=R1+R3, pm_ptr = R1; R3=5; R0=R0-R3; PM(pm_ptr, pm_1) = 0; /* writing doesn't need to change*/ PM(pm_ptr, pm_1) = R1; /*b'cse stacks/heaps are 32bits*/ PM(pm_ptr, pm_1) = R1; /*Dummy write*/ PM(pm_ptr, pm_1) = R0; JUMP (PC, loop_thru_heaps) (DB); PM(pm_ptr, pm_1) = R0; PM(pm_ptr, pm_0) = 0; .GLOBAL ___lib_sure_rts; ___lib_sure_rts: FETCH_RETURN /*Always a return for ints*/ RETURN (DB); RESTORE_STACK RESTORE_FRAME .ENDSEG;