📄 paddleg.asm
字号:
.model tiny ; MODEL TYPE
.stack ; STACK SEGMENT
.data ; DATA SEGMENT
instructions db " This is a Paddle Ball Game for two users ",13,10,13,10
db " The Left Paddle is 'q' for UP and 'a' for down",13,10
db " The Right Paddle is 'p' for UP and 'l' for down",13,10
db " ",13,10
db " The Game Exits if you miss 9 times $"
DTIME dw 00d0h
Score_text db " Score= "
CharAddr dw 0
CharColNo db 20 ; For Char
Char db " " ; For Char
CharRowNo db 1 ; For Char
RPaddleTop db 0 ; Top of Right Paddle
LpaddleTop db 22 ; Top of Left Paddle
RCount db 0 ; Right Player Score
LCount db 0 ; Left Player Score
Miss db 0h ; Ball was Missed
Key db 0h ; Key pressed on keyboard
Xdir db 0 ; 0 for right/1 for left
Ydir db 0 ; 0 for up/1 for down
color db 021h ; variable
.code
;===============================================================================
START_MAIN:
mov ax,@data
mov ds,ax
call menu
init:
mov Miss,0
mov Key,0
mov Xdir,0 ; 0 for right/1 for left
mov Ydir,0 ; 0 for up/1 for down
mov CharColNo,20 ; For Char
mov CharRowNo,1 ; For Char
xor al,al
mov ah,01h
mov ch,20h
mov cl,27h
int 10h ;hide cursor
do_again:
call draw_rpaddle
call draw_lpaddle
call draw_scores
call draw_char
call delay
call blank
call next_pos
call check_keypress
jmp do_again
missed:
sub DTIME,0Ah ; shorten delay / increase speed
add Color,10h
cmp Lcount,9
jnz checkrcount
jmp to_end
checkrcount: cmp RCount,9
jnz init
to_end: mov ax,4C00h ; return to DOS <<<<<<<<< EXIT <<<<<
int 21h ; exit program
;===================================================================================================================
;===============================================
next_pos:
cmp Xdir,1
jz left
right: inc CharRowNo
cmp CharRowNo,24
jnz OK
mov Xdir,1
left: dec CharRowNo
cmp CharRowNo,0
jnz OK
mov Xdir,0
inc CharRowNo
OK:
cmp Ydir,1
jz UP
DOWN: inc CharColNo
cmp CharColNo,79
jnz DONE
call check_rpaddle
cmp MISS,1
jz missed
mov Ydir,1
UP: dec CharCOlNo
cmp CharColNo,0
jnz DONE
call check_lpaddle
cmp MISS,1
jnz on
jmp missed
on:
mov YDir,0
inc CharcolNo
inc CharcolNo
DONE:
ret
;=================================
check_rpaddle:
push dx
mov Miss,0
mov dl,RPaddleTop
cmp CharRowNo,dl
jz notmiss
inc dl
cmp CharRowNo,dl
jz notmiss
inc dl
cmp CharRowNo,dl
jz notmiss
setmiss: mov Miss,1
inc LCount
jmp rdone
notmiss: mov Miss,0
rdone: pop dx
ret
;==================================
;=================================
check_lpaddle:
push dx
mov Miss,0
mov dl, LpaddleTop
cmp CharRowNo,dl
jz notmiss
inc dl
cmp CharRowNo,dl
jz notmiss
inc dl
cmp CharRowNo,dl
jz notmissl
setmissl: mov Miss,1
inc Rcount
jmp ldone
notmissl: mov Miss,0
ldone: pop dx
ret
;==================================
Draw_Char:
push bp ax bx dx
mov dh,CharRowNo ; row to put string
mov dl,CharColNo ; column to put string
set_cursor: xor bh,bh
mov ah,02h
int 10h
do_ball: mov al,' '
mov ah,09h ; function 9 - write char
xor bh,bh ; video page 0
mov bl,Color
mov cx,1 ; repeat val
int 10h ; call BIOS service
pop dx bx ax bp
ret ; end proc
;============== BlanK ===========
blank: ;blanks screen
push ax bx cx dx
mov ah,2
mov bh,0
mov dx,0
int 10h
xor bh,bh
mov ah,8
int 10h
mov bl,bh
mov bh,ah
sub cx,cx
mov dx,184fh ;18h = 24 rows, 4f = 79 coulums
mov ax,0600h
int 10h
pop dx cx dx ax
ret
;=========== DELAY +++++++++
delay:
push cx
mov cx,DTIME
again: push cx
mov cx,0FFFFh
here: loop here
pop cx
loop again
pop cx
ret
;===========================
draw_rpaddle:
push ax bx cx dx si
mov si,3h
mov dh,rpaddletop ; row to put string
mov dl,79 ; column to put string
next_rblock: xor bh,bh
mov ah,02h
int 10h
mov al,' ' ; block char
mov ah,09h ; function 9 - write char
xor bh,bh ; video page 0
mov bl,Color
mov cx,1 ; repeat val
int 10h ; call BIOS service
;inc dl
inc dh
dec si
jnz next_rblock
pop si dx cx bx ax
ret
;-----------------------------------------
draw_lpaddle:
push ax bx cx dx si
mov si,3h
mov dh,lpaddletop ; row to put string
mov dl,0 ; column to put string
next_lblock: xor bh,bh
mov ah,02h
int 10h
mov al,' ' ; block char
mov ah,09h ; function 9 - write char
xor bh,bh ; video page 0
mov bl,Color
mov cx,1 ; repeat val
int 10h ; call BIOS service
;inc dl
inc dh
dec si
jnz next_lblock
pop si dx cx bx ax
ret
;_______________________________________
check_keypress:
call read_key
isitq: cmp key,'q'
jnz isita
dec LpaddleTop
jmp done_key
isita: cmp key,'a'
jnz isitp
inc LpaddleTop
jmp done_key
isitp: cmp key,'p'
jnz isitl
dec RpaddleTop
jmp done_key
isitl: cmp key,'l'
jnz done_key
inc RpaddleTop
done_key:
ret
;===============
read_key:
push ax
mov ah,1
int 16h
jz back
mov ah,8
int 21h
mov key,al
jmp kdone
back: mov key,0
kdone: pop ax
ret
; ============================
menu:
push ax bx cx dx
mov dx, OFFSET instructions
mov ah,9
int 21h
mov ah,7
int 21h
pop dx cx bx ax
ret
;============================
draw_scores:
push ax bx cx dx si
mov si,7h
mov dh,24 ; row to put string
mov dl,2 ; column to put string
mov bx,OFFSET Score_text
mov cl,LCount
add cl,30h
mov [bx+7],cl
push bx
next_schar:
xor bh,bh
mov ah,02h
int 10h
pop bx
inc bx
push bx
mov al,[bx] ; block char
mov ah,09h ; function 9 - write char
xor bh,bh ; video page 0
mov bl,Color
mov cx,1 ; repeat val
int 10h ; call BIOS service
inc dl
;inc dh
dec si
jnz next_schar
pop bx
mov si,7h
mov dh,24 ; row to put string
mov dl,69 ; column to put string
mov bx,OFFSET Score_text
mov cl,RCount
add cl,30h ; convert to ascii
mov [bx+7],cl
push bx
next_srchar:
xor bh,bh
mov ah,02h
int 10h
pop bx
inc bx
push bx
mov al,[bx] ; block char
mov ah,09h ; function 9 - write char
xor bh,bh ; video page 0
mov bl,Color
mov cx,1 ; repeat val
int 10h ; call BIOS service
inc dl
;inc dh
dec si
jnz next_srchar
pop bx
pop si dx cx bx ax
ret
;======================== ====
;===============================
end START_MAIN ; end prog
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -