1.1 --- a/vga.S Sat Nov 18 17:53:12 2017 +0100
1.2 +++ b/vga.S Sat Nov 18 17:54:35 2017 +0100
1.3 @@ -61,6 +61,44 @@
1.4 .extern blit_string
1.5 .extern message
1.6
1.7 +.macro load_affected
1.8 + lw $v0, -4($k0)
1.9 + lw $v1, -8($k0)
1.10 + lw $s0, -12($k0)
1.11 + lw $s1, -16($k0)
1.12 + lw $s2, -20($k0)
1.13 + lw $s3, -24($k0)
1.14 + lw $t8, -28($k0)
1.15 + lw $ra, -32($k0)
1.16 + lw $sp, -36($k0)
1.17 +.endm
1.18 +
1.19 +.macro load_state
1.20 + lw $s0, -44($k0)
1.21 + lw $s1, -48($k0)
1.22 + lw $s2, -52($k0)
1.23 + lw $s3, -56($k0)
1.24 +.endm
1.25 +
1.26 +.macro save_affected
1.27 + sw $v0, -4($k0)
1.28 + sw $v1, -8($k0)
1.29 + sw $s0, -12($k0)
1.30 + sw $s1, -16($k0)
1.31 + sw $s2, -20($k0)
1.32 + sw $s3, -24($k0)
1.33 + sw $t8, -28($k0)
1.34 + sw $ra, -32($k0)
1.35 + sw $sp, -36($k0)
1.36 +.endm
1.37 +
1.38 +.macro save_state
1.39 + sw $s0, -44($k0)
1.40 + sw $s1, -48($k0)
1.41 + sw $s2, -52($k0)
1.42 + sw $s3, -56($k0)
1.43 +.endm
1.44 +
1.45 _start:
1.46 /*
1.47 Configure RAM.
1.48 @@ -161,10 +199,7 @@
1.49 /* Save the state for retrieval in the interrupt handler. */
1.50
1.51 li $k0, IRQ_STACK_LIMIT
1.52 - sw $s0, -44($k0)
1.53 - sw $s1, -48($k0)
1.54 - sw $s2, -52($k0)
1.55 - sw $s3, -56($k0)
1.56 + save_state
1.57
1.58 /* Enable interrupts and loop. */
1.59
1.60 @@ -730,26 +765,14 @@
1.61
1.62 interrupt_handler:
1.63
1.64 - /* Store affected registers. */
1.65 + /*
1.66 + Save affected registers, restoring IRQ state and switching to the IRQ
1.67 + stack.
1.68 + */
1.69
1.70 li $k0, IRQ_STACK_LIMIT
1.71 - sw $v0, -4($k0)
1.72 - sw $v1, -8($k0)
1.73 - sw $s0, -12($k0)
1.74 - sw $s1, -16($k0)
1.75 - sw $s2, -20($k0)
1.76 - sw $s3, -24($k0)
1.77 - sw $t8, -28($k0)
1.78 - sw $ra, -32($k0)
1.79 - sw $sp, -36($k0)
1.80 -
1.81 - /* Load state. */
1.82 -
1.83 - lw $s0, -44($k0)
1.84 - lw $s1, -48($k0)
1.85 - lw $s2, -52($k0)
1.86 - lw $s3, -56($k0)
1.87 -
1.88 + save_affected
1.89 + load_state
1.90 li $sp, IRQ_STACK_TOP
1.91
1.92 /*
1.93 @@ -814,25 +837,14 @@
1.94 nop
1.95
1.96 irq_exit:
1.97 - /* Save state. */
1.98 + /*
1.99 + Save IRQ state and restore the affected registers, switching back to the
1.100 + original stack.
1.101 + */
1.102
1.103 li $k0, IRQ_STACK_LIMIT
1.104 - sw $s0, -44($k0)
1.105 - sw $s1, -48($k0)
1.106 - sw $s2, -52($k0)
1.107 - sw $s3, -56($k0)
1.108 -
1.109 - /* Restore affected registers. */
1.110 -
1.111 - lw $v0, -4($k0)
1.112 - lw $v1, -8($k0)
1.113 - lw $s0, -12($k0)
1.114 - lw $s1, -16($k0)
1.115 - lw $s2, -20($k0)
1.116 - lw $s3, -24($k0)
1.117 - lw $t8, -28($k0)
1.118 - lw $ra, -32($k0)
1.119 - lw $sp, -36($k0)
1.120 + save_state
1.121 + load_affected
1.122
1.123 eret
1.124 nop