1.1 --- a/vga.S Sun May 28 19:11:01 2017 +0200
1.2 +++ b/vga.S Sun May 28 22:02:02 2017 +0200
1.3 @@ -140,8 +140,16 @@
1.4
1.5 li $s0, 0 /* line counter */
1.6 la $s1, vbp_active /* current event */
1.7 - move $s2, $zero /* line address */
1.8 - move $s3, $zero /* screen address */
1.9 + li $s2, SCREEN_BASE /* line address */
1.10 + li $s3, SCREEN_BASE /* screen address */
1.11 +
1.12 + /* Save the state for retrieval in the interrupt handler. */
1.13 +
1.14 + li $k0, IRQ_STACK_LIMIT
1.15 + sw $s0, -44($k0)
1.16 + sw $s1, -48($k0)
1.17 + sw $s2, -52($k0)
1.18 + sw $s3, -56($k0)
1.19
1.20 /* Enable interrupts and loop. */
1.21
1.22 @@ -482,7 +490,8 @@
1.23 */
1.24
1.25 la $v0, DCH0SSA
1.26 - sw $zero, 0($v0)
1.27 + li $v1, SCREEN_BASE
1.28 + sw $v1, 0($v0)
1.29
1.30 /*
1.31 For the reset channel, a single byte of zero is transferred:
1.32 @@ -631,6 +640,28 @@
1.33
1.34 interrupt_handler:
1.35
1.36 + /* Store affected registers. */
1.37 +
1.38 + li $k0, IRQ_STACK_LIMIT
1.39 + sw $v0, -4($k0)
1.40 + sw $v1, -8($k0)
1.41 + sw $s0, -12($k0)
1.42 + sw $s1, -16($k0)
1.43 + sw $s2, -20($k0)
1.44 + sw $s3, -24($k0)
1.45 + sw $t8, -28($k0)
1.46 + sw $ra, -32($k0)
1.47 + sw $sp, -36($k0)
1.48 +
1.49 + /* Load state. */
1.50 +
1.51 + lw $s0, -44($k0)
1.52 + lw $s1, -48($k0)
1.53 + lw $s2, -52($k0)
1.54 + lw $s3, -56($k0)
1.55 +
1.56 + li $sp, IRQ_STACK_TOP
1.57 +
1.58 /* Check for a timer interrupt condition. */
1.59
1.60 la $v0, IFS0
1.61 @@ -695,14 +726,14 @@
1.62
1.63 /* Test for wraparound. */
1.64
1.65 - li $t8, SCREEN_SIZE
1.66 + li $t8, (SCREEN_BASE + SCREEN_SIZE)
1.67 sltu $t8, $s2, $t8
1.68 bnez $t8, irq_dma_update
1.69 nop
1.70
1.71 /* Reset the source address. */
1.72
1.73 - move $s2, $zero
1.74 + li $s2, SCREEN_BASE
1.75
1.76 irq_dma_update:
1.77
1.78 @@ -718,6 +749,26 @@
1.79 sw $v1, CLR($v0)
1.80
1.81 irq_exit:
1.82 + /* Save state. */
1.83 +
1.84 + li $k0, IRQ_STACK_LIMIT
1.85 + sw $s0, -44($k0)
1.86 + sw $s1, -48($k0)
1.87 + sw $s2, -52($k0)
1.88 + sw $s3, -56($k0)
1.89 +
1.90 + /* Restore affected registers. */
1.91 +
1.92 + lw $v0, -4($k0)
1.93 + lw $v1, -8($k0)
1.94 + lw $s0, -12($k0)
1.95 + lw $s1, -16($k0)
1.96 + lw $s2, -20($k0)
1.97 + lw $s3, -24($k0)
1.98 + lw $t8, -28($k0)
1.99 + lw $ra, -32($k0)
1.100 + lw $sp, -36($k0)
1.101 +
1.102 eret
1.103 nop
1.104