Emülatörler nasıl çalışır ve nasıl yazılır? [kapalı]


968

Emülatörler nasıl çalışır? NES / SNES veya C64 emülatörlerini gördüğümde beni şaşırtıyor.

http://www.tommowalker.co.uk/snemzelda.png

Özel montaj talimatlarını yorumlayarak bu makinelerin işlemcisini taklit etmek zorunda mısınız? Başka ne var? Tipik olarak nasıl tasarlanırlar?

Bir emülatör yazmakla ilgilenen birine (özellikle bir oyun sistemi) herhangi bir tavsiye verebilir misiniz?


15
Bulmanız gereken en önemli şey, bu sistem için "programcı el kitabı" dır, çünkü bu, HW satıcısı ve programcılar arasındaki "sözleşmeyi" detaylandırır ve ilgili olmayan ve değişebilecek ayrıntıları gizler. Şansınız sistem popülaritesine bağlıdır.
Uri

155
İyi oyun seçimi.
Cristián Romo



8
O oyunu ilk kez oynadığımdan beri, Hyrule'un neden "8-Ball" kayalar ile dolup taştığını merak ettim :-)
Vivian River

Yanıtlar:


1124

Emülasyon çok yönlü bir alandır. İşte temel fikirler ve fonksiyonel bileşenler. Bunu parçalara ayıracağım ve daha sonra ayrıntıları düzenlemelerle dolduracağım. Anlatacağım şeylerin çoğu, işlemcilerin iç işleri hakkında bilgi gerektirecektir - montaj bilgisi gereklidir. Eğer bazı şeyler konusunda biraz fazla muğlaksam, lütfen bu soruyu geliştirmeye devam edebilmek için sorular sorun.

Temel fikir:

Emülasyon, işlemcinin ve bileşenlerin davranışlarını işleyerek çalışır. Sistemin her bir parçasını inşa edersiniz ve daha sonra parçaları kabloda olduğu gibi donanıma bağlarsınız.

İşlemci emülasyonu:

İşlemci öykünmesini işlemenin üç yolu vardır:

  • yorumlama
  • Dinamik yeniden derleme
  • Statik yeniden derleme

Tüm bu yollarda aynı genel hedefiniz vardır: işlemci durumunu değiştirmek ve 'donanım' ile etkileşimde bulunmak için bir kod parçası yürütün. İşlemci durumu, belirli bir işlemci hedefi için işlemci kayıtlarının, kesme işleyicilerinin vb. Bir araya getirilmesidir. 6502 için, kayıtlarını temsil 8 bitlik tamsayılar bir dizi olurdu: A, X, Y, P, ve S; ayrıca 16 bitlik bir PCkaydınız olur.

Yorumlama ile IP(talimat işaretçisi - aynı zamanda PCprogram sayacı olarak da adlandırılır ) başlar ve talimatı bellekten okursunuz. Kodunuz bu talimatı ayrıştırır ve bu bilgileri işlemcinizin belirttiği şekilde işlemci durumunu değiştirmek için kullanır. Yorumlamanın temel sorunu çok yavaş olmasıdır; Belirli bir talimatı her ele aldığınızda, kodu çözmeniz ve gerekli işlemi yapmanız gerekir.

Dinamik yeniden derleme ile, kod üzerinde yorumlama gibi yinelenirsiniz, ancak sadece opcodes yürütmek yerine bir işlem listesi oluşturursunuz. Şube komutuna ulaştığınızda, bu işlem listesini ana makine platformunuz için makine koduna derlersiniz, daha sonra bu derlenmiş kodu önbelleğe alır ve yürütürsünüz. Ardından, belirli bir talimat grubuna tekrar bastığınızda, kodu yalnızca önbellekten yürütmeniz gerekir. (BTW, çoğu insan aslında bir talimat listesi yapmaz, ancak bunları anında makine koduna derler - bu optimize etmeyi daha zor hale getirir, ancak yeterli kişi ilgilenmedikçe bu cevabın kapsamı dışındadır)

Statik yeniden derleme ile dinamik yeniden derleme ile aynı şeyi yaparsınız, ancak dalları takip edersiniz. Programdaki tüm kodu temsil eden bir kod yığını oluşturursunuz ve bu kod daha sonra herhangi bir müdahale olmadan yürütülebilir. Aşağıdaki sorunlar olmasaydı bu harika bir mekanizma olurdu:

  • Başlamak için programda olmayan kod (örneğin, sıkıştırılmış, şifrelenmiş, çalışma zamanında oluşturulmuş / değiştirilmiş, vb.) Kod yeniden derlenmeyeceğinden, çalışmaz
  • Belirli bir ikili dosyadaki tüm kodu bulmanın Durdurma sorununa eşdeğer olduğu kanıtlanmıştır.

Bunlar, vakaların% 99'unda statik yeniden derlemeyi tamamen olanaksız hale getirmek için birleştirilir. Daha fazla bilgi için, Michael Steil statik yeniden derleme konusunda büyük araştırmalar yaptı - gördüğüm en iyisi.

İşlemci öykünmesinin diğer tarafı, donanımla etkileşim biçiminizdir. Bunun gerçekten iki tarafı var:

  • İşlemci zamanlaması
  • Kesinti işleme

İşlemci zamanlaması:

Bazı platformlar - özellikle NES, SNES gibi eski konsollar - öykünücünüzün tamamen uyumlu olması için sıkı zamanlama gerektiriyor. NES ile, CPU'nun pikselleri kesin anlarda belleğe koymasını gerektiren PPU'ya (piksel işleme birimi) sahip olursunuz. Yorum kullanırsanız, döngüleri kolayca sayabilir ve uygun zamanlamayı taklit edebilirsiniz; dinamik / statik yeniden derleme ile işler bir / lot / daha karmaşıktır.

Kesinti işleme:

Kesmeler, CPU'nun donanım ile iletişim kurduğu birincil mekanizmadır. Genel olarak, donanım bileşenleriniz CPU'ya neyin önem verdiği kesintileri söyleyecektir. Bu oldukça basittir - kodunuz belirli bir kesmeyi attığında, kesme işleyici tablosuna bakar ve uygun geri aramayı çağırırsınız.

Donanım öykünmesi:

Belirli bir donanım aygıtını taklit etmenin iki tarafı vardır:

  • Cihazın işlevselliğini taklit etme
  • Gerçek cihaz arayüzlerini taklit etme

Bir sabit sürücü kasasını alın. Bu işlevsellik, destek depolama, okuma / yazma / formatlama yordamları vb. Oluşturularak taklit edilir. Bu bölüm genellikle çok basittir.

Cihazın gerçek arayüzü biraz daha karmaşıktır. Bu genellikle bellek eşlemeli kayıtların bir kombinasyonudur (örneğin cihazın sinyalleme değişikliklerini izlemek için izlediği bellek parçaları) ve kesintilerdir. Bir sabit sürücü için, okuma komutları, yazılar vb. Yerleştirdiğiniz ve bu verileri geri okuduğunuz bir bellek eşlemeli alanınız olabilir.

Daha fazla ayrıntıya girerdim, ama bununla baş edebilmenin bir milyon yolu var. Burada herhangi bir sorunuz varsa, sormaktan çekinmeyin, ben de bilgileri ekleyeceğim.

Kaynaklar:

Ben intro burada oldukça iyi verdik düşünüyorum, ama bir orada tonluk ek alanların. Herhangi bir soruya yardımcı olmaktan mutluluk duyuyorum; Bunun çoğunda, sadece büyük karmaşıklıktan dolayı çok belirsiz davrandım.

Zorunlu Wikipedia bağlantıları:

Genel öykünme kaynakları:

  • Zophar - Burası öykünme ile başladım, ilk önce emülatörleri indirdim ve sonunda büyük belge arşivlerini yağmaladım. Bu, sahip olabileceğiniz mutlak en iyi kaynaktır.
  • NGEmu - Çok fazla doğrudan kaynak yok, ancak forumları rakipsiz.
  • RomHacking.net - Belgeler bölümü, popüler konsollar için makine mimarisine ilişkin kaynakları içerir

Referans edilecek emülatör projeleri:

  • IronBabel - Bu Nemerle yazılmış .NET için bir öykünme platformu ve anında kod C # derler. Yasal Uyarı: Bu benim projem, bu yüzden utanmaz fişi affedin.
  • BSnes - Mükemmel döngü doğruluğu hedefiyle harika bir SNES emülatörü.
  • MAME - çarşı emülatörü. Harika referans.
  • 6502asm.com - Bu harika bir forum ile bir JavaScript 6502 emülatörüdür.
  • dynarec'd 6502asm - Bu bir iki gün içinde yaptığım küçük bir hack. Mevcut emülatörü 6502asm.com'dan aldım ve devasa hız artışları için kodu dinamik olarak JavaScript'e yeniden derleyecek şekilde değiştirdim.

