1

Hello ^^ comme certains d'entre vous ici bossent dans l'embarqué, peut être que qqn saura me répondre. En fait je me demandais combien de cycles sont grillés par le Z80 lorsqu'il saute à un vecteur d'interruption? Pour l'instant dans le doute j'ai pris la même chose que pour les RST étant donné que ça fait presque la même chose, c'est à dire 4 m-cycles. Sauf qu'il n'y a pas à décoder l'instruction pour sauter à l'IRQ, donc peut être que 3 seraient suffisants?
Merci d'avance ^^
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

2

Bah, demande dans le forum pour les TIs Z80, il doit y avoir quelqu'un qui sait là-bas.
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é

3

Ça fait trop longtemps que j'ai plus fait de Z80, donc je préfère pas dire de bêtises ^^

Celà dit, un "piège" classique est que le temps de déclenchement d'une interruption est souvent variable (et assez imprévisible) entre un minimum et un maximum suivant l'état courant du processeur. Exemple typique : l'instruction en cours ne peut pas être interrompue, donc l'interruption ne se déclenchera qu'après -> vu que toutes les instructions n'ont pas le même nombre de cycles, ça fait varier le temps de réponse à l'interruption. Tu peux avoir le même genre de phénomène avec des cycles d'accès mémoire, etc.

Je sais pas quelles sont les conditions exactes pour le Z80, mais c'est un truc à garder à l'esprit si t'as besoin d'un timing précis.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

4

Brunni (./1) :
Hello ^^ comme certains d'entre vous ici bossent dans l'embarqué, peut être que qqn saura me répondre. En fait je me demandais combien de cycles sont grillés par le Z80 lorsqu'il saute à un vecteur d'interruption? Pour l'instant dans le doute j'ai pris la même chose que pour les RST étant donné que ça fait presque la même chose, c'est à dire 4 m-cycles. Sauf qu'il n'y a pas à décoder l'instruction pour sauter à l'IRQ, donc peut être que 3 seraient suffisants?
Merci d'avance ^^



Dans l'embarqué, ça fait des lustres que plus personnes n'utilise de Z80 wink

Par contre ce n'est pas la doc qui manque sur le net, mais je crayonne ce que dit Zerosquare au détail pret, que le Z80 (l'original, je sais pas pour les version "modernes") fait partit des CPU simple du genre 6809/6502 & co, et les cycles consomé sont très facilement calculable, et généralement une interruption a lieu au prochain cycle d'horloge.

Mais globalement le temps est lié au poussage dans la pile du PC précédent et du registre de status.
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.

5

Yep merci ^^
Godzil> Plus utilisé, ok donc je suis déjà complètement dépassé grin
C'est ça alors. Finalement ce "poussage" de PC pourrait se faire en un cycle machine alors? confus
Par contre quand tu parles de statut, je ne suis pas sûr de comprendre (flags?), mais ça me fait penser à un truc bien con: je ne crois pas que les flags soient sauvés lors d'un saut à un INT handler... je vais checker que c'est bien au programme utilisateur de s'en charger (le push/pop AF servirait donc à quelque chose).

(En fait j'ai pas été super clair, je fais un ému pour la Game Boy donc 1) c'est pas tout à fait un Z80, 2) c'est à l'école donc faut que formellement je sois ok et 3) faut que le timing pour traiter notamment les interruptions STAT qui peuvent arriver en milieu de tracé du LCD soit précis.)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

6

Brunni (./5) :
Par contre quand tu parles de statut, je ne suis pas sûr de comprendre (flags?), mais ça me fait penser à un truc bien con: je ne crois pas que les flags soient sauvés lors d'un saut à un INT handler... je vais checker que c'est bien au programme utilisateur de s'en charger (le push/pop AF servirait donc à quelque chose).

Un registre de statut contien les flags en effet.Mais je vois mal comment l'utilisateur pourrait deviner qu'une interruption va se produire, sauver ses flags à la va vite, puisles remettre après. Il marche comment ce proc ?

7

Nan mais j'ai vérifié, c'est *probablement* à l'utilisateur de les sauver, parce que les jeux ont du code comme ça:

0040  jp $0469    ; VBLANK INT handler
0469  push af
[...]
0572  pop af
0573  reti        ; retour d'interruption (enable interrupts + return)

En fait quand une interruption se produit, seul le PC est sauvé sur la pile, et il prend la valeur du vecteur correspondant (40, 48, ... suivant l'interruption), les interruptions sont désactivées, le halt éventuellement levé et là quelques cycles sont consommés (je cherche justement à savoir combien wink).

Peut être qu'un code C te sera plus parlant, même si j'en doute grin
// Interruptions en attente?
if ((IME || halted) && (REG(IF) & REG(IE))) {
	unsigned i;
	// Teste les bits actifs
	for (i = 0; i < INT_LAST; i++) {
		if (REG(IF) & REG(IE) & BIT(i)) {
			// Désactive les interruptions pour éviter les IRQ multiples,
			// désactive le flag dans IF et saute à l'interruption
			REG(IF) &= ~BIT(i);
			IME = 0;
			call(0x40 + 8 * i);
			halted = 0;
			return 4;	// cycles consommés
		}
	}
}
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

8

Hmm j'ai retrouvé ça dans le code de mon émulateur en C# here... goto HandleBreakpoints; }
, apparemment j'utilisais 20 cycles: // Check for pending interrupts
if (ime && (temp = bus.EnabledInterrupts & bus.RequestedInterrupts) != 0)
{
	// Push PC on the stack
	bus.WriteByte(--sp, (byte)(pc >> 8));
	bus.WriteByte(--sp, (byte)pc);
	// Disable interrupts
	ime = false;
	// Set PC to new value acording to requested interrupts
	if ((temp & 0x01) != 0)
	{
		bus.InterruptHandled(0x01);
		pc = 0x0040;
	}
	else if ((temp & 0x02) != 0)
	{
		bus.InterruptHandled(0x02);
		pc = 0x0048;
	}
	else if ((temp & 0x04) != 0)
	{
		bus.InterruptHandled(0x04);
		pc = 0x0050;
	}
	else if ((temp & 0x08) != 0)
	{
		bus.InterruptHandled(0x08);
		pc = 0x0058;
	}
	else if ((temp & 0x10) != 0)
	{
		bus.InterruptHandled(0x10);
		pc = 0x0060;
	}
	cycleCount = 20; // I don't know the exact interrupt timing but I read somewhere it is 20, so instead of 4 i put 20
Je sais plus si l'approximation est entièrement exacte, mais ça donnait des résultats plutôt corrects en général (ceci dit j'avais quelques rares problèmes de timing a certains moments mais j'ai jamais trop réussi à trouver la source après avoir vérifié le code en long en large et en travers ^^)
Egalement ça peut t'intéresser (même si c beaucoup moins utile grinon// It seems the CPU used in GB hardware is Sharp LR35902 (aka GB-Z80)) mais j'avais trouvé le vrai nom du CPU en complétant ma documentati
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

9

Cool merci, ça me sera utile ^^ l'idéal ce serait que je puisse dire pourquoi si je choisis 20 grin
En fait pour mes timings je ne suis pas sûr qu'ils soient vraiment justes, mais j'ai fait au mieux grâce aux pandocs, et pour les instructions je me suis aidé du Z80.DOC par Sean Young (fait pour la MSX).
Je sais par exemple que Bomb Jack merde pour cause de timing (il bloque au tout début avec juste BOMB JACK écrit, mais le raster palette ainsi que la musique fonctionnent confus).

Mais sinon:
[URL=http://img504.imageshack.us/i/img219.png/][IMG]http://img504.imageshack.us/img504/4967/img219.png[/IMG][/URL]

love
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

10

Hmm pour bomb jack l'erreur doit venir d'ailleurs car moi ça marchait (cela dit je sais plus si il marche encore car j'avais pas mal modifié la gestion des interruptions écran pour *essayer* d'être plus proche du matériel) mais je vais regarder.
Quand aux 20 cycles, je me souviens plus des détails du comptage de cycle car c'est un peu tordu parfois, mais si je ne fais pas d'erreur je dirais que ça donne un truc du genre:
Un PUSH prend 16 cycles. Tu peux en retirer 4 pour le fetch & decodage de l'instruction qui n'a pas lieu pour une interruption, et en ajouter 8 pour l'assignement de PC, ce qui te donne 20 cycles.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

11

(je sais pas pour le Z80, mais le 6809 et le 6502 poussent tout seul le registre de status dans la pile, il sert d'ailleurs pour le 6502 pour savoir si c'est une NMI ou unr IRQ)
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.

12

L'affectation de PC prendrait 8 cycles? Hmm c'est pas faux, même si les bits du haut sont affectés par 0 dans ce cas, ça doit correspondre à du 16 bits!
Par contre ce qui est étrange à ce moment c'est qu'un RST prend 16 cycles alors qu'il y a le fetch & decode + push du PC + affectation du PC.
En tous cas il a l'air bien plus propre ton code, j'aime particulièrement la classe Bus hehe
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

13

Tout ce qui passe pas par le port 80, c'est de la triche.

14

Folco (./6) :
Brunni (./5) :
Par contre quand tu parles de statut, je ne suis pas sûr de comprendre (flags?), mais ça me fait penser à un truc bien con: je ne crois pas que les flags soient sauvés lors d'un saut à un INT handler... je vais checker que c'est bien au programme utilisateur de s'en charger (le push/pop AF servirait donc à quelque chose).

Un registre de statut contien les flags en effet.Mais je vois mal comment l'utilisateur pourrait deviner qu'une interruption va se produire, sauver ses flags à la va vite, puisles remettre après. Il marche comment ce proc ?

La sauvegarde des flags se fait juste après/avant la sauvegarde du compteur programme/pointeur d'instruction lorsque l'interruption est reçue.

Je n'ai pas trop de détails sur le Z80 (bien que j'aie un bouquin à proximité où je peux regarder si j'arrive à vaincre ma flemme), mais sur le 68k, SR et PC sont sauvés sur la pile superviseur ET le statut est modifié avec le nouveau niveau d'interruption et le bit "superviseur" forcé à 1, donc sauvegarder les flags APRÈS serait s'y prendre un peu tard...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

15

Oui, mais tu parles d'interruption générée par un programme, ou d'une auto-interruption ?

16

Ici, je parle d'interruption matérielle. Mais les interruptions logicielles fonctionnent pareil à ma connaissance (sauf peut-être au niveau du niveau d'interruption 68k ou de l'interdiction d'interruption en Z80).
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

17

Ce qui arrive sur la pile dépend de l'interruption. Après, le SR y est toujours, à ma connaissance.

18

Bon je vais passer pour un débile profond mais je ne savais pas qu'il y avait un registre de statut dans le Z80...
Mais j'imagine quoi qu'il en soit que la GB n'en a pas, puisqu'apparemment ils ont coupé tout ce qui était utile pour les OS (in/out remplacé par ldh, pas de deuxième set de registres, etc.). Mais si qqn pouvait confirmer... ^^'
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

19

?
Le statut c'est juste les flags, je vois mal comment ton émulateur pourrait marcher si t'avait pas implémenté ça ^^
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

20

Beurk, tu codes toujours en mode DOS? C'est totalement obsolète, non portable et en plus tu utilises une interface faite pour afficher directement sur l'écran en virtualisé.
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é

21

Dites vous avez pas un peu l'impression de tous raconter de la merde et en plus de vous éloigner du sujet ?
1) Le CPU de la GameBoy ne sauvegarde pas les flags. Et surtout vu la fonctionnalité du truc (de même pour le vrai Z80 avec ses 2 + 2 flags supplémentaires...) aller jusqu'à jusqu'à apeller ça un registre de statut et faire douter Brunni la dessus (surtout que je sais pas si vous avez remarqué mais il vous a dit que le CPU ne sauvegarde pas les flags et il arrive à faire tourner des jeux ! houhou -_-) est limite abusé. L'interruption est générée -> le programme fait ce qu'il veut, y compris sauvegarder (PUSH AF) et restaurer (POP AF) les flags si besoin, ça s'arrête là. Et y'a pas de mode superviseur ou autre donc on s'en branle du reste.
2) Kevin je sais pas si tu te rappelles mais Brunni avait codé un certaine lib (que je trouve très crade sur le concept mais passons tongue) permettant de dessiner par dessus l'écran de la console, c'est certainement ça qu'il utilise là. Et ensuite je pense qu'on s'en branle complètement avec quoi il code. Il sait coder et il est assez grand pour faire ses choix lui même.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

