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