Komputer buatan sendiri dari papan AON

Baru-baru ini, beberapa artikel tentang komputer buatan yang dibuat dari berbagai komponen non-standar telah muncul di Habré. Saya juga memutuskan untuk berbicara tentang komputer saya, yang dibuat pada tahun 1993. Setelah antusiasme umum terhadap sinclair, saya ingin memiliki komputer 8-bit yang sepenuhnya asli berdasarkan z80 dan, selain itu, membuat perangkat lunak untuk itu, mulai dari sistem operasi dan diakhiri dengan mainan. Apa yang terjadi, baca di bawah potongan.

Pertanyaan pertama yang muncul saat membuat komputer Anda adalah pertanyaan tentang arsitektur. Saya memutuskan bahwa itu akan cukup kompak, berdasarkan pada prosesor z80, tanpa menampilkan gambar di TV, tetapi dengan layar teks LCD, keyboard yang cukup besar, output suara dalam bentuk tweeter nada tunggal (standar pada waktu itu untuk sebagian besar komputer) dan port RS232 untuk menghubungkan ke komputer lain untuk keperluan pemrograman dan debugging.

Namun, muncul masalah di mana mendapatkan papan sirkuit tercetak untuk sirkuit yang sepenuhnya asli, karena pada tahun 1993 orang Cina belum memproduksi papan untuk seluruh dunia, dan itu sangat mahal untuk memesan pengembangan dan produksi di pabrik. Dan kemudian saya mengalihkan perhatian saya ke papan dari mana ID penelepon dibuat - pengidentifikasi nomor otomatis. Mereka dijual di pasar Mitinsky, memiliki kesempatan untuk menginstal komponen yang saya butuhkan, tetapi perlu ditingkatkan. Dijual ada beberapa jenis papan sirkuit cetak yang, jika ingatanku, saya memilih papan yang disebut "Rus."

Biarkan saya mengingatkan Anda untuk pembaca muda apa itu AON. Itu adalah telepon dengan pemanggilan tombol (ngomong-ngomong, pada waktu itu cukup keren, karena sebagian besar ponsel memiliki disk pemintalan), yang terdiri dari 12 tombol dan indikator 9-segmen, 7-segmen yang menyala di mana nomor telepon ditampilkan, jika itu mungkin untuk menentukan dan beberapa informasi lainnya. Papan AON berisi prosesor z80, port paralel 58055, sirkuit dekoder, timer 58053, ROM 32-kilobyte (dengan penghapusan ultraviolet), RAM statis 8-kilobyte, bagian analog yang terhubung ke saluran telepon dan, mungkin, sesuatu yang lain, apa yang saya lupa selama beberapa tahun terakhir.

Keyboard 12 tombol dan indikator yang tersedia pada Caller ID tidak cocok untuk saya, karena mereka biasanya tidak dapat memasukkan informasi atau menampilkannya (dalam huruf-huruf tertentu). Oleh karena itu, diputuskan untuk menggunakan keyboard buatan sendiri 40 tombol dan layar LCD 24-karakter teks, yang kemudian dijual. Untuk menghubungkan keyboard dan layar LCD, perlu untuk memodifikasi skema AON. Hal pertama yang saya lakukan adalah membuang seluruh bagian analog yang terkait dengan saluran telepon, atau lebih tepatnya, saya tidak menyegelnya. Pada saat yang sama, kaki output pada decoder, yang memilih debit indikator dan kaki pada port paralel 58055, dibebaskan. Layar LCD memerlukan 4 baris untuk mengirimkan informasi, tetapi untuk keyboard itu perlu menggunakan decoder.Karena 40 tombol pada keyboard disusun dalam matriks 5 baris 8 buah, diputuskan untuk menghubungkan 8 tombol ini ke dekoder sehingga dapat dipindai dengan memasok kombinasi yang berbeda dari tiga baris ke input dekoder dan membaca 5 nilai dari deretan tombol menggunakan KR580VB55. Dengan demikian, kode pindai tombol yang ditekan pada keyboard berukuran satu byte, di mana tiga bit pertama menentukan kolom di mana tombol ditekan, dan sisa 5 bit yang ditunjukkan di baris mana tombol ini (atau beberapa tombol sekaligus) ditekan . Selain itu, saya menganggap bahwa 8 kilobyte RAM tidak akan cukup dan menggantinya dengan 32 kilobyte. Pada saat yang sama, saya harus menyolder ulang beberapa track pada papan sirkuit tercetak, untungnya, casing RAM 8- dan 32-kilobyte hampir identik dalam pinout. Lewat sini,Saya mendapat ROM 32 kilobyte dan RAM 32 kilobyte (saya ingat bahwa Z80 dapat menangani maksimum 64 kilobyte, sehingga saya menggunakan ruang alamat secara maksimal). Selain itu, dua baris lagi 58055 pergi ke port serial RS232, yang diperlukan untuk menghubungkan ke komputer lain. Saya menempatkan semua ekonomi ini dalam kasing dari tester. Hasilnya adalah desain ini:

