ping-pong game.S

This commit is contained in:
cxy004 2021-08-15 22:55:41 +08:00
parent 216ee53089
commit 1aa7ead513
6 changed files with 280 additions and 62 deletions

View File

@ -6,61 +6,222 @@
.set noat
.section .rodata
.p2align 2
pause:
.asciz "pause\n"
.section .bss
.p2align 2
.word 0
.word 0
kb_buffer:
.rept 32
.word 0
.endr
score:
.word 0
button_state:
.word 0
.global pause_state
pause_state:
.word 0
.section .text
.p2align 2
.global GAME_START
GAME_START:
li t6, 1
lui t0, %hi(SWITCH) + 1
lui t1, %hi(BUTTON) + 1
lw t2, %lo(SWITCH)(t0)
beqz t2, 1f
lw t3, %lo(BUTTON)(t1)
lui t0, %hi(pause_state)
li t2, 0x1
sw t2, %lo(pause_state)(t0)
la a0, UART0
la a1, pause
jal PRINT
nop
lui t0, %hi(next_thread)
la t1, SUPV_TCB
sw t1, %lo(t0)
syscall
1:
lui t0, %hi(button_state)
lw t2, %lo(button_state)(t0)
xor t2, t2, zero
sw t3, %lo(button_state)(t0)
and t3, t2, t3
andi t0, t3, 0x1
andi t1, t3, 0x2
slti t2, player1_y, HEIGHT - 1
beqz t0, 2f
slt t3, t6, player1_y
add player1_y, player1_y, t2
2:
beqz t1, 3f
sltu t0, ball_cntx, ball_spx
sub player1_y, player1_y, t3
3:
bnez t0, 4f
sltu t1, ball_cnty, ball_spy
add ball_x, ball_x, ball_dx
li ball_cntx, 0
slt t2, t6, ball_x
slti t3, ball_x, HEIGHT
and t0, t2, t3
sll t0, t0, 1
addiu t0, t0, -2
xor ball_dx, ball_dx, t0
4:
bnez t1, 5f
nop
add ball_y, ball_y, ball_dy
li ball_cnty, 0
sltiu t1, ball_dy, 1
slt t2, t6, ball_y
slti t3, ball_y, HEIGHT
and t0, t2, t3
or t0, t1, t0
sll t0, t0, 1
addiu t0, t0, -2
xor ball_dy, ball_dy, t0
5:
la t0, kb_buffer
lw t2, -8(t0)
lw t3, -4(t0)
beq t2, t3, 8f
addiu t1, t0, t2
j kb_readbuffer
lw t5, 0(t1)
kb_readbuffer_loop:
andi t2, t2, 0x7c
beq t2, t3, 8f
addiu t1, t0, t2
lw t5, 0(t1)
kb_readbuffer:
li t1, KB_PAUSE
bne t5, t1, 6f
nop
lui v0, %hi(pause_state)
li t1, 0x2
sw t1, %lo(pause_state)(v0)
la a0, UART0
la a1, pause
jal PRINT
nop
lui v0, %hi(next_thread)
la t1, SUPV_TCB
sw t1, %lo(v0)
syscall
j kb_readbuffer_loop
addiu t2, t2, 4
6:
li t1, KB_UP
bne t5, t1, 7f
slti t1, player2_y, HEIGHT - 1
beqz t1, kb_readbuffer_loop
addiu t2, t2, 4
j kb_readbuffer_loop
add player2_y, player2_y, t1
7:
li t1, KB_DOWN
bne t5, t1, kb_readbuffer_loop
addiu t2, t2, 4
slt t1, t6, player2_y
beqz t1, kb_readbuffer_loop
nop
nop
nop
nop
j kb_readbuffer_loop
sub player2_y, player2_y, t1
8:
sw t2, -8(t0)
// TODO
j GAME_START
nop
.global GAME_TIMER
GAME_TIMER:
j RESTART
addi sp, sp, -16
sw ra, 12(sp)
sw a1, 8(sp)
sw a0, 4(sp)
sw v0, 0(sp)
addiu ball_cntx, ball_cntx, 1
addiu ball_cnty, ball_cnty, 1
la a0, UART0
ori a1, player1_y, 0x80
jal WRITESERIAL
nop
.global GAME_KB0
GAME_KB0:
j RESTART
ori a1, player2_y, 0x80
jal WRITESERIAL
nop
ori a1, ball_x, 0x80
jal WRITESERIAL
nop
ori a1, ball_y, 0x80
jal WRITESERIAL
nop
li a1, 0x0A // '\n'
jal WRITESERIAL
nop
mtc0 zero, CP0_COUNT
lw v0, 0(sp)
lw a0, 4(sp)
lw a1, 8(sp)
lw ra, 12(sp)
j RESTART
addi sp, sp, 16
.global GAME_KB1
GAME_KB1:
addi sp, sp, -16
sw ra, 12(sp)
addi sp, sp, -24
sw ra, 20(sp)
sw t1, 16(sp)
sw t0, 12(sp)
sw a0, 8(sp)
sw v1, 4(sp)
sw v0, 0(sp)
la k0, RESTART
la a0, UART1
0:
la t0, kb_buffer
lw k0, -8(t0)
lw k1, -4(t0)
kb_writebuffer:
addiu k1, k1, 4
andi k1, k1, 0x7c
beq k0, k1, 1f
nop
jal TRYREADSERIAL
nop
beqz v1, 1f
nop
j 0b
beqz v1, 2f
addiu t1, t0, k0
sw v0, 0(t1)
j kb_writebuffer
nop
1:
jal TRYREADSERIAL
nop
bnez v1, 1b
nop
2:
addiu k1, k1, -4
lw v0, 0(sp)
andi k1, k1, 0x7c
lw v1, 4(sp)
sw k1, -4(t0)
lw a0, 8(sp)
lw ra, 12(sp)
jr k0
addi sp, sp, 16
lw t0, 12(sp)
lw t1, 16(sp)
lw ra, 20(sp)
j RESTART
addi sp, sp, 24
.set reorder

View File

@ -5,6 +5,9 @@ OUTPUT_FORMAT("elf32-tradlittlemips")
PROVIDE(SPVR_STACK_INIT = 0x807E0000);
PROVIDE(GAME_STACK_INIT = 0x807F0000);
PROVIDE(SEG7 = 0xBFAFF010);
PROVIDE(SWITCH = 0xBFAFF020);
PROVIDE(BUTTON = 0xBFAFF028);
PROVIDE(UART0 = 0xBFE40000);
PROVIDE(UART1 = 0xBFE40010);
SECTIONS

View File

@ -1,6 +1,7 @@
#include <regdef.h>
#include <mipsregs.h>
#include <exception.h>
#include <game.h>
.set noreorder
.set noat
@ -9,8 +10,8 @@
.section .rodata
.p2align 2
pingpong_hello:
.asciz "Ping Pong."
pingpong:
.asciz "Ping Pong.\n"
.section .data
@ -78,17 +79,9 @@ GAME_TCB:
.word DEFAULT_INT_HANDLER
.word DEFAULT_INT_HANDLER
.word DEFAULT_INT_HANDLER
.word GAME_KB1
.word DEFAULT_INT_HANDLER
.word DEFAULT_INT_HANDLER
.word DEFAULT_INT_HANDLER
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word GAME_TIMER
.word 0
.word 0
.word 0
@ -103,8 +96,27 @@ GAME_TCB:
.word 0
.word 0
.word 0
// random
.word 0xBFC00380
// player1
.word center_y
// player2
.word center_y
// ball_x
.word center_x
// ball_y
.word center_y
// ball_cntx
.word 0
// ball_cnty
.word 0
// ball_spx
.word x_sp3
// ball_spy
.word y_sp3
// ball_dx
.word -1
// ball_dy
.word 0
// gp
.word 0
@ -117,9 +129,9 @@ GAME_TCB:
// Count
.word 0
// Compare
.word 33000000 / 2
.word 16500000 / fps
// STATUS
.word STATUSF_IP7 | STATUSF_IP5 | STATUSF_IP4 | ST0_IE
.word IE_IRQ5 | IE_IRQ3 | IE_IRQ2 | ST0_IE
// EPC
.word GAME_START
@ -178,7 +190,7 @@ bss_init_done:
sb t1, 2(t0) // FIFO
li t1, 0x80 // CFCR_DLAB, divisor latch
sb t1, 3(t0) // CFCR
li t1, 0x23 // modify Baud 57600
li t1, 0x1b // modify Baud 76388.89
sb t1, 0(t0) // DATA
srl t1, 8
sb t1, 1(t0) // IER
@ -191,14 +203,9 @@ bss_init_done:
li t1, 0x1 // IRxE
sb t1, 1(t0) // IER
la s0, pingpong_hello
la a0, UART0
lb a1, 0(s0)
0:
jal WRITESERIAL
addiu s0, s0, 0x1
lb a0, 0(s0)
bne a0, zero, 0b
la a1, pingpong
jal PRINT
nop
j RESTART_LOAD

