
सर्किट-स्तर PDP-11/34 एमुलेटर
ll/34 PDP-11/34A (1976) के लिए एक सर्किट-स्तरीय एमुलेटर है, जो एक वास्तविक PDP-11/34A के स्कीमैटिक्स, माइक्रोकोड और लॉजिक कैप्चर से रिवर्स-इंजीनियर्ड वर्चुअल CPU चलाता है।
इसे मूल रूप से सिग्नल स्तर पर समस्या निवारण में सहायता के लिए वास्तविक CPU की डिजिटल प्रतिकृति के रूप में डिज़ाइन किया गया था। वर्चुअल KD11-EA CPU मूलतः स्कीमैटिक्स के C अनुवाद और ROM तालिकाओं के लुकअप से बना है। सभी कॉम्बिनेशनल ROM रिवर्स-इंजीनियर्ड हैं, और क्लॉक जनरेटर को सटीक रूप से मॉडल किया गया है।
सर्किट-स्तर (ROM ट्रुथ टेबल + कॉम्बिनेशनल लॉजिक) को गेट-स्तर (Verilog) पर चुना गया क्योंकि यह हार्डवेयर बग को पुन: उत्पन्न करने के लिए पर्याप्त निम्न-स्तरीय है, फिर भी प्रोग्राम चलाने के लिए पर्याप्त तेज़ है।
सभी डिवाइस UNIBUS बैकप्लेन (unibus.c) में प्लग किए गए हैं, जो एड्रेस डिकोडिंग, टाइमिंग और बस साइकल करता है।
आंतरिक रूप से, CPU निम्नलिखित घटकों से बना है:
| फ़ाइल | विवरण |
|---|---|
ucode_rom.h | 512x48-बिट माइक्रोकोड स्टोर (बाइपोलर PROMs), Bitsavers Verilog और डंप पर आधारित। प्रत्येक माइक्रो-वर्ड एक माइक्रो-साइकल के लिए ALU, स्क्रैचपैड, बस इंटरफ़ेस और ब्रांचिंग को नियंत्रित करता है। |
combo_roms.h | कॉम्बिनेशनल ROMs (E51-E83, E107), IR डिकोड (E59/E60/E63/E69/E70/E71/E74), ALU फ़ंक्शन चयन (E61/E82/E83), ट्रैप/सर्विस प्राथमिकता (E52/E53), और कंडीशन कोड लॉजिक (E68/E107), सभी स्कीमैटिक्स और लॉजिक कैप्चर से पुनर्निर्मित। ओपन-कलेक्टर ROMs MPC बस पर वायर-OR होते हैं। |
kd11ea.c | डेटापथ इंजन। प्रति साइकल एक माइक्रो-वर्ड के माध्यम से माइक्रोकोड को कदम दर कदम चलाता है। बुनियादी 74xx गेट्स को C लॉजिक ऑपरेटरों (!, &&, >> आदि) का उपयोग करके सिम्युलेटेड किया जाता है। 74S181 बिट-स्लाइस ALU पूरी तरह से मॉडल किया गया है (4 स्लाइस, 16-बिट)। |
mmu.c | मेमोरी मैनेजमेंट। कर्नेल/यूज़र एड्रेस स्पेस, 18-बिट रीलोकेशन (3x 74S283 एडर्स), 16 PAR/PDR जोड़े, फ्रीज़ लॉजिक के साथ SR0/SR2 एबॉर्ट रजिस्टर। |
clockgen.c | क्लॉक जनरेटर। E106 डिले लाइन को मॉडल करता है (TAP 30/90/120 फीडबैक, TRAN INH बस प्रतीक्षा)। छोटे साइकल: 180 ns, लंबे साइकल: 240 ns, बस ट्रांसफर तब तक खिंचता है जब तक SSYN वापस नहीं आता। |
clock.c | रीयल-टाइम पेसिंग। सिम्युलेटेड समय को वॉल-क्लॉक समय के साथ सिंक में रखता है। |
int.c | इंटरप्ट आर्बिटर। BR4-BR7 प्राथमिकता कतार, UNIBUS डेज़ी-चेन ग्रांट ऑर्डर का अनुमान लगाता है। |
PDP-11/34A के फ्रंट पैनल स्विच और इंडिकेटर को एमुलेट करता है। जब CPU रुका होता है (पावर-अप, HALT निर्देश, या Ctrl-P) तब सक्रिय होता है।
यह बस को इनिशियलाइज़ करने, CPU को बूट करने, कोड के माध्यम से सिंगल-स्टेप करने, मनमाने एड्रेस पर डेटा की जाँच और जमा करने, और एमुलेटर को बंद करने की अनुमति देता है।
फ्रंटएंड इंजन से अलग है, इसलिए WebAssembly में एक फोटोरियलिस्टिक फ्रंट पैनल GUI भी प्रदान किया गया है।
डीबग कंसोल माइक्रोकोड-स्तरीय और निर्देश-स्तरीय दोनों कोड के लिए एक इंटरैक्टिव डीबगर प्रदान करता है:
s [n]: n माइक्रो-निर्देशों को पूर्ण स्थिति डंप (MPC, ALU, बस, रजिस्टर) के साथ सिंगल-स्टेप करेंb addr: PC ब्रेकपॉइंट सेट करें (ऑक्टल), bl सूची के लिए, bd n हटाने के लिएg: निष्पादन फिर से शुरू करेंu [addr] [n]: निर्देशों को डिस्सेम्बल करेंc [addr] [n]: मेमोरी डंप (ऑक्टल)mmu: MMU स्थिति दिखाएं (कर्नेल + यूज़र PAR/PDR, वर्तमान मोड चिह्नित)r: रजिस्टर डंपll-34 के विकास के दौरान समस्या निवारण वास्तविक हार्डवेयर के समस्या निवारण के समान निकला, इसलिए सिग्नल को ट्रेस करने और डेटापथ की जांच करने के लिए एक आंतरिक लॉजिक एनालाइज़र लागू किया गया। यह वर्चुअल CPU में सूक्ष्म ROM और टाइमिंग बग को ट्रैक करने में महत्वपूर्ण साबित हुआ। इसका उपयोग वास्तविक हार्डवेयर के समस्या निवारण के लिए संदर्भ के रूप में भी किया जा सकता है, जैसे कार्यशील हार्डवेयर ने एमुलेटर के विकास में मदद की।
लॉजिक एनालाइज़र प्रमुख CPU सिग्नल पर 102 बिंदुओं की जांच करने की अनुमति देता है, जो भौतिक चिप पिन (KD1:Exx:pin नोटेशन DEC स्कीमैटिक्स K1-5 से K2-9 से मेल खाता है) से मैप किए गए हैं। सुविधा के लिए लॉजिकल उपनाम (MPC, ALU_OUT, IR, PSW…) प्रदान किए गए हैं।
नमूना दर रीयल-टाइम CPU क्लॉक (5,555,556 Hz) है जिसका रिज़ॉल्यूशन 180 ns प्रति नमूना है। एक कॉन्फ़िगरेबल डिवाइडर लंबे कैप्चर विंडो के लिए नमूना दर को कम करता है।
कैप्चर एक रिंग बफर (64K नमूनों तक) का उपयोग करते हैं, जिसमें किसी भी सिग्नल पर कॉन्फ़िगरेबल ट्रिगर, समायोज्य ट्रिगर स्थिति (प्री/पोस्ट अनुपात), और ऑफ़लाइन विश्लेषण के लिए CSV निर्यात होता है।
पूरे प्रोजेक्ट में खराब समझे जाने वाले मल्टीप्लेक्सिंग पथों को मैप और डीबग करने के लिए लॉजिक कैप्चर का उदारतापूर्वक उपयोग किया गया।
ll-34 के साथ आज़माने के लिए कुछ प्रोग्राम और सिस्टम शामिल हैं: एक Game of Life, V6 UNIX, मूल Tetris गेम के साथ RT-11 V4, और ATTN/11, एक छोटा प्रशिक्षण योग्य Transformer जिसमें स्व-ध्यान है।
./ll-34 --rk ./wasm/demos/rtv4_rk.dsk
बूट ROM स्वचालित रूप से RK11 से लोड होगा और ऑपरेटिंग सिस्टम शुरू करेगा। DIR फ़ाइलों को सूचीबद्ध करेगा, HELP सहायता प्रिंट करेगा, RUN TETRIS Tetris डेमो शुरू करेगा (हालाँकि $TERM शायद गलत होगा?)। RUN ADVENT Colossal Cave Adventure शुरू करेगा, जो एक वास्तविक PDP-11/34 पर बनाया गया है।
./ll-34 --rk ./wasm/demos/v6bin.rk
बूटलोडर एक न्यूनतम @ प्रॉम्प्ट प्रिंट करेगा। rkunix टाइप करें और एंटर दबाएँ, और कुछ सेकंड बाद आपको login: प्रॉम्प्ट मिलना चाहिए। root उपयोगकर्ता नाम बिना पासवर्ड के दर्ज करें और आप अंदर हैं! एक नोट यह है कि प्रारंभिक यूनिक्स में cd का नाम chdir है।
make + एक C11 कंपाइलर, कोई अन्य डिपेंडेंसी नहीं है।
Linux (x86_64 और aarch64) पर musl और glibc दोनों के साथ, macOS aarch64, और NetBSD 10 aarch64 पर बिना किसी चेतावनी के संकलित होने के लिए सत्यापित।
CLI के अलावा, एक फोटो-यथार्थवादी GUI के साथ एक स्वतंत्र WebAssembly संस्करण यहाँ उपलब्ध है: https://dbrll.github.io/ll-34.
नोट: ll-34 एक संसाधन-गहन एमुलेटर है। निर्देश-स्तरीय एमुलेटर के विपरीत, यह एक बार में एक साइकल माइक्रोकोड के माध्यम से कदम रखता है और प्रत्येक चरण में ALU, कॉम्बिनेशनल ROMs, स्क्रैचपैड, क्लॉक जनरेटर और बस टाइमिंग चलाता है। होस्ट को साइकल-सटीक बने रहने के लिए 5.5 MHz क्लॉक जनरेटर की गति को लगातार बनाए रखना होगा।
स्टार्टअप पर, एमुलेटर स्वयं का बेंचमार्क करेगा और वास्तविक KD11-EA के सापेक्ष अपनी गति रिपोर्ट करेगा। 1x से नीचे का अनुपात का मतलब है कि होस्ट बनाए नहीं रख सकता और समय सटीकता की गारंटी नहीं है। WebAssembly संस्करण में बेंचमार्क उपलब्ध नहीं है, जहाँ ब्राउज़र टाइमर रिज़ॉल्यूशन इसे अविश्वसनीय बनाता है। चूँकि WASM बिल्ड नेटिव से धीमा है, इसे स्मार्टफोन पर चलाना आमतौर पर बहुत धीमा होगा।