8086_proteus_all_dsn

为了备考,把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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值