Skip to content

Instantly share code, notes, and snippets.

@ha2zakura

ha2zakura/main.asm

Created Feb 6, 2018
Embed
What would you like to do?
16F84A+YMZ294(きらきら星、エンベロープ)
; きらきら星(エンベロープ)
; ha2zakura
list p=16F84A ; 使用するPICの種類の定義
#include <p16F84A.inc> ; 設定ファイルの指定
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
; _CP_OFF プログラムコードプロテクト無効
; _WDT_OFF ウォッチドドック・タイマ無効
; _PWRTE_ON パワーアップタイム有効
; _HS_OSC 外部クロック(4MHz-20MHz)
;***** 定数の定義 **
TIM1 EQU 0x0C ; タイマー用
TIM2 EQU 0x0D ; タイマー用
ADR EQU 0x0E ; 書き込みアドレス
DAT EQU 0x0F ; 書き込みデータ
TP4 EQU 0x10 ; TP上位4bit
TP8 EQU 0x11 ; TP下位8bit
; 大文字:上位4bit, 小文字:下位8bit
TPC3 EQU B'0001'
TPc3 EQU B'11011001'
TPD3 EQU B'0001'
TPd3 EQU B'10100101'
TPE3 EQU B'0001'
TPe3 EQU B'01111011'
TPF3 EQU B'0001'
TPf3 EQU B'01100011'
TPG3 EQU B'0001'
TPg3 EQU B'00111100'
TPA4 EQU B'0001'
TPa4 EQU B'00011100'
TPB4 EQU B'0000'
TPb4 EQU B'11111101'
TPC4 EQU B'0000'
TPc4 EQU B'11101101'
;**********************************************************************
ORG 0x000 ; リセット
BSF STATUS, RP0
CLRF TRISA ; 0 : 出力, 1 : 入力
CLRF TRISB ; bit0 -> RA0(RB0)
BCF STATUS, RP0
call TIMTIM ; YMZ294が起動するまで待つ
call TIMTIM
call TIMTIM
call TIMTIM
call TIMTIM
call TIMTIM
goto MAIN ; MAINへ移動
;**********************************************************************
; メイン
MAIN call MIXVOL ; 音量の設定
call AMEL
call BMEL
call AMEL
LOOP goto LOOP
AMEL call C3
call TIMTIM
call TIMTIM
call C3
call TIMTIM
call TIMTIM
call G3
call TIMTIM
call TIMTIM
call G3
call TIMTIM
call TIMTIM
call A4
call TIMTIM
call TIMTIM
call A4
call TIMTIM
call TIMTIM
call G3
call TIMTIM
call TIMTIM
call TIMTIM
call TIMTIM
call F3
call TIMTIM
call TIMTIM
call F3
call TIMTIM
call TIMTIM
call E3
call TIMTIM
call TIMTIM
call E3
call TIMTIM
call TIMTIM
call D3
call TIMTIM
call TIMTIM
call D3
call TIMTIM
call TIMTIM
call C3
call TIMTIM
call TIMTIM
call TIMTIM
call TIMTIM
return
BMEL call G3
call TIMTIM
call TIMTIM
call G3
call TIMTIM
call TIMTIM
call F3
call TIMTIM
call TIMTIM
call F3
call TIMTIM
call TIMTIM
call E3
call TIMTIM
call TIMTIM
call E3
call TIMTIM
call TIMTIM
call D3
call TIMTIM
call TIMTIM
call TIMTIM
call TIMTIM
call G3
call TIMTIM
call TIMTIM
call G3
call TIMTIM
call TIMTIM
call F3
call TIMTIM
call TIMTIM
call F3
call TIMTIM
call TIMTIM
call E3
call TIMTIM
call TIMTIM
call E3
call TIMTIM
call TIMTIM
call D3
call TIMTIM
call TIMTIM
call TIMTIM
call TIMTIM
return
MIXVOL movlw B'00000111' ; $07(ミキサーの設定)
movwf ADR
movlw B'00111110' ; C B A C B A
movwf DAT ; ノイズ トーン
call SUB1 ; 0 = 出力
movlw B'00001000' ; $08(チャンネルAの音量)
movwf ADR
movlw B'00010000' ; 下位4bitが音量
movwf DAT
call SUB1
movlw B'00001100' ; $0C(エンベロープの周波数)
movwf ADR
movlw B'00011110' ; EPの上位8bit
movwf DAT
call SUB1
movlw B'00001011' ; $0B(エンベロープの周波数)
movwf ADR
movlw B'10000100' ; EPの下位8bit
movwf DAT
call SUB1
TONE movlw B'00000001' ; $01(チャンネルAの周波数)
movwf ADR
movf TP4 ,w ; TPの上位4bit
movwf DAT
call SUB1
movlw B'00000000' ; $00(チャンネルAの周波数)
movwf ADR
movf TP8 ,w ; TPの下位8bit
movwf DAT
call SUB1
movlw B'00001101' ; $0D(エンベロープの形状)
movwf ADR
movlw B'00000000' ; 減衰
movwf DAT
call SUB1 ; カウントはじめ
return
C3 movlw TPC3
movwf TP4
movlw TPc3
movwf TP8
call TONE
return
D3 movlw TPD3
movwf TP4
movlw TPd3
movwf TP8
call TONE
return
E3 movlw TPE3
movwf TP4
movlw TPe3
movwf TP8
call TONE
return
F3 movlw TPF3
movwf TP4
movlw TPf3
movwf TP8
call TONE
return
G3 movlw TPG3
movwf TP4
movlw TPg3
movwf TP8
call TONE
return
A4 movlw TPA4
movwf TP4
movlw TPa4
movwf TP8
call TONE
return
B4 movlw TPB4
movwf TP4
movlw TPb4
movwf TP8
call TONE
return
C4 movlw TPC4
movwf TP4
movlw TPc4
movwf TP8
call TONE
return
; 書き込み ; WR CS AC Data
SUB1 movlw B'00001000' ; 0 0 0
movwf PORTA
movf ADR, W ; 0 0 0 ADR
movwf PORTB
movlw B'00001011' ; 1 1 0
movwf PORTA ; ADRを書き込む
movlw B'00001100' ; 0 0 1
movwf PORTA
movf DAT, W ; 0 0 1 DAT
movwf PORTB
movlw B'00001111' ; 1 1 1
movwf PORTA ; DATを書き込む
return
; タイマー
TIM movlw 0x0FF
movwf TIM1
TIMLP nop
decfsz TIM1, F
goto TIMLP
return
TIMTIM movlw 0x099
movwf TIM2
TIMLP2 call TIM
decfsz TIM2, F
goto TIMLP2
return
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment