Voilà un petit programme qui se copie dans le secteur boot d'une disquette.
En gros, c'est un jeu à la Pong. On dirige la raquette avec les touches Shift gauche et droite.
En fait, le but était qu'il tienne dans 421 octets et des poussières pour passer inaperçu sur la disquette.
Celà fait un long moment que j'ai fait ce programme. Donc, je ne sais plus trop comment il fonctionne.
En plus, à ce moment là, j'était pas bavard pour les commentaires...
Mais, je le file, au cas où ça interesse quelqu'un...
Source / Exemple :
.model tiny
.CODE
ORG 100H
START:
jmp debut
; boot secteur info
BootSecteur_FAT12 db 59 dup (?)
; BootSecteur_FAT16 db 59 dup (?)
; BootSecteur_FAT32 db 87 dup (?)
; BootSecteur_NTFS db 81 dup (?)
;===================================================================
afficheball proc near
; affiche la baballe (x,y)-> (bx,ax), couleur=cl,ch
mov dx,320 ; di=bx+ax*320
mul dx
add ax,bx
mov di,ax
mov es:[di-320],cl
mov es:[di-1],cl
mov es:[di+1],cl
mov es:[di+320],cl
mov es:[di],ch
ret
afficheball endp
;===================================================================
;===================================================================
;===================================================================
;===================================================================
;===================================================================
debut:
cld
;initialisation mode graphique
mov AX,13h
int 10h
mov ax,0a000h ; init variable
mov es,ax
mov ds,ax
;===================================================================
; affichefond
mov di,320*8
mov cx,6
mov al,1Fh
bord1:
push cx
mov cx,320
rep stosb
pop cx
sub al,02h
loop bord1
mov es:[di],320*14
mov es:[di],1715h
mov es:[di+2],1B19h
mov es:[di+4],1F1Dh
mov es:[di+320-6],1D1Fh
mov es:[di+320-4],191Bh
mov es:[di+320-2],1517h
mov si,320*14
mov di,320*15
mov cx,320*184
rep movsb
;===================================================================
mov si,64000 ; si pointe vers les données
mov ax,00A0h
mov es:[si],ax ; position de la raquette
mov es:[si+2],ax ; position X
mov es:[si+4],ax ; position Y
mov es:[si+6],word ptr(0103h) ; vitesse VX,VY
mov es:[si+8],word ptr(0028h) ; longueur raquette
; mov es:[si+10],word ptr(0000h) ; points
xor bx,bx
mov cx,128
tracepal:
mov es:[si+12+bx],cl
inc bx
loop tracepal
;************************
boucleprincipale: ; boucle principale
;===================================================================
mov bx,es:[si+2]
mov ax,es:[si+4]
push bx
push ax
; efface la balle
xor cx,cx
call afficheball
pop ax
pop bx
mov cx,es:[si+6] ; faible=vx, fort=vy
; 1=-1 3=1
push cx
sub bx,2 ; x=x+-1
xor ch,ch
add bx,cx
pop cx
cmp bx,311 ; collision avec me mur de droite
jb ok_bord3 ; non, on continue
mov cl,1 ; oui, on inverse la vapeur!!!
ok_bord3:
cmp bx,8 ; collision avec me mur de gauche
ja ok_bord1 ; non, on continue
mov cl,3 ; oui, on inverse la vapeur!!!
ok_bord1:
sub ax,2 ;y=y+-1
add al,ch
cmp ax,15 ; collision avec me mur d'en haut
ja ok_bord2 ; non, on continue
mov ch,3 ; oui, on inverse la vapeur!!!
ok_bord2:
mov es:[si+2],bx ; sauvegarde x, y, vx,vy
mov es:[si+4],ax
mov es:[si+6],cx
mov cx,0e06h
call afficheball
;===================================================================
; traitememt de la raquette
; efface la raquette
mov di,320*195+6
mov cx,308
xor al,al
rep stosb
; affiche raquette
mov cx,es:[si+8]
push cx
mov ax,es:[si]
push ax
add ax,195*320
mov di,ax
mov si,64000+45
rep movsb
mov si,64000
;===================================================================
pop dx ; bouge la raquette
mov ah,02h ; recupere l'etat du clavier
int 16h
and al,3 ; seulement les touches shifts
pop cx ; recupere la longueure de la raquette
cmp al,1 ; si byte 1, on bouge à droite
jne pas_a_droite ; non => pas_a_droite
add cx,dx
cmp cx,312 ; on regarde si ca passe
ja pas_a_droite ; non => pas_a_droite
add dx,2 ; oui, on avance de 2
pas_a_droite:
cmp al,2 ; si byte 2, on bouge à gauche
jne pas_a_gauche ; non => pas_a_gauche
cmp dx,7 ; on regarde si ca passe
jb pas_a_gauche ;non => pas_a_gauche
sub dx,2 ; oui, on recule
pas_a_gauche:
mov es:[si],dx ; on sauve la position
mov ax,dx ; ax=position de la raquette
mov bx,es:[si+2] ; bx=X
mov cx,es:[si+4] ; cx=Y
mov dx,es:[si+6] ; dx=vx,vy
; cas au niveau de la raquette
cmp cx,195 ; si c'est pas en bas, on ne traite pas la collision avec la raquette
jne suiteboucle
cmp ax,bx ; a gauche de la raquette?
ja fin ; oui => fin
add ax,es:[si+8]
cmp ax,bx ; a droite de la raquette?
jb fin ; oui => fin
; ni a gauche, ni a droite, alors rebond
mov es:[si+7],byte ptr 1 ; sauve vy=1
inc word ptr es:[si+10] ; on ajoute un point
mov ah,02h ; on affiche les points
xor bh,bh
mov dx,0012h ; a la position ligne 0, colonne 12
int 10h
mov ax,es:[si+10]; decompose les points
push ax
mov bx,10 ; sur 5 chiffres
mov cx,5
decomp:
xor dx,dx
div bx
push dx
loop decomp
mov cx,5
xor bl,bl
affpt:
pop ax
add ax,30h
mov ah,0Eh
inc bl
int 10h
loop affpt
pop cx
and cx,3 ; on diminue la raquette que tout les 4 points
jnz suiteboucle
cmp word ptr es:[si+8],8 ; raquette plus petite que 8
jb suiteboucle ; oui, on continue
sub word ptr es:[si+8],2 ; non, on la diminue
suiteboucle:
; attend le retour vertical du rayon catodique
mov dx,3dah
pause:
in al,dx
test al,08h
jz pause
jmp boucleprincipale
fin:
jmp debut
END START
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.