multitask.asm 1.65 KB
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