中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [原创]斗地主脚本技术准备-彩色输出 SYBC.com
« [1] [2] »
作者:
标题: [原创]斗地主脚本技术准备-彩色输出 SYBC.com 上一主题 | 下一主题
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『楼 主』:  [原创]斗地主脚本技术准备-彩色输出 SYBC.com

俺正在努力开发cmd版的斗地主,为此要做很多技术准备.
由于计划使用全彩的游戏界面,所以需要一个小com来输出彩色字符.
最初使用tit.com,然后以此为基础开发了sybc.com
并使用sybc.com编写了一系列示例代码.
目前已经可以用sybc.com实现斗地主的完整界面.
游戏代码以及1.1.11版sybc在6楼[注意这是1.1.11的]
最新1.1.21版在9楼
最新1.1.31版在12楼

征召高手低手一起加盟开发 QQ群:3401238
http://www.cn-dos.net/forum/viewthread.php?tid=50331&fpage=1

[ Last edited by sl543001 on 2010-4-3 at 03:23 ]

附件 1: sybc.rar (2010-3-2 17:48, 1.06 K,下载次数: 64)
附件 2: sybc参数详解.gif (2010-3-10 12:40, 17.45 K,下载次数: 14)


附件 3: ddz59.GIF (2010-3-10 13:38, 23.49 K,下载次数: 1)




SYBNQQ:354324773
2010-2-28 18:39
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
awangwjf
新手上路





积分 7
发帖 3
注册 2010-2-26
状态 离线
『第 2 楼』:  

希望早日看到V1.0。

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




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

修改并更新了代码,略微修改了语法,截图改为扑克牌!



SYBNQQ:354324773
2010-3-1 11:20
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




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

用于显示1楼截图中的一列扑克牌的cmd部分代码:
set a=a0=$fcA;a1=$fcA;a2=$fc2;a3=$fc3;a4=$fc4;a5=$fc5;a6=$fc6;a7=$fc7;a8=$fc8;a9=$fc9;a10=$fc10;a11=$fcJ;a12=$fcQ;a13=$fcK;a14=$fcS;a15=$fcY;a16=$fcB;a17=$fcN
set p%a:;=&set p%
cls
for /l %%a in (0,1,17) do set /a wz=11800+%%a*4&&(if %%a gtr 2 if %%a lss 8 set /a wz=!wz!-100)&&call :pa !wz! !pa%%a! ◆
pause
exit
:pb
call s7.com %1f1┏━━━━┓;$f1┃╳╳╳╳┃;$f1┃╳SYBN╳┃;$f1┃╳╳╳╳┃;$f1┃╳2010╳┃;$f1┃╳╳╳╳┃;$f1┗━━━━┛
goto :eof
:pa
call s7.com %1f1┏━━━━┓;:┃%2   $f1┃;:┃%3 斗  ┃;:┃  地  ┃;:┃  主 %2$f1┃;:┃   %3┃;:┗━━━━┛
goto :eof




SYBNQQ:354324773
2010-3-1 11:28
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




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

正在计划修改参数入口和调用方式,突破124参数限制



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




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

修改参数入口的计划暂缓到sybn Dll中解决
目前找到了新方法解决问题
在新版sybc中把参数中";:"的意义和";"的意义调换
因为原";:"的使用率比";"多,所以节约了少许代码
刚搞够吧右下角的数字变色

截图中用到的斗地主脚本[预想版]
只能干看看,还不能玩.

[ Last edited by sl543001 on 2010-3-4 at 12:18 ]

附件 1: ddz.rar (2010-3-4 12:18, 1.68 K,下载次数: 22)


SYBNQQ:354324773
2010-3-4 12:01
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 7 楼』:  

.......

哎呀,隔行如隔山,看不懂,也没机会去学汇编了,只能精神上支持了



┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2010-3-4 14:33
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
sl543001
中级用户




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

不需要会原理,会用就行了.
俺等到sybc开发到一定程度后,就会发布DEBUG版.
到时候就可以实现无3方全彩输出了!



SYBNQQ:354324773
2010-3-6 09:56
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




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

新版sybc 1.1.21已经支持choice功能 方法是不加任何参数直接运行

现发布debug版sybc生成代码:[只需将以下代码运行即可生成sybc]
SET SYBCOM=A100;80BE AC00 23C 5472 3CAC 7501 BE13 282;0EEB 3CAC 743A 3C09 740D 8347 1EE 46EB;E8AC 90 A2E8 3C00 7F18 8837 E8C6 84;96E8 3C00 7F4F 882B B0C2 F602 50E2 A0B0;E6F6 15F 57C7 3CAC 7424 E80A 67 45E8;8800 EBD1 E817 3B D188 10EB B0 16CD;E088 4CB4 21CD 815F A0C7 5700 B850 B800;0750 295A 88F5 ACCA 243C D974 3B3C 9274;0D3C DE74 233C 575 D783 EB01 AA01 D088;EBAA E8E4 1E C387 393C 27E 904 FB80;7E39 8003 9C3 F24 E380 B20F F610 E2;88D8 C3C2 3CAC 7420 3CFB 740D 88A5 ACC3;203C F074 D3C 9A74 87C3 2CC3 8030 30EB;0AB4 E4F6 D800 C3
SET V=;RCX;D7;N SYBC.COM;W;Q
(ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%V:;=&ECHO.%)|DEBUG>NUL
[ Last edited by sl543001 on 2010-3-6 at 16:40 ]

附件 1: ddz59.GIF (2010-3-6 16:40, 18.95 K)




SYBNQQ:354324773
2010-3-6 16:38
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




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

因为SYBC被设计为内嵌于脚本中,你可以不在磁盘中生成SYBC.COM文件.
而是直接把他从脚本中释放到内存,并在内存中运行.
当然如果你愿意,它也可以像一般三方工具那样被使用.

好吧,大家首先是要截图下载地址,截图就在下边,是cmd脚本的实图哦!
至于下载地址,既然内嵌了,又何须下载?吧下面代码保存为cmd运行即可生成SYBC.com(此代码版本1.1.21 更新日期2010-3-10)

SET SYBCOM=A100;80BE AC00 23C 5472 3CAC 7501 BE13 282;0EEB 3CAC 743A 3C09 740D 8347 1EE 46EB;E8AC 90 A2E8 3C00 7F18 8837 E8C6 84;96E8 3C00 7F4F 882B B0C2 F602 50E2 A0B0;E6F6 15F 57C7 3CAC 7424 E80A 67 45E8;8800 EBD1 E817 3B D188 10EB B0 16CD;E088 4CB4 21CD 815F A0C7 5700 B850 B800;0750 295A 88F5 ACCA 243C D974 3B3C 9274;0D3C DE74 233C 575 D783 EB01 AA01 D088;EBAA E8E4 1E C387 393C 27E 904 FB80;7E39 8003 9C3 F24 E380 B20F F610 E2;88D8 C3C2 3CAC 7420 3CFB 740D 88A5 ACC3;203C F074 D3C 9A74 87C3 2CC3 8030 30EB;0AB4 E4F6 D800 C3
SET V=;RCX;D7;N SYBC.COM;W;Q
if not exist sybc.com (ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%V:;=&ECHO.%)|DEBUG>NUL

-------------------------------------------------------------------------------
好吧,现在大家手上应该有SYBC.com文件了吧,没有就生成一个.
接下来的问题是SYBC应该怎么用,SYBC分为基础高级2中语法,(2者仅在速度上有差别,最终效果一至)
可以以SYBC.com文件形式运行,也可以直接运行于内存.(后者略快)
-------------------------------------------------------------------------------
使用SYBC之前需要初始化(特别是win2000/XP),
初始化的方法很简单,首先如果你要使用中文,需要在你的代码开头加上"(CHCP 437 &GRAFTABL 936)>NUL"
然后你需要运行一次无参数的SYBC,用户按任意键后初始化完成.:[语法图第1例]
(由于没有提示,所以建议大家最好用echo告知用户要按任意键)
-------------------------------------------------------------------------------
基础语法:[语法图第2例]
SYBC 位置颜色内容
SYBC 10303$F1SYBN#s
位置 5位数字第23位为行数第45位为列数
颜色 用$引导的2个16进制数,同color命令
内容 任意字符串 (注意不要使用$#;三个符号以免冲突)
#号 无内容,保留此位置原内容仅改变颜色
$号 允许存在多个$号,分别控制之后的字符颜色
-------------------------------------------------------------------------------
利用基础语法可以实现SYBC的全部效果,
如果觉得速度不满意,可以使用高级语法,
把多行基础语法合并成一行高级语法从而减少调用次数以加速.
不论使用什么语法,没次调用SYBC的时间都约0.01秒,瓶颈在硬盘的响应速度.
另外使用内嵌式调用,跳过磁盘直接运行SYBC可以进一步提高速度,但会牺牲代码可读性.
-------------------------------------------------------------------------------
高级语法:
[语法图第3例]
SYBC 10303$F1SYBN;2010
效果同
SYBC 10303$F1SYBN
SYBC 10403$F12010
分号 是换行符可以再上一行的起点列从启一行继续
如果不使用换行符而写一个很长的字符串,则会像echo那样自然换行.

[语法图第4例]
SYBC 10303$F1SYBN;:10401$F12010
效果同
SYBC 10303$F1SYBN
SYBC 10401$F12010
分号冒号 效果类似于脚本中的&符,可以吧两个SYBC命令连接在一起使用.
这样你几乎就可以吧所有连续出现的sybc命令合并成一行,速度会快很多.
--------------------------------------------------------------------------------
不过大家要注意com程序的参数是有长度限制的.
理论长度为127,实际可用长度为124,超过124则无法执行了!
当然,如果你使用后面的内嵌式调用,则没有这个限制了!
--------------------------------------------------------------------------------
内嵌式调用:
使用DEBUG可以方便的调用com程序,之前生成SYBC.com用的就是DEBUG,
我们是要稍微修改就可以用于内嵌式调用了!
首先,把SYBC.com的代码以16进制的形式保存在变量SYBCOM中
SET SYBCOM=A100;80BE AC00 23C 5472 3CAC 7501 BE13 282;0EEB 3CAC 743A 3C09 740D 8347 1EE 46EB;E8AC 90 A2E8 3C00 7F18 8837 E8C6 84;96E8 3C00 7F4F 882B B0C2 F602 50E2 A0B0;E6F6 15F 57C7 3CAC 7424 E80A 67 45E8;8800 EBD1 E817 3B D188 10EB B0 16CD;E088 4CB4 21CD 815F A0C7 5700 B850 B800;0750 295A 88F5 ACCA 243C D974 3B3C 9274;0D3C DE74 233C 575 D783 EB01 AA01 D088;EBAA E8E4 1E C387 393C 27E 904 FB80;7E39 8003 9C3 F24 E380 B20F F610 E2;88D8 C3C2 3CAC 7420 3CFB 740D 88A5 ACC3;203C F074 D3C 9A74 87C3 2CC3 8030 30EB;0AB4 E4F6 D800 C3
然后把DEBUG指令保存在变量V中
SET V=;A80;DB 10 00 "10303$F1SYBN2010" 0D;;RCX;F0;G;Q
注意10是指参数长度的16进制值,在1.1.21版中它已经没用了,不用管它照着写或写别的16进制值都行.
"10303$F1SYBN2010"就是参数了,记得两边加上冒号,这里的参数长度限制大约为65个字节
最后在调用它们
(ECHO.%SYBCOM:;=&ECHO.DW %&ECHO.%V:;=&ECHO.%)|DEBUG>NUL
---------------------------------------------------------------------------------------------------------
当然你还是没有突破124参数限制,反而限制降低到了约65字节,
如何突破限制呢?修改变量V的值就可以了.
SET V=;A80;DB 10 01;; A280;DB 10 00 "10303$F1SYBN";DB "2010-";DB "3-16" 0D;;RCX;F0;G;Q
大家不需要管为啥要这样写,只需要知道你可以吧参数分段,每段少于65字节,写在引号里就好了,
你可以写无限多个DB "XXXXXXXX"注意最后一个要加上0D不要忘记0D前的空格就好.

如有问题联系QQ:354324773



SYBNQQ:354324773
2010-3-20 15:19
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




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

最新SYBC 1.1.31支持直接读取内存中的变量作为程序参数
大幅提高使用效率,相同内容显示时间减少三分之一以上
以斗地主为例:刷新时间由48降为27
SYBC 1.1.31正在测试中...

附件 1: ddz61.GIF (2010-3-31 18:50, 20.14 K,下载次数: 3)




SYBNQQ:354324773
2010-3-31 18:50
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




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

1.1.31版 内存调用模块 演示代码
将SYBC之后内容插入脚本,初始化后利用"call :SYBC 参数"即可
参数几乎可以无限长,只要不超过64K(想让参数超过64K也难啊)
@ECHO Off&SETLOCAL ENABLEDELAYEDEXPANSION&SET SYBNV=0.0.2[缩减版]
:SYDLL
call :SYBA
call :SYBC 103003e完全无3方彩色输出示例模块演示代码,以上是效果展示;您看到的所有内容采用完全无3方彩色单行代码输出;大家使用SYBC前需要初始化,执行一次无参数的SYBC,或执行标签SYBA中的代码;标签SYBC与SYBCC需连续放置,不得改变位置关系;大家只要把标签SYBC及其之后的内容插入自己的脚本中;初始化后使用 [CALL :SYBC 参数] 的形式即可无3方调用SYBC;示例代码的参数极限长度为700字节;如有特殊需求可自行修改变量V扩展参数极限;:10000$f0 :::│$fC积$f9  电脑左  $f00  $f2+0$fC=$f00  $f0│$fC 斗地主 V0.0 [测试版] $f0│$f0  [庄家]  $f0│ 底 牌 │::: ;:10100$f0  ::│$fC分$f9  电脑右  $f00  $f2+0$fC=$f00  $f0│$f9开发:SYBN NETBENTON PLP $f0│$f9  电脑左  $f0│       │::  ;:10200$f0   :│$fC榜$f9 玩家SYBN $f00  $f2+0$fC=$f00  $f0│$f22010-3-20  按F1查看帮助$f0│$fD 叫分 3分 $f0│       │:   ;
pause>nul
exit
:SYBA
(CHCP 437 &GRAFTABL 936)>NUL
ECHO {SYBN DLL %SYBNV% } 内含SYBC 1.1.31 初始化,按任意键继续...
(echo a100&echo db B8 00 00 cd 16 cd 20&echo.&echo.rcx&echo.7&echo.g&echo.q)|DEBUG>NUL
GOTO :EOF
:SYBC
SET SYBCOM=A100`80BE AC00 3C 375 83E9 3C00 ACFF 4275`2CBE AC00 E08A 86AC 50C4 BE1F 0 3CAC`7553 ACFB 593C F675 3CAC 7542 ACF1 433C`EC75 3CAC 7553 ACE7 3D3C E275 14EB 3CAC`743A 3C0F 740D 3C4D 7400 8349 1EE 48EB`54B4 E8AC 93 ADE8 3C00 7F18 8A37 E8F0`87 A1E8 3C00 7F4F 8A2B B0D0 F602 50E2`A0B0 E6F6 35F 57F8 3CAC 7424 E80A 6A`49E8 8A00 EBCA E817 3F CA8A 10EB B0`16CD C48A 4CB4 21CD 815F A0C7 5700 B850`B800 750 2B5A 8AEE ACD1 243C D974 3B3C`8C74 D3C DE74 3C DA74 233C 575 D783`EB01 AA01 C28A EBAA E8E0 1D 3C93 7E39`402 8009 39FB 37E C380 2409 800F FE3`10B2 E2F6 C302 D08A ACC3 203C FB74 D3C`A274 3C 9E74 D88A 3CAC 7420 3CEC 740D`3C93 7400 C38F 2C93 8030 30EB AB4 E4F6`C302 C3`
set SYBCS=%*
SET V=`A80`DB FF``RCX`120`g`Q
(ECHO.%SYBCOM:`=&ECHO.DW %&ECHO.%V:`=&ECHO.%)|DEBUG>nul
goto :EOF
[ Last edited by sl543001 on 2010-3-31 at 19:00 ]



SYBNQQ:354324773
2010-3-31 18:57
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




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

1.1.31初步测试未发现BUG,正计划添加新功能:鼠标支持,延时



SYBNQQ:354324773
2010-4-3 03:25
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 14 楼』:  新教程及五子棋脚本开发实例

http://www.cn-dos.net/forum/viewthread.php?tid=50950&fpage=1



SYBNQQ:354324773
2010-4-18 23:09
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




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

逐行注释了一部分汇编源代码:
;sybc 基于x86的16位彩色字符输出 v 1.1.32
;参数列表:
;1.无参数
;    示例: sybc
;    调用:当命令行调用时没有附加参数或debug调用时0080数据为"00"时,启用choice功能,
;    作用:暂停命令行并等待用户输入一个键盘按键,对shift等键无效,对esc,f1,空格.回车等键有效
;    技术:在[标签choice],调用中断15,并使al=ah,退出返回al到erroelrvrer
;2.标准方式
;    示例: sybc 10000$f1sybn$f22010          sybc 10000$f1sybn;$f22010;:10308f4sybn
;          set v=`a80`db 10 0d "%sybcc%" 0d``rcx`ff`g`q
;          (echo.%sybcom:`=&echo.dw %&echo.%v:`=&echo.%)|debug>nul
;    调用:当命令行调用时加有参数或debug调用时0080不为"00"且0081不为"01"时启用,
;    作用:在一行(无分号)或多行(有分号)或不连续位置(有分号冒号)输出
;    技术:首先读取一个坐标信息[标签hqzb]读取5字节),
;         然后读取一个颜色信息[标签dcx]一个美元符加上2字节颜色信息,这里的美元符可省略
;         然后读取数据并以之前的颜色信息输出到b800显示缓存,从而显示在字符界面上
;         直到遇到控制字符停止,控制字符有:
;                 {24 "$"}颜色标记符 程序遇到[颜色标记符]则跳转到[标签color],读取2字节颜色信息,仅有紧跟坐标信息的[颜色标记符]可省略
;                 {3b ";"}换行标记符 程序遇到[换行标记符]则跳转到[标签wz],则换行,除非跟[起始标记符]{3a ":"}连用
;                 {23 "#"}跳过标记符 程序遇到[跳过标记符]则给di加1,从而保留一个字符,仅改变颜色,不修改#所在位置的原内容
;                 {0d " "}结束标记符 程序遇到[换行标记符]则结束程序
;                 {3a ":"}起始标记符 仅限于与[换行标记符]连用有效,跳转到[标签hqzb],从新读取一个坐标颜色信息执行,可用于连接2个sybc命令
;    注意:理论利用";:"可以无线连接sybc,但参数长度有124限制
;3.debug专有模式
;    示例:set v=`a80`db ff``a282`db "%sybcc:~0,75%"`db "%sybcc:~75,75%"`db "%sybcc:~150,75%"`db "%sybcc:~225,75%"`db 0d``rcx`ff`g`q
;         (echo.%sybcom:`=&echo.dw %&echo.%v:`=&echo.%)|debug>nul
;    调用:仅限于debug调用,在0080位置写入ff,在0282位置写入参数,从而跳过124参数极限,示例代码的参数极限被扩展到300
;    技术:在修读取时发现0080=ff则修改参数入口为0282,正常调用时不可能出现0080=ff
;    注意:如有需要可修改示例代码进一步扩展参数极限
                                
                mov si,0080     ;设置SI=0080                    修改指针地址为0080             参数入口
                mov DX,0000     ;设置DX=0000
                lodsb           ;读取DS:SI指针地址的数据到AL    此时SI=0080
                mov ah,al       ;设置AH=AL                      AL=从0080读取到的数据
                lodsb           ;读取DS:SI指针地址的数据到AL    此时SI=0081
                lodsb           ;读取DS:SI指针地址的数据到AL    此时SI=0082
                mov BL,al       ;设置BL=AL                      AL=从0082读取到的数据
                cmp ah,00       ;比较 Ah的值 和 0               此时Ah=0080的值
                jz #TOchoice    ;相等则跳转到标签TOchoice       用以获取键盘输入
                cmp ah,ff       ;比较 Ah的值 和 FF              此时Ah=0080的值
                mov si,0082     ;修改指针地址为0082             从而跳过0081
                jnz #hqzb       ;不等则跳转到标签hqzb           获取输出坐标
                mov si,002c     ;设置SI=0080                    修改指针为002c                 内存变量段地址
                lodsb           ;读取DS:SI指针地址的数据到AL    此时SI=002c
                mov ah,al       ;设置AH=AL                      AL=读取到的数据
                lodsb           ;读取DS:SI指针地址的数据到AL    此时SI=002d
                xchg al,ah      ;交换AL和AH                     
                push ax         ;把数据压入堆扎                 AX被压入堆扎
                pop ds          ;把数据压出堆扎                 DS=刚才上一行的AX
                mov si,0000     ;设置SI=0080                    修改指针为0000                 因为要从内存变量段的开头搜索变量
#SSBL
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,53       ;比较Al和53                     53="S"
                jnz #SSBL       ;不同则跳转到标签SSBL
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,59       ;比较Al和59                     53="Y"
                jnz #SSBL       ;不同则跳转到标签SSBL
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,42       ;比较Al和42                     53="B"
                jnz #SSBL       ;不同则跳转到标签SSBL
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,43       ;比较Al和43                     53="C"
                jnz #SSBL       ;不同则跳转到标签SSBL
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,53       ;比较Al和53                     53="S"
                jnz #SSBL       ;不同则跳转到标签SSBL
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,3d       ;比较Al和3d                     53="="
                jnz #SSBL       ;不同则跳转到标签SSBL
                jmp #hqzb       ;无条件跳转到标签hqzb           如果满足以上条件则 获取输出坐标
#TOchoice
                JMP #choice     ;无条件跳转到标签choice         条件寻址是短寻址,够不到choice只能用JMP中转一下
;读取到分号后的处理
#wz
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,3a       ;比较Al和3a                     3a=":"
                jz #hqzb        ;相同则跳转到标签hqzb           为:则读取新坐标
                cmp al,0d       ;比较Al和0d                     OD=结束符
                jz #quit        ;相同则跳转到标签quit           为结束符则结束
                cmp al,00       ;比较Al和0                      3a=空
                jz #quit        ;相同则跳转到标签quit           为结束符则结束
                sub si,01       ;设置SI减1
                jmp #xhn        ;无条件跳转到标签XHN            其他则换行继续
;读取坐标信息,存放到di
#hqzb
                lodsb           ;读取DS:SI指针地址的数据到AL    跳过一个字符
                                ;键将来要在这里添加一些内容
                call #DQ2SJ     ;调用子程序DQ2SJ                读取2个数据
                call #ZH10JZ    ;调用子程序ZH10JZ               转换为10进制
                cmp al,18       ;比较Al和18                     AL是刚获得的行号
                jg #quit        ;大于则跳转到标签QUIT           行数超过24则结束
                mov dh,al       ;设置DH=AL                      保存行号到DH
                call #DQ2SJ     ;调用子程序DQ2SJ                读取2个数据
                call #ZH10JZ    ;调用子程序ZH10JZ               转换为10进制
                cmp al,4f       ;比较Al和4f                     AL是刚获得的列号
                jg #quit        ;大于则跳转到标签QUIT           行数超过80则结束
                mov dl,al       ;设置DL=AL                      保存列号到DL
;把来源于DH和DL的行列坐标转换为内存地址并保存到DI
#ZBZH
                mov al,02       ;
                mul dl          ;
                push ax         ;
                mov al,a0       ;
                mul dh          ;
                pop di          ;
                add di,ax       ;
                push di         ;
;读取颜色信息
#dcx
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,24
                jz #color       ;为$则跳过从新读取
                call #DQ2SJ0    ;不为$则正常读取
                call #dc0
                mov cl,dl
                jmp #dwz
#color
                call #dc
                mov cl,dl
                jmp #dwz
;choice功能
#choice
                mov al,0
                int 16
                mov al,ah
;退出
#quit
                mov ah,4c
                int 21
;换行并从原起点继续
#xhn
                pop di
                add di,a0
                push di
;定位字符输出位置
#dwz
                push ax
                mov ax,b800
                push ax
                pop es
                pop dx
                sub bp,si
                mov dl,cl
;写入数据
#xr
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,24
                jz #color                ;为$则读取新的颜色信息
                cmp al,3b
                jz #wz                ;为;则结束,再次从头执行
                cmp al,0d
                jz #quit                ;为结束符则结束
                cmp al,0
                jz #quit                ;为结束符则结束
                cmp al,23
                jnz #xr2                ;为#则
                adc di,1
                jmp #xr3
#xr2
                stosb                ;写入一个数据
#xr3
                mov al,dl
                stosb                ;写入颜色信息
                jmp #xr
;读取2个字节的字符内容,转换为颜色信息
#dc
                call #DQ2SJ
#dc0
                xchg ax,bx
                cmp al,39
                jle #dc1
                add al,9
#dc1
                cmp bl,39
                jle #dc2
                add bl,9
#dc2
                and al,0f
                and bl,0f
                mov dl,10
                mul dl
                add al,bl
                mov dl,al
                ret
;读取2个字节的内容
#DQ2SJ
                lodsb           ;读取DS:SI指针地址的数据到AL
#DQ2SJ0
                cmp al,20
                jz #DQ2SJ
                cmp al,0d
                jz #quit                ;为结束符则结束
                cmp al,0
                jz #quit                ;为结束符则结束
                mov bl,al
#DQ2SJ1
                lodsb           ;读取DS:SI指针地址的数据到AL
                cmp al,20
                jz #DQ2SJ
                cmp al,0d
                jz #quit                ;为结束符则结束
                cmp al,0
                jz #quit                ;为结束符则结束
                ret
;10进制字符转16进制数字
#ZH10JZ
                xchg ax,bx
                sub al,30
                sub bl,30
                mov ah,0a
                mul ah
                add al,bl
                ret  




SYBNQQ:354324773
2010-4-19 21:28
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: