Accueil > > > BOOT PONG
BOOT PONG
Information sur la source
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
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.
Sources de la même categorie
Commentaires et avis
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
|
Derniers Blogs
VISUAL STUDIO TALK SHOW: EF4VISUAL STUDIO TALK SHOW: EF4 par Matthieu MEZIL
La semaine dernière, j'étais à Montréal pour y animer des conférences sur Entity Framework. J'en ai profité pour enregister un podcast Visual Studio Talk Show que vous pouvez retrouver ici ....(read more) ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [MIX 2010] - WINDOWS PHONE 7 EN SUPER STAR DU MICROSOFT MIX 2010 ![MIX 2010] - WINDOWS PHONE 7 EN SUPER STAR DU MICROSOFT MIX 2010 ! par redo
Me voici enfin arrivé au Microsoft Mix 2010, je dois vous avouer être arrivé un peu plus tard que d'habitude, ce qui explique que je n'ayez vu aucune info passer quant au premier keynote . certains événements sont plus importants que tout, ce qui était mo...
Cliquez pour lire la suite de l'article par redo [MIX 2010] - LIVRE GRATUIT SUR PROGRAMMER WINDOWS PHONE 7 SERIES ![MIX 2010] - LIVRE GRATUIT SUR PROGRAMMER WINDOWS PHONE 7 SERIES ! par redo
Disponible gratuitement : (153 pages) PDF Version : http://download.microsoft.com/download/7/C/8/7C820C6F-C205-4ECF-B9F3-1505DD13F9BF/ProgWinPhonePreview.pdf XPS Version : http://download.microsoft.com/download/E/3/5/E359FC51-1CF5-47F1-9BF3-74AB09D3339B/P...
Cliquez pour lire la suite de l'article par redo SQL SERVER : ESTIMER LE NOMBRE DE LIGNES RENVOYéES PAR UNE REQUêTE AVEC SQLCLRSQL SERVER : ESTIMER LE NOMBRE DE LIGNES RENVOYéES PAR UNE REQUêTE AVEC SQLCLR par christian
Dans certains cas très particuliers il peut être intéressant de savoir le nombre de ligne que va renvoyer une requête sans exécuter cette dernière. En effet les opérations de comptage sont généralement gourmande en ressource est très difficile à optim...
Cliquez pour lire la suite de l'article par christian [WF4] ACTIVITY AVEC VUE DéTAIL MASQUéE PAR DéFAUT, VIVE WPF![WF4] ACTIVITY AVEC VUE DéTAIL MASQUéE PAR DéFAUT, VIVE WPF! par JeremyJeanson
Le code suivant est destiné à répondre à une problématique courante en Workflow : Vous avez une activité dont le designer est complexe ou dont l'affichage prend une place importante à l'écran et la possibilité Collapse/Expand ne répond pas pleinement à vo...
Cliquez pour lire la suite de l'article par JeremyJeanson
Forum
RE : CSHARPRE : CSHARP par ghuysmans99
Cliquez pour lire la suite par ghuysmans99 CSHARPCSHARP par nano16
Cliquez pour lire la suite par nano16
Logiciels
Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor
|