2008-02-14

[舊文]懷念的 8088 (3) 8288

8288 bus controller
在網路上可以找到 data sheet.
S0, S1, S2 -> status decoder
CLK, AEN, CEN, IOB -> control logic
MRDC, MWTC, AMWC, IORC, IOWC, AIOWC, INTA -> command signal generator
DT/R DEN MCE/PDEN ALE -> control signal generator
ALE = address latch enable
DEN = data enable
DT/R=1 表從CPU寫入記憶體;0 表從記憶體讀到CPU
AEN = address enable 延遲指令控制訊號
CEN = 1 叫 8288 把控制訊號丟上匯流排
IOB = 1 表 I/O bus mode; IOB = 0 表 system bus mode
AIOWC = advanced I/O write command 通知週邊要準備寫入
IOWC 通知週邊要寫入

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)

2008-02-04

懷念的 8088 (1)

超級令人懷念的 8088 架構重出現! 看了《IBM PC/XT BIOS 剖析》後,才知道事情都有歷史因素的...首先是懷念的主機板 (p.15)

8088 用的是 14.31818MHz 的石英振盪晶體,除3後 4.77MHz 給 CPU (CLK),除4後 3.58MHz 給顯示卡。8088 有4個DMA, 3個 16-bit timer counter (TC), 8個INT, 一個 NMI. 其中 DMA#4 要拿來給記憶體充電,充電時 address bus 不能用,所以 CPU 要等記憶體 refresh.

TC Channel 0: 系統時間
TC Channel 1: 和 DMA#4 一起幫 RAM 充電
TC Channel 2: speaker 用的

系統硬體架構圖 (p.20)先是 8284 (p.21) 做 OSC,然後輸出 CLK (4.77MHz), PCLK (2.38MHz), 再加一組 RES (reset) 和 RDY (ready). 開機時做 CPU Reset 原來 8088 就有了,那是為了避免剛開電的時候訊號不穩定,8284 等 pulse 穩定後,會送 RES 給 CPU. RDY 是給週邊設備用的,它可以叫 CPU 等一下下...

8087 有 8 個 80-bit 暫存器,可以透過 QS0, QS1 和 8088 一起抓指令。8088 抓到 8087 的指令後丟掉不管,8087 會撿起來執行。在計算的時候,BUSY 拉起來,8088 就知道要等結果。它們用同一個 CLK. 8087 用 RQ/GT0 告訴 8088 它想用 bus. 這本書講了一堆 8087 運作方式和指令集,先跳過。

古老的時代,PIC 用的是 8259A. 如果在觸發 INT 的時候剛好 stack overflow 會怎樣?