📄 timers.lss
字号:
pc00:
out _SFR_IO_ADDR(UDR), p1l
630: 8c b9 out 0x0c, r24 ; 12
ret
632: 08 95 ret
00000634 <_GetHex>:
_ENDFUNC
;-----------------------------------------
; _GetHex
;
; PASSED: p1l = Maximum number of digits
; RETURNS: r1 = val, Tbit, p2l = Number of digits entered
; USES: R24, R25
; STACK: 4
;
_FUNCTION(_GetHex)
_GetHex:
push R10
634: af 92 push r10
push R11
636: bf 92 push r11
push R12
638: cf 92 push r12
push R13
63a: df 92 push r13
mov R13, p1l
63c: d8 2e mov r13, r24
clr R10
63e: aa 24 eor r10, r10
clr R11
640: bb 24 eor r11, r11
clr R12
642: cc 24 eor r12, r12
00000644 <gh_00>:
gh_00:
rcall _GetChar
644: c3 df rcall .-122 ; 0x5cc
rcall IsHex
646: 21 d0 rcall .+66 ; 0x68a
brtc gh_xx
648: 96 f4 brtc .+36 ; 0x66e
cpi r1l, '9'+1
64a: 8a 33 cpi r24, 0x3A ; 58
brge gh_01
64c: 14 f4 brge .+4 ; 0x652
subi r1l, '0'
64e: 80 53 subi r24, 0x30 ; 48
rjmp gh_02
650: 02 c0 rjmp .+4 ; 0x656
00000652 <gh_01>:
gh_01:
cbr r1l, 0x20
652: 8f 7d andi r24, 0xDF ; 223
subi r1l, 'A'-10
654: 87 53 subi r24, 0x37 ; 55
00000656 <gh_02>:
gh_02:
lsl R10
656: aa 0c add r10, r10
rol R11
658: bb 1c adc r11, r11
lsl R10
65a: aa 0c add r10, r10
rol R11
65c: bb 1c adc r11, r11
lsl R10
65e: aa 0c add r10, r10
rol R11
660: bb 1c adc r11, r11
lsl R10
662: aa 0c add r10, r10
rol R11
664: bb 1c adc r11, r11
add R10, r1l
666: a8 0e add r10, r24
inc R12
668: c3 94 inc r12
dec R13
66a: da 94 dec r13
brne gh_00
66c: 59 f7 brne .-42 ; 0x644
0000066e <gh_xx>:
gh_xx:
mov p2l, R12
66e: 6c 2d mov r22, r12
mov r1l, R10
670: 8a 2d mov r24, r10
mov r1h, R11
672: 9b 2d mov r25, r11
pop R13
674: df 90 pop r13
pop R12
676: cf 90 pop r12
pop R11
678: bf 90 pop r11
pop R10
67a: af 90 pop r10
ret
67c: 08 95 ret
0000067e <GetHexWord>:
_ENDFUNC
;-----------------------------------------
; GetHexWord
;
_FUNCTION(GetHexWord)
GetHexWord:
ldi p1l, 4
67e: 84 e0 ldi r24, 0x04 ; 4
rjmp _GetHex
680: d9 cf rjmp .-78 ; 0x634
00000682 <GetHexByte>:
_ENDFUNC
;-----------------------------------------
; GetHexByte
;
_FUNCTION(GetHexByte)
GetHexByte:
ldi p1l, 2
682: 82 e0 ldi r24, 0x02 ; 2
rjmp _GetHex
684: d7 cf rjmp .-82 ; 0x634
00000686 <GetHexChar>:
_ENDFUNC
;-----------------------------------------
; GetHexByte
;
_FUNCTION(GetHexChar)
GetHexChar:
ldi p1l, 1
686: 81 e0 ldi r24, 0x01 ; 1
rjmp _GetHex
688: d5 cf rjmp .-86 ; 0x634
0000068a <IsHex>:
_ENDFUNC
;-----------------------------------------
; IsHex
;
; Tests RxByte for ascii hex char
; Returns: T bit
;
_FUNCTION(IsHex)
IsHex:
push p1l
68a: 8f 93 push r24
lds p1l, _RxByte
68c: 80 91 22 01 lds r24, 0x0122
clt
690: e8 94 clt
cpi p1l, '0'
692: 80 33 cpi r24, 0x30 ; 48
brlt ihno
694: 5c f0 brlt .+22 ; 0x6ac
cpi p1l, '9'+1
696: 8a 33 cpi r24, 0x3A ; 58
brlt ihyes
698: 44 f0 brlt .+16 ; 0x6aa
cpi p1l, 'A'
69a: 81 34 cpi r24, 0x41 ; 65
brlt ihno
69c: 3c f0 brlt .+14 ; 0x6ac
cpi p1l, 'F'+1
69e: 87 34 cpi r24, 0x47 ; 71
brlt ihyes
6a0: 24 f0 brlt .+8 ; 0x6aa
cpi p1l, 'a'
6a2: 81 36 cpi r24, 0x61 ; 97
brlt ihno
6a4: 1c f0 brlt .+6 ; 0x6ac
cpi p1l, 'f'+1
6a6: 87 36 cpi r24, 0x67 ; 103
brge ihno
6a8: 0c f4 brge .+2 ; 0x6ac
000006aa <ihyes>:
ihyes:
set
6aa: 68 94 set
000006ac <ihno>:
ihno:
pop p1l
6ac: 8f 91 pop r24
ret
6ae: 08 95 ret
000006b0 <IsWhite>:
_ENDFUNC
;-----------------------------------------
; IsWhite
;
; Tests RxByte for space or CR
; Returns: T bit
;
_FUNCTION(IsWhite)
IsWhite:
push p1l
6b0: 8f 93 push r24
lds p1l, _RxByte
6b2: 80 91 22 01 lds r24, 0x0122
clt
6b6: e8 94 clt
cpi p1l, ' '
6b8: 80 32 cpi r24, 0x20 ; 32
breq ihyes
6ba: b9 f3 breq .-18 ; 0x6aa
cpi p1l, 0x0D
6bc: 8d 30 cpi r24, 0x0D ; 13
breq ihyes
6be: a9 f3 breq .-22 ; 0x6aa
rjmp ihno
6c0: f5 cf rjmp .-22 ; 0x6ac
000006c2 <_PutHex>:
_ENDFUNC
;-----------------------------------------
; void _PutHex(unsigned val, char digits)
;
; Passed: p2 = Value, p1l = # digits
; RETURN: Nothing
; USES: R25, TxByte
; STACK: 2
;
_FUNCTION(_PutHex)
_PutHex:
ldi tmp2, 4 ; Maximum number of digits.
6c2: 44 e0 ldi r20, 0x04 ; 4
mov tmp3, p2l
6c4: 56 2f mov r21, r22
mov p2l, p1l
6c6: 68 2f mov r22, r24
mov p2h, p1h
6c8: 79 2f mov r23, r25
000006ca <ph00>:
ph00:
lsl p2l
6ca: 66 0f add r22, r22
rol p2h
6cc: 77 1f adc r23, r23
rol p1l
6ce: 88 1f adc r24, r24
lsl p2l
6d0: 66 0f add r22, r22
rol p2h
6d2: 77 1f adc r23, r23
rol p1l
6d4: 88 1f adc r24, r24
lsl p2l
6d6: 66 0f add r22, r22
rol p2h
6d8: 77 1f adc r23, r23
rol p1l
6da: 88 1f adc r24, r24
lsl p2l
6dc: 66 0f add r22, r22
rol p2h
6de: 77 1f adc r23, r23
rol p1l
6e0: 88 1f adc r24, r24
cp tmp3, tmp2
6e2: 54 17 cp r21, r20
brlt ph02
6e4: 34 f0 brlt .+12 ; 0x6f2
cbr p1l, 0xF0
6e6: 8f 70 andi r24, 0x0F ; 15
subi p1l, lo8(-'0') ; Addi 0
6e8: 80 5d subi r24, 0xD0 ; 208
cpi p1l, lo8('9' + 1) ; if > 9
6ea: 8a 33 cpi r24, 0x3A ; 58
brlt ph01 ; subi 9 and add A
6ec: 0c f0 brlt .+2 ; 0x6f0
subi p1l, lo8('9' + 1 - 'A')
6ee: 89 5f subi r24, 0xF9 ; 249
000006f0 <ph01>:
ph01:
rcall PutChar
6f0: 97 df rcall .-210 ; 0x620
000006f2 <ph02>:
ph02:
dec tmp2
6f2: 4a 95 dec r20
brne ph00
6f4: 51 f7 brne .-44 ; 0x6ca
ret
6f6: 08 95 ret
000006f8 <PutHexWord>:
_ENDFUNC
;-----------------------------------------
; Put out a hex word
;
; Passed: Y = word
;
_FUNCTION(PutHexWord)
PutHexWord:
ldi p2l, 4
6f8: 64 e0 ldi r22, 0x04 ; 4
rjmp _PutHex
6fa: e3 cf rjmp .-58 ; 0x6c2
000006fc <PutHexByte>:
_ENDFUNC
;-----------------------------------------
; Put out a two ascii hex byte
; Yl = byte
;
_FUNCTION(PutHexByte)
PutHexByte:
ldi p2l, 2
6fc: 62 e0 ldi r22, 0x02 ; 2
rjmp _PutHex
6fe: e1 cf rjmp .-62 ; 0x6c2
00000700 <IntProlog>:
;-
_FUNCTION(IntProlog)
IntProlog: ; 3 cycles
push R29
700: df 93 push r29
push R28
702: cf 93 push r28
push R27
704: bf 93 push r27
push R26
706: af 93 push r26
push R25
708: 9f 93 push r25
ldi Yh, hi8(AvrXKernelData)
70a: d1 e0 ldi r29, 0x01 ; 1
ldi Yl, lo8(AvrXKernelData)
70c: c4 e2 ldi r28, 0x24 ; 36
in R25, _SFR_IO_ADDR(SREG) ; Save flags
70e: 9f b7 in r25, 0x3f ; 63
ldd Xl, Y+SysLevel
710: ae 81 ldd r26, Y+6 ; 0x06
subi Xl, lo8(-1) ; Carry set if results 0
712: af 5f subi r26, 0xFF ; 255
std Y+SysLevel, Xl ; if already in kernel, then save context
714: ae 83 std Y+6, r26 ; 0x06
brcs SaveContext
716: 60 f0 brcs .+24 ; 0x730
ldd Xl, Y+Running+NextL ; Check if current task = IDLE
718: aa 81 ldd r26, Y+2 ; 0x02
ldd Xh, Y+Running+NextH
71a: bb 81 ldd r27, Y+3 ; 0x03
or Xh, Xl
71c: ba 2b or r27, r26
brne SaveContext ; Carry cleared if results 0
71e: 41 f4 brne .+16 ; 0x730
;
; When interrupting IDLE, just reset the stack pointer to PRIOR the interrupt.
; in Epilog, if still IDLE, control will return to the start of the IDLE loop.
; I.E. we don't need the return address to IDLE, just the return address to the
; caller of Prolog() (the interrupt handler).
;
; The code, below, is obscure, but cycle efficient. The net effect is to reset
; the stack to AvrXStack before returning to the interrupt handler.
;
in Yl, _SFR_IO_ADDR(SPL) ;Idle task: don't bother saving registers, etc.
720: cd b7 in r28, 0x3d ; 61
in Yh, _SFR_IO_ADDR(SPH)
722: de b7 in r29, 0x3e ; 62
ldd Zh, Y+6 ; Get return address
724: fe 81 ldd r31, Y+6 ; 0x06
ldd Zl, Y+7
726: ef 81 ldd r30, Y+7 ; 0x07
adiw Yl, 9 ; Adjust pointer
728: 29 96 adiw r28, 0x09 ; 9
out _SFR_IO_ADDR(SPL), Yl ; This is cycle efficient, but obscure.
72a: cd bf out 0x3d, r28 ; 61
out _SFR_IO_ADDR(SPH), Yh
72c: de bf out 0x3e, r29 ; 62
ijmp ; ~37 cycles for IDLE task.
72e: 09 94 ijmp
00000730 <SaveContext>:
SaveContext:
push R24
730: 8f 93 push r24
push R23
732: 7f 93 push r23
push R22
734: 6f 93 push r22
push R21
736: 5f 93 push r21
push R20
738: 4f 93 push r20
push R19
73a: 3f 93 push r19
push R18
73c: 2f 93 push r18
push R17
73e: 1f 93 push r17
push R16
740: 0f 93 push r16
push R15
742: ff 92 push r15
push R14
744: ef 92 push r14
push R13
746: df 92 push r13
push R12
748: cf 92 push r12
push R11
74a: bf 92 push r11
push R10
74c: af 92 push r10
push R9
74e: 9f 92 push r9
push R8
750: 8f 92 push r8
push R7
752: 7f 92 push r7
push R6
754: 6f 92 push r6
push R5
756: 5f 92 push r5
push R4
758: 4f 92 push r4
push R3
75a: 3f 92 push r3
push R2
75c: 2f 92 push r2
push R1
75e: 1f 92 push r1
push R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -