game_pong: call .draw_screen call .detect_input ; Clears screen and draws both players and ball .draw_screen: call os_set_graphics_mode ; Clear screen .draw_p1: ; Player 1 mov ax, [p1_x] mov [x_start], ax mov [x_end], ax mov bx, [p1_y] mov [y_start], bx add bx, [bat_height] mov [y_end], bx call os_draw_graphical_rectangle ; Draw player 1 .draw_p2: ; Player 2 mov ax, [p2_x] mov [x_start], ax mov [x_end], ax mov bx, [p2_y] mov [y_start], bx add bx, [bat_height] mov [y_end], bx call os_draw_graphical_rectangle ; Draw player 1 .draw_ball: ; The ball mov ax, [ball_x] mov [x_start], ax mov [x_end], ax mov bx, [ball_y] mov [y_start], bx mov [y_end], bx call os_draw_graphical_rectangle ; Draw the ball ret ; Player 1 movements .p1_up: mov dx, [p1_y] sub dx, 5 mov [p1_y], dx ret .p1_down: mov dx, [p1_y] add dx, 5 mov [p1_y], dx ret ; Player 2 movements .p2_up: mov dx, [p2_y] sub dx, 5 mov [p2_y], dx ret .p2_down: mov dx, [p2_y] add dx, 5 mov [p2_y], dx ret ; Ball bouncing ; This should move the ball along one frame ; The ball moves 1 pixel per frame, however this is usually ; at an angle, so we need sin and cos .bounce_ball: ; Change the x coords fld dword [ball_angle] fcos fld dword [precise_ball_x] faddp frndint fstp dword [ball_x] ; Change the y coords fld dword [ball_angle] fsin fld dword [precise_ball_y] faddp frndint fstp dword [ball_y] ret .detect_input: call os_read_input cmp al, 08h je .finish ; Player 1 cmp al, 77h ; Pressed 'w' (player 1 up) call .p1_up cmp al, 73h ; Pressed 's' (player 1 down) call .p1_down ; Player 2 cmp al, 5bh ; Pressed '[' (player 2 up) call .p2_up cmp al, 27h ; Pressed ''' (player 2 down) call .p2_down ;call .bounce_ball call .draw_screen jmp .detect_input .finish: call os_set_text_mode call os_start_cli section .data ball_x dw 100 ball_y dw 100 precise_ball_x dw 100 precise_ball_y dw 100 ball_angle dw 1 ; In radians cos_ball_angle dw 0 sin_ball_angle dw 0 p1_x dw 5 p1_y dw 5 p2_x dw 315 p2_y dw 5 bat_height dw 20