* * Ex6.asm ---- Example program 6 for the Ep2711E9 Rev.C board * (c)2003, EVBplus.com, Written by Wayne Chu * * Function: Plays a song via OC3 (PA5) * * The 68HC11 control register address is the offset address from the * register base address $1000, so index addressing mode can also be used, * otherwise only extended addressing mode can be used. * * ORG $c4 *** Vector jump table for BUFFALO monitor *** JSCI RMB 3 JSPI RMB 3 JPAIE RMB 3 JPAO RMB 3 JTOF RMB 3 JTOC5 RMB 3 JTOC4 RMB 3 JTOC3 RMB 3 JTOC2 RMB 3 JTOC1 RMB 3 JTIC3 RMB 3 JTIC2 RMB 3 JTIC1 RMB 3 JRTI RMB 3 JIRQ RMB 3 JXIRQ RMB 3 JSWI RMB 3 JILLOP RMB 3 JCOP RMB 3 JCLM RMB 3 * DB2 equ 4 DB3 equ 8 DB4 equ $10 DB5 equ $20 DB6 equ $40 NOTDB5 equ $DF NOTDB6 equ $BF OL4 equ DB2 OM4 equ DB3 OL3 equ DB4 OM3 equ DB5 toc2: equ $18 toc3: equ $1a tctl1: equ $20 tmsk1: equ $22 tflg1: equ $23 REGBLK: equ $1000 * TB5MS: equ 10000 ; time base of 10,000 instruction cycles * ; = 10,000 x 0.5us = 5ms at 8MHz F3500HZ: equ 351 ; 3.5KHz at 8MHz * org $00 spk_tone: rmb 2 sound_dur: rmb 1 xsound_save: rmb 2 sound_repeat: rmb 1 xsound_beg: rmb 2 sound_start: rmb 1 rest_note: rmb 1 * STACK: equ $8FFF * * org $D000 ; user program starts at $D000 jmp start * * to calculate note value by 1000000/freq for 8 MHz c0 equ 30578 ; 32.703 Hz at 8 MHz c0s equ 28862 ; 34.648 Hz at 8 MHz d0 equ 27242 ; 36.708 Hz at 8 MHz d0s equ 25714 ; 38.890 Hz at 8 MHz e0 equ 24270 ; 41.203 Hz at 8 MHz f0 equ 22908 ; 43.653 Hz at 8 MHz f0s equ 21622 ; 46.249 Hz at 8 MHz g0 equ 20409 ; 48.999 Hz at 8 MHz g0s equ 19263 ; 51.913 Hz at 8 MHz a0 equ 18182 ; 55.000 Hz at 8 MHz a0s equ 17161 ; 58.270 Hz at 8 MHz b0 equ 16198 ; 61.735 Hz at 8 MHz c1 equ 15289 ; 65.406 Hz at 8 MHz c1s equ 14431 ; 69.295 Hz at 8 MHz d1 equ 13621 ; 73.416 Hz at 8 MHz d1s equ 12857 ; 77.781 Hz at 8 MHz e1 equ 12135 ; 82.406 Hz at 8 MHz f1 equ 11454 ; 87.307 Hz at 8 MHz f1s equ 10811 ; 92.499 Hz at 8 MHz g1 equ 10204 ; 97.998 Hz at 8 MHz g1s equ 9632 ; 103.82 Hz at 8 MHz a1 equ 9091 ; 110.00 Hz at 8 MHz a1s equ 8581 ; 116.54 Hz at 8 MHz b1 equ 8099 ; 123.47 Hz at 8 MHz c2 equ 7645 ; 130.81 Hz at 8 MHz c2s equ 7216 ; 138.59 Hz at 8 MHz d2 equ 6811 ; 146.83 Hz at 8 MHz d2s equ 6428 ; 155.56 Hz at 8 MHz e2 equ 6068 ; 164.81 Hz at 8 MHz f2 equ 5727 ; 174.61 Hz at 8 MHz f2s equ 5406 ; 184.99 Hz at 8 MHz g2 equ 5102 ; 195.99 Hz at 8 MHz g2s equ 4816 ; 207.65 Hz at 8 MHz a2 equ 4545 ; 220.00 Hz at 8 MHz a2s equ 4290 ; 233.08 Hz at 8 MHz b2 equ 4050 ; 246.94 Hz at 8 MHz c3 equ 3822 ; 261.63 Hz at 8 MHz c3s equ 3608 ; 277.18 Hz at 8 MHz d3 equ 3405 ; 293.66 Hz at 8 MHz d3s equ 3214 ; 311.13 Hz at 8 MHz e3 equ 3034 ; 329.63 Hz at 8 MHz f3 equ 2863 ; 349.23 Hz at 8 MHz f3s equ 2703 ; 369.99 Hz at 8 MHz g3 equ 2551 ; 391.99 Hz at 8 MHz g3s equ 2408 ; 415.31 Hz at 8 MHz a3 equ 2273 ; 440.00 Hz at 8 MHz a3s equ 2145 ; 466.16 Hz at 8 MHz b3 equ 2025 ; 493.88 Hz at 8 MHz c4 equ 1911 ; 523.25 Hz at 8 MHz c4s equ 1804 ; 554.37 Hz at 8 MHz d4 equ 1703 ; 587.33 Hz at 8 MHz d4s equ 1607 ; 622.25 Hz at 8 MHz e4 equ 1517 ; 659.26 Hz at 8 MHz f4 equ 1432 ; 698.46 Hz at 8 MHz f4s equ 1351 ; 739.99 Hz at 8 MHz g4 equ 1276 ; 783.99 Hz at 8 MHz g4s equ 1204 ; 830.61 Hz at 8 MHz a4 equ 1136 ; 880.00 Hz at 8 MHz a4s equ 1073 ; 932.32 Hz at 8 MHz b4 equ 1012 ; 987.77 Hz at 8 MHz c5 equ 956 ; 1046.50 Hz at 8 MHz c5s equ 902 ; 1108.73 Hz at 8 MHz d5 equ 851 ; 1174.66 Hz at 8 MHz d5s equ 804 ; 1244.51 Hz at 8 MHz e5 equ 758 ; 1318.51 Hz at 8 MHz f5 equ 716 ; 1396.91 Hz at 8 MHz f5s equ 676 ; 1479.98 Hz at 8 MHz g5 equ 638 ; 1567.98 Hz at 8 MHz g5s equ 602 ; 1661.22 Hz at 8 MHz a5 equ 568 ; 1760.00 Hz at 8 MHz a5s equ 536 ; 1864.66 Hz at 8 MHz b5 equ 506 ; 1975.53 Hz at 8 MHz c6 equ 478 ; 2093.00 Hz at 8 MHz c6s equ 451 ; 2217.46 Hz at 8 MHz d6 equ 426 ; 2349.32 Hz at 8 MHz d6s equ 402 ; 2489.02 Hz at 8 MHz e6 equ 379 ; 2637.02 Hz at 8 MHz f6 equ 358 ; 2793.83 Hz at 8 MHz f6s equ 338 ; 2959.96 Hz at 8 MHz g6 equ 319 ; 3135.97 Hz at 8 MHz g6s equ 301 ; 3322.44 Hz at 8 MHz a6 equ 284 ; 3520.00 Hz at 8 MHz a6s equ 268 ; 3729.31 Hz at 8 MHz b6 equ 253 ; 3951.07 Hz at 8 MHz c7 equ 239 ; 4186.01 Hz at 8 MHz c7s equ 225 ; 4434.92 Hz at 8 MHz d7 equ 213 ; 4698.64 Hz at 8 MHz d7s equ 201 ; 4978.03 Hz at 8 MHz e7 equ 190 ; 5274.04 Hz at 8 MHz f7 equ 179 ; 5587.66 Hz at 8 MHz f7s equ 169 ; 5919.92 Hz at 8 MHz g7 equ 159 ; 6271.93 Hz at 8 MHz g7s equ 150 ; 6644.88 Hz at 8 MHz a7 equ 142 ; 7040.00 Hz at 8 MHz a7s equ 134 ; 7458.63 Hz at 8 MHz b7 equ 127 ; 7902.13 Hz at 8 MHz c8 equ 1 ; for rest note NOTE_TABLE: fdb c0,c0s,d0,d0s,e0,f0,f0s,g0,g0s,a0,a0s,b0 fdb 0,0,0,0 ; dummy byte fdb c1,c1s,d1,d1s,e1,f1,f1s,g1,g1s,a1,a1s,b1 fdb 0,0,0,0 ; dummy byte fdb c2,c2s,d2,d2s,e2,f2,f2s,g2,g2s,a2,a2s,b2 fdb 0,0,0,0 ; dummy byte fdb c3,c3s,d3,d3s,e3,f3,f3s,g3,g3s,a3,a3s,b3 fdb 0,0,0,0 ; dummy byte fdb c4,c4s,d4,d4s,e4,f4,f4s,g4,g4s,a4,a4s,b4 fdb 0,0,0,0 ; dummy byte fdb c5,c5s,d5,d5s,e5,f5,f5s,g5,g5s,a5,a5s,b5 fdb 0,0,0,0 ; dummy byte fdb c6,c6s,d6,d6s,e6,f6,f6s,g6,g6s,a6,a6s,b6 fdb 0,0,0,0 ; dummy byte fdb c7,c7s,d7,d7s,e7,f7,f7s,g7,g7s,a7,a7s,b7 fdb 0,0,0,0 ; dummy byte fdb c8 * note_c equ 0 note_cs equ 1 note_d equ 2 note_ds equ 3 note_e equ 4 note_f equ 5 note_fs equ 6 note_g equ 7 note_gs equ 8 note_a equ 9 note_as equ 10 note_b equ 11 * dur18= 1/8 note, dur14= 1/4 note, $fe= rest_note, $ff = end of song dur132 equ 12 dur116 equ 25 dur18 equ 50 dur14 equ 100 dur12 equ 200 start: lds #STACK ldx #REGBLK * ldx #F3500HZ ; 3.5KHz stx spk_tone * ldx #REGBLK ldaa #DB5+DB6 staa tmsk1,x cli jsr spk_on jsr start_sound ; start sound stp: jmp stp spk_on: pshx ldx #REGBLK bclr tctl1,x OM3 bset tctl1,x OL3 ; toggle speaker pulx rts spk_off: pshx ldx #REGBLK bset tctl1,x OM3 bclr tctl1,x OL3 ; turn off speaker pulx rts * tmr6oc2: ldaa sound_start beq tmr3 ldaa sound_dur ; duration deca staa sound_dur bne tmr3 ldx xsound_save repeat: ldab 0,x cmpb #255 beq sound_end ldaa 1,x cmpa #255 beq sound_end staa sound_dur inx inx stx xsound_save cmpb #$fe bne not_rest ldaa #1 staa rest_note jsr spk_off jmp tmr3 not_rest: clr rest_note jsr spk_on ldx #NOTE_TABLE aslb abx ldx 0,x stx spk_tone jmp tmr3 sound_end: ldaa sound_repeat beq no_rep ldx xsound_beg jmp repeat no_rep: ldx #F3500HZ ; 3.5KHz stx spk_tone jsr spk_off clr sound_start tmr3: ldx #REGBLK * in an interrupt servicing routine the x register will be saved automatically * the rti instruction will pop the x register off stack. ldd #TB5MS ; reload the count for 5 ms time base addd toc2,x std toc2,x bclr tflg1,x NOTDB6 rti * spk5oc3: ldx #REGBLK ldd spk_tone addd toc3,x std toc3,x bclr tflg1,x NOTDB5 rti * * start_sound: ldx #SONG stx xsound_beg ldaa #1 staa sound_repeat ldab 0,x ldaa 1,x staa sound_dur inx inx stx xsound_save ldx #NOTE_TABLE aslb abx ldx 0,x stx spk_tone ldaa #1 staa sound_start rts SONG: fcb $50+note_e,dur18 fcb $50+note_ds,dur18 fcb $50+note_e,dur18 fcb $50+note_ds,dur18 fcb $50+note_e,dur18 fcb $40+note_b,dur18 fcb $50+note_d,dur18 fcb $50+note_c,dur18 fcb $40+note_a,dur14 * fcb $fe,dur18 * fcb 255,255 fcb $30+note_e,dur18 fcb $30+note_a,dur18 fcb $40+note_c,dur18 fcb $40+note_e,dur18 fcb $40+note_a,dur18 fcb $40+note_b,dur14 fcb $30+note_gs,dur18 fcb $40+note_d,dur18 fcb $40+note_e,dur18 fcb $40+note_gs,dur18 fcb $40+note_b,dur18 fcb $50+note_c,dur14 fcb $30+note_e,dur18 fcb $30+note_a,dur18 fcb $40+note_e,dur18 fcb $fe,dur14 fcb 255,255 org JTOC3 ; BUFFALO RAM vector for OC3 jmp spk5oc3 ; jmp to OC3 service routine org JTOC2 ; BUFFALO RAM vector for OC2 jmp tmr6oc2 ; jmp to OC2 service routine end