📄 sim340.s
字号:
subi R24,22 ; offset = 234
sbci R25,255
std y+1,R25
std y+0,R24
clr R18
clr R19
movw R16,R22
xcall _copy
.dbline 226
; nOffset = 18;
ldi R24,18
ldi R25,0
movw R30,R28
subi R30,148 ; addi 108
sbci R31,255
std z+1,R25
std z+0,R24
.dbline 227
; copy(pOut2,nOffset,chrTemp,0,nOff);
movw R30,R28
subi R30,46 ; addi 210
sbci R31,255
ldd R2,z+0
ldd R3,z+1
std y+5,R3
std y+4,R2
clr R2
clr R3
std y+3,R3
std y+2,R2
movw R24,R28
subi R24,4 ; offset = 252
sbci R25,255
std y+1,R25
std y+0,R24
movw R30,R28
subi R30,148 ; addi 108
sbci R31,255
ldd R18,z+0
ldd R19,z+1
movw R16,R22
xcall _copy
.dbline 228
; nOffset += nOff;
movw R30,R28
subi R30,46 ; addi 210
sbci R31,255
ldd R2,z+0
ldd R3,z+1
movw R30,R28
subi R30,148 ; addi 108
sbci R31,255
ldd R4,z+0
ldd R5,z+1
add R4,R2
adc R5,R3
movw R30,R28
subi R30,148 ; addi 108
sbci R31,255
std z+1,R5
std z+0,R4
.dbline 229
; Encode(pData,pBuf,nLen);
movw R30,R28
subi R30,173 ; addi 595
sbci R31,253
ldd R0,z+0
ldd R1,z+1
std y+1,R1
std y+0,R0
movw R18,R28
subi R18,134 ; offset = 378
sbci R19,254
movw R30,R28
subi R30,175 ; addi 593
sbci R31,253
ldd R16,z+0
ldd R17,z+1
xcall _Encode
.dbline 230
; ByteToChar(pBuf,chrTmp,nLen);
movw R30,R28
subi R30,173 ; addi 595
sbci R31,253
ldd R0,z+0
ldd R1,z+1
std y+1,R1
std y+0,R0
movw R18,R28
subi R18,248 ; offset = 8
sbci R19,255
movw R16,R28
subi R16,134 ; offset = 378
sbci R17,254
xcall _ByteToChar
.dbline 231
; copy(pOut2,nOffset,chrTmp,0,(2 * nLen));
ldi R16,2
ldi R17,0
movw R30,R28
subi R30,173 ; addi 595
sbci R31,253
ldd R18,z+0
ldd R19,z+1
xcall empy16s
std y+5,R17
std y+4,R16
clr R2
clr R3
std y+3,R3
std y+2,R2
movw R24,R28
adiw R24,8
std y+1,R25
std y+0,R24
movw R30,R28
subi R30,148 ; addi 108
sbci R31,255
ldd R18,z+0
ldd R19,z+1
movw R16,R22
xcall _copy
.dbline 232
; nOffset += (2 * nLen);
ldi R16,2
ldi R17,0
movw R30,R28
subi R30,173 ; addi 595
sbci R31,253
ldd R18,z+0
ldd R19,z+1
xcall empy16s
movw R30,R28
subi R30,148 ; addi 108
sbci R31,255
ldd R2,z+0
ldd R3,z+1
add R2,R16
adc R3,R17
movw R30,R28
subi R30,148 ; addi 108
sbci R31,255
std z+1,R3
std z+0,R2
.dbline 233
; pOut2[nOffset] = 27;//PDU编码,ESC的ASCALL是27
movw R30,R2
add R30,R22
adc R31,R23
ldi R24,27
std z+0,R24
.dbline 235
;
; *nTXLen2 = nOffset; //编码的长度
movw R30,R12
std z+1,R3
std z+0,R2
.dbline -2
L10:
adiw R28,63
adiw R28,63
adiw R28,63
adiw R28,63
adiw R28,63
adiw R28,63
adiw R28,63
adiw R28,63
adiw R28,63
adiw R28,12 ; offset = 579
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l Len 578 A[1:1]c
.dbsym l pBuf 378 A[200:200]c
.dbsym l nContent_Len 376 I
.dbsym l chrInfo 370 A[6:6]c
.dbsym l nLen_temp 368 I
.dbsym l strHead_temp 354 A[14:14]c
.dbsym l nTempLen 352 I
.dbsym l chrTemp 252 A[100:100]c
.dbsym l strHead 234 A[18:18]c
.dbsym l n 232 I
.dbsym l phoneTemp 212 A[20:20]c
.dbsym l nOff 210 I
.dbsym l nTemp 110 A[100:100]c
.dbsym l nOffset 108 I
.dbsym l chrTmp 8 A[100:100]c
.dbsym l i 6 I
.dbsym r sca_len 20 I
.dbsym l sca 605 pc
.dbsym r pOut2 22 pc
.dbsym r pOut1 10 pc
.dbsym r nTXLen2 12 pI
.dbsym r nTXLen1 14 pI
.dbsym l nLen 595 I
.dbsym l pData 593 pc
.dbsym l phonelen 591 I
.dbsym l pPhone 589 pc
.dbend
.dbfunc e copy _copy fV
; i -> R20,R21
; nLen -> R22,R23
; nStart -> R10,R11
; pOrg -> R12,R13
; nOrg -> R18,R19
; pDest -> R16,R17
.even
_copy::
xcall push_gset4
ldd R12,y+8
ldd R13,y+9
ldd R10,y+10
ldd R11,y+11
ldd R22,y+12
ldd R23,y+13
.dbline -1
.dbline 239
; }
; //将源数组的内容拷贝到目的数组
; void copy(char pDest[],int nOrg,char pOrg[],int nStart,int nLen)
; {
.dbline 241
; int i;
; for(i = 0;i < nLen;i++)
clr R20
clr R21
xjmp L50
L47:
.dbline 242
.dbline 243
movw R30,R20
add R30,R10
adc R31,R11
add R30,R12
adc R31,R13
ldd R2,z+0
movw R30,R18
add R30,R20
adc R31,R21
add R30,R16
adc R31,R17
std z+0,R2
.dbline 244
L48:
.dbline 241
subi R20,255 ; offset = 1
sbci R21,255
L50:
.dbline 241
cp R20,R22
cpc R21,R23
brlt L47
.dbline -2
L46:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbsym r nLen 22 I
.dbsym r nStart 10 I
.dbsym r pOrg 12 pc
.dbsym r nOrg 18 I
.dbsym r pDest 16 pc
.dbend
.dbfunc e ByteToChar _ByteToChar fV
; i -> R20,R21
; chrTemp -> R22
; nLen -> R10,R11
; Out -> R18,R19
; nInPut -> R16,R17
.even
_ByteToChar::
xcall push_gset3
ldd R10,y+6
ldd R11,y+7
.dbline -1
.dbline 248
; {
; pDest[nOrg + i] = pOrg[i + nStart];
; }
; }
; // 将字节处理成字符串
; void ByteToChar(char nInPut[],char Out[],int nLen)
; {
.dbline 252
; int i;
; char chrTemp;
;
; for(i = 0;i < nLen;i++)
clr R20
clr R21
xjmp L55
L52:
.dbline 253
; {
.dbline 255
; // 高字节
; chrTemp = (char)((nInPut[i] >> 4) & 0x0f);
movw R30,R20
add R30,R16
adc R31,R17
ldd R22,z+0
clr R23
asr R23
ror R22
asr R23
ror R22
asr R23
ror R22
asr R23
ror R22
andi R22,15
andi R23,0
.dbline 256
; if(chrTemp >= 0 && chrTemp <= 9) chrTemp += 48;
cpi R22,0
brlo L56
ldi R24,9
cp R24,R22
brlo L56
.dbline 256
subi R22,208 ; addi 48
xjmp L57
L56:
.dbline 257
; else chrTemp += 55;
subi R22,201 ; addi 55
L57:
.dbline 258
; Out[i] = chrTemp;
movw R30,R20
add R30,R18
adc R31,R19
std z+0,R22
.dbline 261
;
; // 低字节
; chrTemp = (char)(nInPut[i] & 0x0f);
movw R30,R20
add R30,R16
adc R31,R17
ldd R22,z+0
clr R23
andi R22,15
andi R23,0
.dbline 262
; if(chrTemp >= 0 && chrTemp <= 9) chrTemp += 48;
cpi R22,0
brlo L58
ldi R24,9
cp R24,R22
brlo L58
.dbline 262
subi R22,208 ; addi 48
xjmp L59
L58:
.dbline 263
; else chrTemp += 55;
subi R22,201 ; addi 55
L59:
.dbline 264
movw R30,R20
add R30,R18
adc R31,R19
std z+0,R22
.dbline 265
L53:
.dbline 252
subi R20,255 ; offset = 1
sbci R21,255
L55:
.dbline 252
cp R20,R10
cpc R21,R11
brge X2
xjmp L52
X2:
.dbline 267
; Out[i] = chrTemp;
; }
;
; return;
.dbline -2
L51:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbsym r chrTemp 22 c
.dbsym r nLen 10 I
.dbsym r Out 18 pc
.dbsym r nInPut 16 pc
.dbend
.dbfunc e IntToChar _IntToChar fI
; i -> <dead>
; nLen -> R20,R21
; chrTemp3 -> R10
; chrTemp2 -> R12
; chrTemp1 -> R14
; Out -> R22,R23
; n -> R20,R21
.even
_IntToChar::
xcall push_gset5
movw R22,R18
movw R20,R16
.dbline -1
.dbline 271
; }
; // 数的范围为250以内
; int IntToChar(int n,char Out[])
; {
.dbline 278
; int i;
; char chrTemp1;
; char chrTemp2;
; char chrTemp3;
; int nLen;
;
; chrTemp1 = n / 100;
ldi R18,100
ldi R19,0
movw R16,R20
xcall div16s
mov R14,R16
.dbline 279
; chrTemp2 = (n - chrTemp1 * 100) / 10;
ldi R24,100
mul R24,R14
movw R16,R20
sub R16,R0
sbc R17,R1
ldi R18,10
ldi R19,0
xcall div16s
mov R12,R16
.dbline 280
; chrTemp3 = n - chrTemp1 * 100 - chrTemp2 * 10;
ldi R24,100
mul R24,R14
mov R10,R20
sub R10,R0
sbc R11,R1
ldi R24,10
mul R24,R12
sub R10,R0
sbc R11,R1
.dbline 281
; if(chrTemp1 != 0)
tst R14
breq L61
.dbline 282
; {
.dbline 283
; nLen = 3;
ldi R20,3
ldi R21,0
.dbline 284
; Out[0] = chrTemp1 + 0x30;
mov R24,R14
subi R24,208 ; addi 48
movw R30,R22
std z+0,R24
.dbline 285
; Out[1] = chrTemp2 + 0x30;
mov R24,R12
subi R24,208 ; addi 48
std z+1,R24
.dbline 286
; Out[2] = chrTemp3 + 0x30;
mov R24,R10
subi R24,208 ; addi 48
movw R30,R22
std z+2,R24
.dbline 287
; }
xjmp L62
L61:
.dbline 289
; else
; {
.dbline 290
; if(chrTemp2 != 0)
tst R12
breq L63
.dbline 291
; {
.dbline 292
; nLen = 2;
ldi R20,2
ldi R21,0
.dbline 293
; Out[0] = chrTemp2 + 0x30;
mov R24,R12
subi R24,208 ; addi 48
movw R30,R22
std z+0,R24
.dbline 294
; Out[1] = chrTemp3 + 0x30;
mov R24,R10
subi R24,208 ; addi 48
std z+1,R24
.dbline 295
; }
xjmp L64
L63:
.dbline 297
; else
; {
.dbline 298
; nLen = 1;
ldi R20,1
ldi R21,0
.dbline 299
; Out[0] = chrTemp3 + 0x30;
mov R24,R10
subi R24,208 ; addi 48
movw R30,R22
std z+0,R24
.dbline 300
; }
L64:
.dbline 301
; }
L62:
.dbline 303
;
; return nLen;
movw R16,R20
.dbline -2
L60:
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym l i 1 I
.dbsym r nLen 20 I
.dbsym r chrTemp3 10 c
.dbsym r chrTemp2 12 c
.dbsym r chrTemp1 14 c
.dbsym r Out 22 pc
.dbsym r n 20 I
.dbend
.dbfunc e Encode _Encode fV
; nDst -> <dead>
; nLeft -> R22
; nChar -> R10,R11
; nSrc -> R20,R21
; nLen -> R14,R15
; out -> R6,R7
; in -> R12,R13
.even
_Encode::
xcall push_gset5
movw R6,R18
movw R12,R16
ldd R14,y+10
ldd R15,y+11
.dbline -1
.dbline 307
; }
; // 编码函数
; void Encode(char in[],char out[],int nLen)
; {
.dbline 314
; int nSrc; // 源字符串的计数值
; int nDst; // 目标编码串的计数值
; int nChar; // 当前正在处理的组内字符字节的序号,范围是0-7
; char nLeft; // 上一字节残余的数据
;
; // 计数值初始化
; nSrc = 0;
clr R20
clr R21
xjmp L67
L66:
.dbline 321
; //nDst = 0;
;
; // 将源串每8个字节分为一组,压缩成7个字节
; // 循环该处理过程,直至源串被处理完
; // 如果分组不到8字节,也能正确处理
; while(nSrc<nLen)
; {
.dbline 323
; // 取源字符串的计数值的最低3位
; nChar = nSrc & 7;
movw R24,R20
andi R24,7
andi R25,0
movw R10,R24
.dbline 326
;
; // 处理源串的每个字节
; if(nChar == 0)
cpi R24,0
cpc R24,R25
brne L69
X3:
.dbline 327
; {
.dbline 329
; // 组内第一个字节,只是保存起来,待处理下一个字节时使用
; nLeft = *in;
movw R30,R12
ldd R22,z+0
.dbline 330
; }
xjmp L70
L69:
.dbline 332
; else
; {
.dbline 334
; // 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
; *out = (*in << (8-nChar)) | nLeft;
ldi R18,8
ldi R19,0
sub R18,R10
sbc R19,R11
movw R30,R12
ldd R16,z+0
clr R17
xcall lsl16
movw R2,R16
mov R4,R22
clr R5
or R2,R4
or R3,R5
movw R30,R6
std z+0,R2
.dbline 337
;
; // 将该字节剩下的左边部分,作为残余数据保存起来
; nLeft = *in >> nChar;
movw R30,R12
ldd R16,z+0
clr R17
movw R18,R10
xcall asr16
mov R22,R16
.dbline 339
; // 修改目标串的指针和计数值
; out++;
movw R24,R6
adiw R24,1
movw R6,R24
.dbline 341
; //nDst++;
; }
L70:
.dbline 344
movw R24,R12
adiw R24,1
movw R12,R24
.dbline 344
subi R20,255 ; offset = 1
sbci R21,255
.dbline 345
L67:
.dbline 320
cp R20,R14
cpc R21,R15
brge X4
xjmp L66
X4:
.dbline -2
L65:
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym l nDst 1 I
.dbsym r nLeft 22 c
.dbsym r nChar 10 I
.dbsym r nSrc 20 I
.dbsym r nLen 14 I
.dbsym r out 6 pc
.dbsym r in 12 pc
.dbend
.dbfunc e FindERROR _FindERROR fI
; nOffset -> R20,R21
; i -> R22,R23
; nLen -> R18,R19
; in -> R16,R17
.even
_FindERROR::
xcall push_gset2
.dbline -1
.dbline 459
;
; // 修改源串的指针和计数值
; in++; nSrc++;
; }
;
; // 返回目标串长度
; //return nDst;
; }
; /*
; int AnalyseSms(char in[],int nLen,char chrPhone[],char chrMessage[])
; {
; char Phone[20];
; int phone_len;
; char chrTemp[200];
; char chrMessage[140];
; int nLen_temp;
; int nTempLen;
; int nOffset;
; int nOff;
; char chrTmp;
; int n,i;
; int nContent_Len;
; char content[140];
;
; //去掉+CMGR:信息
; nLen_temp = nLen - 6;
; nOffset = 6;
; copy(chrTemp,0,in,nOffset,nLen_temp);
;
; if(nLen_temp < 20) return -1;
; chrTmp = chrTemp[0];
; if(chrTmp == '1')//新消息
; {
; chrTmp = strTemp[3];
; if(chrTemp == '1')// 长度为三个字符
; {
; nTempLen = (strTemp[3] - 48) * 100 + (strTemp[4] - 48) * 10
; + (strTemp[4] - 48);
; if(nLen_temp >= 26)
; {
; nLen_temp -= 26;
; nOffset += 26;
; copy(chrTemp,0,in,nOffset,nLen_temp);
; }
; else return -1;
; }// 长度为两个字符
; else
; {
; nTempLen = (strTemp[3] - 48) * 10 + (strTemp[4] - 48);
; if(nLen_temp >= 25)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -