ping-pong game.S
This commit is contained in:
parent
216ee53089
commit
1aa7ead513
@ -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
|
||||
|
@ -5,8 +5,11 @@ OUTPUT_FORMAT("elf32-tradlittlemips")
|
||||
|
||||
PROVIDE(SPVR_STACK_INIT = 0x807E0000);
|
||||
PROVIDE(GAME_STACK_INIT = 0x807F0000);
|
||||
PROVIDE(UART0 = 0xBFE40000);
|
||||
PROVIDE(UART1 = 0xBFE40010);
|
||||
PROVIDE(SEG7 = 0xBFAFF010);
|
||||
PROVIDE(SWITCH = 0xBFAFF020);
|
||||
PROVIDE(BUTTON = 0xBFAFF028);
|
||||
PROVIDE(UART0 = 0xBFE40000);
|
||||
PROVIDE(UART1 = 0xBFE40010);
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x807F0000;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user