1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
;;
;; spreadspace pic utils
;;
;;
;; Copyright (C) 2011 Christian Pointner <equinox@spreadspace.org>
;;
;; This file is part of spreadspace pic utils.
;;
;; spreadspace pic utils 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
;; any later version.
;;
;; spreadspace pic utils 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 spreadspace pic utils. If not, see <http://www.gnu.org/licenses/>.
;;
;; flash read --------
cmd_reset
movlw E_OK
call ack_cmd
movlb .3
cmd_resset_wait_ack
btfss TXSTA,TRMT
goto cmd_resset_wait_ack
reset
;; flash read --------
cmd_r_flash
;; movlw FSS ; initialize EEADR:EEADRH and FSR
;; movwf cnt
;; movlw b'01011000'
;; movwf STATUS
;; movlw combuff + .2
;; movwf FSR
;; movf INDF,w
;; movwf EEADR
;; incf FSR,f
;; movf INDF,w
;; movwf EEADRH
;; read_flash_segment_loop
;; bsf STATUS,RP0 ; perform the actual read
;; bsf EECON1,EEPGD
;; bsf EECON1,RD
;; nop
;; nop
;; bcf STATUS,RP0
;; movf EEDAT,w ; load code word from EEDAT:EEDATH to combuff
;; movwf INDF
;; incf FSR,f
;; movf EEDATH,w
;; movwf INDF
;; incf FSR,f
;; incfsz EEADR,f ; increment flash address
;; goto read_flash_segment_next
;; incf EEADRH,f
g;; read_flash_segment_next
;; decfsz cnt,f
;; goto read_flash_segment_loop
;; bcf STATUS,RP1
;; clrf combuff + .2 ; = E_OK
;; movlw .1 + .2*FSS ; bytes to send
;; call send_answer
movlw E_NOT_IMPL
call ack_cmd
goto wait_new_cmd
;; flash write --------
cmd_w_flash
;; movf combuff + .3,f ; if addr[15:8] == 0 -> boot loader section
;; btfsc STATUS,Z
;; goto address_prohibited
;; movlw FLASH_BOUNDARY ; addr on boundary?
;; andwf combuff + .2,w
;; btfss STATUS,Z
;; goto address_invalid
;; movlw FSS ; initialize EEADR:EEADRH and FSR
;; movwf cnt
;; movlw b'01011000'
;; movwf STATUS
;; movlw combuff + .2
;; movwf FSR
;; movf INDF,w
;; movwf EEADR
;; incf FSR,f
;; movf INDF,w
;; movwf EEADRH
;; write_flash_segment_loop
;; incf FSR,f ; load code word into EEDAT:EEDATH
;; movf INDF,w
;; movwf EEDAT
;; incf FSR,f
;; movf INDF,w
;; movwf EEDATH
;; bsf STATUS,RP0 ; now start the acutal write sequence
;; bsf EECON1,EEPGD
;; bsf EECON1,WREN
;; movlw H'55'
;; movwf EECON2
;; movlw H'AA'
;; movwf EECON2
;; bsf EECON1,WR
;; nop
;; nop
;; bcf EECON1,WREN
;; bcf STATUS,RP0
;; incfsz EEADR,f ; increment flash address
;; goto write_flash_segment_next
;; incf EEADRH,f
;; write_flash_segment_next
;; decfsz cnt,f
;; goto write_flash_segment_loop
;; bsf STATUS,RP0
;; clrw ; check if a write error occured
;; btfsc EECON1,WRERR
;; movlw E_FLASH_WERR
;; bcf STATUS,RP1
;; bcf STATUS,RP0
;; movwf combuff + .2 ; = E_OK
;; movlw .1 ; bytes to send
;; call send_answer
movlw E_NOT_IMPL
call ack_cmd
goto wait_new_cmd
|