およそ20年前に、68HC05 の開発の練習に書いた車のブレイクライト・方向指示器コントローラです。
リビジョン | a89723ba66842646d5e548b0e4af9af878bb64c0 (tree) |
---|---|
日時 | 2013-07-08 22:34:06 |
作者 | Joel Matthew Rees <reiisi@user...> |
コミッター | Joel Matthew Rees |
Adding the assembler output files to the source tree, for reference.
@@ -0,0 +1,1282 @@ | ||
1 | + | |
2 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 1 | |
3 | +Turn Signal Switch by Joel Matthew Rees | |
4 | + | |
5 | + | |
6 | + 0200 1 PAGEWIDTH 128 | |
7 | + 0200 2 HEADER 'Turn Signal Switch by Joel Matthew Rees' | |
8 | + 3 | |
9 | + 4 * Electronic Turn Signal and Emergency Flasher Switch/Timer | |
10 | + 5 * Version 1.00 | |
11 | + 6 * Implemented on the 68HC705K1 | |
12 | + 7 * Assembled and tested on the M68HC705KICS | |
13 | + 8 * | |
14 | + 9 * Copyright 1993 Joel Matthew Rees | |
15 | + 10 * | |
16 | + 11 * Permission granted in advance for strictly non-profit | |
17 | + 12 * educational use. All other rights retained by the author. | |
18 | + 13 | |
19 | + 14 * Authored by Joel Matthew Rees, June to November 1993 | |
20 | + 15 * of also of | |
21 | + 16 * South Salt Lake City Amagasaki | |
22 | + 17 * Utah Japan | |
23 | + 18 * | |
24 | + 19 | |
25 | + 20 | |
26 | + 21 | |
27 | + 0200 22 SUBHEADER 'Purpose, Description, and Design' | |
28 | + | |
29 | + | |
30 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 2 | |
31 | +Turn Signal Switch by Joel Matthew Rees | |
32 | +Purpose, Description, and Design | |
33 | + | |
34 | + 0200 22 PAGE | |
35 | + 23 * Design: | |
36 | + 24 | |
37 | + 25 * When the turn signal and emergency flasher switch assembly on my | |
38 | + 26 * parents' 1971 Colt fell apart some years back, rather than go to the | |
39 | + 27 * nearest Dodge dealer in the next city to order the part, I designed a | |
40 | + 28 * substitute switch using a pair of double-pole, double-throw relays in | |
41 | + 29 * set-reset latch configuration. Momentary-closed pushbuttons (mounted | |
42 | + 30 * to the steering column cover) set the turn signals, and a momentary | |
43 | + 31 * open pushbutton (mounted between the set buttons) or reed switch | |
44 | + 32 * (mounted inside the cover housing so a magnet mounted to the steering | |
45 | + 33 * column would actuate it) shut them off. I usurped the emergency | |
46 | + 34 * flasher unit and took power from the battery lead on the ignition | |
47 | + 35 * switch, so when I needed emergency flashers, I could just turn both | |
48 | + 36 * turn signals on. Mom had trouble getting used to this arrangement, but | |
49 | + 37 * it passed Texas inspection in the seventies. | |
50 | + 38 | |
51 | + 39 * Examining the 68HC05K series MCUs brought that turn signal | |
52 | + 40 * switch back to mind. I thought ten bits of I/O, internal timers, | |
53 | + 41 * and the STOP mode would be sufficient to replicate the logic of that | |
54 | + 42 * switch assembly, adding directional turn signal return switches and | |
55 | + 43 * flasher and turn sgnal return logic as well. It turned out to be a | |
56 | + 44 * tight squeeze. | |
57 | + 45 | |
58 | + 46 * The intent of this document is to focus on the problems of | |
59 | + 47 * decoding inputs, directionalizing the turn signal return, eliminating | |
60 | + 48 * the flasher units, and minimizing power consumption using the STOP | |
61 | + 49 * mode and interrupts. Hardware issues such as power supply design, | |
62 | + 50 * electro-static discharge protection (very important in automotive | |
63 | + 51 * applications), and details of lamp driver circuits are mostly set | |
64 | + 52 * aside. The logic has been tested with the M68HC705KICS simulator | |
65 | + 53 * program, but has not been tested in a physical mock up or real | |
66 | + 54 * vehicle. (I ran out of time for this project.) | |
67 | + 55 | |
68 | + 56 ******* Potential problems: ****************************************** | |
69 | + 57 | |
70 | + 58 * I have not dealt with the problems that occur when the turn signals | |
71 | + 59 * are turned on while the return sensors are within range of their | |
72 | + 60 * actuator fields. Two more bits of port B would have allowed complete | |
73 | + 61 * separation of the two functions. A little extra code might allow | |
74 | + 62 * suppressing the turn signal inputs while both return switches are | |
75 | + 63 * active, to reduce the operator frustration factor. | |
76 | + 64 | |
77 | + 65 * I have also mostly ignored the problems presented by shorted switches. | |
78 | + 66 * Having the turn signal functions on port B is handy, because a week | |
79 | + 67 * turn signal spring will not keep the circuit from staying in the STOP | |
80 | + 68 * instruction. Another 50 bytes of ROM might have allowed tracking time | |
81 | + 69 * of no change for every sensor, which could allow shutting out a | |
82 | + 70 * sensor that has been active more than n minutes. | |
83 | + 71 | |
84 | + 72 ********************************************************************** | |
85 | + 73 | |
86 | + 74 * One of the intents of this design was to replace mechanical | |
87 | + 75 * parts (that tend to flow in hot climates and become brittle in cold) | |
88 | + 76 * with logic. In order to eliminate the mechanical latching lever with | |
89 | + 77 * spring loaded return, I have (perhaps arbitrarily) enforced a new "user | |
90 | + 78 * interface" involving momentary contact switches for the turn signals. | |
91 | + 79 * Two possible physical arrangements for the turn signal present | |
92 | + | |
93 | + | |
94 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 3 | |
95 | +Turn Signal Switch by Joel Matthew Rees | |
96 | +Purpose, Description, and Design | |
97 | + | |
98 | + 80 * themselves to my mind: In the one, a spring-loaded, non-latching | |
99 | + 81 * signal rod (the latch/return mechanism was the weakest part) actuates | |
100 | + 82 * momentary contact switches in two axes; the rod can be pushed up or | |
101 | + 83 * down to activate the turn signals, or it can be pushed in to actuate | |
102 | + 84 * the manual cancel. In another arrangement, the signal rod is fixed, | |
103 | + 85 * and three pushbuttons are provided on a pad at its end. (Cancel in | |
104 | + 86 * the center would seem logical.) | |
105 | + 87 | |
106 | + 88 * The emergency flasher switch is a momentary on pushbutton, and | |
107 | + 89 * it cancels itself in software -- push on, push off. I think the audio | |
108 | + 90 * feedback and dash panel indicators should be sufficient user feedback. | |
109 | + 91 | |
110 | + 92 * The turn signal return mechanism is a pair of reed relays | |
111 | + 93 * mounted inside the bottom of the steering column housing about 11.25 | |
112 | + 94 * degrees apart, with one to four magnetic actuators distributed around | |
113 | + 95 * the steering shaft. The shape, size, and position of the magnets and | |
114 | + 96 * reeds should be such that the reeds close only once as a magnet | |
115 | + 97 * passes, and such that the reeds have about 22.5 degrees of total | |
116 | + 98 * actuation. The overlap in actuation is used to determine the direction | |
117 | + 99 * the steering wheel is rotating. Minor changes to the design should | |
118 | + 100 * allow the use of optical sensors, but I have the impression that | |
119 | + 101 * magnetic devices are more immune to extremes of climate. (Maybe?) | |
120 | + 102 | |
121 | + 0200 103 SUBHEADER 'Model Schematic' | |
122 | + | |
123 | + | |
124 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 4 | |
125 | +Turn Signal Switch by Joel Matthew Rees | |
126 | +Model Schematic | |
127 | + | |
128 | + 0200 103 PAGE | |
129 | + 104 * An idealized schematic follows: | |
130 | + 105 | |
131 | + 106 | |
132 | + 107 * PA7>---FRNT_LEFT_DRVR---+---FL_SGNL_LAMP---GND | |
133 | + 108 * | | |
134 | + 109 * +---LEFT_INDCTR---GND | |
135 | + 110 * | | |
136 | + 111 * +---LEFT_AUDIO---GND | |
137 | + 112 | |
138 | + 113 * PA6>---FRNT_RGHT_DRVR---+---FR_SGNL_LAMP---GND | |
139 | + 114 * | | |
140 | + 115 * +---RGHT_INDCTR---GND | |
141 | + 116 * | | |
142 | + 117 * +---RGHT_AUDIO---GND | |
143 | + 118 | |
144 | + 119 * PA5>---REAR_LEFT_DRVR----RL_SGNL_LAMP---GND | |
145 | + 120 * | |
146 | + 121 * PA4>---REAR_RGHT_DRVR----RR_SGNL_LAMP---GND | |
147 | + 122 | |
148 | + 123 * PA3<---+---160K_OHM---------+---BRK_SW---12V | |
149 | + 124 * | | | |
150 | + 125 * +---5V_ZENER---GND +---CENTER_BRK_LGHT---GND | |
151 | + 126 | |
152 | + 127 * PA2<---+---160K_OHM---ENGINE_ON_SW---12V | |
153 | + 128 * | | |
154 | + 129 * +---5V_ZENER---GND | |
155 | + 130 | |
156 | + 131 * PA1>---DRVRS_ON_CNTRL | |
157 | + 132 | |
158 | + 133 * IRQ<---+---100K_OHM---Vdd | |
159 | + 134 * | | |
160 | + 135 * +---EMG_SW---GND | |
161 | + 136 | |
162 | + 137 * PB1<>--+----------LEFT_RETURN_SW---+ | |
163 | + 138 * | | | |
164 | + 139 * +---LEFT_TURN_SW---+ | | |
165 | + 140 * | | | |
166 | + 141 * Vdd---100K_OHM---+ | | |
167 | + 142 * | | | |
168 | + 143 * +---RGHT_TURN_SW---+ | | |
169 | + 144 * | | | |
170 | + 145 * PB0<>--+----------RGHT_RETURN_SW---+ | |
171 | + 146 * | | |
172 | + 147 * PA0<---+---------------------------+ | |
173 | + 148 * | | |
174 | + 149 * +---CAN_SW---100K_OHM---Vdd | |
175 | + 150 | |
176 | + 151 * RESET<---100K_OHM---Vdd | |
177 | + 152 | |
178 | + 153 * IF THIS IS IMPLEMENTED IN A REAL CIRCUIT, ESD PROTECTION MUST BE ADDED! | |
179 | + 154 | |
180 | + 0200 155 SUBHEADER 'Circuit Explication' | |
181 | + | |
182 | + | |
183 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 5 | |
184 | +Turn Signal Switch by Joel Matthew Rees | |
185 | +Circuit Explication | |
186 | + | |
187 | + 0200 155 PAGE | |
188 | + 156 * Explanatory notes: | |
189 | + 157 | |
190 | + 158 * PA1 allows the signal drivers to be shut down to preserve power. | |
191 | + 159 * I assume a suitable digital switch with power down is available. If | |
192 | + 160 * optical sensors are used for the turn signal return, the optical | |
193 | + 161 * sources would also be turned on by this signal. I assume it will be | |
194 | + 162 * active high. | |
195 | + 163 | |
196 | + 164 * I arbitrarily assume the signal lamp drivers will be active low. | |
197 | + 165 * Who could say why? It should be easy to find all references to the | |
198 | + 166 * driver lines with a text editor and reverse the active states of the | |
199 | + 167 * outputs. | |
200 | + 168 | |
201 | + 169 * Hanging the indicators and the audio feedback on the front lamp | |
202 | + 170 * drivers separates them from brake activity. Two audio feedback | |
203 | + 171 * devices are used here because there were not enough MCU outputs to | |
204 | + 172 * drive a single cheap clicking device. Stereo audio feedback might be | |
205 | + 173 * a nice touch anyway, allowing a person with binaural hearing to | |
206 | + 174 * determine by sound which signal is on. (If the ROM were a little | |
207 | + 175 * larger, a separate audio feedback could be modulated with different | |
208 | + 176 * sounds for left, right, and emergency flashers.) | |
209 | + 177 | |
210 | + 178 * The center brake light is directly switched to eliminate one of | |
211 | + 179 * the separate high-power outputs. Fortunately, its state is not | |
212 | + 180 * dependent on any other inputs. | |
213 | + 181 | |
214 | + 182 * The engine-on input (PA2) is necessary so that the MCU knows | |
215 | + 183 * when it can shut itself down to conserve power. It is an interrupting | |
216 | + 184 * input so that the MCU STOP mode can be used. Brake lights and | |
217 | + 185 * emergency flashers must be accessible when the engine is off, so those | |
218 | + 186 * inputs are also interrupting. The engine-on and brake inputs are | |
219 | + 187 * naturally positive-going signals, but the emergency flasher input is | |
220 | + 188 * not naturally biased. So the the emergency flasher seemed a more | |
221 | + 189 * natural match for IRQ. | |
222 | + 190 | |
223 | + 191 * The following crude diagram illustrates the actuation in a left | |
224 | + 192 * rotation (restoring from a right turn or turning left). The carots | |
225 | + 193 * indicate the position of the reed switches, the asterisks indicate the | |
226 | + 194 * actuation field of a magnet. | |
227 | + 195 | |
228 | + 196 * Actuation Field ******** | |
229 | + 197 * Left Return Switch ^ ^ Right Return Switch | |
230 | + 198 * ******** | |
231 | + 199 * ^ ^ | |
232 | + 200 * ******** | |
233 | + 201 * ^ ^ | |
234 | + 202 * ******** | |
235 | + 203 * ^ ^ | |
236 | + 204 * ******** | |
237 | + 205 * ^ ^ | |
238 | + 206 * ******** | |
239 | + 207 * ^ ^ | |
240 | + 208 * ******** | |
241 | + 209 * ^ ^ | |
242 | + 210 | |
243 | + 211 * Referring to the above diagram, the right turn signal return | |
244 | + 212 * switch is positioned about 5 5/8 degrees right of bottom center below | |
245 | + | |
246 | + | |
247 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 6 | |
248 | +Turn Signal Switch by Joel Matthew Rees | |
249 | +Circuit Explication | |
250 | + | |
251 | + 213 * the steering column and fixed to the steering column housing, and the | |
252 | + 214 * left return is positioned the same distance to the left. In this way, | |
253 | + 215 * when the steering wheel rotates, the return switch for the direction | |
254 | + 216 * of rotation actuates first, then the opposite direction switch closes, | |
255 | + 217 * then the same direction switch opens, and then the opposite direction | |
256 | + 218 * switch opens. Thus, when restoring from a turn, the return switch for | |
257 | + 219 * the direction of the turn closes after the other switch. In other | |
258 | + 220 * words, if you turn right, the steering wheel will rotate to the left | |
259 | + 221 * when you return to straight, and the switches actuate from left to | |
260 | + 222 * right during the restore. (I say this so many times because it takes | |
261 | + 223 * repeating to convince myself of it.) | |
262 | + 224 | |
263 | + 225 * When both turn signals are off, both turn signal switch ports | |
264 | + 226 * are set as inputs. When a turn signal switch input senses a closure, | |
265 | + 227 * its port is made an output and driven high. Now, in addition to | |
266 | + 228 * manual cancel, the cancel port can sense steering wheel rotation. In | |
267 | + 229 * same direction rotation, there is a lead period when the cancel input | |
268 | + 230 * does not remain high if the turn signal input ports' output states are | |
269 | + 231 * inverted. The debounce routine suppresses cancel if this lead time is | |
270 | + 232 * sensed. | |
271 | + 233 | |
272 | + 234 * Since the opposite direction turn signal switch port remains an | |
273 | + 235 * input, it can still be sensed. The operator can change turn signals | |
274 | + 236 * directly, without hitting the cancel button. | |
275 | + 237 | |
276 | + 238 * The separation of the switches and the actuation arc length I | |
277 | + 239 * specify are based on my assumption that the steering wheel will rotate | |
278 | + 240 * at a maximum speed of three revolutions per second, and that the four | |
279 | + 241 * to six mS (1 MHz crystal) required debounce period requires a minimum | |
280 | + 242 * 10 milli-second separate actuation period. The actual result was 10.9 | |
281 | + 243 * degrees separate actuation (21.8 total), which I arbitrarily rounded | |
282 | + 244 * up to a power of two fraction of the circle: 2*PI/16 total actuation | |
283 | + 245 * and 2*PI/32 separate actuation. | |
284 | + 246 | |
285 | + 247 * A peculiar characteristic of this design is the apparent lack of | |
286 | + 248 * use for the RESET input. Since power-on reset is built in to the | |
287 | + 249 * K-series MCUs, RESET should probably be tied high. However, I suppose | |
288 | + 250 * it could make a good manual cancel-all input, if such is necessary. | |
289 | + 251 | |
290 | + 252 * This assembler appears not to have a bit-not function for | |
291 | + 253 * operand expressions. So, I have in several places resorted to the | |
292 | + 254 * obtuse expedient of exclusive-orring bits to be reset with $FF, | |
293 | + 255 * ergo, AND #{$FF ^ F_OPC ^ F_MNC} | |
294 | + 256 * instead of AND #~(F_OPC | F_MNC) | |
295 | + 257 * which I think would have been clearer. | |
296 | + 258 | |
297 | + 259 * One more assembler quirk -- I have used $FF in a couple of | |
298 | + 260 * places I would normally have used -1 to indicate all bits set. The | |
299 | + 261 * assembler apparently turns {-1} into 1 in operands. | |
300 | + 262 | |
301 | + 0200 263 SUBHEADER 'Obligatory Mnemonics' | |
302 | + | |
303 | + | |
304 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 7 | |
305 | +Turn Signal Switch by Joel Matthew Rees | |
306 | +Obligatory Mnemonics | |
307 | + | |
308 | + 0200 263 PAGE | |
309 | + 0200 264 $base $0A | |
310 | + 0200 265 $include "68HC05K.EQU" | |
311 | + 266 | |
312 | + 0200 267 SUBHEADER 'Program Mnemonics' | |
313 | + | |
314 | + | |
315 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 8 | |
316 | +Turn Signal Switch by Joel Matthew Rees | |
317 | +Program Mnemonics | |
318 | + | |
319 | + 0200 267 PAGE | |
320 | + 268 * physical I/O definitions | |
321 | + 269 * PORTA | |
322 | + 0200 270 F_LDRV equ B7 ; four lamp drivers | |
323 | + 0200 271 F_LDRV_ equ B7_ | |
324 | + 0200 272 F_RDRV equ B6 | |
325 | + 0200 273 F_RDRV_ equ B6_ | |
326 | + 0200 274 R_LDRV equ B5 | |
327 | + 0200 275 R_LDRV_ equ B5_ | |
328 | + 0200 276 R_RDRV equ B4 | |
329 | + 0200 277 R_RDRV_ equ B4_ | |
330 | + 0200 278 DRVLMPS equ {F_LDRV | F_RDRV | R_LDRV | R_RDRV} | |
331 | + 0200 279 LFTDRV equ {F_LDRV | R_LDRV} | |
332 | + 0200 280 RGTDRV equ {F_RDRV | R_RDRV} | |
333 | + 0200 281 FRNTDRV equ {F_LDRV | F_RDRV} | |
334 | + 0200 282 REARDRV equ {R_LDRV | R_RDRV} | |
335 | + 0200 283 BRK_SW equ B3 | |
336 | + 0200 284 BRK_SW_ equ B3_ | |
337 | + 0200 285 NGN_SW equ B2 ; engine (ENG and EMG could be confusing) | |
338 | + 0200 286 NGN_SW_ equ B2_ | |
339 | + 0200 287 DRVDRV equ B1 | |
340 | + 0200 288 DRVDRV_ equ B1_ | |
341 | + 0200 289 EMG_BTF equ DRVDRV ; where to fold EMG_BT | |
342 | + 0200 290 EMG_BTF_ equ DRVDRV_ | |
343 | + 0200 291 CAN_BT equ B0 | |
344 | + 0200 292 CAN_BT_ equ B0_ | |
345 | + 293 * PORTB | |
346 | + 0200 294 LFT_BT equ B1 ; a handy data dependency! DO NOT CHANGE | |
347 | + 0200 295 LFT_BT_ equ B1_ | |
348 | + 0200 296 RGT_BT equ B0 ; another handy data dependency! | |
349 | + 0200 297 RGT_BT_ equ B0_ | |
350 | + 298 * IRQ input (inverted) is the real EMG_BT | |
351 | + 299 | |
352 | + 300 | |
353 | + 301 * logical input definitions for debounce and states | |
354 | + 302 * bits are remapped for debounce and speed | |
355 | + 303 * six bits of physical input, high two bits borrowed for cancel logic | |
356 | + 0200 304 F_LFT equ LFT_BT ; another handy data dependency! | |
357 | + 0200 305 F_LFT_ equ LFT_BT_ | |
358 | + 0200 306 F_RGT equ RGT_BT ; another handy data dependency! | |
359 | + 0200 307 F_RGT_ equ RGT_BT_ | |
360 | + 0200 308 TURNSIG equ {F_LFT | F_RGT} | |
361 | + 0200 309 F_BRK equ {BRK_SW < 2} ; physical output bit | |
362 | + 0200 310 F_BRK_ equ {BRK_SW_ + 2} | |
363 | + 0200 311 F_NGN equ {NGN_SW < 2} ; physical output bit | |
364 | + 0200 312 F_NGN_ equ {NGN_SW_ + 2} | |
365 | + 0200 313 F_EMG equ {DRVDRV < 2} ; fold onto output bit | |
366 | + 0200 314 F_EMG_ equ {DRVDRV_ + 2} | |
367 | + 0200 315 ANYLITE equ {TURNSIG | F_BRK | F_EMG} | |
368 | + 0200 316 F_CAN equ {CAN_BT < 2} | |
369 | + 0200 317 F_CAN_ equ {CAN_BT_ + 2} | |
370 | + 0200 318 F_OPC equ $40 ; opposite direction cancel record | |
371 | + 0200 319 F_MNC equ $80 ; manual cancel record | |
372 | + 320 | |
373 | + 321 * The turn signal table and many of the turn signal routines | |
374 | + 322 * depend on F_LFT and F_RGT and LFT_BT and RGT_BT being in bits one and | |
375 | + 323 * zero (but not particular which is which!). If these are changed, | |
376 | + 324 * there will be a domino effect on the rest of the code. | |
377 | + | |
378 | + | |
379 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 9 | |
380 | +Turn Signal Switch by Joel Matthew Rees | |
381 | +Program Mnemonics | |
382 | + | |
383 | + 325 | |
384 | + 0200 326 SUBHEADER 'Resource Definitions' | |
385 | + | |
386 | + | |
387 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 10 | |
388 | +Turn Signal Switch by Joel Matthew Rees | |
389 | +Resource Definitions | |
390 | + | |
391 | + 0200 326 PAGE | |
392 | + 327 | |
393 | + 328 | |
394 | + 0200 329 XTAL equ 1 ; crystal frequency, in MHz | |
395 | + 0200 330 RTIPOW equ 0 | |
396 | + 331 * 1 ; bits 1 & 0 for timer hardware | |
397 | + 0200 332 RTIRATE equ {2 < RTIPOW} ; 2 ^ RTIPOW | |
398 | + 0200 333 TIMOUT equ 1 | |
399 | + 334 * {9155*XTAL/RTIRATE+1} ; 5 minutes (if XTAL equ is correct) | |
400 | + 335 * only one flash rate, 2/3 duty cycle | |
401 | + 0200 336 FLASH0 equ 1 | |
402 | + 337 * {32*XTAL/RTIRATE/4} ; about 1/4 second off time | |
403 | + 0200 338 FLASH1 equ 1 | |
404 | + 339 * {32*XTAL/RTIRATE/2} ; about 1/2 second on time | |
405 | + 340 | |
406 | + 0017 341 org MOR | |
407 | + 342 * Software Pulldown is used. | |
408 | + 343 * Can't spare the third RC oscillator pin. | |
409 | + 344 * Set RC because we assume the cheap oscillator. | |
410 | + 345 * STOP must not convert to WAIT: saves power when engine off. | |
411 | + 346 * Assume Low Voltage Reset would be meaningless. | |
412 | + 347 * PA3 - PA0 interrupts are used to bring the chip up for brake, engine on. | |
413 | + 348 * Accept level sensitive interrupts, since IRQ is disabled immediately. | |
414 | + 349 * Assume COP might be useful here. | |
415 | + 0017 27 350 fcb {RC | PIRQ | LEVEL | COPEN} | |
416 | + 351 | |
417 | + 00E0 352 org RAMBEG | |
418 | + 00E0 353 DEBO rmb 3 ; the debounce record chain | |
419 | + 00E3 354 SSTBLE rmb 1 ; temporary record of stable bits | |
420 | + 00E4 355 TOGGLE rmb 1 ; record of toggles | |
421 | + 00E5 356 ISTATE rmb 1 ; record of the current input state | |
422 | + 00E6 357 STATES rmb 1 ; current controller states | |
423 | + 00E7 358 NGN_TIM rmb 2 ; engine time out timer | |
424 | + 00E9 359 FLASH rmb 1 ; flash timer | |
425 | + 00EA 360 FLDARK rmb 1 ; flash light or dark state, 11111111 == dark | |
426 | + 00EB 361 FLMASK rmb 1 ; flash mask to communicate between BRK, EMG, and TRN | |
427 | + 00EC 362 TMPTRN rmb 1 ; temporary for keep turn signal interpretation | |
428 | + 00ED 363 LASTST rmb 1 ; previous state record to separate timer from decode | |
429 | + 00EE 364 rmb 4 | |
430 | + 00F2 365 DBGCT rmb 4 ; count how many times TIMSRV has executed | |
431 | + 366 | |
432 | + 367 | |
433 | + 368 * ROM definitions follow: | |
434 | + 0200 369 org ROMBEG | |
435 | + 370 | |
436 | + 0200 371 SUBHEADER 'Timer Service Code' | |
437 | + | |
438 | + | |
439 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 11 | |
440 | +Turn Signal Switch by Joel Matthew Rees | |
441 | +Timer Service Code | |
442 | + | |
443 | + 0200 371 PAGE | |
444 | + 372 | |
445 | + 373 * The timer service routine has these functions: debouncing the | |
446 | + 374 * inputs, flagging changes in TOGGLE, adjusting STATES to match the | |
447 | + 375 * inputs, and maintaining two software clocks. Interrupts occur on timer | |
448 | + 376 * overflow (1024 CPU cycles). | |
449 | + 377 | |
450 | + 378 * The debounce routine translates the physical inputs to logical | |
451 | + 379 * inputs, maintains a record of the last three logical states sensed in | |
452 | + 380 * DEBO, debounces (in parallel) each input on three identical states, | |
453 | + 381 * flags changes in the debounced input in TOGGLE, and leaves the current | |
454 | + 382 * debounced input in ISTATE. Since debouncing occurs on three identical | |
455 | + 383 * states, the debounce period is between two and three timer overflows | |
456 | + 384 * -- 4 to 6 mS with a 1 MHz crystal, 2 to 3 mS with a 2 MHz crystal. | |
457 | + 385 | |
458 | + 386 * This debounce technique works because we don't care what is | |
459 | + 387 * happening to the inputs between timer overflows, and because we assume | |
460 | + 388 * there is no physical mechanism to induce noise coincident and rythmic | |
461 | + 389 * with timer overflow. | |
462 | + 390 | |
463 | + 391 * The TOGGLE cancel (F_CAN) bit is suppressed on same-direction | |
464 | + 392 * rotation. Trailing edge TOGGLE F_CAN and F_EMG are filtered out to | |
465 | + 393 * simplify interpretation of those functions. Opposite direction cancel | |
466 | + 394 * (F_OPC) and manual cancel (F_MNC) ISTATE auxiliary flags are | |
467 | + 395 * maintained to provide information on the source of the F_CAN bit, and | |
468 | + 396 * are always filtered out of TOGGLE and STATES. STATES F_CAN is | |
469 | + 397 * adjusted according to TOGGLE F_CAN rather than ISTATE F_CAN, by which | |
470 | + 398 * means we hope to not need to remember in which direction a cancel was | |
471 | + 399 * sensed. In other words, we hope that F_CAN does not toggle again | |
472 | + 400 * until both return sensors are past the actuator field. | |
473 | + 401 | |
474 | + 402 * After adding an event queue and checking the timing results, two | |
475 | + 403 * things became clear: there is plenty of time to handle all the changes | |
476 | + 404 * to STATES without a queue, and TOGGLE makes a sort of horizontal | |
477 | + 405 * priority queue anyway. In other words, there is no reason to make the | |
478 | + 406 * adjustments to STATES asynchronous when there is plenty of headroom | |
479 | + 407 * for synchronous adjustments. Moreover, the adjustments take less time | |
480 | + 408 * than organizing the button events in a queue. (Darn! I was kind of | |
481 | + 409 * proud of that six byte queue, and the shift technique for storing | |
482 | + 410 * events into it.) | |
483 | + 411 | |
484 | + 412 * When moving the ISTATE turn signal bits to STATES, the STATES | |
485 | + 413 * turn signal bits are examined to see if the direction has changed. If | |
486 | + 414 * a STATE turn signal bit is on, PORTB is set to wait for F_CAN. | |
487 | + 415 | |
488 | + 416 * The engine time-out counter communicates with the power down | |
489 | + 417 * routine via the STATES engine on (F_NGN) bit. In other words, STATES | |
490 | + 418 * F_NGN bit is held off until the ISTATE F_NGN bit and the STATES F_EMG | |
491 | + 419 * and F_BRK bits have been inactive for five minutes. (This perhaps | |
492 | + 420 * overloads the semantics of STATES F_NGN.) | |
493 | + 421 | |
494 | + 422 * In the current design, the turn signals are not masked with the | |
495 | + 423 * ISTATE F_NGN bit, and so will function during the time-out period. | |
496 | + 424 * This "feature" can easily be corrected in the debounce routine. | |
497 | + 425 | |
498 | + 426 * It should be relatively easy to add a turn signal time-out | |
499 | + 427 * counter to turn off the turn signals after the same turn signal has | |
500 | + 428 * been on an un-reasonable period, such as five or more minutes. | |
501 | + | |
502 | + | |
503 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 12 | |
504 | +Turn Signal Switch by Joel Matthew Rees | |
505 | +Timer Service Code | |
506 | + | |
507 | + 429 * Such a time-out might negatively impact safety when attempting to turn | |
508 | + 430 * in backed-up traffic or onto a very busy highway, or when using the | |
509 | + 431 * turn signal to show a car parked for delivery, etc. It also might | |
510 | + 432 * cause drivers to become even lazier. | |
511 | + 433 | |
512 | + 434 * Both timers reset in such a manner as to be in a known state at | |
513 | + 435 * any time they are put into use. | |
514 | + 436 | |
515 | + 437 * The single emergency and turn signal signal flasher uses a single | |
516 | + 438 * rate and duty cycle. | |
517 | + 439 | |
518 | + 0200 440 SUBHEADER 'Timer Service Code -- Debounce and Toggle Filter' | |
519 | + | |
520 | + | |
521 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 13 | |
522 | +Turn Signal Switch by Joel Matthew Rees | |
523 | +Timer Service Code -- Debounce and Toggle Filter | |
524 | + | |
525 | + 0200 440 PAGE | |
526 | + 441 | |
527 | + 0200 83 442 swi ; since we have a few unused ROM locations | |
528 | + 0201 83 443 swi | |
529 | + 0202 83 444 swi | |
530 | + 445 | |
531 | + 0203 446 $CYCLE_ADDER_ON | |
532 | + 0203 1608 447 TIMSRV bset TOFR_,TSCR | |
533 | + 448 | |
534 | + 449 * move the debounce chain | |
535 | + 0205 B6E1 450 lda DEBO+1 | |
536 | + 0207 B7E2 451 sta DEBO+2 | |
537 | + 0209 B6E0 452 lda DEBO | |
538 | + 020B B7E1 453 sta DEBO+1 | |
539 | + 454 | |
540 | + 455 * record previous STATE | |
541 | + 020D B6E6 456 lda STATES | |
542 | + 020F B7ED 457 sta LASTST | |
543 | + 458 | |
544 | + 459 * read the static inputs, converting physical to logical | |
545 | + 0211 B600 460 lda PORTA | |
546 | + 0213 A40D 461 and #{BRK_SW | NGN_SW | CAN_BT} ; clears DRV_DRV | |
547 | + 0215 2F02 462 bih TMIEMG ; invert EMG and fold it in | |
548 | + 0217 AA02 463 ora #EMG_BTF ; keep temporally very close to first read | |
549 | + 0219 464 TMIEMG equ * | |
550 | + 0219 48 465 lsla ; remap | |
551 | + 021A 48 466 lsla | |
552 | + 021B B7E0 467 sta DEBO | |
553 | + 021D B601 468 lda PORTB ; PB2-7 always read 0 | |
554 | + 021F BAE0 469 ora DEBO | |
555 | + 0221 B7E0 470 sta DEBO | |
556 | + 471 | |
557 | + 472 * read the turn signal return and manual cancel auxiliary flags | |
558 | + 473 * (F_CAN & turn_sig_on) <=> read auxiliary flags | |
559 | + 474 * Assume that DDRB showing output means turn signal on and waiting | |
560 | + 475 * for cancel. | |
561 | + 476 * Filtering F_CAN on same-direction turn is handled later. | |
562 | + 477 * Remember that F_CAN should be sensed via TOGGLE, to avoid multiple | |
563 | + 478 * interpretations of one pass of the actuator. | |
564 | + 479 | |
565 | + 0223 A504 480 bit #F_CAN ; nothing at all without cancel | |
566 | + 0225 2725 481 beq TM0TURN | |
567 | + 0227 BE05 482 ldx DDRB ; cancel meaningless if not waiting for it | |
568 | + 0229 2721 483 beq TM0TURN | |
569 | +TOTAL CYCLES = 0 decimal | |
570 | + 022B 484 $CYCLE_ADDER_OFF | |
571 | + 022B 485 $CYCLE_ADDER_ON | |
572 | + 022B 9F 486 txa | |
573 | + 022C A803 487 eor #{LFT_BT | RGT_BT} ; strobe other side | |
574 | + 022E B701 488 sta PORTB ; set output state first | |
575 | + 0230 B705 489 sta DDRB ; handy (data dependent) output state, huh? | |
576 | + 0232 000000 490 brset CAN_BT_,PORTA,TMTBIT6 ; CAN_BT_ into carry | |
577 | + 0235 46 491 TMTBIT6 rora ; carry into bit 7 | |
578 | + 0236 3F05 492 clr DDRB ; kill strobe: manual cancel? | |
579 | + 0238 000000 493 brset CAN_BT_,PORTA,TMTBIT7 ; CAN_BT_ into carry again | |
580 | + 023B 46 494 TMTBIT7 rora ; carry into bit 7 again | |
581 | + 023C A4C0 495 and #{F_OPC | F_MNC} | |
582 | + 023E BAE0 496 ora DEBO | |
583 | + | |
584 | + | |
585 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 14 | |
586 | +Turn Signal Switch by Joel Matthew Rees | |
587 | +Timer Service Code -- Debounce and Toggle Filter | |
588 | + | |
589 | + 0240 A540 497 bit #F_OPC ; ignore turn signals if opposition cancel | |
590 | + 0242 2702 498 beq TMTNTN | |
591 | + 0244 A4FC 499 and #{$FF ^ TURNSIG} | |
592 | + 0246 B7E0 500 TMTNTN sta DEBO | |
593 | + 0248 BF01 501 stx PORTB ; restore turn signal inputs | |
594 | + 024A BF05 502 stx DDRB | |
595 | + 024C 503 TM0TURN equ * | |
596 | + 504 * leave A == DEBO | |
597 | +TOTAL CYCLES = 0 decimal | |
598 | + 024C 505 $CYCLE_ADDER_OFF | |
599 | + 024C 506 $CYCLE_ADDER_ON | |
600 | + 507 | |
601 | + 508 * debounce inputs, set flags in TOGGLE and ISTATE | |
602 | + 509 * STABLE_BITS = ~((DEBO[0] ^ DEBO[1]) | (DEBO[1] ^ DEBO[2])) | |
603 | + 510 * A == DEBO on entry | |
604 | + 024C B8E1 511 eor DEBO+1 | |
605 | + 024E B7E4 512 sta TOGGLE ; re-use TOGGLE, TOGGLE not valid | |
606 | + 0250 B6E1 513 lda DEBO+1 | |
607 | + 0252 B8E2 514 eor DEBO+2 | |
608 | + 0254 BAE4 515 ora TOGGLE ; a bit for any input that bounced | |
609 | + 0256 43 516 coma ; bits that bounced are clear | |
610 | + 0257 97 517 tax ; STABLE_BITS | |
611 | + 0258 B4E0 518 and DEBO ; state of stable bits | |
612 | + 025A B7E3 519 sta SSTBLE ; (unstable bits still clear) | |
613 | + 025C 9F 520 txa | |
614 | + 025D B4E5 521 and ISTATE ; look only at bits that are stable | |
615 | + 025F B8E3 522 eor SSTBLE ; flag bits that toggled | |
616 | + 0261 B7E4 523 sta TOGGLE ; true TOGGLEs, but not yet filtered | |
617 | + 0263 43 524 coma ; mask of non-toggles | |
618 | + 0264 B4E5 525 and ISTATE ; old state of non-toggles | |
619 | + 0266 B7E5 526 sta ISTATE ; (toggled bits cleared) | |
620 | + 0268 B6E4 527 lda TOGGLE ; mask of toggles | |
621 | + 026A B4E3 528 and SSTBLE ; new states of bits that toggled | |
622 | + 026C BAE5 529 ora ISTATE | |
623 | + 026E B7E5 530 sta ISTATE ; ISTATE now has current debounced inputs | |
624 | + 531 * leave A == ISTATE | |
625 | + 532 | |
626 | + 533 * filter out TOGGLE F_CAN if same direction | |
627 | + 534 * A == ISTATE on entry | |
628 | + 0270 A5C0 535 bit #{F_OPC | F_MNC} ; opposite direction or manual? | |
629 | + 0272 2602 536 bne TMF1CAN | |
630 | + 0274 15E4 537 bclr F_CAN_,TOGGLE ; same direction | |
631 | + 0276 538 TMF1CAN equ * | |
632 | + 539 * leave A == ISTATE | |
633 | + 540 | |
634 | + 541 * filter out trailing edge of F_EMG and F_CAN in TOGGLE | |
635 | + 542 * also filter out auxiliary TOGGLEs in passing | |
636 | + 543 * ISTATE == A on entry | |
637 | + 0276 AA33 544 ora #{F_NGN | F_BRK | F_LFT | F_RGT} ; not filtered | |
638 | + 0278 B4E4 545 and TOGGLE ; filter (logical) fall(en) edges | |
639 | + 027A A43F 546 and #{$FF ^ F_OPC ^ F_MNC} ; auxiliaries should never TOGGLE | |
640 | + 027C B7E4 547 sta TOGGLE | |
641 | + 548 * leave A == TOGGLE | |
642 | + 549 | |
643 | + 027E 550 SUBHEADER 'Timer Service Code -- Adjust STATES' | |
644 | + | |
645 | + | |
646 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 15 | |
647 | +Turn Signal Switch by Joel Matthew Rees | |
648 | +Timer Service Code -- Adjust STATES | |
649 | + | |
650 | + 027E 550 PAGE | |
651 | + 551 | |
652 | + 552 * move brake bit from ISTATE to STATES | |
653 | + 027E 1BE6 553 bclr F_BRK_,STATES | |
654 | + 0280 0BE502 554 brclr F_BRK_,ISTATE,TMF0BRK | |
655 | + 0283 1AE6 555 bset F_BRK_,STATES | |
656 | + 0285 556 TMF0BRK equ * | |
657 | + 557 | |
658 | + 558 * toggle STATES F_EMG if TOGGLE F_EMG | |
659 | + 559 * act on TOGGLE to avoid multiple reads of EMG button | |
660 | + 0285 07E406 560 brclr F_EMG_,TOGGLE,TMF0EMG | |
661 | + 0288 B6E6 561 lda STATES | |
662 | + 028A A808 562 eor #F_EMG | |
663 | + 028C B7E6 563 sta STATES ; STATES not yet valid! | |
664 | + 028E 564 TMF0EMG equ * | |
665 | + 028E 201A 565 bra TMSTRN ; skip over the turn signal states table | |
666 | + 566 * leaves A indeterminate | |
667 | + 567 | |
668 | + 0290 83 568 swi ; since we have a few unused ROM locations | |
669 | + 0291 83 569 swi | |
670 | + 0292 83 570 swi | |
671 | + 0293 83 571 swi | |
672 | + 0294 83 572 swi | |
673 | + 573 | |
674 | + 574 * this table is very data dependent | |
675 | + 0295 575 TURNSTATE equ * ; depends on turn signals being rightmost | |
676 | + 576 * S' S I | |
677 | + 0295 00 577 fcb %00 ; 00 00 | |
678 | + 0296 01 578 fcb %01 ; 00 01 | |
679 | + 0297 02 579 fcb %10 ; 00 10 | |
680 | + 0298 08 580 fcb {%00 | F_EMG} ; 00 11 set F_EMG instead | |
681 | + 0299 01 581 fcb %01 ; 01 00 | |
682 | + 029A 01 582 fcb %01 ; 01 01 | |
683 | + 029B 02 583 fcb %10 ; 01 10 should not occur | |
684 | + 029C 02 584 fcb %10 ; 01 11 this inverts directions | |
685 | + 029D 02 585 fcb %10 ; 10 00 | |
686 | + 029E 01 586 fcb %01 ; 10 01 should not occur | |
687 | + 029F 02 587 fcb %10 ; 10 10 | |
688 | + 02A0 01 588 fcb %01 ; 10 11 this inverts directions | |
689 | + 02A1 00 589 fcb %00 ; 11 00 should not occur | |
690 | + 02A2 01 590 fcb %01 ; 11 01 should not occur | |
691 | + 02A3 02 591 fcb %10 ; 11 10 should not occur | |
692 | + 02A4 00 592 fcb %00 ; 11 11 should not occur | |
693 | + 593 * Since PEPROM accesses only one bit at a time, | |
694 | + 594 * and since I can't figure out how to build the turn signal new state | |
695 | + 595 * table in the PEPROM as part of this file anyway, | |
696 | + 596 * and since we apparently have plenty of ROM, | |
697 | + 597 * I decided this table is not a good candidate for the PEPROM. | |
698 | + 598 * Darn! | |
699 | + 599 * After careful consideration, I decided this table does not benefit | |
700 | + 600 * from a more symbolic construction. As it stands, it does not matter | |
701 | + 601 * whether F_LFT or F_RGT is b0, only that they do reside in B0 and B1. | |
702 | + 602 | |
703 | + 02A5 83 603 swi ; since we have a few unused ROM locations | |
704 | + 02A6 83 604 swi | |
705 | + 02A7 83 605 swi | |
706 | + 02A8 83 606 swi | |
707 | + 02A9 83 607 swi | |
708 | + | |
709 | + | |
710 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 16 | |
711 | +Turn Signal Switch by Joel Matthew Rees | |
712 | +Timer Service Code -- Adjust STATES | |
713 | + | |
714 | + 608 | |
715 | + 609 * turn on STATES turn signal if ISTATE turn signal is on | |
716 | + 610 * check to see if direction has changed | |
717 | + 02AA B6E6 611 TMSTRN lda STATES | |
718 | + 02AC A403 612 and #TURNSIG | |
719 | + 02AE 48 613 lsla | |
720 | + 02AF 48 614 lsla | |
721 | + 02B0 B7EC 615 sta TMPTRN | |
722 | + 02B2 B6E5 616 lda ISTATE | |
723 | + 02B4 A403 617 and #TURNSIG | |
724 | + 02B6 BAEC 618 ora TMPTRN | |
725 | + 02B8 97 619 tax | |
726 | + 02B9 D60295 620 lda TURNSTATE,x | |
727 | + 02BC B7EC 621 sta TMPTRN | |
728 | + 02BE B6E6 622 lda STATES | |
729 | + 02C0 A4FC 623 and #{$FF ^ TURNSIG} | |
730 | + 02C2 BAEC 624 ora TMPTRN ; table is 0s in b2-7, except forced F_EMG | |
731 | + 02C4 B7E6 625 sta STATES ; may be reset by F_CAN | |
732 | + 626 * leaves A == STATES | |
733 | + 627 | |
734 | + 628 * cancel STATES turn signal if TOGGLE F_CAN is not filtered out | |
735 | + 629 * Act on TOGGLE to avoid multiple reads of single actuator pass! | |
736 | + 630 * A == STATES on entry | |
737 | + 02C6 05E404 631 brclr F_CAN_,TOGGLE,TMCAN0 | |
738 | + 02C9 A4FC 632 and #{$FF ^ TURNSIG} | |
739 | + 02CB B7E6 633 sta STATES ; STATES not yet valid! | |
740 | + 02CD 634 TMCAN0 equ * ; turn signals are valid | |
741 | + 635 * leaves A == STATES | |
742 | + 636 | |
743 | + 637 * Now we should have no more than one turn signal on. | |
744 | + 638 * set up steering wheel return sense state or clear it | |
745 | + 639 * then latch turn signal input to keep it from reverting | |
746 | + 640 * A == STATES on entry | |
747 | + 02CD A403 641 and #TURNSIG | |
748 | + 02CF B701 642 sta PORTB ; another handy value dependency! | |
749 | + 02D1 B705 643 sta DDRB ; gate it out, if there | |
750 | + 644 * I feel there is a better way, but I'm out of time | |
751 | + 02D3 B7EC 645 sta TMPTRN ; feed response back | |
752 | + 02D5 B6E5 646 lda ISTATE | |
753 | + 02D7 A4FC 647 and #{$FF ^ TURNSIG} | |
754 | + 02D9 BAEC 648 ora TMPTRN | |
755 | + 02DB B7E5 649 sta ISTATE | |
756 | + 650 * leaves A == ISTATE | |
757 | + 651 | |
758 | + 652 * if not timed out, STATES F_NGN should not yet be clear! | |
759 | + 02DD B6E8 653 lda NGN_TIM+1 | |
760 | + 02DF BAE7 654 ora NGN_TIM | |
761 | + 02E1 2602 655 bne TMFNGN0 | |
762 | + 02E3 18E6 656 bset F_NGN_,STATES ; might time out before RTI | |
763 | + 02E5 657 TMFNGN0 equ * | |
764 | + 658 | |
765 | + 659 * STATES is still not valid! | |
766 | + 660 * fall through to TMCLOCK | |
767 | + 661 | |
768 | + 02E5 662 SUBHEADER 'Timer Service Code -- Engine Time Out and Flasher Timers' | |
769 | + | |
770 | + | |
771 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 17 | |
772 | +Turn Signal Switch by Joel Matthew Rees | |
773 | +Timer Service Code -- Engine Time Out and Flasher Timers | |
774 | + | |
775 | + 02E5 662 PAGE | |
776 | + 663 | |
777 | + 664 * reset engine time-out if F_NGN, F_EMG, or F_BRK TOGGLEs | |
778 | + 02E5 B6E4 665 TMCLOCK lda TOGGLE | |
779 | + 02E7 A438 666 and #{F_NGN | F_EMG | F_BRK} | |
780 | + 02E9 2708 667 beq TMORST | |
781 | + 02EB A601 668 lda #{TIMOUT & $FF } ; reset value low byte | |
782 | + 02ED B7E8 669 sta NGN_TIM+1 | |
783 | + 02EF A601 670 lda #{TIMOUT / $100 + 1} ; borrow on 0, not -1 | |
784 | + 02F1 B7E7 671 sta NGN_TIM | |
785 | + 02F3 672 TMORST equ * | |
786 | + 673 | |
787 | + 674 * if flashers TOGGLE off, reset the flashers | |
788 | + 675 * if they TOGGLE on, clear the mask only if none on before | |
789 | + 02F3 A60B 676 lda #{F_EMG | TURNSIG} | |
790 | + 02F5 B5E4 677 bit TOGGLE | |
791 | + 02F7 2714 678 beq TMSCLK | |
792 | + 02F9 B5E6 679 bit STATES ; flasher active? | |
793 | + 02FB 260A 680 bne TMMFLH | |
794 | + 02FD A6FF 681 lda #$FF ; reset flash timer | |
795 | + 02FF B7EA 682 sta FLDARK | |
796 | + 0301 A601 683 lda #FLASH1 | |
797 | + 0303 B7E9 684 sta FLASH | |
798 | + 0305 2006 685 bra TMSCLK | |
799 | + 686 | |
800 | + 0307 B5ED 687 TMMFLH bit LASTST ; flashers already running? | |
801 | + 0309 2602 688 bne TMMFLH0 ; might be better to shine on every change? | |
802 | + 030B 3FEA 689 clr FLDARK | |
803 | + 030D 690 TMMFLH0 equ * | |
804 | + 691 | |
805 | + 692 * Although the Real Time Interrupt is masked, the software clocks | |
806 | + 693 * clock on the RTI flag. See RTIPOW for the RTI flag rate | |
807 | + 694 | |
808 | + 030D 0D082D 695 TMSCLK brclr RTIF_,TSCR,TIMDUN | |
809 | + 0310 1408 696 bset RTIFR_,TSCR | |
810 | + 697 | |
811 | + 698 * Engine time-out counter only runs when the ISTATE F_NGN bit is | |
812 | + 699 * low and the emergency flashers and brakes (STATES F_EMG and F_BRK) are | |
813 | + 700 * with power down routine via STATES F_NGN. | |
814 | + 701 | |
815 | + 0312 08E514 702 brset F_NGN_,ISTATE,TMNGNR0 | |
816 | + 0315 B6E6 703 lda STATES | |
817 | + 0317 A438 704 and #{F_NGN | F_EMG | F_BRK} ; brakes or emg flashers? | |
818 | + 0319 A810 705 eor #F_NGN ; already counted out? | |
819 | + 031B 260C 706 bne TMNGNR0 | |
820 | + 031D 3AE8 707 dec NGN_TIM+1 | |
821 | + 031F 2608 708 bne TMNGNR0 ; initial count is adjusted to make this work | |
822 | + 0321 3AE7 709 dec NGN_TIM | |
823 | + 0323 2604 710 bne TMNGNR0 | |
824 | + 0325 19E6 711 bclr F_NGN_,STATES ; signal timed out | |
825 | + 0327 18E4 712 bset F_NGN_,TOGGLE ; communicate change to STATES F_NGN | |
826 | + 0329 713 TMNGNR0 equ * ; Only now is STATES valid! | |
827 | + 714 | |
828 | + 715 * The flasher counter runs only when STATES F_EMG, F_LFT, or F_RGT | |
829 | + 716 * are set. When there are no flashers running, FLDARK is set, causing | |
830 | + 717 * FLASH1 (on time) to be loaded when when flasher timer starts. | |
831 | + 718 | |
832 | + 0329 A60B 719 TMFLASH lda #{F_EMG | TURNSIG} | |
833 | + | |
834 | + | |
835 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 18 | |
836 | +Turn Signal Switch by Joel Matthew Rees | |
837 | +Timer Service Code -- Engine Time Out and Flasher Timers | |
838 | + | |
839 | + 032B B5E6 720 bit STATES ; flasher active? | |
840 | + 032D 270E 721 beq TMFLH0 | |
841 | + 032F 3AE9 722 dec FLASH | |
842 | + 0331 260A 723 bne TMFLH0 | |
843 | + 0333 A601 724 lda #FLASH1 | |
844 | + 0335 33EA 725 com FLDARK | |
845 | + 0337 2A02 726 bpl TMFLTM ; result dark (1s) or light (0s) | |
846 | + 0339 A601 727 lda #FLASH0 | |
847 | + 033B B7E9 728 TMFLTM sta FLASH | |
848 | + 033D 729 TMFLH0 equ * | |
849 | + 730 | |
850 | + 731 * It might be amusing to install a turn signal time out so that if | |
851 | + 732 * the turn signals remain flashing for more than ten minutes, they turn | |
852 | + 733 * themselves off. The entire mechanism should fit here. As mentioned | |
853 | + 734 * above, consider safety first! | |
854 | + 735 | |
855 | + 736 TIMDUN | |
856 | + 033D 3CF5 737 inc DBGCT+3 ; count number of timer interrupts serviced | |
857 | + 033F 260A 738 bne TIMDUX ; put here strictly for debugging sessions | |
858 | + 0341 3CF4 739 inc DBGCT+2 ; so I can have an idea of virtual time | |
859 | + 0343 2606 740 bne TIMDUX | |
860 | + 0345 3CF3 741 inc DBGCT+1 | |
861 | + 0347 2602 742 bne TIMDUX | |
862 | + 0349 3CF2 743 inc DBGCT | |
863 | + 744 TIMDUX | |
864 | + 034B 120A 745 bset IRQR_,ISCR ; POTA and IRQ activity may set IRQF | |
865 | + 034D 80 746 rti | |
866 | +TOTAL CYCLES = 0 decimal | |
867 | + 034E 747 $CYCLE_ADDER_OFF | |
868 | + 748 | |
869 | + 034E 83 749 swi ; more unused ROM | |
870 | + 034F 83 750 swi | |
871 | + 0350 83 751 swi | |
872 | + 0351 83 752 swi | |
873 | + 0352 83 753 swi | |
874 | + 0353 83 754 swi | |
875 | + 0354 83 755 swi | |
876 | + 756 | |
877 | + 0355 757 SUBHEADER 'Initializations' | |
878 | + | |
879 | + | |
880 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 19 | |
881 | +Turn Signal Switch by Joel Matthew Rees | |
882 | +Initializations | |
883 | + | |
884 | + 0355 757 PAGE | |
885 | + 758 | |
886 | + 759 * waking up simply resets the MCU | |
887 | + 760 * if SWI occurs, the machine is not in a defined state, and must reset | |
888 | + 761 IRQSRV | |
889 | + 762 SWISRV | |
890 | + 0355 AE5C 763 ldx #$5C ; unique | |
891 | + 0357 CF03F0 764 stx COPR | |
892 | + 035A 9C 765 rsp ; now falls through to RSTSRV | |
893 | + 035B 120A 766 bset IRQR_,ISCR ; it just gets us started | |
894 | + 767 | |
895 | + 768 * general inits | |
896 | + 769 RSTSRV | |
897 | + 770 * disable external interrupts | |
898 | + 035D 1F0A 771 bclr IRQE_,ISCR ; disable external interrupts | |
899 | + 035F 120A 772 bset IRQR_,ISCR ; clear the external interrupt flag | |
900 | + 773 * get ports stared right | |
901 | + 0361 A6F0 774 lda #DRVLMPS | |
902 | + 0363 B700 775 sta PORTA ; initial output values | |
903 | + 0365 A6F2 776 lda #{DRVLMPS | DRVDRV} | |
904 | + 0367 B704 777 sta DDRA ; set up directions | |
905 | + 0369 B710 778 sta PDRA ; pull downs only on inputs | |
906 | + 036B 3F01 779 clr PORTB ; initial outputs (do port B just in case) | |
907 | + 036D 3F05 780 clr DDRB ; B initially input | |
908 | + 036F 3F11 781 clr PDRB ; with pull downs set | |
909 | + 782 * make sure EPROM programming stuff is out of the way | |
910 | + 783 * clr EPROG ; ICS05K complains, skip by hand | |
911 | + 0371 3F0F 784 clr PESCR | |
912 | + 785 * set up specific variables | |
913 | + 0373 A610 786 lda #F_NGN ; pretend the engine is on, to get us started | |
914 | + 0375 B7E0 787 sta DEBO ; start debounce chain clear | |
915 | + 0377 B7E1 788 sta DEBO+1 ; DEBO+2 is thrown out on first timer interrupt | |
916 | + 0379 B7E6 789 sta STATES ; no unknown states | |
917 | + 037B B7E5 790 sta ISTATE | |
918 | + 037D A601 791 lda #{TIMOUT & $FF } ; reset time-out low byte | |
919 | + 037F B7E8 792 sta NGN_TIM+1 | |
920 | + 0381 A601 793 lda #{TIMOUT / $100 + 1} ; counter borrows on 0, not -1 | |
921 | + 0383 B7E7 794 sta NGN_TIM | |
922 | + 0385 A6FF 795 lda #$FF | |
923 | + 0387 B7EA 796 sta FLDARK ; initial flash state is dark | |
924 | + 0389 A601 797 lda #FLASH1 | |
925 | + 038B B7E9 798 sta FLASH ; initial flash time is on/light state | |
926 | + 799 * clear the virtual debugging time counter | |
927 | + 038D 3FF2 800 clr DBGCT | |
928 | + 038F 3FF3 801 clr DBGCT+1 | |
929 | + 0391 3FF4 802 clr DBGCT+2 | |
930 | + 0393 3FF5 803 clr DBGCT+3 | |
931 | + 804 * set up hardware timer | |
932 | + 0395 AE6A 805 ldx #$6A ; unique use of X | |
933 | + 0397 CF03F0 806 stx COPR ; b0 clear, about to change timer rate | |
934 | + 039A A600 807 lda #{RTIPOW} ; set rate | |
935 | + 039C B708 808 sta TSCR | |
936 | + 039E AA0C 809 ora #{TOFR | RTIFR} ; clear pending interrupts | |
937 | + 03A0 B708 810 sta TSCR | |
938 | + 03A2 1A08 811 bset TOIE_,TSCR ; first section overflow interrupt only | |
939 | + 812 | |
940 | + 813 * Falls through to DOSTATES | |
941 | + 814 | |
942 | + | |
943 | + | |
944 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 20 | |
945 | +Turn Signal Switch by Joel Matthew Rees | |
946 | +DOSTATES: Interpret States | |
947 | + | |
948 | + 03A4 815 SUBHEADER 'DOSTATES: Interpret States' | |
949 | + | |
950 | + | |
951 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 21 | |
952 | +Turn Signal Switch by Joel Matthew Rees | |
953 | +DOSTATES: Interpret States | |
954 | + | |
955 | + 03A4 815 PAGE | |
956 | + 816 | |
957 | + 817 * The debounce and timer routines make the output state machine | |
958 | + 818 * simple. All indicator lamps are set according to the indicator STATES, | |
959 | + 819 * then masked by the current flasher output state (FLDARK). Then, if the | |
960 | + 820 * brake light STATES bit is set, the rear lamps are forced on. Then, | |
961 | + 821 * DRVDRV is only set if lamps are on (to save power when the engine is | |
962 | + 822 * off). | |
963 | + 823 | |
964 | + 824 * Finally, if STATES F_NGN bit is clear, the power-down routine is | |
965 | + 825 * executed (and never returned from). Again, requiring the time-out | |
966 | + 826 * counter to hold off the STATES engine-on bit may be a bit of a | |
967 | + 827 * semantic overload, but it seems more natural than making the STATES | |
968 | + 828 * F_NGN bit a mere mirror of ISTATE F_NGN, and then maintaining a | |
969 | + 829 * separate flag which would operate by the same rules as STATES F_NGN | |
970 | + 830 * does in the present design. It also seems less data coupled than | |
971 | + 831 * having the power-down sense routine examine the internals of the | |
972 | + 832 * counter. | |
973 | + 833 | |
974 | + 834 * FLDARK is used slightly ambiguously: in the flasher timer | |
975 | + 835 * routine, bit 7 is used to determine whether to use the on period or | |
976 | + 836 * off period. In the output state machine, below, all lamp bits are | |
977 | + 837 * used to mask out the signal lamps when the flasher says they should be | |
978 | + 838 * dark. Rather than concern myself in several places with the state of | |
979 | + 839 * non-lamp bits, I mask them out where they could cause trouble. | |
980 | + 840 | |
981 | + 841 DOSTATES: | |
982 | + 03A4 8F 842 wait ; wait for something intelligible to debounce | |
983 | + 03A5 AE78 843 ldx #$78 ; unique | |
984 | + 03A7 CF03F0 844 stx COPR ; tell COP we're in control | |
985 | + 845 | |
986 | + 846 * update the (inverted) lamp output state | |
987 | + 03AA A6F0 847 lda #DRVLMPS ; guess nothing shines (inverted drive) | |
988 | + 848 * A == lamp output state | |
989 | + 849 | |
990 | + 850 * now mask in inverted drive bits for any flashers that are on | |
991 | + 03AC 07E602 851 brclr F_EMG_,STATES,STT0EMG | |
992 | + 03AF A40F 852 and #{$FF ^ DRVLMPS} | |
993 | + 03B1 853 STT0EMG equ * | |
994 | + 854 * A == lamp output state | |
995 | + 855 | |
996 | + 03B1 03E602 856 brclr F_LFT_,STATES,STT0LFT | |
997 | + 03B4 A45F 857 and #{$FF ^ LFTDRV} | |
998 | + 03B6 858 STT0LFT equ * | |
999 | + 859 * A == lamp output state | |
1000 | + 860 | |
1001 | + 03B6 01E602 861 brclr F_RGT_,STATES,STT0RGT | |
1002 | + 03B9 A4AF 862 and #{$FF ^ RGTDRV} | |
1003 | + 03BB 863 STT0RGT equ * | |
1004 | + 864 * A == lamp output state | |
1005 | + 865 | |
1006 | + 866 * mask out flasher lamps if flasher is in off state | |
1007 | + 03BB BAEA 867 ora FLDARK | |
1008 | + 868 * A == lamp output state | |
1009 | + 869 | |
1010 | + 870 * check for brake lights | |
1011 | + 03BD 0BE602 871 STTBRK brclr F_BRK_,STATES,STT0BRK | |
1012 | + 03C0 A4CF 872 and #{$FF ^ REARDRV} ; brake has higher priority than flash | |
1013 | + | |
1014 | + | |
1015 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 22 | |
1016 | +Turn Signal Switch by Joel Matthew Rees | |
1017 | +DOSTATES: Interpret States | |
1018 | + | |
1019 | + 03C2 873 STT0BRK equ * | |
1020 | + 874 * A == lamp output state | |
1021 | + 875 | |
1022 | + 03C2 A4F0 876 and #DRVLMPS ; filter out extraneous bits | |
1023 | + 03C4 B7EB 877 sta FLMASK | |
1024 | + 03C6 A8F0 878 eor #DRVLMPS ; any lamps driven? | |
1025 | + 03C8 2702 879 beq STT0FLH ; invert the CCR zero bit and move it to DRVDRV | |
1026 | + 03CA 12EB 880 bset DRVDRV_,FLMASK | |
1027 | + 03CC 881 STT0FLH equ * | |
1028 | + 882 * now A is free | |
1029 | + 883 | |
1030 | + 03CC B600 884 lda PORTA | |
1031 | + 03CE A40D 885 and #{$FF ^ DRVLMPS ^ DRVDRV} | |
1032 | + 03D0 BAEB 886 ora FLMASK | |
1033 | + 03D2 B700 887 sta PORTA | |
1034 | + 888 | |
1035 | + 889 * all done with lamps until next timer interrupt | |
1036 | + 890 * loop to wait if engine not timed-out | |
1037 | + 03D4 08E6CD 891 brset F_NGN_,STATES,DOSTATES | |
1038 | + 892 | |
1039 | + 893 * At this point, we know there has been no engine, emergency flasher, or | |
1040 | + 894 * brake activity for about five minutes. | |
1041 | + 895 | |
1042 | + 896 * go to power conserving state | |
1043 | + 897 * first shut down all lamps | |
1044 | + 03D7 A6F0 898 lda #DRVLMPS ; DRVDRV, CAN_BT also off! | |
1045 | + 899 * should be lda #{DRVLMPS & ~DRVDRV & ~CAN_BT} for clarity | |
1046 | + 03D9 B700 900 sta PORTA ; don't feed CAN_BT to pull downs | |
1047 | + 901 * now make sure power down state is valid! | |
1048 | + 03DB A6F3 902 lda #{DRVLMPS | DRVDRV | CAN_BT} | |
1049 | + 03DD B704 903 sta DDRA ; interrupts only from NGN_SW, BRK_SW, EMG_BT | |
1050 | + 03DF B710 904 sta PDRA ; pull downs only on inputs | |
1051 | + 03E1 3F01 905 clr PORTB ; initial outputs (do port B just in case) | |
1052 | + 03E3 3F05 906 clr DDRB ; B initially input | |
1053 | + 03E5 3F11 907 clr PDRB ; with pull downs set | |
1054 | + 908 * make sure EPROM programming stuff is out of the way | |
1055 | + 909 * clr EPROG ; ICS complains, skip by hand | |
1056 | + 03E7 3F0F 910 clr PESCR | |
1057 | + 911 * enable external interrupts | |
1058 | + 03E9 1E0A 912 bset IRQE_,ISCR ; DO NOT clear the flag (don't miss anything) | |
1059 | + 03EB 8E 913 stop ; also shuts timer down | |
1060 | + 03EC 83 914 swi ; should never come here (IRQSRV resests stack pointer) | |
1061 | + 03ED 83 915 swi ; more unused ROM | |
1062 | + 03EE 83 916 swi | |
1063 | + 03EF 83 917 swi | |
1064 | + 918 | |
1065 | + 03F0 919 SUBHEADER 'Interrupt Vectors' | |
1066 | + | |
1067 | + | |
1068 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 23 | |
1069 | +Turn Signal Switch by Joel Matthew Rees | |
1070 | +Interrupt Vectors | |
1071 | + | |
1072 | + 03F0 919 PAGE | |
1073 | + 920 | |
1074 | + 03F8 921 org VECTORS | |
1075 | + 03F8 0203 922 fdb TIMSRV | |
1076 | + 03FA 0355 923 fdb IRQSRV | |
1077 | + 03FC 0355 924 fdb SWISRV | |
1078 | + 03FE 035D 925 fdb RSTSRV | |
1079 | + 926 | |
1080 | + 0400 927 SUBHEADER 'Symbol Table' | |
1081 | + 0400 928 end | |
1082 | + 929 | |
1083 | + 930 | |
1084 | + | |
1085 | + Symbol Table | |
1086 | + | |
1087 | +ANYLITE 002B | |
1088 | +B0 0001 | |
1089 | +B0_ 0000 | |
1090 | +B1 0002 | |
1091 | +B1_ 0001 | |
1092 | +B2 0004 | |
1093 | +B2_ 0002 | |
1094 | +B3 0008 | |
1095 | +B3_ 0003 | |
1096 | +B4 0010 | |
1097 | +B4_ 0004 | |
1098 | +B5 0020 | |
1099 | +B5_ 0005 | |
1100 | +B6 0040 | |
1101 | +B6_ 0006 | |
1102 | +B7 0080 | |
1103 | +B7_ 0007 | |
1104 | +BRK_SW 0008 | |
1105 | +BRK_SW_ 0003 | |
1106 | +CAN_BT 0001 | |
1107 | +CAN_BT_ 0000 | |
1108 | +COPEN 0001 | |
1109 | +COPR 03F0 | |
1110 | +DBGCT 00F2 | |
1111 | +DDRA 0004 | |
1112 | +DDRB 0005 | |
1113 | +DEBO 00E0 | |
1114 | +DOSTATES 03A4 | |
1115 | +DRVDRV 0002 | |
1116 | +DRVDRV_ 0001 | |
1117 | +DRVLMPS 00F0 | |
1118 | +ELAT 0004 | |
1119 | +ELAT_ 0002 | |
1120 | +EMG_BTF 0002 | |
1121 | +EMG_BTF_ 0001 | |
1122 | +EPGM 0001 | |
1123 | +EPGM_ 0000 | |
1124 | +EPROG 0018 | |
1125 | +FLASH 00E9 | |
1126 | +FLASH0 0001 | |
1127 | +FLASH1 0001 | |
1128 | +FLDARK 00EA | |
1129 | +FLMASK 00EB | |
1130 | + | |
1131 | + | |
1132 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 24 | |
1133 | +Turn Signal Switch by Joel Matthew Rees | |
1134 | +Symbol Table | |
1135 | + | |
1136 | +FRNTDRV 00C0 | |
1137 | +F_BRK 0020 | |
1138 | +F_BRK_ 0005 | |
1139 | +F_CAN 0004 | |
1140 | +F_CAN_ 0002 | |
1141 | +F_EMG 0008 | |
1142 | +F_EMG_ 0003 | |
1143 | +F_LDRV 0080 | |
1144 | +F_LDRV_ 0007 | |
1145 | +F_LFT 0002 | |
1146 | +F_LFT_ 0001 | |
1147 | +F_MNC 0080 | |
1148 | +F_NGN 0010 | |
1149 | +F_NGN_ 0004 | |
1150 | +F_OPC 0040 | |
1151 | +F_RDRV 0040 | |
1152 | +F_RDRV_ 0006 | |
1153 | +F_RGT 0001 | |
1154 | +F_RGT_ 0000 | |
1155 | +IRQE 0080 | |
1156 | +IRQE_ 0007 | |
1157 | +IRQF 0008 | |
1158 | +IRQF_ 0003 | |
1159 | +IRQR 0002 | |
1160 | +IRQR_ 0001 | |
1161 | +IRQSRV 0355 | |
1162 | +IRQVEC 03FA | |
1163 | +ISCR 000A | |
1164 | +ISTATE 00E5 | |
1165 | +LASTST 00ED | |
1166 | +LEVEL 0002 | |
1167 | +LFTDRV 00A0 | |
1168 | +LFT_BT 0002 | |
1169 | +LFT_BT_ 0001 | |
1170 | +LVRE 0008 | |
1171 | +MOR 0017 | |
1172 | +MPGM 0002 | |
1173 | +MPGM_ 0001 | |
1174 | +NGN_SW 0004 | |
1175 | +NGN_SW_ 0002 | |
1176 | +NGN_TIM 00E7 | |
1177 | +PDRA 0010 | |
1178 | +PDRB 0011 | |
1179 | +PEBSR 000E | |
1180 | +PEDATA 0080 | |
1181 | +PEDATA_ 0007 | |
1182 | +PEPGM 0020 | |
1183 | +PEPGM_ 0005 | |
1184 | +PEPRZF 0001 | |
1185 | +PEPRZF_ 0000 | |
1186 | +PESCR 000F | |
1187 | +PIN3 0040 | |
1188 | +PIRQ 0004 | |
1189 | +PORTA 0000 | |
1190 | +PORTB 0001 | |
1191 | +RAMBEG 00E0 | |
1192 | +RAMSIZ 0020 | |
1193 | +RC 0020 | |
1194 | + | |
1195 | + | |
1196 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 25 | |
1197 | +Turn Signal Switch by Joel Matthew Rees | |
1198 | +Symbol Table | |
1199 | + | |
1200 | +REARDRV 0030 | |
1201 | +RESET 03FE | |
1202 | +RGTDRV 0050 | |
1203 | +RGT_BT 0001 | |
1204 | +RGT_BT_ 0000 | |
1205 | +ROMBEG 0200 | |
1206 | +RSTSRV 035D | |
1207 | +RT0 0001 | |
1208 | +RT0_ 0000 | |
1209 | +RT1 0002 | |
1210 | +RT1_ 0001 | |
1211 | +RTIE 0010 | |
1212 | +RTIE_ 0004 | |
1213 | +RTIF 0040 | |
1214 | +RTIFR 0004 | |
1215 | +RTIFR_ 0002 | |
1216 | +RTIF_ 0006 | |
1217 | +RTIPOW 0000 | |
1218 | +RTIRATE 0002 | |
1219 | +R_LDRV 0020 | |
1220 | +R_LDRV_ 0005 | |
1221 | +R_RDRV 0010 | |
1222 | +R_RDRV_ 0004 | |
1223 | +SSTBLE 00E3 | |
1224 | +STATES 00E6 | |
1225 | +STKTOP 00FF | |
1226 | +STT0BRK 03C2 | |
1227 | +STT0EMG 03B1 | |
1228 | +STT0FLH 03CC | |
1229 | +STT0LFT 03B6 | |
1230 | +STT0RGT 03BB | |
1231 | +STTBRK 03BD | |
1232 | +SWAIT 0010 | |
1233 | +SWISRV 0355 | |
1234 | +SWIVEC 03FC | |
1235 | +SWPDI 0080 | |
1236 | +TCNTR 0009 | |
1237 | +TIMDUN 033D | |
1238 | +TIMDUX 034B | |
1239 | +TIMER 0009 | |
1240 | +TIMOUT 0001 | |
1241 | +TIMSRV 0203 | |
1242 | +TIMVEC 03F8 | |
1243 | +TM0TURN 024C | |
1244 | +TMCAN0 02CD | |
1245 | +TMCLOCK 02E5 | |
1246 | +TMF0BRK 0285 | |
1247 | +TMF0EMG 028E | |
1248 | +TMF1CAN 0276 | |
1249 | +TMFLASH 0329 | |
1250 | +TMFLH0 033D | |
1251 | +TMFLTM 033B | |
1252 | +TMFNGN0 02E5 | |
1253 | +TMIEMG 0219 | |
1254 | +TMMFLH 0307 | |
1255 | +TMMFLH0 030D | |
1256 | +TMNGNR0 0329 | |
1257 | +TMORST 02F3 | |
1258 | + | |
1259 | + | |
1260 | +TURNSIG.asm Assembled with IASM 11/19/1993 00:26 PAGE 26 | |
1261 | +Turn Signal Switch by Joel Matthew Rees | |
1262 | +Symbol Table | |
1263 | + | |
1264 | +TMPTRN 00EC | |
1265 | +TMSCLK 030D | |
1266 | +TMSTRN 02AA | |
1267 | +TMTBIT6 0235 | |
1268 | +TMTBIT7 023B | |
1269 | +TMTNTN 0246 | |
1270 | +TOF 0080 | |
1271 | +TOFR 0008 | |
1272 | +TOFR_ 0003 | |
1273 | +TOF_ 0007 | |
1274 | +TOGGLE 00E4 | |
1275 | +TOIE 0020 | |
1276 | +TOIE_ 0005 | |
1277 | +TSCR 0008 | |
1278 | +TSTROM 03F0 | |
1279 | +TURNSIG 0003 | |
1280 | +TURNSTATE 0295 | |
1281 | +VECTORS 03F8 | |
1282 | +XTAL 0001 |
@@ -0,0 +1,34 @@ | ||
1 | +S104001727BD | |
2 | +S11302008383831608B6E1B7E2B6E0B7E1B6E6B792 | |
3 | +S1130210EDB600A40D2F02AA024848B7E0B601BA11 | |
4 | +S1130220E0B7E0A5042725BE0527219FA803B70151 | |
5 | +S1130230B705000000463F0500000046A4C0BAE030 | |
6 | +S1130240A5402702A4FCB7E0BF01BF05B8E1B7E4AD | |
7 | +S1130250B6E1B8E2BAE44397B4E0B7E39FB4E5B8D3 | |
8 | +S1130260E3B7E443B4E5B7E5B6E4B4E3BAE5B7E528 | |
9 | +S1130270A5C0260215E4AA33B4E4A43FB7E41BE600 | |
10 | +S11302800BE5021AE607E406B6E6A808B7E6201A64 | |
11 | +S113029083838383830001020801010202020102B5 | |
12 | +S11302A001000102008383838383B6E6A4034848E4 | |
13 | +S11302B0B7ECB6E5A403BAEC97D60295B7ECB6E66C | |
14 | +S11302C0A4FCBAECB7E605E404A4FCB7E6A403B7BF | |
15 | +S11302D001B705B7ECB6E5A4FCBAECB7E5B6E8BAE5 | |
16 | +S11302E0E7260218E6B6E4A4382708A601B7E8A66C | |
17 | +S11302F001B7E7A60BB5E42714B5E6260AA6FFB7AF | |
18 | +S1130300EAA601B7E92006B5ED26023FEA0D082D5D | |
19 | +S1130310140808E514B6E6A438A810260C3AE82612 | |
20 | +S1130320083AE7260419E618E4A60BB5E6270E3AC0 | |
21 | +S1130330E9260AA60133EA2A02A601B7E93CF52612 | |
22 | +S11303400A3CF426063CF326023CF2120A8083831C | |
23 | +S11303508383838383AE5CCF03F09C120A1F0A124B | |
24 | +S11303600AA6F0B700A6F2B704B7103F013F053F55 | |
25 | +S1130370113F0FA610B7E0B7E1B7E6B7E5A601B79E | |
26 | +S1130380E8A601B7E7A6FFB7EAA601B7E93FF23F3F | |
27 | +S1130390F33FF43FF5AE6ACF03F0A600B708AA0C0A | |
28 | +S11303A0B7081A088FAE78CF03F0A6F007E602A4C8 | |
29 | +S11303B00F03E602A45F01E602A4AFBAEA0BE60269 | |
30 | +S11303C0A4CFA4F0B7EBA8F0270212EBB600A40D5B | |
31 | +S11303D0BAEBB70008E6CDA6F0B700A6F3B704B7AA | |
32 | +S11303E0103F013F053F113F0F1E0A8E8383838315 | |
33 | +S10B03F8020303550355035DE4 | |
34 | +S9030000FC |