;----------------------------------------------------------- ; ; [Sano MIDI Tempo Controller] January 2007 ; ;----------------------------------------------------------- ;##### 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 p2ddr .equ h'0fffc1 p2dr .equ h'0fffc3 paddr .equ h'0fffd1 padr .equ h'0fffd3 pbddr .equ h'0fffd4 pbdr .equ h'0fffd6 iprb .equ h'0ffff8 tstr .equ h'0fff60 tsnc .equ h'0fff61 tmdr .equ h'0fff62 tfcr .equ h'0fff63 toer .equ h'0fff90 tocr .equ h'0fff91 tcr0 .equ h'0fff64 tior0 .equ h'0fff65 tier0 .equ h'0fff66 tsr0 .equ h'0fff67 tcnt0 .equ h'0fff68 gra0 .equ h'0fff6a ;##### Vector Defines ##### .section vector,data,locate=h'000000 .data.l start .org h'000060 .data.l int_timer0 ;##### Work RAM Data Defines ##### .section ram,data,locate=h'0fef10 tx_top .res.w 1 tx_end .res.w 1 div_d .res.w 1 div_t .res.w 1 tap_cnt .res.w 1 phase .res.b 1 timer1 .res.b 1 timer2 .res.b 1 flag .res.b 1 tempo .res.b 21 preset .res.b 1 sw_old .res.b 1 sw_prev .res.b 1 sw_new .res.b 1 old_buf .res.b 1 eve_buf .res.b 1 status .res.b 1 up_p .res.b 1 down_p .res.b 1 .org h'0ff400 tx_fifo .res.b 1024 ;***** Constant Table Defines ***** .section rom,data,locate=h'001000 tempo_1: .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 40-49 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 50-59 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 60-69 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 70-79 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 80-89 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 90-99 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 100-109 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 110-119 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 120-129 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 130-139 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 140-149 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 150-159 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 160-169 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 170-179 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 180-189 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 190-199 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 200-209 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 210-219 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 220-229 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101, b'11011011, b'01011111, b'01101101 ; 0-4 230-239 .data.b b'01110111, b'11110111, b'00111101, b'11111111, b'01111111 ; 5-9 .data.b b'10111111, b'00001101 ; 0-4 240 tempo_10: .data.b b'01101101, b'01101101, b'01101101, b'01101101, b'01101101 ; 4 40-44 .data.b b'01101101, b'01101101, b'01101101, b'01101101, b'01101101 ; 4 45-49 .data.b b'01110111, b'01110111, b'01110111, b'01110111, b'01110111 ; 5 50-54 .data.b b'01110111, b'01110111, b'01110111, b'01110111, b'01110111 ; 5 55-59 .data.b b'11110111, b'11110111, b'11110111, b'11110111, b'11110111 ; 6 60-64 .data.b b'11110111, b'11110111, b'11110111, b'11110111, b'11110111 ; 6 65-69 .data.b b'00111101, b'00111101, b'00111101, b'00111101, b'00111101 ; 7 70-74 .data.b b'00111101, b'00111101, b'00111101, b'00111101, b'00111101 ; 7 75-79 .data.b b'11111111, b'11111111, b'11111111, b'11111111, b'11111111 ; 8 80-84 .data.b b'11111111, b'11111111, b'11111111, b'11111111, b'11111111 ; 8 85-89 .data.b b'01111111, b'01111111, b'01111111, b'01111111, b'01111111 ; 9 90-94 .data.b b'01111111, b'01111111, b'01111111, b'01111111, b'01111111 ; 9 95-99 .data.b b'10111111, b'10111111, b'10111111, b'10111111, b'10111111 ; 0 100-104 .data.b b'10111111, b'10111111, b'10111111, b'10111111, b'10111111 ; 0 105-109 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 110-114 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 115-119 .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 120-124 .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 125-129 .data.b b'01011111, b'01011111, b'01011111, b'01011111, b'01011111 ; 3 130-134 .data.b b'01011111, b'01011111, b'01011111, b'01011111, b'01011111 ; 3 135-139 .data.b b'01101101, b'01101101, b'01101101, b'01101101, b'01101101 ; 4 140-144 .data.b b'01101101, b'01101101, b'01101101, b'01101101, b'01101101 ; 4 145-149 .data.b b'01110111, b'01110111, b'01110111, b'01110111, b'01110111 ; 5 150-154 .data.b b'01110111, b'01110111, b'01110111, b'01110111, b'01110111 ; 5 155-159 .data.b b'11110111, b'11110111, b'11110111, b'11110111, b'11110111 ; 6 160-164 .data.b b'11110111, b'11110111, b'11110111, b'11110111, b'11110111 ; 6 165-169 .data.b b'00111101, b'00111101, b'00111101, b'00111101, b'00111101 ; 7 170-174 .data.b b'00111101, b'00111101, b'00111101, b'00111101, b'00111101 ; 7 175-179 .data.b b'11111111, b'11111111, b'11111111, b'11111111, b'11111111 ; 8 180-184 .data.b b'11111111, b'11111111, b'11111111, b'11111111, b'11111111 ; 8 185-189 .data.b b'01111111, b'01111111, b'01111111, b'01111111, b'01111111 ; 9 190-194 .data.b b'01111111, b'01111111, b'01111111, b'01111111, b'01111111 ; 9 195-199 .data.b b'10111111, b'10111111, b'10111111, b'10111111, b'10111111 ; 0 200-204 .data.b b'10111111, b'10111111, b'10111111, b'10111111, b'10111111 ; 0 205-209 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 210-214 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 215-219 .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 220-224 .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 225-229 .data.b b'01011111, b'01011111, b'01011111, b'01011111, b'01011111 ; 3 230-234 .data.b b'01011111, b'01011111, b'01011111, b'01011111, b'01011111 ; 3 235-239 .data.b b'01101101, b'01101101 ; 4 240 tempo_100: .data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; - 40-69 .data.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; - 70-99 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 100- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 110- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 120- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 130- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 140- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 150- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 160- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 170- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 180- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 190- .data.b b'00001101, b'00001101, b'00001101, b'00001101, b'00001101 ; 1 .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 200- .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 210- .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 220- .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 230- .data.b b'11011011, b'11011011, b'11011011, b'11011011, b'11011011 ; 2 .data.b b'11011011, b'11011011 ; 2 240 preset_1: .data.b b'10010000, b'11010111, b'10100010, b'10000110, b'11000101 ; 0-4 0-9 .data.b b'10001100, b'10001000, b'11010100, b'10000000, b'10000100 ; 5-9 .data.b b'10010000, b'11010111, b'10100010, b'10000110, b'11000101 ; 0-4 10-19 .data.b b'10001100, b'10001000, b'11010100, b'10000000, b'10000100 ; 5-9 .data.b b'10010000, b'11010111, b'10100010, b'10000110, b'11000101 ; 0-4 20-29 .data.b b'10001100, b'10001000, b'11010100, b'10000000, b'10000100 ; 5-9 .data.b b'10010000, b'11010111, b'10100010, b'10000110, b'11000101 ; 0-4 30-39 .data.b b'10001100, b'10001000, b'11010100, b'10000000, b'10000100 ; 5-9 .data.b b'10010000, b'11010111 ; 0-4 40 preset_10: .data.b 255,255,255,255,255,255,255,255,255,255 ; - 0-9 .data.b b'11010111, b'11010111, b'11010111, b'11010111, b'11010111 ; 1 10-19 .data.b b'11010111, b'11010111, b'11010111, b'11010111, b'11010111 ; 1 .data.b b'10100010, b'10100010, b'10100010, b'10100010, b'10100010 ; 2 20-29 .data.b b'10100010, b'10100010, b'10100010, b'10100010, b'10100010 ; 2 .data.b b'10000110, b'10000110, b'10000110, b'10000110, b'10000110 ; 3 30-39 .data.b b'10000110, b'10000110, b'10000110, b'10000110, b'10000110 ; 3 .data.b b'11000101, b'11000101 ; 4 40 ;***** Reset --> Initialize --> Main Loop ***** .section program,code,locate=h'002000 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 mov.b #b'00100011,r0l mov.b r0l,@tcr0 ; Timer0 init : 2MHz clock bclr #0,@tsr0 ; Clear IMFA bset #0,@tier0 ; timer INT set mov.w #100,r0 ; 0.05msec INT mov.w r0,@gra0 jsr @sci0_init ; SCI initialize mov.b #b'00000000,r0l mov.b r0l,@p2ddr ; set : Port[2] all input mov.b #b'11111111,r0l mov.b r0l,@paddr ; set : Port[A] all output mov.b r0l,@pbddr ; set : Port[B] all output mov.b r0l,@pbdr ; Port[B] all High - Latch Pulse mov.b #1,r0l mov.b r0l,@preset mov.w #0,e1 mov.w #1,r1 _tempo_init: mov.b #120,r0l mov.b r0l,@(tempo,er1) ; tempo : 40-240 inc.l #1,er1 cmp.b #21,r1l ; preset : 1-20 bne _tempo_init mov.w #417,r0 mov.w r0,@div_t mov.w #1000,r0 mov.w r0,@timer1 jsr @preset_display jsr @tempo_display mov.b @p2dr,r0l ; init switches xor.b #b'11111111,r0l and.b #b'01111111,r0l mov.b r0l,@sw_prev mov.b r0l,@sw_old mov.b #b'00100000,r0l ; tx start ! mov.b r0l,@scr bset #0,@tstr ; timer start ! andc.b #b'01111111,ccr ; interrupt enable main_loop: jsr @timer_check jsr @tx_midi_check jmp @main_loop ;***** Main Routines ***** timer_check: mov.b @flag,r0l bne _timer_event rts _timer_event: mov.b #0,r0l mov.b r0l,@flag mov.w @div_t,r0 dec.w #1,r0 mov.w r0,@div_t beq _div_hit bra _timer_job rts _div_hit: mov.w @div_d,r0 mov.w r0,@div_t mov.b #248,r0h jsr @tx_fifo_set _timer_job: mov.b @timer1,r0l dec.b r0l mov.b r0l,@timer1 beq _1msec rts _1msec: mov.b #20,r0l mov.b r0l,@timer1 jsr @tap_check mov.b @timer2,r0l inc.b r0l mov.b r0l,@timer2 cmp.b #25,r0l beq _25msec rts _25msec: mov.b #0,r0l mov.b r0l,@timer2 jsr @sw_scan rts tap_check: mov.b @phase,r0l bne _tap_increment rts _tap_increment: mov.w @tap_cnt,r0 inc.w #1,r0 mov.w r0,@tap_cnt mov.w #1550,r1 cmp.w r0,r1 bmi _over_1550msec rts _over_1550msec: mov.w #0,r0 mov.b r0l,@phase mov.w r0,@tap_cnt rts sw_scan: mov.b @p2dr,r0l xor.b #b'11111111,r0l and.b #b'01111111,r0l mov.b r0l,@sw_new ; R0L : current scanned SW [0-6] mov.b @sw_prev,r1l cmp.b r1l,r0l beq _not_chatter mov.b r0l,@sw_prev rts _not_chatter: mov.b r0l,r2h and.b #b'00000110,r2h cmp.b #b'00000110,r2h bne _not_reset jsr @reset_tempo rts _not_reset: mov.b @sw_old,r1l ; R1L : old status mov.b r1l,@old_buf cmp.b r1l,r0l bne _sw_event and.b #b'00000110,r0l ; tempo up/down pushing ? bne _pushing rts _pushing: jsr @pushing_check rts _sw_event: mov.b r0l,@sw_old mov.b r1l,r2l xor.b r0l,r2l ; R2L : event bits mov.b r2l,@eve_buf jsr @bit0_test jsr @bit1_test jsr @bit2_test jsr @bit3_test jsr @bit4_test jsr @bit5_test jsr @bit6_test rts bit0_test: mov.b @eve_buf,r2l btst #0,r2l bne event_bit0 rts event_bit0: mov.b @sw_new,r0l btst #0,r0l bne tap_on rts tap_on: mov.b @phase,r0l bne _tap_count mov.b #1,r0l mov.b r0l,@phase mov.w #0,r0 mov.w r0,@tap_cnt rts _tap_count: mov.w @tap_cnt,r1 ; R1 = tap interval (msec) mov.w #250,r2 cmp.w r1,r2 bmi _tap_ok mov.b #240,r2l bra _tap_tempo_set2 _tap_ok: mov.w #1500,r2 cmp.w r1,r2 bpl _tap_ok2 mov.b #40,r2l bra _tap_tempo_set2 _tap_ok2: mov.w #0,e0 mov.w #60000,r0 divxu.w r1,er0 ; 50000 / tempo --> R0 mov.b r0l,r3l _tap_tempo_set: mov.b @preset,r1l ; preset : 1-20 [not used 0] mov.w #0,e1 mov.b #0,r1h mov.b @(tempo,er1),r2l ; R2L : tempo of this preset (40-240) mov.b #0,r2h mov.b #0,r3h add.w r3,r2 shlr.w r2 _tap_tempo_set3: mov.b r2l,@(tempo,er1) ; R2L : tempo of this preset (40-240) mov.b #1,r0l mov.b r0l,@phase mov.w #0,r0 mov.w r0,@tap_cnt jsr @tempo_display rts _tap_tempo_set2: mov.b @preset,r1l ; preset : 1-20 [not used 0] mov.w #0,e1 mov.b #0,r1h bra _tap_tempo_set3 pushing_check: mov.b @old_buf,r0l and.b #b'00000010,r0l beq _push_down _push_up: mov.b @up_p,r1l inc.b r1l mov.b r1l,@up_p cmp.b #10,r1l beq _push_up_go rts _push_up_go: mov.b #0,r1l mov.b r1l,@up_p jsr @increment_tempo rts _push_down: mov.b @down_p,r1l inc.b r1l mov.b r1l,@down_p cmp.b #10,r1l beq _push_down_go rts _push_down_go: mov.b #0,r1l mov.b r1l,@down_p jsr @decrement_tempo rts bit1_test: mov.b @eve_buf,r2l btst #1,r2l bne event_bit1 rts event_bit1: mov.b @sw_new,r0l btst #1,r0l bne tempo_up rts tempo_up: jsr @increment_tempo rts bit2_test: mov.b @eve_buf,r2l btst #2,r2l bne event_bit2 rts event_bit2: mov.b @sw_new,r0l btst #2,r0l bne tempo_down rts tempo_down: jsr @decrement_tempo rts bit3_test: mov.b @eve_buf,r2l btst #3,r2l bne event_bit3 rts event_bit3: mov.b @sw_new,r0l btst #3,r0l bne preset_up rts preset_up: mov.b @preset,r0l inc.b r0l mov.b r0l,@preset cmp.b #21,r0l beq _to_01 jsr @preset_display jsr @tempo_display rts _to_01: mov.b #1,r0l mov.b r0l,@preset jsr @preset_display jsr @tempo_display rts bit4_test: mov.b @eve_buf,r2l btst #4,r2l bne event_bit4 rts event_bit4: mov.b @sw_new,r0l btst #4,r0l bne preset_down rts preset_down: mov.b @preset,r0l dec.b r0l mov.b r0l,@preset cmp.b #0,r0l beq _to_20 jsr @preset_display jsr @tempo_display rts _to_20: mov.b #20,r0l mov.b r0l,@preset jsr @preset_display jsr @tempo_display rts bit5_test: mov.b @eve_buf,r2l btst #5,r2l bne event_bit5 rts event_bit5: mov.b @sw_new,r0l btst #5,r0l bne continue_send rts continue_send: mov.b #251,r0h ; continue jsr @tx_fifo_set mov.b #1,r0l mov.b r0l,@status jsr @preset_display rts bit6_test: mov.b @eve_buf,r2l btst #6,r2l bne event_bit6 rts event_bit6: mov.b @sw_new,r0l btst #6,r0l bne startstop_send rts startstop_send: mov.b @status,r0l beq _to_start _to_stop: mov.b #252,r0h ; stop jsr @tx_fifo_set mov.b #0,r0l mov.b r0l,@status jsr @preset_display rts _to_start: mov.b #250,r0h ; start jsr @tx_fifo_set mov.b #1,r0l mov.b r0l,@status jsr @preset_display rts increment_tempo: mov.b @preset,r1l ; preset : 1-20 [not used 0] mov.w #0,e1 mov.b #0,r1h mov.b @(tempo,er1),r2l inc.b r2l cmp.b #241,r2l bne _led_run mov.b #40,r2l _led_run: mov.b r2l,@(tempo,er1) jsr @tempo_display rts decrement_tempo: mov.b @preset,r1l ; preset : 1-20 [not used 0] mov.w #0,e1 mov.b #0,r1h mov.b @(tempo,er1),r2l dec.b r2l cmp.b #39,r2l bne _led_run2 mov.b #240,r2l _led_run2: mov.b r2l,@(tempo,er1) jsr @tempo_display rts reset_tempo: mov.b @preset,r1l ; preset : 1-20 [not used 0] mov.w #0,e1 mov.b #0,r1h mov.b #120,r2l mov.b r2l,@(tempo,er1) jsr @tempo_display rts tempo_display: mov.b @preset,r1l ; preset : 1-20 [not used 0] mov.w #0,e1 mov.b #0,r1h mov.b @(tempo,er1),r2l ; R2L : tempo of this preset (40-240) mov.b #0,r2h mov.w #0,e0 mov.w #50000,r0 divxu.w r2,er0 ; 50000 / tempo --> R0 dec.w #1,r0 mov.w r0,@div_d mov.b r2l,r0l mov.b #40,r2h sub.b r2h,r0l ; R0L : offset for display (0-200) mov.b #0,r0h mov.w #0,e0 mov.l #tempo_1,er1 add.l er0,er1 mov.b @er1,r3h ; --> (tempo_1) --> r3h mov.b r3h,@padr nop mov.b #b'11111110,r3l mov.b r3l,@pbdr nop mov.b #b'11111111,r3l mov.b r3l,@pbdr mov.l #tempo_10,er1 add.l er0,er1 mov.b @er1,r3h ; --> (tempo_10) --> r3h mov.b r3h,@padr nop mov.b #b'11111101,r3l mov.b r3l,@pbdr nop mov.b #b'11111111,r3l mov.b r3l,@pbdr mov.l #tempo_100,er1 add.l er0,er1 mov.b @er1,r3h ; --> (tempo_100) --> r3h mov.b r3h,@padr nop mov.b #b'11111011,r3l mov.b r3l,@pbdr nop mov.b #b'11111111,r3l mov.b r3l,@pbdr rts preset_display: mov.b @status,r4h ; status display mask rotr.b r4h xor.b #b'01111111,r4h mov.b @preset,r0l ; preset : 1-20 [not used 0] mov.b #0,r0h mov.w #0,e0 mov.l #preset_1,er1 add.l er0,er1 mov.b @er1,r3h ; --> (preset_1) --> r3h and.b r4h,r3h mov.b r3h,@padr nop mov.b #b'11110111,r3l mov.b r3l,@pbdr nop mov.b #b'11111111,r3l mov.b r3l,@pbdr mov.l #preset_10,er1 add.l er0,er1 mov.b @er1,r3h ; --> (preset_10) --> r3h and.b r4h,r3h mov.b r3h,@padr nop mov.b #b'11101111,r3l mov.b r3l,@pbdr nop mov.b #b'11111111,r3l mov.b r3l,@pbdr 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 wait_500msec: mov.l #500,er1 _wait_1: jsr @wait_1msec sub.l #1,er1 bne _wait_1 rts wait_1msec: mov.l #2048,er5 _wait_2: sub.l #1,er5 bne _wait_2 rts int_timer0: push.w r0 mov.b #1,r0l mov.b r0l,@flag btst #0,@tsr0 bclr #0,@tsr0 ; Clear IMFA pop.w r0 rte .end