Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2395 connectés 

 

Sujet(s) à lire :
    - Article: un raytracer de base en C++
 

 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
Auteur Sujet :

La programmation d'effets de demos old-school (Assembleur + C)

n°1660547
bjone
Insert booze to continue
Posté le 19-12-2007 à 11:15:43  profilanswer
 

Reprise du message précédent :

dap++ a écrit :


J'aurais bien essayé de recompiler mais mon disque dur a décider de lâcher hier. :sweat: Sinon il y un moyen simple pour utiliser un DOS extender en assembleur ?


 
y'a un stub a lier qui peut intégrer le dos-extender.
 
sous Dosbox, j'ai peur que ça ne puisse pas marcher.
Doom ou DN3D ça marche sous dosbox ?
 
regarde PMODE, c'était mon dos-extender préféré. (déjà il s'initialisait plus vite que dos4g)

Message cité 1 fois
Message édité par bjone le 19-12-2007 à 11:16:34
mood
Publicité
Posté le 19-12-2007 à 11:15:43  profilanswer
 

n°1660550
dap++
Script kiddie
Posté le 19-12-2007 à 11:19:09  profilanswer
 

FlorentG a écrit :

C'est dès lors qu'il faut faire de l'adressage style [machin + eax]. Si je met juste ax, fasm veut pas compiler.


En 16bit il faut utiliser si, si, bx ou bp pour adresser. Si tu n'écris pas le registre de segment que tu veux utiliser ce sera ss pour bp et ds pour les autres.


---------------
dap.developpez.com
n°1660594
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 19-12-2007 à 12:08:55  profilanswer
 

bjone a écrit :


 
y'a un stub a lier qui peut intégrer le dos-extender.
 
sous Dosbox, j'ai peur que ça ne puisse pas marcher.
Doom ou DN3D ça marche sous dosbox ?


si si, et Doom, DN3D et autres Redneck Rampage fonctionnent parfaitement avec une fluidité remarquable :jap:

n°1660648
bjone
Insert booze to continue
Posté le 19-12-2007 à 14:40:02  profilanswer
 

bon bah c'est farpait alors :) (t'as pas cité Blood caymale)


Message édité par bjone le 19-12-2007 à 14:40:17
n°1662595
FlorentG
Unité de Masse
Posté le 23-12-2007 à 15:03:46  profilanswer
 

Bon, ça fait 3 heures que je cherche, sans trouver.
 
Est-ce que quelqu'un a quelque chose permettant de profiler mon truc ? Y'a une énorme différence de perfs entre la version normalle, et la version double-bufferisée (ça va du simple au double)...

n°1662601
FlorentG
Unité de Masse
Posté le 23-12-2007 à 15:28:23  profilanswer
 

Bon c'est bon, c'est à peu près résolu.

 

Pour copier le buffer dans la mémoire vidéo, j'utilisais ça :

Code :
  1. mov cx, 64000
  2. rep movs byte [di], [si]


Avec es: di qui pointe sur la mémoire vidéo, et ds:si sur le buffer. C'est évidemment totalement naze, parce que je copie octet par octet... alors qu'on peut copier dword par dword direct :

Code :
  1. mov cx, 16000
  2. rep movsd


Et ça marche tout de suite mieux


Message édité par FlorentG le 23-12-2007 à 15:28:36
n°1662626
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-12-2007 à 17:06:05  profilanswer
 

et avec du mmx, tu peux même copier 8 octets à la fois [:jar jar]

n°1662629
FlorentG
Unité de Masse
Posté le 23-12-2007 à 17:13:58  profilanswer
 

Ouais j'ai vu sur le forum de fasm, on peut doubler voire tripler les perfs

n°1662633
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-12-2007 à 17:23:03  profilanswer
 

le top, c'est d'utiliser la FPU pour effacer l'écran :D

n°1662642
FlorentG
Unité de Masse
Posté le 23-12-2007 à 18:07:11  profilanswer
 

[:pingouino]
 
