.model small .code jumps org 100h start: mov ax, 03h ; \ ; | Clear Screen int 10h ; / mov ah, 02h ; \ Функция установки курсора mov bh, 0 ; | Активная страница mov dh, 24 ; |- Курсор к paddle (Y) mov dl, 10 ; | (X) int 10h ; / mov ah, 09h ;\ Вывод символа mov al, '▀' ;| Выводимый символ mov bh, 0h ;\ Страница mov bl, 04h ;/ Прорисовка paddle (Аттрибуты символа) mov cx, 05h ;| Количество символов int 10h ;/ mov ah, 02h ; \ Функция установки курсора mov bh, 0 ; | Активная страница mov dh, 15 ; |- Курсор к шарику (Y) mov dl, 15 ; | (X) int 10h ; / mov ah, 09h ;\ Вывод символа mov al, '' ;| Выводимый символ mov bh, 0h ;\ Страница mov bl, 01h ;/ Прорисовка шарика (Аттрибуты символа) mov cx, 01h ;| Количество символов int 10h ;/ mainloop: mov ah, 06h ;\ mov dl, 0FFh ;| IF KeyPressed then Z on int 21h ;/ jz TOFLY ; Если нет - проверяем, нужно ли двигать шар mov si,offset ifpad ;\ Смещение переменной изменения mov byte ptr [si], 1 ;/ - Изменение произошло cmp al, 0 ; -Проверяем, была ли расширеная клавиша jne GOODKEY ; Если нет - на начало работы mov ah, 08h ; \ int 21h ; /Иначе - Снова вызываем считывания GOODKEY: ; AL - готова к работе cmp al, 27 ;\ IF je KONEZ ;/ ESC then END cmp al, 75 ;\ IF jne GORIGHT ;/ not Left - goto try RIGHT mov si, offset px ;\ in [si] - xpos of paddle cmp BYTE PTR [si],1 ;| compare with beg of screen jbe TOFLY ;| IF <= then goto TRY BAll dec BYTE PTR [si] ;| Else dec xpos of paddle: xpos-- jmp TOFLY ;/ goto TRY BALL GORIGHT: cmp al, 77 ;\ IF jne TOFLY ;/ not LEFT goto TRY BALL mov si, offset px ;\ in [si] - xpos of paddle cmp BYTE PTR [si],74 ;| compare with end of screen jae TOFLY ;| IF >= then goto TRY BAll inc BYTE PTR [si] ;| Else inc xpos of paddle: xpos++ jmp TOFLY ;/ goto TRY BALL loopend: ; Final stage of loop mov si, offset IFPAD ;\ in [si] - if i need to redraw cmp byte ptr [si],0 ;| if ![si]_ je PREDDEL ;/ goto DELEAY mov si,offset ifpad ;\ IF needed then, on next turn_ mov byte ptr [si], 0 ;/ it will be 0 mov ah, 09h ;\ mov al, ' ' ;| Выводимый символ mov bh, 0h ;\ Страница mov bl, 00h ;/ Прорисовка шарика (Аттрибуты символа) mov cx, 01h ;| Количество символов int 10h ;/ mov ah, 02h ; \ GotoXY(0,24) to delete all line mov bh, 0 ; | Активная страница mov dh, 24 ; |- Курсор к paddle (Y) mov dl, 0 ; | (X) int 10h ; / mov ah, 09h ;\ Clear last line to redraw paddle mov al, ' ' ;| Выводимый символ (#20) mov bh, 0h ;\ Страница mov bl, 00h ;/ Прорисовка шарика (Аттрибуты символа) mov cx, 80 ;| Количество символов int 10h ;/ mov si, offset px ; [si] = xpos of paddle mov ah, 02h ; \ GotoXY(xpos,24) mov bh, 0 ; | Активная страница mov dh, 24 ; |- Курсор к paddle (Y) mov dl, byte ptr [si] ; | (X) (From [si]) int 10h ; / mov ah, 09h ;\ Draw the paddle mov al, '▀' ;| Выводимый символ mov bh, 0h ;| Страница mov bl, 04h ;| Прорисовка paddle (Аттрибуты символа) mov cx, 05h ;| Количество символов (Length of paddle) int 10h ;/ mov si, offset x1 ; [si] = x pos of ball (x1) mov di, offset y1 ; [di] = y pos of ball (y1) mov ah, 02h ; \ GotoXY(x1,y1) mov bh, 0 ; | Активная страница mov dh, byte ptr [di] ; |- Cursor to draw ball (Y1) (From [di]) mov dl, byte ptr [si] ; | (X1) (From [si]) int 10h ; / mov ah, 09h ;\ Draw ball mov al, '' ;| Выводимый символ mov bh, 0h ;| Страница mov bl, 01h ;| Прорисовка шарика (Аттрибуты символа) mov cx, 01h ;| Количество символов int 10h ;/ PREDDEL: ;\ mov cx, 05F00h ;| delay: push cx ;|- Delay for some time pop cx ;| loop delay ;/ jmp mainloop ; TOTAL END OF LOOP !!!!!!! ;----------------------------------------------------- ; END OF LOOP ;----------------------------------------------------- TOFLY: ; Ball flying ? mov si, offset ticks ; [si] = ticks(counter to syncronize ball with_ ; paddle mov al, byte ptr [si] ; al = ticks inc al ; al++ mov byte ptr [si], al ; ticks++ mov ah, 0 ; ax = al mov bx, 0200h ; the period of ball move xor dx, dx ; dx = 0 div bx ; dx = ax mod bx cmp dx, 0 ; if ticks кратно bx (0FFFFh)_ je MOVE ; then goto MOVE bALL xor si, si ; si=0 jmp loopend ; goto ENDOFLOOP MOVE: mov byte ptr [si], 1 ; [si]-ticks=1 (to not overflow) mov si,offset ifpad ;\ [si] = ifRedraw mov byte ptr [si], 1 ;/ redraw = true mov si, offset x1 ;\ [si] = x pos of ball (x1) mov di, offset y1 ;/ [di] = y pos of ball (y1) cmp byte ptr [si], 0 ; compare x1 with 0 ja moveright ; if > then goto TEST RIGHT_ mov byte ptr [XNEW+1], 0C6h ; Else in XNEW - change (dec dh)_ ; to (inc dh) moveright: ; if ball can go right cmp byte ptr [si], 79 ; comp x1 with 79(end of screen) jb moveup ; if < goto TRY UP_ mov byte ptr [XNEW+1], 0CEh ; Else in XNEW - change (inc dh)_ ; to (dec dh) ; the inc/dec mnemonics ; inc dl - FEC2 ; dec dl - FECA ; inc dh - FEC6 ; dec dh - FECE moveup: ; if ball can go up cmp byte ptr [di], 0 ; comp y1 with 0(top of screen) ja movedown ; if > goto TRY DOWN_ mov byte ptr [YNEW+1], 0C2h ; Else in YNEW - change (dec dl)_ ; to (inc dl) movedown: ; if ball can go down cmp byte ptr [di], 23 ; comp y1 with 24(bottom of screen) jb allgood ; if < goto TRY UP_ PUSH DI ; push DI in stack ([di]=y1) mov di, offset px ; Now in [DI] - paddle xpos mov bl, byte ptr [di] ; bl = xpos POP DI ; Now in [DI] = y1 cmp byte ptr [si], bl ;\ compare x1 with xpos jb KONEZ ;| if < then goto GAMEOVER add bl,5 ;| bl=xpos+5(length if paddle) ;|-If paddle under ball cmp byte ptr [si], bl ;| compare x1 with xpos+5 jae KONEZ ;| if > then gameover_ mov byte ptr [YNEW+1], 0CAh ;/ Else in YNEW - change (inc dl)_ ; to (dec dl) allgood: ; End of ball tests mov dh, byte ptr [si] ; dh = x pos of ball (x1) mov dl, byte ptr [di] ; dh = y pos of ball (y1) XNEW: inc dh ;\ HERE functions, that move ball_ YNEW: dec dl ;/ they changed in ball tests mov byte ptr [si], dh ;\ x1 := new x pos of ball mov byte ptr [di], dl ;/ y1 := new y pos of ball xor si, si ;\ CLEAR SI,DI xor di, di ;/ jmp loopend ; goto draw new pos of ball and paddle ;------------------------------------------------------------------- ;End OF GAME ;------------------------------------------------------------------- KONEZ: ; GAMEOVER !!!!!!!! int 20h ; Global End Proc x1 db 15 ;\ Coordinates of ball y1 db 15 ;/ px db 10 ; - X coordinate of paddle ticks db 0 ; the number of game ticks IFPAD db 0 ; bool variable - if redraw end start ; LAST LINE