0
|
1 ;=============================================================================
|
|
2 ;
|
|
3 ; File options.asm
|
|
4 ;
|
|
5 ; Manage all options data.
|
|
6 ;
|
|
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
|
|
8 ;=============================================================================
|
|
9 ; HISTORY
|
|
10 ; 2011-07-12 : [jDG] Creation.
|
|
11 ;
|
|
12 ; RATIONALS:
|
|
13 ;
|
|
14 ; Provides a centralized file with
|
|
15
|
275
|
16 #include "hwos.inc" ; Mandatory header
|
0
|
17 #include "strings.inc"
|
|
18 #include "convert.inc"
|
|
19 #include "ghostwriter.inc"
|
|
20 #include "eeprom_rs232.inc"
|
|
21 #include "external_flash.inc"
|
21
|
22 #include "wait.inc"
|
0
|
23
|
|
24 extern write_eeprom
|
|
25 extern read_eeprom
|
|
26 extern eeprom_serial_save,eeprom_opt_backup
|
143
|
27 extern option_table_begin,option_table_end
|
0
|
28
|
|
29 global option_reset_all ; Reset all options to factory default.
|
21
|
30 global option_check_all ; Check all option and reset option if out of min/max boundary
|
0
|
31 global option_reset ; Reset FSR0 option to factory default.
|
|
32 global option_save_all ; Save options to EEPROM.
|
|
33 global option_restore_all ; Restore options from EEPROM.
|
|
34 global option_inc ; Increment FSR0 option.
|
|
35 global option_draw ; STRCAT FRS0 option.
|
|
36
|
21
|
37
|
0
|
38 ;=============================================================================
|
|
39 CBLOCK tmp+0x10 ; Reserve space for wordprocessor & convert
|
|
40 opt_type
|
|
41 opt_default
|
|
42 opt_inc ; Also default+1 (string), and enum low
|
|
43 opt_min ; also enum high
|
|
44 opt_max
|
|
45 opt_unit:2 ; Multi-lingual unit text.
|
|
46 opt_eeprom
|
|
47 opt_backup_tbl:3
|
|
48 ; Reserved to tmp+0x1F...
|
|
49 ENDC
|
|
50
|
|
51 gui CODE ; Appends to other GUI segment
|
|
52 ;=============================================================================
|
|
53 ; Reset all options to factory defauts.
|
|
54 ;
|
|
55 ; INPUT: none
|
|
56 ; OUTPUT: none
|
|
57 ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2
|
|
58
|
|
59 option_reset_all:
|
|
60 clrf EEADRH
|
|
61 read_int_eeprom .2
|
139
|
62 tstfsz EEDATA ; Total dives=0?
|
|
63 bra option_reset_all2 ; No, skip resetting logbook
|
0
|
64 read_int_eeprom .3
|
139
|
65 tstfsz EEDATA ; Total dives=0?
|
0
|
66 bra option_reset_all2 ; No, skip resetting logbook
|
|
67
|
|
68 clrf EEDATA
|
|
69 write_int_eeprom .4
|
|
70 write_int_eeprom .5
|
|
71 write_int_eeprom .6
|
|
72 write_int_eeprom .2 ; Also, delete total dive counter
|
|
73 write_int_eeprom .3
|
|
74 call ext_flash_erase_logbook ; And complete logbook (!)
|
|
75
|
|
76 option_reset_all2:
|
|
77 clrf lo
|
|
78 clrf hi
|
|
79 call do_logoffset_common_write ; reset Logbook offset
|
21
|
80
|
|
81 ; Point to option table begin
|
0
|
82 movlw LOW(option_table_begin)
|
|
83 movwf FSR0L
|
|
84 movlw HIGH(option_table_begin)
|
|
85 movwf FSR0H
|
|
86 option_reset_all_1:
|
|
87 movf FSR0L,W ; Reached end of table ?
|
|
88 xorlw LOW(option_table_end) ; (8bit test -> 10 bytes x 128 options max)
|
|
89 btfsc STATUS,Z ; YES: done.
|
|
90 return
|
|
91
|
|
92 rcall option_reset ; Reset one option.
|
|
93 bra option_reset_all_1 ; and loop.
|
|
94
|
|
95 ;=============================================================================
|
21
|
96 ; Check all option and reset option if out of min/max boundary
|
|
97 ;
|
|
98 ; INPUT: none
|
|
99 ; OUTPUT: none
|
|
100 ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2
|
|
101 option_check_all:
|
|
102 ; Point to option table begin
|
|
103 movlw LOW(option_table_begin)
|
|
104 movwf FSR0L
|
|
105 movlw HIGH(option_table_begin)
|
|
106 movwf FSR0H
|
|
107
|
|
108 option_check_all_1:
|
|
109 movf FSR0L,W ; Reached end of table ?
|
|
110 xorlw LOW(option_table_end) ; (8bit test -> 10 bytes x 128 options max)
|
|
111 btfsc STATUS,Z ; YES: done.
|
|
112 return
|
|
113
|
|
114 rcall option_check ; check one option.
|
|
115 bra option_check_all_1 ; and loop
|
|
116
|
|
117 ;=============================================================================
|
0
|
118 ; Read option handle
|
|
119 ; INPUT: FSR0 = option handle
|
|
120 ; OUTPUT: FSR1 = address of variable.
|
|
121 ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1
|
|
122 option_read:
|
|
123 movff FSR0L,TBLPTRL
|
|
124 movlw HIGH(option_table_begin); Get 8 high bits.
|
|
125 andlw 0xF0 ; Keep only the 4 highest ones.
|
|
126 iorwf FSR0H,W ; Cat with the known 4 lower ones.
|
|
127 movwf TBLPTRH ; And we have the high byte.
|
|
128 movlw UPPER(option_table_begin)
|
|
129 movwf TBLPTRU
|
|
130
|
|
131 ; Read type, default and register from table
|
|
132 tblrd*+
|
|
133 movff TABLAT,opt_type
|
|
134 tblrd*+
|
|
135 movff TABLAT,opt_default
|
|
136 tblrd*+
|
|
137 movff TABLAT,opt_inc
|
|
138 tblrd*+
|
|
139 movff TABLAT,opt_min
|
|
140 tblrd*+
|
|
141 movff TABLAT,opt_max
|
|
142 tblrd*+
|
|
143 movff TABLAT,opt_eeprom
|
|
144 tblrd*+
|
|
145 movff TABLAT,opt_unit+0
|
|
146 tblrd*+
|
|
147 movff TABLAT,opt_unit+1
|
|
148 tblrd*+
|
|
149 movff TABLAT,FSR1L
|
|
150 tblrd*+
|
|
151 movff TABLAT,FSR1H
|
|
152 movff TBLPTRL,FSR0L ; Advance handle too, for reset_all
|
|
153 movff TBLPTRH,FSR0H
|
|
154 return
|
21
|
155
|
|
156 ;=============================================================================
|
|
157 ; Check one option and reset if it's out of it's min/max boundaries
|
|
158 ; INPUT: FSR0 = option handle
|
|
159 ; OUTPUT: none
|
|
160 ; TRASH: TBLPTR, TABLAT, WREG, FSR1, FSR2, lo
|
|
161 ;
|
|
162 option_check:
|
|
163 ; Read type, default and register from table
|
|
164 rcall option_read
|
|
165
|
|
166 ; Switch on type
|
|
167 movf opt_type,W ; Type == STRING ?
|
|
168 xorlw 2
|
|
169 bz option_check_string ; String: Do not reset strings
|
|
170
|
110
|
171 movf opt_type,W ; Type == ENUM8 ?
|
|
172 xorlw 1
|
|
173 bz option_check_enum8 ; ENUM8: Check if lower then max. value only
|
|
174
|
220
|
175 tstfsz opt_min ; opt_min=0?
|
|
176 bra option_check_both ; no
|
|
177 bra option_check_enum8 ; Check max only
|
|
178
|
|
179 option_check_both:
|
|
180 decf opt_min,W
|
|
181 cpfsgt INDF1 ; bigger then opt_min-1?
|
21
|
182 bra option_check_reset ; No, reset option
|
185
|
183 option_check_enum8: ; ENUM8: Check max only
|
222
|
184 infsnz opt_max,W ; Max = 255?
|
|
185 return ; Yes, igonore max. test
|
185
|
186 cpfslt INDF1 ; smaller then opt_max+1?
|
21
|
187 bra option_check_reset ; No, reset option
|
|
188 return ; in range, return
|
|
189
|
|
190 option_check_reset:
|
|
191 movff opt_default,INDF1 ; reset option to default
|
|
192 return ; Done.
|
|
193
|
|
194 option_check_string:
|
|
195 return
|
|
196
|
0
|
197 ;=============================================================================
|
|
198 ; Reset an option to its default value.
|
|
199 ; INPUT: FSR0 = option handle
|
|
200 ; OUTPUT: none
|
|
201 ; TRASH: TBLPTR, TABLAT, WREG, FSR1, FSR2
|
|
202 ;
|
|
203 option_reset:
|
|
204 ; Read type, default and register from table
|
|
205 rcall option_read
|
|
206
|
|
207 ; Switch on type
|
|
208 movf opt_type,W ; Type == STRING ?
|
|
209 xorlw 2
|
|
210 bz opt_reset_string ; YES: special copy
|
|
211
|
|
212 movff opt_default,INDF1 ; NO: just a 8bit indirect copy
|
|
213 return
|
|
214
|
|
215 opt_reset_string:
|
|
216 movff FSR1L,FSR2L ; set string destination address.
|
|
217 movff FSR1H,FSR2H
|
|
218
|
|
219 movff opt_default+0,FSR1L ; Get handle to multi-lingual text in FSR1
|
|
220 movff opt_default+1,FSR1H
|
|
221
|
|
222 movff TBLPTRL,opt_backup_tbl+0; TBLPTR trashed by text routine...
|
|
223 movff TBLPTRH,opt_backup_tbl+1
|
|
224 movff TBLPTRU,opt_backup_tbl+2
|
|
225
|
|
226 call strcat_text ; Copy translated text to FSR2
|
|
227
|
|
228 movff opt_backup_tbl+0,TBLPTRL
|
|
229 movff opt_backup_tbl+1,TBLPTRH
|
|
230 movff opt_backup_tbl+2,TBLPTRU
|
|
231
|
|
232 return
|
|
233
|
|
234 ;=============================================================================
|
|
235 ; Save all options to EEPROM
|
|
236 option_save_all:
|
|
237 ;---- Save option serial into EEPROM to detect reset and new version
|
|
238 movlw LOW(eeprom_serial_save)
|
|
239 movwf EEADR
|
|
240 movlw HIGH(eeprom_serial_save)
|
133
|
241 movwf EEADRH
|
0
|
242 movlw LOW(eeprom_opt_serial)
|
|
243 movwf EEDATA
|
|
244 call write_eeprom
|
|
245 incf EEADR,F
|
|
246 movlw HIGH(eeprom_opt_serial)
|
|
247 movwf EEDATA
|
|
248 call write_eeprom
|
|
249
|
|
250 ;---- Save all options
|
|
251 movlw LOW(option_table_begin)
|
|
252 movwf FSR0L
|
|
253 movlw HIGH(option_table_begin)
|
|
254 movwf FSR0H
|
|
255
|
|
256 option_save_all_1:
|
|
257 movf FSR0L,W ; Reached end of table ?
|
|
258 xorlw LOW(option_table_end) ; (8bit test -> 10 bytes x 128 options max)
|
|
259 btfsc STATUS,Z ; YES: done.
|
|
260 return
|
|
261
|
|
262 rcall option_save ; Save one option.
|
|
263 bra option_save_all_1 ; and loop.
|
|
264
|
93
|
265 global option_save
|
0
|
266 option_save:
|
|
267 rcall option_read
|
|
268 incf opt_eeprom,W ; Should we save it ?
|
|
269 btfsc STATUS,Z ; eeprom address is FFh ?
|
|
270 return ; YES: nothing to do.
|
|
271
|
|
272 movf opt_eeprom,W ; Compute backup address in EEPROM
|
|
273 addlw LOW(eeprom_opt_backup) ; Add offset
|
|
274 movwf EEADR
|
|
275 movlw HIGH(eeprom_opt_backup)
|
142
|
276 btfsc STATUS,C ; >256
|
|
277 addlw .1 ; Yes: +1
|
0
|
278 movwf EEADRH
|
|
279
|
|
280 movf opt_type,W ; Option type is string ?
|
|
281 xorlw 2
|
|
282 bz option_save_string
|
|
283
|
|
284 ; One byte to save to eeprom
|
|
285 movff INDF1,EEDATA
|
133
|
286 btfss EEADRH,1 ; EEADR:EEADRH < 512?
|
|
287 call write_eeprom ; Yes, write
|
|
288 return
|
0
|
289
|
|
290 option_save_string:
|
|
291 movff POSTINC1,EEDATA ; Write one byte
|
133
|
292 btfss EEADRH,1 ; EEADR:EEADRH < 512?
|
|
293 call write_eeprom ; Yes, write
|
0
|
294 infsnz EEADR,F
|
|
295 incf EEADRH,F
|
|
296
|
|
297 decfsz opt_max ; Decrement string length
|
|
298 bra option_save_string ; And loop while not finished
|
|
299
|
|
300 return
|
|
301 ;=============================================================================
|
|
302
|
|
303 option_restore_all:
|
|
304 ;---- Read option serial from EEPROM
|
|
305 movlw LOW(eeprom_serial_save)
|
|
306 movwf EEADR
|
|
307 movlw HIGH(eeprom_serial_save)
|
|
308 movf EEADRH
|
|
309 call read_eeprom
|
|
310 movlw LOW(eeprom_opt_serial)
|
|
311 xorwf EEDATA,W
|
|
312 bnz option_restore_bad ; Auto reset if changed.
|
|
313 incf EEADR,F
|
|
314 call read_eeprom
|
|
315 movlw HIGH(eeprom_opt_serial)
|
|
316 xorwf EEDATA,W
|
|
317 bz option_restore_ok ; Auto reset if changed.
|
|
318
|
|
319 option_restore_bad:
|
|
320 call option_reset_all ; Reset RAM contains
|
|
321 goto option_save_all ; Then save to EEPROM
|
|
322
|
|
323 ;---- Proper restore
|
|
324 option_restore_ok:
|
|
325 movlw LOW(option_table_begin)
|
|
326 movwf FSR0L
|
|
327 movlw HIGH(option_table_begin)
|
|
328 movwf FSR0H
|
|
329
|
|
330 option_restore_all_1:
|
|
331 movf FSR0L,W ; Reached end of table ?
|
|
332 xorlw LOW(option_table_end) ; (8bit test -> 10 bytes x 128 options max)
|
|
333 btfsc STATUS,Z ; YES: done.
|
|
334 return
|
|
335
|
|
336 rcall option_restore ; Restore one option.
|
|
337 bra option_restore_all_1 ; and loop.
|
|
338 return
|
|
339
|
|
340 option_restore:
|
|
341 rcall option_read
|
|
342 incf opt_eeprom,W ; Should we save it ?
|
|
343 btfsc STATUS,Z ; eeprom address is FFh ?
|
|
344 return ; YES: nothing to do.
|
|
345
|
|
346 movf opt_eeprom,W ; Compute backup address in EEPROM
|
|
347 addlw LOW(eeprom_opt_backup) ; Add offset
|
|
348 movwf EEADR
|
|
349 movlw HIGH(eeprom_opt_backup)
|
142
|
350 btfsc STATUS,C ; >256
|
|
351 addlw .1 ; Yes: +1
|
0
|
352 movwf EEADRH
|
|
353
|
|
354 movf opt_type,W ; Option type is string ?
|
|
355 xorlw 2
|
|
356 bz option_restore_string
|
|
357
|
|
358 ; Read one byte from eeprom
|
|
359 call read_eeprom
|
|
360 movff EEDATA, INDF1 ; And restore option register.
|
|
361 return
|
|
362
|
|
363 option_restore_string:
|
|
364 call read_eeprom ; Read one byte, and
|
|
365 movff EEDATA,POSTINC1 ; restore it
|
|
366 infsnz EEADR,F
|
|
367 incf EEADRH,F
|
|
368
|
|
369 decfsz opt_max ; Decrement string length
|
|
370 bra option_restore_string ; And loop while not finished
|
|
371 return
|
|
372
|
|
373 ;=============================================================================
|
|
374 ; Increment an option, based on type, and boundary.
|
|
375 ; INPUT: FSR0 = option handle
|
|
376 ; OUTPUT: none
|
|
377 ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1
|
|
378 option_inc:
|
|
379 ; Read type, default and register from table
|
|
380 rcall option_read
|
|
381
|
|
382 ; Switch on type
|
|
383 movf opt_type,W
|
|
384 bz option_inc_uint8
|
|
385 dcfsnz WREG
|
|
386 bra option_inc_enum8
|
|
387 dcfsnz WREG
|
|
388 bra option_inc_string
|
|
389
|
|
390 option_inc_uint8: ; Defaults type too...
|
|
391 movf INDF1,W
|
|
392 addwf opt_inc,W
|
|
393 cpfslt opt_max
|
|
394 bra option_inc_1
|
|
395 movf opt_min,W
|
|
396 option_inc_1:
|
|
397 movwf INDF1
|
|
398 return
|
|
399
|
|
400 option_inc_enum8: ; Always +1
|
|
401 incf INDF1,W
|
|
402 cpfsgt opt_max
|
|
403 clrf WREG
|
|
404 movwf INDF1
|
|
405 return
|
|
406
|
|
407 option_inc_string: ; No edition yet...
|
|
408 return
|
|
409
|
|
410 ;=============================================================================
|
|
411 ; Strcat option into FSR2 buffer.
|
|
412 option_draw:
|
|
413 ; Read type, default and register from table
|
|
414 rcall option_read
|
|
415
|
|
416 ; Switch on type
|
|
417 movf opt_type,W
|
|
418 bz option_draw_uint8
|
|
419 dcfsnz WREG
|
|
420 bra option_draw_enum8
|
|
421 dcfsnz WREG
|
|
422 bra option_draw_string
|
|
423 return ; Unknown: return...
|
|
424
|
|
425 option_draw_uint8:
|
|
426 movff INDF1,lo ; Draw value.
|
263
|
427 bsf leftbind
|
0
|
428 output_8
|
263
|
429 bcf leftbind
|
0
|
430 clrf INDF2 ; Make sure to close string...
|
|
431
|
|
432 movf opt_unit+0,W ; Is there a unit to append ?
|
|
433 iorwf opt_unit+1,W
|
|
434 rcall option_draw_unit
|
|
435
|
|
436 movf opt_default,W ; Default value
|
|
437 cpfseq lo ; Current value
|
|
438 bra option_draw_uint8_2 ; Not default, add *
|
|
439 return ; Default, Done.
|
|
440 option_draw_uint8_2:
|
|
441 PUTC "*"
|
|
442 return ; Done.
|
|
443
|
|
444 option_draw_unit:
|
|
445 movff opt_unit+0,FSR1L
|
|
446 movff opt_unit+1,FSR1H
|
|
447 goto strcat_text
|
|
448
|
|
449
|
|
450
|
|
451 ;---- Draw an enumerated value (set of translated strings)
|
|
452 option_draw_enum8:
|
|
453 movf INDF1,W ; Get current value.
|
|
454 cpfsgt opt_max ; Bound value
|
|
455 clrf WREG
|
|
456 addwf WREG ; *= 2
|
|
457 addwf opt_inc,W ; Base text + 2 * value
|
|
458 movwf FSR1L
|
|
459 movlw 0
|
|
460 addwfc opt_min,W ; Propagate carry
|
|
461 movwf FSR1H ; Into FSR1
|
|
462
|
|
463 goto strcat_text
|
|
464
|
|
465 option_draw_string:
|
|
466 movff POSTINC1,POSTINC2
|
|
467 decfsz opt_max
|
|
468 bra option_draw_string
|
|
469 return
|
|
470
|
|
471 END
|