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 ; 書き込みデータ
NP EQU 0x10
;**********************************************************************
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 ; 音量の設定
LOOP movlw B'00011111'
movwf NP
call NOISE
call TIMTIM
call TIMTIM
call TIMTIM
call TIMTIM
movlw B'00000001'
movwf NP
call NOISE
call TIMTIM
call TIMTIM
call TIMTIM
movlw B'00011111'
movwf NP
call NOISE
call TIMTIM
call TIMTIM
movlw B'00011111'
movwf NP
call NOISE
call TIMTIM
movlw B'00011111'
movwf NP
call NOISE
call TIMTIM
call TIMTIM
movlw B'00000001'
movwf NP
call NOISE
call TIMTIM
call TIMTIM
call TIMTIM
call TIMTIM
goto LOOP
MIXVOL movlw B'00110111' ; $07(ミキサーの設定)
movwf ADR
movlw B'00110111' ; 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
return
NOISE movlw B'00000110' ; $06(ノイズ周波数の設定)
movwf ADR
movf NP, w ; 下位5bitが周波数
movwf DAT
call SUB1
movlw B'00001101' ; $0D(エンベロープの形状)
movwf ADR
movlw B'00000000' ; 減衰
movwf DAT
call SUB1 ; カウントはじめ
return
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 0x066
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