¿Cómo saber la línea actual de una ventana de texto de +3e?

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

¿Cómo saber la línea actual de una ventana de texto de +3e?

Notapor programandala.net el Mar Mar 03, 2015 9:40 pm

¿Alguien sabe cómo obtener la línea actual de impresión de una ventana de texto de ZX Spectrum +3e? He leído la documentación del sistema: Los canales de ventanas son solo de salida, los comandos de BASIC de +3e no se pueden usar para obtener información de ellos, y no hay una llamada a IDEDOS que sirva para este caso.

Gracias
Marcos Cruz (programandala.net)
Avatar de Usuario
programandala.net
Jack The Nipper
 
Mensajes: 189
Registrado: Mie Ago 04, 2010 9:20 pm
Ubicación: España

Re: ¿Cómo saber la línea actual de una ventana de texto de +

Notapor programandala.net el Vie Mar 06, 2015 11:26 pm

He contactado con Garry Lancaster, el autor de +3e, y amablemente me ha facilitado la información, que incluyo a continuación por si a alguien le sirve alguna vez.

Los datos están en la tabla normal de canales del sistema (apuntada por la variable CHANS, y con los punteros de las corrientes en la variable STRMS), como era previsible:

Although this is a bit hacky, you could look at the channel information for the window channel you are interested in. See the attached channels.def file for the layout.

The first 5 bytes are what you would expect to see for a standard spectrum channel, like K, S, or P:

Código: Seleccionar todo
ch_o_swap       ds.w    1       ; output routine, always SWAP (even if output invalid)
ch_i_swap       ds.w    1       ; input routine, always SWAP (even if input invalid)
ch_identity     ds.b    1       ; channel name (if this is not "P" and above are SWAP, we have an extended channel)


ie, ch_identity will be "W" for window channels.

Following this are ch_output..ch_size, then each different channel type has its own set of information. For window channels, this is w_tlx..w_extra.


Esta es la parte relevante del fichero mencionado:

Código: Seleccionar todo
ch_o_swap   ds.w   1   ; output routine, always SWAP (even if output invalid)
ch_i_swap   ds.w   1   ; input routine, always SWAP (even if input invalid)
ch_identity   ds.b   1   ; channel name (if this is not "P" and above are SWAP, we have an extended channel)

ch_output   ds.w   1   ; real output routine in ROM 0 (or invalid I/O device error)
ch_input   ds.w   1   ; real input routine in ROM 0 (or invalid I/O device error)
ch_point   ds.w   1   ; pointer routine in ROM 0 (or invalid I/O device error)
ch_size      ds.w   1   ; total size of channel information

w_tlx   ds.b   1   ; top left of window x-coord (0-31)
w_tly   ds.b   1   ; top left of window y-coord (0-23)
w_brx   ds.b   1   ; bottom right of window x-coord (0-31)
w_bry   ds.b   1   ; bottom right of window y-coord (0-23)
w_xpos   ds.b   1   ; screen character (0-31)
w_ypos   ds.b   1   ; screen line (0-23)
w_csize   ds.b   1   ; #pixels per character (3-8)
w_cset   ds.w   1   ; address of character set-256
w_ppos   ds.b   1   ; pixel position within character square (0-7)
w_wcol   ds.b   1   ; actual column (0-84)
w_cols   ds.b   1   ; number of actual columns (1-85)
w_attr   ds.b   1   ; attribute byte to use
w_flags   ds.b   1   ; flags:
;   bit 0=inverse
;   bit 1=over
;   bit 2: 0=tokens, 1=extended udgs
;   bit 3: true if window copy saved
;   bit 4: double width mode
;   bit 5: double height mode
;   bit 6: embedded code current
;   bit 7: set to receive new mode
w_ctrl   ds.b   1   ; current control code
w_just   ds.b   1   ; justification mode (bit 7=embeddeds allowed, bit 6=32-line mode)
w_nbuf   ds.b   1   ; number of characters in justify buffer
w_nprn   ds.b   1   ; number of printable characters in justify buffer
w_punc   ds.b   1   ; position of last punctuation mark in justify buffer
w_npunc   ds.b   1   ; number of printable chars at last punc mark in justify buffer
w_plpos   ds.b   1   ; pixel line position
w_autupd ds.b   1   ; auto-update flag (0=no update, 2=double line-feed, 1=normal)
w_charac ds.b   1   ; character to output
w_saveload ds.b   1   ; flag for saving/loading window (normally zero)
w_doubbuf ds.b   16   ; buffer to create expanded characters
w_highbuf ds.b   16   ; buffer to create expanded characters
w_blockgr ds.b   8   ; buffer to hold graphic
w_extra   ds.b   1   ; dummy, points to extra data for window channels
; This may consist of:
;   justify buffer (always at w_extra)
;   saved window contents (always at end of window channel information)


Tras hacer unas pruebas me di cuenta de que w_ypos no contiene la línea de carácter (0-23), como dice el comentario del código, sino la línea de píxel (0-191), contada desde la parte superior de la pantalla; es decir, hay que dividirla entre 8 para obtener la línea de carácter. Con esta información, es posible obtener cualquier dato de un canal de ventana, con ayuda de unas funciones de BASIC o de una rutina en ensamblador.
Marcos Cruz (programandala.net)
Avatar de Usuario
programandala.net
Jack The Nipper
 
Mensajes: 189
Registrado: Mie Ago 04, 2010 9:20 pm
Ubicación: España


Volver a Programación y nuevos desarrollos

¿Quién está conectado?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 3 invitados