- 积分
- 207
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
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 编辑 ] |
|