Mercurial > public > mk2
annotate code_part1/OSTC_code_asm_part1/simulator.asm @ 186:57a654c199ae
BUGFIX Gradient Factor algo.
+ Fix calc_hauptroutine_update_tissues() crazzy calculation in GF mode for deco limit.
+ Backup lock/GF_step/deco_pointer during ascent simulation.
author | JeanDo |
---|---|
date | Wed, 02 Feb 2011 00:09:30 +0100 |
parents | 016c45a0caaf |
children | f15e804ff67f |
rev | line source |
---|---|
0 | 1 |
2 ; OSTC - diving computer code | |
3 ; Copyright (C) 2008 HeinrichsWeikamp GbR | |
4 | |
5 ; This program is free software: you can redistribute it and/or modify | |
6 ; it under the terms of the GNU General Public License as published by | |
7 ; the Free Software Foundation, either version 3 of the License, or | |
8 ; (at your option) any later version. | |
9 | |
10 ; This program is distributed in the hope that it will be useful, | |
11 ; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 ; GNU General Public License for more details. | |
14 | |
15 ; You should have received a copy of the GNU General Public License | |
16 ; along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 | |
18 | |
19 ; menu "Simulator" | |
20 ; written by: Matthias Heinrichs, info@heinrichsweikamp.com | |
21 ; written: 081210 | |
22 ; last updated: 081210 | |
23 ; known bugs: | |
24 ; ToDo: | |
25 | |
26 menu_simulator: | |
27 movlw d'1' | |
28 movwf logbook_temp1 ; Bottom time | |
29 movlw d'15' | |
30 movwf logbook_temp2 ; Max. Depth | |
31 movlw d'1' | |
32 movwf menupos | |
33 | |
34 menu_simulator1: | |
35 clrf timeout_counter2 | |
36 bsf menubit | |
37 bsf cursor | |
49 | 38 call PLED_brightness_full ;max. brightness |
0 | 39 call PLED_ClearScreen |
40 call PLED_simulator_mask | |
41 | |
42 menu_simulator2: | |
43 bcf switch_left | |
44 bcf switch_right | |
45 bcf menubit2 | |
46 bcf menubit3 | |
47 call PLED_simulator_data | |
48 call PLED_menu_cursor | |
49 | |
50 menu_simulator_loop: | |
51 call check_switches_menu | |
52 menu_simulator_loop2: | |
53 btfss onesecupdate | |
54 bra menu_simulator_loop3 | |
55 | |
56 call timeout_surfmode | |
57 call set_dive_modes | |
58 call test_charger ; check if charger IC is active | |
59 call get_battery_voltage ; get battery voltage | |
60 | |
61 bcf onesecupdate ; End of one second tasks | |
62 | |
63 menu_simulator_loop3: | |
64 btfsc menubit2 | |
65 goto menu_simulator_do ; call submenu | |
66 | |
67 btfss menubit | |
35 | 68 goto menu_simulator_exit |
0 | 69 |
70 btfsc sleepmode | |
35 | 71 goto menu_simulator_exit |
0 | 72 |
73 btfsc divemode | |
74 goto restart ; exit menu, restart and enter divemode | |
75 | |
76 bra menu_simulator_loop | |
77 | |
78 menu_simulator_do: ; calls submenu | |
79 dcfsnz menupos,F | |
80 bra simulator_startdive | |
81 dcfsnz menupos,F | |
82 bra simulator_inc_bottomtime | |
83 dcfsnz menupos,F | |
84 bra simulator_inc_maxdepth | |
85 dcfsnz menupos,F | |
86 bra simulator_calc_deco | |
87 dcfsnz menupos,F | |
88 bra simulator_show_decoplan | |
35 | 89 menu_simulator_exit: |
0 | 90 movlw d'4' |
91 movwf menupos | |
92 goto more_menu2 ; exit... | |
93 | |
94 simulator_inc_bottomtime: | |
95 movlw d'2' | |
96 addwf logbook_temp1,F ; Here: Bottomtime in m | |
97 movlw d'199' | |
98 cpfslt logbook_temp1 | |
99 movwf logbook_temp1 | |
100 movlw d'2' | |
101 movwf menupos | |
102 bra menu_simulator2 | |
103 | |
104 simulator_inc_maxdepth: | |
105 movlw d'3' | |
106 addwf logbook_temp2,F ; Here: Maxdepth in m | |
107 movlw d'99' | |
108 cpfslt logbook_temp2 | |
109 movwf logbook_temp2 | |
110 movlw d'3' | |
111 movwf menupos | |
112 bra menu_simulator2 | |
113 | |
114 simulator_startdive: | |
33 | 115 ; Descent to -15m depth |
0 | 116 ; Set standalone_simulator flag (Displays Simulator menu during simulation by pressing ENTER button) |
117 ; Clear standalone_simulator after (any) dive | |
118 bsf simulatormode_active ; normal simulator mode | |
119 bsf standalone_simulator ; Standalone Simulator active | |
120 | |
121 movff logbook_temp2,xA+0 | |
122 clrf xA+1 | |
123 movlw d'100' | |
124 movwf xB+0 | |
125 clrf xB+1 | |
126 call mult16x16 ;xA*xB=xC ; Depth in m*100 | |
127 | |
62 | 128 movlw LOW d'1000' |
0 | 129 addwf xC+0,F |
62 | 130 movlw HIGH d'1000' |
131 addwfc xC+1,F ; add 1000mBar | |
132 | |
133 ; movf amb_pressure+0,W | |
134 ; addwf xC+0,F | |
135 ; movf amb_pressure+1,W | |
136 ; addwfc xC+1,F ; Add ambient pressure | |
137 ; | |
0 | 138 movff xC+0,sim_pressure+0 |
139 movff xC+1,sim_pressure+1 | |
140 | |
141 movff sim_pressure+0,amb_pressure+0 ; override readings with simulator values | |
142 movff sim_pressure+1,amb_pressure+1 | |
143 | |
144 bcf menubit2 | |
145 bcf menubit3 | |
146 bcf menubit | |
147 bcf switch_left | |
148 bcf switch_right | |
149 | |
150 call simulator_save_tissue_data ; Stores 32 floats "pre_tissue" into bank3 | |
151 | |
152 bsf divemode ; Set divemode flag | |
153 ostc_debug 'P' ; Sends debug-information to screen if debugmode active | |
154 goto diveloop ; Start Divemode | |
155 | |
156 simulator_show_decoplan: | |
124 | 157 call PLED_ClearScreen |
158 call PLED_simdata_screen | |
159 call divemenu_see_decoplan | |
160 | |
184 | 161 WIN_LEFT .0 |
162 call PLED_standard_color | |
163 | |
124 | 164 ; Display TTS, if any... |
168 | 165 movff int_O_ascenttime+0,lo |
166 movff int_O_ascenttime+1,hi | |
167 movf lo,W | |
168 iorwf hi,W | |
124 | 169 bz simulator_decoplan_notts |
184 | 170 |
124 | 171 WIN_TOP .160 |
184 | 172 lfsr FSR2, letter |
173 OUTPUTTEXT .85 ; TTS (for translation). | |
174 STRCAT ": " | |
175 bsf leftbind | |
176 output_16 | |
177 STRCAT_PRINT "'" | |
178 | |
179 simulator_decoplan_notts: | |
180 movff int_I_pres_surface+0,lo | |
181 movff int_I_pres_surface+1,hi | |
182 | |
183 WIN_TOP .190 ; Print Pamb used for compute | |
184 lfsr FSR2, letter | |
169
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
185 bsf leftbind |
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
186 output_16 |
124 | 187 bcf leftbind |
184 | 188 STRCAT_PRINT " mbar" |
124 | 189 |
190 WIN_INVERT .1 ; Init new Wordprocessor | |
191 DISPLAYTEXT .188 ; Sim. Results: | |
192 WIN_INVERT .0 ; Init new Wordprocessor | |
34 | 193 |
64 | 194 simulator_show_decoplan1: |
0 | 195 bcf switch_left |
196 bcf switch_right | |
197 simulator_show_decoplan2: | |
198 btfss onesecupdate | |
199 bra simulator_show_decoplan3 | |
200 | |
201 call timeout_surfmode | |
202 call set_dive_modes | |
203 call test_charger ; check if charger IC is active | |
204 call get_battery_voltage ; get battery voltage | |
205 | |
206 bcf onesecupdate ; End of one second tasks | |
207 | |
208 simulator_show_decoplan3: | |
64 | 209 btfsc switch_right |
0 | 210 bra simulator_show_decoplan4 ; Quit display |
211 | |
64 | 212 btfsc switch_left |
213 bra simulator_show_decoplan5 ; Quit display or new Decoplan-Page (GF Mode only) | |
0 | 214 |
215 btfsc sleepmode | |
216 goto more_menu | |
217 | |
218 btfsc divemode | |
219 goto restart ; exit menu, restart and enter divemode | |
220 | |
221 bra simulator_show_decoplan2 | |
222 | |
64 | 223 simulator_show_decoplan5: |
124 | 224 incf decoplan_page,F |
64 | 225 btfsc last_ceiling_gf_shown ; last ceiling shown? |
226 bra simulator_show_decoplan5_0 ; All done, clear and return | |
227 | |
169
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
228 call PLED_decoplan ; Re-Draw Current page of GF Decoplan |
64 | 229 bra simulator_show_decoplan1 |
230 | |
169
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
231 simulator_show_decoplan5_0: |
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
232 bcf display_see_deco ; clear flag |
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
233 bra simulator_show_decoplan4 ; Quit |
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
234 |
0 | 235 simulator_show_decoplan4: |
236 movlw d'5' | |
237 movwf menupos | |
238 bra menu_simulator1 | |
239 | |
240 | |
241 simulator_calc_deco: | |
242 call diveloop_boot ; configure gases, etc. | |
243 | |
244 bsf simulatormode_active ; normal simulator mode | |
245 bsf standalone_simulator ; Standalone Simulator active | |
246 | |
159 | 247 movff logbook_temp1,logbook_temp3 ; store bottom time |
0 | 248 |
249 movff logbook_temp2,xA+0 | |
250 clrf xA+1 | |
251 movlw d'100' | |
252 movwf xB+0 | |
253 clrf xB+1 | |
254 call mult16x16 ;xA*xB=xC ; Depth in m*100 | |
255 | |
62 | 256 movlw LOW d'1000' |
0 | 257 addwf xC+0,F |
62 | 258 movlw HIGH d'1000' |
259 addwfc xC+1,F ; add 1000mBar | |
260 | |
0 | 261 movff xC+0,sim_pressure+0 |
262 movff xC+1,sim_pressure+1 | |
263 | |
264 movff sim_pressure+0,amb_pressure+0 ; override readings with simulator values | |
265 movff sim_pressure+1,amb_pressure+1 | |
266 | |
267 call simulator_save_tissue_data ; Stores 32 floats "pre_tissue" into bank3 | |
268 | |
124 | 269 call PLED_topline_box |
0 | 270 WIN_INVERT .1 |
271 DISPLAYTEXT .12 ;" Wait.." | |
272 WIN_INVERT .0 | |
273 | |
274 simulator_calc_deco_loop1: | |
169
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
275 call divemode_check_decogases ; Checks for decogases and sets the gases |
32 | 276 call divemode_prepare_flags_for_deco |
277 | |
116 | 278 call deco_calc_hauptroutine ; calc_tissue |
32 | 279 movlb b'00000001' ; rambank 1 selected |
280 | |
124 | 281 movff char_O_deco_status,WREG |
282 tstfsz WREG ; deco_status=0 if decompression calculation done | |
32 | 283 bra simulator_calc_deco_loop1 ; Not finished |
0 | 284 |
31 | 285 movlw d'1' |
286 movff WREG,char_I_step_is_1min ; 1 minute mode | |
32 | 287 |
169
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
288 movlw d'2' |
32 | 289 movff WREG,char_O_deco_status ; Reset Deco module |
290 | |
291 simulator_calc_deco_loop2: | |
69 | 292 |
32 | 293 call PLED_simulator_data |
294 | |
295 btg LED_red | |
31 | 296 |
0 | 297 call divemode_check_decogases ; Checks for decogases and sets the gases |
298 call divemode_prepare_flags_for_deco | |
299 | |
116 | 300 call deco_calc_hauptroutine ; calc_tissue |
0 | 301 movlb b'00000001' ; rambank 1 selected |
302 ostc_debug 'C' ; Sends debug-information to screen if debugmode active | |
303 | |
304 decfsz logbook_temp1,F | |
32 | 305 bra simulator_calc_deco_loop2 |
306 | |
307 movlw d'0' | |
308 movff WREG,char_I_step_is_1min ; 2 second deco mode | |
309 | |
169
e26f49674956
Merge decoplan display for both GF and Buhlmann models.
JeanDo
parents:
168
diff
changeset
|
310 movlw d'2' |
32 | 311 movff WREG,char_O_deco_status ; Reset Deco module |
0 | 312 |
313 bra simulator_calc_deco2 ; Not finished | |
314 | |
315 simulator_calc_deco3: | |
21 | 316 bsf LED_red |
0 | 317 |
318 call simulator_restore_tissue_data ; Restore 32 floats "pre_tissue" from bank3 | |
319 | |
320 bcf simulatormode_active ; normal simulator mode | |
321 bcf standalone_simulator ; Standalone Simulator active | |
322 | |
323 WAITMS d'250' | |
324 WAITMS d'250' | |
325 WAITMS d'250' ; Wait for Pressure Sensor to get real pressure again... | |
326 | |
21 | 327 bcf LED_red |
0 | 328 |
329 movlw d'1' | |
330 movwf logbook_temp1 ; Bottom time>0! | |
331 | |
332 movlw d'5' ; Pre-Set Cursor to "Show Decoplan" | |
333 movwf menupos | |
159 | 334 movff logbook_temp3,logbook_temp1 ; restore bottom time |
0 | 335 bra menu_simulator1 ; Done. |
336 | |
337 simulator_calc_deco2: | |
338 call divemode_check_decogases ; Checks for decogases and sets the gases | |
339 call divemode_prepare_flags_for_deco | |
340 | |
116 | 341 call deco_calc_hauptroutine ; calc_tissue |
0 | 342 movlb b'00000001' ; rambank 1 selected |
343 | |
124 | 344 movff char_O_deco_status,WREG |
345 tstfsz WREG ; deco_status=0 if decompression calculation done | |
0 | 346 bra simulator_calc_deco2 ; Not finished |
49 | 347 bra simulator_calc_deco3 ; finished! |
348 | |
349 | |
350 simulator_save_tissue_data: | |
351 bsf restore_deco_data ; Set restore flag | |
352 ostc_debug 'S' ; Sends debug-information to screen if debugmode active | |
116 | 353 call deco_push_tissues_to_vault |
49 | 354 movlb 0x01 ; Back to RAM Bank1 |
355 ostc_debug 'T' ; Sends debug-information to screen if debugmode active | |
356 return | |
357 | |
358 simulator_restore_tissue_data: | |
359 bcf restore_deco_data ; clear restore flag | |
360 ostc_debug 'S' ; Sends debug-information to screen if debugmode active | |
116 | 361 call deco_pull_tissues_from_vault |
49 | 362 movlb 0x01 ; Back to RAM Bank1 |
363 ostc_debug 'T' ; Sends debug-information to screen if debugmode active | |
364 | |
365 ostc_debug 'G' ; Sends debug-information to screen if debugmode active | |
116 | 366 call deco_calc_desaturation_time ; calculate desaturation time |
49 | 367 movlb b'00000001' ; select ram bank 1 |
368 call calculate_noflytime ; Calc NoFly time | |
369 ostc_debug 'H' ; Sends debug-information to screen if debugmode active | |
370 | |
371 ; Calculate CNS | |
116 | 372 call deco_calc_CNS_fraction ; calculate CNS |
49 | 373 movlb b'00000001' ; rambank 1 selected |
374 return |