中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS汉化世界 & 中文系统 (中文化室) » 用于 Config.sys 的驱动程序并列配置菜单 ConfigP.Mnu v1.01
« [1] [2] [3] [4] [5] [6] [7] [8] »
作者:
标题: 用于 Config.sys 的驱动程序并列配置菜单 ConfigP.Mnu v1.01 上一主题 | 下一主题
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『楼 主』:  用于 Config.sys 的驱动程序并列配置菜单 ConfigP.Mnu v1.01

一、特点
    1. 常见的配置菜单是逐级往下执行,不可返回,像串联。嵌套级数多时,菜单项目将会呈级数放大趋势,使菜单编写比较繁琐,重复项较多。本配置菜单是并列关系,菜单编写简捷,可阅读性强。菜单可连续选择,也可顺序返回。
    2. 为显示中文菜单提供了一个平台。
    3. 设有标题和尾注,每行都可单独设定颜色。
    4. 设有注释,为菜单提供简要说明,可单独设定颜色和位置。
    5. 可屏蔽显示信息。
   
    二、简要说明
    1. 菜单分为3种:嵌套菜单(NestMenu),复选菜单(CheckMenu),单选菜单(RadioMenu)。
     嵌套菜单用来选择下一步打开哪一个菜单。它更像是一个目录,说明配置哪些内容,缺省加载哪些内容。
     嵌套菜单可以没有项目。
     复选菜单用来加载相容的驱动程序,可不选或全选。
     单选菜单用来加载互斥的驱动程序,应选择1项且只能选择1项。
    2. 项目分为2种:默认项目(DefaultItem),普通项目(Item)。
     默认项目是启动时缺省加载的项目。
    3. 配置块(block)是按需要组织在一起的一组驱动程序。可在配置块里设定参数,遥控AutoExec.bat。
     可在 block=0 之前和 block=end 之后放置公共配置块。
    4. 如果菜单中不含标题、尾注、默认颜色,则继承上一菜单内容。
    5. 如果菜单中的标题、尾注不含颜色,则使用默认颜色。
    6. 如果菜单中注释不含颜色、位置,则继承上一菜单内容。

    三、使用方法
    1. 选择项目方法
     a. 按相应字母键。
     b. 按↑/↓键,向上/向下顺序循环选择。
    2. 设定项目方法
     在复选菜单被选项目按空格键,设定项目/清除项目。
    3. 选择菜单方法
     a. 按→键,向后连续选择。
     b. 按←键,顺序返回。
     c. 在嵌套菜单被选项目按空格键,打开指定菜单。
    4. 退出菜单方法
     在任意菜单按回车键,退出菜单配置。
    5. 开关参数
     a. /s   屏蔽config.sys显示信息
     b. /u   解除屏蔽

    四、语法说明
    1. 菜单  
        rem 0NestMenu=e,u,....
        rem 0CheckMenu=e,u,....
        rem 0RadioMenu=e,u,....
        0 菜单顺序号
        e 注释颜色(0...f),缺省color
        u 注释位置(u显示在上部[标题之下],d显示在下部[尾注之上]),缺省d
        .... 注释内容
        例:=e,u,....
            =e,,....
            =,u,....
            =,,....
            =       
    2. 默认颜色,被选项目显示方式,缺省07,c
        rem color=       
        背景前景色(00...ff)(闪烁已更改为高亮)
        0黑 1蓝 2绿 3青 4红 5品红 6棕 7白 8灰 9亮蓝 a亮绿 b亮青 c亮红 d亮品红 e黄 f亮白
        被选项目显示方式(c反色,h高亮)
        例:=07,h
            =07
            =,h               
    3. 主菜单时间,时间标签,缺省60
        rem time=30,....
        30 时间(秒)
        .... 时间标签
        例:=30,剩余时间
            =30       
    4. 标题
        rem caption=7,....
        7 标题颜色(0...f),缺省color
        .... 标题内容
        例:=7,....
            =,....
            =
    5. 尾注
        rem endnote=7,....
        7 尾注颜色(0...f),缺省color
        .... 尾注内容
        例:=7,....
            =,....
            =
    6. 项目
        rem item=2=....
        rem DefaultItem=2,11=....
        数字 对于嵌套菜单,是菜单顺序号(打开第2页菜单)
             对于单选菜单、复选菜单是配置块顺序号(包含第2,11配置块)
        .... 项目说明
    7. 配置块
        rem block=0
        ....
        rem block=end
        0 配置块顺序号
        end 配置块结束符

[ Last edited by yaya on 2006-3-28 at 16:26 ]

附件 1: configp1.jpg (2006-3-26 15:43, 35.14 K, 下载附件所需积分 1 点 ,下载次数: 23)


附件 2: configp2.jpg (2006-3-26 15:43, 31.69 K, 下载附件所需积分 1 点 ,下载次数: 20)


附件 3: ConfigP.Mnu101.rar (2006-3-28 16:24, 58.12 K, 下载附件所需积分 1 点 ,下载次数: 1131)
2006-2-10 09:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『第 2 楼』:  

例1:统一的标题、尾注,每一菜单的功能由注释说明。
    (实际使用时,需由'本是'的VTMagic.com将下面的中文字体换掉)   
device=config.exe    (由'本是'的VTMagic.com生成)
device=ConfigP.Mnu /s

rem 0NestMenu=e,u,首菜单
rem color=17,c
rem time=30,剩余时间
rem caption=
rem caption=
rem caption=
rem caption=3,             中文 MSDOS_7.1 启动盘
rem caption=4,================================================
rem endnote=2,按↑↓键或相应字母键选择项目,按空格键设定项目
rem endnote=2,按→键向后连续选择,按←键顺序返回,按回车退出菜单
rem item=1=选择启动模式   默认加载 umbpci
rem item=2=选择光驱       默认加载 vide-cdd
rem item=3=选择usb        默认不加载

rem 1RadioMenu=,,选择启动模式  (单选)
rem DefaultItem=0,2,11=加载 umbpci
rem item=0,1,11=加载 emm386
rem item==最小加载

rem 2CheckMenu=,,选择光驱  (复选)
rem DefaultItem=3,6=加载 vide-cdd
rem item=4,6=加载 aspicd
rem item=5,6=加载 usbcd

rem 3CheckMenu=,,选择usb  (复选)
rem item=7=加载 usbaspi
rem item=8=加载 aspiohci
rem item=9=加载 aspiuhci
rem item=10=加载 di1000dd

rem block=0
device=himem.sys
rem block=1
device=emm386.exe noems
rem block=2
device=umbpci.sys
rem block=3
devicehigh=vide-cdd.sys /d:ide-cd
rem block=4
devicehigh=aspicd.sys /d:scsi-cd
rem block=5
device=usbcd.sys /d:usb-cd
rem block=6
set cm=cdrom
rem block=7
device=usbaspi.sys /r
rem block=8
device=aspiohci.sys /int /all
rem block=9
device=aspiuhci.sys /int /all
rem block=10
device=di1000dd.sys
rem block=11
dos=high,umb,auto
rem block=end

fcbshigh=4,0
fileshigh=30
buffershigh=30,0
lastdrivehigh=32
stackshigh=9,256

device=ConfigP.Mnu /u


例2:每一菜单有各自的标题,不用注释
device=config.exe
device=ConfigP.Mnu /s

rem 0NestMenu=
rem color=17,c
rem time=30,剩余时间
rem caption=
rem caption=
rem caption=
rem caption=3,             中文 MSDOS_7.1 启动盘
rem caption=4,================================================
rem endnote=2,按↑↓键或相应字母键选择项目,按空格键设定项目
rem endnote=2,按→键向后连续选择,按←键顺序返回,按回车退出菜单
rem item=1=选择启动模式   默认加载 umbpci
rem item=2=选择光驱       默认加载 vide-cdd
rem item=3=选择usb        默认不加载

rem 1RadioMenu=
rem caption=
rem caption=
rem caption=
rem caption=5,             选择启动模式  (单选)
rem caption=4,================================================
rem DefaultItem=0,2,11=加载 umbpci
rem item=0,1,11=加载 emm386
rem item==最小加载

rem 2CheckMenu=
rem caption=
rem caption=
rem caption=
rem caption=5,             选择光驱  (复选)
rem caption=4,================================================
rem DefaultItem=3,6=加载 vide-cdd
rem item=4,6=加载 aspicd
rem item=5,6=加载 usbcd

rem 3CheckMenu=
rem caption=
rem caption=
rem caption=
rem caption=5,             选择usb  (复选)
rem caption=4,================================================
rem item=7=加载 usbaspi
rem item=8=加载 aspiohci
rem item=9=加载 aspiuhci
rem item=10=加载 di1000dd

rem block=0
device=himem.sys
rem block=1
device=emm386.exe noems
rem block=2
device=umbpci.sys
rem block=3
devicehigh=vide-cdd.sys /d:ide-cd
rem block=4
devicehigh=aspicd.sys /d:scsi-cd
rem block=5
device=usbcd.sys /d:usb-cd
rem block=6
set cm=cdrom
rem block=7
device=usbaspi.sys /r
rem block=8
device=aspiohci.sys /int /all
rem block=9
device=aspiuhci.sys /int /all
rem block=10
device=di1000dd.sys
rem block=11
dos=high,umb,auto
rem block=end

fcbshigh=4,0
fileshigh=30
buffershigh=30,0
lastdrivehigh=32
stackshigh=9,256

device=ConfigP.Mnu /u

例3:单一菜单,有公共配置块
device=config.exe
device=ConfigP.Mnu

rem RadioMenu=
rem color=17,c
rem time=30,剩余时间
rem caption=
rem caption=
rem caption=
rem caption=3,             中文 MSDOS_7.1 启动盘
rem caption=4,================================================
rem endnote=2,按↑↓键或相应字母键选择项目,按回车退出菜单
rem item=0=保护模式  加载 EMM386
rem item=0,2=保护模式  加载 EMM386 和 CD-ROM
rem item=0,2,3=保护模式  加载 EMM386 , CD-ROM 和 USB
rem item=1=实模式    加载 UMBPCI
rem DefaultItem=1,2=实模式    加载 UMBPCI 和 CD-ROM
rem item=1,2,3=实模式    加载 UMBPCI , CD-ROM 和 USB

device=himem.sys
rem block=0
device=emm386.exe noems
rem block=1
device=umbpci.sys
rem block=2
devicehigh=vide-cdd.sys /d:ide-cd
devicehigh=aspicd.sys /d:scsi-cd
rem block=3
device=usbcd.sys /d:usb-cd
device=usbaspi.sys /r
device=aspiohci.sys /int /all
device=aspiuhci.sys /int /all
device=di1000dd.sys
rem block=end

dos=high,umb,auto
fcbshigh=4,0
fileshigh=30
buffershigh=30,0
lastdrivehigh=32
stackshigh=9,256


例4:一页说明,没有目录(目前显示不了这么多汉字,只作为示例)
device=config.exe
device=ConfigP.Mnu /s

rem 0NestMenu=
rem color=17,c
rem time=30,剩余时间
rem caption=
rem caption=
rem caption=
rem caption=5,           MS-DOS 7.10启动盘说明文件
rem caption=4,--------------------------------------------------
rem caption=5,      版权所有:xxxxxxxxxx   2003-10-12
rem caption=
rem caption=3,长文件名支持
rem caption=3,NTFS驱动器支持
rem caption=3,鼠标支持
rem caption=3,中文支持
rem caption=3,实用工具
rem caption=3,保护模式DOS程序支持
rem caption=3,直接启动Windows 3.x/9x
rem endnote=2,按→键向后连续选择菜单,按←键顺序返回,按回车退出菜单
rem endnote=2,按↑↓键选择项目,按空格键设定项目

rem 1RadioMenu=e,,选择启动模式  (单选)
rem caption=
rem caption=
rem caption=
rem caption=5,             中文 MSDOS_7.1 启动盘
rem caption=4,================================================
rem caption=
rem DefaultItem=0,2,11=加载 umbpci
rem item=0,1,11=加载 emm386
rem item==最小加载

rem 2CheckMenu=,,选择光驱  (复选)
rem DefaultItem=3,6=加载 vide-cdd
rem item=4,6=加载 aspicd
rem item=5,6=加载 usbcd

rem 3CheckMenu=,,选择usb  (复选)
rem item=7=加载 usbaspi
rem item=8=加载 aspiohci
rem item=9=加载 aspiuhci
rem item=10=加载 di1000dd

rem block=0
device=himem.sys
rem block=1
device=emm386.exe noems
rem block=2
device=umbpci.sys
rem block=3
devicehigh=vide-cdd.sys /d:ide-cd
rem block=4
devicehigh=aspicd.sys /d:scsi-cd
rem block=5
device=usbcd.sys /d:usb-cd
rem block=6
set cm=cdrom
rem block=7
device=usbaspi.sys /r
rem block=8
device=aspiohci.sys /int /all
rem block=9
device=aspiuhci.sys /int /all
rem block=10
device=di1000dd.sys
rem block=11
dos=high,umb,auto
rem block=end

fcbshigh=4,0
fileshigh=30
buffershigh=30,0
lastdrivehigh=32
stackshigh=9,256

device=ConfigP.Mnu /u

[ Last edited by yaya on 2006-3-28 at 16:29 ]

2006-2-10 09:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
coolboy163
初级用户





积分 176
发帖 74
注册 2005-11-7
状态 离线
『第 3 楼』:  

刚上班,就上来看看了
呵呵,YAYA果真的厉害啊,放假还没歇息啊
看起来很完善了,我来试试

2006-2-10 15:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
weilong888
银牌会员




积分 1270
发帖 548
注册 2004-5-31
状态 离线
『第 4 楼』:  

这东西搞得好啊。

2006-2-10 18:37
查看资料  发送邮件  发短消息 网志  OICQ (314295922)  编辑帖子  回复  引用回复
本是
银牌会员





积分 2201
发帖 789
注册 2005-1-27
状态 离线
『第 5 楼』:  

好!!!功能更加强大了。大家可以继续提建议,有了新想法,才有更好的作品!



my major is english----my love is dos----my teacher is the buddha----my friends--how about U
2006-2-10 22:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jackiepeng
中级用户




积分 211
发帖 38
注册 2003-8-12
状态 离线
『第 6 楼』:  

不错,感谢提供。

2006-2-15 11:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『第 7 楼』:  

v1.01 发布于1楼
修改:背景闪烁位改为高亮。
使背景颜色丰富,实现正确的反色显示。

在此特别感谢版主willsort一再提出改进意见和思路!

逐级执行式菜单编辑器ConMenu.sys比较适用,还是返回执行式菜单编辑器ConMenuR.sys比较适用?很想听听反馈意见。
欢迎大家继续提建议和新想法。

2006-2-28 17:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 8 楼』:  

Re yaya:

      感谢兄如此看重我的意见和建议!其实无论从算法设计还是从语言实现上我都无法给你提供多少切实有效的建议,而只能从程序之外做一些简单的黑箱测试,然后从一个客户的角度谈一谈自己的看法。同时,我对 DOS 启动技术的了解仍然不够全面和深入,之所以厚颜回复你的主题,一方面是为了表达对论坛原创作品的支持,希望能够抛砖引玉,使大家来关注你的程序以及其所涉及的领域;另一方面是彼时我恰在做二次引导扩展启动配置菜单的研究,希望能从你的程序中获得思路和灵感。后来,因为自己技术功底不足,我的研究半道夭折了,以后也就将注意力转回了我所爱好的批处理之上;现在看到你的邀请,感觉十分愧对兄的一腔热情,不得不勉力对兄的新作 ConMenuR 作了一些观摩和测试,所得如下,愿与兄及各位同仁共享。

      关于返回执行和逐级执行的选择,我个人更看好“返回执行式菜单编辑器ConMenuR.sys”,因为它在程序算法上确实是一个突破,而在功能实现上也独出一格。与 IO.SYS 相比,解决了复式选择、重新选择、连续选择等关键性问题。而 Block 的创意性构思,也大大降低了 include 多级嵌套所带来的程序编写和菜单编写的复杂度,同时也增加了菜单的可阅读性。至于它所带来的默认设置复杂的问题,我认为可以通过以下的“同级的连续菜单”的实现来部分解决。

      关于“同级的连续菜单”,与你的 ConMenuR 中的示例非常相近,它主要是针对不可返回的菜单而言的。就以 ConMenuR 示例的实现需求来说,如果菜单不可返回,而我们选择完内存管理程序后,还希望选择光驱和 USB 设备驱动,而这些选择如果作为二、三级菜单实现,就需要在每个一级菜单项中都实现二级菜单,在每个二级菜单项中都实现三级菜单,这样随着设备种类的增加,菜单项将会呈级数放大趋势。这正是你所提到的“编写菜单比较繁琐,重复项较多”的问题。

      而如果将内存管理程序、光驱驱动和 USB 驱动都在同一级菜单中实现选择,即选择完内存管理后,不必进入下一级(或进入后又返回)而继续选择设备驱动,USB驱动亦然,这样就很大程度上节约了菜单编写上的重复性。目前版本的返回执行式菜单的实现,使这个功能变得没有太大必要了,但是如果实现的话,即在“返回菜单前”加上一项“继续选择”,或者加上一个“继续选择”的快捷键(比如Enter),那么用户就可以不必返回菜单而直接进行下一设备驱动的选择,在选择时间上与逐级执行式相比也不会有太大变化,默认设置的问题也就淡化了(当然它仍是有必要的)。同时,菜单返回的作用不再主要是进行“下一步”选择,而是进行“另一次”选择。

      关于程序的测试情况,在我的虚拟机MSDOS7.10启动盘中,以你提供的示例进行测试,发现“rem color=”至“rem endnote=”一节所有行均不起作用,不过这应该是小问题,相信兄很快就能解决。

      另外,再在一些细节上提供一些建议仅供参考:

      1、快捷键布局:选择/反选-空格/Enter,返回-Backspace/LeftArrow,继续选择-Enter/RightArrow,直接执行-Esc,菜单选择-顺序数字/顺序字母/指定字符;
      2、类 IO.SYS 的界面风格:菜单项文字继续向右缩进,已选择菜单项的显示(包括多级、复选的显示),倒计时的显示位置等等;
      3、加入动态编辑菜单的功能;
      4、加入屏蔽 device 项输出信息的选项。

[ Last edited by willsort on 2006-3-1 at 19:40 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-3-1 19:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『第 9 楼』:  

Re willsort:
    你的谦逊再一次让人领略大师风范!
    感谢你提供的建议,非常有实用价值!近期我会逐一改进。
    关于"已选择菜单项的显示",目前使用"+",我感觉使用"√"更适当,但这要使用ASCII字符"FB",与汉化字使用"80-FF"冲突,为避免冲突,有可能减少5个汉字。怎样更好,也请同仁共商。
    关于"加入屏蔽device项输出信息的选项",device项是由config.sys模块执行的,怎样屏蔽device项输出信息,从网上浏览没有结果,有人说不能。
    关于"“rem color=”至“rem endnote=”一节所有行均不起作用",是由于忘了更改说明文档。应该将上述内容移到"rem menu=l主菜单$0"这一行之下。我已更改了2楼的例子1和1楼的附件3。由此引起的不便深感歉意!

2006-3-2 16:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 10 楼』:  

Re yaya:

      关于已选用菜单项标记,不建议占用扩展ASCII区的字符,本来可以显示的汉字便有限,应该尽量保证它的充分利用。可以考虑从ASCII码表的非打印控制取寻找[1],比如04,07-10,16,26等字符,也可以取 > } 之类。或者向 IO.SYS 借鉴,将已选取项显示在菜单项下方,只是如何显示多级、复选、连续菜单项还是个问题,目前简化为只显示当前菜单的所有选择项。

      屏蔽输出信息可以借鉴内部命令 ctty ,在命令行下执行 ctty nul 将NUL设备句柄复制给 stdin/stdout/stderr,从而将PC控制权移交NUL,封锁了所有输入输出。另外,command nul 也有类似的作用。

[1]ASCII编码表
http://www.cn-dos.net/forum/viewthread.php?tid=18942

[2]CTTY - Change console
; ****************************************************************
; *
; * ROUTINE:         CTTY - Change console
; *
; * SYNTAX:         CTTY device
; *
; * FUNCTION:         If a valid console device is specified, CTTY will
; *                 duplicate the device handle to STDIN, STDOUT and
; *                 STDERR.  This routine returns to LODCOM1.
; *
; * INPUT:         command line at offset 81H
; *
; * OUTPUT:         none
; *
; ****************************************************************

CTTY:
        push        ds                                ;AN000; Get local ES
        pop        es                                ;AN000;
        mov        si,81H                                ;AC000; Get command argument for CTTY

        mov        di,offset trangroup:parse_ctty        ;AC000; Get adderss of PARSE_CTTY
        xor        cx,cx                                ;AC000; clear cx,dx
        xor        dx,dx                                ;AC000;
        invoke        cmd_parse                        ;AC000; call parser
        cmp        ax,end_of_line                        ;AN000; are we at end of line?
        jz        ctty_error                        ;AN000; yes - error
        cmp        ax,result_no_error                ;AN000; did an error occur
        jnz        ctty_error                        ;AN000; YES -ERROR

        push        si                                ;AN000; save position in line
        lds        si,parse1_addr                        ;AN000; get address of filespec
        mov        di,offset trangroup:srcbuf        ;AN000; get address of srcbuf

ctty_move_filename:                                ;AN000; put filespec in srcbuf
        lodsb                                        ;AN000; get a char from buffer
        stosb                                        ;AN000; store in srcbuf
        cmp        al,end_of_line_out                ;AN000; it char a terminator?
        jnz        ctty_move_filename                ;AN000; no - keep moving
        pop        si                                ;AN000; get line position back
        mov        di,offset trangroup:parse_ctty        ;AC000; Get adderss of PARSE_CTTY
        call        parse_check_eol                 ;AN000; are we at end of line?
        jz        nocolon                         ;AN000; yes - continue

ctty_error:
        jmp        short isbaddev                        ;AC000; yes - exit

nocolon:
        mov        dx,offset trangroup:srcbuf        ;AN000; get address of srcbuf
        MOV        AX,(OPEN SHL 8) OR 2                ; Read and write
        INT        21h                        ; Open new device
        JC        ISBADDEV
        MOV        BX,AX
        MOV        AX,IOCTL SHL 8
        INT        21h
        TEST        DL,80H
        JNZ        DEVISOK

CLOSEDEV:                                        ;AN007;
        MOV        AH,CLOSE                        ; Close initial handle
        INT        21h

ISBADDEV:
        MOV        DX,OFFSET TRANGROUP:BADDEV_ptr
        invoke        std_printf
        JMP        SHORT RESRET

DEVISOK:
        push        dx                                ;AN007; save device info
        mov        ax,acrlf_ptr                        ;AN021; get message number for 0d, 0a
        mov        dh,util_msg_class                ;AN021; this is a utility message
        push        bx                                ;AN021; save handle
        invoke        Tsysgetmsg                        ;AN021; get the address of the message
        mov        dx,si                                ;AN021; get address into dx
        mov        ax,(write shl 8)                ;AN007; write to device
        mov        cx,2                                ;AN007; write two bytes
        int        21h                        ;AN007;
        pop        bx                                ;AN021; get back handle
        pop        dx                                ;AN007; get back device info
        jc        closedev                        ;AN007; if error, quit
        XOR        DH,DH
        OR        DL,3                                ; Make sure has CON attributes
        MOV        AX,(IOCTL SHL 8) OR 1
        INT        21h
        PUSH        BX                                ; Save handle
        MOV        CX,3
        XOR        BX,BX

ICLLOOP:                                        ; Close basic handles
        MOV        AH,CLOSE
        INT        21h
        INC        BX
        LOOP        ICLLOOP
        POP        BX                                ; Get handle
        MOV        AH,XDUP
        INT        21h                        ; Dup it to 0
        MOV        AH,XDUP
        INT        21h                        ; Dup to 1
        MOV        AH,XDUP
        INT        21h                        ; Dup to 2
        MOV        AH,CLOSE                        ; Close initial handle
        INT        21h

RESRET:
        MOV        DS,[RESSEG]
ASSUME        DS:RESGROUP
        PUSH        DS
        MOV        AX,WORD PTR DS:[PDB_JFN_Table]        ; Get new 0 and 1
        MOV        [IO_SAVE],AX
        MOV        AX,OFFSET DATARES:TrnLodCom1_Trap
        PUSH        AX

ZMMMM        PROC FAR
        RET                                        ; Force header to be checked
ZMMMM        ENDP
[ Last edited by willsort on 2006-3-2 at 19:24 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-3-2 19:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『第 11 楼』:  

Re willsort:
    关于已选用菜单项标记,我非常赞成你的观点,不能浪费有限的汉化资源。我考虑使用'00-1f'中不使用的控制字符,自造一个图形符号。
    关于屏蔽device输出信息,我认为应该单独编一段程序,在开始屏蔽的地方和结束屏蔽的地方分别加入命令。ConMenuR程序结束后,才由io.sys执行device,因此既便在ConMenuR程序中加入屏蔽代码,也无法控制屏蔽结束(ConMenuR不驻留内存)。

2006-3-4 09:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『第 12 楼』:  

v1.10 2006/3/6 发布于1楼

修改:将时间显示位置上移到菜单项之下
修改:出错时由退出程序改为退出菜单
修改:子菜单不再显示剩余时间
修改:被选菜单项标记由"+"改为"√"
增加:"剩余时间"标签显示
增加:快捷键esc,在任意位置执行菜单
增加:快捷键←/→,-/=,向前/向后顺序显示菜单页
增加:快捷键spacebar,等同于enter
增加:快捷键(shift+'-')/(shift+'='),等同于↑/↓

2006-3-7 17:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 13 楼』:  

Re yaya:

      以下有很多关于 ConMenuR 工作原理的疑问和猜测,很可能与实情想去甚远,请 yaya 兄聊作“哂”阅。

>>ConMenuR程序结束后,才由io.sys执行device

      这里你的意思是否是说,ConMenuR 执行结束后,才由 IO.SYS 执行 ConMenuR.sys 之后的 DEVICE 语句?因为 Config.exe 和 ConMenuR.sys 本身都是通过 device 加载,如果 device 在 ConMenuR.sys 之后处理,则形成一个“鸡与蛋”的互生悖论。

      如果以上问题的答案是肯定的,那么是否可以推断 ConMenuR.sys 的生存周期是在 IO.SYS 对 Config.sys 预处理和符号化之后,ConMenuR 之后的 DEVICE 命令执行之前,而它的作用域应该就是 REM Menu= 和 REM BLOCK=END 之间的 REM 之类的菜单配置语句和 device 之类的内存配置语句。虽然所有的内存配置命令在菜单结束前都不会被 io.sys 执行。

      而这些配置语句又是如何被处理的?我的猜想是,因为在第一条device命令被加载前,所有的 device 语句均被预处理和符号化,那么它所需的 device 命令则应该是从预处理后的 config 工作区中获取的,否则 ConMenuR 需要将重新组装后的 device 原始语句再次符号化;而因为 rem 语句在预处理过程中是被忽略的,因此菜单配置所需的 REM 语句应该是从原始的 Config.sys 中读取所的。

      这就意味着可以通过menu和block的分离(即block在config.sys文件中,而menu在自定义文件中),简单实现在非 config.sys 文件中实现菜单配置,从而绕过 IO.SYS 的语法检查机制,也从而实现更自由的菜单定制。

>>既便在ConMenuR程序中加入屏蔽代码,也无法控制屏蔽结束

      考虑到 ConMenuR 可以重新组装 device 语句,则在菜单配置结束后自行增加一条关闭屏蔽输出的 device 或类 device 似也并非没有可能,甚至可以考虑将这条特殊的命令插入到 block 中其它任意位置。当然,前提是首先能够实现出这条特殊命令。

      以下是关于 ConMenuR 菜单内部格式的一些设想和看法,权作参靠。

      在我的设想中:

      1、所有的菜单配置语句中分隔标记不会超过三个:空格、等号和逗号,他们的用法与IO.SYS定制的没有太大的不同,如图数学上的三色原理一样,我相信他们应该可以胜任Config配置菜单所有的语法表达,而这也同样促使在菜单项中可以显示更多的特殊字符。

      2、而配制命令则会多一些,包括嵌套菜单NestMenu,复选菜单CheckMenu,单选菜单RadioMenu,它们决定了菜单的类型;还包括菜单项Item,缺省菜单项DefaultItem,公共菜单项CommonItem(即在分析此级菜单时总是会加载的项),他们决定了菜单项的类型;还有标题项Capation/TitleText(屏幕顶部,居中?高亮?),尾注项EndText(屏幕底部),提示文字项Text/NoteText(他们可以出现在菜单项之前、之后和之间,并且他们在 Config.sys 中的相对位置决定了在屏幕上的相对位置)。

      最后,我想说的是,这个程序的名字似乎无法准确完全的涵盖它的已有功能和实现目标,至少它不是一个Editor。

[ Last edited by willsort on 2006-3-7 at 23:42 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-3-7 22:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
shj99422
初级用户





积分 178
发帖 78
注册 2005-8-9
状态 离线
『第 14 楼』:  

真是大千世界无其不有啊

2006-3-8 10:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yaya
银牌会员





积分 1009
发帖 353
注册 2003-9-4
状态 离线
『第 15 楼』:  

Re willsort:
    关于 ConMenuR 工作原理,你说的很对。IO.SYS 对 Config.sys 预处理和符号化之后,开始从上到下逐条执行命令。执行到 device=ConMenuR.sys ,显示菜单,同用户互动,进行命令配置,然后屏蔽掉 rem block=0 到rem block=end 之间所有未选命令,加入一些必要的命令(如在 ConMenu 中加入 set cm0=...)。ConMenuR 退出后,IO.SYS 从 ConMenuR 之后逐条执行未屏蔽的命令。
    关于在 ConMenuR 程序中加入屏蔽代码的问题,我觉得很必要,但限于水平低,目前还没能实现。希望同仁继续提供思路,或直接编一条程序供鉴赏。
    关于分隔标记种类过多的问题,可以考虑缩减。目前在菜单项中不可使用的字符只有'$'。
    各菜单页都可设置自己的标题,尾注,颜色。如果不想繁琐设置,'菜单页说明'提供了另一类显示途径。为了醒目,可以提供显示在菜单项之上/之下选择,高亮选择。
    程序的名称是不够确切,它的功能是提供菜单,实现人/机互动,选择设备驱动程序,遥控自动批处理程序,实现启动引导。确实不是一个编辑器。

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


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



论坛跳转: