home *** CD-ROM | disk | FTP | other *** search
- ; by Ferdinand Oeinck copyright 1990
- ;
- ; version 1.00, 04-06-1990
- ;
- ; file: exproasm.s
- ;
- ;
- ;
-
-
- a1 RN 0
- a2 RN 1
- a3 RN 2
- a4 RN 3
- v1 RN 4
- v2 RN 5
- v3 RN 6
- v4 RN 7
- v5 RN 8
- v6 RN 9
- sl RN 10
- fp RN 11
- ip RN 12
- sp RN 13
- lr RN 14
- pc RN 15
-
- f0 FN 0
- f1 FN 1
- f2 FN 2
- f3 FN 3
- f4 FN 4
- f5 FN 5
- f6 FN 6
- f7 FN 7
-
- r0 RN 0
- r1 RN 1
- r2 RN 2
- r3 RN 3
- r4 RN 4
- r5 RN 5
- r6 RN 6
- r7 RN 7
- r8 RN 8
- r9 RN 9
- r10 RN 10
- r11 RN 11
- r12 RN 12
- r13 RN 13
- r14 RN 14
- r15 RN 15
-
- R0 RN 0
- R1 RN 1
- R2 RN 2
- R3 RN 3
- R4 RN 4
- R5 RN 5
- R6 RN 6
- R7 RN 7
- R8 RN 8
- R9 RN 9
- R10 RN 10
- R11 RN 11
- R12 RN 12
- R13 RN 13
- R14 RN 14
- PC RN 15
-
- GET $.clib.s.swis
-
- OS_check_address * &38006CC
- OS_check_cont * &E58CD108
-
- AREA |C$$code|, CODE, READONLY
-
-
- ;****************************************************************
- ;* *
- ;* FUNCTION TO CLAIM THE INTERRUPT AND INTERUPT HANDLER *
- ;* *
- ;****************************************************************
-
- exproasm_ClaimIntDeviceVector_X
- DCB "exproasm_ClaimIntDeviceVector", 0
- ALIGN
- exproasm_ClaimIntDeviceVector_Y
- DCD &ff000000 + exproasm_ClaimIntDeviceVector_Y - exproasm_ClaimIntDeviceVector_X
-
- EXPORT exproasm_ClaimIntDeviceVector
-
- exproasm_ClaimIntDeviceVector
- ;void exproasm_ClaimIntDeviceVector(int *adr, int *cnt, int count);
-
- LDR a1, expro_check
- LDR a2, expro_check + 4
- LDR a1, [a1]
- CMP a1, a2 ; check if running under RISCOS 2.00
- MOVNE a1, #0
- MOVNES pc, lr ; no
-
- MOV a1, #0
- LDR a3, [a1, #4] ; load undefined instr. vector
- STR a3, default_undef_vector
- BIC a3, a3, #&FF000000 ; clear branch bits
- MOV a3, a3, LSL #2
- ADD a3, a3, #12 ; address
- STR a3, default_undef_instr ; save undefined instr. address
-
- ADR a2, undefined_instr
- SUB a2, a2, #12
- MOV a2, a2, LSR #2
- ORR a2, a2, #&EA000000
- STR a2, [a1, #4] ; save my undefined instr. address
- STR a2, my_undef_branch
-
- MOV a1, #1 ; yes
- ADR a2, exproasm_every
- MOV a3, #0
- SWI OS_CallEvery
-
- MOV a1, #1
- LDR a2, expro_claimed
- STR a1, [a2]
-
- MOVS pc, lr
-
- expro_check
- DCD OS_check_address
- DCD OS_check_cont
-
- default_undef_vector
- DCD 0
- my_undef_branch
- DCD 0
-
- expro_claimed
- DCD |x$dataseg| + 4
-
- EXPORT expro_fp_return_address
- expro_fp_return_address
- DCD 0
-
- ;****************************************************************
-
- exproasm_ReleaseIntDeviceVector_X
- DCB "exproasm_ReleaseIntDeviceVector", 0
- ALIGN
- exproasm_ReleaseIntDeviceVector_Y
- DCD &ff000000+exproasm_ReleaseIntDeviceVector_Y-exproasm_ReleaseIntDeviceVector_X
-
- EXPORT exproasm_ReleaseIntDeviceVector
-
- exproasm_ReleaseIntDeviceVector ; void exproasm_ReleaseIntDeviceVector(void);
-
-
- ADR a1, exproasm_every
- MOV a2, #0
- SWI OS_RemoveTickerEvent
-
- LDR a1, default_undef_vector
- MOV a2, #0
- STR a1, [a2, #4] ; restore undefined inst. vector
-
- MOV a1, #0
- LDR a2, expro_claimed
- STR a1, [a2]
-
- MOVS pc, lr
-
- ;****************************************************************
-
- exproasm_every_X
- DCB "exproasm_every", 0
- ALIGN
- exproasm_every_Y
- DCD &ff000000 + exproasm_every_Y - exproasm_every_X
-
- IMPORT binsearch
-
- exproasm_every
- STMFD sp!, {a1-a4, ip, lr}
- MOV a1, #0
- LDR a2, [a1, #264] ; OS stack storage
- LDR a1, [a2, #28] ; 8 regs on stack => 7 * 4 = 28
- BIC a1, a1, #&FC000003
- BL binsearch
- LDMFD sp!, {a1-a4, ip, pc}
-
-
- undefined_instr
- STMFD sp!, {a1}
- BIC a1, lr, #&FC000003 ; return address
- STR a1, expro_fp_return_address
- LDMFD sp!, {a1}
- LDR pc, default_undef_instr
-
- default_undef_instr
- DCD 0
-
- ;****************************************************************
- ;* *
- ;* FUNCTIONS TO GET THE RELEVANT LINKER AREAS TO C *
- ;* *
- ;****************************************************************
-
- exproasm_getstart_X
- DCB "exproasm_getstart", 0
- ALIGN
- exproasm_getstart_Y
- DCD &ff000000 + exproasm_getstart_Y - exproasm_getstart_X
-
- EXPORT exproasm_getstart
-
- exproasm_getstart ; void exproasm_getstart(void);
- ADR a1, exproasm_data
- LDR a1, [a1, #0]
- MOV pc, lr
-
- ;****************************************************************
-
- exproasm_getend_X
- DCB "exproasm_getend", 0
- ALIGN
- exproasm_getend_Y
- DCD &ff000000 + exproasm_getend_Y - exproasm_getend_X
-
-
- EXPORT exproasm_getend
-
- exproasm_getend ; void exproasm_getend(void);
- ADR a1, exproasm_data
- LDR a1, [a1, #4]
- MOV pc, lr
-
-
- EXPORT exproasm_getlangdesblock
-
- exproasm_getlangdesblock ; void exproasm_getlangdesblock(void);
- ADR a1, exproasm_data
- LDR a1, [a1, #8]
- MOV pc, lr
-
-
- IMPORT |C$$code$$Base|
- IMPORT |C$$code$$Limit|
- IMPORT |RTSK$$Data$$Base|
-
- exproasm_data
- DCD |C$$code$$Base|
- DCD |C$$code$$Limit|
- DCD |RTSK$$Data$$Base|
-
-
-
-
-
- ;****************************************************************
- ;* *
- ;* REDEFINITION OF wimp_poll AND wimp_pollidle *
- ;* *
- ;****************************************************************
-
- EXPORT wimp_poll
- IMPORT |_kernel_fpavailable|
- wimp_poll
- MOV R12,R13
- STMDB R13!,{R4,R5,R11,R12,R14,PC}
- SUB R11,R12,#4
- MOV R5,R0
- MOV R4,R1
- LDR R0, fp_state_ptr
- LDR R0,[R0],#0
- CMP R0,#0
- BLNE |_kernel_fpavailable|
- CMPNE R0,#0
- BLNE save_fpe_state
- MOV R14,R0
-
- LDR r0, expro_claimed
- LDR r0, [r0]
- CMP r0, #1
- BNE poll_no_expro1
-
- ADR r0, exproasm_every
- MOV r1, #0
- SWI OS_RemoveTickerEvent
- LDR r0, default_undef_vector
- MOV r1, #0
- STR r0, [r1, #4]
-
- poll_no_expro1
- MOV R0,R5
- ADD R1,R4,#4
- SWI XOS_Bit:OR:Wimp_Poll
- SUB R1,R1,#4
- STR R0,[R1,#0]
- MOVVC R0,#0
- CMP R14,#0
- BLNE restore_fpe_state
-
- MOV r5, r0
- LDR r0, expro_claimed
- LDR r0, [r0]
- CMP r0, #1
- BNE poll_no_expro2
-
- LDR a2, my_undef_branch
- MOV a1, #0
- STR a2, [a1, #4]
- MOV a1, #1
- ADR a2, exproasm_every
- MOV a3, #0
- SWI OS_CallEvery
-
- poll_no_expro2
- MOV r0, r5
- LDMDB R11,{R4,R5,R11,R13,PC}^
-
-
- EXPORT wimp_pollidle
- IMPORT |_kernel_fpavailable|
- wimp_pollidle
- MOV R12,R13
- STMDB R13!,{R4-R6,R11,R12,R14,PC}
- SUB R11,R12,#4
- MOV R5,R0
- MOV R4,R1
- MOV R6,R2
- LDR R0, fp_state_ptr
- LDR R0,[R0],#0
- CMP R0,#0
- BLNE |_kernel_fpavailable|
- CMPNE R0,#0
- BLNE save_fpe_state
- MOV R14,R0
-
- LDR r0, expro_claimed
- LDR r0, [r0]
- CMP r0, #1
- BNE pollidle_no_expro1
-
- ADR r0, exproasm_every
- MOV r1, #0
- SWI OS_RemoveTickerEvent
- LDR r0, default_undef_vector
- MOV r1, #0
- STR r0, [r1, #4]
-
- pollidle_no_expro1
- MOV R0,R5
- ADD R1,R4,#4
- MOV R2,R6
- SWI XOS_Bit:OR:Wimp_PollIdle
- CMP R14,#0
- BLNE restore_fpe_state
- SUB R1,R1,#4
- STR R0,[R1,#0]
- MOVVC R0,#0
-
- MOV r5, r0
- LDR r0, expro_claimed
- LDR r0, [r0]
- CMP r0, #1
- BNE pollidle_no_expro2
-
- LDR a2, my_undef_branch
- MOV a1, #0
- STR a2, [a1, #4]
- MOV a1, #1
- ADR a2, exproasm_every
- MOV a3, #0
- SWI OS_CallEvery
-
- pollidle_no_expro2
- MOV r0, r5
-
- LDMDB R11,{R4-R6,R11,R13,PC}^
-
- save_fpe_state
- RFS R1
- STMDB R13!,{R1}
- MOV R1,#0
- WFS R1
- SUB R13,R13,#&30
- STFE f4,[R13,#0]
- STFE f5,[R13,#12]
- STFE f6,[R13,#24]
- STFE f7,[R13,#36]
- MOVS PC,R14
-
- restore_fpe_state
- MOV R4,#0
- WFS R4
- LDFE f4,[R13,#0]
- LDFE f5,[R13,#12]
- LDFE f6,[R13,#24]
- LDFE f7,[R13,#36]
- ADD R13,R13,#&30
- LDMIA R13!,{R4}
- WFS R4
- MOVS PC,R14
-
-
- EXPORT wimp_save_fp_state_on_poll
- wimp_save_fp_state_on_poll
- LDR R0, fp_state_ptr
- MOV R1,#1
- STR R1,[R0],#0
- MOVS PC,R14
-
-
- EXPORT wimp_corrupt_fp_state_on_poll
- wimp_corrupt_fp_state_on_poll
- LDR R0, fp_state_ptr
- MOV R1,#0
- STR R1,[R0],#0
- MOVS PC,R14
-
- fp_state_ptr
- DCD |x$dataseg|
-
- ;****************************************************************
-
-
- AREA |C$$data|
-
- |x$dataseg|
- DCD 0
- DCD 0
- END
-