Files
PipelineProcessorTests/20display_num.asm
2024-07-12 00:39:39 +08:00

140 lines
4.6 KiB
NASM

.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