1 ;======================================================================
6 ;----------------------------------------
7 ; LOCAL REVERSERS - Variables
13 ;----------------------------------------
14 ; MASTER - Access bank variables and other sections
16 polarity_cmds equ 0x5f
17 polarity_cmds_section udata polarity_cmds
20 ; 11RRRRRR reverse command for slave, waiting to write
21 ; 00000001 this is not a reversers board
22 ; 00000000 we have written any relevant command
25 ;======================================================================
27 ; on slave, or master's own
32 ; On slave, called during i2c receive, ie High ISR
33 ; On master, called during serial receive, ie Low ISR
36 ; W here polarity msg (see below) undefined
37 ; STATUS any undefined
38 ; t_dolocal any undefined
39 ; maska,maske set up correctly preserved
40 ; LATA,LATE any modified appropriately
41 ; all others any preserved
43 ; on entry: ; W = PP PP v3 v0 v2 v1 v5 v4
45 ; where PP bits are those specifying that this is a polarity message
46 ; v<num> is the reversal bits for point <num>
48 mov_wf t_dolocal ; t = PP PP v3 v0 v2 v1 v5 v4
50 mov_fw LATE ; W = kk kk kk kk kk kk o5 o4
51 xor_wfw t_dolocal ; W = ?? ?? ?? ?? ?? ?? d5 d4
52 and_wfw maske ; W = zz zz zz zz zz zz d5 d4
53 xor_wff LATE ; LATE = kk kk kk kk kk kk v5 v4
55 bc_f t_dolocal, 1 ; t = SS SS v3 v0 v2 v1 zz v4
56 bt_f_if1 t_dolocal, 4 ; t : .. .. .. v0 .. .. .. ..
57 bs_f t_dolocal, 1 ; t = SS SS v3 v0 v2 v1 v0 v4
59 mov_fw LATA ; W = kk kk o3 kk o2 o1 o0 kk
60 xor_wfw t_dolocal ; W = ?? ?? d3 ?? d2 d1 d0 ??
61 and_wfw maska ; W = zz zz d3 zz d2 d1 d0 zz
62 xor_wff LATA ; LATA = kk kk v3 kk v2 v1 v0 kk
64 ; where kk is a bit we must keep
65 ; o<n> is old reverse bit
67 ; v<n> is new reverse bit
73 load_perpic_tblptr picno2revmasks, 2
84 call polarity_local_do
94 ;======================================================================
100 ; SS zz zz SS ZZ 2f 2e 2d g is board 2
101 ; MM 2c 0f 0e 0d 0c 0b 0a board 0
102 ; MM 2b 1f 1e 1d 1c 1b 1a board 1
103 ; MM 2a 3f 3e 3d 3c 3b 3a g, board 2, complete, also 3
104 ; MM 9f 4f 4e 4d 4c 4b 4a g is board 9
105 ; MM 9e 5f 5e 5d 5c 5b 5a
106 ; MM 9d 6f 6e 6d 6c 6b 6a
107 ; MM 9c 7f 7e 7d 7c 7b 7a
108 ; MM 9b 8f 8e 8d 8c 8b 8a
109 ; MM 9a af ae ad ac ab aa
114 ; other things are <board><segment> where <segment>
115 ; is a for LSb in message to PIC, b for next bit,
116 ; and so on until f for bit 5. (See polarity_do_here, below.)
118 ; we accumulate (`gather') the `g' bits in t.
119 mov_lfsr polarity_cmds, 1
120 mov_fw POSTINC0 ; W = 10010RRR
121 mov_wf t ; t = 10010ggg
122 xor_lw b'10001000' ; t = 00011ggg
123 loop ; Exit from this loop is done by board popping, doing some
124 ; final stuff, and returning. See board_next_none, below.
125 rrc_fw INDF0 ; W = ?Mhhhhhh C = g
126 rlc_f t ; t = 0*11g+ C = ?
127 bra_nn if_not_gathered
131 mov_lw b'000000011' ; W = 00000011
132 mov_wf t ; t = 00000011
133 if_not_gathered ; *INDF0 = Mhhhhhhg
134 rr_fw INDF0 ; W = gMhhhhhh
135 ior_lw b'011000000' ; W = 11hhhhhh
137 bt_f_if1 POSTINC0,7 ; *POSTINC0 : M.......
144 mov_wf INDF1 ; *(this pic) = 11RRRRRR
145 ; FSR1 -> pic we've just filled
148 dec_fw PREINC1 ; FSR1 -> pic after one we're testing
149 ; W = 1??????? existing reverse command
150 ; 00000000 not a reversers pic
151 ; 11111111 no existing command
153 bra_z board_next_loop ; not a reversers pic
154 bra_nn board_next_none ; sentinel
159 bt_f_if1 INDF0,7 ; *INDFO : M.......
160 bra board_next_none_more_message
162 ; now we're exiting from the loop in when_reverse_message_found
163 pop ; that disposes of the call to `board'
165 call power_polarising_begin
167 mov_fw polarity_cmds ; there's always a board 0, us
168 call polarity_local_do
169 rcall polarity_needwrite ; does `return' because it will find one
170 return ; ... or maybe not if only 1 rev board
173 board_next_none_more_message
176 ;----------------------------------------------------------------------
179 load_tblptr picno2revmasks
180 mov_lfsr polarity_cmds - 1, 0
183 mov_lw 0x01 ; meaning `not a reversers board'
184 polarity_master_init_boardloop
186 rcall polarity_master_init_board_mask_check
187 rcall polarity_master_init_board_mask_check
189 bra polarity_master_init_boardloop
191 bt_f_if1 polarity_cmds, 0
192 bra polarity_bad_masternotused
194 ; OK, but now we have to work our way back and place
196 mov_lw 0x40 ; meaning `sentinel'
198 bra polarity_bad_lastpicused
199 polarity_master_init_truncateloop
200 mov_wf POSTDEC0 ; overwrite with sentinel
201 tst_f_ifnz INDF0 ; previous one is also `not reversers board' ?
202 bra polarity_master_init_truncateloop ; yes
203 ; no. hah, we have truncated it.
207 polarity_master_init_board_mask_check
210 ; INDF0 maybe set to `reversers board but no command'
211 ; TBLPTR* used and advanced
214 ; everything else preserved
217 clr_f INDF0 ; meaning `reversers board but no command to send'
220 polarity_bad_masternotused panic morse_RF
221 polarity_bad_lastpicused panic morse_RG
223 ;----------------------------------------------------------------------
225 ; needwrite_<something> will see if we need to talk to a slave
226 ; if not it will simply return
227 ; if we _do_, it will put the slave no. in W, and then pop
228 ; and branch to i2c_needwrite. See mascan.asm.
229 ; nb register usage may need to be adjusted for wiring into mascan i2cm_...
230 mov_lfsr polarity_cmds, 0
231 polarity_needwrite_loop
232 rlc_fw PREINC1 ; W = 1RRRRRR? C=1 reverse command
233 ; W = 0000001? C=0 not a reversers pic
234 ; W = 0000000? C=0 no existing command
235 ; W = 1000000? C=0 sentinel
236 bra_nn polarity_needwrite_loop
238 bra polarity_needwrite_found
239 ; we found the sentinel:
241 bt_f_if0 flags, flags_polarising
243 goto power_polarising_settling
245 polarity_needwrite_found
247 add_lw -polarity_cmds
251 near_getwritebyteyes code
252 ;----------------------------------------------------------------------
253 polarity_getwritebyte
254 ; getwritebyte_<something> finds a byte to write to a particular
255 ; slave. If we have something to write, puts the byte in W
256 ; and does `goto getwritebyte_yes'. Otherwise simply returns.
258 ; on entry return, `no' branch-away, `yes'
259 ; cwslave slave number preserved preserved
260 ; W undefined trashed byte for slave
262 mov_lfsr polarity_cmds, 0
266 bra_n i2c_getwritebyte_yes
270 ;======================================================================