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

1985年2月17日日曜日

[書籍][FM7] Oh!FM/1985年





























[書籍][FM7] Oh!FM/1985年
Oh!FM表紙集
Update (1997/11/23)
FM7ユーザーのバイブルと言うべきOh!FMの表紙集です。

Nabechan Home Page
http://www23.tok2.com/home/fm7emu/ysm7/ysm74/ysm74.htm
http://www23.tok2.com/home/fm7emu/ysm7/ysm77/ysm77.htm
http://www23.tok2.com/home/fm7emu/ysm2/asc/wiz.htm
http://www23.tok2.com/home/fm7emu/ysm2/art/a-tr.htm

1985年2月16日土曜日

[ゲーム][FM7] The Castle~カセット/FDD版パズルアドベンチャ





[ゲーム][FM7] The Castle~カセット/FDD版パズルアドベンチャ
「The Castle」
提供会社:(株)アスキー
■価格
3.5DFDD: 7800円
Tape: 3800円
■内容
あなたは王子を操り、城内にある100部屋をくぐり抜け、何処かに捕らわれているお姫様を助けだすのだ。
■感想
とてもじゃないがクリヤー出来ませんでした。ギブアップです。
キャスル ゲーム

Nabechan Home Page
http://www23.tok2.com/home/fm7emu/ysm2/asc/tcas.htm
http://www23.tok2.com/home/fm7emu/ysm2/asc/cand.htm
http://www23.tok2.com/home/fm7emu/ysm2/asc/arion.htm
http://www23.tok2.com/home/fm7emu/ysm2/art/robo.htm
http://www23.tok2.com/home/fm7emu/ysm2/asc/1942.htm
http://www23.tok2.com/home/fm7emu/ysm2/art/arctic.htm
http://www23.tok2.com/home/fm7emu/ysm2/art/a-tr.htm




[ゲーム][FM7} 1942






[ゲーム][FM7} 1942
1942
提供会社:(株)アスキー
■価格
5.0DFDD: 6800円
3.5DFDD: 6800円
■内容
戦闘機を操作し連射機銃で敵をやっつけろ!!
■感想
縦スクロールのシューティングゲームです。 戦闘機が多数表示されると,動作が重くなるのは・・・。 ゲーセンでもお馴染みの一作品です。
1942 ゲーム

Nabechan Home Page
http://www23.tok2.com/home/fm7emu/ysm2/asc/1942.htm
http://www23.tok2.com/home/fm7emu/ysm2/art/arctic.htm
http://www23.tok2.com/home/fm7emu/ysm2/art/a-tr.htm

[ゲーム][FM7} アークテック(ARCTIC)





[ゲーム][FM7} アークテック(ARCTIC)
「アークテック(ARCTIC)」
提供会社:(株)アートディンク
■価格
3.5DFDD: 5800円
■内容
立体交差のレール上に繰り広げられる,あなたとボールの知的バトル。 ポイントを切り換えのタイミングが勝敗を左右する,ACTIVE RALL PLAYING GAME。
■感想
アートディンクさんお得意の思考型ゲームと言ったところでしょうか。
ゲームのルールは簡単で,スタート時に有ったボールを元の位置に戻す物ですが, 言うとやるのでは大違い。なかなか難しく,時間を忘れて嵌まっちゃうゲームです。

Nabechan Home Page
http://www23.tok2.com/home/fm7emu/ysm2/art/arctic.htm
http://www23.tok2.com/home/fm7emu/ysm2/art/a-tr.htm


1985年2月15日金曜日

[ゲーム][MSX] XANADU DRAGON SLAYER II

[ゲーム][MSX] XANADU DRAGON SLAYER II
■STORY
はるかなる昔ザナドゥという王国があった。
長きに渡り平和が続き、祝福にあふれた美しい土地。そこで暮らす人々は皆幸福に包まれ、日々が喜びに満たされていて、一年中飽くことを知らないぐらいでした。
輝かしき永遠の地ザナドゥ。
しかしながら、ある時を境に預言者達が不吉な未来を訴えるようになりました。
それと時をほぼ同じくして、ザナドゥの地ではありえなかった事がおき始めたのです。
温暖で穏やかなはずのザナドゥの地は、深い雲に覆われ、海は荒れ果て、大地は実りをもたらさなくなりました。 
そのような最中、「大いなる災いの到来に備えよ!」との預言者達の声は、人々の心に大きく圧し掛かり不安を広げました。
時の王は人心を乱す輩として、預言者達を残らず獄に繋ぎ、それをもって人々の不安を取り除こうとしました。
しかし、何一つ変わる事の無い現実に人々はやがて正気を欠いていくようになり、一月を待たずして地上の楽園ザナドゥは、欲望と悪徳に満ちた世界となってしまいました。
そして時が来ました。預言者達の思いも虚しく、虚無の世界の主たるキングドラゴン・ガルシスが手を伸ばしてきたのです。
桃源郷。地上の楽園とまで呼ばれたザナドゥの地は、瞬く間に魔族の手に落ち焦土と成り果ててしまいました。
魔族達はザナドゥの地を荒廃し尽くすと、キングドラゴン・ガルシスの名の下、現ザナドゥの王であるジュリデン王に魔族が立ち去る条件と引き換えに三つの要求をしてきたのです。
「一つ、XANADU地下にある”聖なる洞窟”を要塞化した上で我らに明け渡すこと」
「二つ、XANADUの統治者たる証し、”レビック” ”クォージィ” ”タイタン” ”サグリュイレス”の四つの王冠をよこすこと」
「三つ、XANADUで穫れる各生産物の六割を我らに納めること」
ジュリデン王は王家の威信や屈辱よりも幾万の民の命を思い、魔王ガルシスの要求を呑まざるを得ませんでした。
こうして苦難の時代が始まり、数十年もの月日が流れました…。
王家もただ黙って魔族に屈し続けていたわけではなく、秘密裏に幾度となくガルシスを倒すべく試みを繰り返していましたが、そのどれもが敵の強大さを知るだけの、無残な結果となっていました。
「ガルシスを倒す事のできる者は、もうこの世界にはおらんのか・・」
王の弱々しい言葉を前に、皆がうなだれていました…。
ある時、王の側近のサミュエルは、預言者達が牢獄の壁に残していた詩を見つけました。
”三百年に一度シリューガの三つの星が三ヶ月の間一点に交わる時、シリューガの目に守られし者によりこの地は光を取り戻す…”
サミュエルはこの予言を王に伝えました。詩の啓示が確かなら、この時こそがガルシスを討てる唯一のタイミングであるはずだと。
その言葉に希望を見出した王と家臣一同は、密かに事を運ぶため、魔術師達に夢による啓示を行うように命じました。
かくして予言の時は来ました。夢の啓示に導かれた若き勇士達によって王城の広間は溢れかえっていました。
勇士達は戦意も高く、すぐにでも地下城砦に赴かんとする勢いでしたが、王はガルシスの”負”の波動に負けないよう彼等を鍛えるようにサミュエルに命じ、勇士達に七つの道場で過酷な訓練を施しました。
想像を絶した訓練にもかかわらず、勇士達の中で脱落した者は誰一人としておらず、訓練を終えた勇士達は魔族に悟られぬよう、ひとり、またひとりとガルシスの地下城砦へと降りていきました…。
こうしてザナドゥ奪還の幕が切って落とされたのです。
あなたは勇士達のひとりとなって、ガルシスを倒しザナドゥに光を取り戻さなければなりません。
ガルシスを倒す為には、神々が遠い昔、ある王に与えた幻の剣”Dragon Slayer”が必要となることでしょう。
まずは伝説の剣を探すため、唯一の手がかりである精霊の王達の四つの王冠を手にする事です。
神々の祝福があなたの上に多からんことを…。
■マイコンゲームの金字塔
今回はマイコンゲームの超有名作品であるXANADUの記事を書いていこうと思います。
 発売は日本ファルコム。
ジャンルはアクションRPGになります。
マイコンゲーマーだった世代に本作の事を聞いてみると、まずは「名作だ!」だとか「超ヒットした怪物ソフト」だとかの返答が高確率で返ってくるのではないでしょうか?
ザナドゥの初出はPC88版の1985年秋。その洗練された見た目やゲームとしての完成度は、当時の周囲のゲームと比べ何十歩もリードしていて、かなりの注目を集めました。当然雑誌などでも相応にもてはやされ、特集や攻略記事などが1年以上も続くという今では考えられない事態を引き起こしました。
しかし、その絶大なる熱狂振りを信じて、初心者が本作を実際に手にとってプレイしてみると、何がなんだか分からないという状況に必ず陥ると思います。
たいていのゲームはやってさえいればゲームをクリアできるのですが、このゲームはだらだらやっているとすぐにハマリ(クリア不可能状態)になります。基本的に本作はプレイヤーを完全に突き放していて全然優しくありません(笑)
地形でハマって身動きとれずにゲームのやり直し。食料難に陥ってにっちもさっちもいかなくなってやり直し。武具が購入できず敵の強さに対処できなくなったからやり直し…、初心者は散々な目に遭う事は確実でしょう。失敗を重ねて、試行錯誤を繰り返して、仕様を少しずつ体に染み込ませて、そこまでやってやっと本作が始まるのです。
この、試行錯誤を強いられる、やり直しを当たり前とするスタイルは、今現在のゲームのスタイルとしてはあまり歓迎されないでしょう。今の時代ではユーザーにできる限り強いてはならないというのが基本であり常識なのですから。
きっと今現在のゲームユーザーに”当時は大流行した”という事以外を告げずに本作をプレイさせてみたら、9割以上の人間は「これがどうして大ブレイクしたのか理解できない!」と憤慨するか本気で首を傾げるのではないでしょうか?
当時は購入したゲームはクリアできなくても普通という時代でしたから、ユーザーに厳しいタイトルも多かったです。
製作サイドの方は、アクションやシューティングは無理を感じたらそこで終了すればいいという考えだったし、アドベンチャーやRPGはとにかく難解にしてクリアが容易にできないようにする事は当然でした。
ユーザー自体も、当時は今現在のように大漁のゲームタイトルが発売されていたわけでもなく、また気に入らないからと言って気軽に中古屋に売りに行って、帰りに安価な別のゲームを購入、といったような事ができたわけでもなかったので、購入したゲームがどのようなモノであっても、なんだかんだとやり込んでしまうという事が結構普通でした。
試行錯誤や繰り返しプレイが当たり前な時代だったという事も、本作が大ヒットした要因のひとつではないかと、少なからず管理人は思っています。洗練された見た目はともかく、本作はゲームとしての完成度を体感できるまでに時間が掛かりますから。
管理人自身も今でこそザナドゥの魔力に魅了された一プレイヤーではありますが、そこにたどり着くまでには当然の事ながら、
「なんだ? このわけの分からん、ややこしいゲームは!!」 
だとか、
「やっぱりザナドゥなんて手を出さずに止めておけば良かった…」
だとか何度も何度も何度も何度も思いながらプレイしていました(笑)
さて、実際にプレイをして苦難を経験して本作の理解度を少しずつ深めていき、1度は中盤程度の位置まで進めたプレイヤーならば、ひとつの事実に気がつく事でしょう。「ゲームクリアまでの道筋がひとつではない」という事に。
本作は必ずしも順番にクリアしていく必要があるわけでもないですし、ステータス配分も余程極端ではない限りなんとかなります(笑)
称号が無ければ開かないケーブも Pendant を使って無理やり開ける事もできるし、敵がいくら強くても Demons Ring で透明になれば一方的に攻撃できます。Mantle を使えば踏破しにくい地理だろうが壁を無視して進む事も可能なのです。
アイテムの使い方以外でも敵の強さを把握する事で、その敵の処理を後回しにできるし、敵が有限である事や、レベルアップにより発生するデメリットも、中長期的な戦略によりコントロールができます。慣れてくると、制限や面倒さが多い本作も、意外と自由度が高く、やりたい放題ができるという事に気がつくと思います。
いろいろと挙げましたが要するに経験と知恵で本作は如何様にもプレイができてしまうわけです。
それが本作の大きな長所であり、最大の魅力です。
ザナドゥにおける一番の楽しさは、どのような状況であっても、それに応じた戦術・戦略を練る事ができる事にその妙があると管理人は思っています。それ故にプレイヤー自身の経験値や本作への理解度が増えれば増えるほど、ザナドゥは魅力的になゲームへと化けていくのではないでしょうか? 
以前ザナドゥは面白くない! との意見を当時からの古参ゲーマーより聞いた事がありますが、一度や二度の躓きや、間口の狭さによる取り付き難さで、ザナドゥを面白くないと断ずるのは勿体無いかと思います。

