Moderadores: andre_luis, 51
tcpipchip escreveu:Estou montando o circuito (melhorando) para o 8086...
.MODEL SMALL
IO0 EQU 0000h
IO1 EQU 0200h
IO2 EQU 0400h
IO3 EQU 0600h
IO4 EQU 0800h
IO5 EQU 0A00h
IO6 EQU 0C00h
IO7 EQU 0E00h
IO8 EQU 1000h
IO9 EQU 1200h
IO10 EQU 1400h
IO11 EQU 1600h
IO12 EQU 1800h
IO13 EQU 1A00h
IO14 EQU 1C00h
IO15 EQU 1E00h
; 8251A USART
ADR_USART_DATA EQU (IO0 + 00h)
ADR_USART_CMD EQU (IO0 + 02h)
ADR_USART_STAT EQU ADR_USART_CMD
; 8253A Timer
ADR_TIMER_CONTROL EQU (IO2 + 06h)
ADR_TIMER_DATA0 EQU (IO2 + 00h)
ADR_TIMER_DATA1 EQU (IO2 + 02h)
ADR_TIMER_DATA2 EQU (IO2 + 04h)
TIMER_COUNTER0 EQU 00h
TIMER_COUNTER1 EQU 40h
TIMER_COUNTER2 EQU 80h
TIMER_LATCH EQU 00h
TIMER_LSB EQU 10h
TIMER_MSB EQU 20h
TIMER_LSB_MSB EQU 30h
TIMER_MODE0 EQU 00h
TIMER_MODE1 EQU 02h
TIMER_MODE2 EQU 04h
TIMER_MODE3 EQU 06h
TIMER_MODE4 EQU 08h
TIMER_MODE5 EQU 09h
TIMER_BCD EQU 01h
; 8255A PIO
ADR_PPI_PORTA EQU (IO1)
ADR_PPI_PORTB EQU (IO1 + 02h)
ADR_PPI_PORTC EQU (IO1 + 04h)
ADR_PPI_CONTROL EQU (IO1 + 06h)
PPI_PORTA_INP EQU 10h
PPI_PORTA_OUT EQU 00h
PPI_PORTB_INP EQU 02h
PPI_PORTB_OUT EQU 00h
PPI_PORTCL_INP EQU 01h
PPI_PORTCL_OUT EQU 00h
PPI_PORTCH_INP EQU 08h
PPI_PORTCH_OUT EQU 00h
PPI_MODE_BCL_0 EQU 00h
PPI_MODE_BCL_1 EQU 04h
PPI_MODE_ACH_0 EQU 00h
PPI_MODE_ACH_1 EQU 20h
PPI_MODE_ACH_2 EQU 40h
PPI_ACTIVE EQU 80h
; 8259
IO8259_MAIN_ADDR EQU 0600H
IO8259_SUB_ADDR EQU 0800H
.8086
.code
io8259_std1_init macro base,icw1_val,icw2_val,icw4_val
mov dx,base
mov al,icw1_val
out dx,al
mov dx,base+2
mov al,icw2_val
out dx,al
mov al,icw4_val
out dx,al
endm
io8259_std_init macro base,icw1_val,icw2_val,icw3_val,icw4_val
mov dx,base
mov al,icw1_val
out dx,al
mov dx,base+2
mov al,icw2_val
out dx,al
mov al,icw3_val
out dx,al
mov al,icw4_val
out dx,al
endm
setup_int macro int_irq,int_cs,int_ip
push di
push ds
mov di,0
mov ds,di
mov di,(int_irq)*4
mov word ptr ds:[di],int_ip
mov word ptr ds:[di+2],int_cs
pop ds
pop di
endm
setup_ints macro int_irq,int_cs,int_ip
setup_int int_irq,int_cs,int_ip
setup_int (int_irq+1),int_cs,int_ip
setup_int (int_irq+2),int_cs,int_ip
setup_int (int_irq+3),int_cs,int_ip
setup_int (int_irq+4),int_cs,int_ip
setup_int (int_irq+5),int_cs,int_ip
setup_int (int_irq+6),int_cs,int_ip
setup_int (int_irq+7),int_cs,int_ip
endm
intxx proc far
IRET
;cli
pushf
push ax
push dx
MOV DX,IO11
MOV AL,0AAH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
pop dx
pop ax
popf
;sti
iret
intxx endp
intl1 proc far
cli
pushf
push ax
push dx
MOV DX,IO15
MOV AL,0AAH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
pop dx
pop ax
popf
sti
iret
intl1 endp
intl2 proc far
cli
pushf
push ax
push dx
CALL IMPRIME_DISPLAY_A
MOV DX,IO14
MOV AL,0AAH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
pop dx
pop ax
popf
sti
iret
intl2 endp
intl1_s proc far
cli
pushf
push ax
push dx
CALL IMPRIME_DISPLAY_B
MOV DX,IO13
MOV AL,0AAH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
pop dx
pop ax
popf
sti
iret
intl1_s endp
intl2_s proc far
cli
pushf
push ax
push dx
MOV DX,IO12
MOV AL,0AAH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
pop dx
pop ax
popf
sti
iret
intl2_s endp
.startup
MOV AX,CS
MOV DS,AX
MOV SS,AX
CALL INICIALIZA_8255
CALL INICIALIZA_8251
CALL INICIALIZA_8259
CALL INICIALIZA_8253
LOO:
inc bx
cmp bx,65535
je zera
jmp LOO
zera:
call manda_caracter
mov bx,0
jmp loo
;19200,N,8,1
INICIALIZA_8251:
MOV AL,7Dh
MOV DX,ADR_USART_CMD ; /* ED */
OUT DX,AL
MOV AL,07h
MOV DX,ADR_USART_CMD ; /* RxEn, TxEn, DTRa */
OUT DX,AL
RET
MANDA_CARACTER:
PUSHF
PUSH AX
PUSH DX
MOV DX, ADR_USART_STAT
BUSY:
IN AL,DX
AND AL,1
JZ BUSY
MOV AL,"."
MOV DX,ADR_USART_DATA ; DATA
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
POP DX
POP AX
POPF
RET
;20 IOS SENDO UTILIZADAS
INICIALIZA_8255:
MOV DX, ADR_PPI_CONTROL
MOV AL,0
OR AL,PPI_PORTA_OUT
OR AL,PPI_PORTB_OUT
OR AL,PPI_PORTCL_INP
OR AL,PPI_PORTCH_INP
OR AL,PPI_MODE_BCL_0
OR AL,PPI_MODE_ACH_0
OR AL,PPI_ACTIVE
OUT DX,AL
RET
IMPRIME_DISPLAY_A:
PUSH AX
PUSH DX
MOV DX,ADR_PPI_PORTB
MOV AL,7FH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
POP DX
POP AX
RET
IMPRIME_DISPLAY_B:
PUSH AX
PUSH DX
MOV DX,ADR_PPI_PORTB
MOV AL,0FFH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
POP DX
POP AX
RET
;CONFIGURA 8 INTERRUPTS (0-MAIOR PRIORIDADE)
INICIALIZA_8259:
cli
;NMI
setup_ints 00h,seg intxx,offset intxx
setup_int 30h,seg intl1,offset intl1
setup_int 31h,seg intl2,offset intl2
setup_int 32h,seg intl1_s,offset intl1_s
setup_int 33h,seg intl2_s,offset intl2_s
io8259_std_init io8259_main_addr,13h,30h,03h,0h
sti
ret
INICIALIZA_8253:
PUSH AX
PUSH DX
MOV DX,ADR_TIMER_CONTROL
MOV AL,0
OR AL,TIMER_COUNTER1
OR AL,TIMER_MODE2
OR AL,TIMER_LSB_MSB
OUT DX,AL
MOV DX,ADR_TIMER_DATA1
MOV AL,0D0H
OUT DX,AL
MOV DX,ADR_TIMER_DATA1
MOV AL,07H
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
POP DX
POP AX
RET
; VARIAVEIS
.DATA
VALUE DB 0
.STACK
STK DW 128 DUP(0)
END
tcpipchip escreveu:Estou montando o circuito (melhorando) para o 8086.
Ele terá
8086 - processador principal
8259 - Controlador de Interrupções (a novidade)
8251 - Usart
8253 - 3 timers
8255 - PIC 24 IO
Exemplos para inicializar estes dispositivos em assembly.
O 8253 vai gerar em uma das saidas um SYSTICK para gerar uma interrupcao em uma da 8 entradas do 8259 (8 ou 1ch)...ou para fazer SOM.
Já esta funcionando 8251, 8253, 8255, tenho que fazer funcionar o 8259, tenho que ver pq nao responde com INTA.
Tem funcao para ler e escrever no terminal...
Abraços
TCPIPCHIP
.MODEL SMALL
IO0 EQU 0000h
IO1 EQU 0200h
IO2 EQU 0400h
IO3 EQU 0600h
IO4 EQU 0800h
IO5 EQU 0A00h
IO6 EQU 0C00h
IO7 EQU 0E00h
IO8 EQU 1000h
IO9 EQU 1200h
IO10 EQU 1400h
IO11 EQU 1600h
IO12 EQU 1800h
IO13 EQU 1A00h
IO14 EQU 1C00h
IO15 EQU 1E00h
; 8251A USART
ADR_USART_DATA EQU (IO0 + 00h)
ADR_USART_CMD EQU (IO0 + 02h)
ADR_USART_STAT EQU ADR_USART_CMD
; 8253A Timer
ADR_TIMER_CONTROL EQU (IO2 + 06h)
ADR_TIMER_DATA0 EQU (IO2 + 00h)
ADR_TIMER_DATA1 EQU (IO2 + 02h)
ADR_TIMER_DATA2 EQU (IO2 + 04h)
TIMER_COUNTER0 EQU 00h
TIMER_COUNTER1 EQU 40h
TIMER_COUNTER2 EQU 80h
TIMER_LATCH EQU 00h
FTIMER_LSB EQU 10h
TIMER_MSB EQU 20h
TIMER_LSB_MSB EQU 30h
TIMER_MODE0 EQU 00h
TIMER_MODE1 EQU 02h
TIMER_MODE2 EQU 04h
TIMER_MODE3 EQU 06h
TIMER_MODE4 EQU 08h
TIMER_MODE5 EQU 09h
TIMER_BCD EQU 01h
; 8255A PIO
ADR_PPI_PORTA EQU (IO1)
ADR_PPI_PORTB EQU (IO1 + 02h)
ADR_PPI_PORTC EQU (IO1 + 04h)
ADR_PPI_CONTROL EQU (IO1 + 06h)
PPI_PORTA_INP EQU 10h
PPI_PORTA_OUT EQU 00h
PPI_PORTB_INP EQU 02h
PPI_PORTB_OUT EQU 00h
PPI_PORTCL_INP EQU 01h
PPI_PORTCL_OUT EQU 00h
PPI_PORTCH_INP EQU 08h
PPI_PORTCH_OUT EQU 00h
PPI_MODE_BCL_0 EQU 00h
PPI_MODE_BCL_1 EQU 04h
PPI_MODE_ACH_0 EQU 00h
PPI_MODE_ACH_1 EQU 20h
PPI_MODE_ACH_2 EQU 40h
PPI_ACTIVE EQU 80h
; 8259
IO8259_MAIN_ADDR EQU 0600H
IO8259_SUB_ADDR EQU 0800H
.8086
.code
io8259_std1_init macro base,icw1_val,icw2_val,icw4_val
mov dx,base
mov al,icw1_val
out dx,al
mov dx,base+2
mov al,icw2_val
out dx,al
mov al,icw4_val
out dx,al
endm
io8259_std_init macro base,icw1_val,icw2_val,icw3_val,icw4_val
mov dx,base
mov al,icw1_val
out dx,al
mov dx,base+2
mov al,icw2_val
out dx,al
mov al,icw3_val
out dx,al
mov al,icw4_val
out dx,al
endm
setup_int macro int_irq,int_cs,int_ip
push di
push ds
mov di,0
mov ds,di
mov di,(int_irq)*4
mov word ptr ds:[di],int_ip
mov word ptr ds:[di+2],int_cs
pop ds
pop di
endm
setup_ints macro int_irq,int_cs,int_ip
setup_int int_irq,int_cs,int_ip
setup_int (int_irq+1),int_cs,int_ip
setup_int (int_irq+2),int_cs,int_ip
setup_int (int_irq+3),int_cs,int_ip
setup_int (int_irq+4),int_cs,int_ip
setup_int (int_irq+5),int_cs,int_ip
setup_int (int_irq+6),int_cs,int_ip
setup_int (int_irq+7),int_cs,int_ip
endm
intxx proc far
IRET
intxx endp
intl1 proc far
cli
pushf
push ax
push dx
push bx
CALL VERIFICA_TECLA
MOV DX,ADR_PPI_PORTA
MOV AL,0FFH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
MOV BX, WORD PTR LIN_COL
MOV AL,DISPLAY[BX]
MOV BH,0
MOV BL,AL
MOV AL,TABLE_LED[BX]
MOV DX, ADR_PPI_PORTB
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
MOV BX, WORD PTR LIN_COL
MOV AL, TABLE_LIN_COL[BX]
INC WORD PTR LIN_COL
CMP WORD PTR LIN_COL,4
JE ZERA
JMP VARRE
ZERA:
MOV WORD PTR LIN_COL,0
VARRE:
MOV DX,ADR_PPI_PORTA
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
pop bx
pop dx
pop ax
popf
sti
iret
intl1 endp
intl2 proc far
cli
pushf
push ax
push dx
MOV DX,IO13
MOV AL,0AAH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
pop dx
pop ax
popf
sti
iret
intl2 endp
intl1_s proc far
cli
pushf
push ax
push dx
MOV DX,IO14
MOV AL,0AAH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
pop dx
pop ax
popf
sti
iret
intl1_s endp
intl2_s proc far
cli
pushf
push ax
push dx
MOV DX,IO15
MOV AL,0AAH
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
pop dx
pop ax
popf
sti
iret
intl2_s endp
.startup
MOV AX,CS
MOV DS,AX
MOV SS,AX
CALL INICIALIZA_8255
CALL INICIALIZA_8251
CALL INICIALIZA_8259
CALL INICIALIZA_8253
MOV WORD PTR LIN_COL,0
MOV BYTE PTR TECLA,'.'
LOO:
inc bx
cmp bx,65535
je zera
jmp LOO
zera:
;MANDA . PELA SERIAL
call manda_caracter
mov bx,0
jmp loo
;19200,N,8,1
INICIALIZA_8251:
MOV AL,7Dh
MOV DX,ADR_USART_CMD ; /* ED */
OUT DX,AL
MOV AL,07h
MOV DX,ADR_USART_CMD ; /* RxEn, TxEn, DTRa */
OUT DX,AL
RET
MANDA_CARACTER:
PUSHF
PUSH AX
PUSH DX
MOV DX, ADR_USART_STAT
BUSY:
IN AL,DX
AND AL,1
JZ BUSY
MOV AL,TECLA
MOV DX,ADR_USART_DATA ; DATA
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
POP DX
POP AX
POPF
RET
;20 IOS SENDO UTILIZADAS
INICIALIZA_8255:
MOV DX, ADR_PPI_CONTROL
MOV AL,0
OR AL,PPI_PORTA_OUT
OR AL,PPI_PORTB_OUT
OR AL,PPI_PORTCL_INP
OR AL,PPI_PORTCH_INP
OR AL,PPI_MODE_BCL_0
OR AL,PPI_MODE_ACH_0
OR AL,PPI_ACTIVE
OUT DX,AL
RET
;CONFIGURA 4 INTERRUPTS (0-MAIOR PRIORIDADE)
INICIALIZA_8259:
cli
;NMI
setup_ints 00h,seg intxx,offset intxx
setup_int 30h,seg intl1,offset intl1
setup_int 31h,seg intl2,offset intl2
setup_int 32h,seg intl1_s,offset intl1_s
setup_int 33h,seg intl2_s,offset intl2_s
io8259_std_init io8259_main_addr,13h,30h,03h,0h
sti
ret
INICIALIZA_8253:
PUSH AX
PUSH DX
MOV DX,ADR_TIMER_CONTROL
MOV AL,0
OR AL,TIMER_COUNTER1
OR AL,TIMER_MODE2
OR AL,TIMER_LSB_MSB
OUT DX,AL
MOV DX,ADR_TIMER_DATA1
MOV AL,0FFH ;;D0
OUT DX,AL
MOV DX,ADR_TIMER_DATA1
MOV AL,0FFH ;;07
OUT DX,AL
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
POP DX
POP AX
RET
VERIFICA_TECLA:
MOV DX,ADR_PPI_PORTC
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE SEM_TECLA
CMP AL,0EH
JE COLUNA_1
CMP AL,0DH
JE COLUNA_2
CMP AL,0BH
JE COLUNA_3
CMP AL,07H
JE COLUNA_4
COLUNA_1:
MOV BX,WORD PTR LIN_COL
MOV AL,TABCOL_1[BX]
MOV TECLA,AL
JMP SEM_TECLA
COLUNA_2:
MOV BX,WORD PTR LIN_COL
MOV AL,TABCOL_2[BX]
MOV TECLA,AL
JMP SEM_TECLA
COLUNA_3:
MOV BX,WORD PTR LIN_COL
MOV AL,TABCOL_3[BX]
MOV TECLA,AL
JMP SEM_TECLA
COLUNA_4:
MOV BX,WORD PTR LIN_COL
MOV AL,TABCOL_4[BX]
MOV TECLA,AL
SEM_TECLA:
MOV DX,0FFFFH
MOV AL,0AAH
OUT DX,AL
RET
; VARIAVEIS
;.DATA
LIN_COL DW 0
TABLE_LIN_COL DB 0FEH,0FDH,0FBH,0F7H
;DECODER SEVEN SEGMENT
TABLE_LED DB 3FH,06H,5BH,4FH,66H,6DH,79H,07H,7FH,67H
;DISPLAY DEVE CONTER DADO A SER IMPRESSO NO SEVEN SEGMENT
DISPLAY DB 1,2,3,4
TABCOL_1 DB 'C','7','4','1'
TABCOL_2 DB '0','8','5','2'
TABCOL_3 DB '=','9','6','3'
TABCOL_4 DB '+','/','X','-'
TECLA DB 0
.STACK
STK DW 128 DUP(0)
END
[code][/code]
Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes