電子オルゴール(新バージョン)

回路:AT90S1200に10MHz発振子をつけ,PB0とGNDに圧電ブザーを接続する.
旧バージョンを修正し,10MHzの外部発振を使い,音符も変えられるようにしました.
プログラムではタイマ/カウンタ割り込みを使ってPB0のon,offを行います.タイマ/カウンタ0(TCNT0)がオーバフローすると割り込みが発生するので,TCNT0の初期値を変えれば音の高さが変わります.割り込みが発生するとPB0のビットが反転します.音の高さはRCALLのラベルで指定し,音の長さはA5(R20)で設定するようにしたので,旧バージョンに比べプログラムがシンプルになりました.
音の高さを決めた計算式は以下のとおりです.

f=523.25*2^(n/12)
TCNT0=256-10^7/128/f
(タイマ/カウンタはTCCR0の設定により,1/64の分周になっています.128で割る意味は,1/64の分周とon,offの2回の割り込みで1周期ということです.)

サンプル1(アルプス一万尺)

;music for 10MHz
.DEF    A1      =R16    
.DEF    A2      =R17    
.DEF    A3      =R18    
.DEF    A4      =R19
.DEF    A5      =R20
.DEF    CNT1    =R21
.DEF    CNT2    =R22
.DEF    CNT3    =R23
.EQU    SREG    =0x3F   
.EQU    TCNT0   =0x32   
.EQU    TCCR0   =0x33   
.EQU    DDRB    =0x17   
.EQU    PORTB   =0x18   
.EQU    TIMSK   =0x39
        RJMP    RESET
        RETI
        RJMP    T_INT
        RETI
RESET:  SBI     DDRB,0          ;PORTB Output
        LDI     A1,0x03         ;1/64(100)
        OUT     TCCR0,A1
        LDI     A1,0x02         ;
        OUT     TIMSK,A1
        SEI
BEGIN:
        LDI     A5,50
        RCALL   G
        RCALL   G
        RCALL   A
        RCALL   H
        RCALL   G
        RCALL   H
        RCALL   A
        RCALL   D
        RCALL   G
        RCALL   G
        RCALL   A
        RCALL   H
        LDI     A5,100
        RCALL   G
        LDI     A5,50
        RCALL   FP
        RCALL   D
;2
        RCALL   G
        RCALL   G
        RCALL   A
        RCALL   H
        RCALL   CC
        RCALL   H
        RCALL   A
        RCALL   G
        RCALL   FP
        RCALL   D
        RCALL   E
        RCALL   FP
        LDI     A5,100
        RCALL   G
        LDI     A5,50
        RCALL   G
        RCALL   NOS
;3
        LDI     A5,75
        RCALL   E
        LDI     A5,25
        RCALL   FP
        LDI     A5,50
        RCALL   E
        RCALL   D
        RCALL   E
        RCALL   FP
        LDI     A5,100
        RCALL   G
        LDI     A5,75
        RCALL   D
        LDI     A5,25
        RCALL   E
        LDI     A5,50
        RCALL   D
        RCALL   C
        RCALL   CM
        RCALL   C
        RCALL   D
        RCALL   NOS
        LDI     A5,75
        RCALL   E
        LDI     A5,25
        RCALL   FP
        LDI     A5,50
        RCALL   E
        RCALL   D
        RCALL   E
        RCALL   FP
        RCALL   G
        RCALL   E
        RCALL   D
        RCALL   G
        RCALL   FP
        RCALL   A
        LDI     A5,150
        RCALL   G
        LDI     A5,50
        RCALL   NOS
        RJMP    BEGIN

T_INT:  IN      A3,SREG
        SBRS    A4,0
        RJMP    ON
OFF:    CLR     A4
        CBI     PORTB,0
        RJMP    P1
ON:     SER     A4
        SBI     PORTB,0
P1:     OUT     TCNT0,A2        
        OUT     SREG,A3
        RETI

NOS:    CLI
RJMP    L1      
CM:     LDI     A2,98
        OUT     TCNT0,A2
RJMP    L1      
C:      LDI     A2,107
        OUT     TCNT0,A2
RJMP    L1      
CP:     LDI     A2,115
        OUT     TCNT0,A2
RJMP    L1      
D:      LDI     A2,123
        OUT     TCNT0,A2
RJMP    L1      
DP:     LDI     A2,130
        OUT     TCNT0,A2
RJMP    L1      
E:      LDI     A2,137
        OUT     TCNT0,A2
RJMP    L1      
F:      LDI     A2,144
        OUT     TCNT0,A2
RJMP    L1      
FP:     LDI     A2,150
        OUT     TCNT0,A2
RJMP    L1      
G:      LDI     A2,156
        OUT     TCNT0,A2
RJMP    L1      
GP:     LDI     A2,162
        OUT     TCNT0,A2
RJMP    L1      
A:      LDI     A2,167
        OUT     TCNT0,A2
RJMP    L1      
AP:     LDI     A2,172
        OUT     TCNT0,A2
RJMP    L1      
H:      LDI     A2,177
        OUT     TCNT0,A2
