Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ;...

35
Universit` a degli Studi di Pisa FACOLT ` A DI INGEGNERIA Corso di Laurea Triennale in Ingegneria Informatica Tesi di laurea triennale Realizzazione di supporto per la gestione del mouse in un nucleo multiprogrammato Candidato: Daniele Di Proietto Relatori: Prof. Giuseppe Lettieri Prof. Giovanni Stea Anno Accademico 2011-2012

Transcript of Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ;...

Page 1: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

Universita degli Studi di Pisa

FACOLTA DI INGEGNERIA

Corso di Laurea Triennale in Ingegneria Informatica

Tesi di laurea triennale

Realizzazione di supporto per la gestione del mouse in unnucleo multiprogrammato

Candidato:

Daniele Di ProiettoRelatori:

Prof. Giuseppe LettieriProf. Giovanni Stea

Anno Accademico 2011-2012

Page 2: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

Indice

Introduzione 2

1 L’interfaccia PS/2 31.1 Caratteristiche dell’ i8042 . . . . . . . . . . . . . . . . . . . . 3

1.1.1 Registri di I/O del controllore . . . . . . . . . . . . . . 31.2 Inizializzazione del controllore per il mouse . . . . . . . . . . 5

1.2.1 mouse wait . . . . . . . . . . . . . . . . . . . . . . . . 51.2.2 mouse write . . . . . . . . . . . . . . . . . . . . . . . . 51.2.3 mouse read . . . . . . . . . . . . . . . . . . . . . . . . 51.2.4 Procedura di inizializzazione . . . . . . . . . . . . . . 61.2.5 Abilitazione di Intellimouse . . . . . . . . . . . . . . . 7

1.3 Formato dei dati inviati dal mouse . . . . . . . . . . . . . . . 71.3.1 Intellimouse . . . . . . . . . . . . . . . . . . . . . . . . 8

2 Architettura e implementazione 92.1 Interfaccia driver-hardware . . . . . . . . . . . . . . . . . . . 102.2 Disegno del puntatore e gestione della grafica . . . . . . . . . 102.3 Interazione con lo userspace . . . . . . . . . . . . . . . . . . . 142.4 Interfaccia offerta ai processi utente . . . . . . . . . . . . . . 16

2.4.1 Gestore del mouse di esempio . . . . . . . . . . . . . . 172.5 Sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . . . . 18

A Codice 19A.1 io/io.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19A.2 io/io.S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30A.3 utente/lib.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . 30A.4 include/costanti.h . . . . . . . . . . . . . . . . . . . . . . . . 31A.5 include/mouse.h . . . . . . . . . . . . . . . . . . . . . . . . . 31A.6 utente/prog/mouseuser.in . . . . . . . . . . . . . . . . . . . . 31A.7 utente/utente.S . . . . . . . . . . . . . . . . . . . . . . . . . . 32

Page 3: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

Introduzione

Scopo del lavoro e di realizzare un driver per il mouse integrato nelnucleo di Calcolatori Elettronici, ampiamente descritto in [1]. Il driver usal’interfaccia fornita da un controllore Intel 8042 o compatibile, presente sututti i PC IBM dal PS/2.

L’interfaccia (quindi gli indirizzi di I/O) e la stessa della tastiera; set-tando dei bit in alcuni registri si puo comunicare con il mouse. Il capitolo 1spiega i dettagli dell’interazione con l’hardware.

Il driver riceve gli aggiornamenti dalla periferica sfruttando il mecca-nismo dell’interruzione e, operando in un ambiente multiprogrammato, estrutturato come un normale processo esterno[1, cap.6]. Gli eventi vengonopoi passati ai processi in userspace tramite una primitiva che si sincronizzausando delle variabili semaforiche.

Come il resto del nucleo, il codice per il mouse e stato scritto in C++.Solo per l’aggiunta della primitiva si e reso necessario modificare dei file inassembly.

I test sono stati fatti in un ambiente virtualizzato QEMU([2]), sia conemulazione del processore in spazio utente, sia con il supporto hardwareall’esecuzione nativa delle istruzioni virtuali(kvm).

Page 4: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

Capitolo 1

L’interfaccia PS/2

1.1 Caratteristiche dell’ i8042

Per quello che concerne il mouse, lo standard PS/2 regola la forma fisicadella porta usata, i segnali elettrici, i bit spediti e l’interfaccia che il pro-grammatore deve rispettare e che deve essere implementata dall’hardwaresottostante.

Il controllore che si occupa della gestione del mouse e della tastiera e lostesso: piu precisamente si tratta dell’ Intel 8042 nei primi PC AT, di un suoclone compatibile, magari integrato con altri controllori o nel southbridge,nei moderni PC oppure di una periferica completamente virtuale come nelnostro ambiente di sviluppo. Esso e in grado di gestire contemporaneamen-te la tastiera ed un’altra periferica, nota come periferica ausiliaria, che puoessere un dispositivo di puntamento con posizionamento assoluto (una ta-voletta grafica) oppure, come nel nostro caso, un dispositivo di puntamentorelativo (il mouse).

Qualora il sistema non avesse un mouse PS/2 ma solo USB, l’interfacciaqui descritta viene emulata per retrocompatibilita fino al momento in cuiil programmatore non inizi a controllare direttamente la periferica comedispositivo USB.

1.1.1 Registri di I/O del controllore

I registri del controllore sono montati nello spazio di I/O agli indirizzi0x60 e 0x641 ; a seconda del tipo di accesso richiesto(in lettura o in scrittura)ad ogni indirizzo si vedono due registri diversi. Ogni registro e largo un byte.

des mouse .MOUSE CMR = 0 x64 ; // wr i t e−on l ydes mouse . MOUSE STR = 0 x64 ; // read−on l y

1Nonostante sia stato scelto di chiamare nel codice i registri MOUSE ∗, si ricorda chenon sono registri propri del mouse, bensı del controllore 8042, usati, quindi, anche percomunicare con la tastiera.

Page 5: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

4 1.1 Caratteristiche dell’ i8042

des mouse . MOUSE RBR = 0 x60 ; // read−on l ydes mouse . MOUSE TBR = 0 x60 ; // wr i t e−on l y

Il registro MOUSE CMR (Command Register) viene usato per inviare co-mandi al controllore stesso. Alcuni esempi di comandi (usati nel driver perl’inizializzazione) sono:

0x20-0x3FLeggi da un registro interno del controllore

0x60-0x7FScrivi in un registro interno del controllore

0xA8Abilita la periferica ausiliaria

0xD4Invia un comando alla periferica ausiliaria: il prossimo byte scritto dalprogrammatore in MOUSE TBR sara inviato al mouse

Il registro MOUSE STR (Status Register) puo essere letto per conoscerelo stato della periferica: i suoi bit indicano se sono presenti dati provenien-ti dalla tastiera o dal mouse e se i buffer di ingresso/uscita sono pieni ocontengono dati significativi.

bit nome significato

Bit 0 Output buffer full Se settato ci sono dati che de-vono essere letti dal program-matore nel RBR

Bit 1 Input buffer full Se settato indica che il da-to scritto dal programmatorenel TBR non e stato ancoraprocessato dal controllore

Bit 5 Auxiliary device output buffer Se settato e se il bit 0 esettato indica che i dati nelRBR provengono dal mou-se. Altrimenti provengonodalla tastiera o dal controllorestesso.

I registri MOUSE RBR e MOUSE TBR sono buffer di uscita/ingresso per ilcontrollore. MOUSE TBR ad esempio puo essere usato per scrivere in un regi-stro di controllo (dopo aver scritto in MOUSE CMR 0x60) oppure per inviareun comando al mouse (dopo aver scritto in MOUSE CMR 0xD4)

MOUSE RBR viene usato per ricevere la risposta ai comandi inviati e,sopratutto, per ricevere gli eventi (click e spostamenti del mouse).

Page 6: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

5 1.2 Inizializzazione del controllore per il mouse

1.2 Inizializzazione del controllore per il mouse

1.2.1 mouse wait

Nella procedura di configurazione del controllore per usare il mouse espesso necessario attendere finche i registri non contengano dati significativi,o finche i dati inviati non siano stati processati, in modo da poter scriverenuovamente sugli stessi registri. Proprio a questo serve la funzione mouse wait(

int r): essa blocca il programma facendo attesa attiva sui bit del MOUSE STR

