Autor ::Dr.Sid Poslaná :: 21.06.2009 11:35:36 Predmet ::Popis instrukci
Nazdar borci. Skvela prace !
Sam bych si ale taky emulatorek napsal. Ne, rozhodne nehodlam konkurovat, to ani neni treba, ale proste me laka nejaky si napsat, a PMD je jasna volba, jednak je jednoduche, a druhak ho dobre znam.
S udivem a nadsenim jsem zjistil ze tady mate komentovane vypisy romky, to jsem primo zamackl slzu. Ale potreboval bych jeste sehnat nejaky popis instrukci procesoru. Nejak to dam dohromady z toho vypisu prinejhorsim, ale radeji bych se tehle fazi vyhnul, taky z romky nevyctu casovani. Co se tyce hardwaru, ta vetsinu veci si pamatuju a co ne to vylustim z romky.
Správa
Autor ::Roman Bórik Poslaná :: 21.06.2009 13:28:11 Predmet ::Re: Popis instrukci
Tabuľku inštrukcií si môžete stiahnuť tu.
Na tomto linku je naskenovaný článok z Aktualít k Zbrojováčku s detailným popisom inštrukcií 8080.
Samozrejme, ďakujeme za uznanie ;-) a prajeme veľa zábavy pri písaní vlastného emulátora.
Správa
Autor ::Dr.Sid Poslaná :: 21.06.2009 18:21:54 Predmet ::Re: Popis instrukci
Dik za podklady !
Správa
Autor ::Dr.Sid Poslaná :: 08.07.2009 16:30:59 Predmet ::Re: Popis instrukci
Pres vikend jsem se na to vrhnul .. a uz mi projde romka az k zobrazeni 'Os Ready' .. zdaleka nemam vsechny instrukce a z hardwaru mam jen obrazovku, ale je to uzasna junda.
Správa
Autor ::Roman Bórik Poslaná :: 10.07.2009 08:16:37 Predmet ::Re: Popis instrukci
Super! Len tak ďalej.
Správa
Autor ::Dr.Sid Poslaná :: 13.07.2009 23:09:27 Predmet ::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.
Správa
Autor ::Roman Bórik Poslaná :: 14.07.2009 09:04:40 Predmet ::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] = { ... };
Správa
Autor ::Roman Bórik Poslaná :: 14.07.2009 09:07:39 Predmet ::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]);