[機器][TVゲーム] ファミリーベーシックでBASICプログラム
小容量のメモリ構成ながら意外としっかりした作りになっている。
いろいろ不満はあるものの低価格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コントローラ
コントローラ十字ボタンの入力状態の取得
8
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