Saya ingin membagikan proyek saya yang dibuat di Factorio berdasarkan logika yang ditawarkan oleh game ini. Proyek ini terinspirasi oleh pikiran yang hebat, yang menuliskan panduan langkah demi langkah untuk membuat mobil yang hampir sama, tetapi di dunia nyata. Saya sarankan menontonnya, ini akan membantu Anda memahami dan membuat ulang proyek ini: Komputer 8-bit
Saya menundukkan kepala kepada Ben Eater, yang mengajari saya banyak hal melalui salurannya, dan saya ingin mengabdikan proyek kecil ini untuknya. Kerja bagus Ben!
Berikut adalah komputer yang menghitung angka Fibonacci, setelah melebihi batas 8-bit (255), ia menjalankan cabang bersyarat dan memulai kembali:
Mari kita lihat cara kerja komputer ini. Dan jangan takut - saya yakin dengan dasar-dasar Anda juga bisa melakukannya! Mari kita mulai dengan tata letak umum komputer. Di sini saya telah menyoroti bidang-bidang penting. Di bawah ini saya akan menjelaskan bagaimana saya membuatnya.
CLK adalah pengatur waktu yang menyediakan sinkronisasi mesin. CPU modern mampu beroperasi pada 4-5 GHz (4-5.000.000.000 Hz). Saat ini mesin saya dapat berjalan pada 2 Hz karena keterbatasan gerbang logika Factorio - setiap input harus dihitung untuk setiap kombinator (gerbang), jadi jika kami memiliki 10 berturut-turut, maka kami perlu menunggu 10 jam permainan (fps ) untuk memulai siklus sistem berikutnya. Jika tidak, sinyal akan bingung dan kalkulasi tidak akan dilakukan.
PC (Program Counter, program counter) - penghitung memberitahu bagian mana dari program yang kita masuki. Program dibaca dari memori 16-byte (satu byte berisi 8 bit). Penghitung menghitung hingga 16 (4 bit) dalam format biner (0000, 0001, 0010, 0011, 0100, 0101 ... 1111), jadi masing-masing kalkulasi ini memberi kita alamat register, yang nanti dapat kita ambil dari memori dan melakukan tindakan dengan itu. Ini juga berisi Jump yang mengatur ulang penghitung. Kita dapat memasukkan nilai yang berbeda untuk pergi ke lokasi tertentu dalam memori / kode kita.
BUS adalah titik koneksi utama untuk semua komponen komputer. Kami dapat mentransfer data ke / dari itu. Untuk melakukan ini, kami menggunakan sinyal kontrol yang membuka / menutup gerbang setiap komponen, sehingga lebih dari dua gerbang tidak pernah terbuka (sehingga data tidak tercampur).
ALU adalah "kalkulator" kami yang melakukan operasi penjumlahan dan pengurangan (ALU dapat melakukan lebih banyak hal pada CPU yang lebih kompleks!). Ini langsung menerima apa yang ada di register A dan B, dan kemudian melakukan operasi logis (kami memilih operasi dengan dekoder instruksi). Kemudian data ini di keluarkan ke bus (bus). ALU juga menyimpan tanda yang bisa digunakan dalam fungsi cabang bersyarat.
Mendaftarkan A dan B - mereka dapat menyimpan angka 8-bit, yang kemudian digabungkan dalam ALU. Kedua register dapat mengirim dan menerima data dari bus.
Register address / Decoder (RAD) - membaca alamat 4-bit dari bus dan menerjemahkan berapa banyak RAM yang harus kita baca. Misalnya, alamat 1110 berisi nilai 0000 0011 (lihat gambar).
RAM - PC modern biasanya memiliki memori sekitar 16 GB (16.000.000.000 byte). Kami hanya memiliki 16 byte ... Ini memberi kami ruang untuk 16 instruksi atau lebih sedikit sehingga kami dapat menyimpan data / variabel di bagian memori lain. Pada dasarnya RAM di sini adalah 16 register yang berbeda, seperti yang kita gunakan di tempat lain, mereka hanya diakses melalui decoder register.
Register instruksi (IR) / decoder (DC) - Kita dapat memasukkan data ke dalam register instruksi dari BUS dan kemudian mendekodekannya untuk memberi tahu bagaimana program harus berperilaku. Hanya 4 bit yang digunakan (disorot dengan warna biru kehijauan), yang memberi kita 16 jenis perintah yang dapat diprogram. Katakanlah kita memiliki perintah OUT yang mencetak apa yang disimpan di register A. Ini dikodekan sebagai 1110, jadi ketika perintah seperti itu mengenai register, kita dapat mendekodekannya dan memberi tahu komputer bagaimana melanjutkan.
Penghitung mikrokode (MC) - Mirip dengan penghitung program, tetapi terletak di dalam dekoder instruksi. Memberi kami kemampuan untuk menjalankan setiap perintah.
LCD / Layar sebenarnya adalah sebuah register, tetapi lebih rumit, karena ia mencetak isinya pada layar LCD (Lamp-Combinator-Display, "tampilan lampion dan combinator").
Switch board (SB) - Panel ini menunjukkan fungsi sakelar mana yang kami kirim untuk mengontrol setiap komponen komputer. Saat ini terdapat 17 sakelar berbeda yang mengontrol berbagai hal. Misalnya, jika kita ingin membaca dari BUS ke register A, atau menulis ke memori / register perintah, dll. Sakelar yang dijelaskan di bawah ini dapat digunakan untuk mengontrol mesin secara manual.
Flags (F) - register untuk menyimpan flag (carry [T] - ketika kita melebihi nilai 8-bit saat menambahkan, memusatkan perhatian [O] - ketika jumlah / perbedaannya 0). Mereka akan membantu kita dengan perintah lompat bersyarat.
Mari saya bahas lebih detail tentang masing-masing komponen, dan pada akhirnya kita akan melihat bagaimana memprogram komputer, karena prosesnya akan menjadi lebih jelas. Jika Anda hanya tertarik pada pemrograman, langsung saja ke bagian terakhir artikel.
CLK adalah penghasil waktu kami, yang paling penting dalam komputasi apa pun. Saya ingin membuat osilator yang memiliki sinyal [C = 1] tinggi dan [C = 0] rendah pada saat bersamaan.
(1) Ini adalah kombinator konstan dasar yang memberikan sinyal ke generator. Ini melompat ke (2) di mana input dan output digabungkan bersama. Berkat konfigurasi ini, dengan setiap jam permainan (UPS), nilai [C] bertambah 1. Ketika mencapai [Z], disetel ulang ke 0. Artinya, Z memberi tahu kita berapa banyak jam permainan yang diperlukan untuk setel ulang generator. Ada juga pembagi sederhana dengan 2 di bawah ini, yang membuat generator tetap tinggi untuk separuh waktu dan rendah untuk separuh waktu. Ketika C kurang dari [Y] (yaitu setengah [Z]), generator tinggi, jika tidak maka rendah.
Penyisip (4) digunakan sebagai generator sinkronisasi sekunder jika kita membutuhkan lebih banyak kontrol atas tanda centang. Jika Anda meletakkan sesuatu di peti pertama, maka akan terjadi ketukan. Jika kita membutuhkan 5 batang, kita perlu menempatkan lima objek di dalamnya.
(5) adalah sinyal kontrol pertama. [H] adalah kependekan dari perintah HALT {HLT}. Jika nilai rendah [H = 0], maka generator beroperasi normal, dan jika tinggi, masuk ke mode manual. Ini difasilitasi oleh gerbang kontrol, mereka (5a) digunakan untuk operasi normal, dan ketika sinyal [H] bukan 0, maka mode manual diaktifkan dan [C] (CLK kami) adalah keluaran.
Saya juga membuat sinyal terbalik menggunakan gerbang (6) - ketika output rendah, sinyal terbalik tinggi. Saya tidak menggunakannya di dalam mobil, tetapi sebaiknya mengingatnya untuk referensi di masa mendatang.
Sinyal [C] berjalan melalui sistem melalui kabel hijau. Saya ingin mengisolasinya pada kabel yang benar-benar terpisah (misalnya, BUS kami ada di kabel merah) sehingga dapat dengan mudah dilacak dan tidak tertukar dengan sinyal lain.
Register - jangan terintimidasi oleh mereka. Ini mungkin bagian paling kompleks dari keseluruhan sistem, tetapi penting untuk memahami cara kerja seluruh mesin.
Register berisi nilai-nilai. Dalam kehidupan sehari-hari, kita harus membuat register untuk masing-masing 8 bit dan sinyal lainnya. Untungnya, Factorio memungkinkan Anda mengirim banyak sinyal melalui satu jalur. Pada dasarnya, ini adalah pemicu JK.
Secara singkat tentang cara kerjanya. Pada setiap pulsa sinkronisasi, mereka menyiram apa yang ada di dalamnya dan menyimpan nilai yang masuk. Jika tidak ada nilai yang masuk (semua nol), nilai tersebut akan dihapus dalam siklus sinkronisasi. Tentu saja, kita tidak ingin mereka selalu kosong, bagaimanapun juga, kita perlu menyimpan nilai di dalamnya. Oleh karena itu, kami menggunakan logika kontrol, yang sekarang akan saya bicarakan, dan kami akan membahas sihir hitam dalam membuat pemicu nanti.
Nilai yang disimpan (1) ditampilkan dengan senter. Saat lampu menyala, artinya 1, dan padam artinya 0. Seperti yang Anda lihat, saat ini kami menyimpan nilai 1110 1001.
Untuk mengeluarkan nilai ke bus, kami menggunakan logika kontrol gerbang (2). Ketika sinyal [K] rendah, gerbang ini mengeluarkan apa pun yang ada di dalam register ke bus utama.
Mengapa kami menggunakannya saat sinyal rendah dan tidak tinggi? Karena gerbang logika mengeluarkan semua yang disuplai kepadanya (merah *), dan sebagai hasilnya, bus akan memiliki sinyal [K], dan kita tidak membutuhkan ini, kita hanya perlu [7, 6, 5, 4, 3 , 2, 10]. Untuk alasan yang sama, kita perlu menyaring sinyal kontrol dengan gerbang (3) sehingga kita menerima [K] hanya ketika kita membutuhkannya.
Gerbang (4) terhubung ke bus (kabel merah) dan sinyal kontrol (kabel hijau). Seperti dalam kasus sebelumnya, register menerima input ketika sinyal [A] rendah. Untuk menyaring semua sinyal lainnya, kami menggunakan gerbang logika (4a). Faktanya, ia mengambil semua input dari bus dan sinyal kontrol yang tidak diinginkan, dan kemudian menambahkannya ke kombinator (4b), yang inputnya selalu sinyal [7, 6, ... 0] = 1. Kemudian jika ada sinyal bernilai 0, lalu mengeluarkan masing-masing sinyal ini = 1. Sederhana, bukan? Dalam hal ini, hanya nilai-nilai dari bus yang penting bagi kita yang masuk ke register (nilai 0 akan tetap 1, mereka berkedip untuk satu siklus clock, dan kemudian tetap dinonaktifkan selama seluruh siklus CLK tinggi).
Dalam situasi seperti itu, ketika [C] menjadi tinggi, rana (6) mengeluarkan sinyal [HITAM], dan rana (6a) membatalkan [C]. Tetapi karena membutuhkan 1 UPS lagi untuk dikurangi menjadi nol, gate (6) mengeluarkan sinyal dalam waktu yang singkat.
Sinyal ini kemudian ditransfer ke gerbang (7), yang juga terbuka untuk waktu yang singkat. Gerbang (7b) membatalkan sinyal [HITAM] sehingga tidak disimpan di gerbang (8), yang digunakan sebagai penjaga sinyal kami. Ini mirip dengan jaring CLK, karena input dan output dihubungkan bersama. Jika tidak ada masukan, maka tetap tidak berubah. Jika kita mengubah jam sekali lagi tanpa memasukkan data baru, gerbang (7a) akan memasukkan sinyal terbalik sehubungan dengan nilai yang disimpan dalam register untuk menghapusnya.
Sekarang setelah kita tahu cara kerja pengenalan perubahan dan register, kita tahu hampir segalanya.
ALU - terus-menerus menambah / mengurangi apa yang ada di register (A) dan (B). Kami hanya mengontrol apakah akan mengeluarkannya ke bus [Z] atau mengubah mode untuk mengurangi [S].
Bagaimana itu bekerja? Untuk mendapatkan gambaran yang utuh, saya sarankan untuk menonton beberapa video Ben Iter, karena penjelasannya akan tiga kali lebih panjang dari artikel saya.
Saya hanya akan menjelaskan cara membuat adder seperti itu di Factorio.
Untuk melakukan ini, kita membutuhkan tiga jenis gerbang: XOR (1), AND (2), dan OR (3). Untungnya, mereka cukup mudah dibuat. Karena kita dapat menggunakan banyak sinyal pada baris yang sama, gerbang XOR dan AND pertama kita dapat disederhanakan menjadi hanya dua, dan kita tidak perlu melakukannya untuk semua 8 bit. Ini memungkinkan kita untuk membuat (4) bagian dari rantai dan menduplikasinya untuk setiap bit.
Pengurangan dilakukan dengan sinyal [S], yang membalikkan sinyal yang datang dari register (B).
ALU juga mengeluarkan carry (ketika jumlahnya melebihi 8 bit), memusatkan perhatian dan menyimpannya di register di sebelah kanan (F dalam gambar dengan komputer utama).
LCD / Layar - Tampak mengintimidasi, tapi sejujurnya, itu yang paling mudah dibuat. Hanya butuh waktu untuk menghubungkan semuanya dengan benar.
Pertama, kami membuat register yang inputnya dikontrol oleh sinyal [P]. Kemudian kami mengalikan setiap bit dengan nilainya, mengubahnya menjadi nilai desimal untuk mendapatkan sinyal yang sama dengan nilai desimal (ini semacam kecurangan di Factorio, tetapi kurangnya EEPROM yang dapat diprogram tidak memungkinkan kami untuk berbalik terlalu banyak). Untuk mengonversi, kita hanya perlu mengambil bit pertama [0] dan mengalikannya dengan * 1, lalu mengambil bit kedua [1] dan mengalikan dengan * 2, yang ketiga [2] dengan * 4, dan seterusnya. Dalam prosesnya, kami menampilkan beberapa nilai arbitrer untuk menentukan angka yang dihasilkan (dalam hal ini, itu adalah [setetes air]).
LCD menyala dalam 9 langkah untuk angka (3). Kita hanya perlu mengatur lampu tersebut sesuai dengan langkah (1), dan kemudian menggunakan gerbang (2) untuk mengeluarkan nilai tepat di tempat yang kita butuhkan. Anda hanya perlu mengingat untuk menambahkan kombinator konstan terpisah (3) dan menghubungkannya hanya ke satu gerbang khusus (2). Kemudian kami cukup menghubungkan semua lampu satu sama lain dan memberi mereka instruksi tentang langkah mana mereka berada (1).
RAM / Memory Register (RAD) - Di sini saya akan menjelaskan cara kerja RAM secara kasar.
Kita sudah tahu register yang menggunakan pulsa sinkronisasi untuk menyimpan nilai. RAM hanyalah sebuah grid dari 16 register yang berbeda (dalam kasus kami) (2). Input mereka dikendalikan oleh register lain (1) yang menyimpan 4 bit [0, 1, 2, 3], yang memberi tahu kita lokasi memori mana yang kita tunjuk. Ini diimplementasikan menggunakan decoder alamat (3), yang bekerja dengan cara yang mirip dengan LED / Layar. Setiap gerbang menerima nilai dari kombinator konstan (dalam kasus kami 1100 bin = 10 dec), dan kemudian mengeluarkan nama sinyal dari register yang sesuai (dalam kasus kami [M]) sehingga nilainya dapat diakses (dalam kasus kami 00110 0011).
Pemrograman memori manual juga perlu disebutkan di sini. Ini dapat dilakukan dengan menggunakan sinyal [W], diaktifkan / dinonaktifkan menggunakan kombinator konstan (4). Kombinator lain (5) memungkinkan kita mengubah alamat, dan kita menggunakan kombinator lain (6) untuk memasukkan nilainya. Pada akhirnya, kami hanya meletakkan semuanya di peti (7), sehingga saat menyinkronkan, secara manual mentransfer nilai ke RAM, tanpa menyentuh CLK utama komputer.
Program counter (PC) - tugasnya adalah menghitung pada langkah program mana kita (1). Saat startup, nilainya 0000, alamat ini dibaca dari RAM dan ditransfer ke register perintah untuk interpretasi. Setelah perintah selesai, kita dapat menaikkan penghitung dengan sinyal [X], kemudian menjadi sama dengan 0001, dan pada iterasi berikutnya alamat ini diambil dari memori, dan loop berlanjut.
Tentu saja, terkadang kita perlu melakukan pencabangan tanpa syarat atau bersyarat ke bagian lain dari program. Kita bisa melakukan ini dengan sinyal [J]. Jika rendah (dalam kasus kami, rendah berarti aktif), maka itu diatur ulang, membaca dari bus alamat yang harus dilompati, dan menyimpannya dalam register (2). Ketika [J] naik lagi, ini memberi sinyal detektor perubahan (terletak tepat di bawah 2) ke PC.
Penghitung itu sendiri bekerja mirip dengan CLK, tetapi alih-alih menghitung siklus jam secara konstan, ia menghitung siklus jam ketika perubahan dalam CLK terdeteksi (pada kenyataannya, hanya ketika X dan CLK aktif). Ini bisa dilihat langsung pada gambar (1).
Sinyal tersebut kemudian dapat diterapkan ke bus menggunakan sinyal kontrol [C].
Switch board (SB) - Ini adalah momen yang tepat untuk menjelaskan setiap sinyal kontrol yang digunakan dalam program.
Sinyal dibagi menjadi dua warna, hijau ke kiri, merah ke kanan. Setiap sinyal dari kombinator konstan sebenarnya dilewatkan sebagai nilai [-1]. Artinya, ketika kombinator diatur ke *! = 0, mereka dapat mengeluarkan sinyal 1. Karena ini, ketika logika kontrol mengirim sinyal [1], mereka dibatalkan, dan kita mendapatkan [0], dan dalam semua kasus kita hanya perlu ini (Anda dapat membaca di bagian di mana saya menjelaskan register).
[H] - menghentikan generator jam (beralih ke mode manual), sinyal tinggi berarti CLK tidak diaktifkan.
[Q] - alamat RAM, tempat register berada, dengan sinyal tinggi, register alamat RAM akan menyimpan nilai dari bus pada siklus CLK berikutnya.
[Y] - Input memori RAM, ketika sinyal RAM tinggi, ini akan menyimpan nilai dari bus di siklus CLK berikutnya (di alamat yang disimpan di register alamat).
[R] - Output RAM, ketika sinyal RAM tinggi, ia mengeluarkan nilai ke bus dalam siklus CLK berikutnya (dari alamat yang disimpan dalam register alamat).
[V] - masukan dari register perintah, ketika sinyalnya tinggi, register perintah menyimpan nilai dari bus dalam siklus CLK berikutnya.
[U] - output dari register perintah, ketika sinyalnya tinggi, register perintah mengeluarkan nilai ke bus dalam siklus CLK berikutnya (hanya 4 bit terakhir [3, 2, 1, 0]).
[C] - output dari pencacah program, ketika sinyalnya tinggi, pencacah program mengeluarkan nilai ke bus dalam siklus CLK berikutnya (hanya 4 bit pertama [7, 6, 5, 4]).
[J] - masuknya alamat transisi, ketika sinyalnya tinggi, pencacah program akan menetapkan nilai dari bus pada siklus CLK berikutnya (hanya 4 bit terakhir [3, 2, 1, 0]).
[X] - meningkatkan nilai pencacah perintah, ketika sinyalnya tinggi, pencacah program melakukan kenaikan dalam siklus CLK berikutnya.
[A] - input register A, dengan sinyal tinggi di register A, nilai dari bus disimpan dalam siklus clock CLK berikutnya.
[K] - keluaran dari register A, dengan sinyal tinggi dari register A, nilainya adalah keluaran ke bus pada siklus clock CLK berikutnya.
[Z] - Pin ALU, ketika sinyal ALU tinggi, ia mengeluarkan nilai ke bus dalam siklus CLK berikutnya.
[S] - pengurangan (ALU), ketika sinyal tinggi, ALU mengubah modenya dari penjumlahan ke pengurangan.
[B] - input register B, dengan sinyal tinggi di register B, nilai dari bus disimpan dalam siklus clock CLK berikutnya.
[L] - keluaran dari register B, dengan sinyal tinggi dari register B, nilainya adalah keluaran ke bus dalam siklus clock CLK berikutnya.
[P] - memasuki register LCD / layar, ketika sinyalnya tinggi, nilai dari bus disimpan ke register LCD / layar pada siklus CLK berikutnya, dan nilai ini ditampilkan.
[W] - masukan register flag, ketika sinyal tinggi, register flag menyimpan carry dari ALU (ketika 8 bit terlampaui), nol (ketika operasi ALU = 0000 0000).
[sinyal merah muda] - membawa bendera dinaikkan [T]
[sinyal biru kehijauan] - bendera nol dinaikkan [O]
Sekarang katakanlah kita perlu melakukan tindakan KELUAR: ambil apa yang ada di register A dan cetak ke LCD / layar (register). .. Untuk melakukan ini secara manual, kita hanya perlu menyalakan (dengan mematikan kombinator konstan untuk huruf tertentu) sinyal [K] (keluaran register A -> bus) dan sinyal [P] (bus -> register input lcd / screen), lalu jalankan jam CLK.
Command register / decoder / microcode counter - di sinilah keajaiban dimulai. Sekarang kita tahu cara mengontrol komputer secara manual, ini akan membantu kita memahami. apa yang perlu dilakukan agar dia bisa mengatur dirinya sendiri.
(1) penghitung mikrokode akan menghitung sampai 8 (jumlahnya dapat dikurangi jika kita tidak membutuhkan banyak), yaitu, kita dapat menjalankan 8 perintah on / off yang berbeda untuk melakukan tindakan dalam satu perintah.
(2) perintah dibaca ke dalam register dari bus, untuk ini kita perlu menyalakan sinyal [C] (keluaran dari penghitung perintah -> bus) dan [Q] (bus -> alamat memori masukan), dan kemudian baca RAM [R] (keluaran RAM -> bus) ke register perintah [V] (bus -> register perintah), dan juga untuk menaikkan penghitung [X].
Karena semua tindakan di atas perlu dilakukan setiap saat, saya menghubungkan semua ini (4) langsung ke penghitung mikrokode sehingga ini terjadi setiap kali penghitung melewati langkah 0 dan 1.
Ketika ada sesuatu di register, kita dapat menggunakan tabel kebenaran serupa dengan yang kami buat untuk register alamat RAM dan output ke LCD / layar.
Nilai [D] dari register perintah (selalu lebih besar dari 8) dan penghitung mikrokode (selalu sama dengan atau kurang dari 8) dapat ditambahkan, dan menggunakan angka yang dihasilkan, kita dapat membuat gerbang logika. Ini dilakukan dengan gerbang (3).
Contoh menunjukkan perintah 0110 XXXX (48 + X dalam desember, yang saya programkan perintah JMP), yang kemudian ditambahkan ke langkah 2 dari penghitung mikrokode, yang memberikan 50.
Contoh lain: perintah ADD (0010 XXXX - 16 + X pada des); setelah langkah 0 dan 1 microcode akan menjadi 2, yaitu register 18-24 dapat digunakan untuk bagian kode lainnya (dalam hal ini kita hanya perlu 18-20, karena ADD adalah proses 3 langkah).
(5) Bendera pembawa diproses oleh gerbang logika sederhana, input dinonaktifkan padanya hanya jika tidak ada pembawa [T] atau nol [O] yang diterapkan ke gerbang logika.
Di bawah ini adalah daftar lengkap saya dari perintah yang diimplementasikan (Anda dapat mengubahnya atau menambahkan perintah Anda sendiri!):
0 NOP - 0000 XXXX - tidak melakukan apa-apa.
1 LDA X - 0001 XXXX - memuat nilai dari alamat X RAM ke register A.
2 TAMBAH X - 0010 XXXX - muat nilai dari alamat X RAM ke register B, lalu keluarkan penambahan dan tempatkan di register A.
3 TAMBAH X - 0011 XXXX - memuat nilai dari alamat X RAM ke register B, dan kemudian mengeluarkan pengurangan dan memasukkannya ke dalam register A.
4 STA X - 0100 XXXX - memuat nilai dari register A dan menyimpannya dalam RAM di alamat
X.5 LDI X - 0101 XXXX - dengan cepat memuat nilai dari register perintah ( hanya nilai 4-bit) ke dalam register A.
6 JMP X - 0110 XXXX - tanpa syarat (selalu terjadi), transisi ke nilai X (PC memberikan nilai X).
7 JC X - 0111 XXXX - jika nilai bawaan [T] benar, lompat ke nilai X (tetapkan PC ke X).
8 JO X - 1000 XXXX - ketika transfer nol [O] benar, maka itu masuk ke nilai X (menetapkan nilai PC ke X).
9 OUR X - 1001 XXXX - menampilkan nilai dari alamat X RAM.
...
...
...
14 OUT - 1110 XXXX - Melakukan tampilan dari register A (X tidak melakukan apa pun).
15 HLT - 1111 XXXX - menghentikan generator sinkronisasi (X tidak melakukan apa pun).
Mari kita tulis program sederhana dan lihat cara kerjanya!
0 LDA 3 - memuat nilai ke register A dari alamat memori 3
1 OUT - menampilkan nilai dari register A.
2 HLT - stop CLK, yaitu seluruh mesin.
3 42 - nilai tersimpan
Artinya, program ini mengeluarkan nilai yang disimpan pada alamat 3 RAM (0011 dalam biner).
Mari kita ubah menjadi biner:
0 Alamat: 0000, nilai: 0001 0011
1 Alamat: 0001, nilai: 1110 0000
2 Alamat: 0010, nilai: 1111 0000
3 Alamat: 0011, nilai: 0010 1010
Artinya, untuk menulis program, kita perlu menulis ke memori (W pada panel memori; lihat bagian dengan gambar RAM), mulai dari alamat 0000, dan masukkan nilai 0001 0011 di dalamnya (0001 berarti perintah LDA, di mana 0011 adalah X, yaitu alamat 3 dalam memori) ...
Kemudian kami melakukan hal yang sama untuk tim lain.
Jangan lupa untuk mengubah warna [W] menjadi hijau lagi dan save stop ke counter.
Anda juga dapat mengatur ulang PC dengan melompat menggunakan J (tidak perlu mengubah ketukan CLK).