Revisi Agon Light dan Revisi Platform Agon lainnya didasarkan pada prosesor Zilog eZ80. eZ80 memiliki ruang alamat 24 bit yang mendukung memori 16 megabyte, dibandingkan dengan 64 kilobyte pada Z80 asli. eZ80 memiliki dua mode operasi: mode Z80 standar, yang memiliki register 16-bit sehingga mudah untuk menangani 64k memori, namun memerlukan penggunaan "banking" untuk mengakses lebih dari 64k memori; dan mode operasi ADL (data alamat panjang), yang memperluas register hingga 24 bit, membuat seluruh ruang alamat mudah diakses.
Ketika kita mempertimbangkan bahasa pemrograman tingkat tinggi, ada sejumlah bahasa yang tersedia untuk Z80, namun terbatas pada memori 64k atau memiliki metode peralihan bank yang canggung untuk mengakses memori yang lebih besar.
Mengingat bahasa pemrograman C, ada sejumlah kompiler C Z80 yang tersedia. Hingga saat ini, komunitas Agon berfokus pada dua hal:
Lingkungan pengembangan Zilog ZDS II yang dapat menghasilkan kode ADL eZ80. Ini adalah seperangkat alat asli yang digunakan oleh pengembang Agon, tetapi merupakan sumber tertutup, hanya berjalan di Windows, dan hanya mendukung standar data C89
SDCC (kompiler C perangkat kecil) , pilihan populer untuk komputer 8-bit, dan mengadaptasinya untuk Agon telah menjadi fokus sejumlah orang di komputer Agon. Ini adalah kompiler yang bagus untuk Z80, tetapi hanya mendukung Z80 dan bukan mode ADL.
Sebagai alternatif, rantai alat CEdev C/C++ adalah kompiler sumber terbuka yang dapat menghasilkan kode ADL. Ini menargetkan kalkulator TI-84 Plus CE (berdasarkan prosesor eZ80) dan memiliki komunitas yang cukup besar. CEdev didasarkan pada versi eZ80 dari kompiler LLVM dan assembler fasmg. Ini menghasilkan kode ADL dengan pointer 24 bit, bilangan bulat 24 bit, panjang 32 bit, pendek 16 bit, dan float 32 bit. Ada juga perpustakaan yang cukup luas untuk program C dan C++ (meskipun belum sesuai dengan ISO...).
AgDev adalah hasil upaya memodifikasi CEdev untuk mengakomodasi rangkaian fitur dan desain perangkat keras Platform Agon. Hasilnya adalah toolchain yang lebih kuat dan berkemampuan C++, dibandingkan dengan opsi lain untuk Agon.
Unduh sendiri versi rilis atau buat dari sumbernya. Tempatkan build di direktori pilihan Anda.
Setelah itu pastikan folder /bin
dapat ditemukan di PATH
; jika Anda menggunakan Windows, ikuti panduan ini, atau Anda dapat menjalankan cedev.bat dan menjalankan perintah dari sana. Di Linux, jalankan export PATH=/<insert path here>/bin:$PATH
di jendela terminal.
Ini mengikuti pendekatan yang sama seperti CE Toolchain asli (lihat bagian bawah halaman memulai CEdev). Proses pembangunan telah dimodifikasi untuk berhenti pada pembuatan file .bin
. Ini adalah Agon Light yang dapat dieksekusi.
Saya sarankan untuk menggunakan:
membuat bersih membuat V = 1
Perintah make clean
dapat digunakan untuk menghapus hasil kompilasi sebelumnya dan dengan demikian memaksa kompilasi ulang.
Proses pembangunan melewati langkah-langkah berikut:
Kompilasi file sumber .c ke bitcode LLVM (.bc) menggunakan ez80-clang
Menautkan bitcode LLVM menggunakan ez80-link
. Ini termasuk pengoptimalan waktu tautan
Pembuatan kode perakitan eZ80 (.src) untuk program sumber menggunakan ez80-clang
Merakit dan menghubungkan kode perakitan yang dihasilkan (dari langkah 3) dengan perpustakaan dan run-time compiler menggunakan fasmg
- ini termasuk membangun executable yang ditargetkan pada lokasi memori tertentu. Ini adalah bagian utama dari proses pembangunan yang perlu disesuaikan.
Lihat catatan aplikasi Zilog "Memanggil C dari asm.pdf".
Hanya register dan tumpukan IX yang perlu dipertahankan dengan fungsi yang dipanggil.
Argumen didorong dari yang terakhir ke yang pertama sesuai dengan prototipe C. Di eZ80, 3 byte selalu dimasukkan ke tumpukan terlepas dari ukuran sebenarnya. Namun, fungsi perakitan harus berhati-hati untuk hanya menggunakan byte valid yang didorong. Misalnya, jika tipe pendek digunakan, byte atas dari nilai yang dimasukkan ke dalam tumpukan akan berisi data arbitrer. Tabel ini mencantumkan lokasi relatif terhadap sp dari dalam fungsi yang dipanggil. Perhatikan bahwa sp + [0,2]
berisi alamat pengirim.
Tipe C/C++ | Ukuran | Lokasi Tumpukan |
---|---|---|
arang | 1 byte | sp + [3] |
pendek | 2 byte | sp + [3,4] |
ke dalam | 3 byte | sp + [3,5] |
panjang | 4 byte | sp + [3,6] |
panjang sekali | 8 byte | sp + [3,10] |
mengambang | 4 byte | sp + [3,6] |
dobel | 4 byte | sp + [3,6] |
penunjuk | 3 byte | sp + [3,5] |
Perhatikan bahwa eZ80 adalah little endian - yaitu byte paling tidak signifikan disimpan terlebih dahulu.
Tabel ini mencantumkan register mana yang digunakan untuk mengembalikan nilai dari suatu fungsi. Tanda tipe tidak mempengaruhi register yang digunakan, namun dapat mempengaruhi nilai yang dikembalikan. LSB terletak di register di paling kanan ekspresi, misalnya E:UHL
menunjukkan register L
menyimpan LSB.
Tipe C/C++ | Daftar Kembali |
---|---|
arang | A |
pendek | Hl |
ke dalam | UHL |
panjang | E:UHL |
panjang sekali | SM:UDE:UHL |
mengambang | E:UHL |
dobel | E:UHL |
penunjuk | UHL |
Tidak sesuai ISO!
Terdiri dari berikut ini:
Berkas IO:
fopen()
, freopen(),
fclose()
fputc()
, fputs()
fgetc()
, ungetc()
, fgets()
feof()
, ferror()
, fflush()
fread()
, fwrite()
fseek()
, rewind()
, ftell()
clearerr()
remove()
Stdin / stdout IO:
putchar()
, puts()
getchar()
, gets_s()
Keluaran yang diformat
printf()
(dan vprintf()
)
sprintf()
(dan vsprintf()
)
snprintf()
(dan vsnprintf()
)
Masukan yang diformat
scanf()
sscanf()
Ada beberapa hal lain di sini - seperti stdint
dan semacamnya - tetapi sebagian besar harus sesuai dengan harapan untuk perpustakaan standar normal. Sebagian besar.
stdio
Dapat mengarahkan keluaran dengan menggunakan freopen()
pada stdout
atau stderr
:
putchar()
- keluaran ke outchar()
kecuali keluaran dialihkan, dalam hal ini keluaran ke fputc()
puts()
- panggilan putchar()
printf()
(dan vprintf()
) - memanggil npf_putc_std()
, yang memanggil putchar()
di nanoprintf.c
fputc()
- memanggil mos_fputc()
kecuali dipanggil di stdout
saat memanggil outchar()
- menghindari pemanggilan putchar()
sehingga tidak ada risiko loop panggilan fungsi
Dapat mengalihkan input dengan menggunakan freopen()
pada stdin
:
getchar()
- memanggil inchar()
untuk mendapatkan karakter dan outchar()
untuk menggemakan karakter (bahkan jika output telah dialihkan). Jika keluaran belum diarahkan ulang, panggil fgetc()
dan tidak menggemakan karakter tersebut.
gets_s()
- memanggil getchar()
jika input belum dialihkan (saluran diakhiri dengan CR). Panggilan fgets()
input telah dialihkan (saluran diakhiri dengan pasangan CR/LF).
scanf()
- memanggil getchar()
di uscan.c
(tidak perlu diperbarui)
fgetc()
- memanggil mos_fgetc()
kecuali dipanggil di stdin saat memanggil inchar()
dan menggema dengan outchar()
- menghindari pemanggilan getchar()
sehingga tidak ada risiko loop panggilan fungsi
Memerlukan FILE *
, yang merupakan penunjuk ke pegangan file yang dikembalikan oleh fopen
dan diteruskan ke rutinitas file IO untuk menunjukkan file tempat tindakan akan dilakukan.
File terkait lainnya:
stdio.h
- file header normal, yang mendefinisikan berbagai fungsi dan typedef untuk FILE
files.c
- membuat instance penyimpanan untuk pegangan file termasuk: stdout, stderr, stdin.
Pegangan file standar berikut ditentukan:
stdout
- keluaran bawaan
stderr
- keluaran default untuk pesan kesalahan
stdin
- masukan bawaan
MOS tidak mengimplementasikan pengalihan input/output, jadi secara default semuanya menggunakan konsol.
Dua opsi tersedia untuk pemrosesan baris perintah.
Ini secara otomatis disertakan jika fungsi utama didefinisikan sebagai
ke dalam utama( ke dalam argc, char* argv[] )
yang membagi baris perintah menggunakan spasi sebagai pembatas. Opsi baris perintah tersedia dalam array argv[]
seperti biasa.
Ini secara opsional disertakan jika makefile aplikasi mencakup:
LDHAS_ARG_PROCESSING = 1
Ini mendukung
Mengutip dengan tanda kutip ganda
Pengalihan masukan/keluaran
>out_file.txt
- mengalihkan stdout ke out_file.txt
, membuat file baru
>>out_file.txt
- mengalihkan stdout ke out_file.txt
, menambahkan ke akhir file
<in_file.txt
- mengalihkan stdin dari in_file.txt
Untuk dokumentasi terkini tentang perintah MOS, lihat Dokumentasi Agon Console8.
MOS (sistem operasi mesin) menyediakan antarmuka ke sistem file Agon dan beberapa periferal perangkat keras, seperti mouse. Itu menyimpan informasi tentang variabel sistem dalam struktur SYSVAR
besar yang dapat diakses di sisi Z80. Umumnya kode C Anda akan mendeklarasikan pointer ke struct ini, diinisialisasi seperti ini:
SYSVAR* sv yang mudah menguap statis; sv = vdp_vdu_init();
Untuk informasi lebih lanjut lihat <mos_api.h>
.
Untuk dokumentasi terkini tentang perintah VDU, lihat Dokumentasi Agon Console8.
VDP (pemroses tampilan video) menerima aliran teks dari MOS, bertindak seperti terminal teks/grafis. Aliran teks dapat berisi:
Teks biasa
Urutan / perintah escape untuk mengontrol tampilan dan mengirim perintah grafis/suara/dll
Ketika hasil dikembalikan oleh MOS sebagai hasil dari pengiriman perintah, hasil tersebut disimpan di SYSVAR
dan tidak dikembalikan secara langsung sebagai respons terhadap perintah. Responsnya tidak sinkron - untuk memeriksa apakah hasilnya telah dikembalikan:
Setel vdp_pflags
di SYSVAR
ke nol
Keluarkan perintah VDU
Tunggu hingga bit yang relevan di vdp_pflags
disetel - lihat <mos_api.h>
untuk bit mask
Perintah dapat dikirim melalui:
putch()
- karakter tunggal (ini bukan bagian dari perpustakaan standar C)
mos_puts()
- string multi-karakter
Kedua output ini langsung ke MOS/VDP - perhatikan bahwa keduanya bukan bagian dari perpustakaan STDIO dan tidak tunduk pada terjemahan atau pengalihan CR/LF.
Fungsi kemudahan untuk banyak perintah VDU disediakan di AgDev. Misalnya, untuk mengubah MODE layar ke 3, C memanggil vdp_mode(3);
akan mengirimkan 22,3
sebagai byte tunggal ke output, setara dengan putch(22); putch(3);
Untuk daftar fungsi-fungsi ini lihat <vdp_vdu.h>
. Fungsi tambahan terkait penanganan keyboard dapat ditemukan di <vdp_key.h>
.