Page 1 sur 1

EMU: overflow flag

Publié : ven. 23 oct. 2009 21:48
par Tanuki
Pour calculer le drapeau 'overflow' de l'instruction ADC (HuC6280), j'ai trouvé les codes suivants:

Code : Tout sélectionner

Ootake:

  _VF = (Uint8)((~(_A^val) & (_A^sum) & CPU_NF) >> 1);

TGEmu:

  if (~(A^tmp) & (A^sum) & _fN)
   P |= _fV;

Mednafen:

  _P|=((((_A^x)&0x80)^0x80) & ((_A^l)&0x80))>>1;
Les exemples de code ci-dessus, implémentent sous différentes formes cette expression-ci:
(A, B : opérandes, S : somme)

(NOT(A XOR B) AND (A XOR S)) AND $80

Il existe une forme légèrement plus simple qui permet de zapper l'opérateur unaire NOT:

((A XOR S) AND (B XOR S)) AND $80

Exemple:

Code : Tout sélectionner


 if ((a ^ sum) & (b ^ sum) & 0x80)
  P|= OF;


Re: EMU: overflow flag

Publié : lun. 26 oct. 2009 15:42
par MooZ
La dernière version est la plus lisible je trouve. Et pour faire mon malin, sachant que l'overflow flag est le 6ème bit du registre de statut, tu peux faire comme mednafen et tgemu :

Code : Tout sélectionner

 statusReg |= ( ( (acc ^ res) & (op ^ res) ) & 0x80 ) >> 1
Image
Sinon rien à voir (ou presque). Pour vérifier l'état du registre de statut issue d'un bout de code 6502, j'utilise py65. C'est plutôt sympa. Mais malheureusement ça ne supporte pas la pcengine.
Par exemple tu lances py65 depuis un terminal et tu pastes ce bout de script:

Code : Tout sélectionner

reset
assemble c000 lda #%11000000
assemble c002 sta $00
assemble c004 clc
assemble c005 lda #%10000000
assemble c007 adc $00
goto c000
Et il te sort :

Code : Tout sélectionner

       PC  AC XR YR SP NV-BDIZC
6502: c009 40 00 00 ff 01000001

Re: EMU: overflow flag

Publié : lun. 26 oct. 2009 16:33
par Tanuki
MooZ a écrit :statusReg |= ( ( (acc ^ res) & (op ^ res) ) & 0x80 ) >> 1
C'était juste pour faire le plus simple possible, mais c'est vrai que comme celà, on évite de faire un branchement conditionnel.

Quand on pense (qu'en vrai) pour les opérations ADC et SBC, le drapeau overflow est juste un XOR entre les deux dernières retenues ... :?

Sinon je ne connaissais pas py65, merci pour l'info. :)