Sinon, t'aurais pas un chouette profiler, là ? [:dawa]

mood
Publicité
Posté le 23-12-2007 à 18:07:11  profilanswer
 

n°1662706
dap++
Script kiddie
Posté le 23-12-2007 à 23:01:07  profilanswer
 

Pour optimiser du code natif : http://smallcode.weblogs.us/2007/1 [...] ith-rdtsc/
Mais en 16 bits ça ne donnera rien.
 
Je viens de refaire le starfield en 241 octets : http://pastie.caboo.se/131935
Ca ne marcherait pas d'augmenter l'abscisse de l'étoile même quand ça la fait sauter à la ligne suivante et de rajouter des étoiles en à gauche régulièrement ?
J'ai fait une version où à la place de l'ordonnée je stocke directement l'adresse de la ligne, ça marche aussi bien. :)


---------------
dap.developpez.com
n°1743291
antsite
Je me souviens
Posté le 09-06-2008 à 06:33:26  profilanswer
 

Salut,
 
Je me passionne depuis quelques jours pour ce topic d'Harkonnen sur les demos assembleur et j'ai donc entrepris d'ecrire quelques lignes en suivant quelque peu la progression du topic.
J'ai d'ailleurs pas mal suivi dans un premier temps les posts de la page precedente car je ne fais que de l'asm (avec FASM) sans C. Pour le fun ! Et c'est fun !
 
J'ai fait mon point a l'ecran, ensuite je l'ai fait se deplacer, ensuite en synchro avec le VBL pas de souci ! Me voila rendu au double buffering et c'est la que j'ai un souci.
 
Voici le code tout simple pour ecrire un point dans le buffer et switch ensuite tout le buffer dans la memoire video (A000h).
 
 

Code :
  1. org 100h ; DOS 16bits .com binary file
  2.         mov ax, 13h ; mode 13h
  3.         int 10h ; qu'on met pour le mode video
  4.         ; couleur
  5.         mov dx, 3c8h ; modification palette
  6.             mov al, 0 ; de la couleur idx=0 (= background)
  7.             out dx, al
  8.             mov dx, 3c9h ; on envoie les r g b successifs
  9.             mov al, 0
  10.             out dx, al ; red = 0
  11.             out dx, al ; green same
  12.             out dx, al ; blue same
  13.         ; calcul & ecriture dans buffer
  14.         mov ax, 320 ; taille d'une ligne
  15.         mov cx, 15 ; y = 15
  16.         mul cx ; ax = ax * cx
  17.         add ax, 20 ; x = 20
  18.         mov bx, ax
  19.         mov [memB + bx * 1], 30 ; 1 = sizeof(char)
  20.         ; *** BitBlt - from ds:si to es:di, repete cx fois
  21.         cld ;clear write direction
  22.         mov cx, 64000 / 4 ;how many dwords (=4bytes, ie 64000/4)
  23.         mov si, WORD [memB] ;source = DS:[memB]
  24.         mov ax, 0A000h
  25.         mov es, ax
  26.         xor di, di ;target = A000:0000
  27.         rep movsd
  28.         ; wait keypress
  29.         mov ah, 00h
  30.         int 16h
  31.         ; reset video
  32.         mov ax, 0003h
  33.         int 10h
  34.         ret
  35. ;Global Variables
  36. memB db 64000 dup (0) ;double buffering: 320x200


 
Le probleme est le suivant : le "blit" buffer -> ecran se passe mal, je suis quasiment sur que c'est la source du blit qui est erronee (le resultat est presque correct sauf tout en haut (=au debut du tampon) une ligne de couleurs incoherente).
 
A mon avis c'est parce que pour faire le movsd, la source requise est de la forme ds:si, si est bon je pense, mais ds ne semble pas pointer au bon endroit (d'ou le resultat pas tout a fait correct)
ds est cense pointe sur le segment des donnees, et donc ds:[memB] est cense pointe sur mon buffer.
 
Avez-vous une idee du probleme ?
Si qqn peut "corriger" et me donner des ameliorations sur mon code il est le bienvenu aussi.
Est-ce la bonne facon de declarer un buffer pour double buffering ?
 
merci


Message édité par antsite le 09-06-2008 à 06:39:27
n°1743563
bjone
Insert booze to continue
Posté le 09-06-2008 à 16:41:11  profilanswer
 

il te manque un: (en début de code)
push cs
pop ds
 
ou
 
mov ax,cs
mov ds,ax
 
pour mettre le segment de donné sur le segment de code. (.com)

Message cité 1 fois
Message édité par bjone le 09-06-2008 à 16:41:49
n°1743912
antsite
Je me souviens
Posté le 10-06-2008 à 01:54:11  profilanswer
 

bjone a écrit :

il te manque un: (en début de code)
push cs
pop ds
 
ou
 
mov ax,cs
mov ds,ax
 
pour mettre le segment de donné sur le segment de code. (.com)


 
Je l'ai mis juste apres le org 100h et ca ne change malheureusement rien.
J'ai bien compris l'idee mais ca ne marche pas!  :(

n°1743913
bjone
Insert booze to continue
Posté le 10-06-2008 à 02:22:30  profilanswer
 

mov si, WORD [memB]
 
plustôt en:
mov si, offset memB  
ou
lea si, memB
 
là si je suis pas fatigué, mov si, WORD [memB]
charge le word à l'adresse memB (et non l'adresse) dans si: soit 0 (dû à la déclaration de memB)
 
tu blit donc ton code en ram vidéo.
 
---
sinon DS est automatiquement a CS dans un .com, donc ma première réponse est à coté de la plaque.

Message cité 1 fois
Message édité par bjone le 10-06-2008 à 02:24:34
n°1743917
antsite
Je me souviens
Posté le 10-06-2008 à 02:49:48  profilanswer
 

bjone a écrit :

mov si, WORD [memB]
 
plustôt en:
mov si, offset memB  
ou
lea si, memB
 
là si je suis pas fatigué, mov si, WORD [memB]
charge le word à l'adresse memB (et non l'adresse) dans si: soit 0 (dû à la déclaration de memB)
 
tu blit donc ton code en ram vidéo.
 
---
sinon DS est automatiquement a CS dans un .com, donc ma première réponse est à coté de la plaque.


 
 
Voila c'etait exactement ca (lea si, [memB] pour etre exact) ! Grand merci  :jap:


Message édité par antsite le 10-06-2008 à 02:52:42
n°1744150
dap++
Script kiddie
Posté le 10-06-2008 à 12:29:05  profilanswer
 

Ou bien mov si, memB. LEA est surtout utile pour les adresses qui doivent être calculées à l'exécution comme celles des variables locales.


---------------
dap.developpez.com
n°1744495
antsite
Je me souviens
Posté le 11-06-2008 à 02:01:30  profilanswer
 

dap++ a écrit :

Ou bien mov si, memB. LEA est surtout utile pour les adresses qui doivent être calculées à l'exécution comme celles des variables locales.


Merci pour la precision, je debute alors ca clarifie tres bien l'utilisation de mov.  :)

n°1745189
dap++
Script kiddie
Posté le 11-06-2008 à 22:35:51  profilanswer
 

