Mengubah Komputer Mikro BBC (1981) menjadi Penulis Disk Aman $ 40.000



pengantar



Salah satu kisah keamanan floppy disk paling terkenal berasal dari Dungeon Master . Game ini, dirilis pada Desember 1987, menggabungkan format disk fisik yang canggih (bit fuzzy) dengan pemeriksaan keamanan rahasia yang dibangun ke dalam gameplay itu sendiri.



Saya merekomendasikan membaca artikel ini , yang memberikan gambaran umum yang sangat baik tentang floppy disk, diikuti dengan gambaran umum yang sangat rinci tentang perlindungan bit fuzzy Dungeon Master untuk Atari ST. Ada juga artikel bagus ini yang membahas lebih detail tentang cerita seputar pertahanan Dungeon Master. Ini memiliki kutipan dari salah satu penulis Dungeon Master:



Β« , , 40 . , Β».


Alasan harga tinggi ini kemungkinan besar karena akurasi waktu yang diperlukan untuk membuat bit fuzzy dengan andal. Kembali pada hari-hari ketika sebagian besar dunia mengukur kinerja dalam mikrodetik, akurasi yang diperlukan diukur dalam nanodetik.



BBC Micro memiliki prosesor 6502 pada 2 MHz dan menggunakan dua siklus clock, atau 1 mikrodetik, untuk menjalankan instruksi paling sederhana. Adakah harapan bahwa akan mungkin untuk menulis bit fuzzy di bawah batasan seperti itu? Mari kita lihat seberapa jauh kita bisa melangkah. Pekerjaan ini akan disebut sebagai "Proyek Berang-berang Berminyak".



Untuk memberi Anda rasa zeitgeist, berikut adalah gambar duplikator floppy disk 3,5 ". Sungguh menakjubkan betapa miripnya dengan mesin fotokopi, kecuali Anda memasukkan cakram ke dalam wadah alih-alih kertas! Sepertinya Advanced World Products bahkan mungkin telah menjual mesin semacam itu kepada Anda .





Port Kustom Mikro BBC



BBC Micro dikenal karena kemampuannya yang sangat baik, termasuk penggunaan apa yang disebut "port pengguna". Port ini dikendalikan oleh 6522 Versatile Interface Adapter yang beroperasi pada 1 MHz. Portanya sendiri memiliki 8 pin data dan 2 pin kontrol. Kontak ini memberikan tingkat kendali yang sangat tinggi. Pin data dapat dikonfigurasi secara individual sebagai input dan output, dan level pin dapat diatur ke tinggi atau rendah.



Mengapa port pengguna penting bagi kami? Kami akan mencoba mengontrol disk drive secara langsung melalui itu. Dengan menghapus pengontrol floppy disk dari persamaan, kita mungkin dapat menyingkirkannya dan mendapatkan kontrol lebih langsung atas drive disk dan aliran data yang sedang ditransfer.





Port pengguna ke drive disk



Gambar di atas menunjukkan kabel saya yang menghubungkan port pengguna ke drive disk. Konektornya standar, dan kabel yang menghubungkannya hanyalah jumper. Saya dengan tulus berusaha untuk membuat sesuatu yang dapat dibuat "pada masa itu", jadi saya tidak menggunakan elektronik tambahan.



Kabel tersebut disusun sebagai berikut:





Kesimpulan utama dari diagram ini adalah bahwa antarmuka disk drive mungkin lebih sederhana daripada yang dibayangkan. Kita dapat mengontrol drive disk dan menanyakan status pentingnya hanya dengan 8 pin. Semuanya sangat sederhana. Katakanlah kita perlu memutar drive, maka itu cukup untuk memberikan sinyal rendah ke PB0 dan PB1. Jika Anda ingin menunggu disk berputar ke awal trek, maka Anda perlu menanyakan level logika pada PB6 hingga kami melihat level sinyal berubah dari tinggi ke rendah. Untuk pergerakan selangkah demi selangkah, cukup dengan menyetel tingkat logis "masuk" yang berlawanan dengan "melangkah keluar", lalu melakukan denyut sinyal rendah pada "langkah" kontak.



