1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- ; "asmarm.s" Copyright (C) Codemist Ltd, 1992
- ;
- ;
- r0 RN 0 ; r0-r3 are used as workspace here
- r1 RN 1
- r2 RN 2
- r3 RN 3
- r12 RN 12 ; points at profile_record
- sp RN 13 ; stack provided by the operating system for me
- lr RN 14 ; return address
- pc RN 15
- AREA |C$$code|, CODE, READONLY
- IMPORT |__main|
- B |__main|
- EXPORT |__RO_Base|
- EXPORT |__RO_Limit|
- IMPORT |Image$$RO$$Base|
- IMPORT |Image$$RO$$Limit|
- |__RO_Base|
- & |Image$$RO$$Base|
- |__RO_Limit|
- & |Image$$RO$$Limit|
- EXPORT wimp_tick
- IMPORT C_nil
- IMPORT tick_pending
- IMPORT polltick_pending
- IMPORT already_in_gc
- IMPORT tick_on_gc_exit
- IMPORT saveheaplimit
- IMPORT savevheaplimit
- IMPORT savecodelimit
- IMPORT savestacklimit
- IMPORT stackbase
- tick_count
- & 0
- wimp_tick
- LDR r2, tick_count
- SUBS r2, r2, #1 ; decrement tick_count
- MOVMI r2, #20 ; set back to 1/5 second delay on wrap
- STR r2, tick_count
- MOVPLS pc, lr ; not ready yet
- LDR r2, =polltick_pending
- STR r2, [r2, #0] ; set polltick_pending
- LDR r2, =tick_pending
- LDR r0, [r2, #0]
- CMPS r0, #0
- MOVNES pc, lr ; tick already signalled
- LDR r0, =already_in_gc
- LDR r1, [r0, #0]
- CMPS r1, #0
- BEQ not_in_gc
- LDR r2, =tick_on_gc_exit
- STR r1, [r2, #0] ; special case if garbage collecting
- MOVS pc, lr
- not_in_gc
- LDR r0, =C_nil ; use NIL as base-register
- LDR r0, [r0, #0]
- BIC r0, r0, #&80000000 ; clean up potential mark bit
- MOV r1, r0
- MOV r3, #1
- STR r3, [r2, #0]
- LDR r3, [r1, #76]
- LDR r2, =saveheaplimit
- STR r3, [r2, #0]
- LDR r2, [r1, #72]
- STR r2, [r1, #76]
- LDR r1, [r0, #80]
- LDR r2, =savevheaplimit
- STR r1, [r2, #0]
- LDR r1, [r0, #84]
- STR r1, [r0, #80]
- LDR r2, [r0, #56]
- LDR r1, =savecodelimit
- STR r2, [r1, #0]
- LDR r1, [r0, #52]
- STR r1, [r0, #56]
- LDR r2, [r0, #60]
- LDR r1, =savestacklimit
- STR r2, [r1, #0]
- LDR r1, =stackbase
- LDR r1, [r1, #0]
- STR r1, [r0, #60]
- MOVS pc, lr
- END
|