
OpenType फ़ॉन्ट जो Z80 निर्देशों को डिसअसेंबल करता है
आपका पसंदीदा डिस्सेम्बलर कौन सा है? मेरा तो एक फ़ॉन्ट है:
https://github.com/user-attachments/assets/bb6ceb18-c2fd-40a9-be4f-202321a214d9
यह फ़ॉन्ट हेक्साडेसिमल लोअरकेस कैरेक्टर्स के सीक्वेंस को डिस्सेम्बल की गई Z80 निर्देशों में बदलता है, जो OpenType के Glyph Substitution Table (GSUB) और Glyph Positioning Table (GPOS) का व्यापक उपयोग करता है।
अगर आप इसे आज़माना चाहते हैं, तो ./test/z80-sans.ttf पर एक प्रतिलिपि उपलब्ध है।
Debian GNU/Linux 12 पर परीक्षण किया गया है। ध्यान दें कि इस Debian संस्करण में ruby संस्करण 3 शामिल है, जबकि fontcustom को ruby संस्करण 2 के लिए लिखा गया था, और बाद के संस्करणों के साथ असंगत है (जैसे सिंटैक्स त्रुटियाँ)। ruby इंस्टॉल के लिए एक संगत OpenSSL संस्करण की भी आवश्यकता होती है। इसलिए, RVM का उपयोग ruby और OpenSSL के स्थानीय इंस्टॉल दोनों को प्रबंधित करने के लिए किया जा सकता है।
apt install imagemagick potrace
pip install fonttools
git submodule update --init --recursive
# fontforge
(
cd ./modules/fontforge/
git checkout 4f4907d9541857b135bd0b361099e778325b4e28
git apply ../../resources/fontforge.diff
mkdir -p build
cd build
cmake -GNinja ..
ninja
ninja install
)
# woff2
(
cd ./modules/woff2/
make clean all
)
# fontcustom
rvm use 2.7
rvm pkg install openssl
rvm install 2.4 --with-openssl-dir=$HOME/.rvm/usr
gem update --system 3.3.22
(
export PATH=$PWD/modules/woff2/build:$PATH
cd ./modules/fontcustom/
git apply ../../resources/fontcustom.diff
gem build fontcustom.gemspec
gem install ./fontcustom-2.0.0.gem
)
cp ./resources/droid-sans-mono.ttf /tmp/base.ttf
./gen.py ./resources/instructions.json
.ttf फ़ॉन्ट फ़ाइल ~/.local/share/fonts/ में कॉपी की जाती है, जिसका उपयोग जैसे LibreOffice द्वारा किया जाता है।
अन्य अभिशप्त फ़ॉन्ट्स की तुलना में, Z80 Sans में ये चुनौतियाँ हैं:
CALL जैसे म्नेमोनिक), हालांकि यह अगले बिंदु से भी जुड़ा है...65536 * 7 = 458752 तक संभावित संयोजन हो सकते हैं;0x80..0xff रेंज के सभी ऑफसेट को ऋणात्मक दो-पूरक संख्या के रूप में रेंडर करने की आवश्यकता है;यह सब एक प्रोग्रामेटिक समाधान को आमंत्रित करता है। जबकि fontcustom और ImageMagick ग्लिफ़ उत्पन्न करने का ध्यान रखते हैं, ऐसा लगता है कि लुकअप नियम लिखने का एक सुविधाजनक तरीका .fea प्रारूप है, लेकिन मुझे इसे fonttools के .ttx प्रारूप (जो मूलतः xml है) के साथ एकीकृत करने का कोई तरीका नहीं मिला। मैंने Noto Sans Mono के .ttx को सीधे संपादित करने का न्यूनतम सामान्य विभाजक दृष्टिकोण अपनाया (हालांकि ग्लिफ़ आकार Droid Sans Mono से गणना किए जाते हैं, क्योंकि मैंने FontForge पैच करते समय उसी से शुरुआत की थी)।
सभी संभावित ग्लिफ़ उत्पन्न करने के लिए एक रिकर्सिव डिसेंट पार्सर का उपयोग किया जाता है, जो एन्कोडिंग में अभिव्यक्तियों का मूल्यांकन करने में मदद करता है (जैसे SET b,(IX+o) एक बिट और एक विस्थापन लेता है, जिसे अभिव्यक्ति DD CB o C6+8*b के रूप में एन्कोड किया गया है)। इन एन्कोडिंग्स को फिर सभी संभावित मानों तक विस्तारित किया गया जो ऑपरेंड ले सकते हैं, अंत में एक विस्तारित निर्देश को रेंडर करने के लिए आवश्यक प्रत्येक डिस्सेम्बली ग्लिफ़ के साथ 1 या अधिक हेक्साडेसिमल बाइट्स को जोड़ा गया।
OpenType सुविधाओं के लिए कुछ अच्छे संदर्भ हैं, लेकिन वे उच्च-स्तर पर लिखे गए हैं, या .fea(?) प्रारूप में:
यह कभी भी बहुत स्पष्ट नहीं होता है कि उन्हें .ttx में कैसे अनुवादित किया जाए, इसलिए अंत में मैंने बस Noto Sans परिवार के सभी को कनवर्ट किया और "उदाहरणों द्वारा सीखना" के अच्छे पुराने ब्रूट फोर्स दृष्टिकोण का उपयोग किया। यह सुनने में जितना मजेदार है उससे भी अधिक मजेदार है, .ttx से .ttf में कनवर्ट करते समय कई मौन विफलताओं के लिए धन्यवाद, जहां लुकअप कुछ धारणाओं के कारण मेल नहीं खाएंगे जो fonttools द्वारा मान्य नहीं हैं (जैसे कि प्रासंगिक श्रृंखलन प्रतिस्थापन के लिए वर्ग परिभाषाओं में कम से कम एक कवरेज ग्लिफ़ होना चाहिए जिसका class value="1" हो)।
अधिकांश चुनौतियों को प्रासंगिक श्रृंखलन नियमों के साथ हल किया गया। पतों को संभालने के लिए, 0..f रेंज में प्रत्येक निबल को अलग ग्लिफ़ के साथ एन्कोड किया गया, जिसमें स्पेसिंग कैरेक्टर का उपयोग करके एक बार में एक कैरेक्टर के लिए कई प्रतिस्थापन बनाए गए। विस्थापनों में अतिरिक्त हस्ताक्षरित रूप भी हैं। यह हमें संख्याओं के लिए कुल (4 + 2) * 16 ग्लिफ़ देता है। यह फ़ॉन्ट फ़ाइल को 65536 ग्लिफ़ की सीमा से नीचे रखने के लिए पहले से ही पर्याप्त था।
सबसे बुरा हिस्सा निश्चित रूप से क्रम से बाहर ऑपरेंड था। हालांकि, निर्देशों में इनकी सीमित संख्या के कारण, उन्हें अस्पष्ट रूप से एन्कोड किए गए उपसर्गों वाले निर्देशों के समान रणनीति द्वारा कवर किया जा सकता है, उदाहरण के लिए
["SET b,(IX+o)", "DD CB o C6+8*b"],
["SET b,(IY+o)", "FD CB o C6+8*b"],
निम्नलिखित के समान लुकअप नियमों द्वारा कवर किया गया है:
["SRA (IX+o)", "DD CB o 2E"],
["SRA (IY+o)", "FD CB o 2E"],
["SRL (IX+o)", "DD CB o 3E"],
["SRL (IY+o)", "FD CB o 3E"],
Z80 ISA में एक दिलचस्प गुण यह है कि बिट्स और रजिस्टरों में 8 तक भिन्नताएं होती हैं, और ये क्रम से बाहर के मामलों में केवल ऑफसेट और उन विशिष्ट ऑपरेंड में से एक शामिल होता है। इसलिए, हम बिट्स या रजिस्टरों को शाब्दिक के रूप में एन्कोड कर सकते हैं। पर्याप्त लुकअहेड के साथ, हम अंतिम हेक्साडेसिमल बाइट तक मेल कर सकते हैं, और प्रत्येक मामले के लिए समर्पित लुकअप बना सकते हैं। अंतिम शाब्दिक को एक लिगेचर उत्पन्न करके कम किया जा सकता है जो प्रत्यय ग्लिफ़ से मेल खाता हो। अंतिम परिणाम इन मामलों के लिए दर्जनों और उत्पन्न लुकअप था (जिसे संभवतः इस संख्या को कम करने के लिए समूहित किया जा सकता है)।
LD (IX+o),r को LD (IX+o r), के रूप में रेंडर किया गया है;SET b,(IX+o) को SET b,(IX+o)) के रूप में रेंडर किया गया है;FontForge GenerateFeatureFile() और MergeFeature() कमांड का उपयोग करके सुविधाओं के स्क्रिप्टेबल संशोधन का समर्थन करता है (इसका संक्षेप में The Terrible Secret of OpenType Glyph Substitution - Ansuz - mskala's home page में उल्लेख किया गया है)। मुझे .ttx आधारित कार्यान्वयन करने के बाद ही इसके बारे में पता चला, लेकिन यह संभावित रूप से .ttx फ़ाइलों से छेड़छाड़ करने से बचा सकता था।
अधिक जटिल निर्देश सेट के लिए, एक वैकल्पिक दृष्टिकोण जो कम बाधाओं वाला लगता है, फ़ॉन्ट शेपर्स का उपयोग करना है। कुछ उदाहरण:
./resources/instructions.json को maziac/z80-instruction-set से अनुकूलित किया गया;./resources/instructions.json GNU Lesser General Public License संस्करण 3 के अंतर्गत है;