chiark / gitweb /
fix an out of range branch
[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
60 ;----------
61 intrl_handled_routine
62         mov_ff  isr_low_save_stkptr, STKPTR
63         intrl_handled_core
64
65 ;======================================================================
66 ; MASTER
67
68 ;----------------------------------------
69 master_init
70 ; Master-specific initialisation.
71         call    i2cm_init
72         call    serialtxbuf_init
73         call    polarity_master_init
74         call    points_master_init
75         call    common_local_init
76         call    serial_init
77         call    nmra_init
78         call    serialtxfc_init
79         call    mascan_init
80         call    tick_init
81         return
82
83 ;----------------------------------------
84 master_interrupt_low
85         enter_interrupt_low
86         call    tick_intrl
87         call    nmra_serialrx_intrl
88         call    serialtx_intrl
89         call    points_local_intrl
90         call    i2cm_intrl
91         panic   morse_IL
92
93 ;----------
94 near_interrupt_high code
95 master_interrupt_high_notnmra
96         panic   morse_IH
97
98 ;----------------------------------------------------------------------
99 serialrx_table_section  code    0x2000
100
101 ;--------------------
102 serialrx_generalmsg
103 ;command_<something>  has same calling convention:
104 ;
105 ;  FSR0 ->      start of message                undefined
106 ;  *FSR0        message                         undefined
107 ;
108 ;                               ; INDF0=MM ww ww ww ww ii ii ii
109         rlc_fw  INDF0           ; W =   ww ww ww ww ii ii ii ??  C=MM Z=00
110         bra_c   serialrx_if_multibyte
111         bra_z   command_crashed
112         ; single-byte non-0 command, has to be ON or OFF
113         ;       ie supposedly   ; INDF0=zz zz II zz zz zz zz PP  C=zz
114         rrc_fw  INDF0           ; W =   zz zz zz II zz zz zz zz  C=PP
115         xor_lw  0x10            ; W =   zz zz zz zz zz zz zz zz  C=PP Z=OK
116         bra_n   serialrx_bad
117         goto    command_power
118
119 ;-----
120 serialrx_if_multibyte
121         rr_fw   INDF0           ; W =   ii MM ww ww ww ww ii ii
122         and_lw  0x3c            ; W =   zz zz ww ww ww ww zz zz
123         bt_f_if0 PCL, 0 ; always true, but reads PCL
124         add_wff PCL
125         ; <--- here is zero
126
127         goto    serialrx_bad            ; 1 0000 xxx
128         goto    command_ping            ; 1 0001 xxx
129         goto    command_polarity        ; 1 0010 xxx
130         goto    serialrx_bad            ; 1 0011 xxx
131         goto    command_point           ; 1 0100 xxx
132         goto    serialrx_bad            ; 1 0101 xxx
133         goto    serialrx_bad            ; 1 0110 xxx
134         goto    serialrx_bad            ; 1 0111 xxx
135         goto    serialrx_bad            ; 1 1000 xxx
136         goto    serialrx_bad            ; 1 1001 xxx
137         goto    serialrx_bad            ; 1 1010 xxx
138         goto    serialrx_bad            ; 1 1011 xxx
139         goto    serialrx_bad            ; 1 1100 xxx
140         goto    serialrx_bad            ; 1 1101 xxx
141         goto    serialrx_bad            ; 1 1110 xxx
142         goto    serialrx_bad            ; 1 1111 xxx
143
144         goto    serialrx_bad    ; 0 0000 xxx
145         goto    serialrx_bad    ; 0 0001 xxx
146         goto    serialrx_bad    ; 0 0000 xxx
147
148 ;-----
149 serialrx_bad
150         mov_ff  INDF0, t
151         panic   morse_HX
152
153 ;--------------------
154 command_ping
155         mov_fw  POSTINC0
156         mov_ff  INDF0, t
157         call    serial_addbyte
158         mov_fw  t
159         bra_n   command_ping_bad
160         goto    serial_addbyte_another
161
162 command_ping_bad panic morse_HP
163
164 ;--------------------
165 command_crashed
166         panic   morse_UC
167
168 ;======================================================================
169 ; SLAVE
170
171 ;----------------------------------------
172 slave_init
173 ; Slave-specific initialisation.
174         mov_fw  picno
175         call    i2cs_init
176
177         bc_f    T0CON, TMR0ON
178
179         call    common_local_init
180         call    detect_slave_init
181         return
182
183 ;----------------------------------------
184 slave_interrupt_low
185         enter_interrupt_low
186         call    points_local_intrl
187         panic   morse_IL
188
189 ;----------------------------------------
190 i2csu_write_begin
191         return
192
193 near_local_do code
194 ;----------------------------------------
195 i2csu_write_data
196         call    led_green
197
198         bt_w_if0 7
199         bra     i2csu_write_if_special
200         bt_w_if1 6
201         bra     polarity_local_do
202         bt_w_if0 5
203         bra     point_local_do
204 i2csu_write_if_bad
205         mov_wf  t
206         panic   morse_DX
207
208 i2csu_write_if_special
209         tst_w_ifnz
210         bra     i2csu_write_if_bad
211         goto    panic_crashread_commanded
212
213 code2 code
214 ;======================================================================
215 ; MASTER/SLAVE deviations
216
217 ;----------
218 message_for_master
219 ; Either transmits the message to the master, or if we are the master,
220 ; handles it as an incoming message from the notional `slave 0'.
221 ;  W            message         unchanged
222 ;  GIEH         set             set
223         bt_f_if0 idloc1,idloc1_master
224         goto    slave_add_short_message
225         goto    loopback_read_byte
226
227 ;======================================================================
228  include final.inc