60

Vu qu'on est dans le concours de celui qui a la plus grosse wink


/**
 *  CoreCPU - The Quick6502 Project
 *  corecpu.c
 *
 *  Created by Manoel Trapier on 24/02/08
 *  Copyright 2008 986 Corp. All rights reserved.
 *
 *  $LastChangedDate$
 *  $Author$
 *  $HeadURL$
 *  $Revision$
 *
 */

/* Depending on the OS, one of these provide the malloc function */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

{snap}

/**
 * Initialise the CPU
 *
 * Inputs:
 *
 * - CPU Init structure:
 *  - Memory Read function pointer
 *  - Memory Write function pointer
 *  - Fast memory read function pointer (for opcodes read)
 *  - Fast page 0 function Read/Write
 *  - Fast page 1 function Read/Write
 *
 * Output:
 *
 * (void *): An opaque pointer to the internal structure of the CPU.
 *           NULL if an error occured !
 */
quick6502_cpu *quick6502_init(quick6502_cpuconfig *config)
{
   quick6502_cpu *cpu;

   /* Alloc structure */
   cpu = (quick6502_cpu *) malloc (sizeof (quick6502_cpu));
   if (!cpu)
      return NULL;

   /* Initialise other variables */
   cpu->running = 0; /* CPU is currently NOT running */

   cpu->cycle_done = 0;
   
   /* Initialise registers */
   cpu->reg_A = 0;
   cpu->reg_X = 0;
   cpu->reg_Y = 0;
   cpu->reg_S = 0xFF;
   
   cpu->reg_P = Q6502_D_FLAG | Q6502_I_FLAG;
   
   if (config->memory_read != NULL)
      cpu->memory_read                 = config->memory_read;
   else
      goto init_error;

   if (config->memory_write != NULL)
      cpu->memory_write                = config->memory_write;
   else
      goto init_error;

   if (config->memory_opcode_read != NULL)
      cpu->memory_opcode_read          = config->memory_opcode_read;
   else
      cpu->memory_opcode_read          = config->memory_read;


   if (config->memory_page0_read != NULL)
      cpu->memory_page0_read           = config->memory_page0_read;
   else
      cpu->memory_page0_read           = config->memory_read;

   if (config->memory_page0_write != NULL)
      cpu->memory_page0_write          = config->memory_page0_write;
   else
      cpu->memory_page0_write          = config->memory_write;

   if (config->memory_stack_read != NULL)
      cpu->memory_stack_read           = config->memory_stack_read;
   else
      cpu->memory_stack_read           = config->memory_read;

   if (config->memory_stack_write != NULL)
      cpu->memory_stack_write          = config->memory_stack_write;
   else
      cpu->memory_stack_write          = config->memory_write;
   
   return cpu;

init_error:
   if (cpu)
      free (cpu);

   return NULL;
}

{snap}

/**
 * Run cpu for at least X cycles 
 *
 * Output:
 *
 * int: (Number of cycle really done) - (Number of cycle asked)
 */
int quick6502_run(quick6502_cpu *cpu, int cycles)
{
   cpu->running = !0;

   while(cpu->cycle_done < cycles)
   {
      quick6502_exec_one(cpu);
   }
   cpu->cycle_done -= cycles;

   cpu->running = 0;

   return cycles + cpu->cycle_done;
}
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

61

./58 : L'indentation avec des espaces t'oblige à visualiser la source d'une seule façon. Avec une indentation en tabs, je peux choisir une taille de 4 alors que l'auteur était en 2 ou 8. C'est un poil moins beau (il y aura éventuellement quelques alignements qui sont perdus), mais ça reste largement lisible et au moins c'est plus confortable pour moi puisqu'adapté à une taille à laquelle je suis habitué. L'indentation en espaces sux ^^

et en plus ça prend quelques octets de moins tritop
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

62

Pollux (./57) :
et pourquoi t'indentes le début du fichier ? confus.gif

Ouais, je suis d'accord, ça je pourrais le squizzer (mais je le défendais à une époque en disant que mon <? marquait un premier début de bloc ^^)
Pollux (./57) :

