Arsitektur dan pemrograman Fairchild Channel F

"Homebrew Channel F akan seperti pemrograman sprite melalui jumper perangkat keras ..."
/ chadtower, forum atariage /



Konsol game Fairchild Channel F , juga dikenal sebagai VES, muncul pada November 1976. Tidak seperti pendahulunya seperti Ping-Pong, Tennis (di baris yang sama - "Olahraga Video" Soviet), ia memiliki perbedaan yang sangat signifikan - kehadiran mikroprosesor dan kartrid dengan program. Sebelum ini, game di konsol diimplementasikan dengan logika yang ketat - program, dalam arti modern, tidak ada di sana.

Fairchild Channel F dirilis hingga 1983. Selama waktu ini, lebih dari seperempat juta konsol ini telah terjual dan sekitar 30-40 game telah dirilis , beberapa di antaranya sudah ada di tahun 2000-an.

Berbicara tentang keunggulan dalam hal menggunakan mikroprosesor, perlu dicatat bahwa RCA Studio II, yang saya bicarakan di artikel sebelumnya, hanya beberapa bulan terlambat, tetapi ternyata jauh lebih lemah dari Channel F, yang mengapa gagal dalam penjualan. Namun, kemunculannya, kurang dari setahun kemudian, Atari VCS - dan menggantikan Channel F. dari pasar.

Pengembangan Fairchild_Channel_F, dengan demikian, tidak. Dalam Sistem II dan beberapa klon, seperti Saba Videoplay 2 (1979), perbedaannya terutama di tubuh, joystick (ngomong-ngomong, mereka semua mengerti, kecuali untuk posisi yang biasa, rotasi tombol) dan jumlah chip. Secara arsitektur, semuanya hampir identik.

Apa itu Saluran F?

CPU


Prosesor itu, dalam tradisi-tradisi zaman itu, diproduksi oleh perusahaan Fairchild yang sama dengan konsol itu sendiri dan disebut F8 en.wikipedia.org/wiki/Fairchild_F8 . Ini adalah prosesor 8-bit tahun 1974, yang beroperasi pada frekuensi 1,8 MHz (satu instruksi memakan waktu dari 1 hingga 6 siklus clock).



Namun, itu dapat disebut mikroprosesor hanya dengan peregangan, karena prosesor ini terdiri dari dua chip - perangkat komputasi 3850CPU yang mengandung ALU, baterai, 64 byte SRAM, logika yang diperlukan untuk menjalankan instruksi, dua port (tidak ada bus alamat!) Dan 3851PSU (Dapat diprogram) Storage Unit), yang berisi 1 kb ROM (digunakan untuk BIOS), penunjuk instruksi, skema pengalamatan memori, interupsi, pengatur waktu (interupsi dan pengatur waktu tidak digunakan secara khusus dalam Saluran F).

Kemudian, chip F3859 muncul, yang menggabungkan CPU dan PSU pada chip yang sama dan Mostek 3870 - versi yang sedikit ditingkatkan, dirilis hingga tahun 1990-an. Namun, ini adalah cerita lain. Menariknya, kadang-kadang F8 disebut mikrokontroler (khususnya, karena adanya timer dan port) dan disebut sebagai nenek moyang keluarga Intel MCS-48 (8048).

Selain Channel F, prosesor F8 juga digunakan di komputer VideoBrain dan komputer catur CompuChess . Secara umum, sangat mengejutkan bahwa ada sangat sedikit informasi tentang prosesor ini. Dengan pengecualian beberapa deskripsi dari Fairchild dan kode sumber dari beberapa game dan contoh khusus untuk Channel F, tidak ada lagi. Tampaknya prosesor ini belum pernah digunakan di tempat lain, yang tampaknya luar biasa (mengingat bahwa versi-versi canggihnya telah dirilis untuk beberapa waktu). Saya akan berasumsi bahwa semua perangkat lain yang digunakan adalah untuk keperluan militer.

Sekarang sedikit tentang fitur prosesor. Renungkan set dan fungsi registernya. Saya pikir ini adalah salah satu arsitektur paling membingungkan yang ada pada waktu itu (yang modern mungkin meluas, tetapi perbandingannya akan salah, karena mereka dirancang untuk kompiler. Orang yang hidup bekerja dengan F8).

Ada banyak register di prosesor. Selain baterai 8-bit A dan register bendera W (I, O, Z, C, S), ada juga "papan alas" - 64 sel delapan-bit dengan berbagai fungsi.

Sembilan sel pertama digunakan sebagai register tujuan umum R0-R8 dalam perintah seperti 'lr a, 7 "(memuat isi register R7 ke dalam baterai). Perhatikan bahwa huruf R tidak diindikasikan - hanya nomor register yang ditulis. Apa yang sebenarnya dimaksud, nomor atau nomornya harus jelas dari konteksnya. Katakanlah, dalam kasus instruksi lr, tidak mungkin ada angka. Dan jika, misalnya, "li 7" (memuat konstanta ke dalam baterai), maka itu persis angka, bukan register.

Sel 9, 10-11 (H), 12-13 (K), 14-15 (Q) dirancang untuk menyimpan register lain dalam situasi yang berbeda, seperti memanggil subprogram.

Register R16-R63 hanya dapat diakses melalui register indeks ISAR khusus (Indirect Scratchpad Address Register), sebagai enam buffer delapan byte yang terbentuk dari sel 16-23, 24-31, 32-39, 40-47, 48-55, 56-63 .

Enam bit ISAR dibagi menjadi dua bagian dari 3 bit. Saat menambah atau mengurangi ISAR per satu, hanya 3 bit yang lebih rendah yang terpengaruh - mis. pengalamatan dilakukan dalam salah satu dari enam buffer delapan byte yang disebutkan (pada saat yang sama, ujung buffer dapat dilacak oleh instruksi cabang bersyarat khusus br7).

clr ; 0 -> A ; set ISAR to full address Ox27 (octal 27) lisu 2 ; buffer N2 lisl 7 ; index within buffer N2 loop: lr d,a ; A-> buffer N2[index], than decrement ISAR (27, 26, 25, ... ) br7 loop ; go further if low part of ISAR contains 7 (end of buffer N2). if not, go loop again 

Dalam hal ini, "d" dalam instruksi "lr d, a" bukan nama register, tetapi tanda bahwa ISAR perlu dikurangi ("i" - meningkat, "s" - biarkan tidak berubah).

Ada cara lain untuk mengatasi tidak langsung - melalui register DC0 (Penghitung Data):

  dci data_addr ; data_addr -> DC0 lm ; [data_addr] -> A, DC0 + 1 -> DC0 ... data_addr: db 0,1,2,3,... 

Jika Anda perlu mentransfer data dari satu area memori ke yang lain, maka perintah xdc juga digunakan, yang menukar konten register DC0 dan DC1. Yaitu kita membaca dari alamat yang ditunjukkan oleh DC0, kemudian melakukan xdc dan menulis ke alamat yang sekarang ditunjuk oleh DC1. Kemudian lagi xdc, dll. Yaitu DC1 adalah semacam register bayangan untuk menyimpan salinan DC0. Mengakses langsung (kecuali untuk perintah xdc) tidak mungkin.

Contoh-contoh di atas hanya mengilustrasikan sebagian dari kemungkinan dalam hal menangani, pada kenyataannya, ada lebih banyak dari mereka.

Juga di F8 ada empat port - 0,1,4,5, di mana Anda dapat menulis dengan perintah out dan membaca dengan perintah in. Di Saluran F, port digunakan untuk menampilkan grafik, suara, dan membaca status joystick.

Saya tidak akan memikirkan instruksi lain seperti aritmatika, transisi, dan sebagainya - mereka cukup standar. Saya hanya mencatat bahwa pilihan register tempat Anda dapat melakukan tindakan sangat terbatas, sehingga kode tumbuh dengan cepat karena kebutuhan untuk terus-menerus memindahkan nilai bolak-balik.

Tidak ada pengurangan (hanya ada penambahan). Instruksi decrement (ds) dan increment (inc) per unit bersifat asimetris. ds hanya bekerja dengan register r0-r8, inc - hanya dengan baterai.

Lompatan tanpa syarat merusak baterai.

Contoh loop normal

  li 25 ; (r4) number of iterations lr 4,a next: ds 4 ; r4-- bnz next ; until r4 == 0 

Rutinitas


