.text #initialize $sp lui $sp, 0x4000 addi $sp, $sp, 0x7ff # load digit to mem lui $s0, 0x4000 addi $s0, $s0, 0x20 #0 addi $s1, $zero, 0x3f sw $s1, 0($s0) #1 addi $s1, $zero, 0x6 sw $s1, 4($s0) #2 addi $s1, $zero, 0x5b sw $s1, 8($s0) #3 addi $s1, $zero, 0x4f sw $s1, 12($s0) #4 addi $s1, $zero, 0x66 sw $s1, 16($s0) #5 addi $s1, $zero, 0x6d sw $s1, 20($s0) #6 addi $s1, $zero, 0x7d sw $s1, 24($s0) #7 addi $s1, $zero, 0x7 sw $s1, 28($s0) #8 addi $s1, $zero, 0x7f sw $s1, 32($s0) #9 addi $s1, $zero, 0x6f sw $s1, 36($s0) #A addi $s1, $zero, 0x77 sw $s1, 40($s0) #B addi $s1, $zero, 0x7c sw $s1, 44($s0) #C addi $s1, $zero, 0x58 sw $s1, 48($s0) #D addi $s1, $zero, 0x5e sw $s1, 52($s0) #E addi $s1, $zero, 0x79 sw $s1, 56($s0) #F addi $s1, $zero, 0x71 sw $s1, 60($s0) lui $s1, 0x4000 addi $s1, $s1, 0x10 addi $s0, $zero, 0xa80 main_loop: addi $s0, $s0, 1 addi $a0, $s0, 0 addi $a1, $s1, 0 jal display_number j main_loop # a0 is the number to be displayed, a1 is the bcd control addr display_number: addi $sp, $sp, -32 sw $ra, 4($sp) sw $s0, 8($sp) sw $s1, 12($sp) sw $s2, 16($sp) sw $s3, 20($sp) sw $s4, 24($sp) sw $s5, 28($sp) sw $s6, 32($sp) # s0 is the number to be displayed addi $s0, $a0, 0 # s1 is the bcd_control addr addi $s1, $a1, 0 # s2 is the base addr for display digit lui $s2, 0x4000 addi $s2, $s2, 0x20 # s3 is the counter for a complete scan of 4 digit addi $s3, $zero, 0xbe2 all_digit_scan_loop: # s4 is the num being shifted gradually addi $s4, $s0, 0 # s6 is the enable digit addi $s6, $zero, 0x100 addi $s5, $zero, 4 single_digit_loop: # get a digit andi $t0, $s4, 0xf # digit * 4 is the memory shift sll $t0, $t0, 2 add $t0, $s2, $t0 lw $t0, 0($t0) or $t0, $t0, $s6 sw $t0, 0($s1) srl $s4, $s4, 4 sll $s6, $s6, 1 # jal wait_for_digit_time addi $t0, $zero, 0x400 wait_time_loop: addi $t0, $t0, -1 bgtz $t0, wait_time_loop addi $s5, $s5, -1 bgtz $s5, single_digit_loop # end of single digit loop # ** depends on the clock ** # four digit, 328.68us. # 1s / 328.68us = 3042 = (be2)hex addi $s3, $s3, -1 bgtz $s3, all_digit_scan_loop lw $ra, 4($sp) lw $s0, 8($sp) lw $s1, 12($sp) lw $s2, 16($sp) lw $s3, 20($sp) lw $s4, 24($sp) lw $s5, 28($sp) lw $s6, 32($sp) addi $sp, $sp, 32 jr $ra