Sejauh ini bagus, kami memiliki kontrol dasar atas drive, tetapi kami belum merekam apa pun.



Masalah kelistrikan



Penyimpangan singkat pada masalah kelistrikan sangat penting, karena saya bertemu dengannya. Menghubungkan pasangan komponen secara acak dapat membuatnya berfungsi, tetapi terkadang diperlukan penyesuaian. Berikut adalah kisaran tegangan yang awalnya diamati pada pin W / DATA drive:





Kami mencoba menulis pulsa ke drive dengan frekuensi FM 250 kHz.



Tegangan logika 1 kira-kira 3,4 V, dan tegangan logika 0 kira-kira 1,5 V. Ini masalah serius! Tingkat tegangan TTL yang dapat diterima didefinisikan dengan baik:



β€œSinyal TTL input dianggap 'rendah' ​​jika memiliki tegangan antara 0 V dan 0,8 V relatif terhadap pin arde, dan 'tinggi' saat berada di antara 2 V dan VCC (5 V). Jika sinyal tegangan dalam kisaran dari 0,8 V hingga 2,0 V diterapkan ke input elemen TTL, maka elemen tersebut tidak memberikan jawaban yang spesifik, dan oleh karena itu sinyal tersebut dianggap "tidak ditentukan". "


Tegangan logika 0 1,5 V dianggap "tidak ditentukan" dan tidak akan menyebabkan tindakan apa pun. Memang, drive saya tidak merekam apa pun dengan sinyal ini.



Masalah ini diatasi dengan melepas kabel floppy drive EOL dari drive . Ini adalah foto drive saya dengan perakitan EOL yang diberi garis merah:





Ini menyelesaikan masalah level tegangan dengan baik, setelah itu semuanya berfungsi. Sepertinya banyak port BBC Micro selain port disk tidak memiliki daya yang cukup untuk menggerakkan kabel EOL. Tapi tunggu - mungkin ada alasan untuk memasang resistor ini? Iya. Menghapusnya memiliki dua trik:



  • Perhatikan panjang kabelnya. Tanpa resistor EOL, kabel yang panjang rentan terhadap distorsi sinyal.
  • Perhatikan level tegangan pada kabel yang tidak terhubung. Saya mengamati tegangan 1,32V pada pin aktuator S / SEL (pilih samping). Ini tidak normal karena nilai ini juga berada dalam kisaran ketidakpastian TTL. Di mana drive akan menulis data? Mungkin di sisi atas, mungkin di bawah. Atau mungkin tidak satupun dari mereka sama sekali! Masalahnya diselesaikan dengan menghubungkan setiap kabel penting dan menerapkan sinyal tinggi atau rendah ke kabel tersebut.


Perlu menambah bandwidth



Masalah yang telah kami lewati sejauh ini: bagaimana cara mengirim sinyal ke pin W / DATA? Ini adalah kontak yang "sulit". Ini memiliki bandwidth tinggi dan persyaratan waktu yang tepat. Mari berhenti bermimpi tentang bit kabur dengan presisi nanodetik sejenak dan coba tulis pulsa FM sederhana ke drive.



Kebanyakan disk untuk BBC Micro berada dalam FM (alias DFM, alias kepadatan tunggal) yang dikodekan pada 250 kHz. Merekam trek FM sebenarnya cukup sederhana. Penting untuk memeriksa apakah drive berputar dan jika penutup rekam terbuka. Setelah itu, setiap 4 mikrodetik, baik kita melakukan riak W / DATA ke rendah, lalu kembali ke sinyal tinggi (bit 1), atau kita tidak melakukannya (bit 0). Paling sering setiap bit detik harus 1 (sinkronisasi bit untuk menjaga waktu dan sinkronisasi).



Mengontrol W / DATA melalui prosesor adalah tugas yang sia-sia. 4 mikrodetik adalah 8 siklus clock prosesor; ini jelas tidak cukup untuk memuat satu byte, menggesernya, menulis 0, dan kemudian 1 ke tingkat logis dari port pengguna. Putaran sederhana kemungkinan akan memakan waktu 12+ mikrodetik, yang terlalu banyak. Jadi, untuk menulis W / DATA dengan cukup cepat, kita harus menggunakan kemampuan chip 6522 VIA.



Register geser 6522 VIA



Kandidat paling jelas untuk tugas kita adalah register geser. Register geser adalah register 8-bit. Dalam mode yang sesuai, memuat register geser akan memaksa chip untuk mengirimkan 8 bit secara berurutan pada salah satu pin port pengguna. Ini bagus - bit diproses secara paralel dengan prosesor utama, sehingga prosesor dapat dengan aman menghabiskan waktu membuat rangkaian bit baru untuk mulai menggeser.



Sayangnya, saya tidak bisa menjalankan sirkuit ini. Satu-satunya mode shift yang berpotensi untuk berjalan cukup cepat adalah "system clock shift". Spesifikasi Western Design Center 6522 memiliki garis besar yang bagus:





Jam sistem VIA adalah 1 MHz, sehingga jam offset akan menjadi 500 kHz dan resolusi bit keluaran adalah 250 kHz. Ini sudah cukup. Namun, saya belum menemukan cara agar jam shift bekerja secara kontinyu dan lancar. Bahkan setelah mencoba waktu yang tepat untuk memuat ulang register geser, interval pin dari jam shift selalu terlihat seperti ini:





Ternyata dalam mode satu shift cukup cepat untuk eksperimen kami, memuat ulang register geser menyebabkan penundaan sebelum melanjutkan shift. Itu tidak cocok untuk kita.



6522 VIA Mode Output Pulsa



Sebuah fitur yang sedikit diketahui dari 6522 adalah "mode keluaran pulsa". Ini tidak dijelaskan dalam spesifikasi dari semua variasi 6522, tetapi berikut adalah entri kecil tentang itu dalam spesifikasi Teknologi MOS :





Akhirnya, kami menemukan spesifikasi yang secara akurat menggambarkan perilakunya. Mode ini sangat menarik bagi kami, karena satu operasi tulis di VIA menjanjikan untuk menghasilkan dua tindakan terpisah: sinyal logika rendah diterapkan ke pin keluaran, dan setelah 1 jam (1 mikrodetik), ia kembali ke sinyal tinggi tanpa upaya di pihak kami. Hal ini memungkinkan kita untuk menggunakannya untuk mendorong sinyal output 250 kHz. Sumber daya prosesor sangat terbatas - loop tidak akan menyelesaikan masalah dengan cara apa pun, tetapi blok kode linier 6502 akan dapat mengatasinya, misalnya:



        \ &70 points to &FE60, aka. user 6522 VIA ORB register.
        STA (&70),Y        \ 8 cycles, pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        LDA (&70),Y        \ 8 cycles, do not pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        ...


Ini akan berhasil. Prosesor memiliki daya yang cukup untuk ini. 8 siklus clock adalah 4 mikrodetik, yang merupakan waktu terpendek antara pulsa disk.



Sayangnya, operasi semacam itu sangat ekstrimsecara aktif menggunakan memori. Setiap bit FM yang dikodekan membutuhkan 2 byte kode baris 6502. Setiap bit data penting adalah dua bit FM karena setiap bit lainnya sinkron. Trek memiliki panjang 3125 byte, jadi diperlukan 3125 * 8 * 2 * 2 == 100 kB kode baris. BBC Micro memiliki RAM 32KB, jadi kami kurang beruntung di sini. Sektor tunggal (kecil) dapat ditulis, termasuk mekanisme perlindungan disk baru yang andal. Tetapi kami tidak akan dapat menulis sektor besar (1024 byte) atau trek lengkap. Kedua operasi ini diperlukan untuk menulis banyak disk dengan benar. Selain itu, resolusi waktu adalah 1 mikrodetik, yang tidak cukup untuk merekam lebih banyak pelindung dan permukaan disk yang lebih kompleks.



Kami bisa senang bahwa kami berhasil mendapatkan setidaknya sesuatu untuk bekerja, dengan batasan seperti itu, tetapi solusi ini tidak sepenuhnya cocok untuk kami.



Bantuan dari port keluaran yang tidak menjanjikan



Untungnya, saya berbicara dengan orang pintar seperti Bitshifters Collective . (Lihat demo terbaru mereka, Pengaruh Jahat !) Dalam percakapan di Slack, Tom Seddon (penulis emulator b2 ) menyarankan ... menggunakan output port RGB (?)



Kabel adaptor video-ke-disk ... Anda tidak melihatnya di Amazon setiap hari.



Pada awalnya saya menertawakan gagasan ini, tetapi semakin saya memikirkannya, semakin besar kemungkinannya bagi saya. BBC Micro menggunakan chip video 6845 untuk pengaturan waktu . Seperti 6522, ini adalah prosesor yang moody, tetapi setidaknya fitur-fiturnya diuraikan dengan baik berkat demo Bitshifters yang mengeksploitasi 6845 tanpa ampun. Saya juga melakukan rekayasa ulang untuk memaksa emulator jsbeebmeniru dengan benar Hitachi 6845. Mari kita lihat karya Oiled Otter di video ini, lalu beri tahu kami apa yang kami lihat:





Semuanya bekerja berkat konfigurasi yang tidak biasa dari chip 6845. 6845 berjalan pada 1 MHz dan waktu bingkai diatur untuk memiliki satu garis raster pada 32 mikrodetik / 32 byte per "bingkai". Pada setiap output frame, register memori video 6845 ditimpa untuk mengambil 32 byte berikutnya dari lokasi yang berpotensi berbeda. Artinya, setiap 32 mikrodetik, pola keluaran yang berbeda dipilih dari tabel pola keluaran. Kami mengonfigurasi pin RGB untuk mengirimkan 8 piksel per mikrodetik, yaitu 256 per pola keluaran. Ini memberi kita sejumlah besar pola keluaran yang mungkin berbeda. Tetapi karena kami merekam 32 potongan mikrodetik dari pengkodean disk FM, hanya beberapa pola yang cocok untuk kami. Dalam 32 mikrodetik, kita dapat memasukkan 8 pulsa / bit FM. 4 bit akan disinkronkan, dan biasanya semuanya 1.4 bit akan menjadi bit data dan hanya ada 16 kombinasi darinya.



Misalnya, jika kita menulis data 0x5, maka output 32 mikrodetik akan terlihat seperti ini:





Data video akan berformat 00FFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFF. 00 pertama, kedua, keempat dan kelima adalah bit sinkronisasi. Antara bit sinkronisasi adalah pola bit data 0101, atau 0x5.



Batasan CPU dan memori seimbang dengan baik. Pada akhirnya, rangkaian ini mirip dengan yang akan kami coba dengan register geser VIA jika berfungsi: beberapa koprosesor kecil (chip video) menangani transmisi rangkaian bit FM, dan prosesor pusat bebas memuat dan menyediakan pola berikutnya. Persyaratan memori cukup masuk akal. Tabel berisi fragmen keluaran yang diperlukan selama 32 mikrodetik, berkat mode pengalamatan linier khusus, cocok dengan 1024 byte. Daftar indeks pencarian untuk seluruh lagu kira-kira 12KB, jadi semuanya cocok dengan 32KB RAM BBC Micro.



Fitur BBC Micro / 6845



Karakter / kolom terakhir 6845



Tentu saja, agar ini bekerja, Anda harus menemukan beberapa fitur "menyenangkan". Yang pertama adalah fitur 6845, yang menyebabkannya mengeluarkan warna hitam untuk karakter terakhir dari setiap baris bitmap. Ini adalah kutukan dari pengembang demo, dan sekarang tampaknya, peneliti cakram juga. Berikut adalah slide dari pembicaraan baru-baru ini di mana saya mendemonstrasikan masalah ini:





Di sebelah kiri adalah efek dari demo, dirusak oleh bilah hitam vertikal yang disebabkan oleh masalah "karakter / kolom hitam terakhir". Beberapa 6845 garis raster masuk dalam satu jalur raster, dan sayangnya garis-garis hitam muncul secara tidak sengaja. Saat mengontrol disk, efeknya jauh lebih buruk: bilah hitam diganti dengan pulsa yang tidak diinginkan, yang tertulis ke disk.



