中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 通过大家努力,批处理可告别choice
« [1] [2] [3] [4] »
作者:
标题: 通过大家努力,批处理可告别choice 上一主题 | 下一主题
wangff
初级用户





积分 134
发帖 54
注册 2008-11-19
状态 离线
『楼 主』:  通过大家努力,批处理可告别choice

改进版在26楼:
大家共同改进!
@echo off
call inc 2>nul
if %errorlevel%==1 (
   >inc.src echo ecs:100 B8 00 01 CD 16 B8 00 00 74 02 CD 16 B4 4C CD 21
   >>inc.src echo rcx
   >>inc.src echo 10
   >>inc.src echo w
   >>inc.src echo q
   debug inc.com < inc.src 2>nul 1>nul
   del inc.src
)
:loop
inc
if not %errorlevel%==0 (
   echo %errorlevel%
   if %errorlevel%==81 goto :eof ::q or Q exit
   if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop
[ Last edited by wangff on 2008-12-11 at 10:34 ]

   此帖被 +31 点积分        点击查看详情   
评分人:【 Helloworld 分数: +1  时间:2008-12-9 13:34
评分人:【 s11ss 分数: +11  时间:2008-12-9 19:31
评分人:【 wxcute 分数: +4  时间:2008-12-10 13:46
评分人:【 523066680 分数: +15  时间:2008-12-13 10:56


2008-12-9 11:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wangff
初级用户





积分 134
发帖 54
注册 2008-11-19
状态 离线
『第 2 楼』:  


@echo off
call inc 2>nul
if %errorlevel%==1 (   ::inc 不存在则创建
   >inc.src echo ecs:100 A0 5D 00 3C 20 75 09 B4 01 CD 16 B8 00 00 74 02 CD 16 B4 4C CD 21
   >>inc.src echo rcx
   >>inc.src echo 16
   >>inc.src echo w
   >>inc.src echo q
   debug inc.com < inc.src 2>nul 1>nul
   del inc.src
)
set/p =input:<nul
inc i ::有参数(任意)等待输入一个字符,通过errorlevel返回
echo %errorlevel%
:loop
inc   ::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键
echo %errorlevel%
if not %errorlevel%==0 (
   if %errorlevel%==81 goto :eof ::q or Q exit
   if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop
[ Last edited by wangff on 2008-12-10 at 21:35 ]

2008-12-9 16:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 3 楼』:  

wangff兄可不可以讲解下int 16的1号功能是怎么用的?

   此帖被 +2 点积分    点击查看详情   
评分人:【 xxi 分数: +2  时间:2009-6-25 02:33


2008-12-9 19:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wangff
初级用户





积分 134
发帖 54
注册 2008-11-19
状态 离线
『第 4 楼』:  

键盘服务(Keyboard Service——INT 16H)  
作者:佚名  出处:中国自学编程网收集整理   发布日期:2007-09-27   

00H、10H —从键盘读入字符03H —设置重复率
01H、11H —读取键盘状态04H —设置键盘点击
02H, 12H —读取键盘标志05H —字符及其扫描码进栈
(1)、功能00H和10H
功能描述:从键盘读入字符
入口参数:AH=00H——读键盘
=10H——读扩展键盘,可根据0000:0496H单元的内容判断:扩展键盘是否有效
出口参数:AH=键盘的扫描码
AL=字符的ASCII码
(2)、功能01H和11H
功能描述:读取键盘状态
入口参数:AH=01H——检查普通键盘
=11H——检查扩展键盘
出口参数:ZF=1——无字符输入,否则,AH=键盘的扫描码,AL=ASCII码。
(3)、功能02H和12H
功能描述:读取键盘标志
入口参数:AH=02H——普通键盘的移位标志
=12H——扩展键盘的移位标志
出口参数:AL=键盘标志(02H和12H都有效),其各位之值为1时的含义如下: 位7—INS开状态位3—ALT键按下
位6—CAPS LOCK开状态位2—CTRL键按下
位5—NUM LOCK开状态位1—左SHIFT键按下
位4—SCROLL LOCK开状态位0—右SHIFT键按下
AH=扩展键盘的标志(12H有效),其各位之值为1时的含义如下:
位7—SysReq键按下位3—右ALT键按下
位6—CAPS LOCK键按下位2—右CTRL键按下
位5—NUM LOCK键按下位1—左ALT键按下
位4—SCROLL键按下位0—左CTRL键按下
(4)、功能03H
功能描述:设置重复率
入口参数:AH=03H 对于PC/AT和PS/2:AL=05H
BH=重复延迟
BL=重复率
对于PCjr:AL=00H——装入缺省的速率和延迟
=01H——增加初始延迟
=02H——重复频率降低一半
=03H——增加延迟和降低一半重复频率
=04H——关闭键盘重复功能
出口参数:无
(5)、功能04H
功能描述:设置键盘点击
入口参数:AH=04H AL=00H——关闭键盘点击功能
=01H——打开键盘点击功能
出口参数:无
(6)、功能05H
功能描述:字符及其扫描码进栈
入口参数:AH=05H
CH=字符的描述码
CL=字符的ASCII码
出口参数:CF=1——操作成功,AL=00H,否则,AL=01H

   此帖被 +7 点积分     点击查看详情   
评分人:【 HAT 分数: +4  时间:2008-12-9 21:04
评分人:【 s11ss 分数: +3  时间:2008-12-9 21:05


2008-12-9 20:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 5 楼』:  

不好意思,这不算讲解吧?至少给一两个例子说明下嘛:)

2008-12-9 21:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wangff
初级用户





积分 134
发帖 54
注册 2008-11-19
状态 离线
『第 6 楼』:  

(2)、功能01H
功能描述:读取键盘状态
入口参数:AH=01H——检查普通键盘
出口参数:ZF=1——无字符输入,否则,AH=键盘的扫描码,AL=ASCII码。
mov     ah,1     ;检测是否按键
int       16h
mov     ax,0     ;ah=0 读键,清al
jz         ret      ;zf=1 无按键返回0
int       16h     ;有按键,读出的ASCII在al

ret:
mov     ah,4ch   ;将al返回给 errorleve
int       21h
不知说清楚否?打字很慢,请谅解.

   此帖被 +3 点积分     点击查看详情   
评分人:【 s11ss 分数: +3  时间:2008-12-9 22:04


2008-12-9 21:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 7 楼』:  

mov ah,0
int 16

上面两句不就是读输入么,还要1号功能干什么?

2008-12-9 22:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wangff
初级用户





积分 134
发帖 54
注册 2008-11-19
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by s11ss at 2008-12-9 22:03:
mov ah,0
int 16

上面两句不就是读输入么,还要1号功能干什么?

ah=0: 是等待输入   ah=1: 只检测,不读取(还在键盘缓冲中),如有输入还必须用ah=0读出

[ Last edited by wangff on 2008-12-9 at 22:17 ]

2008-12-9 22:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by wangff at 2008-12-9 10:15 PM:



ah=0: 是等待输入   ah=1: 只检测,不读取(还在键盘缓冲中),如有输入还必须用ah=0读出

[ Last edited by wangff on 2008-12-9 at 22:17 ]

C:\>debug
-a
0B22:0100 mov ah,0
0B22:0102 int 16
0B22:0104
-t

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B22  ES=0B22  SS=0B22  CS=0B22  IP=0102   NV UP EI PL NZ NA PO NC
0B22:0102 CD16          INT     16
-p
(此处输入的是a)
AX=1E61  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B22  ES=0B22  SS=0B22  CS=0B22  IP=0104   NV UP EI PL NZ NA PO NC
0B22:0104 381C          CMP     [SI],BL                            DS:0000=CD
-

我还是觉得用0号就行了

[ Last edited by s11ss on 2008-12-9 at 22:22 ]

2008-12-9 22:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wangff
初级用户





积分 134
发帖 54
注册 2008-11-19
状态 离线
『第 10 楼』:  

2楼的例子:
inc i ::有参数(任意)等待输入一个字符,通过errorlevel返回

就只用了ah=0

而:
inc   ::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键

则必须用到 ah=1

2008-12-9 22:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by wangff at 2008-12-9 10:36 PM:
2楼的例子:
inc i ::有参数(任意)等待输入一个字符,通过errorlevel返回

就只用了ah=0

而:
inc   ::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键

则必须用到 ah=1

无按键是直接回车的情况么?如果只用0号的话,al是0d啊

2008-12-9 22:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wangff
初级用户





积分 134
发帖 54
注册 2008-11-19
状态 离线
『第 12 楼』:  


@echo off

:loop
for /f "tokens=*" %%a in ('ping -n 1 127.1 ^| findstr /i "Request Reply"') do echo.%%a
inc   ::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键
if not %errorlevel%==0 (
   if %errorlevel%==112 pause   ::input p or P pause
   if %errorlevel%==90  pause
   if %errorlevel%==81 goto :eof ::input q or Q exit
   if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop
这个例子就可说明,只用ah=0做不到这种效果

[ Last edited by wangff on 2008-12-9 at 23:06 ]

2008-12-9 23:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 13 楼』:  

我慢慢体会吧,有劳了,wangff兄

2008-12-9 23:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 14 楼』:  

二楼的ecs:100 A0 5D 00 3C 20 75 09 B4 01 CD 16 B8 00 00 74 02 CD 16 B4 4C CD 21 CD 21 CD 21中,3次int 21,何故?

2008-12-9 23:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wangff
初级用户





积分 134
发帖 54
注册 2008-11-19
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by s11ss at 2008-12-9 23:59:
二楼的ecs:100 A0 5D 00 3C 20 75 09 B4 01 CD 16 B8 00 00 74 02 CD 16 B4 4C CD 21 CD 21 CD 21中,3次int 21,何故?

谢谢s11ss的细心,是从debug考下多余的,被长度16h约束没存到inc.com中不影响使用,已修改.

2008-12-10 08:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: