Warning: Missing argument 2 for wpdb::prepare(), called in /home/stromber/public_html/kryptoblog/wp-content/plugins/wp-super-edit/wp-super-edit.core.class.php on line 109 and defined in /home/stromber/public_html/kryptoblog/wp-includes/wp-db.php on line 1222
MOS6502 – En Pythonbaserad emulator » Kryptoblog

MOS6502 – En Pythonbaserad emulator

August 29th, 2008 by Joachim Strömbergson Leave a reply »

Jag har precis lagt upp en sida med mitt sommarhack MOS6502. MOS6502 är en enkel, objektorienterad emulator av den gamla processorn MOS 6502 skriven i Python.

MOS 6502

Processormodelln inkluderar i dag alla API-synliga register, flaggor och pekare. Dock finns det ingen egentlig funktionalitet för stack och interrupt. Vidare är inte de mer ortodoxa instruktionspekar, och adressberäkningarna i MOS 6502 med.

Däremot finns det stöd för att räkna cykler och instruktioner samt stega processorn en instruktion i taget. Vidare kan processorn dumpa valfri del av sitt minne. Tanken är att detta skall underlätta profilering och debuggning av assemblerprogram.

MOS6502 klarar i dagsläget av att exekvera en delmängd av alla instruktioner, och av dessa inte alla adesseringsmoder. Dock klarar den i alla fall av att köra en implementation av PRNG-delen av strömkryptot RC4:

js@sotis:>time ./rc4_MOS6502.py
Key byte 0: 2
Key byte 100000: 34
Key byte 200000: 27
Key byte 300000: ba
Key byte 400000: 56
Key byte 500000: ac
Key byte 600000: b
Key byte 700000: 9c
Key byte 800000: 6b
Key byte 900000: 20
Cycles executed: 80000000
i_ptr = 40
j_ptr = 81
acc_reg = 8a
x_reg = 8a
y_reg = 8e
carry = 0
95.658u 0.103s 1:35.97 99.7%0+0k 0+16io 0pf+0w

Körningen ovan är från ett exempelprogram som kör PRNG-delen av RC4 en miljon gånger. Assemblerkoden (som INTE är optimerad) tar 80 cykler per varv. Som synes tar körningen nästan 100 sekunder på min MacBook. Dvs jag får nästan 1 MHz(!) i klockfrekvens och drygt 10 kByte/s i kryptoprestanda. Inte snabbt, men samtidigt inte illa av en emulerad processor som körs i en emulerad miljö (Python VM).

RC4-exemplet finns med i den release som finns att tanka ner på emulatorns sida. Jag tar väldigt gärna emot kommentarer, buggrapporter, patchar och tips för att utveckla emulatorn vidare.

No related posts.

Related posts brought to you by Yet Another Related Posts Plugin.

Advertisement

2 comments

  1. Klas says:

    Ett alternativ till alla elif-satser skulle kunna vara att definiera varje operation i en egen metod och använda en dictionary för att mappa från op-kod till metod. Dictionary-uppslagningen skulle antagligen gå litet snabbare än att gå igenom alla elif-satser, men man skulle förlora desto mer prestanda på funktionsanropen. Det handlar alltså om en avvägning mellan prestanda och hur snygg kod man vill ha.

  2. Tack för kommentaren Klas.

    Japp jag tittade på att implementera instruktionsavkodningen på det viset. Tydligen är det dessutom så man skall göra enligt ett snyggt designmönster.

    Dock är if-elif-elif-else nära den MUX det skulle bli i HW och jag tycker att det är mer lättläst med en sekvens av block än en dictionary med metodanrop.

    Det jag funderat på som alternativ är att försöka kodifiera varje instruktion som ett antal fält i en dicionary med opkoden som nyckel. Problemet är det finns så mycket specialfall som är svåra att koda som fält.

Leave a Reply

You must be logged in to post a comment.