Preguntas de secuencia de comandos DEC ANSI; movimiento del cursor

8

Así que estoy escribiendo una emulación de terminal (lo sé, debería compilar masilla, etc.) y estoy en la etapa de avanzar más rápido para asegurarme de que sea correcto. Lo estoy basando en el VT102 por ahora, pero agregaré características de terminal posteriores, como el color, cuando lo básico funcione correctamente.

El conjunto de comandos es principalmente ANSI. DEC tenía su propio conjunto de comandos, pero era compatible con los comandos ANSI de alrededor de 1973. Esos estándares ANSI aparentemente no están disponibles ahora, pero los equivalentes de ECMA sí, los tengo (ECMA-48 parece más relevante) pero no responde esta pregunta hasta donde yo puede ver. La mayoría de las secuencias de comandos ANSI comienzan con ESC. Muchos comandos comienzan con el identificador de secuencia de comandos que se muestra aquí como CSI y se representa en los datos como 0x1c 0x5b (ESC [) o 0xdb si era posible la comunicación de 8 bits. Luego siguió una secuencia que identifica el comando. Algunos comandos afectan la posición del cursor, otros la pantalla, otros provocan una respuesta al host, etc.

Algunos comandos de terminal incluyen un argumento numérico. Ejemplo CSI 10 ; 5 Hsignifica hacer que la posición del cursor sea la fila 10, columna 5. Cuando falta el argumento numérico, debe usarse un valor predeterminado: CSI 10 ; Hsignifica hacer que la posición del cursor sea la fila 10, columna 1 porque 1 es el valor predeterminado cuando no se proporciona un argumento.

Tengo el manual vt102 de vt100.net (excelente recurso) y alrededor de una docena de páginas que brindan información parcial sobre estas secuencias de comandos. Aparentemente, la especificación completa de la terminal DEC gospel nunca salió de DEC.

Lo que está claro es que CSI Ces mover el cursor hacia la derecha y que el valor predeterminado es 1.

Lo que no está claro es cuál es el significado de CSI 0 C.

¿Por qué tener un cero allí, parece que el comando no hace nada? Si significa "usar el valor predeterminado", entonces podría haberse enviado como 1, pero la cadena más corta no tendría ningún argumento y se basaría en que el valor predeterminado se interprete como 1 de todos modos. ¡Estos terminales VT físicos reales a menudo se usaban a 300 baudios y menos, por lo que el único personaje importaba!

No estoy tan avanzado como para probarlo en ambos sentidos y ver qué hace que todo sea perfecto, pero estoy lo suficientemente lejos como para que pequeñas preguntas como esta empiecen a importar.

Adam Eberbach
fuente
2
Nota de terminología: CSI es escape [, que puede codificarse como la secuencia de dos caracteres ESC [o como [con el conjunto de 8 bits. (Algunos modelos solo pueden ser compatibles ESC [) No sé qué CSI 0 Chizo en el vt102; en xterm es equivalente a CSI 1 C. Sospecho, pero no estoy seguro, que 0 y la ausencia de un valor se analizan de forma idéntica en algún momento (piense atoi). ¿Buscó comentarios en la fuente xterm?
Gilles 'SO- deja de ser malvado'
Absolutamente correcto, gracias por la edición, y espero que necesite mirar alguna fuente para obtener más pistas.
Adam Eberbach

Respuestas:

4

Me puse en contacto con Thomas Dickey (invisible-island.net) que mantiene xterm y vttest; me explicó que CSI 0 Ces lo mismo que CSI 1 Co CSI Cen xterm.

Para cualquier persona que busque más información sobre la programación de terminales, le recomiendo que consulte la fuente xterm que alberga, específicamente ctlseqs.txt dentro de xterm, que se parece mucho a la referencia de secuencias de control de terminal que he estado buscando.

Adam Eberbach
fuente
Este archivo fuente fue útil para encontrar el código CSI; la información sobre el CSI representado como 0x9b byte de los ctlseqs.txt mencionados parece estar equivocada, en realidad es 0x1b
Hi-Angel
1

¿Por qué la compatibilidad de código duro para un tipo de terminal específico cuando ya tiene una base de datos que asigna la funcionalidad a secuencias de código específicas para muchos terminales diferentes? (la base de datos terminfo generalmente está en / usr / share y se incluye en la mayoría de las distribuciones ncurses). Cualquier recurso sobre maldiciones debe explicar la forma en que se etiquetan estas funciones.

Tenga en cuenta que los archivos terminfo generalmente se compilan (usando tic), por lo que es posible que tenga que cavar un poco para encontrar los archivos fuente terminfo.

Ver también http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16 (hay un enlace en su a un repositorio de archivos terminfo.src)

symcbean
fuente
El dispositivo en el que estoy poniendo el terminal no tiene terminfo o ncurses, y escribir una emulación de terminal específica parece ser la mejor manera de ejecutar netback en él. Ya hay nethacks para iPad, pero solo quiero poder jugarlo con un teclado en modo DECgraphics en lugar de cualquier interfaz gráfica de usuario con esquema de control táctil como todos parecen tener. No espero que esto prende fuego al mundo, pero es la forma en que quiero jugar nethack.
Adam Eberbach
1
No, no estoy diciendo que debería haber una entrada en terminfo para su hardware, habrá una entrada para un VT102 aunque describa todas las secuencias de comandos que usará nethack o cualquier otra aplicación basada en maldiciones.
symcbean
Ah, gracias, sería una buena referencia compacta.
Adam Eberbach