chiark / gitweb /
memory erase on master's startup
[trains.git] / detpic / program.asm
1 ;======================================================================
2 ; MAIN PROGRAM AND GLUE
3
4   include common.inc
5   code
6
7 ;======================================================================
8 ; COMMON TO MASTER AND SLAVE
9
10 ;----------------------------------------
11 vector_reset @
12
13  set_f qqTRISA
14  set_f qqTRISB
15  set_f qqTRISC
16  set_f qqTRISD
17  set_f qqTRISE
18  mov_lw 0xaa
19  mov_wf qqLATA
20  mov_wf qqLATB
21  mov_wf qqLATC
22  mov_wf qqLATD
23  mov_wf qqLATE
24
25         clr_f   INTCON
26         bs_f    RCON, IPEN      ; interrupt priorities
27
28         call    idlocs_init
29         clr_f   flags
30
31         bt_f_if0 idloc1,idloc1_master
32         call    slave_init
33
34         bt_f_if1 idloc1,idloc1_master
35         call    master_init
36
37         bs_f    INTCON, GIEH
38         bs_f    INTCON, GIEL
39
40         bt_f_if1 idloc1,idloc1_master
41         goto    backgroundloop_master
42         bt_f_if1 idloc1,idloc1_boarddet
43         goto    backgroundloop_detectors
44         goto    backgroundloop_reversers
45
46 ;----------
47 common_local_init
48 ; called by {master,slave}_init immediately after they've init'd i2c.
49         clr_f   PCLATU
50         call    bitnum2bit_init
51
52         call    points_local_init
53         call    polarity_local_init
54         call    detect_local_init
55         return
56
57 ;----------------------------------------
58 panic_kill_hook @
59         call    power_panichook
60         call    cdu_panichook
61         return
62
63 ;----------
64 intrl_handled_routine @
65         mov_ff  isr_low_save_stkptr, STKPTR
66         intrl_handled_core
67
68 ;======================================================================
69 ; MASTER
70
71 ;----------------------------------------
72 master_init
73 ; Master-specific initialisation.
74         call    memory_erase
75         call    serial_init
76         call    i2cm_init
77         call    serialtxbuf_init
78         call    polarity_master_init
79         call    points_master_init
80         call    common_local_init
81         call    nmra_init
82         call    serialtxfc_init
83         call    mascan_init
84         call    tick_init
85         call    cdu_init
86         call    power_polarising_init
87         call    power_fault_init
88         call    watchdog_init
89  clr_f xdebug+0
90         return
91
92 ;----------------------------------------
93 master_interrupt_low @
94         enter_interrupt_low
95         call    tick_intrl
96         call    nmra_serialrx_intrl
97         call    power_fault_intrl
98  mov_ff PIR1, xdebug+2
99  mov_ff PIE1, xdebug+3
100  mov_ff IPR1, xdebug+4
101  mov_ff INTCON, xdebug+5
102         call    serialtxfc_intrl
103         call    serialtx_intrl
104         call    points_local_intrl
105         call    i2cm_intrl
106  bs_f   xdebug+0, 5
107         panic   morse_IL
108
109 ;----------------------------------------------------------------------
110 serialrx_table_section  code    0x2000
111
112 ;--------------------
113 serialrx_generalmsg @
114 ;command_<something>  has same calling convention:
115 ;
116 ;  FSR0 ->      start of message                undefined
117 ;  *FSR0        message                         undefined
118 ;
119         mov_fw  INDF0
120         bra_n   serialrx_if_multibyte
121         bra_z   command_crashed
122
123         xor_lw  0x21
124         bra_z   command_power_on
125         xor_lw  0x01
126         bra_z   command_power_off
127         bra     serialrx_bad
128
129 ;-----
130 serialrx_if_multibyte
131         rr_fw   INDF0           ; W =   ii MM ww ww ww ww ii ii
132         and_lw  0x3c            ; W =   zz zz ww ww ww ww zz zz
133         bt_f_if0 PCL, 0 ; always true, but reads PCL
134         add_wff PCL
135         ; <--- here is zero
136
137         goto    serialrx_bad            ; 1 0000 xxx
138         goto    command_ping            ; 1 0001 xxx
139         goto    command_polarity        ; 1 0010 xxx
140         goto    serialrx_bad            ; 1 0011 xxx
141         goto    command_point           ; 1 0100 xxx
142         goto    serialrx_bad            ; 1 0101 xxx
143         goto    serialrx_bad            ; 1 0110 xxx
144         goto    serialrx_bad            ; 1 0111 xxx
145         goto    serialrx_bad            ; 1 1000 xxx
146         goto    serialrx_bad            ; 1 1001 xxx
147         goto    serialrx_bad            ; 1 1010 xxx
148         goto    serialrx_bad            ; 1 1011 xxx
149         goto    serialrx_bad            ; 1 1100 xxx
150         goto    serialrx_bad            ; 1 1101 xxx
151         goto    serialrx_bad            ; 1 1110 xxx
152         goto    serialrx_bad            ; 1 1111 xxx
153
154 ;-----
155 serialrx_bad
156         mov_ff  INDF0, t
157         panic   morse_HX
158
159 code2 code
160 ;--------------------
161 command_ping
162         mov_fw  POSTINC0
163         mov_ff  INDF0, t
164         call    serial_addbyte
165         mov_fw  t
166         bra_n   command_ping_bad
167         goto    serial_addbyte_another
168
169 command_ping_bad panic morse_HP
170
171 ;======================================================================
172 ; SLAVE
173
174 ;----------------------------------------
175 slave_init
176 ; Slave-specific initialisation.
177         mov_fw  picno
178         call    i2cs_init
179
180         bc_f    T0CON, TMR0ON
181
182         call    common_local_init
183         call    detect_slave_init
184         return
185
186 ;----------------------------------------
187 slave_interrupt_low @
188         enter_interrupt_low
189         call    points_local_intrl
190         panic   morse_IL
191
192 ;----------------------------------------
193 i2csu_write_begin
194         return
195
196 near_local_do code
197 ;----------------------------------------
198 i2csu_write_data
199         call    led_green
200
201         bt_w_if0 7
202         bra     i2csu_write_if_special
203         bt_w_if1 6
204         bra     polarity_local_do
205         bt_w_if0 5
206         bra     point_local_do
207 i2csu_write_if_bad
208         mov_wf  t
209         panic   morse_DX
210
211 i2csu_write_if_special
212         tst_w_ifnz
213         bra     i2csu_write_if_bad
214         goto    panic_crashread_commanded
215
216 code3 code
217 ;======================================================================
218 ; MASTER/SLAVE deviations
219
220 ;----------
221 message_for_master @
222 ; Either transmits the message to the master, or if we are the master,
223 ; handles it as an incoming message from the notional `slave 0'.
224 ;  W            message         unchanged
225 ;  GIEH         set             set
226         bt_f_if0 idloc1,idloc1_master
227         goto    slave_add_short_message
228         goto    loopback_read_byte
229
230 ;======================================================================
231   include final.inc