Karena F8 tidak memiliki tumpukan perangkat keras, ada kesulitan dengan panggilan subprogram bersarang. Panggilan normal dan kembali terlihat seperti ini:

  ; ...code pi sub ; Pushes address of next instruction to PC1 ; address of sub is stored in PC0 (jump to subroutine) ; ...code continues sub: ; ... often used code pop ; Move return address from PC1 to PC0 

Di sini PC0 adalah penunjuk instruksi biasa. PC1 - yang disebut "tumpukan register". Ini tidak ada hubungannya dengan stack, hanya PC0 disimpan di dalamnya ketika subrutin dipanggil.

Jika subrutin lain dipanggil dari sub, alamat pengirim ditimpa dan perlu rumit (simpan alamat pengirim pertama di register K):

  prog: ; ...do something... pi sub1 ; Address of next instruction stored in PC1 ; sub1 is stored in PC0 (jump to subroutine) ; ...do more... sub1: lr k,p ; Copy PC1 to K, original jump address to K ; ...do something... pi sub2 ; Pushes address of next instruction to PC1 ; sub1 is stored in PC0 (jump to subroutine) ; ...do more... pk ; Store address of next instruction in PC1 ; Copy value in K to PC0 (jump back to main) sub2: ; ...do something... pop ; Move return address from PC1 to PC0 

Jika Anda juga membutuhkan sarang tingkat ketiga, maka semuanya menjadi sangat menyedihkan (di BIOS untuk ini bahkan ada dua rutinitas khusus - pushk dan popk).

Rekomendasi umum adalah mencoba mengganti panggilan subrutin dengan makro. Tentu saja, jika tidak ada batasan ketat pada ukuran kode.

Tidak ada tumpukan perangkat keras di F8. Jika perlu, ini diimplementasikan secara terprogram - melalui ISAR dan buffer.

Menulis ke RAM tidak terlalu relevan (karena kekurangan satu), tetapi terlihat seperti ini:

  li $FF ; set value dci $3800 ; set target address st ; write 

Memori


Meskipun ini terdengar agak aneh, tidak ada RAM di Fairchild Channel F. Dua kilobyte memori video (MK4027) yang ada tidak ditampilkan di ruang alamat, dan memang mereka tidak dapat dibaca, mereka ditulis melalui port. Register mikroprosesor, bahkan sebanyak 64, hampir tidak dianggap benar untuk RAM.

Program yang dapat dijalankan disimpan dalam kartrid ROM yang dapat dilepas, paling sering memiliki kapasitas 2kb (beberapa game modern menggunakan kartrid 3k, 4k dan 5k). Selain itu, ada chip prosesor built-in, ROM 1KB, yang berisi permainan sederhana seperti Tenis, beberapa rutinitas yang berguna dan gambar dari beberapa karakter.

Di ruang alamat, BIOS terletak dari $ 0000 hingga $ 07ff, ROM cartridge - dari $ 0800.

Grafik


Kemampuan grafis Channel F sangat primitif, karena tidak ada pengontrol video dalam bentuk chip terpisah di sana - semuanya diimplementasikan pada logika biasa seperti register geser, gerbang, dan penguat operasional. Sangat tidak biasa bahwa sumber yang berbeda menyebutkan resolusi yang berbeda, dan ada banyak pilihan. Faktanya adalah bahwa memori video yang tersedia 2 kilobyte menyiratkan resolusi 128 x 64, tetapi pada kenyataannya ini jauh dari kasus. Pertama, banyak tergantung pada area gambar yang sedang dibentuk di TV khusus ini yang terlihat (karena 4 kolom pertama tidak digunakan sama sekali secara resmi). Kedua, beberapa kolom terakhir digunakan di bawah palet. Ketiga, sebagian dari memori tidak digunakan sama sekali.

Hasilnya, resolusi aktual dapat diperkirakan sekitar 95 x 58 piksel dengan 8 warna (yang, bagaimanapun, jauh lebih baik daripada RCA Studio II dengan 64x32 hitam putih).

Sebagian besar konsol dirilis dalam versi NTSC, tetapi PAL juga ada. Tidak ada perbedaan praktis, seperti kata mereka (jumlah garisnya sama).

Pada dasarnya, setrika sederhana semacam itu hanya memungkinkan Anda menggambar titik-titik pada layar. Meskipun jumlah total warna yang ditampilkan adalah 8, namun, hanya empat yang dapat ditampilkan dalam satu baris (Anda dapat secara sewenang-wenang menyebutnya palet). Palet diatur secara individual untuk setiap baris, dan disimpan di tempat yang agak aneh - di kolom 125 dan 126 dari setiap baris (yang dalam hal apa pun berada di luar area yang terlihat). Mengubah palet, masing-masing, dengan menggambar piksel dalam dua kolom ini.


