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 .set noat
.section .rodata
.p2align 2
pause:
.asciz "pause\n"
.section .bss .section .bss
.p2align 2 .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 .section .text
.p2align 2 .p2align 2
.global GAME_START .global GAME_START
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 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 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 nop
lui v0, %hi(pause_state)
li t1, 0x2
sw t1, %lo(pause_state)(v0)
la a0, UART0
la a1, pause
jal PRINT
nop 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 j kb_readbuffer_loop
nop sub player2_y, player2_y, t1
nop 8:
sw t2, -8(t0)
// TODO
j GAME_START j GAME_START
nop nop
.global GAME_TIMER .global GAME_TIMER
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 nop
ori a1, player2_y, 0x80
.global GAME_KB0 jal WRITESERIAL
GAME_KB0:
j RESTART
nop 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 .global GAME_KB1
GAME_KB1: GAME_KB1:
addi sp, sp, -16 addi sp, sp, -24
sw ra, 12(sp) sw ra, 20(sp)
sw t1, 16(sp)
sw t0, 12(sp)
sw a0, 8(sp) sw a0, 8(sp)
sw v1, 4(sp) sw v1, 4(sp)
sw v0, 0(sp) sw v0, 0(sp)
la k0, RESTART
la a0, UART1 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 jal TRYREADSERIAL
nop nop
beqz v1, 1f beqz v1, 2f
nop addiu t1, t0, k0
sw v0, 0(t1)
j 0b j kb_writebuffer
nop nop
1: 1:
jal TRYREADSERIAL
nop
bnez v1, 1b
nop
2:
addiu k1, k1, -4
lw v0, 0(sp) lw v0, 0(sp)
andi k1, k1, 0x7c
lw v1, 4(sp) lw v1, 4(sp)
sw k1, -4(t0)
lw a0, 8(sp) lw a0, 8(sp)
lw ra, 12(sp) lw t0, 12(sp)
jr k0 lw t1, 16(sp)
addi sp, sp, 16 lw ra, 20(sp)
j RESTART
addi sp, sp, 24
.set reorder .set reorder

View File

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

View File

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

View File

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

View File

@ -10,20 +10,33 @@
.global WRITESERIAL .global WRITESERIAL
WRITESERIAL: WRITESERIAL:
1: 1:
lb t0, 5(a0) lb v0, 5(a0)
andi t0, t0, 0x20 andi v0, v0, 0x20
beqz t0, 1b beqz v0, 1b
nop nop
sb a1, 0(a0) sb a1, 0(a0)
jr ra jr ra
nop 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 .global READSERIAL
READSERIAL: READSERIAL:
1: 1:
lb t0, 5(a0) lb v0, 5(a0)
andi t0, t0, 0x01 andi v0, v0, 0x01
beqz t0, 1b beqz v0, 1b
nop nop
lb v0, 0(a0) lb v0, 0(a0)
jr ra jr ra

View File

@ -8,4 +8,38 @@
#define KB_SCORE 0xEB #define KB_SCORE 0xEB
#define KB_RESET 0xF3 #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 #endif