RJMP    L1      
CC:     LDI     A2,181
        OUT     TCNT0,A2
RJMP    L1      
L1:     MOV     CNT1,A5
LOOP1:  LDI     CNT2,150
LOOP2:  LDI     CNT3,100
LOOP3:  NOP
        NOP
        DEC     CNT3
        BRNE    LOOP3
        DEC     CNT2
        BRNE    LOOP2
        DEC     CNT1
        BRNE    LOOP1
        CLI
        MOV     CNT1,A5
L2:     LDI     CNT2,100
L3:     NOP
        NOP
        DEC     CNT2
        BRNE    L3
        DEC     CNT1
        BRNE    L2
        SEI
        RET

サンプル2(四季の歌)

;music for 10MHz
.DEF    A1      =R16    
.DEF    A2      =R17    
.DEF    A3      =R18    
.DEF    A4      =R19
.DEF    A5      =R20
.DEF    CNT1    =R21
.DEF    CNT2    =R22
.DEF    CNT3    =R23
.EQU    SREG    =0x3F   
.EQU    TCNT0   =0x32   
.EQU    TCCR0   =0x33   
.EQU    DDRB    =0x17   
.EQU    PORTB   =0x18   
.EQU    TIMSK   =0x39
        RJMP    RESET
        RETI
        RJMP    T_INT
        RETI
RESET:  SBI     DDRB,0          ;PORTB Output
        LDI     A1,0x03         ;1/64(100)
        OUT     TCCR0,A1
        LDI     A1,0x02         ;
        OUT     TIMSK,A1
        SEI
BEGIN:
        LDI     A5,100
        RCALL   H
        LDI     A5,50
        RCALL   H
        RCALL   A
        RCALL   G
        RCALL   A
        RCALL   G
        RCALL   FP
        LDI     A5,100
        RCALL   E
        RCALL   E
        LDI     A5,200
        RCALL   E
        LDI     A5,100
        RCALL   CC
        LDI     A5,50
        RCALL   CC
        RCALL   H
        RCALL   A
        RCALL   G
        RCALL   A
        RCALL   CC
        LDI     A5,250
        RCALL   H
        LDI     A5,150
        RCALL   NOS
;2
        LDI     A5,100
        RCALL   CC
        LDI     A5,50
        RCALL   CC
        RCALL   H
        LDI     A5,100

        RCALL   A
        LDI     A5,50

        RCALL   A
        RCALL   CC
        LDI     A5,100
        RCALL   H
        LDI     A5,50
        RCALL   H
        RCALL   G
        LDI     A5,200
        RCALL   E
        LDI     A5,100
        RCALL   FP
        RCALL   H
        LDI     A5,50
        RCALL   A
        RCALL   G
        RCALL   FP
        RCALL   G
        LDI     A5,250
        RCALL   E
        LDI     A5,150
        RCALL   NOS

        RJMP    BEGIN

T_INT:  IN      A3,SREG
        SBRS    A4,0
        RJMP    ON
OFF:    CLR     A4
        CBI     PORTB,0
        RJMP    P1
ON:     SER     A4
        SBI     PORTB,0
P1:     OUT     TCNT0,A2        
        OUT     SREG,A3
        RETI

NOS:    CLI
RJMP    L1      
CM:     LDI     A2,98
        OUT     TCNT0,A2
RJMP    L1      
C:      LDI     A2,107
        OUT     TCNT0,A2
RJMP    L1      
CP:     LDI     A2,115
        OUT     TCNT0,A2
RJMP    L1      
D:      LDI     A2,123
        OUT     TCNT0,A2
RJMP    L1      
DP:     LDI     A2,130
        OUT     TCNT0,A2
RJMP    L1      
E:      LDI     A2,137
        OUT     TCNT0,A2
RJMP    L1      
F:      LDI     A2,144
        OUT     TCNT0,A2
RJMP    L1      
FP:     LDI     A2,150
        OUT     TCNT0,A2
RJMP    L1      
G:      LDI     A2,156
        OUT     TCNT0,A2
RJMP    L1      
GP:     LDI     A2,162
        OUT     TCNT0,A2
RJMP    L1      
A:      LDI     A2,167
        OUT     TCNT0,A2
RJMP    L1      
AP:     LDI     A2,172
        OUT     TCNT0,A2
RJMP    L1      
H:      LDI     A2,177
        OUT     TCNT0,A2
RJMP    L1      
CC:     LDI     A2,181
        OUT     TCNT0,A2
RJMP    L1      
L1:     MOV     CNT1,A5
LOOP1:  LDI     CNT2,150
LOOP2:  LDI     CNT3,100
LOOP3:  NOP
        NOP
        DEC     CNT3
        BRNE    LOOP3
        DEC     CNT2
        BRNE    LOOP2
        DEC     CNT1
        BRNE    LOOP1
        CLI
        MOV     CNT1,A5
L2:     LDI     CNT2,100
L3:     NOP
        NOP
        DEC     CNT2
        BRNE    L3
        DEC     CNT1
        BRNE    L2
        SEI
        RET