1 ;======================================================================
2 ; MAIN PROGRAM AND GLUE
7 ;======================================================================
8 ; COMMON TO MASTER AND SLAVE
10 ;----------------------------------------
26 bs_f RCON, IPEN ; interrupt priorities
31 bt_f_if0 idloc1,idloc1_master
34 bt_f_if1 idloc1,idloc1_master
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
49 ; called by {master,slave}_init immediately after they've init'd i2c.
53 call points_local_init
54 call polarity_local_init
55 call detect_local_init
58 ;----------------------------------------
66 mov_ff isr_low_save_stkptr, STKPTR
69 ;======================================================================
72 ;----------------------------------------
74 ; Master-specific initialisation.
78 call polarity_master_init
79 call points_master_init
80 call common_local_init
85 call power_polarising_init
89 ;----------------------------------------
93 call nmra_serialrx_intrl
94 call power_fault_intrl
96 call points_local_intrl
100 ;----------------------------------------------------------------------
101 serialrx_table_section code 0x2000
103 ;--------------------
105 ;command_<something> has same calling convention:
107 ; FSR0 -> start of message undefined
108 ; *FSR0 message undefined
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
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
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
146 goto serialrx_bad ; 0 0000 xxx
147 goto serialrx_bad ; 0 0001 xxx
148 goto serialrx_bad ; 0 0000 xxx
155 ;--------------------
161 bra_n command_ping_bad
162 goto serial_addbyte_another
164 command_ping_bad panic morse_HP
167 ;======================================================================
170 ;----------------------------------------
172 ; Slave-specific initialisation.
178 call common_local_init
179 call detect_slave_init
182 ;----------------------------------------
185 call points_local_intrl
188 ;----------------------------------------
193 ;----------------------------------------
198 bra i2csu_write_if_special
200 bra polarity_local_do
207 i2csu_write_if_special
209 bra i2csu_write_if_bad
210 goto panic_crashread_commanded
213 ;======================================================================
214 ; MASTER/SLAVE deviations
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
222 bt_f_if0 idloc1,idloc1_master
223 goto slave_add_short_message
224 goto loopback_read_byte
226 ;======================================================================