arcanoid.asm 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. .model small
  2. .code
  3. jumps
  4. org 100h
  5. start:
  6. mov ax, 03h ; \
  7. ; | Clear Screen
  8. int 10h ; /
  9. mov ah, 02h ; \ ”ã­ªæ¨ï ãáâ ­®¢ª¨ ªãàá®à 
  10. mov bh, 0 ; | €ªâ¨¢­ ï áâà ­¨æ 
  11. mov dh, 24 ; |- Šãàá®à ª paddle (Y)
  12. mov dl, 10 ; | (X)
  13. int 10h ; /
  14. mov ah, 09h ;\ ‚뢮¤ ᨬ¢®« 
  15. mov al, 'ß' ;| ‚뢮¤¨¬ë© ᨬ¢®«
  16. mov bh, 0h ;\ ‘âà ­¨æ 
  17. mov bl, 04h ;/ �à®à¨á®¢ª  paddle (€ââਡãâë ᨬ¢®« )
  18. mov cx, 05h ;| Š®«¨ç¥á⢮ ᨬ¢®«®¢
  19. int 10h ;/
  20. mov ah, 02h ; \ ”ã­ªæ¨ï ãáâ ­®¢ª¨ ªãàá®à 
  21. mov bh, 0 ; | €ªâ¨¢­ ï áâà ­¨æ 
  22. mov dh, 15 ; |- Šãàá®à ª è à¨ªã (Y)
  23. mov dl, 15 ; | (X)
  24. int 10h ; /
  25. mov ah, 09h ;\ ‚뢮¤ ᨬ¢®« 
  26. mov al, '' ;| ‚뢮¤¨¬ë© ᨬ¢®«
  27. mov bh, 0h ;\ ‘âà ­¨æ 
  28. mov bl, 01h ;/ �à®à¨á®¢ª  è à¨ª  (€ââਡãâë ᨬ¢®« )
  29. mov cx, 01h ;| Š®«¨ç¥á⢮ ᨬ¢®«®¢
  30. int 10h ;/
  31. mainloop:
  32. mov ah, 06h ;\
  33. mov dl, 0FFh ;| IF KeyPressed then Z on
  34. int 21h ;/
  35. jz TOFLY ; …᫨ ­¥â - ¯à®¢¥à塞, ­ã¦­® «¨ ¤¢¨£ âì è à
  36. mov si,offset ifpad ;\ ‘¬¥é¥­¨¥ ¯¥à¥¬¥­­®© ¨§¬¥­¥­¨ï
  37. mov byte ptr [si], 1 ;/ - ˆ§¬¥­¥­¨¥ ¯à®¨§®è«®
  38. cmp al, 0 ; -�஢¥à塞, ¡ë«  «¨ à áè¨à¥­ ï ª« ¢¨è 
  39. jne GOODKEY ; …᫨ ­¥â - ­  ­ ç «® à ¡®âë
  40. mov ah, 08h ; \
  41. int 21h ; /ˆ­ ç¥ - ‘­®¢  ¢ë§ë¢ ¥¬ áç¨â뢠­¨ï
  42. GOODKEY: ; AL - £®â®¢  ª à ¡®â¥
  43. cmp al, 27 ;\ IF
  44. je KONEZ ;/ ESC then END
  45. cmp al, 75 ;\ IF
  46. jne GORIGHT ;/ not Left - goto try RIGHT
  47. mov si, offset px ;\ in [si] - xpos of paddle
  48. cmp BYTE PTR [si],1 ;| compare with beg of screen
  49. jbe TOFLY ;| IF <= then goto TRY BAll
  50. dec BYTE PTR [si] ;| Else dec xpos of paddle: xpos--
  51. jmp TOFLY ;/ goto TRY BALL
  52. GORIGHT:
  53. cmp al, 77 ;\ IF
  54. jne TOFLY ;/ not LEFT goto TRY BALL
  55. mov si, offset px ;\ in [si] - xpos of paddle
  56. cmp BYTE PTR [si],74 ;| compare with end of screen
  57. jae TOFLY ;| IF >= then goto TRY BAll
  58. inc BYTE PTR [si] ;| Else inc xpos of paddle: xpos++
  59. jmp TOFLY ;/ goto TRY BALL
  60. loopend: ; Final stage of loop
  61. mov si, offset IFPAD ;\ in [si] - if i need to redraw
  62. cmp byte ptr [si],0 ;| if ![si]_
  63. je PREDDEL ;/ goto DELEAY
  64. mov si,offset ifpad ;\ IF needed then, on next turn_
  65. mov byte ptr [si], 0 ;/ it will be 0
  66. mov ah, 09h ;\
  67. mov al, ' ' ;| ‚뢮¤¨¬ë© ᨬ¢®«
  68. mov bh, 0h ;\ ‘âà ­¨æ 
  69. mov bl, 00h ;/ �à®à¨á®¢ª  è à¨ª  (€ââਡãâë ᨬ¢®« )
  70. mov cx, 01h ;| Š®«¨ç¥á⢮ ᨬ¢®«®¢
  71. int 10h ;/
  72. mov ah, 02h ; \ GotoXY(0,24) to delete all line
  73. mov bh, 0 ; | €ªâ¨¢­ ï áâà ­¨æ 
  74. mov dh, 24 ; |- Šãàá®à ª paddle (Y)
  75. mov dl, 0 ; | (X)
  76. int 10h ; /
  77. mov ah, 09h ;\ Clear last line to redraw paddle
  78. mov al, ' ' ;| ‚뢮¤¨¬ë© ᨬ¢®« (#20)
  79. mov bh, 0h ;\ ‘âà ­¨æ 
  80. mov bl, 00h ;/ �à®à¨á®¢ª  è à¨ª  (€ââਡãâë ᨬ¢®« )
  81. mov cx, 80 ;| Š®«¨ç¥á⢮ ᨬ¢®«®¢
  82. int 10h ;/
  83. mov si, offset px ; [si] = xpos of paddle
  84. mov ah, 02h ; \ GotoXY(xpos,24)
  85. mov bh, 0 ; | €ªâ¨¢­ ï áâà ­¨æ 
  86. mov dh, 24 ; |- Šãàá®à ª paddle (Y)
  87. mov dl, byte ptr [si] ; | (X) (From [si])
  88. int 10h ; /
  89. mov ah, 09h ;\ Draw the paddle
  90. mov al, 'ß' ;| ‚뢮¤¨¬ë© ᨬ¢®«
  91. mov bh, 0h ;| ‘âà ­¨æ 
  92. mov bl, 04h ;| �à®à¨á®¢ª  paddle (€ââਡãâë ᨬ¢®« )
  93. mov cx, 05h ;| Š®«¨ç¥á⢮ ᨬ¢®«®¢ (Length of paddle)
  94. int 10h ;/
  95. mov si, offset x1 ; [si] = x pos of ball (x1)
  96. mov di, offset y1 ; [di] = y pos of ball (y1)
  97. mov ah, 02h ; \ GotoXY(x1,y1)
  98. mov bh, 0 ; | €ªâ¨¢­ ï áâà ­¨æ 
  99. mov dh, byte ptr [di] ; |- Cursor to draw ball (Y1) (From [di])
  100. mov dl, byte ptr [si] ; | (X1) (From [si])
  101. int 10h ; /
  102. mov ah, 09h ;\ Draw ball
  103. mov al, '' ;| ‚뢮¤¨¬ë© ᨬ¢®«
  104. mov bh, 0h ;| ‘âà ­¨æ 
  105. mov bl, 01h ;| �à®à¨á®¢ª  è à¨ª  (€ââਡãâë ᨬ¢®« )
  106. mov cx, 01h ;| Š®«¨ç¥á⢮ ᨬ¢®«®¢
  107. int 10h ;/
  108. PREDDEL: ;\
  109. mov cx, 05F00h ;|
  110. delay: push cx ;|- Delay for some time
  111. pop cx ;|
  112. loop delay ;/
  113. jmp mainloop ; TOTAL END OF LOOP !!!!!!!
  114. ;-----------------------------------------------------
  115. ; END OF LOOP
  116. ;-----------------------------------------------------
  117. TOFLY: ; Ball flying ?
  118. mov si, offset ticks ; [si] = ticks(counter to syncronize ball with_
  119. ; paddle
  120. mov al, byte ptr [si] ; al = ticks
  121. inc al ; al++
  122. mov byte ptr [si], al ; ticks++
  123. mov ah, 0 ; ax = al
  124. mov bx, 0200h ; the period of ball move
  125. xor dx, dx ; dx = 0
  126. div bx ; dx = ax mod bx
  127. cmp dx, 0 ; if ticks ªà â­® bx (0FFFFh)_
  128. je MOVE ; then goto MOVE bALL
  129. xor si, si ; si=0
  130. jmp loopend ; goto ENDOFLOOP
  131. MOVE:
  132. mov byte ptr [si], 1 ; [si]-ticks=1 (to not overflow)
  133. mov si,offset ifpad ;\ [si] = ifRedraw
  134. mov byte ptr [si], 1 ;/ redraw = true
  135. mov si, offset x1 ;\ [si] = x pos of ball (x1)
  136. mov di, offset y1 ;/ [di] = y pos of ball (y1)
  137. cmp byte ptr [si], 0 ; compare x1 with 0
  138. ja moveright ; if > then goto TEST RIGHT_
  139. mov byte ptr [XNEW+1], 0C6h ; Else in XNEW - change (dec dh)_
  140. ; to (inc dh)
  141. moveright: ; if ball can go right
  142. cmp byte ptr [si], 79 ; comp x1 with 79(end of screen)
  143. jb moveup ; if < goto TRY UP_
  144. mov byte ptr [XNEW+1], 0CEh ; Else in XNEW - change (inc dh)_
  145. ; to (dec dh)
  146. ; the inc/dec mnemonics
  147. ; inc dl - FEC2
  148. ; dec dl - FECA
  149. ; inc dh - FEC6
  150. ; dec dh - FECE
  151. moveup: ; if ball can go up
  152. cmp byte ptr [di], 0 ; comp y1 with 0(top of screen)
  153. ja movedown ; if > goto TRY DOWN_
  154. mov byte ptr [YNEW+1], 0C2h ; Else in YNEW - change (dec dl)_
  155. ; to (inc dl)
  156. movedown: ; if ball can go down
  157. cmp byte ptr [di], 23 ; comp y1 with 24(bottom of screen)
  158. jb allgood ; if < goto TRY UP_
  159. PUSH DI ; push DI in stack ([di]=y1)
  160. mov di, offset px ; Now in [DI] - paddle xpos
  161. mov bl, byte ptr [di] ; bl = xpos
  162. POP DI ; Now in [DI] = y1
  163. cmp byte ptr [si], bl ;\ compare x1 with xpos
  164. jb KONEZ ;| if < then goto GAMEOVER
  165. add bl,5 ;| bl=xpos+5(length if paddle)
  166. ;|-If paddle under ball
  167. cmp byte ptr [si], bl ;| compare x1 with xpos+5
  168. jae KONEZ ;| if > then gameover_
  169. mov byte ptr [YNEW+1], 0CAh ;/ Else in YNEW - change (inc dl)_
  170. ; to (dec dl)
  171. allgood: ; End of ball tests
  172. mov dh, byte ptr [si] ; dh = x pos of ball (x1)
  173. mov dl, byte ptr [di] ; dh = y pos of ball (y1)
  174. XNEW: inc dh ;\ HERE functions, that move ball_
  175. YNEW: dec dl ;/ they changed in ball tests
  176. mov byte ptr [si], dh ;\ x1 := new x pos of ball
  177. mov byte ptr [di], dl ;/ y1 := new y pos of ball
  178. xor si, si ;\ CLEAR SI,DI
  179. xor di, di ;/
  180. jmp loopend ; goto draw new pos of ball and paddle
  181. ;-------------------------------------------------------------------
  182. ;End OF GAME
  183. ;-------------------------------------------------------------------
  184. KONEZ: ; GAMEOVER !!!!!!!!
  185. int 20h ; Global End Proc
  186. x1 db 15 ;\ Coordinates of ball
  187. y1 db 15 ;/
  188. px db 10 ; - X coordinate of paddle
  189. ticks db 0 ; the number of game ticks
  190. IFPAD db 0 ; bool variable - if redraw
  191. end start ; LAST LINE