--- /dev/null
+;======================================================================
+; WAGGLE - SET PIN HIGH OR LOW
+
+ include common.inc
+
+;----------------------------------------
+; LOCAL WAGGLERS - Variables
+
+maxwagglers equ 16
+
+waggle_lpins equ 0x3a0 ; has to be 0x?a0
+waggle_lpins_section udata waggle_lpins
+ res maxwagglers*2
+ ; Each pair of bytes is:
+ ; bitmask containing only the relevant bit
+ ; bottom byte of LAT*
+
+;----------------------------------------
+; MASTER - Access bank variables etc.
+
+ udata_acs
+waggle_picno res 1
+waggle_message res 1
+
+;======================================================================
+; LOCAL WAGGLERS
+
+near_local_do code
+;----------
+waggle_local_do @
+; On master, called during serial receive, ie Low ISR
+; On slave, called during i2c receive, ie High ISR
+; W fire point msg undefined
+;
+; on entry: ; W = 101 WWWWY
+
+ mov_wf t ; t = 101 WWWWY
+
+ intrlh_fsr0_save
+ mov_lfsr waggle_lpins | b'011110', 0
+ ; FSR0 = aaaa 101 11110
+ and_wff FSR0L ; FSR0 = aaaa 101 WWWW0
+ ; INDF0 = bbbb bbbb LAT*-addr
+ mov_fw POSTINC0 ; W = bbbb bbbb (one-bit mask)
+ ; INDF0 = LAT*-addr
+ bra_z waggle_nonexistent
+
+ mov_ff INDF0, FSR0L
+ set_f FSR0H ; FSR0 = 1111 LAT*-addr
+ ; INDF0 = <latch>
+
+ bt_f_if0 t, 0 ; test Y
+ bra waggle_ifclear
+ ; set:
+
+ ior_wff INDF0
+;...
+waggle_local_done
+ intrlh_fsr0_restore
+ return
+
+;-----
+waggle_ifclear
+ com_w
+ and_wff INDF0
+ bra waggle_local_done
+
+;----------------------------------------------------------------------
+; LOCAL WAGGLERS - INITIALISATION
+
+;----------------------------------------
+wagglers_local_init
+ outputs_local_init picno2wagglemap, maxwaggles, waggle_lpins, bkwaggleix2portbitnum
+ return
+
+;======================================================================
+; MASTER
+
+; No initialisation needed; we just pass on the commands as they come in.
+
+;----------------------------------------------------------------------
+command_waggle @
+ ; ie 1010 1Yss
+ ; OSSS wwww
+ tst_f_ifnz wagglemsg
+ bra command_waggle_busy
+
+ mov_fw POSTINC0 ; W = 1010 1Yss
+ and_lw 0x03 ; W = 0000 00ss
+ mov_lw waggleslave ; waggleslave = 0000 00ss
+
+ rr_fw INDF0 ; W = w0SSS www
+ rr_w ; W = ww0SSS ww
+ and_lw 0x1c ; W = 000S SS00
+ add_wff waggleslave ; waggleslave = 000S SSss C = 0
+
+ ; C = Y
+ rlc_fw INDF0 ; W = sss wwwwY C = O
+ bra_cs command_waggle_badmsg
+ and_lw 0x1f ; W = 000 wwwwY
+ ior_lw 0xa0 ; W = 101 wwwwY
+ mov_wf wagglemsg ; wagglemsg = 101 wwwwY
+
+ tst_f_ifnz waggleslave
+ bra waggle_local_do
+ goto i2c_needwrite
+
+;----------
+waggle_needwrite @
+ rr_fw pointslave
+
+
+
+ rlc_fw INDF0 ; W = sss wwww? C = O
+ ; OK: ; W = sss wwww?
+ and_lw 0x1f ; W = 000 wwww?
+ ior_lw 0xa0 ; W = 101 wwww?
+ mov_wf wagglemsg ; wagglemsg = 101 wwww?
+
+ swap_fw INDF0 ; W = tttt 0ssT
+ and_lw 0x06 ; W = 0000 0ss0
+ ior_wff pointslave ; pointslave = 00SS Sss0
+
+ rr_fw pointslave ; W = 000S SSss
+ bra_nz command_point_ifslave
+
+ mov_fw pointmsg
+ goto point_local_do
+
+command_point_badmsg panic morse_PX
+command_point_busy panic morse_PB
+command_point_cduempty panic morse_PC
+
+;----------------------------------------------------------------------
+points_master_init @
+
+
+
+
+
+ ; ie 1010 1Y__
+ ; O__s ssss
+ tst_f_ifnz wagglemsg
+ bra command_waggle_busy
+
+ rr_fw POSTINC0 ; W = _101 01Y_
+ swap_fw
+
+ mov_fw PREINC0 ; F0->[1], W = O__s ssss N = O
+ bra_n command_waggle_badmsg
+ and_lw 0x1f ; W = 000s ssss
+ mov_wf waggleslave ; slave = 000s ssss
+
+
+
+
+
+
+;; rrc_f POSTINC0 ; [0] = ?1010 1Ys C = s
+;; swap_fw POSTDEC0 ; W = wwww OSSS
+;; rlc_w ; W = www OSSSs C = ?
+;; rrc_f INDF0 ; [0] = ??1010 1Y C = s
+;; rlc_w ; W = ww OSSSss C = ?
+;; and_lw 0x1f ; W = 00 OSSSss
+;; mov_wf waggleslave ; waggleslave = 00 OSSSss
+
+;; swap_fw POSTINC0 ; W = 1Yss 1010
+;; rl_w ; W = Yss 10101
+;; rlc_w ; W = ss 10101? C = Y