Forum

From PMD 85 Infoserver

Jump to: navigation, search
:: back to start of topic :: back to topic list ::
Message
Author  Author ::  Roman Bórik
Posted  Posted ::  2009-07-10 08:16:37 AM
Subject  Subject ::  Re: Popis instrukci
Super! Len tak ďalej.
 
Message
Author  Author ::  Dr.Sid
Posted  Posted ::  2009-07-13 11:09:27 PM
Subject  Subject ::  Re: Popis instrukci
Tak prvni zakys. Jak ma fungovat AC priznak pri odecitani ? Zkousel jsem to krokovat ve vasem emulatoru a nejak mi to nedava smysl. Neni to ani jako pri scitani, ani negace flagu po pricteni doplnku (jak to ma CY).

Jinac uz mam klavesnici, editace radku jede, prikazy zda se jedou, akorat dump vypisuje nesmysly, prave proto ze tam se pouziva DAA a AC. DAA mi zda se jede dobre, ale jak je na adrese 888c 'sbi 2f' tak tam se mi to AC vychazi jinak nez vam .. a vysledek je spatne.
 
Message
Author  Author ::  Roman Bórik
Posted  Posted ::  2009-07-14 09:04:40 AM
Subject  Subject ::  Re: Popis instrukci
Ako bol písal Dex, vyladenie flagov je zvyčajne najväčšia "zábava". Ja som sa tiež pôvodne snažil nájsť na nete rôzne implementácie emulácie i8080, ale nie vždy to čo som našiel bolo správne, takže som nakoniec "ladil" inštrukcie na reálnom PMD 85. V každom prípade mi niektoré implementácie pomohli v tom, že ma inšpirovali, ako na tie flagy ísť. Sám by som na všetko asi neprišiel.
Aby nastavovanie flagov "nezdržiavalo", časť je robená cez tabuľky:


// Tabulka vyhodnotenia pomocneho prenosu AC po operaciach ADD a SUB.
// To ci nastalo AC je mozne zistit z 3. bitu oboch argumentov a vysledku.
// Index do tabulky je vo forme r21, kde r je 3. bit vysledku, 1 je 3. bit prveho
// argumentu (registra A) a 2 je 3. bit druheho argumentu.
// Tabulka je odlisna pre operaciu scitanie a odcitanie.
//
BYTE ChipCpu8080::auxcarryAddTable[8] = {
  0, FLAG_AC, FLAG_AC, FLAG_AC, 0, 0, 0, FLAG_AC
};
BYTE ChipCpu8080::auxcarrySubTable[8] = {
  FLAG_AC, FLAG_AC, 0, FLAG_AC, 0, FLAG_AC, 0, 0
};


Tabuľka pre ostatné príznaky (okrem CY) je dopredu vygenerovaná a v kóde je ako pole bytov:

// Tabulka vyhodnotenia priznakov S, Z, 5, 3, PE a 1

// Tabulka bola vytvorena nasledujucim algoritmom
/*
  int ii, jj, kk;
  BYTE byte;

  for (ii = 0; ii < 0x100; ii++) {
    jj = ii;
    // vypocet parity
    byte = 0;
    for (kk = 0; kk < 8; kk++) {
      byte ^= (jj & 1);
      jj >>= 1;
    }

    sz53p1Table[ii] = (ii & FLAG_S) | (byte ? 0 : FLAG_PE) | FLAG_1;
  }
  sz53p1Table[0] |= FLAG_Z; // Z je nastavene pre hodnotu 0
*/
BYTE ChipCpu8080::sz53p1Table[0x100] = { ... };
 
Message
Author  Author ::  Roman Bórik
Posted  Posted ::  2009-07-14 09:07:39 AM
Subject  Subject ::  Re: Popis instrukci
Tabuľka pre DAA je tiež dopredu vygenerovaná a v kóde je ako pole wordov:

// Tabulka pre instrukciu DAA.
// bity 7:0 indexu predstavuju hodnotu z A pred vykonanim DAA
// bit 8 indexu je CY pred vykonanim DAA
// bit 9 indexu je AC pred vykonanim DAA
// vyssi byte hodnoty predstavuje hodnotu A po vykonani DAA
// nizsi byte hodnoty predstavuje nastavenie priznakov (F) po vykonani DAA
//
// Tabulka bola vytvorena nasledujucim algoritmom
/*
  int ii;
  WORD af;
  BYTE byte;

  for (ii = 0; ii < 0x400; ii++) {
    byte = (ii & 0xFF);
    af = 0;
    if ((ii & 0x200) || (byte & 0x0F) > 9) { // AC
      if ((byte & 0x0F) > 9)
        af |= FLAG_AC;
      byte += 6;
    }
    if ((ii & 0x100) || (byte & 0xF0) > 0x90) { // CY
      byte += 0x60;
      af |= FLAG_CY;
    }
    af |= ((byte << 8) | sz53p1Table[byte]);

    daaTable[ii] = af;
  }
*/
WORD ChipCpu8080::daaTable[0x400] = { ... };

Pochopiteľne, jednotlivé inštrukcie sú spracovávané osobitne a predošlé tabuľky sú používané pre spoločné "vlastnosti".
 
Message
Author  Author ::  Dr.Sid
Posted  Posted ::  2009-07-13 11:58:54 PM
Subject  Subject ::  Re: Popis instrukci
Tak ne, chyba je v tom jak pricitam CY .. ne v AC .. to uz si najdu. Sorry :-D
 
Message
Author  Author ::  dex
Posted  Posted ::  2009-07-14 07:17:57 AM
Subject  Subject ::  Re: Popis instrukci
To znám.
Když jsem psal emulátor Apple I pro ZX Spectrum, měl jsem nahrubo instrukce a hardware za den, a pak týden u instrukcí ladil flagy :o)
:: back to start of topic :: back to topic list ::