Bab 5: Sistem Pengendalian Commodore-64 dalam Bahasa Himpunan

Bab 5 Sistem Pengendalian Commodore 64 Dalam Bahasa Himpunan



5.1 Pengenalan

Sistem pengendalian untuk komputer Commodore-64 disertakan dengan komputer dalam Memori Baca Sahaja (ROM). Bilangan lokasi bait memori untuk Commodore-64 berjulat dari $0000 hingga $FFFF (iaitu 000016 hingga FFFF16 iaitu 010 hingga 65,53510). Sistem pengendalian adalah dari $E000 hingga $FFFF (iaitu 57,34410 hingga 65,53610).

Mengapa Mengkaji Sistem Operasi Commodore-64
Mengapa mengkaji Sistem Pengendalian Commodore-64 hari ini sedangkan ia merupakan sistem pengendalian komputer yang dikeluarkan pada tahun 1982? Nah, komputer Commodore-64 menggunakan Unit Pemprosesan Pusat 6510 yang merupakan peningkatan (walaupun bukan peningkatan besar) daripada 6502 µP.







6502 µP masih dihasilkan hari ini dalam jumlah yang besar; ia bukan lagi untuk komputer rumah atau pejabat tetapi untuk peralatan elektrik dan elektronik (peranti). 6502 µP juga mudah difahami dan dikendalikan berbanding dengan mikropemproses lain pada zamannya. Hasil daripada ini, ia adalah salah satu mikropemproses terbaik (jika bukan yang terbaik) untuk digunakan untuk mengajar bahasa himpunan.



65C02 µP, masih daripada kelas mikropemproses 6502, mempunyai 66 arahan bahasa himpunan, yang kesemuanya boleh dipelajari secara hati. Mikropemproses moden mempunyai banyak arahan bahasa himpunan dan tidak boleh dipelajari dengan hati. Setiap µP mempunyai bahasa himpunan sendiri untuk dirinya sendiri. Mana-mana sistem pengendalian, sama ada baharu atau lama, adalah daripada bahasa himpunan. Dengan itu, bahasa himpunan 6502 adalah baik untuk digunakan untuk mengajar sistem pengendalian untuk pemula. Selepas mempelajari sistem pengendalian, seperti itu untuk Commodore-64, sistem pengendalian moden boleh dipelajari dengan mudah menggunakan itu sebagai asas.



Ini bukan sekadar pendapat penulis (saya sendiri). Ia adalah trend yang semakin meningkat di dunia. Semakin banyak artikel sedang ditulis di Internet untuk sistem pengendalian Commodore-64 yang dipertingkatkan agar ia kelihatan seperti sistem pengendalian moden. Sistem pengendalian moden diterangkan dalam bab selepas yang seterusnya.





Catatan : OS Commodore-64 (Kernal) masih berfungsi dengan baik dengan peranti input dan output moden (bukan semua).

Komputer Lapan-Bit
Dalam komputer mikro lapan bit seperti Commodore 64, maklumat disimpan, dipindahkan dan dimanipulasi dalam bentuk kod binari lapan bit.



Peta Memori
Peta memori ialah skala yang membahagikan julat lengkap memori kepada julat yang lebih kecil dengan saiz yang berbeza dan menunjukkan perkara (subrutin dan/atau pembolehubah) tergolong dalam julat apa. Pembolehubah ialah label yang sepadan dengan alamat memori tertentu yang mempunyai nilai. Label juga digunakan untuk mengenal pasti permulaan subrutin. Tetapi dalam kes ini, mereka dikenali sebagai nama subrutin. Subrutin hanya boleh dirujuk sebagai rutin.

Peta ingatan (susun atur) dalam bab sebelumnya tidak cukup terperinci. Ia agak mudah. Peta memori komputer Commodore-64 boleh ditunjukkan dengan tiga peringkat butiran. Apabila ditunjukkan pada tahap pertengahan, komputer Commodore-64 mempunyai peta memori yang berbeza. Peta memori lalai komputer Commodore-64 pada tahap pertengahan ialah:


Rajah 5.11 Peta Ingatan Komodor-64

Pada zaman itu, terdapat bahasa komputer yang popular dipanggil BASIC. Ramai pengguna komputer perlu mengetahui beberapa arahan bahasa ASAS minimum seperti memuatkan atur cara daripada disket (cakera) ke memori, untuk menjalankan (melaksanakan) atur cara dalam ingatan, dan untuk keluar (menutup) atur cara. Apabila program BASIC sedang berjalan, pengguna perlu menyuap data, baris demi baris. Ia tidak seperti hari ini apabila aplikasi (beberapa program membentuk aplikasi) ditulis dalam bahasa peringkat tinggi dengan tingkap dan pengguna hanya perlu memuatkan data yang berbeza di tempat khusus dalam tetingkap. Dalam sesetengah kes, gunakan kami tetikus untuk memilih data prapesan. BASIC ialah bahasa peringkat tinggi pada masa itu, tetapi agak hampir dengan bahasa himpunan.

Perhatikan bahawa kebanyakan memori diambil oleh BASIC dalam peta memori lalai. BASIC mempunyai arahan (arahan) yang dilaksanakan oleh apa yang dikenali sebagai Jurubahasa BASIC. Sebenarnya, penterjemah BASIC berada dalam ROM dari lokasi $A000 ke $BFFF (termasuk) yang sepatutnya kawasan RAM. Ini ialah 8 Kbytes agak besar pada masa itu! Ia sebenarnya dalam ROM di tempat keseluruhan memori itu. Ia mempunyai saiz yang sama dengan sistem pengendalian dari $E000 hingga $FFFF (termasuk). Program yang ditulis dalam BASIC juga diletakkan dalam julat $0200 hingga $BFFF.

RAM untuk program bahasa himpunan pengguna adalah dari $C000 hingga $CFFF, hanya 4 Kbytes daripada 64 Kbytes. Jadi, mengapa kita menggunakan atau mempelajari bahasa himpunan? Sistem pengendalian baharu dan lama adalah daripada bahasa pemasangan. Sistem pengendalian Commodore-64 adalah dalam ROM, dari $E000 hingga $FFFF. Ia ditulis dalam bahasa himpunan 65C02 µP (6510 µP). Ia terdiri daripada subrutin. Program pengguna dalam bahasa himpunan perlu memanggil subrutin ini untuk berinteraksi dengan persisian (peranti input dan output). Memahami sistem pengendalian Commodore-64 dalam bahasa himpunan membolehkan pelajar memahami sistem pengendalian dengan cepat, dengan cara yang tidak membosankan. Sekali lagi, pada masa itu, banyak program pengguna untuk Commodore-64 ditulis dalam BASIC dan bukan dalam bahasa himpunan. Bahasa himpunan pada zaman itu lebih banyak digunakan oleh pengaturcara sendiri untuk tujuan teknikal.

Kernal, dieja sebagai K-e-r-n-a-l, ialah sistem pengendalian Commodore-64. Ia datang dengan komputer Commodore-64 dalam ROM dan bukan dalam cakera (atau disket). Kernal terdiri daripada subrutin. Untuk mengakses peranti persisian, program pengguna dalam bahasa himpunan (bahasa mesin) perlu menggunakan subrutin ini. Kernal tidak boleh dikelirukan dengan kernel yang dieja sebagai K-e-r-n-e-l sistem pengendalian moden, walaupun ia adalah perkara yang hampir sama.

Kawasan memori daripada $C000 (49,15210) hingga $CFFF (6324810) daripada 4 Kbytes10 memori ialah sama ada RAM atau ROM. Apabila ia adalah RAM, ia digunakan untuk mengakses peranti. Apabila ia adalah ROM, ia digunakan untuk mencetak aksara pada skrin (monitor). Ini bermakna sama ada aksara sedang dicetak pada skrin atau persisian sedang diakses dengan menggunakan bahagian memori ini. Terdapat sekumpulan ROM (ROM aksara) dalam unit sistem (papan induk) yang ditukar masuk dan keluar dari keseluruhan ruang memori untuk mencapainya. Pengguna mungkin tidak menyedari penukaran itu.

Kawasan ingatan daripada $0100 (256 10 ) kepada $01FF (511 10 ) ialah timbunan. Ia digunakan oleh kedua-dua sistem pengendalian dan program pengguna. Peranan timbunan telah dijelaskan dalam bab sebelumnya kursus kerjaya dalam talian ini. Kawasan memori dari $0000 (0 10 ) kepada $00FF (255 10 ) digunakan oleh sistem pengendalian. Banyak petunjuk diberikan di sana.

Jadual Lompat Kernal
Kernal mempunyai rutin yang dipanggil oleh program pengguna. Apabila versi baharu OS keluar, alamat rutin ini berubah. Ini bermakna bahawa program pengguna tidak lagi boleh berfungsi dengan versi OS baharu. Ini tidak berlaku kerana Commodore-64 menyediakan meja lompat. Jadual lompat ialah senarai 39 entri. Setiap entri dalam jadual mempunyai tiga alamat (kecuali untuk 6 bait terakhir) yang tidak pernah berubah walaupun dengan perubahan versi sistem pengendalian.

Alamat pertama entri mempunyai arahan JSR. Dua alamat seterusnya terdiri daripada penunjuk dua bait. Penunjuk dua bait ini ialah alamat (atau alamat baharu) rutin sebenar yang masih dalam OS ROM. Kandungan penunjuk boleh berubah dengan versi OS baharu, tetapi tiga alamat untuk setiap entri jadual lompat tidak pernah berubah. Sebagai contoh, pertimbangkan alamat $FF81, $FF82 dan $FF83. Ketiga-tiga alamat ini adalah untuk rutin memulakan skrin dan litar papan kekunci (daftar) papan induk. Alamat $FF81 sentiasa mempunyai kod op (satu bait) JSR. Alamat $FF82 dan $FF83 mempunyai alamat lama atau baharu subrutin (masih dalam OS ROM) untuk melakukan permulaan. Pada satu masa, alamat $FF82 dan $FF83 mempunyai kandungan (alamat) $FF5B yang boleh berubah dengan versi OS seterusnya. Walau bagaimanapun, alamat $FF81, $FF82 dan $FF83 jadual lompat tidak pernah berubah.

Untuk setiap entri tiga alamat, alamat pertama dengan JSR mempunyai label (nama). Label untuk $FF81 ialah PCINT. PCINT tidak pernah berubah. Jadi, untuk memulakan daftar skrin dan papan kekunci, pengaturcara hanya boleh menaip 'JSR PCINT' yang berfungsi untuk semua versi OS Commodore-64. Lokasi (alamat mula) subrutin sebenar, cth., $FF5B, boleh berubah dari semasa ke semasa dengan sistem pengendalian yang berbeza. Ya, terdapat sekurang-kurangnya dua arahan JSR yang terlibat dalam program pengguna yang menggunakan OS ROM. Dalam program pengguna, terdapat arahan JSR yang melompat ke entri dalam jadual lompat. Dengan pengecualian enam alamat terakhir dalam jadual lompat, alamat pertama entri dalam jadual lompat mempunyai arahan JSR. Dalam Kernal, beberapa subrutin boleh memanggil subrutin yang lain.

Jadual lompatan Kernal bermula dari $FF81 (termasuk) naik ke atas dalam kumpulan bertiga, kecuali enam bait terakhir yang merupakan tiga penunjuk dengan alamat bait yang lebih rendah: $FFFA, $FFFC dan $FFFE. Semua rutin OS ROM adalah kod boleh guna semula. Jadi, pengguna tidak perlu menulis semula mereka.

Rajah Blok Unit Sistem Commodore-64
Gambar rajah berikut adalah lebih terperinci daripada rajah pada bab sebelumnya:


Rajah 5.12 Rajah Blok Unit Sistem Commodore_64

ROM dan RAM ditunjukkan sebagai satu blok di sini. Cip Antara Muka Video (IC) untuk mengendalikan maklumat pada skrin, yang tidak ditunjukkan dalam bab sebelumnya, ditunjukkan di sini. Blok tunggal untuk peranti input/output, yang ditunjukkan dalam bab sebelumnya, ditunjukkan di sini sebagai dua blok: CIA #1 dan CIA #2. CIA bermaksud Penyesuai Antara Muka Kompleks. Setiap satu mempunyai dua port lapan bit selari (jangan dikelirukan dengan port luaran pada permukaan menegak unit sistem) yang dipanggil port A dan port B. CIA disambungkan kepada lima peranti luaran dalam situasi ini. Peranti tersebut ialah papan kekunci, kayu bedik, pemacu cakera/pencetak dan modem. Pencetak disambungkan di bahagian belakang pemacu cakera. Terdapat juga Litar Peranti Antara Muka Bunyi dan Litar Tatasusunan Logik Boleh Aturcara yang tidak ditunjukkan.

Namun, terdapat ROM Aksara yang boleh ditukar dengan kedua-dua CIA apabila aksara dihantar ke skrin dan ia tidak ditunjukkan dalam gambarajah blok.

Alamat RAM dari $D000 hingga $DFFF untuk litar input/output jika tiada ROM aksara mempunyai peta memori terperinci berikut:

Jadual 5.11
Peta Memori Terperinci daripada $D000 hingga $DFFF
Julat sub-alamat Litar Saiz (Bait)
D000 – D3FF VIC (Pengawal Antara Muka Video (Cip)) 1K
D400 – D7FF SID (Litar Bunyi) 1K
D800 – DBFF RAM warna 1K Nibbles
DC00 – DCFF CIA #1 (Papan Kekunci, Kayu Joy) 256
DD00 – DDFF CIA #2 (Bas Bersiri, Port Pengguna/RS-232) 256
DE00 – DEF Buka Slot I/O #1 256
DF00 – DFFF Buka Slot I/O #2 256

5.2 Dua Penyesuai Antara Muka Kompleks

Terdapat dua Litar Bersepadu (IC) tertentu dalam unit sistem Commodore-64, dan setiap satu daripadanya dipanggil Penyesuai Antara Muka Kompleks. Kedua-dua cip ini digunakan untuk antara muka papan kekunci dan peranti lain kepada mikropemproses. Dengan pengecualian VIC dan skrin, semua isyarat input/output antara mikropemproses dan persisian melalui kedua-dua IC ini. Dengan Commodore-64, tiada komunikasi langsung antara memori dan mana-mana peranti. Komunikasi antara memori dan mana-mana persisian melalui penumpuk mikropemproses, dan salah satu daripadanya ialah penyesuai CIA (IC). IC tersebut dirujuk sebagai CIA #1 dan CIA #2. CIA bermaksud Penyesuai Antara Muka Kompleks.

Setiap CIA mempunyai 16 daftar. Dengan pengecualian daftar pemasa/kaunter dalam CIA, setiap daftar adalah 8-bit lebar dan mempunyai alamat memori. Alamat daftar memori untuk CIA #1 adalah daripada $DC00 (56320 10 ) kepada $DC0F (56335 10 ). Alamat daftar memori untuk CIA #2 adalah daripada $DD00 (56576 10 ) kepada $DD0F (56591 10 ). Walaupun daftar ini tiada dalam memori IC, ia adalah sebahagian daripada ingatan. Dalam peta memori perantaraan, kawasan I/O dari $D000 hingga $DFFF termasuk alamat CIA dari $DC00 hingga $DC0F dan dari $DD00 hingga $DD0F. Kebanyakan kawasan memori I/O RAM dari $D000 hingga $DFFF boleh ditukar dengan bank memori ROM aksara untuk aksara skrin. Itulah sebabnya apabila aksara dihantar ke skrin, peranti tidak boleh beroperasi; walaupun pengguna mungkin tidak menyedari perkara ini kerana pertukaran bolak-balik adalah pantas.

Terdapat dua daftar dalam CIA #1 yang dipanggil Port A dan Port B. Alamat mereka ialah $DC00 dan $DC01, masing-masing. Terdapat juga dua daftar dalam CIA #2 yang dipanggil Port A dan Port B. Sudah tentu, alamat mereka berbeza; mereka ialah $DD00 dan $DD01, masing-masing.

Port A atau Port B dalam sama ada CIA ialah port selari. Ini bermakna ia boleh menghantar data ke persisian dalam lapan bit sekaligus atau menerima data daripada mikropemproses dalam lapan bit sekaligus.

Dikaitkan dengan port A atau port B ialah Daftar Arah Data (DDR). Daftar arah data untuk port A CIA #1 (DDRA1) berada di lokasi bait memori $DC02. Daftar arah data untuk port B CIA #1 (DDRB1) berada di lokasi bait memori $DC03. Daftar arah data untuk port A CIA #2 (DDRA2) berada di lokasi bait memori $DD02. Daftar arah data untuk port B CIA #2 (DDRB2) berada di lokasi bait memori $DD03.

Sekarang, setiap bit untuk port A atau port B boleh ditetapkan oleh daftar arah data yang sepadan untuk menjadi input atau output. Input bermakna maklumat dihantar dari persisian ke mikropemproses melalui CIA. Output bermaksud bahawa maklumat dihantar dari mikropemproses ke persisian melalui CIA.

Jika sel port (daftar) hendak dimasukkan, bit yang sepadan dalam daftar arah data ialah 0. Jika sel port (daftar) hendak dikeluarkan, bit yang sepadan dalam daftar arah data ialah 1. Dalam kebanyakan kes, semua 8-bit port diprogramkan sama ada input atau output. Apabila komputer dihidupkan, port A diprogramkan untuk output dan port B diprogramkan untuk input. Kod berikut menjadikan CIA #1 port A sebagai output dan CIA #1 port B sebagai input:

LDA #$FF
STA DDRA1 ; $DC00 diarahkan oleh $DC02
LDA #$00
STA DDRB1 ; $DC01 diarahkan oleh $DC03

DDRA1 ialah label (nama pembolehubah) untuk lokasi bait memori $DC02, dan DDRB1 ialah label (nama pembolehubah) untuk lokasi bait memori $DC03. Arahan pertama memuatkan 11111111 kepada penumpuk µP. Arahan kedua menyalin ini ke daftar arah data port A CIA no. 1. Arahan ketiga memuatkan 00000000 kepada penumpuk µP. Arahan keempat menyalin ini ke daftar arah data port B CIA no. 1. Kod ini terdapat dalam salah satu subrutin dalam sistem pengendalian yang melakukan permulaan ini semasa komputer dihidupkan.

Setiap CIA mempunyai talian permintaan perkhidmatan gangguan kepada mikropemproses. Yang dari CIA #1 pergi ke IRQ pin µP. Yang dari CIA #2 pergi ke NMI pin µP. Ingat itu NMI adalah keutamaan yang lebih tinggi daripada IRQ .

5.3 Pengaturcaraan Bahasa Himpunan Papan Kekunci

Terdapat hanya tiga gangguan yang mungkin untuk Commodore-64: IRQ , BRK dan NMI . Penunjuk meja lompat untuk IRQ berada di alamat $FFFE dan $FFFF dalam ROM (sistem pengendalian) yang sepadan dengan subrutin yang masih dalam OS (ROM). Penunjuk jadual lompat untuk BRK adalah pada alamat $FFFC dan $FFFD dalam OS yang sepadan dengan subrutin yang masih dalam OS (ROM). Penunjuk meja lompat untuk NMI berada di alamat $FFFA dan $FFB dalam OS yang sepadan dengan subrutin yang masih dalam OS (ROM). Untuk IRQ , sebenarnya terdapat dua subrutin. Jadi, gangguan perisian BRK (arahan) mempunyai penunjuk jadual lompat sendiri. Penunjuk meja lompat untuk IRQ membawa kepada kod yang menentukan sama ada gangguan perkakasan atau gangguan perisian yang digunakan. Jika ia adalah gangguan perkakasan, rutin untuk IRQ dipanggil. Jika ia adalah gangguan perisian (BRK), rutin untuk BRK dipanggil. Dalam salah satu versi OS, subrutin untuk IRQ adalah pada $EA31 dan subrutin untuk BRK ialah pada $FE66. Alamat ini berada di bawah $FF81, jadi ia bukan entri jadual lompat dan ia boleh berubah dengan versi OS. Terdapat tiga rutin minat dalam topik ini: yang menyemak sama ada kekunci yang ditekan atau BRK, yang berada pada $FE43 dan yang mungkin juga berubah dengan versi OS.

Komputer Commodore-64 adalah seperti penulis taip yang besar (ke atas) dalam penampilan tanpa bahagian percetakan (kepala dan kertas). Papan kekunci disambungkan ke CIA #1. CIA #1 mengimbas papan kekunci setiap 1/60 saat dengan sendiri tanpa sebarang gangguan pengaturcaraan, secara lalai. Jadi, setiap 1/60 saat, CIA #1 menghantar IRQ kepada µP. Hanya ada satu IRQ pin pada µP yang hanya datang dari CIA #1. Satu pin input daripada NMI daripada µP, yang berbeza daripada IRQ , hanya datang dari CIA #2 (rujuk ilustrasi berikut). BRK sebenarnya adalah arahan bahasa himpunan yang dikodkan dalam program pengguna.

Jadi, setiap 1/60 saat, IRQ rutin yang ditunjuk oleh $FFFE dan $FFFF dipanggil. Rutin menyemak sama ada kekunci ditekan atau arahan BRK ditemui. Jika kekunci ditekan, rutin untuk mengendalikan penekan kekunci dipanggil. Jika ia adalah arahan BRK, rutin untuk mengendalikan BRK dipanggil. Jika tidak, tiada apa yang berlaku. Tidak mungkin berlaku, tetapi CIA #1 menghantar IRQ kepada µP setiap 1/60 saat.

Barisan papan kekunci, juga dikenali sebagai penimbal papan kekunci, ialah julat lokasi bait RAM daripada $0277 hingga $0280, termasuk; 1010 bait kesemuanya. Ini ialah penimbal First-In-First-Out. Ini bermakna watak pertama yang datang adalah yang pertama pergi. Watak Eropah Barat mengambil satu bait.

Jadi, semasa program tidak menggunakan sebarang aksara apabila kekunci ditekan, kod kekunci masuk ke penimbal (baris gilir) ini. Penampan terus diisi sehingga terdapat sepuluh aksara. Sebarang aksara yang ditekan selepas aksara kesepuluh tidak direkodkan. Ia diabaikan sehingga sekurang-kurangnya satu aksara diperolehi (dimakan) daripada baris gilir. Jadual lompat mempunyai entri untuk subrutin yang mendapat aksara pertama daripada baris gilir ke mikropemproses. Ini bermakna ia mengambil aksara pertama yang masuk ke dalam baris gilir dan memasukkannya ke dalam penumpuk µP. Subrutin jadual lompat untuk melakukan ini dipanggil GETIN (untuk Masuk). Bait pertama untuk entri tiga bait dalam jadual lompat dilabelkan sebagai GETIN (alamat $FFE4). Dua bait seterusnya ialah penunjuk (alamat) yang menunjuk kepada rutin sebenar dalam ROM (OS). Ia adalah tanggungjawab pengaturcara untuk memanggil rutin ini. Jika tidak, penimbal papan kekunci akan kekal penuh dan semua kekunci yang ditekan baru-baru ini akan diabaikan. Nilai yang masuk ke dalam penumpuk ialah nilai ASCII kunci yang sepadan.

Bagaimanakah kod kunci masuk ke dalam baris gilir pada mulanya? Terdapat rutin jadual lompat yang dipanggil SCNKEY (untuk kunci imbasan). Rutin ini boleh dipanggil oleh kedua-dua perisian dan perkakasan. Dalam kes ini, ia dipanggil oleh litar elektronik (fizik) dalam mikropemproses apabila isyarat elektrik IRQ adalah rendah. Bagaimana ia dilakukan dengan tepat tidak ditangani dalam kursus kerjaya dalam talian ini.

Kod untuk mendapatkan kod kunci pertama daripada penimbal papan kekunci ke dalam penumpuk A hanyalah satu baris:

MASUK

Jika penimbal papan kekunci kosong, $00 diletakkan dalam penumpuk. Ingat bahawa kod ASCII untuk sifar bukanlah $00; ia ialah $30. $00 bermakna Batal. Dalam program, mungkin terdapat satu titik di mana program perlu menunggu untuk menekan kekunci. Kod untuk ini ialah:

TUNGGU JSR DAPATKAN
CMP #$00
KATAK TUNGGU

Dalam baris pertama, 'TUNGGU' ialah label yang mengenal pasti alamat RAM tempat arahan JSR diletakkan (ditaip). GETIN juga merupakan alamat. Ia ialah alamat yang pertama daripada tiga bait yang sepadan dalam jadual lompat. Entri GETIN, serta semua entri dalam jadual lompat (kecuali tiga yang terakhir), terdiri daripada tiga bait. Bait pertama entri ialah arahan JSR. Dua bait seterusnya ialah alamat badan subrutin GETIN sebenar yang masih dalam ROM (OS) tetapi di bawah jadual lompat. Jadi, entri mengatakan untuk melompat ke subrutin GETIN. Jika baris gilir papan kekunci tidak kosong, GETIN meletakkan kod kunci ASCII baris gilir Pertama-Masuk-Dulu-Keluar ke dalam penumpuk. Jika baris gilir kosong, Null ($00) dimasukkan ke dalam penumpuk.

Arahan kedua membandingkan nilai penumpuk dengan $00. Jika $00, ini bermakna baris gilir papan kekunci kosong dan arahan CMP menghantar 1 ke bendera Z daftar status pemproses (hanya dipanggil daftar status). Jika nilai dalam A bukan $00, arahan CMP menghantar 0 ke bendera Z daftar status.

Arahan ketiga iaitu 'BEQ WAIT' menghantar program kembali ke arahan pertama jika tanda Z pada daftar status ialah 1. Arahan pertama, kedua dan ketiga dilaksanakan berulang kali mengikut urutan sehingga kekunci pada papan kekunci ditekan. . Jika kekunci tidak pernah ditekan, kitaran akan berulang selama-lamanya. Segmen kod seperti ini biasanya ditulis dengan segmen kod pemasaan yang keluar dari gelung selepas beberapa ketika jika kekunci tidak pernah ditekan (rujuk perbincangan berikut).

Catatan : Papan kekunci ialah peranti input lalai dan skrin ialah peranti output lalai.

5.4 Saluran, Nombor Peranti dan Nombor Fail Logik

Peranti yang bab ini gunakan untuk menerangkan sistem pengendalian Commodore-64 ialah papan kekunci, skrin (monitor), pemacu cakera dengan disket, pencetak dan modem yang bersambung melalui antara muka RS-232C. Untuk komunikasi berlaku antara peranti ini dan unit sistem (mikropemproses dan memori), saluran perlu diwujudkan.

Saluran terdiri daripada penimbal, nombor peranti, nombor fail logik, dan secara pilihan alamat kedua. Penjelasan istilah tersebut adalah seperti berikut:

Penampan
Perhatikan daripada bahagian sebelumnya bahawa apabila kekunci ditekan, kodnya mesti pergi ke lokasi bait dalam RAM bagi siri sepuluh lokasi berturut-turut. Siri sepuluh lokasi ini ialah penimbal papan kekunci. Setiap peranti input atau output (periferal) mempunyai satu siri lokasi berturut-turut dalam RAM yang dipanggil buffer.

Nombor Peranti
Dengan Commodore-64, sebarang persisian diberikan dengan nombor peranti. Jadual berikut menunjukkan peranti yang berbeza dan nombornya:

Jadual 5.41
Nombor Peranti Commodore 64 dan Perantinya
Nombor Peranti
0 papan kekunci
1 Pemacu Pita
2 Antara muka RS 232C ke cth. sebuah modem
3 Skrin
4 Pencetak #1
5 Pencetak #2
6 Pelopor #1
7 Pelopor #2
8 Pemacu cakera
9
¦
¦
¦
30
Daripada 8 (termasuk) sehingga 22 lagi peranti storan

Terdapat dua jenis port untuk komputer. Satu jenis adalah luaran, pada permukaan menegak unit sistem. Jenis lain adalah dalaman. Port dalaman ini adalah daftar. Commodore-64 mempunyai empat port dalaman: port A dan port B untuk CIA 1 dan port A dan Port B untuk CIA 2. Terdapat satu port luaran untuk Commodore-64 yang dipanggil Serial Port. Peranti dengan nombor 3 ke atas disambungkan ke port bersiri. Ia disambungkan dalam fesyen rantai daisy (satu yang disambungkan di belakang yang lain), setiap satunya boleh dikenal pasti melalui nombor perantinya. Peranti dengan nombor 8 ke atas biasanya peranti storan.

Catatan : Peranti input lalai ialah papan kekunci dengan nombor peranti 0. Peranti output lalai ialah skrin dengan nombor peranti 3.

Nombor Fail Logik
Nombor fail logik ialah nombor yang diberikan untuk peranti (periferal) mengikut susunan ia dibuka untuk diakses. Mereka berkisar antara 010 hingga 255 10 .

Alamat Menengah
Bayangkan dua fail (atau lebih daripada satu fail) dibuka dalam cakera. Untuk membezakan antara kedua-dua fail ini, alamat kedua digunakan. Alamat sekunder ialah nombor yang berbeza dari peranti ke peranti. Maksud 3 sebagai alamat sekunder untuk pencetak adalah berbeza daripada maksud 3 sebagai alamat sekunder untuk pemacu cakera. Maknanya bergantung pada ciri seperti apabila fail dibuka untuk dibaca atau apabila fail dibuka untuk menulis. Nombor sekunder yang mungkin adalah dari 0 10 ke 15 10 untuk setiap peranti. Untuk kebanyakan peranti, nombor 15 digunakan untuk menghantar arahan.

Catatan : Nombor peranti juga dikenali sebagai alamat peranti dan nombor kedua juga dikenali sebagai alamat kedua.

Mengenal pasti Sasaran Periferi
Untuk peta memori Commodore lalai, alamat memori dari $0200 hingga $02FF (halaman 2) digunakan semata-mata oleh sistem pengendalian dalam ROM (Kernal) dan bukan oleh sistem pengendalian serta bahasa BASIC. Walaupun BASIC masih boleh menggunakan lokasi melalui OS ROM.

Modem dan pencetak adalah dua sasaran persisian yang berbeza. Jika dua fail dibuka dari cakera, itu adalah dua sasaran yang berbeza. Dengan peta memori lalai, terdapat tiga jadual berturut-turut (senarai) yang boleh dilihat sebagai satu jadual besar. Tiga jadual ini memegang hubungan antara Nombor Fail Logik, Nombor Peranti dan Alamat Sekunder. Dengan itu, saluran tertentu atau sasaran input/output dapat dikenal pasti. Tiga jadual itu dipanggil Jadual Fail. Alamat RAM dan apa yang mereka ada ialah:

$0259 — $0262: Jadual dengan label, LAT, sehingga sepuluh nombor fail logik aktif.
$0263 — $026C: Jadual dengan Label, FAT, sehingga sepuluh nombor peranti yang sepadan.
$026D — $0276: Jadual dengan Label, SAT, daripada sepuluh alamat sekunder yang sepadan.

Di sini, “—“ bermaksud “kepada”, dan nombor mengambil satu bait.

Pembaca mungkin bertanya, 'Mengapa penampan untuk setiap peranti tidak disertakan dalam mengenal pasti saluran?' Nah, jawapannya ialah dengan commodore-64, setiap peranti luaran (periferal) mempunyai siri tetap bait dalam RAM (peta memori). Tanpa sebarang saluran yang dibuka, kedudukan mereka masih ada dalam ingatan. Penampan untuk papan kekunci, sebagai contoh, ditetapkan daripada $0277 hingga $0280 (termasuk) untuk peta memori lalai.

SETLFS Kernal dan Subrutin SETNAM
SETLFS dan SETNAM ialah rutin Kernal. Saluran boleh dilihat sebagai fail logik. Untuk saluran dibuka, nombor fail logik, nombor peranti dan alamat sekunder pilihan perlu dihasilkan. Nama fail pilihan (teks) juga mungkin diperlukan. Rutin SETLFS menyediakan nombor fail logik, nombor peranti dan alamat sekunder pilihan. Nombor ini diletakkan dalam jadual masing-masing. Rutin SETNAM menyediakan nama rentetan untuk fail yang mungkin wajib untuk satu saluran dan pilihan untuk saluran lain. Ini terdiri daripada penunjuk (alamat dua bait) dalam ingatan. Penunjuk menunjuk ke permulaan rentetan (nama) yang mungkin berada di tempat lain dalam ingatan. Nama rentetan bermula dengan bait yang mempunyai panjang rentetan, diikuti dengan teks (nama). Nama adalah maksimum enam belas bait (panjang).

Untuk memanggil rutin SETLFS, program pengguna perlu melompat (JSR) ke alamat $FFBA jadual lompat OS dalam ROM untuk peta memori lalai. Ingat bahawa dengan pengecualian enam bait terakhir jadual lompat, setiap entri terdiri daripada tiga bait. Bait pertama ialah arahan JSR, yang kemudiannya melompat ke subrutin, bermula pada alamat dalam dua bait seterusnya. Untuk memanggil rutin SETNAM, program pengguna perlu melompat (JSR) ke alamat $FFBD bagi jadual lompat OS dalam ROM. Penggunaan kedua-dua rutin ini ditunjukkan dalam perbincangan berikut.

5.5 Membuka Saluran, Membuka Fail Logik, Menutup Fail Logik dan Menutup Semua Saluran I/O

Saluran terdiri daripada penimbal memori, nombor fail logik, nombor peranti (alamat peranti) dan alamat sekunder pilihan (nombor). Fail logik (abstraksi) yang dikenal pasti melalui nombor fail logik boleh merujuk kepada persisian seperti pencetak, modem, pemacu cakera, dsb. Setiap peranti berbeza ini harus mempunyai nombor fail logik yang berbeza. Terdapat banyak fail dalam cakera. Fail logik juga boleh merujuk kepada fail tertentu dalam cakera. Fail tertentu itu juga mempunyai nombor fail logik yang berbeza daripada peranti persisian seperti pencetak atau modem. Nombor fail logik diberikan oleh pengaturcara. Ia boleh menjadi sebarang nombor dari 010 ($00) hingga 25510 ($FF).

Rutin OS SETLFS
Rutin OS SETLFS yang diakses dengan melompat (JSR) ke jadual lompat OS ROM di $FFBA menyediakan saluran. Ia perlu meletakkan nombor fail logik dalam jadual fail iaitu LAT ($0259 — $0262). Ia perlu meletakkan nombor peranti yang sepadan dalam jadual fail iaitu FAT ($0263 — $026C). Jika akses fail (peranti) memerlukan nombor kedua, ia perlu meletakkan alamat kedua (nombor) yang sepadan dalam jadual fail iaitu SAT ($026D — $0276).

Untuk beroperasi, subrutin SETLFS perlu mendapatkan nombor fail logik daripada penumpuk µP; ia perlu mendapatkan nombor peranti daripada daftar µP X. Jika diperlukan oleh saluran, ia perlu mendapatkan alamat kedua daripada daftar µP Y.

Nombor fail logik ditentukan oleh pengaturcara. Nombor fail logik yang merujuk kepada peranti berbeza adalah berbeza. Sekarang, sebelum memanggil rutin SETLFS, pengaturcara harus meletakkan nombor untuk fail logik ke dalam penumpuk µP. Nombor peranti dibaca daripada jadual (dokumen) seperti dalam Jadual 5.41. Pengaturcara juga perlu memasukkan nombor peranti ke dalam daftar µP X. Pembekal untuk peranti seperti pencetak, pemacu cakera, dsb. menyediakan kemungkinan alamat kedua dan maknanya untuk peranti tersebut. Jika saluran memerlukan alamat sekunder, pengaturcara perlu mendapatkannya daripada dokumen yang dibekalkan dengan peranti (periferal). Jika alamat sekunder (nombor) diperlukan, pengaturcara perlu memasukkannya ke dalam daftar µP Y sebelum memanggil subrutin SETLFS. Jika tidak ada keperluan untuk alamat sekunder, pengaturcara perlu memasukkan nombor $FF ke dalam daftar µP Y sebelum memanggil subrutin SETLFS.

Subrutin SETLFS dipanggil tanpa sebarang hujah. Hujahnya sudah ada dalam tiga daftar 6502 µP. Selepas meletakkan nombor yang sesuai ke dalam daftar, rutin dipanggil dalam program hanya dengan yang berikut dalam baris berasingan:

JSR SETLFS

Rutin meletakkan nombor yang berbeza dengan sewajarnya ke dalam jadual fail mereka.

Rutin OS SETNAM
Rutin OS SETNAM diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFBD. Tidak semua destinasi mempunyai nama fail. Bagi mereka yang mempunyai destinasi (seperti fail dalam cakera), nama fail harus disediakan. Anggapkan bahawa nama fail ialah 'mydocum' yang terdiri daripada 7 bait tanpa petikan. Andaikan nama ini berada di lokasi $C101 hingga $C107 (termasuk) dan panjang $07 adalah di lokasi $C100. Alamat permulaan aksara rentetan ialah $C101. Bait bawah alamat mula ialah $01 dan bait yang lebih tinggi ialah $C1.

Sebelum memanggil rutin SETNAM, pengaturcara perlu meletakkan nombor $07 (panjang rentetan) ke dalam penumpuk µP. Bait bawah bagi alamat permulaan rentetan $01 dimasukkan ke dalam daftar µP X. Bait yang lebih tinggi bagi alamat permulaan rentetan $C1 dimasukkan ke dalam daftar µP Y. Subrutin dipanggil hanya dengan yang berikut:

JSR SETNAM

Rutin SETNAM mengaitkan nilai daripada tiga daftar dengan saluran. Nilai tidak perlu kekal dalam daftar selepas itu. Jika saluran tidak memerlukan nama fail, pengaturcara perlu meletakkan $00 dalam penumpuk µP. Dalam kes ini, nilai yang ada dalam daftar X dan Y diabaikan.

Rutin OS OPEN
Rutin OS OPEN diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFC0. Rutin ini menggunakan nombor fail logik, nombor peranti (dan penimbal), alamat sekunder yang mungkin, dan nama fail yang mungkin, untuk menyediakan sambungan antara komputer komodor dan fail dalam peranti luaran atau peranti luaran itu sendiri.

Rutin ini, seperti semua rutin ROM OS Commodore yang lain, tidak mengambil sebarang hujah. Walaupun ia menggunakan daftar µP, tiada satu pun daripada daftar yang perlu dimuatkan dengan argumen (nilai) untuknya. Untuk mengekodnya, hanya taip yang berikut selepas SETLFS dan SETNAM dipanggil:

JSR DIBUKA

Ralat mungkin berlaku dengan rutin OPEN. Sebagai contoh, fail mungkin tidak ditemui untuk dibaca. Apabila ralat berlaku, rutin gagal dan meletakkan nombor ralat yang sepadan ke dalam penumpuk µP, dan menetapkan bendera bawa (ke 1) daftar status µP. Jadual berikut menyediakan nombor ralat dan maknanya:

Jadual 5.51
Nombor Ralat Kernal dan Maksudnya untuk Rutin OS ROM OPEN
Nombor Ralat Penerangan Contoh
1 TERLALU BANYAK FAIL BUKA apabila sepuluh fail sudah dibuka
2 FAIL DIBUKA BUKA 1,3: BUKA 1,4
3 FAIL TIDAK DIBUKA CETAK#5 tanpa BUKA
4 FAIL TIDAK DIJUMPAI MUAT “TIADA”,8
5 PERANTI TIDAK HADIR BUKA 11,11: CETAKAN#11
6 BUKAN INPUT FAIL BUKA “SEQ,S,W”: DAPATKAN#8,X$
7 BUKAN OUTPUT FAIL BUKA 1,0: CETAKAN#1
8 NAMA FAIL HILANG MUAT “”,8
9 PERANTI HARAM NO. MUAT “PROGRAM”,3

Jadual ini dibentangkan dengan cara yang mungkin dilihat oleh pembaca di banyak tempat lain.

Rutin OS CHKIN
Rutin OS CHKIN diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFC6. Selepas membuka fail (fail logik), ia perlu diputuskan sama ada pembukaan adalah untuk input atau output. Rutin CHKIN menjadikan pembukaan saluran input. Rutin ini perlu membaca nombor fail logik daripada daftar µP X. Jadi, pengaturcara perlu meletakkan nombor fail logik ke dalam daftar X sebelum memanggil rutin ini. Ia dipanggil secara ringkas sebagai:

JSR CHKIN

Rutin OS CHKOUT
Rutin OS CHKOUT diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFC9. Selepas membuka fail (fail logik), ia perlu diputuskan sama ada pembukaan adalah untuk input atau output. Rutin CHKOUT menjadikan pembukaan saluran keluaran. Rutin ini perlu membaca nombor fail logik daripada daftar µP X. Jadi, pengaturcara perlu meletakkan nombor fail logik ke dalam daftar X sebelum memanggil rutin ini. Ia dipanggil secara ringkas sebagai:

JSR CHKOUT

Rutin TUTUP OS
Rutin OS CLOSE diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFC3. Selepas fail logik dibuka dan bait dihantar, fail logik perlu ditutup. Menutup fail logik membebaskan penimbal dalam unit sistem untuk digunakan oleh beberapa fail logik lain yang masih perlu dibuka. Parameter yang sepadan dalam tiga jadual fail juga dipadamkan. Lokasi RAM untuk bilangan fail-terbuka dikurangkan sebanyak 1.

Apabila kuasa dihidupkan untuk komputer, terdapat tetapan semula perkakasan untuk mikropemproses dan cip utama lain (litar bersepadu) pada papan ibu. Ini diikuti dengan permulaan beberapa lokasi memori RAM dan beberapa daftar dalam beberapa cip pada papan induk. Dalam proses permulaan, lokasi memori bait alamat $0098 dalam halaman sifar diberikan dengan label NFILES atau LDTND, bergantung pada versi sistem pengendalian. Semasa komputer beroperasi, lokasi satu bait 8 bit ini memegang bilangan fail logik yang dibuka, dan indeks alamat mula bagi tiga jadual fail berturut-turut. Dalam erti kata lain, bait ini mempunyai bilangan fail-terbuka yang dikurangkan sebanyak 1 apabila fail logik ditutup. Apabila fail logik ditutup, akses kepada peranti terminal (destinasi) atau fail sebenar dalam cakera tidak lagi boleh dilakukan.

Untuk menutup fail logik, pengaturcara perlu meletakkan nombor fail logik ke dalam penumpuk µP. Ini adalah nombor fail logik yang sama yang digunakan dalam membuka fail. Rutin CLOSE memerlukannya untuk menutup fail tertentu itu. Seperti rutin OS ROM yang lain, rutin CLOSE tidak mengambil hujah, walaupun nilai yang digunakan daripada penumpuk adalah agak hujah. Barisan arahan bahasa himpunan hanyalah:

JSR TUTUP

Subrutin bahasa himpunan tersuai atau dipratentukan 6502 (rutin) tidak mengambil hujah. Walau bagaimanapun, hujah itu datang secara tidak rasmi dengan meletakkan nilai yang akan digunakan oleh subrutin dalam daftar mikropemproses.

Rutin CLRCHN
Rutin OS CLRCHN diakses dengan melompat (JSR) ke jadual lompat OS ROM di $FFCC. CLRCHN bermaksud CLeaR CHanneL. Apabila fail logik ditutup, parameter nombor fail logik, nombor peranti dan kemungkinan alamat kedua akan dipadamkan. Jadi, saluran untuk fail logik dikosongkan.

Manual mengatakan bahawa rutin OS CLRCHN mengosongkan semua saluran yang dibuka dan memulihkan nombor peranti lalai dan lalai lain. Adakah ini bermakna nombor peranti untuk peranti boleh ditukar? Nah, tidak cukup. Semasa pemulaan sistem pengendalian, lokasi bait alamat $0099 diberikan dengan label DFLTI untuk memegang nombor peranti input semasa semasa komputer beroperasi. Commodore-64 hanya boleh mengakses satu persisian pada satu masa. Semasa pemulaan sistem pengendalian, lokasi bait alamat $009A diberikan dengan label DFLTO untuk memegang nombor peranti output semasa semasa komputer beroperasi.

Apabila subrutin CLRCHN dipanggil, ia menetapkan pembolehubah DFLTI kepada 0 ($00) yang merupakan nombor peranti input lalai (papan kekunci). Ia menetapkan pembolehubah DFLTO kepada 3 ($03) yang merupakan nombor peranti output lalai (skrin). Pembolehubah nombor peranti lain ditetapkan semula sama. Itulah maksud menetapkan semula (atau memulihkan) peranti input/output kepada normal (nilai lalai).

Manual Commodore-64 mengatakan bahawa selepas rutin CLRCHN dipanggil, fail logik yang dibuka kekal terbuka dan masih boleh menghantar bait (data). Ini bermakna bahawa rutin CLRCHN tidak memadamkan entri yang sepadan dalam jadual fail. Nama CLRCHN agak samar-samar untuk maksudnya.

5.6 Menghantar Watak ke Skrin

Litar bersepadu (IC) utama untuk mengendalikan paparan aksara dan grafik ke skrin dipanggil Pengawal Antara Muka Video (cip) yang disingkatkan sebagai VIC dalam Commodore-64 (sebenarnya VIC II untuk VIC versi 2). Untuk maklumat (nilai) pergi ke skrin, ia perlu melalui VIC II sebelum mencapai skrin.

Skrin terdiri daripada 25 baris dan 40 lajur sel aksara. Ini menjadikan 40 x 25 = 1000 aksara yang boleh dipaparkan pada skrin. VIC II membaca 1000 RAM memori lokasi bait berturut-turut untuk aksara. 1000 lokasi ini bersama-sama dikenali sebagai memori skrin. Apa yang masuk ke dalam 1000 lokasi ini ialah kod aksara. Untuk Commodore-64, kod aksara adalah berbeza daripada kod ASCII.

Kod aksara bukan corak aksara. Terdapat juga yang dikenali sebagai ROM watak. ROM watak terdiri daripada semua jenis corak aksara, beberapa daripadanya sepadan dengan corak aksara pada papan kekunci. ROM watak berbeza daripada memori skrin. Apabila aksara hendak dipaparkan pada skrin, kod aksara dihantar ke kedudukan antara 1000 kedudukan memori skrin. Dari sana, corak yang sepadan dipilih daripada ROM aksara yang akan dipaparkan pada skrin. Memilih corak yang betul dalam ROM aksara daripada kod aksara dilakukan oleh VIC II (perkakasan).

Banyak lokasi memori antara $D000 dan $DFFF mempunyai dua tujuan: ia digunakan untuk mengendalikan operasi input/output selain daripada skrin atau digunakan sebagai ROM aksara untuk skrin. Dua blok ingatan bimbang. Satu ialah RAM dan satu lagi ialah ROM untuk ROM aksara. Pertukaran bank untuk mengendalikan sama ada input/output atau corak aksara (ROM aksara) dilakukan oleh perisian (rutin OS dalam ROM daripada $F000 hingga $FFFF).

Catatan : VIC mempunyai daftar yang dialamatkan dengan alamat ruang memori dari dalam julat $D000 dan $DFFF.

Rutin CHROUT
Rutin OS CHROUT diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFD2. Rutin ini, apabila dipanggil, mengambil bait yang telah dimasukkan oleh pengaturcara ke dalam penumpuk µP dan mencetak pada skrin di mana kursor berada. Segmen kod untuk mencetak aksara 'E', sebagai contoh, ialah:

LDA #$05
CHOUT

0516 bukan kod ASCII untuk “E” . Commodore-64 mempunyai kod aksara sendiri untuk skrin di mana $05 bermaksud 'E'. Nombor #$05 diletakkan dalam memori skrin sebelum VIC menghantarnya ke skrin. Kedua-dua baris pengekodan ini sepatutnya datang selepas saluran disediakan, fail logik dibuka dan rutin CHKOUT dipanggil untuk output. Kod lengkap ialah:

; Sediakan saluran
LDA #$40 ; nombor fail logik
LDX #$03 ; nombor peranti untuk skrin ialah $03
LDY #$FF ; tiada alamat sekunder
JSR SETLFS ; persediaan saluran dengan betul
; tiada SETNAM kerana skrin tidak memerlukan nama
;
; Buka fail logik
JSR DIBUKA
; Tetapkan saluran untuk output
LDX #$40 ; nombor fail logik
JSR CHKOUT
;
; Output char ke skrin
LDA #$05
JSR CHROUT
; Tutup fail logik
LDA #$40
JSR TUTUP

Pembukaan hendaklah ditutup sebelum program lain dijalankan. Andaikan bahawa pengguna komputer menaip aksara pada papan kekunci apabila dijangka. Program berikut mencetak aksara dari papan kekunci ke skrin:

; Sediakan saluran
LDA #$40 ; nombor fail logik
LDX #$03 ; nombor peranti untuk skrin ialah $03
LDY #$FF ; tiada alamat sekunder
JSR SETLFS ; persediaan saluran dengan betul
; tiada SETNAM kerana skrin tidak memerlukan nama
;
; Buka fail logik
JSR DIBUKA
; Tetapkan saluran untuk output
LDX #$40 ; nombor fail logik
JSR CHKOUT
;
; Masukkan aksara daripada papan kekunci
TUNGGU JSR GETIN ; meletakkan $00 dalam A jika baris gilir papan kekunci kosong
CMP #$00 ; Jika $00 pergi ke A, maka Z ialah 1 dengan perbandingan
BEQ TUNGGU ; GETIN dari baris gilir sekali lagi jika 0 pergi ke penumpuk
BNE PRNSCRN ; pergi ke PRNSCRN jika Z ialah 0, kerana A tidak lagi mempunyai $00
; Output char ke skrin
PRNSCRN JSR CHROUT ; hantar aksara dalam A ke skrin
; Tutup fail logik
LDA #$40
JSR TUTUP

Catatan : WAIT dan PRNSCRN ialah label yang mengenal pasti alamat. Bait daripada papan kekunci yang tiba dalam penumpuk µP ialah kod ASCII. Kod yang sepadan untuk dihantar ke skrin oleh Commodore-64 mestilah berbeza. Itu tidak diambil kira dalam program sebelum ini demi kesederhanaan.

5.7 Menghantar dan Menerima Bait untuk Pemacu Cakera

Terdapat dua Penyesuai Antara Muka Kompleks dalam unit sistem (papan induk) Commodore-64 yang dipanggil VIA #1 dan CIA #2. Setiap CIA mempunyai dua port selari yang dipanggil sebagai Port A dan Port B. Terdapat port luaran pada permukaan menegak di bahagian belakang unit sistem Commodre-64 yang dipanggil sebagai port bersiri. Port ini mempunyai 6 pin, salah satunya adalah untuk data. Data memasuki atau meninggalkan unit sistem secara bersiri, satu bit pada satu masa.

Lapan bit selari dari Port A dalaman CIA #2, sebagai contoh, boleh keluar dari unit sistem melalui port bersiri luaran selepas ditukar kepada data bersiri oleh daftar anjakan dalam CIA. Data bersiri lapan bit daripada port bersiri luaran boleh masuk ke Port A dalaman CIA #2 selepas ditukar kepada data selari oleh daftar anjakan dalam CIA.

Unit sistem Commodore-64 (unit asas) menggunakan pemacu cakera luaran dengan disket. Pencetak boleh disambungkan ke pemacu cakera ini dalam fesyen rantai daisy (menyambungkan peranti secara bersiri sebagai rentetan). Kabel data untuk pemacu cakera disambungkan ke port bersiri luaran unit sistem Commodore-64. Ini bermakna pencetak rantai daisy juga disambungkan ke port bersiri yang sama. Kedua-dua rekaan ini dikenal pasti oleh dua nombor peranti yang berbeza (biasanya 8 dan 4, masing-masing).

Menghantar atau menerima data untuk pemacu cakera mengikut prosedur yang sama seperti yang diterangkan sebelum ini. Itu dia:

  • Menetapkan nama fail logik (nombor) yang sama dengan fail cakera sebenar menggunakan rutin SETNAM.
  • Membuka fail logik menggunakan rutin OPEN.
  • Memutuskan sama ada ia adalah input atau output menggunakan rutin CHKOUT atau CHKIN.
  • Menghantar atau menerima data menggunakan arahan STA dan/atau LDA.
  • Menutup fail logik menggunakan rutin CLOSE.

Fail logik mesti ditutup. Menutup fail logik dengan berkesan menutup saluran tertentu itu. Apabila menyediakan saluran untuk pemacu cakera, nombor fail logik ditentukan oleh pengaturcara. Ia adalah nombor antara $00 dan $FF (termasuk). Ia tidak sepatutnya menjadi nombor yang telah dipilih untuk mana-mana peranti lain (atau fail sebenar). Nombor peranti ialah 8 jika hanya terdapat satu pemacu cakera. Alamat kedua (nombor) diperoleh daripada manual pemacu cakera. Program berikut menggunakan 2. Atur cara menulis huruf 'E' (ASCII) pada fail dalam cakera yang dipanggil 'mydoc.doc'. Nama ini diandaikan bermula pada alamat memori $C101. Jadi, bait bawah $01 perlu berada dalam daftar X dan bait tinggi $C1 perlu berada dalam daftar Y sebelum rutin SETNAM dipanggil. Daftar A juga harus mempunyai nombor $09 sebelum rutin SETNAM dipanggil.

; Sediakan saluran
LDA #$40 ; nombor fail logik
LDX #$08 ; nombor peranti untuk pemacu cakera pertama
LDY #$02 ; alamat sekunder
JSR SETLFS ; persediaan saluran dengan betul
;
; Fail dalam pemacu cakera memerlukan nama (sudah dalam ingatan)
LDA #$09
LDX #$01
LDY#$C1
JSR SETNAM
; Buka fail logik
JSR DIBUKA
; Tetapkan saluran untuk output
LDX #$40 ; nombor fail logik
JSR CHKOUT ;untuk menulis
;
; Output char ke cakera
LDA #$45
JSR CHROUT
; Tutup fail logik
LDA #$40
JSR TUTUP

Untuk membaca bait daripada cakera ke dalam daftar µP Y, ulangi atur cara sebelumnya dengan perubahan berikut: Daripada “JSR CHKOUT ; untuk menulis”, gunakan “JSR CHKIN ; untuk bacaan”. Gantikan segmen kod untuk “; Output char to disk' dengan yang berikut:

; Masukkan aksara daripada cakera
JSR CHRIS

Rutin OS CHRIN diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFCF. Rutin ini, apabila dipanggil, mendapat bait daripada saluran yang telah disediakan sebagai saluran input dan meletakkannya ke dalam daftar µP A. Rutin OS ROM GETIN juga boleh digunakan sebagai ganti CHRIN.

Menghantar Byte ke Pencetak
Menghantar bait ke pencetak dilakukan dengan cara yang sama seperti menghantar bait ke fail dalam cakera.

5.8 Rutin OS SAVE

Rutin JIMAT OS diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFD8. Rutin OS SAVE dalam ROM menyimpan (membuang) bahagian memori ke cakera sebagai fail (dengan nama). Alamat permulaan bahagian dalam ingatan perlu diketahui. Alamat akhir bahagian juga perlu diketahui. Bait bawah alamat mula diletakkan dalam sifar halaman dalam RAM pada alamat $002B. Bait yang lebih tinggi bagi alamat mula diletakkan di lokasi memori bait seterusnya di alamat $002C. Dalam halaman sifar, label TXTTAB merujuk kepada dua alamat ini, walaupun TXTTAB sebenarnya bermaksud alamat $002B. Bait bawah alamat akhir diletakkan dalam daftar µP X. Bait yang lebih tinggi bagi alamat akhir ditambah 1 diletakkan dalam daftar µP Y. Daftar µP A mengambil nilai $2B untuk TXTTAB ($002B). Dengan itu, rutin SAVE boleh dipanggil dengan perkara berikut:

JSR JIMAT

Bahagian memori yang akan disimpan boleh menjadi program bahasa himpunan atau dokumen. Contoh dokumen boleh berupa surat atau esei. Untuk menggunakan rutin simpan, prosedur berikut harus diikuti:

  • Sediakan saluran menggunakan rutin SETLFS.
  • Tetapkan nama fail logik (nombor) yang sama dengan fail cakera sebenar menggunakan rutin SETNAM.
  • Buka fail logik menggunakan rutin OPEN.
  • Jadikan ia fail untuk output menggunakan CHKOUT.
  • Kod untuk menyimpan fail pergi ke sini yang berakhir dengan 'JSR SAVE'.
  • Tutup fail logik menggunakan rutin CLOSE.

Program berikut menyimpan fail yang bermula dari lokasi memori $C101 hingga $C200:

; Sediakan saluran
LDA #$40 ; nombor fail logik
LDX #$08 ; nombor peranti untuk pemacu cakera pertama
LDY #$02 ; alamat sekunder
JSR SETLFS ; persediaan saluran dengan betul
;
; Nama untuk fail dalam pemacu cakera (sudah dalam ingatan pada $C301)
LDA #$09 ; panjang nama fail
LDX #$01
LDY#$C3
JSR SETNAM
; Buka fail logik
JSR DIBUKA
; Tetapkan saluran untuk output
LDX #$40 ; nombor fail logik
JSR CHKOUT ; untuk menulis
;
; Output fail ke cakera
LDA #$01
STA $2B ; TXTTAB
LDA #$C1
STA $2C
LDX #$00
LDY #$C2
LDA #$2B
JSR JIMAT
; Tutup fail logik
LDA #$40
JSR TUTUP

Ambil perhatian bahawa ini ialah program yang menyimpan bahagian lain memori (bukan bahagian program) ke dalam cakera (disket untuk Commodore-64).

5.9 Rutin OS LOAD

Rutin OS LOAD diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFD5. Apabila bahagian (kawasan besar) memori disimpan ke cakera, ia disimpan dengan pengepala yang mempunyai alamat permulaan bahagian dalam ingatan. Subrutin OS LOAD memuatkan bait fail ke dalam memori. Dengan operasi LOAD ini, nilai penumpuk mestilah 010 ($00). Untuk operasi LOAD membaca alamat permulaan dalam pengepala fail dalam cakera dan meletakkan bait fail dalam RAM bermula dari alamat itu, alamat kedua untuk saluran mestilah 1 atau 2 (program berikut menggunakan 2). Rutin ini mengembalikan alamat ditambah 1 lokasi RAM tertinggi yang dimuatkan. Ini bermakna bahawa bait rendah alamat terakhir fail dalam RAM tambah 1 dimasukkan ke dalam daftar µP X, dan bait tinggi alamat terakhir fail dalam RAM tambah 1 dimasukkan ke dalam daftar µP Y.

Jika pemuatan tidak berjaya, daftar µP A menyimpan nombor ralat (mungkin 4, 5, 8 atau 9). Bendera C daftar status mikropemproses juga ditetapkan (dijadikan 1). Jika pemuatan berjaya, nilai terakhir daftar A tidak penting.

Kini, dalam bab sebelumnya kursus kerjaya dalam talian ini, arahan pertama program bahasa himpunan adalah di alamat dalam RAM di mana program itu bermula. Ia tidak semestinya begitu. Ini bermakna arahan pertama program tidak perlu berada di permulaan program dalam RAM. Arahan permulaan untuk program boleh berada di mana-mana sahaja dalam fail dalam RAM. Pengaturcara dinasihatkan untuk melabelkan bahawa memulakan arahan bahasa himpunan dengan MULA. Dengan itu, selepas program dimuatkan, ia dijalankan semula (dilaksanakan) dengan arahan bahasa pemasangan berikut:

JSR MULA

'JSR START' berada dalam program bahasa himpunan yang memuatkan program untuk dijalankan. Bahasa himpunan yang memuatkan fail bahasa himpunan lain dan menjalankan fail yang dimuatkan mempunyai prosedur kod berikut:

  • Tetapkan saluran menggunakan rutin SETLFS.
  • Tetapkan nama fail logik (nombor) yang sama dengan fail cakera sebenar menggunakan rutin SETNAM.
  • Buka fail logik menggunakan rutin OPEN.
  • Jadikan ia fail untuk input menggunakan CHKIN.
  • Kod untuk memuatkan fail pergi ke sini dan berakhir dengan 'JSR LOAD'.
  • Tutup fail logik menggunakan rutin CLOSE.

Program berikut memuatkan fail dari cakera dan menjalankannya:

; Sediakan saluran
LDA #$40 ; nombor fail logik
LDX #$08 ; nombor peranti untuk pemacu cakera pertama
LDY #$02 ; alamat sekunder
JSR SETLFS ; persediaan saluran dengan betul
;
; Nama untuk fail dalam pemacu cakera (sudah dalam ingatan pada $C301)
LDA #$09 ; panjang nama fail
LDX #$01
LDY#$C3
JSR SETNAM
; Buka fail logik
JSR DIBUKA
; Tetapkan saluran untuk input
LDX #$40 ; nombor fail logik
JSR CHKIN ; untuk bacaan
;
; Masukkan fail daripada cakera
LDA #$00
BEBAN JSR
; Tutup fail logik
LDA #$40
JSR TUTUP
; Mulakan program yang dimuatkan
JSR MULA

5.10 Modem dan Standard RS-232

Modem ialah peranti (periferal) yang menukarkan bit daripada komputer kepada isyarat audio elektrik yang sepadan untuk dihantar melalui talian telefon. Di hujung penerima, terdapat modem sebelum komputer penerima. Modem kedua ini menukar isyarat audio elektrik kepada bit untuk komputer penerima.

Modem perlu disambungkan ke komputer di port luaran (di permukaan menegak komputer). Standard RS-232 merujuk kepada jenis penyambung tertentu yang menyambungkan modem ke komputer (pada masa lalu). Dalam erti kata lain, banyak komputer pada masa lalu mempunyai port luaran yang merupakan penyambung RS-232 atau penyambung serasi RS-232.

Unit Sistem Commodore-64 (komputer) mempunyai port luaran di permukaan menegak belakangnya yang dipanggil port pengguna. Port pengguna ini serasi dengan RS-232. Peranti modem boleh disambungkan di sana. Commodore-64 berkomunikasi dengan modem melalui port pengguna ini. Sistem pengendalian ROM untuk Commodore-64 mempunyai subrutin untuk berkomunikasi dengan modem yang dipanggil rutin RS-232. Rutin ini mempunyai entri dalam jadual lompat.

Kadar baud
Bait lapan bit daripada komputer ditukarkan kepada satu siri lapan bit sebelum dihantar ke modem. Pembalikan dilakukan dari modem ke komputer. Kadar baud ialah bilangan bit yang dihantar sesaat, secara bersiri.

Bahagian Bawah Ingatan
Istilah 'Bawah Memori' tidak merujuk kepada lokasi bait memori alamat $0000. Ia merujuk kepada lokasi RAM terendah di mana pengguna boleh mula meletakkan data dan programnya. Secara lalai, ia ialah $0800. Ingat daripada perbincangan sebelum ini bahawa banyak lokasi antara $0800 dan $BFFF digunakan oleh bahasa komputer ASAS dan pengaturcaranya (pengguna). Hanya lokasi alamat $C000 hingga $CFFF yang tinggal untuk digunakan untuk program dan data bahasa himpunan; ini adalah 4Kbait daripada 64 Kbait memori.

Atas Memori
Pada masa itu, apabila pelanggan membeli komputer Commodore-64, ada yang tidak datang dengan semua lokasi memori. Komputer sedemikian mempunyai ROM dengan sistem pengendaliannya dari $E000 hingga $FFFF. Mereka mempunyai RAM dari $0000 hingga had, yang bukan $DFFF, bersebelahan dengan $E000. Had adalah di bawah $DFFF dan had itu dipanggil 'Memori Teratas'. Jadi, memori atas tidak merujuk kepada lokasi $FFFF.

Penampan Commodore-64 untuk Komunikasi RS-232
Menghantar Penampan
Penampan untuk penghantaran (output) RS-232 mengambil 256 bait dari bahagian atas memori ke bawah. Penunjuk untuk penimbal pemancar ini dilabelkan sebagai ROBUF. Penunjuk ini berada di halaman sifar dengan alamat $00F9 diikuti dengan $00FA. ROBUF sebenarnya mengenal pasti $00F9. Jadi, jika alamat untuk permulaan penimbal ialah $BE00, bait bawah $BE00, iaitu $00, berada di lokasi $00F9 dan bait yang lebih tinggi bagi $BE00, iaitu $BE, berada dalam $00FA lokasi.

Menerima Penampan
Penampan untuk menerima bait RS-232 (input) mengambil 256 bait dari bahagian bawah penimbal pemancar. Penunjuk untuk penimbal penerima ini dilabelkan sebagai RIBUF. Penunjuk ini berada dalam halaman sifar dengan alamat $00F7 diikuti dengan $00F8. RIBUF sebenarnya mengenal pasti $00F7. Jadi, jika alamat untuk permulaan penimbal ialah $BF00, bait bawah $BF00, iaitu $00, berada di lokasi $00F7 dan bait yang lebih tinggi bagi $BF00, iaitu $BF, berada dalam $00F8 lokasi. Jadi, 512 bait dari memori atas digunakan sebagai jumlah penampan RAM RS-232.

Saluran RS-232
Apabila modem disambungkan ke port pengguna (luaran), komunikasi ke modem hanyalah komunikasi RS-232. Prosedur untuk mempunyai saluran RS-232 yang lengkap adalah hampir sama seperti dalam perbincangan sebelumnya, tetapi dengan satu perbezaan penting: nama fail ialah kod dan bukan rentetan dalam ingatan. Kod $0610 ialah pilihan yang baik. Ini bermakna kadar baud 300 bit/saat dan beberapa parameter teknikal lain. Juga, tiada alamat sekunder. Ambil perhatian bahawa nombor peranti ialah 2. Prosedur untuk menyediakan saluran RS-232 yang lengkap ialah:

  • Menetapkan saluran menggunakan rutin SETLFS.
  • Menetapkan nama fail logik, $0610.
  • Membuka fail logik menggunakan rutin OPEN.
  • Menjadikannya fail untuk output menggunakan CHKOUT atau fail untuk input menggunakan CHKIN.
  • Menghantar bait tunggal dengan CHROUT atau menerima bait tunggal dengan GETIN.
  • Menutup fail logik menggunakan rutin CLOSE.

Rutin OS GETIN diakses dengan melompat (JSR) ke jadual lompat OS ROM pada $FFE4. Rutin ini, apabila dipanggil, mengambil bait yang dihantar ke dalam penimbal penerima dan meletakkan (mengembalikannya) ke dalam penumpuk µP.

Program berikut menghantar bait 'E' (ASCII) ke modem yang disambungkan ke port serasi RS-232 pengguna:

; Sediakan saluran
LDA #$40 ; nombor fail logik
LDX #$02 ; nombor peranti untuk RS-232
LDY #$FF ; tiada alamat sekunder
JSR SETLFS ; persediaan saluran dengan betul
;
; Nama untuk RS-232 ialah kod cth. $0610
LDA #$02 ; panjang kod ialah 2 bait
LDX #$10
LDY#$06
JSR SETNAM
;
; Buka fail logik
JSR DIBUKA
; Tetapkan saluran untuk output
LDX #$40 ; nombor fail logik
JSR CHKOUT
;
; Output char kepada RS-232 cth. modem
LDA #$45
JSR CHROUT
; Tutup fail logik
LDA #$40
JSR TUTUP

Untuk menerima bait, kodnya sangat serupa, kecuali 'JSR CHKOUT' digantikan dengan 'JSR CHKIN' dan:

LDA #$45
JSR CHROUT

digantikan dengan 'JSR GETIN' dengan hasilnya dimasukkan ke dalam daftar A.

Penghantaran atau penerimaan bait berterusan dilakukan oleh gelung untuk penghantaran atau penerimaan segmen kod, masing-masing.

Ambil perhatian bahawa input dan output dengan Commodore adalah serupa untuk kebanyakan kesnya kecuali untuk papan kekunci di mana beberapa rutin tidak dipanggil oleh pengaturcara, tetapi ia dipanggil oleh sistem pengendalian.

5.11 Mengira dan Masa

Pertimbangkan urutan mengira mundur iaitu:

2, 1, 0

Ini mengira mundur dari 2 hingga 0. Sekarang, pertimbangkan urutan mengira mundur berulang:

2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0

Ini ialah pengiraan berulang bagi urutan yang sama. Urutan itu diulang empat kali. Empat kali bermakna masa adalah 4. Dalam satu urutan sedang mengira. Mengulangi urutan yang sama ialah pemasaan.

Terdapat dua Penyesuai Antara Muka Kompleks dalam unit sistem Commodore-64. Setiap CIA mempunyai dua litar pembilang/pemasa yang dinamakan Pemasa A (TA) dan Pemasa B (TB). Litar pengiraan tidak berbeza dengan litar pemasaan. Kaunter atau pemasa dalam Commodore-64 merujuk kepada perkara yang sama. Malah, salah satu daripada mereka pada dasarnya merujuk kepada satu daftar 16-bit yang sentiasa mengira ke bawah kepada 0 pada denyutan jam sistem. Nilai yang berbeza boleh ditetapkan ke dalam daftar 16-bit. Semakin besar nilainya, semakin lama masa yang diperlukan untuk mengira detik hingga sifar. Setiap kali salah satu pemasa melepasi sifar, nilai IRQ isyarat sampukan dihantar ke mikropemproses. Apabila pengiraan turun melepasi sifar, ia dipanggil aliran bawah.

Bergantung pada cara litar pemasa diprogramkan, pemasa boleh berjalan dalam mod satu masa atau dalam mod berterusan. Dengan ilustrasi sebelumnya, mod satu masa bermaksud 'lakukan 2, 1, 0' dan berhenti semasa denyutan jam diteruskan. Mod berterusan adalah seperti '2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, dll.' yang berterusan dengan denyutan jam. Ini bermakna apabila ia melepasi sifar, jika tiada arahan diberikan, urutan kira detik akan berulang. Nombor terbesar biasanya lebih besar daripada 2.

Pemasa A (TA) CIA #1 menjana IRQ pada selang masa yang tetap (tempoh) untuk servis papan kekunci. Malah, ini sebenarnya setiap 1/60 saat secara lalai. IRQ dihantar ke mikropemproses setiap 1/60 saat. Ia hanya apabila IRQ dihantar bahawa atur cara boleh membaca nilai kunci daripada baris gilir papan kekunci (penampan). Ingat bahawa mikropemproses hanya mempunyai satu pin untuk IRQ isyarat. Mikropemproses juga mempunyai hanya satu pin untuk NMI isyarat. Isyarat NMI kepada mikropemproses sentiasa datang daripada CIA #2.

Daftar pemasa 16-bit mempunyai dua alamat memori: satu untuk bait yang lebih rendah dan satu untuk bait yang lebih tinggi. Setiap CIA mempunyai dua litar pemasa. Kedua-dua CIA adalah sama. Untuk CIA #1, alamat untuk dua pemasa ialah: DC04 dan DC05 untuk TA dan DC06 dan DC07 untuk TB. Untuk CIA #2, alamat untuk dua pemasa ialah: DD04 dan DD05 untuk TA dan DD06 dan DD07 untuk TB.

Anggapkan bahawa nombor 25510 akan dihantar ke pemasa TA CIA #2 untuk mengira detik. 25510 = 00000000111111112 adalah dalam enam belas bit. 00000000111111112 = $000FFF adalah dalam perenambelasan. Dalam kes ini, $FF dihantar ke daftar di alamat $DD04, dan $00 dihantar ke daftar di alamat $DD05 – little endianness. Segmen kod berikut menghantar nombor ke daftar:

LDA #$FF
NEGERI $DD04
LDA #$00
NEGERI $DD05

Walaupun daftar dalam CIA mempunyai alamat RAM, mereka secara fizikal berada dalam CIA dan CIA ialah IC yang berasingan daripada RAM atau ROM.

Bukan itu sahaja! Apabila pemasa telah diberi nombor untuk mengira mundur, seperti dengan kod sebelumnya, mengira mundur tidak bermula. Mengira mundur bermula apabila bait lapan-bit telah dihantar ke dalam daftar kawalan yang sepadan untuk pemasa. Bit pertama bait ini untuk daftar kawalan menunjukkan sama ada kiraan ke bawah harus dimulakan atau tidak. Nilai 0 untuk bit pertama ini bermakna berhenti mengira mundur, manakala nilai 1 bermakna mula mengira mundur. Selain itu, bait perlu menunjukkan sama ada mengira ke bawah adalah dalam mod satu pukulan (sekali) atau dalam mod larian bebas (mod berterusan). Mod satu pukulan mengira detik dan berhenti apabila nilai daftar pemasa menjadi sifar. Dengan mod larian percuma, kiraan mundur berulang selepas mencapai 0. Bit keempat (indeks 3) bait yang dihantar ke daftar kawalan menunjukkan mod: 0 bermaksud mod larian percuma dan 1 bermaksud mod satu pukulan.

Nombor yang sesuai untuk mula mengira dalam mod satu pukulan ialah 000010012 = $09 dalam perenambelasan. Nombor yang sesuai untuk mula mengira dalam mod larian bebas ialah 000000012 = $01 dalam perenambelasan. Setiap daftar pemasa mempunyai daftar kawalan sendiri. Dalam CIA #1, daftar kawalan untuk pemasa A mempunyai alamat RAM DC0E16 dan daftar kawalan untuk pemasa B mempunyai alamat RAM DC0F16. Dalam CIA #2, daftar kawalan untuk pemasa A mempunyai alamat RAM DD0E16 dan daftar kawalan untuk pemasa B mempunyai alamat RAM DD0F16. Untuk mula mengira nombor enam belas bit dalam TA CIA #2, dalam mod satu pukulan, gunakan kod berikut:

LDA #$09
STA $DD0E

Untuk mula mengira nombor enam belas bit dalam TA CIA #2, dalam mod berjalan bebas, gunakan kod berikut:

LDA #$01
STA $DD0E

5.12 Yang IRQ dan NMI Permintaan

Mikropemproses 6502 mempunyai IRQ dan NMI garisan (pin). Kedua-dua CIA #1 dan CIA #2 masing-masing mempunyai IRQ pin untuk mikropemproses. The IRQ pin CIA #2 disambungkan ke NMI pin µP. The IRQ pin CIA #1 disambungkan ke IRQ pin µP. Itu adalah satu-satunya dua talian sampukan yang menyambungkan mikropemproses. Jadi IRQ pin CIA #2 ialah NMI sumber dan juga boleh dilihat sebagai talian NMI.

CIA #1 mempunyai lima kemungkinan sumber segera untuk menjana IRQ isyarat untuk µP. CIA #2 adalah sama dalam struktur seperti CIA #1. Jadi, CIA #2 mempunyai lima kemungkinan sumber segera yang sama untuk menjana isyarat gangguan kali ini iaitu NMI isyarat. Ingat bahawa apabila µP menerima NMI isyarat, jika ia mengendalikan IRQ permintaan, ia menggantung itu dan mengendalikan NMI permintaan. Apabila ia selesai mengendalikan NMI permintaan, ia kemudian menyambung semula pengendalian IRQ permintaan.

CIA #1 biasanya disambungkan secara luaran ke papan kekunci dan peranti permainan seperti kayu bedik. Papan kekunci menggunakan lebih banyak port A CIA #1 daripada port B. Peranti permainan menggunakan lebih banyak port CIA #1 B daripada port Anya. CIA #2 biasanya disambungkan secara luaran ke pemacu cakera (daisy dirantai ke pencetak) dan modem. Pemacu cakera menggunakan lebih banyak port A CIA #2 (walaupun melalui port bersiri luaran) daripada port Bnya. Modem (RS-232) menggunakan lebih banyak port CIA #2 B daripada port Anya.

Dengan semua itu, bagaimana unit sistem mengetahui apa yang menyebabkan IRQ atau NMI menyampuk? CIA #1 dan CIA #2 mempunyai lima sumber gangguan segera. Jika isyarat sampukan kepada µP ialah NMI , sumber itu adalah salah satu daripada lima sumber segera daripada CIA #2. Jika isyarat sampukan kepada µP ialah IRQ , sumber itu adalah salah satu daripada lima sumber segera daripada CIA #1.

Soalan seterusnya ialah, 'Bagaimana unit sistem membezakan antara lima sumber segera setiap CIA?' Setiap CIA mempunyai daftar lapan bit yang dipanggil sebagai Daftar Kawalan Gangguan (ICR). ICR berfungsi untuk kedua-dua pelabuhan CIA. Jadual berikut menunjukkan makna lapan bit daftar kawalan gangguan, bermula dari bit 0:

Jadual 5.13
Daftar Kawalan Gangguan
Indeks Bit Maknanya
0 Tetapkan (dibuat 1) oleh aliran bawah pemasa A
1 Ditetapkan oleh aliran bawah pemasa B
2 Tetapkan apabila jam Time-Of-Day sama dengan penggera
3 Tetapkan apabila port bersiri penuh
4 Ditetapkan oleh peranti luaran
5 Tidak digunakan (dibuat 0)
6 Tidak digunakan (dibuat 0)
7 Tetapkan apabila mana-mana lima bit pertama ditetapkan

Seperti yang dapat dilihat dari jadual, setiap sumber segera diwakili oleh salah satu daripada lima bit pertama. Jadi, apabila isyarat sampukan diterima pada µP, kod tersebut perlu dilaksanakan untuk membaca kandungan daftar kawalan sampukan untuk mengetahui sumber sampukan yang tepat. Alamat RAM untuk ICR CIA #1 ialah DC0D16. Alamat RAM untuk ICR CIA #2 ialah DD0D16. Untuk membaca (mengembalikan) kandungan ICR CIA #1 kepada penumpuk µP, taip arahan berikut:

LDA$DC0D

Untuk membaca (mengembalikan) kandungan ICR CIA #2 kepada penumpuk µP, taip arahan berikut:

LDA $DD0D

5.13 Program Latar Belakang Didorong Gangguan

Papan kekunci biasanya mengganggu mikropemproses setiap 1/60 saat. Bayangkan bahawa program sedang berjalan dan ia mencapai kedudukan untuk menunggu kekunci daripada papan kekunci sebelum ia boleh meneruskan dengan segmen kod di bawah. Andaikan bahawa jika tiada kekunci ditekan dari papan kekunci, program hanya melakukan gelung kecil, menunggu kekunci. Bayangkan program sedang berjalan dan hanya menjangkakan kekunci dari papan kekunci sejurus selepas gangguan papan kekunci dikeluarkan. Pada ketika itu, seluruh komputer secara tidak langsung berhenti dan tidak melakukan apa-apa selain untuk gelung gelung tunggu. Bayangkan bahawa kekunci papan kekunci ditekan sejurus sebelum keluaran seterusnya gangguan papan kekunci seterusnya. Ini bermakna komputer tidak melakukan apa-apa selama kira-kira satu per enam puluh saat! Itu adalah masa yang lama untuk komputer tidak melakukan apa-apa, walaupun pada zaman Commodore-64. Komputer mungkin melakukan sesuatu yang lain dalam masa itu (tempoh). Terdapat banyak tempoh sedemikian dalam sesuatu program.

Program kedua boleh ditulis untuk beroperasi pada tempoh 'terbiar' sedemikian. Program sedemikian dikatakan beroperasi di latar belakang program utama (atau pertama). Cara mudah untuk melakukan ini ialah dengan memaksa pengendalian gangguan BRK yang diubah suai apabila kunci dijangka daripada papan kekunci.

Penunjuk untuk Arahan BRK
Di lokasi berturut-turut RAM bagi alamat $0316 dan $0317 ialah penunjuk (vektor) untuk rutin arahan BRK sebenar. Penunjuk lalai diletakkan di sana apabila komputer dihidupkan oleh sistem pengendalian dalam ROM. Penunjuk lalai ini ialah alamat yang masih menunjuk kepada pengendali arahan BRK lalai dalam OS ROM. Penunjuk ialah alamat 16-bit. Bait bawah penuding diletakkan di lokasi bait alamat $0306, dan bait penuding yang lebih tinggi diletakkan di lokasi $0317 bait.

Program kedua boleh ditulis sedemikian rupa sehingga apabila sistem 'terbiar', beberapa kod program kedua dilaksanakan oleh sistem. Ini bermakna program kedua perlu terdiri daripada subrutin. Apabila sistem 'terbiar' yang sedang menunggu kekunci dari papan kekunci, subrutin seterusnya untuk program kedua dilaksanakan. Interaksi manusia dengan komputer adalah perlahan berbanding dengan operasi unit sistem.

