1 ;======================================================================
2 ; MASTER - SCANNING ETC.
6 ;----------------------------------------------------------------------
9 ; for reading and detection:
10 b res 1 ; byte just read
11 cslot res 1 ; current slave in slave table, points to flags byte
13 ; one of the following:
14 ; 0000 0000 we're expecting the first byte
15 ; M0B1 0000 we're expecting more detection byte 1
16 ; M010 0000 we're expecting more detection byte 2
17 ; 1000 0000 we're expecting an extra byte
19 ;======================================================================
20 ; HANDLING OF I2C EVENTS
22 near_getwritebyteyes code
23 ;----------------------------------------
25 pop ; we don't care where we were in i2cmu_write_next_byte
26 bc_f STATUS, Z ; yes, we want to write this byte
27 return ; from i2cmu_write_next_byte
30 ;----------------------------------------
32 ; add calls to getwritebyte_<foo> here:
33 call getwritebyte_polarity
34 call getwritebyte_points
35 ; end of list of calls to getwritebyte_<foo>
36 ; so, no-one wants this slave:
40 bra_nz write_another_slave
46 ;----------------------------------------
48 ; handles i2c interrupt using i2cm_interrupt[_definite],
49 ; according to the rules for <something>_intrl.
52 call i2cm_interrupt_definite
55 ;======================================================================
56 ; PROCESSING OF INCOMING BYTES - CORE AND DETECTION
58 ;----------------------------------------
61 ; State Reading Reading-Wait
64 ; See detect.asm head comment for protocol info, in particular
65 ; the meaning of these bytes.
67 mov_wf b ; W = b = received byte
69 mov_lfsr slavetable, 1
70 mov_ff cslot, FSR1L ; FSR1 -> slave's flags
74 ; this is a first (head) byte:
76 bt_f_if0 POSTINC1, stf_detect ; FSR1 -> detbasel
77 bra read_got_first_reversers
78 read_got_first_detectors ; b = MdBBdddd
79 and_lw 0xb0 ; W = M0BB0000
80 mov_wf cbyte ; cbyte = M0BB0000
81 mov_lw 0x4f ; W = 01001111
82 and_wff b ; b = 0d00dddd
83 mov_fw POSTINC1 ; W = detbasel; FSR1 -> lastd0
84 rcall read_got_detectbyte_prep ; b = 0d00dddd
86 bt_f_if1 b, 6 ; b bit .d......
87 bs_f b, 4 ; b = 0d0ddddd
88 ; ^ ^ copies of same bit
89 ; u = (still) 0C00CCCC
90 ; or, using detection segment bit numbers:
96 read_got_first_reversers
98 bra read_got_bad_first_reversers
99 and_lw 0x80 ; W = M0000000
100 mov_wf cbyte ; cbyte = M0000000
101 bc_f b, 7 ; b = 00dddddd
102 mov_fw POSTINC1 ; W = detbasel; FSR1 -> lastd0
103 rcall read_got_detectbyte_prep
107 read_got_bad_first_reversers panic morse_MR
110 read_got_detectors_b1 ; b = dddddddd
111 bc_f cbyte, 4 ; cbyte = M0B00000
112 mov_fw POSTINC1 ; W = detbasel; FSR1 -> lastd0
113 inc_f FSR1L ; FSR1 -> lastd1
114 add_lw 5 ; W = detbasel+8
115 rcall read_got_detectbyte_prep
119 read_got_detectors_b2 ; b = dddddddd
120 bc_f cbyte,5 ; cbyte = M0000000
121 mov_fw POSTDEC1 ; W = detbasel; FSR1 -> flags
122 bs_f FSR1L, 2 ; FSR1L -> lastd2
123 add_lw 13 ; W = detbasel+16
124 rcall read_got_detectbyte_prep
128 read_got_detectbyte_prep_ifsomething
130 ; This is a branch of read_got_detectbyte_prep, called if we're doing
131 ; `return' rather than `pop+return'. For conditions on return, see
132 ; read_got_detectbyte_prep; these are supposed to be (basically) the
133 ; same as the entry conditions for addmsgs_<kind>.
144 xor_wfw INDF1 ; lastd<n> = [d0]*
146 ior_wff FSR1L ; FSR1L -> detmsgh
147 return ; to addmsgs_<something>, very shortly
149 ;----------------------------------------
152 bra read_got_detectors_b1
154 bra read_got_detectors_b2
155 ; it must be an extra byte
157 bt_f_if0 b, 7 ; any more ?
160 call process_got_extra
161 bra i2c_arrange_next_byte
164 read_got_detectbyte_prep
166 ; Sees if anything has changed. If no changes pops one return address
167 ; and branches to i2c_arrange_next_byte; if some changes, returns to
170 ; So, caller should be i2cmu_read_got_byte, and next stuff
171 ; should basically be a call to addmsg_<something> (perhaps preceded
172 ; by a bit of fiddling of b). addmsg_<something> will finish
173 ; by branching to i2c_arrange_next_byte.
175 ; call return pop+return
176 ; W adjdetbasel preserved undefined
177 ; b [d0]* preserved preserved
178 ; FSR1 -> lastd<n> detmsgh preserved
179 ; cbyte set for next read etc. preserved preserved
180 ; u undefined [C0]* preserved
181 ; lastd<n> [o0]* [d0]* preserved = [d0]*
183 ; TOS -> (optionally, fiddle b, and then:) goto addmsgs_<something>
184 ; NOS return address for i2cmu_read_got_byte
186 mov_wf t ; t = adjdetbasel
188 xor_wfw INDF1 ; W = [C0]*, Z iff same
189 ; where C set iff change to that detection segment
190 bra_nz read_got_detectbyte_prep_ifsomething
191 ; there's nothing to do
194 ;----------------------------------------
195 i2c_arrange_next_byte
197 goto i2cm_read_another
199 ;======================================================================
200 ; DECIDING WHICH SLAVE TO ADDRESS
202 i2c_arrange_something
204 ; figure out what to do next - which pic to address, etc.
205 mov_fw needwrite_slave
208 ; add calls to needwrite_<foo> here:
209 call needwrite_polarity
210 call needwrite_points
211 ; end of list of calls to needwrite_<foo>
213 ; no writing needed, we have to read:
214 mov_lfsr slavetable, 1 ; FSR1H -> slavetable
215 mov_ff cslot, FSR1L ; FSR1 -> current ste_flags
216 mov_lw ste_size ; W = ste_size
218 add_wff FSR1L ; FSR1 -> next ste_flags
219 bt_f_if0 INDF1, stf_present
222 nextslave_reloop_resume
223 mov_ff FSR1L, cslot ; cslot -> new ste_flags
224 bt_f_if1 POSTDEC1, stf_sentinel ; FSR1 -> ste_slave
227 mov_fw INDF1 ; W = new slave number
231 mov_lfsr slavetable + ste_size + ste_flags
232 bra nextslave_reloop_resume
234 fixme do not i2cm_read_start if no room in buffer
235 fixme check that we don't accidentally skip reading a slave
237 ;======================================================================
238 ; PROCESSING OF INCOMING BYTES - EXTRA (NON-DETECTION)
241 ;----------------------------------------
253 ;======================================================================
254 ; GENERATION OF DETECTION MESSAGES FOR HOST - MAD BT_F_IF1 TABLES
256 addmsg_testbit macro bit
261 addmsg_return macro dummy_bit
262 goto i2c_arrange_next_byte
265 addmsg_ignore macro dummy_bit
270 addmsg_padding macro dummy_bit
275 ;----------------------------------------
278 ; on entry after first addmsg_one, or when done
279 ; W, STATUS, v, FSR0 undefined trashed
280 ; t adjdetbasel not modified by addmsgs_<kind> or _one
281 ; u [C0]* not modified by addmsgs_<kind> or _one
282 ; b [d0]* not modified by addmsgs_<kind> or _one
283 ; lastd<n> [d0]* (new) not modified by addmsgs_<kind> or _one
284 ; FSR1 -> detmsgh not modified by addmsgs_<kind> or _one
285 ; outbuf, outmsg_* not full, updated appropriately
286 ; all others any not interfered with
288 ; (this is all set up by read_prep_detectbyte and
289 ; read_got_detectbyte_prep_ifsomething)
290 ; when done, branches to i2c_arrange_next_byte, rather than returning
292 addmsgs_section code ( 7 )*4 + 0x2100
295 ; |- PCL bbb value after macro - number in this
296 ; V column should increment 1 each line
298 addmsgs_revhead addmsg_testbit 0
306 addmsgs_all addmsg_testbit 7
316 addmsgs_dethead addmsg_testbit 0
320 addmsg_testbit 6 ; bit 6 was copied to 4 but only in b, not u
325 ; TOS - 4 -> bt_f_if1 w, b'bbb'
327 ; other conditions on entry and exit as for entry to addmsgs_<kind>, above
328 rr_fw TOSL ; W = 0???bbb0
330 ior_wfw 0xf8 ; W = 11111bbb
331 mov_wf FSR0L ; FSR0L = 11111bbb
332 clr_f FSR0H ; FSR0 -> bitnum2bit[bbb]
333 add_wfw t ; W = adjdetbasel + 11111bbb
334 ; ie = 0 SSSSSSS (det msg low byte)
335 mov_wf v ; v = 0 SSSSSSS (det msg low byte)
338 and_wfw INDF0 ; train: W = 0x00, Z=1; none: W = 0*d0*, Z=0
340 mov_lw 0x08 ; train: W = 0 000 0 000; none: W = 0 000 1 000
341 xor_wfw INDF1 ; W = 1 001 Y SSS (det msg high byte)
344 mov_fw v ; W = 0 SSSSSSS (det msg low byte)
345 goto serial_addbyte_another
347 ;======================================================================