home *** CD-ROM | disk | FTP | other *** search
- ; Assembler function to enable podule irqs
-
- GET &.Hdr.ListOpts
- GET &.Hdr.Macros
- GET &.Hdr.System
- GET &.Hdr.EnvNumbers
- GET &.Hdr.ModHand
-
- EXPORT enable_podule_irqs
- EXPORT disable_podule_irqs
- EXPORT disable_irqs
- EXPORT enable_irqs
- EXPORT splet
- EXPORT splimp
- EXPORT splnet
- EXPORT splx
- EXPORT set_irqsareoff
- EXPORT clear_irqsareoff
- EXPORT ensure_irqs_off
- EXPORT restore_irqs
- EXPORT ensure_irqs_on
- ^ 0
-
- AREA poduleirqs,PIC,CODE,REL
-
- ALIGN
-
- irqsareoff
- DCD 0
-
- memc_type
- DCD 0
-
- ; os_error *enable_podule_irqs();
- enable_podule_irqs ROUT
- Push "r0-r1,lr"
-
-
- MOV R14,PC ;Hold current I_bit & F_bit & Mode
- SWI XOS_EnterOS ;Set SVC Mode.
- TEQP PC,#I_bit+F_bit+SVC_mode ;Disable IRQs & FIRQs
- MOV R0,#IOC ;whilst enabling Podule IRQs
- LDRB R1,[R0,#IOCIRQMSKB] ;in IOC
- ORR R1,R1,#podule_IRQ_bit
- STRB R1,[R0,#IOCIRQMSKB]
- TEQP PC,R14 ;Restore original I_bit & F_bit
- NOP ;And the Mode.
-
- ; Exit with no recovery
- Pull "r0-r1,pc",,^
-
- ; os_error *disable_podule_irqs();
- disable_podule_irqs ROUT
- Push "r0-r1,lr"
-
-
- MOV R14,PC ;Hold current I_bit & F_bit &Mode
- SWI XOS_EnterOS ;Set SVC Mode.
- TEQP PC,#I_bit+F_bit+SVC_mode ;Disable IRQs & FIRQs
- MOV R0,#IOC ; whilst disabling Podule IRQs
- LDRB R1,[R0,#IOCIRQMSKB] ; in IOC
- AND R1,R1,#(&FF-podule_IRQ_bit)
- STRB R1,[R0,#IOCIRQMSKB]
- TEQP PC,R14 ;Restore original I_bit & F_bit
- NOP ;And mode.
-
- ; Exit with no recovery
- Pull "r0-r1,pc",,^
-
- ;int disable_irqs();
- ; returns:
- ; 1 - If IRQs were already disabled.
- ; 0 - If this call disabled IRQs.
- ;
- disable_irqs ROUT
- splet
- splnet
- splimp
- LDR r0,irqsareoff
- MOVS r0,r0
- MOVNE pc,lr
- B disable_podule_irqs
-
- ;void enable_irqs();
- ; irqsareoff
- ; 1 - Just return.
- ; 0 - Enable podule IRQs.
- ;
- enable_irqs ROUT
- splx
- LDR r0,irqsareoff
- MOVS r0,r0
- MOVNE pc,lr ;If so, return.
- B enable_podule_irqs
-
- set_irqsareoff
- MOV r0,#1
- STR r0,irqsareoff
- MOV pc,lr
-
- clear_irqsareoff
- MOV r0,#0
- STR r0,irqsareoff
- MOV pc,lr
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ; ensure_irqs_off:
- ;
- ; Disables interrupts up to the level of the ethernet driver (for RISC OS,
- ; this is just disable IRQs). Once IRQs are disabled, we cannot/must not
- ; be reentered.
- ;
- ; Returns a value indicating the state of interrupts prior to calling here.
- ;
-
- ensure_irqs_off
- AND r0, lr, # I_bit
- ORRS pc, lr, # I_bit
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ; restore_irqs:
- ;
- ; Restore interrupts to the state they were in prior to a call to
- ; ensure_irqs_off, using the value returned by ensure_irqs_off.
- ;
-
- restore_irqs
- BIC lr, lr, # I_bit
- ORRS pc, lr, r0
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ; ensure_irqs_on:
- ;
- ; Ensure that interrupts are enabled. Returns a value that, when passed
- ; to restore_irqs, will restore the state prior to enabling interrupts.
- ;
-
- ensure_irqs_on
- AND r0, lr, # I_bit
- BICS pc, lr, # I_bit
-
-
- END
-