View File

@ -19,13 +19,13 @@
sw k1, TF_STATUS(k0)
mfc0 k0, CP0_CAUSE
andi k1, k0, 0x00FC
andi k1, k0, CAUSEF_EXCCODE
bnez k1, SYSCALL
nop
mfc0 k1, CP0_STATUS
and k0, k0, k1
7:
andi k1, k0, CAUSEF_IP7
andi k1, k0, C_IRQ5
beqz k1, 6f
nop
lui k0, %hi(current_thread)
@ -34,7 +34,7 @@
jr k1
nop
6:
andi k1, k0, CAUSEF_IP6
andi k1, k0, C_IRQ4
beqz k1, 5f
nop
lui k0, %hi(current_thread)
@ -43,7 +43,7 @@
jr k1
nop
5:
andi k1, k0, CAUSEF_IP5
andi k1, k0, C_IRQ3
beqz k1, 4f
nop
lui k0, %hi(current_thread)
@ -52,7 +52,7 @@
jr k1
nop
4:
andi k1, k0, CAUSEF_IP4
andi k1, k0, C_IRQ2
beqz k1, 3f
nop
lui k0, %hi(current_thread)
@ -61,7 +61,7 @@
jr k1
nop
3:
andi k1, k0, CAUSEF_IP3
andi k1, k0, C_IRQ1
beqz k1, 2f
nop
lui k0, %hi(current_thread)
@ -70,7 +70,7 @@
jr k1
nop
2:
andi k1, k0, CAUSEF_IP2
andi k1, k0, C_IRQ0
beqz k1, 1f
nop
lui k0, %hi(current_thread)
@ -79,7 +79,7 @@
jr k1
nop
1:
andi k1, k0, CAUSEF_IP1
andi k1, k0, C_SW1
beqz k1, 0f
nop
lui k0, %hi(current_thread)
@ -102,11 +102,6 @@ SYSCALL:
addiu k1, k1, 0x4
mtc0 k1, CP0_EPC
.global DEFAULT_INT_HANDLER
DEFAULT_INT_HANDLER:
j RESTART
nop
.global RESTART_SAVE
RESTART_SAVE:
lui k0, %hi(current_thread)
@ -198,6 +193,11 @@ RESTART:
j RESTART
nop
.global DEFAULT_INT_HANDLER
DEFAULT_INT_HANDLER:
j RESTART
nop
.set reorder
.set at

View File

@ -10,20 +10,33 @@
.global WRITESERIAL
WRITESERIAL:
1:
lb t0, 5(a0)
andi t0, t0, 0x20
beqz t0, 1b
lb v0, 5(a0)
andi v0, v0, 0x20
beqz v0, 1b
nop
sb a1, 0(a0)
jr ra
nop
.global PRINT
PRINT:
move v1, a1
lb a1, 0(a1)
1:
jal WRITESERIAL
addiu v1, v1, 0x1
lb a1, 0(v1)
bne a1, zero, 1b
nop
jr ra
nop
.global READSERIAL
READSERIAL:
1:
lb t0, 5(a0)
andi t0, t0, 0x01
beqz t0, 1b
lb v0, 5(a0)
andi v0, v0, 0x01
beqz v0, 1b
nop
lb v0, 0(a0)
jr ra

View File

@ -8,4 +8,38 @@
#define KB_SCORE 0xEB
#define KB_RESET 0xF3
#define fps 30
#define x_sp0 10
#define x_sp1 20
#define x_sp2 30
#define x_sp3 45
#define x_sp4 60
#define y_sp0 30
#define y_sp1 60
#define y_sp2 90
#define y_sp3 120
#define y_sp4 150
#define WIDTH 81
#define HEIGHT 25
#define center_x 40
#define center_y 13
#define player1_x 5
#define player2_x (WIDTH - player1_x + 1)
#define random $15
#define player1_y $16
#define player2_y $17
#define ball_x $18
#define ball_y $19
#define ball_cntx $20
#define ball_cnty $21
#define ball_spx $22
#define ball_spy $23
#define ball_dx $24
#define ball_dy $25
#endif