Mercurial > hg > Members > kono > nitros9-code
comparison level2/modules/clock2_swatch.asm @ 0:6641a883d6b0
Initial revision
author | boisy |
---|---|
date | Thu, 04 Apr 2002 16:34:12 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:6641a883d6b0 |
---|---|
1 ******************************************************************** | |
2 * Clock2 - Dallas Semiconductor 1216E SmartWatch clock driver | |
3 * | |
4 * $Id$ | |
5 * | |
6 * Ed. Comments Who YY/MM/DD | |
7 * ------------------------------------------------------------------ | |
8 * 1 Created BGP 98/10/04 | |
9 | |
10 nam Clock2 | |
11 ttl Dallas Semiconductor 1216E SmartWatch clock driver | |
12 | |
13 ifp1 | |
14 use defsfile | |
15 endc | |
16 | |
17 rev set 1 | |
18 edition set 1 | |
19 | |
20 RTC.Base equ $2000 We map the clock into this addr | |
21 RTC.Blok equ $FFA1 Address corresponding to map RTC ROM block into | |
22 RTCMPSlt equ $33 MPI Slot ($00-$33) where RTC is | |
23 | |
24 mod CSize,CNam,Systm+Objct,ReEnt+rev,Entry,RTC.Base | |
25 | |
26 CNam fcs "Clock2" | |
27 fcb edition edition byte | |
28 SlotSlct fcb RTCMPSlt slot constant for MPI select code | |
29 | |
30 Entry bra Init clock hardware initialization | |
31 nop maintain 3 byte entry table spacing | |
32 * bra GetTime get hardware time | |
33 bra ReadSW get hardware time | |
34 nop save a couple cycles with short branch a | |
35 bra SetTime set hardware time | |
36 | |
37 * SetTime is not implemented yet | |
38 SetTime clrb | |
39 rts | |
40 | |
41 GetTime ldb <D.Sec get seconds | |
42 incb | |
43 cmpb #60 | |
44 beq ReadSW if zero, get SmartWatch time | |
45 stb <D.Sec else update second | |
46 rts | |
47 | |
48 Init | |
49 ReadSW pshs d,x,y,u save regs which will be altered | |
50 | |
51 ldx #$003E | |
52 ldb #1 | |
53 os9 F$MapBlk | |
54 * lbcs exx | |
55 | |
56 pshs cc | |
57 | |
58 * orcc #IntMasks disable interrupts | |
59 lda MPI.Slct get MPI slot | |
60 ldb <D.HINIT get GIME shadow of $FF90 | |
61 pshs d | |
62 lda SlotSlct,pcr | |
63 sta MPI.Slct and select it | |
64 andb #$FC | |
65 stb $FF90 ROM mapping = 16k internal, 16k external | |
66 leay SWKey,pcr | |
67 *ROMRAM sta >$FFDE put CC3 in ROM mode | |
68 * Loop to write 64 bit key to SmartWatch | |
69 MapSW lda $04,u read ROM block (trigger SW) | |
70 LoopTop ldb #8 B = bit counter (8) | |
71 lda ,y+ get byte in key | |
72 beq ReadTime if zero, exit | |
73 BitLoop lsra move bit 0 to Carry | |
74 bcs Write1 if Carry set, write a 1 to SmartWatch | |
75 tst ,u else write 0 to SmartWatch | |
76 bra LoopCntl | |
77 Write1 tst 1,u | |
78 LoopCntl decb dec bit counter | |
79 beq LoopTop if more bits, continue | |
80 bra BitLoop else move to top of loop and get next byte in key | |
81 | |
82 * Read Time from SmartWatch | |
83 ReadTime lda #8 | |
84 L00CF ldb #8 | |
85 pshs d | |
86 L00D3 ldb 4,u | |
87 lsrb | |
88 rora | |
89 dec 1,s dec count (B) on stack | |
90 bne L00D3 | |
91 | |
92 * Convert BCD to a normal number | |
93 BCD2Dec clrb | |
94 B2DLoop cmpa #$10 | |
95 bcs B2DDone | |
96 suba #$10 | |
97 addb #$0A | |
98 bra B2DLoop | |
99 B2DDone pshs a | |
100 addb ,s+ | |
101 | |
102 stb 1,s | |
103 puls a | |
104 deca | |
105 bne L00CF | |
106 * sta >$FFDF | |
107 * Restore original values and unmask interrupts ASAP | |
108 ldx #D.Time | |
109 ldd ,s get year/Month | |
110 std ,x save year/month | |
111 lda 2,s get day | |
112 sta 2,x save day | |
113 ldd 4,s get hour/min | |
114 std 3,x save hour/min | |
115 lda 6,s get seconds | |
116 sta 5,x save seconds | |
117 leas 8,s clean stack | |
118 puls d get DINIT/MPI slot | |
119 sta >MPI.Slct restore org MPI slot | |
120 stb >$FF90 restore org GIME INT0 | |
121 | |
122 puls cc | |
123 | |
124 ldb #1 | |
125 os9 F$ClrBlk | |
126 | |
127 exx | |
128 puls pc,d,x,y,u | |
129 | |
130 SWKey fcb %11000101,%00111010,%10100011,%01011100 | |
131 fcb %11000101,%00111010,%10100011,%01011100 | |
132 fcb $00 | |
133 | |
134 ifeq 1 | |
135 | |
136 | |
137 * Read SmartWatch time | |
138 * Entry: Y=copy of stack pointer | |
139 ReadSW pshs cc Save interrupt status | |
140 orcc #IntMasks Disable interupts | |
141 | |
142 lda >MPI.Slct Get current MPak slot | |
143 ldb <D.HINIT Get current GIME init register | |
144 pshs d Save current MPak slot & GIME init register | |
145 lda #RTCMPSlt Set MPak to slot 4 (both ROM & IRQ select) | |
146 sta >MPI.Slct | |
147 andb #$FC Set GIME to use 16K Internal/16K External ROM | |
148 stb $FF90 | |
149 lda <D.TINIT Get task side | |
150 bita #$01 We in task 1? (either GRFDRV or user task) | |
151 bne L0207 Yes, adjust myself for it | |
152 * If we are in system state, map ROM block into block 2 of Task 0 | |
153 ldb RTC.Blok Get current memory block to swap out | |
154 pshs d Save it | |
155 lda #$3E Get Disk ROM block # | |
156 sta RTC.Blok Swap it in | |
157 bra ROMRAM Go find Smart watch | |
158 * If we are in user state, map ROM block into block 2 of Task 1 | |
159 L0207 ldb RTC.Blok+8 Get block # to save | |
160 pshs d Preserve Init1 register & block # currently mapped | |
161 lda #$3E Get Disk ROM block # | |
162 sta RTC.Blok+8 Swap it in | |
163 | |
164 * Now, switch to ROM mode and swap Smartwatch in | |
165 ROMRAM clr $FFDE Switch to all ROM mode | |
166 * pshs dp Preserve DP | |
167 * lda #$20 Point DP to ROM/Smartwatch block | |
168 * tfr a,dp | |
169 lbsr MapSW Swap Smarwatch into beginning of ROM block | |
170 ldx #D.Sec Point to system seconds | |
171 lda #8 Get # registers to read | |
172 sta ,-s Save it on stack | |
173 * Read bits from SmartWatch | |
174 ReadSW ldb #8 Get # of bits | |
175 GetBit lda >RTC.Base+4 Get a bit off the smartwatch | |
176 lsra Shift it to carry | |
177 ror ,x Move it location | |
178 decb Done? | |
179 bne GetBit No, keep going | |
180 lda ,s Get register # | |
181 cmpa #$08 Was it the 1/10th second register? | |
182 beq L023D Yes skip it and do it again | |
183 cmpa #$04 Was it day of week register? | |
184 bne L0239 No, go on to next register | |
185 ldb ,x Get the day of week | |
186 stb <D.Daywk Save it | |
187 bra L023D Move to next register | |
188 | |
189 L0239 leax -1,x Move time packet pointer back | |
190 bsr BCD2Dec Convert BCD to hex for current register | |
191 L023D dec ,s Done all registers? | |
192 bne ReadSW No, go back | |
193 leas 1,s Purge stack | |
194 * puls dp Get back real DP | |
195 clr $FFDF Swap back to all RAM mode | |
196 puls d Restore block # | |
197 bita #$01 In task 1? | |
198 bne L0251 Yes, save block to task 1 | |
199 stb RTC.Blok Save block to task 0 | |
200 bra L0254 Continue on | |
201 L0251 stb RTC.Blok+8 Save block to task 1 | |
202 L0254 puls d Restore MPak slot # & GIME init register | |
203 sta >MPI.Slct Switch MPak back | |
204 stb $FF90 Restore GIME | |
205 puls cc,pc Restore interupts & return | |
206 | |
207 * Convert BCD to Hex | |
208 BCD2Dec lda 1,x Get BCD byte | |
209 clrb Clear out destination byte | |
210 L0261 cmpa #16 0-15? | |
211 blo L026B Yes, it's fine | |
212 suba #16 Subtract 16 from BCD byte | |
213 addb #10 Add 10 to destination byte | |
214 bra L0261 keep doing until we are done | |
215 L026B pshs a Push leftover onto stack | |
216 addb ,s+ Add to current destination byte | |
217 stb 1,x Store it back | |
218 rts return | |
219 | |
220 | |
221 | |
222 | |
223 | |
224 | |
225 | |
226 | |
227 | |
228 | |
229 | |
230 | |
231 | |
232 | |
233 | |
234 | |
235 * Enable SmartWatch | |
236 * Entry: S is a new stack ptr for temporary use. ROM has been mapped into | |
237 * block 2, which will have the Smartwatch mapped into the beginning of | |
238 * it after we send out the 'map in Smartwatch' 64 bit sequence | |
239 * Y=original stack pointer, DO NOT MODIFY! | |
240 * DP must be $20, for direct page addressing | |
241 * | |
242 * 6809 optomization: Preserve DP on the stack, and then set it for $20 | |
243 * Use for $2000/$2001 ops in direct page mode, saving 50+ cycles | |
244 * (especially considering interrupts are disabled this whole time!) | |
245 * NOTE: all accesses to smartwatch except the init pattern have to be | |
246 * READS ONLY, not writes | |
247 * 6309: do above, and use LDE instead of TST, as well as F as the counter | |
248 * instead of the stack | |
249 * | |
250 | |
251 SWBits fcb %11000101,%00111010,%10100011,%01011100 | |
252 fcb %11000101,%00111010,%10100011,%01011100 | |
253 | |
254 MapSW leax SWBits,pc point to coding table | |
255 lda >RTC.Base+4 Reset Smarwatch to expect the map in sequence | |
256 lda #8 byte counter | |
257 sta ,-s onto stack | |
258 | |
259 ByteLoop ldb #8 bit counter | |
260 lda ,x+ get code byte | |
261 BitLoop lsra shift LSBit out | |
262 bcs Write1 if a 1 bit, skip ahead | |
263 tst >RTC.Base if 0, test 1st byte of ROM we mapped in | |
264 bra DecLoop | |
265 Write1 tst >RTC.Base+1 if 1 bit, test 2nd byte of ROM we mapped in | |
266 DecLoop decb dec bit counter | |
267 bne BitLoop keep reading alternate signals until byte is done | |
268 dec ,s dec byte counter | |
269 bne ByteLoop keep going until entire 64 bit read pattern done | |
270 puls a,pc restore regs & return | |
271 | |
272 | |
273 | |
274 endc | |
275 | |
276 emod | |
277 CSize equ * | |
278 end | |
279 | |
280 |