Ce qui peut paraître bizarre au début c'est qu'avec FASM/NASM on utilise toujours [] pour accéder à la mémoire, y compris pour les variables globales (le nom de la variable est juste un label typé sur une certaine taille en fait, avec FASM en tout cas).
Avec MASM/TASM on accède aux variables globales sans [] (en fait MASM accepte aussi [] mais on ne l'utilise jamais, TASM je ne sais pas), si on veut l'adresse on ajoute OFFSET devant. En fait TASM avait un "ideal mode" avec une syntaxe du style de FASM mais c'est surtout le mode de compatibilité avec MASM qui est connu.


---------------
dap.developpez.com
n°1745314
antsite
Je me souviens
Posté le 12-06-2008 à 10:22:32  profilanswer
 

Je n'arrive pas a comprendre ce qu'il se passe avec la bande bleue (cf debut du topic, tstarfield.c) nous indiquant le temps machine restant / consomme.
Ce que je comprends:
- on est au debut du VBL, on passe en background bleu
- fin des calculs, on passe en fond noir jusqu'a ce que le VBL se termine
- phase de tracage sur l'ecran
 
je ne comprends pas pourquoi ce qui est trace a l'ecran n'est pas tout simplement noir ? Puisque la derniere couleur de fond specifiee est noire justement. Pourquoi le bleu reste la ?
Pour moi au debut du tracage le systeme regarde quelle couleur est specifiee pour le background est c parti, tout en noir dans cas. A posteriori je me trompe !
 
merci pour vos lumieres~

n°1745469
bjone
Insert booze to continue
Posté le 12-06-2008 à 14:33:52  profilanswer
 

ne pouvant plus tester le binaire :D (vista 64 proute sur le dos)
je peux pas trop te dire.

n°1745517
ixemul
Nan mais sans blague ! ⚡
Posté le 12-06-2008 à 15:35:14  profilanswer
 

bjone a écrit :

ne pouvant plus tester le binaire :D (vista 64 proute sur le dos)
je peux pas trop te dire.


 
Virtual PC
VMWare
DosBOX
etc...
 
[:dawao]


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1745588
bjone
Insert booze to continue
Posté le 12-06-2008 à 17:29:50  profilanswer
 

j'ai vmware d'installé, mais en fait j'avais la flemme :D

n°1808817
TheDarkTig​er
Posté le 05-11-2008 à 23:55:36  profilanswer
 

je le suit avec beaucoup d'intérêt depuis à peu près un ans, sans héla, avoir le temps de coder les exemples.
 
et je me demandais :
 
ce post est il mort ?
ou juste en 'sommeil' ?
 
merci, bonne journée ;)

n°1808840
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-11-2008 à 09:01:17  profilanswer
 

il est pas mort, je reçois régulièrement des MP pour le continuer, mais je manque de temps en ce moment :/
mais il reprendra, j'en fais la promesse à tous mes nombreux fans, promis juré [:kbchris]


---------------
J'ai un string dans l'array (Paris Hilton)
n°1808844
antsite
Je me souviens
Posté le 06-11-2008 à 09:11:03  profilanswer
 

[:cupra]
 
:calimero:

n°1809150
TheDarkTig​er
Posté le 06-11-2008 à 19:17:14  profilanswer
 

chouette !
 
merci encore pour tout ce temps passé à faire connaitre aux plus jeunes, la (douce) folie d'antan de la programmation de démo !

n°1809178
SICKofitAL​L
misanthrope
Posté le 06-11-2008 à 21:28:17  profilanswer
 

TheDarkTiger a écrit :

chouette !
 
merci encore pour tout ce temps passé à faire connaitre aux plus jeunes, la (douce) folie d'antan de la programmation de démo !


Ben disons que contrairement à la rumeur, la demoscene est LOIN d'être morte :
http://www.pouet.net/
http://www.pouet.net/prodlist.php
 
