Sección "IS-DOS - para programadores". No 2
Yeliseev V. A. "Sistema de ventanas IS-DOS" (versión de revista)
(C) PENCRAFT 1995 (C) IskraSoft 1995
Continuación, inicio en No 1.
_________________________________________
Reinicios de impresión. La siguiente operación más importante - impresión de mensajes de texto - se presenta en el sistema IS-DOS como un grupo completo de reinicios, que se diferencian, principalmente, en la forma de establecer los parámetros iniciales y algunas funcionalidades adicionales. En total, en el nivel WIND.SYS hay 7 reinicios relacionados con el proceso de impresión de textos. Los primeros tres de ellos se diferencian por el uso de la información contenida en el vector de ventana como coordenadas de impresión (Print pos, Print size, Y-coord). Prácticamente, estos tres reinicios representan un único programa, que tiene tres puntos de entrada para establecer diferentes parámetros.
lwt (#65) - permite imprimir en la ventana un número específico de líneas del búfer de texto con un margen dado en Y desde el borde superior de la ventana. Parámetros de entrada: C - código de reinicio (#65) IX - dirección del vector de ventana HL - dirección del búfer de texto A - cantidad de margen en Y desde el borde superior de la ventana B - número de líneas a imprimir. El formato del búfer de texto para lwt es estándar para la mayoría de los reinicios de impresión en IS-DOS: los caracteres se colocan secuencialmente, comenzando desde la dirección inicial en dirección a direcciones crecientes, las líneas se separan entre sí por el carácter con código #0D, el marcador de finalización de texto - el carácter con código #03. Al trabajar con lwt, el marcador #03 no es obligatorio, ya que el texto impreso se limita al número de líneas especificadas. Sin embargo, si el marcador #03 aparece en el texto antes de que se haya impreso la cantidad requerida de líneas, la impresión se detiene. Los caracteres de salto de línea tampoco son obligatorios, ya que al alcanzar el borde derecho de la ventana, la impresión continúa desde el inicio de la siguiente línea, y el contador de líneas tiene en cuenta esto, de modo que independientemente de la presencia de caracteres #0D, se imprimirán el número especificado de líneas. El resto del texto se corta. Si el número de líneas especificadas excede el tamaño de la ventana, el texto continúa saliendo más allá de sus límites. Al trabajar con el reinicio lwt, el contenido de los registros IX y de la pareja de registros HL se mantiene sin cambios. Consideremos un ejemplo:;****************************************;Listado 4 Ejemplo de uso de lwt(#65)
ORG #5D64;apertura de ventanas CALL CLS LD IX,WIND1 LD C,#61 LD A,2 RST #10 LD IX,WIND2 LD C,#61 LD A,0 RST #10 CALL WAIT;impresión de líneas de texto del búfer en la ventana 1 LD IX,WIND1 ;dirección del vector de ventana LD HL,TEXT1 ;dirección del texto LD C,#65 ;código de reinicio LD A,1 ;margen en Y LD B,4 ;número de líneas RST #10 CALL WAIT;impresión de líneas de texto del búfer en la ventana 2 LD IX,WIND2 LD HL,TEXT2 LD C,#65 LD A,1 LD B,4 RST #10 CALL WAIT JP EXIT;vectores de ventana WIND1 DEFB 5 DEFB 2 DEFB 8 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20 WIND2 DEFB 5 DEFB 12 DEFB 8 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20;búferes de texto TEXT1 DEFM "Reinicio lwt(65)" DEFB 13 DEFM "permite imprimir" DEFB 13 DEFM "en la ventana texto de" DEFB 13 DEFM "el búfer de texto." DEFB 13 TEXT2 DEFM "En el registro B se ha establecido" DEFB 13 DEFM "el número de líneas," DEFB 13 DEFM "que se requieren" DEFB 13 DEFM "imprimir" DEFB 13;procedimientos adicionales CLS LD C,#73 ;reinicio cls RST #10 ;para limpiar la pantalla RET WAIT LD C,#07 ;reinicio ttyin RST #10 ;para esperar la pulsación de una tecla RET EXIT XOR A ;salida estándar LD A,#F4 ;en IS-DOS RET;****************************************
Resultado de la ejecución del programa Listado 1 ver en Fig. 4.
┌───────────────────────────────────────┐
│ │
│ ╔═══════════════════════╗ │
│ ║ Reinicio lwt(#65) ║ │
│ ║ permite imprimir ║ │
│ ║ en la ventana texto de ║ │
│ ║ el búfer de texto ║ │
│ ║ ║ │
│ ║ ║ │
│ ╚═══════════════════════╝ │
│ │
│ ┌───────────────────────┐ │
│ │ en el registro B se ha establecido │ │
│ │ el número de líneas, │ │
│ │ que se requiere │ │
│ │ imprimir │ │
│ │ │ │
│ │ │ │
│ └───────────────────────┘ │
│ │
│ │
├───────────────────────────────────────┤
│ Fig. 4: Impresión de texto en la ventana lwt(#65) │
└───────────────────────────────────────┘
adrwt (#66) - está diseñado para imprimir en la ventana el texto que se encuentra inmediatamente después del vector de ventana. Parámetros de entrada: C - código de reinicio (#66) IX - dirección del vector de ventana. El reinicio adrwt es muy conveniente para imprimir ventanas con texto fijamente vinculado a una ventana específica. Su principal ventaja es que solo necesita un parámetro de entrada (sin contar el código de reinicio en el registro C). Para mostrar el texto en pantalla, adrwt utiliza los mismos procedimientos que lwt, por lo que todo lo que se ha dicho sobre el formato de texto para lwt es aplicable también a adrwt. Al alcanzar el borde inferior de la ventana, la impresión se detiene y la parte restante del texto se ignora. Al trabajar con el reinicio adrwt, se conserva el contenido del registro IX.
Ejemplo:;****************************************;Listado 5 Impresión utilizando adrwt(#66)
ORG #5D64;apertura de ventanas CALL CLS LD IX,WIND1 LD C,#61 LD A,2 RST #10 LD IX,WIND2 LD C,#61 LD A,0 RST #10 CALL WAIT;impresión de líneas de texto en la ventana 1 LD IX,WIND1 ;dirección del vector de ventana LD C,#66 ;código de reinicio RST #10 CALL WAIT;impresión de líneas de texto en la ventana 2 LD IX,WIND2 LD C,#66 RST #10 CALL WAIT JP EXIT;vectores de ventana WIND1 DEFB 5 DEFB 3 DEFB 7 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20;texto de ventana 1 DEFM "Reinicio adrwt(66)" DEFB #0D DEFM "permite imprimir" DEFB #0D DEFM "texto, que sigue" DEFB #0D DEFM "después del vector de ventana." DEFB #03 WIND2 DEFB 5 DEFB 12 DEFB 7 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20;texto de ventana 2 DEFM "Las líneas se separan" DEFB #0D DEFM "por el símbolo con código #0D" DEFB #0D DEFM "fin de texto - " DEFB #0D DEFM "símbolo con código #03" DEFB #03;procedimientos adicionales CLS LD C,#73 ;reinicio cls RST #10 ;para limpiar la pantalla RET WAIT LD C,#07 ;reinicio ttyin RST #10 ;para esperar la pulsación de una tecla RET EXIT XOR A ;salida estándar LD A,#F4 ;en IS-DOS RET;****************************************
lenwt (#67) - también está destinado a imprimir texto en la ventana, sin embargo, el texto no está vinculado al vector de una ventana específica, sino que puede estar en cualquier lugar del programa. La principal ventaja del reinicio lenwt es la capacidad de imprimir un texto en varias ventanas y viceversa, la posibilidad de imprimir diferentes textos en una ventana. Parámetros de entrada: C - código de reinicio IX - dirección del vector de ventana HL - dirección del texto. Al trabajar con el reinicio lenwt, se conserva el contenido del registro IX y de la pareja de registros HL.
Ejemplo:;****************************************;Listado 6 Impresión utilizando lenwt(#67)
ORG #5D64;apertura de ventanas CALL CLS LD IX,WIND1 LD C,#61 LD A,2 RST #10 LD IX,WIND2 LD C,#61 LD A,0 RST #10 CALL WAIT;impresión de líneas de texto del búfer en la ventana 1 LD IX,WIND1 ;dirección del vector de ventana LD HL,TEXT ;dirección del texto LD C,#67 ;código de reinicio RST #10 CALL WAIT;impresión de líneas de texto del búfer en la ventana 2 LD IX,WIND2 LD HL,TEXT LD C,#67 RST #10 CALL WAIT JP EXIT;vectores de ventana WIND1 DEFB 5 DEFB 3 DEFB 7 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20 WIND2 DEFB 5 DEFB 12 DEFB 7 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20;búfer de texto TEXT DEFM "Reinicio lenwt(67)" DEFB #0D DEFM "permite imprimir" DEFB #0D DEFM "texto, que se encuentra" DEFB #0D DEFM "en cualquier lugar" DEFB #0D DEFM "del programa" DEFB #0D DEFB #03;procedimientos adicionales CLS LD C,#73 ;reinicio cls RST #10 ;para limpiar la pantalla RET WAIT LD C,#07 ;reinicio ttyin RST #10 ;para esperar la pulsación de una tecla RET EXIT XOR A ;salida estándar LD A,#F4 ;en IS-DOS RET;****************************************
El resultado de la ejecución del programa Listado 6 se presenta en la figura 5:
┌───────────────────────────────────────┐
│ │
│ ╔═══════════════════════╗ │
│ ║ Reinicio lenwt(67) ║ │
│ ║ permite imprimir ║ │
│ ║ texto, que se encuentra║ │
│ ║ en cualquier lugar ║ │
│ ║ del programa ║ │
│ ║ ║ │
│ ╚═══════════════════════╝ │
│ │
│ ┌───────────────────────┐ │
│ │ Reinicio lenwt(67) │ │
│ │ permite imprimir │ │
│ │ texto, que se encuentra║ │
│ │ en cualquier lugar │ │
│ │ del programa │ │
│ │ │ │
│ └───────────────────────┘ │
│ │
│ │
├───────────────────────────────────────┤
│ Fig. 5: Impresión de texto lenwt(#67) │
└───────────────────────────────────────┘
prstr (#68) Reinicio prstr(#68) - el más potente y versátil de todos los reinicios destinados a imprimir cadenas de texto en la ventana. Su principal ventaja es la posibilidad de alineación automática de la cadena a la izquierda y a la derecha, así como la centración de la cadena. El reinicio tiene 4 subfunciones, que permiten establecer la cadena impresa de varias maneras. El código de subfunción se coloca en el registro E:
E=0 - impresión de la cadena por nombre lógico, definido en un arreglo especial de análisis E=1 - impresión de la cadena de longitud dada, contenida en la dirección especificada E=2 - subfunción de servicio, que no imprime nada, pero permite calcular los parámetros para la subfunción anterior, conociendo la dirección de inicio del búfer de texto y el número de línea E=3 - impresión de la cadena por su número en el texto - en realidad representa una combinación de las subfunciones 2 y 1.
El despachador de subfunciones tiene "protección contra tontos" - si se establece en el registro E un número mayor que 3, se ajustará automáticamente a cero.
Ahora consideremos más detalladamente el trabajo con las subfunciones del reinicio prstr(#68).
Para empezar - disposiciones generales. Al llamar al reinicio, en el registro A debe haber un número que determine dos parámetros principales de impresión - el modo de alineación (los dos bits más significativos) y el margen en Y desde el borde superior de la ventana (los seis bits menos significativos). El modo de alineación se codifica de la siguiente manera:
00 - alineación a la izquierda 01 - alineación a la izquierda 10 - alineación a la derecha 11 - centrado de la cadena.
Al trabajar con el reinicio, el contenido del registro A no se guarda.
El formato del búfer de texto para prstr es estándar - los caracteres se colocan secuencialmente, comenzando desde la dirección inicial, las líneas se separan entre sí por el carácter #0D, el marcador de fin de texto - #03.
Para mostrar los caracteres en pantalla, prstr utiliza el reinicio ttyout(#0A) del nivel DOS.SYS. Al formar el búfer de texto, establecer el margen y el número de caracteres a imprimir, es necesario asegurarse de que el texto no salga de los límites de la ventana. Con un ancho de línea mayor que el ancho del campo de impresión de la ventana, la alineación se realiza automáticamente a la izquierda, independientemente del estado de los dos bits más significativos del registro A.
La subfunción 0, como se mencionó anteriormente, permite imprimir líneas del búfer de texto por sus nombres lógicos. ¿Qué es esto?
Supongamos que necesita imprimir en la ventana un texto que contiene líneas que se repiten con frecuencia. En lugar de llamar repetidamente a prstr, estableciendo todos los parámetros cada vez y controlando estrictamente cuál de las líneas imprimir a continuación, o, lo que es aún peor, llenar el búfer de texto con líneas idénticas, puede simplemente crear un arreglo en el que se establecerá la secuencia de impresión de las líneas mediante referencias a sus números ordinales en el búfer. Al alternar diferentes arreglos, podrá reorganizar fácilmente sus textos, intercambiar líneas, insertar otras, etc. Con la subfunción 0 también es fácil organizar la impresión de mensajes de texto por código de la tabla (como los mensajes de error en Spectrum BASIC).
Parámetros de entrada:
C - código de reinicio (#68) E - código de subfunción (0) IX - dirección del vector de ventana HL - dirección del arreglo de análisis A - modo de centrado y margen en Y (ver arriba) B - nombre lógico de la línea - cualquier código, excepto #FF.
A la salida, al finalizar normalmente, el registro HL contiene un número que es uno menos que la dirección del primer símbolo de la línea que sigue a la impresa. Se conserva el contenido del registro IX, el contenido de los registros A, B, C, E se pierde. El reinicio prstr también modifica la variable del sistema xypos (ver el vector del dispositivo de salida de caracteres).
Posibles errores:
1. Si el nombre lógico de la línea no se encuentra en el arreglo de análisis, el reinicio regresa al programa llamador con la bandera C establecida y el código de error 140 (no hay nombre en el arreglo) en el registro A.
2. Si el texto no contiene una línea con el número ordinal especificado en el arreglo, el reinicio regresa con la bandera C establecida y el código de error 141 (no hay línea en el texto) en el registro A.
El arreglo de análisis tiene la siguiente estructura: los primeros dos bytes - dirección del búfer de texto, luego - registros de dos bytes, donde el primer byte - nombre lógico de la línea, y el segundo - su número ordinal en el búfer. El arreglo finaliza obligatoriamente con el código #FF.
Consideremos un ejemplo. Dibujemos en la pantalla un marco de asteriscos en dos variantes diferentes para dos ventanas (ver Fig. 6):
┌───────────────────────────────────────┐
│ │
│ ************************* │
│ * * * │
│ * * * │
│ ************************* │
│ * * │
│ * * │
│ * * │
│ * * │
│ ************************* │
│ │
│ ************************* │
│ * * * * │
│ * * * * │
│ * * * * │
│ ************************* │
│ * * * │
│ * * * │
│ * * * │
│ ************************* │
│ │
├───────────────────────────────────────┤
│ Fig. 6: Marcos de asteriscos para │
│ demostrar el funcionamiento de prstr │
└───────────────────────────────────────┘
Para dibujar estos dos marcos utilizando la subfunción 0 del reinicio prstr, solo se necesitan 4 tipos de líneas:
1. "*************************" 2. "* *" 3. "* * *" 4. "* * * *".
Elaboremos un programa que realice esta tarea:
;*****************************************
; Listado 7 Impresión utilizando la subfunción 0 del reinicio prstr
ORG #5D60
;apertura de ventanas
CALL CLS ;limpiar la pantalla LD IX,WIND1 ;abrir ventana 1 LD C,#61 LD A,2 RST #10 LD IX,WIND2 ;abrir ventana 2 LD C,#61 LD A,0 RST #10
;impresión del primer marco
LD IX,WIND1 ;dirección del vector de ventana LD HL,TABL1 ;dirección del arreglo CALL PRINT ;llamar al procedimiento de impresión de texto
;impresión del segundo marco
LD IX,WIND2 LD HL,TABL2 CALL PRINT
CALL WAIT ;esperar la tecla JP EXIT ;salida a IS-DOS
;procedimiento de impresión
PRINT LD B,#09 ;número de líneas que se deben imprimir, simultáneamente - nombre lógico de la primera línea
;modo de alineación - al centro, margen - 1 línea
LD A,%11000001
M1 PUSH HL ;guardar en la pila la dirección del arreglo PUSH AF ;guardar en la pila el modo de alineación y el margen actual en Y
LD C,#68 ;código de reinicio LD E,#00 ;código de subfunción RST #10 ;llamar al reinicio
POP AF ;sacar de la pila el margen actual INC A ;aumentar en 1 para imprimir la siguiente línea POP HL ;restaurar en HL la dirección del arreglo DJNZ M1 ;repetir, mientras el valor de B no disminuya a 0
;el valor de B sirve simultáneamente como contador en el ciclo de impresión y como nombre lógico de la siguiente línea a imprimir
RET ;retorno al programa principal
;vectores de ventana
WIND1 DEFB 0
DEFB 0
DEFB 11
DEFB 30
DEFB %00001111
DEFB #FF
DEFB 3
DEFB 38
WIND2 DEFB 0
DEFB 12
DEFB 11
DEFB 30
DEFB %00001111
DEFB #FF
DEFB 3
DEFB 38
;búfer de texto
TEXT DEFM "*************************"
DEFB #0D
DEFM "* *"
DEFB #0D
DEFM "* * *"
DEFB #0D
DEFM "* * * *"
DEFB #0D
DEFB #03
;arreglos de análisis
TABL1 DEFW TEXT
DEFB #09
DEFB 1
DEFB #08
DEFB 3
DEFB #07
DEFB 3
DEFB #06
DEFB 1
DEFB #05
DEFB 2
DEFB #04
DEFB 2
DEFB #03
DEFB 2
DEFB #02
DEFB 2
DEFB 1
DEFB #FF
TABL2 DEFW TEXT
DEFB #09
DEFB 1
DEFB #08
DEFB 4
DEFB #07
DEFB 4
DEFB #06
DEFB 4
DEFB 5
DEFB 1
DEFB #04
DEFB 3
DEFB #03
DEFB 3
DEFB #02
DEFB 3
DEFB #01
DEFB 1
DEFB #FF
;procedimientos adicionales
CLS LD C,#73 ;limpiar la pantalla RST #10 ;para limpiar la pantalla RET
WAIT LD C,#07 ;esperar la tecla RST #10 ;para esperar la pulsación de una tecla RET
EXIT XOR A ;salida estándar LD A,#F4 ;en IS-DOS RET
;****************************************
La subfunción 1 permite imprimir una línea de longitud dada, almacenada en la memoria en la dirección especificada. Esta subfunción calcula las coordenadas de impresión de la línea, teniendo en cuenta la cantidad de caracteres, el margen, el modo de alineación y el ancho del campo de impresión. Para ello, utiliza el mismo procedimiento que la subfunción 0, por lo que es necesario controlar la correspondencia de los tamaños de la ventana con los tamaños del texto.
Después de calcular las coordenadas, la subfunción 1 llama al mismo reinicio ttyout(#0A) en un ciclo hasta que se haya impreso la cantidad requerida de caracteres.
Parámetros de entrada:
C - código de reinicio (#68) E - código de subfunción (#01) IX - dirección del vector de ventana HL - dirección de inicio de la línea B - longitud de la línea A - modo de alineación y margen en Y.
La longitud de la línea impresa se determina exclusivamente por el valor del registro B. El carácter de salto de línea #0D se reemplaza en este caso por un espacio, no se recomienda utilizar otros caracteres con códigos menores que #20 para evitar la aparición de "basura" en la pantalla.
Ejemplo de uso de la subfunción 1:
;****************************************
;Listado 8 Ejemplo de impresión utilizando prstr(#68) subfunción 1
ORG #5D64
;apertura de ventana
CALL CLS LD IX,WIND LD C,#61 LD A,2 RST #10 CALL WAIT
;impresión de una línea de texto del búfer en la ventana a través de la subfunción 1
LD IX,WIND ;vector de ventana LD C,#68 ;código de reinicio LD E,1 ;código de subfunción LD HL,TEXT1 ;dirección de la línea
LD A,%11000010
;dos bits más significativos - modo de alineación (en este caso - centrado); seis menos significativos - margen superior (2 líneas).
LD B,30 ;número de caracteres en la línea RST #10 ;llamar al reinicio
CALL WAIT
;impresión de la siguiente línea
LD IX,WIND ;vector de ventana LD C,#68 ;código de reinicio LD E,1 ;código de subfunción LD HL,TEXT2 ;dirección de inicio de la línea
LD A,%11000100
;impresión sin alineación y margen superior - 4 líneas.
LD B,36 ;número de caracteres en la línea RST #10 ;llamar al reinicio
CALL WAIT JP EXIT
;vector de ventana
WIND DEFB 1 DEFB 1 DEFB 8 DEFB 30 DEFB %00001111 DEFB %00000001 DEFB 3 DEFB 38
;búfer de texto
TEXT1 DEFM "Reinicio prstr(68) " DEFM "subfunción 1" TEXT2 DEFM "impresión de línea en ventana " DEFM "con alineación"
;procedimientos adicionales
CLS LD C,#73 ;limpiar la pantalla RST #10 ;para limpiar la pantalla RET
WAIT LD C,#07 ;esperar la tecla RST #10 ;para esperar la pulsación de una tecla RET
EXIT XOR A ;salida estándar LD A,#F4 ;en IS-DOS RET
;****************************************
La subfunción 2 permite calcular los parámetros de entrada para la subfunción 1 (dirección y longitud de la línea) por su número ordinal en el búfer de texto.
Parámetros de entrada:
C - código de reinicio (#68) E - código de subfunción (#02) HL - dirección de inicio del texto B - número ordinal de la línea.
Parámetros de salida:
HL - dirección de la línea B - longitud de la línea.
El contenido de los registros C y E no se conserva. El formato del texto es estándar. Si el valor del número ordinal de la línea excede el número de líneas en el texto, el reinicio regresa con la bandera C establecida y el código de error 141 (no hay línea en el texto).Ejemplo de uso de la subfunción 2:
;****************************************
;Listado 9 Ejemplo de uso
; prstr(#68) subfunción 2
ORG #5D64
;apertura de ventana
CALL CLS
LD IX,WIND
LD C,#61
LD A,2
RST #10
CALL WAIT
;ejemplo de uso de la subfunción 2 para
;determinar los parámetros para la subfunción 1
;por el número de línea conocido en el texto
LD C,#68 ;código de reinicio
LD E,2 ;código de subfunción 2
LD HL,TEXT ;dirección de inicio
;del texto
LD B,1 ;número de línea
RST #10
;en la salida en HL' - dirección de la línea,
;y en B - longitud
EXX
LD C,#68
LD E,1 ;código de subfunción 1
LD A,%11000001
RST #10
LD C,#68
LD E,2 ;determinación
LD HL,TEXT ;de los parámetros
LD B,2 ;líneas
RST #10
EXX
LD C,#68
LD E,1 ;impresión
LD A,%11000011
RST #10
LD C,#68
LD E,2
LD HL,TEXT
LD B,3
RST #10
EXX
LD C,#68
LD E,1
LD A,%11000101
RST #10
CALL WAIT
JP EXIT
;vector de ventana
WIND DEFB 1
DEFB 1
DEFB 8
DEFB 30
DEFB %00001111
DEFB %00000001
DEFB 3
DEFB 38
;búfer de texto
TEXT DEFM "Reinicio prstr(68) "
DEFM "subfunción 2"
DEFB #0D
DEFM "determina los parámetros para "
DEFB #0D
DEFM "subfunción 1"
DEFB #0D
DEFB #03
;procedimientos adicionales
CLS LD C,#73 ;limpiar la pantalla
RST #10
RET
WAIT LD C,#07 ;esperar la tecla
RST #10
RET
EXIT XOR A ;salida estándar
LD A,#F4 ;en IS-DOS
RET
;****************************************
La subfunción 3 - combinación de las subfunciones 2 y 1. Como parámetros de entrada se utilizan la dirección de inicio del texto y el número ordinal de la línea en él.
Primero, la subfunción 3 utiliza la subfunción 2 para calcular los valores de dirección y longitud de la línea, después de lo cual el control se transfiere a la subfunción 1.
Parámetros de entrada:
C - código de reinicio (#68)
E - código de subfunción (#03)
IX - dirección del vector de ventana
HL - dirección de inicio del texto
B - número de línea
A - modo de alineación y margen en Y
Al igual que en la subfunción 2, la ausencia en el texto de una línea con el número ordinal especificado provoca el retorno al programa llamador con la bandera C establecida y el código de error 141 (no hay línea en el texto) en el registro A.
Ejemplo de uso de la subfunción 3:
;****************************************
;Listado 10 Ejemplo de uso
; prstr(#68) subfunción 3
ORG #5D64
;apertura de ventana
CALL CLS
LD IX,WIND
LD C,#61
LD A,2
RST #10
CALL WAIT
;impresión de líneas de texto desde el búfer en la ventana
;a través de la subfunción 3
LD IX,WIND ;vector de ventana
LD C,#68 ;código de reinicio
LD E,3 ;código de subfunción
LD HL,TEXT ;dirección de inicio
;texto
LD A,%11000010
;impresión con centrado y margen
;superior - 2 líneas
LD B,1 ;número de línea
;en el texto
RST #10 ;llamada de reinicio
CALL WAIT
LD IX,WIND ;vector de ventana
LD C,#68 ;código de reinicio
LD E,3 ;código de subfunción
LD A,%11000101
LD B,2 ;impresión de la siguiente
RST #10 ;línea en la ventana
CALL WAIT
JP EXIT
;vector de ventana
WIND DEFB 1
DEFB 1
DEFB 8
DEFB 30
DEFB %00001111
DEFB %00000001
DEFB 3
DEFB 38
;búfer de texto
TEXT DEFM "Reinicio prstr(68) "
DEFM "subfunción 3"
DEFB #0D
DEFM "impresión de línea por número"
DEFB #0D
DEFB #03
;procedimientos adicionales
CLS LD C,#73 ;limpieza de pantalla
RST #10
RET
WAIT LD C,#07 ;espera de tecla
RST #10
RET
EXIT XOR A ;salida estándar
LD A,#F4 ;en IS-DOS
RET
;****************************************
Los siguientes dos reinicios están destinados a imprimir en la pantalla en coordenadas absolutas, no vinculadas a una ventana específica.
str (#6C)
El reinicio str(#6C) - imprime en la posición actual de la pantalla una línea, limitada por el código #0D. La dirección de la línea se establece en el par de registros HL. Este reinicio es conveniente para imprimir líneas en la pantalla fuera de las ventanas, no requiere establecer coordenadas, sino que utiliza la posición de impresión actual, almacenada en la variable del sistema XYPOS.
El reinicio str es simplemente una llamada cíclica al reinicio mencionado anteriormente ttyout(#0A) desde el nivel DOS.SYS, llevada a cabo hasta que se encuentra el código de salto de línea #0D. Para determinar las coordenadas de impresión se utiliza la variable del sistema XYPOS, que se encuentra en el vector del dispositivo de salida de caracteres. Se puede acceder a esta variable utilizando los reinicios wtpos(#6B) y prapd(#0C), de lo que hablaremos más adelante.
Al trabajar con el reinicio str, el carácter de salto de línea se considera solo como un delimitador de texto, y no se realiza un verdadero salto de línea al imprimir. Cabe destacar que el tamaño del campo de impresión al llamar a str está limitado a una de las terceras partes de la pantalla - superior, media o inferior, es decir, aquella dentro de la cual se encontraba la posición actual de impresión antes de la llamada. Al alcanzar el límite derecho de la pantalla, la impresión se traslada a la siguiente línea, y el último carácter puede ser "cortado" al trasladarse, y al alcanzar el límite inferior de la tercera parte correspondiente de la pantalla, la impresión se traslada a la primera de las ocho líneas de esta tercera parte.
Parámetros de entrada:
C - código de reinicio (#6C)
HL - dirección de la línea
XYPOS - variable del sistema - posición actual de impresión.
Ejemplo:
;****************************************
;Listado 11 Ejemplo de uso str(#6C)
ORG #5D64
CALL CLS ;limpieza de pantalla
LD HL,TEXT1 ;dirección del texto
LD C,#6C ;código de reinicio
RST #10 ;impresión de línea
CALL WAIT
LD HL,TEXT2 ;impresión de la segunda
LD C,#6C ;línea
RST #10
CALL WAIT
LD HL,TEXT3 ;impresión de la tercera
LD C,#6C ;línea
RST #10
CALL WAIT
JP EXIT
;búfer de texto
TEXT1 DEFM "Reinicio str (#6C) "
DEFB #0D
TEXT2 DEFM " permite imprimir "
DEFB #0D
TEXT3 DEFM " en coordenadas "
DEFM " absolutas"
DEFB #0D
;procedimientos adicionales
CLS LD C,#73 ;reinicio cls
RST #10 ;para limpiar la pantalla
RET
WAIT LD C,#07 ;reinicio ttyin
RST #10 ;para esperar la pulsación de una tecla
EXIT XOR A ;salida estándar
LD A,#F4 ;en IS-DOS
RET
;****************************************
lnstr (#6D)
El reinicio lnstr(#6D) - al igual que el anterior, accede en ciclo a ttyout(#0A), pero imprime solo la cantidad de caracteres especificada. Las coordenadas de impresión también se almacenan en la variable del sistema XYPOS.
Parámetros de entrada:
C - código de reinicio (#6D)
HL - dirección del texto de la línea
B - cantidad de caracteres
XYPOS - variable del sistema - posición actual de impresión.
Al imprimir, los caracteres de salto de línea #0D se reemplazan por espacios, y otros caracteres con códigos menores a #20 no se recomienda usarlos. Al igual que en el caso de str, el campo de impresión está limitado a una de las terceras partes de la pantalla.
Para establecer coordenadas a través de la variable del sistema XYPOS, utilice los reinicios prapd(#0C) desde el nivel DOS.SYS y wtpos(#6B).
Ejemplo:
;****************************************
;Listado 12 Ejemplo de trabajo lnstr(#6D)
ORG #5D64
CALL CLS ;limpieza de pantalla
LD HL,TEXT ;dirección del texto
LD C,#6D ;código de reinicio
LD B,81
RST #10 ;impresión de línea
CALL WAIT
JP EXIT
;búfer de texto
TEXT DEFM "Reinicio str (#6C) "
DEFM "permite imprimir "
DEFM " en coordenadas"
DEFM " absolutas"
;procedimientos adicionales
CLS LD C,#73 ;reinicio cls
RST #10 ;para limpiar la pantalla
RET
WAIT LD C,#07 ;reinicio ttyin
RST #10 ;para esperar la pulsación de una tecla
EXIT XOR A ;salida estándar
LD A,#F4 ;en IS-DOS
RET
;****************************************
Otro reinicio de impresión tylin(#71) está directamente relacionado con el funcionamiento del editor de cadenas edstr(#7F), por lo que se tratará en uno de los siguientes artículos de nuestra serie.
Continuará ...
En el próximo número de nuestra revista, conocerá un grupo bastante grande de reinicios auxiliares, que también forman parte del nivel WIND.SYS.
Contenido de la publicación: ZX Format #02
- IS-DOS
Anuncio de un complejo hardware-software para escuelas por Iskra Soft y Peters, con una configuración de clase informática en red en ZX Spectrum con IS-DOS.
- IS-DOS - Владимир Елисеев
Explicación del monitor de línea de comandos y reinicio del editor de texto en IS-DOS usando la utilidad mon.com como ejemplo.
- IS-DOS
Introducción a las utilidades del sistema IS-DOS, cubriendo funciones como ayuda, menú de usuario, visualización de archivos, edición y operaciones de archivos.
- IS-DOS
Descripción detallada del programa eliminat.com para liberar memoria de tareas residentes y controladores, con modo interactivo y claves de línea de comandos. Números de canal específicos asignados para tipos de tareas y controladores. Incluye opciones de uso y personalización de colores.
- Sistema de Ventanas IS-DOS - Владимир Елисеев
Exploración de reinicios del sistema de ventanas IS-DOS para imprimir texto en ventanas y coordenadas de pantalla absolutas. Ejemplos de implementaciones de reinicios como lwt, adrwt, lenwt, prstr, str y lnstr. Continuación para cubrir reinicios auxiliares en el próximo número.
- Ensamblador
Introducción a los conceptos básicos del lenguaje ensamblador, centrándose en las banderas, operaciones aritméticas y manipulación de registros. Se discuten operaciones como suma, resta y operaciones complejas como multiplicación y división a través de ejemplos. Destaca comandos específicos de ensamblador y sus funciones para ZX Spectrum.
- Hardware
Discusión sobre modificaciones de hardware para Scorpion ZS-256-Turbo, incluida la implementación de un interruptor Turbo/Normal. Pros y contras de los métodos de cambio basados en software. Consejos sobre soldadura y ajustes de circuitos.
- Hardware
Discusión de un nuevo complemento musical para ZX Spectrum de X-TRADE y HACKER STINGER, llamado 'ZX GENERAL SOUND', que ofrece audio de alta calidad y uso mínimo del procesador.
- Hardware
Discusión sobre innovaciones de hardware y estrategias de marketing, enfocándose en interfaces de ratón y teclado para ZX Spectrum. Crítica a la publicidad engañosa de la competencia y análisis de la tecnología de ratón serial frente a pasiva. El autor cuestiona la necesidad y el costo de características avanzadas.
- Hardware
Discusión sobre métodos de aceleración de hardware para ZX Spectrum, centrándose en modos turbo y sus efectos en el rendimiento y la compatibilidad.
- Juguetes
Cuento de fantasía sobre criaturas mágicas luchando contra la intrusión humana. El personaje principal recluta aliados para restaurar la gloria pasada de la tierra. Desafíos incluyen encontrar herramientas, superar obstáculos y revivir compañeros.
- Juguetes
Reseña del juego 'Carrier Command', centrada en sus aspectos estratégicos y de simulación. Incluye detalles de mecánicas de juego, controles y objetivos. Destaca estrategias para el éxito y características únicas como la gestión de recursos y sistemas autónomos.
- Entrevista
Entrevista con Sergey Zonov y Andrey Larchenko discutiendo su experiencia con microprocesadores y el desarrollo del ZX Spectrum, incluyendo la creación del ordenador Scorpion ZS 256.
- Información
Información de contacto y lista de personal de ZX-Format No. 2 (1995) incluyendo editor, programadores y diseñadores.
- Información
Dirección del editor a los lectores de ZX Format, discutiendo comentarios positivos, errores pasados y la búsqueda de un caricaturista, con planes futuros para la revista.
- Información
Discusión sobre la nueva interpretación del sistema de menú de ventanas 'PULLDOWN' para ZX Spectrum, centrándose en las actualizaciones de la interfaz y las mejoras en la interacción del usuario.
- Información
Discusión sobre empresas que distribuyen ilegalmente ZX Format, enfatizando los beneficios de comprar copias oficiales.
- Concurso
El artículo discute la falta de participación en el concurso de ZX Format, detalla las reglas y premios, y alienta a los lectores a participar con nuevas ideas.
- Vamos a Relajarnos
Relato humorístico de los desafíos de un vendedor de software al tratar con clientes ignorantes, ilustrando la naturaleza estresante de su trabajo.
- Buzón
Descripción de componentes y precios para entusiastas de ZX Spectrum con detalles de pedido.
- Buzón
La sección de cartas de lectores en ZX Format #02 discute comentarios de los lectores, aborda problemas con las características de ZX Format y ofrece mejoras futuras.
- Estreno
Guía de Digital Studio v1.12, un editor musical para ZX Spectrum, incluyendo características, navegación del menú y uso de Digital Studio Compiler.
- Para Programadores
Exploración de herramientas que amplían el Basic 48 estándar, incluyendo Renumber para Basic 128, Trace & Speed, Blast Toolkit y ZXeditor, destacando sus funcionalidades y utilidades.
- Varios
Historia de los modelos de computadoras Amiga y su evolución desde A1000 hasta A4000/60T con especificaciones y características únicas. Explicación de términos técnicos y diferencias entre memoria chip y fast. Mención de nuevos desarrollos como el chipset AGA y modelos para diferentes necesidades.
- Varios
El artículo presenta lanzamientos de software para ZX Spectrum y revisa innovaciones de juegos como 'Aventuras de Winnie Pooh' y 'UFO 2: Demonios del Abismo'. Destaca características, creadores y requisitos técnicos. Incluye anuncios de SOFTLAND y Cracked Masters Group.
- Sistemas
Discusión sobre la creación de música con Instrument 3.01, centrado en el sonido digitalizado. Análisis de las capacidades del programa y conversión de ASC Sound Master. Instrucciones para composición y conversión.
- Qué Hay de Nuevo
Reseña de nuevos juegos para ZX Spectrum en el mercado de San Petersburgo a finales de 1995. Descripciones detalladas de juegos, requisitos de memoria, controles y evaluaciones de música/gráficos. Destacan Night Hunter, Extreme, Grell & Falla y más.