(area memori video yang benar-benar terlihat di layar dan area di mana palet diatur disorot dengan warna kuning)

Seperti disebutkan di atas, hanya ada satu cara untuk menulis data ke VRAM - melalui porta. Ini menunjukkan warna, kolom, baris:

X ditulis ke port 4, Y ke port 5, warna ke port 1, setelah itu data ditransfer dengan menulis konstanta ke port 0:

  ; set color (2 bit per pixel) li $00 ; color ($00 = green, $40 = red, $80 = blue, $C0 = background) outs 1 li 104 ; X com outs 4 ; set the row li 61 ; Y com outs 5 ; transfer data to VRAM li $60 outs 0 li $50 outs 0 ; wait for update lis 6 delay: ai $ff bnz delay 

Diperlukan penundaan agar semuanya dapat direkam, jika tidak, poin berikutnya tidak dapat ditarik. Dalam versi resmi, 4 masih ditambahkan ke kolom dan baris (dihilangkan karena kesederhanaan)

Mengisi seluruh layar dengan titik-titik (dalam satu lingkaran) dengan demikian membutuhkan waktu sekitar satu detik. Penting untuk dicatat bahwa selain pembaruan layar yang sangat lambat, ada juga fakta bahwa tidak ada cara untuk menunggu berkas kembali melalui bingkai. Dengan demikian, bahkan redraw kecil pasti akan disertai dengan kedipan.

Sekarang tentang palet. Sebenarnya, untuk setiap baris ada dua mode - hitam dan putih (ketika latar belakang hitam dan latar depan hanya putih, tidak peduli apa piksel yang diambil) dan warna.

Dalam mode warna latar depan, selalu ada tiga - merah, hijau, biru (rgb). Ditambah satu dari tiga warna latar belakang - abu-abu, biru muda, hijau muda.

Untuk mengatur palet di kolom 125 dan 126, tulis nilai berikut:

 x=125 x=126 palette --------------------------------------------------------------------- 00 00 COLOR: rgb, light green bg 00 ff COLOR: rgb, light blue bg ff 00 COLOR: rgb, gray bg ff ff B/W: www, black bg 

Dalam gim biasa, mereka biasanya melakukan ini: pertama mereka menetapkan latar belakang umum tertentu, untuk itu Anda dapat menggunakan prosedur BIOS yang sudah jadi:
  li $c6 ; $21 - b/w palette, fill with black. $c6 - color palette, fill with gray lr 3, A pi clrscrn ; clrscrn BIOS call 

Kemudian, jika perlu, buat strip dengan palet hitam dan putih (misalnya, untuk menampilkan skor permainan dengan angka putih pada latar belakang hitam)


Dan kemudian mereka menempatkan piksel dalam salah satu dari tiga warna (jika latar belakangnya abu-abu, masing-masing - r, g, b). Akibatnya, tentu saja ada 8 warna, tetapi untuk menempatkan di tempat tertentu, titik warna sewenang-wenang sangat mudah - tidak mungkin. Berikut adalah serangkaian gambar yang memberikan beberapa gagasan tentang warna dan kombinasinya.

Sebenarnya, pada gambar ini semua, dengan demikian, akhir - semua yang ingin Anda lakukan dilakukan dengan menggambar piksel, dan secara manual. Dari rutinitas yang bermanfaat, BIOS memiliki keluaran karakter. Namun, untuk alasan penghematan ruang, dalam ROM hanya ada gambar angka dan karakter individu, ukuran 5x8 piksel:


Namun, prosedur penarikan mereka bermanfaat dan dapat digunakan sebagai berikut:

  li 25 ; column lr 1,a li 25 ; row lr 2,a li %11000000 ; eg $c0 - green "0" lr 0,a ; a -> r0 pi drawchar ; call subroutine 

