EnterMice (Spanish)
Interfaz de Ratón PS/2 y Puertos de Joystick para el ordenador Enterprise 64/128
Contents
- 1 Introducción
- 2 Lista programas compatibles hasta la fecha
- 3 Descripción General
- 4 Importante
- 5 Conectándolo al ordenador
- 6 Caracteristicas
- 7 Uso del controlador
- 8 Solución de problemas
- 9 Especificaciones Tecnicas
- 10 Información para desarrolladores
- 10.1 Sincronismos de EnterMice
- 10.2 Memoria intermedia de datos(búfer)
- 10.3 Lectura del ratón
- 10.4 Lectura Mínima de EnterMice, gracias a Bruce Tanner
- 10.5 Una rutina aun mas condensada que lee Ratón+todos los botones+rueda, gracias a IstvanV
- 10.6 Lectura de los botones del ratón sin ejecutar la rutina
- 11 Manual en otros idiomas
Introducción
Este sofisticado interfaz ha sido diseñado especialmente para el ordenador Enterprise 64/128.
Se ha logrado culminar tras seis meses de trabajo de un desarrollador polaco multidisciplinar conocido en importantes foros como "Pear" (a instigación del colega español GFlorez, que también fue el primer probador del EnterMice junto a Zozo, de Hungría).
El objetivo principal del adaptador es permitir el uso en el micro-ordenador Enterprise de asequibles ratones PS/2. Además, permite la conexión directa de dos joysticks de norma Atari sin adaptadores adicionales.
EnterMice se basa en soluciones utilizadas en la interfaz del ratón BoxSoft, que soporta el ratón Neos (protocolo MSX).
Uno de los modos de funcionamiento de EnterMice es totalmente compatible con la antigua interfaz de ratón BoxSoft. Otro modo de operación convierte el movimiento del ratón en pulsaciones de joystick.
Un poco de historia sobre el Enterprise y ratones
Mejorar el Enterprise128 con control por ratón no es una nueva y excéntrica idea de un grupo de frikis de los retro-ordenadores, ya estaba previsto por los diseñadores originales del EP. El problema era que la misión de implementarlo fue sub-contratada a Aztec Software Ltd, una modesta compañía inglesa que suministró un resultado decepcionante, por dos razones principales: en primer lugar, el producto era feo [1], muy lejos de las formas redondeadas del Enterprise. En segundo lugar, no era un ratón adecuado, ya que se basaba en la emulación del movimiento de joystick. También en ese momento Enterprise Computing Ltd. estaba desapareciendo.
Pero la base de usuarios en el Reino Unido se mantuvo muy activa durante los siguientes años. Entusiastas del Enterprise fundaron pequeñas compañías. Se ofrecieron nuevos productos: ampliaciones de memoria, cables adaptados, juegos, utilidades, emuladores de Spectrum, una controladora IDE, Eprom, expansiones de la placa base, módems RS232, y mas.
La empresa más activa fue Boxsoft, fundada por el desarrollador Tim Box. Boxsoft ofrecía la mayor parte de los productos enumerados anteriormente. Dentro del paquete de un programa de dibujo llamado "Paintbox" [2], se comercializaba también un adaptador [3] más un ratón Neos con su controlador incluido. El Neos, internamente [4] un ratón MSX [5], ya había sido adaptado con éxito a otros ordenadores de 8 bits, como el Commodore 64.
En ese momento sólo unos pocos ordenadores de 8 bits tenían un ratón que funcionase con alguna forma de GUI. Era muy difícil vender algo nuevo de uso desconocido y no completamente integrado en el equipo. Visto desde la perspectiva actual, la ventaja de navegar por los sistemas operativos y aplicaciones con un ratón es obvia, y se aprecia aun mas en el instante en que este deja de funcionar...
Al final, sólo se vendieron alrededor de un centenar de "Paintbox".
El programa "Paintbox" llegó a Hungría en solitario. Los húngaros compraron los ordenadores Enterprise sabiendo que procedían de Reino Unido, pero no mucho más. Cuando se vendieron todos los Enterprise128, la base de usuarios fue abandonada tal como en el país de origen. Una vez más, nuevas compañías surgieron ofreciendo nuevos productos. Entonces una empresa llamada "A Studio" comenzó a fabricar y vender los artículos Boxsoft, camuflándolos como si fuesen sus propios productos. Uno de los programas era una versión de "Paintbox" sin la opción del ratón. Todavía necesitaba el controlador, pero una versión capada. En el lado este del Telón de Acero nadie oyó nunca hablar sobre qué era un ratón Neos.
Más tarde, en Hungría, salió al mercado una tarjeta de expansión RS232 [6] para el Enterprise, fruto de la genialidad de un equipo de desarrolladores húngaros: Gyula Mészáros por el hardware, y László Haluska ( HSOFT) para la parte de software. HSOFT tomó el controlador de ratón capado de "A Studio" y lo modificó para adaptarlo a la interfaz serie para su uso con un ratón "Mouse Systems". Mas tarde suministraría un controlador integrado para el sistema operativo 2.x EPDOS.
Esto ya es historia antigua, pero en los últimos años, con la WWW, Internet y la globalización, han surgido algunos de los antiguos artefactos Boxsoft + Neos y todas las piezas del rompecabezas han empezado a encajar. Por fin, las antiguas promesas (vistas en la propaganda de Enterprise Computers Ltd.) de una verdadera interfaz de ratón para el Enterprise, empiezan a hacerse realidad.
El nuevo interfaz EnterMice que es presentado aquí se basa en el trabajo del equipo Boxsoft, pero adaptado a la actualidad y mejorado con nuevas opciones. (Es un milagro lo que Tim Box logró entonces con solo una pocas puertas lógicas y diodos[7]). En cuanto a la programación, el eficaz controlador fue creado por D. Rabson, Andrew Fitter y Andrew Richards. Con pequeñas modificaciones, es el mismo controlador que se usará con el adaptador Entermice.
El principal problema que aparece en el momento de conectar un ratón o un joystick a el Enterprise es que los conectores y sus señales están muy lejos de ser un estándar. Pequeños conectores de borde de placa que pueden ser enchufados al revés, varios comunes conectados a +5v para los botones cuando lo normal es un solo común conectado a cero voltios, falta de protección en los retornos de señal cuando dos o mas botones son pulsados, ningún modo de mandar información o estado al dispositivo, y seguramente algún problema más.
Ahora, lo que Boxsoft creó con asequibles y comunes componentes, ha sido rediseñado y mejorado con dos circuitos integrados programables y otros modernos componentes. Uno de los chips (Xilinx) está al cargo de la conversión de conectores y señales al estándar de puertos de juego Atari. El interfaz original Boxsoft solo ofrecía la conversión del primer puerto de control, que era usado para conectar el ratón Neos o un joystick tipo Atari(nunca al mismo tiempo). En el presente proyecto se pueden conectar dos joystick y eso no interfiere con el conector de Ratón.
El ratón Neos(MSX) no es muy común hoy en día, por lo que se ha incluido un conversor de protocolo de PS/2 a MSX. Lo rige un económico y sencillo Atmel AT89C4051 a 12Mhz, capaz de adaptarse a la frecuencia del procesador Z80 instalado en el Enterprise. Con este circuito integrado y la apropiada programación en su interior, Entermice puede funcionar tanto en un EP a 4 MHz como en uno potenciado a 10 MHz, sin problemas.
También, el protocolo de lectura del ratón ha sido ampliado siguiendo el nuevo protocolo extendido de MSX lanzado por Prodatron(desarrollador de SymbOS) y NYYRIKKI(desarrollador de MSX). Ahora Entermice es capaz de mandar información de hasta cinco botones y una rueda si están presentes en el ratón.
Lista programas compatibles hasta la fecha
Multiplay, Iview, Cview, by Istvan-V.[8]+ File, by Zozosoft.[9] Internally.
Paintbox por medio del controlador de ratón.[10]
The Enterprise Graphical Interface por medio del controlador de ratón.[11]
SymbOS internamente, en EnterMice mode por hack[12].Por Prodatron[13].
EDC Windows, internamente en modo EnterMice y modo Hsoft driver. Usar este ejecutable modificado: [14]
SPEmu128 creado por geco, el gran emulador de Spectrum para el Enterprise, ahora es capaz de emular el ratón Kempston en juegos modificados[15], desde el movimiento de ratón de EnterMice. La lista de programas compatibles crece constántemente.[16]
Lista de juegos
Pasziansz(Solitario)[17]. Versión Rom[18]
SWAP [19]
Wolf2004 shoot'em up en primera persona. Convertido de ZX por Geco[20]
Bricky Prise. Creado por Geco, Endi y Szipucsu. Adaptado a EnterMice por Isvan-V. [21] and [22]
Five in a Row. Juego de estrategia programado en Basic. Adaptado a EnterMice por Lacika. [23]
Chess Master 2000. convertido de Amstrad por Geco.[24]
Puede funcionar en programas escritos en Basic, por medio del controlador de ratón
Viejos programas que usen el puerto joystick 1, con EnterMice en modo joystick.
Emuladores XEP128 y EP128emu
Incluso aunque no se posea un adaptador EnterMice, se puede experimentar como sería manejar simuladamente un Enterprise con un ratón. Ahora XEP128[25], el gran emulador creado por LGB, es capaz de simularlo desde el movimiento del ratón de un PC. Se puede incluso combinar con SPEmu128 para emular un Spectrum dentro del Enterprise emulado. El ratón Kempston obedecerá los movimientos del ratón del PC...
Aquí[26] se encuentra una explicación de como hay que organizar el emulador XEP128 para que funcione correctamente en un PC con Windows.
Y aquí[27] hay una explicación para OSX.
Gracias al trabajo de LGB en su emulador XEP128, IstvanV también ha actualizado EP128emu para que emule el interface EnterMice. Existe un instalador de Windows para mas fácil installación.
Puedes descargar la versión mas actual aquí[28].
Descripción General
Importante
¡No conectar el interfaz al ordenador cuando la fuente de alimentación esté encendida!
Una vez conectado el interfaz, si tu ordenador no arranca correctamente o si se comporta de forma extraña, ¡debe ser apagado inmediatamente!
Comprueba que el interfaz esté conectado correctamente y prueba de nuevo.
El ratón y los joysticks pueden ser conectados y desconectados mientras el ordenador está encendido, pero no es recomendable. Es mas seguro realizar las conexiones con la fuente de alimentación apagada.
Atención: Por favor, asegúrese de leer la sección "Como conectar otros dispositivos a EnterMice" antes de conectar algún dispositivo para el cual EnterMice no haya sido diseñado.
Conectándolo al ordenador
La placa del interfaz debe ser enchufada al mismo tiempo a tres conectores de borde de placa en la parte trasera del tu Enterprise: Control 1, Control 2 y Serial/Net. Puedes apreciar que los conectores de borde de placa del interfaz están soldados en un ángulo ligeramente mayor de 90 grados. Es completamente intencionado, para asegurar que el Entermice se adapte mejor a la forma trasera del Enterprise.
Solo puede ser conectado de una forma determinada, pero puede ser que los terminales no asienten centrados en los conectores de borde de placa. Si así sucede, el contacto puede ser inestable y el ordenador y/o el interfaz pueden no funcionar.
Correctamente conectado, el interfaz funciona inmediatamente una vez que se enciende la fuente de alimentación.
Nada mas encenderse, él mismo se hace una auto-comprobación, durante la cual ambos LEDs, rojo y verde, destellaran 3 veces (independientemente del estado del interruptor 3).
Una vez que el Entermice está conectado a el Enterprise, aunque es preferible conectar el ratón antes de encender el ordenador, el interfaz está provisto de una función de hot-plug(conectado en caliente) que reconoce cuando se ha conectado un ratón, entonces, es clasificado y puesto en marcha.
Después de la correcta inicialización,el LED verde se quedará encendido (si DS3 está ON).
Caracteristicas
El interfaz puede operar en varios modos. Para configurarlo, va provisto de una fila de cinco micro interruptores.
Los valores de configuración se pueden cambiar durante el funcionamiento de la interfaz. No es necesario reiniciar el equipo.
A continuación se muestran todas las configuraciones posibles.
DS1 | DS2 | Modo de funcionamiento |
---|---|---|
ON | ON | Modo de ratón EnterMice |
OFF | ON | Modo de ratón compatible BoxSoft. Los dos botones principales están intercambiados. El principal ahora es el derecho. |
OFF | OFF | Modo joystick EnterMice. El movimiento detectado en el ratón es redirigido a la entrada del puerto Joystick 1 y ese puerto es desactivado. |
ON | OFF | No usado (de hecho EnterMice como joystick en columna KB K) |
Joystick 2 nunca cambia, no importa en que selección de modo se halle el interfaz.
DS3 | Estado de los LEDs |
---|---|
OFF | Estado de LEDs desactivado |
ON | Estado de LEDs activado |
Configuración de modo de emulación Joystick:
DS4 | Sensibilidad |
---|---|
OFF | Normal |
ON | Alta |
DS5 | Corrección diagonal |
---|---|
OFF | Desactivada |
ON | Activada |
La corrección diagonal mejora la precisión de la simulación de joystick en los movimientos diagonales, a expensas de un ligero descenso en la velocidad.
Uso del controlador
Aquí [29] puedes encontrar el controlador.
Las siguientes instrucciones han sido tomadas del manual original de Paintbox, corregidas y después añadidas las nuevas habilidades de EnterMice.
El ratón y como usarlo en tus programas
El uso del ratón no está restringido a programas en código máquina, se puede incorporar muy fácilmente dentro de casi cualquier programa Basic. Para ello es necesario el uso de una extensión del sistema operativo(EXOS) llamado controlador de ratón("Mouse.xr").
Este controlador de dispositivo dibujará un puntero en cualquier pantalla gráfica o de texto, y mediante el control de los movimientos del ratón el puntero se deslizará en sincronía por la pantalla. El puntero en páginas de texto trabaja internamente en coordenadas gráficas, pero solo es dibujado en casillas de caracteres, por lo que el movimiento será visto como a saltos en gestos cortos.
El controlador de ratón puede ser dirigido por medio de varios comandos y funciones, por ejemplo mostrar o no el puntero. Hay dos maneras de comunicarse con el controlador de ratón, la primera es mediante la lectura y escritura en el canal del dispositivo, la segunda es por medio de las variables del sistema.
Instalación
El controlador del ratón se puede instalar por todos los métodos es decir, desde Basic "START"(si está almacenado en un cassette) o LOAD "MOUSE.XR". También se puede cargar desde el "WP", desde EXDOS o desde cualquier otro interprete(revise el manual del lenguaje de programación para más detalles).
Una vez instalado seguirá residente hasta el siguiente restablecimiento completo o hasta apagar el ordenador.
En anteriores versiones, para que funcionase correctamente, era necesario inicializarlo con el comando EXOS ":PB". El EGI y Paintbox hacen esto internamente.
Si esta usando aún una versión anticuada del controlador, nunca ejecute dos veces el comando de inicialización, ya que el Enterprise se puede quedar colgado. Ignore el mensaje de error que saldrá. El código de error (obtenido en Basic con la función EXTYPE) es 9.000 + la página de memoria donde se ha cargado el controlador. Este comportamiento fue introducido deliberadamente por los programadores del controlador.
La versión actual se auto-inicializa sola, y no colisiona con antiguos programas que usen el comando :PB, que ha sido eliminado.
Instalar varias instancias del controlador no es perjudicial ya que el sistema siempre va a usar la última, pero es un gasto inútil de memoria.
Esta es una manera muy sencilla de detectar en Basic si el controlador ya ha sido instalado:
100 WHEN EXCEPTION USE DRIVER_LOADING 110 SET 189,4 ! intenta asignar EnterMice como modo de control. Solo posible una vez instalado el controlador. 120 END WHEN
1000 HANDLER DRIVER_LOADING 1010 EXT "LOAD MOUSE.XR" ! El fichero ha de estar en el directorio actual, si no sucederá otro error. 1020 PRINT "Loading the Mouse Driver" 1030 SET 189,4 ! Aquí se asume que el controlador ha sido correctamente instalado. 1040 END HANDLER
Se puede hacer mas complejo y efectivo, asignando a una variable el valor de no-instalado dentro de la subrutina "handler", cargando después el controlador en el programa principal. Así, si el fichero no es encontrado(probablemente estemos en otro directorio), el error podrá ser tratado en la misma subrutina "handler" u otra.
Es una buena práctica evitar instalar varias veces el controlador de ratón.
Ejecutando ":HELP MOUSE" en EXOS nos va a mostrar información sobre la versión del controlador y, si el Entermice está conectado, también mostrará información sobre el Interfaz.
Comunicación con el controlador de ratón
Como se ha explicado anteriormente, hay dos maneras de comunicarse con el controlador de ratón. Para demostrar los dos métodos y sus efectos, vamos a mostrar primero todos los comandos, funciones y variables que se pueden usar dentro de un programa.
Comandos imprimibles y funciones
La primera y más importante tarea es abrir el canal del ratón, es decir:OPEN £?:"MOUSE:" (siendo ? un número de canal).
Hay que tener en cuenta que un canal de ratón siempre está asociado a un canal de vídeo donde dibujar el puntero. No se puede abrir un canal de ratón sin un canal de vídeo, y si el canal de vídeo desaparece o cambia mientras está abierto el canal de ratón, este lo detectara y se desactivará a si mismo. Recuerde que el canal permanecerá abierto pero inefectivo.
Para evitar errores, si un canal de vídeo ha de ser cerrado mientras se ejecuta un programa, antes se debe cerrar el canal de ratón al que está asociado.
También, si un programa en Basic basado en ratón se detiene, siempre hay que ejecutar CLOSE £? cuando se ejecute TEXT, porque el Editor de Basic cierra automáticamente el canal de vídeo de gráficos.
Comandos ejecutados al imprimir caracteres en el canal del ratón:
O | Activa el dibujo del puntero |
---|---|
o | Desactiva el puntero |
P | Solicita posición X e Y |
Resultados o estados obtenidos mediante la lectura de un número desde el canal del ratón:
Solo después de mandar "P":
X | Byte bajo |
X | Byte alto |
Y | Byte bajo |
Y | Byte alto |
Siempre accesible:
Fire = "1" si el botón principal se ha pulsado, "0" si no.
Variables de Sistema
Dirección | Contenido | Por defecto |
---|---|---|
180 | Canal de vídeo donde se mostrará el puntero | 101 |
181 | Posición en la Linea de Estado donde se mostraran las coordenadas X,Y | 30 |
182 | Mostrar coordenadas: 1 si, 0 no | 0 |
183 | Color del puntero {mas información en sección de tecnología} | 255 |
184 | Byte bajo de la coordenada X | |
185 | Byte alto de la coordenada X. Compruebe programa de demostración sobre conversión de coordenadas. | |
186 | Byte bajo de la coordenada Y | |
187 | Byte alto de la coordenada Y | |
188 | Estado del botón principal: 0 reposo, 1 pulsado | |
189 | Dispositivo de entrada:
0 - Joystick interno 2 botones, Espacio e Intro 1 - Control 1 3 botones, 2 - Control 2 3 botones 3 - Boxsoft de 2 a 5 botones 4 - EnterMice (por defecto) de 2 a 5 botones 5 - Serial Mouse Sytems 3 botones 6 - Serial Microsoft 2 botones >6 - No implementado |
|
190 | Estado del botón secundario y botones adicionales si existen, contador de impulsos de rueda si existe
Bits 0 a 3, semi-octeto(nibble) con signo, del contador de impulsos de la rueda(7 -> -8) Bit 4, botón de la rueda Bit 6 y 5, botones adicionales Bit 7, botón secundario Estado de los botones: 0 reposo, 1 pulsado. Si existe un tercer botón es asignado al bit 4. |
Ejemplos
100 PROGRAM "ms_test.bas" 110 NUMERIC X,V,MAX_Y",X_COUNT,LASTX,LASTY 120 GRAPHICS 130 CALL MOUSE_SETUP 130 OPEN £1:"mouse:" ! Open a channel to the Mouse 140 DO 15D CALL MOUSE_POS 160 LOOK 1:FIRE ! Check the fire button 170 IF FIRE THEN 130 PRINT £1:"o"; ! Turn the pointer off 190 PLOT LASTX,LASTY,X,Y 200 PRINT 1:"O"; ! Turn the pointer on 210 ELSE I10 PLOT X,Y, 230 END IF 240 LET LASTX=X:LET LASTY=Y 250 LOOP 250 END 270 DEF MOUSE_SETUP 280 LET CHAR_Y=20 ! No. of characters screen high 290 LET X_COUNT=2 ! Pixel calc no 300 SET 180,101 ! Video channel to put mouse pointer on 310 SET 181,30 ! Position of co-ordinates on status line 320 SET 182,1 ! Show co-ordinates 330 SET 183,255" ! Colour of pointer 310 LET MAX_Y=CHAR_Y*36-2 ! Convert char_y to co-ordinates 350 END DEF - Note X_COUNT is = to "2" in 2 colour mode "4" in 4 colour mode "8" in 16 colour mode and "16" in 255 colour mode. All these values double when in lores.
Ahora debe agregar la rutina MOUSE_POS que pide la posición del puntero al controlador. Seleccione una de las dos formas siguientes:
Lectura de las coordenadas del puntero mediante la lectura del canal del ratón..
DEF MOUSE_POS PRINT £1:"P" LOOK £1:XL LOOK £1:XH LOOK £1:YL LOOK £1:YH LET X=XL+256*XH LET Y=YL+256*YH END DEF
Lectura de las coordenadas del puntero mediante las variables de Sistema.
DEF MOUSE_POS ASK 184 XL ASK 185 XH ASK 186 YL ASK 187 YH LET X1=XL+256*XH LET X=X1*X_COUNT LET Y=YL+256*YH LET Y=Y*2 LET Y=MAX_Y—Y END DEF
También se puede ordenar al controlador donde debe dibujar el puntero:
Ajuste de las coordenadas del puntero mediante las variables del sistema.
DEF POS_MOUSE LET X=INT(X/X_COUNT) LET XL=X-256*INT(X/256) LET XH=INT(X/256) LET Y=MAX_Y-Y:LET Y=INT(Y/2) LET YL=Y-256*INT(Y/256) LET LET YH=INT(Y/256) SET 184,XL SET 185,XH SET 186,YL SET 187,YH END DEF
Este es un programa de dibujo muy sencillo, simplemente dibuja
una línea que sigue el movimiento del ratón cuando el botón
principal del ratón es pulsado. Se hace una llamada a MOUSE_POS
en la línea 150, y en función de cómo se quiere leer se debe añadir
en el programa la rutina adecuada de los dos de la lista.
También se muestra otra rutina que permite establecer la posición del puntero. Simplemente llame con la posición deseada en las variables X e Y.
Experimente con las diferentes rutinas, y trate de agregarlas en sus propios programas. No pasará mucho tiempo hasta que se acostumbre, y después de poco tiempo descubrirá lo fácil que es incorporar el ratón en los programas existentes o escribir programas específicos para ratón.
Como usar la rueda y los botones adicionales en tus programas
Manejar datos binarios(bits) en el Basic del Enterprise es lento y difícil. La Variable del Sistema 190 contiene mucha información que no es fácil de extraer:
100 GRAPHICS 110 SET 180,101 120 SET 183,255 130 OPEN #1:"MOUSE:" 140 ASK 188 A 150 ASK 190 B 160 IF (A) THEN PRINT "Main button" 170 IF (B BAND 128) THEN PRINT "Secondary button" 180 IF (B BAND 16) THEN PRINT "Central button" 190 IF (B BAND 32) THEN PRINT "Fourth button" 200 IF (B BAND 64) THEN PRINT "Fifth button" 210 LET B=(B BAND 15) 220 IF (B BAND 8) THEN LET B=B-16 230 PRINT "Wheel: ";B 240 GOTO 140
Pero puedes usar esta rutina de código maquina dentro de tus programas para separar la información en cinco octetos(bytes). Además esta rutina pondrá a cero el contador de impulsos de la rueda(Z_COUNTER) cada vez que sea ejecutada:
100 PROGRAM "EXPLOD.BAS" 105 ALLOCATE 42 110 CODE XPLOD=HEX$("18,05,00,00,00,00,00,23,06, 00,0E,BE,F7,10,FE,00,C0,7A,06,04,23,36,00,17,CB, 16,10,F8,23,7A,36,00,ED,6F,57,06,01,0E,BE,F7,10,C9") 120 GRAPHICS 130 OPEN £1:"MOUSE:" ><><><><><><> 520 CALL USR(XPLOD,XPLOD)! We pass the XPLOD address in "hl" register pair ><><><><><><> 930 PRINT PEEK(XPLOD+2)! Secondary mouse button \ 940 PRINT PEEK(XPLOD+3)! Spare button \ 950 PRINT PEEK(XPLOD+4)! Spare button / 0 idle, 1 pressed 960 PRINT PEEK(XPLOD+5)! Wheel button / 970 LET B=PEEK(XPLOD+6)! Z_COUNTER(wheel) two's complement 7 to -8 980 IF B<8 THEN PRINT B 990 IF B>7 THEN PRINT B-16
Aquí está la rutina en código maquina desensamblada:
ORG: jr CODE ;hl contains the ORG address BUTTON2: db 0 BUTTON3: db 0 BUTTON4: db 0 BUTTON5: db 0 Z_COUNT: db 0 CODE: inc hl ld b,0 ; read ld c, 0BEh ; 190 rst 030h db 10h ;EXOS 16, Read System Var 190 cp 0 ret nz ; if var 190 not found, the driver has not been loaded, return to Basic ld a, d ;put the obtained value in "a" to be exploded ld b, 4 ; we need a count of 4 for the buttons loop LOOP: inc hl ld (hl), 0 ; we don't need old values rla ; rotate left "a" and put bit 7 on carry rl (hl) ; put the carry bit on bit 0 of (hl) djnz LOOP inc hl ; we still have to extract the wheel count ld a,d ; recover original 190 variable content on "a" ld (hl), 0 ; we don't need old value rld ; we are only interested on low nibble of "a" ld d, a ; a nibble filled of zeros has come from (hl) to reset the wheel counter ; on low nibble of "a" but leaving the buttons intact on high nibble ld b, 1 ; now we need to write the variable ld c, 0BEh ; 190 rst 030h db 10h ;EXOS 16, Write System Var 190 ret ;return to Basic
Esta es la explicación del procedimiento para programar la rueda:
El semi-octeto(nibble) inferior de la variable de Sistema 190 almacena la cuenta de impulsos recibidos desde la rueda del ratón desde la última vez que fue puesto a cero. Los impulsos son positivos o negativos, el controlador los suma o resta al contador, que puede guardar un valor desde 7 hasta -8. El programa debe estar provisto de una rutina de repetición que compruebe el contador cada cierto tiempo(fácilmente con la rutina XPLOD). Una vez leído el valor, el contador ha de ser puesto a cero para esperar al siguiente ciclo(también con la rutina XPLOD). El valor encontrado(en la dirección XPLOD+6) puede entonces ser usado para realizar una tarea dentro del programa, por ejemplo deslizar el contenido de la pantalla arriba y abajo.
Observa que el botón secundario del ratón es "cableado", al contrario que los otros botones, que son "transmitidos". Por eso el botón secundario puede ser leído directamente desde la matriz del teclado(con la rutina en código máquina descrita en la sección "Leyendo datos del interfaz joystick" o mas fácil, comparando el valor de la variable 190 con 127(El botón secundario está en el bit 7):
ASK 190 SECBUTT IF SECBUTT>127 THEN GOTO MENU !Botón secundario pulsado!!!
Información técnica sobre el controlador
Ejecutando el comando :HELP en EXOS mostrará la versión del controlador en la lista de todas las extensiones.
Si se ejecuta :MOUSE se mostrará solo la versión del controlador y la forma de control que está activa en la variable de sistema 189.
Además, si Entermice está conectado y funcionando, se mostrará información sobre el interfaz.
Por ahora el controlador solo funciona en modos gráficos, pero se planea implementar también alguna forma de puntero en los modos de texto. Una vez conseguido será fácil usar el ratón, por ejemplo, en el editor de Basic, en WP o en EXDOS.
Valores posibles de la variable EXOS 183 para cambiar el color del puntero
VALOR | RESULTADO | |
---|---|---|
TINTA | COLOR | |
MODO 2 COLORES | 0 | 0 |
255 | 1 | |
MODO 4 COLORES | 0 | 0 |
240 | 1 | |
15 | 2 | |
255 | 3 | |
MODO 16 COLORES | 0 | 0 |
192 | 1 | |
12 | 2 | |
204 | 3 | |
36 | 4 | |
228 | 5 | |
48 | 6 | |
240 | 7 | |
3 | 8 | |
195 | 9 | |
15 | 10 | |
207 | 11 | |
51 | 12 | |
243 | 13 | |
63 | 14 | |
255 | 15 | |
MODO 256 COLORES | 0-255 | 0-255 |
Modo joystick del interfaz de ratón EnterMice
Un ratón conectado en el puerto PS/2 del Entermice no solo puede usarse como ratón, puede también simular un joystick. Para activar ese modo han de ponerse en OFF los dos micro-interruptores DS1 y DS2. El interfaz entonces convertirá el movimiento del ratón en el puerto PS/2 a pulsaciones de joystick en el puerto Joy 1. Ni siquiera hay que desconectar un joystick conectado allí, pues ese puerto será desactivado. El ratón mandará movimiento tal como un joystick, lo que será útil para manejar juegos o programas antiguos.
Siempre que DS3 esté en ON, El modo joystick encenderá el LED rojo, que parpadeará si algún contacto de dirección es pulsado por la emulación.
NOTA: El botón de disparo será el pulsador izquierdo del ratón. Para hacer uso del pulsador derecho del ratón se debe usar la rutina descrita en la sección "Leyendo datos del interfaz joystick".
Los puertos de joystick
EnterMice puede no solo funcionar como un interfaz de ratón, sino además como un interfaz inteligente de joystick. Cualquier joystick tipo ATARI-Kempston-Amiga puede ser enchufado en uno de los dos conectores de 9 pines de la parte trasera de la tarjeta. Si el joystick esta provisto de opción auto-disparo también funcionará. El ratón y los joystick pueden estar conectados al mismo tiempo, pues no interfieren entre si.
Leyendo datos del interfaz joystick
Originalmente los puertos de control del Enterprise solo tenían un botón de disparo, pero ahora el Entermice dispone de otros dos en cada uno de los puertos. Obviamente, no funcionarán en juegos o programas antiguos, solo en lanzamientos nuevos o nuevas conversiones de juegos.
Todos los métodos normales de leer los dos puertos funcionarán. Lo único que necesitará programación adicional serán los botones de disparo extra. A continuación se muestra una rutina de ejemplo.
100 PROGRAM "JOYFIRE2.BAS" 110 ALLOCATE 40 120 CODE FIRE=HEX$("7C,F3,D3,B5,DB,B6,FB,A5,28,04,21,00,00,C9, 21,01,00,C9") 130 DO 140 LET FIRE2=USR(FIRE,4) 150 IF FIRE2 THEN PRINT "FIRE I PRESSED" 160 LOOP
Esta es la rutina en código máquina desensamblada:
org: 7c ld a,h ; h is the row, l is the column. (H*256+L) f3 di d3b5 out (b5h),a dbb6 in a,(b6h) fb ei a5 and l ; bit 0 is J column, bit 1 is K column, and bit 2 is L column. 2804 jr z,pressed 210000 ld hl, 00h c9 ret pressed: 210100 ld hl,01h c9 ret
Puedes leer los tres botones de fuego del primer joystick cambiando en la linea de Basic "140 LET FIRE2=USR(FIRE,4)", el "4" por un "1" o un "2".(registro H=0) Para el segundo puerto debes usar "1281","1282" or "1284".(H=5)
Este método puede ser utilizado además para leer los dos botones principales del ratón, pues son compartidos con los botones de disparo del puerto 1.
Solución de problemas
Problemas con el teclado
Durante la creación del Entermice se descubrió un error bastante serio en el diseño del Enterprise.
No se nota cuando no hay nada conectado a los puertos de control 1 o 2. Pero por supuesto, EnterMice los usa...
Este problema provoca interferencias en la matriz del teclado, que también es usada para los puertos de control.
Si solo se pulsa un botón en el teclado no hay inconvenientes(ver figura 1).
Pero, si se pulsan dos teclas de la misma columna al mismo tiempo, la señal de la primera tecla colisiona con la señal de la segunda(figura 2).
¡El Enterprise no lleva diodos anti-retorno que separen las filas de la matriz del teclado!
Eléctricamente no hay peligro de cortocircuitos (el decodificador LS145 dentro del ordenador esta protegido con resistencias en colector abierto), pero las pulsaciones en el teclado pueden provocar lecturas fantasma al explorar el estado de los puertos de control externos.
La forma de solucionar el problema es añadir diodos a cada una de las filas del teclado del Enterprise, para evitar que se crucen las señales al pulsar dos o mas teclas (figura 3).
Pear ha preparado un adaptador que soluciona el problema. Si no se ha instalado aun el adaptador, con el fin de evitar errores, no se debe accionar el teclado mientras se usa el ratón o los joysticks.
Ratón Óptico Microsoft
El Ratón Óptico Microsoft PS/2 es un caso especial de ratón. Solo debe ser usado en el Entermice insertado en su adaptador USB a PS/2 original de Microsoft. Funcionará si se le conecta antes de encender la fuente de alimentación, pero en este caso particular no será reconocido si se conecta "en caliente".
EnterMice puede ser forzado a reconocer el ratón Microsoft mientras el Enterprise está encendido, solo hay que juntar los contactos de RESET del interfaz, o pulsar el botón de RESET en las nuevas versiones del interfaz (solo se re-inicializará el interfaz, no el ordenador).
Especificaciones Tecnicas
Patillaje de los conectores de joystick
patilla | señal |
---|---|
1 | Arriba |
2 | Abajo |
3 | Izquierda |
4 | Derecho |
5 | Disparo 3 |
6 | Disparo 1 |
7 | +5 V |
8 | Masa |
9 | Disparo 2 |
Mapa de Control
columna J (bit 0) | columna K (bit 1) | columna L (bit 2) | |||||
---|---|---|---|---|---|---|---|
JM=0* | JM=1* | JM=0 | JM=1 | JM=0 | JM=1 | ||
Control 1 | Fila 0 disparo | Joy 1 Disp 1 | Ratón Btn Izq | Ratón Btn Izq o Joy 1 Disp 2* | Joy 1 Disp | Ratón Btn Der o Disp 3 Joy 1* | |
Fila 1 Arriba | Joy 1 Arriba | Ratón D0 | Ratón D0 | libre | libre | libre | |
Fila 2 Abajo | Joy 1 Abajo | Ratón D1 | Ratón D1 | libre | libre | libre | |
Fila 3 Izquierda | Joy 1 Izquierda | Ratón D2 | Ratón D2 | libre | libre | libre | |
Fila 4 Derecha | Joy 1 Derecha | Ratón D3 | Ratón D3 | libre | libre | libre | |
Control 2 | Fila 5 Fuego | Joy 2 Fuego 1 | Joy 2 Fuego 2 | Joy 2 Fuego 3 | |||
Fila 6 Arriba | Joy 2 Arriba | libre | libre | libre | libre | ||
Fila 7 Abajo | Joy 2 Abajo | libre | libre | libre | libre | ||
Fila 8 Izquierda | Joy 2 Izquierda | libre | libre | libre | libre | ||
Fila 9 Derecha | Joy 2 Derecha | libre | libre | libre | libre |
* Los botones del ratón tienen alta prioridad * JM=0 (DS1 ON) Modo Entermice nativo JM=1 (DS1 OFF) Emulación de joystick y modo compatible BoxSoft
Como conectar otros dispositivos a EnterMice
Sega Twister
Como conectar un mando Sega de seis botones [30]
Información sobre la electrónica de un mando Sega de seis botones
Protocolo para explorar un mando de SEGA MegaDrive's con 6 botones
pin | Select = Bajo | Select = Alto | Select = pulso-3 |
---|---|---|---|
1 | Arriba | Arriba | Botón Z |
2 | Abajo | Abajo | Botón Y |
3 | MASA | Izquierda | Botón X |
4 | MASA | Derecha | no usado |
5 | +5V | ||
6 | Botón A | Botón B | no usado |
7 | Seleccionar | ||
8 | MASA | ||
9 | Start | Botón C | no usado |
Ratón Neos
Patilla | Función |
---|---|
1 | Arriba |
2 | Abajo |
3 | Izquierda |
4 | Derecha |
5 | No conectado |
6 | /Selección-Int. Izq. |
7 | +5V |
8 | MASA |
9 | Interruptor Derecho. |
Ratón MSX
pin | Función |
---|---|
1 | Arriba |
2 | Abajo |
3 | Izquierda |
4 | Derecha |
5 | +5V |
6 | Interruptor Izquierdo |
7 | Interruptor Derecho |
8 | Selección |
9 | MASA |
Accesorios USB
La corriente máxima disponible en el conector PS/2 está limitada por la eficacia de los estabilizadores internos del Enterprise. En la práctica, la carga no debe superar los 300 mA.
3D housing
First version (DIP switch on the component side)
Second version (DIP switch on the side of the edge connectors)
Información para desarrolladores
Sincronismos de EnterMice
La programación dentro de EnterMice está optimizada para la lectura cíclica con una frecuencia de 50 Hz (video IRQ).
Ciclo de lectura por defecto | 20 ms |
Periodo de espera para auto-comprobación del ratón PS/2(timeout) | aprox. 2000 ms |
Tiempo de recogida de datos del ratón PS/2 | max. 12 ms |
Intervalo desde que se cambia el estado de la señal RTS hasta que se consigue leer un semi-octeto(nibble) | 25 μs |
Espera hasta la siguiente lectura(contando desde que se recogió el dato) | 14 μs |
Plazo de cancelación desde que se lee el último semi-octeto(nibble) hasta poner a cero la cuenta de semi-octetos(timeout)* | 1500 μs |
Periodo de tiempo por defecto para la exploración del ratón en modo de emulación joystick | 30 ms |
En modo joystick, tiempo de exploración del ratón cuando este no se mueve (espera de exploración minimizada) | 12,5 ms |
* Después de este intervalo comienza otra recogida de datos del ratón.
Memoria intermedia de datos(búfer)
El búfer de datos de EnterMice tiene un tamaño de 16 octetos.
Actualmente solo se usa la mitad. El resto está reservado para mejoras futuras.
Bits | Octeto alto | Octeto bajo | Contenido | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||
0 | Valor X | Entero con signo (positivo es movido hacia la izquierda) | Protocolo BoxSoft | |||||||||
1 | Valor Y | Entero con signo (positivo es movido hacia arriba) | ||||||||||
2 | 0 | 0 | 0 | 1 1) | 0 | Btn5 | Btn4 | Btn3 | Identif. protocolo y estado botones 3,4,5 (1=pulsado) | Protocolo extendido MSX | ||
3 | Rueda Horizontal 2) | Valor Z | Entero con signo (positivo es rueda girada arriba) | |||||||||
4 | ExCnt 3) | Mouse ID | Cuenta de bytes a leer (incluido este) & PS/2 mouse ID | Protocolo extendido EnterMice | ||||||||
5 | Hw ver. my. | Hw ver. mn. | Versión Hardware (mayor.menor) | |||||||||
6 | Fw ver. my. | Fw ver. mn. | Versión Firmware (mayor.menor) | |||||||||
7 | ID de dispositivo | EnterMice ID es 5Dh |
1) Si el dispositivo sólo es compatible con el protocolo BoxSoft, el quinto nibble es siempre igual a 0000.
2) No implementado aun, por ahora los 8 bits representan el valor Z (Rueda Vertical).
3) Si el dispositivo no es compatible con el protocolo EnterMice, el noveno nibble es siempre igual a 0000.
No es necesario leer todos los datos del búfer.
La lectura puede ser interrumpida en cualquier momento. El interfaz entonces esperará el plazo de cancelación, tras lo cual leerá datos del ratón y estará listo para empezar de nuevo a mandar datos.
El último estado de RTS tampoco importa(sí en el protocolo Neos-MSX original). EnterMice reacciona a los cambios de estado, no al nivel de la señal.
Lectura del ratón
; Here begin the Neos mouse reading | ||
ld hl,X_REL | ; first byte | |
ld a,2 | ; put RTS low, the contrary to normal MSX | |
out (0B7h),a | ||
ld b,3 | ; long delay. Stock was 8 | |
call WAIT | ||
call READ_4BIT | ; read four higher bits | |
rld | ; push them in (HL) | |
xor a | ; put RTS high | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four lower bits | |
rld | ; push them in (HL) | |
ld hl,Y_REL | ; second byte | |
ld a,2 | ; put RTS low | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four higher bits | |
rld | ; push them in (HL) | |
xor a | ; put RTS high | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four lower bits | |
rld | ; push them in (HL) | |
;<======Here will be added the future Wheel and three spare buttons reading. SECOND TENTATIVE | ||
ld hl,SW_Z_STATUS | ||
ld a,2 | ; put RTS low | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four higher bits | |
and 15 | ||
cp 1 | ; IF THIS NIBBLE=0001 THEN THE MOUSE IS IN EXTENDED PROTOCOL | |
jr z,CONTINUE_READ | ||
xor a | ; we must leave RTS high for the next mouse reading cycle | |
out (0B7h),a | ;IGNORE THAT NIBBLE | |
ld (hl),0 | ; we don't need old values | |
jr STOP_READ | ||
CONTINUE_READ: | ||
xor a | ; put RTS high | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four higher bits, the three lower bits are the buttons. They come ready to store | |
push af | ; push them in stack. they are in the lower nibble. | |
ld a,(hl) | ; | |
push af | ;save the Z counter for later. | |
ld a,2 | ; put RTS low | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four bits | |
rld | ;we need z displacement in 8 bit | |
xor a | ; put RTS high for the next mouse reading cycle | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four lower bits. Z displacement | |
rld | ; push them in (HL) ;NOW WE HAVE Z displacement in (hl) | |
pop af | ; restored Z counter to "a", but we have garbage on high nibble | |
and 00Fh | ||
bit 3,a | ||
jr z,SIGN_DONE | ||
or 0F0h | ||
SIGN_DONE: | ; now we have the sign extended to 8 bits on "a" | |
add a,(hl) | ||
cp 128 | ; positive or negative? | |
jr c,POSITIVE | ||
cp 248 | ; lower than -8? | |
jr nc,FINISHED | ; | |
ld a,248 | ; -8 is the bottom | |
jr FINISHED | ||
POSITIVE: | ||
cp 8 | ; higher than 7? | |
jr c,FINISHED | ||
ld a,7 | ; 7 is the top | |
FINISHED: | ; the excess of 7 or -8 has been wiped | |
ld c,a | ; save Z addition on c | |
pop af | ; retrieve the buttons status. They are now on first nibble of a | |
rld | ; buttons stored | |
ld a,c | ; we only need the first nibble of Z counter addition | |
rld | ; the spare buttons status and the Z counter are now in SW_Z_STATUS | |
STOP_READ: | ||
xor a | ; recall buttons on row 0 | |
out (0B5h),a | ||
in a,(0B6h) | ; read Mouse buttons | |
and 7 | ; mask | |
xor 7 | ; flip them all as on Enterprise a pressed key is 1 and released 0 | |
rl (hl) | ; Get ready the bit 7 of "hl" register pair. Inside is SW_Z_STATUS, variable number 190 | |
srl a | ; This is the very FIRST "srl a". The button status is now in the carry flag | |
; secondary button of Boxsoft is read on J column. Primary button of EnterMice is read on K column | ||
push af | ||
ld a,(INPUT_DEVICE) | ||
cp 3 | ; Boxsoft interface mode buttons | |
jr nz,L_BUTTON | ||
pop af | ; We need the value of "a" and "f" registers. Carry flag still stores the value of secondary button | |
rr (hl) | ; secondary button goes to bit 7 of SW_Z_STATUS, variable number 190 | |
srl a | ; Primary button of Boxsoft is on J column. This is the second "srl a" | |
JR MAIN_BUTTON | ||
L_BUTTON: | ; EnterMice interface mode buttons | |
pop af | ; retrieve the value of register "a". "f" is disposable, soon we will load the button on carry flag | |
push af | ; I still will need later the register "a" value | |
srl a | ; two "srl a" because the secondary button of EnterMice is read on L column | |
srl a | ; the proper button status is now in the carry flag | |
rr (hl) | ; secondary button goes to bit 7 of SW_Z_STATUS, variable number 190 | |
pop af | ; retrieve the value of register "a" just after the FIRST "srl a" | |
MAIN_BUTTON: | ||
and 1 | ||
ld (FIRE_STATUS),a | ; EXOS Variable 188. K column if Boxsoft or L column if EnterMice | |
call sub_C3A6 | ; this is the "corrections and drawing" routine where the "velocity" 1.1 modification was made | |
ld a,(X_REL) | ||
ld c,a | ||
ld a,(Y_REL) | ||
or c | ||
ret | ||
XXXXXXXXXXXXXX | XXXXXXXXXXXXXXXXXXXX | XXXXXXXXXXXXXX |
WAIT: | ||
nop | ||
nop | ||
nop | ||
dec b | ||
jr nz,WAIT | ||
ret | ||
XXXXXXXXXXXXXX | XXXXXXXXXXXXXXXXXXXX | XXXXXXXXXXXXXX |
READ_4BIT: | ; I split the routine in two to not put more processor time | |
ld b,4 | ||
ld d,0 | ||
ld a,(INPUT_DEVICE) | ||
cp 3 | ||
jr z,J_COLUMN | ||
K_COLUMN: | ||
ld a,b | ||
;inc c | ; this is not necessary | |
out (0B5h),a | ||
in a,(0B6h) | ||
;ld c,a | ; this is not necessary | |
rra | ; data read from K column | |
rra | ||
rl d | ||
djnz K_COLUMN | ||
jr CONTINUE | ||
J_COLUMN: | ||
ld a,b | ||
;inc c | ; this is not necessary | |
out (0B5h),a | ||
in a,(0B6h) | ||
;ld c,a | ; this is not necessary | |
rra | ; data read from J column | |
rl d | ||
djnz J_COLUMN | ||
CONTINUE: | ||
ld a,d | ||
ret |
Lectura Mínima de EnterMice, gracias a Bruce Tanner
Esta rutina de solo 79 octetos es estrictamente protocolo MSX, solo lee movimiento mas los dos botones principales. Está concebida para hacer mas fáciles nuevas conversiones o adaptaciones de viejos programas o juegos. Debe ser gobernada por una interrupción de 50 hercios, y asume que X_REL y Y_REL están contiguos en la memoria.
ld hl, X_REL | ;first byte, X displacement since last lecture | |
ld b,3 | ;long delay | |
call READ_8BIT | ||
inc hl | ;Y_REL | |
ld b,2 | ;short delay | |
call READ_8BIT | ;leaves B=0 | |
xor a | ||
out (0B5h), a | ||
in a, (0B6h) | ||
and 6 | ||
xor 6 | ||
srl a | ; here the status of J column is on carry, but is discarded | |
srl a | ||
rl b | ; K column is saved in b | |
ld (SECBUTT_STATUS), a | ; L column is the Right Mouse Button | |
ld a,b | ||
ld (MAINBUTT_STATUS), a | ; K column is the Left Mouse Button | |
ld a, (HL) | ;Y-rel | |
dec hl | ;X-REL | |
or (hl) | ;If a=0, no movement | |
ret | ||
XXXXXXXXXXXXXXXX | XXXXXXXXXXXXXXXXXXXXXXXX | XXXXXXXXXXXXXXXXXXX |
WAIT: | ||
nop | ||
nop | ||
nop | ||
dec b | ||
jr nz, WAIT | ||
ret | ||
XXXXXXXXXXXXXXXX | XXXXXXXXXXXXXXXXXXXXXXXX | XXXXXXXXXXXXXXXXXXX |
READ_8BIT: | ld a,2 | ;RTS low |
out (0B7h), a | ||
call WAIT_READ_4BIT | ; read four higher bits | |
xor a | ;RTS high | |
out (0B7h), a | ||
ld b, 2 | ;short delay | |
WAIT_READ_4BIT: | call WAIT | ;leaves B=0 |
READ_4BIT: | ||
ld d, b | ;d=0 | |
ld b, 4 | ||
READ_LOOP: | ||
ld a, b | ||
out (0B5h), a | ||
in a, (0B6h) | ||
rra | ;data is read from K column | |
rra | ||
rl d | ||
djnz READ_LOOP | ||
ld a, d | ||
rld | ||
ret |
Una rutina aun mas condensada que lee Ratón+todos los botones+rueda, gracias a IstvanV
Esta rutina incluso comprueba el principio del cuadro de video(50Hz).
;read EnterMice mouse input, returns: | ||
; Z flag = input is valid | ||
; H = X_REL | ||
; L = Y_REL | ||
; A bits 0 and 1 = buttons 1 and 2 | ||
; D bits 0 to 2 = buttons 3 to 5 | ||
; E bits 0 to 3 = mouse wheel Y | ||
MOUSEINPUT: | ||
DI | ||
VSYNCWAIT1: | IN A,(0B4H) | |
AND 10H | ||
JR Z,VSYNCWAIT1 | ||
VSYNCWAIT2: | IN A,(0B4H) | |
AND 10H | ||
JR NZ,VSYNCWAIT2 | ||
LD C,4 | ||
READ_LOOP_1: | LD H,L | |
LD L,D | ||
LD D,E | ||
LD E,01H | ||
LD A,02H | ;RTS low | |
READ_LOOP_2: | OUT (0B7H),A | |
LD B,17 | ;25.6 us at 10 MHz without wait states | |
M_WAIT_LOOP: | DJNZ M_WAIT_LOOP | |
LD B,4 | ||
READ_LOOP_3: | LD A,B | |
OUT (0B5H),A | ||
IN A,(0B6H) | ||
RRA | ;data is read from K column | |
RRA | ||
RL E | ||
DJNZ READ_LOOP_3 | ||
LD A,B | ;RTS high | |
JR NC,READ_LOOP_2 | ||
DEC C | ||
JR NZ,READ_LOOP_1 | ||
OUT (0B5H),A | ;A = 0 | |
IN A,(0B6H) | ||
CPL | ||
AND 06H | ;bit 0 = left button, | |
RRA | ;bit 1 = right button | |
BIT 7,D | ;bits 5 to 7 of button state must be 0 | |
RET | ;IRQ disabled, Z = mouse detected |
Lectura de los botones del ratón sin ejecutar la rutina
EnterMice trata los botones principales(cableados) de diferente manera que Boxsoft+Neos. En el adaptador original siempre se puede leer el estado de los dos botones tal como se hace para leer los botones de disparo de los joysticks, escribiendo un cero o un cinco en el puerto B5h del procesador Z80, y después se lee el valor de retorno en el puerto B6h. Esto independientemente de si se llama o no a la rutina de lectura de movimiento de ratón.
Debido a la naturaleza programada, no cableada, del convertidor de PS/2, esto no puede hacerse directamente con EnterMice. Pero los botones en solitario pueden ser accedidos fácilmente cambiando el estado de RTS(a 0v al menos 2 μs, y entonces de nuevo a 12v antes de escribir un cero en el puerto B5h). Entonces, después de 1,5 ms, EnterMice comenzara a traducir los datos de PS/2(en el peor de los casos tardará 12 ms), poniendo en el puerto B6h los valores correctos de los botones.
Ejemplo:
ld a,2 | ||
out (0B7h),a | ;RTS is put low | |
CODE | ||
CODE | ||
CODE | ||
CODE | ||
CODE | ||
CODE | ||
CODE | ||
xor a | ||
out (0B7h),a | ;RTS is put high again | |
out (0B5h),a | ;Keyboard row 0 is requested | |
in a, (0B6h) | ;The two mouse buttons are read on bits 1 and 2 |