Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BOOT PONG


Information sur la source

Catégorie :Applications ms-dos Classé sous : démarrage, boot, diskette, pong, jeu Niveau : Expert Date de création : 15/06/2005 Date de mise à jour : 26/09/2005 13:47:51 Vu / téléchargé: 4 508 / 403

Note :
8,67 / 10 - par 3 personnes
8,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

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

  • .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
.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                                       

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

26 septembre 2005 13:47:51 :
Bon, voilà une MàJ pour une seule raison : la taille du code dans un secteur boot c'est pas de 480 octets et des poussières mais 421 Octets max pour une FAT32. Donc, j'ai racourcis au max le code. Par contre, apèrs avoir couper le code, il me restait finalement des octets en rab, alors, j'ai modifier de nouveau le code pour que la raquette soit en arc-en-ciel.

Commentaires et avis

signaler à un administrateur
Commentaire de Choumoumou le 07/07/2005 14:41:15

Pas mal, vraiment pas mal....
8/10

signaler à un administrateur
Commentaire de georges023 le 06/01/2006 00:43:30

C'est vraiment super en plus je peux l'utiliser pour un os que je suis en train d'ecrire.
Vraiment merci!!

signaler à un administrateur
Commentaire de barbichette le 06/01/2006 08:31:37

pour les fervants des langages évolués, j'ai mis en ligne :
http://www.delphifr.com/code.aspx?ID=33965
un programme pour modifier les secteurs boot des disques à partir de XP. (pour les fat12,16,32)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Disquette et secteur de BOOT [ par clem2003 ] Clem2002:Salut a tous, J'aimerai savoir comment puis-je copier mon fichier binaire dans le secteur de boot de la disquette par une commande DOS si pos logiciel boot [ par TRAX44 ] Salut, je voudrai faire booter mon pc sur un logiciel fait en asm et qui n'aurai pas besoin de windows ni de ms-dos afin d'utiliser toute la capacité algo pour jeu de shoot en asm [ par cable ] Bonjourje suis un jeune débutant en programmation en assembleur et je cherche l'algo (voir le code source) d'un jeu de shoot 'em up en scroling horizo modification de programme [ par GMib ] Bonjour, j'ai telecharger un jeu et je voudrai le modifier pour qu'il se lance en 640*480 o lieu de 800*600mon ecran ne suporte pas le 800*600 je ne p Chargement d'un noyau [ par Stormy ] Je suis en train de coder un OS simple pour comprendre le principe. Le secteur de boot est écrit comme il convient sur le premier secteur de ma disque boot sector sur image binaire [ par Sialagio ] bonjour a tousj'essaye de créer une image d'une disquette boot sans utiliser de support physique. je souhaiterais mettre un de mes progs de boot où i Probleme de boot [ par DbD ] Bonjour,Alors je fais mon OS et j'ai des problème de boot a partir d'un disquette, sur certain pc ou quand le noyau depasse 40 secteurs ca boot plus Question Asm/C++ [ par Lelys ] Bonjour,Je voudrai faire un OS, mais le problème c'est que je ne m'en sort pas en ASM...Je suis plus allese en C/C++.Mais le problème est que les syst boot [ par VBREP ] salut à tousje cherche la base de departpour creer un boot systememerci d'avance Boot / Os [ par the_best ] Qui peut m'aider ??!!:j'ai envie de faire un os mais je ne sais pas coment rendre une disquette bootale et la faire executer mon noyeau.Qui peut me t


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.