2008-02-08

懷念的 8088 (2) 8259A & INT

8259A 包括... (方塊圖和 spec 見此)
Interrupt Request Reg (IRR)
Priority Resolver
In service reg (ISR)
Interrupt mask reg (IMR)
Control logic
Data bus buffer
R/W Logic
Cascade buffer / Comparator

比較值得注意的是,CS = 0 表示將 8259A enable, WR = 0 表示要寫入。
A0 要怎麼和 CS/WR/RD 配合,來存取 IRR,ISR,IMR,ICW1-4,OCW1-3 呢?
A0=0, D4=1 表寫入 ICW1
A0=1, 表寫入 ICW2-4, OCW1 (依序寫入)
A0=0, D4=0, D3=0 表寫入 OCW2
A0=0, D4=0, D3=1 表寫入 OCW3

初始完後,A0=1 就直接寫入 OCW1. (A0=1 要從 port $+1 送出).

Master 8259A ICW3 S0-S7 表示有幾個 Slave.
Slave 8259A ICW3 ID0-ID2 表示接在 Master 的 IRx
OCW1 的 D0-D7 代表 IMR.
OCW2 控制 rotate on non-specific EOI, specific EOI, in AEOI, 設定優先權
OCW3 控制讀取 ISR/IRR. Special Mask mode.

插斷流程(pp.96-7)
1. IR0 - IR7 = 1 時,IRR 拉高
2. PR 決定誰先,送 INT 給 CPU
3. CPU 如果 STI, 送 INTA 給 8259A
4. 收到 INTA 後 ISR 拉高,IRR 重設
5. CPU 再送 INTA, 8259A 收到後把 INT 號碼告訴 CPU, 以查詢中斷向量表
6. 如果在 AEOI, 8259A 把 ISR 重設,不然等到中斷服務程式 EOI 才重設。

平常用的中斷都不會忘記,可是千萬別忘了這幾個更重要的:
INT 0 Divide by zero :: 8088和286以上作用不同
INT 1 Single step (TF=1) :: 386以上有新的意義
INT 2 NMI
INT 3 Breakpoint (指令 CCh)
INT 4 Overflow (OF=1, INTO)
INT 5 PrtScr / Bound error
INT 6 Illegal instruction
INT 7 No FPU
INT A lllegal TSS (>=286)

沒有留言: