chiark / gitweb /
wip new things
authorian <ian>
Fri, 9 May 2008 18:49:59 +0000 (18:49 +0000)
committerian <ian>
Fri, 9 May 2008 18:49:59 +0000 (18:49 +0000)
detpic/waggle.asm [new file with mode: 0644]

diff --git a/detpic/waggle.asm b/detpic/waggle.asm
new file mode 100644 (file)
index 0000000..b18b61e
--- /dev/null
@@ -0,0 +1,169 @@
+;======================================================================
+; 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