|
In questo momento in teoria si stà spiegando la struttura del processore. Non c'è
materiale per sperimentare l'assembler. Occorrerà terminare la teoria generale del
processore ed affrontare il processore reale prima di poter iniziare esercizi di assembler.
Si introducono quindi alcuni esercizi di vario genere, mirati in particolare alle operazioni
bit a bit.
Il testo dell'esercizio è il seguente:
Scrivere un programma C che, utilizzando la svgalib, visualizzi un rettangolo sullo
schermo ed una pallina di un pixel che, muovendosi sempre diagonalmente, rimbalzi sui quattro
lati del rettangolo.
Note
- Per una introduzone alle vgalib andare
all'esperienza in Quarta
- Per far muovere la 'pallina' occorre per prima cosa disegnarla nella posizione
iniziale. Ogni volta che la dovremo muovere, per prima cosa la disegneremo con il
colore dello sfondo nella vecchia posizione, per cancellarla, poi la disegneremo
nella nuova posizione.
- Per gestire il movimento il metodo più semplice è quello di prevedere
due variabili che contengano lo spostamento lungo l'asse delle x e delle y. Quando la
pallina raggiungerà uno dei bordi, non faremo altro che cambiare il segno
del relativo incremento per ottenere il rimbalzo.
- Per limitare la velocità della pallina, occorre introdurre un ritardo tra
uno spostamento e l'altro. In un sistema multitasking non è opportuno creare
ritardi con dei cicli vuoti che, oltre ad essere molto onerosi per il sistema, sono
anche imprecisi ed inaffidabili. Per creare un ritardo in maniera affidabile e non
onerosa si può usare la funzione usleep (<numero di microsecondi da
attendere>);.
Una possibile soluzione è la seguente:
// Tizio - Pinco - 3AIN
// Pallina che rimbalza (in grafica)
#include <stdio.h>
#include <vga.h> // Utilizza VGALIB
#define ALTO 10 /* Bordo superiore del campo */
#define SINISTRA 10 /* Bordo sinistro del campo */
#define BASSO 100 /* Bordo inferiore del campo */
#define DESTRA 150 /* Bordo destro del campo */
main()
{
int i; // Contatore di passi
int dx=1; // Incremento orizzontale (+1 o -1)
int dy=1; // Incremento verticale (+1 o -1)
int x=(DESTRA + SINISTRA)/2; // Posizione orizzontale della pallina (partre dal centro)
int y=(ALTO + BASSO)/2; // Posizione verticale della pallina (partre dal centro)
vga_init(); // Inizializza la libreria
vga_setmode(G320x200x256); // Entra in modalita' grafica
// Disegna la cornice (i quattro lati)
vga_drawline(SINISTRA,ALTO,DESTRA,ALTO); // Superiore
vga_drawline(SINISTRA,BASSO,DESTRA,BASSO); // Inferiore
vga_drawline(SINISTRA,ALTO,SINISTRA,BASSO); // Sinistro
vga_drawline(DESTRA,ALTO,DESTRA,BASSO); // Destro
vga_drawpixel(x,y); // Disegna la 'pallina' iniziale
for(i=1;i<500;i++) // Ciclo di movimenti
{
vga_setcolor(0); // Disegna col colore dello sfondo (cancella)
vga_drawpixel(x,y); // Cancella la pallina vecchia
if(y==BASSO-1) // Se ha raggiunto il bordo basso
{
dy = -1; // rmbalza verso l'alto
}
if(y==ALTO+1) // Se ha raggiunto il bordo alto
{
dy = 1; // Rimbalza verso il basso
}
if(x==DESTRA-1) // Se ha raggiunto il bordo destro
{
dx = -1; // Rimbalza verso sinistra
}
if(x==SINISTRA+1) // Se ha raggiunto il bordo sinistro
{
dx = 1; // Rimbalza verso destra
}
x += dx; // Si sposta (asse X)
y += dy; // Si sposta (asse Y)
vga_setcolor(30); // Colore della pallina
vga_drawpixel(x,y); // Disegna la pallina nella nuova posizione
usleep (10000); // Pausa un centesimo di secondo
}
vga_setmode(TEXT); // Ritorna in modalita' testo
}
|
Per provare il programma, scaricare il sorgente, compilarlo
con il comando cc -lvga pallina.c ed eseguirlo con il comando ./a.out.
ATTENZIONE: i programmi che utilizzano la vgalib devono essere fatti
partire con privilegio di root, altrimenti non possono far entrare la scheda video in
modalità grafica.
Per fare questo o si entra in una console di testo (ALT-CTRL-F1) e si fà
login come root, oppure si apre una finestra terminale e si assume
l'identità di root con il comando su root.
[Home Page dell'ITIS "Fermi"]
[Indice Terza]
[Precedente]
[Successivo]
© Ing. Stefano Salvi - Released under GPL licence
|