Decodificação de I/O e Memória
Cap.6:
1/10
CAPÍTULO VI
DECODIFICAÇÃO DE I/O E MEMÓRIA
•
afirmava-se que memória era todo dispositivo acessado através dos
sinais *(S)MEMR ou *(S)MEMW e que I/O era todo dispositivo acessado
através dos sinais *IOR ou *IOW (ativados pelas instruções "in" e "out")
I/O é o nome dado a dispositivos que realizam diversas funções específicas,
tais como enviar dados, receber dados, configurar a porta serial, controlar o
acionador de disco ou ainda gerenciar a temporização. De forma mais simples,
diz-se que os dispositivos de I/O trabalham com comandos e dados. Os
comandos (operações de escrita) indicam como o dispositivo deverá operar,
por exemplo, mudando a resolução da placa VGA, enquanto que os dados
(leitura ou escrita) são manuseados pelo I/O com objetivos diversos, como,
por exemplo, para serem comunicados via modem ou placa de rede.
•
instruções in, out, ins e outs
•
64K x 1K endereços
Espaço de I/O com
512 endereços
para a placa do sistema ou
Indica se o endereço era
para os slots de expansão
(A9=0) - placa do sistema
Gerado pelas
instruções IN e OUT,
mas ignorado no caso
de alguns PCs antigos
Não são usados pelas
instruções IN e OUT
(A9=1) - slots de expansão
19 18 17 16
15 14 13 12 11 10
9
8 7 6 5 4 3 2 1 0
Bits do Endereço
Figura 6.1. Interpretação dos bits de endereçamento de I/O, nas arquiteturas de PCs antigos.
MZ
MZ Editora Ltda.
FFFFh
0400h
03FFh
0200h
01FFh
0000h
64.512
512
512
Não usado no projeto inicial do PC
Espaço para os slots de expansão
Espaço para a placa do sistema
Figura 6.2. Utilização do espaço de endereçamento de I/O nos primeiros PCs.
•
dispositivos "on-board"
Endereços
Dispositivo
000h-00Fh
primeiro controlador de DMA (8237)
020h-021h
primeiro controlador de interrupções (8259)
040h-043h
temporizador programável (8253)
060h-063h
interface paralela 8255 (XT)
060h-064h
controlador 8742 (AT)
070h-071h
RAM CMOS e registrador de máscara NMI (AT)
080h-08Fh
registradores de paginação para DMA
0A0h-0A1h
segundo controlador de interrupções (AT)
0C0h-0DFh
segundo controlador de DMA (AT)
0F0h-0FFh
coprocessador aritmético (AT)
1F0h-1FFh
disco rígido (AT)
200h-20Fh
porta de jogos
238h-23Bh
mouse de barramento
278h-27Fh
LPT2:
2B0h-2BFh
vídeo (EGA-VGA)
2C0h-2CFh
vídeo (EGA-VGA)
2D0h-2DFh
vídeo (EGA-VGA)
2E8h-2EFh
COM4:
2F8h-2FFh
COM2:
320h-32Fh
disco rígido (XT)
378h-37Fh
LPT1:
300h-31Fh
reservado para protótipos
3C0h-3CFh
vídeo (EGA-VGA)
3D0h-3DFh
vídeo (CGA)
3E8h-3EFh
COM3:
3F0h-3F7h
disco flexível
3F8h-3FFh
COM1:
400h =>
projetos PCI
Decodificação de I/O e Memória
Cap.6:
3/10
Decodificação com endereço fixo
•
*CS0, *CS1,...,*CS7 com habilitação em nível baixo
•
OR dos *CS com *IOR e *IOW
D0
D1
D2
D0
Q0
D1
Q1
D2
Q2
D3
Q3
D4
Q4
D5
Q5
D6
Q6
D7
Q7
OC
G
74LS373
*IOW (B13)
74LS02
D3
D4
D5
D6
D7
D0
D1
D2
D3
D4
D5
1A1
1Y1
1A2
1Y2
1A3
1Y3
1A4
1Y4
2A1
2Y1
2A2
2Y2
2A3
2Y3
2A4
2Y4
1G
2G
74LS244
*CS0 (3E0H)
*CS1 (3E1H)
*CS2 (3E2H)
*CS3 (3E3H)
*CS4 (3E4H)
*CS5 (3E5H)
*CS6 (3E6H)
VCC
A
B
C
G1
G2A
G2B
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
74LS138
A0 (A31)
A1 (A30)
A2 (A29)
A9
A8
A7
74LS30
A9 (A22)
A8 (A23)
A7 (A24)
A4 (A27)
A6 (A25)
A5 (A26)
74LS04
A6
A5
*A4
*A3
*AEN
*CS7 (3E7H)
*IOR (B14)
74LS32
D6
D7
D0
D1
D2
D3
A1
B1
A2
B2
A3
B3
A4
B4
A5
B5
A6
B6
A7
B7
A8
B8
G
DIR
74LS245
D0 (A9)
D1 (A8)
D2 (A7)
D3 (A6)
74LS04
74LS04
A3 (A28)
AEN (A11)
*IOR (B14)
*IOW (B13)
74LS08
D4 (A5)
D5 (A4)
D6 (A3)
D7 (A2)
74LS32
D4
D5
D6
D7
*IOR (B14)
Barramento
de Dados do PC
Barramento Interno
Entrada com
8 Bits
Saída com
8 Bits
8 Endereços
Decodificados
A9
A8
1
1
A7
A6
1
1
A5
A4
1
0
A3
A2
0
X
A1
A0
X
X
Endereço Base = 3E0H
*ADROK
*IORW
Figura 6.4. Decodificação de I/O com endereço fixo.
•
outportb(0x3E0, variável);
•
variável = inportb(0x3E0);
•
uso do 74LS374 ao invés do 74LS373
AEN = 0 é um nível lógico necessário para que os decodificadores de
I/O operem sem conflitar com os ciclos de DMA.
Decodificação programável por chave
•
uso de "dip switch"
•
outportb(endereço, variável);
•
variável = inportb(endereço);
MZ
MZ Editora Ltda.
D0
Q0
D1
Q1
D2
Q2
D3
Q3
D4
Q4
D5
Q5
D6
Q6
D7
Q7
OC
G
74LS373
D0
D1
D2
*IOW (B13)
74LS02
D3
D4
D5
D6
D7
1G
2G
74LS244
D0
D1
D2
D3
D4
D5
*CS0 (base)
*CS1 (base+1)
*CS2 (base+2)
*CS3 (base+3)
*CS4 (base+4)
*CS5 (base+5)
*CS6 (base+6)
VCC
A
B
C
G1
G2A
G2B
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
74LS138
A0 (A31)
A1 (A30)
A2 (A29)
P0
P1
P2
P3
P4
P5
P6
P7
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
G
P=Q
74LS688
AEN (A11)
6x (8K2)
A9 (A22)
A8 (A23)
A7 (A24)
A6 (A25)
A5 (A26)
A4 (A27)
A3 (A28)
VCC
*CS7 (base+7)
*IOR (B14)
74LS32
D6
D7
D0
D1
D2
D3
A1
B1
A2
B2
A3
B3
A4
B4
A5
B5
A6
B6
A7
B7
A8
B8
G
DIR
74LS245
D0 (A9)
D1 (A8)
D2 (A7)
D3 (A6)
VCC
SW1
SW DIP-6
*IOR (B14)
*IOW (B13)
74LS08
*ADROK
*IORW
D4 (A5)
D5 (A4)
D6 (A3)
D7 (A2)
74LS32
D4
D5
D6
D7
*IOR (B14)
Barramento
de Dados do PC
Barramento Interno
Entrada com
8 Bits
Saída com
8 Bits
8 Endereços
Decodificados
A9
A8
1
Y
A7
A6
Y
Y
A5
A4
Y
Y
A3
A2
Y
X
A1
A0
X
X
Programado pela Chave
1A1
1Y1
1A2
1Y2
1A3
1Y3
1A4
1Y4
2A1
2Y1
2A2
2Y2
2A3
2Y3
2A4
2Y4
Figura 6.5. Decodificação programável por chave, usando o 74LS688.
4X (8K2)
VCC
VCC
4K7
*CS0 (base+0)
*CS1 (base+4)
*CS2 (base+8)
*CS3 (base+12)
*CS4 (base+16)
A
B
C
G1
G2A
G2B
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
74LS138
A2 (A29)
A4 (A27)
A3 (A28)
74LS266
74LS266
A8 (A23)
A7 (A24)
SW1
SW DIP-4
A6 (A25)
74LS266
ADROK
*CS5 (base+20)
*CS6 (base+24)
*CS7 (base+28)
74LS266
74LS09
A5 (A26)
74LS04
AEN (A11)
A9 (A22)
A
B
NXOR
0
0
1
0
1
0
1
0
0
1
1
1
A=B
1
A=B
0
Wired AND
Coletor Aberto
A9
A8
1
Y
A7
A6
Y
Y
A5
A4
Y
X
A3
A2
X
X
A1
A0
-
-Programado pela Chave
8 Linhas Decodificadas.
Cada linha seleciona um
bloco de 4 endereços
consecutivos.
Decodificação de I/O e Memória
Cap.6:
5/10
•
decodificação selecionável por PROM
EXEMPLO: Habilitar *CS0 para o endereço 382h
Endereço
Dado Programado
1
1
1
0
0
0
0
1
0
D7 D6 D5 D4 D3 D2 D1 D0
1
1
1
1
1
1
1
0
A8 A7 A6 A5 A4 A3 A2 A1 A0
A0 (A31)
A1 (A30)
8
7
A2 (A29)
A3 (A28)
6
5
A4 (A27)
A5 (A26)
4
3
A6 (A25)
A7 (A24)
2
1
A8 (A23) 23
(60 s)
N82S141
512X8 PROM
AEN (A11) 21
A9 (A22) 19
23
21
*CS0
*CS1
9
10
*CS2
*CS3
11
13
*CS4
*CS5
14
15
*CS6
*CS7
16
17
VCC
A0
A1
A2
A3
A4
A5
A6
A7
A8
D0
D1
D2
D3
D4
D5
D6
D7
*CE1
*CE2
CE3
CE4
η
Figura 6.7. Decodificação de I/O usando uma PROM.
Expandindo o espaço de endereçamento
•
utilização dos bits de ordem superior
•
não funciona desde o surgimento do PCI
•
endereçamento indireto
•
RAM CMOS e vídeo VGA
DECOD.
NORMAL
D0 - D7
*IOW
D0 - D7
G
Latch
IA0-7
D0-D7
*CS
*IOW
*IOR
8 / 256
A0-A9
AEN
Endereço
Indireto
Decodificador
I/O Endereçado
Indiretamente
*SEL
Transceiver
Dado
Interpretado
como Endereço
Barramento de Dados Interno
*CS0
*CS1
Barramento
de Dados do PC
Figura 6.9. Esquema simplificado para o endereçamento indireto para I/O.
MZ
MZ Editora Ltda.
A
B
C
G1
G2A
G2B
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
74LS138
D0
Q0
D1
Q1
D2
Q2
D3
Q3
D4
Q4
D5
Q5
D6
Q6
D7
Q7
OC
G
74LS373
74LS27
D0
D1
D2
D3
D4
D5
D6
D7
IA0
IA1
IA2
IA3
IA4
IA5
IA6
IA7
VCC
*ICS0
*ICS1
*ICS2
*ICS3
*ICS4
*ICS5
*ICS6
*ICS7
D0
Q0
D1
Q1
D2
Q2
D3
Q3
D4
Q4
D5
Q5
D6
Q6
D7
Q7
OC
G
74LS373
D0
D1
D2
D3
D4
P0
P1
P2
P3
P4
P5
P6
P7
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
G
P=Q
74LS688
AEN (A11)
A0 (A31)
*IOW (B13)
6x (8K2)
A9 (A22)
A8 (A23)
A7 (A24)
A6 (A25)
A5 (A26)
A4 (A27)
A3 (A28)
VCC
*IOW (B13)
D5
D6
D7
1G
2G
74LS244
D0
D1
D2
D3
D4
D5
D6
D7
VCC
SW1
SW DIP-6
*IOR (B14)
A1
B1
A2
B2
A3
B3
A4
B4
A5
B5
A6
B6
A7
B7
A8
B8
G
DIR
74LS245
D0
D1
D2
D3
D4
D5
D6
D7
D0 (A9)
D1 (A8)
D2 (A7)
D3 (A6)
D4 (A5)
D5 (A4)
D6 (A3)
D7 (A2)
74LS32
A0 (A31)
74LS04
*IOR (B14)
Dado usado
como Endereço
8 Endereços Decodificados
Saída Digital
Endereçada Indiretamente
Entrada Digital
Endereçada Indiretamente
Barramento de Dados
Interno
Barramento de Dados do PC
Barramento Dados PC
74LS27
1A1
1Y1
1A2
1Y2
1A3
1Y3
1A4
1Y4
2A1
2Y1
2A2
2Y2
2A3
2Y3
2A4
2Y4
Figura 6.10. Uso de endereçamento indireto para expandir o espaço de I/O.
•
"outportb(base,índice);" seguido de "outportb(base+1,dado);"
I/O mapeado em memória
DO0
DO1
DO2
DO3
D0
D1
D2
D3
D0
Q0
D1
Q1
D2
Q2
D3
Q3
D4
Q4
D5
Q5
D6
Q6
D7
Q7
OC
G
74LS373
*MEMW
74LS02
D4
D5
D6
D7
DO4
DO5
DO6
DO7
D0
D1
A1
B1
A2
B2
A3
B3
A4
B4
A5
B5
A6
B6
A7
B7
A8
B8
G
DIR
74LS245
D0 (A9)
D1 (A8)
74LS04
74LS30
A13 (A18)
A14 (A17)
A15 (A16)
A16 (A15)
A18 (A13)
A19 (A12)
A7 (A24)
A8 (A23)
A9 (A22)
A10 (A21)
A11 (A20)
A12 (A19)
74LS30
74LS04
D2 (A7)
D3 (A6)
D4 (A5)
D5 (A4)
D6 (A3)
D7 (A2)
74LS10
D2
D3
D4
D5
D6
DI0
DI1
DI2
DI3
DI4
DI5
D0
D1
D2
D3
D4
D5
1G
2G
74LS244
*MEMR
74S260
A0 (A31)
A1 (A30)
A2 (A29)
A3 (A28)
A4 (A27)
A5 (A26)
A6 (A25)
A17 (A14)
*MEMR
74LS02
74LS04
D6
D7
DI6
DI7
D7
Decodificação dos 20 bits do Endereço DFFF8H
A19
1
A18
1
A17
0
A16
1
A15
1
A14
1
A13
1
A12
1
A11
1
A10
1
A9
1
A8
1
A7
1
A6
1
A5
1
A4
1
A3
1
A2
0
A1
0
A0
0
Entradas usando o endereço
de memória DFFF8H
Saídas usando o endereço
de memória DFFF8H
1A1
1Y1
1A2
1Y2
1A3
1Y3
1A4
1Y4
2A1
2Y1
2A2
2Y2
2A3
2Y3
2A4
2Y4
Decodificação de I/O e Memória
Cap.6:
7/10
•
nunca entra em conflito com os endereços de I/O já utilizados
•
aumenta o espaço de I/O
•
oferece a possibilidade de usar todas as instruções da família 80x86
I/O a 16 bits
DO0
DO1
DO2
DO3
D0
D1
D2
D3
D0
Q0
D1
Q1
D2
Q2
D3
Q3
D4
Q4
D5
Q5
D6
Q6
D7
Q7
OC
G
74LS373
*IOW
74LS02
D4
D5
D6
D7
DO4
DO5
DO6
DO7
74LS05
A1
B1
A2
B2
A3
B3
A4
B4
A5
B5
A6
B6
A7
B7
A8
B8
G
DIR
74LS245
SD0
SD1
SD2
SD3
SD4
SD5
SD6
SD7
*IOR
A0
*I/OCS16
DO8
DO9
DO10
DO11
D8
D9
D10
D11
D0
Q0
D1
Q1
D2
Q2
D3
Q3
D4
Q4
D5
Q5
D6
Q6
D7
Q7
OC
G
74LS373
*IOW
74LS02
D12
D13
D14
D15
DO12
DO13
DO14
DO15
A1
B1
A2
B2
A3
B3
A4
B4
A5
B5
A6
B6
A7
B7
A8
B8
G
DIR
74LS245
SD8
SD9
SD10
SD11
SD12
SD13
SD14
SD15
*IOR
*SBHE
A9
...
A1
AEN
decod.
I/O
endereço
ímpar
endereço
par
74LS04
Figura 6.12. Esquema para I/O a 16 bits.
•
parte alta e parte baixa (*SBHE e A0)
•
acesso a endereço par
•
mov dx,300h
in ax,dx
•
"outport(0x300);" em linguagem C
•
endereços acessados: 300h e 301h
•
1 único ciclo de barramento
•
acesso a endereço ímpar
•
mov dx,301h
in ax,dx
•
"outport(0x301);" em linguagem C
•
endereços acessados: 301h e 302h
•
2 ciclos de barramento
MZ
MZ Editora Ltda.•
acesso de 16 bits em barramento PCI
•
acesso de 32 bits em barramento PCI
Decodificação de memória
•
*(S)MEMR e *(S)MEMW
BD0
BD1
BD2
BD3
BD4
BA0
BA1
BA2
BA3
BA4
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
CE
OE
WE
D0
D1
D2
D3
D4
D5
D6
D7
6116
BD0
BD1
BD2
BD3
BD4
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
CE
OE
WE
D0
D1
D2
D3
D4
D5
D6
D7
6116
BA0
BA1
BA2
BA3
BA4
BA10
BA9
BA8
BA7
BA6
1A1
1Y1
1A2
1Y2
1A3
1Y3
1A4
1Y4
2A1
2Y1
2A2
2Y2
2A3
2Y3
2A4
2Y4
1G
2G
74LS244
A10 (A21)
A9 (A22)
A8 (A23)
A6 (A25)
A7 (A24)
A5 (A26)
A4 (A27)
A3 (A28)
1A1
1Y1
1A2
1Y2
1A3
1Y3
1A4
1Y4
2A1
2Y1
2A2
2Y2
2A3
2Y3
2A4
2Y4
1G
2G
74LS244
BA5
BA4
BA3
BA5
BA6
BA7
BA8
BA9
BA10
*BMEMR
*CS0
BD5
BD6
BD7
*BMEMR
*CS1
BA5
BA6
BA7
BA8
BA9
BA10
BD5
BD6
BD7
BD0
BD1
BD2
BD3
BA0
BA1
BA2
BA3
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
CE
OE
WE
D0
D1
D2
D3
D4
D5
D6
D7
6116
*BMEMW
BD0
BD1
BD2
BD3
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
CE
OE
WE
D0
D1
D2
D3
D4
D5
D6
D7
6116
*BMEMW
BA0
BA1
BA2
BA3
BA2
BA1
BA0
*BMEMR
*BMEMW
A2 (A29)
A1 (A30)
A0 (A31)
*MEMR (B12)
*MEMW (B11)
A11 (A20)
A
Y0
B
Y1
Y2
G
Y3
74LS139
*CS0
BA4
BA5
BA6
BA7
BA8
BA9
BA10
BD4
BD5
BD6
BD7
BA4
BA5
BA6
BA7
BA8
BA9
BA10
BD4
BD5
BD6
BD7
*BMEMR
*BMEMW
*CS3
*BMEMR
*BMEMW
*CS2
*CS1
*CS2
*CS3
*SEL GRUPO
A12 (A19)
VCC
A19 (A12)
A18 A(13)
A17 (A14)
A16 (A15)
A15 (A16)
A14 (A17)
A13 (A18)
8K2
P0
P1
P2
P3
P4
P5
P6
P7
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
G
P=Q
74LS688
*SEL GRUPO
D0 (A9)
D1 (A8)
D2 (A7)
D3 (A6)
D4 (A5)
D5 (A4)
D6 (A3)
A1
B1
A2
B2
A3
B3
A4
B4
A5
B5
A6
B6
A7
B7
A8
B8
G
DIR
74LS245
BD0
BD1
BD2
BD3
BD4
BD5
BD6
BD7
D7 (A2)
*MEMR (B12)
SW DIP-7
Figura 6.13. Decodificação de 8 KB de memória em blocos de 2 KB.
VCC
SW DIP-4
8K2
A19 (A12)
A18 (A13)
A17 (A14)
A16 (A15)
A0
A1
A2
A3
B0
B1
B2
B3
A<B
A<B
A=B
A=B
A>B
A>B
74LS85
Decodificação
VCC
de um bloco
de 64KB
Decodificação de I/O e Memória
Cap.6:
9/10
Mapa de memória
PC AT
Memória Estendida
100000h
E0000h
C0000h
A0000h
00000h
00400h
00500h
Reservado para a PARA ROM BIOS
Reservado para ROMs
Buffers de Vídeo
Porção transiente do DOS
Área de Programas
(programas de usuários e dados)
Porção residente do DOS
Área de dados para ROM BIOS e BASIC
Área de dados para a ROM BIOS
Tabela de Vetores de Interrupção
Área destinada
ao DOS
9FFFFh
Figura 6.15. Mapa de memória de um típico PC AT.
Exercícios
6-7) Projete um circuito que multiplexe o acesso a 2 registradores num
mesmo endereço, da seguinte forma: o primeiro acesso é realizado em um
dos registradores, o acesso seguinte é feito ao outro e assim
sucessivamente.
6-12) O seguinte conjunto de instruções é utilizado para realizar uma leitura
de 16 bits:
mov dx,300h
in ax,dx
.
Existe alguma diferença de desempenho entre executar estas instruções
com a linha *I/O CS 16 ativada ou não ?
6-13) Repita o problema anterior, substituindo apenas 300h por 301h.
6-14) Nos casos dos problemas 6-12 e 6-13, quais as diferenças de
implementações em hardware ao ativar-se ou não a linha *I/O CS 16 ?
6-15) O que acontecerá se, por engano, um projetista utilizar em seu projeto
os endereços de I/O de 3F0h a 3F7h ?
MZ
MZ Editora Ltda.