Files
PipelineProcessorTests/21display_num_in_mem.asm
2024-07-12 18:32:09 +08:00

203 lines
8.2 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)
# 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