.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) # save the numbers to be sorted lui $s0, 0x4000 addi $s0, $s0, 0x60 addi $s1, $zero, 0x4b8d sw $s1, 0($s0) addi $s1, $zero, 0x2307 sw $s1, 4($s0) addi $s1, $zero, 0xfae0 sw $s1, 8($s0) addi $s1, $zero, 0x7815 sw $s1, 12($s0) addi $s1, $zero, 0xc105 sw $s1, 16($s0) addi $s1, $zero, 0x84f0 sw $s1, 20($s0) addi $s1, $zero, 0xdb6 sw $s1, 24($s0) addi $s1, $zero, 0xf21d sw $s1, 28($s0) addi $s1, $zero, 0xe97a sw $s1, 32($s0) addi $s1, $zero, 0xa3b6 sw $s1, 36($s0) addi $s1, $zero, 0x8466 sw $s1, 40($s0) addi $s1, $zero, 0x3a25 sw $s1, 44($s0) addi $s1, $zero, 0x5df sw $s1, 48($s0) addi $s1, $zero, 0xd2de sw $s1, 52($s0) addi $s1, $zero, 0xba7a sw $s1, 56($s0) addi $s1, $zero, 0x7809 sw $s1, 60($s0) addi $s1, $zero, 0xf6a8 sw $s1, 64($s0) addi $s1, $zero, 0x361d sw $s1, 68($s0) addi $s1, $zero, 0x3adb sw $s1, 72($s0) addi $s1, $zero, 0x969a sw $s1, 76($s0) main: addi $a0, $zero, 20 # jal insertion_sort lui $s0, 0x4000 # s1 = 0x40000010 addi $s1, $s0, 0x10 # s0 = 0x40000060 addi $s0, $s0, 0x60 display_numbers_loop: addi $s2, $zero, 0 addi $s3, $zero, 20 display_single_number: sll $t0, $s2, 2 add $t0, $s0, $t0 lw $a0, 0($t0) addi $a1, $s1, 0 jal display_number addi $s2, $s2, 1 sub $t0, $s3, $s2 bgtz $t0, display_single_number jal display_empty j display_numbers_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, 0x17c4 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 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 display_empty: lui $t0, 0x4000 addi $t0, $t0, 0x10 sw $zero, 0($t0) lui $t0, 0x100 display_empty_wait_loop: addi $t0, $t0, -1 bgtz $t0, display_empty_wait_loop jr $ra