EnterMice (Spanish)

From Enterprise Wiki
Jump to: navigation, search
EnterMice

Interfaz de Ratón PS/2 y Puertos de Joystick para el ordenador Enterprise 64/128

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.

File.jpg

Paintbox por medio del controlador de ratón.[10]

Paintbox.png

The Enterprise Graphical Interface por medio del controlador de ratón.[11]

EGI.JPG

SymbOS internamente, en EnterMice mode por hack[12].Por Prodatron[13].

SymbOS.png


EDC Windows, internamente en modo EnterMice y modo Hsoft driver. Usar este ejecutable modificado: [14]

Edcw.png

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]

Moorhun.png

Lista de juegos

Pasziansz(Solitario)[17]. Versión Rom[18]

Pasziansz1.PNG

SWAP [19]

Swap.gif

Wolf2004 shoot'em up en primera persona. Convertido de ZX por Geco[20]

Wolf2004.png

Bricky Prise. Creado por Geco, Endi y Szipucsu. Adaptado a EnterMice por Isvan-V. [21] and [22]

Bricky.png

Five in a Row. Juego de estrategia programado en Basic. Adaptado a EnterMice por Lacika. [23]

Fiverow.jpg

Chess Master 2000. convertido de Amstrad por Geco.[24]

Cm2000.JPG

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

Vista frontal del Entermice
Vista trasera del Entermice

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

download

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

Figura 1
Figura 2
Figura 3

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.

Solución para el teclado (recreación) Keyboard fixer Keyboard fixer inside the Enterprise Keyboard connected via fixer

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

Sega Twister diagrama
Prototipo
Modificación en Entermice
EnterMice con el adaptador

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

Patillaje de un mando Sega
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

Neos Twister diagrama
Patillaje del 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

MSX Twister diagrama
Patillaje 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.

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

Manual en otros idiomas

Inglés

Polaco

Alemán

Húngaro