;----------------------------------------------------------- ; ; Misaki 21balls touch sensor : 2011 August ; ;----------------------------------------------------------- ;##### Port Defines ##### smr .equ h'0fffb0 brr .equ h'0fffb1 scr .equ h'0fffb2 tdr .equ h'0fffb3 ssr .equ h'0fffb4 rdr .equ h'0fffb5 paddr .equ h'0fffd1 padr .equ h'0fffd3 addrah .equ h'0fffe0 addrbh .equ h'0fffe2 addrch .equ h'0fffe4 addrdh .equ h'0fffe6 adcsr .equ h'0fffe8 adcr .equ h'0fffe9 iprb .equ h'0ffff8 ;##### Vector Defines ##### .section vector,data,locate=h'000000 .data.l start ;##### Work RAM Data Defines ##### .section ram,data,locate=h'0fef10 timer1 .res.w 1 timer2 .res.w 1 timer3 .res.w 1 tx_top .res.w 1 tx_end .res.w 1 data .res.b 1 ad_no .res.b 1 ad_data .res.b 24 group .res.b 1 .org h'0ff800 tx_fifo .res.b 1024 ;***** Reset --> Initialize --> Main Loop ***** .section program,code,locate=h'000100 start: mov.l #h'0fff0f,er7 ; stack pointer set mov.l #h'0fef10,er2 mov.w #h'0fe0,r1 mov.b #0,r0l _ram_clear: mov.b r0l,@er2 inc.l #1,er2 dec.w #1,r1 bne _ram_clear jsr @sci0_init ; SCI initialize mov.b #b'00000000,r0l mov.b r0l,@adcsr ; A/D setting mov.b #b'11111111,r0l mov.b r0l,@paddr ; set : Port[1] all output mov.b #0,r0l mov.b r0l,@padr mov.b r0l,@group mov.b r0l,@ad_no jsr @wait_500msec bset.b #5,@adcsr ; A/D start ! mov.b #b'00100000,r0l ; tx/rx start ! mov.b r0l,@scr loop: jsr @ad_check jsr @tx_midi_check jmp @loop ;***** A/D Check Routine ***** ad_check: btst.b #7,@adcsr ; A/D conv end ? bne _ad_go rts _ad_go: mov.b @ad_no,r0l mov.b r0l,r4l ; [R4L] = current A/D channel cmp.b #0,r0l beq _ad_1 cmp.b #4,r0l beq _ad_1 cmp.b #1,r0l beq _ad_2 cmp.b #5,r0l beq _ad_2 cmp.b #2,r0l beq _ad_3 cmp.b #6,r0l beq _ad_3 cmp.b #3,r0l beq _ad_4 cmp.b #7,r0l beq _ad_4 _ad_1: mov.b @addrah,r3h ; Get A/D data bra _ad_next _ad_2: mov.b @addrbh,r3h ; Get A/D data bra _ad_next _ad_3: mov.b @addrch,r3h ; Get A/D data bra _ad_next _ad_4: mov.b @addrdh,r3h ; Get A/D data bra _ad_next _ad_next: mov.b @group,r5l shll.b r5l shll.b r5l shll.b r5l add.b r5l,r4l ; R4L = no + group mov.b @ad_no,r0l cmp.b #7,r0l bne _ch_1_7 mov.b @group,r0l ; and.b #b'00000011,r0l inc.b r0l cmp.b #3,r0l bne _pa_mix mov.b #0,r0l _pa_mix: mov.b r0l,@group mov.b r0l,@padr ; write to Port[A] mov.b @ad_no,r0l _ch_1_7: inc.b r0l and.b #b'00000111,r0l mov.b r0l,@ad_no mov.b r0l,@adcsr ; A/D setting ; bclr.b #7,@adcsr ; ADF clear bset.b #5,@adcsr ; A/D start ! extu.w r4 extu.l er4 shlr.b r3h ; R3H = now mov.b r3h,r3l ; --> r3l mov.b @(ad_data,er4),r2h ; R2H = old cmp.b r2h,r3l ; r3l-r2h bmi _minus ; if minus sub.b r2h,r3l ; r3l-r2h -> r3l cmp.b #2,r3l ; r3l>2 ? bpl _ad_ok rts _minus: sub.b r3l,r2h ; r2h-r3l -> r2h cmp.b #2,r2h ; r2h>2 ? bpl _ad_ok rts _ad_ok: mov.b r3h,@(ad_data,er4) ; now -> old mov.b #h'a0,r0h jsr @tx_fifo_set mov.b r4l,r0h ; R4L = no + group jsr @tx_fifo_set mov.b r3h,r0h jsr @tx_fifo_set rts ;***** SCI init / MIDI Transmit Routines ***** sci0_init: mov.b #b'00000000,r0l mov.b r0l,@scr mov.b #b'00000000,r0l mov.b r0l,@smr mov.b #15,r0l mov.b r0l,@brr mov.w #500,r0 _sci0_wait: dec.w #1,r0 bne _sci0_wait mov.b @ssr,r0l ; (dummy read) mov.b #0,r0l mov.b r0l,@ssr mov.b #b'00001000,r0l mov.b r0l,@iprb ; SCI0-int priority UP ! rts tx_midi_check: mov.w @tx_top,r1 mov.w @tx_end,r6 cmp.w r1,r6 bne _tx_exist rts _tx_exist: btst #7,@ssr ; test TRDE bne _tx_seq rts _tx_seq: mov.w #0,e6 mov.b @(tx_fifo,er6),r0l mov.b r0l,@tdr bclr #7,@ssr ; Transmit ! inc.w #1,r6 bclr #2,r6h mov.w r6,@tx_end rts tx_fifo_set: mov.w @tx_top,r6 mov.w #0,e6 mov.b r0h,@(tx_fifo,er6) ; transmit data = [r0h] inc.w #1,r6 bclr #2,r6h mov.w r6,@tx_top rts ;***** Timer / Counter Routines ***** wait_500msec: mov.l #500,er1 _wait_1: jsr @wait_1msec sub.l #1,er1 bne _wait_1 rts wait_1msec: mov.l #2048,er2 _wait_2: sub.l #1,er2 bne _wait_2 rts .end