home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 3
/
PDCD_3.iso
/
internet
/
netlite
/
DCI
/
s
/
irqs
Wrap
Text File
|
1992-03-03
|
4KB
|
147 lines
; 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