ラベル $Nintendo FC の投稿を表示しています。 すべての投稿を表示
ラベル $Nintendo FC の投稿を表示しています。 すべての投稿を表示

1985年2月26日火曜日

[機器][TVゲーム] 任天堂ファミコンディスクシステム













2013/3/2
「ファミコン ディスクシステム RAMアダプタ 回路図」  ファミコン
(改訂 2013/03/02)
ファミコン ディスクシステムのRAMアダプタについて回路図を起こしてみた。以前、途中まで書いてRP2C33のピンアサインが分からず放置していたもの。写真1,2はHVC-023 RAMアダプタのオモテ面外観。初期のものはシボ(表面処理)がない。後になってキズが付きやすいためか、シボ付きに変更されている。なお、左上にラベルで示してある形番は、中に入っていた基板の形番。
 初期のもの :基板 HVC-FMR-01 RP2C33 搭載
 中期?のもの:基板 HVC-FMR-04 RP2C33A 搭載
HVC-FMR-03もあるらしいが所有しておらず。
こちらによるとHVC-FMR-03まではRP2C33,DRAM4つ搭載の構成だったようです。
HVC-023 初期のRAMアダプタ オモテ
基板はHVC-FMR-01
初期のRAMアダプタは筐体表面に皺(シボ)加工が入っていないので表面に傷つきまくり
HVC-023 初期のRAMアダプタ オモテ
基板はHVC-FMR-04
HVC-FMR-01
・HVC-FMR-01,HVC-FMR-04回路図 Rev.05(PDF)
○Rev.05での変更点
2013年03月01日 回路図Rev.05
・EXT-PORT(P3) 9番ピン 音声を出力に修正
(SuperTurbo さんの情報提供・指摘により修正。ありがとうございました。)
・4069UB(U5)の未使用ピンNC表示追加
○Rev.04での変更点
・Rev.03での修正をDISK DRIVE CONNECTORに反映していなかったのでピン番号を変更
・EXT7/BATT信号のバス接続先が間違っていたので修正
・「VCC +5V」を「+5V」に修正
・「CLOCK」が「CLICK」になっていたので修正
・「PHI2」が意味のないところに記載されていたので削除
・図面タイトルに「HVC-FMR-04」が抜けていたので追加
なお、RP2C33、LH2833-15ピンアサインの情報はこちらを参照。
KEYWORD:ファミリーコンピュータ ファミコン ディスクシステム HVC-023 HVC-FMR-01 HVC-FMR-04 回路図 FC CIRCUIT SCHEMATIC DISK SYSTEM RP2C33 RP2C33A LH2833-15

子機器 Junker
https://green.ap.teacup.com/applet/junker/116/trackback













[機器][TVゲーム] 任天堂ファミコンディスクシステム
ファミコンディスクシステム
RAMアダプタに8KByteのROM(カスタムに内蔵)
32KByteのRAM($6000-$DFFF)、8KByteのキャラクタRAMのメモリを載せて
クィックディスク(QD)ドライブ込みで15、000円はかなり安い。
またドライブは通信アダプタの底面にあるコネクタ(ロットによっては無くなっている)でも接続可能
■RAM、拡張ポートテスト
スタートキーとセレクトーキーを押しながらリセットすると実行されます
このときにメインRAM$6000-$DFFFのチェック
次にPPU$0000-$1FFFをCPURAM$C000-$DFFFに転送してチェックを行います
エラーがあればOKと表示される所にエラーが出たアドレスが表示されます
$0000-$1FFFPPUのアドレス
$6000-$DFFFCPUのアドレス
拡張ポートのテストは左からBit0-Bit7の並びになっていて
$4026で拡張ポートにデータを書き込み、$4033で拡張ポートのデータを読み込みます
Cf=0にして$FFと左ローテイトで1つだけビットを0にして他は1にしてポートのチェックを行います
ただしBit7のBATTRY_SENCEはモータを起動していない為0(電圧NG)になります
■ROMの種類
RAMアダプタ内のROMはファミリーコンピュータ用の旧、新バージョンの2つ
ツインファミコンのデモでNintendoと出るのとFamicomとでるタイプの2つの計4つがあります
ROMのバージョンの判定方法はIコントローラのスタートキーとセレクトーキーを押しながらリセットすると、
RAM、拡張ポートテスト画面になりますが、そのテスト画面になる前に
Iコントローラの右とAを押すとメッセージがでます。
このときDEV2があれば新バージョン、数字が出ないのは旧バージョンになります
ツインファミコンの方は両方ともDEV2なので起動画面が違うだけのようです
■ROMバージョンの違いによる不都合
若干ROMエントリのアドレスが変っていますので、そこの部分をコールされると動かない可能性がでます
しかし実際に純正ソフトでは使わないようになっているようで実際問題での不都合はありません
非ライセンスソフトのDISKHACKERVer1.0では
FCBのブロックに$FFがあると新バージョンではエラーがでます(旧バージョンはそのままコピーが出来ます)
バックアップ活用研究のDISKCOPYでは
RAMアダプタのバージョンに合わせてアドレス変更して対応しています
NMI割り込み$E18B
ワークエリアの$0100のBit7-6(NMIコード)を見てジャンプするようになっています。
NMIコード
$00=RAMアダプタ用$E18B
$40=ゲーム用0JMP($DFF6)
$80=ゲーム用1JMP($DFF8)
$C0=ゲーム用2JMP($DFFA)
IRQ割り込み$E1C7
ディスクアクセスに使用
ワークエリアの$0101のBit7-6を見てジャンプします
IRQコード
$00=ディスクロード・スキップの終了
$01~$3F=ディスクロード・スキップnnバイト(nn=$01~$3F)
*$40=ディスク1バイト転送
読み込みの場合A、Xにデータが読み込まれる
書き込みの場合Aにデータをセットする
$80=ディスクステータスを読む
$C0=JMP($DFFE)
*$40だけPC-下位、PC-上位、PSRを空読みしてRTSを実行($E7A3の割り込みトラップから戻る為)
リセット割り込み$EE24
電源を入れるとオートリセットが掛かるので電源を入れるかリセットを押すとココにジャンプします
まずPPUの設定、その他のポートの設定、スタックの設定を行います
次にNMIコードを$C0、IRQコードを$80をセットします
リセットコードがあり使用アドレスは$0102-$0103のリセットコードによって動作が変わります
1.$0102が$35以外RAMアダプタのデモへ行きます。
2.$0102が$35、$0103が$53ならスクロールセット。JMP($DFFC)
3.$0102が$35、$0103が$ACなら$53にセット、スクロールセットしてJMP($DFFC)
4.$0102が$35、$0103が$53、$ACでなければRAMアダプタのデモ
電源を入れると本体RAMの内容が不確定なので$0102と$0103の内容が
特定のデータかチェックして一番最初の起動の判断を行います
次にリセットしたときにRAMアダプタの起動かゲームの再起動が任意に出来ます。
$0102、$0103のデータがリセットコード以外の値(電源をOn)ならデモンストレーションへ
$0102が$35、$0103が$ACなら$0103:$53にしてゲームのリセットベクトルへ
$0102が$35、$0103が$53ならゲームのリセットベクトルへ
スクロールセットは$EAEAのサブルーチンコールを行いますので
ゲームではポート$2005のセットは$00FC,$00FDと$EAEAのコールを行い
ディスクシステムの基準に倣った方が良いです
$4020:(出力)IRQタイマ下位クロックは1.79MHz
$4021:(出力)IRQタイマ上位
$4022:(出力)
Bit2:1=IRQタイマカウント開始、0=IRQタイマカウント停止
$4023:(出力)2C33タイマーコントロール
Bit1:サウウンド?T/Oのアクセス1=許可、0=禁止
Bit0:ディスクI/Oのアクセス1=許可、0=禁止
$4024:(出力)ディスクライトデータ(/WRITE_DATA)
1バイトのデータをシフトレジスタによって
/WRITE_DATAにシリアルデータで転送されます
$4023Bit0=1ディスクI/Oアクセス許可
$4025Bit2=0/WRITEGATEデータライト
$4030Bit7=1リード・ライト可能
の条件がそろってないと書き込めません
$4025:(出力)ディスクコントロール
Bit7:IRQデータ転送1=実行する、0=実行しない
Bit6:CRCレジスタ1=クリアする、0=クリアしない
Bit5:不明1=、0=
Bit4:CRC-Hコントロール1=行う、0=行わない
Bit3:スクロール1=スクロール-V、0=スクロール-H
Bit2:/WRITEGATE1=データリード、0=データライト
Bit1:/MOTOR1=モーターの回転停止、0=モーターの回転開始
Bit0:/RESET1=リセットを行わない、0=リセットを行う
不明ほとんど1になっている、CRC転送の実行?0だとデータ転送が出来ない
CRC-Hコントロールを行うと書き込みの場合CRC-Hが$4024に転送され
WaitでCRC-Hをディスクに書き込む?
読み込みの場合次にロードした$4031のデータとCRC-Hの比較を行い
結果を$4030のBit4(同じなら0)に出力する?
/RESETは転送タイミングのリセット
$4026:(出力)バッテリーコントロール、背面の拡張I/Oライト
Bit7:BATTRY_SENCE1=オン、0=オフ
Bit6:背面の拡張I/O
Bit5:背面の拡張I/O
Bit4:背面の拡張I/O
Bit3:背面の拡張I/O
Bit2:背面の拡張I/O
Bit1:背面の拡張I/O
Bit0:背面の拡張I/O
$4030:(入力)ディスクI/Oステータス
Bit7:ドライブの検知1=リード・ライト可能、0=リード・ライト不可
Bit6:ヘッドの検知1=最後まで移動した、0=最後まで移動していない
Bit5:
Bit4:CRC-Hチェック1=エラー有り、0=エラー無し
Bit3:
Bit2:
Bit1:シフトレジスタ転送の検知1=転送中、0=転送終了
Bit0:IRQタイマ割り込みの検知1=発生した、0=発生していない
CRCチェックはCRC-HとCRC上位として読み込んだデータが同じなら0になる?
$4031:(入力)ディスクリードデータ(READ_DATA)
READ_DATAから転送されたシリアルデータをシフトレジスタによって
1バイトのデータに変換されます
$4023Bit0=1ディスクI/Oアクセス許可
$4025Bit2=1/WRITEGATEデータリード
$4030Bit7=1リード・ライト可能
の条件がそろってないと読み込めません
???データを書き込んでいる場合(/WRITEGATE=0)はCRC-Lの値
$4032:(入力)ドライブステータス
Bit7:不明0
Bit6:不明1
Bit5:不明0
Bit4:不明0
Bit3:不明0
Bit2:/WRITE_PROTECT1=カード書き込み禁止、0=カード書き込み可
Bit1:/READY1=内部に移動している、0=スタート位置
Bit0:/MEDIA_SET1=セットされていない、0=セットされた
Bit6はほとんど1になっている
/WRITE_PROTECTはディスクカードのツメが折れていたら1、折れていなければ0
/READYはヘッドが一番外に移動し、内に移動し読み書きのが可能な時に0になる
/MEDIA_SETはディスクカードがセットされていなければ1、セットされれば0
$4033:(入力)バッテリーステータス、背面の拡張I/Oリード
Bit7:BATTRY_SENCEの結果1=電圧OK、0=電圧NG
Bit6:背面の拡張I/O
Bit5:背面の拡張I/O
Bit4:背面の拡張I/O
Bit3:背面の拡張I/O
Bit2:背面の拡張I/O
Bit1:背面の拡張I/O
Bit0:背面の拡張I/O
■ディスク フォーマット
FCB部分
まず最初にブロック01、ブロック02が存在します
ブロック01にそのディスクのゲーム名、両面ソフトでどの面か、青色のディスクか黄色のディスクか等の情報が入っています
ブロック02はマウントファイル数が書き込まれています
ファイル部分
ブロック03がファイル情報、ブロック04がファイルデータになります
ブロック03はファイルID、ファイル名、ロードアドレス等が書かれています
ブロック04はバイナリデータになります
1つのファイルはブロック03と04の対となります。
ブロックコードの説明
------------------------------------------------
GAP:$00
スタートデータ:1バイト$80
ブロックコード:1バイト$01
チェックコード:14バイト*NINTENDO-HVC*
メーカーコード:1バイト
ゲームネーム:4バイト
ゲームバージョン:1バイト
ディスクサイド:1バイト両面$00=A面、$01=B面)/片面$00のみ
ボリューム(ディスクの順番):1バイト2枚以上のソフトで使用$00から
ディスクの種類:1バイト$00=FMC(ノーマルカード)、$01=FSC(シャッター付きカード)
予備1:1バイト
コールドスタート:1バイト起動時に読み込む最大ロードナンバ
不明(予備):5バイト$FF、$FF、$FF、$FF、$FF
製造年月日:3バイト
国コード:1バイト$49=日本
不明:1バイト$61地域?
不明:1バイト$00場所?
不明:2バイト$00、$02
不明(各ゲームの情報?):5バイト
書換えた年月日:3バイト店頭販売の場合、製造年月日と同じ
不明:1バイト
不明:1バイト$80書き込んだシステム?
ディスクライターのナンバ:2バイト
不明:1バイト$07
書換えた回数:1バイト10進数で書かれている(00=店頭販売のディスク)
実際のディスクサイド:1バイト$00=A面、$01=B面
不明:1バイト
デバグバージョンまたは、プライス:1バイト
CRC:2バイト
ブロックコード$01は3つに分けると
$01-1*NINTNDO-HVC*
$01-2ディスクアクセス用(メーカーコードからコールドスタートまで)
$01-3メーカー管理用
$01-1はディスクシステムに必要なデータでこれが無いとBIOSからのディスクアクセスが出来ません
$01-2はディスクの情報なりますディスクアクセスに必要なデータになります
ディスクサイド=$00(A面)、ボリューム=$00でないと起動出来ません
ゲームネームの最後の1バイトはイベント等を表し
$20=通常のディスク
$45=Eイベントディスクファックスを使った全国トーナメント
$52=Rリダクションインプライス広告による値引き
コールドスタートは起動時に読み込む最大ロードナンバで一括でファイルを読み込みます
$0Fの場合、ディスク内のロードナンバ$00~$0Fまで全て読み
ロードナンバ$10以上のファイルは読み込みません
$01-3は主にメーカー管理用
実際のディスクサイドはディスクライタで両面ソフトの書き換え時にチェックされます
もしディスクA面に$01(B面)のデータだとディスクライタはA面の書き換えチェック時にエラーを出します
プライスは値段や周辺機器の対応
書き換え回数が00の場合は販売用のディスクの値段となり
$01=3400円
$03=3400円(とびだせ大作戦でメガネ同梱版と無しの両方)
01以上の場合は書き換えの値段
$00=500円
$01=600円
帰ってきたマリオブラザースの場合は500円でゲーム内の広告によって-100円なので
書き換え料金は500円扱いになる
------------------------------------------------
GAP:$00
スタートデータ:1バイト$80
ブロックコード:1バイト$02
マウントファイル数:1バイト登録されているファイル数
CRC:2バイト
------------------------------------------------
GAP:$00
スタートデータ:1バイト$80
ブロックコード:1バイト$03
ファイルナンバ:1バイト一番最初のファイルを$00として以降+1される
ロードナンバ:1バイト一括ロードするためのグループナンバ
ファイルネーム:8バイト
アドレス:2バイト下位、上位の順
ファイルの長さ:2バイト下位、上位の順
ファイルの種類:1バイト00=プログラム、01=キャラクタ、02=許諾ファイル
CRC:2バイト
ファイルナンバ最初のファイル(通常はKYODAKUファイル)を$00で次のファイルは$01になり
書き込む場合に使用されます(ファイルを追加するごとに+1)
ロードナンバ読み込むときに使用されるナンバで他のファイルにも同じナンバがある場合があります
同じナンバだと一度にロードする事が可能になります
ブロックコード$01-2のコールドスタートではそのロードナンバ以下の値がロードされます
例えばコールドスタートが$0Fなら起動時に$00-$0Fまでの
ロードナンバのファイルが一度にロードされ$10以降のファイルはロードされません
ファイルネーム目安程度なので同じ名前のファイルネームがあっても構いません
------------------------------------------------
GAP:$00
スタートデータ:1バイト$80
ブロックコード:1バイト$04
プログラム:データ本体(ブロックコード$03の長さ分)
CRC:2バイト
------------------------------------------------
------------------------------------------------
テスト ファイル用
スタートデータ:1バイト$80
ブロックコード:1バイト$05
データ:3バイト$6D、$B6、$DB
:|
:|以降この3バイトのデータがディスクの最後まで続く
:|
CRC:2バイト
------------------------------------------------
CRCは16ビットでスタートデータからブロックの最後まで計算される
まずデータとCRCレジスタを右シフトしてCRCレジスタ最下位が1なら
CRCレジスタとXOR$8408を実行する
これを8回(8ビット分)繰り返せば1バイトのCRC計算となる
これを1ブロック分まで繰りかえす
起動時に必要なもの
1.ブロックコード$01-1’*NINTNDO-HVC’
2.ブロックコード$01-2ディスクサイド$00、ゲームボリューム$00、コールドスタート$nn
3.ブロックコード$02のマウントファイル数、マウントファイル数分のファイル
4.$00、$00に’KYODAKU-’の許諾ファイル
5.割込み、リセットベクタ($DFFA~$DFFF)のあるプログラムファイル
<例>リンクの冒険A面のファイル内容
ブロックコード$01
+--------------------------------+
|+0+1+2+3+4+5+6+7||
|-----------------------+--------|
|012A4E494E54454E|.*NINTEN|
|444F2D4856432A01|DO-HVC*.|
|4C4E4B2000000000|LNK....|
|000FFFFFFFFFFF62|.......b|
|0114496100000200|..Ia....|
|25021800620114FF|%...b...|
|FFFFFFFF00000000|........|
+--------------------------------+
’*NINTNDO-HVC’
メーカーコード$01
ゲームネーム’LNK’
ゲームバージョン$00
ディスクサイド$00A面
ボリューム$00
ディスクの種類FMC
予備1$00
コールドスタート$0F

ブロックコード$02
マウントファイル数=$07
ブロックコード$03
+-------------------------------------+
|Fnn|Lnn|ファイル名|アドレス|長さ|種類|
|---+---+--------+-----+-----+--------|
|$00|$00|KYODAKU-|$2800|$00E0|$02(許諾)|
|$01|$03|MAIN-PRG|$6340|$7CC0|$00(PRG)|
|$02|$28|CASTLE-L|$C000|$1FF6|$00(PRG)|
|$03|$29|ENDING-P|$D660|$0996|$00(PRG)|
|$04|$01|CHARA-00|$0000|$2000|$01(CHR)|
|$05|$14|CHARA-05|$0E00|$09C0|$01(CHR)|
|$06|$06|SAVE-DAT|$6000|$0338|$00(PRG)|
+-------------------------------------+
コールドスタート$0Fなので起動時L$00~$0Fのファイルをロード指定
ディスクサイドA面、ボリューム$00なので起動ディスクとみなしロード開始
$00$00KYODAKU-
$01$03MAIN-PRG
$04$01CHARA-00
$06$06SAVE-DATが一括ロードされる
一括ロード終了後、VRAMの$2800-$28DFに’KYADAKU-’がロードされたかチェックを行い
許諾ファイルがVRAMにロードされているのなら、上スクロールで許諾画面を表示して
’MAIN-PRG’の$DFFC-$DFFDのアドレスにジャンプします
■書き込む場合
CRCレジスタのリセット=0
GAP$00を書き込む
CRCレジスタのリセット=1

|スタートデータ$80以降を書き込む

CRCデータ下位の書き込み
CRCコントロール=1
CRCデータ上位の書き込み
読み込む場合
GAP$00を読み込む
CRCレジスタのリセット=1

|データを読み込む

CRCデータ下位の読み込む
CRCコントロール=1
CRCデータ上位の読み込む
ブロックコード$01の書き込み例
JSR$E64D;BootDiskDrive
LDA$00FA
AND#$2B
STA$4025
LDA#$00
STA$4024
LDY#$C5
JSR$E153
LDY#$86
JSR$E153
LDA#$01;Write$00,$80,$01
JSR$E6B0

|*NINTENDO-HVC*...のデータをJSR$E7A3で書き込む

JSR$E729;WriteCRC
エラー
■ドライブ&ディスクセット関連
01:DISKSETERR.01ディスクが正しくセットされていない
02:BATTERYERR.02ディスクドライブの電圧が規定値以下になっている
03:WRITEPROTECTERR.03ライトプロテクトのツメが折れているのに書き込もうとした
04:GAMEMAKERERR.04違ったメーカのディスクがセットされた
05:GAMENAMEERR.05違ったゲームのディスクがセットされた
06:GAMEVERSIONERR.06違ったバージョンのディスクがセットされた
07:A.B.SIDEERR07違ったサイドのディスク(表と裏)がセットされた
08:DISKNUMBERERR.08違った順番のディスクがセットされた
09:ERR.09違ったディスクの種類がセットされた
10:ERR.10違った予備1のデータがセットされた
08はROM内ではDISKNO.ERR.08として出力
11-19はディスクライター用?
ファイルアクセス関連
20:DISKTROUBLEERR.20許諾ファイルが読み込めない
21:DISKTROUBLEERR.21ブロックコード$01の*NINTENDO-HVC*が見つからない
22:DISKTROUBLEERR.22ブロックコード$01の開始マーク$01が見つからない
23:DISKTROUBLEERR.23ブロックコード$02の開始マーク$02が見つからない
24:DISKTROUBLEERR.24ブロックコード$03の開始マーク$03が見つからない
25:DISKTROUBLEERR.25ブロックコード$04の開始マーク$04が見つからない
26:DISKTROUBLEERR.26ディスクに正しく書き込みが出来ない
27:DISKTROUBLEERR.27CRCエラーを検出
28:DISKTROUBLEERR.28ディスクの読み込みでタイミングが合っていない(読み込み途中でヘッドが最後まで行った)
29:DISKTROUBLEERR.29ディスクの書き込みでタイミングが合っていない(書き込み途中でヘッドが最後まで行った)
ユーザーセーブ関連
30:DISKTROUBLEERR.30ディスクに書き込みが出来なくなった(容量不足またはドライブ・プロテクトによる強制終了)
31:DISKTROUBLEERR.31ディスクのデータ数が合わない、または書き込もうとしたマウントファイル数がマイナスになった
35:DISKTROUBLEERR.35テストファイル(ブロックコード$05ファイル)の書き込み失敗
その他
40:DISKTROUBLEERR.40一括ロードでロード出来なかったファイルがあった(ファイル数が足りない)
41:DISKTROUBLEERR.41不明(きね子IIの説明書にERR.41~の表記あり)
*DISKTROUBLEERR.35以降はROMルーチンではなくソフトのルーチンでエラーの判断を行います
DISKROM エントリ
$E000:00
$E001-$E148:キャラクタデータ(文字)
$E149:Wait
$E153:nnミリWait
入力:Y=nnミリ
使用:X、Y
Yミリ秒のウェイトをかけます
ルーチン内で$0000をロード、コンペアの実行を行っていますが
時間稼ぎの為で内容の変更はありません
主にディスクアクセスのタイミングに使用
$E161:OBJ+BGOff
使用:A
$00FE
スプライトとBG画面を表示しません。
$E16B:OBJ+BGOn
使用:A
$00FE
スプライトとBG画面を表示します。
$E171:OBJOff
使用:A
$00FE
スプライトを表示しません。
$E178:OBJOn
使用:A
$00FE
スプライトを表示します。
$E17E:BGOff
使用:A
$00FE
BG画面を表示しません。
$E185:BGOn
使用:A
$00FE
BG画面を表示します。
$E18B:NMIベクタ
ディスクシステムのNMIベクタです。
割り込みがかかったら$0100のBit7-6をみて、それぞれの処理を行ないます。
0100:11******で$DFFAの内容の所へジャンプ
0100:10******で$DFF8の内容の所へジャンプ
0100:01******で$DFF6の内容の所へジャンプ
0100:00******でRAMアダプタ内で処理(許諾画面表示中などで使用)
$E1B2:NMIがかかるのを待ちます。
使用:$00FF
まず、Aレジスタ、NMIコード($0100の内容)をスタックにセーブしてから
NMIコード$00にしてNMIがかかるのを待ちます
NMIがかかるとセーブしたNMIコード、Aレジスタを元に戻るようになっています
$E1C7:IRQベクタ
入力:$0101=IRQコード
出力:IRQコードによって異なる
ディスクシステムのIRQです。
割り込みがかかったら$0101のBit7-6をみて、それぞれの処理を行ないます。
0101:11******$DFFEの内容の所へジャンプ
0101:10******$4030(ディスクI/Oステータス)を読んでWaitをかけRTI
0101:01******ディスク1バイト転送、スタックからPC-L、PC-H、PSRを取り出してRTS
これは1バイト転送($E7A3)をコールしたアドレスに戻る為
ライトの場合入力:A=セーブするデータ
出力:A=CRC下位のデータ
X=CRC下位のデータ(Aレジスタと同じ内容)
リードの場合出力:A=リードデータ
X=リードデータ(Aレジスタと同じ内容)
0101:00******$0101の内容が$00なら何もせず、
それ以外はBit5-0のデータ分をAにディスクロード(スキップ)
$E1F8:ファイルロード
入力:1st=ブロックコード$01-2比較データアドレス下位
2nd=ブロックコード$01-2比較データアドレス上位
3rd=ロードナンバ群ポインタ下位
4th=ロードナンバ群ポインタ上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$04=GAMEMAKERERR.04
$05=GAMENAMEERR.05
$06=GAMEVERSIONERR.06
$07=A.B.SIDEERR07
$08=DISKNUMBERERR.08
$09=ERR.09
$10=ERR.10
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$24=DISKTROUBLEERR.24
$27=DISKTROUBLEERR.27
Y=ロード出来たファイル数
使用:A、X、Y
$0000
$0001
$0002
$0003
$0004
$0005
$0007
$0008
$000E
$00F8
$00F9
$00FA
$0101
ブロックコード$01のチェックを行ってから($E445を実行)
ブロックコード$02のマウントファイル数を読み込み($E484を実行)
ロードナンバデータで$FF(エンドマーク)が出るまでファイルロードを行います
ただし、ロードナンバ群の第1バイトが$FFならコールドスタートとしてロードされます
このルーチンで一括ロードを行うのですが
ファイルをロードできなくてもエラーが出ない恐れがあります
その為に幾つロード出来たかYレジスタにロードしたファイル数が入ります
ロードするファイル数とロード出来たファイル数とが合わないとERR.40として
各自で処理する必要があります(ROMルーチンでは何もしません)
ロードナンバ群nn,mm,...,$FF(エンドマーク)
ロードするロードナンバが記されている(最大19個まで)
ロードナンバ群の第1バイト$FF=コールドスタートの値と比較する
その場合エンドマークを足して$FF,$FFになる
$E237:一番最後にファイルセーブ
入力:1st=ブロックコード$01-2比較データアドレス下位
2nd=ブロックコード$01-2比較データアドレス上位
3rd=ブロックコード$03データアドレス下位
4th=ブロックコード$03データアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$04=GAMEMAKERERR.04
$05=GAMENAMEERR.05
$06=GAMEVERSIONERR.06
$07=A.B.SIDEERR07
$08=DISKNUMBERERR.08
$09=ERR.09
$10=ERR.10
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$26=DISKTROUBLEERR.26
$27=DISKTROUBLEERR.27
$0008=コールドスタート出来る最大ロードナンバ
使用:A、X、Y
$0004
$0005
$0006
$0007
$0009
$000A
$000B
$000C
$000D
$00F8
$00F9
$00FA
$0101
Aレジスタに$FFを入れて、下のファイルセーブを行います
$E239:ファイルセーブ
入力:A=$00から$FE$0006で指定した場所-1にセーブ(最後のファイル)
$FF最後にセーブ(新しく作成)
1st=ブロックコード$01-2比較データアドレス下位
2nd=ブロックコード$01-2比較データアドレス上位
3rd=ブロックコード$03データアドレス下位
4th=ブロックコード$03データアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$04=GAMEMAKERERR.04
$05=GAMENAMEERR.05
$06=GAMEVERSIONERR.06
$07=A.B.SIDEERR07
$08=DISKNUMBERERR.08
$09=ERR.09
$10=ERR.10
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$26=DISKTROUBLEERR.26
$27=DISKTROUBLEERR.27
$0008=コールドスタート出来る最大ロードナンバ
使用:A、X、Y
$0004
$0005
$0006
$0007
$0009
$000A
$000B
$000C
$000D
$00F8
$00F9
$00FA
$0101
ブロックコード$01のチェックを行ってから($E445を実行)
指定した番号のファイルをセーブを行います
またブロックコード$02にファイルナンバが書き込まれます
ロックコード$03データアドレスはロードナンバからファイルタイプまで
書かれているアドレスを指します
セーブが成功すれば、ベリファイの実行を行います
またベリファイの前にマウントファイル数の書き込みを行います
ファイルはブロックコード$04も含む
LDA#$05
JSR#$E239
DB$01-2データ下位,$01-2データ上位
DBファイルデータ下位,ファイルデータ上位
BNEERROR

$01-2データはメーカーコードからコールドスタートの次の$FFまで
ファイルデータはブロックコード$03のロードナンバからファイルタイプまで
ファイルデータに記されているアドレスと長さが書き込む範囲になります
$E26B:ファイルセーブ(メイン)
入力:$0000=ブロックコード$01-2比較データアドレス下位
$0001=ブロックコード$01-2比較データアドレス上位
$0002=ブロックコード$03データアドレス下位
$0003=ブロックコード$03データアドレス上位
$000E=$00から$FE$0006で指定した場所-1にセーブ
$FF最後にセーブ
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$04=GAMEMAKERERR.04
$05=GAMENAMEERR.05
$06=GAMEVERSIONERR.06
$07=A.B.SIDEERR07
$08=DISKNUMBERERR.08
$09=ERR.09
$10=ERR.10
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$26=DISKTROUBLEERR.26
$27=DISKTROUBLEERR.27
$0008=コールドスタート出来る最大ロードナンバ
使用:A、X、Y
$0004
$0006
$0007
$0009
$000A
$000B
$000C
$000D
$00F8
$00F9
$00FA
$0101
ブロックコード$01のチェックを行ってから($E445を実行)
$000Eを見て$00なら$0006の場所の最後に移動してファイルをセーブ
$FFならブロックコード$02を読み込んでマウントファイル数の最後に移動してセーブ
ファイルはブロックコード$04も含む
$E2AB:マウントファイル数の書き込み
入力:$0000=ブロックコード$01-2比較データアドレス下位
$0001=ブロックコード$01-2比較データアドレス上位
$0006=フマウントァイル数
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$04=GAMEMAKERERR.04
$05=GAMENAMEERR.05
$06=GAMEVERSIONERR.06
$07=A.B.SIDEERR07
$08=DISKNUMBERERR.08
$09=ERR.09
$10=ERR.10
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$27=DISKTROUBLEERR.27
$0008=コールドスタート出来る最大ロードナンバ
使用:A、X、Y
$0002
$0004
$0005
$0006
$0007
$0009
$00F8
$00F9
$00FA
$0101
ブロックコード$01のチェックを行ってから($E445を実行)
ブロックコード$02のマウントファイル数の書き込みを行います
$E2B7:ブロックコード$01のチェック、マウントファイル数の書き込み
入力:A=マウントファイル数
$0000=ブロックコード$01-2比較データアドレス下位
$0001=ブロックコード$01-2比較データアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$04=GAMEMAKERERR.04
$05=GAMENAMEERR.05
$06=GAMEVERSIONERR.06
$07=A.B.SIDEERR07
$08=DISKNUMBERERR.08
$09=ERR.09
$10=ERR.10
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$27=DISKTROUBLEERR.27
使用:A、X、Y
$0002
$0004
$0005
$0006
$0007
$0009
$00F8
$00F9
$00FA
$0101
ブロックコード$01のチェックを行ってから
ブロックコード$02に指定したマウントファイル数の書き込みを行います。
$E2BB:ブロックコード$01のチェック、マウントファイル数の削除
入力:A=削除するファイル数
$0000=ブロックコード$01-2比較データアドレス下位
$0001=ブロックコード$01-2比較データアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$04=GAMEMAKERERR.04
$05=GAMENAMEERR.05
$06=GAMEVERSIONERR.06
$07=A.B.SIDEERR07
$08=DISKNUMBERERR.08
$09=ERR.09
$10=ERR.10
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$27=DISKTROUBLEERR.27
使用:A、X、Y
$0002
$0004
$0005
$0006
$0007
$0009
$00F8
$00F9
$00FA
$0101
ブロックコード$01のチェックを行ってから
ブロックコード$02のマウントファイル数から指定したファイル数の分だけ減らします
この時マウントファイル数がマイナスになるとERR.31となります。
$E2F7:マウントファイル数の読み込み
入力:$0000=ブロックコード$01-2比較データアドレス下位
$0001=ブロックコード$01-2比較データアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$04=GAMEMAKERERR.04
$05=GAMENAMEERR.05
$06=GAMEVERSIONERR.06
$07=A.B.SIDEERR07
$08=DISKNUMBERERR.08
$09=ERR.09
$10=ERR.10
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$27=DISKTROUBLEERR.27
$0006=ファイル数
$0008=コールドスタート出来る最大ロードナンバ
使用:A、X、Y
$0004
$0007
$00F8
$00F9
$00FA
ブロックコード$01のチェックを行ってから($E445を実行)
ブロックコード$02のマウントファイル数を読み込みます($E484を実行)
その為、前もってブロックコード$01の比較データを用意する必要があります。
$E301:マウントファイル数+1を書き込む
入力:A=マウントファイル数
1st=ブロックコード$01-2比較データアドレス下位
2nd=ブロックコード$01-2比較データアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$27=DISKTROUBLEERR.27
$29=DISKTROUBLEERR.29
$30=DISKTROUBLEERR.30
使用:A、X、Y
$0002
$0004
$0005
$0006
$0007
$00FA
$0101
スタック
ブロックコード$01-2のチェックを行ってから
マウントファイル数より1つ多く書き込みます
$E305:マウントファイル数を書き込む
入力:A=マウントファイル数
1st=ブロックコード$01-2比較データアドレス下位
2nd=ブロックコード$01-2比較データアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$27=DISKTROUBLEERR.27
$29=DISKTROUBLEERR.29
$30=DISKTROUBLEERR.30
使用:A、X、Y
$0002
$0004
$0005
$0006
$0007
$00FA
$0101
スタック
ブロックコード$01-2のチェックを行ってから
マウントファイル数を書き込みます
$E307:マウントファイル数+nnを書き込む
入力:A=マウントファイル数
X=nn(加えるファイル数)
$0000=ブロックコード$01-2比較データアドレス下位
$0001=ブロックコード$01-2比較データアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$27=DISKTROUBLEERR.27
$29=DISKTROUBLEERR.29
$30=DISKTROUBLEERR.30
使用:A、X、Y
$0002
$0004
$0005
$0006
$0007
$00FA
$0101
スタック
ブロックコード$01-2のチェックを行ってから
マウントファイル数+nnを書き込みます
$E32A:ディスクインフォメーションの収得
入力:1st=ディスクインフォメーションアドレスの下位
2nd=ディスクインフォメーションアドレスの上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$21=DISKTROUBLEERR.21
$27=DISKTROUBLEERR.27
$0002-$0003=ディスクの総容量
$000A-$000B=ディスクの総容量
使用:A、X、Y
$0000
$0001
$0004
$0005
$0006
$0009
$000A
$000B
$000C
$000D
ディスクを最初から読み、指定したアドレスにディスクインフォメーションの取得を行います
新規ファイル作成やユーザディスクに使用か?
ディスクインフォメーションの内容
+00メーカーコード1バイト
+01ゲームネーム4バイト
+05ゲームバージョン1バイト
+06ディスクサイド1バイトA面=00、B面=01
+07ディスクの順番1バイト
+08ディスクの種類1バイト00=FMC(黄色の磁気カード)、01=FSC(シャッター付きカード)
+09不明(地域?)1バイト
+0Aマウントファイル数1バイトブロックコード$02のデータ
+0Bロードナンバー001バイトファイルの順番00のロードナンバ(ブロックコード$03のデータ)
+0Cファイルネーム008バイトファイルの順番00のファイルネーム(ブロックコード$03のデータ)

|以降ファイル数分のファイルが続き最後にディスクの総容量

+nnディスクの総容量の下位
+mmディスクの総容量の上位
ディスクの総容量はヘッダ部分+00~+0A10バイト
ファイル部分ファイルの順番1バイト
+0Bロードナンバ1バイト
+0C~+12ファイルネーム8バイト
ロードアドレス2バイト
ファイルの長さ2バイト
ファイルタイプ1バイト
GAP?255バイト($03と$04分?)
プログラム部分ファイルの長さ
以降ファイル部分+プログラム部分がマウントファイル数-1分まで加算されます。
???ディスクの総容量は$E31Fまで
$E3E7:パラメータの取得、現在のドライブの状態を見る(ロード)
入力:A=$FF(パラメータ4バイト)、$00(パラメータ2バイト)
1st,2nd
3rd、4th(パラメータ4バイトの場合)
出力:$0000=1stパラメータ
$0001=2ndパラメータ
$0002=3rdパラメータ(パラメータ4バイトの場合)
$0003=4thパラメータ(パラメータ4バイトの場合)
A=エラーコード$00=エラー無し
$01=DISKSETERR
使用:A、X、Y
$0004
$0005
$0006
スタック
パラメータのの取得を行って$0000からそれぞれ対応するデータをセットして
メディアセットを調べます
$E3EA:パラメータの取得、現在のドライブの状態を見る(セーブ)
入力:A=$FFパラメータ4バイトセット
$00-$FEパラメータ2バイトセット
1st,2nd
3rd、4th(パラメータ4バイトの場合)
出力:$0000=1stパラメータ
$0001=2ndパラメータ
$0002=入力したAレジスタの内容(パラメータ2バイトセットの場合)
3rdパラメータ(パラメータ4バイトセットの場合)
$000E=パラメータnnバイトの値(0か2エラーの場合)
A=エラーコード$00=エラー無し
$01=DISKSETERR
$03=WRITEPROTECTERR
$0004
$0005
$0006
スタック
パラメータのの取得を行ってJSR命令の実行した後のアドレスをパラメータとして
$0000からそれぞれ対応するデータをセットして
Aレジスタにディスクの状態を送ります。
エラーが発生するとRTSする前にスタック操作を行って
このルーチンを実行したルーチンを強制終了されます
$E3EB:パラメータの取得、現在のドライブの状態を見るメイン
入力:Cf=1ロード時のドライブ状態を見る
0サーブ時のドライブ状態を見る
A=$FFパラメータ4バイトセット
$00-$FEパラメータ2バイトセット
1st、2nd
3rd、4th(パラメータ4バイトの場合)
出力:$0000=1stパラメータ
$0001=2ndパラメータ
3rdパラメータ(パラメータ4バイトセットの場合)
$0003=4thパラメータ(パラメータ4バイトセットの場合)
$000E=パラメータnnバイトの値(0か2エラーの場合)
A=ロードの場合$00=エラー無し
$01=DISKSETERR.01
セーブの場合$00=エラー無し
$01=DISKSETERR.01
$03=WRITEPROTECTERR.03
使用:A、X、Y
$0004
$0005
$0006
スタック
$0000からそれぞれ対応するデータをセットして
Aレジスタにディスクの状態を送ります
セーブの状態なら$E3EAをサブルーチンコールをすれば良いのですが
エラーが発生するとRTSする前にスタック操作を行って
このルーチンを実行したルーチンを強制終了されます
$E445:ブロックコード$01リード、チェック
$0001=ブロックコード$01-2比較データアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$04=GAMEMAKERERR.04
$05=GAMENAMEERR.05
$06=GAMEVERSIONERR.06
$07=A.B.SIDEERR07
$08=DISKNUMBERERR.08
$09=ERR.09
$10=ERR.10
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$27=DISKTROUBLEERR.27
$0008=コールドスタート出来る最大ロードナンバ
使用:A、X、Y
$0004
$0007
$00F8
$00F9
$00FA
ブロックコード$01-1と$01-2のチェックを行います
$01-3とCRCはスキップされる
違うメーカ、ゲームネーム、バージョン等の判断が出来ます
ブロックコード$01-2のチェックは予備1まで必要です
$E484:ブロックコード$02のマウントファイル数リード
出力:A=エラーコード$00=エラー無し
$27=DISKTROUBLEERR.27
$0006=マウントファイル数
使用:A、X、Y
$0004
$0007
$00F9
$00FA
$0101
マウントファイル数を読み、CRCチェックを行います。
$E492:ブロックコード$02のマウントファイル数ライト
入力:A=マウントファイル数
使用:A、X、Y
$0004
$0007
$00FA
$0101
マウントファイル数を書き込み、CRCデータを書き込みます。
$E4A0:ファイルチェック
入力:$0002=ロードナンバ群ポインタ下位
$0003=ロードナンバ群ポインタ上位
$0008=コールドスタートの値
出力:$0009=ロードコントロール$00=ロード
$FF=スキップ
$000E=ロード出来るファイルカウンタ
使用:A,X、Y
$0101
指定したファイルがロードが出来るかチェックを行います
ファイルナンバの読み込みから始まりますので
ブロックコード$03の$00、$80、$03を読んでからコールします
ロードナンバ群とブロックコード$03を読み同じなら$0009に$00、$000Eをインクリメント
違うのなら$0009に$FF
ロードナンバ群nn,mm,...,$FF(エンドマーク)
ロードするロードナンバが記されている(最大19個まで)
ロードナンバ群の第1バイト$FF=コールドスタートの値と比較する
$E4DA:全てのファイルをスキップ
入力:$0006=マウントファイル数
使用:A、X、Y
$0002
$0003
$0004
$0007
$0008
$0009
$000A
$000B
$000C
$000D
$00F9
$00FA
$0101
マウントファイル数の次の所まで移動します
新しくファイルを追加するなどにコールします
$E4E0:指定したファイル数をスキップ
入力:A=スキップするファイル数
使用:A、X、Y
$0002
$0003
$0004
$0007
$0008
$0009
$000A
$000B
$000C
$000D
$00F9
$00FA
$0101
指定したファイル数をスキップします
$E583:ブロックコード$03のデータ解析
入力:$0002=ブロックコード$03データポインタ下位
$0003=ブロックコード$03データポインタ上位
出力:$000A=ロード、セーブアドレス下位
$000B=ロード、セーブアドレス上位
$000C=ファイルの長さ下位
$000D=ファイルの長さ上位
使用:A、X、Y
$00FE
前もって読み書きしたブロックコード$03の内容に沿って
ブロックコード$04へ読み書きする為に
アドレス、ファイルの長さを取得し
ファイルの種類がキャラクタか許諾ファイルなら
PPUアドレスをセットします
またPPUロードの為1回$2007を空読みを行っています
$E64D:ディスクドライブの起動
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
使用:A、X、Y
$0004
$00F8
$00F9
$00FA
モータ・オフ
約0.512秒のウェイト
モータ・オン+バッテリーチェック
ディスクセットのチェックを行いながら
/READY=0になるまで待ちます
$E685:ディスクドライブモーターストップ
出力:A=$4025の内容
使用:A
$00FA
ドライブのモーターを止めます
$4025に0010?110Bを出力し、その内容をAレジスタ出力されます
このAレジスタはドライブのモータスタート($EE17)で使用します
つまり$E685と$EE17は対で使用(間にウェイトが入る場合がある)されます
$E68F:ブロックコードの読み込み
入力:A=ブロックコード
出力:A=エラーコード$00=エラー無し
$21=DISKTROUBLEERR.21
$22=DISKTROUBLEERR.22
$23=DISKTROUBLEERR.23
$24=DISKTROUBLEERR.24
使用:A、X、Y
$0004
$0007
$00F9
$00FA
$0101
CRCレジスタをリセットを行い、
1バイト読み込んだデータをブロックコードとして読みます
ヘッドが予めブロックコードのある所にいなければなりません
$E6B0:ブロックコードの書き込み
入力:A=ブロックコード
$3F1F-$3F1Fカラーパレット
使用:A、X、Y
$0004
$0007
$00FA
$0101
$4025の設定(AND#$2Bをとる)
約0.01秒のウェイト
GAP$00を書き込む
CRCレジスタのリセット
スタートデータ$80を書き込む
指定したブロックコードを書き込みます(1バイト)
ヘッドが予めブロックコードのある所にいなければなりません
$E6D5-$E6E2:*NINTENDO-HVC*データ
*CVH-ODNETNIN*'(逆になっています)
$E6E3:*NINTENDO-HVC*のチェック
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$02=BATTERYERR.02
$21=DISKTROUBLEERR.21
使用:A、X、Y
$0004
$0007
$00F8
$00F9
$00FA
ドライブを起動し
ブロックコード$01-1の'*NINTENDO-HVC*'があるかチェックを行います
*NINTENDO-HVC*'が無ければドライブを止め
Aレジスタにエラーコード$21を返します
$E706:CRCリード
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$27=DISKTROUBLEERR.27
$28=DISKTROUBLEERR.28
使用:$00FA
CRC-Lデータをリード(データ自体は使用しません)
CRC-Hコントロールを1($4025のBit4=1)
CRC上位バイトをリード
リードしたデータがCRC-Hコントロールによってチェックが行われ
結果が$4030のBit4に現れ(1=エラー、0=エラー無し)
それの合わせてエラーコードが出力され、ドライブクローズされます
$E729:CRCライト
入力:A=CRC-Lデータ
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$29=DISKTROUBLEERR.29
$30=DISKTROUBLEERR.30
使用:$00FA
*CRC-Lデータをライト
CRC-Hコントロールを1($4025のBit4=1)
約0.0005秒のウェイト<-ここでCRC-Hが書き込まれている?
$4032の/READY=1(Bit1=1)ならエラー(ERR.31)
0(Bit1=0)ならエラーなし
*CRC-LデータはIRQの1バイトデータ転送ルーチンでAレジスタに出力されています
$E761:2バイトロード、ドライブのクローズ
入力:$000A=ロードアドレス下位
$000B=ロードアドレス上位
出力:A=エラーコード$00=エラー無し
$01=DISKSETERR.01
$28=DISKTROUBLEERR.28
エラーコード$28(エラーの場合)
使用:$00FA
2バイトロードしてドライブをクローズします
CRCチェックは行いません
エラーチェックはヘッドの検知を行います
CRCデータのロード?
$E778:ドライブのクローズ(エラー無し)
入力:
出力:A=エラーコード$00=エラー無し
使用:A、X
$00FA
X=$00(エラー無し)として
ドライブクローズ($E786)を実行します
当然、出力でAレジスタには$00が入ります
$E77F:ディスクコンペアデータZfチェック
入力:Zf=0比較データと違う
1比較データと同じ
出力:A=エラーコード(Zf=0で入力の場合)
使用:$0004
$00FA
前もってデータを比較したりしてZfの変化を見るルーチンになります
入力でZf=1なら何もせずRTS
0ならエラー
エラーでは$0004のスタックデータをスタックポインタにして
ドライブクローズ、エラー出力して強制終了します
$E786:ドライブクローズ
入力:X=エラーコード
出力:A=エラーコード(Xレジスタの値)
使用:A、X
$00FA
$4025Bit7:0
6:0
5:1
4:0
3:*
2:1
1:1
0:*
XレジスタをAレジスタにコピーして、IRQをオンにします
$E794:IRQ1バイト転送の開始
入力:A=ライトデータ(書き込みの場合)
出力:A=CRC下位(書き込みの場合)
X=リードデータ(読み込みの場合)
A=リードデータ(読み込みの場合)
使用:$00FA
$0101
IRQコードを$40(0101:40)
IRQデータ転送を1($4025のBit7=1)にして
下の$E7A3(IRQ1バイト転送)を実行します
ディスクのリード・ライトの始めに使用しますが事前に
CRCレジスタをクリアしていないとCRC計算が正しく行われません
$E7A3:IRQ1バイト転送
入力:A=ライトデータ(書き込みの場合)
出力:A=CRC下位(書き込みの場合)
X=リードデータ(読み込みの場合)
A=リードデータ(読み込みの場合)
IRQをオンにして無限ループでIRQが掛かるまで待ちます
1バイトだけIRQによってディスク転送を行いますが、
ディスクドライブ起動、IRQの設定は行わないので前もって設定する必要があります
IRQのディスク1バイト転送ではスタック操作して
このルーチンをコールしたアドレスに返るようになっています・
$E7A7:ファイルアドレスのINC、プログラムの長さのDEC
入力:$000A=ファイルアドレス下位
$000B=ファイルアドレス上位
$000C=ファイルの長さ下位
$000D=ファイルの長さ上位
出力:$000A=ファイルアドレス+1下位
$000B=ファイルアドレス+1上位
$000C=ファイルの長さ-1下位
$000D=ファイルの長さ-1上位
使用:A
$000Aと$000Bを16ビットカウウンタとしてINCします
下の$E7ADへ続き
$000Cと$000Dを16ビットカウウンタとしてDECします
ブロックコード$04のデータを読み書き等に使用します
通常、入力はブブロックコード$03のデータ解析($E583)でセットされ
このルーチンで入力する事はありません
$E7AD:プログラムの長さのDEC
入力:$000C=ファイルの長さ下位
$000D=ファイルの長さ上位
出力:$000C=ファイルの長さ-1下位
$000D=ファイルの長さ-1上位
使用:A
$000Cと$000Dを16ビットカウウンタとしてDECします
$E7BB:文字列出力
入力:1st=データアドレス下位
2nd=データアドレス上位
使用:A、X、Y
$0000
$0001
$0005
$0006
PPUにデータを送ります
JSR#$E7BB
DBデータアドレス下位、データアドレス上位

上記の様にJSR命令の後にデータアドレスを指定します
データのフォーマットは
PPUアドレス上位またはコード
PPUアドレス下位
コマンド+表示する長さ
データ

コマンド+表示する長さ
データ
$FF(コードエンドマーク)
コード$80-$FFならエンドマークとみなし終了(通常は$FF)
$60ならサブデータから戻ります
$4Cなら次のデータをアドレス上位、下位の順でサブデータのアクセスを行います
サブデータは通常のデータと同じフォーマットになりエンドマークが$60になります
コマンドBit7:1=Y方向+1、0=X方向+1
6:1=メモリを埋める、0=データレングスとして処理
5-0:長さ
$E844:パラメータの取得
入力:コールする前の1st
コールする前の2nd
出力:$0000=1stパラメータ
$0001=2ndパラメータ
使用:$0005
     $0006
ROMのサブルーチンによってはJSRnnmmの後にパラメータを設定するのですが
それらのサブルーチンが使用して、パラメータを読みRTSする為のスタックを調節します
$0005から$0006の内容が壊れます
$E86A:VRAMバッファ出力
入力:$0302=バッファデータ00VRAMアドレス上位
$0303=バッファデータ00VRAMアドレス下位
$0304=バッファデータ00データの長さ
$0305=バッファデータ00VRAMに書き込むデータ

$03nn=エンドマーク($80から$FF)
出力:$0301=$00
$0302=エンドマーク$80から$FF(実際には$FF)
使用:A、X、Y
$00FF
PPUアクセス時のアドレスの増加をX方向($2000Bit2=0)にして
VRAMバッファからアドレス、長さを取得してVRAMにバッファデータを書き込みます
バッファデータの第1バイトのVRAMアドレスが$80から$FFだとエンドマークになります
データフォーマット
バッファデータ00VRAMアドレス上位
バッファデータ00VRAMアドレス下位
バッファデータ00出力データの長さ
バッファデータ00出力データ

バッファデータnnVRAMアドレス上位
バッファデータnnVRAMアドレス下位
バッファデータnn出力データの長さ
バッファデータnn出力データ
エンドマーク($80から$FF)
$E8B3:VRAMバッファ入力
入力:X=インデックス($02から)
Y=転送するバイト数
$0302=データ00VRAMアドレス上位
$0303=データ00VRAMアドレス下位
$0305=データ01VRAMアドレス上位
$0306=データ01VRAMアドレス下位

出力:$0304=指定したデータ00のVRAMの内容
$0307=指定したデータ01のVRAMの内容

使用:A、X、Y
$0302にあるVRAMバッファにVRAMの内容を転送します
1バイトごとの転送なので3バイト1組になります
入力するXレジスタの値は$02以上になります
VRAMバッファは
+00VRAMアドレス上位
+01VRAMアドレス下位
+02VRAMの内容(3バイトで1組になっています)

+nn$FF(エンドマーク)
このルーチンではVRAMバッファのアドレスを読んで
その内容をVRAMの内容としてVRAMバッファに書き込みます
データの長さは3バイトで1つの長さになります
$E8D2:メモリからVRAMバッファへ1行分の転送
入力:A=VRAMアドレス上位
X=VRAMアドレス下位
Y=転送する長さ
1st=データアドレス下位、2nd=データアドレス上位
$0300=VRAMバッファインデックスの上限
$0301=VRAMバッファインデックス
出力:A=$01エラー有り
$FFエラー無し
$0002=キャラクタ定義用($0002-$0003に$20足される他のルーチン用)
$0003=キャラクタ定義用
$0301=入力したVRAMバッファインデックス+データの長さ(次のインデックス)
$0302=VRAMアドレス上位
$0303=VRAMアドレス下位
$0304=データの長さ
$0305=データ

$03nn=$FFエンドマーク
使用:A、X、Y
$0000
$0001
$0004
$0005
$0006
メモリからVRAMバッファ($0302-$03FF)へ1行分転送(追加)します
バッファの上限が$0300に設定され
これを超えるとバッファにエンドマーク$FFが書き込まれ
このルーチンをコールしたルーチンが強制終了されます
書き込み例
LDA#$20;VRAM上位
LDX#$00;VRAM下位
LDY#$04;転送する長さ
JSR$E8D2;VRAMバッファに転送
DBデータアドレス下位,データアドレス上位
JSR$E1B2
JSR$E86A;VRAMバッファからVRAMに転送
JSR$EAEA

DB’ABCD’;データ
$E8E1:メモリからVRAMバッファへ数行転送
入力:A=VRAMアドレス上位
X=VRAMアドレス下位
1st=データアドレス下位、2nd=データアドレス上位
$0300=VRAMバッファインデックスの上限
$0301=VRAMバッファインデックス
出力:A=$01エラー有り
$FFエラー無し
$0002=キャラクタ定義用($0002-$0003に$20足される他のルーチン用)
$0003=キャラクタ定義用
$0301=入力したVRAMバッファインデックス+データの長さ(次のインデックス)
$0302=VRAMアドレス上位
$0303=VRAMアドレス下位
$0304=データの長さ
$0305=データ

$03nn=$FFエンドマーク
使用:A、X、Y
$0000
$0001
$0004
$0005
$0006
メモリからVRAMバッファ($0302-$03FF)へ数行転送(追加)します
$E8D2と違うのはデータの第1バイトがPPUデータでなく
Bit7-4:行数で
Bit3-0:データの長さ
になります
バッファの上限が$0300に設定され
これを超えるとバッファにエンドマーク$FFが書き込まれ
このルーチンをコールしたルーチンが強制終了されます
$E94F:VRAMバッファアドレスチェック、リード
入力:X=$00(VRAMバッファオフセット)
Y=VRAMバッファスキップする個数(3バイトで1)
$0000=チェックするVRAMバッファ(VRAMアドレスの上位)
$0001=チェックするVRAMバッファ(VRAMアドレスの下位)
出力:<同じアドレスの場合>
A=VRAMバッファにあるVRAMの内容
Cf=0
<違うアドレスの場合>
チェックしたVRAMバッファ+0=チェックするVRAMアドレス上位($0000)
チェックしたVRAMバッファ+1=チェックするVRAMアドレス下位($0001)
Cf=1
Y=VRAMバッファインデックス
VRAMバッファX=インデックス(+0の位置)、Y=スキップする個数(3バイトで1)で
X=$0302+X+3*(Y-1)でチェックするアドレスを決めます
そのアドレスと$0000、$0001と比較して
同じならAレジスタに+2のデータを読み、Cf=0にしています
違う場合は+0、+1に比較した$0000、$0001のアドレスを書き込み
Cf=1にしてエラーとみなします
$E97D:座標からネームテーブル0変換
入力:$0002=Y座標(0から224)
$0003=X座標(0から255)
出力:$0000=ネームテーブル0上位
$0001=ネームテーブル0下位
使用:A
ドットの座標からネームテーブル0($2000-$23BF)に変換を行います
$E997:ネームテーブルから座標変換
入力:$0000=ネームテーブル上位
$0001=ネームテーブル下位
出力:$0002=Y座標(0から232)
$0003=X座標(0から248)
使用:A
ネームテーブルオフセット($0000-$03BF)からドットの座標に変換を行います
入力のネームテーブル上位は$0000から$03BFで計算を行っているので
どのネームテーブル、ネームテーブルオフセットでも同じ出力になります
$E9B1:乱数の発生
入力:X=インデックスデータ
Y=長さ
ゼロページ
出力:ゼロページ+入力したXレジスタからゼロページ+入力したX+Yまで
使用:A、X、Y
$0000
指定したゼロページ+Xレジスタのアドレスを起点として長さYまでを
発生レジスタとして乱数の発生を行います
指定したゼロページ+XレジスタのBit1だけマスクして$0000にストア
指定したゼロページ+1+XレジスタのBit1と$0000とEORする
0ならCf=0、1ならCf=1
全発生レジスタを右シフトする
$E9C8:仮想OBJエリアセット
使用:A
仮想OBJを$0200に設定します。
$E9D3:ロジックカウンタ
入力:X=カウンタ0のアドレス(ゼロページ内)
A=カウンタ1のアドレス(ゼロページ内)
Y=カウンタ2のアドレス(ゼロページ内)
出力:X=カウンタ0のアドレス(ゼロページ内0から9)
A=カウンタ1のアドレス(ゼロページ内0から255)
Y=カウンタ2のアドレス(ゼロページ内0から255)
使用:A、X、Y
カウンタを1つ減らします
カウンタ0が基本になり、9からカウントダウンして-1になると9に戻ります
カウンタ0が9から0の時にカウンタ1のカウントダウン(00で止まる)
-1の時にカウンタ2のカウントダウン(00で止まる)
$E9EB:リアルタイムでコントローラを読む
出力:$0000:拡張端子のI-コントローラ
$0001:拡張端子のII-コントローラ
$00F5:I-コントローラ
$00F6:II-コントローラ
使用:A、X
$00FB
本体コントローラと外部のコントローラを読んで
各ワークエリアにデータをストアします。
$EA0D:コントローラデータの合成
入力:$0000:拡張端子のI-コントローラ
$0001:拡張端子のII-コントローラ
$00F5:I-コントローラ
$00F6:II-コントローラ
出力:$00F5:I-コントローラ
$00F6:II-コントローラ
使用:A
$E9EBをコールして得たデータをIコン、IIコンの2つにまとめます
$EA1A:リアルタイムで本体コントローラを読む
出力:$00F5:I-コントローラ
$00F6:II-コントローラ
$00F7:I-コントローラを1回押した時の内容
$00F8:II-コントローラを1回押した時の内容
使用:A、X、Y
$0000
$0001
リアルタイムでントローラを読み($E9EBをコール)
ワークエリアにストアします
$00F7と$00F8は
押されたままだと1になり、離すと0になります
$EA1F:リアルタイムで本体コントローラと拡張コントローラを読む
出力:$00F5:I-コントローラ
$00F6:II-コントローラ
$00F7:I-コントローラを1回押した時の内容
$00F8:II-コントローラを1回押した時の内容
使用:A、X、Y
$0000
$0001
リアルタイムでコントローラを読み($E9EBをコール)
コントローラデータの合成($EA0Dをコール)を行い
ワークエリアにストアします
$00F7と$00F8は
押されたままだと1になり離すと0になります
使用:A、X、Y
$0000
$0001
$EA36:本体コントローラを読む
出力:$00F5:I-コントローラ
$00F6:II-コントローラ
$00F7:I-コントローラを1回押した時の内容
$00F8:II-コントローラを1回押した時の内容
使用:A、X、Y
$0000
$0001
リアルタイムでコントローラを読み($E9EBをコール)、レジスタA、Yに読む
リアルタイムでコントローラを読み($E9EBをコール)
1回目と2回目に読んだ内容が同じになるまでループ
同じになったら$00F5から$00F8までのワークに
それぞれストアします
$EA4C:本体コントローラと拡張コントローラを読む
出力:$00F5:I-コントローラ
$00F6:II-コントローラ
$00F7:I-コントローラを1回押した時の内容
$00F8:II-コントローラを1回押した時の内容
使用:A、X、Y
$0000
$0001
$EA36と同様に本体コントローラと拡張コントローラで
コントローラの読み込みを行います
$EA84:PPUメモリを埋める
入力:A=PPUアドレス上位
X=埋めるデータ
Y=パラメータ(PPUアドレスの指定によって違う)
出力:X=指定した埋めるデータ
使用:A、X、Y
$0000
$0001
$0002
指定したPPUアドレスが$2000未満(パターンテーブル)なら
XレジスタのデータをYレジスタで指定した長さ*256バイトで埋めます
指定したPPUアドレスが$2000以上なら
Xレジスタのデータ$0400バイトをネームテーブルに埋め
Yレジスタのデータ$40バイトをネームテーブルのアトリビュートに埋めます
主に画面クリアに使用
PPUアドレスは上位のみで下位アドレスは$00になります。
転送量も上位になるので256バイト単位になります。
$EAD2:メモリを埋める
入力:A=埋めるデータ
X=スタートアドレス上位
Y=エンドアドレス下位
使用:A、X、Y
$0000
$0001
CPUメモリを特定のデータで埋めます
指定できるのはアドレス上位のみなのでページ単位$nn00-$mmFFが指定範囲になります
$EAEA:スクロールをセット
入力:$00FC=ポート$2005の内容(X座標)
$00FD=ポート$2005の内容(Y座標)
$00FF=ポート$2000の内容
使用:A
VRAMをアクセスした後スクロールセットをするのに使用します
スクロールをセット
PPUR#0を$00FFの内容でセット
$EAFD:テーブルジャンプ
入力:A=テーブジャンプNo.nn($00-$7Fまで)
1st=テーブルジャンプNo.$00下位アドレス
2nd=テーブルジャンプNo.$00上位アドレス
3rd=テーブルジャンプNo.$01下位アドレス
4th=テーブルジャンプNo.$01上位アドレス

使用:A、X、Y
$0000
$0001
テーブルジャンプを行います
BASICのONAGOTOnnnn,mmmm,...に相当
使用例
JSR$EAFD
DWADDRESS0;A=$00のジャンプ
DWADDRESS1;A=$01のジャンプ
DWADDRESS2;A=$02のジャンプ

$EB13:HVC-007キーボードのキーマトリクス入力
出力:$0000=キーマトリクスP29の反転データ
$0001=キーマトリクスP28の反転データ
$0002=キーマトリクスP27の反転データ
$0003=キーマトリクスP26の反転データ
$0004=キーマトリクスP25の反転データ
$0005=キーマトリクスP24の反転データ
$0006=キーマトリクスP23の反転データ
$0007=キーマトリクスP22の反転データ
$0008=キーマトリクスP21の反転データ
使用:A、X、Y
$00FB
ファミリーBASICのキーボード(HVC-0007)のキーマトリクス入力を行います
出力データは反転されているので押していると1、離している0になります
P31がBit0...P38がBit7になります
$EB66:ポインタ+8バイト、Y=#$00、DEC($02)
入力:$0000=ポインタ下位
$0001=ポインタ上位
$0002=ブロック(長さ)
出力:Y=$00
$0000=ポインタ下位
$0001=ポインタ上位
$0002=ブロック(長さ)-1
使用:A、Y
$0000=ポインタ下位
$0001=ポインタ上位
$0002=ブロック(長さ)
$0000から$0001をポインタとして
ポインタ+8
Y=#$00
$0002の内容を-1にします
パターンテーブル定義用
$EB69:ポインタ+Aバイト、Y=#$00、DEC($02)
入力:A=ポインタにプラスする値
$0000=ポインタ下位
$0001=ポインタ上位
$0002=ブロック(長さ)
出力:Y=$00
$0000=ポインタ下位
$0001=ポインタ上位
$0002=ブロック(長さ)-1
使用:A、Y
$0000=ポインタ下位
$0001=ポインタ上位
$0002=ブロック(長さ)
$0000から$0001をポインタとして
ポインタ+A
Y=#$00
$0002の内容を-1にします
パターンテーブル定義用
$EBAF:パターンテーブル定義
入力:Y=PPUアドレス上位
A=PPUアドレス下位+コード
Bit7:PPUアドレスA7
Bit6:PPUアドレスA6
Bit5:PPUアドレスA5
Bit4:PPUアドレスA4
Bit3:コードD111=反転通常、10=埋める通常
Bit2:コードD001=通常埋める、00=通常通常
Bit1:コード1=リードモード、0=ライトモード
Bit0:コード1=$FFで埋める、0=$00で埋める
X=キャラクタ数
1st=パターンデータアドレス下位
2nd=パターンデータアドレス上位
使用:A、X、Y
$0000
$0001
$0002
$0003
$0004
$00FF
パターンテーブル(キャラクタ)の定義を行います
アクセスするPPUアドレスを指定しますがPPUアドレス下位のBit3-0は0になる($xxx0)
次にコード解析でBit1-0の設定、Bit3-2で各キャラクタ定義を行います
キャラクタは1キャラ8バイト+8バイトの計16バイト必要で
コードによって定義のパターン(必要なパターンデータ数)が変わります
コード11(パターンデータは1キャラクタ16バイト必要)
プレーン0パターンデータを反転してVRAMに書き込む
プレーン1ライトモード=パターンデータをVRAMに書き込む
リードモード=VRAMの内容をパターンデータに書き込む
コード10(パターンデータは1キャラクタ8バイト必要)
プレーン0ライトモード=VRAMに$FFまたは$00で埋める
リードモード=VRAMのデータを読み、VRAMに書き込む
プレーン1ライトモード=パターンデータをVRAMに書き込む
リードモード=VRAMの内容をパターンデータに書き込む
コード01(パターンデータは1キャラクタ8バイト必要)
プレーン0ライトモード=パターンデータをVRAMに書き込む
リードモード=VRAMの内容をパターンデータに書き込む
プレーン1ライトモード=VRAMに$FFまたは$00で埋める
リードモード=VRAMのデータを読み、VRAMに書き込む
コード00(パターンデータは1キャラクタ16バイト必要)
プレーン0ライトモード=パターンデータをVRAMに書き込む
リードモード=VRAMの内容をパターンデータに書き込む
プレーン1ライトモード=パターンデータをVRAMに書き込む
リードモード=VRAMの内容をパターンデータに書き込む
$ED37-$EE16:許諾画面データ
$EE17:ドライブのモータスタート
入力:A=$4025の内容
使用:A
$00FA
/RESET=1にして/MOTOR=0にします
前もってディスクドライブモーターストップ($E685)を実行しておく必要があります
$EE24:ディスクシステムスタート(リセットベクタ)
電源を入れたり、リセットされるとココにとびます。
$F1C3:キャラクタ定義
使用:A、X、Y
$0000
$0001
$0002
$0003
$0004
$00FF
BG(PPU$1000)に数字、英字のキャラクタ41文字の定義を行います
$F431:許諾画面の書き込みチェック
出力:Zf=0エラーなし
1エラーあり
キャラクタ定義、カラーの設定、BG-Aをクリア
BG-Cにロードされた許諾データとROM内にある許諾データの比較を行います
$F48C:キャラクタ定義の退避または復帰
入力:Y=$03キャラクタデータの退避
$07キャラクタデータの復帰
使用:A、X、Y
$0000
$0001
$0002
$0003
$0004
$0007
$0008
$0009
$000A
$000B
$00FF
PPU$2930以降
ディスクを起動したときにはキャラクタ、プログラム、許諾データが一括ロードされている場合があります
キャラクタデータがロードされていても必ずしも許諾画面を確実に表示する英数字コードとは限りません
そこで、このルーチンでロードしたPPU$1000以降のキャラクタデータを
一旦PPU$2930以降を退避用エリアとして一時退避、復帰を行います
データを退避したら英数字のキャラクタ定義を行いPPUにロードした許諾画面のチェック、表示
許諾画面の表示が終了したらデータの復帰を行いロードしたプログラムの実行となります。
$0000:JSR文の後の第1パラメータ
データアドレス下位
ポインタ下位
$0001:JSR文の後の第2パラメータ
データアドレス上位
ポインタ上位
$0002:JSR文の後の第3パラメータ
VRAMアドレス下位
指定したマウントファイル数
$0003:JSR文の後の第4パラメータ
VRAMアドレス上位
$0004:スタックポインタ退避
データの長さ
$0005:JSRで戻るアドレス下位
ディスクアクセスリトライカウンタ
VRAMバッファの長さ
$0006:JSRで戻るアドレス上位
マウントファイル数
$0007:ブロックコード
$0008:エラーコード
最初に読み込むロードナンバ
$0009:ロードコントロール$00=ロード、$FF=スキップ
セーブコントロール$00=セーブ、$FF=ベリファイ
$000A:ファイルの先頭アドレス下位
$000B:ファイルの先頭アドレス上位
$000C:ファイルの長さ下位
$000D:ファイルの長さ上位
$000E:パラメータnnバイトの値
ファイルカウンタ
$00F5:コントローラIの内容
$00F6:コントローラIIの内容
$00F7:コントローラIを1回押した時の内容
$00F8:コントローラIIを1回押した時の内容
$00F9:ポート$4026の内容
$00FA:ポート$4025の内容
$00FB:ポート$4016の内容
$00FC:ポート$2005の内容(垂直)
$00FD:ポート$2005の内容(水平)
$00FE:ポート$2001の内容
$00FF:ポート$2000の内容
$0100:NMIコントロール
$00=BIOS内
$40=JMP($DFF6)
$80=JMP($DFF8)
$C0=JMP($DFFA)
$0101:IRQコントロール
$00=ロード・スキップの終了
$01-$3F=ロード・スキップバイト
$40=ディスク1バイトリード・ライト
$80=ディスクステータス
$C0=JMP($DFFE)
$0102-$0103:RESETコントロール
$0102:3553=JMP($DFFC)
$0102:35AC=$0103を$53にしてスクロールセットの後、JMP($DFFC)
それ以外のデータはデモ
$0200-$02FF:仮想OBJエリア
$0300-$03FF:VRAMバッファ
■ディスクドライブのプロテクト
最初のドライブにはプロテクトは掛かっていませんでしたがコピープログラムの発表や発売され
一定時間(約1秒)しか書き込みが出来ないようになりました。
プロテクトの内容はドライブ内の基板でライト信号が送られたらカウントして約1秒たったら
シャットダウンする方式でコレをパターンカットとバイバスを通して無効する方法があります。
最終的にはFDC自身に同等のプロテクトを掛けるのですがロジック回路で破られています。
ソフトでのプロテクト
元々QDなのでそれほどきついプロテクトは掛けられません。
特定のソフトのコピーツールに対してのプロテクトとなります。
またPCから読み書きやデュプリケータでは全くプロテクトの意味がありません。
ダミーファイル
ブロックコード$02のマウントファイル数より多くファイルを持つタイプ
とびだせ大作戦、夢工場ドキドキパニック、ディープダンジョンII勇士の紋章(店頭販売、書き換え共)が該当します
主に対DISKHACKERV1.1用です
DISKHACKERV1.1までではファイル数を見て必要なファイルだけをコピーしていました
とびだせ大作戦のA面では実際のファイルはブロックコード$02のファイル数より1つ多く
DISKHACKERV1.1でコピーすると最後の1つだけファイルが足りないものになります
そのファイルが無ければコピー品と判断しています
ダミーファイルとはいえ、とびだせ大作戦はダミーファイルが本当のメインプログラムになっていて
ゲームスタートするとMAINPROG(警告プログラム)がロードされ、その後すぐにダミーファイル(本当のメイン)が
RAMに上書きされ実行されます
ダミーファイルが上書きされないと警告プログラムが動いてコピー品とみなされメッセージを出します
夢工場ドキドキパニック、ディープダンジョンII勇士の紋章では数バイトのデータが書き込まれていて
このファイルがロード出来るかでコピー品の判断を行っています。
とびだせ大作戦ではコピー失敗すると作者からメッセージが出ます。
夢工場ドキドキパニックのコピー失敗
勇士の紋章のコピー失敗
新鬼ヶ島のコピー失敗
40KBファイル
コピーツールのバッファより大きいファイルを持つタイプ
麻雀家族、スーパーロードランナーが該当
1つのファイルがRAM容量よりも大きくなっています
ファイルが40KBのファイルがあり、コピーバッファが少ないとコピー出来ないようになっています
主に対DISKHACKERV1.2用
DISKHACKERV1.3ではV1.2より大きいバッファを持ちコピー出来ます。
ファミコンのディスクはランダムアクセスが出来ないQDなのでトラックやセクタ等は無く
テープと同じように最低でも一つのファイルを一気に書き込まないといけません
つまり分割して一つのファイルを書き込みする事はかなり困難になります
しかし、本体メモリは32KB(RAMアダプタ)+2KB(ワーク)+2KB(VRAM)+キャラクタ(8K)計44KBなので
4KB内でコピープログラム、最低限40KBのバッファを取ってコピー出来るツールもあります
スーパーロードランナーではSIDEAの4番目のファイルLRMAIN01が
ロードアドレス$6000で長さ$A000になります
3番目のファイルPROTECT(ローダ)を本体内ワークRAMにローダを転送、実行
LRMAIN01は$6000から読み込まれますが
ローダによって始めの$2000バイトを空読みして
残りの$8000バイトが$6000-$DFFFにロードされます
ロード終了後、$DFE0-$DFEFのチェック
$6000-$DFFFのチェックを行い
正常ロード出来たなら$6000にジャンプします
44KBファイル
本体内の全RAMと同じ容量のファイルを持つタイプ
HACKERのソフトで途中から出てきたプロテクトです
1つのファイルの大きさが44KBで本体内の全RAMより同じになります
これだとコピープログラムの入る所が無くソフトのコピーツールではコピー出来なくなります
メインプログラムが$4800からロードしてBIOSの$F7FFまでロードするようになっていて
実際にはRAM領域の$6000-$DFFFにプログラムがロードされるようになります
HACKERのソフトで同タイトルでもプロテクトが掛かっているのと掛かっていない2タイプがあります。
偽データ
ブロックコード$03と$04が合わないプロテクトです
アイツーのジンゴローが該当
ブロックコード$03にはファイル名やロードされるアドレス、長さが書き込まれています
ブロックコード$04が実際のプログラムやデータとなります
そのブロックコード$03で書き込まれた長さとブロックコード$04の長さが合わないようするタイプです
コピーツールでブロックコード$03を見てブロックコード$04のファイルをコピーする
コピーツールに対して有効です
ジンゴローでは最後のファイルがブロックコード$03では1バイトの長さになっていますが
次のブロックコード$04では1バイトでなく7バイト×$2000=$E000バイトのデータが書き込まれており
IPLプログラムでデータをメモリとVRAMに振り分けながらロードしています
第1バイトがプログラムデータ(ストアアドレス下位の値で引く)
第2バイトがダミー
第3バイトがダミー
第4バイトがダミー
第4バイトがダミー
第6バイトがキャラクターデータ(ストアアドレス下位の値で足す)
第7バイトがダミー
このデータ群をロード(CRC計算もされているのでダミーデータも必要)する様になっています
CRCエラー
ファイルにワザとCRCエラーの出るファイルが存在するタイプ
トンカチエディタが該当
ディスクが起動するまでは通常のフォーマットでその後の読み込みにCRCエラーの出るファイルを
ロードしてCRCエラーが出るかチェックします
コピーツールによっては正しいCRCが書き込まれるので
CRCエラーが出るはずのファイルがエラー無しとなり
コピーされたと判断しています
■オリジナルフォーマット
最後のメーン・ファイルが独自のフォーマットで書き込まれIPLプログラムでロードするプロテクトです
子育てゴッコ、クイックハンターが該当
検査システムでチェックするディスクデータがディスクの最後までデータの読み書きが出来るかチェックされる為
テストファイルが上書きされるので注意が必要なタイプです
キャラクタの移動を行います
途中まで普通のフォーマットでIPLもそのフォーマット内のファイルにあるので
IPLをロードして実行、独自のフォーマットで書かれたプログラムを読む
単純なバイナリデータや、加工したデータ、プログラムとダミーデータとVRAMデータと混合等
ソフトによってデータが変わります
子育てゴッコではメインプログラムは$0200-$05FFで
通常のフォーマットの後ろに直接メインプログラムが書かれていて
IPLプログラムでこのメインプログラムを$0200からロード
ロード終了したら最初の0200:20と最後の05FF:23をチェックして
ロードされたか判断をしています
このメインプログラムのコピーに失敗すると隠しゲームのバリケードゲームが遊べます。
クイックハンターではIPLプログラムまで行くまでに自己書き換え(一部分が暗号化されている)しながら
数ヶ所にジャンプされています
最終ファイルはブロックコード$00として書き込まれており
$1000バイト空読みしてから$B000-$CFFFにロードします
$B000以降のロードデータは暗号化されておりEOR$C9(データを一部反転)しながらロードします
当然、このブロックコード$00のファイルもCRCチェックも行われています。
メーカーコード$00
HACKER製コピーツールでHACKER製ソフトをコピー出来ない為のプロテクトです
通常のソフトはメーカーコードは$01からになっており$00は使用していません
そこでHACKERのソフトはここに$00を書き込みを行っています
メーカーコードが$00だとHACKER製コピーツールではエラーFFを出力して
コピーできないようになっています
DEV1のRAMディスクとディスクハッカーVer1.0ではエラーが出ずにコピー出来ます
DEV2のRAMディスクとディスクハッカーVer1.0ではエラーFFが出てコピー出来ません
他のコピーツールではコピーが出来ますが44KBファイルはコピーできません
プログラム書き換えチェック
これはプロテクトといってもコピープロテクトでは無くプログラムの改造されたかチェックをするタイプ
改造するとチェックサムエラーのメッセージが出たり、起動画面に飛んだり、ゲームが起動出来ない様になっています
ただし完全なチェックを行っているとは限りません(コピーライト表記の書き換えを阻止するだけの為?)
コナミやカプコンのソフトに見かけます
セクションZのチェックサムエラーメッセージ
ナムコのディスクソフト
プロテクトでは無いのですがナムコのディスクソフトは非ライセンスソフトと同じような
許諾画面を出さないような事をしています。
実際には許諾画面を出しているのですがRAMアダプタのプログラムで動いてなくて
ゲームソフト(IPLMAIN)が割り込みでRAMアダプタからの許諾画面表示
を乗っ取っていながらゲームソフトから許諾画面を表示しています。
これにより任天堂が許諾画面表示の乗っ取りプログラムに対する
プロテクトを掛けるのが難しくなっています
つまりプロテクトを掛けるのを防ぐ為の任天堂に対する逆プロテクト(?)に思えますが
真相は不明です。

Enri's HP
http://www43.tok2.com/home/cmpslv/














1985年2月22日金曜日

[機器][TVゲーム] ファミリーベーシックでBASICプログラム




[機器][TVゲーム] ファミリーベーシックでBASICプログラム
ファミリーベーシックV2.1A
小容量のメモリ構成ながら意外としっかりした作りになっている。
いろいろ不満はあるものの低価格BASICとしては結構な出来と思われる
NMI割り込み(V-Sync)
PPUからの割り込み
エントリアドレスは$00ED
ゼロページ内にジャンプするのでBASICで任意に変える事が出来ます
セレクト$CDA7
BASIC$880F
リセット割り込み
電源を入れたり、リセットボタンが押されるとココに飛びます
エントリアドレスは$C400
IRQ割り込み
エントリアドレスは$FFF0
謎の部分があります。
割り込みベクタをみると$FFFEが$FFF0となっています
AFFF0:CLI
DB$5C
RTS
この$5Cが謎で動作不明です
もし、このIRQが使えるとして、OPコード$5Cは1バイト命令と思われます
その下のRTSで帰るという事はスタック関係と思われます
BRKが掛かったときにPSR、PCの順にスタックに退避するので
$5Cの後RTSで帰ったとすると、PSRの1バイトをスタックから取り出す事になります
この取り出したPSRをどうするのか確かめていませんし
全く関係なく残ったデータなのかもしれません
ただプログラムの流れでは何かにPSRを保存してデバッキングする為のようにみえます
ROMの回路図
PRGROMにはHVC-FB1-2A、HVC-FB1-2Bと印字(バージョンで変わります)
CHRROMにはHVC-FB1-0と印字されています。(CHRROMはV1.0と同じ)
単3電池を2本使い、RAMの内容をバックアップしています。
ワーキングRAMはS-RAMでスイッチの切り換えでバックアップスイッチONでスタンバイモードにします。
スタンバイモードではデータを書き込む事が出来ないのを利用してBASICではRAM領域にデータの書き込みチェック
データの書き込みが出来ればスイッチOFF、
データの書き込みが出来なければスイッチON
バックアップスイッチの判断をしています。
またS-RAMのアドレスは$6000から配置されていますが、ミラーを利用して
$7000-$77FFとして使用しています。
ファミリーBASICキーボードの回路図
本体前面にある15ピンからキーボードを接続するためどうしても複雑になります
IC4017のRSTはOUT0で、1にすることでIC4017のカウンタをリセット
IC4017の/CKEはOUT1で、1から0にすれば
IC4017のQ0-9が順番にカウント(選択)されます
IC4019に繋がっているキーデータP31~P38をポート$4017D4-1で読みます
1度に読み込むデータは4Bitなので2回読むことになります
下位、上位データを読み込む事でIC4017の/CKEが0から1になり
次のキーラインを読む為下位データを選択した時点で/CKEは1から0になり
キーラインが新しくカウント(指定)されます
キーボード
出力ポート
4016D2:OUT2デバイスの選択1=キーボード、0=CMTREAD
4016D1:OUT1データセレクト&ラインカウンタ1=上位データ、0=下位データ
4016D0:OUT0キーライン(P2)のリセット1=行う、0=行わない
入力ポート
4017D4:キーデータD7(上位の場合)/キーデータD3(下位の場合)
4017D3:キーデータD6(上位の場合)/キーデータD2(下位の場合)
4017D2:キーデータD5(上位の場合)/キーデータD1(下位の場合)
4017D1:キーデータD4(上位の場合)/キーデータD0(下位の場合)
キーボードはロッジクで組まれ、タイミングをソフトで行う必要があります。
1.キーラインのリセット
$4016:$05(OUT2=1、OUT1=0、OUT0=1)、NOP*6
*2.下位データセレクトのセット
$4016:$04(OUT2=1、OUT1=0、OUT0=0)、ウエイト
3.下位データの読み込み
$4017にあるキーデータ(下位)を読み、ワークにセット(右シフト1回してAND#$0Fにしてセット)
4.上位データセレクトのセット
$4016:$06(OUT2=1、OUT1=1、OUT0=0)、ウエイト
5.上位データの読み込み
$4017にあるキーデータ(上位)を読み、ワークにセット(左シフト3回してAND#$F0にしてセット)
これを*2の所でループ(計9回繰り返し)して、全てのキースキャンが出来ます。
ROM$AF9B-$AFE3を参照
CMT
出力ポート
4016D2:OUT2デバイスの選択1=キーボード、0=CMTREAD
4016D0:OUT0CMTライトデータ
入力ポート
4016D1:CMTリードデータ
シャープのMZ、X1と同じくPWM方式でソフトでタイミングを行います。
テープフォーマットもかなりMZ、X1に近いです。
BASIC自体はBASICプログラムしかセーブ・ロードしかできません。
バイナリファイルをセーブ・ロードする場合はプログラムを自作する必要があります。
  インフォメーションブロック(FCB)
”0”*20000
テープマーク(”1”*40+”0”*40)
”1”
インフォーメーション128バイト
チェックサム2バイト
”1”
データブロック
”0”*20000
テープマーク(”1”*20+”0”*20)
”1”
データブロック
チェックサム2バイト
”1”
1バイトデータの内容
”1”、D7、D6、D5、D4、D3、D2、D1、D0
インフォメーションブロック
属性1バイト($02=BASIC、$03=BG-GRAPHIC)
ファイルネーム16バイト16文字以内の場合最後にエンドマーク$00
予備1バイト$00
長さ2バイト
ロードアドレス2バイト
実行アドレス2バイト
空き104バイト
(注)チェックサムは単純にデータを足したものではなく、1バイトデータの各Bitの内容の’1’の数になります。
データが$FFなら+8、$C0なら+2、$00なら+0になります
BG-GRAPHICデータは
BG-Bの内容をCPU$0700-$07FFHへ転送したデータを4分割でセーブ
BG-Bへ転送するデータをCPU$0700-$07FFHに4分割でロード、PPUへ転送

Enri's HP
http://www43.tok2.com/home/cmpslv/
http://www43.tok2.com/home/cmpslv/Famic/Fambas.htm















■操作
キャラクタ
スプライトのキャラクタになります
BGのキャラクタになります
これがBASICのアスキーコードの基準となります
アスキーコードは$00-$1Fのキャラクタは表示されずコントロールコードとして使用されます
ただしPRINT文には反映されません
$00=Null$10=^P*SHIFT+F5
$01=^AINSモードのON/OFF$11=^Q*SHIFT+F6
$02=^B*SHIFT+F1$12=^RINS
$03=^CBREAK(プログラム停止は出来ない)$13=^S
$04=^D画面の初期設定$14=^T
$05=^Eカーソル以降1行分の消去$15=^U
$06=^F*SHIFT+F2$16=^Vカナモードにする
$07=^GBEEP音を出す$17=^W英数字モードにする、*SHIFT+F7
$08=^HDEL$18=^X*SHIFT+F8
$09=^I$19=^Y
$0A=^Jラインフィールド$1A=^Zカーソル以降画面下の消去
$0B=^KHOME$1B=ESC
$0C=^L画面クリア$1C=カーソル右
$0D=^MRETURN$1D=カーソル左
$0E=^N*SHIFT+F3$1E=カーソル上
$0F=^O*SHIFT+F4$1F=カーソル下
*SHIFT+Fnは英数モードキー入力で使用
BGGRAPHIC
SELECT
キャラクタを書きます
カーソルキーカーソルの移動
[RETURN]配色番号の変更
[INS]マーカー左移動
[HOME]グループ+1
[SHIFT]+[HOME]グループ-1
[D]キャラクタの消去
[ESC]ファンクションメニュー
グループ表
COPY
キャラクタのコピーを行います
カーソルキーカーソルの移動
[INS]キャラクタの取得
[DEL]キャラクタの複製
[ESC]ファンクションメニュー
MOVE
カーソルキーカーソルの移動
[INS]1回目キャラクタの取得
2回目キャラクタの消去
[DEL]キャラクタの移動
[ESC]ファンクションメニュー
CLEAR
[SPACE]画面消去の実行
FILE
CMTのロード・セーブを行います
画面の指示に従いセーブかロードを決め
ファイルネーム(最大16文字)を入力して[RETURN]
CHAR
文字の入力を行います
[ESC]ファンクションメニュー
カーソルキー上カーソル上の移動
カーソルキー下カーソル下の移動
[SPACE]メニュー(MODE)の実行
ABS(数式)
絶対値を求める
ASC(文字列)
ヌルストリングの場合0になる
BEEP
音を鳴らす
アドレス…&H0000~&HFFFFまたは-32768~32767
マシン語のサブルーチンの実行
CGENn
n…0~3
BG、スプライト面にキャラクタの割り当てを行う
ポート$2000Bit4-3の設定になります
+------------+
|n|BG面|スプライト面|
|-+---+------|
|0|A|A|A=マリオ等のスプライトキャラクタ
|1|A|B|B=英数字等のBGキャラクタ
|2|B|A|
|3|B|B|デフォルト、^DはCGEN2の設定
+------------+
CGSETm,n
m…0~1BG面
n…0~2スプライト面
BG、スプライト面のパレットグループの指定
*BGGRAPHICで描いた背景をそのままの色にしておく場合は
CGSET1,1にする
CHR$(数式)
数値0~255または&H0~&HFFをキャラクタコードして変換する
CLEAR
変数、配列のクリアを実行
CLEARアドレス
BASICで使用するメモリ上限アドレスの指定
CLS
テキスト画面をクリア
COLORx,y,n
x…カラム0~27
y…行0~23
n…配色番号0~3
テキスト画面のカラー指定
CONT
プログラムの再開
CSRLIN
カーソルY座標の取得
CUTn0[,n1,n2,n3,n4,n5,n6,n7]
n0~n7…DEFMOVEで定義した番号0~7
MOVEで動いたスプライトを停止
DATA定数[,定数,定数,……]
定数…数値または文字列
READ文で使用するデータの定義
DEFMOVE(n)=SPRITE(a,b,c,d,e,f)
n…キャラクタの動作番号0~7
a…キャラクタの種類0~15
b…方向
c…速さ0=256フレーム毎、1(最高速)~255(最低速)
d…移動量0=表示しない、1~255(移動量)
e…優先順位0=BGより前、1=BGより後
f…配色番号0~3(CGSETで指定した番号)
スプライトの動作の定義を行う
キャラクタの動作番号
0…マリオ6…車12…レーザー
1…レディ7…スピナー13…シェルクーパー
2…ファイターフライ8…スターキラー14…サイドステッパー
3…アキレス9…スターシップ15…ニットピッカー
4…ペンペン10…爆発
5…ファイアーボール11…ニタニタ
方向
812
7■3■=スプライト
6540=停止状態
速さ
c=フレーム毎1/30秒×2ドット(斜め移動ではx、yとも2ドット)
移動量
d×2ドットの移動量
DEFSPRITEn,(a,b,c,d,e)=f
n…定義するスプライト番号0~7
a…配色番号0~3(CGSETで指定した番号)
b…合成型0=8×8キャラクタ、1=16×16キャラクタ
c…優先順位0=BGより前、1=BGより後
d…X軸反転0=反転しない、1=反転する
e…Y軸反転0=反転しない、1=反転する
f…b=08×8キャラクタの場合
文字列”i”
文字式CHR$(i)
文字変数1キャラクタ分のデータ
b=116×16キャラクタの場合
文字列”ijkl”
文字式CHR$(i)+CHR$(j)+CHR$(k)+CHR$(l)
文字変数4キャラクタ分のデータ
b=116×16キャラクタのfのデータ
+---+
|i|j|
|-+-|
|k|l|
+---+
スプライトの定義を行います
定義可能のスプライト番号は0~7の8個
DIM配列名(m1[,m2])[,配列名(n1[,n2])]
配列宣言を行います
配列名は数値変数、文字列変数の両方可
END
プログラムを終了、BASICコマンド待ちへ行きます
ERAn0[,n1,n2,n3,n4,n5,n6,n7]
n0~n7…DEFMOVEで定義した番号0~7
MOVEで動いたスプライトを停止、消去を実行
FORi=lTOm[STEPs]
NEXT
i…ループ変数
l…初期値
m…終了値
s…増分値(負でも可)
FOR~NEXT間の処理を繰り返します
NEXTの後にループ変数名をつけるとエラーになります
FRE
ユーザメモリの未使用サイズの取得
GOTO行番号
指定した行番号へジャンプ
GOSUB行番号
指定して行番号をサブルーチンとして呼び出す
HEX$(n)
n…数式-32768~+32767
数式を16進数文字列に変換
IF式THEN行番号または文
倫理式による分岐の実行
条件が成立すればTHEN以降の行番号へジャンプ、または文を実行
成立しなければ次の行番号へ
真=0、偽=0以外
INKEY$
キーボードから一文字入力の実行
実行時キーが押されていれば押されたキーのキャラクタコードが入る
押されていなければヌルストリング0が入る
キャラクタコードは$00-$1Fを除く
INKEY$(0)
キーボードから一文字入力の実行
カーソルブリンクになり、キーが押されるまで待ちます
押されたキーのキャラクタコードが入る
キャラクタコードは$00-$1Fを除く
INPUT変数[,変数…]
INPUT文字列,変数[,変数…]
INPUT文字列;変数[,変数…]
文字列…メッセージ
変数……キーボードから入力した数値または文字を入れる変数
キーボードから文字入力を行い、数値または文字を変数に代入
INPUT文の文字列の後の;は文字列の後に?が表示されます
,は文字列の後に何も表示されません
INPUTで指定した変数の数と入力したデータの個数は同じでないといけません
区切りは,になる為文字列で,を入れたい場合”,”とダブルクォーテションを付ける
数値入力で文字を入力した場合、その文字が変数扱いになります(ただし値は0)
KEYn,文字列
n………ファンクションキー番号1~8
文字列…定義する文字列15文字以内
ファンクションキーの内容を定義します
コントロールコードやキーボードで入力出来ないキャラクタを定義する場合
はCHR$(n)を使用します
KEYLIST
定義されているファンクショキーの内容を表示します
コントロールコードは()内に表示されます($00-$1Fでは+$40で表示)
リターン(コントロールコード$0D^M)の場合(M)と表示
LEFT$(文字列,n)
文字列…31文字まで
n………文字列から取り出す長さ
文字列の左端からn文字まで取得
nが文字列より大きい場合は文字列全て
nが0の場合はヌルストリング
LEN(文字列)
文字列の長さを取得0~31
文字列が0の場合はヌルストリング
コントロールコード、スペースも文字列の長さに加わる
LINPUT文字変数
LINPUT文字列,文字変数
LINPUT文字列;文字変数
文字列……メッセージ
文字変数…キーボードから入力した文字を入れる文字変数
キーボードから文字入力を行い、文字を文字変数に代入
LINPUT文の文字列の後の;と,は同じ動作をします
INPUT文と違い”,”とダブルクォーテションを入れる必要はなし
文字列も文字変数の最初に入る為
入力可能な文字は文字列と文字変数を含めて31文字まで
LIST[m][-n]
LIST[m][,n]
m…表示する初めの行
n…表示する終りの行
メモリにあるBASICプロラムの表示
LOAD[”ファイル名”]
カセットにあるBASICプロラムのロード
ファイル名は16文字まで
BG画面のロードはBGGRAPHICで行う
LOAD?[”ファイル名”]
LOADPRINT[”ファイル名”]
カセットでセーブしたBASICプロラムのベリファイ
ファイル名は16文字まで
LOCATEx,y
x…水平方向カラム0~27
y…垂直方向行0~23
カーソルを指定の位置へ移動
BASICのシステム上、画面全体の移動不可
MID$(文字列,m,n)
文字列…文字列最大31文字
m………文字列の最初を1として取得開始の文字位置
n………取得する文字の長さ
指定した文字列のmからm+nの文字を取得
MOVEn0[,n1,n2,n3,n4,n5,n6,n7]
n0~n7…DEFMOVEで定義した番号0~7
DEFMOVEで定義された動作の開始
MOVE(n)
n…0~7DEFMOVEで定義したキャラクタの動作番号
MOVE命令で動いているキャラクタの動作が完了したか調べる
0=動作完了
-1=動作中
NEW
BASICプログラムの消去
ON式GOTO行番号[,行番号,行番号…]
式の値によって指定された行へジャンプ
ON式GOSUB行番号[,行番号,行番号…]
式の値によって指定された行へサブルーチンジャンプ
ON式RETURN行番号[,行番号,行番号…]
式の値によって指定された行へ復帰
ON式RESTORE行番号[,行番号,行番号…]
式の値によってデータを指定
PALETmn,c1,c2,c3,c4
m……B=BGカラーを選択、S=スプライトカラーを選択
n……配色番号0~3
c1…バックドロップの色ただしn(配色番号)=0で有効
c2…パレット+1のカラーコード
c3…パレット+2のカラーコード
c4…パレット+3のカラーコード
配色番号のカラーの設定
PAUSE[n]
n…0~32767
BASICプログラムの一時休止
nを省略すると何かキーが押されるまで待つ
PEEK(アドレス)
指定したメモリからデータの取得
PLAY文字列
文字列を演奏プログラムとして実行
”チャンネルA:チャンネルB:チャンネルC”の形式になり
各チャンネルに下記のコマンドが使用可
ただしチャンネルCではエンベロープは無効(Yn、M1)
T、Y、M、V、Oコマンドは値の維持可
T…テンポ(速い)1~8(遅い)
Y…デューティ比
0=12.5%、2=50.0%
1=25.0%、3=75.5%
M…エンベロープ0=オフ、1=オン
V…音量またはエンベロープの長さ
M0の場合音量少0~15音量大
M1の場合短い0~15長い
O…オクターブ(低音)0~5(高音)
R…休符後ろに長さを指定
C~B…音階後ろに長さを指定
C、#C、D、#D、E、F、#F、G、#G、A、#A、B
0~9…長さ
0…32分音符5…4分音符
1…16分音符6…付点4分音符
2…付点16分音符7…2分音符
3…8分音符8…付点2分音符
4…付点8分音符9…全音符
:…重音次のチャンネルの演奏データ
*デフォルトO3T4M0V15、音の長さ5
POKEアドレス,データ[,データ,データ…]
データ…0~255または&H00~&HFF
指定したメモリのデータを書き込む
POS(0)
画面のカーソル水平位置(X座標)の取得
()内の値は何でも構わない
POSITIONn,x,y
n…DEFMOVEで定義した動作番号0~7
x…水平方向0~255(有効範囲0~244)
y…垂直方向0~255(有効範囲5~220
デフォルト値x=120,y=120
MOVE文でスプライトを動かす為の初期位置の設定
PRINT[定数][;[定数]……]
[変数][,[変数]]
[式][[式]]
画面に計算結果等を画面に出力
続けて出力する場合,か;を使用
,は表示画面行を8文字で分割した区切りの最初に表示する
前のデータが区切りを超えると次のデータは次の区切りになる
|8文字|8文字|8文字|4文字|…1行
;はつづけて出力
ただし正の数値表示の場合、最初にスペースが入る
最後の;では次のPRINT文の内容を続けて表示可
ただしカーソルを移動する命令が実行されたら無効
PRINTのみだと1行改行
READ変数[,変数……]
DATA文にあるデータを変数に代入
変数と代入データ型は同じでないとエラー
読み込むデータが少ないとエラー
RESTORE指定がないと
最初のREADは最初のデータを読み
次のREADは続けて次のデータを読む
REM[コメント]
’[コメント]
BASICプログラム内にコメントを書く(行内範囲まで)
REMと’は別扱いになっており
GOSUB命令の後には’のみ使用可
RESTORE[行番号]
次に読むREAD文のDATAの指定
RESTOREのみの場合、1番最初にあるDATA文を指定
RETURN[行番号]
サブルーチンからの復帰
行番号がある場合、その行に復帰
行番号がない場合、GOSUBされた所に復帰
RIGHT$(文字列,n)
文字列…31文字まで
n………文字列から取り出す長さ
文字列の右端からn文字まで取得
nが文字列より大きい場合は文字列全て
nが0の場合はヌルストリング
RND(n)
n…数式または整数1~32767
指定した数式または整数の範囲内の乱数の発生
RUN[行番号]
変数を全てクリア、BASICプログラムの実行
行番号ありの場合、その行から実行
行番号なしの場合、最初の行から実行
SAVE[”ファイル名”]
BASICプロラムをカセットにセーブ
ファイル名は16文字まで(省略可)
BG画面のセーブはBGGRAPHICで行う
SCR$(x,y[,c])
x…水平方向カラム0~27
y…垂直方向行0~23
c…配色番号0=配色番号を取得しない(省略すると0)
1=配色番号を取得する
BG-GRAPHICで描かれた文字または絵の取得
SGN(n)
n…数式または整数ー32768~32767
数式また整数の値の符号の取得
1=正
0=0
-1=負
SPRITEn[x,y]
n…スプライト番号0~7
x…スプライト水平座標0~255(有効範囲0~240)
y…スプライト垂直座標0~255(有効範囲5~220)
DEFSPRITEて定義されているスプライトを指定の位置に表示
座標の位置を省略すると消去
同一座標に複数のスプライトを表示した場合
スプライト番号が小さいものが手前に表示される
スプライトは水平に4つ(8文字分)まで表示可
超えると重なる水平部分は表示されない
SPRITEOFF
全スプライトの表示オフ
SPRITEON
全スプライトの表示オン
STICK(n)
n…0=Iコントローラ
1=IIコントローラ
コントローラ十字ボタンの入力状態の取得

21
40=何も押されていない
同時入力の場合、対応する数字が加わる
STOP
BASICプログラムの中断
変数はクリアされないのでCONTで次の文の再実行可
STRIG(n)
n…0=Iコントローラ
1=IIコントローラ
コントローラSELECT、TART、B、A字ボタンの入力状態の取得
SELECT=2(Iコントローラのみ)
START=1(Iコントローラのみ)
B=4
A=8
同時入力の場合、対応する数字が加わる
STR$(x)
x…数式
数式の値を文字列に変換
正の数の場合は先頭にスペースが入る
SWAPn,m
n…変数1
m…変数2
2つの変数の値を交換
ただし交換する変数の型は同一でないといけない
SYSTEM
GAMEBASICモードにする
BASICプログラムは保護される
VAL(文字列)
文字列…数字の文字列-32768~32767
&H0~&HFFFF
文字列は数値に変換
ただし文字列の最初の文字が+-&または数字以外なら0となる
文字列の中に16進数の文字以外があれば、それ以降は無視される
VIEW
BGGRAPHIC画面をバックグランド面(テキスト)へコピー
カーソール位置はホームへ戻る
BGGRAPHIC画面の色をそのまま持ってくる場合
CGSET1,1を使用
XPOS(n)
n…DEFMOVEで定義されたスプライト動作番号0~7
DEFMOVEで定義された動作番号の水平位置の取得
YPOS(n)
n…DEFMOVEで定義されたスプライト動作番号0~7
DEFMOVEで定義された動作番号の垂直位置の取得
数の表現範囲
10進-32768から32767
16進&H0000から&HFFFF
変数
英字で始まる2文字を識別(255文字まで表記可)
行番号の範囲
0から65534最大255桁
2次元配列まで(メモリ範囲内で要素制限無し)
>F060->F061レジスタ退避用(R0)
GOSUB~RETURNネスト
>F071:
FOR~NEXTネスト
メモリ範囲内で制限なし
>F074->F075:次のVRAMアドレス
演算の優先順位
1.()で囲まれた式
2.関数
3.*/
4.MOD
5.+-
6.=<>><>=<=
7.NOT
8.AND
9.OR
10.XOR
エラーメッセージ
NF=NEXTwithoutFOR:FORが無いがNEXTがある
SN=Syntaxerror:文法間違い
RG=RETURNwithoutGOSUB:GOSUBが無いがRETURNがある
OD=OutofDATA:DATAが用意されていない
IL=Illegalfunctioncall:ステートメント、関数の呼び出し間違い
OV=Overflow:演算結果が許容範囲オーバー
OM=Outofmemory:メモリ不足になった
UL=UndefinedlineNumber:指定した行番号が無い
SO=Subscriptoutofrange:配列の添字が規定外
DD=DuplicateDefinition:配列の2重定義
DZ=Divisionbyzero:0の除算を実行
TM=Typemismatch:変数の型が合わない
ST=Stringtoolong:文字が31文字超えた
FT=FormulaToocomplex:式が複雑すぎる
CC=Can’tcountinue:CONTでプログラムの再開出来ない
MO=Missingoperand:最低限必要なパラメータが無い
TP=TapereadERROR:CMTから正しくデータが読めない
クィックスタート
Tキーを押しながら起動(リセット)、Tキーを離すと直接BASICメニュー画面に飛びます
ただしバックアップRAM領域のテストメモリを行うので
プログラムメモリの内容は全て$55に書き込まれます
プログラムを残しながらクィックスタートを行う場合は
BACKUPSWITCHをONにしてメモリを保護してから起動
起動終了後、BACKUPSWITCHをOFFにします

Enri's HP
http://www43.tok2.com/home/cmpslv/
http://www43.tok2.com/home/cmpslv/Famic/Fambas.htm












■プログラム
変数領域
BASICプログラム後に配置され
$001D-$001Eの内容から$001F-$0020までが領域となります
実数
$02、変数名2バイト、数値(下位、上位)
文字列
$03、変数名2バイト、長さ(下位、上位)、文字列32バイト(エンドマーク$00含む)
大きさは固定A$=”0”とA$=”0123”は同じ大きさになります
配列実数
$82、変数名2バイト、1次(下位、上位)、数値(2バイトごと)...
$82、変数名2バイト、1次(下位、上位)、2次(下位、上位)、数値(2バイトごと)...
1次配列データはa(0)、a(1)…の順
2次配列データはa(0,0)、a(1,0)…の順
中間言語
$0B行番号次の2バイト(16進数表記下位、上位の順)
$1116進数次の2バイト(&Hまたは&以降の数値下位、上位の順)
$12実数次の2バイト(16進数表記下位、上位の順)
$22”
$2C,
$2D-(DATA、LIST用)
$27’
$28(
$29)
$3A:
$3B;
$80GOTO$9146|$A0VIEW$A932
$81GOSUB$90C6|$A1MOVE$C0CE
$82RUN$857C|$A2END$820B
$83RETURN$9126|$A3PLAY$9A1D
$84RESTORE$98E0|$A4BEEP$B30F
$85THEN$83A6|$A5LOAD$97FC
$86LIST$85AF|$A6SAVE$978C
$87SYSTEM$80D7|$A7POSITION$C0B6
$88TO$836D|$A8KEY$95AA
$89STEP$836D|$A9COLOR$BA4E
$8ASPRITE$A7F3|$AADEF$A887
$8BPRINT$8740|$ABCGEN$A6CA
$8CFOR$927E|$ACSWAP$9496
$8DNEXT$930D|$ADCALL$918C
$8EPAUSE$9198|$AELOCATE$91CA
$8FINPUT$93C2|$AFPALET$A6EA
$90LINPUT$94F6|$B0ERA$C0ED
$91DATA$8343|
$92IF$9204|
$93READ$994D|
$94DIM$964E|
$95REM$8343|
$96STOP$86DA|
$97CONT$8717|
$98CLS$AB75|
$99CLEAR$9226|
$9AON$954D|
$9BOFF$836D|
$9CCUT$C0F0|
$9DNEW$8382|
$9EPOKE$91DF|
$9FCGSET$A746|
$CAABS$A369
$CBASC$A40A
$CCSTR$$A485
$CDFRE$A31A
$CELEN$A3FF
$CFPEEK$A358
$D0RND$A39F
$D1SGN$A379
$D2SPC$836D
$D3TAB$836D
$D4MID$$A5FB
$D5STICK$A6AA
$D6STRIG$A6B9
$D7XPOS$A346
$D8YPOS$A34F
$D9VAL$A4BE
$DAPOS$A32E
$DBCSRLIN$A2F3
$DCCHR$$A461
$DDHEX$$A4B5
$DEINKEY$$A520
$DFRIGHT$$A5BD
$E0LEFT$$A574
$E1SCR$$A41D
$EFXOR
$F0OR
$F1AND
$F2NOT
$F3<>
$F4>=
$F5<=
$F6=
$F7>
$F8<
$F9+
$FA-
$FBMOD
$FC/
$FD*
プログラムの格納
<例>
10FORI=0TO10
20PRINT”TEST”;
30NEXT
上記のプログラムだと下記の様に格納されます
703E:11;1行の長さ……イ
703F:0A00;行番号10…ロ
7041:8C2049F612000020;プログラム……ハ
8820120A00
704E:00;エンドマーク
704F:0E;1行の長さ
7050:1400;行番号20
7052:8B20225445535420;プログラム
223B
705C:00;エンドマーク
705D:07;1行の長さ
705E:1E00;行番号30
7060:8D;プログラム
7061:00;エンドマーク
7062:0000;最終マーク
イ…このアドレス+1行の長さで次の行番号のアドレスになります
このとき次の行番号のアドレスの内容が$00だとプログラムの格納は終了となります
ロ…行番号16進数で下位、上位の順10行なので$000Aを$0A、$00とする
ハ…プログラム本体中間言語で格納
$8C:FOR
$20:’’
$49:I
$F6:=
$120000:0(実数)
$20:’’
$88:TO
$20:’’
$120A00:10(実数)10なので16進数で$000A
$00:エンドマーク行の終わり
変数の配置
RUNすると変数Iが使用されるのでBASICプログラムの後ろに変数エリアが配置されます
7064:024900;変数の型$02、変数名I(アスキーコード)
mmnn;変数の数値
セレクトワーク
$0000:VSYNC用文字列ポインタ下位
VSYNCタスク$06用メッセージデータ
VSYNCタスク用コマンド比較アドレス
$0001:VSYNC用文字列ポインタ上位
$0002:VSYNCタスクアドレス下位
データアドレス下位
$0003:VSYNCタスクアドレス上位
データアドレス上位
仮想OBJポインタ下位
$0004:データレングス0(文字列データの長さ)
仮想OBJポインタ上位
$0005:データレングス1(文字列データブロック分)
$0006-$0007:VSYNCタスクコマンドポインタ(下位、上位)
$0010:ポート$2001の内容0$10
$0011:ポート$2001の内容
$0012:ポート$2005の内容(水平)
$0013:ポート$2005の内容(垂直)
$0018:スペシャルキーフラグ$FF=オン、$00=オフ
$0020:ロジックカウンタ$00(メイン)
$0021:ロジックカウンタ$01(キーリピート)
$0022:ロジックカウンタ$02(両端の長方形の色を暗くする)
$0023:ロジックカウンタ$03
$0024:ロジックカウンタ$04
$0025:ロジックカウンタ$05
$0026:ロジックカウンタ$06
$0027:ロジックカウンタ$07
$0028:ロジックカウンタ$08
$0029:ロジックカウンタ$09(次の1文字を書き始める)
$002A:ロジックカウンタ$0A($00で次の行のメッセージを書く)
$002B:ロジックカウンタ$0B
$002C:ロジックカウンタ$0C(カラーパネル)
$002D:ロジックカウンタ$0D(アイドリング$00で時間切れ、ウェイトに使用)
$002E-$002F:各種ボードのカーソル位置(上位、下位)
$0030:カーソルOBJのX座標
$0031:カーソルOBJのY座標
$0032:カーソル位置のBGPPUアドレス上位
$0033:DELカーソル位置のBGPPUアドレス上位
$0034:カーソル位置のBGPPUアドレス下位
$0035:DELカーソル位置のBGPPUアドレス下位
$0036:ボード$00=カリキュレータ、$01=メッセージ、$03=セレクト、$04=ミュージック
$0037:キーデータ(ASCIIコード)
$0038:キーデータ(ASCIIコード)
$0039:キーデータ(ASCIIコード)
$003B:VSYNCカウンタ(NMIが掛かる事に+1)
$0040:押されたキー
$0042:メッセージボード指定している行
$0043:ボードネームインデックス$00=BASIC、$01=カリキュレータ、$02=ミュージック、$03=メッセージ
$0046:BACKUPSWITCHチェックフラグ$00=チェックしない、$AA=チェックする
$004C:INSモードスイッチ$FF=オン、$00=オフ
$004F:BG-AまたはBG-Bの上位アドレスの指定$20=BG-A、$24=BG-B
$0050:カナキースイッチ$FF=オン、$00=オフ
$0051-$0058:乱数ジェネレートレジスタ
$0060:VSYNCコマンド(第1データVSYNCタスクnn)
$00=新しいVSYNCコマンドを実行
$01から$FF=VSYNCタスクのパラメータを読む
$0062:VSYNCコマンドnn
$0064:VSYNCコマンドアドレス
$0065:文字列インデックスカラー
$00=BGカラー
$01=OBJカラー
$0066:ファンクションキーフラグ
$FF=オン
$00=オフ
$0067:ファンクションキーデータ
Bit7-4:押されたFnのn-1の値
Bit3-0:押されたFnの文字数
$0068:ファンクションキースイッチ
$FF=オン
$00=オフ
$006B:セレクトVSYNCコマンド(第2データ)
$006D:キーマトリックスビットデータ(押されたビット)
ファンクションキー
$F0=F1キー
$F1=F2キー
$F2=F3キー
$F3=F4キー
$F4=F5キー
$F5=F6キー
$F6=F7キー
$F7=F8キー
キーマトリック
$07=Bit7が1
$06=Bit6が1
$05=Bit5が1
$04=Bit4が1
$03=Bit3が1
$02=Bit2が1
$01=Bit1が1
$00=Bit0が1
$006E:キーマトリクスラインナンバ0から8
$006F:CTRLフラグ$FF=オン、$00=オフ
$0070:SHIFTフラグ$FF=オン、$00=オフ
$0071:GRPHフラグ$FF=オン、$00=オフ
$0072:カナフラグ$FF=オン、$00=オフ
$0073:VSYNCタスク内初期化フラグ$00=初期化しない、$01=初期化する
$0077:入力フラグ$02=コマンド入力、$FF=名前入力
$0078:画面のコントロール
NMIで参照され画面のオン・オフの実行
$00=BG+OBJオン
$01-$FF=BG+OBJオフ
$007A:RAMテストNMIフラグ$FF=初回NMI、$00=2回目以降のNMI
$007B:RAMテストデータ
$00=RAMテストを実行していない
$03=RAMテストOk
$55=テストしたデータ
$AA=テストしたデータ
$0088:どのボードか訊ねる(VSYNCタスク$06用[C0]メッセージ)
$0E=カクシュボード
$0F=GAMEBASIC
$10=カリキュレータボード
$11=ミュージックボード
$12=メッセージボード
$008A:メッセージナンバ
VSYNCタスク$08、$0Eでセットされ
NMI割り込みが掛かるとVRAMにデータが書き込まれる
$00=$0301からの文字列
$01=セレクト画面
$02=カリキュレータボード画面
$03=’RAMOK’を表示
$04=メッセージボード画面
$05=ボードライン0、ライン1、カラー
$06=ボード、ライン1、カラー
$07=ボード、、カラー
$08=ボードの外枠
$09=ミュージックボード画面
$00B4:コマンド入力用コマンドと比較して合っている数
$00B5:コマンド入力用コマンドと比較して合っている数
$00B7:メッセージ用表示する位置インデックス($00B9から$00BAにセット)
$00=$20C6
$01=$20E6
$02=$2106
$03=$2126
$04=$2146
$05=$2166
$06=$2186
$07=$21A6
$08=$2246
$09=$2266
$0A=$2286
$00B9-$00BA:メッセージ用PPUアドレス上位、下位
$00BB:コンピュータパネル用PPUアドレス下位
カーソル右端フラグ$00=右端を超えていない、$01=右端を超えた
$00BC:コンピュータパネル用PPUアドレス上位
$00C3:VSYNCコマンド(第3データVSYNCタスク$06用メッセージナンバ)
$00C5:メッセージデータインデックス
$00C6:メッセージフラグ$00=表示終了、$01=表示、$FF=表示初期化
$00C8:入力コマンドファンクションキーデータインデックス
$00D0:ウラナイの西暦千の桁
$00D1:ウラナイの西暦百の桁
$00D2:ウラナイの西暦十の桁
$00D3:ウラナイの西暦一の桁
$00D4:ウラナイの月十の桁
$00D6:ウラナイ$0D
$00D7:ウラナイの日十の桁
$00D8:ウラナイの日一の桁
$00D8:ウラナイ$0D
$00E0:キー入力モード$FD=BGGRAPHICCHARまたはBASIC
$5E=BGGRAPHICSELECT
$3E=BGGRAPHICファンクションメニュー
$20=BGGRAPHICCOPY、MOVE
$1F=
$1E=
$03=
$00ED:NMI(VSYNC)フック$CD7A
$00FC:セレクトBGM
$00FE:セレクトS.E.-A
$01=各種ボード、セレクトに切り替わる音
$02=文字列表示が終了した音
$03=文字列表示が終了した音
$04=カラーパネルからセレクトに切り替わる
時間切れの音
各種ボードの改行
$10=セレクト内でRETURN
$00FF:セレクトS.E.-B
$0100-$01FF:スタックエリア
$0200-$02FF:スプライトDMAエリア
$0300-$03FF:VSYNC用文字列バッファ
$0300:VSYNC用文字列インデックス(最終データの位置)
$0301:VSYNC用文字列
PPUアドレス上位または$00=エンドマーク
PPUアドレス下位
コードBit7:INCモード1=Y方向、0=X方向
Bit6:書き込みモード1=埋める、0=文字列
Bit5:長さD5
Bit4:長さD4
Bit3:長さD3
Bit2:長さD2
Bit1:長さD1
Bit0:長さD0
データ(埋める場合1バイト、文字列の場合長さの分)

以降エンドマークがでるまで繰り返し
$0480-$040F:F1キーの内容
$0490-$049F:F2キーの内容
$04A0-$04AF:F3キーの内容
$04B0-$04BF:F4キーの内容
$04C0-$04CF:F5キーの内容
$04D0-$04DF:F6キーの内容
$04E0-$04EF:F7キーの内容
$04F0-$04FF:F8キーの内容
$0500-$0512:入力した名前
$0550:コマンドデータ(比較して合っている所まで$0D含む)
$0634:キーマトリクスP21
Bit7:F8キー1=押されている、0=押されていない
Bit6:RETURN1=押されている、0=押されていない
Bit5:[キー1=押されている、0=押されていない
Bit4:]キー1=押されている、0=押されていない
Bit3:カナキー1=押されている、0=押されていない
Bit2:右SHIFT1=押されている、0=押されていない
Bit1:¥キー1=押されている、0=押されていない
Bit0:STOPキー1=押されている、0=押されていない
$0635:キーマトリクスP22
Bit7:F7キー1=押されている、0=押されていない
Bit6:@キー1=押されている、0=押されていない
Bit5:;キー1=押されている、0=押されていない
Bit4::キー1=押されている、0=押されていない
Bit3:ンキー1=押されている、0=押されていない
Bit2:/キー1=押されている、0=押されていない
Bit1:=キー1=押されている、0=押されていない
Bit0:^キー1=押されている、0=押されていない
$0636:キーマトリクスP23
Bit7:F6キー1=押されている、0=押されていない
Bit6:Oキー1=押されている、0=押されていない
Bit5:Lキー1=押されている、0=押されていない
Bit4:Kキー1=押されている、0=押されていない
Bit3:<キー1=押されている、0=押されていない
Bit2:>キー1=押されている、0=押されていない
Bit1:Pキー1=押されている、0=押されていない
Bit0:0キー1=押されている、0=押されていない
$0637:キーマトリクス24
Bit7:F5キー1=押されている、0=押されていない
Bit6:Iキー1=押されている、0=押されていない
Bit5:Uキー1=押されている、0=押されていない
Bit4:Jキー1=押されている、0=押されていない
Bit3:Mキー1=押されている、0=押されていない
Bit2:Nキー1=押されている、0=押されていない
Bit1:9キー1=押されている、0=押されていない
Bit0:8キー1=押されている、0=押されていない
$0638:キーマトリクスP25
Bit7:F4キー1=押されている、0=押されていない
Bit6:Yキー1=押されている、0=押されていない
Bit5:Gキー1=押されている、0=押されていない
Bit4:Hキー1=押されている、0=押されていない
Bit3:Bキー1=押されている、0=押されていない
Bit2:Vキー1=押されている、0=押されていない
Bit1:7キー1=押されている、0=押されていない
Bit0:6キー1=押されている、0=押されていない
$0639:キーマトリクスP26
Bit7:F3キー1=押されている、0=押されていない
Bit6:Tキー1=押されている、0=押されていない
Bit5:Rキー1=押されている、0=押されていない
Bit4:Dキー1=押されている、0=押されていない
Bit3:Fキー1=押されている、0=押されていない
Bit2:Cキー1=押されている、0=押されていない
Bit1:5キー1=押されている、0=押されていない
Bit0:4キー1=押されている、0=押されていない
$063A:キーマトリクスP27
Bit7:F2キー1=押されている、0=押されていない
Bit6:Wキー1=押されている、0=押されていない
Bit5:Sキー1=押されている、0=押されていない
Bit4:Aキー1=押されている、0=押されていない
Bit3:Xキー1=押されている、0=押されていない
Bit2:Zキー1=押されている、0=押されていない
Bit1:Eキー1=押されている、0=押されていない
Bit0:3キー1=押されている、0=押されていない
$063B:キーマトリクスP28
Bit7:F1キー1=押されている、0=押されていない
Bit6:ESC1=押されている、0=押されていない
Bit5:Qキー1=押されている、0=押されていない
Bit4:CTR1=押されている、0=押されていない
Bit3:左SHIFT1=押されている、0=押されていない
Bit2:GRPH1=押されている、0=押されていない
Bit1:1キー1=押されている、0=押されていない
Bit0:2キー1=押されている、0=押されていない
$063C:キーマトリクスP29
Bit7:HOME1=押されている、0=押されていない
Bit6:カーソル上1=押されている、0=押されていない
Bit5:カーソル右1=押されている、0=押されていない
Bit4:カーソル左1=押されている、0=押されていない
Bit3:カーソル下1=押されている、0=押されていない
Bit2:スペース1=押されている、0=押されていない
Bit1:DEL1=押されている、0=押されていない
Bit0:INS1=押されている、0=押されていない
$063D-$064E:キー入力用バッファ
BASICワーク
$0000:$59=コールドスタートを実行した、$59以外=電源スタート
$0003-$0004:フリーエリア最終領域下位、上位(初期値$77FF)
$0005-$0006:BASICプログラムの先頭アドレス下位、上位(初期値$703E)
$0007-$0008:BASICプログラムの最終アドレス上位、下位(バックアップ場所$703C-$703D)
$0009-$000A:汎用バッファポインタ下位、上位
実行中プログラム行アドレス下位、上位
$000B-$000C:入力したプログラム行アドレス下位、上位
実行中プログラム行下位、上位
$000D-$000E:実行中プログラム行の先頭アドレス下位、上位
$000F-$0010:入力したプログラム行下位、上位
$0011-$0012:実行中プログラム行($000B-$000C)退避用
$0013-$0014:実行中プログラム行の先頭アドレス($000D-$000E)退避用
$0015-$0016:汎用バッファポインタ退避用($0009-$000A、$0058-$0059)
$0017:スタック退避用
$0018:スペシャルキーフラグ$FF=オン、$00=オフ
$0019:PPUアドレス上位
コマンドリスト上位
BEEP、キーリピート用カウンタ
BG-GRAPHICジャンプテーブル下位
CMTデータワーク0
$001A:PPUアドレス下位
コマンドリスト下位
BG-GRAPHICジャンプテーブル上位
CMTデータワーク1
$001B:VSYNCタスクアドレス下位
CMTライトビットディレイ0
”1”=$6A
”0”=$34
$001C:VSYNCタスクアドレス上位
CMTライトビットディレイ1
”1”=$6A
”0”=$34
$001D-$001E:変数領域先頭アドレス下位、上位
$001F-$0020:変数領域最終アドレス下位、上位
$0021:$80+文字列の長さ
マシン語領域先頭アドレス下位?(未使用)
$0022:マシン語領域先頭アドレス上位?(未使用)
$0024:ブレークフラグ$FF=オン、$00=オフ
$0027:変数、実数の型$02=数値変数、$03=文字変数
$0028:1文字表示ルーチンジャンプテーブル下位
符号付き被乗数・被除算の下位
演算結果下位
$0029:1文字表示ルーチンジャンプテーブル下位
符号付き被乗数・被除算の上位
演算結果上位
$002A:符号付き除算ワーク0
$002B:符号付き除算ワーク1
$002C:ASCIIコードから変換した数値下位0から9
符号付き乗数・除算の下位
符号付き除算ワーク2
CMTチェックサム比較用下位
VSYNCタスクPPUアドレス計算Y
$002D:ASCIIコードから変換した数値上位0から9
符号付き乗数・除算の上位
CMTチェックサム比較用上位
$0030:BASICプログラム解析ワークインデックス
$0032:ポート$2000の内容
$0033:ポート$2001の内容1$0E
$0034:演算用ワーク0
$0035:演算用ワーク1
$0036:演算用ワーク2
$0037:演算用ワーク3
$0038:$00
$0039:$00
$003A:$00
$003B:$00
$003D-$0042:BASIC16進数表示バッファ(ASCIIデータ)
$0044-$0045:入力した行番号下位、上位
$0046:16進数表示バッファ($003D-$0042)インデックス
$0046:16進数から10進数変換用ワークインデックス
$0047:16進数から10進数変換用アスキーコード$30-$39
$0048:カーソルX座標
$0049:カーソルY座標
BG-GRAPHICメニューカーソル$00-$05(メニューの種類)
$004A-$004B:PPUアドレス下位、上位
$004C:INSモードスイッチ$FF=オン、$00=オフ
$004D-$004E:プログラムバッファポインタ下位、上位($0300-$03FF)
$004F:BG-AまたはBG-Bの上位アドレスの指定$20=BG-A、$24=BG-B
$0050:カナキースイッチ$FF=オン、$00=オフ
$0052-$0053:文字列データ下位、上位
$0054-$0055:中間言語検索用ポインタ下位、上位
$0056-$0057:RND用
$0058-$0059:汎用バッファポインタ退避用下位、上位($0009-$000A)
$005A:プログラム1行分の長さ
$005B-$005C:BASICコマンド検索アドレス下位、上位
$005D:MOVEコマンド第nnパラメータ(01-08)
$005E:キー入力用$00=通常、$01-$FF=デバグ用?出力キーデータの$03(^C)を返す
$005F:BG-GRAPHICCMTPPUアドレス下位、上位
$0061:表示するカーソルのキャラクタ(ASCII)
$0062:VRAMバッファインデックス
$0063:VSYNCタスクnn(nn=$00から$0F$00でタスク実行終了)
$0064:文字列インデックス
$0065:文字列インデックスカラー$00=BG、$01=OBJ
$0066:ファンクションキーフラグ$FF=オン、$00=オフ
$0067:ファンクションキーデータ
Bit7-4:押されたFnのn-1の値
Bit3-0:押されたFnの文字数
$0068:ファンクションキースイッチ$FF=オン、$00=オフ
$0069:ポート$2005(垂直)の内容
$006B:カーソルX座標退避用
$006C:カーソルY座標退避用
$006D:キーマトリックスビットデータ(押されたビット)
ファンクションキー
$F0=F1キー
$F1=F2キー
$F2=F3キー
$F3=F4キー
$F4=F5キー
$F5=F6キー
$F6=F7キー
$F7=F8キー
キーマトリック
$07=Bit7が1
$06=Bit6が1
$05=Bit5が1
$04=Bit4が1
$03=Bit3が1
$02=Bit2が1
$01=Bit1が1
$00=Bit0が1
$006E:キーマトリクスラインナンバ(0から8)
$006F:CTRLフラグ$FF=オン、$00=オフ
$0070:SHIFTフラグ$FF=オン、$00=オフ
$0071:GRPHフラグ$FF=オン、$00=オフ
$0072:カナフラグ$FF=オン、$00=オフ
$0073:カーソル点滅にあるキャラクタ(ASCIIコード)
文字列V-SYNCタスクnn
$0074:文字列V-SYNCタスク用
汎用レジスタ
CGEN用
カラーパレット
VIEW用
汎用カウンタ
カーソル点滅
CMT1バイトリード
KEYLIST表示インデックス
SPRITE
メニュー
$0075:キーデータ(ASCIIコード)
文字列データリードインデクス
CMTリードディレイ
$0076:キーバッファインデックス
$0077:BASICキーリピートカウンタ0
$0078:BASICキーリピートカウンタ1
$0079:BASICキーリピートカウンタ2
$007B:キーリピートフラグ$FF=オン、$00=オフ
$007C:BGGRAPHIC
$00=SELECT
$01=COPY
$02=MOVE
$03=CLEAR
$04=FILE
$05=CHAR
$007D:BGGRAPHICSELECTキャラクタグループ$00-$0C
$007E:テキストスクロールカウンタスクロールするたびに-1
$007F:BGGRAPHICSELECTカーソル$00-$07
$0088:BGGRAPHICSELECTMODEnn(nn=$00-$03)
$008A-$008B:変数名2バイト
$008C-$008D:使用した変数アドレス下位、上位(タイプ、名前)
$008E-$008F:使用した変数の値アドレス下位、上位
$0090:PLAY文””の中の長さ
:KEYLIST用Fnキー
$0091:PLAY文バッファポインタ下位
CMTテープマークの数
CMTチェックサム下位
$0092:PLAY文バッファポインタ上位
CMTチェックサム上位
$0098:中間言語データ検索用(アスキーコード)
$0099:中間言語
$009A-$009B:汎用バッファポインタ上位、下位保存用
$009D:ポート$2005(水平)の内容
$009E:BG-Bクリアラフグ$81以外=クリア可、$81=クリア不可
$00A9:アニメキャラクタインデックス0から7
$00AB:MOVEを実行でVSYNCタスクとMOVEの振り分け$FF=MOVE、$00=VSYNCタスク
$00AC:MOVEフラグ$FF=実行、$00=停止
$00AD-$00AE:CMTデータポインタ下位、上位
$00AF:CMTファイルネームポインタ下位
$00B0:CMTファイルネームポインタ上位
INS用右端を超えたキャラクタ
$00B1:BASICCMTロードフラグ$00=LOAD、$01=LOAD?
$00B9:PLAY文Ch1T(テンポ1から8)
$00BA:PLAY文Ch2T(テンポ1から8)
$00BB:PLAY文Ch3T(テンポ1から8)
$00BC:PLAY文Ch1V(音量、エンベロープの長さ0から15)
$00BD:PLAY文Ch2V(音量、エンベロープの長さ0から15)
$00BE:PLAY文Ch3V(音量、エンベロープの長さ0から15)
$00BF:PLAY文Ch1O(オクターブ0から5)
$00C0:PLAY文Ch2O(オクターブ0から5)
$00C1:PLAY文Ch3O(オクターブ0から5)
$00C3:PLAY文Ch1音の長さ(0から9)
$00C4:PLAY文Ch2音の長さ(0から9)
$00C5:PLAY文Ch3音の長さ(0から9)
$00C6:PLAY文Ch1で音を鳴らす位置(バッファポインタ下位)
$00C7:PLAY文Ch2で音を鳴らす位置(バッファポインタ下位)
$00C8:PLAY文Ch3で音を鳴らす位置(バッファポインタ下位)
$00C9:APUチャンネル
Bit7:エラー1=エラー発生、0=エラー無し
Bit6:
Bit5:
Bit4:
Bit3:
Bit2:APUCh31=使用する、0=使用しない
Bit1:APUCh21=使用する、0=使用しない
Bit0:APUCh11=使用する、0=使用しない
$00CA:PLAY文Chnの指定$00=Ch1、$01=Ch2、$02=Ch3
$00CB:PLAY文Ch1カウンタ
$00CC:PLAY文Ch2カウンタ
$00CD:PLAY文Ch3カウンタ
$00CE:APUチャンネルストップ$4015からこの値を引く
Bit7:
Bit6:
Bit5:
Bit4:
Bit3:
Bit2:APUCh31=停止する、0=停止しない
Bit1:APUCh21=停止する、0=停止しない
Bit0:APUCh11=停止する、0=停止しない
$00CF:PLAY文Ch1M(エンベロープ)M0=$30、M1=$00
$00D0:PLAY文Ch2M(エンベロープ)M0=$30、M1=$00
$00D1:PLAY文Ch3M(エンベロープ)M0=$30、M1=$00
$00D2:PLAY文Ch1Y(デューティ効果1~3)Y0=$00、Y1=$40、Y2=$80、Y3=$C0
$00D3:PLAY文Ch2Y(デューティ効果1~3)Y0=$00、Y1=$40、Y2=$80、Y3=$C0
$00D4:PLAY文Ch3Y(デューティ効果1~3)Y0=$00、Y1=$40、Y2=$80、Y3=$C0
$00E0:キー入力モード
$FD=BGGRAPHICCHARまたはBASIC
$5E=BGGRAPHICSELECT
$3E=BGGRAPHICファンクションメニュー
$20=BGGRAPHICCOPY、MOVE
$1F=
$1E=
$03=
$00E1:
$00ED:NMI(VSYNC)フック$880F
$0100-$01FF:スタックエリア
$0200-$02FF:スプライトDMAエリア
$0300-$03FF:プログラムバッファ(1行分のプログラム中間言語で収納)
$0400-$047F:BASICプログラム解析ワーク
$0480-$040F:F1キーの内容
$0490-$049F:F2キーの内容
$04A0-$04AF:F3キーの内容
$04B0-$04BF:F4キーの内容
$04C0-$04CF:F5キーの内容
$04D0-$04DF:F6キーの内容
$04E0-$04EF:F7キーの内容
$04F0-$04FF:F8キーの内容
$0500-$05FF:汎用バッファ(キーデータ、VRAMデータ、CMTデ-タ)
$0500-$057F:CMTFCBバッファ
$0500:CMTファイルタイプ$02=BASIC、$03=BGDATA
$0501-$0511:CMTファイルネーム
$0512ー$0513:CMT長さ(下位、上位の順)
$0514ー$0515:CMTロードアドレス(下位、上位の順)
$0516ー$0517:CMT実行アドレス(下位、上位の順)*使用しない
$0505:BG-GRAPHICX座標
$0506:BG-GRAPHICY座標
$0510-$051F:BG-GRAPHICグループCHR表示バッファ
$0520-$0579:BG-GRAPHICメニューVRAM退避用10桁×8行
$0580-$059F:CMTキー入力したファイルネ-ム(エンドマーク$00)
$0600-$0617:テキストラインフラグ$00=行の先頭、FF=前の行と繋がっている
$0618:
$0619:
$0634:キーマトリクスP21
Bit7:F8キー1=押されている、0=押されていない
Bit6:RETURN1=押されている、0=押されていない
Bit5:[キー1=押されている、0=押されていない
Bit4:]キー1=押されている、0=押されていない
Bit3:カナキー1=押されている、0=押されていない
Bit2:右SHIFT1=押されている、0=押されていない
Bit1:¥キー1=押されている、0=押されていない
Bit0:STOPキー1=押されている、0=押されていない
$0635:キーマトリクスP22
Bit7:F7キー1=押されている、0=押されていない
Bit6:@キー1=押されている、0=押されていない
Bit5:;キー1=押されている、0=押されていない
Bit4::キー1=押されている、0=押されていない
Bit3:ンキー1=押されている、0=押されていない
Bit2:/キー1=押されている、0=押されていない
Bit1:=キー1=押されている、0=押されていない
Bit0:^キー1=押されている、0=押されていない
$0636:キーマトリクスP23
Bit7:F6キー1=押されている、0=押されていない
Bit6:Oキー1=押されている、0=押されていない
Bit5:Lキー1=押されている、0=押されていない
Bit4:Kキー1=押されている、0=押されていない
Bit3:<キー1=押されている、0=押されていない
Bit2:>キー1=押されている、0=押されていない
Bit1:Pキー1=押されている、0=押されていない
Bit0:0キー1=押されている、0=押されていない
$0637:キーマトリクス24
Bit7:F5キー1=押されている、0=押されていない
Bit6:Iキー1=押されている、0=押されていない
Bit5:Uキー1=押されている、0=押されていない
Bit4:Jキー1=押されている、0=押されていない
Bit3:Mキー1=押されている、0=押されていない
Bit2:Nキー1=押されている、0=押されていない
Bit1:9キー1=押されている、0=押されていない
Bit0:8キー1=押されている、0=押されていない
$0638:キーマトリクスP25
Bit7:F4キー1=押されている、0=押されていない
Bit6:Yキー1=押されている、0=押されていない
Bit5:Gキー1=押されている、0=押されていない
Bit4:Hキー1=押されている、0=押されていない
Bit3:Bキー1=押されている、0=押されていない
Bit2:Vキー1=押されている、0=押されていない
Bit1:7キー1=押されている、0=押されていない
Bit0:6キー1=押されている、0=押されていない
$0639:キーマトリクスP26
Bit7:F3キー1=押されている、0=押されていない
Bit6:Tキー1=押されている、0=押されていない
Bit5:Rキー1=押されている、0=押されていない
Bit4:Dキー1=押されている、0=押されていない
Bit3:Fキー1=押されている、0=押されていない
Bit2:Cキー1=押されている、0=押されていない
Bit1:5キー1=押されている、0=押されていない
Bit0:4キー1=押されている、0=押されていない
$063A:キーマトリクスP27
Bit7:F2キー1=押されている、0=押されていない
Bit6:Wキー1=押されている、0=押されていない
Bit5:Sキー1=押されている、0=押されていない
Bit4:Aキー1=押されている、0=押されていない
Bit3:Xキー1=押されている、0=押されていない
Bit2:Zキー1=押されている、0=押されていない
Bit1:Eキー1=押されている、0=押されていない
Bit0:3キー1=押されている、0=押されていない
$063B:キーマトリクスP28
Bit7:F1キー1=押されている、0=押されていない
Bit6:ESC1=押されている、0=押されていない
Bit5:Qキー1=押されている、0=押されていない
Bit4:CTR1=押されている、0=押されていない
Bit3:左SHIFT1=押されている、0=押されていない
Bit2:GRPH1=押されている、0=押されていない
Bit1:1キー1=押されている、0=押されていない
Bit0:2キー1=押されている、0=押されていない
$063C:キーマトリクスP29
Bit7:HOME1=押されている、0=押されていない
Bit6:カーソル上1=押されている、0=押されていない
Bit5:カーソル右1=押されている、0=押されていない
Bit4:カーソル左1=押されている、0=押されていない
Bit3:カーソル下1=押されている、0=押されていない
Bit2:スペース1=押されている、0=押されていない
Bit1:DEL1=押されている、0=押されていない
Bit0:INS1=押されている、0=押されていない
$063D:SPRITE0のキャラクタ合成型$00=8×8、$01=16×16
$063E:SPRITE1のキャラクタ合成型$00=8×8、$01=16×16
$063F:SPRITE2のキャラクタ合成型$00=8×8、$01=16×16
$0640:SPRITE3のキャラクタ合成型$00=8×8、$01=16×16
$0641:SPRITE4のキャラクタ合成型$00=8×8、$01=16×16
$0642:SPRITE5のキャラクタ合成型$00=8×8、$01=16×16
$0643:SPRITE6のキャラクタ合成型$00=8×8、$01=16×16
$0644:SPRITE7のキャラクタ合成型$00=8×8、$01=16×16
$0645:DEFMOVE(0)
Bit7:8×81=通常、0=Y反転
Bit6:8×81=通常、0=X反転
Bit5:優先1=BG奥、0=BG手前
Bit4:1=アニメオン、0=アニメオフ
Bit3:
Bit2:
Bit1:カラーd1
Bit0:カラーd0
$0646:DEFMOVE(1)
Bit7:8×81=通常、0=Y反転
Bit6:8×81=通常、0=X反転
Bit5:優先1=BG奥、0=BG手前
Bit4:1=アニメオン、0=アニメオフ
Bit3:
Bit2:
Bit1:カラーd1
Bit0:カラーd0
$0647:DEFMOVE(2)
Bit7:8×81=通常、0=Y反転
Bit6:8×81=通常、0=X反転
Bit5:優先1=BG奥、0=BG手前
Bit4:1=アニメオン、0=アニメオフ
Bit3:
Bit2:
Bit1:カラーd1
Bit0:カラーd0
$0648:DEFMOVE(3)
Bit7:8×81=通常、0=Y反転
Bit6:8×81=通常、0=X反転
Bit5:優先1=BG奥、0=BG手前
Bit4:1=アニメオン、0=アニメオフ
Bit3:
Bit2:
Bit1:カラーd1
Bit0:カラーd0
$0649:DEFMOVE(4)
Bit7:8×81=通常、0=Y反転
Bit6:8×81=通常、0=X反転
Bit5:優先1=BG奥、0=BG手前
Bit4:1=アニメオン、0=アニメオフ
Bit3:
Bit2:
Bit1:カラーd1
Bit0:カラーd0
$064A:DEFMOVE(5)
Bit7:8×81=通常、0=Y反転
Bit6:8×81=通常、0=X反転
Bit5:優先1=BG奥、0=BG手前
Bit4:1=アニメオン、0=アニメオフ
Bit3:
Bit2:
Bit1:カラーd1
Bit0:カラーd0
$064B:DEFMOVE(6)
Bit7:8×81=通常、0=Y反転
Bit6:8×81=通常、0=X反転
Bit5:優先1=BG奥、0=BG手前
Bit4:1=アニメオン、0=アニメオフ
Bit3:
Bit2:
Bit1:カラーd1
Bit0:カラーd0
$064C:DEFMOVE(7)
$0680-$0683:DEFSPRITE0の文字式(キャラクタ)
$0684-$0687:DEFSPRITE1の文字式(キャラクタ)
$0688-$068B:DEFSPRITE2の文字式(キャラクタ)
$068C-$068F:DEFSPRITE3の文字式(キャラクタ)
$0690-$0693:DEFSPRITE4の文字式(キャラクタ)
$0694-$0697:DEFSPRITE5の文字式(キャラクタ)
$0698-$069B:DEFSPRITE6の文字式(キャラクタ)
$069C-$069F:DEFSPRITE7の文字式(キャラクタ)
$06C0:DEFMOVE(0)アニメキャラクタの種類
$06C1:DEFMOVE(0)アニメキャラクタの動作の方向指定
$06C2:DEFMOVE(0)アニメキャラクタの動かす速さカウンタ
$06C3:DEFMOVE(0)アニメキャラクタの全移動量カウンタ
$06C4:DEFMOVE(0)アニメキャラクタの動かす速さ
$06C5:DEFMOVE(0)アニメキャラクタの全移動量
$06C6:POSITION0X座標
$06C7:POSITION0Y座標
$06C8:DEFMOVE(1)アニメキャラクタの種類
$06C9:DEFMOVE(1)アニメキャラクタの動作の方向指定
$06CA:DEFMOVE(1)アニメキャラクタの動かす速さカウンタ
$06CB:DEFMOVE(1)アニメキャラクタの全移動量カウンタ
$06CC:DEFMOVE(1)アニメキャラクタの動かす速さ
$06CD:DEFMOVE(1)アニメキャラクタの全移動量
$06CE:POSITION1X座標
$06CF:POSITION1Y座標
$06D0:DEFMOVE(2)アニメキャラクタの種類
$06D1:DEFMOVE(2)アニメキャラクタの動作の方向指定
$06D2:DEFMOVE(2)アニメキャラクタの動かす速さカウンタ
$06D3:DEFMOVE(2)アニメキャラクタの全移動量カウンタ
$06D4:DEFMOVE(2)アニメキャラクタの動かす速さ
$06D5:DEFMOVE(2)アニメキャラクタの全移動量
$06D6:POSITION2X座標
$06D7:POSITION2Y座標
$06D8:DEFMOVE(3)アニメキャラクタの種類
$06D9:DEFMOVE(3)アニメキャラクタの動作の方向指定
$06DA:DEFMOVE(3)アニメキャラクタの動かす速さカウンタ
$06DB:DEFMOVE(3)アニメキャラクタの全移動量カウンタ
$06DC:DEFMOVE(3)アニメキャラクタの動かす速さ
$06DD:DEFMOVE(3)アニメキャラクタの全移動量
$06DE:POSITION3X座標
$06DF:POSITION3Y座標
$06E0:DEFMOVE(4)アニメキャラクタの種類
$06E1:DEFMOVE(4)アニメキャラクタの動作の方向指定
$06E2:DEFMOVE(4)アニメキャラクタの動かす速さカウンタ
$06E3:DEFMOVE(4)アニメキャラクタの全移動量カウンタ
$06E4:DEFMOVE(4)アニメキャラクタの動かす速さ
$06E5:DEFMOVE(4)アニメキャラクタの全移動量
$06E6:POSITION4X座標
$06E7:POSITION4Y座標
$06E8:DEFMOVE(5)アニメキャラクタの種類
$06E9:DEFMOVE(5)アニメキャラクタの動作の方向指定
$06EA:DEFMOVE(5)アニメキャラクタの動かす速さカウンタ
$06EB:DEFMOVE(5)アニメキャラクタの全移動量カウンタ
$06EC:DEFMOVE(5)アニメキャラクタの動かす速さ
$06ED:DEFMOVE(5)アニメキャラクタの全移動量
$06EE:POSITION5X座標
$06EF:POSITION5Y座標
$06F0:DEFMOVE(6)アニメキャラクタの種類
$06F1:DEFMOVE(6)アニメキャラクタの動作の方向指定
$06F2:DEFMOVE(6)アニメキャラクタの動かす速さカウンタ
$06F3:DEFMOVE(6)アニメキャラクタの全移動量カウンタ
$06F4:DEFMOVE(6)アニメキャラクタの動かす速さ
$06F5:DEFMOVE(6)アニメキャラクタの全移動量
$06F6:POSITION6X座標
$06F7:POSITION6Y座標
$06F8:DEFMOVE(7)アニメキャラクタの種類
$06F9:DEFMOVE(7)アニメキャラクタの動作の方向指定
$06FA:DEFMOVE(7)アニメキャラクタの動かす速さカウンタ
$06FB:DEFMOVE(7)アニメキャラクタの全移動量カウンタ
$06FC:DEFMOVE(7)アニメキャラクタの動かす速さ
$06FD:DEFMOVE(7)アニメキャラクタの全移動量
$06FE:POSITION7X座標
$06FF:POSITION7Y座標
$0700-$077F:表示バッファ
PLAYバッファ
カラーパレット
BG-GRAPHICファイルバッファ
$0780-$079F:ストリングデータバッファ
$7000-$7012:セレクト前々回入力した名前
$7013-$7025:セレクト前回入力した名前
$7026-$7038:セレクト入力した名前
$7039:BACKUPSWITCHテスト用
$703A:BACKUPSWITCHテスト用
$5A=データ有り
$5A以外=データ無し(コールドスタート)
$703B:BACKUPSWITCHテスト用
$33=データ有り(BASICプログラム)
$33以外=データ無し(コールドスタート)
$703C-$703D:プログラムの最終アドレスバックアップ下位、上位
ROMルーチン
$8000:セレクトBASICメニューへ飛ぶ
セレクトからBASICメニュー($80AD)へ飛びます
$8003:セレクト、BASIC一文字入力
出力:A=キーデータ(ASCIIコード)
$AF88へ飛び、キーボードから一文字入力を行います
$8006-$8098:PLAY文周波数データテーブル
PLAY文で設定される周波数データになります
周波数データは2バイトで下位、上位の順
C、#C、D、#D、E、F、#F、G、#G、A、#A、Bの順
この24バイトがオクターブ単位でO5からO0の順
$8096-$809F:PLAY文音長データテーブル
PLAY文で使用する音長をカウンタの長さに変換するテーブルデータです
0から9の順
$80A0-$80A6:PLAY文音程インデックス
周波数データテーブルの音程を指します(#の指定は出来ません)
AからGの順
$80A7-$80AC:PLAY文オクターブインデックス
周波数データテーブルのオクターブの先頭を指します
O0からO5の順
$80AD:BASICBASICメニュー
ここでBASIC、BGGRPAHIC、END(セレクト)と
各場所へと実行されます
1:BASIC$80F0
2:BGGRAPHIC$80D4
3:END$C400
$8127:BASICBASICのコールドスタート
出力:$0000=$59
BG-Bクリア、$0000=$59にして$81FFに飛びます
$8131:BASICBASICメニューの表示
$814B:BASICBG-Bクリア
入力:$009E
$009E=$81かチェックを行い$81以外ならBG-Bクリアを行います。
$8154:BASICBASICメニューメッセージの表示
入力:A=メッセージナンバ(0-3)
BASICメニュー内のメッセージを表示します
0=1--BASIC
1=2--BGGRAPHIC
2=3--END
3=1,2,3KEYIN!!
$819C:BASICBASICメニューの枠の表示
メニューの枠の表示を行います。
$81D3:BASICBASICメニューの枠の表示サブ0
入力:A=表示するVRAMアドレス上位
X=表示するVRAMアドレス下位
$00AD=枠の角のASCIIコード($DEまたは$E0)
使用:A、X、Y
枠の上と下のライン表示を行います
$81EA:BASICBASICメニューの枠の表示サブ1
入力:A=表示するVRAMアドレス上位
X=表示するVRAMアドレス下位
$00AD=枠の角のASCIIコード($DEまたは$E0)
使用:A、X、Y
枠の縦のライン表示を行います
前もってポート$2000のBit2=1にする必要があります
$81F1:BASICVRAMをデータで埋める
入力:A=キャラクタデータ
Y=長さ
使用:A、Y
VRAMをYレジスタ分だけAレジスタの内容を埋めます
前もって埋めるVRAMアドレス、方向を設定しておきます
$81F8:BASICPPUアドレスの指定
入力:A=PPUアドレスの上位
X=PPUアドレスの下位
使用:A、X
ポート$2006に各データをセットして
PPUアドレスの指定を行います。
$81FF:BASICBASICコールドスタート
$820B:BASICBASICのコマンド待ち(END文のエントリ)
プロント’OK’または’OK.’、$0A(NL)を出力して
コマンド待ちの状態になります
$8236:BASICBASICのコマンド待ち
キー入力を行いBREAKならループ、RETURNキーが押されるまで待ち
スペースを読み飛ばして数字ならプログラムインプットモード
英字ならダイレクトコマンドモード
それぞれの処理を行います
$86B9:BASICCMTSTOPキーのチェック
出力:Zf=1STOPキーが押さた
0STOPキーが押されていない
使用:A
STOPキーが押されたかチェックします
$87F8:BASIC文字列表示
入力:$0048=表示するカーソルX座標
$0049=表示するカーソルY座標
$0052=文字列データアドレス下位
$0053=文字列データアドレス上位
文字列データ...(エンドマーク$00)
使用:A、X、Y
$0028
$0029
$0032
$0047
$004C
$0062
$0069
$007E

$8808:BASICVSYNCタスクの実行
入力:A=VSYNCタスクnn(nn=$01-$0F)
出力:$0063=$00VSYNCタスク$00
VSYNCタスクによる
使用:VSYNCタスクによる
VSYNCタスクを実行、終了するまで待ちます
$8B5C:BASIC符号付き16Bitの乗算
入力:$0028=符号付き被乗数の下位
$0029=符号付き被乗数の上位
$002C=符号付き乗数の下位
$002D=符号付き乗数の上位
出力:$0028=演算結果下位
$0029=演算結果上位
$0034=$FF演算結果がマイナス
$00演算結果がプラス
使用:A、X
$0034=演算用ワーク0
$0035=演算用ワーク1
$0036=演算用ワーク2
$0037=演算用ワーク3
$0038=$00
$0039=$00
$003A=$00
$003B=$00
符号付の16Bit×16Bitを行います
$8BE59:BASIC16Bitの減算
入力:$0028=被減数の下位
$0029=被減数の上位
$002C=減数の下位
$002D=減数の上位
出力:$0028=演算結果下位
$0029=演算結果上位
Cf=1演算結果が正
0演算結果が負
使用:A
16Bitの減算を行います
$0028-$0029をa、$002C-$002Dをbとすると
単純にa=a-bを実行します
$8CA1:汎用バッファポインタの16Bitインクリメント
入力:A=バッファデータ
出力:$0009=汎用バッファポインタ+1下位
$000A=汎用バッファポインタ+1上位
Zf=1バッファデータ=$00
0バッファデータ=$01-$FF
使用:A=バッファデータ
$0009=汎用バッファポインタ下位
$000A=汎用バッファポインタ上位
$0009から$000Aを16Bitとしてインクリメントしてから
AND$FFを行いAレジスタが$00(エンドマーク)か調べます
$8CAD:汎用バッファの16Bitインクリメント、データの取得
出力:$0009=汎用バッファポインタ+1下位
$000A=汎用バッファポインタ+1上位
A=ポインタデータ
使用:$0009=汎用バッファポインタ下位
$000A=汎用バッファポインタ上位
$0009から$000Aを16Bitとしてインクリメントしてから
そのポインタの内容をAレジスタに入れます
$8CD4:汎用バッファの先頭から$20を読み飛ばす
出力:A=ASCIIコード
Y=$00
$0009=汎用バッファポインタ+nn下位
$000A=汎用バッファポインタ+nn上位
使用:$0009=汎用バッファポインタ下位
$000A=汎用バッファポインタ上位
$0009から$000Aのポインタ内の先頭データから
$20(スペース)を読み飛ばします
ポインタもインクリメントされます
$8CDD:ASCII数字のチェック
入力:A=ASCIIコード
出力:Cf=1数字以外
0数字($30から$39)
使用:A
キー入力等で得たASCIIコード1文字が数字か調べます
$8D09:BASICバッファ内のASCIIコードから16進数の変換
入力:$0009=汎用バッファポインタ下位
$000A=汎用バッファポインタ上位
出力:$0009=汎用バッファポインタ下位(数字以外のコードがあったアドレス)
$000A=汎用バッファポインタ上位(数字以外のコードがあったアドレス)
$0027=使用する変数、実数の型$02=数値変数
$0028=変換した16進数下位
$0029=変換した16進数上位
使用:A、X、Y
$002C=符号付き乗数の下位$0A
$002D=符号付き乗数の上位$00
バッファにあるASCIIコードから16進数データに変換します
$0009-$000Aをポインタとして示すバッファから
$0028-$0029を16ビットレジスタR0とすると
1.ASCIIコードとして取得(数字$30-$39以外ならRTS)
2.R0=R0*10
3.アスキーコード$30-$39から$30を引いて数字1桁に変換
4.R0=R0+変換した数字1桁($FFFFオーバーなら?OVERRORへ)
5.$0009-$000AをINCして1.から繰り返し
$8D3C:BASIC16進数から10進ASCIIの変換
入力:$0028=16進数下位
$0029=16進数上位
出力:$003D-$0042=16進数から10進数変換したASCIIデータ
$0046=$00
使用:A、X
$002C-$002D=変換する為の減算、加算値
$0046=16進数から10進数変換用ワークインデックス($003D-$0042)
$0047=16進数から10進数変換用アスキーコード$30-$39
16ビット16進数を10進数ASCIIコードに変換して
$003D-$0042に収納します
$003D=万の値
$003E=千の値
$003F=百の値
$0040=十の値
$0041=一の値
$0042=$00(エンドマーク)
$98A1:BASICCMTファイルネームバッファのクリア
使用:A、X、Y
$0580-$0590
ファイルネーム$0580-$058Fを$20で埋め
$0590を$00にします
$A1C3:ASCII英字のチェック
入力:A=ASCIIコード
出力:Cf=1英字以外
0英字($41から$5A)
使用:A
キー入力等で得たASCIIコード1文字が英字か調べます
$A6C5:セレクト、BASICA=A*16
入力:A=データ
出力:A=入力したデータ*16
使用:A
ASLAを4回実行します
$AAFE:BASICVBLANK期間中になるまで待つ
使用:A
ポート$2002のBit7=0(描画中)になるまで待ち
その後、Bit7=1(VBLANK)になるまで待ちます
始めにBit7=1になるまで待たないのは
すぐにVBLNKが終わる可能性があるため
Bit7が0から1に変わった瞬間で
VBLANKの始まりを検知します
$AB09:BASICカラーパレットの初期化
使用:A
$0052=文字列データ下位
$0053=文字列データ上位
$0065:文字列インデックスカラー$00=BGカラー、$01=OBJカラー
$0700-$077F=VRAMバッファ
VRAMバッファを使用してカラーパレットの初期化を行います
$AB71:BASICBG-Bクリア
出力:$0069=$00ポート$2005(垂直)の内容
$009D=$00ポート$2005(水平)の内容
$0600-0$0619=すべて$00テキストラインフラグ
使用:$0032=ポート$2000の内容
$0033=$0Eポート$2001の内容1
$004F=$24にして下の$AB75を実行します
$AB75:BASICBG-AまたはBクリア
入力:$004F=$20BG-A
$24BG-B
出力:$0069=$00ポート$2005(垂直)の内容
$009D=$00ポート$2005(水平)の内容
$0600-0$0619=すべて$00テキストラインフラグ
使用:$0032=ポート$2000の内容
$0033=$0Eポート$2001の内容1
$004Fで指定した画面の消去、アトリビュート$00で埋め
NMIをオン、カーソルX、Y=0,0
テキストラインフラグを全て$00にします
$ABA6:BASICカーソル座標からPPUアドレスに変換する
入力:$0048=カーソルX座標
$0049=カーソルY座標
$004F=BG-AまたはBG-Bの上位アドレス$20BG-A
$24BG-B
$0069=ポート$2005(垂直)の内容
出力:$004A=PPUアドレス下位
$004B=PPUアドレス上位
使用:A、X
$0028=符号付き被乗数の下位、演算結果下位
$0029=符号付き被乗数の上位、演算結果上位
$002C=符号付き乗数の下位
$002D=符号付き乗数の上位
$0034=演算用ワーク0
$0035=演算用ワーク1
$0036=演算用ワーク2
$0037=演算用ワーク3
$0038=$00
$0039=$00
$003A=$00
$003B=$00
カーソルX、Y座標の位置をPPUアドレスに変換します
$ABE6:BASICスクロールセット
入力:$0069=ポート$2005(垂直)の内容
$009D=ポート$2005(水平)の内容
ポート$2005にデータ(スクロール)を行います
$ABF1:BASICBG+OBJオフ
使用:A
$AAFE(VBLANK待ち)をコールしてから
直接ポート$2001に$00を書き込みます
$ABFA:BASICポート$2001の設定
使用:A
$0033=ポート$2001の内容
$AAFE(VBLANK待ち)をコールしてから
$0033のデータをポート$2001に書き込む
$AC0D:BASIC1文字表示
入力:A=ASCIIコード
$0048=カーソルX座標
$0049=カーソルY座標
使用:A、X、Y
$0019=
$0028=コントロールコードジャンプテーブルアドレス下位
VRAMオフセット下位
$0029=コントロールコードジャンプテーブルアドレス上位
VRAMオフセット上位
$0032=ポート$2000の内容
$0033=ポート$2001の内容1$0E
$0034=
$0035=
$0036=
$0037=
$003B=
$004C=INSモードスイッチ$FF=オン、$00=オフ
$0052=文字列データ下位
$0053=文字列データ上位
$0062=VRAMバッファインデックス
$0065:文字列インデックスカラー$00=BGカラー、$01=OBJカラー
$0069=ポート$2005(垂直)の内容
$006B=
$006C=
$0073=VSYNCタスクnn
$0074=文字列VSYNCタスク用
$0075=文字列VSYNCタスク用
$007E=
$0700-$077F=VRAMバッファ
画面に1文字表示する為
VRAMバッファにデータを置き
VSYNCタスク$01によってVRAMに書き込みます
コントロールコードはASCIIコードによって従います
$B263:キーリピートチェック+1文字キー入力
出力:A=キーデータ(ASCIIコード)
使用:A、X、Y
$005E=$00
$0074=カーソル点滅カウンタ初期値$80で-1されていく
$0077=キーリピートカウンタ0(キーリピートオンの時に$00)
$0078=キーリピートカウンタ1(キーリピートオンの時に$00)
$0079=キーリピートカウンタ2
$007B=キーリピートフラグ$FF=キーリピートオン
$00=キーリピートオフ
通常のキー入力になります
$005Eに$00(デバグ用?)を出力し
数回キー入力を行い、キーリピートが出来るかチェックします
またカーソルの点滅処理も行いますがキーデータは表示されまん
$B30F:BASIC^GBEEP
使用:A、X、Y
$0019=$F0カウンタ(鳴らす時間)
BEEPを実行します
もし違う時間で鳴らしたい場合は
Aレジスタに時間をセットして$B316をコールします。
$B343:BASICラインインプット
使用:A、X、Y
$0019=
$0028=コントロールコードジャンプテーブルアドレス下位
VRAMオフセット下位
$0029=コントロールコードジャンプテーブルアドレス上位
VRAMオフセット上位
$0032=ポート$2000の内容
$0033=ポート$2001の内容1$0E
$0034=
$0035=
$0036=
$0037=
$003B=
$004C=INSモードスイッチ$FF=オン、$00=オフ
$005E=$00
$0047=
$0048=カーソルX座標
$0049=カーソルY座標
$0052=文字列データ下位
$0053=文字列データ上位
$0062=VRAMバッファインデックス
$0063=VSYNCタスク
$0064=文字列インデックス
$0065=文字列インデックスカラー$00=BGカラー、$01=OBJカラー
$0069=ポート$2005(垂直)の内容
$006B=
$006C=
$0073=VSYNCタスクnn
$0074=文字列VSYNCタスク用、カーソル点滅カウンタ初期値$80で-1されていく
$0075=文字列VSYNCタスク用
$0076=キーバッファインデックス
$0077=キーリピートカウンタ0(キーリピートオンの時に$00)
$0078=キーリピートカウンタ1(キーリピートオンの時に$00)
$0079=キーリピートカウンタ2
$007B=キーリピートフラグ$FF=キーリピートオン
$00=キーリピートオフ
$007E=
$009D=ポート$2005(水平)の内容
$00A9=
$0500-$05FF=汎用バッファ(キーバッファ)
$0601-$0617:テキストラインフラグ$00=行の先頭
$FF=前の行と繋がっている
$0700-$077F=VRAMバッファ
キーリピートチェック+1文字キー入力($B263)、1文字表示($AC0D)をコール
^C、^Dが押されたら
キーバッファに$03、$00でRTS
リターンキーが押されたら
カーソル位置から打ち込まれたラインを取得
VSYNCタスク$02実行(VRAMからバッファ$500へ転送)
転送した最終データから先頭へ$20(スペース)をスキップして
$21-$FFのアスキーコードがあるところまでを
キーバッファの最終データ、次をエンドマーク$00を書き込みます
$B3B9:BASICCMTエンドアドレスチェック
入力:$00AD=チェックアドレス下位
$00AE=チェックアドレス上位
$00AF=エンドアドレス下位
$00B0=エンドアドレス上位
出力:Zf=1エンドアドレスと同じ値
0エンドアドレスと同じ値では無い
$00ADから$00AEの値が$00AFから$00B0の値と
同じかチェックをします
$B3C4:BASICCMTスタート、エンドアドレス変換
使用:A
入力:$0512=プログラムの長さ下位
$0513=プログラムの長さ上位
$0514=スタートアドレス下位
$0515=スタートアドレス上位
出力:$00AD=スタートアドレス下位
$00AE=スタートアドレス上位
$00AF=エンドアドレス下位
$00B0=エンドアドレス上位
CMTバッファにあるスタートアドレスと長さを足してエンドアドレスを求め
$00ADから$00B0のワークに書き込みを行います
$B3EB:BASICNMIセット
入力:$0032=ポート$2000の内容
使用:A
ポート$2000を$0032のデータの書き込みを行います
$B3F1:BASICNMIオン
使用:A
$0032=ポート$2000の内容
ポート$2000Bit7=1にしてNMIオンにします
$B3F9:BASICNMIセット、CMTデータブロックベリファイ
$B3F1をコール、A=$01にして$B406を実行します
$B401:BASICNMIセット、CMTデータブロックロード
$B3F1をコール、A=$00にして$B406を実行します
$B406:BASICCMTデータブロックロード
入力:A=$00LOAD
$01LOAD?
出力:A=$00正常にロード
$02エラー
Cf=1STOPまたはエラー発生
0正常にロード
使用:A、X、Y
$002C=CMTチェックサム比較用下位
$002D=CMTチェックサム比較用下位
$0032=ポート$2000の内容
$0091=CMTチェックサム下位
$0092=CMTチェックサム上位
$00AD=ロードまたはチェックアドレス下位
$00AE=ロードまたはチェックアドレス上位
$00AF=ロードまたはチェック最終アドレス+1下位
$00B0=ロードまたはチェック最終アドレス+1上位
$00B1=ロードタイプ$01=LOAD?
$00=LOAD
インフォメーションブロックをロードします
$0512から$0515のデータを$00ADから$00B0に書き込み
テープマーク(”1”×20、”0”×20)が見つかるまで読み続け
インフォメーション本体をロード($B458)します
インフォメーションブロック本体
属性1バイト
ファイルネーム16バイト
予備1バイト
長さ2バイト
ロードアドレス2バイト
実行アドレス2バイト
空き104バイト
$B458:BASICCMT本体ロード
出力:A=$00正常にロード
$02エラー
Cf=1STOPまたはエラー発生
0正常にロード
使用:A、X、Y
$002C=CMTチェックサム比較用下位
$002D=CMTチェックサム比較用下位
$0032=ポート$2000の内容
$0091=CMTチェックサム下位
$0092=CMTチェックサム上位
$00AD=ロードまたはチェックアドレス下位
$00AE=ロードまたはチェックアドレス上位
$00AF=ロードまたはチェック最終アドレス+1下位
$00B0=ロードまたはチェック最終アドレス+1上位
$00B1=ロードタイプ$01=LOAD?
$00=LOAD
データ本体部分をロードします
したがって前もってテープマークを読み込む必要があります
$00B1のロードタイプを見て
LOADならメモリに書き込み、チェックサム増加
LOAD?ならメモリと比較し、チェックサム増加
全てのデータをロードして増加したチェックサムを
$002Cから$002Dに置いて
CMTからのチェックサムデータをロード、比較を行います
$B4A6:BASICCMTリードデータの検知
出力:Cf=1STOPキーが押された
0CMTリードデータの検知
使用:A
STOPキーが押されたかチェックを行い
CMTリードのポート$4016のBit1が1になるまで待ち
STOPキーが押されたかチェックを行い
CMTリードのポート$4016のBit1が0になるまで待ちます
ビットデータ”1”と”0”の検知ではなく信号の1と0になります
$B4C0:BASICCMT1Bitリード
出力:Cf=1STOP
0CMTリード
Zf=1CMTリードデータ”1”
0CMTリードデータ”0”
使用:A、Y
CMTリードデータの検知を行い(HからL)
ディレイで時間稼ぎを行ってから
CMTリードのポート$4016のBit1を読む事によって
リードデータが”0”か”1”の判断を行います
”0”はパルスが短いのでHからLからディレイ後の信号はHになります
”1”はパルスが長いのでHからLからディレイ後の信号はLになります
$B50D:BASICCMTデータブロックセーブ
入力:$0512=プログラムの長さ下位
$0513=プログラムの長さ上位
$0514=スタートアドレス下位
$0515=スタートアドレス上位
使用:A、X、Y
$0019=CMTテープマーク用
$0032=ポート$2000の内容
$0091=$14書き込むテープマーク数20
CMTチェックサム下位
$0092=CMTチェックサム上位
$00AD=スタートアドレス下位
$00AE=スタートアドレス上位
$00AE=エンドアドレス上位
$00AE=エンドアドレス上位
ポート$2000に$0032のデータを書き込み
スタート、エンドアドレスのセット($B3C4をコール)
書き込みテープマーク数$14にして
$B51Bのルーチンへ行きます
$B51B:BASICCMTブロックセーブメイン
入力:$0091=書き込むテープマーク数
$00AD=スタートアドレス下位
$00AE=スタートアドレス上位
$00AE=エンドアドレス上位
$00AE=エンドアドレス上位
使用:A、X、Y
$0019=CMTテープマーク用
$0032=ポート$2000の内容
$0091=CMTチェックサム下位
$0092=CMTチェックサム上位
CMTにブロックデータをセーブします
ビットデータ”0”×20000
”1”×テープマーク数
”0”×テープマーク数
データ全体
チェックサム
”1”
NMIオン
$B56A:BASICCMT1バイトライト
入力:A=出力データ
$0091=CMTチェックサム下位
$0092=CMTチェックサム上位
出力:$0091=CMTチェックサム下位
$0092=CMTチェックサム上位
使用:A、X
$0019=出力データ
CMTに1バイト出力します
ビットデータ”1”を出力
出力データは$0019に移され、2倍にしてCf=1になれば
ビットデータ”1”を出力、チェックサムを+1
Cf=0ならビットデータ”0”を出力
これを1バイト分繰り返します
ビットデータ”1”を出力した分だけチェックサムは増加します
$B586:BASICCMTビットデータ”0”を出力
使用:A
$001B=CMTライトビットディレイ0”0”=$34
$001C=CMTライトビットディレイ1”0”=$34
これは本体が0と判断するパルスをCMTに出力します
$B590:BASICCMTビットデータ”1”を出力
使用:A
$001B=CMTライトビットディレイ0”1”=$6A
$001C=CMTライトビットディレイ1”1”=$6A
これは本体が”1”と判断するパルスをCMTに出力します
$B7C4-$B7F4:BGTOOL用メッセージ
$B7F5-$B800:BGTOOL用メッセージポインタ
$C529-$C564:セレクトVSYNCタスク$06用メッセージポインタ下位
$C565-$C5A0:セレクトVSYNCタスク$06用メッセージポインタ上位
$C5A1:$00ワタシハ[0D]ファミリーコンピュータデス[FF]
$C5B5:$01ドウサヲカイシシマス[FF]
$C5C2:$02ワカリマシタ[FF]
$C5C9:$03ハイ![FF]
$C5CD:$04リョウカイ![FF]
$C5D4:$05サギョウヲカイシシマス[FF]
$C5E2:$06アナタハダレデスカ?[0D]ナマエヲイレテクダサイ
$C5FC:$07モウイチドキキマス[FF]
$C607:$08”[C2]”ニ[0D]シマスカ?[FF]
$C613:$09サギョウヲチュウシシマス[FF]
$C622:$0Aサヨウナラ[FF]
$C629:$0Bカセットノバックアップスイッチヲ[0D]OFFニシテクダサイ[FF]
$C647:$0C”[C2]”ヲ[0D]カイシシマス[FF]
$C655:$0D”[C2]”ハ
$C66A:$0Eアア![0D]マエニオアイシタコトガアリマス
$C680:$0Fコンニチハ[FF]
$C686:$10ツギハナニヲシマショウ[FF]
$C694:$11リカイデキマセン![FF]
$C69F:$12:ファンファーレ:ヲナラシマス[FF]
$C6B0:$13エート?エート?[FF]
$C6BA:$14ワタシハウラナイガデキマス[FF]
$C6CA:$15[C0][0D]サンウラナイヲシマスカ?[FF]
$C6DB:$16ジカンギレデス[FF]
$C6E4:$17オモイダシマシタ![FF]
$C6EE:$18ソレデハアテマス[FF]
$C6F8:$19データヲノコシタイトキハ[0D]カセットノバックアップスイッチヲ[0D]
ONニシテクダサイ[FF]
$C724:$1Aコノカセットニハ[0D]”[C2]”ノデータガ[0D]ノコッテイマス[FF]
$C741:$1Bウラナイヲハジメマス[FF]
$C74D:$1Cマダウマレテイマセン[FF]
$C75A:$1Dスデニオナクナリニナラレテ[0D]イルデショウ![FF]
$C772:$1Eカラダノチョウシガヨイノデ[0D]スポーツシゴトベンキョウ[0D]
スベテニガンバリガキキマス[FF]
$C7A1:$1Fカラダノチョウシガフアンテイデスビョウキニカカラナイヨウニ[0D]
キヲツケテクダサイ[FF]
$C7CE:$20タイリョクガスコシヨワッテイマスムリヲシナイヨウニココロガケテ[0D]クダサイ[FF]
$C7F7:$21キブンハソウカイ[0D]セッキョクテキニ[0D]ナニゴトモススメテクダサイ[FF]
$C819:$22セイシンテキニフアンテイデス[0D]イライラシナイヨウニキヲツケテ[0D]クダサイ[FF]
$C840:$23キブンガサエマセン[0D]タイジンカンケイニ[0D]キヲツケテクダサイ[FF]
$C862:$24モノゴトヲカンガエルノニ[0D]テキシテイマス[0D]ムズカシイコトモカイケツシマス[FF]
$C88C:$25オオキナミスヲオカシヤスイ[0D]ヒデス[0D]ウッカリシナイヨウニキヲツケテクダサイ[FF]
$C8B7:$26アタマノカイテンガニブッテイマスノウリツガアガリマセンカラ[0D]
ムリニアタマヲツカワナイヨウニ[FF]
$C8EB:$27ソノヒノウラナイハツギノヨウニナリマシタ[FF]
$C903:$28ウラナイオワリ[FF]
$C90C:$29ナカナカヨイケッカガデマシタ[0D]ヨカッタデスネ![FF]
$C928:$2Aアマリヨクアリマセンネ[0D]キヲオトサナイデクダサイイ![FF]
$C945:$2Bウラナイハヤメマショウ[FF]
$C952:$2Cツギノシツモンニコタエテクダサイイ[FF]
$C965:$2Dワタシハナニヲシテイルトコロ[0D]デシタカ
$C97B:$2E[FF]
$C97C:$2Fアナタハ[0D][C0][0D]サンデスネ[FF]
$C98A:$30[C0][0D]サンマタヨビダシテクダサイ[FF]
$C99D:$31セイネンガッピハ[0D][C1]/[FF]
$C9A9:$32[0D][0D][E5][C0]/[C1]デスネ[FF]
$C9B4:$33[C0]/[FF]
$C9B7:$34[E5][C0]/[C1]ハ[FF]
$C9BE:$35ウマレテ[C0]ニチメニ[0D]ナリマス[FF]
$C9CF:$36[C0]![FF]
$C9D2:$37[0D][C0][0D]サンオゲンキデスカ?[FF]
$C9DE:$38イマワタシハ[0D][C0][0D]シジドウリドウサヲ[0D]シテイマス[FF]
$CA00:$39セイネンガッピヲイレテクダサイ[FF]
$CA11:$3Aウラナッテホシイヒニチヲ[0D]イレテクダサイ[FF]
$CA28:$3Bウラナイヲツヅケマスカ?[FF]
$CA50-$CA53:セレクト入力コマンドデータポインタ下位
$CA54-$CA57:セレクト入力コマンドデータポインタ上位
$CA58:ハイ、イイエ、[0D]、オワリ
$CA5C:[0D]、[0D]、[0D]、[0D]
$CA60:ハイ、イイエ、[0D]、[0D]
$CA69-$CA72:セレクト文字列データポインタ下位
$CA73-$CA7C:セレクト文字列データポインタ上位
$00$0301から汎用文字列
$01$D7F4セレクト画面
$02$D9A5カリキュレータボード画面
$03$CA7Dアトリビュート$00*2RAMOK
$04$D9FAメッセージボード画面
$05$DA22ボードライン0、ライン1、カラー
$06$DA32ボード、ライン0、カラー
$07$DA42ボード、、カラー
$08$DA77ボードの外枠
$09$DACCミュージックボード画面
$CA8B-$CA8C:セレクトRAMテストデータ$00,$55,$AA
$CA8D-$CAA1:セレクトコマンドデータポインタ下位
$CAA2-$CAB6:セレクトコマンドデータポインタ上位
$00$7000から$7012前々回入力した名前
$01$7013から$7025前回入力した名前
$02$7026から$7038入力した名前
$CAB7:$03オワリ[0D]
$CABB:$04ハイ[0D]
$CABE:$05イイエ[0D]
$CAC2:$06GAMEBASIC[0D]
$CACD:$07カリキュレータボード[0D]
$CAD9:$08ミュージックボード[0D]
$CAE4:$09メッセージボード[0D]
$CAEE:$0AEND[0D]
$CAF2:$0BHELLO[0D]
$CAF8:$0Cオハヨウ[0D]
$CAFD:$0Dコンニチハ[0D]
$CB03:$0Eコンバンハ[0D]
$CB09:$0F[0D](RETURN)
$CB10:$10[0D](RETURN)
$CB0A:$11BASIC[0D]
$CB10:$12CAL.[0D]
$CB15:$13MUS.[0D]
$CB1A:$14MES.[0D]
$CB28-$CB57:セレクトVSYNCタスクコマンドポインタ下位
$CB58-$CB87:セレクトVSYNCタスクコマンドポインタ上位
$CB88:セレクトコマンド$00
$CB8E:セレクトコマンド$01
$CB92:セレクトコマンド$02
$CB98:セレクトコマンド$0F
$CBA1:セレクトコマンド$2F
$CBBA:セレクトコマンド$03
$CBC6:セレクトコマンド$05
$CBCB:セレクトコマンド$06、$07
$CBD8:セレクトコマンド$1B
$CBE4:セレクトコマンド$1E
$CBE6:セレクトコマンド$08、$09
$CBEB:セレクトコマンド$0A
$CC00:セレクトコマンド$0B
$CC07:セレクトコマンド$0C
$CC0B:セレクトコマンド$0D
$CC15:セレクトコマンド$04
$CC22:セレクトコマンド$0E
$CC2E:セレクトコマンド$10
$CC3A:セレクトコマンド$11、$12
$CC3F:セレクトコマンド$13、$14
$CC48:セレクトコマンド$15、$16、$17
$CC4B:セレクトコマンド$18
$CC92:セレクトコマンド$19、$1A
$CC9B:セレクトコマンド$1C
$CC9F:セレクトコマンド$1D
$CCA7:セレクトコマンド$1F
$CCAF:セレクトコマンド$20
$CCB4:セレクトコマンド$21
$CCB9:セレクトコマンド$22、$23
$CCBE:セレクトコマンド$24、$25、$26、$27、$2C
$CCDA:セレクトコマンド$28
$CCDD:セレクトコマンド$2B
$CCE6:セレクトコマンド$2A
$CCEC:セレクトコマンド$29
$CCFD:セレクトコマンド$2D、$2E
$CE46:セレクトRAMテスト
出力:$007B=$03RAMテスト成功
$55RAMテスト失敗
$AARAMテスト失敗
$008A=$03RAMテスト成功の場合(メッセージナンバ$03RAMOK)
$7000-$7FFF=テストするデータの値
Tキーを押しながら起動するとこのRAMテストを行いBASICメニューへジャンプします
RAMテストは
$7000-$7FFFを$AAで書き込み、読み込みチェック
$7000-$7FFFを$55で書き込み、読み込みチェック
チェックに失敗すると書き込んだデータを$007Bに出力
チェックに成功すると$007Bに$03を出力と
RAMOKを表示する為のメッセージナンバ$03を出力します
$7000-$7FFFの内容は全て壊れます
$CF48:セレクトバックアップ・スイッチのテスト
出力:Zf=1BACKUPSWITCH=ON
0BACKUPSWITCH=OFF
メモリ$7039に$55と$AAを書き込み、読み込みチェックをする事に
よってBACKUPSWITCHのON/OFFを調べます
$D48F:セレクトセレクトでファンクションキーのデータを出力
入力:Y=$00=F1キーを選択
$01=F2キーを選択
$02=F3キーを選択
$03=F4キーを選択
$00C8=入力コマンドファンクションキーデータインデックス
$00=[0D]、[0D]、[0D]、[0D]
$01=ハイ、イイエ、[0D]、[0D]
$02=[0D]、[0D]、[0D]、[0D]
$03=ハイ、イイエ、コンニチハ、オワリ
出力:ファンクションキーのデータの長さ
使用:A、X、Y
$0001=ファンクションキーデータポインタ下位
$0002=ファンクションキーデータポインタ上位
$0304以降VRAMバッファ
$063D以降キー入力バッファ
VRAMバッファとキー入力バッファにファンクションキーに定義されている
文字を書き込みます
$D7F4:セレクト文字列データ$01セレクト画面データ
$D7F4:カラーパレット
$D817:BG-Aアトリビュート
$D850:画面
$D9A5:セレクト文字列データ$02カリキュレータボード画面データ
$D9A5:カラーパレット
$D9B0:画面
$D9FA:セレクト文字列データ$04メッセージボード画面データ
$D9FA:カラーパレット
$DA0C:画面
$DA22:セレクト文字列データ$05ボード画面データ
$DA22:セレクトライン0
$DA32:セレクトライン1
$DA22:セレクトカラー
アトリビュート
インクポッド
$DA77:セレクト文字列データ$08ボードの外枠画面データ
$DACC:セレクト文字列データ$09ミュージックボード画面データ
$DACC:カラーパレット
$DAD7:画面
$EDE8:セレクト乱数の発生
使用:$0000=ワーク
$0051=乱数発生用(初期値$0F)
$0052=乱数用
$0053=乱数用
$0054=乱数用
$0055=乱数用
$0056=乱数用
$0057=乱数用
$0058=乱数用
乱数を発生させます
$0051のBit2XOR$0052のBit2で1ならCf=1
0ならCf=0
Cf->$0051->0052...->0058
とシフトしていきます
$EE09:セレクト文字列表示先頭(実行アドレスは$EE43)
$EE43:セレクト文字列表示
入力:$0000=文字列ポインタ下位
$0001=文字列ポインタ上位
使用:A、X、Y
$0010=ポート$2001の内容0
$0012=ポート$2005の内容(水平)
$0013=ポート$2005の内容(垂直)
NMIが掛かると$008Aのメッセージナンバのアドレスを
$0000と$0001にセットされ$EE43をコールされます
このルーチンでVRAMにデータを書き込まれ
スクロールをセットされます
文字列のデータフォーマット
PPUアドレス上位または$00=エンドマーク
PPUアドレス下位
コードBit7:INCモード1=Y方向、0=X方向
Bit6:書き込みモード1=埋める、0=文字列
Bit5:長さD5
Bit4:長さD4
Bit3:長さD3
Bit2:長さD2
Bit1:長さD1
Bit0:長さD0
データ埋める場合1バイト、文字列の場合長さの分

以降エンドマークがでるまで繰り返し
$EE4C:セレクトスクロールセット
使用:$0012=ポート$2005の内容(水平)
$0013=ポート$2005の内容(垂直)
スクロールの設定を行います
$EE90-$EE94:右端オーバデータ
$EE9A-$EE9E:1ラインの長さデータ
$ED65:セレクトVRAMバッファにデータを書き込む
入力:$0000=PPUアドレス上位
$0001=PPUアドレス下位
$0002=データアドレス下位
$0003=データアドレス下位
出力:$0300=VRAMバッファの長さ
$0301から$033F:VRAMバッファ
使用:A、X、Y
$0004=列数
$0005=PPUデータの長さ
VRAMバッファにデータを書き込みます
$0300の値をみて書き込むので追加していきます
データは第1バイト:Bit7-4=列数、BiT3-0=データ長さ
第2バイト:PPUアドレス上位
第3バイト:PPUアドレス下位
第3バイト以降:データ
$EED3-$EEFA:セレクトファンクションキーデータ
$EED3:セレクト用
$C1=ハイ
$C2=イイエ
$C3=コンニチハ
$C4=オワリ
$C5-$C8使用しない
$EEDB:カリキュレータ用
$2B=+
$2C=-
$B5=×
$B6=÷
$28=(
$29=)
$2E=.
$3D==
$EEE3:ミュージック用
$A5=ド
$89=レ
$7F=ミ
$B7=ファ
$6E=ソ
$86=ラ
$6B=シ
$C8=エンソウ
$EEEB:???
$02
$06
$0E
$0F
$10
$11
$17
$18
$EEF3:ミュージック用+SHIFT
$43=C
$44=D
$45=E
$46=F
$47=G
$41=A
$42=B
$24=$
セレクトVSYNCタスク
$00:$2412使用禁止次のVSYNCタスク
$01:$CD93RTS
$02:$DC77カリキュレータボード
$03:$CD45使用禁止$00C6=$FFにしてタスク$06を実行
$04:$CF5Bバックアップデータがあるかチェック
$05:$CED5ウェイト、ランプのフラッシング
$06:$D2A4文字列表示
$07:$CF78バッファに$0D(RETURN)があるかチェック
$08:$CEF8メッセージナンバの設定(データを$008Aにセット)
$09:$CF06CLSBG-A、タスク$16の実行
$0A:$D515セレクト開始
$0B:$DB97メッセージボード
$0C:$D44Aファンクションキーの定義
$0D:$CF1Fキー入力した名前を$0500から$0512に書き込む
$0E:$CEF8文字列の設定(データを$008Aにセット)
$0F:$CF18BG、OBJの表示、タスク$00にする
$10:$D0E8名前の入力
$11:$D02A名前のチェック
$12:$D107JMPコマンド($0087)
$13:$CFC4コマンドの照合
$14:$CF2DBACKUPSWITCHのチェック
$15:$D06Eコマンド入力受付
$16:$CF10OBJの表示をしない、タスク$00にする
$17:$D0DAボードネームインデックスのリセット
$18:$F634
$19:$FA0Dウラナイ生年月日を聞く
$1A:$F646ウラナイ実行するか聞く
$1B:$F67Aウラナイファンファーレ
$1C:$D10F
$1D:$D124
$1E:$F4B1セレクトのファンクションキー設定、タスク$00にする
$1F:$CEE8
$20:$D10C次のボードをセットする
$21:$F689ウラナイ開始
$22:$F98E
$23:$F9AFウラナイ
$24:$F9E2
$25:$D139
$26:$E423ミュージックボード
$27:$D103JMPコマンド($0045)
$FFエンドマーク第2データのコマンドへジャンプする
オペーレータのプログラムデータ(コード)が格納されています
幾つかのコードのかたまりをコマンド$nnとします
1つのコードはVSYNCタスクnn、パラメータ、(パラメータ)の2バイトか3バイトになり
VSYNCタスクnnによって変わります
コマンドテーブル
+0+1+2+3
-----------------------
$CB88、$CB8E、$CB92、$CBBA
$CC15、$CBC6、$CBCB、$CBCB
$CBE6、$CBE6、$CBEB、$CC00
$CC07、$CC0B、$CC22、$CB98
$CC2E、$CC3A、$CC3A、$CC3F
$CC3F、$CC48、$CC48、$CC48
$CC4B、$CC92、$CC92、$CBD8
$CC9B、$CC9F、$CBE4、$CCA7
$CCAF、$CCB4、$CCB9、$CCB9
$CCBE、$CCBE、$CCBE、$CCBE
$CCDA、$CCEC、$CCE6、$CCDD
$CCBE、$CCFD、$CCFD、$CBA1
コマンド$00($CB88)
$09、$00BG-Aクリア、OBJオフ
$08、$01画面作成$01(セレクト)
$0F、$00BG、OBJオン
コマンド$01($CB8E)
$1E、$00セレクトのファンクションキーの設定
$0A、$01セレクトの開始
コマンド$02($CB92)
$06、$00、$00ワタシハファミリーコンピュタデス
$06、$00、$01ドウサヲカイシシマス
コマンド$0F($CB98)
$14、$00BACKUPSWITCHのチェック、OFFなら次のタスクから+7(コマンド$2Fの先頭)
$06、$00、$0BカセットノバックアップスイッチヲOFFニシテクダサイ
$05、$06ウェイト、ランプのフラッシング
$FF、$0FJMPコマンド$0F
コマンド$2F
$06、$00、$06アナタハダレデスカ?ナマエヲイレテクダサイ
$05、$03ウェイト、ランプのフラッシング
$10、$03名前入力
$13、$00入力コマンドのチェック
$0D、$00名前をメモリにセット
$06、$00、$04リョウカイ!
$06、$00、$2Fアナタハ[C0]サンデスネ
$11、$00名前のチェック
$06、$00、$0Eアア!マエニオアイシタコトガアリマス
$06、$00、$0Fコンニチハ
コマンド$03
$06、$00、$05サギョウヲカイシシマス
$04、$00バックアップスイッチのチェック
$06、$00、$1Aコノカセットニハ”[C2]”ノデータガノコッテイマス
$17、$00ボードネームの初期化
$FF、$06JMPコマンド$06
コマンド$05
$06、$00、$10ツギハナニヲシマショウ
$20、$00次のボードネーム
コマンド$06、$07
$06、$00、$08”[C2]”ニシマスカ?
$05、$03ウェイト、ランプのフラッシング
$0C、$03ファンクションキーの定義
$15、$00コマンドインプット
$0C、$00ファンクションキーの定義
$12、$00JMPコマンド($0087)
コマンド$1B
$0C、$00ファンクションキーの定義
$06、$00、$04リョウカイ!
$06、$00、$0C[C2]ヲカイシシマス
$05、$07ウェイト、ランプのフラッシング
$09、$00CLSBG-A、タスク$16の実行
コマンド$1E
$12、$00JMPコマンド($0087)
コマンド$08、$09
$0C、$00ファンクションキーの定義
$06、$00、$08”[C2]”ニシマスカ?

BASICVSYNCタスク
BASIC上でNMI(VBLANK)が掛かると
OBJのDMA転送等、VYSNCタスクの実行を行います
$0063をコマンドとして各実行を行います(実行終了$0063=$00になる)
またMOVEコマンドが実行されるとMOVE処理とVSYNCタスクがNMI毎に交互に実行されます
<例BGのCMTアクセス>
LDA#$0B;VSYNCタスク$0CBG-Bを実行
STA$63
LOOP0:LDA$63;タスク終了($00)まで待つ
BNELOOP0

CMTアクセスルーチン

LDA#$0C;VSYNCタスク$0BBG-Aを実行
STA$63
LOOPZ:LDA$63;タスク終了($00)まで待つ
BNELOOPZ
RTS
$00=VSYNCタスク終了または実行をしない
何も実行しません
$01=文字列表示$88AA
入力:$0048=カーソルX座標
$0049=カーソルY座標
$0064=文字列インデックス
$0700から文字列データ(エンドマーク$00)
出力:$0062=VRAMバッファインデックス(終了した場合$00)
$0063=VSYNCタスク$00タスク実行終了
$01持ち越し
$0064=文字列インデックス(終了した場合$00)
カーソル指定の文字列を表示します
ただし1回のタスクでカーソルのX座標が13か27まで行くと
タスクは終了して次の割り込みに持ち越しされます
つまり1回のタスクで1ラインの半分(14文字)しか表示されません
座標が右下を超えると画面をスクロールして新しいラインを表示します
スクロールするときに一旦タスクを止めて
ポート$2005に書き込みを行ってから再びタスク$01を指定して
次の割り込みに持ち越しします
$02=VRAMからバッファにコピー$8925
入力:$0049=カーソルY座標
$0076=バッファインデックス
出力:$0048=カーソルX座標$00になる
$0063=VSYNCタスク$00タスク実行終了
$0064=文字列インデックス$FF
$0500-$051Bバッファ
Xレジスタ=$00A9の内容
カーソルX座標=$00、その1ラインをバッファにコピー
そのテキストライン接続フラグ$FFならカーソルY座標を+1
$00なら何もしない
$0064=$FF
Xレジスタに$00A9の内容をロード
タスク$00にしてスクロールセットを行います
$03=テキストラインのコピー、表示$8961
入力:$0019=表示アドレス上位
$001A=表示アドレス下位
$0048=コピーするカーソルX座標
$0049=コピーするカーソルY座標
$0076=バッファインデックス
カーソル位置から1ライン分のVRAMをバッファ$0500-$051Bにコピー
表示アドレスにバッファ$0500-$051Bのデータを表示
タスク$00にしてスクロールセットを行います
$04=テキストライン1行消去$8898
入力:$0048=カーソルX座標
$0049=カーソルY座標
カーソル位置から右端までスペース($20)を埋め
タスク$00にしてスクロールセットを行います
$05=VRAMリード$8870
入力:$0048=カーソルX座標
$0049=カーソルY座標
出力:A=リードしたVRAMデータ
$0073=リードしたVRAMデータ
カーソル位置のVRAMデータを読み込み$0073にデータを書き込みを行い
タスク$00にしてスクロールセットを行います
$06=BGカラーパレットの設定$8990
入力:$0700=パレットコード($00から$03)
$0701=配色番号0
$0702=配色番号1
$0703=配色番号2
$0704=配色番号3
BGカラーパレットの1組のデータの書き込みを行い
タスク$00にしてスクロールセットを行います
$07=OBJカラーパレットの設定$89BE
入力:$0700=パレットコード($00から$03)
$0701=配色番号0
$0702=配色番号1
$0703=配色番号2
$0704=配色番号3
OBJカラーパレットの1組のデータの書き込みを行い
タスク$00にしてスクロールセットを行います
$08=プロント表示$8882
入力:$0048=カーソルX座標
$0049=カーソルY座標
カーソル位置にあるキャラクタを$0073に保存
$0061のカーソルキャラクタを表示
タスク$00にしてスクロールセットを行います
$09=プロント表示で消されたキャラクタ表示$8890
入力:$0048=カーソルX座標
$0049=カーソルY座標
カーソル位置に$0073に保存されたキャラクタを表示
タスク$00にしてスクロールセットを行います
$0A=PLAY$9A90
入力:
バッファ内にあるPLAY文データの演奏を行います
$0B=BG-GRAPHIC画面(BG-B)の選択$8862
入力:$0033=ポート$2001の内容1
ポート$2001へ$0033の内容($0E)を書き込みます
主にBGのCMTアクセス後で使用
$0C=テキスト画面(BG-A)の選択$885F
ポート$2001へ$00を書き込みます
主にBGのCMTアクセス前で使用
$0D=スクリーンエディットINS$89CC
$0E=1ラインをバッファにコピーして次のVSYNCにタスク$0Fにする$8A02
$0F=Y座標を+1にして、そこからバッファにある1ラインデータをVRAMに書き込む$8A1A

Enri's HP
http://www43.tok2.com/home/cmpslv/
http://www43.tok2.com/home/cmpslv/Famic/Fambas.htm








[ゲーム][TVゲーム] 任天堂ファミリーコンピュータ・ゲーム,1985.1~1985.4発売分, 
バルーンファイト
任天堂
1985.1.22発売
カートリッジ
バルーンファイト
・ドラえもーん、ボクも風船で飛びたいよー!(ふくろ~)
・ジャウストの100倍おもろい。バルーントリップモードも良いのら。(吉ダム)
アイスクライマー
任天堂
1985.1.30発売
4500円
カートリッジ
アイスクライマー
・最後、あの怪鳥につかまっちゃって大丈夫か?(ふくろ~)
エクセリオン
ジャレコ
1985.2.11発売
4500円
カートリッジ
エクセリオン
・ダブルビームよりシングルビームのほうが強い。渋い。(ふくろ~)
・まずはちゃんと面白かった。ですはい。(吉ダム)
ギャラガ
ナムコ
1985.2.15発売
4500円
カートリッジ
ギャラガ
・味方を撃ったときの曲と、1000点がせつなく心に染みる。(ふくろ~)
・ボーナスステージのパターンしっかり覚えたり、昔は真面目にやってたなあ。(吉ダム)
◆ファミリーベーシックV3
任天堂
1985.2.21発売
9800円
カートリッジ
ファミベV3
・誰も持ってなかったが、CMの「ブイスリ~~~~~」は真似した。(ふくろ~)
・やっぱCMだけは記憶に残ってるなあ。おれ遊ぶの専門でよろしく!(吉ダム)
バンゲリングベイ
ハドソン
1985.2.22発売
4900円
カートリッジ
バンゲリングベイ
・発売前の、コロコロの煽り記事はすごいものだったなあ。(ふくろ~)
・前評判の反動がすごかったあまりにクソゲーあつかい。(吉ダム)
フォーメーションZ
ジャレコ
1985.4.4発売
4500円
フォーメーションZ
あんた誰!?
・中ボスの名前、「サトゥ・テム・ユル・ボワク」は、ちょいやりすぎ。(ふくろ~)
・海上をジャンプで渡れるのだ!ってウラ技むずくてできね!(吉ダム)
サッカー
任天堂
1985.4.9発売
4500円
カートリッジ
サッカー
・当時知っていたサッカー選手、釜本。ペレ。以上!(ふくろ~)
・微妙にフットサル。ロングシュート最強説。(吉ダム)
スペースインベーダー
タイトー
1985.4.17発売
4500円
カートリッジ
インベーダー
・ゼビウスの後に出たインベーダーを、君は買うか?爆弾発言。(ふくろ~)
・すでに私の世代なんも思いいれなし。スマン。(吉ダム)
チャンピオンシップロードランナー
ハドソン
1985.4.17発売
4900円
カートリッジ
チャンピオンシップロードランナー
・チャンピオンシップすぎ!1面しかクリアできなかった。(ふくろ~)
・タイミングが全てのやなむずかしさ。やりなおし覚悟でよろしく!(吉ダム)

ファミコンDataBase
http://www.geocities.jp/f_tamakoku/famicon/database/databaseframe.htm