. Il parametro r stabilisce che cosa si vuole attendere, secondo la tabellasuccessiva.

r == 0 La mouse wait si blocca finche il bit 1 del MOUSE STR nondiventa 0 ad indicare che si puo scrivere sul registroMOUSE TBR

r == 1 La mouse wait si blocca finche il bit 0 del MOUSE STR nondiventa 1 ad indicare che ci sono dati significativi da leggerenel MOUSE RBR

r == 2 La mouse wait si blocca finche i bit 0 e 5 del MOUSE STR nondiventano entrambi 1 ad indicare che ci sono dati signi-ficativi da leggere nel MOUSE RBR generati dalla perifericaausiliaria(non dalla tastiera o dal controllore stesso)

1.2.2 mouse write

La funzione mouse write(natb val) serve per inviare dati direttamente allaperiferica ausiliaria (il mouse).

//Comando pe r i n v i a r e d a t i a l mouseoutputb (0 xD4 , des mouse .MOUSE CMR) ;

Essa invia il comando 0xD4 al controllore. Quest’ultimo interpretera ilprossimo byte scritto nel registro TBR come un dato per il mouse.

mouse wai t ( 0 ) ;outputb ( v a l , des mouse . MOUSE TBR) ;

In seguito la funzione aspetta di poter scrivere nel registro e vi copia il byteval che poi viene inviato al mouse.

1.2.3 mouse read

La funzione mouse read() semplicemente ritorna un byte proveniente dalmouse.

mouse wai t ( 2 ) ;i n p u t b ( des mouse . MOUSE RBR, r ) ;re tu rn r ;

Essa aspetta la disponibilita di un byte nel buffer del controllore, assicuran-dosi che sia proveniente dal mouse(mouse wait(2)), lo legge e lo ritorna.

Page 7: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

6 1.2 Inizializzazione del controllore per il mouse

1.2.4 Procedura di inizializzazione

Per inizializzare correttamente l’hardware, e necessario inviare comandial controllore e alla periferica ausiliaria.

// A b i l i t a i l d i s p o s i t i v o a u s i l i a r i o (mouse )outputb (0 xA8 , des mouse .MOUSE CMR) ;

L’istruzione precedente invia un comando all’ i8042 che abilita la perife-rica ausiliaria

// Chiede d i po t e r l e g g e r e i l r e g i s t r o i n t e r n o d i s t a t ooutputb (0 x20 , des mouse .MOUSE CMR) ;

// Legge i l r e g i s t r o i n t e r n o d i s t a t oi n p u t b ( des mouse . MOUSE RBR, s ) ;

// Chiede d i s c r i v e r e i l r e g i s t r o i n t e r n o d i s t a t ooutputb (0 x60 , des mouse .MOUSE CMR) ;

mouse wai t ( 0 ) ;// S c r i v e i l r e g i s t r o i n t e r n o d i s t a t o s e t t ando un b i t// pe r a b i l i t a r e l e i n t e r r u z i o n i d a l mouseoutputb ( s |2 , des mouse . MOUSE TBR) ;

Il blocco precedente di codice abilita il controllore a generare un’inter-ruzione per segnalare nuovi dati provenienti dal mouse. L’abilitazione vienefatta settando il bit 1 in un registro interno della periferica accessibile tra-mite i comandi 0x20 e 0x60. La parte di inizializzazione del controllore (manon del mouse) ora e finita.

m o u s e w r i t e (0 xF6 ) ; //Comando pe r u s a r e impo s t a z i o n i d i d e f a u l tmouse read ( ) ;m o u s e w r i t e (0 xF4 ) ; //Comando pe r a b i l i t a r e i l data r e p o r t i n gmouse read ( ) ;

Il codice precendente comunica direttamente con il mouse. Vengonorichieste le impostazioni di default per la frequenza di campionamento, larisoluzione e lo scaling (disabilitato di default). Dopo ogni mouse write vienefatta una mouse read per ricevere il byte di acknowledgement dalla periferica.Viene quindi abilitato il flusso di dati dal mouse. Inizialmente la periferica ein modalita stream: invia i dati al controllore ogni volta che l’utente muoveil mouse o clicca su un bottone; questa modalita di operazione e quella chee stata usata mentre le altre (reset, remote, wrap) non interessano.

des mouse . MOUSE IRQ = 1 2 ;a c t i v a t e p e ( e s t e r n m o u s e , 0 , PRIO , LIV , des mouse . MOUSE IRQ) ;

A questo punto viene creato un processo esterno per gestire le richiestedi interruzione provenienti dalla periferica (il tipo di interruzione generatadall’i8042 per eventi del mouse e 12).

Page 8: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

7 1.3 Formato dei dati inviati dal mouse

1.2.5 Abilitazione di Intellimouse

Per abilitare l’estensione nota come Intellimouse, spiegata meglio suc-cessivamente (vd. 1.3.1), usiamo il seguente codice, collocato subito primadella creazione del processo esterno.

m o u s e w r i t e (0 xF3 ) ; // Set Sample Ratemouse read ( ) ;m o u s e w r i t e ( 2 0 0 ) ;mouse read ( ) ;m o u s e w r i t e (0 xF3 ) ; // Set Sample Ratemouse read ( ) ;m o u s e w r i t e ( 1 0 0 ) ;mouse read ( ) ;m o u s e w r i t e (0 xF3 ) ; // Set Sample Ratemouse read ( ) ;m o u s e w r i t e ( 8 0 ) ;mouse read ( ) ;

m o u s e w r i t e (0 xF2 ) ; //Comando Get Dev ice IDmouse read ( ) ;natb r e s = mouse read ( ) ;i f ( r e s == 0 x03 )

des mouse . i n t e l l i m o u s e = t rue ;e l s e i f ( r e s == 0 x00 )

des mouse . i n t e l l i m o u s e = f a l s e ;

La procedura consiste nella richiesta consecutiva di tre valori di samplingrate specifici (200,100,80)2. Se il mouse supporta l’estensione, riconoscendoi tre valori, la abilitera. Si chiede poi al mouse tramite il comando 0xF2 dicomunicare il suo ID. Il mouse Intellimouse rispondera (dopo aver inviatoun acknowledgement) con un ID pari a 0x03, un mouse non compatibile conl’estensione inviera un ID pari a 0. Il driver si deve ricordare se Intellimousee abilitato o meno, perche cambia il formato dei dati forniti dalla periferica.

1.3 Formato dei dati inviati dal mouse

Inizialmente si prendera in considerazione il caso di estensione Intel-limouse disabilitata. Ogni volta che l’utente compie un’azione (muove larotella, schiaccia un bottone, sposta il mouse) viene generato un evento.Ogni evento genera tre bytes di dati che il programmatore deve leggere dal-la periferica. Di conseguenza, nel caso in cui le interruzioni siano abilitate,il controllore genera tre richieste per ogni evento. Le informazioni ottenute

2La procedura e pensata in modo da mantenere la retrocompatibilita sia con mousedatati, sia con sistemi operativi che non la supportano. Un mouse non compatibile, infatti,vedra tre comandi consecutivi e rispondera correttamente a ciascuno di essi singolarmente.

E piuttosto improbabile che un sistema operativo mandi tre richieste consecutive disample rate diversi.

Page 9: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

8 1.3 Formato dei dati inviati dal mouse

dal programmatore sono: lo spostamento relativo (sull’asse X e sull’asse Y)e i bottoni premuti. I dati ricevuti avranno questo formato:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0Byte 1 Y of X of Y sign X sign 1 Middle Right LeftByte 2 X movementByte 3 Y movement

Il significato dei campi e il seguente:

Y of, X of Bit di overflow dell’asse Y e X. Se settato indica che il movimen-to del mouse lungo l’asse ha superato il range consentito. Nel nostrocaso, qualora uno dei due bit fosse settato, i dati vengono ignorati.

Y sign, Y movement Il bit Y sign insieme agli otto bit Y movement co-stituisce un intero in complemento a due (a nove bit) che rappresentalo spostamento relativo lungo l’asse Y. Lo spostamento puo quindivariare nell’intervallo [-256, +255]

X sign, X movement I campi hanno un significato analogo ai precedenti,per spostamenti lungo l’asse X.

Middle, Right, Left Questi tre bit specificano lo stato dei tre bottoni delmouse: se un bottone e premuto il relativo bit e settato, altrimenti nonlo e. Notare che sta al programmatore ricordarsi lo stato precedentedel bottone per accorgersi di un click.

1.3.1 Intellimouse

L’estensione Intellimouse, se supportata dal mouse e se abilitata dalprogrammatore (vd. 1.2.5), permette di ricevere informazioni aggiuntive:piu precisamente i cambiamenti di posizione della rotella di scrolling. I byteinviati dal mouse non sono piu tre, bensı quattro (cosı come quattro sono lerichieste di interruzione) per ogni evento. Il formato dei dati e molto simileal precedente:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0Byte 1 Y of X of Y sign X sign 1 Middle Right LeftByte 2 X movementByte 3 Y movementByte 4 Z movement

Z movement Spostamento della rotella (intero in complemento a due): no-tare che per gestire due rotelle o una rotella con due assi i valori vannointerpretati. Un valore di ±1 si riferisce ad uno spostamento lungol’asse verticale, mentre un valore di ±2 si riferisce all’asse orizzontaleo alla seconda rotella.

Page 10: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

Capitolo 2

Architettura eimplementazione

Il supporto al mouse si compone di una parte (il driver), eseguita conprivilegi di I/O (nel nucleo questo livello di privilegio uguale a quello disistema), e un normale processo in spazio utente di esempio che gestisce glieventi ricevuti ed implementa funzionalita di prova.

E stato scelto di implementare il disegno del puntatore direttamentenel modulo di I/O per semplicita di interfaccia. I dettagli di questa sceltasaranno chiariti in seguito (vd. 2.2 a pagina 11).

Page 11: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

10 2.2 Disegno del puntatore e gestione della grafica

2.1 Interfaccia driver-hardware

Tutto il codice aggiunto in kernelspace e contenuto in io/io .cpp. Il driver,dopo aver inizializzato l’hardware sottostante (vd. 1.2.4), riceve richieste diinterruzione. Per gestirle esso e strutturato come processo esterno [1, cap.7]. Il suo corpo principale e:

vo id e s t e r n m o u s e ( i n t h ){

natb m ou s e b y t e s [ 4 ] ;natb a ;natb count = 0 ;

f o r ( ; ; ){

i n p u t b ( des mouse . MOUSE RBR, a ) ;m o u s e b y t e s [ count++] = a ;i f ( ( ! des mouse . i n t e l l i m o u s e && count == 3) | |

( des mouse . i n t e l l i m o u s e && count == 4) ){

count = 0 ;m o u s e p r o c e s s e v e n t ( m o u s e b y t e s ) ;

}w f i ( ) ;

}}

Esso risponde all’interrupt leggendo un byte dal registro RBR del con-trollore. Prima di processare un evento aspetta di ricevere tutti i dati, chesono quattro bytes nel caso di Intellimouse, altrimenti tre. La funzione wfi ()

(si veda [1, 7.3 pag 147]) si blocca finche non viene ricevuta l’interruzionesuccessiva. Quando i bytes necessari sono stati accumulati viene chiamatala mouse process event() che si occupa di interpretare i dati ricevuti.

2.2 Disegno del puntatore e gestione della grafica

Nel nucleo la grafica viene gestita in modalita SVGA. Tutte le operazionidi disegno sono delle scritture su un buffer di memoria (il framebuffer) condi-viso con la scheda video. Ogni byte nel framebuffer (che chiameremo anchememoria video) e un indice di un colore nella tavolozza (che corrisponde aquella standard VGA a 256 colori).

Il cursore del mouse deve essere disegnato a video in primo piano e devesempre essere visibile. A tal fine il driver deve intercettare ogni scritturasullo schermo e fare in modo che l’immagine del mouse non venga sovrascrit-ta. Oltre a cio, si deve memorizzare il contenuto precedente del framebuffersotto il cursore (viene memorizzato in prevvideobuf [] ).1

1Inizialmente si e tentato un approccio diverso ovvero il disegno del puntatore tra-mite lo XOR del colore sottostante, sarebbe a dire che per ogni pixel del puntatore

Page 12: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

11 2.2 Disegno del puntatore e gestione della grafica

Per memorizzare l’immagine del puntatore sono necessari due array bi-dimensionali: in uno (mouse cur) e memorizzata l’informazione sul colore delpixel, nell’altro (mouse mask) e specificato se quel pixel e visibile (1) oppuretrasparente (0).

bool std mouse mask [ 2 0 ] [ 2 0 ] ={1 , 0 , 0 , . . .}

bool s t d m o u s e c u r [ 2 0 ] [ 2 0 ] ={1 , 0 , 0 , . . .}

des mouse . mouse cur =(bool ∗) &( s t d m o u s e c u r [ 0 ] [ 0 ] ) ;des mouse . mouse mask =(bool ∗) &( std mouse mask [ 0 ] [ 0 ] ) ;des mouse . m o u s e c u r s i z e = s i z e o f ( s t d m o u s e c u r [ 0 ] ) / s i z e o f (

s t d m o u s e c u r [ 0 ] [ 0 ] ) ;

La scelta di effettuare il disegno del puntatore nel modulo di I/O dipendedal fatto che tutte le scritture nel framebuffer avvengono proprio in quelmodulo. Per disegnare un pixel e sufficiente chiamare la funzione write pixel

. Questa, in assenza del mouse, scrive semplicemente un valore in unalocazione di memoria, mentre ora si occupa anche di controllare che il disegnonon sovrascriva il cursore.

s t a t i c i n l i n e vo id w r i t e p i x e l ( n a t l x , n a t l y , natb c ){

// Po s i z i o n e a t t u a l e d e l top− l e f t c o r n e r d e l c u r s o r e ( cx ; cy )i n t cx = des mouse . mouse pos . x ;i n t cy = des mouse . mouse pos . y ;//Grandezza i n p i x e l d e l quadrato d e l c u r s o r e ( sc x sc )i n t s c = des mouse . m o u s e c u r s i z e ;i f ( cx<=x && x<=(cx+sc−1) && cy <= y && y<=(cy+sc−1) &&

i s m o u s e a c t i v e ){

des mouse . p r e v v i d e o b u f [ ( y−cy ) ∗ s c + x−cx ] = c ;i f ( ! des mouse . mouse mask [ ( y−cy ) ∗ s c + x−cx ] )

l o w w r i t e p i x e l ( x , y , c ) ;}e l s e

l o w w r i t e p i x e l ( x , y , c ) ;}

p[x,y] = p[x,y] ˆ 0xFF. In questo modo, nonostante sia comunque necessario intercettaretutte le scritture e correggerle, si ha il vantaggio di non dover memorizzare il contenutoprecedente del framebuffer. Per ripristinarlo, infatti, e sufficiente ripetere lo XOR.

L’approccio e stato scartato perche lo XOR del byte non ha senso se p[x,y] non e larappresentazione RGB del colore, ma l’indice di in una tavolozza, e spesso produce risultatinon corretti (il puntatore del byte non e visibile chiaramente).

Page 13: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

12 2.2 Disegno del puntatore e gestione della grafica

La low write pixel (x,y,c) scrive direttamente nella memoria video alle coor-dinate x,y il colore c. Il ramo else copre il caso semplice: la scrittura avvienefuori dal rettangolo del puntatore del mouse (oppure il mouse non e attivo).

Il ramo if invece copre il caso in cui la scrittura avvenga nel rettangolodel puntatore. Prima di tutto l’operazione viene redirezionata nel bufferdove era memorizzato il contenuto precedente dello schermo(prevbuf). Poi, seil pixel interessato e parte di un area trasparente (controlliamo guardandola mouse mask), questo viene disegnato a schermo.

Allo stesso modo, quando c’e bisogno di leggere un pixel, va chiamata laread pixel .2

s t a t i c i n l i n e natb r e a d p i x e l ( n a t l x , n a t l y ) {// Po s i z i o n e a t t u a l e d e l top− l e f t c o r n e r d e l c u r s o r e ( cx ; cy )i n t cx = des mouse . mouse pos . x ;i n t cy = des mouse . mouse pos . y ;//Grandezza i n p i x e l d e l quadrato d e l c u r s o r e ( sc x sc )i n t s c = des mouse . m o u s e c u r s i z e ;i f ( cx<=x && x<=(cx+sc−1) && cy <= y && y<=(cy+sc−1) &&

i s m o u s e a c t i v e )re tu rn des mouse . p r e v v i d e o b u f [ ( y−cy ) ∗ s c + x−cx ] ;

