IDEAL
MODEL small
STACK 100h
DATASEG
ball_x db 40
ball_y db 12
ball_dx db 1
ball_dy db 1
paddle1_y db 10
paddle2_y db 10
score1 db 0
score2 db 0
score_msg db 'Score: ', 0
newline db 13, 10, '$'
CODESEG
start:
mov ax, @data
mov ds, ax
call clear_screen
call draw_paddles
call draw_ball
call draw_score
main_loop:
call delay
call erase_ball
call move_ball
call draw_ball
call check_input
call draw_score
jmp main_loop
; --- Clear screen ---
clear_screen:
mov ah, 0
mov al, 3
int 10h
ret
; --- Draw both paddles ---
draw_paddles:
call draw_paddle1
call draw_paddle2
ret
draw_paddle1:
mov cx, 3
mov si, paddle1_y
.p1_loop:
mov ah, 02h
mov bh, 0
mov dh, si
mov dl, 2
int 10h
mov ah, 09h
mov al, '|'
mov bh, 0
mov bl, 2
mov cx, 1
int 10h
inc si
loop .p1_loop
ret
draw_paddle2:
mov cx, 3
mov si, paddle2_y
.p2_loop:
mov ah, 02h
mov bh, 0
mov dh, si
mov dl, 77
int 10h
mov ah, 09h
mov al, '|'
mov bh, 0
mov bl, 2
mov cx, 1
int 10h
inc si
loop .p2_loop
ret
; --- Erase ball ---
erase_ball:
mov ah, 02h
mov bh, 0
mov dh, ball_y
mov dl, ball_x
int 10h
mov ah, 09h
mov al, ' '
mov bh, 0
mov bl, 7
mov cx, 1
int 10h
ret
; --- Draw ball ---
draw_ball:
mov ah, 02h
mov bh, 0
mov dh, ball_y
mov dl, ball_x
int 10h
mov ah, 09h
mov al, 'O'
mov bh, 0
mov bl, 4
mov cx, 1
int 10h
ret
; --- Draw score ---
draw_score:
mov ah, 02h
mov bh, 0
mov dh, 0
mov dl, 30
int 10h
mov ah, 09h
mov dx, offset score_msg
int 21h
; display score1
mov al, score1
call print_digit
mov ah, 09h
mov dx, offset newline
int 21h
ret
print_digit:
add al, '0'
mov dl, al
mov ah, 02h
int 21h
ret
; --- Move ball ---
move_ball:
mov al, ball_x
add al, ball_dx
mov ball_x, al
cmp al, 1
jl .score2
cmp al, 78
jg .score1
jmp .y_part
.score1:
inc score1
mov ball_x, 40
mov ball_y, 12
neg byte ptr ball_dx
ret
.score2:
inc score2
mov ball_x, 40
mov ball_y, 12
neg byte ptr ball_dx
ret
.y_part:
mov al, ball_y
add al, ball_dy
mov ball_y, al
cmp al, 23
jg .reverse_y
cmp al, 1
jl .reverse_y
jmp .check_paddle
.reverse_y:
neg byte ptr ball_dy
.check_paddle:
; Left paddle
cmp ball_x, 3
jne .check_right
mov al, ball_y
mov bl, paddle1_y
cmp al, bl
jb .done
add bl, 2
cmp al, bl
ja .done
neg byte ptr ball_dx
jmp .done
.check_right:
cmp ball_x, 76
jne .done
mov al, ball_y
mov bl, paddle2_y
cmp al, bl
jb .done
add bl, 2
cmp al, bl
ja .done
neg byte ptr ball_dx
.done:
ret
; --- Check keyboard input ---
check_input:
mov ah, 1
int 16h
jz .no_key
mov ah, 0
int 16h
cmp al, 'w'
jne .check_s
dec paddle1_y
jmp .no_key
.check_s:
cmp al, 's'
jne .check_o
inc paddle1_y
jmp .no_key
.check_o:
cmp al, 'o'
jne .check_l
dec paddle2_y
jmp .no_key
.check_l:
cmp al, 'l'
jne .no_key
inc paddle2_y
.no_key:
ret
; --- Delay function ---
delay:
mov cx, 0FFFFh
.delay_loop:
nop
loop .delay_loop
ret
exit:
mov ax, 4C00h
int 21h
END start