;---------------------------- ; FoliBALL ; ;--- MAIN MODULE org 100h call main ;--- other modules include scores.asm include objects.asm ;--- GLOBAL DATA Skill DB ? OldMode DW ? Turn DB ? InitMsg DB 'PortFolio MINI BALL',0 DB 'Keys:',0 DB ' [ESC] game over',0 DB ' [ Q ] move paddle left / stop',0 DB ' [ P ] move paddle right / stop',0 DB ' [SPC] jump in direction of move',0,0 ByeMsg DB 'FoliBALL v2.1b (C) David Stastny 2001',13,10 DB 'e-mail: david.stastny@quick.cz',13,10 DB '$' SkillMsg DB 'Choose your skill:',0 DB 'Novice',0 DB 'Beginner',0 DB 'Average',0 DB 'Master',0,0 QuitMsg: DB 'Play again?',0,'Yes',0,'No',0,0 YouGoalMsg: DB 'Try it again. ' DB 'Still keep trying. ' DB 'Great! You are good.' DB 'Very nice shot. ' DB 'You are really good!' DB 'How did you do that?' DB 'That is amazing! ' DB 'Impossible !!!!! ' CompGoalMsg: DB 'Do not cry... ' DB 'Take this then cry. ' DB 'Again and again ... ' DB 'You are too slow! ' DB 'Wait for next! ' DB 'What do you say now?' DB 'Meet the best! ' DB 'I am MASTER OF BALL!' GoalTitle: DB ' G O A L ' WinTitle: DB ' Y O U W O N ' LoseTitle: DB 'Y O U L O S T' DrawGameTitle: DB 'D R A W G A M E' ClearScore: DB ' x : x ' ScoreBoard: DB '________________',0,32,0 ScoreBoardMsg: DB '____________________',0,32,0,0 ;--- PROCEDURES set_graph: mov ah,0Fh int 10h mov OldMode,ax ;--- PC video mode ; mov ax,0010h ;--- POFO video mov ax,0008h int 10h ret set_text: mov ax,OldMode xor ah,ah int 10h ret fast_clear_screen: ;--- PC video more ; mov ax,0010h ;--- POFO video mov ax,0008h int 10h ret clear_screen: mov ah,1 int 16h jz >L2 xor ah,ah int 16h jmp short clear_screen L2: xor dx,dx mov cx,64 @crow: push cx mov cx,240 @cline: push cx dec cx mov ax,0C00h mov bh,0 int 10h pop cx loop @cline inc dx pop cx mov ah,1 int 16h jnz >L1 loop @crow ret L1: xor ah,ah int 16h call fast_clear_screen ret reset_game proc mov Paddle1X,113 mov Paddle1Y,0 mov Paddle1P,0 mov Pad1Move,1 mov Target,0 mov Paddle2X,113 mov Paddle2Y,62 mov Paddle2P,0 mov BallX,119 mov BallY,31 mov BallMove,2 mov ballSpeed,1 mov GameOver,0 mov Goal,0 mov Pad2Move,1 mov Turn,0 ret it_is_goal proc push ax push bx push cx push dx push si push di push es push ds pop es @clear_key_buffer: mov ah,1 int 16h jz @show mov ah,0 int 16h jmp @clear_key_buffer @show: cld mov cx,16 mov si,offset GoalTitle mov di,offset ScoreBoard rep movsb xor ah,ah mov bl,20 cmp Goal,1 jne >L1 mov si,offset YouGoalMsg mov al,Paddle2P jmp >L2 L1: mov si,offset CompGoalMsg mov al,Paddle1P L2: dec al mul bl xor ah,ah add si,ax cld mov cx,20 mov di,offset ScoreBoardMsg rep movsb mov ax,1200h xor bh,bh mov dx,0108h mov si,offset ScoreBoard int 60h mov ah,0 ; wait for key int 16h cmp Goal,1 if e mov BallMove,2 cmp Goal,2 if e mov BallMove,8 mov al,BallMove xor ah,ah mov bh,Paddle1P mov bl,Paddle2P push ax push bx call reset_game pop bx pop ax mov BallMove,al mov Paddle1P,bh mov Paddle2P,bl pop es pop di pop si pop dx pop cx pop bx pop ax ret get_skill: call set_text push ds pop es mov si,offset SkillMsg mov di,0FFFFh xor bh,bh ;--- default average skill mov cx,0002h mov dx,0008h mov ax,0F01h int 60h cmp ax,0FFFFh je get_skill inc al mov Skill,al ret ; ================================ ; Main procedure ; ================ main: push ds pop es call set_graph call set_text mov si,offset InitMsg xor bh,bh xor dx,dx mov ah,12h int 60h mov ah,0 int 16h cmp ah,1 jne @startgame jmp long @ask @startgame: call get_skill call reset_game @continue: call fast_clear_screen call draw_field call draw_ball call draw_paddle1 call draw_paddle2 xor ah,ah mov al,Paddle1P call drawnumber mov ah,1 mov al,Paddle2P call drawnumber @game: @repeat: cmp BallSpeed,3 if g mov BallSpeed,3 mov cl,BallSpeed xor ch,ch @ball_loop: push cx call ball_move call bounce_ball call check_paddle call check_goal cmp Goal,0 je @no_goal push cs mov bx,offset @goal push bx ret @no_goal: pop cx loop @ball_loop inc Turn @skill1: cmp Skill,1 jne @skill2 cmp Turn,7 if ne call paddle1_move cmp Turn,7 if ge mov Turn,0 @skill2: cmp Skill,2 jne @skill3 call paddle1_move @skill3: cmp Skill,3 jne @skill4 call paddle1_move cmp Turn,20 if e call paddle1_move cmp Turn,20 if ge mov Turn,0 @skill4: cmp Skill,4 jne @endskill call paddle1_move cmp Turn,10 if e call paddle1_move cmp Turn,10 if ge mov Turn,0 @endskill: call paddle2_move mov ah,1 int 16h if z jmp @repeat @read_key: mov ah,0 int 16h cmp ah,1 jne @ah_16 jmp long @game_over @ah_16: cmp ah,16 jne @ah_25 mov al,Pad2Move mov Pad2Move,1 cmp al,0 if ne mov Pad2Move,0 jmp long @game @ah_25: cmp ah,25 jne @ah_39h mov al,Pad2Move mov Pad2Move,1 cmp al,2 if ne mov Pad2Move,2 @ah_39h: cmp ah,39h jne @endkeys call paddle2_move @endkeys: jmp long @game @goal: mov al,Goal and al,1 add Paddle2P,al mov al,Goal and al,2 shr al,1 add Paddle1P,al cmp Paddle1P,9 je @game_over cmp Paddle2P,9 je @game_over call set_text call it_is_goal jmp long @continue @game_over: call clear_screen call set_text mov ah,Paddle1P mov al,Paddle2P @drawgame: cmp ah,al jne @youwin mov si,offset DrawGameTitle jmp short @print @youwin: cmp ah,al jg @youlose mov si,offset WinTitle jmp short @print @youlose: mov si,offset LoseTitle @print: cld mov cx,16 mov di,offset ScoreBoard rep movsb mov cx,20 mov si,offset ClearScore mov di,offset ScoreBoardMsg rep movsb mov ah,Paddle1P add ah,'0' mov al,Paddle2P add al,'0' mov [ScoreBoardMsg+5],ah mov [ScoreBoardMsg+13],al mov si,offset ScoreBoard xor bh,bh mov ah,12h mov dx,0108h int 60h mov ah,0 int 16h @ask: call set_text mov si,offset QuitMsg mov di,0FFFFh mov ax,0F01h xor bh,bh xor cx,cx mov dx,020Bh int 60h cmp al,1 je @reallyquit jmp long @startgame @reallyquit: call set_text mov ah,9 mov dx,offset ByeMsg int 21h mov ax,4C00h int 21h ret