Untitled
unknown
assembly_x86
2 years ago
12 kB
12
Indexable
.data
WINDOW_WIDTH .word 0x0140 ; the width of the window (320 pixels)
WINDOW_HEIGHT .word 0x00C8 ; the height of the window (200 pixels)
WINDOW_BOUNDS .word 6 ; variable used to check collisions early
TIME_AUX .byte 0 ; variable used when checking if the time has changed
GAME_ACTIVE .byte 1 ; is the game active? (1 -> Yes, 0 -> No (game over))
EXITING_GAME .byte 0
WINNER_INDEX .byte 0 ; the index of the winner (1 -> player one, 2 -> player two)
CURRENT_SCENE .byte 0 ; the index of the current scene (0 -> main menu, 1 -> game)
TEXT_PLAYER_ONE_POINTS .asciz "0,$" ; text with the player one points
TEXT_PLAYER_TWO_POINTS .asciz "0,$" ; text with the player two points
TEXT_GAME_OVER_TITLE .asciz "GAME OVER,$" ; text with the game over menu title
TEXT_GAME_OVER_WINNER .asciz "Player 0 won,$" ; text with the winner text
TEXT_GAME_OVER_PLAY_AGAIN .asciz "Press R to play again,$" ; text with the game over play again message
TEXT_GAME_OVER_MAIN_MENU .asciz "Press E to exit to main menu,$" ; text with the game over main menu message
TEXT_MAIN_MENU_TITLE .asciz "MAIN MENU,$" ; text with the main menu title
TEXT_MAIN_MENU_SINGLEPLAYER .asciz "SINGLEPLAYER - S KEY,$" ; text with the singleplayer message
TEXT_MAIN_MENU_MULTIPLAYER .asciz "MULTIPLAYER - M KEY,$" ; text with the multiplayer message
TEXT_MAIN_MENU_EXIT .asciz "EXIT GAME - E KEY,$" ; text with the exit game message
BALL_ORIGINAL_X .word 0x00A0 ; X position of the ball on the beginning of a game
BALL_ORIGINAL_Y .word 0x0064 ; Y position of the ball on the beginning of a game
BALL_X .word 0x00A0 ; current X position (column) of the ball
BALL_Y .word 0x0064 ; current Y position (line) of the ball
BALL_SIZE .word 6 ; size of the ball (how many pixels does the ball have in width and height)
BALL_VELOCITY_X .word 5 ; X (horizontal) velocity of the ball
BALL_VELOCITY_Y .word 2 ; Y (vertical) velocity of the ball
PADDLE_LEFT_X .word 0x000A ; current X position of the left paddle
PADDLE_LEFT_Y .word 0x0055 ; current Y position of the left paddle
PLAYER_ONE_POINTS .byte 0 ; current points of the left player (player one)
PADDLE_RIGHT_X .word 0x0130 ; current X position of the right paddle
PADDLE_RIGHT_Y .word 0x0055 ; current Y position of the right paddle
PLAYER_TWO_POINTS .byte 0 ; current points of the right player (player two)
PADDLE_WIDTH .word 6 ; default paddle width
PADDLE_HEIGHT .word 0x001D ; default paddle height
PADDLE_VELOCITY .word 0x000F ; default paddle velocity
.text
.global main
main:
@ Set up data and stack pointers
ldr r0, =data
ldr r1, =stack
mov sp, r1
ldmfd r0!, {r1}
mov r13, r1
bl clear_screen
check_time:
ldr r2, =EXITING_GAME
ldrb r3, [r2]
cmp r3, #1
beq start_exit_process
ldr r2, =CURRENT_SCENE
ldrb r3, [r2]
cmp r3, #0
beq show_main_menu
ldr r2, =GAME_ACTIVE
ldrb r3, [r2]
cmp r3, #0
beq show_game_over
bl get_system_time
ldrb r3, =TIME_AUX
cmp r0, r3
beq check_time
@ If it reaches this point, it's because the time has passed
strb r0, [r3] @ Update time
bl clear_screen
bl move_ball
bl draw_ball
bl move_paddles
bl draw_paddles
bl draw_ui
b check_time
show_game_over:
bl draw_game_over_menu
b check_time
show_main_menu:
bl draw_main_menu
b check_time
start_exit_process:
bl conclude_exit_game
exit:
movs r7, #1
swi 0
move_ball:
@ Move the ball horizontally
ldr r2, =BALL_VELOCITY_X
ldr r3, [r2]
ldr r2, =BALL_X
ldr r4, [r2]
add r4, r4, r3
ldr r2, =WINDOW_BOUNDS
ldr r3, [r2]
cmp r4, r3
jl give_point_to_player_two
ldr r2, =WINDOW_WIDTH
ldr r3, [r2]
cmp r4, r3
jg give_point_to_player_one
str r4, [r2]
@ Move the ball vertically
ldr r2, =BALL_VELOCITY_Y
ldr r3, [r2]
ldr r2, =BALL_Y
ldr r4, [r2]
add r4, r4, r3
ldr r2, =WINDOW_HEIGHT
ldr r3, [r2]
cmp r4, r3
jge wall_collision_bottom
mov r2, #0
ldr r3, =BALL_ORIGINAL_Y
cmp r4, [r3]
beq done_moving_ball
b wall_collision_top
give_point_to_player_two:
ldr r2, =PLAYER_TWO_POINTS
ldrb r3, [r2]
add r3, r3, #1
strb r3, [r2]
mov r4, #0
b reset_ball
give_point_to_player_one:
ldr r2, =PLAYER_ONE_POINTS
ldrb r3, [r2]
add r3, r3, #1
strb r3, [r2]
reset_ball:
mov r2, #0
ldr r3, =BALL_X
str r2, [r3]
ldr r3, =BALL_Y
ldr r4, =BALL_ORIGINAL_Y
str r4, [r3]
done_moving_ball:
mov r2, #0
mov r3, #0
bx lr
wall_collision_top:
mov r2, #0
ldr r3, =BALL_ORIGINAL_Y
str r3, [r2]
ldr r3, =BALL_VELOCITY_Y
ldr r4, [r3]
sub r4, r4, r4
str r4, [r3]
b done_moving_ball
wall_collision_bottom:
ldr r2, =WINDOW_HEIGHT
ldr r3, [r2]
ldr r2, =BALL_Y
ldr r4, [r2]
sub r4, r3, r4
ldr r2, =BALL_VELOCITY_Y
ldr r3, [r2]
sub r4, r4, r3
str r4, [r2]
b done_moving_ball
move_paddles:
ldr r2, =PADDLE_LEFT_Y
ldr r3, [r2]
ldr r2, =PADDLE_RIGHT_Y
ldr r4, [r2]
mov r2, #0
ldr r5, =GAME_ACTIVE
ldrb r6, [r5]
cmp r6, #0
beq done_moving_paddles
ldr r5, =PADDLE_VELOCITY
ldr r6, [r5]
ldr r5, =BALL_Y
ldr r7, [r5]
ldr r5, =PADDLE_HEIGHT
add r7, r7, r5
sub r3, r3, r6
ldr r5, =BALL_SIZE
sub r7, r7, r5
ldr r5, =PADDLE_LEFT_X
cmp r3, r5
jl too_high_left
mov r3, r5
b too_low_left
too_high_left:
ldr r3, =0
ldr r5, =WINDOW_HEIGHT
sub r3, r5, r3
ldr r5, =PADDLE_HEIGHT
sub r3, r3, r5
ldr r5, =PADDLE_LEFT_X
sub r3, r3, r5
too_low_left:
ldr r5, =WINDOW_BOUNDS
ldr r6, [r5]
ldr r5, =PADDLE_WIDTH
add r6, r3, r5
cmp r6, r5
jl done_moving_paddles
sub r3, r6, r5
done_moving_paddles:
ldr r5, =PADDLE_LEFT_Y
str r3, [r5]
ldr r5, =PADDLE_RIGHT_Y
ldr r4, [r5]
ldr r5, =GAME_ACTIVE
ldrb r6, [r5]
cmp r6, #0
beq done_moving_paddles
ldr r5, =BALL_Y
ldr r7, [r5]
ldr r5, =PADDLE_HEIGHT
add r7, r7, r5
sub r4, r4, r6
ldr r5, =BALL_SIZE
sub r7, r7, r5
ldr r5, =PADDLE_RIGHT_X
ldr r6, [r5]
ldr r5, =WINDOW_WIDTH
sub r6, r5, r6
ldr r5, =PADDLE_WIDTH
sub r6, r6, r5
cmp r4, r5
jl too_high_right
mov r4, r5
b too_low_right
too_high_right:
ldr r4, =0
ldr r5, =WINDOW_HEIGHT
sub r4, r5, r4
ldr r5, =PADDLE_HEIGHT
sub r4, r4, r5
ldr r5, =PADDLE_RIGHT_X
sub r4, r4, r5
too_low_right:
ldr r5, =WINDOW_BOUNDS
ldr r6, [r5]
ldr r5, =PADDLE_WIDTH
sub r6, r6, r4
ldr r5, =WINDOW_WIDTH
sub r5, r5, r6
cmp r5, r6
jl done_moving_paddles
sub r4, r5, r6
done_moving_paddles_right:
ldr r5, =PADDLE_RIGHT_Y
str r4, [r5]
draw_ball:
ldr r2, =BALL_X
ldr r3, [r2]
ldr r2, =BALL_Y
ldr r4, [r2]
ldr r2, =BALL_SIZE
add r4, r4, r2
ldr r2, =BALL_ORIGINAL_Y
ldr r5, [r2]
ldr r2, =BALL_ORIGINAL_X
ldr r6, [r2]
sub r5, r4, r5
ldr r2, =BALL_COLOR
ldrb r2, [r2]
ldr r7, =DRAW_PIXEL
str r3, [r7]
str r4, [r7]
str r2, [r7]
str r5, [r7]
str r6, [r7]
add r6, r3, r5
add r6, r6, r2
ldr r2, =WINDOW_BOUNDS
ldr r7, [r2]
sub r7, r7, r6
ldr r2, =WINDOW_WIDTH
sub r2, r2, r6
cmp r2, r6
jl done_drawing_ball
draw_paddle_left:
ldr r2, =PADDLE_LEFT_X
ldr r3, [r2]
ldr r2, =PADDLE_LEFT_Y
ldr r4, [r2]
ldr r2, =PADDLE_HEIGHT
add r4, r4, r2
ldr r2, =PADDLE_WIDTH
add r3, r3, r2
ldr r2, =PADDLE_COLOR
ldrb r2, [r2]
ldr r5, =DRAW_RECTANGLE
str r3, [r5]
str r4, [r5]
str r2, [r5]
add r3, r4, r2
ldr r2, =WINDOW_BOUNDS
ldr r4, [r2]
sub r4, r4, r3
ldr r2, =WINDOW_WIDTH
sub r2, r2, r3
cmp r2, r3
jl draw_paddle_right
done_drawing_paddle_left:
draw_paddle_right:
ldr r2, =PADDLE_RIGHT_X
ldr r3, [r2]
ldr r2, =PADDLE_RIGHT_Y
ldr r4, [r2]
ldr r2, =PADDLE_HEIGHT
add r4, r4, r2
ldr r2, =PADDLE_WIDTH
add r3, r3, r2
ldr r2, =PADDLE_COLOR
ldrb r2, [r2]
ldr r5, =DRAW_RECTANGLE
str r3, [r5]
str r4, [r5]
str r2, [r5]
add r3, r4, r2
ldr r2, =WINDOW_BOUNDS
ldr r4, [r2]
sub r4, r4, r3
ldr r2, =WINDOW_WIDTH
sub r2, r2, r3
cmp r2, r3
jl done_drawing_paddle_right
done_drawing_paddle:
bx lr
update_display:
ldr r2, =DRAW_SCREEN
mov r3, #0
bx r2
check_victory:
ldr r2, =PLAYER_ONE_POINTS
ldrb r3, [r2]
ldr r2, =PLAYER_TWO_POINTS
ldrb r4, [r2]
ldr r2, =WINNING_SCORE
ldrb r5, [r2]
cmp r3, r5
jge player_one_wins
cmp r4, r5
jge player_two_wins
player_one_wins:
ldr r2, =PLAYER_ONE_SCORE_TEXT
ldr r3, =PLAYER_ONE_SCORE_STRING
ldr r4, =PLAYER_ONE_POINTS
b update_score_text
player_two_wins:
ldr r2, =PLAYER_TWO_SCORE_TEXT
ldr r3, =PLAYER_TWO_SCORE_STRING
ldr r4, =PLAYER_TWO_POINTS
update_score_text:
ldrb r5, [r4]
add r3, r3, #1
strb r5, [r3]
ldr r3, =LCD_TEXT
ldr r5, [r2]
ldr r6, [r3]
str r5, [r6]
b reset_game
reset_game:
ldr r2, =GAME_ACTIVE
strb r2, #0
mov r2, #0
ldr r3, =PLAYER_ONE_POINTS
strb r2, [r3]
ldr r3, =PLAYER_TWO_POINTS
strb r2, [r3]
ldr r3, =BALL_X
str r2, [r3]
ldr r3, =BALL_Y
str r2, [r3]
b update_display
main:
b reset_game
.data
WINDOW_WIDTH: .int 128
WINDOW_HEIGHT: .int 64
BALL_SIZE: .int 2
BALL_X: .int 0
BALL_Y: .int 0
BALL_VELOCITY_X: .int 1
BALL_VELOCITY_Y: .int 1
BALL_ORIGINAL_X: .int 64
BALL_ORIGINAL_Y: .int 32
BALL_COLOR: .byte 1
PADDLE_WIDTH: .int 2
PADDLE_HEIGHT: .int 16
PADDLE_LEFT_X: .int 4
PADDLE_LEFT_Y: .int 24
PADDLE_RIGHT_X: .int 122
PADDLE_RIGHT_Y: .int 24
PADDLE_COLOR: .byte 1
PADDLE_VELOCITY: .int 2
PLAYER_ONE_POINTS: .byte 0
PLAYER_TWO_POINTS: .byte 0
WINNING_SCORE: .byte 5
PLAYER_ONE_SCORE_TEXT: .asciz "Player 1: "
PLAYER_TWO_SCORE_TEXT: .asciz "Player 2: "
PLAYER_ONE_SCORE_STRING: .byte 0
PLAYER_TWO_SCORE_STRING: .byte 0
LCD_TEXT: .int 0x60000000
DRAW_PIXEL: .int 0x60000014
DRAW_RECTANGLE: .int 0x60000028
DRAW_SCREEN: .int 0x6000003C
WINDOW_BOUNDS: .int 0x00000100
GAME_ACTIVE: .byte 0
.text
Editor is loading...