为了备考,把8086相关的所有芯片都跑了一遍,都放在一个proteus dsn文件里了,需要的同学可以去down
;标识定义
IO1 EQU 0100h
IO2 EQU 0200h
IO3 EQU 0300h
IO4 EQU 0400h
IO5 EQU 0500h
IO6 EQU 0600h
IO7 EQU 0700h
IO8 EQU 0800h
IO9 EQU 0900h
ADDR0 EQU 60h
assume cs:code
assume ss:stack
stack segment stack
db 32 dup(0)
stack ends
code segment
start: call M8259
jmp $
; 中断 8259, IO8
M8259 proc
pushf
push ax
push bx
cli
mov ax, 0
mov es, ax
mov si,ADDR0*4 ;设置中断向量
mov ax,offset int0
mov es:[si],ax
mov ax,cs
mov es:[si+2],ax
mov al,00010011b; ICW1, 单片, 跳变触发
mov dx,IO8
out dx,al
mov al,ADDR0; ICW2 中断类型码为 060 ~ 068h;
mov dx,IO8 + 2
out dx,al
;mov al,1bh; ICW4 00011011b
mov al, 01h; ICW4 非缓冲, 非自动EOI, 非特殊套嵌
out dx,al
mov al, 0h; OCW1 完全不屏蔽
out dx, al
mov dx, IO8
mov al, 20h; OCW2 IR0 普通EOI结束
out dx, al
; 中断仿真bug, 地址线放数据进行模拟
mov dx, IO8
mov al, ADDR0
out dx, al
sti
jmp $
pop bx
pop ax
popf
ret
M8259 endp
; 串行 8251, IO7
M8251 proc
pushf
push ax
push dx
push cx
mov dx, IO7 + 2; 写串行 方式选择控制字
mov al, 7dh
;mov al, 01001101b
out dx, al
mov dx, IO7 + 2; 写 操作命令控制字
mov al, 11h
out dx, al
mov dx, IO7; 写数据
mov cx, 0fffh
o1: mov al, [di]
out dx, al
inc di
loop o1
pop cx
pop dx
pop ax
popf
ret
M8251 endp
; 并行 8255, IO6
M8255 proc
pushf
push dx
push ax
mov dx, IO6 + 6; 控制寄存器,
mov al, 10000000b; 端口A, B, C 全部输出
out dx, al
mov dx, IO6; 端口A
mov al, 3
out dx, al
pop ax
pop dx
popf
ret
M8255 endp
; 时钟 8253, IO5
M8253 proc
pushf
push dx
push ax
mov dx, IO5 + 6; 控制寄存器
mov al, 00010110b; 通道0 计数器低字节 方式0
;mov al, 00110100b; 通道0 计数器低字节 方式0
out dx, al
mov dx, IO5; 通道0
mov al, 0ffh
out dx, al
pop ax
pop dx
popf
ret
M8253 endp
; 数码管实验 IO2
LED proc
push dx
push ax
mov dx, IO2
mov al, 0
LEDL: inc al
out dx, al
jmp LEDL
pop ax
pop dx
popf
ret
LED endp
int0 proc
cli
call M8255
sti
iret
int0 endp
; DAC0832 实验 IO3
DAC proc
push dx
push ax
push cx
mov dx, IO3
mov al, 0h
mov cx, 0ffh
DACL1: inc al
out dx, al
call delay
loop DACL1
mov cx, 0ffh
DACL2: dec al
out dx, al
call delay
loop DACL2
pop cx
pop ax
pop dx
popf
ret
DAC endp
; ADC0808 实验IO4, proteus 不具备ADC0809仿真能力,用0808替换
ADC0808 proc
push ax
push dx
mov dx, IO4
mov al, 12h
out dx, al
call delay
in al, dx
pop dx
pop ax
popf
ret
ADC0808 endp
; 延迟程序
delay: pushf
push cx
mov cx, 0ffh
n: loop n
pop cx
popf
ret
code ends
end start