@@ -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
616800102 $ :
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;
929800116 $ :
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;
10911500113 $ :
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;
12412900110 $ :
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 )
134135010 $ : 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;
14214600107 $ :
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;
15716000104 $ :
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 )
163163004 $ : 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