# HG changeset patch # User Paul Boddie # Date 1495402708 -7200 # Node ID d2f661d6db880450a046aae94b916cc0cc153e05 # Parent b7d5babb9337d583165afe7af3474994744279a9 Added a test pattern generating routine. diff -r b7d5babb9337 -r d2f661d6db88 vga.S --- a/vga.S Sun May 21 23:37:35 2017 +0200 +++ b/vga.S Sun May 21 23:38:28 2017 +0200 @@ -589,6 +589,78 @@ +init_framebuffer_with_pattern: + li $v0, KSEG1_BASE + li $t8, SCREEN_SIZE + move $t2, $zero /* x div 20 */ + move $t3, $zero /* x mod 20 */ + move $t4, $zero /* y mod 16 */ + move $t5, $zero /* base value: [(0...15) << 2] * 4 */ + move $t6, $zero /* offset value: [0...7] * 4 */ + +_init_fbwp_loop: + li $t9, 0xfcfcfcfc + and $t9, $t9, $t5 /* get bits 5...2 of the base value */ + or $t9, $t9, $t6 /* combine base<5:2> and offset values */ + + /* Test for bit 2 and set bit 7 if set, thus setting the intensity. */ + + andi $t7, $t5, 0b00000100 + beqz $t7, _init_fbwp_loop_write + nop + + li $t7, 0x80808080 + or $t9, $t9, $t7 /* set intensity in each byte */ + +_init_fbwp_loop_write: + sw $t9, 0($v0) + addiu $v0, $v0, 4 + + addiu $t3, $t3, 1 /* (x mod 20) += 1 */ + + /* Update the offset value every twenty pixels. */ + + addiu $t9, $t3, -5 + bnez $t9, _init_fbwp_loop_end + nop + + li $t9, 0x01010101 + addu $t6, $t6, $t9 /* offset += [1] * 4 */ + addiu $t2, $t2, 1 /* (x div 20) += 1 */ + move $t3, $zero /* (x mod 20) = 0 */ + + /* Test for the next line. */ + + addiu $t9, $t2, -8 + bnez $t9, _init_fbwp_loop_end + nop + + move $t2, $zero /* (x div 20) = 0 */ + move $t6, $zero /* offset = 0 */ + +_init_fbwp_loop_next_y: + addiu $t4, $t4, 1 /* (y mod 16) += 1 */ + + /* Update the base value every sixteen rows. */ + + addiu $t9, $t4, -16 + bnez $t9, _init_fbwp_loop_end + nop + + li $t9, 0x04040404 + addu $t5, $t5, $t9 /* base += [(1 << 2)] * 4 */ + move $t4, $zero /* (y mod 16) = 0 */ + +_init_fbwp_loop_end: + addiu $t8, $t8, -4 + bnez $t8, _init_fbwp_loop + nop + + jr $ra + nop + + + /* Utilities. */ handle_error_level: