5. 中断服务: 14H 串行 I/O 服务(通信端口)
5.1 服务号:0 初始化串口参数
初始化串行端口的波特率、奇偶校验、停止位和字长参数,并返回端口的状态。
- 输入:
- AH = 00h
- AL = 通讯参数
- DX = 串行端口号(0 - COM1、1 - COM2 等)
- 输出:
- AX = 线路和调制解调器状态(参见状态 03h)
波特率 奇偶校验 停止位 字长
位: 7 6 5 4 3 2 1 0
0 0 0 110 0 0 None 0 One 1 0 7 bits
0 0 1 150 0 1 Odd 1 Two 1 1 8 bits
0 1 0 300 1 0 None
0 1 1 600 1 1 Even
1 0 0 1,200
1 0 1 2,400
1 1 0 4,800
1 1 1 9,600
5.2 服务号:1 发送一个字符
将一个字符发送到指定的串行端口。
- 输入:
- AH = 01h
- AL = 字符
- DX = 串行端口号(0 - COM1、1 - COM2 等)
- 输出:
- AH = 线路状态(见状态 03h)
如果发生错误,将设置AH的第7位。 由于位7用作一般错误标志,因此该服务无法识别超时错误。 有关完整的诊断信息,请使用服务03h(获取串行端口状态)。
5.3 服务号:2 接收一个字符
从指定的串口接收一个字符。
- 输入:
- AH = 02h
- DX = 串行端口号(0 - COM1、1 - COM2 等)
- 输出:
- AL = 字符
- AH = 线路状态(见状态 03h)
该服务等待一个字符。 如果没有可用字符或发生错误,则不返回任何字符并设置AH的第7位。
如果发生错误,将设置AH的第7位。 由于位7用作一般错误标志,因此该服务无法识别超时错误。 有关完整的诊断信息,请使用服务03h(获取串行端口状态)。
5.4 服务号:3 获取串口状态
返回指定串行端口的线路状态和调制解调器状态信息。
- 输入:
- AH = 03h
- DX = 串行端口号(0 - COM1、1 - COM2 等)
- 输出:
- AX = 线路和调制解调器状态(见下文)
状态信息返回给AX,如下
AH(线路状态)
7 6 5 4 3 2 1 0
1 . . . . . . . Time-out error
. 1 . . . . . . Transfer shift register empty
. . 1 . . . . . Transfer holding register empty
. . . 1 . . . . Break-detect error
. . . . 1 . . . Framing error
. . . . . 1 . . Parity error
. . . . . . 1 . Overrun error
. . . . . . . 1 Data ready
AL(调制解调器状态)
7 6 5 4 3 2 1 0
1 . . . . . . . Received line signal detect
. 1 . . . . . . Ring indicator
. . 1 . . . . . Data set ready
. . . 1 . . . . Clear to send
. . . . 1 . . . Change in receive line signal detected
. . . . . 1 . . Trailing edge ring detector
. . . . . . 1 . Change in data set ready
. . . . . . . 1 Change in clear to send
如果设置了线路状态字节 (AH) 的第 7 位,则 AH 和 AL 中的其余位不可预测。
用于原始 PC 的早期版本的 ROM-BIOS 有一个编程错误,会导致“超时”错误报告为“传输移位寄存器为空”和“中断检测”错误。 这已在所有其他版本的 ROM-BIOS 中得到纠正。
6. 中断服务: 15H 磁带和扩展服务
6.1 服务号:0 打开磁带马达(仅限 PC、PCjr)
- 输入:
- AH = 00h
- 输出:无
所有使用磁带的程序必须在使用前实际打开设备。 开机和设备就绪之间有明显的延迟。打开和关闭磁带时可以听到明显的咔哒声。
6.2 服务号:1 关闭磁带马达(仅限 PC、PCjr)
- 输入:
- AH = 01h
- 输出:无
所有使用磁带的程序都应在使用后关闭设备。 打开和关闭磁带时可以听到明显的咔哒声。
6.3 服务号:2 从磁带读取块(仅限 PC、PCjr)
- 输入:
- AH = 02h
- CX = 要读取的字节数
- ES:BX = 指向数据缓冲区的指针
- 输出:
- AH = CF = 1 时的错误代码
1 : CRC 错误
2 : 数据转换丢失(比特信号加扰)
3 : 在磁带上找不到数据 - DX = 实际读取的字节数
- AH = CF = 1 时的错误代码
数据以 256 字节块的形式传输,但实际上只存储了请求的字节数。
6.4 服务号:3 从磁带写入块(仅限 PC、PCjr)
- 输入:
- AH = 03h
- CX = 要写入的字节数
- ES:BX = 指向数据缓冲区的指针
- 输出:
- CX = 0
数据实际上以 256 字节块的形式写入。如果CX小于256,则填充该块。没有错误检测/纠正可用于写入。
6.5 服务号:64 读取/修改配置文件
读取或修改系统或调制解调器参数(仅限PC convertible)。
- 输入:
- AH = 40h
- AL = 子服务
子服务 | 描述 |
---|---|
0 | 在 CX、BX 中返回系统配置文件 |
1 | 修改系统配置文件(CX,BX = 配置文件信息) |
2 | 在 BX 中返回内部调制解调器配置文件 |
3 | 修改内部调制解调器配置文件(BX = 配置文件信息) |
- 输出:
- CF = 设置如果错误,否则清除
- AL = 如果成功则为 0,否则为非 0
- BX = 返回子服务 0 的系统配置文件和子服务 2 的调制解调器配置文件
- CX = 返回子服务 0 的系统配置文件
BX 中的系统配置文件信息
位 | 描述 |
---|---|
Bit 15 | 0 - 设置系统冷启动模式 1* - 设置系统热启动模式 |
Bit 14 | 0 - 禁用低电量警告消息 1* - 启用低电量警告消息 |
Bits 13,12 | 启动视频模式 00 - 预留 01 - 使用 CGA/LCD 的 40 x 25 单色 10* - 使用 CGA/LCD 的 80 x 25 单色 11 - 80 x 25 单色,使用 MONO/LCD |
Bits 11,10 | LCD亮度属性 00* - 忽略LCD亮度属性 01 - 映射LCD亮为下划线 10 - 将 LCD 亮度映射为反转视频 11 - 将 LCD 亮度映射为备用字体 |
Bit 9 | 0* - 使用电池供电的内部调制解调器不可用 1 - 内部调制解调器可用电池供电 |
Bit 8 | 0* - RS-232/Parallel 电池供电不可用 1 - RS-232/Parallel可用电池供电 |
Bits 7-0 (BL) | 预留 |
CX 中的系统配置文件信息
位 | 描述 |
---|---|
Bits 15-8 (CH) | LCD 因缺少键盘活动而出现空白之前的时间。 时间以分钟为单位。 0 禁用此功能。 |
Bits 7-0 (CL) | 因缺少键盘活动而关闭系统电源之前的时间。 时间以分钟为单位。 0 禁用此功能。 |
BX 中的调制解调器配置文件信息
位 | 描述 |
---|---|
Bits 15,14 | 预留 |
Bit 13 | 0* - 手动应答 1 - 自动应答 |
Bits 12-10 | 奇偶校验和帧 000 - Mark, 7-bit data 001 - Space, 7-bit data 010 - Odd, 7-bit data 011* - Even, 7-bit data 100 - None, 8-bit data 101 - 预留 110 - 预留 111 - 预留 |
Bits 9,8 | 调制解调器数据速率 00 - 每秒 110 位 01 - 每秒 300 位 10* - 每秒 1200 位 11 -- 每秒 2400 位 |
Bits 7-0 (BL) | 预留 |
- 断电后信号默认设置
6.6 服务号:65 等待外部事件
此服务在外部事件后等待指定的状态更改。 外部事件可以是中断或 DMA 控制器。 在等待特定状态时,系统时钟会停止以节省电池电量。 此服务仅适用于 PC convertible。
- 输入:
- AH = 41h
- AL = 事件类型代码
- BH = 条件比较或掩码值
- BL = 超时(以55毫秒为单位); 0 表示没有超时
- ES:DI = 指向用于事件确定的用户字节的指针(如果AL为 01h-04h)
- DX = 用于事件确定的I/O端口地址(如果AL为11h-14h)
- 输出:
- CF = 如果发生外部事件,则为0; 1如果超时
Event Type Code (AL)
AL | 描述 |
---|---|
00h | 发生任何事件后返回 |
01h | 比较值,如果相等则返回 |
02h | 比较值,不相等则返回 |
03h | 测试位; 如果非 0 则返回 |
04h | 测试位; 如果为 0,则返回 |
事件类型代码 11h-14h 与 01h-04h 相同,只是事件确定来自 DX 中的 I/O 端口地址,而不是 ES:DI 指定的用户字节。
如果事件类型是 01h-02h 或 11h-12h,则将指示事件确定的字节(使用 CMP 指令)与 BH 进行比较。 如果事件类型是 03h-04h 或 13h-14h,则针对 BH 测试(使用 TEST 指令)指示事件确定的字节。
此服务仅适用于 PC Convertible。
6.7 服务号:66 请求系统关机
系统断电。下次打开系统时,可以将控制权返回到此断电调用之后的指令。(仅限PC Convertible)
- 输入:
- AH = 42h
- AL = 事件类型代码
0 : 使用配置文件恢复模式状态
1 : 无论如何恢复模式
- 输出:
- CF = 设置如果错误否则清除
- AH = 修改的
如果此服务不可用,则立即返回控制权。 如果可用,则关闭电源。 下次打开系统时,如果事件类型代码 (AL) 为 1 或系统配置文件(参见服务 40h)设置了热启动模式,则机器将从上次停止的地方启动,执行生成此事件的程序 服务。
此服务仅适用于 PC Convertible。
在系统断电之前,软盘马达关闭。
6.8 服务号:67 读取系统状态
报告PC convertible的系统状态。
- 输入:
- AH = 43h
- 输出:
- CF = 设置如果错误否则清除
- AH = modified
- AL = 状态(见下文)
状态(AL)
7 6 5 4 3 2 1 0
1 . . . . . . . 低电量
. 1 . . . . . . 使用外部电源运行
. . 1 . . . . . 备用电源丢失
. . . 1 . . . . 实时时钟报警激活电源
. . . . 1 . . . 内部调制解调器开机
. . . . . 1 . . 串行/并行上电
. . . . . . 1 . 预留
. . . . . . . 1 LCD not attached
此服务仅适用于 PC Convertible。
如果备用电源丢失(第 5 位打开),则实时时钟时间将不正确。
参见 INT 1Ah,服务08h,了解如何使用实时时钟闹钟开机。
6.9 服务号:68 激活/停用调制解调器电源
激活或停用PC Convertible内置调制解调器。
- 输入:
- AH = 44h
- AL = 调制解调器电源状态
0 : 关闭内部调制解调器电源
1 : 打开内部调制解调器电源
- 输出:
- CF = 设置如果错误否则清除
- AL = 如果成功则为0,否则为非0
此服务仅适用于 PC Convertible。
如果打开内部调制解调器电源(AL = 01h),它将被初始化为调制解调器配置文件中的当前设置。 有关调制解调器配置文件的更多信息,请参阅服务40h。
6.10 服务号:79 键盘拦截
由键盘硬件处理程序(int 09h)调用,允许替换或删除键。
- 输入:
- AH = 4fh
- AL = 扫描码
- 输出:
- CF = 设置如果错误否则清除
- AL = 如果更改了就是新的扫描码,否则为原始扫描码
进入此服务后,AL 将包含击键的扫描代码。 如果用户希望更改扫描码,请将新的扫描码放入 AL 并设置进位标志。 如果要保持扫描码不变,则不理会 AL 并设置进位标志。 用户可以通过清除携带标志返回来删除或忽略击键。
此服务不适用于82年11月8日的PC、PCjr、XT和84年1月10日的AT。
通过为此服务编写处理程序,用户可以更改键的含义。 操作系统通常会返回未更改的扫描代码(即,它将不理会 AL 并返回设置了进位标志)。
要确定支持此功能的机器,请参阅Service C0h(返回系统配置)。
6.11 服务号:128 打开设备
提供一个接口来打开具有特定进程的设备。
- 输入:
- AH = 80h
- BX = 设备ID
- CX = 进程ID
- 输出:
- CF = 如果服务不支持设置,否则清除
日期为11/08/82的PC、PCjr 和 XT 不支持此服务。
此接口支持多任务环境,其中系统中可能正在执行多个进程(或任务)。 通常操作系统会为此服务提供处理程序; 这样,操作系统可以跟踪哪些进程正在使用系统上的每个设备。
操作系统将使用此服务来启动进程对设备的使用。
6.12 服务号:129 关闭设备
提供一个接口来关闭具有特定进程的设备。
- 输入:
- AH = 81h
- BX = 设备ID
- CX = 进程ID
- 输出:
- CF = 如果服务不支持设置,否则清除
日期为11/08/82 的PC、PCjr 和 XT 不支持此服务。
此接口支持多任务环境,其中系统中可能正在执行多个进程(或任务)。 通常操作系统会为此服务提供处理程序; 这样,操作系统可以跟踪哪些进程正在使用系统上的每个设备。
操作系统将使用此服务来启动进程对设备的使用。
6.12 服务号:130 Device Program Termination
Provides an interface to discontinue the use of a device by all processes currently using the device.
- 输入:
- AH = 82h
- BX = Device ID
- 输出:
- CF = set if service not supported else cleared
日期为11/08/82的PC、PCjr 和 XT 不支持此服务。
此接口支持多任务环境,其中系统中可能正在执行多个进程(或任务)。 通常操作系统会为此服务提供处理程序; 这样,操作系统可以跟踪哪个进程正在使用系统上的每个设备。
操作系统将使用此服务来停止当前使用设备的所有进程对设备的使用。
6.13 服务号:131 事件等待
在指定的时间间隔后修改用户内存中的一个字节。 调用此服务后,控制权立即转移给调用者。
- 输入:
- AH = 83h
- AL = 子服务
00h : 设置间隔
01h : 取消间隔设置
- 输出:
- CF = 如果服务不支持设置,否则清除
调用此服务后,控制权立即返回给调用者。 该服务不是通过延迟然后将控制权交还给用户的方式工作,而是立即将控制权交还给用户; 用户必须定期查看指定的字节(由 ES:BX 指向)以确定间隔何时结束。
日期为 11/08/82 的 PC、PCjr 和 XT 不支持此服务。 84 年 1 月 10 日的 AT 只能设置间隔; 因此不使用 AL 中的值。
通过设置高位(位 7)发送字节。 要测试间隔结束,请确保在调用子服务 0(设置间隔)之前清除字节的高位。
实时时钟用于计算微秒数。
时间的粒度为 976 微秒。
CX 是计数的高位字。 例如,如果CX是98h而DX是9680h,则将指定10秒延迟。
6.14 服务号:132 摇杆支持
读取当前游戏杆开关设置或报告当前游戏杆阻力输入。
- 输入:
- AH = 84h
- AL = 子服务
00h : 读取当前开关设置
01h : 读取阻力输入
- 输出:
- CF = 设置如果错误否则清除
- If DX = 00h (读取当前开关设置):
- AL = 位 7 到 4 包含开关设置
- If DX = 01h (读取阻力值):
- AX = A(x) value
- BX = A(y) value
- CX = B(x) value
- DX = B(y) value
此服务仅适用于 11/08/82 之后的 AT、XT 和 XT-286。
6.15 服务号:133 系统请求被按下
为 Sys Req 键的特殊处理提供一个接口。
- 输入:
- AH = 85h
- AL = 子服务
00h : 系统请求键 Make(按下)
01h : 系统请求键Break(释放)
- 输出:
- CF = 如果服务不支持设置,否则清除
默认情况下,该服务只清除进位标志。 由操作系统或用户提供处理 Sys Req 键的处理程序。 该服务由 INT 09h(键盘)在 Sys Req 键被按下(“made”)或释放(“broken”)后调用。
日期为 11/08/82 的 PC、PCjr 和 XT 不支持此服务。
目前系统请求键没有标准用途。 未来的操作系统可能会使用它在任务之间切换。
6.16 服务号:134 等待
在将控制权返回给调用者之前等待指定的微秒数。
- 输入:
- AH = 86h
- CX:DX = 要经过的微秒数
- 输出:
- CF = 如果错误或正在等待则设置,否则清除
此服务不适用于 PC、PCjr 和 XT。
实时时钟用于计算微秒数。
时间的粒度为 976 微秒。
CX 是计数的高位字。 例如,如果 CX 为 98h,DX 为 9680h,则将指定 10 秒延迟。
6.17 服务号:135 移动数据块
为实模式程序提供在保护模式下将数据块移入或移出 1 兆字节以上区域的能力。
- 输入:
- AH = 87h
- CX = 要移动的块大小(最大 8000h = 32k)
- ES:SI = 指向全局描述表 (GDT) 的指针(见下文)
- 输出:
- CF = 如果错误则设置,否则清除
- ZF = 如果错误则清除否则设置
- AH = 操作状态码
00h : 成功
01h : 内存奇偶校验错误
02h : 发生异常中断错误
03h : 获取地址行 20h 失败
此服务仅适用于 AT 和 XT-286。
ES:SI 指向 6 个描述符的列表。 每个描述符长 8 个字节。 描述符的格式如下:
偏移 | 字节 | 描述 |
---|---|---|
00h | 2 | 包含段限制的字 |
02h | 2 | 24 位地址的低位字 |
04h | 1 | 24位地址的高字节 |
05h | 1 | 访问权限字节 |
06h | 2 | 保留(必须为 0) |
ES:SI 指向的全局描述符表 (GDT) 由 6 个描述符的列表组成。 描述符定义如下,按照它们在内存中出现的顺序出现。
偏移 | 字节 | 描述 |
---|---|---|
00h | 8 | 虚拟描述符。 由用户初始化为 0。 |
08h | 8 | 此 GDT 的描述符。 由用户初始化为 0。由 BIOS 修改。 |
10h | 8 | 源块的描述符。 由用户初始化。 |
18h | 8 | 目标块的描述符。 由用户初始化。 |
20h | 8 | 保护模式代码段的描述符。由用户初始化为 0。由 BIOS 修改。 |
28h | 8 | 保护模式堆栈段的描述符。 由用户初始化为 0。由 BIOS 修改。 |
因此,对于要执行的块移动,只有第三和第四个描述符需要包含除 0 以外的值。 源和目标描述符字段应按如下方式初始化:
段限制字段(偏移量 00h)必须包含 2 * (CX - 1) 或更大。
24 位地址字段(偏移量 02h)必须包含源地址或目标地址。
访问权限字节(偏移量 05h)必须包含 93h(CPL0-R/W)。
大数据块的传输可能会导致中断丢失,因为在移动过程中不允许中断。
6.18 服务号:136 获取扩展内存大小
报告超过 1024k 的内存量。
- 输入:
- AH = 88h
- 输出:
- CF = 如果错误则设置,否则清除
- AX = 1024k 以上的 1k 块数
此服务仅适用于 AT 和 XT-286。
此服务返回的内存量存储在 CMOS 电池中。 它是在上电时确定和设置的。
要使 1024K 以上的内存可用,平面内存(系统板上的内存)必须完全填充。 高于 1024K 范围的内存通常称为“扩展”内存。
6.19 服务号:137 切换到保护模式
切换到受保护(虚拟地址)模式。 还将控制权转移到用户指定的保护模式下的代码段。
- 输入:
- AH = 89h
- BH = 中断描述符表 (IDT) 索引,说明前 8 个硬件中断的开始(中断级别 1)
- BL = 中断描述符表 (IDT) 索引,说明前 8 个硬件中断的开始(中断级别 2)
- ES:SI = 指向全局描述符表 (GDT) 的指针(见下文)
- 输出:
- AH = 如果成功0,否则非0
- 影响寄存器: AX, BP, 所有段寄存器
此服务仅适用于 AT 和 XT-286。
ES:SI 指向八个描述符的列表。 每个描述符长 8 个字节。 描述符的格式如下:
偏移 | 字节 | 描述 |
---|---|---|
00h | 2 | 包含段限制的字 |
02h | 2 | 24 位地址的低位字 |
04h | 1 | 24位地址的高字节 |
05h | 1 | 访问权限字节 |
06h | 2 | 保留(必须为 0) |
ES:SI 指向的全局描述符表 (GDT) 由 6 个描述符的列表组成。 描述符定义如下,按照它们在内存中出现的顺序出现。
偏移 | 字节 | 描述 |
---|---|---|
00h | 8 | 虚拟描述符。 由用户初始化为 0。 |
08h | 8 | 此 GDT 的描述符。 由用户初始化为 0。由 BIOS 修改。 |
10h | 8 | 源块的描述符。 由用户初始化。 |
18h | 8 | 目标块的描述符。 由用户初始化。 |
20h | 8 | 保护模式代码段的描述符。 由用户初始化为 0。由 BIOS 修改。 |
28h | 8 | 保护模式堆栈段的描述符。 由用户初始化为 0。由 BIOS 修改。 |
必须由用户初始化的六个描述符必须初始化段限制、基地址和访问权限字节字段。
BIOS 对用户不可用; 因此用户必须执行所有 I/O。
用户必须初始化异常处理程序和表。
中断描述符表 (IDT) 和实模式 BIOS 中断描述符表 (IDT) 之间不能有任何重叠。
由于 80286 的保留区域,用户必须移动中断向量位置。
为了定义那些在 80286 保留区域中不存在的位置,需要重新初始化硬件中断控制器。
6.20 服务号:138 设备忙碌
调用此服务以通知系统设备正在等待服务。
- 输入:
- AH = 90h
- AL = 设备类型(见下文)
- 输出:
- CF = 0 如果等待不满足; 1 如果满足最短等待时间
此服务不适用于 82 年 11 月 8 日的 PC、PCjr 和 XT。
设备类型分为三个广义组。 这些组是:
00h - 7Fh | 串行可重复使用的设备。 |
80h - BFh | 可重入设备。 ES:BX 用于区分调用。 |
C0h - FFh | 仅超时且未发布的设备。 |
下面列出了定义的设备类型:
设备类型 (AL) | 设备 | 超时 |
---|---|---|
00h | 硬盘 | 是 |
01h | 软盘 | 是 |
02h | 键盘 | 否 |
03h | 指点设备 | 是 |
80h | 网络(ES:BX,指向网络控制块的指针) | 否 |
fdh | 软盘驱动马达启动 | 是 |
feh | 打印机 | 是 |
当进程需要设备,但对其的访问延迟时,系统可以执行另一项任务以实现最大性能,直到该设备被释放以供进程使用。 在多任务环境中,这就是此服务的目的。 操作系统可以跟踪哪个进程正在等待哪个设备,并在设备忙时执行另一个任务。 请参阅服务 91h,了解指示设备已准备好进行进程的服务。
6.21 服务号:192 返回系统配置
报告机器型号、子型号、BIOS 修订级别和其他特定于硬件的属性。
- 输入:
- AH = c0h
- 输出:
- CF = 如果错误则设置,否则清除
- AH = 0
- ES:BX = 指向系统描述符表的指针
此服务不适用于 82 年 11 月 8 日的 PC、PCjr、XT 和 84 年 1 月 10 日的 AT。 使用 AH 的返回状态来确定服务是否正在返回有效信息。
系统描述符表
描述 | 长度 (字节) | 值 |
---|---|---|
表长度 | 1 | 8 |
系统型号 | 1 | ? |
子型号 | 1 | ? |
BIOS 修订级别 | 1 | ? |
功能信息 | 1 | ? |
预留 | 4 | 0 |
功能信息
7 6 5 4 3 2 1 0
x . . . . . . . 硬盘BIOS使用DMA通道3
. x . . . . . . 存在第二个中断芯片
. . x . . . . . 存在实时时钟
. . . x . . . . 在 INT 09h 中调用的键盘拦截
. . . . x . . . 等待支持的外部事件
. . . . . x . . 预留
. . . . . . x . 预留
. . . . . . . x 预留
日期为86年1月10日的 XT 在其功能信息中存在错误。 它错误地指出存在第二个中断芯片(第6位已设置)并且硬盘BIOS不使用DMA通道3(第7位已清除)。这两个都是不正确的。为了测试这种情况,如果型号为FBh且 BIOS 级别为1,则假设硬盘BIOS确实使用DMA通道3,并且不存在第二个中断芯片。
使用 DMA 通道 3 存在的程序还必须知道其他适配器可能正在使用此通道,例如 IBM 网络适配器,这不会反映在功能信息字节中。
有关键盘拦截(功能信息字节的第 4 位)的更多信息,请参见 INT 15h、服务 4Fh,有关硬件键盘中断的更多信息,请参见 INT 09h。
有关等待外部事件(功能信息字节的第3位)的更多信息,请参见INT 15h、服务 41h。
网友评论