e l s ere tu rn l o w r e a d p i x e l ( x , y ) ;

}

La low read pixel e analoga alla low write pixel . Ne riportiamo qui il codice percompletezza:

s t a t i c i n l i n e vo id l o w w r i t e p i x e l ( n a t l x , n a t l y , natb c ) {f r a m e b u f f e r [ y ∗ VID W + x ] = c ;

}

s t a t i c i n l i n e natb l o w r e a d p i x e l ( n a t l x , n a t l y ) {re tu rn f r a m e b u f f e r [ y ∗ VID W + x ] ;

}

Includiamo qui le funzioni che si occupano del disegno del puntatore.La undraw cursor va chiamata (con x e y precedenti) per spostare il cursore,prima di ridisegnarlo nella nuova posizione. Essa si occupa di ripristinare ilcontenuto del framebuffer precedente.

s t a t i c vo id d r a w c u r s o r ( shor t mx , shor t my){

//Grandezza i n p i x e l d e l quadrato d e l c u r s o r e ( sc x sc )i n t s c = des mouse . m o u s e c u r s i z e ;f o r ( i n t i = 0 ; i < s c ; i ++)

f o r ( i n t j = 0 ; j < s c ; j ++){

i f (mx+i >= VID W | | my+j >= VID H )

2la read pixel , ad esempio, e usata durante il disegno del cursore testuale perpermettere lo XOR dei colori.

Page 14: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

13 2.2 Disegno del puntatore e gestione della grafica

cont inue ;des mouse . p r e v v i d e o b u f [ j ∗ s c + i ] = l o w r e a d p i x e l (mx + i

, my + j ) ;i f ( des mouse . mouse mask [ j ∗ s c + i ] )

l o w w r i t e p i x e l (mx + i , my + j , ( des mouse . mouse cur [ j ∗s c + i ] ) ?0 x00 : 0 x0F ) ;

}}

s t a t i c vo id u n d r a w c u r s o r ( shor t mx , shor t my){

//Grandezza i n p i x e l d e l quadrato d e l c u r s o r e ( sc x sc )i n t s c = des mouse . m o u s e c u r s i z e ;f o r ( i n t i = 0 ; i < s c ; i ++)

f o r ( i n t j = 0 ; j < s c ; j ++){

i f (mx+i >= VID W | | my+j >= VID H )cont inue ;

l o w w r i t e p i x e l (mx + i , my + j , des mouse . p r e v v i d e o b u f [ j ∗s c + i ] ) ;

}}

Ogni volta che il processo esterno riceve un evento chiama la mouse process event

. Essa, fra le altre cose, chiama le funzioni per il disegno del mouse.

shor t i n t i n l i n e b y t e t o s i g n e d s h o r t ( natb a , bool s ){

re tu rn ( ( s ) ?0 xFF00 : 0 x0000 ) | a ;}

vo id m o u s e p r o c e s s e v e n t ( const natb m ou s e b y t e s [ 4 ] ){

s igned shor t dx , dy ;

. . .

dx = b y t e t o s i g n e d s h o r t ( m o us e b y t e s [ 1 ] , ( m o u s e b y t e s [0]&(1<<4) )) ;

dy = b y t e t o s i g n e d s h o r t ( m o u se b y t e s [ 2 ] , ( m o u s e b y t e s [0]&(1<<5) )) ;

. . .

i f ( dx | | dy ){

moved = t rue ;u n d r a w c u r s o r ( des mouse . mouse pos . x , des mouse . mouse pos . y ) ;des mouse . mouse pos . x += dx ;des mouse . mouse pos . y −= dy ;//Fa i n modo che i l v a l o r e non e sca d a l l ’ i t e r v a l l o [ 0 ; VID W

−1]r e s t r i c t r a n g e ( des mouse . mouse pos . x , VID W − 1) ;

Page 15: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

14 2.3 Interazione con lo userspace

r e s t r i c t r a n g e ( des mouse . mouse pos . y , VID H − 1) ;d r a w c u r s o r ( des mouse . mouse pos . x , des mouse . mouse pos . y ) ;

}

. . .

}

Per prima cosa vengono estratte le informazioni sullo spostamento daibytes provenienti dal mouse. Gli spostamenti vengono codificati dalla perife-rica in complemento a due su nove bit, quindi, per essere usati comodamente,vengono copiati espandendoli su variabili a 16 bit. Se lo spostamento su al-meno uno dei due assi non e nullo, il cursore viene cancellato, la posizioneviene aggiornata (prestando attenzione che non sfori i limiti dello schermo)e si procede al ridisegno.

2.3 Interazione con lo userspace

Nel modulo di I/O e implementato solo il disegno del cursore; il restodelle funzionalita va implementato nei processi in spazio utente. Il driverpertanto memorizza gli eventi ricevuti in un buffer, in attesa che i processili richiedano tramite una primitiva.

Il buffer di eventi e una coda circolare, implementata come array, all’in-terno della struttura dove vengono memorizzate tutte le altre informazioninecessarie al driver. Ogni evento viene aggiunto alla coda all’interno dellamouse process event, e, qualora la coda fosse piena, viene scartato. Per l’accessoalla coda vengono usati due semafori: mouse sincr e mouse mutex.

s t r u c t des mouse{

. . .mousemsg e v e n t q u e u e [ 1 0 0 ] ;unsigned i n t e v e n t s i z e ;unsigned i n t e v e n t f i r s t ;unsigned i n t e v e n t l a s t ;

n a t l m o u s e s i n c r ;n a t l mouse mutex ;

. . .

} des mouse ;

. . .

vo id m o u s e p r o c e s s e v e n t ( const natb m ou s e b y t e s [ 4 ] ){

. . .

Page 16: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

15 2.3 Interazione con lo userspace

i f ( ! m o u s e i s e v e n t f u l l ( ) ){

m o u s e i n s e r t e v e n t s ( des mouse . mouse pos . x , des mouse .mouse pos . y , dz , buttonchange , des mouse . buttons , moved ) ;

}

. . .

}

Per ogni aggiornamento dal mouse la mouse insert events genera uno opiu eventi (movimento, click, scrolling) che poi vengono inseriti nella codatramite la mouse insert event int

vo id i n l i n e m o u s e i n s e r t e v e n t i n t ( mousemsg x ){

des mouse . e v e n t q u e u e [ des mouse . e v e n t l a s t ] = x ;des mouse . e v e n t l a s t = ( des mouse . e v e n t l a s t + 1) % des mouse .

e v e n t s i z e ;s e m s i g n a l ( des mouse . m o u s e s i n c r ) ;

}

Per ogni evento inserito viene fatta la signal su mouse sincr. I processi uten-te si bloccheranno sullo stesso semaforo tramite la primitiva get mouse events,di cui riportiamo il codice.

mousemsg i n l i n e m o u s e e x t r a c t e v e n t ( ){

mousemsg t = des mouse . e v e n t q u e u e [ des mouse . e v e n t f i r s t ] ;des mouse . e v e n t f i r s t = ( des mouse . e v e n t f i r s t + 1) %

des mouse . e v e n t s i z e ;re tu rn t ;

}

extern ”C” vo id g e t m o u s e e v e n t s ( mousemsg ∗ m){

sem wai t ( des mouse . mouse mutex ) ;

sem wai t ( des mouse . m o u s e s i n c r ) ;

∗m = m o u s e e x t r a c t e v e n t ( ) ;

s e m s i g n a l ( des mouse . mouse mutex ) ;}

La funzione, oltre a fare wait sul semaforo di comunicazione, bloccandosiin attesa di eventi, si puo bloccare sul semaforo mouse mutex. Esso garantisceche la primitiva venga eseguita in mutua esclusione con se stessa.

Page 17: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

16 2.4 Interfaccia offerta ai processi utente

2.4 Interfaccia offerta ai processi utente

Un processo intenzionato a gestire gli eventi del mouse deve includerel’header mouse.h. Puo allora chiamare la get mouse events passandogli comeparametro un puntatore ad un’istanza della struttura mousemsg, che riceverainformazioni sull’evento. La struttura mousemsg e cosı organizzata:

typedef enum mousemsgtype {MM MOVE, MM LBUTTONDOWN,MM MBUTTONDOWN, MM RBUTTONDOWN, MM LBUTTONUP, MM MBUTTONUP,MM RBUTTONUP, MM SCROLL, MM HSCROLL} mousemsgtype ;

typedef s t r u c t mousemsg{

mousemsgtype t y p e ; //Tipo d e l messagg ionatb b u t t o n s ; // Bot ton i p remut i a l momeno so t to f o rma

d i b i ts t r u c t {

natw x ;natw y ;

} abspos ; // Po s i z i o n e a s s o l u t a s u l l o schermos igned char s c r o l l ; // Spostamento r e l a t i v o d e l l a r o t e l l ai n t vterm ; // Termina l e v i r t u a l e i n c u i s i t r o v a

i l c u r s o r es t r u c t {

natw x ;natw y ;

} pos ; // Coo rd i na t e d e l c u r s o r e r e l a t i v e a lt e rm i n a l e v i r t u a l e

}mousemsg ;

I messaggi possono essere diversi; per tutti tipi di messaggi sono signifi-cativi i campi buttons, abspos, vterm e pos.

buttons I suoi bit specificano quali bottoni sono premuti. Il bit 0 e settatose il bottone di sinistra e premuto, altrimenti e a zero. In modo analogoil bit 1 si riferisce al bottone di destra e il bit 2 a quello centrale.

abspos Struttura che specifica la posizione del mouse relativamente all’an-golo superiore sinistro dello schermo.

vterm Indica il numero di terminale virtuale in cui si trova il puntatore.

pos Struttura che specifica la posizione del mouse relativamente all’angolosuperiore sinistro del terminale virtuale vterm.

Il campo type puo essere:

MM MOVE Specifica che la posizione del mouse e cambiata.

MM *BUTTONDOWN Specifica che il bottone interessato(L,R o M) estato premuto.

Page 18: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

17 2.4 Interfaccia offerta ai processi utente

MM *BUTTONUP Specifica che il bottone interessato(L,R o M) e statorilasciato.

MM SCROLL Notifica lo spostamento della rotella verticale. In questocaso il campo scroll e significativo e contiene un intero relativo cherappresenta lo spostamento della rotella.

MM HSCROLL Analogo a MM SCROLL, ma per spostamenti della rotellaorizzontale.

L’architettura attuale del supporto prevede che ci sia un solo processoin ascolto degli eventi3 e che quindi esso sia il gestore esclusivo del mouse.

2.4.1 Gestore del mouse di esempio

Parte del lavoro e stata la scrittura di un processo che usasse il mouseper migliorare l’interfaccia dei terminali virtuali, offerta dal nucleo all’u-tente, semplificando l’interazione con essa. Il suo codice e molto semplice(si trova in utente/prog/mouseuser.in), lo riportiamo qui omettendo le printf diinformazioni di debug.

#inc lude <s y s . h>#inc lude < l i b . h>#inc lude <mouse . h>

p r o c e s s p r o c m o u s e h a n d l e r body mouse main ( 2 ) , 10 , LIV UTENTE ;

p r o c e s s b o d y mouse main ( i n t a ){

mousemsg mm;

f o r ( ; ; ){

g e t m o u s e e v e n t s (&mm) ;

switch (mm. t y p e ){

case MM LBUTTONDOWN:v t e r m s w i t c h (mm. vterm ) ;break ;

case MM SCROLL :v t e r m s c r o l l (mm. vterm , mm. s c r o l l ) ;break ;

de f au l t :break ;

}}

}

3Qualora ci fossero piu processi che invocano ripetutamente nello stesso momento laget mouse events, essi riceverebbero gli eventi a turno.

Page 19: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

18 2.5 Sviluppi futuri

Quando viene premuto il bottone sinistro, il focus viene spostato sulterminale virtuale sopra il quale si trova il cursore del mouse (mm.vterm),chiamando la funzione vterm switch. Quando l’utente muove la rotella vieneinviata una richiesta di scrolling al terminale virtuale sotto il cursore delmouse, tramite la funzione vterm scroll (che e stata scritta appositamente).

2.5 Sviluppi futuri

L’implementazione qui presentata e risultata funzionante, almeno inambiente virtualizzato. Non sono stati effettuati test su hardware vero;l’esecuzione su bare metal potrebbe comportare qualche piccola modificadel codice che interagisce con il controllore, specie per quanto riguardal’inizializzazione.

Data la semplicita dell’interfaccia grafica attualmente presente nel nu-cleo, e stato sufficiente aggiungere dei controlli nelle funzioni di disegnoper implementare correttamente la visualizzazione del puntatore a scher-mo. Qualora si pensasse ad un sistema grafico piu avanzato, avrebbe sensoseparare il driver del mouse dal disegno del puntatore, magari gestendoquest’ultimo in spazio utente.

Un’altra funzionalita comoda non ancora implementata e quella del “copia-incolla”: andrebbe fatta un integrazione al processo in spazio utente cheinteragisca con i terminali virtuali per leggere e scrivere caratteri.

Page 20: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

Appendice A

Codice

Questa appendice riporta il codice completo del supporto al mouse de-scritto nelle pagine precedenti. Per la maggior parte si tratta di aggiunte afile preesistenti. In questo caso si e usato “. . . ” per indicare parti di codicegia presenti.

A.1 io/io.cpp

. . .

#inc lude ”mouse . h”

. . .

//STRUTTURA DEL MOUSEs t r u c t des mouse{

natb MOUSE CMR; //0x64natb MOUSE STR ; //0x64natb MOUSE RBR ; //0x60natb MOUSE TBR ; //0x60

s t r u c t mouse pos{

s igned shor t x , y ;} mouse pos ;n a t l m o u s e s i n c r ;n a t l mouse mutex ;

// I n t e r r u z i o n e hardware d e l mousenatb MOUSE IRQ ; //12

natb b u t t o n s ;bool i n t e l l i m o u s e ;

bool ∗ mouse cur ;

Page 21: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

20 A.1 io/io.cpp

bool ∗ mouse mask ;natb ∗ p r e v v i d e o b u f ;

s i z e t m o u s e c u r s i z e ;

mousemsg e v e n t q u e u e [ 1 0 0 ] ;unsigned i n t e v e n t s i z e ;unsigned i n t e v e n t f i r s t ;unsigned i n t e v e n t l a s t ;

} des mouse ;bool i s m o u s e a c t i v e = f a l s e ;const shor t m o u s e i n i t x = 0 ;const shor t m o u s e i n i t y = 0 ;

. . .

s t a t i c i n l i n e vo id w r i t e p i x e l ( n a t l x , n a t l y , natb c ) {s t a t i c i n l i n e vo id l o w w r i t e p i x e l ( n a t l x , n a t l y , natb c ) {

f r a m e b u f f e r [ y ∗ VID W + x ] = c ;}

s t a t i c i n l i n e natb l o w r e a d p i x e l ( n a t l x , n a t l y ) {re tu rn f r a m e b u f f e r [ y ∗ VID W + x ] ;

}

s t a t i c i n l i n e vo id w r i t e p i x e l ( n a t l x , n a t l y , natb c ){

// Po s i z i o n e a t t u a l e d e l top− l e f t c o r n e r d e l c u r s o r e ( cx ; cy )i n t cx = des mouse . mouse pos . x ;i n t cy = des mouse . mouse pos . y ;//Grandezza i n p i x e l d e l quadrato d e l c u r s o r e ( sc x sc )i n t s c = des mouse . m o u s e c u r s i z e ;i f ( cx<=x && x<=(cx+sc−1) && cy <= y && y<=(cy+sc−1) &&

i s m o u s e a c t i v e ){

des mouse . p r e v v i d e o b u f [ ( y−cy ) ∗ s c + x−cx ] = c ;i f ( ! des mouse . mouse mask [ ( y−cy ) ∗ s c + x−cx ] )

l o w w r i t e p i x e l ( x , y , c ) ;}e l s e

l o w w r i t e p i x e l ( x , y , c ) ;}

s t a t i c i n l i n e natb r e a d p i x e l ( n a t l x , n a t l y ) {// Po s i z i o n e a t t u a l e d e l top− l e f t c o r n e r d e l c u r s o r e ( cx ; cy )i n t cx = des mouse . mouse pos . x ;i n t cy = des mouse . mouse pos . y ;//Grandezza i n p i x e l d e l quadrato d e l c u r s o r e ( sc x sc )i n t s c = des mouse . m o u s e c u r s i z e ;i f ( cx<=x && x<=(cx+sc−1) && cy <= y && y<=(cy+sc−1) &&

i s m o u s e a c t i v e )re tu rn des mouse . p r e v v i d e o b u f [ ( y−cy ) ∗ s c + x−cx ] ;

e l s e

Page 22: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

21 A.1 io/io.cpp

re tu rn l o w r e a d p i x e l ( x , y ) ;}

. . .

//MOUSE

vo id mouse wai t ( i n t r ){

natb a ;i f ( r == 0){

doi n p u t b ( des mouse . MOUSE STR, a ) ;

whi le ( ( a & 2) !=0) ;}e l s e i f ( r == 1){

doi n p u t b ( des mouse . MOUSE STR, a ) ;

whi le ( ( a & 1) !=1) ;}e l s e i f ( r == 2){

doi n p u t b ( des mouse . MOUSE STR, a ) ;

whi le ( ( ( a & 1) !=1) | | ! ( a & 0 x20 ) ) ;}

}

natb mouse read ( ){

natb r ;mouse wai t ( 2 ) ;i n p u t b ( des mouse . MOUSE RBR, r ) ;re tu rn r ;

}

vo id m o u s e w r i t e ( natb v a l ){

outputb (0 xD4 , des mouse .MOUSE CMR) ; //Comando pe r i n v i a r e d a t ia l mouse

mouse wai t ( 0 ) ;outputb ( v a l , des mouse . MOUSE TBR) ;

}

s t a t i c vo id d r a w c u r s o r ( shor t mx , shor t my){

//Grandezza i n p i x e l d e l quadrato d e l c u r s o r e ( sc x sc )i n t s c = des mouse . m o u s e c u r s i z e ;f o r ( i n t i = 0 ; i < s c ; i ++)

f o r ( i n t j = 0 ; j < s c ; j ++){

i f (mx+i >= VID W | | my+j >= VID H )

Page 23: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

22 A.1 io/io.cpp

cont inue ;des mouse . p r e v v i d e o b u f [ j ∗ s c + i ] = l o w r e a d p i x e l (mx + i

, my + j ) ;i f ( des mouse . mouse mask [ j ∗ s c + i ] )

l o w w r i t e p i x e l (mx + i , my + j , ( des mouse . mouse cur [ j ∗s c + i ] ) ?0 x00 : 0 x0F ) ;

}}

s t a t i c vo id u n d r a w c u r s o r ( shor t mx , shor t my){

//Grandezza i n p i x e l d e l quadrato d e l c u r s o r e ( sc x sc )i n t s c = des mouse . m o u s e c u r s i z e ;f o r ( i n t i = 0 ; i < s c ; i ++)

f o r ( i n t j = 0 ; j < s c ; j ++){

i f (mx+i >= VID W | | my+j >= VID H )cont inue ;

l o w w r i t e p i x e l (mx + i , my + j , des mouse . p r e v v i d e o b u f [ j ∗s c + i ] ) ;

}

}

shor t i n t i n l i n e b y t e t o s i g n e d s h o r t ( natb a , bool s ){

re tu rn ( ( s ) ?0 xFF00 : 0 x0000 ) | a ;}

vo id i n l i n e r e s t r i c t r a n g e ( s igned shor t &k , unsigned shor t r a ng e ){

i f ( k < 0)k = 0 ;

e l s e i f ( k > r a ng e )k = ra n g e ;

}

bool i n l i n e m o u s e i s e v e n t e m p t y ( ){

re tu rn des mouse . e v e n t f i r s t == des mouse . e v e n t l a s t ;}

bool i n l i n e m o u s e i s e v e n t f u l l ( ){

re tu rn des mouse . e v e n t f i r s t == ( des mouse . e v e n t l a s t + 1) %des mouse . e v e n t s i z e ;

}

vo id i n l i n e m o u s e i n s e r t e v e n t i n t ( mousemsg x ){

des mouse . e v e n t q u e u e [ des mouse . e v e n t l a s t ] = x ;des mouse . e v e n t l a s t = ( des mouse . e v e n t l a s t + 1) % des mouse .

e v e n t s i z e ;s e m s i g n a l ( des mouse . m o u s e s i n c r ) ;

Page 24: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

23 A.1 io/io.cpp

}

vo id i n l i n e m o u s e i n s e r t e v e n t s ( natw x , natw y , s igned char dz ,natb changebutton , natb buttons , bool moved )

{mousemsg mm;i n t vx , vy ;

mm. abspos . x = x ;mm. abspos . y = y ;

vx = x / (VID W/SQRT NUM SCREEN) ;vy = y / ( VID H/SQRT NUM SCREEN) ;

mm. vterm = vy∗SQRT NUM SCREEN + vx ;mm. pos . x = x % (VID W/SQRT NUM SCREEN) ;mm. pos . y = y % ( VID H/SQRT NUM SCREEN) ;

mm. b u t t o n s = b u t t o n s ;

i f ( moved ){

mm. t y p e = MM MOVE;m o u s e i n s e r t e v e n t i n t (mm) ;

}i f ( dz ){

switch ( dz ){

case +1:case −1:

mm. t y p e = MM SCROLL ;mm. s c r o l l = dz ;break ;

case +2:case −2:

mm. t y p e = MM HSCROLL;mm. s c r o l l = dz / 2 ;break ;

de f au l t :mm. t y p e = MM SCROLL ;mm. s c r o l l = dz ;break ;

}m o u s e i n s e r t e v e n t i n t (mm) ;

}

i f ( ! changebutton )re tu rn ;

i f ( changebutton & 0 x01 ){

mm. t y p e = MM LBUTTONDOWN;m o u s e i n s e r t e v e n t i n t (mm) ;

}

Page 25: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

24 A.1 io/io.cpp

e l s e i f ( changebutton & 0 x02 ){

mm. t y p e = MM LBUTTONUP;m o u s e i n s e r t e v e n t i n t (mm) ;

}

i f ( changebutton & 0 x04 ){

mm. t y p e = MM RBUTTONDOWN;m o u s e i n s e r t e v e n t i n t (mm) ;

}e l s e i f ( changebutton & 0 x08 ){

mm. t y p e = MM RBUTTONUP;m o u s e i n s e r t e v e n t i n t (mm) ;

}

i f ( changebutton & 0 x10 ){

mm. t y p e = MMMBUTTONDOWN;m o u s e i n s e r t e v e n t i n t (mm) ;

}e l s e i f ( changebutton & 0 x20 ){

mm. t y p e = MM MBUTTONUP;m o u s e i n s e r t e v e n t i n t (mm) ;

}

}

mousemsg i n l i n e m o u s e e x t r a c t e v e n t ( ){

mousemsg t = des mouse . e v e n t q u e u e [ des mouse . e v e n t f i r s t ] ;des mouse . e v e n t f i r s t = ( des mouse . e v e n t f i r s t + 1) %

des mouse . e v e n t s i z e ;re tu rn t ;

}

vo id m o u s e p r o c e s s e v e n t ( const natb m ou s e b y t e s [ 4 ] ){

s igned shor t dx , dy ;s igned char dz = 0 ;natb buttonchange = 0 ;bool moved = f a l s e ;

i f ( ( des mouse . b u t t o n s & 1) ˆ ( m o us e b y t e s [ 0 ] & 1 ) ){

i f ( m o u s e b y t e s [ 0 ] & 1 ){

des mouse . b u t t o n s |= 1 ;// f l o g (LOG INFO , ” L e f t p r e s s ”) ;buttonchange |= 0 x01 ;

}e l s e

Page 26: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

25 A.1 io/io.cpp

{des mouse . b u t t o n s &= ˜ ( 1 ) ;// f l o g (LOG INFO , ” L e f t r e l e a s e ”) ;buttonchange |= 0 x02 ;

}}i f ( ( des mouse . b u t t o n s & 2) ˆ ( m o us e b y t e s [ 0 ] & 2 ) ){

i f ( m o u s e b y t e s [ 0 ] & 2 ){

des mouse . b u t t o n s |= 2 ;// f l o g (LOG INFO , ” R ight p r e s s ”) ;buttonchange |= 0 x04 ;

}e l s e{

des mouse . b u t t o n s &= ˜ ( 2 ) ;// f l o g (LOG INFO , ” R ight r e l e a s e ”) ;buttonchange |= 0 x08 ;

}}i f ( ( des mouse . b u t t o n s & 4) ˆ ( m o us e b y t e s [ 0 ] & 4 ) ){

i f ( m o u s e b y t e s [ 0 ] & 4 ){

des mouse . b u t t o n s |= 4 ;// f l o g (LOG INFO , ”Middle p r e s s ”) ;buttonchange |= 0 x10 ;

}e l s e{

des mouse . b u t t o n s &= ˜ ( 4 ) ;// f l o g (LOG INFO , ”Middle r e l e a s e ”) ;buttonchange |= 0 x20 ;

}}/∗ Ge s t i s c e i moviment i ∗/i f ( m o u s e b y t e s [ 0 ] & (1<<6) )

// g e s t i r e b i t d i o v e r f l ow X// apparentemente quando c e ’ un o v e r f l ow l e i n f o rm a z i o n i s u i

c l i c non hanno molto senso , q u i n d i s c a r t o t u t t o i lmessagg io

// f l o g (LOG INFO , ”X ov e r f l ow ”) ;re tu rn ;

i f ( m o u s e b y t e s [ 0 ] & (1<<7) )// g e s t i r e b i t d i o v e r f l ow Y// apparentemente quando c e ’ un o v e r f l ow l e i n f o rm a z i o n i s u i

c l i c non hanno molto senso , q u i n d i s c a r t o t u t t o i lmessagg io

// f l o g (LOG INFO , ”Y ov e r f l ow ”) ;re tu rn ;

dx = b y t e t o s i g n e d s h o r t ( m o u se b y t e s [ 1 ] , ( m o u s e b y t e s [0]&(1<<4) )) ;

Page 27: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

26 A.1 io/io.cpp

dy = b y t e t o s i g n e d s h o r t ( m o us e b y t e s [ 2 ] , ( m o u s e b y t e s [0]&(1<<5) )) ;

// f l o g (LOG INFO , ”dx = %d” , dx ) ;// f l o g (LOG INFO , ”dy = %d” , dy ) ;i f ( dx | | dy ){

moved = t rue ;u n d r a w c u r s o r ( des mouse . mouse pos . x , des mouse . mouse pos . y ) ;des mouse . mouse pos . x += dx ;des mouse . mouse pos . y −= dy ;r e s t r i c t r a n g e ( des mouse . mouse pos . x , VID W − 1) ; //Fa i n

modo che i l v a l o r e non e sca d a l l ’ i t e r v a l l o [ 0 ; VID W −1]r e s t r i c t r a n g e ( des mouse . mouse pos . y , VID H − 1) ; //Fa i n

modo che i l v a l o r e non e sca d a l l ’ i t e r v a l l o [ 0 ; VID H −1]d r a w c u r s o r ( des mouse . mouse pos . x , des mouse . mouse pos . y ) ;// f l o g (LOG INFO , ”mouse coo rd s :{%d,%d}” , des mouse . mouse pos

. x , des mouse . mouse pos . y ) ;}i f ( des mouse . i n t e l l i m o u s e ){

dz = m o u se b y t e s [ 3 ] ;i f ( dz ){

// f l o g (LOG INFO , ” s c r o l l :%d ” , ( s i g n ed i n t ) dz ) ;}

}

i f ( ! m o u s e i s e v e n t f u l l ( ) ){

m o u s e i n s e r t e v e n t s ( des mouse . mouse pos . x , des mouse .mouse pos . y , dz , buttonchange , des mouse . buttons , moved ) ;

}

}

vo id e s t e r n m o u s e ( i n t h ){

natb m ou s e b y t e s [ 4 ] ;natb a ;natb count = 0 ;

f o r ( ; ; ){

// f l o g (LOG INFO , ”INTINTINT”) ;i n p u t b ( des mouse . MOUSE RBR, a ) ;m o u s e b y t e s [ count++] = a ;i f ( ( ! des mouse . i n t e l l i m o u s e && count == 3) | | ( des mouse .

i n t e l l i m o u s e && count == 4) ){

count = 0 ;m o u s e p r o c e s s e v e n t ( m o u s e b y t e s ) ;// f l o g (LOG INFO , ”MOUSE READ! ! ” ) ;

}w f i ( ) ;

Page 28: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

27 A.1 io/io.cpp

}}

bool s t d m o u s e c u r [ 2 0 ] [ 2 0 ] ={1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0} ;

bool std mouse mask [ 2 0 ] [ 2 0 ] ={1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0} ;

natb v i d e o b u f [ 2 0 ] [ 2 0 ] ;

bool m o u s e i n i t ( )

Page 29: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

28 A.1 io/io.cpp

{natb s ;

des mouse .MOUSE CMR = 0 x64 ; // wr i t e−on l ydes mouse . MOUSE STR = 0 x64 ; // read−on l ydes mouse . MOUSE RBR = 0 x60 ; // read−on l ydes mouse . MOUSE TBR = 0 x60 ; // wr i t e−on l ydes mouse . MOUSE IRQ = 1 2 ;des mouse . b u t t o n s = 0 ;des mouse . i n t e l l i m o u s e = f a l s e ;des mouse . mouse cur = ( bool ∗) &( s t d m o u s e c u r [ 0 ] [ 0 ] ) ;des mouse . mouse mask = ( bool ∗) &( std mouse mask [ 0 ] [ 0 ] ) ;des mouse . m o u s e c u r s i z e = s i z e o f ( s t d m o u s e c u r [ 0 ] ) / s i z e o f (

s t d m o u s e c u r [ 0 ] [ 0 ] ) ;des mouse . p r e v v i d e o b u f = ( natb ∗) &( v i d e o b u f [ 0 ] [ 0 ] ) ;des mouse . e v e n t f i r s t = 0 ;des mouse . e v e n t l a s t = 0 ;des mouse . e v e n t s i z e = s i z e o f ( des mouse . e v e n t q u e u e ) / s i z e o f (

des mouse . e v e n t q u e u e [ 0 ] ) ;

// A b i l i t a i l d i s p o s i t i v o a u s i l i a r i o (mouse )outputb (0 xA8 , des mouse .MOUSE CMR) ;

// A b i l i t a i n t e r r u z i o n ioutputb (0 x20 , des mouse .MOUSE CMR) ; // Chiede d i po t e r l e g g e r e

i l r e g i s t r o i n t e r n o d i s t a t o

//mouse wai t (1 ) ;i n p u t b ( des mouse . MOUSE RBR, s ) ; // Legge i l r e g i s t r o i n t e r n o d i

s t a t o

outputb (0 x60 , des mouse .MOUSE CMR) ; // Chiede d i s c r i v e r e i lr e g i s t r o i n t e r n o d i s t a t o

mouse wai t ( 0 ) ;outputb ( s |2 , des mouse . MOUSE TBR) ; // S c r i v e i l r e g i s t r o i n t e r n o

d i s t a t o s e t t ando un b i t pe r a b i l i t a r e l e i n t e r r u z i o n i d a lmouse

// F ine a b i l i t a z i o n e i n t e r r u z i o n i

// Se t t a l e impo s t a z i o n i s t anda rdm o u s e w r i t e (0 xF6 ) ; //Comando pe r u s a r e impo s t a z i o n i d i d e f a u l tmouse read ( ) ;m o u s e w r i t e (0 xF4 ) ; //Comando pe r a b i l i t a r e i l data r e p o r t i n gmouse read ( ) ;

//Prova ad a b i l i t a r e l ’ e s t e n s i o n e I n t e l l iM o u s e ( l a r o t e l l a pe rl o s c r o l l i n g )

m o u s e w r i t e (0 xF3 ) ; // Set Sample Ratemouse read ( ) ;m o u s e w r i t e ( 2 0 0 ) ;mouse read ( ) ;m o u s e w r i t e (0 xF3 ) ; // Set Sample Ratemouse read ( ) ;

Page 30: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

29 A.1 io/io.cpp

m o u s e w r i t e ( 1 0 0 ) ;mouse read ( ) ;m o u s e w r i t e (0 xF3 ) ; // Set Sample Ratemouse read ( ) ;m o u s e w r i t e ( 8 0 ) ;mouse read ( ) ;

m o u s e w r i t e (0 xF2 ) ; //Comando Get Dev ice IDmouse read ( ) ;natb r e s = mouse read ( ) ;i f ( r e s == 0 x03 )

des mouse . i n t e l l i m o u s e = t rue ;e l s e i f ( r e s == 0 x00 )

des mouse . i n t e l l i m o u s e = f a l s e ;// F ine a b i l i t a z i o n e I n t e l l i m o u s e

d r a w c u r s o r ( m o u s e i n i t x , m o u s e i n i t y ) ;

des mouse . mouse pos . x = m o u s e i n i t x ;des mouse . mouse pos . y = m o u s e i n i t y ;

i s m o u s e a c t i v e = t rue ;des mouse . m o u s e s i n c r = s e m i n i ( 0 ) ;des mouse . mouse mutex = s e m i n i ( 1 ) ;

i f ( ( a c t i v a t e p e ( e s t e r n m o u s e , 0 , PRIO , LIV , des mouse .MOUSE IRQ) ) == 0xFFFFFFFF ) {

f l o g (LOG ERR , ”mouse : i m p o s s i b i l e c r e a r e e s t e r n m o u s e ” ) ;re tu rn f a l s e ;

}

re tu rn t rue ;}

extern ”C” vo id g e t m o u s e e v e n t s ( mousemsg ∗ m){

sem wai t ( des mouse . mouse mutex ) ;

sem wai t ( des mouse . m o u s e s i n c r ) ;

∗m = m o u s e e x t r a c t e v e n t ( ) ;

s e m s i g n a l ( des mouse . mouse mutex ) ;}

. . .

// e s e g u i t a i n f a s e d i i n i z i a l i z z a z i o n e//extern ”C” vo id cmain ( i n t s e m i o ){

. . .

i f ( ! m o u s e i n i t ( ) ) {

Page 31: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

30 A.3 utente/lib.cpp

f l o g (LOG WARN, ” m o u s e i n i t f a l l i t a ” ) ;a b o r t p ( ) ;

}

. . .

}

A.2 io/io.S

. . .

. s e t i o t i p o g e t m e , IO TIPO GETME

. . .

f i l l i o g a t e i o t i p o g e t m e a e s g e t m o u s e e v e n t

. . .

. extern g e t m o u s e e v e n t sa e s g e t m o u s e e v e n t s :

s a l v a r e g i s t r ic o p i a p a r a m 1 7c a l l g e t m o u s e e v e n t sa d d l $4 , %espc a r i c a r e g i s t r ii r e t

. . .

A.3 utente/lib.cpp

. . .

// R i s c r i t t a a p a r t i r e da vte rm mot ion pe r g e s t i r e | n |>1d i r e t t amen t e

// e pe r e v i t a r e d i v i s i o n e pe r 0bool v t e r m s c r o l l ( i n t v , i n t n ){

i n t move = 0 ;d e s v t e r m ∗ t = &vterm [ v ] ;i f ( ! n )

re tu rn f a l s e ;i f ( ! t−>v i d e o m a x x ) // Ev i t o d i v i s i o n e pe r 0( c r a s h s c r o l l i n g

t e rm i n a l e 0( r o s s o ) )re tu rn f a l s e ;

s em wai t ( t−>mutex w ) ;i f ( n<0)

move = −t−>v i d e o m a x x ∗ −n ; //UPe l s e i f ( n>0)

Page 32: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

31 A.6 utente/prog/mouseuser.in

move = t−>v i d e o m a x x ∗ n ;

i f ( move < 0 && ( n a t l )−move > t−>vmon of f )t−>vmon of f = 0 ;

e l s e i f ( t−>vmon of f + move + t−>v m o n s i z e > vterm row ( t , t−>a p p e n d o f f ) + t−>v i d e o m a x x )

t−>vmon of f = vterm row ( t , t−>a p p e n d o f f ) + t−>v i d e o m a x x −t−>v m o n s i z e ;

e l s et−>vmon of f += move ;

vterm update vmon ( t , t−>vmon off , t−>vmon of f + t−>v m o n s i z e ) ;s e m s i g n a l ( t−>mutex w ) ;re tu rn t rue ;

}

. . .

A.4 include/costanti.h

. . .

#def ine IO TIPO GETME 0 x99 // ge t mous e e v en t s

. . .

A.5 include/mouse.h

typedef enum mousemsgtype {MM MOVE, MM LBUTTONDOWN,MM MBUTTONDOWN, MM RBUTTONDOWN, MM LBUTTONUP, MM MBUTTONUP,MM RBUTTONUP, MM SCROLL, MM HSCROLL} mousemsgtype ;

typedef s t r u c t mousemsg{

mousemsgtype t y p e ; //Tipo d e l messagg ionatb b u t t o n s ; // Bot ton i p remut i a l momeno so t to f o rma d i b i ts t r u c t {

natw x ;natw y ;

} abspos ; // Po s i z i o n e a s s o l u t a s u l l o schermos igned char s c r o l l ; // Spostamento r e l a t i v o d e l l a r o t e l l ai n t vterm ; // Termina l e v i r t u a l e i n c u i s i t r o v a i l c u r s o r es t r u c t {

natw x ;natw y ;

} pos ; // Coo rd i na t e d e l c u r s o r e r e l a t i v e a l t e rm i n a l ev i r t u a l e

}mousemsg ;

extern ”C” vo id g e t m o u s e e v e n t s ( mousemsg ∗) ;

A.6 utente/prog/mouseuser.in

Page 33: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

32 A.7 utente/utente.S

#inc lude <s y s . h>#inc lude < l i b . h>#inc lude <mouse . h>

p r o c e s s p r o c m o u s e h a n d l e r body mouse main ( 2 ) , 10 , LIV UTENTE ;

p r o c e s s b o d y mouse main ( i n t a ){

mousemsg mm;

f o r ( ; ; ) {g e t m o u s e e v e n t s (&mm) ;

switch (mm. t y p e ){

case MM MOVE:p r i n t f ( a , ”Mouse pos :(%d,%d ) vterm :%d abspos :(%d,%d ) \n” ,

mm. pos . x ,mm. pos . y ,mm. vterm ,mm. abspos . x ,mm. abspos . y ) ;break ;

case MM LBUTTONDOWN:p r i n t f ( a , ” L e f t but ton p r e s s e d \n” ) ;v t e r m s w i t c h (mm. vterm ) ;break ;

case MM LBUTTONUP:p r i n t f ( a , ” L e f t but ton r e l e a s e s \n” ) ;break ;

case MMMBUTTONDOWN:p r i n t f ( a , ” Middle but ton p r e s s e d \n” ) ;break ;

case MM MBUTTONUP:p r i n t f ( a , ” Middle but ton r e l e a s e s \n” ) ;break ;

case MM RBUTTONDOWN:p r i n t f ( a , ” R i g h t but ton p r e s s e d \n” ) ;break ;

case MM RBUTTONUP:p r i n t f ( a , ” R i g h t but ton r e l e a s e d \n” ) ;break ;

case MM SCROLL :i f ( v t e r m s c r o l l (mm. vterm , mm. s c r o l l ) )

p r i n t f ( a , ” S c r o l l i n g by:%d \n” , mm. s c r o l l ) ;break ;

case MM HSCROLL:p r i n t f ( a , ” h o r i z o n t a l s c r o l l i n g by:%d \n” , mm. s c r o l l ) ;break ;

}}p r i n t f ( a , ” f i n e \n” ) ;

}

A.7 utente/utente.S

. . .

Page 34: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

33 A.7 utente/utente.S

. s e t i o t i p o g e t m e , IO TIPO GETME

. . .

. g l o b a l g e t m o u s e e v e n t sg e t m o u s e e v e n t s :i n t $ i o t i p o g e t m er e t

. . .

Page 35: Realizzazione di supporto per la gestione del mouse in un ... · des mouse .MOUSE CMR = 0x64 ; //write only des mouse .MOUSE STR = 0x64 ; //read only 1Nonostante sia stato scelto

Bibliografia

[1] G. Frosini and G. Lettieri. Architettura dei calcolatori. Number v. 3 inArchitettura dei calcolatori. Aracne, 2009.

[2] QEMU, generic and open source machine emulator and virtualizer.Website. http://www.qemu.org/.