-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBANDA11.c~
498 lines (327 loc) · 8.03 KB
/
BANDA11.c~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
P68H11
*Este archivo contiene las rutinas basicas en assembler para
*se llamadas desde el 'C'para el Lector de banda magnetica
*Funciones implementadas:
MODULE BANDA11
PUBLIC read_band Lee una tarjeta
*======Definiciones para el lector magnetico===========================*
*--------------------------------------
* ports
*
porta equ $1000
banda equ porta Aca estan Enable,Strobe y data
* Lector de banda magnetica definicion de pines
* |------------------------------|
* | 0v (Gnd) -> Negro |
data equ 0 | data -> Azul |
strobe equ 1 | strobe (CLK) -> Verde |
enable equ 7 | enable -> Amarillo |
* | +5V (Vcc) -> Rojo |
* |------------------------------|
* Nota Enable is active low
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*
*
* r a m
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*
RSEG UDATA Reservar lugar para este segmento
* en el archivo del linker ej UDATA+80
*== ESTA ZONA ES INICIALIZADA CON 00 ==
ram1 equ *
pntent rmb 2 ;carga del buffer
*======= COMUNICACION =================
buffer rmb 16 ;buffer de salida.
rmb 43-16 ;43 para la adq. de la banda overly c/buffer
*====== Reservas para el lectror magnetico =======
* De aca para abajo es el buffer de lectura para el magnetico
bufmag equ buffer Overlay con buffer
combuf equ buffer+1 comienzo del buffer (+1 pues es compartido el 1ro)
finbuf equ * final del buffer
count rmb 1
leido rmb 1
byte rmb 1 ;armado al leer
dato rmb 1
extend rmb 1
pntbda rmb 2 Two bytes pointer
finmag equ *
endram equ * ;fin zona de datos.
*== ACA TERMINA ZONA INICIALIZADA ======
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*
*
* r o m
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*
RSEG CODE
*--------------------------------------
* hardware reset
*--------------------------------------
*--------------------------------------
* software reset
*--------------------------------------
*============================================================================
* Read_band: Ve si estan pasando una banda
* Si se leyo una banda devuelve un puntero no nulo al buffer
* que contiene un string ascii (terminado en 0) con la lectura de la banda
* En caso de error o que no se paso tj se devuelve un ptr NULO.
* C prototype -> char *read_band(void)
*=====================================================
read_band equ *
jsr clrvars Borra la ram desde [RAM1 a ENDRAM]
ldaa banda Loop de espera del enable
bmi sinpul
jmp inpbda Bajo enable a laburar!!
malban equ *
sinpul equ *
ldd #0 retorna Null ptr
rts
*===== Programa de lector magnetico ===========*
*===========================================*
*
* Inpbda:
*
* Comienza lalectura de la banda magnetica
*
*===========================================*
inpbda equ *
ldx #bufmag
stx pntbda
ldx #combuf
stx pntent inicializa banda.
ldaa #7+$80
staa count ;los 7 primeros los ignoro
*---------------------------------
* aqui comienza la lectura de una banda
* magnetica.
*---------------------------------
jsr rdband ;leo la banda
latoma ldx pntbda
stx pntent puntero de salida
jsr forban
bcc bienb
jmp malban
bienb ldx #combuf
busc inx
cpx pntent ;Busco el final para ponerle el teminador.
bne busc
sale clra 'C'string null terminator.
staa 0,x
ldd #combuf Returns to caller with ptr to combuff
rts
*
*--------------------------------------
*
* lector de banda japones.
*
*--------------------------------------
*
*--------------------------------------
* rutinas de anlisis de lecturas de timer.
*
* asembl -entra desde interrupcion
*
* puntos de entrada.
*
* wait0 -espera encabezamiento de ceros
* wait1 -comienza un analisis de lectura
*
*--------------------------------------
asembl tst count
bpl wait1
wait0 dec count ;dejo pasar los primeros
bpl wait01
return rts
* aca empiezo con ceros
wait01 inc count
bsr pll
bcc return
* aca entro un uno,empieza la lectura de la data
newbyt ldaa #5
staa count ;4bits mas paridad
sec
bra escero
wait1 bsr pll
escero ror byte
dec count
bne return
* aca tengo un caracter
ldaa byte
anda #11111000b
ldx pntbda
cpx #bufmag ;el primero debe ser start sentinel
bne esdata
cmpa #01011000b
beq esdata
inc count ;lo descarto
bra return
esdata cpx #finbuf
beq newbyt ;para no salirme del buffer
pshx ; incr pntbda
ldx pntbda
inx
stx pntbda
pulx
asra
asra
asra
anda #11111b
staa ,x
ldaa #5
staa count
rts
*--------------------------------------
* pll controla el clock
*--------------------------------------
pll eora #1 ; 0 <-> 1
rora ;data -> Cy
rts
*--------------------------------------
/*--------------------------------------
* loop de lectura de banda.
*--------------------------------------
*/
// rdband equ *
// pin_data debe ser b0 del puerto
rx_data=0;
if ((PORTBAN & PIN_ENABLE)==SLIDING)
{
while ((PORTBAN & PIN_ENABLE)==SLIDING) // While card is sliding
{
if((PORTBAN & PIN_CLOCK)==LOW) //Look for falling edge
{
ldaa #7+$80; // Prepare for reading
assemble(PORTBAN & PIN_DATA);
while ((PORTBAN & PIN_CLOCK)==LOW) ; // Wait for clock rising edge
}
}
}
return(NOBAN);
assemble(unsigned char bit)
{
if (bit_count > (0x80 + 7)) // dejo pasar los primeros
return;
switch (state)
case (WAIT_FOR_ONE):
if(bit&0x01)
{
bit_count=5;
state=START_READING;
}
else
return;
break;
case(START_READING):
if(bit_count)
{
rx_data>>=bit;
bit_count--;
}
else
{
if(rx_data==SS)
{
*p2buffer++=rx_data&DATA_MASK;
bit_count=5;
{
else
{
}
break;
default:
break;
]
//pulso tst banda
// bmi retbnd enable=low ?
// ldaa banda bajo el clk ?
// bita #(1.shl.strobe)
// bne pulso
****>
haypul equ *
* brclr data,banda,leo esto es para setear el carry si data = 0
clrb
****>
sec
ldaa banda no afecta al cy
bita #(1.shl.data) " " " "
beq leo
clc
****>
leo rolb
tba ;a=data
*---->
eora #1
jsr asembl
* brclr strobe,banda,$
*****>
w_str ldaa banda espero que suba el clk
bita #(1.shl.strobe)
beq w_str
*****>
******* bra rdband
bra pulso
retbnd rts
*--------------------------------------
* forban - analiza la data leida
* del lector de bandas.
*--------------------------------------
forban ldx #bufmag
ldaa ,x
cmpa #1011b ;start sent?
beq ssent
malbda sec
rts
ssent staa dato
lopfor inx
cpx #finbuf ;se acabo el buffer?
beq malbda
stx pntent
ldaa ,x
bsr verpry ;verifico paridad
bcc malbda
eora dato
staa dato
ldaa leido
cmpa #11111b
beq endss
oraa #$30
staa ,x ;data en ascii
bra lopfor
endss ldaa 1,x
eora dato ;ahora el lrc
anda #1111b
bne malbda
clrape clr ,x
inx
cpx #finbuf
bne clrape
clc
rts
verpry staa leido
clr extend ;cuento los unos
loprty tsta
bne ver
ror extend ;b0 ->cy
ldaa leido
rts
ver asla
bcc loprty
inc extend ;era "1"
bra loprty
*---- Fin lector magnetico -----------*
******************************************
******************************************
******************************************
******************************************
******************************************
clrvars equ * ;Borra la ram desde [RAM1 a ENDRAM]
ldx #ram1
lopram clr 0,x
inx
cpx #endram
bne lopram
rts
*===================================*
*===================================*
*===================================*
*===================================*
end