chiark / gitweb /
less of an unsightly wiggle over bridge
[trains.git] / detpic / waggle.asm
1 ;======================================================================
2 ; WAGGLE - SET PIN HIGH OR LOW
3
4   include common.inc
5
6 ;----------------------------------------
7 ; LOCAL WAGGLERS - Variables
8
9 maxwagglers equ 16
10
11 waggle_lpins equ 0x3a0 ; has to be 0x?a0
12 waggle_lpins_section udata waggle_lpins
13   res maxwagglers*2
14         ; Each pair of bytes is:
15         ;       bitmask containing only the relevant bit
16         ;       bottom byte of LAT*
17
18 ;----------------------------------------
19 ; MASTER - Access bank variables etc.
20
21   udata_acs                             ; idle          busy
22 waggle_slave            res     1       ; 11111111      000 SSSss
23 waggle_message          res     1       ; ????????      101 wwwwY
24
25 ;======================================================================
26 ; LOCAL WAGGLERS
27
28 near_local_do code
29 ;----------
30 waggle_local_do @
31 ; On master, called during serial receive, ie Low ISR
32 ; On slave, called during i2c receive, ie High ISR
33 ;               W       fire point msg          undefined
34 ;
35 ;       on entry:               ; W =           101 WWWWY
36
37         mov_wf  t               ; t =           101 WWWWY
38
39         intrlh_fsr0_save
40         mov_lfsr waggle_lpins | 0x01, 0
41                                 ; FSR0 =   aaaa 000 00001
42         ior_wff FSR0L           ; FSR0 =   aaaa 101 WWWW1
43                                 ; *FSR0 =       bbbb bbbb  (one-bit mask)
44         mov_fw  POSTDEC0        ; W =           bbbb bbbb
45                                 ; *FSR0 =       LAT*-addrl
46         bra_z   waggle_nonexistent
47
48         mov_ff  INDF0, FSR0L    ; FSR0L =       LAT*-addr
49         set_f   FSR0H           ; FSR0 =   1111 LAT*-addr
50                                 ; *FSR0 =       <latch>
51
52         bt_f_if0 t, 0           ; test Y
53         bra     waggle_ifclear
54         ; set:
55
56         ior_wff INDF0
57 ;...
58 waggle_local_done
59         intrlh_fsr0_restore
60         return
61
62 ;-----
63 waggle_ifclear
64         com_w
65         and_wff INDF0
66         bra     waggle_local_done
67
68 ;----------
69 waggle_nonexistent
70         panic   morse_AU
71
72 ;----------------------------------------------------------------------
73 ; LOCAL WAGGLERS -  INITIALISATION
74
75 ;----------------------------------------
76 wagglers_local_init @
77  outputs_local_init picno2wagglemap, maxwaggles, waggle_lpins, bkwaggleix2portnumbitnum
78         return
79
80 ;======================================================================
81 ; MASTER
82
83 ; No serious initialisation needed;
84 ; we just pass on the commands as they come in.
85
86 wagglers_master_init @
87         set_f   waggle_slave
88         return
89
90 ;----------------------------------------------------------------------
91 command_waggle @
92                                 ;             1010 1sss OSS wwwwV
93                                 ;
94                                 ;       ie              1010 1sss
95                                 ;                       OSS wwwwV
96         bt_f_if0 waggle_slave, 7
97         bra     command_waggle_busy
98
99         mov_fw  PREINC0                 ; F0->[1], W =  OSS wwwwV  N = 0
100         bra_n   command_waggle_badmsg
101         and_lw  0x1f                    ; W =           000 wwwwV
102         xor_wff INDF0                   ; [1] =         0SS 00000
103         ior_lw  0xa0                    ; W =           101 wwwwV
104         mov_wf  waggle_message          ; message =     101 wwwwV
105
106         rr_fw   POSTDEC0                ; F0->[0], W =  00SS 0000
107         rr_w                            ; W =           000S S000
108         xor_wfw INDF0                   ; W =           101S Tsss
109         xor_lw  0xa8                    ; W =           000S Ssss
110         mov_wf  waggle_slave            ; slave =       000S Ssss
111
112         bra_z   waggle_local_do
113         goto    i2c_needwrite
114
115 ;----------
116 waggle_needwrite @
117         bt_f_if1 waggle_slave, 7
118         return
119         pop
120         mov_fw  waggle_slave
121         goto    i2c_needwrite
122
123 ;----------
124 waggle_getwritebyte @
125         mov_fw  waggle_slave
126         bra_n   waggle_getwritebyte_ifidle
127         cmp_fw_ifne cwslave
128 waggle_getwritebyte_ifidle
129         return
130         ;...
131         mov_lw  0x04 ; WAGGLED
132         call    serial_addbyte
133         ; actually it's not waggled until the slave acks it but
134         ;  that's a foregone conclusion
135
136         mov_fw  waggle_message
137         set_f   waggle_slave
138         goto    i2c_getwritebyte_yes
139
140 command_waggle_badmsg panic morse_AX
141 command_waggle_busy panic morse_AB
142
143 ;======================================================================
144   include final.inc