In Mouse Burrow
How to Catch a Mouse - The Guide

26 Sep 2020 Fredrik Hussman 152 0 comments
  • EN Language
  • IT Language
Bios Award
Drawing from the Engelbart patent
The Mouse is one of the components that has characterized and modified the approach to personal computers. Patented in 1967, it is still used today. This hardware device allows the operator to position a pointer on the screen and then perform selection operations simply by moving the device over a plane. The displacements are sent to a controller which derives the position of the x and y axes, translating them into coordinates to position the graphic pointer on the screen. The device usually also has 2 or more keys, some models are equipped with an additional wheel placed in the center of the keys to allow various combinations and therefore allow multiple functions.
Bios Award
Classic mouse 4 button

From the first models marketed to today, the electronic components and construction techniques are different, but the principle of operation or at least that of final use, has remained unchanged over time.

The topic I will deal with will essentially be limited to learning how to operate and I will describe how to interface with this device directly.


Bios Award
Mouse Pointer in Text Mode
Not going into electronic specifications, we can immediately learn that the mouse transmits with the computer through hardware switches "interrupt" or more precisely IRQ "Interrupt Request". The so-called software drivers that we are used to installing on our operating systems, exploit these IRQs to allow them to work, translate the movements and the state of the mouse buttons.



Software drivers are programs that make it possible to interface hardware peripherals with the computer's operating system. Although there are standard specifications on what to base development on, some manufacturers use different specifications than the standards using different IRQs causing poor compatibility with certain operating systems or software.

Programming specification

So, like all hardware peripherals, the mouse also has its own standard communication IRQs. In AT / XT systems, interrupt 33h provides many functions to better manage our beloved mouse.
Bios Award
Multiple Icon Selection
Before carrying out special operations, it is necessary to check if the device is installed on our hardware and the 00h service allows us to know the status of the device connected to the computer. If the device is present we could later use the other available services provided by interrupt 33h.

The following example shows how to access the service by obtaining the status of the mouse:




CodeExample 1: Mouse Check / Source code: Assemby


MOV AX, 00H ; REQUEST THE SERVICE INT 33H ; CALL INTERRUPT 33H


The result will always be given by the AX register which will contain 0000h if the mouse is absent and ffffh if the mouse is present; it will also be possible, through the BX register, to know the number of mouse buttons.

CodeExample 2: Mouse Check / Source code: Pascal

VAR MOUSE_FOUND : BOOLEAN; MOUSE_BUTTON : INTEGER; BEGIN MOUSE_FOUND := FALSE; (* SET MOUSE_FOUND ON FALSE INITIALLY *) ASM MOV AX, 00H (* REQUEST THE SERVICE *) INT 33H (* CALL INTERRUPT 33H *) CMP AX, FFFFH (* COMPARE THE REGISTER AX *) JE @DONE (* IF MOUSE NOT FOUND TO JUMP *) (* AT END. *) MOV MOUSE_FOUND, TRUE (* OTHERWISE SET THE MOUSE_FOUND ON TRUE *) MOV MOUSE_BUTTON, BX (* AND NUMBER OF THE BUTTONS ON MOUSE_BUTTON. *) @DONE: (* END CHECK *) END; IF MOUSE_FOUND = TRUE THEN (* VERIFY THE RESULT STATUS *) BEGIN (* IF MOUSE INSTALLED GO TO WRITE RESULT *) WRITELN('MOUSE INSTALLED!'); WRITELN(' BUTTON: ', MOUSE_BUTTON); (* VIEW MOUSE BUTTONS *) END ELSE WRITELN('MOUSE NOT FOUND!'); (* OTHERWISE PRINT NOT FOUND MESSAGE *) END.


The result will be as follows:

MOUSE INSTALLED!
BUTTON: 2

Control Pointer

We have briefly seen how to obtain a verification of the presence of the device (Mouse) on our computer, then we can analyze a more complete list that allows us to use other available services and know the position of the mouse and the state of the buttons.

CodeProgram 1: Mouse Control / Source code: Pascal

USES CRT; VAR MOUSE_FOUND : BOOLEAN; MOUSE_BUTTON : INTEGER; MOUSE_PRESSED: INTEGER; MOUSEX, MOUSEY : INTEGER;

PROCEDURE MOUSECHECK; (* PROCEDURA DI VERIFICA MOUSE *) BEGIN ASM MOV MOUSE_FOUND, FALSE MOV AX, 0000H INT 33H CMP AX, 0FFFH JE @DONE MOV MOUSE_FOUND, TRUE MOV MOUSE_BUTTON, BX @DONE: END; END;

BEGIN CLRSCR; (* PULISCO LO SCHERMO *) MOUSECHECK; (* VERIFICO SE INSTALLATO IL MOUSE *) IF MOUSE_FOUND THEN (* SE L'ESITO E VERO PROSEGUO *) BEGIN REPEAT ASM MOV AX, 01H (* MOSTRO A VIDEO IL CURSORE DEL MOUSE *) INT 33H (* CONSULTO L'INTERRUPT 33H *) MOV AX, 03H (* RICHIEDO LE POSIZIONI E LO STATO DEI*) INT 33H (* PULSANTI. *) MOV MOUSEX, CX (* RECUPERO DA CX L'ASSE X *) MOV MOUSEY, DX (* RECUPERO DA DX L'ASSE Y *) MOV MOUSE_PRESSED, BX (* RECUPERO DA BX LO STATO DEI *) END; (* PULSANTI *) GOTOXY(1,20); (* STAMPO A VIDEO I RISULTATI *) WRITELN('Mouse Installato!'); (-) WRITELN('Asse X.............: ', MOUSEX DIV 8 + 1:2); (-) WRITELN('Asse Y.............: ', MOUSEY DIV 8 + 1:2); WRITELN('Numero pulsanti....: ', MOUSE_BUTTON); WRITE('Pulsante premuto...: ', MOUSE_PRESSED); CASE MOUSE_PRESSED OF (* VERIFICO QUALE PULSANTE E *) (* STATO PREMUTO *) 1: WRITELN('PULSANTE SINISTRO':20); 2: WRITELN('PULSANTE DESTRO':20); 3: WRITELN('ENTRAMBI I PULSANTI':20); END; UNTIL KEYPRESSED; (* ATTENDO TASTO PER USCIRE *) END; END.


As you can see, the lines marked (-) have been divided by 8, this is because the 03h service detects the positions in pixels, therefore, to obtain the coordinates suitable for text mode, column and row, this is necessary.
Bios Award
Classic Mouse (Type Ps2)
Also, re-entering specific dos, we must make sure that the upper left corner starts from 1 and not from 0, that's why the + 1. The remainder :2 is for the WriteLn command to have a padding of 2 characters.

The following source is similar to the previous one, the only difference is the use of the MouseLib library of the uTPk Framework. The MouseLib library includes functions and procedures for complete mouse management which are listed in the download section header.

CodeProgram 2: Mouse Control / Source code: Pascal - Framework uTPk


USES CRT, MOUSELIB; VAR MOUSE: TMOUSE; BEGIN CLRSCR; MOUSE.INIT; IF MOUSE_EXISTS THEN BEGIN REPEAT GOTOXY(1, 1); WRITELN('MOUSE INSTALLED!'); WRITELN('MOUSE X........:', MOUSE.MX:2)); WRITELN('MOUSE Y........:', MOUSE.MY:2)); WRITE ('MOUSE BUTTON...:', MOUSE.BUTTON, ' - '); CASE MOUSE.CLICK OF 1 : WRITELN('MOUSE LEFT PRESSED':20); 2 : WRITELN('MOUSE RIGHT PRESSED':20); 1 : WRITELN('MOUSE BOTH PRESSED':20); END; UNTIL KEYPRESSED; END ELSE WRITELN('MOUSE NOT INSTALLED!';
END.


In the following download you will find the compiled example program and the pascal source.

Minimal system configuration:

  • CPU 8088 / Pentium
  • RAM 640K
  • SO: DOS
Download
MouseControl Example
DOWNLOAD



Bios Award
Drawing from the Engelbart patent
Il Mouse è uno dei componenti che ha caratterizzato e modificato l'approccio con i personal computer. Brevettato nel 1967, oggi viene ancora usato. Questa periferica hardware consente all'operatore di posizionare a video un puntatore e quindi svolgere operazioni di selezione semplicemente spostando la periferica sopra un piano. Gli spostamenti vengono inviati ad un controller che ne ricava la posizione degli assi x e y traducendoli in cordinate per posizionare il puntatore grafico sullo schermo. Il device dispone solitamente anche di 2 o più tasti, alcuni modelli sono provvisti di un'ulteriore rotellina posta al centro dei tasti per consentire svariate combinazioni e quindi consentire molteplici funzioni.
Bios Award
Classic mouse 4 button

Dai primi modelli commercializzati ad oggi le componenti elettroniche e le tecniche di costruzione sono diverse, ma il principio di funzionamento o quantomeno quello di utilizzo finale, è rimasto inalterato nel tempo.

L'argomento che andrò a trattare si limiterà essenzialmente nell' apprendimento del funzionamento e descriverò come interfacciarsi con questo dispositivo in modo diretto.

Bios Award
Mouse Pointer in Text Mode
Non entrando in specifiche elettroniche, possiamo da subito apprendere che il mouse trasmette con il computer attraverso degli interruttori hardware "interrupt" o più precisamente IRQ "Interrupt Request". I cosidetti driver software che siamo abituati ad installare sui nostri sistemi operativi, sfruttano questi IRQ per consentirne il funzionamento , tradurne i movimenti e lo stato dei pulsanti del mouse.



I driver software sono programmi che rendono possibile interfacciare periferiche hardware con il sistema operativo del computer. Nonostante esistono specifiche standard sulle quli basare lo sviluppo, alcuni produttori utilizzano specifiche diverse dagli standard utilizzando IRQ diversi causando scarse compatibilità con determinati sistemi operativi o software.

Specifiche di programmazione

Quindi, come tutte le periferiche hardware, anche il mouse ha i suoi IRQ standard di comunicazione. Nei sistemi AT/XT l'interrupt 33h fornisce molte funzioni per gestire al meglio il nostro amato topolino.
Bios Award
Multiple Icon Selection


Prima di effettuare operazioni particolari occore verificare se il device è installato sul nostro hardware ed il servizio 00h ci consente di conoscere lo stato del dispositivo connesso al computer. Se il dispositivo è presente potremmo in seguito utilizzare gli altri servizi disponibili forniti dall' interrupt 33h.

L'esempio che segue mostra come accedere al servizio ricavandone lo stato del mouse:


CodeEsercizio 1: Mouse Check / Source code: Assemby

 
MOV AX, 00H ; RICHIEDO IL SERVIZIO INT 33H ; CHIAMO L'INTERRUPT 33H


Il risultato sarà dato sempre dal registro AX che conterrà 0000h se il mouse è assente e ffffh se il mouse è presente, inoltre sarà possibile, attraverso il registro BX, di conoscere il numero di pulsanti del mouse.

CodeEsercizio 2: Mouse Check / Source code: Pascal

VAR MOUSE_FOUND : BOOLEAN; MOUSE_BUTTON : INTEGER; BEGIN MOUSE_FOUND := FALSE; (* SETTO INIZIALMENTE MOUSE_FOUND SU FALSE *) ASM MOV AX, 00H (* RICHIEDO IL SERVIZIO *) INT 33H (* CHIAMO L'INTERRUPT 33H *) CMP AX, FFFFH (* COMPARIAMO IL REGISTRO AX *) JE @DONE (* SE IL MOUSE NON E' INSTALLATO SALTO *) (* ALLA FINE. *) MOV MOUSE_FOUND, TRUE (* ALTRIMENTI SETTO LA VARIABILE *) (* MOUSE_FOUND SU TRUE *) MOV MOUSE_BUTTON, BX (* E IL NUMERO DI PULSANTI IN *) (* MOUSE_BUTTON. *) @DONE: (* FINE CHECK *) END; IF MOUSE_FOUND = TRUE THEN (* VERIFICO IL RISULTATO *) BEGIN (* SE INSTALLATO PROCEDO STAMPANDO *) (* A VIDEO IL RISULTATO *) WRITELN('MOUSE INSTALLED!'); WRITELN(' BUTTON: ', MOUSE_BUTTON); (* VISUALIZZO NUMERO PULSANTI *) END ELSE WRITELN('MOUSE NOT FOUND!'); (* ALTRIMENTI STAMPO L'ESITO NEGATIVO *) END.


Il risultato sarà come segue:

MOUSE INSTALLED!
BUTTON: 2

Controllo del puntatore

Abbiamo visto brevemente come ottenere una verifica della presenza del device (Mouse) sul nostro computer, in seguito possiamo analizzare un listato più completo che ci permette di utilizzare altri servizi disponibili e conoscere la posizione del mouse e lo stato dei pulsanti.

CodeProgram 1: Mouse Control / Source code: Pascal

USES CRT; VAR MOUSE_FOUND : BOOLEAN; MOUSE_BUTTON : INTEGER; MOUSE_PRESSED: INTEGER; MOUSEX, MOUSEY : INTEGER;

PROCEDURE MOUSECHECK; (* PROCEDURA DI VERIFICA MOUSE *) BEGIN ASM MOV MOUSE_FOUND, FALSE MOV AX, 0000H INT 33H CMP AX, 0FFFH JE @DONE MOV MOUSE_FOUND, TRUE MOV MOUSE_BUTTON, BX @DONE: END; END;

BEGIN CLRSCR; (* PULISCO LO SCHERMO *) MOUSECHECK; (* VERIFICO SE INSTALLATO IL MOUSE *) IF MOUSE_FOUND THEN (* SE L'ESITO E VERO PROSEGUO *) BEGIN REPEAT ASM MOV AX, 01H (* MOSTRO A VIDEO IL CURSORE DEL MOUSE *) INT 33H (* CONSULTO L'INTERRUPT 33H *) MOV AX, 03H (* RICHIEDO LE POSIZIONI E LO STATO DEI*) INT 33H (* PULSANTI. *) MOV MOUSEX, CX (* RECUPERO DA CX L'ASSE X *) MOV MOUSEY, DX (* RECUPERO DA DX L'ASSE Y *) MOV MOUSE_PRESSED, BX (* RECUPERO DA BX LO STATO DEI *) END; (* PULSANTI *) GOTOXY(1,20); (* STAMPO A VIDEO I RISULTATI *) WRITELN('Mouse Installato!'); (-) WRITELN('Asse X.............: ', MOUSEX DIV 8 + 1:2); (-) WRITELN('Asse Y.............: ', MOUSEY DIV 8 + 1:2); WRITELN('Numero pulsanti....: ', MOUSE_BUTTON); WRITE('Pulsante premuto...: ', MOUSE_PRESSED); CASE MOUSE_PRESSED OF (* VERIFICO QUALE PULSANTE E *) (* STATO PREMUTO *) 1: WRITELN('PULSANTE SINISTRO':20); 2: WRITELN('PULSANTE DESTRO':20); 3: WRITELN('ENTRAMBI I PULSANTI':20); END; UNTIL KEYPRESSED; (* ATTENDO TASTO PER USCIRE *) END; END.


Come si può notare alle righe contrassegnate (-) è stata effettuata una divisione per 8, questo perchè il servizio 03h rileva le posizioni in pixel, quindi,
Bios Award
Classic Mouse (Type Ps2)
per ottenere le cordinate adatte alla modalità testo, ovvero colonna e riga, bisogna effettuare questo accorgimento. Inoltre, rientrando in specifiche dos, dobbiamo fare in modo che l'angolo superiore sinistro parti da 1 e non da 0, ecco perchè il + 1. Il restante :2 serve al comando WriteLn di avere un padding di 2 caratteri.

Il sorgente che segue è analogo al precedente, l'unica differenza è l'uso del libreria MouseLib del Framework uTPk. La libreria MouseLib include funzioni e procedure per una completa gestione del Mouse che sono elencate nell' header sezione download.


CodeProgram 2: Mouse Control / Source code: Pascal - Framework uTPk


USES CRT, MOUSELIB; VAR MOUSE: TMOUSE; BEGIN CLRSCR; MOUSE.INIT; IF MOUSE_EXISTS THEN BEGIN REPEAT GOTOXY(1, 1); WRITELN('MOUSE INSTALLED!'); WRITELN('MOUSE X........:', MOUSE.MX:2)); WRITELN('MOUSE Y........:', MOUSE.MY:2)); WRITE ('MOUSE BUTTON...:', MOUSE.BUTTON, ' - '); CASE MOUSE.CLICK OF 1 : WRITELN('MOUSE LEFT PRESSED':20); 2 : WRITELN('MOUSE RIGHT PRESSED':20); 1 : WRITELN('MOUSE BOTH PRESSED':20); END; UNTIL KEYPRESSED; END ELSE WRITELN('MOUSE NOT INSTALLED!';
END.


Nel download che segue troverete il programma di esempio compilato ed il sorgente in pascal.

Minimal system configuration:

  • CPU 8088 / Pentium
  • RAM 640K
  • SO: DOS
Download
MouseControl Example
DOWNLOAD






Programming, For Beginning



Prev
BIOS - Equipment List
Inside the BIOS / The Equipment List

Comments (1)

Michele
06 Feb 2021 at 14:07

sei veramente in gamba, fate tanto e sempre con idee sorprendenti

Your name (required)

E-Mail (will not be published) (required)

Comment: * min 3 letters



Orbital Crew © 1992, 2020
Copyright. All Rights Reserved, Inc
Web Develope: F.H / A.Mazzola