1.9 דוגמה לפרויקט המשחק פונג

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