From: ian Date: Fri, 9 May 2008 18:49:59 +0000 (+0000) Subject: wip new things X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=6c09037d221cc4d8a3b1d334d36ebd44e8ef8b64;p=trains.git wip new things --- diff --git a/detpic/waggle.asm b/detpic/waggle.asm new file mode 100644 index 0000000..b18b61e --- /dev/null +++ b/detpic/waggle.asm @@ -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 = + + 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