Domande sulla sequenza di comandi DEC ANSI; movimento del cursore


8

Quindi sto scrivendo un'emulazione terminale (lo so, dovrei solo compilare il mastice, ecc.) E sono nella fase di sfogliare vttest per assicurarmi che sia giusto. Lo sto basando sul VT102 per ora, ma aggiungerò in seguito funzionalità terminali come il colore quando le basi funzionano correttamente.

Il set di comandi è principalmente ANSI. DEC aveva il proprio set di comandi ma supportava i comandi ANSI dal 1973 circa. Questi standard ANSI non sono apparentemente disponibili ora ma gli equivalenti ECMA sono, li ho (ECMA-48 sembra più rilevante) ma non risponde a questa domanda per quanto posso vedere. La maggior parte delle sequenze di comandi ANSI iniziano con ESC. Molti comandi iniziano con l'identificatore della sequenza comandi mostrato qui come CSI e rappresentato nei dati come 0x1c 0x5b (ESC [) o 0xdb se era possibile la comunicazione a 8 bit. Quindi ha seguito una sequenza che identifica il comando. Alcuni comandi influenzano la posizione del cursore, altri lo schermo, altri provocano una risposta all'host e così via.

Alcuni comandi del terminale includono un argomento numerico. Esempio CSI 10 ; 5 Hsignifica rendere la posizione del cursore riga 10, colonna 5. Quando manca l'argomento numerico, esiste un valore predefinito da usare: CSI 10 ; Hsignifica rendere la posizione del cursore riga 10, colonna 1 perché 1 è il valore predefinito quando non viene fornito un argomento.

Ho il manuale di vt102 da vt100.net (ottima risorsa) e circa una dozzina di pagine che forniscono informazioni parziali su queste sequenze di comandi. Apparentemente, le specifiche complete del terminale DEC del Vangelo non sono mai state ricavate da DEC.

Ciò che è chiaro è che CSI Csi sposta il cursore a destra e che il valore predefinito è 1.

Ciò che non è chiaro è il significato di CSI 0 C.

Perché avere uno zero lì, sembra che il comando non faccia nulla? Se significa "usa il valore predefinito", avrebbe potuto invece essere inviato come 1, ma la stringa più breve non avrebbe argomenti e si baserebbe sul valore predefinito interpretato comunque come 1. Questi terminali VT fisici reali venivano spesso usati a 300 baud e al di sotto quindi l'unico personaggio contava!

Non sono così avanzato con vttest che posso solo provarlo in entrambi i modi e vedere quale rende tutto perfetto, ma sono abbastanza lontano che piccole domande come questa stanno iniziando a importare.


2
Nota terminologica: CSI è escape- [, che può essere codificato sia come sequenza di due caratteri ESC [, sia come [con l'ottavo bit impostato. (Alcuni modelli potrebbero supportare solo ESC [) Non so che cosa ha CSI 0 Cfatto sul vt102; su xterm è equivalente a CSI 1 C. Ho il sospetto, ma non so per certo, che 0 e l'assenza di un valore vengono analizzati in modo identico ad un certo punto (pensa atoi). Hai cercato commenti nella fonte xterm?
Gilles 'SO- smetti di essere malvagio' il

Assolutamente corretto, grazie per la modifica, e mi aspetto che avrò bisogno di cercare qualche fonte per avere qualche indizio in più.
Adam Eberbach,

Risposte:


4

Mi sono messo in contatto con Thomas Dickey (invisible-island.net) che mantiene xterm e vttest - ha spiegato che CSI 0 Cè lo stesso CSI 1 Co CSI Cin xterm.

Per chiunque sia alla ricerca di maggiori informazioni sulla programmazione dei terminali, consiglio vivamente di controllare la fonte xterm che ospita, in particolare il ctlseqs.txt all'interno di xterm, che assomiglia molto all'unico vero riferimento alle sequenze di controllo dei terminali che stavo cercando.


Questo file sorgente mi è stato utile per scoprire qual è il codice CSI; le informazioni sul CSI rappresentate come byte 0x9b dal ctlseqs.txt menzionato sembrano essere errate, in realtà sono 0x1b
Hi-Angel

1

Perché la compatibilità hardcode per un tipo di terminale specifico quando si dispone già di un database che associa la funzionalità a sequenze di codici specifici per molti terminali diversi? (il database terminfo è di solito in / usr / share ed è incluso nella maggior parte delle distribuzioni di ncurses). Qualsiasi risorsa sulle maledizioni dovrebbe spiegare il modo in cui queste funzioni sono etichettate.

Si noti che i file terminfo sono generalmente compilati (usando tic) quindi potrebbe essere necessario scavare un po 'per trovare i file sorgente terminfo.

Vedi anche http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16 (c'è un link nel loro a un repository di file terminfo.src)


Il dispositivo su cui sto mettendo il terminale non ha terminfo o ncurses e scrivere un'emulazione di terminale specifica sembra essere il modo migliore per far funzionare netback su di esso. Esistono già nethack per iPad, ma voglio solo essere in grado di giocarlo con una tastiera in modalità DECgraphics piuttosto che con qualsiasi interfaccia grafica con schema di controllo touch come tutti sembrano avere. Non mi aspetto che questo incendi il mondo, ma è il modo in cui voglio giocare a nethack.
Adam Eberbach,

1
No - Non sto dicendo che ci dovrebbe essere una voce in terminfo per il tuo hardware - Ci sarà una voce per un VT102 sebbene descriva tutte le sequenze di comandi che nethack o qualsiasi altra applicazione basata su maledizioni utilizzerà.
symcbean,

Ah, grazie - sarebbe un buon riferimento compatto.
Adam Eberbach,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.