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.