📄 common.s
字号:
; dw -> y+0
; pnter -> R16,R17
.even
_u32_Get::
xcall push_gset1
sbiw R28,4
.dbline -1
.dbline 314
; #endif
; }
;
; u32 u32_Get(volatile u32 *pnter)
; {
.dbline 321
; #ifdef CPU_eZ8
; return *pnter; // read the value
; #endif
;
; #ifdef CPU_ATmega128
; u32 dw;
; u8 savedSREG = SREG; // keep interrupt setting
in R20,0x3f
.dbline 322
; Disable_Ints(); //
cli
.dbline 323
; dw = *pnter; // read the value
movw R30,R16
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 324
; SREG = savedSREG; // restore interrupt setting
out 0x3f,R20
.dbline 325
; return dw; //
movw R30,R28
ldd R16,z+0
ldd R17,z+1
ldd R18,z+2
ldd R19,z+3
.dbline -2
L11:
adiw R28,4
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r savedSREG 20 c
.dbsym l dw 0 l
.dbsym r pnter 16 pl
.dbend
.dbfunc e EPROMWrite _EPROMWrite fV
; savedSREG -> R20
; Data -> R18
; Addr -> R16,R17
.even
_EPROMWrite::
xcall push_gset1
.dbline -1
.dbline 334
; #endif
; }
;
; // **************************************************************************
;
; #ifdef CPU_ATmega128
;
; void EPROMWrite(u16 Addr, u8 Data)
; {
.dbline 337
; u8 savedSREG;
;
; savedSREG = SREG; // keep setting so the interrupt setting can be restored
in R20,0x3f
.dbline 338
; Disable_Ints(); //
cli
.dbline 340
L13:
.dbline 340
L14:
.dbline 340
L16:
.dbline 340
; //
; for (; bit_is_set(EECR, EEWE); ); // wait for previous write to finish
sbic 0x1c,1
rjmp L13
.dbline 341
; EEAR = Addr; // set address
out 0x1f,R17
out 0x1e,R16
.dbline 342
; EEDR = Data; // set data
out 0x1d,R18
.dbline 343
; sbi(EECR, EEMWE); // set "write enable" bit
sbi 0x1c,2
.dbline 344
; sbi(EECR, EEWE); // set "write" bit
sbi 0x1c,1
.dbline 346
; //
; SREG = savedSREG; // restore SREG - ie, the CLI/SEI state
out 0x3f,R20
.dbline 347
; EEAR = 0; //
clr R2
clr R3
out 0x1f,R3
out 0x1e,R2
.dbline -2
L12:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r savedSREG 20 c
.dbsym r Data 18 c
.dbsym r Addr 16 s
.dbend
.dbfunc e EPROMRead _EPROMRead fc
; Addr -> R16,R17
.even
_EPROMRead::
.dbline -1
.dbline 351
; }
;
; u8 EPROMRead(u16 Addr)
; {
.dbline 352
L18:
.dbline 352
L19:
.dbline 352
L21:
.dbline 352
; for (; bit_is_set(EECR, EEWE); ); // wait for previous write to finish
sbic 0x1c,1
rjmp L18
.dbline 353
; EEAR = Addr; // set address
out 0x1f,R17
out 0x1e,R16
.dbline 354
; sbi(EECR, EERE); // set "read enable" bit
sbi 0x1c,0
.dbline 355
; EEAR = 0; //
clr R2
clr R3
out 0x1f,R3
out 0x1e,R2
.dbline 356
; return (u8)EEDR; // return the EEPROM byte
in R16,0x1d
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbsym r Addr 16 s
.dbend
.dbfunc e EPROMWrite_Data _EPROMWrite_Data fV
; c -> R20
; crc -> R22,R23
; len -> R10,R11
; src -> R12,R13
; Addr -> R14,R15
.even
_EPROMWrite_Data::
xcall push_gset5
movw R12,R18
movw R14,R16
ldd R10,y+10
ldd R11,y+11
.dbline -1
.dbline 360
; }
;
; void EPROMWrite_Data(u16 Addr, u8 *src, u16 len)
; {
.dbline 364
; u8 c;
; u16 crc;
;
; if (!src) //
tst R12
brne L23
tst R13
brne L23
X1:
.dbline 365
; { // fill with '0'
.dbline 366
xjmp L28
L25:
.dbline 366
clr R18
movw R2,R14
movw R24,R2
adiw R24,1
movw R14,R24
movw R16,R2
xcall _EPROMWrite
L26:
.dbline 366
movw R24,R10
sbiw R24,1
movw R10,R24
L28:
.dbline 366
; for (; len; len--) EPROMWrite(Addr++, 0); // data
tst R10
brne L25
tst R11
brne L25
X2:
.dbline 367
; EPROMWrite(Addr++, 0xff); // crc LS-Byte
ldi R18,255
movw R2,R14
movw R24,R2
adiw R24,1
movw R14,R24
movw R16,R2
xcall _EPROMWrite
.dbline 368
; EPROMWrite(Addr, 0xff); // crc MS-Byte
ldi R18,255
movw R16,R14
xcall _EPROMWrite
.dbline 369
; return; //
xjmp L22
L23:
.dbline 372
; }
;
; crc = 0xffff; // init crc
ldi R22,65535
ldi R23,255
.dbline 373
; crc = UpdateFCS_16(crc, 10); // update crc
ldi R18,10
movw R16,R22
xcall _UpdateFCS_16
.dbline 374
; crc = UpdateFCS_16(crc, (u8)(len & 0xff)); // update crc
mov R18,R10
andi R19,0
xcall _UpdateFCS_16
.dbline 375
; crc = UpdateFCS_16(crc, (u8)(len >> 8)); // update crc
movw R18,R10
mov R18,R19
clr R19
xcall _UpdateFCS_16
movw R22,R16
.dbline 376
; for (; len; len--) //
xjmp L32
L29:
.dbline 377
.dbline 378
movw R30,R12
ld R20,Z+
movw R12,R30
.dbline 379
mov R18,R20
movw R16,R22
xcall _UpdateFCS_16
movw R22,R16
.dbline 380
mov R18,R20
movw R2,R14
movw R24,R2
adiw R24,1
movw R14,R24
movw R16,R2
xcall _EPROMWrite
.dbline 381
L30:
.dbline 376
movw R24,R10
sbiw R24,1
movw R10,R24
L32:
.dbline 376
tst R10
brne L29
tst R11
brne L29
X3:
.dbline 382
; { //
; c = *src++; // get byte
; crc = UpdateFCS_16(crc, c); // update crc
; EPROMWrite(Addr++, c); // save it into the eeprom
; } //
; crc = ~crc; // finalize the crc
com R22
com R23
.dbline 383
; EPROMWrite(Addr++, (u8)(crc & 0xff)); // save LS-Byte of crc
mov R18,R22
andi R19,0
movw R2,R14
movw R24,R2
adiw R24,1
movw R14,R24
movw R16,R2
xcall _EPROMWrite
.dbline 384
; EPROMWrite(Addr++, (u8)(crc >> 8)); // save MS-Byte of crc
movw R18,R22
mov R18,R19
clr R19
movw R2,R14
movw R24,R2
adiw R24,1
movw R14,R24
movw R16,R2
xcall _EPROMWrite
.dbline -2
L22:
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r c 20 c
.dbsym r crc 22 s
.dbsym r len 10 s
.dbsym r src 12 pc
.dbsym r Addr 14 s
.dbend
.dbfunc e EPROMRead_Data _EPROMRead_Data fc
; crc2 -> R10,R11
; i -> R14,R15
; c -> R22
; j -> R12,R13
; crc1 -> R20,R21
; len -> y+16
; dest -> y+14
; Addr -> y+12
.even
_EPROMRead_Data::
xcall push_arg4
xcall push_gset5
sbiw R28,2
.dbline -1
.dbline 388
; }
;
; bool EPROMRead_Data(u16 Addr, u8 *dest, u16 len)
; {
.dbline 393
; u8 c;
; u16 i, j;
; u16 crc1, crc2;
;
; if (!dest) return false;
ldd R0,y+14
ldd R1,y+15
tst R0
brne L34
tst R1
brne L34
X4:
.dbline 393
clr R16
xjmp L33
L34:
.dbline 396
;
; // first check the data is valid
; crc1 = 0xffff; // init crc
ldi R20,65535
ldi R21,255
.dbline 397
; crc1 = UpdateFCS_16(crc1, 10); // update crc
ldi R18,10
movw R16,R20
xcall _UpdateFCS_16
.dbline 398
; crc1 = UpdateFCS_16(crc1, (u8)(len & 0xff)); // update crc
ldd R18,y+16
ldd R19,y+17
andi R19,0
xcall _UpdateFCS_16
.dbline 399
; crc1 = UpdateFCS_16(crc1, (u8)(len >> 8)); // update crc
ldd R18,y+16
ldd R19,y+17
mov R18,R19
clr R19
xcall _UpdateFCS_16
movw R20,R16
.dbline 400
; i = Addr; // eeprom address to read from
ldd R14,y+12
ldd R15,y+13
.dbline 401
; for (j = len; j; j--) //
ldd R12,y+16
ldd R13,y+17
xjmp L39
L36:
.dbline 402
.dbline 403
movw R2,R14
movw R24,R2
adiw R24,1
movw R14,R24
movw R16,R2
xcall _EPROMRead
mov R22,R16
.dbline 404
mov R18,R22
movw R16,R20
xcall _UpdateFCS_16
movw R20,R16
.dbline 405
L37:
.dbline 401
movw R24,R12
sbiw R24,1
movw R12,R24
L39:
.dbline 401
tst R12
brne L36
tst R13
brne L36
X5:
.dbline 406
; { //
; c = EPROMRead(i++); // read byte from eeprom
; crc1 = UpdateFCS_16(crc1, c); // update crc
; } //
; crc1 = ~crc1; // finalize the crc
com R20
com R21
.dbline 407
; crc2 = (u16)EPROMRead(i++); // read LS-Byte of crc
movw R2,R14
movw R24,R2
adiw R24,1
movw R14,R24
movw R16,R2
xcall _EPROMRead
mov R10,R16
clr R11
.dbline 408
; crc2 |= ((u16)EPROMRead(i)) << 8; // read MS-Byte of crc
movw R16,R14
xcall _EPROMRead
mov R2,R16
clr R3
mov R3,R2
clr R2
or R10,R2
or R11,R3
.dbline 409
; if (crc1 != crc2) //
cp R20,R10
cpc R21,R11
breq L45
.dbline 410
; { //
.dbline 411
; memset(dest, 0, len); //
ldd R0,y+16
ldd R1,y+17
std y+1,R1
std y+0,R0
clr R18
clr R19
ldd R16,y+14
ldd R17,y+15
xcall _memset
.dbline 412
; return false; // data is invalid
clr R16
xjmp L33
X6:
.dbline 416
L42:
.dbline 416
ldd R2,y+12
ldd R3,y+13
movw R24,R2
adiw R24,1
std y+13,R25
std y+12,R24
movw R16,R2
xcall _EPROMRead
mov R2,R16
ldd R30,y+14
ldd R31,y+15
st Z+,R2
std y+15,R31
std y+14,R30
L43:
.dbline 416
ldd R24,y+16
ldd R25,y+17
sbiw R24,1
std y+17,R25
std y+16,R24
L45:
.dbline 416
; } //
;
; // go get the data from the eeprom
; for (; len; len--) *dest++ = EPROMRead(Addr++); // read byte from eeprom
ldd R0,y+16
ldd R1,y+17
tst R0
brne L42
tst R1
brne L42
X7:
.dbline 418
; //
; return true; // data is valid
ldi R16,1
.dbline -2
L33:
adiw R28,2
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r crc2 10 s
.dbsym r i 14 s
.dbsym r c 22 c
.dbsym r j 12 s
.dbsym r crc1 20 s
.dbsym l len 16 s
.dbsym l dest 14 pc
.dbsym l Addr 12 s
.dbend
.dbfunc e Set_UnitID _Set_UnitID fV
; UnitID -> y+2
; i -> R22,R23
; s -> R20,R21
.even
_Set_UnitID::
xcall push_gset2
movw R20,R16
sbiw R28,34
.dbline -1
.dbline 429
; }
;
; #endif
;
; // *********************************************************************************
; // set/get the unit id
;
; #ifdef CPU_ATmega128
;
; void Set_UnitID(char *s)
; {
.dbline 434
; int i;
;
; char UnitID[Unit_ID_Len];
;
; if (!s) //
cpi R20,0
cpc R20,R21
brne L47
X8:
.dbline 435
; { //
.dbline 436
; EPROMWrite_Data((u16)&Unit_ID, 0, Unit_ID_Len); //
ldi R24,32
ldi R25,0
std y+1,R25
std y+0,R24
clr R18
clr R19
ldi R16,<_Unit_ID
ldi R17,>_Unit_ID
xcall _EPROMWrite_Data
.dbline 437
; return; //
xjmp L46
L47:
.dbline 440
; } //
;
; memset(UnitID, 0, Unit_ID_Len); //
ldi R24,32
ldi R25,0
std y+1,R25
std y+0,R24
clr R18
clr R19
movw R16,R28
subi R16,254 ; offset = 2
sbci R17,255
xcall _memset
.dbline 441
; i = strlen(s); //
movw R16,R20
xcall _strlen
movw R22,R16
.dbline 442
; if (i >= Unit_ID_Len) i = Unit_ID_Len - 1; //
cpi R16,32
ldi R30,0
cpc R17,R30
brlt L49
.dbline 442
ldi R22,31
ldi R23,0
L49:
.dbline 443
; strncpy(UnitID, s, i); //
std y+1,R23
std y+0,R22
movw R18,R20
movw R16,R28
subi R16,254 ; offset = 2
sbci R17,255
xcall _strncpy
.dbline 444
; EPROMWrite_Data((u16)&Unit_ID, (u8*)UnitID, Unit_ID_Len); // write it to eeprom
ldi R24,32
ldi R25,0
std y+1,R25
std y+0,R24
movw R18,R28
subi R18,254 ; offset = 2
sbci R19,255
ldi R16,<_Unit_ID
ldi R17,>_Unit_ID
xcall _EPROMWrite_Data
.dbline -2
L46:
adiw R28,34
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l UnitID 2 A[32:32]c
.dbsym r i 22 I
.dbsym r s 20 pc
.dbend
.dbfunc e Get_UnitID _Get_UnitID fc
; buf -> R20,R21
.even
_Get_UnitID::
xcall push_gset1
movw R20,R16
sbiw R28,2
.dbline -1
.dbline 448
; }
;
; bool Get_UnitID(char *buf)
; {
.dbline 449
; return EPROMRead_Data((u16)&Unit_ID, (u8*)buf, Unit_ID_Len); //
ldi R24,32
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -