Skip to content

tomekjaworski/8051emu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 

Repository files navigation

8051emu

Repozytorium zwiera środowisko symulatora mikroprocesorów o architekturze 8051 wraz z asemblerem. Oprogramowane zostały trzy wersje kości:

about_mini

Opis

Projekt powstał w 1999-2001, gdy uczęszczałem do szkoły średniej (Technikum Elektroniczne w Kutnie). Miał on zastąpić środowisko DSM51 firmy MicroMade, używane na zajęciach z programowania mikroprocesorów.

Środowisko składa się z dwuprzebiegowego asemblera - kompilatora języka asembler w postaci pełnej listy rozkazów '51 oraz z debuggera. Całość napisałem w języku Borland Pascal 7.0, a pracuje ona poprawnie w trybie chronionym 16 bitowym, pod kontrolą systemu DOS. Do wykonania interfejsu okienkowego wykorzystałem popularny wówczas pakiet Turbo Vision.

Repozytorium GIT nie zawiera ostatecznej wersji środowiska, a jedynie najaktualniejszą wersję źródeł, jaką znalazłem. Nie znałem wtedy koncepcji repozytorium kodu źródłowego, a GIT miał powstać dopiero za kilka lat ;-). Jeżeli kiedyś natrafię na ostatnią wersję - z pewnością ją tutaj opublikuję.

Kompilacja/uruchomienie

Do kompilacji konieczne jest DOSowe środowisko Borland Pascal 7.0 (profesjonalny odpowiedni Turbo Pascala) oraz DOSBox. Pakiety te można pobrać tutaj:

Konfiguracja DOSBox:

Poniżej znajduje się lista zmian, które można wprowadzić do pliku dosbox.conf:

[sdl]
windowresolution=1280x800
output=overlay
hwscale=2.00

autolock=false
sensitivity=100

[cpu]
core=auto
cputype=auto
cycles=fixed 30000
cycleup=10
cycledown=20

[autoexec]
mount c: C
imgmount a: A\floppy.img -t floppy
z:\config -set dos keyboardlayout pl
c:
cd \
call c:\autoexec.bat

Zmiany te obejmują:

  • Powiększenie okna symulacji 2x (zoom)
  • Poprawienie współpracy ze sterownikiem myszy w przypadku korzystania z Remote Desktop
  • Przyspieszenie symulacji
  • Uruchomienie polskich czcionek oraz strony kodowej 852.

Powyższe zmiany jedynie uprzyjemniają pracę z całym systemem i nie są konieczne do jego kompilacji i uruchomienia.

Kompilacja

W pierwszej kolejności należy zainstalować pakiet Borland Pascal w wersji pełnej. Po zainstalowaniu należy uruchomić środowisko BP poleceniami:

cd C:\BP\BIN
BP

A następnie skompilować i uruchomić:

W wyniku kompilacji wygenerowane zostaną pliki debug.exe oraz kompil51.exe - właściwe pliki wykonywalne.

Debugger - moduł uruchomieniowy

Po uruchomieniu skompilowanego debuggera, bezpośrednio z poziomu IDE Pascala lub plikiem debug.exe, środowisko przywita się następującym widokiem: start

Cechy debuggera:

  • Emulacja architektury 8051 na poziomie sprzętowym wraz z liczeniem cykli. Pozwala to dokładnie określić czas działania kodu, co jest krytyczne w przypadku budowania systemów czasu rzeczywistego.

  • Możliwość wczytywania plików wykonywalnych w formacie Intel HEX oraz w formacie RAW (binarne zrzuty pamięci).

  • Możliwość zapisywania plików wykonywalnych w formatach BIN/HEX.

  • Możliwość wczytywania symboli z plików generowanych przez kompilator kompil51 (pliki .SYM); wczytane symbole można w pełni edytować i ponownie zapisywać na dysk.

  • Możliwość pracy debuggera krok po kroku wraz z animacją procesu wykonywania.

  • Możliwość edycji zawartości pamięci RAM (danych) oraz ROM (kodu programu).

  • Pełna interaktywność środowiska - na zmiany zawartości rejestrów RAM/pamięci ROM natychmiast reagowały pozostałe elementy interfejsu, np. poprzez aktualizację zawartości okna śledzenia stanu CPU.

  • Okno śledzenia stanu CPU wyświetla nazwy symboli w miejscach adresów, co znacząco ułatwia proces debugowania.

Widoki aplikacji

Okno debuggera - śledzenia stanu i pracy mikroproceosra po wczytaniu programu. debug_window

Możliwość dodawania wielu pułapek, na których następnie program się zatrzymywał. breakpoints

Możliwość generowania przerwań zewnętrznych jak i wewnętrznych. interrupt_generation

Edytor pamięci ROM (programu): memory_editor2

Edytor pamięci RAM (rejestry, pamięć ogólnego przeznaczenia): memory_editor

Wczytaną pamięć programu można w każdej chwili zmodyfikować tak, aby wprowadzić drobne zmiany bez konieczności ponownej kompilacji i restartu symulacji mikroprocesora. memory_editor_byte

W oknie stanu mikroprocesora można zmienić wartość każdego rejestru (tutaj P3), flag, numeru banku pamięci oraz stosu. register_editor

Do wczytanego programu można dodać/usuwać symbole. symbol_editor

Można je też edytować; symbole podzielone są na dwa zbiory - dla przestrzeni RAM oraz ROM, co jest naturalną konsekwencją harwardzkiej architektury 8051. symbol_editor2

Program można uruchomić w trybie pracy ciągłej - wykonuje się sam do jego przerwania lub natrafienia na pułapkę. trace_animation

Animacje

Animacja przedstawiająca proces wczytywania pliku wykonywalnego w formacie Intel HEX wraz z listą symboli. Po pomyślnym wczytaniu uruchamiana jest opcja animacji wykonywania kodu (Uruchom). video_debugging

Nie ma dobrego środowiska uruchomieniowego bez pułapek, prawda? Prawda! A skoro tak, to tutaj widać chwilę ustawienia pułapki oraz wstrzymywanie procesu wykonywania po natrafienia na nią. video_run_to_breakpoint

Zastosowanie środowiska Turbo Vision oraz mechamizmu wymiany komunikatów ułatwiło zachowanie interaktywności. Poniżej widać, jak zmiany stanu pamięci RAM procesora natychmiast wpływają na zawartość okna podglądu pamięci RAM jak i na zawartość okna śledzenia CPU. video_live_ram

Kompilator

Jest to typowy kompilator dwuprzebiegowy. W pierwszym przebiegu następuje kompilacja kodu, co pozwala na określenie adresów wszystkich symboli. W drugim natomiast następuje uzupełnienie informacji adresowych w generowanym kodzie oraz jego faktyczne wygenerowanie.

Ciekawe elementy:

  • wbudowany preprocesor - można rekurencyjnie dołączać pliki nagłówkowe (taki odpowiedni #include z C/C++)
  • możliwość wykorzystania wyrażeń całkowitych (np. 2 * (2 + 2)) jako wyrażeń liczbowych.

W wersji dostępnej w repozytorium kompilator zafiksowany jest na AT89C2051 oraz plik TEST.ASM.


Podczas pisania kodu można wybrać jeden z kilku predefiniowanych mikroprocesorów: chip_select.png

Do pisania kodu można wykorzystać wbudowany w Turbo Vision edytor. code_editor.png

Podczas kompilacji kompilator generuje następujące komunikaty podsumowujące. compiler_output.png

Tutaj wszystko poszło po myśli autora kodu :)

Cechy wersji ostatecznej

Poniżej znajduje się lista cech, które posiadała wersja ostateczna, a która gdzieś zaginęła.

  • Pełna integracja kompilatora z debuggerem (działająca funkcja Kompiluj)
  • Współpraca z modułem DSM51.
  • Symulacja peryferiów DSM51 (nie pamiętam już których).
  • Programator AT89Cx051 podłączany do portu LPT (to było programowanie High Voltage, chyba...)

Wnioski

Jeżeli szukasz przykładu jak budować symulatory, to ten kod nie jest najlepszym miejscem :) Choćby z tego powodu, że Pascala nikt już nie używa. Pamiętam również, że pod koniec miałem problem z modułowością oraz brakiem abstrakcji - kod ma wiele miejsc wyspecjalizowanych do podrodziny AT90C, brak zasady jedna klasa = jeden plik, itd... To była najważniejsza lekcja, jaką otrzymałem w tym projekcie :-)

Zarówno sam silnik wykonawczy debuggera jak i kompilator pisałem według własnych pomysłów - nigdy wcześniej tego nie robiłem. A o książce ze smokiem - Kompilatory. Reguły, metody i narzędzia, Aho Alfred V. i inni dowiedziałem się dopiero na studiach.

Jeżeli jednak chcesz skorzystać i tych źródeł - powodzenia! I napisz maila; może będę mógł jakoś pomóc. :)