alexbird 发表于 2012-9-28 11:19:20

proteus仿真8086 8259,奇地址IO读写问题解决不了

请教各位,proteus仿真8086 8259中断系统,8259的D0-7应该怎么接。
我遇到的问题是:
1。如果接8086的AD0-7,则在8259初始化写入OCW2(OUT 21h, AL)时,因此时A0=1,BHE=0,则8086的奇偶地址控制起作用,8086是将数据送上AD8-15总线,导致8259从AD0-7收不到数据,实际写入OCW2为0。

2。我改了一下,将AD0-7和AD8-15根据BHE信号做了选通,当A0=1,BHE=0时,8259接上AD8-15。但问题来了,当中断触发,8086进入INTA2阶段,要从AD0-7读入8259送出的中断类型码时,因前面选通器的作用,8259的数据实际是送上了AD8-15,导致8086的AD0-7为0,即读入的中断类型码为0。

这两个问题似乎是无解的矛盾,OCW2就是一个BYTE奇地址,8086要写入它必然是从AD8-15送数据;但回头读中断类型码时,又要从AD0-7走。

请问应该怎么做?

alexbird 发表于 2012-9-28 11:24:14

自己结贴:用点小技巧,将8259的地址均设为偶地址(设好CS选通逻辑),8259的A0实际是接8086的A1等其它地址线,避免奇地址访问。

是从这篇贴子的贴图和程序中找到答案的:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5196710&highlight=8259

XA144F 发表于 2012-9-28 11:25:22

换成8088芯片试验吧,8086的16位总线有点麻烦呢。

alexbird 发表于 2012-9-28 16:10:24

PROTEUS里没有8088仿真。。。

又遇到一个新问题:
中断源接8259的IR1,ICW2中断向量设置为80H起。所以IR1的中断向量应该为81H。

仿真中,看8086的日志,它能够从AD0-7读到正确的向量81H,但是却显示触发中断01H,调用的中断向量地址也是01H的(从地址0004-0007H中取中断服务地址)。
而且不管我将中断源换成IRx,都是一样能够正确地读到向量,但却总是调用01H的中断服务地址。

NND!

yxw_bob 发表于 2012-9-28 17:01:01

8086对于8位的外设只能采用偶地址寻址,所以8259的地址均设为偶地址(设好CS选通逻辑),8259的A0实际是接8086的A1等其它地址线,避免奇地址访问。
8088对于8位的外设可采用奇/偶地址寻址.

alexbird 发表于 2012-9-28 21:42:16

yxw_bob 发表于 2012-9-28 17:01 static/image/common/back.gif
8086对于8位的外设只能采用偶地址寻址,所以8259的地址均设为偶地址(设好CS选通逻辑),8259的A0实际是接80 ...

确实如你所说。

现在碰到的问题是,8259在第二个INTA周期时,明明已经将正确的微量号送上D0-7,8086也正确捕捉了,但8086却总是以一个错误的向量来进行中断调用。这个错误向量证实是总线上一次传送的数据。

比如上一次总线送过 OUT DX, AL(20h),则下一次中断时8086总是调用INT 20h中断。在LOG里看到8086是先FIRED一个错误向量,然后再报告得到正确的向量。如我的截图。

搜了半天有个可怜的家伙也碰到同样问题
http://www.edaboard.com/thread253124.html

尚无解啊。。。

alexbird 发表于 2012-9-28 21:58:13

似乎找到解法,明天试试
http://bbs.elecfans.com/jishu_206341_1_1.html

alexbird 发表于 2012-10-4 20:13:17

alexbird 发表于 2012-9-28 21:58 static/image/common/back.gif
似乎找到解法,明天试试
http://bbs.elecfans.com/jishu_206341_1_1.html

硬件上,这个BUG应该是无解了(即PROTEUS中8259在第二个INTA时虽然送出正确的INT VECTOR,而且8086也能正确地识别到,但8086依然会调用一个错误的INT中断号,而这个错误的中断号等于总线上一次传输的数据值)

绕开个问题的方法有一种,即在中断处理程序中,用人工地读取8259当前ISR来获得正确的中断VECTOR:
1。先将整个中断向量表(0-255号中断)全部填成一个中断处理接口过程地址
2。在这个接口过程中,道德对OCW3发出0FH的读取ISR命令,然后读取,得到当前正确的中断向量
3。将中断向量转换成对应的真正中断处理过程地址(我用了查表法)
4。调用真正的中断处理过程进行中断处理
5。返回中断接口过程后,进行8259 EOI等清ISR操作,IRET结束中断处理。

参考附件代码

页: [1]
查看完整版本: proteus仿真8086 8259,奇地址IO读写问题解决不了