diff src/start.asm @ 0:11d4fc797f74

init
author heinrichsweikamp
date Wed, 24 Apr 2013 19:22:45 +0200
parents
children 55dfc8f6093f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/start.asm	Wed Apr 24 19:22:45 2013 +0200
@@ -0,0 +1,283 @@
+;=============================================================================
+;
+;   File start.asm
+;
+;   Startup subroutines
+;
+;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
+;=============================================================================
+; HISTORY
+;  2011-08-06 : [mH] moving from OSTC code
+
+#include    "ostc3.inc"                  ; Mandatory header
+#include	"ms5541.inc"
+#include	"isr.inc"
+#include 	"shared_definitions.h"      ; Mailbox from/to p2_deco.c
+#include	"eeprom_rs232.inc"
+#include	"math.inc"
+#include	"tft.inc"
+#include	"surfmode.inc"
+#include	"wait.inc"
+#include	"rtc.inc"
+#include 	"external_flash.inc"
+#include	"convert.inc"
+#include	"strings.inc"
+#include	"tft_outputs.inc"
+
+        extern  init_ostc3
+        extern  option_restore_all
+
+;=============================================================================
+; Reset vector: What to do on device wake-up and hard reset.
+;
+reset_v code     0x00000
+;    goto    start
+	goto	0x1FF00     ; Bootloader
+
+	ORG     0x00004			; Needed for second-level bootloader
+	goto	start
+;=============================================================================
+boot   CODE
+	global start
+
+start:
+	lfsr	FSR0,0x000				; Clear rambank 0-14
+clear_rambank:
+	clrf	POSTINC0
+	movlw	0x0F
+	cpfseq	FSR0H					; Bank 14 done?
+	bra		clear_rambank			; clear...
+
+    call    init_ostc3
+  	call    speed_normal
+
+	bsf		no_sensor_int			; disable sensor interrupt
+
+	call	disable_rs232			; disable UART module
+; Air pressure compensation	after reset
+	call	get_calibration_data	; Get calibration data from pressure sensor
+	banksel common                  ; get_calibration_data uses isr_backup
+	bcf		no_sensor_int		    ; normal sensor interrupt mode
+
+	bcf		pressure_refresh
+; First pass will not have valid temperature!
+	btfss	pressure_refresh 		; Air pressure compensation
+	bra		$-2
+; Second pass
+	bcf		pressure_refresh
+	btfss	pressure_refresh 		; Air pressure compensation
+	bra		$-2
+
+	clrf	rel_pressure+0
+	clrf	rel_pressure+1
+	clrf	surface_interval+0
+	clrf	surface_interval+1
+
+    SAFE_2BYTE_COPY amb_pressure, last_surfpressure
+
+	movlw	LOW		max_surfpressure
+	movff	WREG,sub_a+0				; max. "allowed" airpressure in mbar
+	movlw	HIGH	max_surfpressure
+	movff	WREG,sub_a+1				; max. "allowed" airpressure in mbar
+	movff	last_surfpressure+0,sub_b+0
+	movff	last_surfpressure+1,sub_b+1
+	call	subU16					; sub_c = sub_a - sub_b
+	btfss	neg_flag                ; Is 1080mbar < amb_pressure ?
+	bra		start_copy_pressure		; NO: current airpressure is lower then "allowed" airpressure, ok!
+
+    ; not ok! Overwrite with max. "allowed" airpressure
+	movlw	LOW		max_surfpressure
+	movff	WREG,last_surfpressure+0	; max. "allowed" airpressure in mbar
+	movlw	HIGH	max_surfpressure
+	movff	WREG,last_surfpressure+1	; max. "allowed" airpressure in mbar
+
+start_copy_pressure:
+	movff	last_surfpressure+0,last_surfpressure_15min+0
+	movff	last_surfpressure+1,last_surfpressure_15min+1
+	movff	last_surfpressure+0,last_surfpressure_30min+0
+	movff	last_surfpressure+1,last_surfpressure_30min+1	; Rests all airpressure registers
+
+; reset deco data for surface mode
+	movlw	d'79'
+	movff	WREG,char_I_N2_ratio            ; 79% N2
+    SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy for deco routine
+	movff	int_I_pres_respiration+0,int_I_pres_surface+0     ; copy for desat routine
+	movff	int_I_pres_respiration+1,int_I_pres_surface+1		
+
+	extern	deco_reset
+	call	deco_reset
+	call	deco_calc_desaturation_time     ; calculate desaturation time
+	banksel common
+	call	deco_calc_wo_deco_step_1_min	; calculate deco in surface mode 
+	banksel common
+  	clrf	nofly_time+0	              	; Reset NoFly
+  	clrf	nofly_time+1
+	clrf	desaturation_time+0				; Reset Desat
+	clrf	desaturation_time+1
+	bcf		menubit							; clear menu flag
+; Check for Power-on reset here
+	extern	new_battery_menu	
+	extern	use_old_batteries
+
+	btfsc	RCON,POR						; Was this a power-on reset?
+    goto	use_old_batteries				; No, load last stored battery values
+	; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return"
+
+    ; Yes
+	call	rtc_init						; init clock
+ 	goto	new_battery_menu				; show "New battery dialog"
+	; "new_battery_menu" and "use_old_batteries" 'goto' back to "power_on_return"
+
+	global	power_on_return
+power_on_return:
+	bsf		RCON,POR						; Set bit for next detection
+
+; check firmware and reset Custom Functions after an update
+	movlw	d'1'
+	movwf	EEADR
+	movlw	d'1'
+	movwf	EEADRH
+	call	read_eeprom				; read current version x
+	movff	EEDATA,temp1
+	incf	EEADR,F					; set to 0x102
+	call	read_eeprom				; read current version y
+	movff	EEDATA,temp2
+	clrf	EEADRH					; Reset EEADRH
+
+	movlw	softwareversion_x
+	cpfseq	temp1					; compare version x
+	bra		check_firmware_new		; is not equal -> reset CF and store new version in EEPROM
+
+	movlw	softwareversion_y
+	cpfseq	temp2					; compare version y
+	bra		check_firmware_new		; is not equal -> reset CF and store new version in EEPROM
+	bra		restart					; x and y are equal -> do not reset cf
+		
+check_firmware_new:
+    call	speed_normal
+	call	TFT_boot                ; Initialize TFT (includes clear screen)
+	clrf    CCPR1L          		; Backlight off
+    WIN_TOP     .50
+    WIN_LEFT    .10
+    movlw   LOW     0x1E000
+    movwf   TBLPTRL
+    movlw   HIGH    0x1E000
+    movwf   TBLPTRH
+    movlw   UPPER   0x1E000
+    movwf   TBLPTRU
+    extern  color_image
+    call    color_image             ; Show logo
+	call	TFT_standard_color
+	WIN_SMALL   .10,.100
+	STRCPY_TEXT_PRINT	tNewFirmware1	; "Update sucessfull!"
+	WIN_SMALL   .10,.140
+	STRCPY_TEXT	tNewFirmware2			; "New Firmware: "
+	movlw	softwareversion_x
+	movwf	lo
+	bsf		leftbind
+	output_8
+	PUTC	"."
+	movlw	softwareversion_y
+	movwf	lo
+	output_8
+	bcf		leftbind
+	STRCAT_PRINT	""					; Print second row
+    call    TFT_Display_FadeIn          ; Display resulting surface screen.
+
+; place "after-update reset" here...
+	movlw	d'1'					; store current version in EEPROM
+	movwf	EEADR
+	movlw	d'1'
+	movwf	EEADRH
+	movlw	softwareversion_x
+	movwf	EEDATA		
+	call	write_eeprom			; write version x
+	incf	EEADR,F					; set to 0x102
+	movlw	softwareversion_y
+	movwf	EEDATA		
+	call	write_eeprom			; write version y
+	clrf	EEADRH					; Reset EEADRH
+
+	movlw	.7
+	movwf	lo
+check_firmware_new2:
+	; Wait 1 second
+	bcf		onesecupdate
+	btfss	onesecupdate
+	bra		$-2
+	decfsz	lo,F					; Wait 10 seconds...
+	bra		check_firmware_new2
+
+	global	restart	
+restart:
+    clrf    STKPTR                  ; Never return from here
+	extern	option_save_all
+	btfsc	menubit					; Return from Menu/COMM mode or timeout?
+	call	option_save_all			; Yes, save all settings into EEPROM
+
+	clrf	flag1					; clear all flags
+	clrf	flag2
+	clrf	flag3
+	clrf	flag4
+	clrf	flag5
+	clrf	flag6
+    clrf	flag7
+    clrf	flag8
+	bsf		tft_is_dimming	; TFT is dimming up (soon), ignore ambient sensor!
+	; Select high altitude (Fly) mode?
+	movff	last_surfpressure_30min+0,sub_b+0
+	movff	last_surfpressure_30min+1,sub_b+1
+	movlw	HIGH	high_altitude_threshold
+	movwf	sub_a+1
+	movlw	LOW		high_altitude_threshold	; Hard-wired 880mbar
+	movwf	sub_a+0
+	call	subU16					; sub_c = sub_a - sub_b
+	btfss	neg_flag				; Result negative (Ambient>880mbar)?
+	bsf		high_altitude_mode		; No, Set Flag!
+
+	call	ext_flash_disable_protection	; Disable write protection for external flash
+
+	extern  testloop
+;    goto    testloop
+
+	goto	surfloop				; Jump to Surfaceloop!
+
+;=============================================================================
+; Setup all flags and parameters for divemode and simulator computations.
+;
+	global	restart_set_modes_and_flags
+restart_set_modes_and_flags:		    ; "Call"ed from divemode, as well!
+    call    option_restore_all      	; Restore everything from EEPROM
+    movff   opt_dive_mode,lo            ; 0=OC, 1=CC, 2=Gauge, 3=Apnea
+
+	bcf		FLAG_apnoe_mode
+    bcf     FLAG_ccr_mode             ; =1: CCR mode (Fixed ppO2 or Sensor) active
+    bcf     FLAG_gauge_mode           ; =1: In Gauge mode
+    call    disable_ir                ; IR off
+
+    tstfsz  lo
+    bra     restart_set_modes_and_flags2
+    ; OC Mode
+    return
+
+restart_set_modes_and_flags2:
+    decfsz  lo,F
+    bra     restart_set_modes_and_flags3
+    ; CC Mode
+	bsf     FLAG_ccr_mode               ; =1: CCR mode (Fixed ppO2 or Sensor) active
+    call    enable_ir                   ; Enable IR-Port
+    return
+
+restart_set_modes_and_flags3:
+    decfsz  lo,F
+    bra     restart_set_modes_and_flags4
+    ; Gauge Mode
+    bsf     FLAG_gauge_mode           ; =1: In Gauge mode
+    return
+
+restart_set_modes_and_flags4:
+    ; Apnea Mode
+	bsf		FLAG_apnoe_mode
+    return							    ; start in Surfacemode
+
+	END
\ No newline at end of file