Загрузка данных
.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