搜索
bottom↓
回复: 9

Proteus 中8259的仿真

[复制链接]

出0入0汤圆

发表于 2011-3-17 08:55:45 | 显示全部楼层 |阅读模式
因为研究生复试的需要所以最近折腾了下8086的汇编,
不过proteus总是没有我预期的完美[可能也跟和谐的版本有关]
下面是折腾8259的一些总结,不过有一些问题,希望知道的能予以指正

电路搭建,基于自带的例子 (原文件名:8259_1.png)


程序源码 (原文件名:8259_2.png)


断点设置 (原文件名:8259_3.png)


仿真1 (原文件名:8259_4.png)


仿真2 (原文件名:8259_5.png)

另外,一些问题罗列如下
-.我用的老王的77sp2和谐,不过逻辑仿真器貌似用不了啊
-.8259模型需要改一下[加几个字符]才能用于仿真
0.一开始会莫名其妙的产生一个终端,一般位于前16字节,所以我的程序在那里也设置了捕获的proc,要不然会跑飞,不知为何
1.下一次触发时才会相应正确的中断,而当前相应的为上一次的?不过Simulation Log里的信息倒是正确的
2.级联模式,次级的irr不会自动清除,至少我觉的应该自动清除的,导致响应时会被进制,当然可能是我程序的问题
3.软件触发的中断没问题,直接int xx出来的中断都可以正确的响应,个人感觉要么是我程序的问题,要么是8259模型的问题
4.Proteus中仿真用exe和com格式的都可以,我的程序是使用masm的,顺带试了下mingw套件里的gas汇编,com格式输出时也是可以的
  不过没法调试,即使-gstabs加上了也不行.

*.上面的问题可能是本人程序上的错误,希望熟悉8086汇编的人能指正一下
工程文件ourdev_623172B3W6H8.rar(文件大小:32K) (原文件名:8086 Demo Board.rar)

出0入0汤圆

 楼主| 发表于 2011-3-17 08:58:32 | 显示全部楼层
编译链接选项[masm]
ml /c /Zd /Zi sample.asm
link16 /CODEVIEW sample.obj,sample.exe,,,nul.def

出0入0汤圆

 楼主| 发表于 2011-3-17 09:00:26 | 显示全部楼层
源码

.MODEL        SMALL

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
                iret
        intl1 endp
        intl2 proc far
                iret
        intl2 endp
        intl1_s proc far
                iret
        intl1_s endp
        intl2_s proc far
                iret
        intl2_s endp
        


.startup
        cli
      
        setup_ints 00h,seg intxx,offset intxx
        setup_ints 08h,seg intxx,offset intxx
        setup_ints 10h,seg intxx,offset intxx
        setup_ints 18h,seg intxx,offset intxx
        
        setup_int 30h,seg intl1,offset intl1
        setup_int 31h,seg intl2,offset intl2
        setup_int 40h,seg intl1_s,offset intl1_s
        setup_int 41h,seg intl2_s,offset intl2_s
   main:
        io8259_std_init io8259_main_addr,\
                        11h,30h,04h,13h
        ;io8259_std1_init io8259_main_addr,\
                        ;13h,30h,03h
   slave:
        io8259_std_init io8259_sub_addr,\
                        11h,40h,02h,03h

        sti
        jmp $

.data
.stack
END

出0入0汤圆

发表于 2011-4-7 21:32:55 | 显示全部楼层
.8259模型需要改一下[加几个字符]才能用于仿真

我以前仿真的时候没成 很郁闷  楼主能告诉我修改的哪几个字符啊 谢谢

出0入0汤圆

 楼主| 发表于 2011-4-8 11:22:19 | 显示全部楼层
回复【3楼】bdgog  
-----------------------------------------------------------------------

ourdev里有个帖子介绍的,你可以搜一下

出0入0汤圆

发表于 2011-4-11 14:00:08 | 显示全部楼层
多谢 我试试

出0入0汤圆

发表于 2011-5-4 15:38:30 | 显示全部楼层
正好需要

出0入0汤圆

发表于 2011-9-9 21:15:55 | 显示全部楼层
很好很强大~~~~

出0入0汤圆

发表于 2011-11-16 12:08:56 | 显示全部楼层
有没有完成啊。
我也是遇到类似问题。

出0入0汤圆

发表于 2012-10-4 20:15:02 | 显示全部楼层
挖个坟。遇到同样问题。
即PROTEUS中8259在第二个INTA时虽然送出正确的INT VECTOR,而且8086也能正确地识别到,但8086依然会调用一个错误的INT中断号,而这个错误的中断号等于总线上一次传输的数据值
硬件上,这个BUG应该是无解了
绕开个问题的方法有一种,即在中断处理程序中,用人工地读取8259当前ISR来获得正确的中断VECTOR:
1。先将整个中断向量表(0-255号中断)全部填成一个中断处理接口过程地址
2。在这个接口过程中,道德对OCW3发出0FH的读取ISR命令,然后读取,得到当前正确的中断向量
3。将中断向量转换成对应的真正中断处理过程地址(我用了查表法)
4。调用真正的中断处理过程进行中断处理
5。返回中断接口过程后,进行8259 EOI等清ISR操作,IRET结束中断处理。

参考附件代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 04:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表