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 0f 0e 0d 0c 0b 0a 2c board 0
102 ; MM 1f 1e 1d 1c 1b 1a 2b board 1
103 ; MM 3f 3e 3d 3c 3b 3a 2a g, board 2, complete, also 3
104 ; MM 4f 4e 4d 4c 4b 4a 9f g is board 9
105 ; MM 5f 5e 5d 5c 5b 5a 9e
106 ; MM 6f 6e 6d 6c 6b 6a 9d
107 ; MM 7f 7e 7d 7c 7b 7a 9c
108 ; MM 8f 8e 8d 8c 8b 8a 9b
109 ; MM af ae ad ac ab aa 9a
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 clr_f polarity_cmds ; we've done ours (this is for form's sake)
170 rcall polarity_needwrite ; does `return' because it will find one
171 return ; ... or maybe not if only 1 rev board
172 ; so do not optimise away rcall/return combination !
175 board_next_none_more_message
178 ;----------------------------------------------------------------------
179 polarity_master_init @
181 load_tblptr picno2revmasks
182 mov_lfsr polarity_cmds - 1, 0
185 mov_lw 0x01 ; meaning `not a reversers board'
186 polarity_master_init_boardloop
188 rcall polarity_master_init_board_mask_check
189 rcall polarity_master_init_board_mask_check
191 bra polarity_master_init_boardloop
193 bt_f_if1 polarity_cmds, 0
194 bra polarity_bad_masternotused
196 ; OK, but now we have to work our way back and place
198 mov_lw 0x40 ; meaning `sentinel'
200 bra polarity_bad_lastpicused
201 polarity_master_init_truncateloop
202 mov_wf POSTDEC0 ; overwrite with sentinel
203 tst_f_ifnz INDF0 ; previous one is also `not reversers board' ?
204 bra polarity_master_init_truncateloop ; yes
205 ; no. hah, we have truncated it.
209 polarity_master_init_board_mask_check
212 ; INDF0 maybe set to `reversers board but no command'
213 ; TBLPTR* used and advanced
216 ; everything else preserved
219 clr_f INDF0 ; meaning `reversers board but no command to send'
222 polarity_bad_masternotused panic morse_RF
223 polarity_bad_lastpicused panic morse_RG
225 ;----------------------------------------------------------------------
227 ; needwrite_<something> will see if we need to talk to a slave
228 ; if not it will simply return
229 ; if we _do_, it will put the slave no. in W, and then pop
230 ; and branch to i2c_needwrite. See mascan.asm.
231 ; nb register usage may need to be adjusted for wiring into mascan i2cm_...
232 mov_lfsr polarity_cmds, 0
233 polarity_needwrite_loop
234 rlc_fw PREINC0 ; W = 1RRRRRR? C=1 reverse command
235 ; W = 0000001? C=0 not a reversers pic
236 ; W = 0000000? C=0 no existing command
237 ; W = 1000000? C=0 sentinel
238 bra_nn polarity_needwrite_loop
240 bra polarity_needwrite_found
241 ; we found the sentinel:
243 goto power_polarising_nonetodo
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
267 ; yes, we have something:
270 clr_f INDF0 ; we're about to write this
271 bra i2c_getwritebyte_yes
273 ;======================================================================