Nil> argh c'est moche de mettre des /* au milieu d'un commentaire cst.gif (pas mal de compilos font un warning pour ça, et puis plus généralement ça fait qu'on a du mal à savoir où se termine le commentaire : si tu mets juste une seule * en début de ligne on voit bcp mieux la différence entre deux commentaires consécutifs et un seul commentaire)

Ah oui, tiens, j'achète, merci hehe
Pollux (./57) :

sinon t'es pas très consistant dans tes espaces avant le ; (genre return 0 ; et juste après return 1; tongue.gif )

Oué, c'est assez chiant ça :/ En fait, j'ai appris à développer sans mettre d'espace, mais j'ai très souvent le réflexe de le faire par application de la règle typographique française...

Sinon chuis d'accord avec Zephyr (et je me souviens même d'un troll avec PpHd sur le sujet - mais ça remonte à il y a au moins 6 voire 6 ans grin - où il avait admis qu'au moment du parsing, on devait gagner des quelques microsecondes embarrassed grin).
avatar

63

./60

J'adore ce genre de code ou la complexité cyclomatique explose...
(c'est ironique)

64

"Malheureusement", en informatique de gestion, il y a quand même énormément de situations où ce n'est que tu test case (parce qu'on applique des outils informatiques à des traitements humains)..;
avatar

65

attendez ce soir que je mette la main sur la source de vrally, et vous verrez qui a la plus grosse trivil

66

Je crois qu'on l'a déjà vu hehe grin (et effectivement, c'est la plus grosse, mais faut les aimer tordues embarrassed)
avatar

67

Godzil : C'est le code de ton émulateur ?

if (config->memory_stack_read != NULL) 
      cpu->memory_stack_read = config->memory_stack_read; 
else 
      cpu->memory_stack_read = config->memory_read; 
Selon la valeur de config->memory_stack_read, le processeur effectue :
• NULL : un test, puis un saut, puis une affectation
•!NULL : un test, puis une affectation, puis un saut
Les deux cas ont un temps de traitement visiblement identique.

Si on écrit ça :
cpu->memory_stack_read = config->memory_stack_read;
if (cpu->memory_stack_read == NULL)
      cpu->memory_stack_read = config->memory_read;
Selon la valeur de config->memory_stack_read, le processeur effectue :
•!NULL : une affectation, puis un test, puis un saut
• NULL : une affectation, puis un test, puis une affectation
Le premier cas est visiblement aussi rapide à traiter que dans l'écriture de départ.
Le second cas est peut-être plus rapide que le premier sur un 68000 ? (affectation plus rapide qu'un saut)

Sur d'autres processeurs, qui disposent d'un op-code pour réaliser l'inversion logique (c'est à dire qui effectuent !variable en 1 cycle machine), peut-être que cette solution serait encore plus rapide :
cpu->memory_stack_read= (config->memory_read & (!config->memory_stack_read)) | config->memory_stack_read;?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

68

Zephyr (./61) :
./58 : L'indentation avec des espaces t'oblige à visualiser la source d'une seule façon. Avec une indentation en tabs, je peux choisir une taille de 4 alors que l'auteur était en 2 ou 8.

Ça ne marche que si on est très très stricts avec l'indentation (comme par exemple dans ld-tigcc), presque toutes les sources qui utilisent les tabs foirent totalement si on utilise un autre réglage que l'auteur/les auteurs.
C'est un poil moins beau (il y aura éventuellement quelques alignements qui sont perdus)

s/quelques /un nombre inacceptable d'/
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

69

Je ne suis pas de cet avis : je préfère infiniment lire un code source correctement indenté selon mes préférences (tabulations de 4 ou 8 caractères) avec quelques défauts d'alignement (du moment que les lignes de même niveau restent alignées ça me va, et c'est ce qu'il se passe) plutôt que d'être obligé de lire un truc indenté avec par exemple 2 caractères (ou pire, 1, ou 16, ou...) sans pouvoir le changer.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

70

C'est une source d'ennuis, les blocs if/else, for, while sans accolades...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

71

Zephyr (./69) :
Je ne suis pas de cet avis : je préfère infiniment lire un code source correctement indenté selon mes préférences (tabulations de 4 ou 8 caractères) avec quelques défauts d'alignement (du moment que les lignes de même niveau restent alignées ça me va, et c'est ce qu'il se passe) plutôt que d'être obligé de lire un truc indenté avec par exemple 2 caractères (ou pire, 1, ou 16, ou...) sans pouvoir le changer.

Je ne suis pas du tout d'accord, si l'auteur s'amuse à indenter par 2 ou 16 caractères c'est son choix mais c'est qu'il a fait un choix pourri, normalement c'est pas à toi de devoir reconfigurer ton éditeur pour pouvoir lire de façon correcte un code source... Et malheureusement on peut pas changer la taille des tabs sans exploser l'alignement des commentaires, donc c'est de toute façon pas très réaliste de faire ça comme ça. Par contre tu peux appliquer un preprocessing pour changer la taille de l'indentation sans pour autant changer le fait qu'un tab décale de 8 caractères, ça pour le coup c'est fiable ^^


Thibaut> c'est du code d'initialisation, donc a priori il s'en fout de la vitesse... (et puis il fait un malloc(), donc sur une plateforme genre TI ce sera de loin l'opération la plus coûteuse de la fonction)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

72

./71 : "il a fait n'importe quoi donc tant pis" ? bof, je préfère limiter autant que possible les dégats, pour moi une indentation de 2 chars c'est illisible, tandis que si les commentaires ne sont plus alignés je m'en tape un peu
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

73

GoldenCrystal (./19) :
Car quand on t'apprend a coder en école d'ingé, on t'apprend pas à indenter ton code, sans doute parce que les profs pensent que c'est inutile.
D'ailleurs on t'apprend également rarement à commenter...

Moi on m'a appris, c'est marrant tongue

(sinon pour le troll, vive le remplacement auto des tabs par 4 espaces, à bas l'accolade en fin de ligne, à bas le code de kevin d'une façon générale, j'espère que personne ne relira jamais le code de Rintintin si il pense réellement qu'un code "bien écrit" n'a pas besoin de commentaires, etc.)
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

74

Ximoon (./73) :
j'espère que personne ne relira jamais le code de Rintintin si il pense réellement qu'un code "bien écrit" n'a pas besoin de commentaires

ba la ou je taffe on s'en sort tres bien en commentant au stricte minimum les passages vraiment pas clairs, suffit de pas bosser avec une equipe de buses et d'avoir un coding style efficace tongue

75

Mais comme dit, un truc qui te semble évident à toi peut ne pas l'être pour le pauvre type qui reprendra ton code dans 15 ans...
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

76

[sondage=16048]

77

Marrant. Pourtant le plus logique serait int* a.

Pollux ./71 : OK, je n'avais pas vu.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

78

int* a; powa clairement plus oui

(sauf que int* a, b; détruit cette belle logique, malheureusement... du coup je déclare jamais plusieurs variables sur une ligne)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

79

int *a; est correct, int* n'existe pas en C, la preuve, comme déjà soulevé par Zephyr, int* a, b; ne va pas faire ce que vous attendez, c'est int *a, *b; qu'il faut mettre.

(Et sinon il manque l'option int*a;. gni)
Ximoon (./73) :
j'espère que personne ne relira jamais le code de Rintintin si il pense réellement qu'un code "bien écrit" n'a pas besoin de commentaires, etc.

Il a raison, le code C (et plus généralement le code en un langage de moyen ou haut niveau, c'est-à-dire à peu près tout sauf l'assembleur) a rarement besoin de commentaires sauf si on fait exprès de le rendre illisible (cf. IOCCC).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

80

waouh, premiere fois que je suis d'accord avec Kevin \o/

81

Ça n'est pas parceque chaque ligne est claire en lisant le code que l'ensemble l'est forcément...
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

82

si a chaque methode ou portion de code tu te prends une platree de commentaires ca n'en sera pas plus clair pour autant, je trouve meme ca degueulasse le code trop commente

quand on detaille des algos ou des methodes complexes, y'a les specs pour ca

83

Ximoon (./81) :
Ça n'est pas parceque chaque ligne est claire en lisant le code que l'ensemble l'est forcément...

Alors c'est que tu as mal nommé tes fonctions.
C'est sûr qu'une fonction clcamt aura besoin de plus de commentaires qu'une fonction calculate_amount_owed_by_Ximoon (surtout si les sous-fonctions utilisent le même type de nomenclature grin).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

84

Rintintin> je ne parle pas de plâtrée de commentaires, une ligne de temps à autre est largement suffisant à mon sens, mais aucun commentaire n'est pas envisageable. Après, effectivement une description détaillée en tête de fichier couplée à la spec devraient faire l'affaire, mais...

Kevin> Evidemment, mais c'est pas toujours si simple grin
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

85

Moi je suis d'accord avec rintintin.

http://sexycoders.com/index.php/2008-03-13/pourquoi-ne-pas-commenter-son-code/

ca ne s'applique pas à l'asm évidemment. (dsl pour la pub mais ça va bien avec la discussion j'avais pas envie de paraphraser le post)
Tout ce qui passe pas par le port 80, c'est de la triche.

86

Kevin Kofler (./79) :
int *a; est correct, int* n'existe pas en C

"n'existe pas" ? qu'est-ce que tu as voulu dire par là ? grin

Sinon puisqu'il semble utile de l'expliquer, je pense (comme Thibaut a priori) que l'astérisque a sa place à coté du "int" puisqu'elle fait partie du type de la variable (la variable a est bien de type int*), alors que int *a; n'a pas tellement de sens (la variable ne s'appelle pas *a).
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

87

Thibaut (./67) :
Godzil : C'est le code de ton émulateur ?

if (config->memory_stack_read != NULL) 
      cpu->memory_stack_read = config->memory_stack_read; 
else 
      cpu->memory_stack_read = config->memory_read; 
Selon la valeur de config->memory_stack_read, le processeur effectue :
• NULL : un test, puis un saut, puis une affectation
•!NULL : un test, puis une affectation, puis un saut
Les deux cas ont un temps de traitement visiblement identique.

Si on écrit ça :
cpu->memory_stack_read = config->memory_stack_read;
if (cpu->memory_stack_read == NULL)
      cpu->memory_stack_read = config->memory_read;
Selon la valeur de config->memory_stack_read, le processeur effectue :
•!NULL : une affectation, puis un test, puis un saut
• NULL : une affectation, puis un test, puis une affectation
Le premier cas est visiblement aussi rapide à traiter que dans l'écriture de départ.
Le second cas est peut-être plus rapide que le premier sur un 68000 ? (affectation plus rapide qu'un saut)

Sur d'autres processeurs, qui disposent d'un op-code pour réaliser l'inversion logique (c'est à dire qui effectuent !variable en 1 cycle machine), peut-être que cette solution serait encore plus rapide :
cpu->memory_stack_read= (config->memory_read & (!config->memory_stack_read)) | config->memory_stack_read;?

Sachant que le code en question est appelé généralement qu'une seule fois par exécution et que la lisibilité du code est le plus important, a vrai dire j'en ai raf c'est truc du genre ce que tu propose j'en ai ailleurs, la ou c'est vraiment utile


./63: tu sais, il y a des choses que le magic pattern ne peuvent pas faire, et être sur qu'une structure est remplie correctement, il ne le font pas, et faire plusieurs if pour remplir chacun des élément de la structure, est indispensable. Même si actuellement je suis le seul a utiliser le code, je préfère perdre 100.000 cycles au moment de l'initialisation pour être sur que quoi qu'il se passe, il n'y auras pas de problèmes.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

88

89

Ximoon (./73) :
(sinon pour le troll, vive le remplacement auto des tabs par 4 espaces, à bas l'accolade en fin de ligne, à bas le code de kevin d'une façon générale, j'espère que personne ne relira jamais le code de Rintintin si il pense réellement qu'un code "bien écrit" n'a pas besoin de commentaires, etc.)


love calin

Sinon, l'inconvénient de ne pas commenter le code en comptant sur sa "lisibilité", c'est quand on doit faire un debug rapide et qu'on n'a pas le temps de prendre du recul pour "voir ce que ça fait". Si c'est commenté de façon intelligente (i.e. pas besoin d'en faire trop, mais expliquer un point de détail, une subtilité d'application de l'analyse, indiquer quels peuvent être les appelants d'une fonction/d'un fichier lorsqu'on a une cardinalité faible, détailler une regexp un peu rock'n roll, un appel système ou autre), c'est autant de temps de gagné au niveau maintenance ponctuelle.
avatar

90