1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
| .model small
.486
.stack 100h
.data
.code
vecteur dd 0
segVect dw 0
offVect dw 0
ECRAN equ 0b800h
position dw 0 ; position de la balle (entre 0000h et 0F40h)
caract dw 0 ; caractere qui a ete remplace par la balle
colonne db 0 ; colonne de la position de la balle (entre 0 et 80)
ligne db 0 ; ligne de la position de la balle (entre 0 et 21)
pasX db 2 ; pas de deplacement de la balle en X
pasY db 160 ; pas de deplacement de la balle en Y
cpt db 0 ; compteur pour ralentir la balle
; interruption 1Ch
proc_1Ch:
; compteur pour ralentir le deplacement de la balle
inc cs:cpt
cmp cs:cpt, 10
jne fin2
mov cs:cpt, 0
; sauvegarde du contexte
push ax
push di
push ds
; position de la balle
mov ax, ECRAN
mov ds, ax
mov ax, cs:position
mov di, ax
; reaffichage du caractere efface
mov ax, cs:caract
mov [ds:di], ax
; gestion des bords de l ecran (rebond)
cmp cs:colonne, 80 ; debordement sur la droite
jne VeriB
mov cs:pasX, -1
VeriB: cmp cs:ligne, 24 ; debordement sur le bas
jne VeriG
mov cs:pasY, -1
VeriG: cmp cs:colonne, 0 ; debordement sur la gauche
jne VeriH
mov cs:pasX, 1
VeriH: cmp cs:ligne, 0 ; debordement sur le haut
jne FVerif
mov cs:pasY, 1
; mise a jour des informations Ligne/Colonne
FVerif: mov al, cs:pasX
add cs:colonne, al
mov al, cs:pasY
add cs:ligne, al
; calcul de la position en memoire
mov al, cs:ligne
and ax, 00ffh
imul ax, 160
mov bl, cs:colonne
and bx, 00ffh
shl bx, 1
add ax, bx
mov di, ax
mov cs:position , ax
; affichage du caractere
mov ax, ds:di
mov cs:caract, ax
mov [ds:di], 0f6fh
pop ds
pop di
pop ax
fin2: ;jmp cs:vecteur
mov ds, cs:segVect
mov dx, cs:offVect
int 21h
int 1ch
mov dx, offset proc_1Ch
mov ax, 251Ch
int 21h
iret
public _main
_main:
;sauvegarde du premier caractere
mov ax, 0b800h
mov ds, ax
mov di, 0h
mov ax, ds:di
mov cs:caract, ax
;
; init du vecteur dIT 1C
;
push cs
pop ds
mov dx, offset proc_1Ch
mov ax, 251Ch
int 21h
;
;recup ancien vecteur
;
mov ah,35h
mov al,1Ch
int 21h
; mov eax, 0h
; mov ax, es
; shl eax, 16
; mov ax, bx
; mov cs:vecteur, eax
mov cs:segVect, es
mov cs:offVect, bx
mov ax, ECRAN
mov ds, ax
mov ax, 6h
mov di, ax
; reaffichage du caractere efface
mov eax, cs:vecteur
and eax, 000f0000h
shr eax, 16
add ax, 30h
or ax, 0f00h
mov [ds:di], ax
;
; calcul de la longueur utile
;
mov dx,offset _main
add dx,256
shr dx,4
inc dx
mov ah,31h
int 21h
; quitte le programme
mov ax, 4c00h
int 21h
end _main |
Partager