22

GoldenCrystal (./21) :
Dites vous avez pas un peu l'impression de tous raconter de la merde et en plus de vous éloigner du sujet ?

Certes.

23

En effet, j'ai jeté un coup d'oeil au "bouquin" (plutôt une cheet sheet en réalité) et une interruption n'affecte pas les flags (en fait plus un CCR qu'un SR).
Apparemment, il y a bien un statut lié aux interruptions, modifié par les instructions EI, DI, IM, RETI et RETN, mais il n'est pas accessible en tant que registre.

Aussi, je trouve ça bizarre que le Z80 ait deux jeux de registres HL, AF, BC, DE mais un seul pointeur de pile...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

24

Lol mais c'est clair que c'est crade (hint: GetForegroundWindow, GetDC, StretchBlt, GetAsyncKeyState... et ReleaseDC parce que j'ai beau être un gros porc, je suis un porc propre smile).
Cela dit, voilà qui devrait ravir Kevin: l'interface finale sera faite avec wxWidgets smile
GC> Donc ok, pour moi le registre de statut c'était plus "système" que simplement des flags (je pensais plutôt au mode superviseur, toussa). Merci bcp de tes explications en tous cas smilesmile
Sinon je ne sais pas si c'est nécessaire d'ouvrir un nouveau topic pour ça mais je me demandais comment tu avais implémenté DAA (decimal adjust accu)? Les émulos ont l'air de faire un truc over mega complexe, là où perso j'ai juste:
// daa: http://www.geocities.com/siliconvalley/peaks/3938/z80syntx.htm#DAA
// Dernière op.: addition ou soustraction?
s8 direction = flag_test(F_N) ? -1 : 1;
// Exemple: 0x8 + 0x3 = 0xb -> 0x11 (+6)
if (flag_test(F_H) || (accu & 0xf) >= 0xa)
    accu += direction * 0x06;
// Pareil pour le digit du haut
if (flag_test(F_C) || (accu & 0xf0) >= 0xa0) {
    accu += direction * 0x60;
    flag_set(F_C);
}
flag_clear(F_H | F_Z);
if (accu == 0)
    flag_set(F_Z);
return 1;   // m-cycles

J'ai peut être mal compris / oublié qqch?
(pour l'instant j'ai vu que SML2 et Dr. Mario s'en servent pour le score et ça marche)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

25

(attention quand même pour le coup de réutiliser la fenêtre console : j'avais déjà essayé aussi, mais je crois que j'avais abandonné cette voie car ça faisait des choses bizarres dans certains cas... me rappelle pas du tout quoi, par contre :/)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

26

Yep, mais comme je l'ai dit ça utilisera wxWidgets au final wink mais sinon ça marche pas trop mal pour l'instant, la méthode super crade est même documentée chez Microsoft donc bon grin
http://support.microsoft.com/kb/124103

Et sinon, game of the day is: love
Qww1

Ce con plantait après qu'on ait entré son nom (le faux espoir!) parce que j'ai fait le boulet au niveau des flags:
void accu_write(int val) {
    flag_clear(F_C | F_Z);
    if (val == 0)	// Z si résultat nul
    	flag_set(F_Z);
    if (val & ~0xff)	// C si débordement (bits autres que les 8 du registre)
    	flag_set(F_C);
    accu = val & 0xff;
}

Dans le cas où le résultat passé était 0x100 (0x80 + 0x80 par exemple) le flag Z n'était pas mis... et ce machin se cassait la gueule. J'ai passé un temps de malade à déboguer ça fatigue
En rapport avec les interruptions j'ai aussi appris à mes dépends qu'aucune interruption VBLANK ou STAT n'arrive lorsque le LCD est désactivé. Super Mario Land 2 change de banque dans l'interrupt handler, sans la restaurer à la fin. Donc après quand il retournait de la fonction en cours à une adresse >= $4000 il se vautrait lamentablement.
Bon va falloir que j'implémente la sauvegarde, l'envie de jouer me démange de plus en plus grin
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

27

Pour le DAA j'avais fait un truc bête et méchant, et a priori tu as la même chose donc ça doit être bon wink
http://code.google.com/p/crystalboy/source/browse/trunk/CrystalBoy.Emulation.ProcessorGenerator/Templates/Daa.cs
(Par contre j'ai foutu sans faire exprès le header GPL sur tous les template va falloir que je retravaille ça quand j'y retoucherai, mais j'ai pas le temps pour l'instant sad)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

28

La GPL ne te convient-elle pas?
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é

29

Brunni (./26) :
Yep, mais comme je l'ai dit ça utilisera wxWidgets au final wink mais sinon ça marche pas trop mal pour l'instant, la méthode super crade est même documentée chez Microsoft donc bon grin
http://support.microsoft.com/kb/124103

Oué enfin je cite :
Le HWND obtenu n'est pas garantie être adapté pour toutes les opérations handle de fenêtre.
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.

30

J'ai jeté un coup d'oeil et il est *vraiment* plus propre ton code, j'ai trop honte grin
Mais merci c'est bien ça! Je me demande pourquoi les émus genre VBA font des trucs aussi bourrins, mais si on regarde (p.ex. TGB) finalement c'est un peu la même chose, juste écrit en l33t:
case 0x27://DAA :state 4
  tmp.b.h=REG_A&0x0F;
  tmp.w=(REG_F&N_FLAG)?
  (
    (REG_F&C_FLAG)?
      (((REG_F&H_FLAG)? 0x9A00:0xA000)+C_FLAG):
      ((REG_F&H_FLAG)? 0xFA00:0x0000)
  )
  :
  (
    (REG_F&C_FLAG)?
      (((REG_F&H_FLAG)? 0x6600:((tmp.b.h<0x0A)? 0x6000:0x6600))+C_FLAG):
      (
        (REG_F&H_FLAG)?
          ((REG_A<0xA0)? 0x0600:(0x6600+C_FLAG)):
          (
            (tmp.b.h<0x0A)? 
              ((REG_A<0xA0)? 0x0000:(0x6000+C_FLAG)): 
	      ((REG_A<0x90)? 0x0600:(0x6600+C_FLAG))
          )
      )
  );
  REG_A+=tmp.b.h;
  REG_F=ZTable[REG_A]|(tmp.b.l|(REG_F&N_FLAG));
//  FLAGS(REG_A,tmp.b.l|(REG_F&N_FLAG));
  break;


Tu n'émules pas le son GC? smile C'est pourtant passionnant, tu devrais vraiment quand tu trouveras le temps miam

./29> Ouéouéouéoué tongue Les side effects y a pas besoin de chercher très loin de toute: si t'as pas Aero, la console est redessinée de noir si tu passes une autre fenêtre par-dessus (donc il faut constamment mettre à jour l'affichage, et ça devient vraiment hacky si tu dois intercepter les WM_PAINT pour cette fenêtre via un system hook) et si la console défile bah c'est foutu aussi.
Un autre side effect du GetForegroundWindow c'est un truc du genre si tu perds le focus entre la création de la fenêtre et le démarrage de l'appli:
[URL=http://img39.imageshack.us/i/img225.png/][IMG]http://img39.imageshack.us/img39/5715/img225.th.png[/IMG][/URL]

La lib dont Crystal parlait au ./21 c'était une réimplémentation de la console avec des fonctions graphiques au pixel en plus si je me rappelle bien, pas tout à fait pareil ^^
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741