-> mapping to an 1/x like behaviour
[my-code/atmel.git] / monolyzer / main.asm
1 ; main file of the monolyzer project
2 ;
3 ; author: hackbard@hackdaworld.org
4 ;
5
6 ; device specific definition file
7 .include "../include/tn2313def.inc"
8
9 ; defines
10 .def    zero            = r1
11 .def    one             = r2
12 .def    tmp1            = r16
13 .def    tmp2            = r17
14 .def    uart_rxtx       = r18
15 .def    count           = r19
16 .def    state           = r20
17 .def    scount          = r21
18 .def    input           = r22
19 .def    save            = r23
20
21 ;.define FLOODME
22 ;.define S_FLOODME
23
24 ;
25 ; interrupts
26 ;
27
28 ; RESET
29 rjmp INIT
30
31 ; INT0
32 rjmp INT0_IR
33
34 ; INT1
35 reti
36
37 ; T1 CAPT1
38 reti
39
40 ; T1 COMP A
41 reti
42
43 ; T1 OVF1
44 rjmp T1_OVF_IR
45
46 ; T0 OVF0
47 reti
48
49 ; UART RX
50 reti
51
52 ; UART UDRE
53 reti
54
55 ; UART TX
56 reti
57
58 ; ANA COMP
59 reti
60
61 ; PCINT
62 reti
63
64 ; T1 COMP B
65 reti
66
67 ; T0 COMP A
68 reti
69
70 ; T0 COMP B
71 reti
72
73 ; USI START
74 reti
75
76 ; USI OVF
77 reti
78
79 ; EE READY
80 reti
81
82 ; WDT OVF
83 reti
84
85 ;
86 ; init and main code
87 ;
88
89 RESET:
90 INIT:
91
92         ; gio port init
93         rcall PORT_INIT
94
95         ; timer1 init
96         rcall TIMER1_INIT_64
97
98         ; uart init
99         rcall UART_INIT
100
101         ; zero and one initialization
102         ldi tmp1,0
103         mov zero,tmp1
104         ldi tmp1,1
105         mov one,tmp1
106
107         ; set stackpointer
108         ldi tmp1,low(RAMEND)
109         out SPL,tmp1
110
111         ; more init
112         ldi count,0
113         ldi state,0
114
115         ; storage pointer
116         ldi ZL,low(STORAGE)
117         ldi ZH,high(STORAGE)
118
119         ldi scount,0
120         ldi tmp1,0x23
121 INIT_STORAGE:
122         ; init storage
123         st Z+,tmp1
124         st Z+,tmp1
125         add scount,one
126         cpi scount,55
127         brne INIT_STORAGE
128
129         ; storage pointer again
130         ldi ZL,low(STORAGE)
131         ldi ZH,high(STORAGE)
132
133         ; signal ready output
134         ldi uart_rxtx,0x72
135         rcall UART_TX
136
137 .ifdef FLOODME
138 DEBUG_PORT:
139         ;rcall UART_RX
140         ldi scount,0
141 DEBUG_PORT_LOOP:
142         lsl uart_rxtx
143         in tmp1,PIND
144         sbrc tmp1,2
145         add uart_rxtx,one
146         add scount,one
147         cpi scount,8
148         brne DEBUG_PORT_LOOP
149         rcall UART_TX
150         rjmp DEBUG_PORT
151 .endif
152
153 .ifdef S_FLOODME
154 DEBUG_PORT:
155         ldi uart_rxtx,0x30
156         in tmp1,PIND
157         sbrc tmp1,2
158         add uart_rxtx,one
159         rcall UART_TX
160         rjmp DEBUG_PORT
161 .endif
162         ; enable interrupts
163         rcall INT0_IR_CONF_R
164         rcall INT0_IR_ENABLE
165
166         ; global interrupt enable
167         sei 
168
169 MAIN:
170
171 SAMPLE:
172
173         ; sample as long as there is storage capacity and signal
174         cpi state,10
175         brne SAMPLE
176
177         ; signal finish
178         ldi uart_rxtx,0x66
179         rcall UART_TX
180
181 IDLE:
182
183         ; wait for commands via uart
184         rcall UART_RX
185
186         ; decode instruction
187         cpi uart_rxtx,0x72
188         breq RESET
189         cpi uart_rxtx,0x74
190         breq TRANSFER
191         cpi uart_rxtx,0x73
192         breq SINGLE_SAMPLE
193
194         rjmp IDLE
195
196 SINGLE_SAMPLE:
197
198         ; sample port d pin 2 and output via uart
199         ldi uart_rxtx,0x30
200         in tmp2,PIND
201         sbrc tmp2,2
202         ldi uart_rxtx,0x31
203         rcall UART_TX
204         rjmp IDLE
205
206 TRANSFER:
207
208         ; reset storage pointer
209         ldi ZL,low(STORAGE)
210         ldi ZH,high(STORAGE)
211         ldi scount,1
212
213         ; transmit number of sampled words
214         mov uart_rxtx,count
215         rcall UART_TX
216
217 TRANSFER_LOOP:
218
219         ; send data and counter
220         ld uart_rxtx,Z+
221         rcall UART_TX
222         ld uart_rxtx,Z+
223         rcall UART_TX
224
225         ; count sent data
226         add scount,one
227
228         ; check amount of data
229         cpi scount,56
230         breq IDLE
231
232         rjmp TRANSFER_LOOP
233
234 ; include subroutines
235 .include "port.asm"
236 .include "timer.asm"
237 .include "uart.asm"
238
239 ;
240 ; interrupt routines
241 ;
242
243 INT0_IR:
244
245         in save,SREG
246
247         cli
248
249         ; get timer value
250         in tmp1,TCNT1L
251         in tmp2,TCNT1H
252
253         ; reset timer
254         ldi tmp1,0
255         out TCNT1H,tmp1
256         out TCNT1L,tmp1
257
258         ; check for running state
259         cpi state,5
260         breq INT0_RUN
261
262         ; reconfigure int0
263         rcall INT0_IR_CONF_FR
264         ldi state,5
265         rcall TIMER1_INT_ENABLE
266
267         rjmp LEAVE_INT0_IR
268
269 INT0_RUN:
270
271         ; write timer value into sram
272         st Z+,tmp2
273         st Z+,tmp1
274
275         ; inc counter
276         add count,one
277         
278         ; check for left capacity
279         cpi count,55
280         brne LEAVE_INT0_IR
281
282         ; indicate end of 'c'apacity
283         ldi uart_rxtx,0x63
284         rcall UART_TX
285
286         ; exit sampling
287         ldi state,10
288
289         ; leave all interrupts cleared
290         rjmp EXIT_INT0_IR
291
292 LEAVE_INT0_IR:
293
294         sei
295
296 EXIT_INT0_IR:
297
298         out SREG,save
299
300         reti
301
302 T1_OVF_IR:
303
304         in save,SREG
305
306         cli
307
308         ; indicate 'o'verflow end
309         ldi uart_rxtx,0x6f
310         rcall UART_TX
311
312         ; exit sampling
313         ldi state,10
314
315         out SREG,save
316
317         reti
318
319 ;
320 ; sram
321 ;
322
323 .dseg
324
325 STORAGE: .byte 110
326