Logicielsmoto.com

Nous sommes le 05 Aoû 2020, 14:24

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 85 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6
Auteur Message
MessagePosté: 07 Mar 2020, 15:44 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 46
Samuel Devulder a écrit:
Pour info Pulkomandy a fait une démo en C (>>ici<<) il y a quelques années, et même si le C est très proche de l'assembleur, on sent bien que c'est moins efficace que du code machine optimisé à la main.

Pour avoir un jeu fluide à 25 images/seconde avec du son, je pense que seul l'assembleur et les connaissances de Préhisto en sont capables. Les langages de haut niveau ne permettent pas d'être précis au cycle près, chose nécessaire sur Thomson qui ne dispose d'aucune aide matérielle pour les sprites ou le son.

Par contre d'autres jeux, plus lents, et avec moins de son doivent être possibles en Pascal en effet.

Un jour je me pencherais sur le Pascal, surtout s'il permet de la programmation modulaire.


Au cycle près non mais avec Pascal Base, on peut créer des modules en assembleur directement au sein des sources Pascal (d'ailleurs, il y a déjà 19 procédures de ce type dans la doc, comme par exemple, PEEK, POKE, PSET, POINT, LINE etc)

En voici un exemple d'ailleurs utilisant lm'asembleur pour TO7:
PROCEDURE PSET (X,Y,COLOR : INTEGER)
(*allumage d'un point en X,Y de couleur COLOR
identique à l'instruction PSET graphique du BASIC*)
BEGIN ENCODE('7F60413410AE5B10AE56EC54F76038BDE80F3510'); END;

Ou un autre exemple commun aux TO/MO
PROCEDURE CURSOFF; (*extinction du curseur*)
BEGIN WRITE (CHR(20)); END;

Imaginez si on créer une librairie complète en pascal pour les routines du moniteur ou de l'extramoniteur par cette voie On n'a plus besoin de se préoccuper des "variables", de la position des procédures et fonctions.
Cependant, ya juste un point dont je ne vois pas comment utiliser en Pascal, c'est pour l'interruption timer, où, je pense, il faut anticiper l'adresse de début d'interruption.

A ce propos, existe-t-il un moyen de changer la durée du timer qui est de 1/10s ?


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Mar 2020, 20:40 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1219
Localisation: Brest
Neotenien a écrit:
A ce propos, existe-t-il un moyen de changer la durée du timer qui est de 1/10s ?

Sur les TO oui car il y a un 6846 qui gère le timer (doc "pas fun" >>ici<<, doc sympa >><< ). Sur les MO non car l'interruption vient du 50hz de la prise secteur (MO5 du moins, je ne sais pas trop pour le MO6).

J'ai utilisé le timer pour changer la fréquence du son dans >>cette démo<< (1 seul canal audi)
phpBB [video]


Dans ces autres démo avec plusieurs canaux audio, je ne module plus la f'réquence du son via l'interruption timer mais je modifie sa fréquence pour que l’interruption de 10hz passe à 2000 ou 4000hz dans laquelle je calcule la sortie de chaque canal en temps réel.
phpBB [video]

phpBB [video]

phpBB [video]

phpBB [video]

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Mar 2020, 21:49 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 46
adnz a écrit:
Alors oui je suis d'accord,
le TO/MO est hyper limité, c'est une galère grave pour faire un peu comme l'amstrad (surtout en bitmap 16) avec une vitesse de jeu assez rapide....
et aussi il n'y a aucune aide hardware pour les sprites ou le son ou le scrolling (comme sur amstrad par exemple, genre gestion de sprites en hardware etc..).

Sur les Thomson faut tout ce coder à la main, et finalement on atteint assez vite le nombre de cycle max jouable pour 1 frame de jeu. En plus si on met du son digit alors là c'est bonbon :langue: ....!
(ça crain je sais pas si c'est moi, mais justement c'est ce que je kiff sur cette machine. :tourne: )

Du coup quant on à tout ça en tête, le codage de Mission LiftOff c'est pfffff, je pense le truc le plus pointu réalisé sur Thomson de toute la galaxie :W .
Mais c'est ça que je trouve cool, quant on arrive à ce résultat sur ces machines.

Sinon j'avais vu ce "wip zezito" avec le scroll super fluide en bitmap16... ça promet, je sais pas si ce qu'on voit tourne à cette vitesse sur un TO !
(ça serait bien un pinball avec un scrolling comme ça :D )


Pour faire le parallèle avec les Commodore 64 et autre Amstrad CPC, les thomson n'ont rien à envier!! Le 6809E à 1 MHz semble à peu près équivalent aux Zilogh 3MHz en terme de performance. Ces bécanes ont tous 16kO en RAM vidéo... L'Amstrad apparemment n'aurait que 3 modes vidéo en bitmap (d'après ce que j'ai lu) mais avec une palette de 56 couleurs (je crois) allant de 160x200 à 640x200. ON peut comparer graphiquement et techniquement certains jeux où Thomson est meilleur que l'Asmtrad:
- Astérix et la potion magique
- Bactron
- Bivouac
- Blue Star
- Turbo Cup
- Etc

D'autres jeux où la version Asmtrad est meilleure (Comme Arkanoïd) etn d'autres où les 2 sont équivalentes (Bob winner). L'amstrad a théoriquement 128 kO et le TO8 256 jusqu'à 512...

Mais quand on compare au C64 ou pire au ZX spectrum, inférieur aux niveau techno (aussi bien processeur pour le C64 que graphique) et que chacune de ces 2 plate formes dispose de plus de 5000 jeux... A savoir que le Basic 1.1 de l'Amstrad est bien plus limité que le Basic 512 (Voir avec "Speedy Wonder" le compilateur Basic de l'Amstrad également dispo sur Thomson) et que le Basic du C64 est une horreur (et que tous les jeux sont écrits en assembleur)... Avec Pascal Base (qui compile le code directement en langage machine) on a là un outil permettant de créer des jeux rapide facilement

Je suppose que vous connaissez ces jeux montrant les possibilités de la bécane : Tout Schuss, MGT, Bactron, Mission, 3D Fight (qui est un Xwing!!), Minotaure 3D, Space game. Ce qui est dommage est que nombre de jeux d'arcade ont été portés sur les C64, Spectrum et Amstrad et pas sur Thomson. Alors qu'en théorie c'est faisable. Des hit tels International Karaté, Street Fighter, Super Mario, Bubble Bobble, Frozen Bubble, Chuchu rocket (parking) ou même Zelda (le 1er) sont portable sur TO... A ce propos, les jeux vu de dessus (avec scrolling) ne sont pas légion sur Thomson, à part "Avenger", "Slap fight 1 et 2" et Road killer.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 01 Juil 2020, 10:50 
Hors ligne

Inscription: 24 Juil 2010, 16:08
Messages: 421
Localisation: France
Samuel Devulder a écrit:
Pour info Pulkomandy a fait une démo en C (>>ici<<) il y a quelques années, et même si le C est très proche de l'assembleur, on sent bien que c'est moins efficace que du code machine optimisé à la main.


Euh, alors, celle-ci en particulier a été faite rapidement sur un week-end et sans trop prendre le temps d'optimiser quoi que ce soit. C'est loin d'être une référence pour ce qu'on peut faire en C.

Cela dit, effectivement il y a des soucis de performances sur les machines Thomson, principalement à cause du manque de matériel pour le son. Sur un Amstrad par exemple, on peut se contenter d'envoyer quelques dizaines d'octets à la puce son une fois toutes les 20ms et elle se débrouille pour le reste. Sur Thomson, il faut gérer ça avec le CPU et avoir un timing précis, impossible en C.

Ce que je fais souvent, c'est un mélange de C et d'assembleur, qui me permet d'avancer vite en écrivant en C, puis ensuite de passer du temps à réécrire à la main les parties qui méritent d'être optimisées pour obtenir les performances voulues.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 25 Juil 2020, 14:54 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 46
Prehisto a écrit:
Par exemple, vous pourrez toujours chercher les graphismes des sprites en mémoire, vous ne les y trouverez pas. Parce que tous ces graphismes ont été convertis en code. Chaque point de couleur est appliqué "à la main" sans passer par une matrice. Par exemple, une partie du code de l'affichage du jetpack (X contient le pointeur écran, B contient #$F0 (soit 240, pour passer les lignes)):

Code:
       ...
       SOUNDA
       abx   
       lda    #$f0
       anda   ,x
       adda   #$09
       sta    ,x
       lda    #$f0
       anda   40,x
       adda   #$04
       sta    40,x
       lda    #$44
       sta    -120,x
       sta    -80,x
       sta    -40,x
       abx   
       sta    80,x
       lda    #$a3
       ...


Je suis moi même en train de coder, depuis quelques jours, des choses pour des adaptations de jeux sur Thomson (des grand titres existant sur d'autres plate-forme... je pet juste une photo sur un article que je vais publier)

Et je ne comprend pas pourquoi ce codage à la main des pixel sans data derrière ?

Moi j'ai trouvé une astuce pour avoir une couleur "transparente" sur un pixel en mode bm 16.
Il suffit de se dire que "15" est la couleur transparente des sprites. et que si on le rencontre, on utilise un filtre du genre "Ecran AND 240" ou "Ecran and 15" (dépendant du pixel bm sur lequel on travaille)

Je vous fournis une partie de ce traitement
Code:
43 for i=0 to 15 : C= bubble%(4*i+1): D= bubble%(4*i+3) : GOSUB 200
46 for k=0 to 7 : ADR = RAM+40*i+4*k :A=PEEK(ADR) : B = peek (ADR+1):POKE ADR,(FILTREA AND A) + (C AND (not FILTREA)) :  POKE ADR+1,(FILTREB AND B) + (D AND (not FILTREB))
47 next : next :  i=peek(&hE7C3): i=(i OR 1): poke(&he7c3),i
50 for i=0 to 15 :C= bubble%(4*i): D= bubble%(4*i+2) : GOSUB 200
53 for k=0 to 7 : ADR = RAM+40*i+4*k :A=PEEK(ADR) : B = peek (ADR+1):POKE ADR,(FILTREA AND A) + (C AND (not FILTREA)) :  POKE ADR+1,(FILTREB AND B) + (D AND (not FILTREB))
54 next : next :  i=peek(&hE7C3): i=(i OR 1): poke(&he7c3),i
200 IF (C AND 240) = 240 then FILTREA= 240 ELSE FILTREA = 0
201 IF (C AND 15) = 15 then FILTREA= FILTREA+15
202 IF (D AND 240) = 240 then FILTREB= 240 ELSE FILTREB = 0
203 IF (D AND 15) = 15 then FILTREB= FILTREB+15
204 RETURN

Il y a 64 data correspondant à des Octet full, donnant sur les 4 bits de poids fort la couleur sur les pixels pairs (RAMA ou RAMB) et sur les 4 bits de poids faible, la couleur des pixels impairs. Il y a un test sur la couleur 15 indiquant si le filtre s'applique sur la couleur du fond ou sur le pixel du data! FiltreA correspond au pixel pair et FiltreB pour le pixel impair. Ceci est en basic, mais je vais faire une version PURE Pascal pour voir ce que ça donne en terme de vitesse (comparé à BASIC)
Ce code est certainement plus court que le fait d'écrire à la main chaque pixel, tout ça pour l'effet transparence. Et ce code se sert de DATA en matrices.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 25 Juil 2020, 17:34 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1219
Localisation: Brest
Préhisto a mis les data dans les valeurs immédiates pour gagner un max de cycles. Par exemple LDA #123 (adressage immédiat) coûte 2 cycles, alors que LDA ,X+ (adressage indexé, le registre X pointant sur les données) coûte lui 4+2=6 cycles, soit trois fois plus lent. Ca prends plus de place en "code", mais l'avantage en vitesse est primordial si on veut maintenir les 25 images par secondes.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Juil 2020, 11:16 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 46
Samuel Devulder a écrit:
Préhisto a mis les data dans les valeurs immédiates pour gagner un max de cycles. Par exemple LDA #123 (adressage immédiat) coûte 2 cycles, alors que LDA ,X+ (adressage indexé, le registre X pointant sur les données) coûte lui 4+2=6 cycles, soit trois fois plus lent. Ca prends plus de place en "code", mais l'avantage en vitesse est primordial si on veut maintenir les 25 images par secondes.

Wow ça fait un travail monstre! Ce genre de truc est irréalisable avec Bubble Bobble (avec les centaines de sprites qui existe dessus)... Mais je me contenterais du 8 image/s (25/3), avec test du filtre de la couleur du pixel = 15.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Juil 2020, 11:47 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 46
Samuel Devulder a écrit:
Préhisto a mis les data dans les valeurs immédiates pour gagner un max de cycles. Par exemple LDA #123 (adressage immédiat) coûte 2 cycles, alors que LDA ,X+ (adressage indexé, le registre X pointant sur les données) coûte lui 4+2=6 cycles, soit trois fois plus lent. Ca prends plus de place en "code", mais l'avantage en vitesse est primordial si on veut maintenir les 25 images par secondes.


Sauf que, je viens de me rendre compte en Assembleur qu'en utilisant LDD en mode étendu (6 cycles, soit en utilisant les régistres A et B), ça fait à peine plus que l'appel de 2 fois LDA en mode direct! (2x2), et c'est exactement ce font j'ai besoin pour l'affichage des sprites en mode bm 16c!! Et évidemment, c'est 2 fois moins que les 2xLDA en mode étendu (10 cycles) C'est une des forces du 6809 qui est sans doute sous exploitée... Au leu d'être à du 25img/s on serait à du 20 en mode indexé ?

Même mieux, en mode indexé, on peut faire un LDD en 5 cycles contre 2x2 avec LDA en mode immédiat!
Ca signifie qu'on peut utiliser les accès mémoire en 20 img/s! Et pas besoin de rafraichir le fond d'écran, on n'a juste besoin de rafraichir les zones concernant les sprites.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Juil 2020, 13:46 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1219
Localisation: Brest
En asm un truc bon à savoir le ",x+" est pas mal coûteux (et encore plus si c'est un ",x++"). Souvent il est préférable d'utiliser n,x avec n constant ("1,x", "2,x", "-8,x" etc) On doit gagner 1 cycle ou 2 par instructions avec ca facile. Ca n'a l'air de rien, mais les petits ruisseaux font les grandes rivières.

Je pense que le pascal est un bon choix pour le haut niveau (algorithme du jeu). Ensuite se faire des primitives en ASM pour afficher les sprites est un excellent compromis.

Concernant les 20imgs/s ca fait 50ms par image, soit 50 000 cycles par image. Ca a l'air beaucoup mais ca part très très vite. Mieux vaut ne pas se préoccuper de l'optim fine tout de suite, mais déjà implémenter un moteur qui tourne bien, est bien découpé en opérations indépendantes ce qui laisse de la place aux optims locales si besoin.

sam.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 27 Juil 2020, 15:36 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 46
Samuel Devulder a écrit:
En asm un truc bon à savoir le ",x+" est pas mal coûteux (et encore plus si c'est un ",x++"). Souvent il est préférable d'utiliser n,x avec n constant ("1,x", "2,x", "-8,x" etc) On doit gagner 1 cycle ou 2 par instructions avec ca facile. Ca n'a l'air de rien, mais les petits ruisseaux font les grandes rivières.

Je pense que le pascal est un bon choix pour le haut niveau (algorithme du jeu). Ensuite se faire des primitives en ASM pour afficher les sprites est un excellent compromis.

Concernant les 20imgs/s ca fait 50ms par image, soit 50 000 cycles par image. Ca a l'air beaucoup mais ca part très très vite. Mieux vaut ne pas se préoccuper de l'optim fine tout de suite, mais déjà implémenter un moteur qui tourne bien, est bien découpé en opérations indépendantes ce qui laisse de la place aux optims locales si besoin.

sam.


Oui ça passe très vite, surtout sachant qu'une RAM écran c'est 16kO! Et le jeu qui m'épate le plus au niveau du scrolling sur Thomson c'est Bob Morane SF ou Prohibition (ça doit être le même auteur). En supposant qu'il y a 16 kO par écran... A mon avis, ils ont dû utiliser toute la RAM pour y mettre les pixel écran (à supposer que ça fasse 2x4 écran de large, on arrive déjà à 128kO de RAM

J'ai déjà dans l'idée de comment optimiser pour un scrolling type Mario BROS. En utilisant (et conservant) le timer à 0.1s ça devrait déjà être pas mal.

Pour Bubble Bobble, il y a rarement + de 5 sprites à l'écran (+ les bubules.. Et vu déjà la démo de Wip Zezito sur TO8 (qui me parait vraiment la version la plus réussi de l'auteur comparé à Amstrad, BBC Micro, ZX 81 etc)
phpBB [video]
, ça devrait pourvoir se faire pour Bubble Bobble ausssi


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 85 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com