Mercurial > public > mk2
diff code_part1/OSTC_code_asm_part1/simulator.asm @ 0:96a35aeda5f2
Initial setup
author | heinrichsweikamp |
---|---|
date | Tue, 12 Jan 2010 15:05:59 +0100 |
parents | |
children | 73014f788032 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code_part1/OSTC_code_asm_part1/simulator.asm Tue Jan 12 15:05:59 2010 +0100 @@ -0,0 +1,310 @@ + +; OSTC - diving computer code +; Copyright (C) 2008 HeinrichsWeikamp GbR + +; This program is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. + +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with this program. If not, see <http://www.gnu.org/licenses/>. + + +; menu "Simulator" +; written by: Matthias Heinrichs, info@heinrichsweikamp.com +; written: 081210 +; last updated: 081210 +; known bugs: +; ToDo: + +menu_simulator: + movlw d'1' + movwf logbook_temp1 ; Bottom time + movlw d'15' + movwf logbook_temp2 ; Max. Depth + movlw d'1' + movwf menupos + +menu_simulator1: + clrf timeout_counter2 + bsf menubit + bsf cursor + call PLED_ClearScreen + call PLED_simulator_mask + +menu_simulator2: + bcf switch_left + bcf switch_right + bcf menubit2 + bcf menubit3 + call PLED_simulator_data + call PLED_menu_cursor + +menu_simulator_loop: + call check_switches_menu +menu_simulator_loop2: + btfss onesecupdate + bra menu_simulator_loop3 + + call timeout_surfmode + call set_dive_modes + call test_charger ; check if charger IC is active + call get_battery_voltage ; get battery voltage + + bcf onesecupdate ; End of one second tasks + +menu_simulator_loop3: + btfsc menubit2 + goto menu_simulator_do ; call submenu + + btfss menubit + goto menu ; exit setup menu and return to main menu + + btfsc sleepmode + goto more_menu + + btfsc divemode + goto restart ; exit menu, restart and enter divemode + + bra menu_simulator_loop + +menu_simulator_do: ; calls submenu + dcfsnz menupos,F + bra simulator_startdive + dcfsnz menupos,F + bra simulator_inc_bottomtime + dcfsnz menupos,F + bra simulator_inc_maxdepth + dcfsnz menupos,F + bra simulator_calc_deco + dcfsnz menupos,F + bra simulator_show_decoplan + movlw d'4' + movwf menupos + goto more_menu2 ; exit... + +simulator_inc_bottomtime: + movlw d'2' + addwf logbook_temp1,F ; Here: Bottomtime in m + movlw d'199' + cpfslt logbook_temp1 + movwf logbook_temp1 + movlw d'2' + movwf menupos + bra menu_simulator2 + +simulator_inc_maxdepth: + movlw d'3' + addwf logbook_temp2,F ; Here: Maxdepth in m + movlw d'99' + cpfslt logbook_temp2 + movwf logbook_temp2 + movlw d'3' + movwf menupos + bra menu_simulator2 + +simulator_startdive: + ; Descent to -3m depth + ; Set standalone_simulator flag (Displays Simulator menu during simulation by pressing ENTER button) + ; Clear standalone_simulator after (any) dive + bsf simulatormode_active ; normal simulator mode + bsf standalone_simulator ; Standalone Simulator active + + movff logbook_temp2,xA+0 + clrf xA+1 + movlw d'100' + movwf xB+0 + clrf xB+1 + call mult16x16 ;xA*xB=xC ; Depth in m*100 + + movlw LOW d'1000' + addwf xC+0,F + movlw HIGH d'1000' + addwfc xC+1,F ; Add 1000mBar + + movff xC+0,sim_pressure+0 + movff xC+1,sim_pressure+1 + + movff sim_pressure+0,amb_pressure+0 ; override readings with simulator values + movff sim_pressure+1,amb_pressure+1 + + bcf menubit2 + bcf menubit3 + bcf menubit + bcf switch_left + bcf switch_right + + call simulator_save_tissue_data ; Stores 32 floats "pre_tissue" into bank3 + + bsf divemode ; Set divemode flag + ostc_debug 'P' ; Sends debug-information to screen if debugmode active + goto diveloop ; Start Divemode + +simulator_save_tissue_data: + bsf restore_deco_data ; Set restore flag + ostc_debug 'S' ; Sends debug-information to screen if debugmode active + call main_push_tissues_to_vault + movlb 0x01 ; Back to RAM Bank1 + ostc_debug 'T' ; Sends debug-information to screen if debugmode active + return + +simulator_restore_tissue_data: + bcf restore_deco_data ; clear restore flag + ostc_debug 'S' ; Sends debug-information to screen if debugmode active + call main_pull_tissues_from_vault + movlb 0x01 ; Back to RAM Bank1 + ostc_debug 'T' ; Sends debug-information to screen if debugmode active + + ostc_debug 'G' ; Sends debug-information to screen if debugmode active + call deco_main_calc_desaturation_time ; calculate desaturation time + movlb b'00000001' ; select ram bank 1 + call calculate_noflytime ; Calc NoFly time + ostc_debug 'H' ; Sends debug-information to screen if debugmode active + return + +simulator_show_decoplan: + call PLED_ClearScreen + call divemenu_see_decoplan + + bcf switch_left + bcf switch_right + +simulator_show_decoplan2: + btfss onesecupdate + bra simulator_show_decoplan3 + + call timeout_surfmode + call set_dive_modes + call test_charger ; check if charger IC is active + call get_battery_voltage ; get battery voltage + + bcf onesecupdate ; End of one second tasks + +simulator_show_decoplan3: + btfsc switch_left + bra simulator_show_decoplan4 ; Quit display + + btfsc switch_right + bra simulator_show_decoplan4 ; Quit display + + btfsc sleepmode + goto more_menu + + btfsc divemode + goto restart ; exit menu, restart and enter divemode + + bra simulator_show_decoplan2 + +simulator_show_decoplan4: + movlw d'5' + movwf menupos + bra menu_simulator1 + + +simulator_calc_deco: + call diveloop_boot ; configure gases, etc. + + bsf simulatormode_active ; normal simulator mode + bsf standalone_simulator ; Standalone Simulator active + + + movff logbook_temp2,xA+0 + clrf xA+1 + movlw d'100' + movwf xB+0 + clrf xB+1 + call mult16x16 ;xA*xB=xC ; Depth in m*100 + + movlw LOW d'1000' + addwf xC+0,F + movlw HIGH d'1000' + addwfc xC+1,F ; Add 1000mBar + + movff xC+0,sim_pressure+0 + movff xC+1,sim_pressure+1 + + movff sim_pressure+0,amb_pressure+0 ; override readings with simulator values + movff sim_pressure+1,amb_pressure+1 + + call simulator_save_tissue_data ; Stores 32 floats "pre_tissue" into bank3 + + WIN_INVERT .1 + DISPLAYTEXT .12 ;" Wait.." + WIN_INVERT .0 + +simulator_calc_deco_loop1: + movlw d'30' + movwf logbook_temp3 ; 30x/Minute + call PLED_simulator_data + +; movlw .011 +; call PLED_SetColumn +; movlw .009 +; call PLED_SetRow +; lfsr FSR2,letter +; movff char_O_array_decodepth+0,lo ; Get Depth +; bsf leftbind +; output_8 +; bcf leftbind +; movlw ' ' +; movwf POSTINC2 +;call word_processor + + +simulator_calc_deco_loop2: + call toggle_LEDr + + call divemode_check_decogases ; Checks for decogases and sets the gases + call divemode_prepare_flags_for_deco + + call deco_main_calc_hauptroutine ; calc_tissue + movlb b'00000001' ; rambank 1 selected + ostc_debug 'C' ; Sends debug-information to screen if debugmode active + + decfsz logbook_temp3,F + bra simulator_calc_deco_loop2 + decfsz logbook_temp1,F + bra simulator_calc_deco_loop1 + + movff char_O_deco_status,deco_status ; + tstfsz deco_status ; deco_status=0 if decompression calculation done + bra simulator_calc_deco2 ; Not finished + +simulator_calc_deco3: + call set_LEDr + + call simulator_restore_tissue_data ; Restore 32 floats "pre_tissue" from bank3 + + bcf simulatormode_active ; normal simulator mode + bcf standalone_simulator ; Standalone Simulator active + + WAITMS d'250' + WAITMS d'250' + WAITMS d'250' ; Wait for Pressure Sensor to get real pressure again... + + call clear_LEDr + + movlw d'1' + movwf logbook_temp1 ; Bottom time>0! + + movlw d'5' ; Pre-Set Cursor to "Show Decoplan" + movwf menupos + bra menu_simulator1 ; Done. + +simulator_calc_deco2: + call divemode_check_decogases ; Checks for decogases and sets the gases + call divemode_prepare_flags_for_deco + + call deco_main_calc_hauptroutine ; calc_tissue + movlb b'00000001' ; rambank 1 selected + + movff char_O_deco_status,deco_status ; + tstfsz deco_status ; deco_status=0 if decompression calculation done + bra simulator_calc_deco2 ; Not finished + bra simulator_calc_deco3 ; finished! \ No newline at end of file