[轉] Ch 28 輸出入埠 (1) CMOS

出處:http://home.educities.edu.tw/wanker742126/asm/ch28.html

在往後的一、兩章裏,小木偶想談談輸出入埠,所謂輸出入埠,就是英文的 Input/Output prot,簡稱為「I/O port」,他是電腦與周邊設備溝通的管道。
在 IBM PC 相容電腦裏,所有的周邊設備都是藉著輸出入埠和 CPU 相連,IBM PC 共有 65536 個輸出入埠,由編號 0000H 到 0FFFFH,其編排方式有點像一個區段的記憶體,但要寫入或讀取卻完全不同,有些輸出入埠只能讀不能寫,有些只能寫不能讀,有些可寫可讀,都跟和那一種周邊設備有關。每一種周邊設備使用數個輸出入埠與 CPU 相連,當然 PC 提供了六萬多個輸出入埠,而周邊設備不可能有這麼多,所以有許多輸出入埠是空下來的,並沒有使用。例如下表就是 PC/XT 常用的周邊裝置與相對應的輸出入埠。( PC/AT 與 PC/XT 的 I/O 埠稍微不同 )
PC/XT
I/O埠
周邊裝置描 述
00~0F8237A-5 DMA 控制晶片8237A-5 是用來加速記憶體和周邊裝置 ( 如硬碟 ) 之間的資料傳送 ( 註一 )
20~218259A 中斷控制器負責管理中斷及中斷請求 ( IRQ )
40~438253-5 計時器內含三個計時器,見下一章
60~638255A-5 PPI8255A 是一種可程式周邊界面晶片 ( Programmable Peripheral Interface,即 PPI ),通常鍵盤與喇叭接在這個晶片上。意即可經由程式控制鍵盤與喇叭。
200~20FJOYSTICK一般用來接搖桿,玩電玩用
278~27F第二個平行埠即 PARALLEL 2 或 LPT 2,一般用來接 KEY PRO
2F8~2FF第二非同步埠即 COM 2 或第二個 RS-232,一般用來接數據機或滑鼠
378~37F第一個平行埠即 PARALLEL 1 或 LPT 1,一般用來接印表機
3F8~3FF第一非同步埠即 COM 1 或第一個 RS-232,一般用來接數據機或滑鼠
回想以前,還未有 PnP 的時代裏,假如您想自己組裝電腦的話,一定要知道該周邊設備所使用的輸出入埠編,或者有些周邊裝置可以自行調整輸出入埠,使得所有的周邊裝置都有獨一無二的輸出入埠,這樣插入擴充槽後才能正常使用。假如有任何兩個周邊裝置使用相同的輸出入埠,或者有部份重疊,那麼下場只有兩種,不是不能開機,就是不能正常運作。
回歸正傳,寫程式時如果要在螢幕上顯示某一個字元,由印表機印出一份文件,甚至由鍵盤輸入一個字……時,我們怎麼做?大多數的人都是藉由 INT 中斷服務程式來替我們完成,但實際上這些中斷程式是藉由輸出入埠和周邊設備 ( 顯示器、印表機、鍵盤…… ) 溝通。這些都是因為 DOS 或 Win 9x 都已經寫好這些服務程式,我們只需拿來用就好了,假如我們有足夠的資料,我們也能自行控制這些輸出入埠,達到上述目的。
當我們改變某個輸出入埠內的資料,其實就是送某個資料到相對應的周邊設備去,而周邊設備就能依照我們的要求做動作,例如在螢幕上印出一個字。相反的假如要讀取某個周邊設備的狀態,也是利用輸出入埠把其內的資料傳回來。80X86 CPU 提供底下兩個指令用來溝通輸出入埠的。

OUT 指令

語法是:
out     dx,al
out     輸出入埠編號,al
out     dx,ax
out     輸出入埠編號,ax
OUT 指令是把一個位元組或一個字組長度的資料送到輸出入埠,所送出的資料放在 AL 或 AX 暫存器。送出到那一個輸出入埠則由 DX 暫存器指定,或者也可以直接用輸出入埠編號指定。

IN 指令

語法是:
in      al,dx
in      al,輸出入埠編號
in      ax,dx
in      ax,輸出入埠編號
IN 指令和 OUT 指令恰好相反,是把輸出入埠的資料傳回 AL 或 AX 暫存器中。輸出入埠編號可以直接寫出來也可以放在 DX 暫存器中。
電腦的周邊設備很多,而每一種周邊設備的輸出入埠操作方法不同,而且有時候不當的數值會使周邊設備不正常運作,甚至當機,加上現在電腦產品的技術資料幾乎無法取得,因此輸出入埠的使用常蒙上一層神祕的陰影,小木偶就將手邊現有的資料與大家分享。( 小木偶參考民國 83 年 4 月份第三波雜誌林錦瑞先生的文章 (第 16 頁 )、 CMOS Registers 以及 Marc Feeley 的網頁。)

CMOS

CMOS 資料

CMOS ( complementary metal oxide semiconductor 的簡寫,是指互補金金氧化物半導體 ) 是一種耗電很低的記憶體,它是用來儲存電腦中的基本設備,例如硬碟數目及形式、軟碟數目及形式、記憶體大小、顯示器等等,還有像計時這種隨時改變的資料。CMOS 是靠電腦內的電池供應電流,所以即使電腦的電源關掉,其內的資料也不會流失,但是如果電池沒電,CMOS 的資料就後不正確,必須重設,幸好 CMOS 使用的電池是可充電的鋰電池,只要您常使用電腦,就能在使用時同時充電,所以不必擔心這種問題。
IBM PC/XT 等級的電腦是沒有 CMOS,到了 IBM PC/AT 電腦才配備了 CMOS,採用的是 MC146818A 晶片,可存放有 64 位元組的資料。而 386 機種通常是把它整合到其他晶片中 ( 例如 82C206 晶片 ),容量也擴充到 128 到 256 位元組。
CMOS 的資料看得見嗎?這是當然的,在電腦一開機時,會出現像底下的畫面,就是依據 CMOS 內的資料顯示於螢幕上的。
除了在開機時能看到外,您也可以在開機時尚未進入作業系統前,進入 BIOS 設定程式,也可以看到記錄於 CMOS 內的內容。在這一節裏,小木偶將要以自己製作的程式來讀取 CMOS,當然也可寫入 ( 設定 BIOS 時,其實就是修改 CMOS 的內容 ),但是這是很危險的,因為設定值不對很容易造成當機。
要寫程式顯示 CMOS 的資料,要先了解其內容。小木偶只找到前 64 個位元組的資料,如下表:
偏移位址意義
00H~0DH即時時鐘 ( realtime clock )
0EH診斷狀態 ( diagnostic status )
0FH開機狀態 ( reat code )
10H軟碟機型式 ( diskette type )
11H保留
12H硬碟機型式 ( harddisk type )
13H保留
14H設備狀態 ( equipment status )
15H~16H傳統記憶體大小 ( base memory )
17H~18H延伸記憶體大小 ( extended memory )
19H第一台硬碟型態 ( first HD type )
1AH第二台硬碟型態 ( second HD type )
1BH~2DH保留
2EH~2FH記憶體之查核值 ( check sum )
30H~31H延伸記憶體大小 ( extended memory )
32H世紀數 ( BCD 格式 )
33H啟動旗標
34H~3FH保留

用 OUT/IN 指令寫入或讀取 CMOS

電腦是以 70H 與 71H 兩個輸出入埠與 CMOS 溝通,當要讀取 CMOS 的某個位址時,先把該位址填入埠 70H,然後再由埠 71H 讀取該位址之資料。舉例來說,要讀取『世紀數』,可以用下面程式:
        mov     al,32h
        out     70h,al
        in      al,71h
這樣,CMOS 的位址 32H 的數值就在 AL 暫存器裏。同理,要改寫世紀數,也是要把 CMOS 的位址填入埠 70H,再把要改寫的世紀值輸出到埠 71H,如下面程式
        mov     al,32h
        out     70h,al
        mov     al,20h
        out     71h,al

CMOS 內的一些欄位說明

小木偶就自己所收集到的資料,說明在 CMOS 內的資料意義。
位址 00H ~ 0DH 表示即時時鐘,其內容請看下表:
位址意義位址意義
00H07H
01H08H
02H09H
03H0AH
04H小時0BH
05H0CH
06H星期0DH
位址 0EH 表示診斷狀態,這個位元組各位元的意義是
位元意義
7電池狀態
6查核值狀態
5結構狀態
4記憶體大小記錄狀態
3硬碟狀態
2即時時鐘狀態
1保留
0保留
當位元值為一時,表示該項正常。例如位元七為一,表示電池正常,若為零,表示電力不足。
位址 10H 表示軟碟機型式,這個位元組被分成兩部份,較高的四個位元表示軟碟機 A: 的型式;較低的四個位元表示軟碟機 B: 的型式。雖然每個軟碟機被分配到四個位元組,共可以表示 16 種不同型式的軟碟機,但事實上,市面上所販賣的磁碟機只有五種而已,如下表:
BIT 值  軟碟機型式
--------------
0000    未裝置該軟碟機
0001    5.25 吋 360K 軟碟機
0010    5.25 吋 1.2M 軟碟機
0011    3.5 吋 720K 軟碟機
0100    3.5 吋 1.44M 軟碟機
0101    3.5 吋 2.88M 軟碟機
位址 12H 是表示硬碟機的型態,同軟碟機類似,此位元組也分成兩部分,較高的四個位元組是表示第一台硬碟型式,較低的四個位元組是表示第二台硬碟型式,如果為 0000 表示該硬碟不存在,不為零,表示該硬碟型式。因為每台硬碟被分到四個位元組,故可表示 16 種型式的硬碟,但是硬碟發展遠較軟碟快速,從最先 IBM XT 所配備的 20MB 硬碟,到現在 80G 的硬碟,故可知這十六種型式,根本不夠用,所以這四個位元如果是『1111』的話,表示要到位址 19H 或 1AH 去取得真正的硬碟型式。但後來大概是真的發展太快,又加上不再使用磁軌、磁區、磁面來表示硬碟型式,都改用 TYPE 46,由使用者定義,後來更進一步由 BIOS 自己偵測。
位址 14H 是表示設備狀態,位元 7、6 表示軟碟機數目。位元 5、4 表示顯示卡種類:
位元5 位元4  顯示卡
------------
  0    0     EGA/VGA
  0    1     40 行 CGA
  1    0     80 行 CGA
  1    1     MGA ( 單色卡 )
位元 2、3 保留。位元 1 表示是否有浮點運算器,1 表示有,0 表示沒有。位元 0 表示是否有磁碟機 A:,1 表示有,0 表示沒有。
位址 15、16 這兩個位元組表示傳統記憶體大小,單位是 1KB,即 1024 個位元組為單位。舉例來說,若位址 15、16 的內容分別是 80H、02H,表示有 280HKB,換成十進位即 640KB。
位址 17、18 這兩個位元組表示延伸記憶體大小,單位是 1KB。

未經允許不得轉載:GoMCU » [轉] Ch 28 輸出入埠 (1) CMOS