; M0B1 0000 we're expecting more detection byte 1
; M010 0000 we're expecting more detection byte 2
; 1000 0000 we're expecting an extra byte
+ ; ???? ???1 reading halted due to lack of buffer space:
+cbyte_halted equ 0 ; also set briefly while we decide what to do next
+
+wslave res 1 ; slave we need to write to
;======================================================================
; HANDLING OF I2C EVENTS
bs_f STATUS, Z
return
- bra_nz write_another_slave
-
-
-
- return
-
;----------------------------------------
i2cm_intrl
; handles i2c interrupt using i2cm_interrupt[_definite],
; DECIDING WHICH SLAVE TO ADDRESS
;...
i2c_arrange_something
-i2cmu_done
; figure out what to do next - which pic to address, etc.
- mov_fw needwrite_slave
- bra_nz arrange_write
+ bs_f cbyte, cbyte_halted
+
+ tst_f_ifnz wslave ; anyone asked to write ?
+ bra arrange_write
+nextslave_nowrite
+ ; no writing needed, we consider reading:
+ neg_fw outmsg_begin
+ add_wfw outmsg_end
+ and_lw outbuf_size - 1
+ cmp_fw_ifle outmsg_targetlen
+ return ; target len < actual len, do not add anything
+ ; ok, there's space, go ahead:
- ; add calls to needwrite_<foo> here:
- call needwrite_polarity
- call needwrite_points
- ; end of list of calls to needwrite_<foo>
-
- ; no writing needed, we have to read:
mov_lfsr slavetable, 1 ; FSR1H -> slavetable
mov_ff cslot, FSR1L ; FSR1 -> current ste_flags
mov_lw ste_size ; W = ste_size
mov_ff FSR1L, cslot ; cslot -> new ste_flags
bt_f_if1 POSTDEC1, stf_sentinel ; FSR1 -> ste_slave
bra nextslave_reloop
+ ; no wrap around:
mov_fw INDF1 ; W = new slave number
+ bc_f cbyte, cbyte_halted
goto i2cm_read_start
nextslave_reloop
mov_lfsr slavetable + ste_size + ste_flags
bra nextslave_reloop_resume
-fixme do not i2cm_read_start if no room in buffer
-fixme check that we don't accidentally skip reading a slave
+;----------------------------------------
+i2cmu_done
+ ; So we've done one write.
+ bs_f cbyte, cbyte_halted
+
+ tst_f_ifnz wslave ; anyone asked in the meantime ?
+ bra arrange_write
+
+ ; Anyone else to write to ?
+ ; add calls to needwrite_<foo> here:
+ call needwrite_polarity
+ call needwrite_points
+ ; end of list of calls to needwrite_<foo>
+
+ ; no, if we're here, no-one wants to write
+ bra nextslave_nowrite
+
+;----------------------------------------
+i2c_needwrite
+; Informs mascan that we need to write to some slave.
+; Some time after this, mascan will call getwritebyte_<everything>
+; and this must yield at least one byte to write.
+; W slave that we must write to
+ mov_wf wslave
+ bt_f_if0 cbyte, cbyte_halted
+ return ; we're currently doing something
+;...
+;----------
+arrange_write
+; wslave slave to write to
+ bc_f cbyte, cbyte_halted
+ mov_fw wslave
+ mov_wf cwslave
+ clr_f wslave
+ goto i2cm_write_start
+
+;----------------------------------------
+i2c_consider_restartread
+ bt_f_if0 cbyte, cbyte_halted
+ return
+ bra nextslave_nowrite
+
+;======================================================================
+; INITIALISATION
+
+mascan_init
+ add_lw -maxpic/2 ; at 9600, about 1ms per char;
+ ; we reckon on about 2 pics per ms. So if
+ ; we have at least maxpic/2 then we won't
+ ; run out before we have scanned them all
+ coincidentally is about 1 pic cmp_fw_ifle
+ mov_fw outmsg_end
+ sub_wfw
;======================================================================
; PROCESSING OF INCOMING BYTES - EXTRA (NON-DETECTION)