GB(DMGSystem)仕様書


■■ DMGシステム概要
DMGシステムは DMG用に設計された LCDコントローラー内臓のCPUを中心
に 構成されています。

システムは
・階調表示可能な ドットマトリクスLCD ユニット
・電源用 DC-DC コンバータ
・サウンド用 アンプ
・64Kbit-SRAM×2(LCD表示用、ワーク用)
・操作キー
・スピーカー
などが実装されています。


■ DMGメモリー構成
DMGではプログラムエリアとして0~7FFFh番地までの32Kバイトが用意さ
れています。
000~0FFh番地:RST命令の飛び先番号や、割り込みのスタート番地が割り
付けられています。
100~14Fh番地:ゲーム名などを収納するエリアとして割り付けられています。
150h番地:ユーザーのプログラムスタート番地として割り付けられています。
800~9FFFh番地:LCD表示用RAMを実装しています。
RAM領域は 2つのエリアに 区分されています。

1)キャラクターデータ収納エリア
2)背景画面表データ収納エリア

A000~BFFFh番地までの8Kバイトは外部拡張RAM領域となっています。
C000~DFFFh番地までの8Kバイトのワーク用RAMを実装しています。
FE00~FFFFh番地にはDMGC内部RAMが割り付けられています。
FE00~FE9Fh番地:OAM-RAM(40OBJ分の表示データを収納)
FF00~FF50h番地&FFFFh番地:LCDC、サウンド、タイマー などの
 命令レジスター、フラグなどに指定されています。
FF80~FFFEh番地:CPUのワークRAM、スタック用RAMとして使用し
ます。(原則としてスタック用として使用します。)
FF51~FF7Fh、F200h、FDFFh番地は使用禁止領域になっています。


■■ DMGメモリーマップ
0000 ---------------------
   割り込み番地
   RST番地
0100 ---------------------
   GBヘッダ
0150 ---------------------
   ユーザーエリア
8000 ---------------------
   キャラデータ
9800 ---------------------
   背景画面表示データ
9C00 ---------------------
   背景画面表示データ
A000 ---------------------
   外部ワークRAM
C000 ---------------------
   ワークRAM
E000 ---------------------
   未使用
FE00 ---------------------
   OAM-RAM
FEA0 ---------------------
   未使用
FF00 ---------------------
   ポートレジスタ
   LCDCコントロール
   サウンドコントロール
FF80 ---------------------
   ワーク&スタック
FFFE ---------------------
   割り込み用レジスタ
FFFF ---------------------


■■ DMG-CPU 機能概要
DMG-CPUは次の3つの機能を持つ DMG専用カスタムICです。

■ CPU機能
8ビットCPUを基本にI/Oポート、タイマーなどを 装備しています。
・127×8ビットRAM内臓(ワーク&スタック用)
・8192バイトRAM外部拡張可(LCD表示用)
(プログラム用&ワーク用)(*1)
・32768バイトROM&RAM(プログラム用&ワーク用)
・20480バイトROM&RAM(プログラム用&ワーク用)(*4)
・16段分周器 内臓
・8ビット タイマー 内臓
・入力ポート P10~P13装備(*2)
・出力ポート P14~P15装備(*3)
・シリアル入出力ポート SIN、SCK、SOUT装備
・内部割り込み 4種類(マスク可)装備
・外部割り込み 1種類(マスク可)装備
・DMAコントローラー内臓(外部ROM又は 外部SRAM→OBJ-RAM)

*1      DMGシステムでは 実装
*2*3    DMGシステムでは キーマトリクスを 実装
*4      DMGシステムでは 内 8Kバイトを 実装


■ LCDコントローラー機能
LCD上に 画像を表示し 制御する機能を装備しています。
表示する キャラクターデータは システム上のRAMに持ちます。

・160×144ドット液晶表示可能
・4階調表示
・背景、ウィンドウ、キャラクター 8×8ドット構成
・OBJキャラクター 8×8 又は 8×16ドット 構成
・1画面中 最大40OBJ 表示可
・1水平ライン上に 最大10OBJ表示可
・40×28ビットRAM内臓(LCD表示用 OBJ-RAM) 
・背景画面 256×256ドット 制御可能
・ウィンドウ機能


■ サウンド機能
サウンド合成回路を 4系統装備しています。

・サウンド1 短系波 スィープ、エンベローブ機能
・サウンド2 短系波 エンベローブ機能
・サウンド3 任意波形 発生
・サウンド4 ホワイトノイズ 発生
・出力 2チャンネル 装備 (出力の振り分け可)
・外部サウンド入力との 合成出力

■ その他
・DMGCは 内部に モニタープログラムを内蔵しています。
電源投入時 又は リセット時には 内部のモニタープログラムが 先ず実行されポート
などの 初期設定を行った後 ユーザープログラム側に 制御を移します。
・命令サイクル0.954μs(基本クロック4.194304MHz)


