Win3x.Org

Windows & DOS Community

Snake 8088 [en]

Répondre   Page 1 sur 2  [ 17 messages ]
Aller sur la page 1 2 »
Auteur Message
Deksor
Sujet du message : Snake 8088 [en]
Publié : 10 févr. 2020 02:20
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 4411
Inscription : 23 mai 2011 13:33
PC Rétro : 486DX 33 8mo SB Pro 2, P2 450 128mo Voodoo 2 SLI
 
Snake8088 (nom provisoire)
MS-DOS

[en] Hello everyone, here's the little personal project I'm working on at the moment to learn 16 bits x86 assembly : a "Snake" game for 8088 ! I don't think I have to tell you how to play it :D. At the moment, its control keys are the arrow keys to move, and escape to quit the game.

Done
  • The "bare" game engine (display the snake*, being able to control it, to make it grow ...)
  • Support of VGA "13h" mode
  • Support of the CGA Plantronics Colorplus graphic mode
  • The game runs at the same speed no matter which system you use**
To do
  • A configuration menu
  • A title screen
  • Obstacles to avoid
  • Support for other video cards (Tandy Graphics Adapter, maybe EGA)
  • Add sound effects and music
  • Last minute adjustments (snake's speed, maximum size, colors, etc)
* Displaying the snake depends of the graphic mode, currently only VGA and CGA Plantronics Colorplus are functional.
** For now, this causes a bug with DOS that makes the clock to run much faster than usual (nearly four times faster).

Please note that I'm still a beginner with assembly, if you see horrible mistakes, please be comprehensive :approve:. Same with Github, I'm struggling a bit sometimes ^^. However any hint to improve the code is welcome :D.

To assemble the project, please use Borland Turbo Assembler 2.02 available here.

[fr] Bonjour à tous, je vous présente mon petit projet perso sur lequel je travaille en ce moment pour apprendre l'assemblage x86 16 bits : un jeu "Snake" pour 8088 ! Je pense que je n'ai pas besoin de vous expliquer comment jouer :D. Actuellement, ses touches sont les flèches pour se diriger et échap pour quitter le jeu.

Ce qui est fait
  • Le moteur "basique" du jeu (afficher le serpent*, pouvoir le contrôler, le faire grandir ...)
  • Le support du mode "13h" du VGA
  • Le support du mode graphique CGA Plantronics Colorplus
  • Le jeu va à la même vitesse peu importe la configuration **
Ce qu'il reste à faire
  • Un menu de configuration
  • Un écran titre
  • Des obstacles à éviter
  • Le support d'autres cartes vidéo (Tandy Graphics Adapter, peut-être de l'EGA)
  • Rajouter peut-être des bruitages et de la musique
  • Quelques ajustements de dernière minute (vitesse du serpent, taille maximale et taille de départ, couleurs, etc)
* L'affichage dépend du mode graphique, pour l'instant seul le VGA et le mode CGA Plantronics Colorplus sont fonctionnels.
** Pour l'instant, cela induit un bug avec DOS qui fait que l'horloge du système va avancer beaucoup plus vite que la normale (presque quatre fois plus vite).

Sachez cependant que je suis encore débutant avec l'assemblage, si vous voyez des horreurs, soyez un peu indulgent s'il-vous plaît :approve: . De même avec Github, j'ai parfois encore un peu de mal ^^. Néanmoins, les conseils pour améliorer le code sont les bienvenus :D.

Pour assembler le projet, utilisez Borland Turbo Assembler 2.02 disponible ici.

Screenshot (Capture d'écran)
Alpha 0.1 Mode Plantronics Colorplus

Download (Téléchargement)
Le projet sur Github

_________________

Laptop hater


Haut
Profil Citer
Joet BERNARD
Sujet du message : Re: Snake 8088 [en]
Publié : 10 févr. 2020 06:58
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 842
Inscription : 19 mars 2016 20:33
PC Rétro : Pentium 4 1,5 GHz, 512 Mo de RAM, FX 5200
 
Un système de vie :mrgreen:
Plusieurs fruit différents (couleurs de pixels différents comme jaune pour une banane par exemple) qui peuvent disparaître au bout d'un moment
Un système de point (manger une pomme +1 et une banane +2 par exemple)
Et pourquoi pas un système de temps limite pour manger un fruit :mrred: réinitialisé bien sûr après avoir avalé un fruit :mrblue:

_________________

Accueil de mon Index Micso
WINJOY hors-ligne (actuellement en version (4) "Alpha")
Accueil en ligne de WINJOY (actuellement en version "Alpha")
Ma collection au complet


Haut
Profil Citer
Deksor
Sujet du message : Re: Snake 8088 [en]
Publié : 10 févr. 2020 09:41
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 4411
Inscription : 23 mai 2011 13:33
PC Rétro : 486DX 33 8mo SB Pro 2, P2 450 128mo Voodoo 2 SLI
 
N'oublies pas que je suis limité à 16 couleurs dans les modes CGA, et qu'il y a déjà une couleur pour le fond, une couleur pour le serpent, qu'il y en aura une pour les murs ... Avec une pastille on a déjà 1/4 des couleurs qui sont prises ^^
C'est pas impossible à faire mais il y a quand même une limite.

Les points c'est prévu (dans le code tu verras qu'il y a une variable "score" ^^).

Le temps limite pour manger le fruit c'est faisable mais ça pourrait potentiellement demander beaucoup de temps CPU et ça sous-entend de faire un tableau contenant tous les fruits ^^ (il faut stocker la position du fruit, le temps restant et ensuite à chaque boucle, décrémenter le compteur de chaque fruit dans la liste et s'il vaut zéro, le supprimer. Pour avoir fait quelque-chose de similaire, je peux dire que le 8088 en prends un coup ^^)

_________________

Laptop hater


Haut
Profil Citer
Joet BERNARD
Sujet du message : Re: Snake 8088 [en]
Publié : 10 févr. 2020 10:32
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 842
Inscription : 19 mars 2016 20:33
PC Rétro : Pentium 4 1,5 GHz, 512 Mo de RAM, FX 5200
 
Je propose pas non plus d'y incorporer tous les fruits, déja 5 je trouve que cest très bien, et la palette CGA sera pas entièrement utilisée :D
La plupart des Snake que j'ai hjoué n'avais que des pommes... J'y ai joué sur un peu tout, comme sur un Nokia 2680 :mrred: :mrred: :mrred:
D'ailleurs tout ce que j'ai dis précedement n'est qu'un mix de mes différentes expériences.
Pour l'instant je voit pas de code mais je suis impatient de pouvoir l'essayer avec PCem :mrblue: :mrblue:

Et peut être en virant les couleurs avoir un support MDA mais la ca va annuler l'idée de plusieurs fruits :? :?

_________________

Accueil de mon Index Micso
WINJOY hors-ligne (actuellement en version (4) "Alpha")
Accueil en ligne de WINJOY (actuellement en version "Alpha")
Ma collection au complet


Haut
Profil Citer
Deksor
Sujet du message : Re: Snake 8088 [en]
Publié : 10 févr. 2020 11:00
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 4411
Inscription : 23 mai 2011 13:33
PC Rétro : 486DX 33 8mo SB Pro 2, P2 450 128mo Voodoo 2 SLI
 
Il faut aller dans la branche dev sur GitHub.
Je ne compte pas supporter le mode MDA pour la simple raison que ce n'est à l'origine qu'un mode texte. Pour adresser des pixels, il faut une carte hercules (ou un clone). Et le manque de couleurs compromet le fonctionnement du programme. (Il faudrait que j'en revienne à stocker l'emplacement de tout dans la RAM et à chaque cycle vérifier les collisions de tout, ce qui est beaucoup plus lent.)

_________________

Laptop hater


Haut
Profil Citer
Joet BERNARD
Sujet du message : Re: Snake 8088 [en]
Publié : 10 févr. 2020 15:56
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 842
Inscription : 19 mars 2016 20:33
PC Rétro : Pentium 4 1,5 GHz, 512 Mo de RAM, FX 5200
 
J'ai un peu galéré a installé Borland TP 2.02 sous PCem (j'ai du relancer l'installation plusieurs fois, 1/ le programme ne peu pas s'installer avec 128ko de RAM -> il lui était impossible d'utiliser UNZIP... 2/ l'installation a dû planter au niveau de TLINK et j'ai mis au moins 15min a me décider a réinstaller BTP, enfin, tout MS-DOS et BTP après... :? ) mais j'ai réussi à compiler SNAKE :D
Il fonctionne bien et est très réactif quelque soit la configuration que j'ai mis dans PCem (avec bien sûr une carte VGA) : 486 DX4 75 avec 16Mo de RAM (bien au delà du minimum je sais :lol: ) puis 8088 4,77 et 128 ko de RAM.
J'ai aussi essayé de manipuler la carte graphique (EGA, CGA et j'ai aussi essayé MDA :D ) sans succès évidemment...
Ce que j'ai pu remarquer c'est que les fruits ne font qu'un pixel sur un pixel et que si je suis un seul pixel au dessus bah je peux pas prendre le fruit, surtout qu'il est assez rapide ce serpent quand même !! (Malgré avoir maltraité la config, aucun changement...)

J'ai même essayé de ralentir la machine avec AT-SLOW mais là j'ai pas eu le temps de comprendre son fonctionnement :| je devais aller en cours
Et puis je comprends maintenant (après avoir lu le readme) pourquoi il semblait bloqué sur une phrase : c'est qu'il a été testé que sur un PC-AT en 286 minimum et mettrais apparemment plus d'une minute a calibrer la vitesse...

_________________

Accueil de mon Index Micso
WINJOY hors-ligne (actuellement en version (4) "Alpha")
Accueil en ligne de WINJOY (actuellement en version "Alpha")
Ma collection au complet


Haut
Profil Citer
Deksor
Sujet du message : Re: Snake 8088 [en]
Publié : 10 févr. 2020 16:34
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 4411
Inscription : 23 mai 2011 13:33
PC Rétro : 486DX 33 8mo SB Pro 2, P2 450 128mo Voodoo 2 SLI
 
AT-Slow ne fonctionnera pas.
Ce que j'ai fait en fait : il y a une "horloge" dans les pc qui est rafraîchie tous les 18,2Hz. Moi je l'ai modifiée pour aller à 60Hz environ. Donc, à chaque "tick" de l'horloge, soit 60 fois par seconde, mon programme fais l'affichage, la lecture du clavier, etc.