D'ailleurs je te conseille de mater "Edge of disgrace", une démo sur C64 (oui, LE commodore 64) sortie ya qq semaines et qui prouve que niveau programmation d'effets, certains en connaissent un gros rayon (il te faut Vice, l'émulateur C64).
Tu peux aussi choper des démos en 256 octets, avec le code source (en ASM).
 
Donc non, "d'antan" n'est pas vraiement le terme approprié :)


---------------
We deserve everything that's coming...
n°1810594
TheDarkTig​er
Posté le 10-11-2008 à 19:51:39  profilanswer
 

Ho c'était une tournure de phrase.
 
Je ne sais pas si , aujourd'hui, on fait encore des démos techniques pour les machines actuelles...
 
En tout cas, "Edge of disgrace" est une vraie tuerie O_O
Je pensait pas un Comodore64 capable de faire ça !
 
C'est du génie à l'état pur, la musique est énorme, les graphismes magnifiques, elle est Géniale !

n°1868046
Olivier51
Posté le 01-04-2009 à 01:28:52  profilanswer
 

Hi,
je pense que ce sujet est le plus approrié pour ma question, enfin je l'espère.
Est-ce qu'il est possible de faire du double-buffering en se limitant à la norme VBE2, ie, dans le but d'avoir du code portable.
J'étais parti en pensant exploiter

Code :
  1. ModeAttributes      dw ?      ; mode attributes
  2.      WinAAttributes      db ?      ; window A attributes
  3.      WinBAttributes      db ?      ; window B attributes
  4.      WinGranularity      dw ?      ; window granularity
  5.      WinSize             dw ?      ; window size
  6.      WinASegment         dw ?      ; window A start segment
  7.      WinBSegment         dw ?      ; window B start segment
  8.      WinFuncPtr          dd ?      ; pointer to window function


 
... mais en continuant ma lecture aujourd'hui, ces windows ne semblent qu'etre présent pour pallier à une limitation du Video Bios (16 bit pointer). Et donc, elles ne peuvent pas etre utilisées comme je le pensais pour faire du double-buffering (mais juste pour accéder en lecture/écriture à un buffer plus grand). Donc ma solution initiale tombe à l'eau
 
... Toujours dans ma lecture, je tombe sur "NumberOfImagePages" :

Citation :

The NumberOfImagePages field specifies the "total number minus one (-
     1)"of complete display images that will fit into the frame buffer
     memory. The application may load more than one image into the frame
     buffer memory if this field is non-zero, and move the display window
     within each of those pages.  This should only be used for determining
     the additional display pages which are available to the application;
     to determine the available off screen memory, use the
     OffScreenMemOffset and OffScreenMemSize information.


Ces extra-images n'ont-elles comme utilité d'etre seulement des back-buffers et ne peuvent jamais etre swappé pour etre affichées en front buffer (sans copie préalable) ?
 
Bref en conclusion, c'est pas possible ?  
 
Reference: VBE 2.0 - http://docs.ruudkoot.nl/vbe20.txt

n°1868215
bjone
Insert booze to continue
Posté le 01-04-2009 à 12:06:11  profilanswer
 

Si, mais en mode protégé.
C'est quoi ton OS ?
 
Sous DOS, il faut un dos-extender style DOS/4G, PMODE, par le bios vbe 2 tu obtiens l'adresse physique de la mémoire vidéo, tu mappes l'espace par le DPMI et ensuite y'a qu'à écrire et fixer le début du scan comme tu veux pour faire le page flipping.
 

n°1868268
Olivier51
Posté le 01-04-2009 à 13:34:23  profilanswer
 

Veux-tu dire que fixer le debut du scan est une option disponible seulement avec un dos-extender. Je pensais que les dos-extenders n'etait qu'une interface/extension en mode protege des fonctions disponibles en real mode ?
 
Dans mon cas, mon application tourne encore en real mode.
 
Si c'est pas possible en real mode, est-ce que ca voudrait dire que le dos-extender va simuler le flip en copiant les buffer a chaque swap dans la memoire video ?

n°1868294
bjone
Insert booze to continue
Posté le 01-04-2009 à 14:23:34  profilanswer
 

le dos-extender te permet de juste de tourner en protégé (simplifié, adressage flat), et ce mode protégé permet de projeter toute la mémoire vidéo dans l'adressage flat, et ensuite tu fais ton double buffering comme tu le sens et tu as juste à replacer le début de scan comme ça te plait.
 
Le début de scan est bien entendu en mode réel, par contre là tu retombe en adressage banké, et tu dois remplir le backbuffer par passes de 32/64K.
 
Maintenant si tu veux t'amuser passe par un dos-extender t'as quand même plus de ressource sous la main.

n°1868323
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 01-04-2009 à 14:52:23  profilanswer
 

