kanade.hの作成

メモ帳に以下の内容を書き、kanade.hという名前でcc65/includeに保存します。
/////////////////////////////////////////////////////////////////////////////////
// 2010.12.03 ver 0.01
// 煮るなり焼くなりお好きにどうぞ。
// -----------------------------------------------------------------------------
// cc65@wiki
// http://www34.atwiki.jp/cc65/
/////////////////////////////////////////////////////////////////////////////////
#define REGIST_SQ1_A   (unsigned char*)0x4000
#define REGIST_SQ1_B   (unsigned char*)0x4001
#define REGIST_SQ1_C   (unsigned char*)0x4002
#define REGIST_SQ1_D   (unsigned char*)0x4003
#define REGIST_SQ2_A   (unsigned char*)0x4004
#define REGIST_SQ2_B   (unsigned char*)0x4005
#define REGIST_SQ2_C   (unsigned char*)0x4006
#define REGIST_SQ2_D   (unsigned char*)0x4007
#define REGIST_TRI_A   (unsigned char*)0x4008
#define REGIST_TRI_B   (unsigned char*)0x400A
#define REGIST_TRI_C   (unsigned char*)0x400B
#define REGIST_NOISE_A (unsigned char*)0x400C
#define REGIST_NOISE_B (unsigned char*)0x400E
#define REGIST_NOISE_C (unsigned char*)0x400F
#define REGIST_DPCM_A  (unsigned char*)0x4010
#define REGIST_DPCM_B  (unsigned char*)0x4011
#define REGIST_DPCM_C  (unsigned char*)0x4012
#define REGIST_DPCM_D  (unsigned char*)0x4013
#define REGIST_CHANNEL (unsigned char*)0x4015
 
//矩形波設定
void SetSquare(unsigned char no,unsigned char flag1,unsigned char flag2)
{
    if (no == 0) {
        *REGIST_SQ1_A = flag1;
        *REGIST_SQ1_B = flag2;
    } else {
        *REGIST_SQ2_A = flag1;
        *REGIST_SQ2_B = flag2;
    }
}
 
//矩形波再生
void PlaySquare(unsigned char no,unsigned int val,unsigned char time)
{
    unsigned char hi,lo,tim;
 
    tim = time << 3;
    hi  = (val  >> 8) & 0x07;
    lo  = val & 0xff;
 
    if (no == 0) {
        *REGIST_SQ1_C = lo;
        *REGIST_SQ1_D = tim | hi;
    } else {
        *REGIST_SQ2_C = lo;
        *REGIST_SQ2_D = tim | hi;
    }
}
 
//三角波設定
void SetTriangle(unsigned char flag)
{
    *REGIST_TRI_A = flag;
}
 
//三角波再生
void PlayTriangle(unsigned int val,unsigned char time)
{
    unsigned char hi,lo,tim;
 
    tim = time << 3;
    hi  = (val  >> 8) & 0x07;
    lo  = val & 0xff;
    *REGIST_TRI_B = lo;
    *REGIST_TRI_C = tim | hi;
}
 
//ノイズ設定
void SetNoise(unsigned char flag)
{
    *REGIST_NOISE_A = flag;
}
 
//ノイズ再生
void PlayNoise(unsigned char flag,unsigned char time)
{
	*REGIST_NOISE_B = flag;
	*REGIST_NOISE_C = time << 3;
}
 
//PCM設定
void SetDpcm(unsigned char flag1,unsigned char flag2)
{
    *REGIST_DPCM_A = flag1;
    *REGIST_DPCM_B = flag2;
}
 
//PCM再生
void PlayDpcm(unsigned char flag1,unsigned char flag2)
{
    *REGIST_DPCM_C = flag1;
    *REGIST_DPCM_D = flag2;
}
 
//チャンネル設定
void SetChannel(unsigned char flag)
{
    *REGIST_CHANNEL = flag;
}
 

kanade.hの解説

  • SetSquare:矩形波の設定。
    • no:使用するチャンネル(0,1)
    • flag1:矩形波制御レジスタ1の設定。
      • bit7,6:Duty Cycle(00:87.5%, 01:75.0% 10:50.0%, 11:25.0%)
      • bit5:演奏時間カウンタ(0:オフ, 1:オン)
      • bit4:音響選択(0:音響可変, 1:音響固定)
      • bit3,0:ボリューム
    • flag2:矩形波制御レジスタ2の設定
      • bit7:周波数変化(0:固定, 1:可変)
      • bit6,4:周波数変化速度(データ値)
      • bit3:周波数の変化方法(0:増加, 1:減少)
      • bit2-0:周波数範囲値(データ値)
    • PlaySquare:短形波の演奏。
    • no:使用するチャンネル
    • time:演奏時間(0~31)
    • val:音色(1790000[CPUのクロック周波数] / ((音色[?hz=再生したい周波数、「ラ」なら440hz] * 32))
  • SetTriangle:三角波の設定。
    • flag:三角波制御レジスタの設定
      • bit7:演奏時間カウンタ(0:オフ, 1:オン)
      • bit6-0:長さ
  • PlayTriangle:三角波の演奏
    • time:演奏時間(0~31)
    • val:音色(多分 1790000[CPUのクロック周波数] / ((音色[?hz=再生したい周波数] * 64))
  • SetNoise:ノイズの設定。
    • flag:ノイズ制御レジスタの設定
      • bit5:演奏カウンタ(0:オフ, 1:オン)
      • bit4:音響(0:音響可変, 1:音響固定)
      • bit3-0:ボリューム
  • PlayNoise:ノイズの演奏
    • flag:ノイズ乱数レジスタ
      • bit7:乱数のタイプ
      • bit3-0:サンプルレート
    • time:演奏時間(0~31)
  • SetDpcm:PCMの設定
    • flag1:DPCM制御レジスタ1の設定
      • bit3-0:サンプルレートビット数
      • bit7-0:ボリューム
    • flag2:DPCM制御レジスタ2の設定
  • PlayDpcm:PCMの演奏
    • flag1:DPCM制御レジスタ3の設定
      • bit7-0:テーブルアドレス
    • flag2:DPCM制御レジスタ4の設定
      • bit7-0:テーブルバイトサイズ
  • SetChannel:チャンネル設定
    • flag:音声チャンネル制御レジスタの設定
      • bit4:DPCMチャンネル(0:オフ, 1:オン)
      • bit3:ノイズチャンネル(0:オフ, 1:オン)
      • bit2:三角波チャンネル(0:オフ, 1:オン)
      • bit1:矩形波2チャンネル(0:オフ, 1:オン)
      • bit0:矩形波1チャンネル(0:オフ, 1:オン)