■ CPU機能
・割り込み
マスク可能な内部割り込み4種類
マスク可能な外部割り込み1種類が有ります。

IEフラグ(割り込み許可)により 割り込みの 制御をおこないます。
IFフラグ(割り込み要求)により 割り込みが 要求されたかを 知る事が出来ます。

割り込みには 次の5種類が あります。
・LCD表示 垂直ブランク
・LCDCからのステータス割り込み(4種類のモードがあります。)
・タイマーのオーバーフロー時
・シリアル転送終了時
・ポートP10~P13の 入力信号の立ち下がり


■ DMA転送
DMA転送はDMAレジスターにより コントロールされます。

RAMエリア(800~F19FH)から OAM(FE00~FE9FH)への40
×28ビットのDMA転送を する事ができます。
転送のスタート番号は8000~F100番地までの100H番地毎に指定出来ます。
転送のスタート番地は 8000~F100番地までの100H番地毎に指定出来ます。


■ タイマー
タイマーは
TIMA(タイマーカウンター)
TMA(タイマーモジュローレジスター)
TAC(タイマーコントロールレジスター)により 構成されています。


■ コントローラーの接続
P10~P13:入力ポート
P14~P15:出力ポートにより キーマトリクスが 構成されています。


■ スタンバイモード
スタンバイ機能として システムクロックを 停止する HALTモードと発振(原発振)
を停止するSTOPモードの2種類のモードがあります。

・HALTモード
HALT命令を 実行するとHALTモードに移行します。
HALTモードでは システムクロックが停止しCPU動作を停止します。
ただしCK1端子とCK2端子間の 原発振回路は動作を続けます。従ってシステム
クロックを必要としない機能(DIV、SIO、タイマー、LCDコントローラー、
サウンド回路など)は動作します。

HALTモードは次の要因により解除され それぞれ 下記の番地からスタートします。
1)/RESET端子へのLOW信号
スタート番地:0000番地
2)割り込みフラグとそれに対する 割り込み要求フラグがセットされた場合
IME=0(割り込みマスターイネーブルフラグが不許可の場合)
スタート番地:HALT命令の次のアドレス
IME=1(割り込みマスターイネーブルフラグが許可の場合)
スタート番地:各割り込みスターとアドレス

・STOPモード
STOP命令を実行すると STOPモードに 遷移します。
STOPモードでは システムクロック及びCK1端子とCK2端子間の原発振回路も
停止します。
従ってSIOの外部クロック動作以外は全て停止します。

STOPモードは次の要因により 解除されそれぞれ 下記の番地からスタートします。
1)/RESET端子へのLOW信号
スタート番地:0000番地
2)P1O~P13端子 いずれかへのLOW信号
スタート番地:STOP命令の 次のアドレス

STOPモードが解除されると 原発振クロックの 2^17倍後にシステムクロックが供
給されCPUが動作します。

なおSTOPモードに入る場合 割り込み許可フラグを全てリセットした後P10~P13
端子が全てHIGHの期間にSTOP命令を実行して下さい。



■■ CPU制御用レジスター
DMG-CPUは制御用レジスターにデータを設定することにより、色々な機能が動
作します。

■ ポートレジスター
・P1(FF00h)

Bit 7 - 使用してません
Bit 6 - 使用してません
Bit 5 - P15 出力ポート
Bit 4 - P14 出力ポート
Bit 3 - P13 入力ポート
Bit 2 - P12 入力ポート
Bit 1 - P11 入力ポート
Bit 0 - P10 入力ポート

ポートP1はシステムの操作キー読み込み用にマトリックス接続されています。

           P14                P15
            |                  |
--P10-------O-Right------------O-A---------
            |                  |
--P11-------O-Left-------------O-B---------
            |                  |
--P12-------O-Up---------------O-Select----
            |                  |
--P13-------O-Down-------------O-Start-----
            |                  |

入力はすべてHighにプルアップされています。

・P13~P10の端子のいずれかの 立ち上がり入力により 割り込み要求フラグ
(IF:4)がセットされます。 立ち上がり入力はLOWの期間が原振の2^4倍
以上必要です。
・但しP13~P10端子のいずれかがLOWの状態で/RESET端子へリセット
信号を入力した場合も 割り込み要求フラグ(IF:4)がセットされます。


■ デバイダーレジスター
・DIV(FF04h)

Bit 7 - 64Hz
Bit 6 - 128Hz
Bit 5 - 256Hz
Bit 4 - 512Hz
Bit 3 - 1024Hz
Bit 2 - 2048Hz
Bit 1 - 4096Hz
Bit 0 - 8192Hz

基本クロックfをカウントする16ビットカウンターの上位8ビットが参照出来ます。
LD命令を実行すると 書き込む値に関係なく0クリアーされます。
f=4.194304MHz


■ タイマーレジスター

・TIMA(FF05h)
 タイマー本体。オーバーフロー時に割り込みを発生します。

・TMA(FF06h)
 TIMAがオーバーフローした時に、この値がロードされます。

・TAC(FF07h)

Bit 7 - 使用してません
Bit 6 - 使用してません
Bit 5 - 使用してません
Bit 4 - 使用してません
Bit 3 - 使用してません
Bit 2 - タイマーコントロール(0:ストップ、1:スタート)
Bit 1 - 入力クロック選択(上位)
Bit 0 - 入力クロック選択(下位)

入力クロック選択
00:f/2^10(4.096KMz)
01:f/2^4(262.144KHz)
10:f/2^6(65.536KHz)
11:f/2^8(16.384KMz)

タイマーはTIMA、TAM、TACにより構成されています。

TACによりタイマーの入力クロックの選択を行います。

TIMAがタイマー本体でTACにより選択されたクロックで作動します。

TMAはTIMAのモジュローレジスタで
TIMAがオーバーフローした時TMAのデータがTIMAにロードされます。

TACの2ビット目に1を書き込むとタイマーは動作を開始します。

タイマーのスタート(TACのスタートフラグセット)は家運とアップパルスを選択
した後に行って下さい。
選択前 又は 同時にタイマーをスタートさせるとカウントパルス選択時に余分なカウ
ントアップ動作をする事があります。

例      LD      A,3     ;F/2^8をカウントパルスとして選択
        LD      (07),A  ;TAC←3セット
        LD      A,7     ;タイマースタート
        LD      (07),A  ;

タイマーのオーバーフローによってTIMAへモジュローレジスターTMAの内容が
転送される同じタイミングでTMAへ書き込み命令が実行されるとTIMAにも同じ
書き込みデータが転送される。


■ 割り込みフラグ
・IF(FF0Fh)

Bit 7 - 使用してません
Bit 6 - 使用してません
Bit 5 - 使用してません
Bit 4 - P10~P13端子立ち上がり
Bit 3 - シリアルI/O転送終了
Bit 2 - タイマーオーバーフロー
Bit 1 - LCDC(STAT参照)
Bit 0 - 垂直ブランク(Vsync)

・IE(FFFFh)

Bit 7 - 使用してません
Bit 6 - 使用してません
Bit 5 - 使用してません
Bit 4 - P10~P13端子立ち上がり
Bit 3 - シリアルI/O転送終了
Bit 2 - タイマーオーバーフロー
Bit 1 - LCDC(STAT参照)
Bit 0 - 垂直ブランク(Vsync)

0:不許可、1:許可

・IME
割り込みマスターイネーブル
0:DI命令により リセットされ全ての割り込みを禁止します。
1:EI命令により セットされIEレジスターでセットされている割り込みが許可さ
れます。

IEフラグ(割り込み許可)により、割り込みの制御をおこないます。
IFフラグ(割り込み要求)により 、どの割り込みが要求されたかを知る事が出来ま
す。

割り込みには 次の5種類があります。(割り込み原因:割り込みスタート番地)

垂直ブランク(Vsync)   :0040h
LCDCステータス割り込み   :0048h
タイマーオーバーフロー     :0050h
シリアル転送終了        :0058h
P10~P13入力信号立ち下がり:0060h

同時に複数個の割り込みが起こった場合はそれぞれに対するIEフラグは全てリセッ
トされますが割り込み動作に入るのは優先順位の高いものに対してのみで優先順位の
低い割り込みは保留されます。

割り込みを使用する時IEレジスターをセットする前にIFレジスターに0をセット
します。

・割り込み動作手順

1)割り込みが発生すると対応するIFフラグがセットされます。
2)割り込み許可状態
IMEフラグ(割り込みマスターイネーブル)がセットされ対応するIEフラグがセ
ットされている状態であれば次の手順で割り込み動作が行われます。
3)IMEフラグをリセットし全ての割り込みを禁止します。
4)PC(プログラムカウンター)の内容をスタックRAMに退避します。
5)割り込み要因となった割り込みスタート番地へジャンプします。

割り込みの要因となったIFレジスターのリセットはハードで行われます。

割り込み処理中のレジスターの退避は割り込み処理ルーチン無いのプログラムで行い
ます。

割り込み処理に入ると全ての割り込みは禁止されますが 命令でIMEフラグとIE
フラグを制御する事で次の割り込み処理が可能となります。

割り込み処理ルーチンからの復帰はRETI命令RET命令により行われます。

RETI命令で復帰した場合割り込み処理ルーチン内でDI命令を実行してもIME
フラグは自動的にセットされます。

RET命令で復帰した場合割り込みルーチン内でEI命令を実行しなければIME
フラグはリセットされたままとなります。

IFレジスターの各割り込み要求フラグは命令で個々にテストする事が可能です。

割り込みは各命令のOPコードフェッチサイクル時に受け付けられます。



■■ LCDコントローラー機能
■ キャラクター構成

・キャラクターの基本サイズは8×8ドット構成です。

・キャラクターが基本サイズの場合
OBJ専用キャラクターとして128種類
BG専用キャラクターとして128種類
OBJ,BG共用キャラクターとして128種類のキャラクターを登録出来ます。

・キャラクターは4階調(透明を含む)で描く事が出来ます。

・OBJキャラクターのみ基本サイズを8×16ドット構成に切り換える事がができ
ます。但しこの場合キャラクターコードは偶数コードのみ指定可能となります。奇数
コードを指定しても偶数コードと同じ表示となります。

・OBJキャラクターは1画面中最大40個まで表示可能です。
又1水平ライン上には10個まで表示可能です。

・OBJキャラクターの表示データは
Y座標
X座標
キャラクターコード
アトリビュート(表示優先 上下反転 左右反転 パレット切り換え)の順で
OAM(表示用RAM:FE00~FE9F番地)に収納されます。

・OAMにデータを書き込み時はワークRAMからDMA転送します。

・OAMに書き込まれたデータによりOBJキャラクターは自動的に画面に表示され
ます。

・OBJキャラクターのデータ指定範囲

00≦キャラクターのコード≦FFH
00≦X≦FFH
00≦Y≦FFH


■ OBJキャラクターの表示優先について

・OBJキャラクターが重くなった時にはY座標の値に関係なく
1)X座標の値が小さい方が上側に表示されます。
2)X座標が同じ値の時はOAMアドレスの大きい方が上側に表示されます。


■ キャラクターRAM

・キャラクターデータは8000番地から97FF番地までの6144バイト分書い
ておけます。

・OBJキャラクターデータの格納エリアは8000番地から8FFF番地に割り当
てられています。

・BG及びウィンドウのキャラクターデータの格納エリアは
8000番地~8FFF番地 又は
8800番地~97FF番地のいずれか2ヶ所をLCDCレジスターにより選択出来ます。

・BGキャラクターデータが8000~8FFF番地に割り当てられた場合はOBJと
同じエリアとなりCHRコードに対応するキャラクタードットも同じになります。


■ 背景画面(BG)表示
BG表示データとして外部SRAM9800番地又は9C00番地からキャラクター
コードを32×32個分(256×256ドット分)設定出来ます。
その内20×18部分(160×144ドット分)がLCD画面に表示されます。

スクロールレジスターSCY SCYの値を変える事によりドット単位で縦方向又は
横方向に画面をスクロールする事が出来ます。


■ 背景画面RAM
背景データ9800Hから9BFFHに割り当てられた場合の画面データの対応。

RAMアドレス  ブロックNo.
9800H         0
9801H         1
9802H         2
  |      |
9BFDH      1021
9BFEH      1022
9BFFH      1023



■ ウィンドウ表示

・WX及びWYレジスターでLCD画面上の位置を指定するとウィンドウがその位置
から右下方向に開きます。

・ウィンドウの表示データも外部SRAM9800番地又は9C00番地からキャラ
クターコードを設定します。

・OBJキャラクターはウィンドウ内でもBG画面と同様に表示されます。


■ LCD表示用レジスター

・LCDC(FF40h)

Bit 7 - LCDC動作
    0:完全停止、1:動作
Bit 6 - ウィンドウ画面表示データ選択
    0:9800~9BFFh、1:9C00~9FFFh
Bit 5 - ウィンドウ表示
    0:OFF、1:ON
Bit 4 - BGキャラデータ選択
    0:8800~97FFh、1:8000~8FFFh
Bit 3 - BG表示データ選択
    0:9800~9BFFh、1:9C00~9FFFh
Bit 2 - OBJ構成
    0:8×8、1:8×16
Bit 1 - OBJ表示
    0:OFF、1:ON
Bit 0 - BG表示
    0:OFF、1:ON

LCDコントロール動作を完全停止(ビット7←0)するのはV-ブランク中に行い
ます。
V-ブランクの確認が出来ない時はLYレジスターが145以上の時に行います。


・STAT(FF41h)

Bit 7 - 使用してません
Bit 6 - LYC=LY 一致選択
Bit 5 - モード10選択
Bit 4 - モード01選択
Bit 3 - モード00選択
Bit 2 - 一致フラグ
    0:LYC<>LY、1:LYC=LY
Bit 1 - モードフラグ
Bit 0 - モードフラグ

STATはLCDコントローラーが現在どの状態であるかを示します。

モード00:このフラグが1の時は H-ブランクに相当する期間でありCPUが表示
RAM(アドレス8000~9FFFH)をアクセス可能です。
フラグが0の時は、LCDコントローラーが表示RAMを使用中です。

モード01:このフラグが1の時は V-ブランク期間でありCPUが表示RAM
(アドレス8000~9FFFH)をアクセス可能です。(約1ms)

モード10:このフラグが1の時は LCDコントローラーがOAM(FE00~FE
90H)を使用中。CPUはOAMをアクセス出来ません。

