爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 7533|回复: 4
收起左侧

[Flash修改] 快速切换输入法[未完成版]希望有人完成

[复制链接]
发表于 2005-11-27 23:03:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
2128可以使用"#"号键短按和长按进行输入法切换,在短按切换的时候,输入法依据
;"拼音(或其它中文输入法,我没有测试)->abc->Abc->T9abc->T9Abc->123"
;的顺序进行切换,共有6种输入法(不包括其它中文输入法)。长按方式则可以进行所
;有的9种输入法切换。由于短按输入法种类太多,切换起来比较麻烦。虽然可以设置
;不要T9英文输入法,但实际上无效!

大约在一年还是两年前从m55那边移植了快速切换输入法得补丁,希望可以用来设置短按#出现得输入法,而长按则不受影响。

当时远帆(原作者)发布这个补丁时候还提供了源代码,并进行了些简单得说明。自认为好像已经看懂,急急忙忙就改了补丁,测试了半天也不成功,不知道什么地方出了问题。

本来这次小2 当机,想一鼓作气把这个补丁也完善,结果还是因为某些原因,没有能拿出手,也算是个遗憾:(

虽然以前我也贴出过源代码(比如扩增电话本,未接提醒什么),等了相当长时间没人理会,而且最终还是我自己写完-_-#。但是我还是决定把我这个未完成得补丁贴出来,希望有兴趣得机油能够继续。


在测试过程中,我看了下小2与s57相类似得程序,已经可以去掉T9只剩下123 abc ABC 拼音四种,

但是还是没做到原补丁得效果我也不知道哪里有问题。



下面贴出远帆得原代码

使用方法:
;在补丁起始的18个字节是输入法启用与否标志,每个输入法占用两个字节(也就4个
;数字),0100代表使用,0000代表不使用。这9种输入法默认设置为:
;dw 0001h;拼音
;dw 0000h;简体笔划
;dw 0000h;注音
;dw 0000h;繁体笔划
;dw 0001h;abc
;dw 0000h;Abc
;dw 0000h;T9abc
;dw 0000h;T9Abc
;dw 0001h;123
;也即是在默认输入法情况下,只有拼音、abc、123输入法是可用的。
;如果你希望拼音、abc、T9abc、123可用,那么补丁的头3行应该改为:
;0100 拼音 0000 简体笔划 0000 注音 0000 繁体笔划
;0100 abc 0000 Abc 0100 T9abc 0000 T9Abc
;0100 123




[S57V18]
;5D5440:06F00A00 FAAB528B
;6B8B40:FFFFFFFFFFFFFFFF 0100000000000000
;6B8B48:FFFFFFFFFFFFFFFF 0100000000000000
;6B8B50:FFFFFFFFFFFFFFFF 010006F00A00ECF1
;6B8B58:FFFFFFFFFFFFFFFF ECF2ECF3ECF4ECF5
;6B8B60:FFFFFFFFFFFFFFFF ECF6A810D4300600
;6B8B68:FFFFFFFFFFFFFFFF 48163D0546F3FFFF
;6B8B70:FFFFFFFFFFFFFFFF 3D02E0040D3746F1
;6B8B78:FFFFFFFFFFFFFFFF 08003D0546F3FFFF
;6B8B80:FFFFFFFFFFFFFFFF 3D02E0240D2F4815
;6B8B88:FFFFFFFFFFFFFFFF 3D0546F3FFFF3D02
;6B8B90:FFFFFFFFFFFFFFFF E0440D2848173D05
;6B8B98:FFFFFFFFFFFFFFFF 46F3FFFF3D02E064
;6B8BA0:FFFFFFFFFFFFFFFF 0D2148113D044830
;6B8BA8:FFFFFFFFFFFFFFFF 3D02E0840D1B4811
;6B8BB0:FFFFFFFFFFFFFFFF 3D0448313D02E0A4
;6B8BB8:FFFFFFFFFFFFFFFF 0D1548143D044830
;6B8BC0:FFFFFFFFFFFFFFFF 3D02E0C40D0F4814
;6B8BC8:FFFFFFFFFFFFFFFF 3D0448313D02E0E4
;6B8BD0:FFFFFFFFFFFFFFFF 0D0946F110003D05
;6B8BD8:FFFFFFFFFFFFFFFF 46F3FFFF3D02E084
;6B8BE0:FFFFFFFFFFFFFFFF 0D01E004F014D740
;6B8BE8:FFFFFFFFFFFFFFFF AE02D421400B4821
;6B8BF0:FFFFFFFFFFFFFFFF 2D55081246F11200
;6B8BF8:FFFFFFFFFFFFFFFF 9D0940142D4FD740
;6B8C00:FFFFFFFFFFFFFFFF AE02D421400B4821
;6B8C08:FFFFFFFFFFFFFFFF 2D030DF3E0010DF5
;6B8C10:FFFFFFFFFFFFFFFF 48103D06E061E6F2
;6B8C18:FFFFFFFFFFFFFFFF FFFFE6F3FFFF0D39
;6B8C20:FFFFFFFFFFFFFFFF 48123D06E081E6F2
;6B8C28:FFFFFFFFFFFFFFFF FFFFE6F3FFFF0D31
;6B8C30:FFFFFFFFFFFFFFFF 48143D06E051E6F2
;6B8C38:FFFFFFFFFFFFFFFF FFFFE6F3FFFF0D29
;6B8C40:FFFFFFFFFFFFFFFF 48163D06E071E6F2
;6B8C48:FFFFFFFFFFFFFFFF FFFFE6F3FFFF0D21
;6B8C50:FFFFFFFFFFFFFFFF 46F108003D04E011
;6B8C58:FFFFFFFFFFFFFFFF E002E0030D1A46F1
;6B8C60:FFFFFFFFFFFFFFFF 0A003D04E011E002
;6B8C68:FFFFFFFFFFFFFFFF E0130D1346F10C00
;6B8C70:FFFFFFFFFFFFFFFF 3D04E041E002E003
;6B8C78:FFFFFFFFFFFFFFFF 0D0C46F10E003D04
;6B8C80:FFFFFFFFFFFFFFFF E041E002E0130D05
;6B8C88:FFFFFFFFFFFFFFFF E001E6F2FFFFE6F3
;6B8C90:FFFFFFFFFFFFFFFF FFFFB810C4200A00
;6B8C98:FFFFFFFFFFFFFFFF C4300600FCF6FCF5
;6B8CA0:FFFFFFFFFFFFFFFF FCF4FCF3FCF2FCF1
;6B8CA8:FFFFFFFF FA9D4454

看了大概得步骤,根据自己的理解大意是r0传入得数值表示当时切换倒的输入法,每个输入法有相对的R0值,比如6 8 之类

远帆的程序开始先将r0进行运算,赋值给r1和r3
然后判断目前的切到输入法
比如所这句话
;cmp r1,#06h  比较R1数值是不是06,R1值来自R0,间接反映R0
;jmpr cc_NZ,IB

是判断当时是不是按到拼音输入,代码数字是06 。如果不是,则跳到下面一段判断是否
是简体笔画,代码08

;cmp r3,#0FFFFh( -1) r3 的作用是区别abc和Abc ,t9abc 和 t9 Abc,比如
;cmp r1,#01h
;jmpr cc_NZ,IF
;cmp r3,#00  如果 r1 是01则有可能是abc或者Abc,则需要判断r3,如果r3 是0则是abc如果是1则是Abc

程序的步骤大概是,先判断传入r1,确定目前是什么输入法,确定后进行一个判断是否此输入法是否允许可用的操作。

程序采取的是取地址的步骤,(可以修改程序不用取地址,后话)
举例:
;mov r1,r4
;extp #2AEh,#1 ;100
;mov r2,[r1+#0B40h] ;1F60

这个就是将2A3×4000+0b40处的值赋值给r2,(如果当时输入法是拼音),则传入的是6B8B40处,事先我们输好的数字,这里是01

赋值后,将r2和1比较,如果传入数字是1则输入法可用,直接跳转倒程序结束。

如果R2是0(比如目前输入法是简体笔画,既不允许的情况),程序将调整的值,进行搜索,每次步进2,是个循环语句,从6B8B40开始每次加2,直到找到第一个01为止,默认程序第一个01是abc。

当找到abc的值后,程序要做的是将原来r0的传入值(原来是简体笔画,假设r1是08)改为abc的R0值(假设代表r1是1),在程序中就是通过update那个程序段进对R1和R3重新赋值。因为程序最后会将r1和r3赋值给r0,这个时候r0的值就从原来拼音代表的值(假设是2)变为abc代表的r0值(假设是3),以达到切换目的。

S57采用的是fa,但是我测试的情况是fa跳转不如da好,可以修改一下,反正目的差不多




;Data_Define:
;dw 01h;拼音
;dw 00h;简体笔划
;dw 00h;注音
;dw 00h;繁体笔划
;dw 01h;abc
;dw 00h;Abc
;dw 00h;T9abc
;dw 00h;T9Abc
;dw 01h;123
;
;Old_Sequence:
;add r0, #0Ah
;
;
;Program_Start:
;Data_Prepare:
;push r1
;push r2
;push r3
;push r4
;push r5
;push r6
;
;mov r1,[r0]
;;mov r3,[r0+06h];D4300600
;db 0D4h
;db 030h
;db 006h
;db 000h
;
;
;Input_Check:
;IA: ;拼音
;cmp r1,#06h
;jmpr cc_NZ,IB
;cmp r3,#0FFFFh
;jmpr cc_NZ,IB
;mov r4,#00h
;jmpr cc_UC,TransLate
;IB: ;简体笔划
;cmp r1,#08h
;jmpr cc_NZ,IC
;cmp r3,#0FFFFh
;jmpr cc_NZ,IC
;mov r4,#02h
;jmpr cc_UC,TransLate
;IC: ;注音
;cmp r1,#05h
;jmpr cc_NZ,ID
;cmp r3,#0FFFFh
;jmpr cc_NZ,ID
;mov r4,#04h
;jmpr cc_UC,TransLate
;ID: ;繁体笔划
;cmp r1,#07h
;jmpr cc_NZ,IE
;cmp r3,#0FFFFh
;jmpr cc_NZ,IE
;mov r4,#06h
;jmpr cc_UC,TransLate
;IE: ;abc
;cmp r1,#01h
;jmpr cc_NZ,IF
;cmp r3,#00h
;jmpr cc_NZ,IF
;mov r4,#08h
;jmpr cc_UC,TransLate
;IF: ;Abc
;cmp r1,#01h
;jmpr cc_NZ,IG
;cmp r3,#01h
;jmpr cc_NZ,IG
;mov r4,#0Ah
;jmpr cc_UC,TransLate
;IG: ;T9abc
;cmp r1,#04h
;jmpr cc_NZ,IH
;cmp r3,#00h
;jmpr cc_NZ,IH
;mov r4,#0Ch
;jmpr cc_UC,TransLate
;IH: ;T9Abc
;cmp r1,#04h
;jmpr cc_NZ,II
;cmp r3,#01h
;jmpr cc_NZ,II
;mov r4,#0Eh
;jmpr cc_UC,TransLate
;II: ;123
;cmp r1,#10h
;jmpr cc_NZ,IJ
;cmp r3,#0FFFFh
;jmpr cc_NZ,IJ
;mov r4,#8h
;jmpr cc_UC,TransLate
;IJ: ;错误的输入法,缺省为拼音
;mov r4,#0000h
;
;
;TransLate: ;查找可用输入法
;mov r1,r4
;extp #2AEh,#1 ;100
;mov r2,[r1+#0B40h] ;1F60
;cmp r2,#1h
;jmpr cc_Z,Return ;允许此种输入法则直接退出
;
;
;Seek_Next_Input:
;add r1,#2h ;下一输入法
;cmp r1,#12h ;越界情况
;jmpr cc_UGE,Adjust
;Continue:
;cmp r1,r4
;jmpr cc_Z,Return ;说明没有任何一种输入法可用,出现死循环
;extp #2AEh,#1 ;已调整
;mov r2,[r1+#0B40h] ;已调整
;cmp r2,#1h
;jmpr cc_Z,ChangeSet ;允许此种输入法则直接退出
;jmpr cc_UC,Seek_Next_Input
;Adjust:
;mov r1,#0
;jmpr cc_UC,Continue
;
;
;ChangeSet: ;需要对输入法进行调整
;CA: ;拼音
;cmp r1,#00h
;jmpr cc_NZ,CB
;mov r1,#06h
;mov r2,#0FFFFh
;mov r3,#0FFFFh
;jmpr cc_UC,Update
;CB: ;简体笔划
;cmp r1,#02h
;jmpr cc_NZ,CC
;mov r1,#08h
;mov r2,#0FFFFh
;mov r3,#0FFFFh
;jmpr cc_UC,Update
;CC: ;注音
;cmp r1,#04h
;jmpr cc_NZ,CD
;mov r1,#05h
;mov r2,#0FFFFh
;mov r3,#0FFFFh
;jmpr cc_UC,Update
;CD: ;繁体笔划
;cmp r1,#06h
;jmpr cc_NZ,CE
;mov r1,#07h
;mov r2,#0FFFFh
;mov r3,#0FFFFh
;jmpr cc_UC,Update
;CE: ;abc
;cmp r1,#08h
;jmpr cc_NZ,CF
;mov r1,#01h
;mov r2,#00h
;mov r3,#00h
;jmpr cc_UC,Update
;CF: ;Abc
;cmp r1,#0Ah
;jmpr cc_NZ,CG
;mov r1,#01h
;mov r2,#00h
;mov r3,#01h
;jmpr cc_UC,Update
;CG: ;T9abc
;cmp r1,#0Ch
;jmpr cc_NZ,CH
;mov r1,#04h
;mov r2,#00h
;mov r3,#00h
;jmpr cc_UC,Update
;CH: ;T9Abc
;cmp r1,#0Eh
;jmpr cc_NZ,CI
;mov r1,#04h
;mov r2,#00h
;mov r3,#01h
;jmpr cc_UC,Update
;CI: ;123
;mov r1,#00h
;mov r2,#0FFFFh
;mov r3,#0FFFFh
;
;Update:
;mov [r0],r1
;;mov [r0+0Ah],r2 ;C4200A00
;db 0C4h
;db 020h
;db 00Ah
;db 000h
;;mov [r0+06h],r3 ;C4300600
;db 0C4h
;db 030h
;db 006h
;db 000h
;
;Return:
;pop r6
;pop r5
;pop r4
;pop r3
;pop r2
;pop r1
;
;jmps 9D5444h ;9BE458


我当时按自己理解写的不需要取地址的版本,短按无论当时是什么操作法都自动切换到拼音-_-#也不知道哪个句子写错了。现在没时间,贴出来希望 大家看看,希望有人能完善

我测试的时候可以只通过修改两个字节,去掉t9但是觉得意义不大,有机会在公布吧


程序

仅供参考



437056:06F00A00 DAf90034

793400: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ecf1ecf2ecf3ecf4ecf5ecf606f00a00
793410: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF a810d430060048163d0546f3ffff3d02
793420: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e0040d4646f108003d0546f3ffff3d02
793430: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e0040d3e46f105003d0546f3ffff3d02
793440: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e0040d3646f107003d0546f3ffff3d02
793450: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e0040d2e46f101003d0546f300003d02
793460: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e0040d2646f101003d0546f301003d02
793470: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e0040d1e46f104003d0546f300003d02
793480: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e0040d1a46f104003d0546f301003d02
793490: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e0040d1246f110003d0546f3ffff3d02
7934a0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e0040d0ee061e6f2ffffe6f3ffff0d0d
7934b0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e011e002e0130d09e041e002e0030d05
7934c0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF e001e6f2ffffe6f3ffffb810c4200a00
7934d0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF c4300600fcf6fcf5fcf4fcf3fcf2fcf1
7934e0: FFFF db00


[ 本帖最后由 fef 于 2005-11-27 23:08 编辑 ]
发表于 2005-11-28 08:57:09 | 显示全部楼层
这一段正在看反汇编,感觉很郁闷。
回复 支持 反对

使用道具 举报

发表于 2005-11-28 10:53:40 | 显示全部楼层
需要重写程序吗??不能通过直接修改跳转到某一输入法地址来实现吗??算我愚味。。。。^o^
回复 支持 反对

使用道具 举报

发表于 2005-11-28 19:42:32 | 显示全部楼层
好长,看不懂
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-29 20:37:14 | 显示全部楼层
原帖由 100fun 于 2005-11-28 10:53 发表
需要重写程序吗??不能通过直接修改跳转到某一输入法地址来实现吗??算我愚味。。。。^o^

那个工作量就大了,要重新阅读小2的那段程序。。。
我测试的结果,这个地址所在的程序段是对的
修改附近的几个参数可以做到去掉t9输入法
但是不能做到abc t9Abc这样的方式

可能传人参数和s57有区别
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2025-6-12 19:43

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表