中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 祥解:无3方实现任意方向滚屏
作者:
标题: 祥解:无3方实现任意方向滚屏 上一主题 | 下一主题
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『楼 主』:  祥解:无3方实现任意方向滚屏

祥解:无3方实现任意方向滚屏

无需3方,利用DEBUG就能实现任意方向滚屏,配合SYBC的彩色字符输出,可以实现千变万化的绚丽效果。
http://www.cn-dos.net/forum/viewthread.php?tid=50188&fpage=1
目前使用这个技术组合成功实现了全彩的,贪吃蛇打飞机等脚本游戏示例代码。

考虑到大多数人完全搞不懂俺发出来的示例代码,所以在此加上注释详解一下代码:
在此讲解一下关键代码:

====sybc的部分====
SET U=;A80;DB 2D 0D "11230fcS$f6Y$f1B$f9N $f3dll $f9演示脚本 0.01" 0D;;RCX;F0;G;Q
(ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%U:;=&ECHO.%)|DEBUG>NUL
首先把参数写入80位置,从而可以不生成sybc.com文件的情况下运行有参数的sybc.com
其中2D是参数长度的16进制值
引号内的内容是实际的参数
当然我们还需要提前载入sybc才行

====滚屏的部分====
(echo m b800:%X% fa0 b800:%Y%&echo q)|debug >nul

运行了16位子程序了以后,系统仍然保留在25*80@16的显示模式,没有进度条
在这个模式下,cmd窗口内的全部数据保存在B800:0000-B800:0FA0
保存方式是:一个字节的字母,然后是一个字节的颜色信息
其中如果是中文,则拆分为2个单字节分别加上颜色信息
[也就是说一个汉字可以左右两边不一样颜色哦]

最后就看到类似 31 07 32 07 33 07 ...... [黑底灰字的123]
注意07的意义和color一样哦[确切的说是color和他一样]
一行80个字节算上颜色信息就是160个字节[16进制就是A0]
所以从A0开始是第2行的信息

也就是说我们把0000的开始的所有数据挪到0002意味着全屏右移1字节
把0000的开始的所有数据挪到00A0意味着全屏向下移动1行
把0000的开始的所有数据挪到00A2意味着全屏向右下移动
当然你还可以反过来,或是只移动一部分内容
最后注意移动是用复制的方式,旧内容会被保留

了解了原理,移动的代码就简单了
b800:%X% 是要移动的内容的开头
fa0 是要移动的内容的结尾
b800:%Y% 是移动后的位置
注意,所有数据时16进制,开头的0可以省略
例如b800:00A0 可以省略为b800:A0
@echo off
::::SYBN 演示脚本 内含注释 默认一律注释下一行的意义::::::

::打开延迟环境变量
SETLOCAL ENABLEDELAYEDEXPANSION

::初始页码防止运行16位子系统后系统默认语言被改成英文从而不支持中文(脚本不含中文可省略此行)
(CHCP 437 &GRAFTABL 936)>NUL

::初始颜色
color f1

::定义脚本名/版本
set tit=SYBN 演示脚本 裁剪自"SYBN DLL 0.0.1"[SD.bat]

::存储sybc的16进制数据
SET SYBCOM=A100;E8A 80 CD89 C581 81 F980 7F06 CD09 8016 1F9 687F 64EB 83BE E800 65 5AE3 73E8;3C00 7F18 8853 E8C6 57 4CE3 65E8 3C00 7F4F 8845 B0C2 F602 50E2 A0B0 E6F6 15F;E8C7 3D 32E3 C387 393C 27E 904 FB80 7E39 8003 9C3 F24 E380 C00F 4E0 D808;B850 B800 750 295A 89F5 EBE9 AC46 ACAC ACAC F7E2 4CB4 21CD FAEB E088 4CB4;21CD ACAC 203C 475 F9E2 9EB C388 3CAC 7520 E202 C3F9 C387 302C EB80 B430;F60A E4 C3D8 5953 4E42 DED0 C4B8 3032 3930 3231 3631 AC24 243C A74 88AA AAD0;F5E2 B4EB B2EB E349 49AF ACE3 B6E8 E3FF 87A7 3CC3 7E39 402 8009 39FB 37E;C380 2409 800F FE3 10B2 E2F6 D800 C288 C7E2 86EB

::存储调用sybc显示彩色的"SYBC dll 演示脚本 0.01"的16进制DEBUG指令数据
SET U=;A80;DB 2D 0D "11230fcS$f6Y$f1B$f9N $f3dll $f9演示脚本 0.01" 0D;;RCX;F0;G;Q

::存储调用sybc显示彩色的"[   .:2010-02-08:.   ]"的16进制DEBUG指令数据
SET V=;A80;DB 2A 0D "11330f0[   .:2010$fc-$f002$fc-$f004:.   ]" 0D;;RCX;F0;G;Q

::存储调用sybc获取键盘输入的DEBUG指令数据
SET W=;A80;DB 00 0D 0D;;RCX;F0;G;Q

::压缩简化代码 存储X0-X13的值
SET A=0=0;1=0;2=0;3=2;4=2;5=A0;6=A0;7=A2;8=0;9=A4;10=4;11=A0;12=0;13=4

::压缩简化代码 存储Y0-Y13的值
SET B=;0=2;1=A0;2=A2;3=0;4=A0;5=0;6=2;7=0;8=A4;9=0;10=A0;11=4;12=4;13=0

::解压缩变量A,B中存储的X*,Y*的值
SET X%a:;=&SET X%%b:;=&SET y%

::显示标题
TITLE %tit%

::显示提示语
ECHO %tit% 正在初始化,请按任意键继续...

::利用DEBUG运行sybc,由于没有生成SYBC.com,参数存储在变量W
(ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%W:;=&ECHO.%)|DEBUG>NUL

::::初始化完成,以下是主体部分代码::::::::::::::::::::::::::
:0

::获取一个0-49的随机数
SET /A f=%random%%%50

::如果随机数小于14,把变量x,y定义为与随机数对应的X*,Y*
IF %F% LSS 14 SET X=!X%F%!&SET y=!y%F%!

::改变屏幕上所有内容的颜色为灰色
color f7

:调用DEBUG显示彩色的"SYBC dll 演示脚本 0.01"
(ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%U:;=&ECHO.%)|DEBUG>NUL

::存储调用sybc显示彩色的"[   .:2010-02-08:.   ]"
(ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%V:;=&ECHO.%)|DEBUG>NUL

::=========================================================
::关键代码把显示缓存B800段中,X开始的内容存储到Y开头的位置
::以此来实现全屏内容移动的功能
(echo m b800:%X% fa0 b800:%Y%&echo q)|debug >nul
::=========================================================

goto :0
[ Last edited by sl543001 on 2010-2-9 at 14:57 ]

   此帖被 +74 点积分         点击查看详情   
评分人:【 netbenton 分数: +13  时间:2010-2-8 19:53
评分人:【 chenall 分数: +15  时间:2010-2-8 20:15
评分人:【 lotus516 分数: +8  时间:2010-2-8 20:37
评分人:【 moniuming 分数: +15  时间:2010-2-8 23:46
评分人:【 radem 分数: +8  时间:2010-2-10 12:22
评分人:【 s11ss 分数: +15  时间:2010-2-16 04:26


2010-2-8 17:57
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
qwd
初级用户





积分 161
发帖 56
注册 2007-10-1
状态 离线
『第 2 楼』:  

debug 好多人不知道,我也是刚刚接接触!知道是b800写屏,知道一点一点皮毛。做了那个纯批恢复16进制图片。不过还是有空向你多学习一下吧!

2010-2-8 18:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 3 楼』:  

debug可是好东西,利用它可以进行16进制编辑,以及16进制正反汇编,运行程序.
理论上可以吧各种脚本单文件化,把记录配置文件和外部命令全部集成到单个脚本中!

2010-2-9 14:59
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 4 楼』:  

俺正在研究利用DEBUG编写一个可以移动屏幕中任意方形区域的内容到另一区域的子程序,然后添加到sybn dll中.
到时候大家就可以用类似 "call sd y 5 5 10 10 5 5"的命令直接移动屏幕的一部分了,
当然还可以吧这个子程序嵌入大家自己的脚本,然后使用"call :syby 5 5 10 10 5 5"



SYBNQQ:354324773
2010-2-23 21:32
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: