Symulator procesora 8086

0

Na studia mam stworzyć symulator procesora 8086 z koprocesorem 8087, który będzie stanowił pomoc dydaktyczną. Jako narzędzia wykorzystuję C++\Qt. Symulator powinien mieć zaprogramowane działanie alu, rejestrów, koproceora, pamięci i jej adresowanie. Nie interesują mnie urządzenia zewnętrzne. Powinien posiadać edytor, który będzie zezwalał na wykonanie prostych kodów asma krok po kroku i podglądem na bieżąco (pamięć, rejestry..).

Problem mam taki, że trochę średnio wiem jak to zrealizować, pierwszy raz będę robił coś takiego. Mam średnią koncepcję jak zorganizować (jakie struktury, jakich typów używać) i jak zaprogramować poszczególne elementy, jak przetwarzać kod asma wpisany w edytor (opcode?).

Nie mam pomysłu jak zaprogramować taki symulator, czy moglibyście odesłać mnie do stron, przykładów, artykułów opisujących problem, ewentualnie napisać jaki macie na to pomysł.

Znacie może jakieś porządne źródła dobrze opisujące działanie 8086 i 8087? Póki co jedynym moim źródłem jest Anatomia PC, a to za mało.

Z góry dziękuję za pomoc

0

Kiedyś pisałem symulator z procesorem 8051 w C#, myślę, że swój symulator możesz zrealizować w podobny sposób.

Każdą pamięć (ROM, RAM, pamięć programu, czy jakaś inna) zrealizuj w formie tablicy o tej wielkości, jaka jest rzeczywiście duża.

Każdy rejestr procesora będzie zmienną globalną klasy, która odpowiada za pracę programu.

Właściwą pętlę wykonawczą zrealizuj w taki sposób: Niech jest zmienna "Working" typu bool. W momencie uruchomienia programu zmienna Working przyjmuje wartość true i w drugim wątku wchodzi do pętli. Zatrzymanie programu to zmiana wartości Working na false.

Sama pętla mogłaby wyglądać mniej więcej następująco:

Working = true;
while (Working)
{
 if (CzyNastapiloPrzerwanie())
 {
  WejdzWStanObslugiwaniaPrzerwania();
 }
 OpCode = PobierzKodRozkazu();
 switch (OpCode)
 {
  case 0:
   CyklPrzedInstrukcja();
   WykonajInstrukcje0();
   CyklPoInstrukcji();
   break;
  case 1:
   CyklPrzedInstrukcja();
   WykonajInstrukcje1();
   CyklPoInstrukcji();
   break;
  case 2:
   CyklPrzedInstrukcja();
   WykonajInstrukcje2();
   CyklPoInstrukcji();
   break;
 }
}

Polecenia CyklPrzedInstrukcja() i CyklPoInstrukcji() byłyby tyle razy pod rząd, z ilu cykli zegarowych składa się wykonanie danego rozkazu. Wewnątrz tych instrukcji może być np. praca jakiegoś licznika, zegara lub synchronizacja pracy z innymi elementami symulatora.
Polecenie WykonajInstrukcjeX() to operacje na rejestrach i pamięci, które wykonuje dana instrukcja.
Instrukcja WejdzWStanObslugiwaniaPrzerwania() to operacje, które wykonuja się, jak jest sygnał przerwania, czyli zapisanie stanu licznika rozkazów na stosie, ustawienie jakiś flag, oczywiście wśród rozkazów powinien być powrót z obsługi przerwania.

Wyświetlanie na ekranie może być w stałych odstępach czasowych lub co np. 100000 rozkazów (ilość należy dobrać doświadczalnie).

0

jak przetwarzać kod asma wpisany w edytor (opcode?).

AMD64 Architecture Programmer’s Manual
http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/

Intel® 64 and IA-32 Architectures Software Developer's Manual
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

to są opasłe tomiszcza zawierające wszystko co mają najnowsze procesory, więc do 8086/8087 potrzebujesz tylko ułamka informacji tam zawartych, ale "wszystko tam jest".

1 użytkowników online, w tym zalogowanych: 0, gości: 1