1990’lı yıllarda Alper Özer tarafından Borland C++ ile 16-bit Windows (Win16 NE – New Executable) mimarisinde geliştirilen MoonStar Türkçe Denetim Editörü; 64 KB bellek segmentleri ve 1.44 MB’lık disket ortamında Türkçe yazım denetimi, sözlük, eş anlamlılar motoru ve kelime oyunları barındıran bir yazılımdır.
Bu yazıda; yazılımın ikili (binary) veri dosyalarını gün ışığına çıkarma sürecini, 2014’te yarım bırakılan açık kaynak girişiminin yapay zekâ destekli analizle nasıl tamamlandığını, MTU.EXE‘nin kendi içinde kullandığı sıkıştırma ve morfoloji tekniklerini, 16-bit x86 assembly rutinlerini, bayt seviyesindeki dosya yapılarını ve kurulan modern Python mimarisini teknik ayrıntılarıyla paylaşıyorum.
1. Veri Kaynağı ve İkili Format Yapısı
MoonStar’ın veri tabanı yapısı, yazılımın geliştiricisi Alper Özer (@aozer8080) tarafından 17 Aralık 2020’de şu şekilde açıklanmıştır:
“Sözlük ve Eşanlamlılar datası için Fono yayınları kullanıldı. Kendi oluşturduğumuz binary file formatına giriş için bir utility programı yazdık. Sonra tüm ofis çalışanları koca ciltlerdeki karşılıkların girişini yaptılar.”
— Alper Özer (@aozer8080)
Veriler standart bir veritabanı motoru yerine, disket boyutunu ve bellek kullanımını minimize etmek amacıyla geliştirilen özel bir ikili formatta saklanmıştır.
Çalışma dizinindeki temel ikili dosyalar ve bunların MTU.EXE binary’si içerisindeki doğrudan ofset referansları:
| Dosya Adı | Boyut | EXE İkili Ofseti | İkili Kanıt (Binary String / Roster) | Kullanıldığı Menü & Modül |
|---|---|---|---|---|
MTU.TRK | 832 KB | 0x1B61D, 0x1B8B8 | TRK dosya etiketi; 0x1B8B8 ek tablosu | İngilizce Türkçe Sözlük (0x1BC6C) |
MTU.TUR | 221 KB | 0x1BC54, 0x1B61D | ".SOZ\0MG2\x1a\0.SOZ\0TUR" filtresi | Türkçe Leb Demeden (0x5E80F) |
MTU.TES | 640 KB | 0x1B62C, 0x1B61D | TESING1.Anlam (0x1B62C) etiketi | Türkçe Eş Anlamlı Sözcükler (Ordinal 9) |
MTU.ING | 655 KB | 0x1B61D | ING dosya etiketi | Kelime Oyunu (0x5D80F) |
MTU.SOZ | 23 KB | 0x1B31F, 0x1BC4F | *.SOZ filtre dizesi, MG2\x1a sihirli baytı | Ek yazım denetim listesi (Yer adları) |
MTU.HLP | 105 KB | 0x1B23B | WinHelp sınıf kaydı (HLP) | Yardım (F1 tuşu) |
MTU.INI | 1 KB | 0x1B23B | Profil yükleme sınıf kaydı | Seçenekler, Klavye Seçimi (0x5DE0F) |
2. 2014’ten Günümüze: Yarım Kalan Açık Kaynak Girişimi
MoonStar dosya formatlarını analiz etme süreci 2014 yılında Eren Okka (@erengy) tarafından başlatılmıştır:
MTU.TRK(İngilizce-Türkçe) sözlüğünün morfem genişletme mantığı kısmen çözümlenmiştir.MTU.TUR(26,775 kelimelik Türkçe başlık sözlüğü) temel hatlarıyla ayrıştırılmıştır.
Ancak çalışma şu noktalarda tıkanarak yarım kalmıştır:
MTU.TESDosyası Yanılgısı: Dosya yanlışlıkla “İngilizce Leb Demeden test modu / Quiz metadata” olarak etiketlenmiş ve içerisindeki eş anlamlılar yapısı çözülememiştir.- Morfolojik Ek Zincirleri:
MTU.TUR‘un Section 3 bloğundaki 3,218 adet morfolojik kuralın ikili bayt yapısı ve türetim mantığı deşifre edilememiştir. - 16-Bit Win16 NE Assembly Karmaşası: Borland C++’ın Segment 3 içindeki dinamik bellek adresleme rutinleri çözümlenemediği için çok kelimeli öbekler ve uzmanlık kategorileri bozuk karakterler üretmiştir.
Bu 16-bit disassembly analizi, yapay zekâ destekli statik IDA/ndisasm kod dökümleri ve canlı DOSBox-X / NTVDM bellek izleme yöntemleriyle ele alınarak eksik kalan bayt yapıları ve algoritmalar çözümlendi.
3. MTU.EXE: Win16 NE Segment Mimarisi ve Ayrıştırma Yöntemleri
MTU.EXE, dosya ofseti 0x250 adresinde NE (New Executable) başlığına sahip 6 segmentli bir Borland C++ v5.10 derlemesidir:
NE Başlık Ofseti : 0x0250 (Magic: 'NE' - 0x454E)
Hedef İşletim Sis: Windows 3.x (0x02)
Bağlayıcı (Link) : Borland C++ v5.10 (0x0A05)
Giriş Noktası : CS=1 IP=0x0000 | Otomatik Veri Seg: 6 (DGROUP) | Yığın: SS=6 SP=0
Bellek Tahsisi : Yığın (Heap): 16,384 Bayt | Stack: 5,120 Bayt
Hizalama (Align) : 2^9 = 512 Baytlık Sektörler (Dosya Ofseti = Sektör × 512)
| Segment | Sektör | Dosya Ofseti | Bellek Boyutu | Bayraklar | Görev ve İçerik |
|---|---|---|---|---|---|
| Seg 1 | 9 | 0x1200 | 9,051 B | 0x1D50 | Kod: Program başlatıcı, pencere sınıfları |
| Seg 2 | 27 | 0x3600 | 20,985 B | 0x1D50 | Kod: TRTHESDLG (Ordinal 9 @ 0x5E1A), UI diyalogları |
| Seg 3 | 81 | 0xA200 | 19,697 B | 0x1D50 | Kod: 0xD1EC, 0xD422, 0xD5BD Arama ve metin motoru |
| Seg 4 | 124 | 0xF800 | 12,311 B | 0x1D50 | Kod: Yazım denetimi motoru ve SOZ ayrıştırıcı |
| Seg 5 | 155 | 0x13600 | 24,347 B | 0x1D50 | Kod: Sıkıştırma algoritmaları ve morfoloji rutinleri |
| Seg 6 | 207 | 0x19E00 | 43,516 B | 0x0D51 | Veri: DGROUP Statik tablolar, string havuzu |
A. Kullanılan Tersine Mühendislik Araç Seti (Toolchain)
- Ghidra: Win16 New Executable (NE) başlığı ve 6 segmentin haritası çıkarıldı; Borland C++ çalışma zamanı fonksiyonları, yığın çerçeveleri ve diyalog prosedürleri sembolik olarak dekompile edildi.
- radare2 (r2): Komut satırından hızlı çapraz referans (xref) analizleri gerçekleştirildi (
axt,axf).0x1B61Ddosya listesi ve0x1B63Akategori tablosuna başvuran kod blokları tespit edildi. - ndisasm: Segmentlerin dosyadaki ham sektör ofsetleri üzerinden 16-bit x86 makine kodları (
ndisasm -b 16 -o 0xXXXX) doğrudan assembly metnine dönüştürüldü. - DOSBox-X Hata Ayıklayıcı: Canlı çalışma anında CPU yazmaçları (CS, DS, ES, SS) ve
0x60348RAM adresindeki geçici metin tamponları gerçek zamanlı izlendi. - Python: Ayrıştırılan ikili protokollerin simülasyonu, morfolojik doğrulama ve birim test otomasyonu için kullanıldı.
B. Segment 3 Ayrıştırması: 0xD422 Durum Makinesi
; DL yazmacında o an okunan kayıt bayrağı (flag) bulunur:
00003250 F6C280 test dl, 0x80 ; Bit 7 set edilmiş mi? (Morfolojik slot başlığı)
00003253 7405 jz 0x325A
00003255 E84501 call 0x339D ; 0x80 başlık ayrıştırıcısına dallan
00003258 8AC2 mov al, dl
0000325A 240F and al, 0x0F ; Alt 4 bit: Anlam grubu (0x00..0x0A)
00003262 3A46F5 cmp al, 0x0C ; 0x0C: Bilimsel uzmanlık kategorisi mi?
00003265 7508 jne 0x326F
00003267 8A5E04 mov bl, [bp+4] ; Sonraki baytı kategori indeksi (top_id) olarak oku
0000329C F6C240 test dl, 0x40 ; Bit 6: Fiil kökü alt-kayıt (Deverbal subrecord) ayracı
0000329F 7512 jnz 0x32B3 ; Alt kayda dallan
C. Segment 3: 0xD5BD Metin Birleştirici ve Deyim Çözücü
; ES:DI metin tamponuna işaret eder, SI veri akışını okur:
000033E0 AD lodsw ; AX = [DS:SI], SI += 2
000033E1 8BD8 mov bx, ax
000033E3 81E3FF7F and bx, 0x7FFF ; BX = Kelime indeksi (Bit 0-14)
000033E7 A90080 test ax, 0x8000 ; Bit 15: Ek zinciri devam bayrağı mı?
000033EA 740C jz 0x33F8 ; Devam bayrağı yoksa kelimeyi bitir
000033EC E8AEFD call 0x319D ; Section 3 ekini oku ve fonetik olarak iliştir
D. 24 Girişlik Atlama Tablosu (Jump Table) ve format_sub
SUB AL, 2 ; Frekans değerinden 2 çıkar
CMP AL, 23 ; 23'ten büyükse işlem yapmadan dön
SHL AL, 1
MOV BX, AX
JMP [CS:BX + 0x1237] ; İlgili UI yordamına sıçra
mov dl, [bp+0x6] ; DL = parametre (0-7)
mov ax, dl
shl ax, 1 ; AX = param * 2
add ax, 0x1015 ; AX = param*2 + 0x1015 (tablo girişi)
mov si, ax ; SI -> tablo girişi
mov al, 1
mov cl, dl
shl al, cl ; AL = 1 << param
xor [0x283A], al ; Durum bayrağını evir: flag ^= (1 << param)
4. MTU.TUR Dosya Anatomisi ve Bölüm Yapısı
MTU.TUR dosyası (221,466 bayt), 4 baytlık MG2\x1a sihirli baytı ile başlayan 6 bölümlü ikili bir morfoloji dosyasıdır:
letter_count = 32
sec1_size = (letter_count + 1) * 2 # 66 bayt
sec2_size = (letter_count ** 2 + 1) * 2 # 2,050 bayt
sec3_off = 12 + sec1_size + sec2_size # 2,128 (Boyut: 3,218 * 14 = 45,052 B)
sec4_off = sec3_off + sec3_count * 14 # 47,180 (Boyut: 26,775 * 4 = 107,100 B)
sec5_off = sec4_off + word_count * 4 # 154,280 (Ham ek baytları havuzu)
sec6_off = sec5_off + sec5_len # 158,288 (Boyut: 910 * 4 = 3,640 B)
Section 6 Ünsüz Sertleşme Algoritması: Eğer (byte2 & 0x80 == 0) ve (byte1 & 0x10 != 0) ise gövde sertleştirilir: ğ ➔ k, b ➔ p, c ➔ ç, d ➔ t, g ➔ k.
5. Çift Yönlü Sözlük Motorları
A. İngilizce ➔ Türkçe Sözlük (MTU.TRK – 832 KB)
17,988 madde başı; 676 adet iki harfli önek ofset tablosu ve 195 girişlik İngilizce suffix tablosu (-ability, -ness, -ization, -fully, -ing, -tion) kullanılarak çözümlenmiştir.
B. Türkçe ➔ İngilizce Sözlük (TR_EN Ters İndeksleme)
MTU.TRK dosyasındaki 17,988 adet İngilizce-Türkçe çifti tersine indekslenerek 27,105 adet temiz Türkçe ➔ İngilizce sözlük maddesi elde edilmiştir.
C. Türkçe ➔ Türkçe Sözlük (“Türkçe Leb Demeden” – MTU.TUR)
26,775 madde başı; ilk iki harften Section 1 ve Section 2 ofset tablolarına $O(1)$ sürede zıplayarak anlık arama ve yazım denetimi yapar.
6. Kelime Oyunu ve Quiz Motoru (MTU.ING – 655 KB)
32,000 yuvalı ofset tablosunda 12,437 aktif oyun kaydı bulunur. Yuva başlığı: [0x00, (trk_idx + 1) % 256, category_byte].
flag_low = flag & 0x7F # varyant biti temizlenir (bit 7)
is_variant = bool(flag & 0x80) # bit 7: alternatif oyun modu
topic_idx = flag_low % 36 # 36 uzmanlık konusu (0-35)
quiz_mode = flag_low // 36 # quiz zorluk modu: 0, 1 veya 2
7. MTU.SOZ Dosya Mimarisi (Yer Adları – 23 KB)
14,034 karakterlik kesintisiz alfabetik harf akışında kelime sınırları (\0 veya boşluk) saklanmaz; 19 grup ayracı bulunur. MTU.EXE yer adı sorgularını akış üzerinde doğrudan alt-dize taraması (substring search) yaparak doğrular.
8. MTU.TES İkili Formatı ve Kayıt Protokolü
Toplam 640,866 baytlık veritabanı, 26,775 kelimeye ait eş anlamlı kümelerini saklar (21,076 aktif kayıtlı slot).
- 0x80 Morfolojik Başlık: İzleyen 16-bit ek ID’si türemiş başlığı tanımlar (1,727 slot).
- 0x40 Fiil Kökü Alt-Kayıt Ayracı: Fiilden türeyen alt başlıkları başlatır (1,906 alt-kayıt).
- Çok Kelimeli Deyim Formülü:
word_count = ((flag >> 4) & 3) + 1 - Bit-15 Morfem Zincirleme: 16-bit sözcük okunurken Bit 15 set edilmişse sonraki 16-bit ek kuralı okunur (Örn:
çek + in + me + z + lik ➔ çekinmezlik).
9. MTU.EXE İçindeki 36 Bilimsel Kategori Tablosu
MTU.EXE veri segmentinde (0x1B63A - 0x1B7B6) yer alan 36 uzmanlık konusu:
| ID | Kategori | ID | Kategori | ID | Kategori |
|---|---|---|---|---|---|
| 0 | Mecaz | 12 | Ekonomi | 24 | Meteoroloji |
| 1 | Argo | 13 | Elektrik, elektronik | 25 | Mimarlık |
| 2 | Renk | 14 | Felsefe | 26 | Müzik |
| 3 | Türemiş | 15 | Fizik | 27 | Otomobil, otomotiv |
| 4 | Anatomi | 16 | Gökbilim (astronomi) | 28 | Ruhbilim (psikoloji) |
| 5 | Askerlik | 17 | Hayvanbilim | 29 | Sinema |
| 6 | Bitkibilim | 18 | Hekimlik | 30 | Spor |
| 7 | Biyoloji | 19 | Hukuk | 31 | Teknik, teknoloji |
| 8 | Coğrafya | 20 | İskambil | 32 | Ticaret |
| 9 | Denizcilik | 21 | Kimya | 33 | Tiyatro |
| 10 | Dilbilgisi, dilbilim | 22 | Mantık | 34 | Yazın (edebiyat) |
| 11 | Dinsel | 23 | Matematik | 35 | Yerbilim (jeoloji) |
10. Kritik Hata Çözümleri ve Vaka Analizleri
- Vaka 1: 0x0C Bilimsel Kategori Başlığı (
anevrizma): Alt 4 biti0x0Colan baytların 36 bilimsel kategoriyi temsil ettiği çözülerekHekimlik: damar hastalığıtanımı kurtarıldı. - Vaka 2: 0xC0 Çapraz Başvuru Mimarisi (
siyasi): 8,179 kelimelik çapraz başvuru mimarisinde yönlenilen ana başlığın listeye eklenmesi sağlanarakpolitik, siyasaleşleşmesi tamamlandı. - Vaka 3: Eşsesli (Homonym) Yuva Seçim Hatası (
araç,cami,çeşme,aks): Boş slot filtresi uygulanarak 528 temel kelime sisteme kazandırıldı (21,505 aktif kelime). - Vaka 4: Morfem Yumuşama Kontrolü (
hafif): Fiil köklerinde yumuşama bypass’ı uygulanaraktartıda az çekenvegüçlüksüzçıktıları canlı Windows 3.1 ekranlarıyla eşitlendi.
11. Python Tabanlı Modüler Mimari
src/
├── core/ # Çekirdek Sabitler ve Metin Fonksiyonları
│ ├── constants.py # 32 harfli alfabe, 36 kategori tablosu
│ └── text.py # tr_lower, normalize_turkish, sıralama algoritmaları
│
├── engine/ # Tersine Mühendislik Çekirdek Motorları
│ ├── phonetics.py # Ünlü uyumu, ünsüz yumuşama ve sertleşme kuralları
│ ├── suffix.py # SuffixEngine: 3,218 adetlik Section 3 ek tablosu
│ ├── binary_parser.py # TesBinaryParser: 0x80, 0xC0, 0x0C ve 0x40 akış ayrıştırıcı
│ └── thesaurus.py # ThesaurusEngine: O(1) indeksler ve koordinatör (~250 satır)
12. Web Arayüzü
Elde edilen veritabanını tarayıcı üzerinde incelemek amacıyla Vanilla HTML/CSS ve Python http.server tabanlı hafif bir web arayüzü (ui.py) hazırlandı:
- Windows 3.1 Masaüstü: Klasik teal arka plan (
#008080), 3D kabartmalı pencereler, lacivert başlık çubuğu. - Orijinal Buton Sprite’ları:
MTU.EXEkaynaklarından çıkarılan sarı onay eli, “Tamam” ve “Değiştir” butonları. - Pencere Sürükleme Motoru (
makeDraggable): CSS transform ortalamasını mutlak piksel koordinatlarına dönüştüren sürükle-bırak motoru. - Canlı Arama: 26,775 kelime içinde harf yazıldıkça anında çalışan sözlük ve eş anlamlılar listesi.
13. Doğrulama (Ground Truth Testi)
Python motorunun çıktılarının orijinal 16-bit yazılımla birebir örtüştüğünü teyit etmek için DOSBox-X üzerinde Windows 3.1 ortamında çalışan MTU.EXE ile karşılaştırmalı testler (test_comparison.py) yürütüldü. Ekran görüntüleri alınan temel kelimelerin anlam grupları, morfolojik türevleri ve deyimleri karşılaştırılarak tam uyum sağlandı:
| Kelime | Anlam Grupları | Öne Çıkan Doğruluk Kriteri |
|---|---|---|
öz | 1, 2, 3.Anlam, Türemiş (63 eş) | 15/15 türemiş sözcük eşleşmesi |
kitap | 1.Anlam (1 eş) | elkitabı (bileşik tamlama) |
elma | 1.Anlam (2 eş) | amerikaelması, kirazelması |
ekmek | 1.Anlam, 2.Anlam (17 eş) | ekip biçmek, francala |
gelmek | 1.Anlam (17 eş) | sökün etmek, çıkagelmek |
yüz | 1, 2.Anlam, Mecaz (22 eş) | bet beniz, çehre, fizyonomi |
göz | 1.Anlam (5 eş) | bakış açısı, görüş açısı |
akıl | 1.Anlam (34 eş) | eseme, feraset, havsala, izan |
güzel | 1, 2.Anlam (48 eş) | bir içim su, ay parçası, gelgelli |
test | 1.Anlam (13 eş) | deneme, tatma, sınav |
mali | 1.Anlam (3 eş) | mal ile ilgili, para ile ilgili, parasal |
hafif | 1, 2, 3.Anlam (41 eş) | tartıda az çeken, güçlüksüz |
dolu | 1.Anlam (41 eş) | avuç avuç, az buz değil |
ağır | 1.Anlam, Mecaz (21 eş) | balyoz gibi, battal, kunt |
boş | 1, 2.Anlam (24 eş) | abes, beyhude, nafile |
adalet | 1.Anlam (22 eş) | hâk yemezlik, âlicenaplık, tarafsızlık |
cesaret | 1.Anlam (24 eş) | çekinmezlik, cüretkârlık, korkusuzluk |
hürriyet | 1.Anlam (15 eş) | başına buyrukluk, bağımsızlık |
barış | 1.Anlam (4 eş) | ateşkes, sulh, uyuşma |
zengin | 1, 2, 3.Anlam (44 eş) | fazlasıyla, ibadullah |
ölüm | 1.Anlam (22 eş) | cana kıyma, göçüp gitme, ecel |
giriş | 1.Anlam (24 eş) | açılış, başlayış, ilk başta |
çıkış | 1.Anlam (10 eş) | kaynak, köken, mahreç, menşe |
el | 1..4.Anlam, 2 Mecaz (33 eş) | aracı/araç/vasıta ve baskı/etki/idare |
anevrizma | Hekimlik (1 eş) | damar hastalığı (0x0C başlığı) |
siyasi | 1.Anlam (2 eş) | politik, siyasal (0xC0 çapraz başvuru) |
araç | 1.Anlam (7 eş) | vasıta, otomobil, taşıt, taksi |
cami | 1.Anlam (1 eş) | mescit |
çeşme | 1.Anlam (17 eş) | pınar, kaynak, memba, kuyu |
aks | 1.Anlam (1 eş) | dingil |
çit | 1.Anlam (11 eş) | parmaklık, çeper, ağıl |


