Pertanyaan urutan perintah DEC ANSI; pergerakan kursor

8

Jadi saya menulis emulasi terminal (saya tahu, saya harus mengkompilasi dempul, dll.) Dan saya pada tahap melompati vttest untuk memastikan itu benar. Saya mendasarkannya pada VT102 untuk saat ini tetapi akan menambahkan fitur terminal nantinya seperti warna ketika dasar-dasarnya bekerja dengan benar.

Set perintah sebagian besar ANSI. DEC memiliki set perintah mereka sendiri tetapi mendukung perintah ANSI dari sekitar tahun 1973. Standar-standar ANSI itu tampaknya tidak tersedia sekarang tetapi ekuivalen ECMA adalah, saya memilikinya (ECMA-48 tampaknya paling relevan) tetapi tidak menjawab pertanyaan ini sejauh saya bisa melihat. Sebagian besar urutan perintah ANSI dimulai dengan ESC. Banyak perintah dimulai dengan pengidentifikasi urutan perintah yang ditampilkan di sini sebagai CSI dan direpresentasikan dalam data sebagai 0x1c 0x5b (ESC [), atau 0xdb jika komunikasi 8-bit dimungkinkan. Kemudian mengikuti urutan yang mengidentifikasi perintah. Beberapa perintah mempengaruhi posisi kursor, beberapa layar, beberapa memprovokasi respons ke tuan rumah dan sebagainya.

Beberapa perintah terminal termasuk argumen numerik. Contoh CSI 10 ; 5 Hberarti membuat posisi kursor baris 10, kolom 5. Ketika argumen numerik hilang ada nilai default untuk digunakan: CSI 10 ; Hberarti membuat posisi kursor baris 10, kolom 1 karena 1 adalah nilai default ketika argumen tidak diberikan.

Saya memiliki manual vt102 dari vt100.net (sumber yang bagus) dan sekitar selusin halaman memberikan informasi parsial tentang urutan perintah ini. Tampaknya spec terminal DEC Injil yang lengkap tidak pernah keluar dari DEC.

Yang jelas adalah CSI Cmemindahkan kursor ke kanan dan nilai defaultnya adalah 1.

Apa yang tidak jelas adalah apa artinya CSI 0 C.

Mengapa ada nol di sana, sepertinya membuat perintah tidak melakukan apa-apa? Jika itu berarti "gunakan nilai default" maka itu bisa dikirim sebagai 1 sebagai gantinya, tetapi string yang lebih pendek tidak memiliki argumen dan mengandalkan nilai default yang ditafsirkan sebagai 1. Terminal VT fisik yang sebenarnya sering digunakan pada 300 baud dan di bawah sehingga karakter yang satu itu penting!

Saya tidak begitu mahir dengan vttest sehingga saya bisa mencoba keduanya dan melihat mana yang membuat semuanya sempurna tetapi saya cukup jauh sehingga pertanyaan kecil seperti ini mulai menjadi masalah.

Adam Eberbach
sumber
2
Catatan terminologi: CSI adalah escape- [, yang dapat disandikan sebagai urutan dua karakter ESC [, atau seperti [yang diatur pada bit ke-8. (Beberapa model mungkin hanya mendukung ESC [) Saya tidak tahu apa yang CSI 0 Cterjadi pada vt102; pada xterm sama dengan CSI 1 C. Saya curiga, tetapi tidak tahu pasti, bahwa 0 dan tidak adanya nilai diuraikan secara identik di beberapa titik (pikirkan atoi). Apakah Anda mencari komentar di sumber xterm?
Gilles 'SO- stop being evil'
Benar sekali, terima kasih untuk hasil editnya, dan berharap saya perlu melihat beberapa sumber untuk mendapatkan petunjuk lebih lanjut.
Adam Eberbach

Jawaban:

4

Saya menghubungi Thomas Dickey (invisible-island.net) yang mengelola xterm dan vttest - ia menjelaskan bahwa CSI 0 Citu sama dengan CSI 1 Catau CSI Cdi xterm.

Bagi siapa pun yang mencari informasi lebih lanjut tentang pemrograman terminal, saya sangat merekomendasikan untuk memeriksa sumber xterm yang dihostingnya - khususnya ctlseqs.txt di dalam xterm, yang sangat mirip dengan referensi sekuens kontrol terminal yang benar yang telah saya cari.

Adam Eberbach
sumber
File sumber ini berguna bagi saya untuk menemukan apa kode CSI itu; informasi tentang CSI yang direpresentasikan sebagai byte 0x9b dari ctlseqs.txt yang disebutkan tampaknya salah, sebenarnya 0x1b
Hi-Angel
1

Mengapa kompatibilitas hardcode untuk jenis terminal tertentu ketika Anda sudah memiliki database yang memetakan fungsionalitas ke urutan kode spesifik untuk banyak terminal yang berbeda? (basis data terminfo biasanya di / usr / share dan termasuk dalam sebagian besar distribusi ncurses). Sumber daya apa pun tentang kutukan harus menjelaskan cara fungsi-fungsi ini diberi label.

Perhatikan bahwa file terminfo biasanya dikompilasi (menggunakan tic) sehingga Anda mungkin harus menggali sedikit untuk menemukan file source terminfo.

Lihat juga http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16 (ada tautan di dalamnya ke satu repositori file terminfo.src)

symcbean
sumber
Perangkat tempat saya meletakkan terminal tidak memiliki terminfo atau ncurses, dan menulis emulasi terminal spesifik tampaknya menjadi cara terbaik untuk mendapatkan netback untuk dijalankan di atasnya. Sudah ada nethack untuk iPad tapi saya hanya ingin bisa memainkannya dengan keyboard dalam mode DECgraphics daripada GUI dengan skema kontrol sentuh seperti yang tampaknya dimiliki semuanya. Saya tidak berharap ini akan membakar dunia tetapi itulah cara saya ingin bermain nethack.
Adam Eberbach
1
Tidak - Saya tidak mengatakan harus ada entri dalam terminfo untuk perangkat keras Anda - akan ada entri untuk VT102 meskipun menggambarkan semua urutan perintah yang nethack atau aplikasi berbasis kutukan lainnya akan digunakan.
symcbean
Ah, terima kasih - itu akan menjadi referensi ringkas yang bagus.
Adam Eberbach