+1 pour le mode protégé, faut quand même être maso pour faire du double buffering en mode réel :D
d'ailleurs, tous les sources que j'ai posté ici sont codés en mode protégé


---------------
J'ai un string dans l'array (Paris Hilton)
n°1868391
Olivier51
Posté le 01-04-2009 à 16:43:07  profilanswer
 

Oky, oky, j'essaye de resumer :

 

On peut avoir deux modes pour le frame buffer :
- Banked Frame Buffer : accessible en real mode. Besoin d'utiliser les banks pour remplir la memoire.
- Flat Frame Buffer : accessible en protected mode. Bankage transparent.

 

Pour etre sur qu'on a un Flat Frame Buffer mode, on verifie que le mode verifie cette condition ((modeInfo.ucNumberOfPlanes == 1 && modeInfo.dwPhysBasePtr != 0).

 


Pour changer l'adresse de depart du display :

Int 10h, 07h
 Input:  AH = 4Fh        Super VGA support
                AL = 07h        Display Start Control
                BH = 00h        Reserved and must be 0
                BL = 00h        Select Display Start
                CX = First Displayed Pixel in Scan Line
                DX = First Displayed Scan Line

 

       Output: AX = Status


... Et l'adresse de depart doit etre dans l'interval [PhysBasePtr;PhysBasePtr+TotalMemory*64KB]
avec :
 - PhysBasePtr : physical address for flat frame buffer
 - The TotalMemory field indicates the maximum amount of memory physically installed and available to the frame buffer in 64KB units.


Message édité par Olivier51 le 01-04-2009 à 16:43:29
n°1868406
bjone
Insert booze to continue
Posté le 01-04-2009 à 17:13:12  profilanswer
 

On parle plustôt de Linear FrameBuffer (LFB).
Mais de mémoire oui c'est ça.

n°1868492
Olivier51
Posté le 01-04-2009 à 22:09:35  profilanswer
 

[:emanu]  
 
Si j'ai des choses intéressantes/difficultés à raconter par rapport à ce double-buffering, je mettrais à jour ce fil.

n°1868495
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 01-04-2009 à 22:24:30  profilanswer
 

faudrait que je le mette à jour aussi [:zytrasnif]
mais pour ça, faudrait que j'arrive à me décoller de Flight Simulator :o

Spoiler :

décoller... Flight Sim... hahalol

Message cité 1 fois
Message édité par Harkonnen le 01-04-2009 à 22:24:58

---------------
J'ai un string dans l'array (Paris Hilton)
n°1868582
ixemul
Nan mais sans blague ! ⚡
Posté le 02-04-2009 à 09:57:50  profilanswer
 

Harkonnen a écrit :

faudrait que je le mette à jour aussi [:zytrasnif]
mais pour ça, faudrait que j'arrive à me décoller de Flight Simulator :o

Spoiler :

décoller... Flight Sim... hahalol



 
HarkoG [:sadnoir]


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1868584
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-04-2009 à 10:03:06  profilanswer
 

[:kbchris]


---------------
J'ai un string dans l'array (Paris Hilton)
n°1920926
TheDarkTig​er
Posté le 03-09-2009 à 15:11:52  profilanswer
 

J'adore ces tutos.
J'ai eu enfin le temps de télécharger un compilateur C pour DOS, et j'adore tout ce que l'on peut faire!
 
je dois être fou XD

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8  9  10  11  12  13  14  15

Aller à :
Ajouter une réponse
 

Sujets relatifs
Projet de topic tutorial sur la programmation d'effets graphiquesProgrammation jeux video
cherche cours de programmation[ASM] L'assembleur sur TI82
Newbee en recherche d'un bon bon logiciel de programmationProgrammation graphique : choix d'un toolkit
[Programmation windows en C++] Recherche d'un bon tutorial...la fin des langages de programmation... sous Windows evidemment
cherche pro de la programmation 
Plus de sujets relatifs à : La programmation d'effets de demos old-school (Assembleur + C)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR