Загрузка данных


.eqv DISP_CTRL 0xFFFF0008
.eqv DISP_DATA 0xFFFF000C
.eqv RECV_CTRL 0xFFFF0000
.eqv RECV_DATA 0xFFFF0004
.eqv TIMER     0xFFFF0018

.data
x:  .word 15
y:  .word 1
dx: .word 0
dy: .word 0
next_time: .word 0

.text
main:
    li a0, 12
    jal ra, putchar
    la t0, x
    lw a0, 0(t0)
    la t0, y
    lw a1, 0(t0)
    jal ra, draw_man
    li t0, TIMER
    lw t1, 0(t0)
    addi t1, t1, 150
    la t2, next_time
    sw t1, 0(t2)
loop:
    li t0, RECV_CTRL
    lw t1, 0(t0)
    andi t1, t1, 1
    beqz t1, skip_key
    li t0, RECV_DATA
    lw t1, 0(t0)
    li t2, '8'
    beq t1, t2, key_up
    li t2, '2'
    beq t1, t2, key_down
    li t2, '4'
    beq t1, t2, key_left
    li t2, '6'
    beq t1, t2, key_right
    li t2, '5'
    beq t1, t2, key_stop
    j skip_key
key_up:
    li t3, 0
    li t4, -1
    j set_dir_val
key_down:
    li t3, 0
    li t4, 1
    j set_dir_val
key_left:
    li t3, -1
    li t4, 0
    j set_dir_val
key_right:
    li t3, 1
    li t4, 0
    j set_dir_val
key_stop:
    li t3, 0
    li t4, 0
set_dir_val:
    la t5, dx
    sw t3, 0(t5)
    la t5, dy
    sw t4, 0(t5)
skip_key:
    li t0, TIMER
    lw t1, 0(t0)
    la t2, next_time
    lw t3, 0(t2)
    bltu t1, t3, loop
    jal ra, move_man
    li t0, TIMER
    lw t1, 0(t0)
    addi t1, t1, 150
    la t2, next_time
    sw t1, 0(t2)
    j loop
move_man:
    addi sp, sp, -16
    sw ra, 0(sp)
    la t0, dx
    lw t1, 0(t0)
    la t0, dy
    lw t2, 0(t0)
    or t3, t1, t2
    beqz t3, move_done
    la t0, x
    lw t3, 0(t0)
    la t0, y
    lw t4, 0(t0)
    mv a0, t3
    mv a1, t4
    jal ra, erase_man
    add t3, t3, t1
    add t4, t4, t2
    blt t3, zero, reset_move
    li t0, 32
    bgt t3, t0, reset_move
    blt t4, zero, reset_move
    li t0, 7
    bgt t4, t0, reset_move
    la t0, x
    sw t3, 0(t0)
    la t0, y
    sw t4, 0(t0)
    mv a0, t3
    mv a1, t4
    jal ra, draw_man
    j move_done
reset_move:
    la t0, dx
    sw zero, 0(t0)
    la t0, dy
    sw zero, 0(t0)
    la t0, x
    lw a0, 0(t0)
    la t0, y
    lw a1, 0(t0)
    jal ra, draw_man
move_done:
    lw ra, 0(sp)
    addi sp, sp, 16
    ret
setpos:
    slli a0, a0, 20
    slli a1, a1, 8
    or a0, a0, a1
    ori a0, a0, 7
putchar:
    li t6, DISP_CTRL
wait_disp:
    lw t5, 0(t6)
    andi t5, t5, 1
    beqz t5, wait_disp
    li t6, DISP_DATA
    sw a0, 0(t6)
    ret
draw_man:
    addi sp, sp, -32
    sw ra, 0(sp)
    sw s0, 4(sp)
    sw s1, 8(sp)
    mv s0, a0
    mv s1, a1
    addi a0, s0, 1
    mv a1, s1
    jal ra, setpos
    li a0, 111
    jal ra, putchar
    mv a0, s0
    addi a1, s1, 1
    jal ra, setpos
    li a0, 43
    jal ra, putchar
    addi a0, s0, 1
    addi a1, s1, 1
    jal ra, setpos
    li a0, 45
    jal ra, putchar
    addi a0, s0, 2
    addi a1, s1, 1
    jal ra, setpos
    li a0, 43
    jal ra, putchar
    mv a0, s0
    addi a1, s1, 2
    jal ra, setpos
    li a0, 47
    jal ra, putchar
    addi a0, s0, 2
    addi a1, s1, 2
    jal ra, setpos
    li a0, 92
    jal ra, putchar
    lw s1, 8(sp)
    lw s0, 4(sp)
    lw ra, 0(sp)
    addi sp, sp, 32
    ret
erase_man:
    addi sp, sp, -32
    sw ra, 0(sp)
    sw s0, 4(sp)
    sw s1, 8(sp)
    mv s0, a0
    mv s1, a1
    addi a0, s0, 1
    mv a1, s1
    jal ra, setpos
    li a0, 32
    jal ra, putchar
    mv a0, s0
    addi a1, s1, 1
    jal ra, setpos
    li a0, 32
    jal ra, putchar
    addi a0, s0, 1
    addi a1, s1, 1
    jal ra, setpos
    li a0, 32
    jal ra, putchar
    addi a0, s0, 2
    addi a1, s1, 1
    jal ra, setpos
    li a0, 32
    jal ra, putchar
    mv a0, s0
    addi a1, s1, 2
    jal ra, setpos
    li a0, 32
    jal ra, putchar
    addi a0, s0, 2
    addi a1, s1, 2
    jal ra, setpos
    li a0, 32
    jal ra, putchar
    lw s1, 8(sp)
    lw s0, 4(sp)
    lw ra, 0(sp)
    addi sp, sp, 32
    ret