; SPRITES ;========= Paddle1 DB 0,1,1,1,1,1,1,1,1,1,1,0 DB 0,1,1,1,1,1,1,1,1,1,1,0 Paddle2 DB 0,1,1,1,1,1,1,1,1,1,1,0 DB 0,1,1,1,1,1,1,1,1,1,1,0 Ball DB 0,0,0,0,0,0,0 DB 0,0,1,1,1,0,0 DB 0,1,1,1,1,1,0 DB 0,1,1,1,1,1,0 DB 0,1,1,1,1,1,0 DB 0,0,1,1,1,0,0 DB 0,0,0,0,0,0,0 ; VARIABLES ;=========== GameOver DB ? Goal DB ? Pad1Move DB 1 Paddle1X DW ? ; col Paddle1Y DW 0 ; line Paddle1P DB 0 ; points Target DB 0 TargetX DW 0 Pad2Move DB 1 Paddle2X DW ? ; col Paddle2Y DW 62 ; line Paddle2P DB 0 ; points BallX DW ? ; col BallY DW ? ; line BallSpeed DB 1 BallMove DB 2 ; 1 2 3 ; 4 5 6 ; 7 8 9 ; PROCEDURES ;============ draw_paddle1 proc push ax push bx push cx push dx push si push di xor di,di mov si,Paddle1X mov dx,Paddle1Y mov cx,2 @row1: push cx mov cx,12 @col1: push cx mov cx,si mov bh,0 mov al,[Paddle1+di] mov ah,0Ch int 10h inc si inc di pop cx loop @col1 mov si,Paddle1X inc dx pop cx loop @row1 pop di pop si pop dx pop cx pop bx pop ax ret draw_paddle1 endp draw_paddle2 proc push ax push bx push cx push dx push si push di xor di,di mov si,Paddle2X mov dx,Paddle2Y mov cx,2 @row2: push cx mov cx,12 @col2: push cx mov cx,si mov bh,0 mov al,[Paddle2+di] mov ah,0Ch int 10h inc di inc si pop cx loop @col2 mov si,Paddle2X inc dx pop cx loop @row2 pop di pop si pop dx pop cx pop bx pop ax ret draw_paddle2 endp draw_ball proc push ax push bx push cx push dx push si push di mov si,BallX sub si,3 xor di,di mov dx,BallY sub dx,3 mov cx,7 @rowb: push cx mov cx,7 @colb: push cx mov cx,si mov al,[Ball+di] mov ah,0Ch mov bh,0 int 10h inc di inc si pop cx loop @colb mov si,BallX sub si,3 inc dx pop cx loop @rowb pop di pop si pop dx pop cx pop bx pop ax ret draw_ball endp draw_field proc push ax push bx push cx push dx mov cx,40 @draw_field1: push cx add cx,49 mov dx,0 mov bh,0 mov ax,0C01h int 10h pop cx push cx add cx,149 int 10h pop cx push cx add cx,49 mov dx,63 int 10h pop cx push cx add cx,149 int 10h pop cx loop @draw_field1 mov cx,64 @draw_field2: push cx mov dx,cx dec dx mov cx,49 int 10h mov cx,189 int 10h pop cx loop @draw_field2 mov ax,0C01h xor bx,bx xor dx,dx mov cx,90 int 10h mov cx,148 int 10h inc cx int 10h add dx,63 int 10h dec cx int 10h mov cx,90 int 10h pop dx pop cx pop bx pop ax ret draw_field endp ; MOVING Routines ;================= paddle2_move proc mov ax,Paddle2X xor ah,ah add al,Pad2Move dec al mov Paddle2X,ax cmp Paddle2X,91 if g jmp @right mov Paddle2X,91 mov Pad1Move,1 @right: cmp Paddle2X,136 if l jmp @return mov Paddle2X,136 mov Pad2Move,1 @return: call draw_paddle2 ret paddle2_move endp paddle1_move proc push ax push bx cmp BallMove,5 if l jmp @is_target mov Target,0 mov TargetX,119 jmp @pad1move @is_target: ; cmp Target,1 ; if e jmp @pad1move ; set target X mov ax,BallX cmp BallMove,1 if e sub ax,BallY cmp BallMove,2 if e mov ax,ax cmp BallMove,3 if e add ax,BallY mov TargetX,ax mov Target,1 @pad1move: mov ax,TargetX mov bx,Paddle1X add bx,6 cmp ax,bx if l dec Paddle1X cmp ax,bx if g inc Paddle1X cmp Paddle1X,91 if l mov Paddle1X,91 cmp Paddle1X,136 if g mov Paddle1X,136 mov ax,Paddle1X sub bx,6 inc al sub al,bl mov Pad1Move,al @pad1moveret: call draw_paddle1 pop bx pop ax ret paddle1_move endp ball_move proc @1: cmp BallMove,1 jg @2 cmp BallX,53 if g dec BallX cmp BallY,4 if g dec BallY jmp @returnb @2: cmp BallMove,2 jg @3 cmp BallY,4 if g dec BallY jmp @returnb @3: cmp BallMove,3 jg @4 cmp BallX,185 if l inc BallX cmp BallY,4 if g dec BallY jmp @returnb @4: cmp BallMove,4 jg @5 cmp BallX,53 if g dec BallX jmp @returnb @5: cmp BallMove,5 jg @6 jmp @returnb @6: cmp BallMove,6 jg @7 cmp BallX,185 if l inc BallX jmp @returnb @7: cmp BallMove,7 jg @8 cmp BallX,53 if g dec BallX cmp BallY,59 if l inc BallY jmp @returnb @8: cmp BallMove,8 jg @9 cmp BallY,59 if l inc BallY jmp @returnb @9: cmp BallY,59 if l inc BallY cmp BallX,185 if l inc BallX jmp @returnb @returnb: call draw_ball ret ball_move endp bounce_ball proc cmp BallX,53 jg @next2 ;--left border @next1: cmp BallMove,1 jne @move4 @move1: cmp BallY,4 jg @1_1to3 @1_1to9: mov BallMove,9 jmp @bounce_ret2 @1_1to3: mov BallMove,3 jmp @bounce_ret2 @move4: cmp BallMove,4 jne @move7 mov BallMove,6 jmp @bounce_ret2 @move7: cmp BallY,59 je @7_7to3 @7_7to9: mov BallMove,9 jmp @bounce_ret2 @7_7to3: mov BallMove,3 jmp @bounce_ret2 ;-- right border @next2: cmp BallX,185 jne @next3 cmp BallMove,3 jne @move6 @move3: cmp BallY,4 jne @3_3to1 @3_3to7: mov BallMove,7 jmp @bounce_ret2 @3_3to1: mov BallMove,1 jmp @bounce_ret2 @move6: cmp BallMove,6 jne @move9a mov BallMove,4 jmp @bounce_ret2 @move9a: cmp BallY,59 je @9_9to1 @9_9to7: mov BallMove,7 jmp @bounce_ret2 @bounce_ret2: jmp @bounce_ret ;-- upper border @next3: cmp BallY,4 jg @next4 cmp BallX,53 if e jmp @1_1to9 cmp BallX,185 if e jmp @3_3to7 add BallMove,6 jmp @bounce_ret ;-- lower border @next4: cmp BallY,59 jne @bounce_ret cmp BallMove,7 jne @move8 @move7b: cmp BallX,53 jne @7b_7to1 @7b_7to3: mov BallMove,3 jmp @bounce_ret @7b_7to1: mov BallMove,1 jmp @bounce_ret @move8: cmp BallMove,8 jne @move9 mov BallMove,2 jmp @bounce_ret @move9: cmp BallX,185 je @9_9to1 @9_9to3: mov BallMove,3 jmp @bounce_ret @9_9to1: mov BallMove,1 jmp @bounce_ret @bounce_ret: ret bounce_ball endp Bounces1 DB 0,7,7,8,0,0,0,0,0,0 DB 0,7,8,9,0,0,0,0,0,0 DB 0,8,9,9,0,0,0,0,0,0 Speeds1 DB 1,2,2,0,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1 DB 1,0,2,2,1,1,1,1,1,1 Moves1 DB 1,0,0,0,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,1,1,1 DB 1,2,2,2,1,1,1,1,1,1 bounce_pad1 proc mov ax,Paddle1X mov bx,BallX cmp bx,ax jl @bp1ret sub bx,ax cmp bx,12 jg @bp1ret push cs pop es mov bp,offset Bounces1 mov bl,BallMove xor bh,bh mov cl,Pad1Move xor ch,ch mov ax,10 mul cx add ax,bx mov cx,ax add bp,ax mov al,es:[bp] cmp al,0 je @bp1ret mov Target,0 mov BallMove,al mov bp,offset Speeds1 add bp,cx mov al,es:[bp] mov ah,BallSpeed add ah,al dec ah cmp ah,0 if e mov ah,1 mov BallSpeed,ah mov bp,offset Moves1 add bp,cx mov al,es:[bp] xor ah,ah mov bx,BallX add bx,ax dec bx mov BallX,bx call draw_ball @bp1ret: ret bounce_pad1 endp Bounces2 DB 0,0,0,0,0,0,0,1,1,2 DB 0,0,0,0,0,0,0,1,2,3 DB 0,0,0,0,0,0,0,2,3,3 Speeds2 DB 1,1,1,1,1,1,1,2,2,3 DB 1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,3,2,2 Moves2 DB 1,1,1,1,1,1,1,0,0,0 DB 1,1,1,1,1,1,1,1,1,1 DB 1,1,1,1,1,1,1,2,2,2 bounce_pad2 proc mov ax,Paddle2X mov bx,BallX cmp bx,ax if l jmp @bp2ret sub bx,ax cmp bx,12 if g jmp @bp2ret push cs pop es mov bp,offset Bounces2 mov bl,BallMove xor bh,bh mov cl,Pad2Move xor ch,ch mov ax,10 mul cx add ax,bx mov cx,ax add bp,ax mov al,es:[bp] cmp al,0 je @bp2ret mov BallMove,al mov bp,offset Speeds2 add bp,cx mov al,es:[bp] mov ah,BallSpeed add ah,al dec ah cmp ah,0 if e mov ah,1 mov BallSpeed,ah mov bp,offset Moves2 add bp,cx mov al,es:[bp] xor ah,ah mov bx,BallX add bx,ax dec bx mov BallX,bx call draw_ball @bp2ret: ret bounce_pad2 endp check_paddle proc push ax push bx @paddle1: cmp BallY,5 jg @paddle2 call bounce_pad1 jmp @check_ret @paddle2: cmp BallY,58 jl @check_ret call bounce_pad2 @check_ret: pop bx pop ax ret check_paddle endp check_goal proc mov Goal,0 @goal1: cmp BallY,4 jg @goal2 cmp BallX,92 jl @goal_ret cmp BallX,145 jg @goal_ret mov Goal,1 jmp @goal_ret @goal2: cmp BallY,59 jl @goal_ret cmp BallX,92 jl @goal_ret cmp BallX,145 jg @goal_ret mov Goal,2 @goal_ret: ret check_goal endp