1.1 --- a/vga.S Sun May 21 23:37:35 2017 +0200
1.2 +++ b/vga.S Sun May 21 23:38:28 2017 +0200
1.3 @@ -589,6 +589,78 @@
1.4
1.5
1.6
1.7 +init_framebuffer_with_pattern:
1.8 + li $v0, KSEG1_BASE
1.9 + li $t8, SCREEN_SIZE
1.10 + move $t2, $zero /* x div 20 */
1.11 + move $t3, $zero /* x mod 20 */
1.12 + move $t4, $zero /* y mod 16 */
1.13 + move $t5, $zero /* base value: [(0...15) << 2] * 4 */
1.14 + move $t6, $zero /* offset value: [0...7] * 4 */
1.15 +
1.16 +_init_fbwp_loop:
1.17 + li $t9, 0xfcfcfcfc
1.18 + and $t9, $t9, $t5 /* get bits 5...2 of the base value */
1.19 + or $t9, $t9, $t6 /* combine base<5:2> and offset values */
1.20 +
1.21 + /* Test for bit 2 and set bit 7 if set, thus setting the intensity. */
1.22 +
1.23 + andi $t7, $t5, 0b00000100
1.24 + beqz $t7, _init_fbwp_loop_write
1.25 + nop
1.26 +
1.27 + li $t7, 0x80808080
1.28 + or $t9, $t9, $t7 /* set intensity in each byte */
1.29 +
1.30 +_init_fbwp_loop_write:
1.31 + sw $t9, 0($v0)
1.32 + addiu $v0, $v0, 4
1.33 +
1.34 + addiu $t3, $t3, 1 /* (x mod 20) += 1 */
1.35 +
1.36 + /* Update the offset value every twenty pixels. */
1.37 +
1.38 + addiu $t9, $t3, -5
1.39 + bnez $t9, _init_fbwp_loop_end
1.40 + nop
1.41 +
1.42 + li $t9, 0x01010101
1.43 + addu $t6, $t6, $t9 /* offset += [1] * 4 */
1.44 + addiu $t2, $t2, 1 /* (x div 20) += 1 */
1.45 + move $t3, $zero /* (x mod 20) = 0 */
1.46 +
1.47 + /* Test for the next line. */
1.48 +
1.49 + addiu $t9, $t2, -8
1.50 + bnez $t9, _init_fbwp_loop_end
1.51 + nop
1.52 +
1.53 + move $t2, $zero /* (x div 20) = 0 */
1.54 + move $t6, $zero /* offset = 0 */
1.55 +
1.56 +_init_fbwp_loop_next_y:
1.57 + addiu $t4, $t4, 1 /* (y mod 16) += 1 */
1.58 +
1.59 + /* Update the base value every sixteen rows. */
1.60 +
1.61 + addiu $t9, $t4, -16
1.62 + bnez $t9, _init_fbwp_loop_end
1.63 + nop
1.64 +
1.65 + li $t9, 0x04040404
1.66 + addu $t5, $t5, $t9 /* base += [(1 << 2)] * 4 */
1.67 + move $t4, $zero /* (y mod 16) = 0 */
1.68 +
1.69 +_init_fbwp_loop_end:
1.70 + addiu $t8, $t8, -4
1.71 + bnez $t8, _init_fbwp_loop
1.72 + nop
1.73 +
1.74 + jr $ra
1.75 + nop
1.76 +
1.77 +
1.78 +
1.79 /* Utilities. */
1.80
1.81 handle_error_level: