主题:中断调用,读写内存、端口应用讲解(2005-3-8)
qb45
[专家分:2880] 发布于 2005-03-23 11:50:00
http://qbdos.51.net/cgi-bin/bbs
是专门讨论QB实用技术的论坛
要在程序中调用中断必须要做到:
(1)启动QB时,要加上命令参数/L,才能将QB.QLB系统快速库装入集成环境;
例如在Dos下键入 QB/L
(2)在程序开始处写入调用包含文件的语句:'$INCLUDE:'QB.BI'。
中断后援的定义以及子程序的声明都写在系统头文件:QB.BI中。如果不想写这个语句,也可以只复制这个里面的相关内容就行!
Quick BASIC提供了中断调用的接口,来实现中断的调用。QB系统提供的快速库QB.QLB和QB.LIB就是为用户实现中断调用的。其中INTERRUPT 和 INTERRUPTX 是它们五个系统子程序中的两个,它们两个中断调用更方便,执行中断执行中断前后CPU的寄存器组用记录类型来处理。
INT86OLD,INT86XOLD,INTERRUPT,INTERRUPTX 可以调用中断
下面是与其有关的语句用法!
OUT P,D '功能I O通道的输出,P是端口地址,D是数据
INP (P) '功能I O通道的输入,P是端口地址
'注意:用端口输入输出的数据是字节,不是字!
POKE A,D '功能写内存,A是偏移量,D是数据
PEEK(A) '功能读内存
DEF SEG=A '功能设置段址,A是段址 范围在:0-&HFFFF
VARSEG(A$) '功能,返回A$的段址
SADD(A$) '功能,返回A$的偏移地址,相当于C语言中的字符指针,不过它只取地址!
如果你定义A是16个字符例如DIM A AS STRING*16
是不能用SADD语句来获得它的偏移地址,必须用VARPTR来获得
例如 :
DIM A AS STRING*16
PRINT "段址= " ;varseg(a)
PRINT "偏移= " ;varptr(a)
VARPTR还有个用处是获得数组的偏移地址
absolute (code%) '功能,执行机器码 Code%是机器码的起始地址
这个语句非常好,本来极大的提高程序的速度,如果要用QB做游戏或者是速度要求很高的场合,非此句莫属!这个得需要有汇编基础的人才能用的得心应手!在本论坛的也有这个方面的原程序!请自己找!
以上的语句在DOS功能调用的时候经常要用到!
我们在QB来调用INT21得到日期
我们先来看看有关的资料
INT 21号DOS中断调用:
入口 2AH AH=2AH 功能:取日期
返回 CX=年
DH=月
DL=日
有了上面这个资料,我门来取当前的系统日期
'$INCLUDE: 'qb.bi'
DIM reg AS RegType
reg.ax = &H2A00 '入口AH=2A
INTERRUPT &H21, reg, reg '调用21号DOS中断
PRINT reg.cx 'CX中是返回的日期
详细的中断调用例程见:
"读取硬盘主引导区的源程序"
“鼠标、汉字、按纽的原程序”
“文本模式下显示汉字的原程序”
教程中获得文件列表的那部分程序!
还有请自己找找
... .... ....
冷石作品中1024*768 256色显示的程序也有响应的中断调用的例子
用法举例
例1 :
out &H61,&HFF '此句可以让pc喇叭发声
PRINT INP(&H61) '此句是读取61H端口的数据
例2:
目的:把A$的内容改掉
A$="abcdefgh"
DEF SEG=VARSEG(A$)'把当前段定位到A$的段纸
off=sadd(a$) '获得A$的偏移
FOR I= 0 TO len(a$)
POKE off+I,49+i
NEXT I
DEF SEG '恢复段
运行后a$里的内容就被改成12345678了
例3:
DEF SEG=&hb800
FOR I= 1 TO 100
POKE I,49
NEXT I
DEF SEG
END
回复列表 (共3个回复)
沙发
qb45 [专家分:2880] 发布于 2004-01-12 22:48:00
详细调用举例(INT21中的文件功能)
我们找到DOS中断调用手册中有关的资料,然后在QB中来完成它!
入口 AH=1A 置数据传送地址 DS:DX=* 指向存储单元
入口 AH=4 E寻找第一个相符文件 DS:DX=* ASCIIZ字符串存储单元 (驱动器/路径/文件名)
CX=检索属性
入口 AH=4F下一个相符文件 (AH=4EH是第一次被调用)
我刚开始学QB的时候,是用SHELL “DIR >1.TXT”然后用程序分析1.TXT来判断显示文件列表,后来知道了QB可以用中断。我们再看看与这些有关功能调用的详细说明,当然看上面的资料就应该已经可以做出来了 !
功能4EH
功能描述: 获取第一个与给定的文件名相匹配的文件
入口参数: AH=4EH,DS:DX=给定文件名的字符串
CX=搜索时使用的文件属性: 位0=1——只读 位1=1——隐含
位2=1——系统 位3=1——卷标号
位4=1——目录 位5=1——归档
其它位保留不用,并置为0
出口参数: CF=1——操作失败,AX=错误号(02H、03H或12H),其含义见错误代码表,否则,操作成功,DTA(Disk Transfer Area)按下列方式填入数据: 字节00~14H 保留
字节15H 匹配的文件属性
字节16~17H 压缩的文件名
字节18~19H 压缩的文件日期
字节1A~1DH 文件大小
字节1E~2AH 文件名字符串
功能4FH
功能描述: 在中断21H的功能4EH成功使用之后,再搜索下一个文件名
入口参数: AH=4FH,AL=返回的代码
出口参数: CF=1——操作失败,AX=错误号(12H),其含义见错误代码表,否则,操作成功,DTA中的数据如前面功能4EH所示
根据这些资料,我们来做个文件列表,请看
TYPE RegTypeX
ax AS INTEGER
bx AS INTEGER
cx AS INTEGER
dx AS INTEGER
bp AS INTEGER
si AS INTEGER
di AS INTEGER
Flags AS INTEGER
ds AS INTEGER
es AS INTEGER
END TYPE
DIM SHARED ax, bx, cx, dx, si, di, Flags, ds, es, ah, al, bh, bl, ch, cl, dh, dl
CLS
file.list "*.*"
END
FUNCTION file.dta$ (dta$, fmode)
'从缓冲区中分离出文件名
endofstr% = INSTR(31, dta$, CHR$(0))
file.dta$ = MID$(dta$, 31, endofstr% - 31)
END FUNCTION
SUB file.list (Filename$)
FileNum = 0
dta$ = SPACE$(43)
dx = SADD(dta$)
ds = VARSEG(dta$)
ax = &H1A00 '设置文件数据块
Xint &H21
Filename$ = Filename$ + CHR$(0)
ax = &H4E00
dx = SADD(Filename$)
ds = VARSEG(Filename$)
cx = &HFF
Xint &H21 '查找第一个相符的文件
f = Flags AND 1
PRINT FileNum, file.dta$(dta$, 1)
DO WHILE f = 0 '如果找到第一个文件,就继续查找,直到结束
FileNum = FileNum + 1
PRINT FileNum, file.dta$(dta$, 1)
ax = &H4F00
Xint &H21
f = Flags AND 1
LOOP
END SUB
SUB Xint (IntNum%)
DIM Reg AS RegTypeX
IF ax = 0 THEN ax = ah * &H100 + al
IF bx = 0 THEN bx = bh * &H100 + bl
IF cx = 0 THEN cx = ch * &H100 + cl
IF dx = 0 THEN dx = dh * &H100 + dl
Reg.ax = ax
Reg.bx = bx
Reg.cx = cx
Reg.dx = dx
Reg.si = si
Reg.di = di
Reg.ds = ds
Reg.es = es
CALL INTERRUPTX(IntNum%, Reg, Reg)
ax = Reg.ax
bx = Reg.bx
cx = Reg.cx
dx = Reg.dx
si = Reg.si
di = Reg.di
ds = Reg.ds
es = Reg.es
Flags = Reg.Flags
ah = ax AND &HFF00: ah = ah / &H100
al = ax AND &HFF
bh = bx AND &HFF00: bh = bh / &H100
bl = bx AND &HFF
ch = cx AND &HFF00: ch = ch / &H100
cl = cx AND &HFF
dh = dx AND &HFF00: dh = dh / &H100
dl = dx AND &HFF
END SUB
板凳
qb45 [专家分:2880] 发布于 2004-07-28 17:55:00
我写了模板
这是一个INT21中断调用的BAS,大家可以很方便的写有关中断调用的程序了
启动QB的时候 别忘了用QB/L
比如资料上说,INT21号中断显示功能调用,入口AH=9 DS:DX=ASC字符串+$,可以在程序里这样用
buff$="Test Show ..."
buff$=buff$+"$" '以$结尾
BuffSeg=varseg(buff$) '得到字符的段址
Buffoff=sadd(buff$) '得到字符串的偏移地址
ah=&H9
ds=buffseg
dx=buffoff
Xint &h21
这样就可以显示了
varseg、sadd,是返回字符串段址偏移地址的 语句
下面就 是整个源程序!
代码:
TYPE RegTypeX
ax AS INTEGER
bx AS INTEGER
cx AS INTEGER
dx AS INTEGER
bp AS INTEGER
si AS INTEGER
di AS INTEGER
flags AS INTEGER
ds AS INTEGER
es AS INTEGER
END TYPE
DIM SHARED ax, bx, cx, dx, si, di, flags, ds, es, AH, AL, BH, BL, CH, CL, DH, dl
SUB Xint (intnum%)
DIM Reg AS RegTypeX
IF ax = 0 THEN ax = ah * &H100 + al
IF bx = 0 THEN bx = bh * &H100 + bl
IF cx = 0 THEN cx = ch * &H100 + cl
IF dx = 0 THEN dx = dh * &H100 + dl
Reg.ax = ax
Reg.bx = bx
Reg.cx = cx
Reg.dx = dx
Reg.si = si
Reg.di = di
Reg.ds = ds
Reg.es = es
CALL INTERRUPTX(IntNum%, Reg, Reg)
ax = Reg.ax
bx = Reg.bx
cx = Reg.cx
dx = Reg.dx
si = Reg.si
di = Reg.di
ds = Reg.ds
es = Reg.es
ah = ax AND &HFF00: ah = ah / &H100
al = ax AND &HFF
bh = bx AND &HFF00: bh = bh / &H100
bl = bx AND &HFF
ch = cx AND &HFF00: ch = ch / &H100
cl = cx AND &HFF
dh = dx AND &HFF00: dh = dh / &H100
dl = dx AND &HFF
END SUB
4 写内存语句的使用举例
我们先来看一个小例子
PRINT “*”
我想这个都懂吧!
可是如果不用PRINT语句能显示*么,当然能!
我们先学习一下计算机的有关知识!
显示器的显示属性定义
显示缓冲区地址
B800:0000—— 2000H字 彩色显示器文本模式的显示缓冲区。每个字中的低字节是字符的ASCII码,高字节是其属性( 背景属性 前景属性 )
我们就以彩色显示器文本模式的显示缓冲区为例子!
目的:往显示缓冲区写东西,看看屏幕上的结果
思路:先定义段到B800,然后写内存
如果我们要显示背景为兰色,前景为灰色的*,如下:
用QB提供的语句:
COLOR 7,1
PRINT “*”
自己调用写内存的语句:
DEF SEG=&HB800
POKE 0,42 '(42是字符*的ASC码)
POKE 1,&H17 '写字符的属性
DEF SEG '恢复段
3 楼
qb45 [专家分:2880] 发布于 2005-03-16 15:36:00
这是一些资料
DOS功能调用(转贴)很老的资料了,不过很多都还用德上
AH 功能 调用参数 返回参数
00 程序终止(同INT 20H) CS=程序段前缀
01 键盘输入并回显 AL=输入字符
02 显示输出 DL=输出字符
03 异步通迅输入 AL=输入数据
04 异步通迅输出 DL=输出数据
05 打印机输出 DL=输出字符
06 直接控制台I/O DL=FF(输入)DL=字符(输出) AL=输入字符
07 键盘输入(无回显) AL=输入字符
08 键盘输入(无回显)检测Ctrl-Break AL=输入字符
09 显示字符串 DS:DX=串地址'$'结束字符串
0A 键盘输入到缓冲区 DS:DX=缓冲区首地址(DS:DX)=缓冲区最大字符数 (DS:DX+1)=实际输入的字符数
0B 检验键盘状态 AL=00 有输入AL=FF 无输入
0C 清除输入缓冲区并请求指定的输入功能 AL=输入功能号(1,6,7,8,A)
0D 磁盘复位 清除文件缓冲区
0E 指定当前缺省的磁盘驱动器 DL=驱动器号 0=A,1=B,... AL=驱动器数
0F 打开文件 DS:DX=FCB首地址 AL=00 文件找到AL=FF 文件未找到
10 关闭文件 DS:DX=FCB首地址 AL=00 目录修改成功AL=FF 目录中未找到文件
11 查找第一个目录项 DS:DX=FCB首地址 AL=00 找到AL=FF 未找到
12 查找下一个目录项 DS:DX=FCB首地址(文件中带有*或?) AL=00 找到AL=FF 未找到
13 删除文件 DS:DX=FCB首地址 AL=00 删除成功AL=FF 未找到
14 顺序读 DS:DX=FCB首地址 AL=00 读成功 =01 文件结束,记录中无数据 =02 DTA空间不够 =03 文件结束,记录不完整
15 顺序写 DS:DX=FCB首地址 AL=00 写成功 =01 盘满 =02 DTA空间不够
16 建文件 DS:DX=FCB首地址 AL=00 建立成功 =FF 无磁盘空间
17 文件改名 DS:DX=FCB首地址(DS:DX+1)=旧文件名(DS:DX+17)=新文件名 AL=00 成功AL=FF 未成功
19 取当前缺省磁盘驱动器 AL=缺省的驱动器号 0=A,1=B,2=C,...
1A 置DTA地址 DS:DX=DTA地址
1B 取缺省驱动器FAT信息 AL=每簇的扇区数DS:BX=FAT标识字节CX=物理扇区大小DX=缺省驱动器的簇数
1C 取任一驱动器FAT信息 DL=驱动器号 同上
21 随机读 DS:DX=FCB首地址 AL=00 读成功 =01 文件结束 =02 缓冲区溢出 =03 缓冲区不满
22 随机写 DS:DX=FCB首地址 AL=00 写成功 =01 盘满 =02 缓冲区溢出
23 测定文件大小 DS:DX=FCB首地址 AL=00 成功(文件长度填入FCB)AL=FF 未找到
24 设置随机记录号 DS:DX=FCB首地址
25 设置中断向量 DS:DX=中断向量AL=中断类型号
26 建立程序段前缀 DX=新的程序段前缀
27 随机分块读 DS:DX=FCB首地址CX=记录数 AL=00 读成功 =01 文件结束 =02 缓冲区太小,传输结束 =03 缓冲区不满
28 随机分块写 DS:DX=FCB首地址CX=记录数 AL=00 写成功 =01 盘满 =02 缓冲区溢出
29 分析文件名 ES:DI=FCB首地址DS:SI=ASCIIZ串AL=控制分析标志 AL=00 标准文件 =01 多义文件 =02 非法盘符
2A 取日期 CX=年DH:DL=月:日(二进制)
2B 设置日期 CX:DH:DL=年:月:日 AL=00 成功 =FF 无效
2C 取时间 CH:CL=时:分DH:DL=秒:1/100秒
2D 设置时间 CH:CL=时:分DH:DL=秒:1/100秒 AL=00 成功 =FF 无效
2E 置磁盘自动读写标志 AL=00 关闭标志AL=01 打开标志
2F 取磁盘缓冲区的首址 ES:BX=缓冲区首址
30 取DOS版本号 AH=发行号,AL=版本
31 结束并驻留 AL=返回码DX=驻留区大小
33 Ctrl-Break检测 AL=00 取状态 =01 置状态(DL)DL=00 关闭检测 =01 打开检测 DL=00 关闭Ctrl-Break检测 =01 打开Ctrl-Break检测
35 取中断向量 AL=中断类型 ES:BX=中断向量
36 取空闲磁盘空间 DL=驱动器号 0=缺省,1=A,2=B,... 成功:AX=每簇扇区数 BX=有效簇数 CX=每扇区字节数 DX=总簇数失败:AX=FFFF
38 置/取国家信息 DS:DX=信息区首地址 BX=国家码(国际电话前缀码)AX=错误码
39 建立子目录(MKDIR) DS:DX=ASCIIZ串地址 AX=错误码
3A 删除子目录(RMDIR) DS:DX=ASCIIZ串地址 AX=错误码
3B 改变当前目录(CHDIR) DS:DX=ASCIIZ串地址 AX=错误码
3C 建立文件 DS:DX=ASCIIZ串地址CX=文件属性 成功:AX=文件代号错误:AX=错误码
3D 打开文件 DS:DX=ASCIIZ串地址AL=0 读 =1 写 =3 读/写 成功:AX=文件代号错误:AX=错误码
3E 关闭文件 BX=文件代号 失败:AX=错误码
3F 读文件或设备 DS:DX=数据缓冲区地址BX=文件代号CX=读取的字节数 读成功: AX=实际读入的字节数 AX=0 已到文件尾读出错:AX=错误码
40 写文件或设备 DS:DX=数据缓冲区地址BX=文件代号CX=写入的字节数 写成功: AX=实际写入的字节数写出错:AX=错误码
41 删除文件 DS:DX=ASCIIZ串地址 成功:AX=00出错:AX=错误码(2,5)
42 移动文件指针 BX=文件代号CX:DX=位移量AL=移动方式(0:从文件头绝对位移,1:从当前位置相对移动,2:从文件尾绝对位移) 成功:DX:AX=新文件指针位置出错:AX=错误码
43 置/取文件属性 DS:DX=ASCIIZ串地址AL=0 取文件属性AL=1 置文件属性CX=文件属性 成功:CX=文件属性失败:CX=错误码
44 设备文件I/O控制 BX=文件代号AL=0 取状态 =1 置状态DX =2 读数据 =3 写数据 =6 取输入状态 =7 取输出状态 DX=设备信息
45 复制文件代号 BX=文件代号1 成功:AX=文件代号2失败:AX=错误码
46 人工复制文件代号 BX=文件代号1CX=文件代号2 失败:AX=错误码
47 取当前目录路径名 DL=驱动器号DS:SI=ASCIIZ串地址 (DS:SI)=ASCIIZ串失败:AX=出错码
48 分配内存空间 BX=申请内存容量 成功:AX=分配内存首地失败:BX=最大可用内存
49 释放内容空间 ES=内存起始段地址 失败:AX=错误码
4A 调整已分配的存储块 ES=原内存起始地址BX=再申请的容量 失败:BX=最大可用空间 AX=错误码
4B 装配/执行程序 DS:DX=ASCIIZ串地址ES:BX=参数区首地址AL=0 装入执行AL=3 装入不执行 失败:AX=错误码
4C 带返回码结束 AL=返回码
4D 取返回代码 AX=返回代码
4E 查找第一个匹配文件 DS:DX=ASCIIZ串地址CX=属性 AX=出错代码(02,18)
4F 查找下一个匹配文件 DS:DX=ASCIIZ串地址(文件名中带有?或*) AX=出错代码(18)
54 取盘自动读写标志 AL=当前标志值
56 文件改名 DS:DX=ASCIIZ串(旧)ES:DI=ASCIIZ串(新) AX=出错码(03,05,17)
57 置/取文件日期和时间 BX=文件代号AL=0 读取AL=1 设置(DX:CX) DX:CX=日期和时间失败:AX=错误码
58 取/置分配策略码 AL=0 取码AL=1 置码(BX) 成功:AX=策略码失败:AX=错误码
59 取扩充错误码 AX=扩充错误码BH=错误类型BL=建议的操作CH=错误场所
5A 建立临时文件 CX=文件属性DS:DX=ASCIIZ串地址 成功:AX=文件代号失败:AX=错误码
5B 建立新文件 CX=文件属性DS:DX=ASCIIZ串地址 成功:AX=文件代号失败:AX=错误码
5C 控制文件存取 AL=00封锁 =01开启BX=文件代号CX:DX=文件位移SI:DI=文件长度 失败:AX=错误码
62 取程序段前缀 BX=PSP地址
I/O端口功能表
———————————————————————————
I/O地址 功能、用途
———————————————————————————
0 DMA通道0,内存地址寄存器(DMA控制器1(8237))
1 DMA通道0, 传输计数寄存器
2 DMA通道1,内存地址寄存器
3 DMA通道1, 传输计数寄存器
4 DMA通道2,内存地址寄存器
5 DMA通道2, 传输计数寄存器
6 DMA通道3,内存地址寄存器
7 DMA通道3, 传输计数寄存器
8 DMA通道0-3的状态寄存器
AH DMA通道0-3的屏蔽寄存器
BH DMA通道0-3的方式寄存器
CH DMA清除字节指针
DH DMA主清除字节
EH DMA通道0-3的清屏蔽寄存器
FH DMA通道0-3的写屏蔽寄存器
19H DMA起始寄存器
20H-3FH 可编程中断控制器1(8259)使用
40H 可编程中断计时器(8253)使用,读/写计数器0
41H 可编程中断计时器寄存器
42H 可编程中断计时器杂项寄存器
43H 可编程中断计时器,控制字寄存器
44H 可编程中断计时器,杂项寄存器(AT)
47H 可编程中断计时器,计数器0的控制字寄存器
48H-5FH 可编程中断计时器使用
60H-61H 键盘输入数据缓冲区
61H AT:8042键盘控制寄存器/XT:8255输出寄存器
62H 8255输入寄存器
63H 8255命令方式寄存器
64H 8042键盘输入缓冲区/8042状态
65H-6FH 8255/8042专用
70H CMOS RAM地址寄存器
71H CMOS RAM数据寄存器
80H 生产测试端口
81H DMA通道2,页表地址寄存器
82H DMA通道3,页表地址寄存器
83H DMA通道1,页表地址寄存器
87H DMA通道0,页表地址寄存器
89H DMA通道6,页表地址寄存器
8AH DMA通道7,页表地址寄存器
8BH DMA通道5,页表地址寄存器
8FH DMA通道4,页表地址寄存器
93H-9FH DMA控制器专用
A0H NM1屏蔽寄存器/可编程中断控制器2
A1H 可编程中断控制器2屏蔽
C0H DMA通道0,内存地址寄存器(DMA控制器2(8237))
C2H DMA通道0, 传输计数寄存器
C4H DMA通道1,内存地址寄存器
C6H DMA通道1, 传输计数寄存器
C8H DMA通道2,内存地址寄存器
CAH DMA通道2, 传输计数寄存器
CCH DMA通道3,内存地址寄存器
CEH DMA通道3, 传输计数寄存器
D0H DMA状态寄存器
D2H DMA写请求寄存器
D4H DMA屏蔽寄存器
D6H DMA方式寄存器
D8H DMA清除字节指针
DAH DMA主清
DCH DMA清屏蔽寄存器
DEH DMA写屏蔽寄存器
DFH-EFH 保留
F0H-FFH 协处理器使用
100H-16FH保留
170H 1号硬盘数据寄存器
171H 1号硬盘错误寄存器
172H 1号硬盘数据扇区计数
173H 1号硬盘扇区数
174H 1号硬盘柱面(低字节)
175H 1号硬盘柱面(高字节)
176H 1号硬盘驱动器/磁头寄存器
177H 1号硬盘状态寄存器
1F0H 0号硬盘数据寄存器
1F1H 0号硬盘错误寄存器
1F2H 0号硬盘数据扇区计数
1F3H 0号硬盘扇区数
1F4H 0号硬盘柱面(低字节)
1F5H 0号硬盘柱面(高字节)
1F6H 0号硬盘驱动器/磁头寄存器
1F7H 0号硬盘状态寄存器
1F9H-1FFH保留
200H-20FH游戏控制端口
210H-21FH扩展单元
278H 3号并行口,数据端口
279H 3号并行口,状态端口
27AH 3号并行口,控制端口
2B0H-2DFH保留
2E0H EGA/VGA使用
2E1H GPIP(0号适配器)
2E2H 数据获取(0号适配器)
2E3H 数据获取(1号适配器)
2E4H-2F7H保留
2F8H 2号串行口,发送/保持寄存器(RS232接口卡2)
2F9H 2号串行口,中断有效寄存器
2FAH 2号串行口,中断ID寄存器
2FBH 2号串行口,线控制寄存器
2FCH 2号串行口,调制解调控制寄存器
2FDH 2号串行口,线状态寄存器
2FEH 2号串行口,调制解调状态寄存器
2FFH 保留
300H-31FH原形卡
320H 硬盘适配器寄存器
322H 硬盘适配器控制/状态寄存器
324H 硬盘适配器提示/中断状态寄存器
325H-347H保留
348H-357H DCA3278
366H-36FH PC网络
372H 软盘适配器数据输出/状态寄存器
375H-376H 软盘适配器数据寄存器
377H 软盘适配器数据输入寄存器
378H 2号并行口,数据端口
379H 2号并行口,状态端口
37AH 2号并行口,控制端口
380H-38FH SDLC及BSC通讯
390H-393H Cluster适配器0
3A0H-3AFH BSC通讯
3B0H-3B H MDA视频寄存器
3BCH 1号并行口,数据端口
3BDH 1号并行口,状态端口
3BEH 1号并行口,控制端口
3C0H-3CFH EGA/VGA视频寄存器
3D0H-3D7H CGA视频寄存器
3F0H-3F7H 软盘控制器寄存器
3F8H 1号串行口,发送/保持寄存器(RS232接口卡1)
3F9H 1号串行口,中断有效寄存器
3FAH 1号串行口,中断ID寄存器
3FBH 1号串行口,线控制寄存器
3FCH 1号串行口,调制解调控制寄存器
3FDH 1号串行口,线状态寄存器
3FEH 1号串行口,调制解调状态寄存器
3FFH 保留
我来回复