モード11:このフラグが1の時は LCDコントローラーがOAM(FE00~FE
90H)及び表示RAM(アドレス8000~9FFFH)を使用中。CPUはOAMと
表示RAMをアクセス出来ません。

又LCDコントローラーからの4種類の割り込みの内1つを選択出来ます。
一致フラグに書き込み命令を実行すると一致フラグはリセットされますがモードフラグ
側は変化しません。


・SCY(FF42h)
・SCX(FF43h)
 ここの値を変える事により、BG画面が縦もしくは横方向にビット単位でスクロー
ルします。

・LY(FF44h)
 LYは、LCDドライバーへ転送しているデータが現在どのラインのデータかを示
します。
 LYは0~153の値を取りその内144~153が垂直ブランキングの期間とな
ります。
 LCDCレジスターのビット7が1の時 再度ビット7に1を書き込んでもLYレジ
スターの値は変化しません。
 LCDCレジスターのビット7が1の時 ビット7に0を書き込むとLCDコントロ
ーラーの動作は停止し この時点でLYレジスターの値は”0”となります。(注:画
面表示中は書き込まないで下さい。)

・LYC(FF45h)
LYCはLYと比較されるレジスターでLYと一致するとSTATレジスターの一致
フラグがセットされます。

・BGP(FF47h)
 BG用パレットデータです。
・OBP0(FF48h)
・OBP1(FF49h)
 どちらもOBJ用パレットデータです。

キャラクタードットデータの階調(2ビット)はパレットデータ(BG側:BGPレジ
スターOBJ側:OBP0又はOBP)により変換され4種類(透明を含む)の濃淡
データとしてLCDドライバーに出力されます。

・WY(FF4Ah)
 0≦WY≦143。WY=0の時、LCD画面上端からウィンドが表示されます。

・WX(FF4Bh)
 7≦WX≦166。WX=7の時 LCD画面 左端からウィンドウが表示されます。
 WX=0~6は 指定しないで下さい。
 OBJキャラクターがウィンド内も BG側と同様に表示されます。


■ DMAレジスター
・DMA(FF46h)

 外ROM 又はRAMエリア(0000~F19FH)からOAM(FE00~FE
9FH)への40×28ビットのDMA転送を行うことが出来ます。転送時間は16
0μsです。

 転送のスタート番地は0~F100番地までの100H番地毎に指定出来ます。

 8000~9FFFH番地(表示用RAMエリア)とそれ以外の番地からの転送は
方法が異なりますので注意して下さい。

例1:
拡張RAMエリア(C000~C09FH)からOAM(FE00~FE9FH)へ
の40×28ビットのDMA転送は下記のように行います。

DMAの動作中はCPUを内部RAMエリア(FF80~FFFEH)で走らせ外部
でバスの衝突を防ぎます。

1)内部RAM(FF80~FFFE)に下記の命令をプログラムで書き込みます。

番地    マシンコード    ラベル  命令    コメント
FF80    3E C0                   LD      A,0C0H
        E0 46                   LD      (DMA),A ;C000~C09F→OAM
        3E 28                   LD      A,40            ;160サイクルウエイ
ト
        3D              L1:     DEC     A
        20 FD                   JR      NZ,L1
        C9                      RET

2)上記命令を内部RAMのFF80番地からに書き込むプログラム例

ラベル          命令
                LD      C,80
                LD      B,10
                LD      HL,DMADATA
L2:             LD      A,(HLI)
                LD      (C),A
                INC     C
                DEC     B
                JR      NZ,L2
                .
                .
                .
DMADATA         DB      3EH,0C0H,0E0H,46H,3EH
                DB      28H,3DH,20H.0FDH,0C9H

3)DMA転送を行う時は内部RAMに書かれた上記 1) のサブルーチンを実行し
ます。

CALL    0FF80H  ;DMA転送実行

注意)V-ブランキングによる割り込み処理ルーチン内でDMA転送を行う場合は先
のプログラムを用いますがそれ以外の場合は内部RAMに書き込むプログラムを下記
のようにし転送中に割り込みがかかって来ないようにします。

番地    マシンコード    ラベル  命令    コメント
FF80    F3                      D1                      ;割り込み禁止
        3E C0                   LD      A,0C0H
        E0 46                   LD      (DMA),A ;C000~C09F→OAM
        3E 28                   LD      A,40            ;160サイクルウエイ
ト
        3D              L1:     DEC     A
        20 FD                   JR      NZ,L1
        FB                      E1                      ;割り込み禁止
        C9                      RET


例2:
表示用RAMエリア(9F00~9F9FH)からOAM(FE00~FE9FH)
への40×28ビットのDMA転送は下記のように行います。

マシーンコード  ラベル  命令    コメント
3E 9F                   LD      A,9FH
E0 46                   LD      (DMA),A ;9F00~9F9F→OAM

8000~9F9FH番地からOAMへのDMA転送は 例1の方法でも転送出来ます
が上記の命令だけでも実行出来ます。


■■ サウンド機能
サウンド回路はサウンド1からサウンド4までの4種類のサウンドを発生する回路から
構成されています。又外部からの音声入力波等を合成することも出来ます。

サウンド1:スイープやエンベローブ機能付きの矩形波を発生させます。
サウンド2:エンベローブ機能付きの矩形波を発生させます。
サウンド3:波形RAMからの任意波形を出力します。
サウンド4:エンベローブ機能付きのホワイトノイズが発生します。

各サウンドにはONモードとOFFモードの2種類のモードがあります。

■ ONモード
各サウンドモードレジスターに設定されているデータによりそれぞれのサウンドが出
力されています。モードレジスターのデータはサウンドを出力しながら随時設定する
ことが出来ます。

・イニシャルフラグ
エンベローブの初期値設定 長さカウンターの再スタートを行う時にはイニシャルフラ
グに1をセットしデータの初期化をおこないます。

・無音
次の時ONフラグとは関係なくサウンドが出力されない無音の状態になります。

サウンド1、2、4において
エンベローブの初期値が0000以外でDOWNモードの時の出力レベルが0になっ
た時エンベローブの初期設定が0000でUPモード、ステップ0の場合。
(NR12、NR22,NR42←08Hセット、イニシャルフラグ)

サウンド3において
出力フラグを無音に設定した時
(NR32の5、6ビット←0セット)

・ストップ状態
次の時ONフラグがリセットされサウンド出力を停止します。
長さカウンターによるサウンド出力停止の場合。
サウンド1においてすいー部動作中 加算モードでオーバーフローが生じた時。

■ OFFモード
周波数カウンター及びD/Aコンバーターの動作を停止しサウンド出力を止めます。

・サウンド1、2、4においてエンベローブDOWNモードで初期レベルを0000
にした時。(イニシャライズ不要)

サウンド3において
サウンドOFFフラグ(NR30の7ビット)に0をセットした時。
OFFモードの解除はサウンドOFFフラグに1をセットします。
更にイニシャライズする場合によりサウンド3がスタートします。

・全サウンドOFFモード
全サウンドON/OFFフラグ(NR52の7ビット)に0をセットするとサウンド1、
2、3、4の全てのモードレジスターをリセットしサウンド出力をとめます。
全サウンドOFFモードの解除は全サウンドON/OFFフラグに1をセットします。

(注意)各サウンドモードレジスターの設定は必ずサウンドモードOFFモードを解
除してから行って下さい。
全てサウンドOFFモード中は各サウンドモードレジスターを設定出来ません。


■ サウンド使用上の注意
・サウンド1・2・4において、サウンドを止める場合には、NR51を使用して下
さい。


■■ サウンド制御用レジスター
■ サウンド1モードレジスター

サウンド1はスイープやエンベローブ機能付きの矩形波を発生する回路でNR10,
NR11,NR12,NR13,NR14レジスターで設定します。

・スイープシフト数
一回シフトした場合の周波数(NR13,NR14)は次のしきで求めます。

X(t)=X(t-1)±X(t-1)/2n n=0~7
X(0)=初期データX(t-1)は前回出力した周波数

この式の加算において 11ビット以上の値になった場合音出力派すトップしNR52
のサウンド1 NOフラグ(0ビット目)がリセットされます。
又減算において減数が0未満の値になった場合は演算前の値となりX(t)=X(t-1)となり
ます。但し n=0の時はシフトされず周波数は変化しません。

・スイープ時間ts
ts時間毎に周波数が変化します。
0000:スイープOFF
001:ts=1/f128(7.8ms)
010:ts=2/f128(15.6ms)
011:ts=3/f128(23.4ms)
100:ts=4/f128(31.3ms)
101:ts=5/f128(39.1ms)
110:ts=6/f128(46.9ms)
111:ts=7/f128(54.7ms)   f128=128Hz

例      NR10=79H,周波数初期データ=400Hの時スイープ波形は次のよ
うになります。

注)スイープ機能を使用しない時は増減フラグを”1”(減算モード)にセットして
下さい。


・NR11(FF11h)
・NR12(FF12h)

エンベロープステップ数
エンベロープの横幅 又は減衰する時の1段階の長さを設定します。
1段階の長さ=N×(1/64)sec
N=0の時エンベロープ機能は止まります。

エンベロープ初期値(0000~1111B)
4ビットD/A回路により16段階のレベルを指定出来ます。
1111Bの時最大で0000の時無音になります。


・NR13(FF13)
・NR14(FF14)

カウンター/連続 選択
0:NR11レジスターの長さデータに無関係に連続して音を出力します。
1:NR11レジスターの長さデータで指定される時間だけ音を出力します。
音を出力し終わるとNR52レジスターの0ビット目のサウンド1 NOフラグがリセ
ットされます。

イニシャル
このビットに1をセットすると サウンド1が再スタートします。

NR13及びNR14で設定される11ビットの周波数データをXとすると出力され
る周波数fは次の式により求められます。
f=4194304/(4×23×(2048-X))Hz
従って 最低周波数は64Hzとなります。
最高周波数は131.1KHzとなります。


■ サウンド1使用上の注意
・サウンド1においてスイープ機能を使用しない時はスイープ時間を0(スイープO
FF)にセットしスイープ増減フラグを1にセットするかスイープシフト数を0にセ
ットして下さい。
(NR10に04H~07H 又は00Hをセットして下さい。)

・NR10のスイープ増減フラグを0(加算モード) スイープシフト数を 0意外に
セットしスイープOFFモード(例えばNR10=01H)にすると音が出なくなる
場合もあります。

・サウンドが動作中(ONフラグが1)にエンベロープレジスター(NR12)の内
容を変更する場合はエンベロープレジスターに値をセットしてからイニシャルフラグ
をセットして下さい。


■ サウンド2 モードレジスター
サウンド2はエンベロープ機能付きの矩形波を発生する回路でNR21,NR22,
NR23,NR24レジスターで設定します。

・NR21(FF16h)
 音の長さデータを入れます。

・NR22(FF17h)
 エンベロープの設定を行います。

・NR23(FF18h)
 周波数の下位データが入ります。

・NR24(FF19h)
 周波数の上位データが入ります。
 カウンター/連続 選択
 0:NR21レジスターの長さデータに無関係に連続して音を出力します。
 1:NR21レジスターの長さデータで指定される時間だけ音を出力します。
 音を出力し終わるとNR52レジスターの1ビット目のサウンド2ONフラグがリ
セットされます。
 イニシャルビットに1をセットすると サウンド2が再スタートします。

■ サウンド2 使用上の注意
・サウンドが動作中(ONフラグが1)にエンベロープレジスター(NR22)の内
容を変更する場合はエンベロープレジスターに値をセットしてからイニシャルフラグ
をセットして下さい。


■ サウンド3モードレジスター
サウンド3は任意波形を発生する回路でアドレスFF30~FF3FHの波形RAM
に書いてある波形パターン(1周期分)を自動的に読み出し 長さ 周波数 及びレベル
をNR30,NR31,NR32,NR33,NR34レジスターにより変化させな
がら出力する事が出来ます。

音の長さ,周波数の機能 及びデータの設定等はサウンド1回路と同様です。

・NR30(FF1Ah)
 最上位1ビットで、サウンド出力を指定します。0:OFF、1:ON

・NR31(FF1Bh)
 音の長さ指定。(256-t1)×(1/256)sec。

・NR32(FF1Ch)
 出力レベルの選択をします。
 00:無音
 01:波形RAMデータ(4ビット長)をそのまま出力します。
 10:波形RAMデータ(4ビット長)を1ビット右シフト(1/2)した内容を
出力します。
 11:波形RAMデータ(4ビット長)を2ヒット右シフト(1/4)した内容を
出力します。

・NR33(FF1Dh)
 周波数の下位データです。

・NR34(FF1Eh)
 周波数の上位データです。
 カウンター/連続 選択
 0:NR31レジスターの長さデータに無関係に連続した音を出力します。
 1:NR31レジスターの長さデータで指定されている時間だけ音を出力します。
音を出力し終わるとNR52レジスターの2ビット目のサウンド3ONフラグがリセ
ットされます。
 イニシャルフラグ:サウンドOFFフラグ(NR30,ビット7)が1の時このビ
ットに1をセットするとサウンド3が再スタートします。

■ サウンド3使用上の注意

・サウンド3を出力中に周波数を変更する場合は イニシャルフラグはセットしないで
下さい。
サウンド3動作中(サウンド3の ONフラグ=1)、イニシャルフラグをセットする
と波形RAMの内容が壊れる恐れがあります。

・サウンド1、サウンド2 及びサウンド4の場合はイニシャルフラグをセットしても
問題はありません。

■ 波形RAMの構成
波形RAMは4ビット×32ステップの波形パターンで構成されています。


■ サウンド4 モードレジスター
サウンド4は、ホワイトノイズ発生回路で周波数,乱数発生用ポリノミアルカウンタ
ーの段数 切り換え 分周比 及び エンぺロープのデータをNR41、NR42,NR
43,NR44のレジスターにより変化させながら出力する事が出来ます。

・NR41(FF20h)
 音の長さデータ t1(0~63)

・NR42(FF21h)
 エンベロープの指定です。

・NR43(FF22h)
 分周比周波選択を行います。
ポリノミアルカウンターのシフトクロックを作る14段のプリスケーラーの入力クロ
ックを選択します。
000:f×1/23×2
001:f×1/23×1
010:f×1/23×1/2
011:f×1/23×1/3
100:f×1/23×1/4
101:f×1/23×1/5
110:f×1/23×1/6
111:f×1/23×1/7       f=4.194304MHz

ポリノミアルカウンターの段数選択
0:15段
1:7段

ポリノミアルカウンターのシフトクロック周波数選択
0000:分周比周波数×1/2
0001:分周比周波数×1/2^2
0010:分周比周波数×1/2^3
0011:分周比周波数×1/2^4

1101:分周比周波数×1/2^14
1110:禁止コード
1111:禁止コード

・NR44(FF23h)
 最上位ビットがイニシャル、第6ビットがカウンターになります。
 カウンター/連続 選択
 0:NR41レジスターの長さデータに無関係に連続して音を出力します。
 1:NR41レジスターの長さデータで指定される時間だけ音を出力します。
 音を出力し終わるとNR52レジスターの3ビット目のサウンド4ONフラグがリ
セットされます。
 イニシャルビットに1をセットするとサウンド4を再スタートします。

■ サウンド4使用上の注意

・サウンドが動作中(ONフラグが1)にエンぺロープレジスター(NR22)の内
容を変更する場合はエンぺロープレジスターに値をセットしてからイニシャルフラグ
をセットして下さい。


■ サウンドコントロールレジスター

・NR50(FF24h)
Bit 7 - Vin>SO2 ON/OFF
Bit 6~4 - SO2出力レベル
Bit 3 - Vin>SO1 ON/OFF
Bit 2~0 - SO1出力レベル

出力レベル
000:最小レベル(最大レベル÷8)
111:最大レベル

Vin→SO1  (Vin→SO2)
Vin端子からの音声入力をサウンド1~サウンド4の音と合成して出力します。
0:出力しない。
1:出力する。

・NR51(FF25h)
 各ビットでステレオ選択。下位4ビットがSO1、上位4ビットがSO2。

・NR52(FF26h)
 最上位ビットですべてのサウンドをON/OFF指定する。
 下位4ビットで、サウンド1~4それぞれのON/OFF指定する。


■■ モニターROMについて
・DMGのCPUは内部にモニターROMを持っています。
電源をON時にモニターROMはゲームカセット内にある”Nintendo”のロ
ゴキャラクターの正誤を確認します。

正しければ”Nintendo”のロゴを表示した後ユーザープログラムを起動しま
す。
誤っておれば画面フラッシュを繰り返します。

・ユーザープログラムのスタートの条件は下記の通りです。

スタートアドレス        150H(初期値)      スタートアドレスは102H,
103H番にジャンプ先番地を書き込む事により自由に設定出来ます。
LCDCの値            91H
スタック値              FFFEH

■ ゲームカセットの仕様
・ゲームカセットに於いてROMアドレス100H~14FH間は以下に示す内容で
その登録を行って下さい。

・登録エリア
100h : nop
       jp 0150h
104h - 133h : Nintendo ロゴ
134h - 143h : タイトル登録エリア
147h : カセットタイプ
148h : ROMサイズ
149h : RAMサイズ
14Ah - 14Bh : メーカーコード
14Ch : バージョン番号
14Dh : 補数チェック
14Eh - 14Fh : サムチェック


・”Nintendo”キャラクターデータエリア
”Nintendo”キャラクターデータを登録するエリアです。
このデータがなかったり違っているとゲームプログラムが走りません。

次のデータをカートリッジの100番地から書いておいて下さい。

ORG     $100
DEFB    $00,$C3,$50,$01
DEFB    $CE,$ED,$66,$66
DEFB    $CC,$0D,$00,$0B
DEFB    $03,$73,$00,$83
DEFB    $00,$0C,$00,$0D
DEFB    $00,$08,$11,$1F
DEFB    $88,$89,$00,$0E
DEFB    $DC,$CC,$6E,$E6
DEFB    $DD,$DD,$D9,$99
DEFB    $BB,$BB,$67,$63
DEFB    $6E,$0E,$EC,$CC
DEFB    $DD,$DC,$99,$9F
DEFB    $BB,$B9,$33,$3E

・カートリッジタイプ
カートリッジの種類をコードで登録します。

・ROMサイズ
プログラムROMのサイズを登録します。

・RAMサイズ
RAMのサイズを登録します。

・メーカーコード
 各メーカーのコードが入ります。

・バージョンナンバー
 ソフトの内部バージョン番号です。

・タイトル登録エリア
ゲームカートリッジのタイトルを登録します。
(アスキーコードによる登録、00コード又は16文字まで)

・補数チェック
全ての登録が完了後 134H~14CHのデータの総和に25を加えた値の補数を登
録する。
(134H)+(135H)+………(14CH)+25+(14DH)=0

・サムチェック
このエリア(14EH~14FH)を除くプログラムROMのサムチェックの値を登
録する。

■■ プログラム上の 注意事項
■ レジスターペア使用上の注意

レジスターペアBC,DE,HL使った命令の内

INC     SS      ;SS:BC,DE,HL
DEC     SS      ;SS:BC,DE,HL

LD      A,(HLI)
LD      A,(HLD)

などを使用される時には それら れ儀スターペアの値が

FE00H~FE9EH にならない様に注意してください。

OAM RAMが壊れる事があります。