- Assembly bersentuhan langsung dengan struktur CPU, jadi pilihan pertama untuk dipelajari sangat penting; 6502 adalah platform pemula yang memiliki struktur sederhana sekaligus ekosistem nyata
- Dengan hanya 6 register dan 56 instruksi asli, Anda bisa cepat memahami konsep dasar seperti register, load/store, operasi logika dan aritmetika, serta percabangan
- Karena ini adalah CPU nyata yang digunakan di Apple II, Commodore VIC 20, Commodore 64, BBC micro, dan lainnya, pembelajaran berbasis praktik dengan emulator, perangkat replikasi, dan materi gratis menjadi mudah
- Easy 6502 menyediakan assembler dan simulator berbasis JavaScript yang bisa langsung dipakai menulis kode di web, sehingga cocok untuk mendapatkan gambaran dalam waktu singkat
- Z80, RISC modern, dan x86-x64 juga layak dipelajari, tetapi untuk langkah pertama, 6502 yang kompleksitasnya rendah membantu mengurangi beban belajar
Mengapa 6502 cocok untuk pemula
- Pemrograman assembly punya keterhubungan dengan hardware yang lebih kuat dibanding bahasa tingkat tinggi, sehingga CPU pertama yang dipelajari sangat memengaruhi tingkat kesulitan belajar
- Assembly 6502 bukanlah lingkungan yang nyaman untuk menulis aplikasi praktis masa kini
- Jika tidak tertarik pada pemrograman retro itu sendiri, tidak perlu berlama-lama di 6502
- Keunggulannya sebagai platform pemula adalah kesederhanaan dan keberadaan nyatanya
- Berkat struktur yang sederhana, konsep dasar bisa dipelajari dengan cepat
- Ada banyak perangkat nyata, emulator, buku, dan materi online, sehingga jalur belajar mudah ditentukan
-
Register dan instruksi tetap sedikit
- 6502 hanya memiliki 6 register
- 1 akumulator
- 2 register indeks
- register status
- register stack
- program counter
- Satu-satunya register 16-bit di 6502 adalah program counter
- Jumlah register yang sedikit memang menjadi batasan untuk menulis aplikasi nyata, tetapi membantu memahami peran dan cara kerja register
- Set instruksi asli 6502 hanya mencakup 56 instruksi
- Dengan kumpulan instruksi kecil ini pun, tipe-tipe instruksi utama bisa dipelajari
- load/store
- operasi logika
- operasi aritmetika
- percabangan
- Tipe-tipe ini masih ada dalam bentuk tertentu di CPU modern
- Pada x86-x64, menghitung jumlah register dan instruksi saja tidak mudah, dan set instruksi RISC modern seperti ARM pun sulit disebut kecil dan sederhana
- 6502 hanya memiliki 6 register
Ekosistem nyata dan pilihan lain
-
Ekosistem yang tua tetapi masih hidup
- 6502 diperkenalkan oleh MOS Technology pada pertengahan 1970-an sebagai versi Motorola 6800 yang lebih murah dan disederhanakan
- Tim yang sama sebelumnya mengembangkan Motorola 6800
- Setelah itu, 6502 cepat populer dan digunakan di berbagai mikrokomputer terkenal
- Apple II
- Commodore VIC 20
- Commodore 64
- BBC micro
- Emulator untuk perangkat-perangkat ini mudah ditemukan, dan sebagian juga memiliki perangkat replikasi modern
- Produk penerus 6502 masih diproduksi pada saat tulisan ini dibuat, dan perangkat baru seperti Neo6502 dari Olimex juga menjalankan keluarga 6502
- Materi belajar gratis banyak tersedia di internet, dan sebagian besar bisa ditemukan di 6502.org
- 6502 diperkenalkan oleh MOS Technology pada pertengahan 1970-an sebagai versi Motorola 6800 yang lebih murah dan disederhanakan
-
Materi belajar yang bisa langsung dipraktikkan
- Easy 6502 adalah buku elektronik karya Nick Morgan, cocok untuk pembelajar yang ingin mencoba 6502 secara singkat
- Selain teks dan gambar, materi ini mencakup assembler dan simulator 6502 yang ditulis dalam JavaScript
- Anda bisa langsung menulis kode assembly 6502 sederhana di halaman web
- Visual6502.org lebih merupakan materi yang memperlihatkan kesederhanaan 6502 secara visual daripada alat belajar assembly
-
Perbedaan dengan kandidat pemula lain
- CPU virtual yang dibuat untuk pendidikan dapat memiliki set instruksi yang bersih dan “sempurna”, tetapi sulit memiliki materi belajar dan komunitas sekaya 6502
- CPU retro seperti Z80, 6809, dan 68000 juga merupakan pilihan yang baik
- Ketiga CPU tersebut dinilai lebih baik daripada 6502 untuk pemrograman serius
- Namun untuk mempelajari konsep dasar, kesederhanaan 6502 lebih menguntungkan
- Z80 memiliki jauh lebih banyak register daripada 6502 dan juga memiliki set register alternatif, sehingga kurang mudah untuk memulai
- Arsitektur RISC modern seperti ARM, MIPS, dan RISC-V pada suatu titik adalah hal yang harus dipelajari oleh programmer assembly yang serius
- Namun, sebagai pengantar, arsitektur-arsitektur ini tidak ideal
- Kesederhanaannya lebih terkait dengan implementasi internal chip daripada set instruksi
- Kebanyakan mikroprosesor modern diprogram dengan bahasa tingkat tinggi, dan pengalaman menulis instruksi assembly langsung bukan prioritas tinggi dalam desain CPU
- Untuk memuat konstanta 64-bit ke register di ARM64, mungkin diperlukan 4 instruksi termasuk bit shift
- Proses memuat konstanta ke register di 6502 jauh lebih sederhana dibanding itu
- x86-x64 bisa dianggap sebagai set instruksi paling populer di desktop dan server modern, sementara ARM sedang mengejar
- Karena tidak dibatasi ukuran 32-bit dan memiliki instruksi kaya dengan jumlah operand variabel, dalam beberapa hal coding di x86-x64 bisa lebih mudah daripada ARM
- Namun bagi pemula, x86-x64 tetap sangat kompleks, dan sejarah 40 tahun tidak membuat x86-x64 menjadi lebih sederhana
1 komentar
Pendapat Hacker News
Sulit untuk setuju bahwa kesederhanaan 6502 lebih baik daripada 68000
68000 memang punya lebih banyak register dan lebar tipe data yang lebih besar, tetapi strukturnya seragam. Pada dasarnya ada dua jenis, A dan D, yang berulang sebagai D0~D7 dan A0~A7, jadi apa yang bisa dilakukan di D0 juga bisa dilakukan di D3. Kesederhanaan struktur harus diseimbangkan dengan kesederhanaan pemrograman, dan pada 6502, begitu menulis program yang sedikit saja rumit, kita terus terbentur batasan
Cara terbaik untuk belajar mengakali keterbatasan mesin kecil justru adalah dengan mengabaikan keterbatasan itu dan menjadi insinyur perangkat lunak yang terampil. Jika masih pemula, lebih baik mulai dari sisi yang memiliki lebih banyak mode pengalamatan, lebih mudah menangani array besar, serta register dan lebar integer yang lebih lapang
Ada klaim bahwa 6502 sederhana karena punya 6 register, tetapi setelah menyentuh 6502 selama seminggu saja, kita akan tahu bahwa pada dasarnya kita berurusan dengan tiga register. Karena itu juga muncul julukan CPU semaphore
6502 itu menyenangkan dan rapi, tetapi tidak cocok jika menginginkan pendekatan modern. Jika ingin mengikuti jalan kejayaan gaya 90-an, lebih baik mulai dari MIPS, atau langsung mulai dengan Neon. Z80 pun, jika melihat register dan kompleksitasnya, masih bisa dianggap lebih mirip dengan hal-hal yang ditemui hari ini
Assembly modern sendiri pada dasarnya tidak rumit. Jika mulai dari FASM, itu tidak sulit, tetapi pendekatan level rendah selalu cepat menjadi kompleks. Lalu kita mulai membuat makro, dan pada akhirnya menumpuk sesuatu yang mirip C versi miskin buatan sendiri
Keunggulan sistem kecil adalah kita bisa memahami semuanya secara menyeluruh, mulai dari silikon, sistem operasi, hingga perangkat lunak
6809 lebih sederhana daripada 68K, lebih kuat daripada 6502, dan ortogonalitasnya bagus, tetapi tidak memiliki basis perangkat lunak pada tingkat yang sama. Menurut saya Motorola mengambil arah yang cukup baik pada set instruksi 6809 dan 68K serta arsitektur dari sudut pandang programmer. Saya ingat PDP-11/VAX dan NS32K juga cukup ortogonal dengan cara serupa
Jika memikirkan platform yang lebih modern, ada argumen kuat untuk mengajarkan RISC-V daripada MC68k. Jika hanya melihat set instruksi integer dasarnya, RISC-V sangat sederhana dan elegan, sekaligus mirip dengan arsitektur modern seperti ARM, Aarch-64, dan MIPS. Ada varian 32-bit maupun 64-bit, dan dokumentasi resminya juga mudah diakses
MC68k punya terlalu banyak kekhasan yang tidak terlalu relevan hari ini. Keunggulannya mungkin sebatas pernah dipakai di berbagai platform perangkat keras dan masih punya komunitas retro yang aktif, tetapi itu lebih merupakan faktor menarik daripada relevansi nyata
68020 hampir mendekati batas maksimal bagaimana arsitektur set instruksi bisa menjadi dekat dengan C, dan pengalaman memakainya sangat bagus
Namun, memakai 65XX pada komputer Commodore awal sangat memuaskan. Karena tidak ada proteksi memori, kita bisa langsung mengubah memori video, mengutak-atik sprite, font, border, dan interrupt, serta menulis kode yang memodifikasi dirinya sendiri. Assembly 68000 di Amiga adalah lingkungan yang lebih aman dan terkendali
Menurut saya, 6502 bukan pilihan yang baik sebagai set instruksi pertama untuk belajar assembly. Anda akan menghabiskan banyak waktu berurusan dengan keunikan arsitektur yang cerdik tetapi punya cacat mendalam.
Idiom-idiom workaround itu tidak banyak terbawa dengan baik ke arsitektur yang lebih baik, yang tidak terikat oleh keterbatasan alat dan anggaran MOS saat itu.
Jika ingin mempelajari set instruksi yang kecil tetapi kuat dan punya sedikit keunikan, ARM v6M lebih baik. Sampai sekarang masih diproduksi secara bermakna, dan dukungan debugger, compiler, assembler, serta linker di toolchain open source modern juga bagus.
Jika Anda mengutamakan keterbukaan arsitektur dan bisa menerima platform yang masih kurang matang, pilihlah MCU RISC-V. Kalau tidak bisa memutuskan, pilih RP2350.
Set instruksi ARMv6M kecil, dan untuk memuat konstanta pun, jika memakai load relatif PC seperti yang didokumentasikan, tidak perlu rangkaian instruksi yang panjang dan membosankan. Tidak perlu kode yang memodifikasi dirinya sendiri atau mengindeks memori lewat zero page, dan lebar register sama dengan ruang alamat. Karena 32-bit, justru lebih mudah dipelajari dan diajarkan dibanding kebanyakan set instruksi 8/16-bit. Kalau terdengar membosankan, tidak perlu khawatir. ARMv6 juga punya cukup banyak keunikan untuk code golf.
Saya mulai dengan assembly PIC16 dan pernah sedikit menyentuh beberapa arsitektur, tetapi dari sisi kerapian, MIPS32 adalah yang paling saya sukai.
Sebagai tambahan kecil, 6502 baru, MCU core 6502, dan chip periferal buatan Western Design Center masih bisa dibeli. Tempat seperti Mouser juga menjualnya.
https://www.mouser.com/c/?m=Western%20Design%20Center%20%28W...
Sekadar mengalikan dua angka 16-bit saja membutuhkan segumpal kode. Tidak terlihat berguna jika programmer baru harus bergulat dengan hal seperti ini.
Seperti yang dikatakan, set instruksi ARM awal adalah pilihan yang baik.
Tentu ini masalah yang muncul di banyak bahasa assembly, tetapi untuk awal, saya ingin memulai dari set instruksi yang tidak punya masalah seperti ini.
[1] https://youtube.com/playlist?list=PLowKtXNTBypFbtuVMUVXNR0z1...
Sebagai seseorang yang telah mengajar assembly kepada mahasiswa sarjana selama beberapa tahun, saya setuju bahwa 6502 bagus untuk pemula. Namun alasannya bukan semata-mata keunggulan bahasa 6502 itu sendiri.
Saya pernah mengajar 68K, MIPS, ARM, x86, dan lainnya; alasan terbesar respons mahasiswa bagus saat mengajar 6502 adalah konteks di sekitar CPU-nya. Dengan 6502, kami memprogram mesin nyata yang mudah dipahami, yaitu Nintendo Entertainment System.
I/O memory-mapped dasar, tanpa sistem operasi, tanpa instruksi pipeline, tanpa delay slot, tanpa jaringan, tanpa noise yang tidak perlu. Hampir seperti kotak sederhana yang di dalamnya ada clock, CPU, beberapa alamat memori, chip pendukung, dan I/O yang dipetakan ke alamat memori. 6502 bukan set instruksi paling sederhana, tetapi kesederhanaan sistem ini sangat membantu.
Keterbatasan 6502 juga penting agar mahasiswa memahami mengapa instruksinya berbentuk seperti itu. CPU dirancang dan dirangkai dalam batasan masa itu, dan hal tersebut tercermin dalam cara pemrogramannya.
Memilih 6502 dan NES untuk pendidikan pemula terbukti sukses. Bukan karena 6502 itu sendiri, melainkan karena 6502 memaksa sistem yang memindahkan bit menjadi sederhana.
Setelah mahasiswa menyentuh 6502 dan melihat tile NES bergerak di layar, mudah untuk berkembang secara alami ke bagaimana 68000 menangani hal secara berbeda, bagaimana MIPS muncul, bagaimana pipelining dan delay slot dimanfaatkan, serta bagaimana membandingkan perbedaan RISC dan CISC. Jika fondasinya ada, perkembangan berikutnya menjadi sangat sederhana.
Jika bukan untuk mempelajari set instruksi yang masih dipakai saat ini, agak mengejutkan bahwa assembler PDP-11 hampir tidak pernah disebut sebagai titik awal yang baik.
Mungkin karena PDP-11 adalah yang pertama benar-benar saya pelajari, tetapi mikroprosesor awal semuanya terasa seperti satu langkah mundur. Saya memang memakai assembly Z80 selama beberapa tahun, tetapi sekarang tidak akan merekomendasikannya. Set instruksinya tidak ortogonal, dan 6502 punya terlalu sedikit register sehingga sulit memberi rasa yang tepat tentang menulis assembly.
Jika Anda menyukai PDP-11, di MSP430 Anda bisa mendapatkan keunggulan serupa dalam bentuk yang sedikit terbatas, dan di 68000 dalam bentuk yang sedikit diperkuat.
Namun sebenarnya yang terbaik adalah melupakan artefak semacam itu dan belajar RISC-V. Atau pilih salah satu dari berbagai varian Arm. Secara pribadi, saya punya keterikatan emosional dengan ARM7TDMI yang banyak saya gunakan pada pertengahan 2000-an. Mode Thumb mungkin sedikit lebih mudah dipelajari daripada mode Arm asli, tetapi keduanya tidak sememuaskan RISC-V.
Bisa saja orang berargumen bahwa mode pengalamatannya secara konseptual lebih rumit daripada RISC, tetapi dalam praktiknya mode pengalamatan 6502 kemungkinan besar lebih sulit dipahami daripada PDP-11.
Namun DEC mengabaikan peluang itu, dan IBM mengambil posisi tersebut dengan set instruksi 8086 yang kaku.
Sekarang tidak ada lagi tujuan untuk mempelajari -11.
Saya tidak begitu paham bagaimana bisa sampai pada kesimpulan seperti itu. Saat siswa pertama kali mengenal pemrograman komputer, masuk akal untuk memulai dengan bahasa mainan/kecil yang tidak punya kegunaan nyata. Namun assembly seharusnya bukan bahasa pertama yang dipelajari
Assembly adalah alat yang sangat praktis, dan biasanya banyak dipakai untuk debugging serta reverse engineering. Lalu mengapa harus menghabiskan waktu untuk assembly dari platform yang sudah lama hilang?
Cara terbaik mempelajari assembly adalah bereksperimen. Tulis kode dengan bahasa favorit, lalu lihat keluaran assembly perantaranya, atau intip bagian dalamnya dengan objdump atau gdb. Anda juga bisa mengubahnya dan melihat apa yang terjadi
Bisa juga memakai emulator komputer lama, tetapi itu lebih sulit. Bahkan untuk menampilkan satu teks di layar, Anda harus mempelajari arsitektur komputer itu, perangkat kerasnya, hingga fungsi ROM-nya, dan pengetahuan ini hampir tidak berlaku untuk Linux atau Windows di x86-64
Bagi pemula total, konsep seperti pointer terlalu abstrak dan sulit dipahami, tetapi setelah belajar pengalamatan tidak langsung di assembly, tiba-tiba menjadi jelas mengapa C memiliki pointer dan bagaimana cara kerjanya
Sebelumnya saya terutama memakai Python, yang jauh lebih diabstraksikan. Orang sering lupa bahwa fitur seperti pointer ada karena keterbatasan perangkat keras dan performa. Jika tidak tahu apa yang sebenarnya dilakukan CPU di dalamnya dan mengapa, pemahaman intuitif akan terbatas
Sejak SMA saya tidak pernah menulis satu baris assembly pun, tetapi berkat pemahaman dasar tentang bagaimana operasi dieksekusi dan bagaimana register bekerja, saya jauh lebih mudah memahami alasan, syarat, dan pengecualian dalam pemrograman serta optimasi. Saya juga jadi lebih menghargai kode yang rapi dan efisien
Jika ingin sedikit merasakan masa lalu, ada di sini
https://www.atariarchives.org/
Karena saya belajar elektronika, saya secara alami mulai dari assembly (Motorola HC11). Menjelang akhir kursus, semua orang secara mandiri membuat macro untuk hal-hal seperti for loop, dan dari sana perpindahan ke C terasa alami. Di akhir kursus C, pemrograman berorientasi objek ala C juga muncul secara alami, lalu berlanjut ke kursus C++ berikutnya
Kekurangan pendekatan ini adalah tidak ada jalur bertahap menuju paradigma fungsional atau paradigma non-imperatif pada umumnya. Selain itu, muncul kebiasaan untuk terus memikirkan bagaimana bahasa bekerja di dalam, dan kadang itu bisa kontraproduktif. Bahkan ketika mencoba belajar Haskell, kepala saya lebih dulu bergerak untuk memahami bagaimana interpreter-nya bekerja
Belajar assembly bukan hanya belajar bahasanya, tetapi juga memahami bagaimana mesin bekerja, seperti bus, memory-mapped peripheral, dan sebagainya. Pada platform lama, bagian ini jauh lebih sederhana. Jadi meskipun instruksi ARM mungkin lebih mudah dipelajari daripada instruksi CISC milik HC11, semua hal lainnya lebih ramah bagi pemula di HC11
-vasm, assembly yang dihasilkan akan ditampilkan selama proses kompilasi. Ada juga yang menilai fitur ini tidak terlalu bagus dengan alasan objdump atau-Ssudah cukup, tetapi kalau mencobanya langsung, Anda akan tahu mengapa ini nyaman. Sebab yang langsung dicetak hanyalah assembly, tanpa boilerplate besar untuk membuat object fileMisalnya, saya sedang mengerjakan code generator AArch64, lebih spesifik lagi pembuatan kode floating-point, dan ada fungsi seperti ini
float test(float a, float b) { return a * b; }Jika dikompilasi dengan
dmd -c test.c -arm -vasm, yang keluar adalah alamat, instruksi heksadesimal, mnemonic instruksi, dan URL spesifikasi instruksiSaya tahu kodenya belum sepenuhnya benar. Sudah saya bilang masih dikerjakan :-)
Bagi saya, set instruksi 6502 adalah bahasa assembly pertama yang bagus
Pada 1977 saya tinggal di sebuah pondok kecil di Oregon, dan karena bosan saya membeli Apple II. Dalam setahun, saya mengerjakan program yang kemudian menjadi Apple Writer, dan semuanya ditulis dalam assembly
https://en.wikipedia.org/wiki/Apple_Writer
Di sini dikatakan assembly 6502 cukup kasar dan sulit ditulis, dan kalau melihat ke belakang saya setuju. Namun pada 1977, saya tidak punya pembanding
Karena Apple II tidak memiliki bahasa tingkat tinggi yang cepat, program kecil saya menjadi produk Apple berkat kurangnya alternatif
Kalau dipikir-pikir, Apple Writer muat dalam 8KB RAM, tetapi benar-benar melakukan pekerjaan. Bahkan ada bahasa macro yang dipakai orang untuk mengolah daftar alamat
Baru-baru ini saya menaikkan sistem utama saya menjadi 96GB RAM agar lebih mudah menjalankan DeepSeek secara lokal, dan saya juga punya RTX 4090. Tiba-tiba saya sadar bahwa dengan RAM ini, hampir 12 juta Apple Writer bisa dimuat di dalamnya
Rasanya cukup surealis, tetapi sejak 1977 saya sudah beberapa kali punya alasan untuk mengatakan hal seperti ini
Untuk bahasa assembly pemula, saya lebih menyukai RISC-V. Desainnya bagus dan lebih intuitif, ada dukungan bahasa serta alat modern seperti GCC, LLVM, dan Rust, serta berjalan di QEMU dan hardware yang benar-benar bisa dibeli
Bahkan bisa berjalan pada 14MHz
Tema tentang kesederhanaan set instruksi 6502 secara pribadi terasa mengganggu bagi saya. Orang yang menganggap kesederhanaan seperti itu bagus tampaknya belum pernah melangkah lebih jauh dari Hello World
Memprogram sesuatu dengan tingkat kompleksitas menengah di 6502 itu sulit. 8-bit terlalu terbatas; lihat saja, misalnya, pengalamatan layar pada Commodore 64. Perkalian dan pembagian harus diimplementasikan sendiri, dan penjumlahan/pengurangan 16-bit memang sederhana, tetapi sama sekali tidak sepele jika ingin efisien
Jika tujuannya mempelajari assembly dasar, platform 8086+DOS jauh lebih mudah ditangani sebagai perbandingan
Menerjemahkan berbagai algoritma perkalian dan pembagian ke assembly adalah cara yang sangat baik untuk belajar
Lagi pula, kalau yang dipelajari adalah sesuatu yang tidak relevan dengan masa kini dan bukan x86-64, RISC-V, atau ARM, saya kurang paham apa keunggulan 8086
Saya menikmati setiap momennya, dan register segmen juga tidak terlalu mengganggu
Saya bersekolah di sekolah teknik yang berfokus pada ilmu komputer, dan seorang profesor informatika yang menyukai retro serta senang memamerkan mesin arkadenya sendiri memilih berfokus pada 6502 alih-alih assembly 8808 yang ada di rencana pelajaran resmi
Jujur, itu salah satu pengalaman belajar terbaik dalam hidup saya, dan saya tidak berharap caranya berbeda. Ia bahkan membuat kami merakit komputer breadboard Ben Eater, sehingga nuansa praktik langsungnya sangat kuat dan benar-benar menarik
Pertama kali saya bersentuhan dengan bahasa assembly adalah PDP-10, dan yang saya punya hanya manual prosesor DEC-10
Saya benar-benar bingung. Instruksinya ada ratusan dan penjelasannya tidak jelas. Saya sama sekali tidak tahu apa itu register, akumulator, alamat, atau stack. David Rolfe menuliskan beberapa subrutin yang saya perlukan untuk versi Fortran dari Empire, dan itu sedikit membantu, tetapi saya tetap tersesat
Suatu hari saya bertanya kepada teman saya Shal Farley apa itu stack, dan ia menjawab, “Bayangkan tumpukan piring. Kamu menaruh satu piring di atasnya (push), lalu mengambil satu piring (pop).” Saat itu juga seperti ada lampu menyala dan saya langsung mengerti
Setelah itu saya mulai menangani mikroprosesor 6800 di sebuah board kecil. Instruksinya sekitar 40 dan semuanya muat di satu kartu. 40 instruksi itu mudah dipelajari, dan tiba-tiba semuanya menjadi jelas
Ketika kembali ke manual -10, semua isinya mulai masuk akal