README
4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
本ディレクトリは以下の4つのサブディレクトリから構成されています。
bank/ : playseq.disk用バンクファイルのディレクトリです。
lib/ : 本サンプルプログラムで使用しています追加オーディ
オ関数のディレクトリです。
seq/ : playseq.disk用シーケンスデータのディレクトリです。
tools/ : バンクファイル(.ctlファイル及び.tblファイル)を
64DD用に修正するパッチプログラムのディレクトリで
す。
また本ディレクトリには以下のファイルが含まれています。
README : 本ファイル
Makefile
playseq.c
playseq.h
seqdata.c
spec
wavedata.c
< playseq.disk >
(1) 目的
本プログラムは、64DDのディスクからRAMに転送された波形データと、64DD
内蔵ROM(DDROM)上の波形データとを、SGIオーディオライブラリで併用す
るためのサンプルです。
基本的な方針は64DDプログラミングマニュアル「9.2.4 SGIドライバ上での
使用に関する補足」に添っていますので、参照してください
(2) 説明
本サンプルプログラムでは、DMAコールバックルーチンの中で、注目波形デ
ータがRAM上にあるのかDDROM上にあるのかを識別し、そのデータに対し適
当な処理を行っています。このとき識別に用いる為のフラグは、サブディ
レクトリtools/内のサンプルアプリケーションdd_bankにより、各データの
アドレスに付加されます。
バンクファイル(.ctl)に記録されている波形データのアドレスの内、
DDROM内に存在する波形データのアドレスは、サンプルアプリケーション
dd_bankにより、その先頭4bitに0xfが付加されます。その結果修正された
バンクファイル(.ctl)の各波形データのアドレスは、その格納先により、
以下の2通りに分られます。
波形データの格納先 | 波形データのアドレス
---------------------------------------------
DDROM | 0xf???_????
---------------------------------------------
その他 | 0x0???_????
プログラム内で、この修正済みバンクファイル(.ctl)をディスクからRAM
に転送し、サブディレクトリlib/に用意してあります追加関数
dd_alBnkfNew()(alBnkfNew()に相当)に渡しますと、各波形データのアド
レスはさらに以下のように修正されます。
波形データの格納先 | 波形データのアドレス
---------------------------------------------
DDROM | 0xf???_????
---------------------------------------------
RAM | 0x8???_????
---------------------------------------------
その他 | 0x0???_????
DMAコールバックルーチン内では、シンセサイズドライバより渡された波形
データアドレスの先頭4bitからデータの格納先を識別し、その識別先に応
じた適当な処理を行います。
DMAコールバックルーチン内での具体的な処理の例を以下に示します。これ
は本サンプルプログラムのソースplayseq.c内で定義されているDMAコール
バックルーチンdmaCallBack()の一部です。
/* check address (device flag) */
tmp = addr & DDROM_FLAG;
/* When in DDROM */
if(tmp == DDROM_FLAG) {
/* When in 64DD internal ROM */
piHandle = driveromHandle;
addr &= 0x0fffffff;
} else {
/* When in RAM */
if(tmp)
return (osVirtualToPhysical((void *)addr));
/* When in CARTRIDGE ROM */
#ifdef FINAL
piHandle = cartromHandle;
#else
osSyncPrintf("Error : Data in CARTRIDGE ROM\n");
#endif
}
addrはシンセサイズドライバより渡される波形データのアドレスです。ま
たDDROM_FLAGはサブディレクトリlib/内のヘッダファイルdd_audio.hの中
で0xf000_0000と定義されています。
上記の様に、波形データの格納先によりその後の処理を違えています。波
形データがDDROM内に有るときは、DMAに用いるPIハンドラ(piHandle)に、
DDROM用に初期化された値(driveromHandle)を用います。またカートリッ
ジROM内に有るときはカートリッジROM用に初期化された値(cartromHandle)
を用います。この後実際の波形データのDMAを行います。
波形データがRAM上に有るときは、そのアドレスを返して処理を終わります。
(3) 注意
・本サンプルプログラムはUltra64開発環境2.0I付属のサンプルプログラム
playseqを"(1) 目的"に従って改造したものです。playseqからの改造点は、
(2)で示したDMAコールバックルーチン以外には、(大きなところで)64DD
の初期化及び64DDディスクからのデータの読み込み処理の追加です。これ
らの処理の詳細及び64DD関数の使用方法等については、64DDプログラミン
グマニュアル及び64DD開発環境2.0I付属のサンプルプログラムddspgameを
参照してください。
・本サンプルプログラムで使用しています.instファイルは例ですので、よ
り良い.instファイルを各自作成してください。
任天堂 開発3部