Mercurial > public > mk2
diff code_part1/OSTC_code_asm_part1/interface.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/interface.asm Tue Jan 12 15:05:59 2010 +0100 @@ -0,0 +1,240 @@ + +; 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/>. + + +; Interface, Downloader, MD2 Hash send routine +; written by: Matthias Heinrichs, info@heinrichsweikamp.com +; written: 10/30/05 +; last updated: 12/27/07 +; known bugs: +; ToDo: + +uart_store_tissues: + bcf uart_store_tissue_data ; Clear flag + bcf PIE1,RCIE ; No Interrupt for UART + call set_LEDusb + call simulator_save_tissue_data ; store and set flag for automatic restore + movlw 'k' ; send echo + movwf TXREG ; When done + call rs232_wait_tx ; wait for UART + call clear_LEDusb + bsf PIE1,RCIE ; Interrupt for RS232 + goto surfloop_loop ; return to surface loop + +; reset Decodata +reset_decodata: + bcf uart_reset_decodata ; clear flag + bcf PIE1,RCIE ; No Interrupt for UART + call set_LEDusb + + call deco_main_clear_tissue ; Reset Decodata + movlb b'00000001' ; select ram bank 1 + call deco_main_calc_desaturation_time ; calculate desaturation time + movlb b'00000001' ; select ram bank 1 + call main_clear_CNS_fraction ; clear CNS + movlb b'00000001' ; select ram bank 1 + + movlw d'1' + movwf nofly_time+0 ; Clear nofly time + clrf nofly_time+1 ; Clear nofly time + + movlw 'h' ; send echo + movwf TXREG ; When done + call rs232_wait_tx ; wait for UART + + bsf oneminupdate ; set flag, so display will be updated at once + call clear_LEDusb + bsf PIE1,RCIE ; Interrupt for RS232 + goto surfloop_loop ; return to surface loop + +; send internal EEPROM BANK 0 via the UART +send_int_eeprom_b0: + bcf uart_send_int_eeprom ; clear flag + bcf PIE1,RCIE ; No Interrupt for UART + call set_LEDusb + + clrf EEADRH ; Point to Bank0 + rcall send_internal_eeprom1 ; sends complete 1st. page of internal EEPROM + + call clear_LEDusb + bsf PIE1,RCIE ; Interrupt for RS232 + goto surfloop_loop ; return to surface loop + +; send internal EEPROM BANK 1 via the UART +send_int_eeprom_b1: + bcf uart_send_int_eeprom2 ; clear flag + bcf PIE1,RCIE ; No Interrupt for UART + call set_LEDusb + + movlw d'1' + movwf EEADRH ; Point to Bank1 + rcall send_internal_eeprom1 ; sends complete 2nd page of internal EEPROM + clrf EEADRH ; Point to Bank0 + + call clear_LEDusb + bsf PIE1,RCIE ; Interrupt for RS232 + goto surfloop_loop ; return to surface loop + + +; Send firmware version and 16bytes MD2 hash via the UART +send_md2_hash: + bcf uart_send_hash ; clear flag + bcf PIE1,RCIE ; No Interrupt for UART + call set_LEDusb + + call rs232_wait_tx ; wait for UART + movlw softwareversion_x ; Softwareversion + movwf TXREG + call rs232_wait_tx ; wait for UART + movlw softwareversion_y ; Softwareversion + movwf TXREG + + lfsr FSR2, char_O_hash + movlw d'16' + movwf temp1 +send_md2_hash2: + call rs232_wait_tx ; wait for UART + movff POSTINC2,TXREG ; copy hash byte to TXREG + decfsz temp1,F + bra send_md2_hash2 ; loop 16 times + + call clear_LEDusb + bsf PIE1,RCIE ; Interrupt for RS232 + goto surfloop_loop ; return to surface loop + + +; Sends first 256Byte from internal and first 32KB from external EEPROM using the UART module +menu_interface: + bcf dump_external_eeprom ; clear flag + bcf PIE1,RCIE ; No Interrupt for UART + call set_LEDusb + call PLED_ClearScreen + call PLED_topline_box + WIN_INVERT .1 ; Init new Wordprocessor + DISPLAYTEXT .15 ; "Interface" + WIN_INVERT .0 ; Init new Wordprocessor + + movlw d'5' + movwf uart1_temp +menu_interface1: + movlw 0xAA ; Startbytes + movwf TXREG + call rs232_wait_tx ; wait for UART + decfsz uart1_temp + bra menu_interface1 + movlw 0x55 ; finish preamble + movwf TXREG + + DISPLAYTEXT .16 ; "Start" + + call get_free_EEPROM_location ; + movlw d'1' ; increase + addwf eeprom_address+0,F + movlw d'0' + addwfc eeprom_address+1,F + + DISPLAYTEXT .17 ; "Data" + + rcall send_internal_eeprom1 ; sends complete 1st. page of internal EEPROM + + call rs232_wait_tx ; wait for UART + movff batt_voltage+0,TXREG ; Battery + + call rs232_wait_tx ; wait for UART + movff batt_voltage+1,TXREG ; Battery + + call rs232_wait_tx ; wait for UART + movlw softwareversion_x ; Softwareversion + movwf TXREG + + call rs232_wait_tx ; wait for UART + movlw softwareversion_y ; Softwareversion + movwf TXREG + + DISPLAYTEXT .18 ; "Header" + + clrf uart1_temp ; low address counter + clrf uart2_temp ; high address counter + +menu_interface3: + bsf SSPCON2,SEN ; Start condition + call WaitMSSP + + movlw b'10100110' ; Bit0=0: WRITE, Bit0=1: READ + movwf SSPBUF ; control byte + call WaitMSSP + btfsc SSPCON2,ACKSTAT + bra menu_interface3 ; No Ack, try again! + + movff eeprom_address+1,SSPBUF ; High Address byte + call WaitMSSP + call I2C_WaitforACK + movff eeprom_address+0,SSPBUF ; Low Address byte + call WaitMSSP + call I2C_WaitforACK + bsf SSPCON2,RSEN ; Start condition + call WaitMSSP + + movlw b'10100111' ; Bit0=0: WRITE, Bit0=1: READ + movwf SSPBUF ; control byte + call WaitMSSP + call I2C_WaitforACK + + DISPLAYTEXT .19 ; "Profile" + +menu_interface2: + call rs232_wait_tx ; wait for UART + + bsf SSPCON2, RCEN ; Enable recieve mode + call WaitMSSP + + movff SSPBUF, TXREG + + movlw d'1' + addwf uart1_temp,F + movlw d'0' + addwfc uart2_temp,F + + btfsc uart2_temp,7 ; 32KB done? + bra menu_interface4 ; Yes + + bsf SSPCON2, ACKEN ; Ack + call WaitMSSP + bra menu_interface2 ; go on + +menu_interface4: + bsf SSPCON2, PEN ; Stop + call WaitMSSP + + DISPLAYTEXT .20 ; Done. + + WAITMS d'250' + call clear_LEDusb + bsf PIE1,RCIE ; Interrupt for RS232 + goto surfloop ; back to surfacemode + +send_internal_eeprom1: + clrf uart1_temp ; Send the total of 256bytes + clrf EEADR ; Send bytes 0-255 from internal EEPROM +send_internal_eeprom2: + call read_eeprom ; read byte + movff EEDATA,TXREG ; send byte + incf EEADR,F ; increase pointer + call rs232_wait_tx ; wait for UART + decfsz uart1_temp,F ; until limit reached + bra send_internal_eeprom2 + return \ No newline at end of file