¿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

Responder
Avatar de Usuario
programandala.net
Manic Miner
Mensajes: 210
Registrado: Mié Ago 04, 2010 9:20 pm
Ubicación: España
Contactar:

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

Mensaje por programandala.net » Mar Mar 03, 2015 8: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
Manic Miner
Mensajes: 210
Registrado: Mié Ago 04, 2010 9:20 pm
Ubicación: España
Contactar:

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

Mensaje por programandala.net » Vie Mar 06, 2015 10: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)

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 2 invitados