ドナドナを聴きながら








■MSX版以外のXANADUについて
MSX版ではグラフィック能力の制約上で見た目が極彩色となっているのですが、本来のXANADUの見た目は青と黄色をメインにした統一感のある美しいカラーリングになっています。
アイテムやキャラクターなどには複数の色が使われているのですが、よく見てみると同じ色の使いまわしで表現されているので、見た目が落ち着いていて統一感があり、なぜか高級感を漂わせているかのような錯覚を覚えます。
それゆえ、この洗練されたグラフィックがザナドゥだ! と思われている方も多いことでしょう。
実際後にリバイバルと銘打ってリメイクされた時も、ハードを考えたらもっと様々な色が使えるというのに、頑なに2色系統内での色数を控えたカラーリングを守っていました。管理人にとっても、青と黄色のカラーリングでないザナドゥはザナドゥに見えません。
「じゃあ、MSX版のザナドゥは何?」
と言われそうですけど、管理人の感覚では、あれは移植版ザナドゥです。[
青と黄色で構成されている多機種版のザナドゥこそが”ザナドゥ”であって、MSX版のアレンジされている(ハード性能上仕方なくではありますが)ザナドゥは”移植されたザナドゥ”として認識しています。MSX1を贔屓目で見てしまう管理人でも、この部分は曲げようがありません。
とは言え管理人はMSX1版のザナドゥのほうが思い入れも強いし、気に入っています。
やはり一番最初に触れたモノに愛着を持ってしまうのはしょうがないのでしょうw
XANADUがMSX1に移植されたのは、XANADUが初めてリリースされてから約2年ほど経った後です。
そのせいか見た目以外でもいくつかバランス調整が入っていて、他機種版とMSX版のXANADUとでは変更点がいくつかあります。
・レベル0のフィールドに戻れない
 MSX版と違いトレーニンググラウンドに戻れないので、魔法のアイテムを売っている店に何度も通う事ができないです。
・画面構成
 MSX1版は、現在何を装備しているのかが、アイコンでも表示されるようになって、視覚的に分かりやすいです。
・BGM
 BGMは基本的に1つで、これを戦闘中や移動中などのシーンなどでBGMの音色やリズムを変化させています。メインがあって、他のシーンではそのメインのアレンジに努めているわけです。脳みそに強制的に刷り込まれるので通称悪魔のワルツと言われていますw
 逆にMSX版はシーン毎に別個にBGMが用意されています。
大きな部分ではこのあたりでしょうか? 
他にもキャラクターメイキング時の支払う対価が違うだとかありますが、管理人がすぐに気が付いたあたりはこの程度です。
探せば他にも細かい部分で違うところはいくつもあると思います。
BGMはMSX版のほうが種類も多く、このBGMを聴く為だけでもMSX版はプレイする価値があると思いますが、統一感のあるXANADUのグラフィックやBGMという、XANADUの美点はMSX版では微塵も味わう事ができません。良し悪しですね。
幸いな事に、XANADUの操作性や戦略性といったゲームの根幹の部分に関しては、全然違和感無くMSX版でも同じ感覚でプレイができるので、グラフィックとBGMの差異さえ理解しておけば、そう頭を悩ませる必要もないかと思います。

ドナドナを聴きながら
http://www.geocities.p/galfned/xanadu/xanadu.htm







■A new type real time role playing game
MSX版のザナドゥはマイコン機種の中では最後に発売され、ようやくザナドゥ熱が治まった頃、
PC88版から見てほぼ2年後に発売されました。
媒体もフロッピーではなくメガロムとなり、ゲーム性はそのままに、見た目やBGMなどいろいろな点はMSX仕様となりました。
当時の管理人のザナドゥ経験と言えば、レンタルソフト屋(当時はこういう業種が存在していました)からMSXのROM版をレンタルしてきて2~3日ばかり触れた程度でしかありませんでした。
ゲーム画面や内容は雑誌などでさんざん見知っていたのでよく知っていたのですが、当時は実際に触れてみてもあまり面白いとは感じなかった事を記憶しています。
このドナドナを開設してこのかた、
「名作と名高い本作に手を出そう」、
「一度はクリアしてみよう」、
と何度も試みたのですが、毎回本作を下調べしているうちにやる気が失せていました…。
敵が無限ではなく有限だというのが、管理人にはかなり気に入らなかったのです。
敵が有限だから、落ちている物も含めてアイテムやお金の量も有限です。
もちろん当然のことながら経験値も有限です。
また自キャラのレベルアップにデメリットがあるという事も、憂鬱なものでした。
基本的に管理人は自分のペースで、だらだらできないゲームは苦手なんですよ。
本作は中期的・長期的戦略が必要になってくるゲームなので、きっちりとした計画を立ててプレイする必要があるんですよね。
そんなこんなで、どう調べても「素人お断り」「一見さんお断り」的な雰囲気に、毎回毎回二の足を踏んでいたのです…。
しかしながら、折角レトロゲームのサイトを持っているのに、ハイドライドだけに触れて本作を避けて通るというのも、何かしら片手落ちになるなぁ…。と思い、気が重く、気乗りしないながらもプレイしていったわけですが、プレイ時間が長くなるほどに、「レベルアップする前に鍵を買い溜めしよう」だとか、「今レベルアップするよりもう少し先に進んでからレベルアップしよう…」だとか、「やべぇ! 脳みそ全滅させちまった! 防具上げられねぇやん!」だとか、いつの間にかきっちりとザナドゥをしていました(笑)
なんだかんだ言いながらも、最終的にはザナドゥを楽しむ事ができていたのには驚きですよ。
当時クリアできなかった無念を晴らす事もできたしホッとしていますw
敵の強さや、所有アイテム、塔内に配置されているアイテム、得られる経験値など、様々なデータを得て、それをベースに行動をしていく。多少ずれたプレイや極端なプレイに走っても、知識を元に戦術・戦略を練って踏破していく…。アクションもある事はありますが、基本的にこのゲームは頭脳ゲームとして一級品なんだと思います。
本作はARPGというジャンルのゲームですが、人によっては本作を優れたパズルゲームだと謳う人もいます。
管理人も本作の本質はARPGというより、シミュレーションや将棋・チェスなどの戦略的ゲームだと思っています。
ファルコムもイースばかり移植していないで、ザナドゥも移植して欲しいですね。
素材はしっかりとしているので、変な弄り方さえしなければ、工夫次第で売り物になると思うけど…。
などと管理人は記事を書いている時に何度も思ったりしていました(笑)

ドナドナを聴きながら
http://www.geocities.jp/galfned/castle/excellent.html
www.geocities.p/galfned/xanadu/xanadu.htm