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