AVR'da MFM kodlama

 Bir önceki yazımda AVR (atmega328p) tabanlı disket emülatöründen (fddEMU) bahsetmiştim. Bu yazımda AVR tabanlı MFM okuyucu/yazıcı projelerinden kronolojik sırayla bahsetmeye çalışacağım. İtiraf etmem gerekir ki aşağıda bahsedeceğim projelerin çoğundan fddEMU'yu yazdıktan sonra haberdar oldum. Eğer daha önce bu projelerin varlığından haberdar olsaydım fddEMU daha önce yazılabilirdi. Bu listede yer alması gereken ancak bilgim olmadığı için yer almayan bir proje varsa lütfen yorumlar bölümünden beni haberdar ediniz.


ZX FDD Emulator (https://github.com/EvgeniyRU/ZX_FDD_Emulator)

Web taramasında (google) bulamadığım bu emülatörü github aramasında buldum. Açıklamasında (README.md) ZX-Spectrum Beta disk arayüzü için yazıldığı belirtilen ZX FDD emulator ilk defa 2016 Nisan ayında github'a yüklenmiş, son güncelleme ise 2018 Haziran ayında yapılmış. Henüz test etmedim ancak incelediğim kodundan anladığım kadarı ile i2c bağlantılı 2x16 lcd ve sd-kart adaptörü gerektiriyor. Bu emülatörün öne çıkan özelliği (daha eskisini bulamadım) yazılan ilk AVR tabanlı disket sürücü emülatörü olması ve disket sürücü kontrolörü (FDC) ile iletişimi UART üzerinden sağlaması. AVR UART'ını (seri port) MSPIM (Master SPI Mode) modunda kullanıyor. Benim anladığım kadarı ile atmega328p Datasheet'inde MSPIM modunda kristal pinleri (XCK) MSPIM Clock pini olarak kullanıldığından kristal kullanılamıyor, oysa bu emülatör kodunda ise hem kristal kullanılıyor hemde MSPIM modu, sırf bu sebeple bile takdiri hak ediyor. Kesinlikle çok aydınlatıcı bir kaynak kod. Ayrıca MFM kodlama 8 byte'lık bir tablo ile o kadar efektif biçimde yapılıyor ki assembly kullanımına dahi gerek kalmıyor. Eksi olarak ise yazma desteğininin olmaması gösterilebilir. 

 

USB Floppy (https://www-user.tu-chemnitz.de/~heha/basteln/PC/usbfloppy/)

Henrik Haftmann tarafından yazılan USB FLoppy ile standart bir disket sürücünün atmega32u4 kullanılarak, bilgisayara usb disket sürücü olarak tanıtılması sağlanmış. Henüz test etmediğim için kodundan anladığım kadarıyla USB Floppy atmega32u4'ün 16 bit timer1'ini kullanarak MFM verisini okuyup yazabiliyor. MFM kodlama için assembly kullanılmış. Kaynak web sitesine göre kod Temmuz 2016'da yayınlanmış. Aynı kod rahatlıkla bir disket sürücü emülatörü yapmak için kullanılabilirdi. 

 

DrawBridge (eski ismi: Arduino Floppy Disk Reader) (https://github.com/RobSmithDev/ArduinoFloppyDiskReader)

Robert Smith tarafından yazılan DrawBridge ilk defa Ağustos 2017'de github'a yüklenmiş. DrawBridge, amiga disketlerini okumak için yazılmış, daha sonra geliştirilerek diğer disketleri de okuma yeteneği eklenmiş. Halen geliştirilmesi devam ediyor. DrawBridge disketten okuduğu işlenmemiş MFM verisini FTDI usb-seri port adaptörü üzerinden yüksek hızla (2 MBaud) bilgisayara gönderiyor, bilgisayarda işlenen veri disket imajına dönüştürülüyor. Mevcut hali ile bir disket sürücü emülatörü yapmak mümkün değil. Ancak özellikle geliştirme esnasındaki tecrübelerini anlattığı blogu bu konuyla ilgilenenler için kesinlikle ilham verici.


MFM Reader (https://www.5volts.ch/posts/mfmreader/)

Bu aslında bir disket sürücü emulatörü değil, tersine disketleri okuyup seri port üzerinden bilgisayara aktarmak için yazılmış. Peter Schranz tarafından yazılan Mayıs 2019 tarihli makalede atmega1284p'nin 8bit timer0'ı kullanılarak disket sürücüden MFM verisinin okunması anlatılmış. AVR assembly ile yazılan kod timer1'in input capture (yakalama) özelliği olmaksızın yazılmış olması nedeniyle bize taze bir perspektif sunuyor.  Bu makalede FM ve MFM kodlama çok güzel anlatılmış, konu üzerinde bilgi sahibi olmak isteyenlere tavsiye ederim. Takip eden 2 makalede 2 ayrı yöntemle MFM verisinin diskete yazılması anlatılıyor. MFM reader kodu da bir disket sürücüsü emülatörü yazabilmek için bize yeterli kaynak sağlamakta.


ArduinoFDC (https://github.com/dhansel/ArduinoFDC)

fddEMU'nun yazılmasını, sağlayan MFM  kodunun kaynağı olan ArduinoFDC ilk defa Ekim 2020'de David Hansel tarafından github'a yüklenmiş. Son güncelleme Mayıs 2021'de yapılmış. ArduinoFDC atmega328p timer1 (input capture) kullanarak MFM verileri okuyup, yazabiliyor. Tabi yine tüm MFM kodu assembly de yazılmış. Seri port üzerinden bilgisayarla haberleşen ArduinoFDC FAT12 formatlı disket içindekileri listeleme (arduDOS), disket imajını yada disketin içinden istenen bir dosyayı bilgisayarınıza kopyalabilmeniz için Z modem protokolü özelliklerini barındırıyor. Her satırı açıklamalı assembly kodu ve GPL lisansı ile ArduinoFDC, fddEMU gibi açık kaynaklı projeler için sağlam bir temel teşkil ediyor.


Yorumlar

Popüler Yayınlar