home *** CD-ROM | disk | FTP | other *** search
- ;----------------------------------------------------------------------------
- ;
- ; $Source: /unixb/home/unixlib/source/unixlib37/src/sys/s/RCS/_syslib,v $
- ; $Date: 1996/11/06 22:01:42 $
- ; $Revision: 1.6 $
- ; $State: Rel $
- ; $Author: unixlib $
- ;
- ; $Log: _syslib,v $
- ; Revision 1.6 1996/11/06 22:01:42 unixlib
- ; Yet more changes by NB, PB and SC.
- ;
- ; Revision 1.5 1996/10/30 21:59:00 unixlib
- ; Massive changes made by Nick Burret and Peter Burwood.
- ;
- ; Revision 1.4 1996/09/16 21:23:52 unixlib
- ; CL_0002 Nick Burret
- ; Minor changes to file handling
- ; Change most error numbers, and use in assembler sources (SJC)
- ; Various minor bug fixes and compatability changes.
- ;
- ; Revision 1.3 1996/07/21 22:19:42 unixlib
- ; CL_0001 Nick Burret
- ; Improve memory handling. Remove C++ library incompatibilities.
- ; Improve file stat routines.
- ;
- ; Revision 1.2 1996/05/06 09:01:35 unixlib
- ; Updates to sources made by Nick Burrett, Peter Burwood and Simon Callan.
- ; Saved for 3.7a release.
- ;
- ; Revision 1.1 1996/04/19 21:34:32 simon
- ; Initial revision
- ;
- ;----------------------------------------------------------------------------
-
- GET Unix37:unixlib.s.asm_dec
-
- AREA |C$$code|,CODE,READONLY
-
-
- IMPORT |_main|
- EXPORT |__main|
-
- NAME __main
-
- ENTRY
- |__main|
- SWI XOS_GetEnv
- [ |__4K_BOUNDARY| = 1
- ; align top of wimpslot to 4k (downwards)
- BIC a2,a2,#&ff
- BIC a2,a2,#&f00
- ]
- MOV sp,a2 ; Stack = top of RAM
- SUB sl,sp,#2048 ; Limit is 2K below.
-
- LDR a4,[pc,#|__cli_ptr|-.-8]
- STR a1,[a4,#0] ; Set pointer to command line
- LDR a4,[pc,#|__himem_ptr|-.-8]
- STR a2,[a4,#0] ; Set top of memory
- LDR a4,[pc,#|__stack_ptr|-.-8]
- STR sl,[a4,#0] ; Set bottom of stack
- LDMIA a3,{a1,a2}
- AND a2,a2,#&ff
- LDR a3,[pc,#|__time_ptr|-.-8]
- STMIA a3,{a1,a2} ; Set start time.
- LDR a4,[pc,#|__robase_ptr|-.-8]
- LDR a1,[a4,#0] ; get start of RO area
- LDR a4,[pc,#|__base_ptr|-.-8]
- STR a1,[a4,#0] ; Set start address of code.
- LDR a4,[pc,#|__rwlimit_ptr|-.-8]
- LDR a1,[a4,#0] ; Get start of R/W area
- [ |__4K_BOUNDARY| = 1
- ; align rwlimit to 4k
- ADD a1,a1,#&1000
- SUB a1,a1,#1
- BIC a1,a1,#&ff
- BIC a1,a1,#&f00
- STR a1,[a4,#0]
- ]
- LDR a4,[pc,#|__lomem_ptr|-.-8]
- STR a1,[a4,#0] ; Set start of used memory
- LDR a4,[pc,#|__break_ptr|-.-8]
- STR a1,[a4,#0] ; Set end of used memory
- LDR a4,[pc,#|__stack_limit_ptr|-.-8]
- STR a1,[a4,#0] ; Set ultimate limit on stack
- CMP sl,a1
- BLS |__exit_no_memory| ; no stack - exit fast
-
- ; use of da's explicitly overridden if __dynamic_no_da is declared
- ADR a1,|__dynamic_no_da_ptr|
- LDR a1,[a1,#0]
- TEQ a1,#0
- BNE |__no_dynamic_area|
-
- ; check OS version for RISC OS 3.5+
- MOV a1,#129
- MOV a2,#0
- MOV a3,#255
- SWI XOS_Byte
- BVS |__no_dynamic_area|
- CMP a2,#165
- BCC |__no_dynamic_area|
-
- ; use old dynamic area if possible
- ; if app mem size = mem size, then can't be a spawned program
- MOV a1,#14
- MOV a2,#0
- SWI XOS_ChangeEnvironment
- CMP a2,sp
- BEQ |__no_old_area|
- ; validate numbers at top of application memory (see sys.s._exec)
- LDMIA sp,{a1,a2,a3,a4,v1,v2,v3,v4}
- EOR a3,a3,a1,ROR #7
- CMP a3,a1
- EOREQ v1,v1,a1,ROR #13
- CMPEQ v1,a1
- EOREQ v3,v3,a1,ROR #23
- CMPEQ v3,a1
- EOREQ a4,a4,a2,ROR #7
- CMPEQ a4,a2
- EOREQ v2,v2,a2,ROR #13
- CMPEQ v2,a2
- EOREQ v4,v4,a2,ROR #23
- CMPEQ v4,a2
- BNE |__no_old_area|
- MOV v6,a1 ; save new __lomem
- MOV a1,#2
- SWI XOS_DynamicArea
- ; check new __lomem = end of dynamic area
- ADD a4,a4,a3
- TEQ a4,v6
- BNE |__no_old_area|
- MOV v6,#0
- BVC |__da_found|
-
- |__no_old_area|
- ; area name is program name + "_Heap"
- LDR a4,[pc,#|__cli_ptr|-.-8]
- LDR a1,[a4,#0]
- MOV a2,a1
- ; search for space or end of cli string
- 01
- LDRB a3,[a2],#1
- CMP a3,#&20
- CMPNE a3,#0
- BNE %B01
- SUB a4,a2,#1 ; a4 is end of program name + 1
- ; search back for '.' or beginning of program name
- 02
- LDRB a3,[a2,#-1]!
- CMP a2,a1
- CMPNE a3,#&2E
- BNE %B02
- CMP a3,#&2E
- ADDEQ a2,a2,#1
- ; use a maximum of 10 characters from the program name
- SUB a3,a4,a2
- CMP a3,#10
- MOVGT a3,#10
- ADDGT a4,a2,a3
- ADR v5,|__dynamic_area_name_end_ptr|
- LDR v5,[v5,#0]
- SUB v5,v5,a3
- MOV a1,v5
- 03
- LDRB a3,[a2],#1
- STRB a3,[a1],#1
- CMP a2,a4
- BLT %B03
-
- ; check environment variable for creating a DA
- MOV a1,v5
- MOV a3,#-1
- MOV a4,#0
- MOV v1,#0
- SWI XOS_ReadVarVal
- CMP a3,#0
- BGE |__no_dynamic_area|
-
- ; create dynamic area
- MOV a1,#0
- MOV a2,#-1
- ; set initial size of dynamic area to 0K
- MOV a3,#0
- MOV a4,#-1
- MOV v1,#&80
- MOV v2,#-1 ; maximum size is total RAM in m/c
- MOV v3,#0
- MOV v4,#0
- ; v5 is already set from above
- SWI XOS_DynamicArea
- BVS |__exit_no_memory| ; no DA, report and exit
- MOV v6,a3 ; setup for deletion at exit
- |__da_found|
- ; v6 is size left in area, a4 is start offset
- ADD a1,v6,a4
- LDR v3,[pc,#|__lomem_ptr|-.-8]
- STR a4,[v3,#0] ; Lomem is start of DA
- LDR v3,[pc,#|__break_ptr|-.-8]
- STR a1,[v3,#0] ; break is end of DA
- LDR v3,[pc,#|__dynamic_num_ptr|-.-8]
- STR a2,[v3,#0]
-
- ; set lower stack limit to __rwlimit
- LDR v3,[pc,#|__rwlimit_ptr|-.-8]
- LDR a1,[v3,#0]
- LDR v3,[pc,#|__stack_limit_ptr|-.-8]
- STR a1,[v3,#0]
-
- ; if current size == passed in size, then delete DA at exit
- ; this means a spawning program must ensure that some of area is used
- ; which is always true, since 8K of heap is initially allocated
- ; FIXME - if we record the initial DA limit, then we can shrink the
- ; dynamic area when the spawned program exits.
- CMP a3,v6
- MOVEQ v5,#1
- MOVNE v5,#0
- LDR v3,[pc,#|__dynamic_deletion_ptr|-.-8]
- STR v5,[v3,#0]
-
- |__no_dynamic_area|
- ADD sl,sl,#256
- MOV fp,#0
- LDR a1,[pc,#|__alloca_list_ptr|-.-8]
- CMP a1,#0
- STRNE fp,[a1,#0]
-
- ; This line is needed for the GNU Objective-C runtime system.
- ; We need a safe 128 bytes of stack space to prevent a program
- ; crashing when the library does a direct copy off the stack.
- SUB sp, sp, #128
- ; Find out whether we are executing within a TaskWindow or not.
- MOV a1, #0
- SWI XTaskWindow_TaskInfo
- LDR a2, [pc, #|__taskwindow_ptr| - . - 8]
- MOVVS a1, #0
- STR a1, [a2, #0]
- B |_main|
-
- |__exit_no_memory|
- SWI OS_WriteS
- DCB "Insufficient memory for application", 0
- ALIGN
- SWI OS_NewLine
- MOV a1,#0
- LDR a2,[pc,#|__exit_word|-.-8]
- MOV a3,#1
- SWI OS_Exit
-
- |__dynamic_area_name_end_ptr|
- DCD |__dynamic_area_name_end|
-
- IMPORT |Image$$RO$$Base|
- IMPORT |Image$$RW$$Base|
- IMPORT |Image$$RW$$Limit|
-
- EXPORT |__svccli| ; copy CLI in SVC mode
-
- NAME __svccli
- |__svccli|
- LDR a2,[pc,#|__cli_ptr|-.-8]
- LDR a2,[a2,#0]
- MOV a4,lr
- SWI OS_EnterOS
- |__svccli_l0|
- LDRBT a3,[a2],#1
- STRBT a3,[a1],#1
- CMP a3,#0
- BNE |__svccli_l0|
- MOVS pc,a4 ; return to USR mode
-
- |__taskwindow_ptr|
- DCD |__taskwindow|
-
- IMPORT |__dynamic_no_da|,WEAK
- |__dynamic_no_da_ptr|
- DCD |__dynamic_no_da|
- |__dynamic_num_ptr|
- DCD |__dynamic_num|
- |__dynamic_deletion_ptr|
- DCD |__dynamic_deletion|
-
- |__cli_ptr|
- DCD |__cli|
-
- |__robase_ptr|
- DCD |__robase|
- |__base_ptr|
- DCD |__base|
- |__rwbase_ptr|
- DCD |__rwbase|
- |__rwlimit_ptr|
- DCD |__rwlimit|
- |__himem_ptr|
- DCD |__himem|
- |__lomem_ptr|
- DCD |__lomem|
-
- |__break_ptr|
- DCD |__break|
- |__stack_ptr|
- DCD |__stack|
- |__stack_limit_ptr|
- DCD |__stack_limit|
-
- |__time_ptr|
- DCD |__time|
-
- IMPORT |__alloca_list|,WEAK
- |__alloca_list_ptr|
- DCD |__alloca_list|
-
- IMPORT |__uname_dont_pack|,WEAK
- EXPORT |__uname_dont_pack_ptr|
- |__uname_dont_pack_ptr|
- DCD |__uname_dont_pack|
-
- EXPORT |__dynamic_area_exit|
- |__dynamic_area_exit|
- LDR a2,[pc,#|__dynamic_deletion_ptr|-.-8]
- LDR a2,[a2,#0]
- TEQ a2,#1
- MOVNES pc,lr
- MOV a4,lr
- LDR a2,[pc,#|__dynamic_num_ptr|-.-8]
- LDR a2,[a2,#0]
- MOV a1,#1
- CMP a2,#-1
- SWINE XOS_DynamicArea
- MOVS pc,a4
-
- EXPORT |__exit|
-
- NAME __exit
- |__exit|
- MOV v1,a1
- BL |__dynamic_area_exit|
- ; re-enable Escape (in case SIGINT handler fired in ttyicanon)
- MOV a1,#229
- MOV a2,#0
- MOV a3,#0
- SWI XOS_Byte
- MOV a3,v1
- LDR a2,[pc,#|__exit_word|-.-8]
- MOV a1,#0
-
- SWI OS_Exit ; - never returns
-
- |__exit_word|
- DCD &58454241
-
- EXPORT |__exit_no_code|
-
- |__exit_no_code|
- BL |__dynamic_area_exit|
- MOV a1,#0
- MOV a2,#0
- MOV a3,#0
- SWI OS_Exit ; - never returns
-
- IMPORT |__vret|,WEAK
- EXPORT |___vret|
- |___vret|
- DCD |__vret|
-
- IMPORT |__stdioinit|,WEAK
- EXPORT |___stdioinit|
- |___stdioinit|
- DCD |__stdioinit|
-
- IMPORT |__stdioexit|,WEAK
- EXPORT |___stdioexit|
- |___stdioexit|
- DCD |__stdioexit|
-
- IMPORT |___main|, WEAK
- EXPORT |___do_global_ctors|
- |___do_global_ctors|
- DCD |___main|
-
-
- EXPORT |__rdenv|
-
- NAME __rdenv
- |__rdenv|
- MOV ip,a2
- MOV a2,#0
- MOV a3,#0
- MOV a4,#0
-
- SWI XOS_ChangeEnvironment
-
- STMVCIA ip,{a2,a3,a4}
- MOVVC a1,#0
-
- MOVS pc,lr
-
- EXPORT |__wrenv|
-
- NAME __wrenv
- |__wrenv|
- LDMIA a2,{a2,a3,a4}
- SWI XOS_ChangeEnvironment
- MOVVC a1,#0
- MOVS pc,lr
-
-
- EXPORT |x$divtest|
- ; The following symbols are added so we can use UnixLib with C v.5
- EXPORT |__rt_divtest|
- |x$divtest|
- |__rt_divtest|
- MOVS pc,lr
-
- EXPORT |x$remainder|
-
- NAME x$remainder
- |x$remainder|
- STMFD sp!,{lr}
- BL |x$divide|
- MOV a1,a2
- LDMFD sp!,{pc}^
-
- EXPORT |x$uremainder|
-
- NAME x$uremainder
- |x$uremainder|
- STMFD sp!,{lr}
- BL |x$udivide|
- MOV a1,a2
- LDMFD sp!,{pc}^
-
- |x$overflow|
- MVN a1,#0
- MOVS pc,lr
-
- ; Veneer to x$udivide to cater for C v.5 code generation
- EXPORT |__rt_udiv10| ; a1 = a1 / 10; a2 = a1 % 10
-
- NAME __rt_udiv10
- |__rt_udiv10|
- MOV a2,a1
- MOV a1,#10
- B |x$udiv10| ; let x$udivide return for us
-
- EXPORT |x$udivide| ; a1 = a2 / a1; a2 = a2 % a1
- ; The following symbols are added so we can use UnixLib with C v.5
- EXPORT |__rt_udiv|
- EXPORT |_kernel_udiv|
-
- NAME x$udivide
- |x$udivide|
- |__rt_udiv|
- |_kernel_udiv|
- CMP a1,#1
- BLO |x$overflow|
- BEQ |x$divide_l0|
- |x$udiv10|
- MOV ip,#0
- MOVS a2,a2
- BPL |x$divide_l1|
- ORR ip,ip,#&20000000; ip bit &20000000 = -ve a2
- MOVS a2,a2,LSR #1
- ORRCS ip,ip,#&10000000; ip bit &10000000 = bit 0 of a2
- B |x$divide_l1|
-
- |x$divide_l0| ; a1 == 1
- MOV a1,a2
- MOV a2,#0
- MOVS pc,lr
-
- ; Veneer to x$divide to cater for C v.5 code generation
- EXPORT |__rt_sdiv10| ; a1 = a1 / 10; a2 = a1 % 10
-
- NAME __rt_sdiv10
- |__rt_sdiv10|
- MOV a2,a1
- MOV a1,#10
- B |x$sdiv10| ; let x$divide return for us
-
- EXPORT |x$divide| ; a1 = a2 / a1; a2 = a2 % a1
- ; The following symbols are added so we can use UnixLib with C v.5
- EXPORT |__rt_sdiv|
- EXPORT |_kernel_sdiv|
-
- NAME x$divide
- |x$divide|
- |__rt_sdiv|
- |_kernel_sdiv|
- CMP a1,#1
- BLO |x$overflow|
- BEQ |x$divide_l0|
- |x$sdiv10|
- ANDS ip,a1,#&80000000
- RSBMI a1,a1,#0
- ANDS a3,a2,#&80000000
- EOR ip,ip,a3
- RSBMI a2,a2,#0
- ORR ip,a3,ip,LSR #1 ; ip bit &40000000 = -ve division
- ; ip bit &80000000 = -ve remainder
-
- |x$divide_l1|
- MOV a3,#1
- MOV a4,#0
-
- CMP a2,a1
- BLO |x$divide_b0|
- CMP a2,a1,LSL #1
- BLO |x$divide_b1|
- CMP a2,a1,LSL #2
- BLO |x$divide_b2|
- CMP a2,a1,LSL #3
- BLO |x$divide_b3|
- CMP a2,a1,LSL #4
- BLO |x$divide_b4|
- CMP a2,a1,LSL #5
- BLO |x$divide_b5|
- CMP a2,a1,LSL #6
- BLO |x$divide_b6|
- CMP a2,a1,LSL #7
- BLO |x$divide_b7|
- CMP a2,a1,LSL #8
- BLO |x$divide_b8|
- CMP a2,a1,LSL #9
- BLO |x$divide_b9|
- CMP a2,a1,LSL #10
- BLO |x$divide_b10|
- CMP a2,a1,LSL #11
- BLO |x$divide_b11|
- CMP a2,a1,LSL #12
- BLO |x$divide_b12|
- CMP a2,a1,LSL #13
- BLO |x$divide_b13|
- CMP a2,a1,LSL #14
- BLO |x$divide_b14|
- CMP a2,a1,LSL #15
- BLO |x$divide_b15|
- CMP a2,a1,LSL #16
- BLO |x$divide_b16|
- CMP a2,a1,LSL #17
- BLO |x$divide_b17|
- CMP a2,a1,LSL #18
- BLO |x$divide_b18|
- CMP a2,a1,LSL #19
- BLO |x$divide_b19|
- CMP a2,a1,LSL #20
- BLO |x$divide_b20|
- CMP a2,a1,LSL #21
- BLO |x$divide_b21|
- CMP a2,a1,LSL #22
- BLO |x$divide_b22|
- CMP a2,a1,LSL #23
- BLO |x$divide_b23|
- CMP a2,a1,LSL #24
- BLO |x$divide_b24|
- CMP a2,a1,LSL #25
- BLO |x$divide_b25|
- CMP a2,a1,LSL #26
- BLO |x$divide_b26|
- CMP a2,a1,LSL #27
- BLO |x$divide_b27|
- CMP a2,a1,LSL #28
- BLO |x$divide_b28|
- CMP a2,a1,LSL #29
- BLO |x$divide_b29|
- CMP a2,a1,LSL #30
- BLO |x$divide_b30|
- CMP a2,a1,LSL #31
- SUBHS a2,a2,a1,LSL #31
- ADDHS a4,a4,a3,LSL #31
- CMP a2,a1,LSL #30
- SUBHS a2,a2,a1,LSL #30
- ADDHS a4,a4,a3,LSL #30
- |x$divide_b30|
- CMP a2,a1,LSL #29
- SUBHS a2,a2,a1,LSL #29
- ADDHS a4,a4,a3,LSL #29
- |x$divide_b29|
- CMP a2,a1,LSL #28
- SUBHS a2,a2,a1,LSL #28
- ADDHS a4,a4,a3,LSL #28
- |x$divide_b28|
- CMP a2,a1,LSL #27
- SUBHSS a2,a2,a1,LSL #27
- ADDHS a4,a4,a3,LSL #27
- |x$divide_b27|
- CMP a2,a1,LSL #26
- SUBHS a2,a2,a1,LSL #26
- ADDHS a4,a4,a3,LSL #26
- |x$divide_b26|
- CMP a2,a1,LSL #25
- SUBHS a2,a2,a1,LSL #25
- ADDHS a4,a4,a3,LSL #25
- |x$divide_b25|
- CMP a2,a1,LSL #24
- SUBHS a2,a2,a1,LSL #24
- ADDHS a4,a4,a3,LSL #24
- |x$divide_b24|
- CMP a2,a1,LSL #23
- SUBHS a2,a2,a1,LSL #23
- ADDHS a4,a4,a3,LSL #23
- |x$divide_b23|
- CMP a2,a1,LSL #22
- SUBHS a2,a2,a1,LSL #22
- ADDHS a4,a4,a3,LSL #22
- |x$divide_b22|
- CMP a2,a1,LSL #21
- SUBHS a2,a2,a1,LSL #21
- ADDHS a4,a4,a3,LSL #21
- |x$divide_b21|
- CMP a2,a1,LSL #20
- SUBHS a2,a2,a1,LSL #20
- ADDHS a4,a4,a3,LSL #20
- |x$divide_b20|
- CMP a2,a1,LSL #19
- SUBHS a2,a2,a1,LSL #19
- ADDHS a4,a4,a3,LSL #19
- |x$divide_b19|
- CMP a2,a1,LSL #18
- SUBHS a2,a2,a1,LSL #18
- ADDHS a4,a4,a3,LSL #18
- |x$divide_b18|
- CMP a2,a1,LSL #17
- SUBHS a2,a2,a1,LSL #17
- ADDHS a4,a4,a3,LSL #17
- |x$divide_b17|
- CMP a2,a1,LSL #16
- SUBHS a2,a2,a1,LSL #16
- ADDHS a4,a4,a3,LSL #16
- |x$divide_b16|
- CMP a2,a1,LSL #15
- SUBHS a2,a2,a1,LSL #15
- ADDHS a4,a4,a3,LSL #15
- |x$divide_b15|
- CMP a2,a1,LSL #14
- SUBHS a2,a2,a1,LSL #14
- ADDHS a4,a4,a3,LSL #14
- |x$divide_b14|
- CMP a2,a1,LSL #13
- SUBHS a2,a2,a1,LSL #13
- ADDHS a4,a4,a3,LSL #13
- |x$divide_b13|
- CMP a2,a1,LSL #12
- SUBHS a2,a2,a1,LSL #12
- ADDHS a4,a4,a3,LSL #12
- |x$divide_b12|
- CMP a2,a1,LSL #11
- SUBHS a2,a2,a1,LSL #11
- ADDHS a4,a4,a3,LSL #11
- |x$divide_b11|
- CMP a2,a1,LSL #10
- SUBHS a2,a2,a1,LSL #10
- ADDHS a4,a4,a3,LSL #10
- |x$divide_b10|
- CMP a2,a1,LSL #9
- SUBHS a2,a2,a1,LSL #9
- ADDHS a4,a4,a3,LSL #9
- |x$divide_b9|
- CMP a2,a1,LSL #8
- SUBHS a2,a2,a1,LSL #8
- ADDHS a4,a4,a3,LSL #8
- |x$divide_b8|
- CMP a2,a1,LSL #7
- SUBHS a2,a2,a1,LSL #7
- ADDHS a4,a4,a3,LSL #7
- |x$divide_b7|
- CMP a2,a1,LSL #6
- SUBHS a2,a2,a1,LSL #6
- ADDHS a4,a4,a3,LSL #6
- |x$divide_b6|
- CMP a2,a1,LSL #5
- SUBHS a2,a2,a1,LSL #5
- ADDHS a4,a4,a3,LSL #5
- |x$divide_b5|
- CMP a2,a1,LSL #4
- SUBHS a2,a2,a1,LSL #4
- ADDHS a4,a4,a3,LSL #4
- |x$divide_b4|
- CMP a2,a1,LSL #3
- SUBHS a2,a2,a1,LSL #3
- ADDHS a4,a4,a3,LSL #3
- |x$divide_b3|
- CMP a2,a1,LSL #2
- SUBHS a2,a2,a1,LSL #2
- ADDHS a4,a4,a3,LSL #2
- |x$divide_b2|
- CMP a2,a1,LSL #1
- SUBHS a2,a2,a1,LSL #1
- ADDHS a4,a4,a3,LSL #1
- |x$divide_b1|
- CMP a2,a1
- SUBHS a2,a2,a1
- ADDHS a4,a4,a3
- |x$divide_b0|
-
- TST ip,#&20000000
- BNE |x$udivide_l1|
- MOV a1,a4
- CMP ip,#0
- RSBMI a2,a2,#0
- MOVS ip,ip,LSL #1
- RSBMI a1,a1,#0
- MOVS pc,lr
-
- |x$udivide_l1|
- TST ip,#&10000000
- MOV a2,a2,LSL #1
- ORRNE a2,a2,#1
- MOV a4,a4,LSL #1
- CMP a2,a1
- SUBHS a2,a2,a1
- ADDHS a4,a4,a3
- MOV a1,a4
- MOVS pc,lr
-
-
- IMPORT raise
-
- EXPORT |x$stack_overflow| ; allocate 512 bytes more stack
- ; The following symbols are added so we can use UnixLib with C v.5
- EXPORT |__rt_stkovf_split_small|
-
- NAME x$stack_overflow
- |x$stack_overflow|
- |__rt_stkovf_split_small|
- STMFD sp!,{a1,a2,lr}
- LDR a1,[pc,#|__stack_limit_ptr|-.-8]
- LDR a1,[a1,#0]
- LDR lr,[pc,#|__stack_ptr|-.-8]
- LDR a2,[lr,#0]
- SUB a2,a2,#512
- CMP a2,a1
- STR a2,[lr,#0]
- ADD sl,a2,#256
- LDMCSFD sp!,{a1,a2,pc}^
- STMFD sp!,{a3,a4,ip}
- MOV a1,#SIGEMT
- BL raise
- LDMFD sp!,{a3,a4,ip}
- LDMFD sp!,{a1,a2,pc}^
-
- EXPORT |x$stack_overflow_1| ; allocate stack to below <ip>
- ; The following symbols are added so we can use UnixLib with C v.5
- EXPORT |__rt_stkovf_split_big|
-
- NAME x$stack_overflow_1
- |x$stack_overflow_1|
- |__rt_stkovf_split_big|
- CMP ip,sl ; sanity check
- MOVCSS pc,lr
- STMFD sp!,{a1,a2,lr}
- LDR a1,[pc,#|__stack_limit_ptr|-.-8]
- LDR a1,[a1,#0]
- LDR lr,[pc,#|__stack_ptr|-.-8]
- SUB a2,ip,#512
- CMP a2,a1
- STR a2,[lr,#0]
- ADD sl,a2,#256
- LDMCSFD sp!,{a1,a2,pc}^
- STMFD sp!,{a3,a4,ip}
- MOV a1,#SIGEMT
- BL raise
- LDMFD sp!,{a3,a4,ip}
- LDMFD sp!,{a1,a2,pc}^
-
-
- EXPORT |_wr1chk|
- EXPORT |_wr2chk|
- EXPORT |_wr4chk|
- ; The following symbols are added so we can use UnixLib with C v.5
- EXPORT |__rt_wr1chk|
- EXPORT |__rt_wr2chk|
- EXPORT |__rt_wr4chk|
- |__rt_wr1chk|
- |_wr1chk|
- BIC a1,a1,#1 ; Ensure address is half word aligned
- |__rt_wr2chk|
- |_wr2chk|
- TST a1,#1
- BNE |__rwNsegv|
- BIC a1,a1,#2 ; Ensure address is full word aligned
-
- |__rt_wr4chk|
- |_wr4chk|
- TST a1,#2
- BNE |__rwNsegv|
-
- LDR a2,[pc,#|__rwbase_ptr|-.-8]
- LDR a2,[a2,#0]
- B |__rwNchk|
-
- EXPORT |_rd1chk|
- EXPORT |_rd2chk|
- EXPORT |_rd4chk|
- ; The following symbols are added so we can use UnixLib with C v.5
- EXPORT |__rt_rd1chk|
- EXPORT |__rt_rd2chk|
- EXPORT |__rt_rd4chk|
-
- |__rt_rd1chk|
- |_rd1chk|
- BIC a1,a1,#1 ; Ensure address is half word aligned
- |__rt_rd2chk|
- |_rd2chk|
- TST a1,#1
- BNE |__rwNsegv|
- BIC a1,a1,#2 ; Ensure address is full word aligned
- |__rt_rd4chk|
- |_rd4chk|
- TST a1,#2
- BNE |__rwNsegv|
-
- LDR a2,[pc,#|__base_ptr|-.-8]
- LDR a2,[a2,#0]
- |__rwNchk|
- CMP a1,a2
- BLO |__rwNsegv|
- LDR a2,[pc,#|__break_ptr|-.-8]
- LDR a2,[a2,#0]
- CMP a1,a2
- MOVLOS pc,lr
- LDR a2,[pc,#|__stack_ptr|-.-8]
- LDR a2,[a2,#0]
- CMP a1,a2
- BLO |__rwNsegv|
- LDR a2,[pc,#|__himem_ptr|-.-8]
- LDR a2,[a2,#0]
- CMP a1,a2
- MOVLOS pc,lr
- |__rwNsegv|
- MOV a1,#SIGSEGV
- B raise
-
- EXPORT |_count|
-
- NAME _count
- |_count|
- ADD lr,lr,#8
- MOVS pc,lr
-
- EXPORT |_count1|
-
- NAME _count1
- |_count1|
- ADD lr,lr,#8
- MOVS pc,lr
-
- EXPORT |__fptest|
- |__fptest|
- ; Recognise the Floating Point facility by determining whether
- ; the SWI FPEmulator_Version actually exists (and works).
- ; If it does, then there is a floating point ability.
- SWI XFPEmulator_Version
- MOVVS a1, #0
- MOVVC a1, #1
- LDR a2, [pc, #|__fpflag_ptr| - . - 8]
- STR a1, [a2, #0]
- MOVS pc, lr
-
- |__fpflag_ptr|
- DCD |__fpflag|
-
- AREA |C$$data|,DATA
-
- EXPORT |__dynamic_num|
- |__dynamic_num|
- DCD -1
- |__dynamic_deletion|
- DCD 0
- DCB "XXXXXXXXXX"
- |__dynamic_area_name_end|
- DCB "_Heap", 0
- ALIGN
-
- EXPORT |__cli| ; CLI from OS_GetEnv
- |__cli|
- DCD 0
-
- EXPORT |__base| ; BASE (application = 0x8000)
- |__robase|
- DCD |Image$$RO$$Base|
- |__base|
- DCD 0
- EXPORT |__lomem| ; LOMEM
- EXPORT |__rwlimit|
- |__rwbase|
- DCD |Image$$RW$$Base|
- |__rwlimit|
- DCD |Image$$RW$$Limit|
- |__lomem|
- DCD 0
-
- EXPORT |__himem| ; HIMEM from OS_GetEnv
- |__himem|
- DCD 0
-
- EXPORT |__break| ; the 'break'
- |__break|
- DCD 0
-
- EXPORT |__stack| ; stack limit
- |__stack|
- DCD 0
-
- EXPORT |__stack_limit| ; lower stack limit
- |__stack_limit|
- DCD 0
-
- EXPORT |__time| ; start time - 5 byte format
- |__time|
- DCD 0 ; low word
- DCD 0 ; high byte
-
- EXPORT |__fpflag|
- |__fpflag|
- DCD 0
-
- EXPORT |__taskwindow|
- ; Not zero if we are executing within a TaskWindow.
- ; Set to 0 if we are not executing within a TaskWindow
- |__taskwindow|
- DCD 0
-
- END
-