Dalam versi di atas, dua digit teratas dalam register r0 menentukan warna (10 - merah, 11 - hijau, 01 - biru, 00 - transparan), sisanya - nomor seri karakter (0 1 2 3 4 5 6 7 8 9 G? T SPACE MX BLOCK: - tengah || kiri || `), mulai dari nol. Register r1 dan r2 ditempatkan, masing-masing, kolom dan baris.

Opsi yang lebih praktis adalah tidak memikirkan bit:

  li 20 ; x lr 1,a ; a -> r1 li 10 ; y lr 2,a ; a -> r2 li $40 ; char color in bits 6,7: $80 (%10000000) - red, $c0 (%11000000) - green, $40 (%01000000) - blue, $00 (%00000000) - transparent oi 1 ; index of char ( eg 3 for "3" ) lr 0,a ; combined color + char index -> r0 pi drawchar ; call subroutine 

Untuk merasakan platform, saya menulis intro 256-byte untuk kontes intro kecil di Chaos Constructions'2019 . Tidak ada yang istimewa, tetapi perhatikan mengapa perubahan palet baris demi baris digunakan di sana. Strip horizontal yang merayap, seolah-olah, menyoroti garis yang ada di bawahnya, sementara mengganti seluruh latar belakang dengan hitam, dan semua piksel dengan putih. Karena Anda tidak perlu menimpa pikselnya sendiri (dan tidak perlu mengembalikannya nanti), Anda dapat membuat "cahaya latar" sedemikian cepat dan tanpa berkedip.

Poin kedua adalah huruf "CC". Karena huruf "C" tidak ada dalam BIOS, tumpang tindih huruf GG dan angka 1 digunakan untuk mendapatkan "CC" terbalik.



Suara


Suara itu buruk. Secara resmi, ada tiga suara - 120Hz, 500 Hz dan 1 KHz. Faktanya, mendapatkan sesuatu selain klik dan mencekik mencekik bermasalah. Selain itu, mereka mengatakan bahwa antara mesin PAL dan NTSC, serta antara versi lama dan baru, suaranya juga berbeda. Namun, untuk gim biasa - cukup. Suara on dan off melalui port:

  li %01000000 ; 1khz beep $40 outs 5 li %10000000 ; 500hz beep $80 outs 5 li %11000000 ; 120hz beep $c0 outs 5 ; some pause clr outs 5 ; turn off sound 

Orang-orang bahkan bersenang-senang bermain musik. Sampel terbaik menyerupai PC-Speaker. Benar, bagaimanapun juga tidak ada arti praktis - semua sumber daya prosesor digunakan untuk musik, tidak ada yang istimewa yang dapat dilakukan.

Alat pengembangan


Saat ini, ada pilihan siap pakai dari perangkat lunak yang diperlukan yang disebut "Paket Pengembangan".

Ini termasuk assembler DASM, disassembler, emulator MESS (dengan debugger). Semua ini berfungsi tanpa masalah setidaknya di bawah Windows 7.


Parameter untuk perakitan dan startup:

 dasm.exe test.asm -f3 -otest.bin messd channelf -cartridge %cartPath%\test.bin -w -effect sharp -r 640x480 -ka 

Emulatornya cukup bagus, meskipun debugger di sana sangat aneh. Saya tidak dapat mengkonfigurasi versi baru MAME / MESS segera (saya perhatikan bahwa pengaturan MAME untuk platform tidak populer yang seharusnya didukung adalah tugas yang tidak sepele setiap kali).

Emulator mengasumsikan bahwa resolusi wilayah yang terlihat sesuai dengan minx = 5, minY = 5, maxX = 105, maxY = 61

Karena tidak ada kesenangan dalam menulis sesuatu di bawah emulator tanpa harus menguji hasilnya secara langsung, saya harus menyelesaikan masalah dengan emulator ROM. Atas permintaan saya, tnt23 membuat kartrij khusus (Alexander Novozhilov mencetak case untuknya) ke mana EEPROM 28C16A dimasukkan. Karena kekhasan pengalamatan F8, saya masih harus membeli chip Fairchild 3853 kuno di eBay. Alhasil, dimungkinkan untuk memprogram EEPROM untuk melihat bagaimana kode terlihat pada mesin live.


Selain itu, tnt23 memasang keluaran F-Video Saluran F (biasanya hanya dapat dihubungkan ke TV melalui input antena), yang sangat meningkatkan kualitas gambar dan reproduksi warna.

Kisah tentang Fairchild Channel F:



Sumber daya


Source: https://habr.com/ru/post/id467811/


All Articles