Mudah untuk menyelesaikan masalah ini: Setiap kali komputer perlu menunggu kekunci daripada papan kekunci, masukkan arahan BRK dalam kod dan gantikan penunjuk pada $0316 (dan $0317) dengan penuding subrutin kedua yang seterusnya ( adat) program. Dengan cara itu, kedua-dua program akan berjalan dalam tempoh yang tidak lebih lama daripada program utama yang berjalan sendiri.

5.14 Perhimpunan dan Penyusunan

Penghimpun menggantikan semua label dengan alamat. Program bahasa himpunan biasanya ditulis untuk bermula pada alamat tertentu. Hasil daripada pemasang (selepas memasang) dipanggil 'kod objek' dengan segala-galanya dalam binari. Hasilnya ialah fail boleh laku jika fail itu adalah program dan bukan dokumen. Dokumen tidak boleh dilaksanakan.

Aplikasi terdiri daripada lebih daripada satu program (bahasa himpunan). Selalunya ada program utama. Keadaan di sini tidak harus dikelirukan dengan situasi untuk Program Latar Belakang Terpacu Gangguan. Semua program di sini adalah program latar depan, tetapi terdapat program pertama atau utama.

Pengkompil diperlukan dan bukannya penghimpun apabila terdapat lebih daripada satu program latar depan. Pengkompil memasang setiap atur cara kepada kod objek. Walau bagaimanapun, akan ada masalah: beberapa segmen kod akan bertindih kerana program mungkin ditulis oleh orang yang berbeza. Penyelesaian oleh pengkompil adalah untuk mengalihkan semua atur cara bertindih kecuali yang pertama pada ruang ingatan, supaya atur cara tidak bertindih. Sekarang, apabila ia datang untuk menyimpan pembolehubah, beberapa alamat pembolehubah masih akan bertindih. Penyelesaian di sini adalah untuk menggantikan alamat bertindih dengan alamat baharu (kecuali untuk program pertama) supaya alamat tersebut tidak lagi bertindih. Dengan cara ini, program yang berbeza akan dimuatkan ke dalam bahagian (kawasan) memori yang berbeza.

Dengan semua itu, adalah mungkin untuk satu rutin dalam satu program untuk memanggil rutin dalam program lain. Jadi, pengkompil melakukan pemautan. Memautkan merujuk kepada mempunyai alamat permulaan subrutin dalam satu program dan kemudian memanggilnya dalam program lain; kedua-duanya adalah sebahagian daripada aplikasi. Kedua-dua program perlu menggunakan alamat yang sama untuk ini. Hasil akhirnya ialah satu kod objek besar dengan segala-galanya dalam binari (bit).

5.15 Menyimpan, Memuatkan dan Menjalankan Program

Bahasa himpunan biasanya ditulis dalam beberapa program editor (yang mungkin disediakan bersama program penghimpun). Program editor menunjukkan di mana program bermula dan berakhir dalam memori (RAM). Rutin Kernal SAVE bagi OS ROM Commodore-64 boleh menyimpan program dalam memori ke cakera. Ia hanya membuang bahagian (blok) memori yang mungkin mengandungi panggilan arahannya ke cakera. Adalah dinasihatkan untuk mempunyai arahan memanggil untuk SAVE, dipisahkan daripada program yang sedang disimpan, supaya apabila program dimuatkan ke dalam memori dari cakera, ia tidak akan menyelamatkan dirinya semula apabila ia dijalankan. Memuatkan atur cara bahasa himpunan daripada cakera adalah jenis cabaran yang berbeza kerana program tidak boleh memuatkan sendiri.

Program tidak boleh memuatkan dirinya sendiri dari cakera ke tempat ia bermula dan berakhir dalam RAM. Commodore-64 pada zaman itu biasanya dibekalkan dengan penterjemah ASAS untuk menjalankan program bahasa ASAS. Apabila mesin (komputer) dihidupkan, ia diselesaikan dengan gesaan arahan: SEDIA. Dari sana, arahan atau arahan ASAS boleh ditaip dengan menekan kekunci 'Enter' selepas menaip. Perintah (arahan) BASIC untuk memuatkan fail ialah:

MUAT 'nama fail', 8,1

Perintah dimulakan dengan perkataan simpanan ASAS iaitu LOAD. Ini diikuti dengan ruang dan kemudian nama fail dalam petikan berganda. Nombor peranti 8 diikuti yang didahului dengan koma. Alamat kedua untuk cakera iaitu 1 diikuti, didahului dengan koma. Dengan fail sedemikian, alamat permulaan program bahasa pemasangan berada dalam pengepala fail dalam cakera. Apabila BASIC selesai memuatkan program, alamat RAM terakhir ditambah 1 program dikembalikan. Perkataan 'dipulangkan' di sini bermaksud bahawa bait bawah alamat terakhir campur 1 dimasukkan ke dalam daftar µP X, dan bait yang lebih tinggi bagi alamat terakhir tambah 1 dimasukkan ke dalam daftar µP Y.

Selepas memuatkan program, ia perlu dijalankan (dilaksanakan). Pengguna program perlu mengetahui alamat permulaan untuk pelaksanaan dalam ingatan. Sekali lagi, satu lagi program ASAS diperlukan di sini. Ia adalah arahan SYS. Selepas melaksanakan arahan SYS, program bahasa himpunan akan berjalan (dan berhenti). Semasa berjalan, jika sebarang input diperlukan daripada papan kekunci, program bahasa himpunan harus menunjukkannya kepada pengguna. Selepas pengguna menaip data pada papan kekunci dan menekan kekunci 'Enter', program bahasa pemasangan akan terus berjalan menggunakan entri papan kekunci tanpa gangguan daripada penterjemah BASIC.

Dengan mengandaikan bahawa permulaan alamat RAM pelaksanaan (berjalan) untuk Program Bahasa Himpunan ialah C12316, C123 ditukar kepada asas sepuluh sebelum menggunakannya dengan arahan SYS. Menukar C12316 kepada asas sepuluh adalah seperti berikut:

Jadi, arahan BASIC SYS ialah:

SYS 49443

5.16 Boot untuk Commodore-64

But untuk Commodore-64 terdiri daripada dua fasa: fasa tetapan semula perkakasan dan fasa permulaan sistem pengendalian. Sistem pengendalian ialah Kernal dalam ROM (dan bukan dalam cakera). Terdapat baris tetapan semula (sebenarnya RES ) yang bersambung ke pin pada 6502 µP, dan ke nama pin yang sama dalam semua kapal khas seperti CIA 1, CIA 2 dan VIC II. Dalam fasa penetapan semula, disebabkan baris ini, semua daftar dalam µP dan dalam cip khas ditetapkan semula kepada 0 (dijadikan sifar untuk setiap bit). Seterusnya, oleh perkakasan mikropemproses, penuding tindanan dan daftar status pemproses diberikan dengan nilai awalnya dalam mikropemproses. Kaunter program kemudiannya diberikan dengan nilai (alamat) di lokasi $FFFC dan $FFFD. Ingat bahawa kaunter program memegang alamat arahan seterusnya. Kandungan (alamat) yang disimpan di sini adalah untuk subrutin yang memulakan permulaan perisian. Segala-galanya setakat ini dilakukan oleh perkakasan mikropemproses. Seluruh ingatan tidak disentuh pada fasa ini. Fasa permulaan seterusnya bermula.

Inisialisasi dilakukan oleh beberapa rutin dalam OS ROM. Permulaan bermaksud memberikan nilai awal atau lalai kepada beberapa daftar dalam cip khas. Permulaan bermula dengan memberikan nilai awal atau lalai kepada beberapa daftar dalam cip khas. IRQ , sebagai contoh, perlu mula mengeluarkan setiap 1/60 saat. Jadi, pemasa yang sepadan dalam CIA #1 perlu ditetapkan kepada nilai lalainya.

Seterusnya, Kernal melakukan ujian RAM. Ia menguji setiap lokasi dengan menghantar bait ke lokasi dan membacanya kembali. Jika ada perbezaan, sekurang-kurangnya lokasi itu adalah buruk. Kernal juga mengenal pasti bahagian atas memori dan bahagian bawah memori dan menetapkan penunjuk yang sepadan dalam halaman 2. Jika bahagian atas memori ialah $DFFF, $FF diletakkan di lokasi $0283 dan $DF diletakkan di lokasi $0284 bait. Kedua-dua $0283 dan $0284 mempunyai label HIRAM. Jika bahagian bawah memori ialah $0800, $00 diletakkan di lokasi $0281 dan $08 diletakkan di lokasi $0282. Kedua-dua $0281 dan $0282 mempunyai label LORAM. Ujian RAM sebenarnya bermula dari $0300 ke bahagian atas memori (RAM).

Akhir sekali, vektor input/output (penunjuk) ditetapkan kepada nilai lalainya. Ujian RAM sebenarnya bermula dari $0300 ke bahagian atas memori (RAM). Ini bermakna halaman 0, halaman 1 dan halaman 2 dimulakan. Halaman 0, khususnya, mempunyai banyak penunjuk OS ROM dan halaman 2 mempunyai banyak petunjuk ASAS. Petunjuk ini dirujuk sebagai pembolehubah. Ingat bahawa halaman 1 adalah timbunan. Penunjuk dirujuk sebagai pembolehubah kerana ia mempunyai nama (label). Pada peringkat ini, memori skrin dikosongkan untuk skrin (monitor). Ini bermakna menghantar kod $20 untuk ruang (yang kebetulan sama dengan ASCII $20) ke lokasi skrin 1000 RAM. Akhir sekali, Kernal memulakan penterjemah BASIC untuk memaparkan arahan arahan BASIC yang SEDIA di bahagian atas monitor (skrin).

5.17 Masalah

Pembaca dinasihatkan untuk menyelesaikan semua masalah dalam bab sebelum beralih ke bab seterusnya.

  1. Tulis kod bahasa himpunan yang menjadikan semua bit CIA #2 port A sebagai output dan CIA #2 port B sebagai input.
  2. Tulis kod bahasa 6502-himpunan yang menunggu kekunci papan kekunci sehingga ia ditekan.
  3. Tulis program bahasa himpunan 6502 yang menghantar aksara 'E' ke skrin Commodore-64.
  4. Tulis program bahasa himpunan 6502 yang mengambil aksara dari papan kekunci dan menghantarnya ke skrin Commodore-64, mengabaikan kod kunci dan pemasaan.
  5. Tulis program bahasa himpunan 6502 yang menerima bait daripada disket Commodore-64.
  6. Tulis program bahasa himpunan 6502 yang menyimpan fail ke disket Commodore-64.
  7. Tulis program bahasa himpunan 6502 yang memuatkan fail program daripada disket Commodore-64 dan memulakannya.
  8. Tulis program bahasa himpunan 6502 yang menghantar bait 'E' (ASCII) ke modem yang disambungkan kepada port serasi RS-232 pengguna Commodore-64.
  9. Terangkan bagaimana pengiraan dan pemasaan dilakukan dalam komputer Commodore-64.
  10. Terangkan bagaimana unit sistem Commodore-64 boleh mengenal pasti 10 sumber permintaan gangguan segera yang berbeza termasuk permintaan gangguan tidak boleh bertopeng.
  11. Terangkan bagaimana program latar belakang boleh dijalankan dengan program latar depan dalam komputer Commodore-64.
  12. Terangkan secara ringkas bagaimana atur cara bahasa himpunan boleh disusun menjadi satu aplikasi untuk komputer Commodore-64.
  13. Terangkan secara ringkas proses but untuk komputer Commodore-64.