gambar

Setelah perangkat keras selesai, tiba saatnya untuk membuat perangkat lunak. Di sini perlu dicatat bahwa proses penciptaannya tidak terlihat sama sekali seperti sekarang ini. Pertama, sebagian besar ditulis dalam assembler z80 (walaupun pada saat itu hampir semua program untuk sistem tersebut ditulis dalam assembler, well, kecuali untuk BASIC). Untuk kompilasi dari assembler pada tahap pertama, teman saya membantu saya, yang memiliki komputer Profi - klon sinclair, tetapi dengan TR-DOS di dalamnya. Kemudian saya mulai menggunakan IBM PC saya, yang merupakan OS / 2, yang menjalankan MS-DOS di jendela terpisah, di mana, pada gilirannya, emulator TR-DOS diluncurkan, di mana kompilasi berlangsung. Saya harus mengatakan bahwa ketika perangkat lunak tumbuh secara nyata, proses kompilasi dan perakitan memakan waktu sepuluh menit. Masalah kedua adalahbahwa tidak ada alat debugging ada dan, karena itu, perlu untuk mengunduh semuanya setiap kali di komputer buatan saya dan memeriksa cara kerjanya (hal pertama yang harus dilakukan adalah program untuk bekerja RS232 pada 9600 bit per detik untuk mengunduh). Dan akhirnya, harus dikatakan bahwa setelah men-debug gambar ROM, perlu untuk menulisnya ke ROM ini sendiri, setelah sebelumnya menghapus apa yang sudah ditulis di sana. Penghapusan dilakukan dengan menggunakan lampu ultraviolet untuk penyamakan melalui jendela khusus di rumah sirkuit mikro, yang kemudian ditutup dengan kertas perekat hitam khusus, yang berfungsi untuk menutup lubang di sisi disket 5-inci untuk melindunginya dari penulisan. Selain itu, karena saya tidak memiliki programmer, untuk menulis versi baru perangkat lunak dalam ROM, setiap kali saya harus pergi ke teman saya ke ujung lain dari Moskow,yang memiliki programmer ini. Di sini perlu untuk mengklarifikasi pertanyaan, bagaimana mungkin untuk men-debug gambar ROM tanpa memuatnya ke dalam ROM ini? Ada alamat dasar untuk ini, yang digunakan semua perangkat lunak saya, mengubah alamat dengan 32 kilobyte. Yaitu, gambar ROM baru dimuat ke dalam RAM dan didebug di sana, dan setelah debugging, alamat dasar diatur ke nol, semuanya dikompilasi lagi, dan saya pergi ke seorang teman untuk menulis versi baru dalam ROM.semuanya dikompilasi lagi dan saya pergi ke seorang teman untuk menulis versi baru di ROM.semuanya dikompilasi lagi dan saya pergi ke seorang teman untuk menulis versi baru di ROM.

Ketika proses "coding" - "debugging" - "firmware" di-debug, muncul pertanyaan untuk menulis sistem operasi. Sistem operasi harus mendukung input keyboard, menampilkan informasi pada layar LCD, mendukung untuk mengeluarkan suara yang berbeda dan melakukan semua ini secara paralel, jika mungkin, yaitu multi-tasking. Untuk semua ini, arsitektur berikut dipilih - ada tiga jenis tugas di OS: beberapa tugas real-time dengan prioritas tertinggi, satu tugas pengguna yang berinteraksi dengan orang itu sendiri dan tugas latar belakang yang berfungsi saat prosesor diam. Saya menutup tugas dengan prioritas tertinggi pada interupsi, yang dihasilkan oleh timer KR580VI53 10 kali per detik. Harus dikatakan bahwa dalam Caller ID, interupsi dihasilkan 400 kali per detik, karena itu perlu untuk memperbarui indikator sangat sering untuksehingga seseorang tidak melihat flicker. Selain memperbarui indikator dalam interupsi, keyboard disurvei untuk mencari tombol yang ditekan. Gangguan yang sering terjadi pada AON menyebabkan fakta bahwa sebagian besar waktu prosesor dihabiskan untuk interupsi, dan saya ingin komputer saya melakukan sesuatu yang bermanfaat. Karena saya memasang layar LCD sebagai perangkat tampilan informasi, yang memiliki memori sendiri dan tidak perlu memperbarui secara dinamis, kebutuhan untuk frekuensi interupsi seperti itu tidak lagi diperlukan. Secara eksperimental ditetapkan bahwa 10 interupsi per detik sudah cukup untuk polling keyboard.bahwa sebagian besar waktu prosesor dihabiskan untuk interupsi, dan saya ingin komputer saya melakukan sesuatu yang bermanfaat. Karena saya memasang layar LCD sebagai perangkat tampilan informasi, yang memiliki memori sendiri dan tidak perlu memperbarui secara dinamis, kebutuhan untuk frekuensi interupsi seperti itu tidak lagi diperlukan. Secara eksperimental ditetapkan bahwa 10 interupsi per detik sudah cukup untuk polling keyboard.bahwa sebagian besar waktu prosesor dihabiskan untuk interupsi, dan saya ingin komputer saya melakukan sesuatu yang bermanfaat. Karena saya memasang layar LCD sebagai perangkat tampilan informasi, yang memiliki memori sendiri dan tidak perlu memperbarui secara dinamis, kebutuhan untuk frekuensi interupsi seperti itu tidak lagi diperlukan. Secara eksperimental ditetapkan bahwa 10 interupsi per detik sudah cukup untuk polling keyboard.

Dengan demikian, tugas real-time diluncurkan pada setiap interupsi dan menempatkan informasi baru dalam antrian acara khusus. Peristiwa tersebut terdiri dari beberapa jenis dan berisi informasi yang berkaitan dengan jenis peristiwa, misalnya, acara "tombol yang ditekan" berisi kode pemindaian. Sebenarnya, salah satu tugas prioritas yang dimulai pada setiap interupsi adalah tugas polling keyboard dan secara terprogram menghapus bouncing kontak. Selain tugas ini, ada juga tugas-tugas prioritas - timer yang tugas pengguna dapat mengatur, dan yang, setelah waktu yang ditentukan, mengantri acara yang sesuai, ada alarm yang bekerja pada waktu, jam dan kalender tertentu, dan ada juga tugas yang memutar musik menggunakan pemrograman KR580VI53, dan input ke dalamnya dimasukkan data dalam bentuk catatan. Lewat sini,tugas pengguna bisa mulai memutar musik dan melakukan hal-hal lain.

Pekerjaan yang bermanfaat di komputer saya dilakukan oleh tugas pengguna yang dikendalikan oleh peristiwa. Pandangan khas dari tugas semacam itu tampak seperti:

while(true) {
  Event e;

  GetEvent(e);

  /* process event */
}


Di sini fungsi GetEvent (e) menunggu acara muncul dalam antrian dan, ketika muncul, mengisi struktur Acara. Jelas bahwa menurut peristiwa tertentu, program dapat keluar dari loop tak terbatas dan mentransfer kontrol kembali ke monitor sistem, yang meluncurkan tugas pengguna. Karena peristiwa dalam tugas pengguna biasanya diproses dengan cepat, program menunggu acara baru muncul dalam prosedur GetEvent (e). Untuk memanfaatkan ekspektasi ini, tugas latar belakang diperkenalkan bahwa program pengguna dapat berjalan dan bekerja secara independen. Yaitu, ketika gangguan dari penghitung waktu terjadi, tugas waktu-nyata pertama kali dipenuhi dengan menempatkan peristiwa dalam antrian, kemudian setelah gangguan, tugas pengguna memproses semua peristiwa dari antrian, dan sisa waktu hingga gangguan berikutnya diberikan pada tugas latar belakang.Hari ini, skema seperti itu terlihat alami, tetapi pada tahun 1993 sangat progresif.

Ada masalah lain terkait dengan fakta bahwa layar LCD tidak dapat menampilkan huruf Rusia. Ini karena fakta bahwa indikator-indikator seperti itu baru saja muncul di pasar kita dan tidak ada yang secara khusus menjelaskannya. Secara alami, tidak ada perpustakaan untuk bekerja dengan mereka, tetapi hanya ada spesifikasi dan deskripsi perintah. Oleh karena itu, semua pekerjaan inisialisasi dan bekerja dengannya harus ditulis dari awal. Saya memecahkan masalah dengan Russification sebagai berikut: prosedur khusus ditulis, inputnya adalah string dengan teks Rusia yang perlu ditampilkan. Prosedur ini menggantikan semua huruf Rusia yang mirip dengan Latin dengan huruf Latin yang sesuai, dan yang tidak mungkin diganti dibuat dengan cepat menggunakan gambar khusus yang dapat diunduh ke layar LCD. Ini harus diperhatikanbahwa ada delapan gambar pengguna seperti itu di dalamnya dan, karenanya, dalam teks Rusia tidak boleh lebih dari delapan huruf, yang analognya tidak ada dalam alfabet Latin. Tapi biasanya sudah cukup. Fitur menyenangkan lain yang saya gunakan adalah bahwa jika Anda mengubah gambar khusus untuk satu karakter, Anda mendapatkan animasi yang lucu. Saya menggunakan kesempatan ini dalam permainan pencari ranjau, yang akan saya bahas di bawah, di mana bendera di atas tambang yang ditemukan berkibar di angin dan bom meledak.Saya menggunakan kesempatan ini dalam permainan pencari ranjau, yang akan saya bahas di bawah, di mana bendera di atas tambang yang ditemukan berkibar di angin dan bom meledak.Saya menggunakan kesempatan ini dalam permainan ranjau, yang akan saya bahas di bawah ini, di mana bendera di atas tambang telah diterbangkan angin dan bom meledak.

Sekarang saya akan memberi tahu Anda tentang tugas-tugas pengguna yang saya buat untuk komputer saya. Ketika saya mulai membuat mereka, saya segera menyadari bahwa menulisnya di assembler, seperti yang dilakukan semua orang pada waktu itu untuk sistem seperti sinclair, cukup menyedihkan. Karena saya memprogram C pada PC IBM, saya memikirkan apakah mungkin memprogram pada C dan pada komputer saya. Setelah beberapa pencarian, saya menemukan kompiler dari bahasa C untuk TR-DOS, apalagi, dalam versi K&R klasiknya. Kompiler ini agak primitif, misalnya, ia tidak memeriksa apakah jumlah parameter yang diteruskan ke prosedur sesuai dengan angka aktualnya, belum lagi memeriksa tipenya. Tetapi jika saya bisa menggunakan kompiler ini untuk komputer saya, itu akan menjadi kemajuan luar biasa. Masalahnya adalah bagaimana mengadaptasi kode yang diterima oleh kompiler ini untuk komputer saya.Di sini saya menggunakan cara klasik, yang sudah kita lupakan, dan pada tahun 1993 mereka masih ingat. Cara ini adalah dengan mengkompilasi kode sumber tidak langsung ke file objek, tetapi ke kode sumber assembler. Dengan demikian, itu hanya diperlukan untuk menulis makro yang akan memungkinkan memanggil prosedur assembler dikompilasi dari kode dan sebaliknya, dengan transfer parameter yang benar, yang dilakukan. Menggunakan kompiler ini, selain kenyamanan bekerja dengan kode, memberikan keuntungan besar lain - menjadi mungkin untuk bekerja dengan perkalian integer / divisi (saya ingat bahwa Z80 tidak memiliki perkalian integer dan perintah pembagian), dan juga (lihatlah!), Kemampuan untuk bekerja dengan angka titik mengambang. Namun, untuk ini saya harus berurusan dengan perpustakaan yang terpasang pada kompiler,karena semua operasi matematika setelah kompilasi dilakukan sebagai panggilan ke perpustakaan ini. Masalahnya adalah bahwa perpustakaan ini menggunakan variabel temporer yang ditempatkan oleh kompiler dalam model memori khusus untuk TR-DOS, yang, tentu saja, sama sekali tidak sesuai dengan model memori komputer saya. Saya harus mencari semua variabel sementara seperti itu dan mengulanginya untuk alamat yang sesuai dengan RAM saya. Tetapi sebagai bonus, saya mendapat banyak fungsi standar seperti sinus dan cosinus, yang saya gunakan dalam tugas saya, yang akan saya bahas di bawah ini.Saya harus mencari semua variabel sementara seperti itu dan mengulanginya untuk alamat yang sesuai dengan RAM saya. Tetapi sebagai bonus, saya mendapat banyak fungsi standar seperti sinus dan cosinus, yang saya gunakan dalam tugas saya, yang akan saya bahas di bawah ini.Saya harus mencari semua variabel sementara seperti itu dan mengulanginya untuk alamat yang sesuai dengan RAM saya. Tetapi sebagai bonus, saya mendapat banyak fungsi standar seperti sinus dan cosinus, yang saya gunakan dalam tugas saya, yang akan saya bahas di bawah ini.

Program pertama yang dibuat menggunakan kompiler C adalah program untuk memeriksa operasi RAM yang benar. Program ini melewati seluruh RAM, menulis, dan kemudian membaca berbagai pola dan membandingkan hasilnya. Selain itu, seluruh proses ditampilkan pada layar LCD, yang juga mengkonfirmasi operasi yang benar dari prosedur yang terkait dengannya. Jelas bahwa ini hanya ujian sebelum menulis program yang lebih menarik. Hal berikutnya yang saya lakukan adalah membuat hex editor untuk mengubah isi RAM. Editor ini sudah memiliki kemungkinan yang cukup luas, termasuk tidak hanya melihat dan mengedit sel memori, tetapi juga mencari byte yang menarik dalam RAM. Secara khusus, menjadi mungkin untuk menulis program kecil secara langsung dalam RAM dalam kode mesin. Untuk menguji kemampuan suara komputer Anda,Saya membuat program seperti "kotak musik" yang memainkan berbagai melodi (saya ingat melodi direkam sebagai catatan). Lebih lanjut, sebuah program untuk permainan "bulls and sapi" ditulis, di mana seseorang diminta untuk menebak angka acak empat digit yang dikandung oleh komputer (ya, saya juga membuat generator angka acak). Dalam program ini, saya harus membuat daftar gulir dengan riwayat nomor yang sudah dimasukkan, karena tidak mungkin untuk menampilkan daftar panjang pada dua baris. Program berikutnya yang dibuat adalah "pencari ranjau" klasik pada bidang 16x16. Karena saya hanya memiliki dua garis yang tersedia, saya melakukan pengguliran, menambahkan iringan musik dan animasi bendera yang terbang di angin dan meledak bom. Selanjutnya, untuk meditasi, saya membuat sebuah program yang menunjukkan cacing merangkak ke arah yang acak,menggunakan kemampuan untuk mengunggah gambar khusus ke layar. Nah, dan di mana tanpa tic-tac-toe klasik? Di dalamnya saya menguji algoritma minimax, yaitu komputer menghitung (agak cepat) semua opsi dan tidak pernah hilang. Karena sistem operasi saya mendukung alarm, waktu, dan kalender, saya membuat program pengguna yang mengatur waktu, tanggal, dan beberapa alarm yang, ketika waktu yang ditentukan tercapai, memainkan melodi yang berbeda. Dan akhirnya, mahkota penciptaan di komputer saya adalah program untuk menghitung lintasan gerak dalam masalah dua benda gravitasi. Yaitu, untuk posisi awal dan kecepatan tubuh tertentu, serta massa dari pusat penarik,masalah integrasi numerik dari sistem dua persamaan diferensial biasa nonlinier dari urutan kedua dengan langkah integrasi yang diberikan diselesaikan. Untuk ini, saya menambahkan prosedur yang secara numerik mengintegrasikan persamaan ini. Semua variabel adalah format floating point ganda. Di sini saya menekankan sekali lagi bahwa dalam prosesor z80 tidak hanya ada dukungan perangkat keras untuk bekerja dengan floating point, tetapi juga perkalian / pembagian bilangan bulat biasa, semuanya dilakukan secara terprogram. Integrasi ini bekerja sangat lambat, sekitar satu langkah per detik, tetapi berhasil!tetapi juga perkalian / pembagian bilangan bulat biasa, semuanya dilakukan secara terprogram. Integrasi ini bekerja sangat lambat, sekitar satu langkah per detik, tetapi berhasil!tetapi juga perkalian / pembagian bilangan bulat biasa, semuanya dilakukan secara terprogram. Integrasi ini bekerja sangat lambat, sekitar satu langkah per detik, tetapi berhasil!

Apa yang masih ingin saya implementasikan, tetapi tidak berhasil - pertama, alokasi dinamis / deallokasi memori, sehingga saya dapat secara fleksibel mengelola sumber daya dari setiap tugas. Juga, perekaman / pembacaan pada kaset tidak dilaksanakan, seperti yang dilakukan di Sinclair. Tetapi secara keseluruhan, saya senang dengan apa yang berhasil saya lakukan. Saya menekankan bahwa semua hal di atas adalah dalam ROM 32 kilobyte - ukuran saat ini dari satu email yang tidak terlalu besar.

Anda dapat melihat komputer saya beraksi di sini:




Dan unduh perangkat lunaknya di sini

All Articles