Skip to content

Commit 20cc444

Browse files
committed
clean up comments, simpler jump layout, 152 Bytes
1 parent 532191a commit 20cc444

1 file changed

Lines changed: 46 additions & 49 deletions

File tree

test/pinmode/pinmode-asm.c

Lines changed: 46 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -25,148 +25,145 @@ void pinMode_asm(uint8_t pin, uint8_t mode)
2525
(void) mode;
2626
__asm
2727

28-
; my optimized code
29-
; nicht mehr benötigte Stack-Variablen:
30-
; (0x01, sp) war bit
31-
; (0x07, sp) war port-ID
32-
; (0x08, sp) war port-ID
28+
;
29+
; position of the parameters on the stack:
30+
; (3,sp) pin
31+
; (4,sp) mode
32+
;
33+
34+
;
35+
; Zuordnung pin => bit mask
36+
;
3337

34-
sub sp, #8
3538
; pinmode-c.c: 9: uint8_t bit = digitalPinToBitMask(pin);
3639
clrw x
37-
ld a, (0x0b, sp)
38-
ld 0x0100,a
40+
ld a, (3, sp)
3941
ld xl, a
4042
addw x, #(_digital_pin_to_bit_mask_PGM + 0)
4143
ld a, (x)
42-
ld 0x0101,a
4344
ld yl,a ; yl = bit
4445
cpl a
4546
ld yh,a ; yh = ~bit
47+
48+
;
49+
; Zuordung pin => Port-ID
50+
;
4651
; pinmode-c.c: 10: uint8_t port = digitalPinToPort(pin);
52+
; pinmode-c.c: 13: if (port == NOT_A_PORT) return;
4753
; es könnte auch subw x, #(NUM_DIGITAL_PINS) sein
4854
clrw x
49-
ld a, (0x0b, sp)
55+
ld a, (3, sp)
5056
ld xl, a
5157
addw x, #(_digital_pin_to_port_PGM + 0)
5258
ld a, (x) ; port-ID. Z-Flag wird gesetzt
53-
; pinmode-c.c: 13: if (port == NOT_A_PORT) return;
54-
; jreq 00118$
59+
jreq 002$
5560

5661

5762
;
5863
; Zuordung port-ID => Port-Addresse
5964
;
65+
; x = (GPIO_TypeDef *) portOutputRegister(port)
66+
;
6067

6168
00102$:
62-
; pinmode-c.c: 15: gpio = (GPIO_TypeDef *) portOutputRegister(port);
63-
;******
6469
clrw x
6570
sll a ; 8 bit shift is sufficient
6671
ld xl, a
6772
addw x, #(_port_to_output_PGM + 0)
6873
ldw x, (x) ; jetzt ist gpio in x
69-
ldw 0x0102,x
7074

7175

7276
;
7377
; case INPUT
78+
; gpio->CR2 &= ~bit; // first: deactivate interrupt
79+
; gpio->CR1 &= ~bit; // release top side
80+
; gpio->DDR &= ~bit; // now set direction
7481
;
75-
; pinmode-c.c: 17: if (mode == INPUT) {
76-
ld a, (0x0c, sp)
82+
ld a, (4, sp)
7783
jrne 00116$
7884

79-
; pinmode-c.c: 19: gpio->CR2 &= ~bit; // first: deactivate interrupt
80-
; pinmode-c.c: 20: gpio->CR1 &= ~bit; // release top side
81-
; pinmode-c.c: 21: gpio->DDR &= ~bit; // now set direction
8285
sim
8386
BIT_CLEAR(CR2)
8487
BIT_CLEAR(CR1)
8588
BIT_CLEAR(DDR)
8689
rim
87-
jp 00118$
90+
002$: ret
8891

8992
;
9093
; case INPUT_PULLUP
94+
; gpio->CR2 &= ~bit; // first: deactivate interrupt
95+
; gpio->DDR &= ~bit; // set direction before
96+
; gpio->CR1 |= bit; // activating the pull up
9197
;
9298
00116$:
93-
; pinmode-c.c: 23: } else if (mode == INPUT_PULLUP) {
9499
cp a, #0x02
95100
jrne 00113$
96-
; pinmode-c.c: 25: gpio->CR2 &= ~bit; // first: deactivate interrupt
97-
; pinmode-c.c: 26: gpio->DDR &= ~bit; // set direction before
98-
; pinmode-c.c: 27: gpio->CR1 |= bit; // activating the pull up
101+
99102
sim
100103
BIT_CLEAR(CR2)
101104
BIT_CLEAR(DDR)
102105
BIT_SET(CR1)
103106
rim
104-
jp 00118$
107+
ret
105108

106109
;
107-
; case OUTPUT_FAST
110+
; case OUTPUT_FAST // output push-pull, fast
111+
; gpio->CR1 |= bit;
112+
; gpio->DDR |= bit; // direction before setting CR2 to
113+
; gpio->CR2 |= bit; // avoid accidental interrupt
108114
;
109115
00113$:
110-
; pinmode-c.c: 29: } else if (mode == OUTPUT_FAST) {// output push-pull, fast
111116
cp a, #0x05
112117
jrne 00110$
113118

114-
; pinmode-c.c: 31: gpio->CR1 |= bit;
115-
; pinmode-c.c: 32: gpio->DDR |= bit; // direction before setting CR2 to
116-
; pinmode-c.c: 33: gpio->CR2 |= bit; // avoid accidental interrupt
117119
sim
118120
BIT_SET(CR1)
119121
jra 010$
120122

121123
;
122-
; case OUTPUT_OD_FAST
124+
; case OUTPUT_OD_FAST // output open drain, fast
125+
; gpio->CR1 &= ~bit;
126+
; gpio->DDR |= bit; // direction before setting CR2 to
127+
; gpio->CR2 |= bit; // avoid accidental interrupt
123128
;
124129
00110$:
125-
; pinmode-c.c: 35: } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast
126130
cp a, #0x07
127131
jrne 00107$
128132

129-
; pinmode-c.c: 37: gpio->CR1 &= ~bit;
130-
; pinmode-c.c: 38: gpio->DDR |= bit; // direction before setting CR2 to
131-
; pinmode-c.c: 39: gpio->CR2 |= bit; // avoid accidental interrupt
132133
sim
133134
BIT_CLEAR(CR1)
134135
010$: BIT_SET(DDR)
135136
BIT_SET(CR2)
136137
rim
137-
jra 00118$
138+
ret
138139

139140
;
140-
; case OUTPUT_OD
141+
; case OUTPUT_OD // output open drain, slow
142+
; gpio->CR1 &= ~bit;
143+
; gpio->CR2 &= ~bit;
144+
; gpio->DDR |= bit;
141145
;
142146
00107$:
143-
; pinmode-c.c: 41: } else if (mode == OUTPUT_OD) { // output open drain, slow
144147
cp a, #0x03
145148
jrne 00104$
146149

147-
; pinmode-c.c: 43: gpio->CR1 &= ~bit;
148-
; pinmode-c.c: 44: gpio->CR2 &= ~bit;
149-
; pinmode-c.c: 45: gpio->DDR |= bit;
150150
sim
151151
BIT_CLEAR(CR1)
152152
jra 004$
153153

154154
;
155-
; case default
155+
; case default //
156+
; gpio->CR1 |= bit;
157+
; gpio->CR2 &= ~bit;
158+
; gpio->DDR |= bit;
156159
;
157160
00104$:
158-
; pinmode-c.c: 49: gpio->CR1 |= bit;
159-
; pinmode-c.c: 50: gpio->CR2 &= ~bit;
160-
; pinmode-c.c: 51: gpio->DDR |= bit;
161161
sim
162162
BIT_SET(CR1)
163163
004$: BIT_CLEAR(CR2)
164164
BIT_SET(DDR)
165165
rim
166166

167-
00118$:
168-
; pinmode-c.c: 54: }
169-
addw sp, #8
170167
__endasm;
171168
}
172169

0 commit comments

Comments
 (0)