logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak emulować 8086 na ATmega128 z 1MB SRAM i obsługą klawiatury/myszy?

gumispl 06 Lip 2009 13:29 3577 6
REKLAMA
  • #1 6744693
    gumispl
    Poziom 11  
    Posty: 16
    Ocena: 1
    Witam.

    Jako iż wakacje i mam dużo czasu postanowiłem zabrać się za zbudowanie odświeżonej kopii IBM PC.

    Procesorem układu byłaby ATmegax128/ATmega128 która odpowiadała by za emulację 8086, jako RAM służyło by 1MB 16bitowej równoległej pamięci SRAM.
    Program w atmedze odpowiadał by za pobieranie programu z ramu i jego interpretowanie, emulował by również przerwania biosu jak i dosowe 21h.
    Komunikacja po szynie SPI z kartą pamięci SD która służyła by jako dysk twardy.
    W trybie tekstowym atmega przesyłała by znaki do wyświetlenia po szynie I2C lub SPI do układu karty graficznej (jeszcze nie obmyślone ;).
    W trybie graficznym adresowanie pamięci 0xA0000-0xBFFFF odwoływało by się bezpośrednio do buforu karty graficznej.

    Zastanawiam się nad sposobem komunikacji z myszą i klawiaturą:
    a) podłączyć bezpośrednio klawiaturę i mysz do portów atmegi, w razie poruszenia myszką czy naciśnięcia klawisza generowane było by przerwanie podczas którego atmega odbierała by dane od myszy/klawiatury i buforowała je w swojej wewnętrznej pamięci sram. Emulowane przerwania biosu pobierały by dane z tych buforów.
    Obawiam się jednak, że przy takim rozwiązaniu ciągłe poruszanie myszką może drastycznie zwolnić pracę procesora (atmega będzie wykonywała tylko żądanie przerwania)
    b) podłączyć klawiaturę, mysz do osobnego małego mikrokontrolera który buforował by dane i w razie potrzeby transmitował dane przez I2C/SPI do głównego procesora.
    c) tak jak wyżej, lecz użyć jakiegoś mikrokontrolera z większa ilością wyprowadzeń i fizycznie zmapować cześć adresowania dla buforu klawiatury/myszy.
    Rozwiązanie to nie podoba mi się o tyle, że tworzy dodatkową ilość połączeń;D

    Dużym zapytaniem jest dla mnie szybkość emulacji, przy wydajności oryginalnego 8086 wynosząca 0,33MIPS i wydajności ATmegix na poziomie 32MIPS teoretycznie emulacja może być aż 96 razy wolniejsza a i tak zachowam oryginalną prędkość działania. Jednak mogłem coś pominąć ;)
    Wybór pomiędzy ATmega128 a ATmegax128 jest uzależniony właśnie od prędkości, gdy 16Mhz w Atmedze128 byłoby wystarczające wolałbym nie wybierać mało dostępnej ATmegix.

    Czekam na jakieś opinie i wskazówki ;)
  • REKLAMA
  • REKLAMA
  • #3 6746479
    gumispl
    Poziom 11  
    Posty: 16
    Ocena: 1
    Znam ten projekt, PC to jednak nie Amiga.
    Amiga była dosyć rozbudowanym systemem, wiele wyspecjalizowanych układów które ciężko byłoby emulować Atmegą :D

    Na FPGA jeszcze przyjdzie czas, póki co nie czuję się na siłach ;)
  • #4 6753345
    mdziewie
    Poziom 19  
    Posty: 312
    Pomógł: 15
    Ocena: 545
    Pamiętaj, że przy wykorzystaniu zewnętrznego ramu wydajność atmegi "trochę" spada (z drugiej strony, nie używamy - jak rozumiem - tego ramu częściej, niż dwa razy na cykl emulowanej maszyny, czyli średnio raz na te 48 cykli atmegi).
    Ciekawy projekt, pozdrawiam.
  • REKLAMA
  • #5 6773149
    gumispl
    Poziom 11  
    Posty: 16
    Ocena: 1
    Stworzyłem prosty prototyp na płytce uniwersalnej z ATmegą32 (kwarc 16Mhz), 64kB sram i komunikacją po porcie szeregowym (klawiatura/monitor).
    Napisałem też bardzo minimalny emulator, aby udało się uruchomić poniższy program:
    mov ah, 2
    mov dl, 'A' 
    int 21h
    mov ax, 1000 
    petla:
    sub ax, 1 
    mov si, 512
    mov di, 24200
    mov cx, 16384
    rep movsb 
    cmp ax, 0 
    jz dalej
    jmp petla 
    dalej:
    mov ah, 2
    mov dl, 'B' 
    int 21h
    int 20h       
    

    Program kopiuje 1000 razy 16kB danych z miejsca na miejsce, czas wykonywania w przybliżeniu to 50 sekund. Czyli średnio emulowana maszyna potrafi kopiować dane w pamięci z prędkością około 320kB/s.
    Czy ktoś wie jak się to ma do prędkości oryginalnego IBM PC?

    Jako załącznik dorzucam skompilowany do .com powyższy program.

    EDIT:
    Nakreśliłem prosty schemat blokowy karty grafiki.
    Dostępny będzie tylko tryb graficzny 320x200x2 z jedną paletą.
    Nie zapomniałem o czymś?

    Jak emulować 8086 na ATmega128 z 1MB SRAM i obsługą klawiatury/myszy?

    EDIT2:
    Poprawiłem trochę kod emulatora, teraz prędkość kopiowania wynosi około 350kB/s. Myślę, że po wymianie kwarca na 20Mhz, oraz pamięci na szybsze (obecnie jest 70ns), uzyskałbym transfer ponad 400kB/s. Nadal nie mam jednak żadnego porównania :|
    Załączniki:
    • app.rar (109 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #6 6894150
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    gumispl napisał:
    Witam.

    Jako iż wakacje i mam dużo czasu postanowiłem zabrać się za zbudowanie odświeżonej kopii IBM PC.

    [...] Czekam na jakieś opinie i wskazówki ;)


    Prosze odpowiedz na jedno proste pytanie: Czy znasz ATMEGE i jezyk C na tyle dobrze, by bez wiekszego problemu spelnic swoja grozbe ?

    Jesli Twoja odpowiedz brzmi "Nie", to uznaje projekt za wartosciowy i bede Ci kibicowal przy jego realizacji, jesli jednak podasz odpowiedz twierdzaca, to zadanie nalezy uznac za niepoznawcze sluzace jedynie bezsensownemu zabiciu czasu. Duzo bardziej bys sie przysluzyl swoim szarym komorkom realizujac ten projekt na FPGA, gdyz musialbys sie nauczyc nowych rzeczy, w tym VHDL'a lub innego jezyka tego typu.

    Robienie czegos co juz sie umie to wyrobnictwo a nie sztuka!
  • #7 6900719
    mdziewie
    Poziom 19  
    Posty: 312
    Pomógł: 15
    Ocena: 545
    Kolega krytyk chyba ma jakieś problemy. A co do transferu, to myślę, że jest git. Bo przesłanie bajtu danych wymaga dwóch cykli magistrali, każdy tak pewnie po 8 taktów zegara. Przy częstotliwości taktowania 8 MHz daje to 500 KB/s.
    Niestety, najbardziej zbliżony komputer, do jakiego mam dostęp, to AT (16 MHz no i magistrala 16-bitowa), więc powyższe jest tylko płodem mojej wyobraźni).

Podsumowanie tematu

LABEL_AI_GENERATED
Projekt emulacji procesora 8086 na mikrokontrolerze ATmega128 z wykorzystaniem 1MB 16-bitowej pamięci SRAM oraz obsługą klawiatury i myszy budzi wątpliwości co do wydajności i możliwości realizacji. Propozycja zakłada interpretację kodu maszynowego z RAM-u, emulację przerwań BIOS-u i DOS-owych funkcji 21h, komunikację z kartą SD przez SPI jako dyskiem twardym oraz przesyłanie znaków do karty graficznej w trybie tekstowym przez I2C lub SPI. W trybie graficznym adresowanie pamięci 0xA0000-0xBFFFF miałoby bezpośrednio odwoływać się do bufora karty graficznej. Dyskusja wskazuje, że takie projekty są zwykle realizowane na FPGA (np. Minimig), a ATmega może mieć ograniczenia wydajnościowe, zwłaszcza przy dostępie do zewnętrznego RAM-u. Autor przedstawił prototyp na ATmega32 z 64kB SRAM i prostym emulatorem, osiągając prędkość kopiowania danych około 320kB/s, co jest porównywane do oryginalnego IBM PC. Poruszono także kwestie obsługi klawiatury i myszy, rozważając bezpośrednie podłączenie do portów ATmegi z generowaniem przerwań. Wskazano, że realizacja projektu wymaga dobrej znajomości ATmegi i języka C, a alternatywnie lepszym rozwiązaniem może być FPGA z nauką VHDL lub podobnych języków. Dyskusja zawiera także uwagi dotyczące taktowania, transferu danych i ograniczeń sprzętowych mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA