一直觉得这个有纪念价值的,现在居然找回来了。先帖一篇,然后打包放到网上硬盘备份!
看了下文件日期,2004.2.15,情人节之后一天,那时候我在做什么啊……
$Segmented
$Mod167
;2004.2.9倒计时显示程序,基础:贪睡猫时钟(数字够小,才够显示)
;2004.3.15 15:55完成
;汇编是自考时学的,且学得并不太好,又忘了不少,因此代码可能有错误或是质量差,
;欢迎提出意见
;修改了原来显示冒号结尾处的代码跳转到本代码,如下:
;0x27D1EE: BB01 BB20
;需改进:日期计算不准确的问题
;说明:日期更换以“日”为标准,因此只改月会被认为并未修改日期,不会刷新。
;Some Function
DrawImageByIndex EQU 0xB3DF04
CalcClockNum EQU 0xC7D1F2
;Some Var
Day EQU 25E0H ;0D:25E0
Month EQU 25E2H
Year EQU 25E4H
;全局变量
DayCount EQU 3E30H ;34:3E30
DateToday EQU 3E32H
;Some Address
PatchBegin EQU 0xC7D230 ;从0xC7D230开始,前面留10B空间 31F:1230
patch section code word AT PatchBegin
fun1 proc far
;Add your Code Here
callr CalcClockNum ;补原指令,来自DrawMaoHao,显示后两位
MOV [-R0],R4
MOV [-R0],R7
MOV [-R0],R8
MOV [-R0],R9
MOV [-R0],R12
MOV [-R0],R13
MOV [-R0],R14
extp #0DH,#3
mov r14,Day ;调用获取日期
mov r13,Month
mov r12,Year
extp #34H,#1
cmp r14,DateToday ;测试是否今天
jmpr cc_Z,IsToday ;是今天转(不需计算)CC_Z
;计算天数并存入全局变量
mov r9,#13H ;日19 依次为直接装入日、月、年
mov r8,#14H ;月4 注:为修改方便编译时改为了14H,以产生 0014更易修改
mov r7,#07D4H ;2004年
sub r7,r12 ;年份相减入r7
jmpr cc_ULT,Error
mov r4,#0CH ;乘以12,得月数
mulu r7,r4
mov r7,MDL ;得到年折算月份
add r8,r7 ;月数累加到r8
sub r8,r13 ;月份相减入r8
jmpr cc_ULT,Error
mov r4,#1EH ;乘以30,得天数
mulu r8,r4
mov r8,MDL ;得到月折算天数
add r9,r8 ;加入到最后月日期,再减今天
sub r9,r14 ;最终天数存入R9
jmpr cc_ULT,Error ;同月但天数更少,转出错
cmp r9,#3E8H ;与1000天比较
jmpr cc_ULT,NoError ;不大于1000,正常转出
Error: ;出错,(天数大于1000/日期超过),置为0
mov r9,#0
NoError:
extp #34H,#2
mov DayCount,r9
mov DateToday,r14 ;计算成功,把“今天”和“天数”存起来。
IsToday: ;取各位数字。先百位。
extp #34H,#1
mov r9,DayCount
mov r7,#0 ;百位先初始化为0
cmp r9,#64H ;与100比较
jmpr cc_ULT,Less100
mov r7,#64H
mov MDL,r9 ;除以100
divu r7
mov r9,MDH
mov r7,MDL
extp #34H,#2
Less100:
mov r8,#0 ;十位先初始化为0
cmp r9,#0AH ;与10比较-----
jmpr cc_ULT,Less10
mov r8,#0AH ;除以10
mov MDL,r9 ;同上保存
divu r8
mov r9,MDH
mov r8,MDL
extp #34H,#2
Less10:
Show:
;开始显示,分别检测百、十、个位为0是否该显示
cmp r7,#0
jmpr cc_EQ,ShowTen ;百位为0不显
mov r12,#10H ;显示百位
mov r13,#20H ;位置X=16,Y=32
mov r14,r7
add r14,#3BH ;59+i,就是数字几
calls seg(DrawImageByIndex),sof(DrawImageByIndex);
jmpr cc_UC,MustShowTen ;百数不为0,十位必须显示
ShowTen:
cmp r8,#0
jmpr cc_EQ,ShowOne ;百、十位均为0,十位也不显
MustShowTen:
mov r12,#1CH ;十位X=16+12=28
mov r13,#20H ;Y=32
mov r14,r8
add r14,#3BH ;59+i,就是数字几
calls seg(DrawImageByIndex),sof(DrawImageByIndex);
ShowOne:
mov r12,#28H ;个位X=16+12+12=40
mov r13,#20H ;Y=32
mov r14,r9
add r14,#3BH ;59+i,就是数字几
calls seg(DrawImageByIndex),sof(DrawImageByIndex);
Exit: ;本来这前面段准备做个循环的,结果一直弄不好,就干脆直接写了。
;且r12、r13不能公用,大概DrawImage中修改了它。
;显示完了,还能做什么?恢复打理一下回去了!
MOV R14,[R0+]
MOV R13,[R0+]
MOV R12,[R0+]
MOV R9,[R0+]
MOV R8,[R0+]
MOV R7,[R0+]
MOV R4,[R0+]
return:rets ;此处改为RET仍然编译为DB 00,大约是作为一个程序来编译的,要将
fun1 endp ;编译结果改为CB 00,不然会死机。
patch ends
End
$Mod167
;2004.2.9倒计时显示程序,基础:贪睡猫时钟(数字够小,才够显示)
;2004.3.15 15:55完成
;汇编是自考时学的,且学得并不太好,又忘了不少,因此代码可能有错误或是质量差,
;欢迎提出意见
;修改了原来显示冒号结尾处的代码跳转到本代码,如下:
;0x27D1EE: BB01 BB20
;需改进:日期计算不准确的问题
;说明:日期更换以“日”为标准,因此只改月会被认为并未修改日期,不会刷新。
;Some Function
DrawImageByIndex EQU 0xB3DF04
CalcClockNum EQU 0xC7D1F2
;Some Var
Day EQU 25E0H ;0D:25E0
Month EQU 25E2H
Year EQU 25E4H
;全局变量
DayCount EQU 3E30H ;34:3E30
DateToday EQU 3E32H
;Some Address
PatchBegin EQU 0xC7D230 ;从0xC7D230开始,前面留10B空间 31F:1230
patch section code word AT PatchBegin
fun1 proc far
;Add your Code Here
callr CalcClockNum ;补原指令,来自DrawMaoHao,显示后两位
MOV [-R0],R4
MOV [-R0],R7
MOV [-R0],R8
MOV [-R0],R9
MOV [-R0],R12
MOV [-R0],R13
MOV [-R0],R14
extp #0DH,#3
mov r14,Day ;调用获取日期
mov r13,Month
mov r12,Year
extp #34H,#1
cmp r14,DateToday ;测试是否今天
jmpr cc_Z,IsToday ;是今天转(不需计算)CC_Z
;计算天数并存入全局变量
mov r9,#13H ;日19 依次为直接装入日、月、年
mov r8,#14H ;月4 注:为修改方便编译时改为了14H,以产生 0014更易修改
mov r7,#07D4H ;2004年
sub r7,r12 ;年份相减入r7
jmpr cc_ULT,Error
mov r4,#0CH ;乘以12,得月数
mulu r7,r4
mov r7,MDL ;得到年折算月份
add r8,r7 ;月数累加到r8
sub r8,r13 ;月份相减入r8
jmpr cc_ULT,Error
mov r4,#1EH ;乘以30,得天数
mulu r8,r4
mov r8,MDL ;得到月折算天数
add r9,r8 ;加入到最后月日期,再减今天
sub r9,r14 ;最终天数存入R9
jmpr cc_ULT,Error ;同月但天数更少,转出错
cmp r9,#3E8H ;与1000天比较
jmpr cc_ULT,NoError ;不大于1000,正常转出
Error: ;出错,(天数大于1000/日期超过),置为0
mov r9,#0
NoError:
extp #34H,#2
mov DayCount,r9
mov DateToday,r14 ;计算成功,把“今天”和“天数”存起来。
IsToday: ;取各位数字。先百位。
extp #34H,#1
mov r9,DayCount
mov r7,#0 ;百位先初始化为0
cmp r9,#64H ;与100比较
jmpr cc_ULT,Less100
mov r7,#64H
mov MDL,r9 ;除以100
divu r7
mov r9,MDH
mov r7,MDL
extp #34H,#2
Less100:
mov r8,#0 ;十位先初始化为0
cmp r9,#0AH ;与10比较-----
jmpr cc_ULT,Less10
mov r8,#0AH ;除以10
mov MDL,r9 ;同上保存
divu r8
mov r9,MDH
mov r8,MDL
extp #34H,#2
Less10:
Show:
;开始显示,分别检测百、十、个位为0是否该显示
cmp r7,#0
jmpr cc_EQ,ShowTen ;百位为0不显
mov r12,#10H ;显示百位
mov r13,#20H ;位置X=16,Y=32
mov r14,r7
add r14,#3BH ;59+i,就是数字几
calls seg(DrawImageByIndex),sof(DrawImageByIndex);
jmpr cc_UC,MustShowTen ;百数不为0,十位必须显示
ShowTen:
cmp r8,#0
jmpr cc_EQ,ShowOne ;百、十位均为0,十位也不显
MustShowTen:
mov r12,#1CH ;十位X=16+12=28
mov r13,#20H ;Y=32
mov r14,r8
add r14,#3BH ;59+i,就是数字几
calls seg(DrawImageByIndex),sof(DrawImageByIndex);
ShowOne:
mov r12,#28H ;个位X=16+12+12=40
mov r13,#20H ;Y=32
mov r14,r9
add r14,#3BH ;59+i,就是数字几
calls seg(DrawImageByIndex),sof(DrawImageByIndex);
Exit: ;本来这前面段准备做个循环的,结果一直弄不好,就干脆直接写了。
;且r12、r13不能公用,大概DrawImage中修改了它。
;显示完了,还能做什么?恢复打理一下回去了!
MOV R14,[R0+]
MOV R13,[R0+]
MOV R12,[R0+]
MOV R9,[R0+]
MOV R8,[R0+]
MOV R7,[R0+]
MOV R4,[R0+]
return:rets ;此处改为RET仍然编译为DB 00,大约是作为一个程序来编译的,要将
fun1 endp ;编译结果改为CB 00,不然会死机。
patch ends
End
L.S当时写了个更大的程序,在这里:
http://www.cnblogs.com/lishenglyx/archive/2008/11/09/1329969.html