Win3x.Org

Windows & DOS Community

Snake 8088 [en]

Répondre   Page 2 sur 2  [ 17 messages ]
Aller sur la page « 1 2
Auteur Message
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 : 1279
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 de sites
WINJOY hors-ligne (actuellement en version (4) "Alpha")
Accueil en ligne de WINJOY (actuellement en version (5) "Beta")
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 : 4874
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 : 630
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 :
	complementAx macro
		AND AX,8000h
		ROL AX,1
	endm
EDIT : je préfère SHL AX,1 et SBB AX,AX qui renvoie -1 au lieu de 1 si AX est négatif.

Dernière modification par gm86 le 01 mars 2020 21:05, modifié 1 fois.

_________________

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 : 4874
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 : 630
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 :
http://www.pcjs.org/pubs/pc/reference/ ... kb/Q28150/
Des améliorations sont possibles :
http://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 : 4874
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
gm86
Sujet du message : Re: Snake 8088 [en]
Publié : 23 févr. 2020 17:58
Membre inscrit
Avatar de l’utilisateur
Hors-ligne
 
Messages : 630
Inscription : 01 sept. 2008 19:07
 
C'est pour ça qu'il ne faut s'intéresser qu'aux cas particuliers des listings donnés, donc les épurer de l'oblicité (Bresenham). D'ailleurs, ils dépendent des listings 5-11 et 5-17 pour l'adressage des pixels.

Il ne faut pas s'arrêter en si bon chemin. Il suffit de voir comment sont traités les extrémités d'une horizontale (octets incomplets) et le reste de la droite (REP STOSB), ainsi que l'incrémentation de l'adressage d'une verticale.


P.S. : Richard Wilton (encore lui) et Peter Norton disent, dans le guide éponyme, que le BASIC pour PC a une solution pour l'horloge du DOS... Quand il rend le timer quatre plus rapide pour les besoins de la tempo de PLAY, il détourne l'interruption 8 tout en appelant l'ancienne routine du BIOS une fois sur quatre. Ainsi, l'écoulement du temps n'est pas modifié !

_________________

C:\ONGRTLNS.W95


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