Mercurial > public > hwos_code
comparison src/ghostwriter.asm @ 0:11d4fc797f74
init
| author | heinrichsweikamp |
|---|---|
| date | Wed, 24 Apr 2013 19:22:45 +0200 |
| parents | |
| children | ed1dec74d5fd |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:11d4fc797f74 |
|---|---|
| 1 ;============================================================================= | |
| 2 ; | |
| 3 ; File ghostwriter.asm | |
| 4 ; | |
| 5 ; Ghostwriter (Log profile recorder) | |
| 6 ; | |
| 7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | |
| 8 ;============================================================================= | |
| 9 ; HISTORY | |
| 10 ; 2011-11-27 : [mH] Creation | |
| 11 | |
| 12 #include "ostc3.inc" ; Mandatory header | |
| 13 #include "shared_definitions.h" ; Mailbox from/to p2_deco.c | |
| 14 #include "external_flash.inc" | |
| 15 #include "surfmode.inc" | |
| 16 #include "eeprom_rs232.inc" | |
| 17 #include "strings.inc" | |
| 18 #include "isr.inc" | |
| 19 #include "tft_outputs.inc" | |
| 20 #include "divemode.inc" | |
| 21 | |
| 22 ghostwriter CODE | |
| 23 | |
| 24 global store_dive_data | |
| 25 store_dive_data: ; 5 seconds gone | |
| 26 bcf store_sample ; update only any 5 seconds | |
| 27 | |
| 28 ifndef __DEBUG | |
| 29 btfsc simulatormode_active ; Are we in simulator mode? | |
| 30 return ; Yes, discard everything | |
| 31 endif | |
| 32 | |
| 33 SAFE_2BYTE_COPY rel_pressure, lo | |
| 34 movf lo,W ; store depth with every sample | |
| 35 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 36 movf hi,W | |
| 37 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 38 | |
| 39 ;First, find out how many bytes will append to this sample.... | |
| 40 clrf ProfileFlagByte ; clear number of bytes to append | |
| 41 | |
| 42 ; Check Extented informations | |
| 43 decfsz divisor_temperature,W ; Check divisor | |
| 44 bra check_extended1 | |
| 45 movlw infolength_temperature | |
| 46 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 47 check_extended1: | |
| 48 decfsz divisor_deco,W ; Check divisor | |
| 49 bra check_extended2 | |
| 50 movlw infolength_deco | |
| 51 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 52 check_extended2: | |
| 53 decfsz divisor_gf,W ; Check divisor | |
| 54 bra check_extended3 | |
| 55 movlw infolength_gf | |
| 56 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 57 check_extended3: | |
| 58 decfsz divisor_ppo2_sensors,W ; Check divisor | |
| 59 bra check_extended4 | |
| 60 movlw infolength_ppo2_sensors | |
| 61 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 62 check_extended4: | |
| 63 decfsz divisor_decoplan,W ; Check divisor | |
| 64 bra check_extended5 | |
| 65 movlw infolength_decoplan | |
| 66 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 67 check_extended5: | |
| 68 decfsz divisor_cns,W ; Check divisor | |
| 69 bra check_extended6 | |
| 70 movlw infolength_cns | |
| 71 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 72 check_extended6: | |
| 73 decfsz divisor_tank,W ; Check divisor | |
| 74 bra check_extended7 | |
| 75 movlw infolength_tank | |
| 76 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 77 check_extended7: | |
| 78 | |
| 79 ; Second, check global event flag | |
| 80 btfss event_occured ; Check global event flag | |
| 81 bra store_dive_data3 ; No Event | |
| 82 incf ProfileFlagByte,F ; add one byte (The EventByte) | |
| 83 | |
| 84 clrf EventByte ; reset EventByte | |
| 85 | |
| 86 movf AlarmType,W ; Type of Alarm Bit 0-3 | |
| 87 addwf EventByte,F ; Copy to EventByte Bit 0-3 | |
| 88 clrf AlarmType ; Reset AlarmType | |
| 89 | |
| 90 ; Third, check events and add aditional bytes | |
| 91 btfss gas6_changed ; Check flag | |
| 92 bra check_event2 | |
| 93 movlw d'2' ; Information length | |
| 94 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 95 bsf EventByte,4 ; Also set Flag in EventByte! | |
| 96 check_event2: | |
| 97 btfss stored_gas_changed ; Check flag | |
| 98 bra check_event3 | |
| 99 movlw d'1' ; Information length | |
| 100 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 101 bsf EventByte,5 ; Also set Flag in EventByte! | |
| 102 check_event3: | |
| 103 btfss setpoint_changed ; Check flag | |
| 104 bra check_event4 | |
| 105 movlw d'1' ; Information length | |
| 106 addwf ProfileFlagByte,F ; add to ProfileFlagByte | |
| 107 bsf EventByte,6 ; Also set Flag in EventByte! | |
| 108 check_event4: | |
| 109 ; more events? | |
| 110 bsf ProfileFlagByte,7 ; Set EventByte Flag in ProfileFlagByte | |
| 111 | |
| 112 store_dive_data3: | |
| 113 movf ProfileFlagByte,W ; finally, write ProfileFlagByte! | |
| 114 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 115 | |
| 116 btfss event_occured ; Check global event flag (again) | |
| 117 bra store_dive_data4 ; No Event | |
| 118 | |
| 119 ; Store the EventByte + additional bytes now | |
| 120 movf EventByte,W | |
| 121 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 122 | |
| 123 btfss gas6_changed ; Check flag | |
| 124 bra store_dive_data3b | |
| 125 movff char_I_O2_ratio,WREG | |
| 126 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 127 movff char_I_He_ratio,WREG | |
| 128 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 129 bcf gas6_changed ; Clear this event | |
| 130 store_dive_data3b: | |
| 131 btfss stored_gas_changed ; Check flag | |
| 132 bra store_dive_data3c | |
| 133 movf active_gas,W ; Store active gas | |
| 134 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 135 bcf stored_gas_changed ; Clear this event | |
| 136 store_dive_data3c: | |
| 137 btfss setpoint_changed ; Check flag | |
| 138 bra store_dive_data3d | |
| 139 movff char_I_const_ppO2,WREG | |
| 140 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 141 bcf setpoint_changed ; Clear this event | |
| 142 store_dive_data3d: | |
| 143 | |
| 144 store_dive_data4: | |
| 145 | |
| 146 ; Store extended informations | |
| 147 decfsz divisor_temperature,F ; Check divisor | |
| 148 bra store_extended1 | |
| 149 rcall store_dive_temperature | |
| 150 store_extended1: | |
| 151 decfsz divisor_deco,F ; Check divisor | |
| 152 bra store_extended2 | |
| 153 rcall store_dive_decodata | |
| 154 store_extended2: | |
| 155 decfsz divisor_gf,F ; Check divisor | |
| 156 bra store_extended3 | |
| 157 rcall store_dive_gf | |
| 158 store_extended3: | |
| 159 decfsz divisor_ppo2_sensors,F ; Check divisor | |
| 160 bra store_extended4 | |
| 161 rcall store_dive_ppO2_sensors | |
| 162 store_extended4: | |
| 163 decfsz divisor_decoplan,F ; Check divisor | |
| 164 bra store_extended5 | |
| 165 rcall store_dive_decoplan | |
| 166 store_extended5: | |
| 167 decfsz divisor_cns,F ; Check divisor | |
| 168 bra store_extended6 | |
| 169 rcall store_dive_cns | |
| 170 store_extended6: | |
| 171 decfsz divisor_tank,F ; Check divisor | |
| 172 bra store_extended7 | |
| 173 rcall store_dive_tank | |
| 174 store_extended7: | |
| 175 | |
| 176 ; The next block is required to take care of "store never" | |
| 177 btfsc divisor_temperature,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!) | |
| 178 clrf divisor_temperature ; And clear register again, so it will never reach zero... | |
| 179 btfsc divisor_deco,7 | |
| 180 clrf divisor_deco | |
| 181 btfsc divisor_gf,7 | |
| 182 clrf divisor_gf | |
| 183 btfsc divisor_ppo2_sensors,7 | |
| 184 clrf divisor_ppo2_sensors | |
| 185 btfsc divisor_decoplan,7 | |
| 186 clrf divisor_decoplan | |
| 187 btfsc divisor_cns,7 | |
| 188 clrf divisor_cns | |
| 189 btfsc divisor_tank,7 | |
| 190 clrf divisor_tank | |
| 191 | |
| 192 store_dive_data5: | |
| 193 bcf event_occured ; Clear the global event flag | |
| 194 return ; Done. (Sample with all informations written to external flash) | |
| 195 | |
| 196 store_dive_cns: | |
| 197 movff int_O_CNS_fraction+0,WREG | |
| 198 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 199 movff int_O_CNS_fraction+1,WREG | |
| 200 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 201 movlw div_cns | |
| 202 movwf divisor_cns ; Reload divisor from CF | |
| 203 return | |
| 204 | |
| 205 store_dive_tank: | |
| 206 movlw div_tank | |
| 207 movwf divisor_tank ; Reload divisor from CF | |
| 208 return | |
| 209 | |
| 210 store_dive_decoplan: | |
| 211 ; Store the decoplan | |
| 212 lfsr FSR1,char_O_deco_time_for_log+.0 | |
| 213 movlw .15 | |
| 214 movwf lo | |
| 215 store_dive_decoplan_loop: | |
| 216 movf POSTINC1,W | |
| 217 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 218 decfsz lo,F | |
| 219 bra store_dive_decoplan_loop | |
| 220 movlw div_decoplan | |
| 221 movwf divisor_decoplan ; Reload divisor from CF | |
| 222 return | |
| 223 | |
| 224 store_dive_ppO2_sensors: | |
| 225 movf o2_ppo2_sensor1,W ; Sensor1 ppO2 (in 0.01bar steps) | |
| 226 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 227 SAFE_2BYTE_COPY o2_mv_sensor1,lo ; o2_mv_sensor may be modifified via ISR during the two writes here... | |
| 228 movf lo,W ; in 0.1mV steps | |
| 229 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 230 movf hi,W ; in 0.1mV steps | |
| 231 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 232 | |
| 233 movf o2_ppo2_sensor2,W ; Sensor2 ppO2 (in 0.01bar steps) | |
| 234 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 235 SAFE_2BYTE_COPY o2_mv_sensor2,lo ; o2_mv_sensor may be modifified via ISR during the two writes here... | |
| 236 movf lo,W ; in 0.1mV steps | |
| 237 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 238 movf hi,W ; in 0.1mV steps | |
| 239 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 240 | |
| 241 movf o2_ppo2_sensor3,W ; Sensor3 ppO2 (in 0.01bar steps) | |
| 242 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 243 SAFE_2BYTE_COPY o2_mv_sensor3,lo ; o2_mv_sensor may be modifified via ISR during the two writes here... | |
| 244 movf lo,W ; in 0.1mV steps | |
| 245 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 246 movf hi,W ; in 0.1mV steps | |
| 247 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 248 | |
| 249 movlw div_ppo2_sensors | |
| 250 movwf divisor_ppo2_sensors ; Reload divisor | |
| 251 return | |
| 252 | |
| 253 store_dive_gf: | |
| 254 movff char_O_gradient_factor,WREG ; gradient factor absolute | |
| 255 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 256 movlw div_gf | |
| 257 movwf divisor_gf ; Reload divisor | |
| 258 return | |
| 259 | |
| 260 store_dive_decodata: | |
| 261 movf decodata+0,W ; =0:no stop dive, if in deco mode: ceiling in m | |
| 262 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 263 movf decodata+1,W ; no stop time of length of first stop | |
| 264 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 265 movlw div_deco | |
| 266 movwf divisor_deco ; Reload divisor | |
| 267 return | |
| 268 | |
| 269 store_dive_temperature: | |
| 270 SAFE_2BYTE_COPY temperature,lo | |
| 271 movf lo,W ; append temperature to current sample! | |
| 272 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 273 movf hi,W | |
| 274 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 275 movlw div_temperature | |
| 276 movwf divisor_temperature ; Reload divisor | |
| 277 return | |
| 278 | |
| 279 ghostwrite_byte_header: | |
| 280 goto write_byte_ext_flash_plus_header ; (This call will also delete the 4kB TOC entry first) | |
| 281 ; returns... | |
| 282 | |
| 283 ghostwrite_byte_profile: | |
| 284 goto write_byte_ext_flash_plus ; writes byte and increases address with banking at 0x200000 | |
| 285 ; returns... | |
| 286 | |
| 287 global ghostwriter_end_dive | |
| 288 ghostwriter_end_dive: | |
| 289 movff ext_flash_address+0,ext_flash_log_pointer+0 | |
| 290 movff ext_flash_address+1,ext_flash_log_pointer+1 | |
| 291 movff ext_flash_address+2,ext_flash_log_pointer+2 ; Save end-of-profile pointer to store in header | |
| 292 | |
| 293 btfss realdive ; dive longer then one minute | |
| 294 goto ghostwriter_end_dive_common ; No, discard everything | |
| 295 | |
| 296 ; In DEBUG compile, keep all simulated dives in logbook, Desat time, nofly, etc... | |
| 297 ifndef __DEBUG | |
| 298 btfsc simulatormode_active ; Are we in simulator mode? | |
| 299 goto ghostwriter_end_dive_common ; Yes, discard everything | |
| 300 endif | |
| 301 | |
| 302 ; Dive finished (and longer then one minute or Apnoe timeout occured) | |
| 303 | |
| 304 btfsc FLAG_apnoe_mode ; Calc max. depth (again) for very short apnoe dives | |
| 305 call apnoe_calc_maxdepth | |
| 306 | |
| 307 ; calculate desaturation time | |
| 308 movff last_surfpressure_30min+0,int_I_pres_surface+0 ; Pass surface to desat routine ! | |
| 309 movff last_surfpressure_30min+1,int_I_pres_surface+1 | |
| 310 | |
| 311 call deco_calc_desaturation_time ; calculate desaturation time | |
| 312 movlb b'00000001' ; select ram bank 1 | |
| 313 movff int_O_desaturation_time+0, desaturation_time+0 | |
| 314 movff int_O_desaturation_time+1, desaturation_time+1 ; Buffer | |
| 315 call calc_deko_surfmode | |
| 316 rcall calculate_noflytime ; Calc NoFly time | |
| 317 | |
| 318 ; store header and ... | |
| 319 movlw 0xFD ; .... End-of-Profile Bytes | |
| 320 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 321 movlw 0xFD | |
| 322 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash | |
| 323 movff ext_flash_address+0,ext_flash_log_pointer+0 | |
| 324 movff ext_flash_address+1,ext_flash_log_pointer+1 | |
| 325 movff ext_flash_address+2,ext_flash_log_pointer+2 ; Save end-of-profile pointer to store in header | |
| 326 | |
| 327 ; Set to first address again to store dive length ext_flash_dive_counter:3 | |
| 328 clrf EEADRH ; Make sure to select eeprom bank 0 | |
| 329 read_int_eeprom .4 | |
| 330 movff EEDATA,ext_flash_address+0 | |
| 331 read_int_eeprom .5 | |
| 332 movff EEDATA,ext_flash_address+1 | |
| 333 read_int_eeprom .6 | |
| 334 movff EEDATA,ext_flash_address+2 | |
| 335 | |
| 336 incf_ext_flash_address_0x20 d'6' ; Skip internal "0xFA 0xFA #Divenumber:2 0xFA 0xFA" Header | |
| 337 ; Store dive length | |
| 338 movf ext_flash_dive_counter+0,W | |
| 339 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 340 movf ext_flash_dive_counter+1,W | |
| 341 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 342 movf ext_flash_dive_counter+2,W | |
| 343 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 344 | |
| 345 ; profile recording done. | |
| 346 | |
| 347 ; Load total number of dives | |
| 348 read_int_eeprom .2 | |
| 349 movff EEDATA,lo | |
| 350 read_int_eeprom .3 | |
| 351 movff EEDATA,hi | |
| 352 ; +1 increase total dive counter | |
| 353 incf lo,F | |
| 354 movlw d'0' | |
| 355 addwfc hi,F | |
| 356 ; Store new number in EEPROM | |
| 357 movff lo,EEDATA | |
| 358 write_int_eeprom .2 | |
| 359 movff hi,EEDATA | |
| 360 write_int_eeprom .3 | |
| 361 | |
| 362 decf lo,F ; -1 | |
| 363 ; Set ext_flash_address:3 to TOC entry of this dive | |
| 364 ; 1st: 200000h-200FFFh -> lo=0 | |
| 365 ; 2nd: 201000h-201FFFh -> lo=1 | |
| 366 ; 3rd: 202000h-202FFFh -> lo=2 | |
| 367 ; 255: 2FF000h-2FFFFFh -> lo=255 | |
| 368 | |
| 369 clrf ext_flash_address+0 | |
| 370 clrf ext_flash_address+1 | |
| 371 movlw 0x20 | |
| 372 movwf ext_flash_address+2 | |
| 373 movlw .16 | |
| 374 mulwf lo ; lo*16 = offset to 0x2000 (up:hi) | |
| 375 movf PRODL,W | |
| 376 addwf ext_flash_address+1,F | |
| 377 movf PRODH,W | |
| 378 addwfc ext_flash_address+2,F | |
| 379 | |
| 380 ; Now, write header | |
| 381 | |
| 382 movlw 0xFA ; Header start | |
| 383 rcall ghostwrite_byte_header ; (This call will also delete the 4kB TOC entry first) | |
| 384 movlw 0xFA | |
| 385 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 386 | |
| 387 ; store pointer to begin of diveprofile | |
| 388 read_int_eeprom .4 | |
| 389 movf EEDATA,W | |
| 390 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 391 read_int_eeprom .5 | |
| 392 movf EEDATA,W | |
| 393 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 394 read_int_eeprom .6 | |
| 395 movf EEDATA,W | |
| 396 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 397 | |
| 398 ; store pointer to end of diveprofile | |
| 399 movf ext_flash_log_pointer+0,W | |
| 400 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 401 movf ext_flash_log_pointer+1,W | |
| 402 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 403 movf ext_flash_log_pointer+2,W | |
| 404 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 405 | |
| 406 ; write rest of header | |
| 407 movlw logbook_profile_version ; Defined in ostc3.inc | |
| 408 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 409 | |
| 410 ; Store dive length | |
| 411 movf ext_flash_dive_counter+0,W | |
| 412 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 413 movf ext_flash_dive_counter+1,W | |
| 414 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 415 movf ext_flash_dive_counter+2,W | |
| 416 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 417 | |
| 418 movf year,W ; Date | |
| 419 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 420 movf month,W | |
| 421 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 422 movf day,W | |
| 423 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 424 movf hours,W ; End of dive time | |
| 425 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 426 movf mins,W | |
| 427 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 428 | |
| 429 btfss FLAG_apnoe_mode ; Store apnoe max or normal max (Which is only max from the last descent) | |
| 430 bra end_dive1 ; Store normal depth | |
| 431 | |
| 432 movff apnoe_max_pressure+0,lo | |
| 433 movff apnoe_max_pressure+1,hi | |
| 434 call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] | |
| 435 movff lo,apnoe_max_pressure+0 | |
| 436 movff hi,apnoe_max_pressure+1 | |
| 437 | |
| 438 movf apnoe_max_pressure+0,W ; Max. depth | |
| 439 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 440 movf apnoe_max_pressure+1,W | |
| 441 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 442 bra end_dive2 ; skip normal max. depth | |
| 443 | |
| 444 end_dive1: | |
| 445 movff max_pressure+0,lo | |
| 446 movff max_pressure+1,hi | |
| 447 call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar] | |
| 448 movff lo,max_pressure+0 | |
| 449 movff hi,max_pressure+1 | |
| 450 | |
| 451 movff max_pressure+0,WREG ; Max. depth | |
| 452 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 453 movff max_pressure+1,WREG | |
| 454 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 455 | |
| 456 end_dive2: | |
| 457 movf divemins+0,W ; divetime minutes | |
| 458 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 459 movf divemins+1,W | |
| 460 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 461 movf divesecs,W ; divetime seconds | |
| 462 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 463 movff minimum_temperature+0,WREG ; minimum temperature | |
| 464 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 465 movff minimum_temperature+1,WREG | |
| 466 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 467 movff last_surfpressure_30min+0,WREG ; airpressure before dive | |
| 468 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 469 movff last_surfpressure_30min+1,WREG | |
| 470 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 471 movff int_O_desaturation_time+0,WREG ; desaturation time in minutes | |
| 472 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 473 movff int_O_desaturation_time+1,WREG | |
| 474 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 475 | |
| 476 btfss FLAG_ccr_mode ; In CCR mode... | |
| 477 bra end_dive_oc_gaslist ; No, write OC gases | |
| 478 ; Write Diluents... | |
| 479 movff opt_dil_O2_ratio+0,WREG | |
| 480 rcall ghostwrite_byte_header ; %O2 | |
| 481 movff opt_dil_He_ratio+0,WREG | |
| 482 rcall ghostwrite_byte_header ; %He | |
| 483 movff char_I_dil_change+0,WREG | |
| 484 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 485 movff opt_dil_type+0,WREG | |
| 486 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal | |
| 487 | |
| 488 movff opt_dil_O2_ratio+1,WREG | |
| 489 rcall ghostwrite_byte_header ; %O2 | |
| 490 movff opt_dil_He_ratio+1,WREG | |
| 491 rcall ghostwrite_byte_header ; %He | |
| 492 movff char_I_dil_change+1,WREG | |
| 493 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 494 movff opt_dil_type+1,WREG | |
| 495 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal | |
| 496 | |
| 497 movff opt_dil_O2_ratio+2,WREG | |
| 498 rcall ghostwrite_byte_header ; %O2 | |
| 499 movff opt_dil_He_ratio+2,WREG | |
| 500 rcall ghostwrite_byte_header ; %He | |
| 501 movff char_I_dil_change+2,WREG | |
| 502 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 503 movff opt_dil_type+2,WREG | |
| 504 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal | |
| 505 | |
| 506 movff opt_dil_O2_ratio+3,WREG | |
| 507 rcall ghostwrite_byte_header ; %O2 | |
| 508 movff opt_dil_He_ratio+3,WREG | |
| 509 rcall ghostwrite_byte_header ; %He | |
| 510 movff char_I_dil_change+3,WREG | |
| 511 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 512 movff opt_dil_type+3,WREG | |
| 513 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal | |
| 514 | |
| 515 movff opt_dil_O2_ratio+4,WREG | |
| 516 rcall ghostwrite_byte_header ; %O2 | |
| 517 movff opt_dil_He_ratio+4,WREG | |
| 518 rcall ghostwrite_byte_header ; %He | |
| 519 movff char_I_dil_change+4,WREG | |
| 520 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 521 movff opt_dil_type+4,WREG | |
| 522 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal | |
| 523 bra end_dive_oc_cc_common | |
| 524 | |
| 525 end_dive_oc_gaslist: ; OC Gases... | |
| 526 movff opt_gas_O2_ratio+0,WREG | |
| 527 rcall ghostwrite_byte_header ; %O2 | |
| 528 movff opt_gas_He_ratio+0,WREG | |
| 529 rcall ghostwrite_byte_header ; %He | |
| 530 movff char_I_deco_gas_change+0,WREG | |
| 531 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 532 movff opt_gas_type+0,WREG | |
| 533 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco | |
| 534 | |
| 535 movff opt_gas_O2_ratio+1,WREG | |
| 536 rcall ghostwrite_byte_header ; %O2 | |
| 537 movff opt_gas_He_ratio+1,WREG | |
| 538 rcall ghostwrite_byte_header ; %He | |
| 539 movff char_I_deco_gas_change+1,WREG | |
| 540 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 541 movff opt_gas_type+1,WREG | |
| 542 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco | |
| 543 | |
| 544 movff opt_gas_O2_ratio+2,WREG | |
| 545 rcall ghostwrite_byte_header ; %O2 | |
| 546 movff opt_gas_He_ratio+2,WREG | |
| 547 rcall ghostwrite_byte_header ; %He | |
| 548 movff char_I_deco_gas_change+2,WREG | |
| 549 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 550 movff opt_gas_type+2,WREG | |
| 551 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco | |
| 552 | |
| 553 movff opt_gas_O2_ratio+3,WREG | |
| 554 rcall ghostwrite_byte_header ; %O2 | |
| 555 movff opt_gas_He_ratio+3,WREG | |
| 556 rcall ghostwrite_byte_header ; %He | |
| 557 movff char_I_deco_gas_change+3,WREG | |
| 558 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 559 movff opt_gas_type+3,WREG | |
| 560 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco | |
| 561 | |
| 562 movff opt_gas_O2_ratio+4,WREG | |
| 563 rcall ghostwrite_byte_header ; %O2 | |
| 564 movff opt_gas_He_ratio+4,WREG | |
| 565 rcall ghostwrite_byte_header ; %He | |
| 566 movff char_I_deco_gas_change+4,WREG | |
| 567 rcall ghostwrite_byte_header ; Configured change depth in m | |
| 568 movff opt_gas_type+4,WREG | |
| 569 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco | |
| 570 ; bra end_dive_oc_cc_common | |
| 571 | |
| 572 end_dive_oc_cc_common: | |
| 573 movlw softwareversion_x ; Firmware version | |
| 574 rcall ghostwrite_byte_header | |
| 575 movlw softwareversion_y | |
| 576 rcall ghostwrite_byte_header | |
| 577 movf batt_voltage+0,W ; Battery voltage | |
| 578 rcall ghostwrite_byte_header | |
| 579 movf batt_voltage+1,W | |
| 580 rcall ghostwrite_byte_header | |
| 581 | |
| 582 movlw samplingrate ; Sampling rate | |
| 583 btfsc FLAG_apnoe_mode ; Apnoe mode? | |
| 584 movlw samplingrate_apnoe ; Apnoe sampling rate | |
| 585 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 586 | |
| 587 ; CNS at gebinning of dive | |
| 588 movff CNS_start+0,WREG | |
| 589 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 590 movff CNS_start+1,WREG | |
| 591 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 592 ; Gradient factor | |
| 593 movff GF_start,WREG | |
| 594 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 595 movff char_O_relative_gradient_GF,WREG | |
| 596 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 597 ; Spares at Byte 57-60 | |
| 598 movlw 0xFF | |
| 599 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 600 movlw 0xFF | |
| 601 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 602 movlw 0xFF | |
| 603 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 604 ; Store 5 Setpoints | |
| 605 movff char_I_setpoint_cbar+0,WREG | |
| 606 rcall ghostwrite_byte_header ; Setpoint in cbar | |
| 607 movff char_I_setpoint_change+0,WREG | |
| 608 rcall ghostwrite_byte_header ; Change depth | |
| 609 movff char_I_setpoint_cbar+1,WREG | |
| 610 rcall ghostwrite_byte_header ; Setpoint in cbar | |
| 611 movff char_I_setpoint_change+1,WREG | |
| 612 rcall ghostwrite_byte_header ; Change depth | |
| 613 movff char_I_setpoint_cbar+2,WREG | |
| 614 rcall ghostwrite_byte_header ; Setpoint in cbar | |
| 615 movff char_I_setpoint_change+2,WREG | |
| 616 rcall ghostwrite_byte_header ; Change depth | |
| 617 movff char_I_setpoint_cbar+3,WREG | |
| 618 rcall ghostwrite_byte_header ; Setpoint in cbar | |
| 619 movff char_I_setpoint_change+3,WREG | |
| 620 rcall ghostwrite_byte_header ; Change depth | |
| 621 movff char_I_setpoint_cbar+4,WREG | |
| 622 rcall ghostwrite_byte_header ; Setpoint in cbar | |
| 623 movff char_I_setpoint_change+4,WREG | |
| 624 rcall ghostwrite_byte_header ; Change depth | |
| 625 | |
| 626 movff opt_salinity,WREG ; Salinity (0-5%) | |
| 627 rcall ghostwrite_byte_header ; Store Salinity to Dive | |
| 628 | |
| 629 movff int_O_CNS_fraction+0,WREG ; copy into bank1 | |
| 630 rcall ghostwrite_byte_header; Stores CNS% | |
| 631 movff int_O_CNS_fraction+1,WREG ; copy into bank1 | |
| 632 rcall ghostwrite_byte_header; Stores CNS% | |
| 633 | |
| 634 movff avr_rel_pressure_total+0,WREG ; Average Depth | |
| 635 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 636 movff avr_rel_pressure_total+1,WREG ; Average Depth | |
| 637 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 638 | |
| 639 movff total_divetime_seconds+0,WREG ; Total dive time (Regardless of start_dive_threshold) | |
| 640 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 641 movff total_divetime_seconds+1,WREG ; Total dive time (Regardless of start_dive_threshold) | |
| 642 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 643 | |
| 644 movff char_I_GF_Low_percentage,WREG ; GF_lo | |
| 645 movff char_I_deco_model,lo | |
| 646 decfsz lo,F ; jump over next line if char_I_deco_model == 1 | |
| 647 movff char_I_saturation_multiplier,WREG ; Saturation Multiplier | |
| 648 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 649 | |
| 650 movff char_I_GF_High_percentage,WREG ; GF_hi | |
| 651 movff char_I_deco_model,lo | |
| 652 decfsz lo,F ; jump over next line if char_I_deco_model == 1 | |
| 653 movff char_I_desaturation_multiplier,WREG ; Desaturation Multiplier | |
| 654 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 655 | |
| 656 movff char_I_deco_model,WREG ; 0 = ZH-L16, 1 = ZH-L16-GF | |
| 657 rcall ghostwrite_byte_header; writes byte and increases address (no banking) | |
| 658 | |
| 659 read_int_eeprom .2 | |
| 660 movf EEDATA,W | |
| 661 rcall ghostwrite_byte_header ; Total dive counter, low | |
| 662 read_int_eeprom .3 | |
| 663 movf EEDATA,W | |
| 664 rcall ghostwrite_byte_header ; Total dive counter, high | |
| 665 | |
| 666 movff opt_dive_mode,WREG | |
| 667 rcall ghostwrite_byte_header ; 0=OC, 1=CC, 2=Gauge, 3=Apnea | |
| 668 | |
| 669 ; Store all tissue data available | |
| 670 movlw .16 | |
| 671 movwf lo | |
| 672 lfsr FSR1,char_O_tissue_N2_saturation+0 | |
| 673 end_dive_store_tissues_N2: | |
| 674 movf POSTINC1,W | |
| 675 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 676 decfsz lo,F | |
| 677 bra end_dive_store_tissues_N2 ; No | |
| 678 | |
| 679 movlw .64 | |
| 680 movwf lo | |
| 681 lfsr FSR1,0x700;pres_tissue_N2+0 ; 16*4Byte Float = 64Bytes | |
| 682 end_dive_store_tissues_N2_2: | |
| 683 movf POSTINC1,W | |
| 684 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 685 decfsz lo,F | |
| 686 bra end_dive_store_tissues_N2_2 ; No | |
| 687 | |
| 688 movlw .16 | |
| 689 movwf lo | |
| 690 lfsr FSR1,char_O_tissue_He_saturation+0 | |
| 691 end_dive_store_tissues_He: | |
| 692 movf POSTINC1,W | |
| 693 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 694 decfsz lo,F | |
| 695 bra end_dive_store_tissues_He ; No | |
| 696 | |
| 697 movlw .64 | |
| 698 movwf lo | |
| 699 lfsr FSR1,0x740;pres_tissue_He+0 ; 16*4Byte Float = 64Bytes | |
| 700 end_dive_store_tissues_He_2: | |
| 701 movf POSTINC1,W | |
| 702 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 703 decfsz lo,F | |
| 704 bra end_dive_store_tissues_He_2 ; No | |
| 705 | |
| 706 ; Some deco stuff | |
| 707 movff char_I_depth_last_deco,WREG ; last stop [m] | |
| 708 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 709 movff char_I_deco_distance,WREG ; assumed distance to shown stop | |
| 710 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 711 | |
| 712 ; Last HUD data | |
| 713 movff hud_battery_mv+0,WREG ; Last HUD battery value | |
| 714 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 715 movff hud_battery_mv+1,WREG ; Last HUD battery value | |
| 716 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 717 movff hud_status_byte,WREG ; Last HUD status | |
| 718 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 719 | |
| 720 ; Battery gauge registers [nAs] | |
| 721 movff battery_gauge+0,WREG ; Battery gauge register | |
| 722 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 723 movff battery_gauge+1,WREG ; Battery gauge register | |
| 724 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 725 movff battery_gauge+2,WREG ; Battery gauge register | |
| 726 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 727 movff battery_gauge+3,WREG ; Battery gauge register | |
| 728 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 729 movff battery_gauge+4,WREG ; Battery gauge register | |
| 730 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 731 movff battery_gauge+5,WREG ; Battery gauge register | |
| 732 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 733 | |
| 734 ; Header stop | |
| 735 movlw 0xFB | |
| 736 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 737 movlw 0xFB | |
| 738 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash | |
| 739 | |
| 740 call divemode_store_statistics ; Store/update statistics for this unit | |
| 741 | |
| 742 clrf surface_interval+0 | |
| 743 clrf surface_interval+1 ; Clear surface interval timer | |
| 744 | |
| 745 ghostwriter_end_dive_common: | |
| 746 ; Update ext_flash_log_pointer into EEPROM | |
| 747 clrf EEADRH | |
| 748 movff ext_flash_log_pointer+0,EEDATA | |
| 749 write_int_eeprom .4 | |
| 750 movff ext_flash_log_pointer+1,EEDATA | |
| 751 write_int_eeprom .5 | |
| 752 movff ext_flash_log_pointer+2,EEDATA | |
| 753 write_int_eeprom .6 | |
| 754 | |
| 755 bcf simulatormode_active ; if we were in simulator mode | |
| 756 | |
| 757 ; In DEBUG compile, keep all simulated dives in logbook, Desat time, nofly, etc... | |
| 758 ifndef __DEBUG | |
| 759 extern deco_pull_tissues_from_vault | |
| 760 btfsc restore_deco_data ; Restore decodata? | |
| 761 call deco_pull_tissues_from_vault | |
| 762 banksel common ; Bank1 | |
| 763 endif | |
| 764 call update_battery_registers ; update battery registers into EEPROM | |
| 765 goto surfloop ; and return to surfaceloop | |
| 766 | |
| 767 global ghostwriter_short_header | |
| 768 ghostwriter_short_header: ; Write short header with divenumber into profile memory | |
| 769 | |
| 770 ; load pointer for profile storing into RAM (Updated in EEPROM after the dive) | |
| 771 clrf EEADRH ; Make sure to select eeprom bank 0 | |
| 772 read_int_eeprom .4 | |
| 773 movff EEDATA,ext_flash_address+0 | |
| 774 read_int_eeprom .5 | |
| 775 movff EEDATA,ext_flash_address+1 | |
| 776 read_int_eeprom .6 | |
| 777 movff EEDATA,ext_flash_address+2 | |
| 778 | |
| 779 ; Clear dive length counter | |
| 780 clrf ext_flash_dive_counter+0 | |
| 781 clrf ext_flash_dive_counter+1 | |
| 782 clrf ext_flash_dive_counter+2 | |
| 783 | |
| 784 ; Write short header with divenumber into profile memory | |
| 785 movlw 0xFA | |
| 786 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 787 movlw 0xFA | |
| 788 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 789 ; Load total number of dives (low byte only) | |
| 790 read_int_eeprom .2 | |
| 791 incf EEDATA,W ;+1 | |
| 792 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 793 read_int_eeprom .3 | |
| 794 movf EEDATA,W | |
| 795 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 796 movlw 0xFA | |
| 797 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 798 movlw 0xFA | |
| 799 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 800 ; Keep room for dive length ext_flash_dive_counter:3 (Stored at the end of the dive) | |
| 801 incf_ext_flash_address_0x20 d'3' ; Skip Bytes in external flash (faster) | |
| 802 | |
| 803 movlw samplingrate ; Sampling rate | |
| 804 btfsc FLAG_apnoe_mode ; Apnoe mode? | |
| 805 movlw samplingrate_apnoe ; Apnoe sampling rate | |
| 806 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 807 | |
| 808 movlw .7 ; Number of divisors | |
| 809 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 810 | |
| 811 movlw .0 ; Type | |
| 812 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 813 movlw infolength_temperature | |
| 814 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 815 movlw div_temperature ; Divisor temperature | |
| 816 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 817 | |
| 818 movlw .1 ; Type | |
| 819 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 820 movlw infolength_deco | |
| 821 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 822 movlw div_deco ; Divisor decodata | |
| 823 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 824 | |
| 825 movlw .2 ; Type | |
| 826 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 827 movlw infolength_gf | |
| 828 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 829 movlw div_gf ; Divisor gf | |
| 830 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 831 | |
| 832 movlw .3 ; Type | |
| 833 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 834 movlw infolength_ppo2_sensors | |
| 835 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 836 movlw div_ppo2_sensors ; Divisor ppO2 | |
| 837 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 838 | |
| 839 movlw .4 ; Type | |
| 840 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 841 movlw infolength_decoplan | |
| 842 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 843 movlw div_decoplan ; Divisor debug | |
| 844 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 845 | |
| 846 movlw .5 ; Type | |
| 847 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 848 movlw infolength_cns | |
| 849 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 850 movlw div_cns ; Divisor CNS | |
| 851 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 852 | |
| 853 movlw .6 ; Type | |
| 854 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 855 movlw infolength_tank | |
| 856 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 857 movlw div_tank ; Divisor Tank | |
| 858 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash | |
| 859 | |
| 860 return | |
| 861 | |
| 862 calculate_noflytime: | |
| 863 ; calculate nofly time | |
| 864 movff int_O_desaturation_time+0,xA+0 | |
| 865 movff int_O_desaturation_time+1,xA+1 | |
| 866 | |
| 867 btfsc xA+1,7 ; Is desat time negative ? | |
| 868 bra calculate_noflytime_3 ; Then surely not valid ! | |
| 869 | |
| 870 tstfsz xA+0 ; Desat=0? | |
| 871 bra calculate_noflytime2 | |
| 872 tstfsz xA+1 ; Desat=0? | |
| 873 bra calculate_noflytime2 | |
| 874 | |
| 875 calculate_noflytime_3: | |
| 876 ; Desaturation time = zero | |
| 877 clrf nofly_time+0 ; Clear nofly time | |
| 878 clrf nofly_time+1 ; Clear nofly time | |
| 879 return | |
| 880 | |
| 881 calculate_noflytime2: | |
| 882 movff xA+0,int_I_temp+0 | |
| 883 movff xA+1,int_I_temp+1 | |
| 884 movlw no_fly_time_ratio ; nofly_time_ratio | |
| 885 movff WREG,char_I_temp | |
| 886 call deco_calc_percentage | |
| 887 movlb b'00000001' ; select ram bank 1 | |
| 888 movff int_I_temp+0,xA+0 | |
| 889 movff int_I_temp+1,xA+1 | |
| 890 tstfsz xA+0 ; Desat=0? | |
| 891 bra calculate_noflytime_2_final | |
| 892 tstfsz xA+1 ; Desat=0? | |
| 893 bra calculate_noflytime_2_final | |
| 894 bra calculate_noflytime_3 | |
| 895 | |
| 896 calculate_noflytime_2_final: | |
| 897 movff xA+0,nofly_time+0 | |
| 898 movff xA+1,nofly_time+1 | |
| 899 return | |
| 900 | |
| 901 | |
| 902 divemode_store_statistics: ; Store/update statistics for this unit | |
| 903 rcall do_logoffset_common_read ; Existing logbook offset into lo:hi | |
| 904 | |
| 905 tstfsz lo ; lo=0? | |
| 906 bra change_logbook_offset1 ; No, adjust offset | |
| 907 tstfsz hi ; hi=0? | |
| 908 bra change_logbook_offset1 ; No, adjust offset | |
| 909 bra change_logbook_offset2 ; lo=0 and hi=0 -> skip Offset routine | |
| 910 change_logbook_offset1: | |
| 911 movlw d'1' | |
| 912 addwf lo | |
| 913 movlw d'0' | |
| 914 addwfc hi | |
| 915 rcall do_logoffset_common_write ; lo:hi -> EEPROM | |
| 916 change_logbook_offset2: | |
| 917 ; Add more here... | |
| 918 return | |
| 919 | |
| 920 global do_logoffset_common_write | |
| 921 do_logoffset_common_write: | |
| 922 movff lo,EEDATA | |
| 923 write_int_eeprom 0x0D | |
| 924 movff hi,EEDATA | |
| 925 write_int_eeprom 0x0E | |
| 926 return | |
| 927 | |
| 928 global do_logoffset_common_read | |
| 929 do_logoffset_common_read: | |
| 930 clrf EEADRH | |
| 931 read_int_eeprom 0x0D | |
| 932 movff EEDATA,lo | |
| 933 read_int_eeprom 0x0E | |
| 934 movff EEDATA,hi ; Existing logbook offset into lo:hi | |
| 935 return | |
| 936 | |
| 937 | |
| 938 global update_battery_registers | |
| 939 update_battery_registers: | |
| 940 ; save battery_gauge:6 into EEPROM 0x07-0x0C | |
| 941 clrf EEADRH | |
| 942 movff battery_gauge+0,EEDATA | |
| 943 write_int_eeprom 0x07 | |
| 944 movff battery_gauge+1,EEDATA | |
| 945 write_int_eeprom 0x08 | |
| 946 movff battery_gauge+2,EEDATA | |
| 947 write_int_eeprom 0x09 | |
| 948 movff battery_gauge+3,EEDATA | |
| 949 write_int_eeprom 0x0A | |
| 950 movff battery_gauge+4,EEDATA | |
| 951 write_int_eeprom 0x0B | |
| 952 movff battery_gauge+5,EEDATA | |
| 953 write_int_eeprom 0x0C | |
| 954 bcf onehourupdate ; Clear flag | |
| 955 return | |
| 956 | |
| 957 | |
| 958 END |
