Franck Pommereau

new example

IRQ0:
# set IP for process B in its first stack frame
set R1 @intr1B # top (empty)
dec R1 # where interrupt mask is saved
set R0 0xFFFF # mask
save R0 R1
dec R1 # where IP is saved
set R0 @processB
save R0 R1 # assign it to @processB
# start process A
set SP @intr0A
set R0 @processA
jmp R0
# which process is running
# - 0 => process A
# - 1 => process B
current:
= 0
IRQ2:
# check which process is running
set R0 @current
load R0 R1
set R2 @switchB
jz R1 R2
switchA: # switch to process A
dec R1
set SP @intr1A
set R3 @end
jmp R3
switchB: # switch to process B
inc R1
set SP @intr1B
end: # update the running process
save R1 R0
iret
# code for process A: make R0 blink (AAAA/4444)
processA:
set R0 0xAAAA
set R0 0x4444
set R1 @processA
jmp R1
# code for process B: make R0 blink (BBBB/8888)
processB:
set R0 0xBBBB
set R0 0x8888
set R1 @processB
jmp R1
# stack for process A
intr0A: # frame for IRQ0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
intr1A: # one more frame
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
intr2A: # one last frame
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
# stack for process B
intr0B: # frame for IRQ0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
intr1B: # one more frame
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
intr2B: # one last frame
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
= 0
top:
= 0
IRQ0:
intr 4
set R4 @top
load R4 R0
sub R0 SP
halt
IRQ4:
set R0 @top
save SP R0
iret
\ No newline at end of file