Cela veut dire que si tu veux ralentir le jeu, sauf à avoir un pc extrêmement lent (perso j'ai essayé dans dosbox, pour avoir un vrai ralentissement, il a fallu que je descende à ... 3cycles par seconde :lol: ) il faut s'y prendre autrement.
Soit tu peux changer la fréquence de l'horloge, soit tu peux faire en sorte que le déclanchement ne se produit qu'une fois sur deux (le serpent sera alors 2x plus lent).

Je te dirais quelle valeur il faut changer pour changer la vitesse du jeu quand je serais rentré chez moi.

Edit : vas voir à la ligne 213, sous le commentaire "19886 = 60hz",
Vois-tu "mov bx, 4daeh" ?
Déjà 19886 = 4dae en hexa. Pourquoi cette valeur ?
Si l'on se fie à la doc ici : http://lacl.univ-paris12.fr/cegielski/bios/ch8.pdf (surtout la page 10) l'horloge fonctionne ainsi : il y a une fréquence de base de 1.193MHz, et ce qui est dans BX, c'est combien de fois on la divise. 1.193MHz / 19886 ~= 60Hz :D
Si tu veux un snake plus lent, il faudra augmenter ce nombre. (J'aurais dû en faire une constante comme les autres, je corrigerai ça prochainement certainement).

_________________

Laptop hater


Haut
Profil Citer
Joet BERNARD
Sujet du message : Re: Snake 8088 [en]
Publié : 10 févr. 2020 17:35
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 842
Inscription : 19 mars 2016 20:33
PC Rétro : Pentium 4 1,5 GHz, 512 Mo de RAM, FX 5200
 
On peut dire que l'affichage "s'actualise" 60 fois par seconde c'est ça ? Donc oui fait augmenter cette valeur pour avoir un jeu plus lent et donc plus facile a jouer avec des cibles si petites
Je vais essayer :D
Convertir un valeur décimale en hexa est un jeux d'enfant car 1/ c'est ce que fait en science de l'ingénieur au lycée (presque) en ce moment 2/ ma calculatrice peu très bien faite cette conversion :D

Essaye la valeur 39766 (9b56) pour SNAKE, c'est a peu près la moitié que la valeur par défaut pour avoir 30 Hz
Plus précisément c'est ta valeur - 3 (pour se rapproche le plus possible de 60 Hz) puis x 2 (pour trouver a peu près 30 Hz). Le peu que j'ai testé avec DOSBox sur Android (par très pratique mais que ça sous la main a cette heure ci) ça a l'air tellement plus jouable !!! J'ai battu mon score de tout à l'heure sur PC avec la valeur par défaut :lol:

Dernière modification par Joet BERNARD le 10 févr. 2020 19:28, modifié 1 fois.

_________________

Accueil de mon Index Micso
WINJOY hors-ligne (actuellement en version (4) "Alpha")
Accueil en ligne de WINJOY (actuellement en version "Alpha")
Ma collection au complet


Haut
Profil Citer
Deksor
Sujet du message : Re: Snake 8088 [en]
Publié : 10 févr. 2020 19:26
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 4411
Inscription : 23 mai 2011 13:33
PC Rétro : 486DX 33 8mo SB Pro 2, P2 450 128mo Voodoo 2 SLI
 
D'ailleurs la manipulation de cette horloge est la raison même du fait que l'horloge de DOS déraille après, car DOS s'en sert aussi pour calculer l'heure ^^
Faudra que je corrige l'heure quand le programme est quitté, mais en attendant c'est pas un gros soucis.

J'aurais pu aussi me baser sur le taux de rafraîchissement de l'écran, sauf que le VGA en mode 13h vas à 70Hz, tandis que le CGA vas à 60Hz. En gros mon jeu aurait eu le même problème que les jeux en version PAL et NTSC à l'époque, sauf que là c'est sur la même machine exactement :lol:.

_________________

Laptop hater


Haut
Profil Citer
Deksor
Sujet du message : Re: Snake 8088 [en]
Publié : 11 févr. 2020 00:26
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 4411
Inscription : 23 mai 2011 13:33
PC Rétro : 486DX 33 8mo SB Pro 2, P2 450 128mo Voodoo 2 SLI
 
Mise à jour !

J'ai réussi à faire supporter le mode Plantronics Colorplus ! :D
Pour ceux qui voudraient l'utiliser actuellement, il faut aller au tout début du programme, peu après "main proc near", il y a normalement
mov al, VGA_MODE
mov videoMode, al
À la place, mettez
mov al, PLANTRONICS_MODE
mov videoMode, al
et c'est tout :D

J'ai aussi ralenti le serpent, mais pas exactement à 30Hz. Je l'ai ralenti à 36.4Hz. Si vous comptez bien vous aurez remarqué qu'il s'agit là de la fréquence de DOS doublée :P

Ça devrait simplifier les calculs à la fin du programme pour remettre le bon temps dans l'horloge de DOS.

_________________

Laptop hater


Haut
Profil Citer
Joet BERNARD
Sujet du message : Re: Snake 8088 [en]
Publié : 12 févr. 2020 09:47
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 842
Inscription : 19 mars 2016 20:33
PC Rétro : Pentium 4 1,5 GHz, 512 Mo de RAM, FX 5200
 
Le mode Platronics à l'air de fonctionner partiellement avec une carte CGA classique (enfin émulée par PCem) :
[ img ]
Le soucis c'est que quand je mange une pomme, le jeu réagit comme si j'avais appuyé sur Echap.

Par contre aucune embuche avec une carte EGA (et cest logique puisque Platronics est lié à CGA) :
[ img ]

J'ai l'impression que les couleurs difèrent un peu du VGA et pourtant les palettes doivent être (quasi) identiques:
[ img ]

J'ai pas de carte Platronics pour tester. Pas grave, PCem offre quand même pas mal de possibilités ! :D
Rééctification ! PCem est capable d'émuler une ColorPlus :shock: Voilà le résultat :
[ img ]
En plus c'est joli comme ça :D :D :D

Et en fait, c'est bien plus jouable en 36 Hz qu'en 60 !

_________________

Accueil de mon Index Micso
WINJOY hors-ligne (actuellement en version (4) "Alpha")
Accueil en ligne de WINJOY (actuellement en version "Alpha")
Ma collection au complet


Haut
Profil Citer
Deksor
Sujet du message : Re: Snake 8088 [en]
Publié : 12 févr. 2020 11:25
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 4411
Inscription : 23 mai 2011 13:33
PC Rétro : 486DX 33 8mo SB Pro 2, P2 450 128mo Voodoo 2 SLI
 
Je pense que le jeu était jouable en mode plantronics sur une carte CGA jusqu'à ce que tu manges une pomme car le jeu essaie de lire dans la RAM de l'écran, sauf que le cga a 16ko de ram, et le mode plantronics en a 32, donc ça lis dans une zone de la RAM qui n'existe pas et ça doit détecter que pomme = morceau du corps, du coup le jeu se termine ^^

Quand à la palette, le VGA a une palette de couleurs de base bien plus étoffée que le mode plantronics (16 couleurs contre 256), et mieux encore, en VGA chacune de ces couleurs peut être reprogrammée pour utiliser une couleur codée sur 18 bits tandis qu'en CGA (mode plantronics et tandy compris), c'est toujours les mêmes 16 couleurs et rien d'autre.

_________________

Laptop hater


Haut
Profil Citer
gm86
Sujet du message : Re: Snake 8088 [en]
Publié : 23 févr. 2020 12:04
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 595
Inscription : 01 sept. 2008 19:07
 
Les points apparaissent aléatoirement dans le temps : 1 , 2, 3 ou même aucun !

Se baser sur l'horloge pour simuler le hasard me fait penser à l'instruction RANDOMIZE TIMER du GW-BASIC. Rendre le code configurable pour diverses cartes vidéo est une bonne chose. C'est du travail de tout faire en assembleur...

Deux petits conseils :
- OR AX,AX permet de tester le signe ou la nullité du registre AX ;
- la macro qui renvoie le signe du registre AX peut se simplifier par AND AX,8000h et ROL AX,1 tout en restant moins efficace que :
	complementAx macro
		SBB AX,AX
		NEG AX
	endm

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
Deksor
Sujet du message : Re: Snake 8088 [en]
Publié : 23 févr. 2020 12:31
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 4411
Inscription : 23 mai 2011 13:33
PC Rétro : 486DX 33 8mo SB Pro 2, P2 450 128mo Voodoo 2 SLI
 
Merci, ceci dit ça servait pour ma fonction de dessin de lignes qui est la traduction en assembleur (par moi-même) de la fonction que l'on trouve ici : http://www.brackeen.com/vga/shapes.html

Mais bon c'est toujours pratique de savoir ça, je pourrais m'en resservir une autre fois peut-être :D

En ce moment j'essaie de faire fonctionner le mode TGA, mais je galère à calculer le bon décalage en recyclant le code qui calcule le décalage pour le mode plantronics (le mode plantronics c'est comme deux cartes CGA mises côte à côte qui contrôlent chacune deux bits d'un pixel. Le mode TGA c'est 4 bits par pixels à la suite les uns des autres)

Pour l'aléatoire ce qui me gêne c'est que je ne le trouve pas assez aléatoire, car je peux souvent voir des points apparaître avec une même coordonnée X mais à des hauteurs différentes. Quand on "joue le jeu" ça n'y paraît pas, mais quand on arrête de manger un moment ça se voit.

_________________

Laptop hater


Haut
Profil Citer
gm86
Sujet du message : Re: Snake 8088 [en]
Publié : 23 févr. 2020 16:08
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 595
Inscription : 01 sept. 2008 19:07
 
L'horloge ne devrait servir qu'à initialiser la longue liste de nombres pseudo-aléatoires. On peut trouver de l'aide dans le fichier 45\RUNTIME\RT\RANDOM.BAS du code source de MS-DOS 6.0 :
www.nurs.or.jp/~nnn/MS-DOS.6.0.Source.Code.zip

Il s'agit de l'instruction RANDOMIZE et de la fonction RND. Microsoft en propose l'alternative :
https://www.pcjs.org/pubs/pc/reference/ ... kb/Q28150/
Des améliorations sont possibles :
https://link.springer.com/content/pdf/1 ... 203835.pdf
Mais notre sujet n'est pas à propos de QuickBASIC.


Revenant à la routine RND de RANDOM.BAS, il suffit de ne pas convertir l'entier 24 bits en nombre à virgule flottante. Il faudra ensuite le diviser par la coordonnée maximale de l'écran et garder le reste. Je n'ai pas d'exemple de division 32 bits sous la main, mais la multiplication de ce programme didactique peut aider :
; Demande l'entrée d'un nombre entier décimal pouvant être stocké dans un
; double-mot signé de 32 bits.
; Assemblage :
;       MASM    DEC2HEX;
;       LINK    DEC2HEX;
;       EXE2BIN DEC2HEX DEC2HEX.COM
 
 
CGROUP  GROUP   CODE, DATA?
 
 
LgNombre        equ     11
 
 
CODE    SEGMENT
        ASSUME  CS:CODE, DS:CGROUP
        ORG     100h
 
Depart:
        mov     Somme,0                 ; Initialise le double-mot Somme
        mov     Somme+2,0
        mov     ah,9                    ; Affiche message
        mov     dx,offset MsgEntree
        int     21h
        mov     ah,0Ah                  ; Attend entrée
        mov     dx,offset TeteTampon
        int     21h
        call    LireDecimalSgn
        or      ax,ax
        jz      Sortie                  ; Si pas d'erreur, sortie hexa
        js      Err_debord
        mov     ah,9                    ; Erreur de frappe
        mov     dx,offset MsgTypo
        int     21h
        jmp     Depart                  ; Recommencez entrée
Err_debord:
        mov     ah,9                    ; Erreur de débordement
        mov     dx,offset MsgDebord
        int     21h
        jmp     Depart                  ; Recommencez entrée
Sortie:
        mov     ah,9
        mov     dx,offset MsgSortie
        int     21h
        std                             ; Direction : décrémentation
        mov     cx,4                    ; Double-mot (4 octets)
        mov     si,offset ds:Somme+3    ; Octet de poids fort
Affiche_octet:
        lodsb                           ; AL = DS:[SI]  et  DEC SI
        call    AfficheHexa             ; Affiche les 2 chiffres hexa
        loop    Affiche_octet
Fin:
        ret                             ; Fin
 
LireDecimalSgn  PROC
; Lit le nombre décimal dans la chaîne Tampon avant de le traduire dans le
; double-mot Somme.
; Entrée :      DS:SI   pointe la chaîne dont le 1er octet donne le nb de car.
; Sortie :      AX= 0, aucune erreur
;               AX= 1, erreur de frappe
;               AX=-1, erreur de débordement
; Lit :         Tampon
;               [1er car. : nb de car. (éventuel sgn "-" puis chiffres)]
; Ecrit :       Somme (double-mot)
; Procédure utilisée :  PuissDix
        push    bx
        push    cx
        push    dx
        push    si
        pushf                           ; sauve le registre d'état car CLD
 
        cld                             ; Direction : incrémentation
        xor     ch,ch                   ; CH = 0
        mov     cl,Tampon               ; Nb de caractères
        mov     si,offset ds:Tampon+1   ; DS:SI pointe le premier caractère
        cmp     byte ptr [si],'-'       ; Négatif ?
        jne     Boucle
        dec     cx                      ; Nombres de chiffres si négatif
        inc     si                      ; Pointe le premier chiffre
Boucle:
        lodsb                           ; AL = DS:[SI]  et  INC SI
        cmp     al,'0'
        jb      Err_typo
        cmp     al,'9'
        ja      Err_typo
        sub     al,'0'                  ; Valeur du chiffre dans AL
 
        xor     ah,ah                   ; AH = 0
        xor     dx,dx                   ; DX = 0
        dec     cx                      ; Exposant = compteur - 1
        call    PuissDix                ; DX:AX = (DX:AX).10^CX
        jc      Err_debord1             ; Erreur ?
        or      dx,dx
        js      Err_debord1             ; Nb négatif ?
        inc     cx
 
        add     Somme,ax                ; Addition des mots de poids faible
        adc     Somme+2,dx              ; Add. avec retenue des mots de pds fort
        jc      Err_debord1             ; Retenue ?
        jo      Err_debord2             ; Débordement ?
        loop    Boucle                  ; Déc. CX et recommence si non nul
 
        cmp     Tampon+1,'-'            ; Rendre négatif ?
        jne     Retour_bon
        neg     Somme                   ; Complément à 2 du mot de poids faible
        adc     Somme+2,0               ; Si poids faible nul, complément à 2
        neg     Somme+2                 ; du mot de poids fort ; sinon à 1.
Retour_bon:
        xor     ax,ax
        popf
Retour_mauvais:
        pop     si
        pop     dx
        pop     cx
        pop     bx
        ret
Err_typo:
        mov     ax,1
        jmp     short Erreur
Err_debord2:
        cmp     word ptr Somme,0
        jne     Err_debord1
        cmp     word ptr Somme+2,8000h
        jne     Err_debord1
        cmp     Tampon+1,'-'
        je      Retour_bon              ; Plus petit nombre possible
Err_debord1:
        mov     ax,-1
Erreur:
        popf
        jmp     Retour_mauvais
 
LireDecimalSgn  ENDP
 
PuissDix        PROC
; Stocke (DX:AX).10^CX dans DX:AX
; Entrée :      DX:AX   multiple
;               CX      exposant
; Sortie :      Si bit de retenue effacé,
;               DX:AX   résultat de AL fois 10 puissance CX
;               Si bit de retenue positionné, erreur de débordement.
        push    bx
        push    cx
        push    si
        push    di
 
        jcxz    Ret_PuissDix            ; Si CX nul, retour
        mov     bx,10                   ; BX : multiplicateur 10
        mov     si,dx                   ; SI <- poids fort
FoisDix:
        xchg    di,ax                   ; DI <- poids faible
        xchg    ax,si                   ; AX <- poids fort
        mul     bx                      ; DX:AX (poids fort) = AX x 10
        or      dx,dx                   ; DX nul ?
        jnz     Debordement             ; Si non, erreur (32 bits insuff.)
        xchg    si,ax                   ; SI <- poids fort
        xchg    ax,di                   ; AX <- poids faible
        mul     bx
        add     si,dx                   ; Retenue dans le poids fort
        loop    FoisDix
 
        mov     dx,si                   ; DX <- poids fort
        clc                             ; CF = 0
Ret_PuissDix:
        pop     di
        pop     si
        pop     cx
        pop     bx
        ret
Debordement:
        stc                             ; CF = 1
        jmp     Ret_PuissDix
PuissDix        ENDP
 
AfficheHexa     PROC
; Affiche l'octet an AL sous forme de 2 chiffres hexa.
; Entrée :      AL      octet à afficher
; Procédure utilisée :  SortChiffreHexa
        push    ax
        push    cx
 
        mov     ah,al                   ; Sauve AL dans AH
        mov     cl,4
        shr     al,cl                   ; AL : quartet de poids fort
        call    SortChiffreHexa
        mov     al,ah                   ; Restitue AL
        and     al,0Fh                  ; AL : quartet de poids faible
        call    SortChiffreHexa
 
        pop     cx
        pop     ax
        ret
AfficheHexa     ENDP
 
SortChiffreHexa PROC
; Affiche un chiffre hexa stocké dans AL.
; Entrée :      AL      chiffre hexa
        push    ax
        push    dx
                                        ; Ex. : 0A      |       00
        cmp     al,10                   ;       0A      |       00(CF=1)
        sbb     al,69h                  ;   (FF)A1      |   (FF)96
        das                             ;       41(CF=1)|       30(CF=1)
        xchg    dx,ax                   ; DL <- AL
        mov     ah,2                    ; Affiche caractère
        int     21h
 
        pop     dx
        pop     ax
        ret
SortChiffreHexa ENDP
 
; Données -------------------------------------------------------------------
 
MsgEntree       db      13,10,'Entier décimal à convertir :',13,10,'$'
MsgTypo         db      13,10,'Caractères autres que les chiffres et le signe '
                db      '"-" refusés. Recommencez.$'
MsgDebord       db      13,10,'Nombre hors limites. Recommencez.$'
MsgSortie       db      13,10,"L'équivalent hexadécimal est :",13,10,'$'
 
; Donne le nombre d'octets nécessaire à l'entrée du nombre pour DOS
TeteTampon      db      LgNombre+1      ; Précède Tampon
 
CODE    ENDS
 
DATA?   SEGMENT BYTE
 
; Prend en compte l'enregistrement de la touche Entrée (car. 13)
Tampon          db      LgNombre+2 dup(?) ; Suit TeteTampon
 
Somme           dw      2 dup(?)
 
DATA?   ENDS
 
        END     Depart
DX:AX est le nombre 32 bits, l'opérateur de l'opération est obligatoirement un nombre 16 bits (autre registre ou WORD PTR).


Quant au dessin de lignes horizontales et verticales, Richard Wilton se serait emporté :
Citation :
Mais est ce que j'ai droit à un peu de respect ? Est ce que je sens un peu d'amitié ? Est ce qui vous vient l'idée de m'appeler Parrain ?
Pourquoi s'embêter avec l'algorithme de Bresenham ? Les listings 6.5 et 6.9 de cette disquette l'expose en assembleur pour la carte CGA et les circuits MCGA et VGA, avec comme cas particuliers les parallèles à x & y. En effet, le livre l'accompagnant promet un gain de temps d'un facteur 10 pour les horizontales et 25 pour les verticales.

_________________

C:\ONGRTLNS.W95


Haut
Profil Citer
Deksor
Sujet du message : Re: Snake 8088 [en]
Publié : 23 févr. 2020 17:13
Modérateur
Avatar de l’utilisateur
Hors-ligne
 
Messages : 4411
Inscription : 23 mai 2011 13:33
PC Rétro : 486DX 33 8mo SB Pro 2, P2 450 128mo Voodoo 2 SLI
 
Ah mais ce n'est qu'un reste d'un ancien test qui n'a rien à voir avec le Snake ^^. À vrai dire je ne compte pas dessiner quoi que ce soit d'oblique dans ce jeu, donc je n'ai pas besoin de cette fonction. Je mettrai sûrement une fonction pour dessiner des lignes horizontales ou verticales pour faire des murs en revanche.

_________________

Laptop hater


Haut
Profil Citer
Afficher : Trier par : Ordre :
Répondre   Page 1 sur 2  [ 17 messages ]
Revenir à « Projets en cours » | Aller sur la page 1 2 »
Aller :