|
Appunti informatica |
|
Visite: 1226 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:Codice sorgenteCODICE SORGENTE list p=16f684 Architettura 68000dArchitettura 68000d Il 68000 possiede i tipi binari Byte, Word, Longword Il dispositivo Bus/MemoriaIl dispositivo Bus/Memoria I campi relativi alla configurazione di un bus sono |
MICROPROCESSORE E PROGRAMMAZIONE A BASSO LIVELLO
1. Le porte logiche
1 ingresso |
|
2 ingressi |
|||||||||
A |
NOT |
A |
B |
|
AND |
OR |
EXOR |
|
NAND |
NOR |
EXNOR |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
Data una coppia Segmento:Offset ad essa corrisponde un solo indirizzo segmentato: il viceversa non è però vero. Ad esempio, l'indirizzo segmentato appena ricavato, 7 2200, oltre che da 6800:A200 poteva provenire dalle coppie
Segmento |
|
|
|
|
|
|
Offset |
8 2 0 0 |
A 0 0 0 |
E 1 0 0 |
0 0 0 0 |
F F F 0 |
2 2 0 0 |
Indirizzo segmentato |
|
|
|
(max seg) |
(min seg) |
canonico |
AH |
Servizio |
Registri coinvolti |
|
|
Determina la modalità del video |
Tipo AL I seguenti valori usano 16 colori: 1 : 40 x 25, Testo 3 : 80 x 25, Testo 13 : 320 x 200, Grafico 14 : 640 x 200, Grafico |
|
|
Fissa la posizione del cursore |
Riga DH Colonna DL |
|
|
Legge la posizione del cursore |
DH Riga DL Colonna |
|
|
Legge il carattere nella posizione del cursore |
AH Colore AL Codice ASCII |
|
|
Scrive caratteri nella posizione del cursore senza modificarla, con un colore stabilito |
Codice ASCII AL Colore BL Numero di ripetizioni CX I 16
colori sono numerati da fondo x 16 + scritta BL |
|
|
Scrive caratteri nella posizione del cursore senza modificarla |
Codice ASCII AL Numero di ripetizioni CX |
|
|
Scrive un pixel sullo schermo in modalità grafica |
Colore del pixel AL Riga del pixel DL Colonna del pixel CX |
|
0 D |
Legge il colore di un pixel determinato sullo schermo in modalità grafica |
AL Colore del pixel Riga del pixel DL Colonna del pixel CX |
|
0 E |
Scrive caratteri dalla posizione del cursore modificandola |
Codice ASCII AL |
|
TTY = teletype: reagisce a 3 caratteri di controllo 0 8 : back-space
|
|||
|
Rileva la modalità del video |
AL tipo (cft servizio 0 0 per i numeri ) |
|
INT 20 - 14 H Comunicazione seriale con la porta RS232
AH |
Servizio |
Registri coinvolti |
|||
|
Inizializza la porta |
Parametri AL |
|||
Bit di AL |
|||||
Baud 000 : 110 bit/s 001 : 150 bit/s 010 : 300 bit/s 011 : 600 bit/s 100 : 1200 bit/s 101 : 2400 bit/s 110 : 4800 bit/s 111 : 9600 bit/s |
Parità 0 0 : Nessuna 0 1 : Dispari 1 0 : Nessuna 1 1 : pari |
Bit di stop 0 : uno 1 : due |
Codifica 0 0 : non usato 0 1 : non usato 7 bit, solo ASCII standard 8 bit, ASCII esteso |
||
|
Trasmette un byte alla porta |
byte AL |
|||
|
Riceve un byte dalla porta |
AL byte |
|||
INT 22 - 16 H Tastiera
AH |
Servizio |
Registri coinvolti |
|
Acquisisce il valore di un tasto |
Codice ASCII AL Scan code AH |
Lo scan code (codice di scansione) è il numero che appartiene ad ogni tasto della tastiera:
Il valore del codice ASCII può modificarsi a seconda dei valori dei byte di stato della tastiera. Così, ad esempio, se si preme il tasto (! / 1), il suo scan code, in AH è sempre 02, ma con shift premuto in AL va 2 1 ( cod ASCII 33, corrispondente al punto esclamativo), altrimenti in AL va 3 1 ( cod. ASCII 49, corrispondente alla cifra uno).
Se in AL c'è 00, significa che è stato premuto un tasto speciale (freccette, tasti funzione, ecc) o una combinazione di tasti ( CTRL + tasto, ALT + tasto ecc.). In tal caso resta solo lo scan code per individuare il tasto premuto, o la combinazione di tasti)
Le informazioni sullo stato della tastiera sono contenute nei due byte 0000 : 0417 e 0000 : 0418
bit |
|
|
|
= 1 INS attivo |
= 1 INS premuto |
|
= 1 Caps Lock attivo |
= 1 Caps Lock premuto |
|
= 1 Num Lock attivo |
= 1 Num Lock premuto |
|
= 1 Scroll Lock attivo |
= 1 Scroll Lock premuto |
|
|
|
|
|
|
|
= 1 Shift sinistro premuto |
|
|
= 1 Shift destro premuto |
|
AH |
Servizio |
Registri coinvolti |
|
Trasmette un byte alla porta |
byte AL |
|
Riceve un byte dalla porta |
AL byte |
4. Sintesi di elementi di linguaggio Turbo BASIC
|
Il byte in esadecimale sono i bit che effettivamente sono in memoria, trascritti in esadecimale per comodità di lettura. Il valore numerico naturale è il numero associato al BYTE, se interpretato come numero in base 2 ( o base 16 ) Il carattere ASCII e' il carattere associato al BYTE nel codice ASCII |
Nel codice ASCII i byte con valore numerico da
B Y T E |
Num |
C. |
B Y T E |
Num |
C. |
B Y T E |
Num |
C. |
|||
Binario |
Esa |
Binario |
Es. |
Byte bin. |
Es. |
||||||
|
|
8 |
BS |
|
|
48 |
|
|
|
64 |
|
|
|
10 |
LF |
|
|
49 |
|
|
|
65 |
A |
|
0 D |
13 |
CR |
|
|
50 |
|
|
|
66 |
B |
|
1 B |
27 |
ESC |
|
|
51 |
|
|
|
89 |
Y |
|
|
32 |
|
|
|
52 |
|
|
|
90 |
Z |
|
|
34 |
|
|
|
53 |
|
|
|
97 |
a |
|
|
38 |
& |
|
|
54 |
|
|
|
98 |
a |
|
|
42 |
|
|
|
55 |
|
|
|
|
y |
|
2 B |
43 |
|
|
|
56 |
|
|
|
|
z |
|
2 D |
45 |
|
|
|
57 |
|
|
|
|
|
|
|
47 |
|
|
|
63 |
|
|
7 E |
|
|
Non è necessaria la preventiva dichiarazione dei campi, ma il tipo di dato si desume dal suffisso:
alfa% = intero a 2 byte beta& = intero a 4 byte ga$ = stringa o carattere ( se di lunghezza 1)
nu! o semplicemente nu = floating point a 4 byte big# = floating point a 4 byte
Le funzioni di conversione predefinite sotto indicate permettono di determinare
Dato il valore numerico num% :
c$ = CHR$(num%)
il carattere corrispondente nella codifica ASCII ( in c$ )
s$ = STR$(num%)
il valore numerico ( anche di altri tipi di dato) , come stringa
Dato il carattere c$ :
num% = ASC ( c$ )
il valore numerico naturale, codice ASCII del carattere (in num% )
num% = val( s$)
il valore numerico della stringa ( anche in altri tipi di dato)
a$ = MID$ ( s$, inizio%, lunghezza%)
la sottostringa che parte dal carattere inizio% ed è lunga lunghezza%.
c$ = MID$ ( s$, i%, 1)
il carattere di posto i% nella stringa
Scrivendo
MID$ (stri$, 3, 1 ) = 'A'
il carattere A viene immesso nella terza posizione della stringa
segmento |
|
VARSEG ( |
nomedicampo |
|
offset |
|
VARPTR ( |
nomedicampo |
|
Restituiscono il segmento di memoria e l'offset che individuano l'indirizzo di una variabile in memoria. Entrambi sono valori compresi tra 0 e 65 535. Conviene utilizzare come tipo di dato destinato a contenere sia segmento che offset interi lunghi. Per la loro visualizzazione, piuttosto che usare la forma decimale, può essere preferibile convertirli in esadecimale con HEX$().
DEF SEG |
|
segmento |
Imposta l'indirizzo del segmento di memoria da cui successivamente calcolare lo scostamento relativo (offset, o displacement). Se non specificato, per default viene considerato il segmento dove il TB memorizza le variabili. <segmento> può essere un intero tra 0 e 65535, e generalmente viene fornito come costante esadecimale, preceduto da &H.
byte |
|
PEEK( |
offset |
|
Restituisce il valore numerico, compreso tra 0 e 255, del contenuto del byte all'indirizzo indicato in <offset>, calcolato come spiazzamento relativo rispetto al segmento definito da DEF SEG.
Generalmente é conveniente visualizzare tale valore in forma esadecimale, usando HEX$()
POKE |
offset |
|
byte |
Memorizza all'indirizzo indicato da < offset >, un valore intero compreso tra 0 e 65535, il contenuto specificato da <byte>, un valore intero compreso tra 0 e 255. Entrambi i valori, se costanti, conviene scriverli in forma esadecimale, preceduti da &H.
Per operare sui registri si usa REG, nella doppia forma di istruzione e funzione. I registri vengono indicati da numeri, secondo la seguente tabella di corrispondenza
Corrispondenza registri REG ( n )
Registri |
AX |
BX |
CX |
DX |
CS |
DS |
SS |
ES |
IP |
SP |
BP |
SI |
DT |
Flag |
T.B. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
REG |
numero |
|
valore |
Assegna al registro indicato dal numero un valore numerico, espresso da una costante, decimale o esadecimale (preceduta da &H ), o contenuto d un campo, o risultato di una espressione con valori costanti o variabili.
Il valore in ogni caso non deve superare 65 535.
Non è possibile trasferire valori numerici nei mezzi registri. Se necessario, occorre comunque coinvolgere tutto il Registro, come mostrato nell'esempio, relativo a AX.
REG 1, &H0E41 : REG 1, 3649 : REG 1, 14 * 256 + 65 : REG 1, &H0E * 256 + &H41
equivalenti all'assembler
MOV AH , 0E
MOV AL , 41
Possono essere naturalmente usate anche variabili intere.
REG 1, a%*256 + b%
Memorizza in AH il valore numerico di a%, e in AL il valore numerico di b%, che ovviamente entrambi dovranno essere compresi tra 0 e 255
nomedicampo |
|
REG ( |
numero |
|
Trasferisce il valore del Registro indicato dal numero in un campo. In ogni caso il valore è determinato come se fosse un intero a due byte, indipendentemente dal tipo di variabile usata.
Ciò significa, in particolare, che la sequenza delle due istruzioni
REG 1, 65535
a& = REG ( 1 )
trasferisce in a& il valore -1,
corrispondente al contenuto del registro FF FF interpretato come variabile
intera. Volendo il valore positivo da
if a& < 0 then a& = a& + 65536
Per individuare i valori dei due mezzi registri AH e AL si può scrivere, solo con variabili intere a due byte:
AH% = REG(1) 256 ' Divisione intera per 256, quindi il valore dei primi 8 bit
AL% = REG(1) mod 256 ' Resto della divisione intera per 256, quindi il valore dei secondi 8 bit
Volendo usare variabili intere a 4 byte, si dovrà invece scrivere
AH& =
int ( reg(1) / 256) :
CALL INTERRUPT |
numero |
Richiama l'interrupt specificato dal numero, espresso il decimale o esadecimale.
Appunti su: |
|