批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

批处理调用debug命令实现任意方向滚屏

无需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
  1. @echo off
  2. ::::SYBN 演示脚本 内含注释 默认一律注释下一行的意义::::::
  3. ::打开延迟环境变量
  4. SETLOCAL ENABLEDELAYEDEXPANSION
  5. ::初始页码防止运行16位子系统后系统默认语言被改成英文从而不支持中文(脚本不含中文可省略此行)
  6. (CHCP 437 &GRAFTABL 936)>NUL
  7. ::初始颜色
  8. color f1
  9. ::定义脚本名/版本
  10. set tit=SYBN 演示脚本 裁剪自"SYBN DLL 0.0.1"[SD.bat]
  11. ::存储sybc的16进制数据
  12. 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
  13. ::存储调用sybc显示彩色的"SYBC dll 演示脚本 0.01"的16进制DEBUG指令数据
  14. SET U=;A80;DB 2D 0D "11230fcS$f6Y$f1B$f9N $f3dll $f9演示脚本 0.01" 0D;;RCX;F0;G;Q
  15. ::存储调用sybc显示彩色的"[   .:2010-02-08:.   ]"的16进制DEBUG指令数据
  16. SET V=;A80;DB 2A 0D "11330f0[   .:2010$fc-$f002$fc-$f004:.   ]" 0D;;RCX;F0;G;Q
  17. ::存储调用sybc获取键盘输入的DEBUG指令数据
  18. SET W=;A80;DB 00 0D 0D;;RCX;F0;G;Q
  19. ::压缩简化代码 存储X0-X13的值
  20. 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
  21. ::压缩简化代码 存储Y0-Y13的值
  22. 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
  23. ::解压缩变量A,B中存储的X*,Y*的值
  24. SET X%a:;=&SET X%%b:;=&SET y%
  25. ::显示标题
  26. TITLE %tit%
  27. ::显示提示语
  28. ECHO %tit% 正在初始化,请按任意键继续...
  29. ::利用DEBUG运行sybc,由于没有生成SYBC.com,参数存储在变量W
  30. (ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%W:;=&ECHO.%)|DEBUG>NUL
  31. ::::初始化完成,以下是主体部分代码::::::::::::::::::::::::::
  32. :0
  33. ::获取一个0-49的随机数
  34. SET /A f=%random%%%50
  35. ::如果随机数小于14,把变量x,y定义为与随机数对应的X*,Y*
  36. IF %F% LSS 14 SET X=!X%F%!&SET y=!y%F%!
  37. ::改变屏幕上所有内容的颜色为灰色
  38. color f7
  39. :调用DEBUG显示彩色的"SYBC dll 演示脚本 0.01"
  40. (ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%U:;=&ECHO.%)|DEBUG>NUL
  41. ::存储调用sybc显示彩色的"[   .:2010-02-08:.   ]"
  42. (ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%V:;=&ECHO.%)|DEBUG>NUL
  43. ::=========================================================
  44. ::关键代码把显示缓存B800段中,X开始的内容存储到Y开头的位置
  45. ::以此来实现全屏内容移动的功能
  46. (echo m b800:%X% fa0 b800:%Y%&echo q)|debug >nul
  47. ::=========================================================
  48. goto :0
复制代码
转自:http://www.cn-dos.net/forum/viewthread.php?tid=50226

强烈建议把“打飞机”这一名词改成     雷电……
综合型编程论坛
Writing Code That Nobody Else Can Read.

TOP

回复 2楼 的帖子

5230真的太能“搞”了

TOP

回复 3楼 的帖子

我翻版一下: 5230 真的太难"搞"了……

看看这句: 贪吃蛇打飞机   我就在想像 贪吃的蛇在打飞机……
综合型编程论坛
Writing Code That Nobody Else Can Read.

TOP

返回列表