Marcos Cruz
Madrid, diciembre 1988
Las rutinas de José Carlos de Prada (Ver disco Cuq número 1) para leer el estado del ratón de Investrónica (¡perdón, quise decir escarabajo pelotero!) permiten a uno diseñar sus propios programas para que funcionen con dicho engendro. No obstante, desde que topé en mi devenir con el susodicho ente repugnante, no he pretendido otra cosa que liberarle de su condición de inútil supremo. Hasta ahora no he tenido éxito en tamaña empresa.
Bueno, la idea era escribir una rutina en SuperBASIC para compilarla y dejarla como tarea residente. La función de la tarea sería leer el estado del escarabajo pelotero y engañar al QL para que creyese que en lugar del mismo se han pulsado las teclas del cursor correspondientes. De este modo, con sólo EXECutar dicha tarea, el escarabajo podría usarse en cualquier programa, ¡incluso en Quill! Hasta aquí todo muy bonito, pero en la práctica no es así.
En primer lugar, ¿por qué, si el escarabajo pelotero se conecta a un port de joystick, no puede leerse con INKEY$? La respuesta la tendremos si ejecutamos el siguiente programa:
100 REMark Marcos 26/10/1988 110 REMark 120 CLS:TK2_EXT:REMark Toolkit II 130 PRINT "bits 01234567" 140 REPeat bucle 150 AT 1,0 160 FOR fila=0 TO 7 170 PRINT "fila"!fila!BIN$(KEYROW(fila),8)&CHR$(10); 180 END FOR fila 190 END REPeat bucle
Ejecutad el programa anterior con el escarabajo pelotero conectado y movedlo. Como observaréis, no se activa sólo el bit correspondiente a la tecla del cursor -o de tecla función, según donde esté conectado el bicho- correspondiente al movimiento, sino que llegan a activarse todos o casi todos los bits de igual peso de todas las filas... ¿? ¡Por eso no se puede leer el escarabajo con INKEY$!
¿Qué se puede hacer, entonces? Se me ocurrió lo siguiente:
100 : 110 REMark Programa para simular el funcionamiento 120 REMark de un joystick 130 REMark con el ratón de Investrónica 140 REMark conectado a CTL1 150 REMark 160 REMark Marcos 28/10/1988 170 REMark 180 REMark Debe ser compilado y ejecutado como tarea 190 : 200 SET_PRIORITY 1:REMark para Turbo 210 IMPLICIT% peso_bit,bit,fila,n_filas,letra:REMark para Turbo 220 : 230 REPeat bucle 240 letra=0 250 IF peso_en_filas%(16)>1:letra=200 260 IF peso_en_filas%(2)>1:letra=192 270 IF peso_en_filas%(4)>1:letra=208 280 IF peso_en_filas%(128)>1:letra=216 290 IF peso_en_filas%(64)>1:letra=32 300 IF letra 310 PRINT "Letra= "; 320 REPeat espera 330 FOR fila=0 TO 7 340 IF KEYROW(fila):NEXT espera 350 END FOR fila 360 END REPeat espera 370 POKE_W 163978,0 380 PRINT letra 390 END IF 400 END REPeat bucle 410 : 420 DEFine FuNction peso_en_filas%(peso_bit) 430 n_filas=0 440 FOR fila=0 TO 7:IF KEYROW(fila)&&peso_bit:n_filas=n_filas+1 450 RETurn n_filas 460 END DEFine peso_en_filas 470 :
Si el programa se ejecuta -para hacer pruebas no hace falta compilarlo- aparecerá el código ASCII del carácter correspondiente al movimiento del escarabajo.
El funcionamiento se basa en averiguar si, para cierto peso de bit, están activadas varias filas del teclado. Si es así, es que el ratón se ha movido. Pero esto es todo lo que hay, no he podido ir más allá. Todo intento de simular que la tecla correspondiente se ha pulsado (en lugar de simplemente imprimir su código ASCII) ha sido infructuoso.
En el conjunto de procedimientos de ejemplo que viene con Turbo, hay uno que, compilado, hace que los caracteres "-" y "_" intercambien sus posiciones en la tecla en que están. Para ello detecta la pulsación de cada uno mediante INKEY$, en un bucle sin fin, y, si han sido pulsados, los sustituye por el otro mediante TYPE_IN. Pero si en vez de INKEY$ se usa KEYROW, el procedimiento no funciona.
En el libro de Adrian Dickens no he encontrado ninguna referencia a todo esto. El problema, lo que me falta saber cómo hacer, es en resumen lo siguiente: ¿Cómo, tras detectar cierta combinación de teclas mediante KEYROW, simular que se ha pulsado otra tecla cualquiera?
Alojado en / Hosted at: Sinclair QL Recursos en Castellano Sinclair QL Spanish Resources |