Gambar solusi ditampilkan di sebelah kanan: gelombang yang ditransmisikan ke disk hanya dibalik. Sekarang normal bahwa kolom terakhir akan selalu berwarna hitam (ditunjukkan dengan garis luar oranye), karena nol selalu diperlukan di sana. Sebenarnya, ini melanggar persyaratan waktu dari beberapa disk drive untuk sinyal W / DATA yang berdenyut rendah. Berikut diagram timing drive dari era tersebut, Mitsubishi M4852 / M4853 :





Menurut skema ini, logika 0 harus dipertahankan hingga 2100 ns. Dengan bentuk gelombang terbalik, perkirakan 3000 ns atau lebih. Namun, drive saya hanya peduli tentang jatuh pulsa data, bukan durasinya. Ini tidak mengherankan. Ada beberapa trik yang bisa saya lakukan untuk menghindari kebiasaan 6845 dan memastikan durasi waktu sejalan dengan spesifikasi, tapi itu ternyata opsional, jadi saya tidak melakukannya.



DRAM



korupsi DRAM pembusukan adalah mimpi buruk. Itu terjadi ketika kami gagal memperbarui DRAM tepat waktu. Mengutip dari artikel Wikipedia tentang memperbarui memori :



"Proses ini dilakukan secara otomatis di latar belakang oleh sirkuit memori elektronik dan tidak terlihat oleh pengguna."


Ini berlaku untuk sistem modern, tetapi tidak untuk BBC Micro. Di BBC Micro, peningkatan DRAM adalah efek samping dari subsistem video. Ini mengeksploitasi properti yang mode layar standar berulang-ulang melalui semua jalur DRAM dalam waktu singkat. Anda mungkin sudah menebak ke mana arahnya - mode video khusus kami, yang digunakan untuk menghasilkan bingkai pada 32 mikrodetik, bukanlah mode layar standar. Itu tidak menjamin bahwa itu akan melewati semua jalur DRAM, sehingga korupsi DRAM terjadi! Korupsi DRAM bukanlah lelucon. Karena kerusakan DRAM yang tidak direncanakan, saya kehilangan berbagai program dan konten disk. Saya akan menunjukkan kepada Anda, sambil tertawa, program BASIC yang menyebabkan kerusakan DRAM hanya dalam hitungan detik:





Hal yang menyedihkan tentang korupsi DRAM adalah jika itu menimpa Anda, Anda dapat dengan mudah kehilangan data.



Di sisi lain, jika Anda mengharapkan kerusakan DRAM, Anda biasanya dapat melewatinya dengan mudah. Dalam kasus Oiled Otter, ada berbagai siklus kritis di mana 6845 berada dalam kondisi yang tidak biasa. Untuk menyimpan pembaruan DRAM pada setiap siklus ini, peningkatan manual penerimaan data dari memori bekerja.



Peluang terbuka



Sekarang kita memiliki sistem penulisan disk yang berfungsi melewati pengontrol floppy, apa yang dapat kita lakukan dengannya? Dalam video di atas, kami telah mendemonstrasikan kemampuannya untuk membakar disk yang dikodekan FM secara acak.



Tetapi dalam penelitian ini kami sangat beruntung. Karena kekurangan register geser VIA, kami harus mencari solusi dengan pin keluaran video, dan kami mendapat akses ke resolusi pengaturan waktu yang lebih baik pada pin W / DATA . Kami menggunakan MODE4 komputer BBC Micro menggunakan jam piksel 8 MHz. Ini berarti Anda dapat mengeluarkan piksel hitam atau putih setiap 125 ns dengan mengganti pulsa tulis dengan resolusi 125 ns... Jika kita ingin menghabiskan lebih banyak memori ekstra (yang kita miliki) pada tabel yang lebih besar, kita dapat menggunakan MODE0, yang menggunakan clock piksel 16 MHz, yang menyediakan resolusi 62,5 ns. Saya memastikan bahwa 125ns cukup baik untuk semua perlindungan disk yang diuji, tetapi sangat bagus bahwa kami masih memiliki ruang gerak.



Perlindungan Trek Panjang Perlindungan



disk favorit saya adalah perlindungan track panjang. Dia populer selama Amiga... Saya rasa itu tidak pernah digunakan di BBC Micro. Saya suka perlindungan jalur panjang karena sangat mendasar: pengontrol floppy disk memiliki banyak toleransi untuk berbagai kecepatan tulis (karena drive disk berputar pada kecepatan berbeda), tetapi hanya menulis pada satu kecepatan yang benar.



Perlindungan yang lebih kompleks dengan trek panjang adalah menulis dua sektor pada satu trek, di mana salah satu sektor ditulis dengan kecepatan lebih tinggi. Pemeriksaan perlindungan salinan adalah waktu yang dibutuhkan untuk membaca kedua sektor ini. Sektor yang ditulis dengan kecepatan lebih tinggi harus dibaca lebih cepat.



Bisakah Oiled Otter merekam trek seperti itu? Ya, dan cukup mudah. Mengingat resolusi keluaran 125 ns, mudah untuk membuat beberapa entri tabel keluaran yang mirip dengan normal, tetapi dengan 125 nanodetik dipotong dari setiap 1 mikrodetik. Berikut adalah video untuk membuat proteksi jalur panjang dan memeriksa pembacaan disk:







Proteksi dengan bit fuzzy



Mungkin, inilah saatnya bagi kita untuk kembali ke awal: ke proteksi dengan bit fuzzy. Dapatkah Oiled Otter membuat bit fuzzy pada perangkat keras tahun 1981? Mari mencoba. Berikut adalah gambar hasil pembacaan sepasang sektor setelah ditulis oleh perintah FUZZ dari sistem Oiled Otter.





Instruksi FUZZ menulis nibble 0x8 dan bit data secara progresif disisihkan dengan penambahan 125 ns. Ini mirip dengan deskripsi tentang bagaimana bit fuzzy dari Dungeon Master direkam. Seperti yang Anda lihat dari tangkapan layar, byte data 0x88 segera mulai dibaca dengan cara yang salah dan non-deterministik. Tetapi varians tidak 100% acak seperti bit yang lemah - varians adalah apakah bit 0x8 ditulis cukup terlambat sehingga memiliki peluang untuk dilewatkan. Jika dihilangkan, kita masih bisa melihat ada pola dan logika dalam kegilaan ini.



Hasil yang disajikan di atas merupakan penerapan prinsip fuzzy bit pada data yang dikodekan FM. Dalam pengkodean FM, setiap bit data disisipkan dengan bit sinkronisasi. Hal ini mengarah pada fakta bahwa terkadang bit clock menyelinap ke dalam aliran data (lihat byte 0xFF saat pertama kali dijalankan - kemungkinan besar adalah bit clock). Pertahanan Dungeon Master menggunakan bit fuzzy bersama dengan MFM. Hal ini menyebabkan situasi yang lebih sederhana di mana bit fuzzy bergerak di antara dua pengkodean bit data yang valid dan tidak menyentuh bit sinkronisasi! Tentu saja, Oiled Otter dapat menulis MFM, GCR, dan pengkodean lain yang dapat Anda pikirkan. Semua ini hanyalah protokol yang berbeda dari satu primitif fundamental - kemampuan untuk mentransfer pulsa ke drive kapan saja dengan resolusi yang baik.



Untuk mengevaluasinya dengan benar, kami akan memberikan tampilan bit fuzzy pada disk dari osiloskop. Maksimalnya tidak merata, dan ketika kedua pulsa sangat dekat satu sama lain (1 mikrodetik atau lebih, terlalu dekat dengan pengkodean standar), gaya pembalikan magnetisasi yang dikenali oleh drive bahkan mulai berkurang.





Misi tercapai



Kami mendapat kemampuan untuk merekam pulsa disk dengan resolusi 125 ns. Ini cukup sempurna untuk membuat perlindungan disk yang kompleks, termasuk trek panjang, bit lemah, dan bit fuzzy. Lumayan untuk hardware tahun 1981 dengan kecepatan eksekusi perintah tercepat 1 mikrodetik!



Lihat juga:






All Articles