İşlemci yeniden derleme başvuruları:

  • Michael Steil (yukarıda atıfta bulunulan) tarafından yapılan statik yeniden derleme araştırması bu makalede doruğa ulaşmıştır ve burada kaynak ve benzeri bulabilirsiniz .

Zeyilname:

Bu cevabın gönderilmesinden bu yana bir yıldan fazla bir süre geçti ve aldığı tüm dikkatle bazı şeyleri güncelleme zamanının geldiğini düşündüm.

Belki de şu anda emülasyondaki en heyecan verici şey , yukarıda bahsedilen Michael Steil tarafından başlatılan libcpu . Yeniden derleme için LLVM kullanan (statik ve dinamik!) Çok sayıda CPU çekirdeğini desteklemeyi amaçlayan bir kütüphanedir. Büyük bir potansiyele sahip ve bence öykünme için harika şeyler yapacak.

emu-docs da dikkatimi çekti, bu da emülasyon amaçları için çok yararlı olan sistem belgelerinin büyük bir havuzunu barındırıyor. Orada fazla zaman geçirmedim, ama çok büyük kaynakları var gibi görünüyor.

Bu yazının yararlı olduğuna sevindim ve kıçımdan inip yılın sonunda / gelecek yılın başlarında konu hakkındaki kitabımı bitirebileceğimi umuyorum.


37
Bu zaten destansı bir cevap olmaya hazırlanıyor. Beni herhangi bir kaynağa yönlendirebilirseniz, bunun sonunda takdir edilecektir. Muhtemelen SNES veya NES sistemini taklit edip dönem projem yapıyorum.
mmcdole

8
Kesinlikle. Güzel bir kaynak listesi oluşturacağım. Herhangi bir özel isteğiniz varsa, bunları doldurmak için elimden geleni yapacağım.
Cody Brocious

3
@thenonhacker, benim kaynaklar bölümünde başvurulan IronBabel projesi benim. (
Utanmaz

1
"Belirli bir ikili dosyadaki tüm kodu bulmanın Durdurma problemine eşdeğer olduğu kanıtlanmıştır" - Referans lütfen? Yoksa " Herhangi bir ikili dosyadaki tüm kodların bulunmasının Durdurma problemine eşdeğer olduğu kanıtlanmış mı?" Ayrıca
Steil'in

4
Bir kitap yazdığından bahsettin; bu konuda bize bir güncelleme verebilir misiniz? Birincisi, onu okumakla ilgilenirim.
alex


43

Öykünme yıldırıcı görünebilir, ancak aslında benzetmekten oldukça kolaydır.

Herhangi bir işlemci tipik olarak durumları, etkileşimleri vb. Açıklayan iyi yazılmış bir spesifikasyona sahiptir.

Performansı hiç önemsemediyseniz, çok eski nesne işlemcilerini çok zarif nesne yönelimli programlar kullanarak kolayca taklit edebilirsiniz. Örneğin, bir X86 işlemcisi, kayıt durumunu korumak için bir şey (kolay), bellek durumunu korumak için bir şey (kolay) ve her gelen komutu alacak ve makinenin geçerli durumuna uygulayacak bir şeye ihtiyaç duyacaktır. Gerçekten doğruluk istiyorsanız, bellek çevirilerini, önbelleğe almayı vb. Taklit ederdiniz, ancak bu yapılabilir.

Aslında, birçok mikroçip ve CPU üreticisi, çipin bir öykünücüsüne ve daha sonra çipin kendisine karşı programları test eder, bu da çipin spesifikasyonlarında veya çipin donanımdaki gerçek uygulamasında sorun olup olmadığını öğrenmelerine yardımcı olur. Örneğin, kilitlenmelere yol açacak bir yonga belirtimi yazmak mümkündür ve donanımda bir son tarih oluştuğunda, yonga uygulamasında bir şeyden daha büyük bir sorun olduğunu belirttiği için spesifikasyonda yeniden üretilip üretilemeyeceğini görmek önemlidir.

Elbette, video oyunları için emülatörler genellikle performansı önemsiyorlar, bu yüzden saf uygulamaları kullanmıyorlar ve ayrıca örneğin çizim ve ses kullanmak için ana bilgisayar sisteminin işletim sistemi ile arayüz oluşturan kod içeriyorlar.

Eski video oyunlarının (NES / SNES, vb.) Çok yavaş performansı düşünüldüğünde, modern sistemlerde öykünme oldukça kolaydır. Aslında, bu sistemler popüler olduğunda, her kartuşa ücretsiz erişime sahip olmanın bir hayalin gerçekleşeceğini göz önünde bulundurarak, şimdiye kadar her SNES oyununun veya herhangi bir Atari 2600 oyununun bir setini indirmeniz daha şaşırtıcı.


1
Emülasyon ve simülasyon arasındaki farklar nelerdir?
Wei Hu

2
@ Wei: Genel olarak, bir emülatörün öykündüğü sistem gibi "dışsal" davranması gerekiyordu, ancak benzer şekilde uygulanması gerektiğini söyleyecek hiçbir şey yok. Bir simülatör, simüle edilen sistemi taklit edecek şekilde uygulanır ve sonuç olarak böyle davranır.
Uri

"Simülatör" gördüğünüzde bir emülatör "öykünür"
mP


29

Bu sorunun biraz eski olduğunu biliyorum, ama tartışmaya bir şeyler eklemek istiyorum. Buradaki cevapların çoğu, taklit ettikleri sistemlerin makine talimatlarını yorumlayan emülatörlerin etrafında toplanmaktadır.

Ancak, bunun "UltraHLE" olarak bilinen çok iyi bir istisnası vardır ( WIKIpedia makalesi) ) . Şimdiye kadar oluşturulan en ünlü emülatörlerden biri olan UltraHLE, yaygın olarak imkansız olduğu düşünülen bir zamanda ticari Nintendo 64 oyunlarını (ev bilgisayarlarında iyi performansla) taklit etti. Nitekim Nintendo, UltraHLE yaratıldığında Nintendo 64 için hala yeni başlıklar üretiyordu!

İlk kez, basılı dergilerde öykünücüler hakkında makaleler gördüm, daha önce sadece web'de tartışıldığını gördüm.

UltraHLE kavramı, makine seviyesi çağrıları yerine C kütüphane çağrılarını taklit ederek imkansızı mümkün kılmaktı.


22

Bir göz atmaya değer bir şey, Imran Nazar'ın JavaScript'te bir Gameboy emülatörü yazma girişimi .


1
Gameboy oyunu için ham opcode talimatlarını nasıl edinebiliriz?
Pacerier

'Gri pazarda' satılabilecek bir dizi cihaz var. Bunları gelişmiş dünyanın herhangi bir büyük mağazasında bulamazsınız. Bu cihazlar, talimatları oyun kartuşundan genellikle "ROM" olarak adlandırılan dosyalara kopyalayabilir. Google "Gameboy Roms", ancak güvenli olmayan bağlantılar ve saldırı sitelerine dikkat edin!
Vivian River

18

80'lerin BBC Mikrobilgisayarına ait kendi emülatörümü (Google'a VBeeb yazın) oluşturduktan sonra bilmeniz gereken birkaç şey var.

  • Gerçek şeyi böyle taklit etmiyorsunuz, bu bir kopya olurdu. Bunun yerine, Devleti taklit ediyorsunuz . İyi bir örnek, bir hesap makinesi, gerçek şeyin düğmeleri, ekranı, kasası vb. bir hesap makinesinde değişebilecek tüm olası kombinasyonları temsil eder.
  • Sadece gerçek bir şey gibi görünmesi ve davranması için emülatörün arayüzüne ihtiyacınız var. Bu ne kadar ikna edici olursa emülasyon o kadar yakın olur. Perde arkasında olup bitenler hoşunuza giden bir şey olabilir. Ancak, bir emülatör yazmanın kolaylığı için, gerçek sistem, yani çipler, ekranlar, klavyeler, devre kartları ve soyut bilgisayar kodu arasında gerçekleşen zihinsel bir haritalama vardır.
  • Bir bilgisayar sistemini taklit etmek için, onu daha küçük parçalara ayırmak ve bu parçaları ayrı ayrı taklit etmek en kolay yoldur. Sonra bitmiş ürün için her şeyi bir araya getirin. Nesneye yönelik programlamaya güzel bir şekilde katkıda bulunan, giriş ve çıkışlara sahip bir dizi siyah kutu gibi. Hayatı kolaylaştırmak için bu parçaları daha fazla alt bölümlere ayırabilirsiniz.

Pratik olarak, genellikle emülasyonun hızı ve sadakati için yazmak istiyorsunuz. Bunun nedeni, hedef sistemdeki yazılımın kaynak sistemdeki orijinal donanımdan daha yavaş çalışmasıdır (olabilir). Bu, programlama dili, derleyiciler, hedef sistem vb. Seçimini kısıtlayabilir.
Bunun yanı sıra, taklit etmeye hazır olduğunuz şeyi atlatmanız gerekir, örneğin, bir mikroişlemcideki transistörlerin voltaj durumunu taklit etmek gerekli değildir, ancak muhtemelen gereklidir mikroişlemcinin kayıt setinin durumunu taklit etmek.
Genel olarak, öykünme ayrıntı düzeyi ne kadar küçük olursa, orijinal sisteme o kadar fazla bağlılık elde edersiniz.
Son olarak, eski sistemlere ilişkin bilgiler eksik veya mevcut olmayabilir. Bu nedenle orijinal ekipmanı elde etmek çok önemlidir veya en azından bir başkasının yazdığı başka bir iyi emülatörü ayırmak!


17

Evet, tüm ikili makine kod karmaşasını "elle" yorumlamanız gerekir. Sadece bu da değil, çoğu zaman hedef makinede eşdeğeri olmayan bazı egzotik donanımları simüle etmek zorundasınız.

Basit yaklaşım, talimatları tek tek yorumlamaktır. Bu iyi çalışıyor, ama yavaş. Daha hızlı bir yaklaşım yeniden derlemedir - kaynak makine kodunu hedef makine koduna çevirir. Çoğu talimat birebir eşleşmeyeceğinden bu daha karmaşıktır. Bunun yerine ek kod içeren ayrıntılı çözümlemeler yapmanız gerekecektir. Ama sonunda çok daha hızlı. Çoğu modern emülatör bunu yapar.


1
En kötü şey, belgelere kadar eksik. GameBoy Color'daki değiştirilmiş Z80 çekirdeğinin, test ettiğiniz oyunun gerçekten inancınızı kaybetmeye başladığı kullandığı belgelenmemiş bayrak işlemlerine sahip olduğunu öğrendiğinizde.
Callum Rogers

1
Evcil hayvan peeve: Makine kodu (tekil), makine kodları değil (çoğul); Sadece 's olarak Mors Kodu değil mors Kodları .
Lawrence Dol

1
@Vilx: Aslında hayır - bir CPU için ayarlanan talimatlara atıfta bulunan "makine kodu" terimi yazılımın başlangıcından beri kullanılmaktadır ve çoğul değildir. "Komut kümesi ", tekil bir form anlamına gelir , çoğul "talimatlar" değil. Program kodu, Mors Kodu, vb. İle aynıdır. Çoğul formun kullanımı, genellikle ikinci dil olarak İngilizce konuşan kişiler tarafından yanlış kullanımdan kaynaklanmıştır.
Lawrence Dol

1
@Software Monkey - Ama "kod" kelimesini setten tek bir öğeye atıfta bulunmak için kullanamaz mıyım? Örneğin: " ... --- ...- bu üç Mors kodu üç S, O, S harfini temsil eder." Çünkü ...olan bir kod "S" harfi temsil eder. Hayır?
Vilx-

1
Hayır, kod sayılamayan isimdir, su veya kum gibi çoğul şekli yoktur ..
Ivan

15

Bir emülatör geliştirdiğinizde, sistemin üzerinde çalıştığı işlemci aksamını yorumlarsınız (Z80, 8080, PS CPU, vb.).

Ayrıca, sistemin sahip olduğu tüm çevre birimlerini taklit etmeniz gerekir (video çıkışı, denetleyici).

C64 için iyi eski Game Boy (bir Z80 işlemci kullanan, yanlış mı değilim) gibi simpe sistemleri için emülatörler yazmaya başlamalısınız .


9
C64 "basit" bir sistem? (Liste dışı opcodes örtülü bir kez) 6510 nispeten basit olmakla birlikte, ses (SID) ve video (VIC) cips şey vardır ama basit. Uygun düzeyde bir uyumluluk elde etmek için, bunları taklit etmeniz gerekir - donanım hataları ve hepsi.
moobaa

10

Emülatör oluşturmak çok zordur çünkü simüle etmeniz gereken birçok hack (sıra dışı efektlerde olduğu gibi), zamanlama sorunları vb.

Bunun bir örneği için bkz. Http://queue.acm.org/detail.cfm?id=1755886 .

Bu aynı zamanda 1MHz bir emülasyon için neden bir çoklu GHz CPU'ya 'ihtiyaç duyduğunuzu' gösterecektir.


9

Ayrıca JIT'ler için talimat düzeyinde optimizasyon ve etkili emülatörler oluşturma konusunda diğer pek çok özellik için Darek Mihocka'nın Emulators.com adresini ziyaret edin .


7

Bir oyun konsolunu taklit etmek için hiç bu kadar süslü bir şey yapmadım ama bir keresinde görevlendirmenin Andrew Tanenbaums Structured Computer Organization'da açıklanan makine için bir emülatör yazmak olduğu bir kursa katıldım . Bu eğlenceliydi ve bana bir sürü an verdi. Gerçek bir emülatör yazmaya başlamadan önce bu kitabı almak isteyebilirsiniz.


4

Gerçek bir sistemi veya kendi işinizi taklit etme konusunda tavsiye? Emülatörlerin ENTIRE donanımını taklit ederek çalıştığını söyleyebilirim. Belki devreyle aşağı doğru değil (HW gibi hareket eden bitler gibi. Baytın taşınması sonuçtur, bu yüzden baytın kopyalanması iyidir). Emülatör oluşturmak çok zordur çünkü simüle etmeniz gereken birçok hack (sıra dışı efektlerde olduğu gibi), zamanlama sorunları vb. Bir (giriş) parça yanlışsa, tüm sistem çalışabilir veya en iyi ihtimalle bir hata / aksaklık olabilir.


4

Paylaşılan Kaynak cihaz emülatörü PocketPC / Smartphone emülatörü için imara kaynak kodunu içeren (Windows üzerinde Visual Studio, ishal gerektirir). İkili sürümün V1 ve V2 üzerinde çalıştım.

Birçok öykünme sorununu ele alır: - konuk sanaldan konuk fizikseline ve sanal sunucuya sanal olarak verimli adres çevirisi - Konuk kodunun JIT derlemesi - ağ bağdaştırıcıları, dokunmatik ekran ve ses gibi çevre aygıtlarının simülasyonu - ana bilgisayar klavyesi ve fare için UI entegrasyonu - kaydet / düşük güç modundan devam etme simülasyonu için durumun geri yüklenmesi


1

@Cody Brocious tarafından sağlanan yanıtı eklemek için
Sanal bir makineye yeni bir sistem (CPU, G / Ç vb.) Taklit ettiğiniz sanallaştırma bağlamında aşağıdaki emülatör kategorilerini görebiliriz.

Yorum: bochs bir tercüman örneğidir, x86 PC emülatörüdür, konuk sistemden her talimatı, istenen etkiyi üretmek için başka bir talimat setine (ana bilgisayar ISA'sı) çevirir.Çok yavaştır, hiçbir şeyi önbelleklemez, böylece her talimat aynı döngüden geçer.

Dinamik emalator: Qemu dinamik bir emülatördür. Konuk talimat anında anında çeviri de sonuçları önbelleğe alır. En iyi bölüm öykünme daha hızlı böylece doğrudan ana sistem üzerinde mümkün olduğunca çok sayıda komut yürütmesidir. Ayrıca Cody tarafından belirtildiği gibi, kodu bloklara böler (1 tek yürütme akışı).

Statik emülatör: Bildiğim kadarıyla sanallaştırmaya yardımcı olabilecek statik bir emülatör yok.


1

Öykünmeye nasıl başlayacağım.

1.Düşük seviyeli programlamayı temel alan kitaplar alın, Nintendo'nun ... oyun çocuğunun "taklit" işletim sistemi için ihtiyacınız olacak ...

2.Özel olarak öykünme ve belki de os geliştirme hakkında kitaplar alın. (bir işletim sistemi yapmayacaksınız, ancak ona en yakın olanı.

3. bazı açık kaynak emülatörlerine, özellikle emülatör yapmak istediğiniz sisteme bakın.

4. daha karmaşık kod parçacıklarını IDE / compliler'inize kopyalayın. Bu, uzun kod yazmanızı kurtaracaktır. İşletim sistemi geliştirmek için yaptığım şey bu, linux bölgesini kullanmak


1

Taklit hakkında bir makale yazdım JavaScript'te Chip-8 sistemini .

Sistem çok karmaşık olmadığı için başlamak için harika bir yer, ancak yine de opcode, yığın, kayıt vb.

Yakında NES için daha uzun bir rehber yazacağım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.