Forum › Commodore › Commodore 64 – 128 – VIC 20 – … › C-64 vs CPC vs Atari vs MSX vs autres 8bits
- Ce sujet contient 69 réponses, 10 participants et a été mis à jour pour la dernière fois par
PZAWA, le il y a 2 années et 8 mois.
-
CréateurSujet
-
22 avril 2018 à 10 h 26 min #23849
PZAWA
- Level 6
- Messages : 316
J’ouvre ici le post pour éviter de polluer l’autre
Heu, je ne savais pas quoi donner comme titre …
edit Jim : Ce sujet est un split du sondage ‘Quels étaient les meilleurs ordinateurs 8 bits et pourquoi ?‘ qui commençait à devenir compliqué à suivre.
-
CréateurSujet
-
AuteurRéponses
-
1 mai 2018 à 18 h 35 min #23392
hlide
- Level 2
- Messages : 53
Bonne nouvelle, ta version fonctionne – j’avais complètement oublié de réduire le nombre à tester à 1000 au lieu de 10000.
Pour en être certain, je fais ce test là pour confirmer sa validité :
void z80_div16_8(unsigned short p1, unsigned short p2, unsigned short& q, unsigned short& r) { unsigned int HL = p1; unsigned int C = p2 & 255; unsigned int A; bool CF; // XOR A A = 0; CF = (HL += HL) >> 16; HL &= 65535; A = +CF | (A << 1) & 255; if (A != 0) std::cout << "HL=" << p1 << "->" << HL << ", CF=" << CF << ",A=" << A << std::endl; if (CF) abort(); CF = (HL += HL) >> 16; HL &= 65535; A = +CF | (A << 1) & 255; if (A != 0) std::cout << "HL=" << p1 << "->" << HL << ", CF=" << CF << ",A=" << A << std::endl; if (CF) abort(); CF = (HL += HL) >> 16; HL &= 65535; A = +CF | (A << 1) & 255; if (A != 0) std::cout << "HL=" << p1 << "->" << HL << ", CF=" << CF << ",A=" << A << std::endl; if (CF) abort(); CF = (HL += HL) >> 16; HL &= 65535; A = +CF | (A << 1) & 255; if (A != 0) std::cout << "HL=" << p1 << "->" << HL << ", CF=" << CF << ",A=" << A << std::endl; if (CF) abort(); CF = (HL += HL) >> 16; HL &= 65535; A = +CF | (A << 1) & 255; if (A != 0) std::cout << "HL=" << p1 << "->" << HL << ", CF=" << CF << ",A=" << A << std::endl; if (CF) abort(); CF = (HL += HL) >> 16; HL &= 65535; A = +CF | (A << 1) & 255; if (A != 0) std::cout << "HL=" << p1 << "->" << HL << ", CF=" << CF << ",A=" << A << std::endl; if (CF) abort(); // à "dérouler" 16 fois for (int i = 0; i < 10; ++i) { // ADD HL,HL <- notez bien bit 0 de HL à 0 ! CF = (HL += HL) >> 16; HL &= 65535; // RLA A = +CF | (A << 1) & 255; // CP C CF = (A < C); // JP C, $+4 if (CF == false) { // INC L <- ça met juste à 1 le bit 0 de HL // qui était à 0 à cause du ADD HL,HL précédent HL |= 1; // SUB C A = (A - C) & 255; } } q = HL; r = A; }
Donc ouais, c’est impécable.
1 mai 2018 à 19 h 51 min #23416PZAWA
- Level 6
- Messages : 316
Merci Hlide ! c’est cool
Sinon j’ai un peu réfléchi cette après-midi et pour le sqrt je pense qu’au final tu vas avoir raison (mon idée était d’extraire de l’information par un sqrt et éviter de rentrer dans la boucle interne et éviter toutes ces divisions mais je pense que les cycles perdues au début ne seront que très rarement compensés: 25 , 49 etc) c’est pourquoi je laisse tombé cette approche. Je proposerai un programme Basic optimisé (sans tableau) avec ton approche histoire de rigoler un peu et je partirais de la pour un premier essai C-64 … heu après le match de touf
1 mai 2018 à 21 h 47 min #23434PZAWA
- Level 6
- Messages : 316
Mi-temps: Avec l’approche de Hlide + légères modifs voila le programme BASIC « optimisé » par rapport à celle de la vidéo mais qui fait exactement la même chose: affiche à la volée les nombres premiers supérieur à 2 et inférieur à 1000:
REM FIRST PRIME NUMBER [3,1000] 10 FOR I=3 TO 1000 STEP 2 20 FOR J=3 TO 99 STEP 2 30 K1 = I/J 40 IF J+1 >= K1 THEN 80 50 K2 = INT(K1) 60 IF K1 = K2 THEN 90 70 NEXT J 80 PRINT I 90 NEXT I
C-64: 50 secondes
CPC: 30 secondes
ATARI:58 secondes
* tests rapide sous émulateur (VICe, WinApe et Altirra) Donc à tester sur les vrais machines2 mai 2018 à 1 h 01 min #23441PZAWA
- Level 6
- Messages : 316
Voila une première version tout en asm (j’avais oubliée comment c’est casse-tête
) pour le C64 mais sans se prendre la tête avec les optimisations (ma fonction uint2str à revoir, utilisation des fonctions de la rom pour l’affichage, fonction div de base sans l’optimisation 10 bits ni déroulage de boucle etc).
Affichage en 7 secondes (sous émulateur). Maintenant il faut faire la version CPC et Atari (cela devrait être rapide à partir de cette version) et ensuite commence à mesurer et optimiser … mais une autre fois demain faut se lever
2 mai 2018 à 10 h 24 min #23454francouai
- Level 8
- Messages : 711
Sinon, qui avait tenu le pari deja, afin que je puisse lui faire parvenir mon IBAN
T’as recu finalement tes 500e?
--
Francois.2 mai 2018 à 12 h 46 min #23465gibs
- Level 9
- Messages : 978
Non, je pense qu’il vont me les demander une fois qu’ils auront réussis :)
Là, on en est à zapper le 2, le calcul des nombres pairs, et réduire le nombre de bit pour limiter le programme à calculer sur 1000 nombres premiers…
Alors que le but est de faire calculer la machine :)
Bientôt ils vont tout precalculer et il n’y aura plus qu’à lire le tableau en Basic :)Team Apollo
2 mai 2018 à 19 h 22 min #23543PZAWA
- Level 6
- Messages : 316
Pour l’instant gibs n’a rien gagnée du tout on vient à peine de commencer
Si on en reste la c’est le C-64 qui gagne vu que le cpc n’a rien à proposer
Je commencerai la version cpc ce soir mais il faudra ensuite me donner un coup de main pour vérifier si ce n’est pas trop massacré
@gibs: Tu remarqueras que le programme d’origine zappe aussi le 2.
Si vraiment tu insistes on peut faire exactement comme le prog d’origine mais comme l’algo est merdique ce n’est pas très motivant de « l’optimiser » et en plus il faudra alors systématiquement vérifier le prog asm pour voir si il n’y a pas de « triche »: on s’en sortira pas.
C’est pourquoi je propose cette règle (si tu y tiens a tes 500euros
): affichage des nombres premiers inférieurs à 65536 (histoire de bien faire calculer les machines) à la volée et le plus vite possible mais sans tableau, ni pré-calcul dans l’exécutable (histoire egalement de faire participer toutes les machines équipées d’un 6502 ou d’un Z80) et le tout en moins de 512 octets . Ca vous va ? Ou bien une autre variante ne rien afficher du tout et seulement stocker la somme pour pouvoir plus confronter les processeurs et pas les machines ? Je suis ouvert
2 mai 2018 à 19 h 50 min #23544gibs
- Level 9
- Messages : 978
@PZAWA
A la base c’était le C64 qui était concerné dans la vidéo.
Mais si t’y arrives pas je te prêterais mon Turbo Chameleon 64 avec le mode Turbo ca devrait allerTeam Apollo
2 mai 2018 à 22 h 51 min #23684PZAWA
- Level 6
- Messages : 316
Là j’ai rien compris mais c’est pas grave
3 mai 2018 à 13 h 26 min #23798gibs
- Level 9
- Messages : 978
Je disais qu’au cas où tu ne parviendrais pas à faire passer le C64 devant l’Amstrad je te prêterai le TC64 (C64 overclocké) pour parvenir à tes fins :)
Le programme Basic de la vidéo part bien à 2 qui est un nombre premier. :)
Team Apollo
3 mai 2018 à 14 h 59 min #23799Zlandicae
- Level 6
- Messages : 290
Vous savez, pour votre concourt de vitesse, vous devriez créer un thread spécifique :).
3 mai 2018 à 15 h 08 min #23800hlide
- Level 2
- Messages : 53
Alors je m’insurge !
Je pars effectivement à trois parce que j’ai un tableau de nombres premier et que j’ai besoin d’un tableau avec un nombre de départ qui est effectivement 2 (je pouvais pas prendre 1 car ce n’est pas un nombre premier et 2 n’est divisible que par lui-même donc pas moyen que de commencer à 3) mais c’est pour pouvoir diviser par les nombres de ce tableau, donc oui je ne commence pas par deux pour déterminer si le nombre est premier mais je DIVISE BIEN PAR 2 la suite des nombres ! et je l’ai fait pour ne pas compliquer l’algoritme en assembleur, pas pour optimiser. L’algorithme du BASIC est – comment dire – stupide sur plusieurs points et ne met pas en valeur les machines. Traduit en assembleur, ça conduit à du mauvais code qu’un bon codeur ne ferait pas. L’idée est de s’assurer que chacune des machines fasse la même opération (tenter une division par des nombres premiers mais intelligemment).
Indépendamment du code machine, la division doit s’exprimer par un code faisable sur une machine 8-bit qui n’a pas d’instruction de division. Il faut donc définir cet algorithme et puisque le nombre maximum était 1000, il n’était pas déconnant d’optimiser l’algorithme à 10 itérations au lieu de 16 (et le code assembleur) pour donner un maximum de chance A CHACUNE DE CES MACHINES de faire une division la plus rapide mais qui reste en substance la même POUR CHACUNE DE CES MACHINES en terme algorithmique.
Il a été précisé qu’un tableau prérempli était formellement interdit, alors t’es mauvaise langue Gibs !
Si on veut étendre au-delà de 1000, je déconseille très fortement 65535 parce que ça risque de prendre beaucoup de temps – surtout la version naive qui ne divise pas des nombres uniquement par des premiers : O(n log2(n)) . Avec 1000, on avait moins de 10000 divisions mais avec 65535, on aura un peu moins 1050 000 de divisions, soit un temps 105 fois plus long. Donc 7 secondes passent à un peu plus de 12 minutes. Alors il vous faudra être super patients pour surveiller la fin du programme…
3 mai 2018 à 18 h 14 min #23818PZAWA
- Level 6
- Messages : 316
bein je suis d’accord avec tout ce que vient de dire hlide …
Le programme Basic de la vidéo part bien à 2 qui est un nombre premier. :)
les deux progs sur la vidéo affichent à partir de 3. Cela dit ça pose mais aucun soucis de les faire tous sur mon prog au contraire : sur C64 ca va même l’accélérer (et oui c’est dingue mais c’est comme ça)
Je disais qu’au cas où tu ne parviendrais pas à faire passer le C64 devant l’Amstrad je te prêterai le TC64 (C64 overclocké) pour parvenir à tes fins :) Le programme Basic de la vidéo part bien à 2 qui est un nombre premier. :)
aha ok
mais non merci: je n’ai aucune problème pour faire passer le c64 devant et facile en plus
Sérieusement je suis trop une tache en z80 : sous émulateurs le c-64 met tout simplement plus de 4 secondes dans la gueule du cpc .
mais je travaille encore dessus pour voir où est ma connerie. Enfin je n’ai pris personne en traître j’avais annoncé qu’avec moi le C-64 serait devant
Vous savez, pour votre concourt de vitesse, vous devriez créer un thread spécifique :).
si tout le monde est d’accord pas de problèmes …
3 mai 2018 à 18 h 57 min #23820StaffZarnal
- Level 22
- Messages : 7973
Si vous voulez créer un thread spécifique, créez le et je déplacerai les posts (en essayant de ne pas me tromper).
A1200 Commodore mutant " FrankenAmiga" + 68040 + 8MO + SD 8go - A1200 ESCOM. HD 20MO. Mon meilleur et seul A500 : WinUae. CPC 6128-CPC 464.
3 mai 2018 à 19 h 08 min #23822PZAWA
- Level 6
- Messages : 316
ok Zarnal. On attend juste la reponse des autres.
Sinon je rassure tout de suite Gibs: !!! tranquille j’avais effectivement, hier, fait une grosse connerie:
le CPC est devant pour environ une seconde
Je me suis amusez à tester tout jusqu’à 4095 sans afficher le cpc fait 3.5 s tandis que le c-64 fait 7 secondes on à bien hors affichage le z80 environ 2 fois plus rapide. Mais comme je le pressentais le c-64 compense lors de l’affichage et comme j’ai fait exprès de garder les fonctions de la rom sur les deux machine et qui sont catastrophiques pour le C-64 (sur cpc je ne sais pas), je refuse encore de parier pour le cpc
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.