ファミリーベーシック V2.1A
小容量のメモリ構成ながら意外としっかりした作りになっている。
いろいろ不満はあるものの低価格BASICとしては結構な出来と思われる
NMI割り込み(V−Sync)
PPUからの割り込み
エントリアドレスは$00ED
ゼロページ内にジャンプするのでBASICで任意に変える事が出来ます
セレクト $CDA7
BASIC $880F
リセット割り込み
電源を入れたり、リセットボタンが押されるとココに飛びます
エントリアドレスは$C400
IRQ割り込み(未使用)
エントリアドレスは$FFF0
割り込みベクタをみると$FFFEが$FFF0となっています
AFFF0:CLI
DB $5C,$60,00
この$5Cはどうやら未定義命令で
次の指定したアドレスのメモリを読むだけで
レジスタ、フラグには影響しないようです
他の未定義命令でも同様なものがありますが
$4C(JMP)を実行させない為に
$5Cを使用したと思われます
ただしこのベクタの後はデータなのでハングアップします
<例>この場合は$9000へジャンプする
DB $5C,$00,$80 ;$5C→$4Cだと$8000へジャンプ
JMP $9000 ;4C 00 90
ROMの回路図
PRG ROMにはHVC−FB1−2 A、HVC−FB1−2 Bと印字(バージョンで変わります)
CHR ROMにはHVC−FB1−0と印字されています。(CHR ROMは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に繋がっているキーデータP3 1 〜 P3 8をポート$4017 D4−1で読みます
1度に読み込むデータは4ビットなので2回読むことになります
下位、上位データを読み込む事でIC4017の/CKEが0から1になり
次のキーラインを読む為下位データを選択した時点で/CKEは1から0になり
キーラインが新しくカウント(指定)されます
キーボード
出力ポート
4016 d2:OUT2 デバイスの選択 1=キーボード、0=CMT READ
4016 d1:OUT1 データ セレクト&ラインカウンタ 1=上位データ、0=下位データ
4016 d0:OUT0 キーライン(P2)のリセット 1=行う 、0=行わない
入力ポート
4017 d4:キーデータD7(上位の場合)/キーデータD3(下位の場合)
4017 d3:キーデータD6(上位の場合)/キーデータD2(下位の場合)
4017 d2:キーデータD5(上位の場合)/キーデータD1(下位の場合)
4017 d1:キーデータ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
出力ポート
4016 d2:OUT2 デバイスの選択 1=キーボード、0=CMT READ
4016 d0:OUT0 CMTライト データ
入力ポート
4016 d1: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バイトデータの各ビットの内容の’1’の数になります。
データが$FFなら+8、$C0なら+2、$00なら+0になります
BG−GRAPHICデータは
BG2の内容をCPU $0700−$07FFHへ転送したデータを4分割でセーブ
BG2へ転送するデータをCPU $0700−$07FFHに4分割でロード、PPUへ転送
キャラクタ
スプライトのキャラクタになります
BGのキャラクタになります
これがBASICのアスキーコードの基準となります
アスキーコードは$00−$1Fのキャラクタは表示されずコントロールコードとして使用されます
ただしPRINT文には反映されません
$00=Null $10=^P *SHIFT+F5
$01=^A INSモードのON/OFF $11=^Q *SHIFT+F6
$02=^B *SHIFT+F1 $12=^R INS
$03=^C BREAK(プログラム停止は出来ない)$13=^S
$04=^D 画面の初期設定 $14=^T
$05=^E カーソル以降1行分の消去 $15=^U
$06=^F *SHIFT+F2 $16=^V カナ モードにする
$07=^G BEEP音を出す $17=^W 英数字モードにする、*SHIFT+F7
$08=^H DEL $18=^X *SHIFT+F8
$09=^I $19=^Y
$0A=^J ラインフィールド $1A=^Z カーソル以降画面下の消去
$0B=^K HOME $1B=ESC
$0C=^L 画面クリア $1C=カーソル右
$0D=^M RETURN $1D=カーソル左
$0E=^N *SHIFT+F3 $1E=カーソル上
$0F=^O *SHIFT+F4 $1F=カーソル下
*SHIFT+Fnは英数モードキー入力で使用
BG GRAPHIC
SELECT
キャラクタを書きます
カーソルキー カーソルの移動
[RETURN] 配色番号の変更
[INS] マーカー左移動
[DEL] マーカー右移動
[HOME] グループ +1
[SHIFT]+[HOME] グループ −1
[D] キャラクタの消去
[ESC] ファンクションメニュー
グループ表
COPY
キャラクタのコピーを行います
カーソルキー カーソルの移動
[INS] キャラクタの取得
[DEL] キャラクタの複製
[ESC] ファンクションメニュー
MOVE
キャラクタの移動を行います
カーソルキー カーソルの移動
[INS] 1回目 キャラクタの取得
2回目 キャラクタの消去
[DEL] キャラクタの移動
[ESC] ファンクションメニュー
CLEAR
画面(BG2)の消去を行います
[SPACE] 画面消去の実行
[ESC] ファンクションメニュー
FILE
CMTのロード・セーブを行います
画面の指示に従いセーブかロードを決め
ファイルネーム(最大16文字)を入力して[RETURN]
CHAR
文字の入力を行います
[ESC] ファンクションメニュー
ファンクションメニュー
カーソルキー上 カーソル上の移動
カーソルキー下 カーソル下の移動
[SPACE] メニュー(MODE)の実行
ABS(数式)
絶対値を求める
ASC(文字列)
文字列の最初の1文字目をキャラクタコードの数値に変換
ヌルストリングの場合0になる
BEEP
音を鳴らす
CALL アドレス
アドレス…&H0000〜&HFFFFまたは−32768〜32767
マシン語のサブルーチンの実行
CGEN n
n…0〜3
BG、スプライト面にキャラクタの割り当てを行う
ポート$2000 d4−3の設定になります
・−−−−−−−−−−−−・
|n|BG面|スプライト面|
|−+−−−+−−−−−−|
|0| 1 | A | A=マリオ等のスプライトキャラクタ
|1| 1 | B | B=英数字等のBG キャラクタ
|2| 2 | A |
|3| 2 | B | デフォルト、^DはCGEN2の設定
・−−−−−−−−−−−−・
CGSET m,n
m…0〜1 BG面
n…0〜2 スプライト面
BG、スプライト面のパレットグループの指定
*BG GRAPHICで描いた背景をそのままの色にしておく場合は
CGSET1,1にする
CHR$(数式)
数値0〜255または&H0〜&HFFをキャラクタコードして変換する
CLEAR
変数、配列のクリアを実行
CLEAR アドレス
BASICで使用するメモリ上限アドレスの指定
CLS
テキスト画面をクリア
COLOR x,y,n
x…カラム 0〜27
y…行 0〜23
n…配色番号 0〜3
テキスト画面のカラー指定
CONT
プログラムの再開
CSRLIN
カーソルY座標の取得
CUT n0[,n1,n2,n3,n4,n5,n6,n7]
n0〜n7…DEF MOVEで定義した番号 0〜7
MOVEで動いたスプライトを停止
DATA 定数[,定数,定数,……]
定数…数値または文字列
READ文で使用するデータの定義
DEF MOVE(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 ■=スプライト
654 0=停止状態
速さ
c=フレーム毎1/30秒 × 2ドット(斜め移動ではx、yとも2ドット)
移動量
d×2ドットの移動量
DEF SPRITE n,(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=0 8×8キャラクタの場合
文字列 ”i”
文字式 CHR$(i)
文字変数 1キャラクタ分のデータ
b=1 16×16キャラクタの場合
文字列 ”ijkl”
文字式 CHR$(i)+CHR$(j)+CHR$(k)+CHR$(l)
文字変数 4キャラクタ分のデータ
b=1 16×16キャラクタのfのデータ
・−−−・
|i|j|
|−+−|
|k|l|
・−−−・
スプライトの定義を行います
定義可能のスプライト番号は0〜7の8個
DIM 配列名(m1[,m2])[,配列名(n1[,n2])]
配列宣言を行います
配列名は数値変数、文字列変数の両方可
END
プログラムを終了、BASICコマンド待ちへ行きます
ERA n0[,n1,n2,n3,n4,n5,n6,n7]
n0〜n7…DEF MOVEで定義した番号 0〜7
MOVEで動いたスプライトを停止、消去を実行
FOR i=l TO m [STEP s]
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)
KEY n,文字列
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画面のロードはBG GRAPHICで行う
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…DEF MOVEで定義した番号 0〜7
DEF MOVEで定義された動作の開始
MOVE(n)
n…0〜7 DEF MOVEで定義したキャラクタの動作番号
MOVE命令で動いているキャラクタの動作が完了したか調べる
0=動作完了
−1=動作中
NEW
BASICプログラムの消去
ON 式 GOTO 行番号[,行番号,行番号…]
式の値によって指定された行へジャンプ
ON 式 GOSUB 行番号[,行番号,行番号…]
式の値によって指定された行へサブルーチンジャンプ
ON 式 RETURN 行番号[,行番号,行番号…]
式の値によって指定された行へ復帰
ON 式 RESTORE 行番号[,行番号,行番号…]
式の値によってデータを指定
PALETm n,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座標)の取得
()内の値は何でも構わない
POSITION n,x,y
n…DEF MOVEで定義した動作番号 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画面のセーブはBG GRAPHICで行う
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)
DEF SPRITEて定義されているスプライトを指定の位置に表示
座標の位置を省略すると消去
同一座標に複数のスプライトを表示した場合
スプライト番号が小さいものが手前に表示される
スプライトは水平に4つ(8文字分)まで表示可
超えると重なる水平部分は表示されない
SPRITE OFF
全スプライトの表示オフ
SPRITE ON
全スプライトの表示オン
STICK(n)
n…0=Iコントローラ
1=IIコントローラ
コントローラ十字ボタンの入力状態の取得
8
2 1
4 0=何も押されていない
同時入力の場合、対応する数字が加わる
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
GAME BASICモードにする
BASICプログラムは保護される
VAL(文字列)
文字列…数字の文字列 −32768〜32767
&H0〜&HFFFF
文字列は数値に変換
ただし文字列の最初の文字が+−&または数字以外なら0となる
文字列の中に16進数の文字以外があれば、それ以降は無視される
VIEW
BG GRAPHIC画面をバックグランド面(テキスト)へコピー
カーソール位置はホームへ戻る
BG GRAPHIC画面の色をそのまま持ってくる場合
CGSET1,1を使用
XPOS(n)
n…DEF MOVEで定義されたスプライト動作番号 0〜7
DEF MOVEで定義された動作番号の水平位置の取得
YPOS(n)
n…DEF MOVEで定義されたスプライト動作番号 0〜7
DEF MOVEで定義された動作番号の垂直位置の取得
数の表現範囲
10進 −32768 から 32767
16進 &H0000 から &HFFFF
変数
英字で始まる2文字を識別(255文字まで表記可)
行番号の範囲
0 から 65534 最大255桁
配列の大きさ
2次元配列まで(メモリ範囲内で要素制限無し)
GOSUB〜RETURN ネスト
メモリ範囲内で制限なし
FOR〜NEXT ネスト
メモリ範囲内で制限なし
演算の優先順位
1. ()で囲まれた式
2. 関数
3. * /
4. MOD
5. + −
6. = <> > < >= <=
7. NOT
8. AND
9. OR
10. XOR
エラーメッセージ
NF=NEXT without FOR :FORが無いがNEXTがある
SN=Syntax error :文法間違い
RG=RETURN without GOSUB :GOSUBが無いがRETURNがある
OD=Out of DATA :DATAが用意されていない
IL=Illegal functioncall :ステートメント、関数の呼び出し間違い
OV=Overflow :演算結果が許容範囲オーバー
OM=Out of memory :メモリ不足になった
UL=Undefined line Number :指定した行番号が無い
SO=Subscript out of range:配列の添字が規定外
DD=Duplicate Definition :配列の2重定義
DZ=Division by zero :0の除算を実行
TM=Type mismatch :変数の型が合わない
ST=String too long :文字が31文字超えた
FT=Formula Too complex :式が複雑すぎる
CC=Can’t countinue :CONTでプログラムの再開出来ない
MO=Missing operand :最低限必要なパラメータが無い
TP=Tape read ERROR :CMTから正しくデータが読めない
クィックスタート
Tキーを押しながら起動(リセット)、
Tキーを離すと直接BASICメニュー画面に飛びます
ただしバックアップRAM領域のテストメモリを行うので
プログラムメモリの内容は全て$55に書き込まれます
プログラムを残しながらクィックスタートを行う場合は
BACK UP SWITCHをONにしてメモリを保護してから起動
起動終了後、BACK UP SWITCHをOFFにします
変数領域
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進数表記 下位、上位の順)
$11 16進数 次の2バイト(&Hまたは&以降の数値 下位、上位の順)
$12 実数 次の2バイト(16進数表記 下位、上位の順)
$22 ”
$2C ,
$2D − (DATA、LIST用)
$27 ’
$28 (
$29 )
$3A :
$3B ;
$80 GOTO $9146 | $A0 VIEW $A932
$81 GOSUB $90C6 | $A1 MOVE $C0CE
$82 RUN $857C | $A2 END $820B
$83 RETURN $9126 | $A3 PLAY $9A1D
$84 RESTORE $98E0 | $A4 BEEP $B30F
$85 THEN $83A6 | $A5 LOAD $97FC
$86 LIST $85AF | $A6 SAVE $978C
$87 SYSTEM $80D7 | $A7 POSITION $C0B6
$88 TO $836D | $A8 KEY $95AA
$89 STEP $836D | $A9 COLOR $BA4E
$8A SPRITE $A7F3 | $AA DEF $A887
$8B PRINT $8740 | $AB CGEN $A6CA
$8C FOR $927E | $AC SWAP $9496
$8D NEXT $930D | $AD CALL $918C
$8E PAUSE $9198 | $AE LOCATE $91CA
$8F INPUT $93C2 | $AF PALET $A6EA
$90 LINPUT $94F6 | $B0 ERA $C0ED
$91 DATA $8343 |
$92 IF $9204 |
$93 READ $994D |
$94 DIM $964E |
$95 REM $8343 |
$96 STOP $86DA |
$97 CONT $8717 |
$98 CLS $AB75 |
$99 CLEAR $9226 |
$9A ON $954D |
$9B OFF $836D |
$9C CUT $C0F0 |
$9D NEW $8382 |
$9E POKE $91DF |
$9F CGSET $A746 |
$CA ABS $A369
$CB ASC $A40A
$CC STR$ $A485
$CD FRE $A31A
$CE LEN $A3FF
$CF PEEK $A358
$D0 RND $A39F
$D1 SGN $A379
$D2 SPC $836D
$D3 TAB $836D
$D4 MID$ $A5FB
$D5 STICK $A6AA
$D6 STRIG $A6B9
$D7 XPOS $A346
$D8 YPOS $A34F
$D9 VAL $A4BE
$DA POS $A32E
$DB CSRLIN $A2F3
$DC CHR$ $A461
$DD HEX$ $A4B5
$DE INKEY$ $A520
$DF RIGHT$ $A5BD
$E0 LEFT$ $A574
$E1 SCR$ $A41D
$EF XOR
$F0 OR
$F1 AND
$F2 NOT
$F3 <>
$F4 >=
$F5 <=
$F6 =
$F7 >
$F8 <
$F9 +
$FA −
$FB MOD
$FC /
$FD *
プログラムの格納
<例>
10 FOR I=0 TO 10
20 PRINT ”TEST ”;
30 NEXT
上記のプログラムだと下記の様に格納されます
703E:11 ;1行の長さ……イ
703F:0A 00 ;行番号 10…ロ
7041:8C 20 49 F6 12 00 00 20;プログラム……ハ
88 20 12 0A 00
704E:00 ;エンドマーク
704F:0E ;1行の長さ
7050:14 00 ;行番号 20
7052:8B 20 22 54 45 53 54 20;プログラム
22 3B
705C:00 ;エンドマーク
705D:07 ;1行の長さ
705E:1E 00 ;行番号 30
7060:8D ;プログラム
7061:00 ;エンドマーク
7062:00 00 ;最終マーク
イ…このアドレス+1行の長さで次の行番号のアドレスになります
このとき次の行番号のアドレスの内容が$00だとプログラムの格納は終了となります
ロ…行番号 16進数で下位、上位の順 10行なので$000Aを$0A、$00とする
ハ…プログラム本体中間言語で格納
$8C :FOR
$20 :’ ’
$49 :I
$F6 :=
$12 00 00 :0 (実数)
$20 :’ ’
$88 :TO
$20 :’ ’
$12 0A 00 :10(実数)10なので16進数で$000A
$00 :エンドマーク 行の終わり
変数の配置
RUNすると変数Iが使用されるのでBASICプログラムの後ろに変数エリアが配置されます
7064:02 49 00 ;変数の型$02、変数名I(アスキーコード)
mm nn ;変数の数値
セレクト ワーク
$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 : カーソル位置のBG PPUアドレス上位
$0033 :DEL カーソル位置のBG PPUアドレス上位
$0034 : カーソル位置のBG PPUアドレス下位
$0035 :DEL カーソル位置のBG PPUアドレス下位
$0036 :ボード $00=カリキュレータ、$01=メッセージ、$03=セレクト、$04=ミュージック
$0037 :キーデータ(ASCII)
$0038 :キーデータ(ASCII)
$0039 :キーデータ(ASCII)
$003B :VSYNCカウンタ (NMIが掛かる事に+1)
$0040 :押されたキー
$0042 :メッセージボード 指定している行
$0043 :ボード ネーム インデックス $00=BASIC、$01=カリキュレータ、$02=ミュージック、$03=メッセージ
$0046 :BACK UP SWITCHチェック フラグ $00=チェックしない、$AA=チェックする
$004C :INSモードスイッチ $FF=オン、$00=オフ
$004F :BG1またはBG2の上位アドレスの指定 $20=BG1、$24=BG2
$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 :ファンクションキーデータ
d7−4:押されたFnのn−1の値
d3−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=d7が1
$06=d6が1
$05=d5が1
$04=d4が1
$03=d3が1
$02=d2が1
$01=d1が1
$00=d0が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=GAME BASIC
$10=カリキュレータ ボード
$11=ミュージック ボード
$12=メッセージ ボード
$008A :メッセージナンバ
VSYNCタスク$08、$0Eでセットされ
NMI割り込みが掛かるとVRAMにデータが書き込まれる
$00=$0301からの文字列
$01=セレクト 画面
$02=カリキュレータ ボード画面
$03=’RAM OK’を表示
$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=BG GRAPHIC CHAR または BASIC
$5E=BG GRAPHIC SELECT
$3E=BG GRAPHIC ファンクション メニュー
$20=BG GRAPHIC COPY、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アドレス下位
コード d7:INCモード 1=Y方向、0=X方向
d6:書き込みモード 1=埋める、0=文字列
d5:長さ D5
d4:長さ D4
d3:長さ D3
d2:長さ D2
d1:長さ D1
d0:長さ 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:キーマトリックス P2 1
d7:F8キー 1=押されている、0=押されていない
d6:RETURN 1=押されている、0=押されていない
d5:[キー 1=押されている、0=押されていない
d4:]キー 1=押されている、0=押されていない
d3:カナキー 1=押されている、0=押されていない
d2:右SHIFT 1=押されている、0=押されていない
d1:¥キー 1=押されている、0=押されていない
d0:STOPキー 1=押されている、0=押されていない
$0635:キーマトリックス P2 2
d7:F7キー 1=押されている、0=押されていない
d6:@キー 1=押されている、0=押されていない
d5:;キー 1=押されている、0=押されていない
d4::キー 1=押されている、0=押されていない
d3:ンキー 1=押されている、0=押されていない
d2:/キー 1=押されている、0=押されていない
d1:=キー 1=押されている、0=押されていない
d0:^キー 1=押されている、0=押されていない
$0636:キーマトリックス P2 3
d7:F6キー 1=押されている、0=押されていない
d6:Oキー 1=押されている、0=押されていない
d5:Lキー 1=押されている、0=押されていない
d4:Kキー 1=押されている、0=押されていない
d3:<キー 1=押されている、0=押されていない
d2:>キー 1=押されている、0=押されていない
d1:Pキー 1=押されている、0=押されていない
d0:0キー 1=押されている、0=押されていない
$0637:キーマトリックス P2 4
d7:F5キー 1=押されている、0=押されていない
d6:Iキー 1=押されている、0=押されていない
d5:Uキー 1=押されている、0=押されていない
d4:Jキー 1=押されている、0=押されていない
d3:Mキー 1=押されている、0=押されていない
d2:Nキー 1=押されている、0=押されていない
d1:9キー 1=押されている、0=押されていない
d0:8キー 1=押されている、0=押されていない
$0638:キーマトリックス P2 5
d7:F4キー 1=押されている、0=押されていない
d6:Yキー 1=押されている、0=押されていない
d5:Gキー 1=押されている、0=押されていない
d4:Hキー 1=押されている、0=押されていない
d3:Bキー 1=押されている、0=押されていない
d2:Vキー 1=押されている、0=押されていない
d1:7キー 1=押されている、0=押されていない
d0:6キー 1=押されている、0=押されていない
$0639:キーマトリックス P2 6
d7:F3キー 1=押されている、0=押されていない
d6:Tキー 1=押されている、0=押されていない
d5:Rキー 1=押されている、0=押されていない
d4:Dキー 1=押されている、0=押されていない
d3:Fキー 1=押されている、0=押されていない
d2:Cキー 1=押されている、0=押されていない
d1:5キー 1=押されている、0=押されていない
d0:4キー 1=押されている、0=押されていない
$063A:キーマトリックス P2 7
d7:F2キー 1=押されている、0=押されていない
d6:Wキー 1=押されている、0=押されていない
d5:Sキー 1=押されている、0=押されていない
d4:Aキー 1=押されている、0=押されていない
d3:Xキー 1=押されている、0=押されていない
d2:Zキー 1=押されている、0=押されていない
d1:Eキー 1=押されている、0=押されていない
d0:3キー 1=押されている、0=押されていない
$063B:キーマトリックス P2 8
d7:F1キー 1=押されている、0=押されていない
d6:ESC 1=押されている、0=押されていない
d5:Qキー 1=押されている、0=押されていない
d4:CTR 1=押されている、0=押されていない
d3:左SHIFT 1=押されている、0=押されていない
d2:GRPH 1=押されている、0=押されていない
d1:1キー 1=押されている、0=押されていない
d0:2キー 1=押されている、0=押されていない
$063C:キーマトリックス P2 9
d7:HOME 1=押されている、0=押されていない
d6:カーソル 上 1=押されている、0=押されていない
d5:カーソル 右 1=押されている、0=押されていない
d4:カーソル 左 1=押されている、0=押されていない
d3:カーソル 下 1=押されている、0=押されていない
d2:スペース 1=押されている、0=押されていない
d1:DEL 1=押されている、0=押されていない
d0:INS 1=押されている、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−$0029:1文字表示ルーチン ジャンプテーブル下位、上位
符号付き被乗数・被除算の下位、上位
演算結果下位、上位
$002A :符号付き 除算ワーク0
$002B :符号付き 除算ワーク1
$002C−$002D:ASCIIから変換した数値下位、上位 0から9
符号付き 乗数・除算の下位、上位
符号付き 除算ワーク2
CMT チェックサム比較用 下位、上位
VSYNCタスク PPUアドレス計算 Y
$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:16進数表示バッファ(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 :BG1またはBG2の上位アドレスの指定 $20=BG1、$24=BG2
$0050 :カナキースイッチ $FF=オン、$00=オフ
$0052−$0053:文字列データ 下位、上位
$0054−$0055:中間言語検索用ポインタ 下位、上位
$0056−$0057:RND用
$0058−$0059:汎用バッファ ポインタ退避用 下位、上位 ($0009−$000A)
$005A :プログラム1行分の長さ
$005B−$005C:コマンド検索アドレス 下位、上位
$005D :MOVEコマンド 第nnパラメータ(01−08)
$005E :キー入力用 $00=通常、$01−$FF=デバグ用? 出力キーデータの$03(^C)を返す
$005F :BG−GRAPHIC CMT PPUアドレス 下位、上位
$0061 :表示するカーソルのキャラクタ(ASCII)
$0062 :VRAMバッファ インデックス
$0063 :VSYNCタスクnn (nn=$00から$0F $00でタスク実行終了)
$0064 :文字列インデックス
$0065 :文字列インデックスカラー $00=BG、$01=OBJ
$0066 :ファンクションキーフラグ $FF=オン、$00=オフ
$0067 :ファンクションキーデータ
d7−4:押されたFn n−1の値
d3−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=d7が1
$06=d6が1
$05=d5が1
$04=d4が1
$03=d3が1
$02=d2が1
$01=d1が1
$00=d0が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バイトリード
KEY LIST 表示インデックス
SPRITE
メニュー
$0075 :キーデータ(ASCIIコード)
文字列 データ リードインデクス
CMT リード ディレイ
$0076 :キーバッファ インデックス
$0077 :BASIC キーリピートカウンタ0
$0078 :BASIC キーリピートカウンタ1
$0079 :BASIC キーリピートカウンタ2
$007B :キーリピートフラグ $FF=オン、$00=オフ
$007C :BG GRAPHIC
$00=SELECT
$01=COPY
$02=MOVE
$03=CLEAR
$04=FILE
$05=CHAR
$007D :BG GRAPHIC SELECTキャラクタグループ $00−$0C
$007E :テキスト スクロールカウンタ スクロールするたびに−1
$007F :BG GRAPHIC SELECTカーソル $00−$07
$0088 :BG GRAPHIC SELECT MODEnn (nn=$00−$03)
$008A−$008B:変数名2バイト
$008C−$008D:使用した変数 アドレス 下位、上位 (タイプ、名前)
$008E−$008F:使用した変数の値 アドレス 下位、上位
$0090 :PLAY文 ””の中の長さ
:KEY LIST用 Fnキー
$0091−$0092:PLAY文 バッファポインタ下位、上位
CMT テープマークの数 $0091のみ
CMT チェックサム下位、上位
$0098 :中間言語データ検索用(アスキーコード)
$0099 :中間言語
$009A−$009B:汎用バッファ ポインタ 上位、下位 保存用
$009D :ポート$2005(水平)の内容
$009E :BG2クリアラフグ $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 :CMTロードフラグ $00=LOAD、$01=LOAD?
$00B9 :PLAY Ch1 T(テンポ 1から8)
$00BA :PLAY Ch2 T(テンポ 1から8)
$00BB :PLAY Ch3 T(テンポ 1から8)
$00BC :PLAY Ch1 V(音量、エンベロープの長さ 0から15)
$00BD :PLAY Ch2 V(音量、エンベロープの長さ 0から15)
$00BE :PLAY Ch3 V(音量、エンベロープの長さ 0から15)
$00BF :PLAY Ch1 O(オクターブ 0から5)
$00C0 :PLAY Ch2 O(オクターブ 0から5)
$00C1 :PLAY Ch3 O(オクターブ 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チャンネル
d7:エラー 1=エラー発生、0=エラー無し
d6:
d5:
d4:
d3:
d2:APU Ch3 1=使用する、0=使用しない
d1:APU Ch2 1=使用する、0=使用しない
d0:APU Ch1 1=使用する、0=使用しない
$00CA :PLAY文 Ch nの指定 $00=Ch1、$01=Ch2、$02=Ch3
$00CB :PLAY文 Ch1カウンタ
$00CC :PLAY文 Ch2カウンタ
$00CD :PLAY文 Ch3カウンタ
$00CE :APUチャンネル ストップ $4015からこの値を引く
d7:
d6:
d5:
d4:
d3:
d2:APU Ch3 1=停止する、0=停止しない
d1:APU Ch2 1=停止する、0=停止しない
d0:APU Ch1 1=停止する、0=停止しない
$00CF :PLAY文Ch1 M(エンベロープ) M0=$30、M1=$00
$00D0 :PLAY文Ch2 M(エンベロープ) M0=$30、M1=$00
$00D1 :PLAY文Ch3 M(エンベロープ) M0=$30、M1=$00
$00D2 :PLAY文Ch1 Y(デューティ効果1〜3) Y0=$00、Y1=$40、Y2=$80、Y3=$C0
$00D3 :PLAY文Ch2 Y(デューティ効果1〜3) Y0=$00、Y1=$40、Y2=$80、Y3=$C0
$00D4 :PLAY文Ch3 Y(デューティ効果1〜3) Y0=$00、Y1=$40、Y2=$80、Y3=$C0
$00E0 :キー入力モード
$FD=BG GRAPHIC CHAR または BASIC
$5E=BG GRAPHIC SELECT
$3E=BG GRAPHIC ファンクション メニュー
$20=BG GRAPHIC COPY、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:CMT FCBバッファ
$0500 :CMT ファイルタイプ $02=BASIC、$03=BG DATA
$0501−$0511:CMT ファイルネーム
$0512ー$0513:CMT 長さ (下位、上位)
$0514ー$0515:CMT ロードアドレス(下位、上位)
$0516ー$0517:CMT 実行アドレス (下位、上位)*使用しない
$0505 :BG−GRAPHIC X座標
$0506 :BG−GRAPHIC Y座標
$0510−$051F:BG−GRAPHIC グループ CHR表示バッファ
$0520−$0579:BG−GRAPHIC メニューVRAM退避用10桁×8行
$0580−$059F:CMT キー入力したファイルネ−ム(エンドマーク$00)
$0600−$0617:テキストライン フラグ $00=行の先頭、FF=前の行と繋がっている
$0618 :
$0619 :
$0634 :キーマトリクス P2 1
d7:F8キー 1=オン、0=オフ
d6:RETURN 1=オン、0=オフ
d5:[キー 1=オン、0=オフ
d4:]キー 1=オン、0=オフ
d3:カナキー 1=オン、0=オフ
d2:右SHIFT 1=オン、0=オフ
d1:¥キー 1=オン、0=オフ
d0:STOPキー 1=オン、0=オフ
$0635 :キーマトリックス P2 2
d7:F7キー 1=オン、0=オフ
d6:@キー 1=オン、0=オフ
d5:;キー 1=オン、0=オフ
d4::キー 1=オン、0=オフ
d3:ンキー 1=オン、0=オフ
d2:/キー 1=オン、0=オフ
d1:=キー 1=オン、0=オフ
d0:^キー 1=オン、0=オフ
$0636 :キーマトリックス P2 3
d7:F6キー 1=オン、0=オフ
d6:Oキー 1=オン、0=オフ
d5:Lキー 1=オン、0=オフ
d4:Kキー 1=オン、0=オフ
d3:<キー 1=オン、0=オフ
d2:>キー 1=オン、0=オフ
d1:Pキー 1=オン、0=オフ
d0:0キー 1=オン、0=オフ
$0637 :キーマトリックス P2 4
d7:F5キー 1=オン、0=オフ
d6:Iキー 1=オン、0=オフ
d5:Uキー 1=オン、0=オフ
d4:Jキー 1=オン、0=オフ
d3:Mキー 1=オン、0=オフ
d2:Nキー 1=オン、0=オフ
d1:9キー 1=オン、0=オフ
d0:8キー 1=オン、0=オフ
$0638 :キーマトリックス P2 5
d7:F4キー 1=オン、0=オフ
d6:Yキー 1=オン、0=オフ
d5:Gキー 1=オン、0=オフ
d4:Hキー 1=オン、0=オフ
d3:Bキー 1=オン、0=オフ
d2:Vキー 1=オン、0=オフ
d1:7キー 1=オン、0=オフ
d0:6キー 1=オン、0=オフ
$0639 :キーマトリックス P2 6
d7:F3キー 1=オン、0=オフ
d6:Tキー 1=オン、0=オフ
d5:Rキー 1=オン、0=オフ
d4:Dキー 1=オン、0=オフ
d3:Fキー 1=オン、0=オフ
d2:Cキー 1=オン、0=オフ
d1:5キー 1=オン、0=オフ
d0:4キー 1=オン、0=オフ
$063A :キーマトリックス P2 7
d7:F2キー 1=オン、0=オフ
d6:Wキー 1=オン、0=オフ
d5:Sキー 1=オン、0=オフ
d4:Aキー 1=オン、0=オフ
d3:Xキー 1=オン、0=オフ
d2:Zキー 1=オン、0=オフ
d1:Eキー 1=オン、0=オフ
d0:3キー 1=オン、0=オフ
$063B :キーマトリックス P2 8
d7:F1キー 1=オン、0=オフ
d6:ESC 1=オン、0=オフ
d5:Qキー 1=オン、0=オフ
d4:CTR 1=オン、0=オフ
d3:左SHIFT 1=オン、0=オフ
d2:GRPH 1=オン、0=オフ
d1:1キー 1=オン、0=オフ
d0:2キー 1=オン、0=オフ
$063C :キーマトリックス P2 9
d7:HOME 1=オン、0=オフ
d6:カーソル 上 1=オン、0=オフ
d5:カーソル 右 1=オン、0=オフ
d4:カーソル 左 1=オン、0=オフ
d3:カーソル 下 1=オン、0=オフ
d2:スペース 1=オン、0=オフ
d1:DEL 1=オン、0=オフ
d0:INS 1=オン、0=オフ
$063D :SPRITE 0のキャラクタ合成型 $00=8×8、$01=16×16
$063E :SPRITE 1のキャラクタ合成型 $00=8×8、$01=16×16
$063F :SPRITE 2のキャラクタ合成型 $00=8×8、$01=16×16
$0640 :SPRITE 3のキャラクタ合成型 $00=8×8、$01=16×16
$0641 :SPRITE 4のキャラクタ合成型 $00=8×8、$01=16×16
$0642 :SPRITE 5のキャラクタ合成型 $00=8×8、$01=16×16
$0643 :SPRITE 6のキャラクタ合成型 $00=8×8、$01=16×16
$0644 :SPRITE 7のキャラクタ合成型 $00=8×8、$01=16×16
$0645 :DEF MOVE(0)
d7:8×8 1=通常 、0=Y反転
d6:8×8 1=通常 、0=X反転
d5:優先 1=BG後、0=BG前
d4:1=アニメオン、0=アニメオフ
d3:
d2:
d1:カラーd1
d0:カラーd0
$0646 :DEF MOVE(1)
d7:8×8 1=通常 、0=Y反転
d6:8×8 1=通常 、0=X反転
d5:優先 1=BG後、0=BG前
d4:1=アニメオン、0=アニメオフ
d3:
d2:
d1:カラーd1
d0:カラーd0
$0647 :DEF MOVE(2)
d7:8×8 1=通常 、0=Y反転
d6:8×8 1=通常 、0=X反転
d5:優先 1=BG後、0=BG前
d4:1=アニメオン、0=アニメオフ
d3:
d2:
d1:カラーd1
d0:カラーd0
$0648 :DEF MOVE(3)
d7:8×8 1=通常 、0=Y反転
d6:8×8 1=通常 、0=X反転
d5:優先 1=BG後、0=BG前
d4:1=アニメオン、0=アニメオフ
d3:
d2:
d1:カラーd1
d0:カラーd0
$0649 :DEF MOVE(4)
d7:8×8 1=通常 、0=Y反転
d6:8×8 1=通常 、0=X反転
d5:優先 1=BG後、0=BG前
d4:1=アニメオン、0=アニメオフ
d3:
d2:
d1:カラーd1
d0:カラーd0
$064A :DEF MOVE(5)
d7:8×8 1=通常 、0=Y反転
d6:8×8 1=通常 、0=X反転
d5:優先 1=BG後、0=BG前
d4:1=アニメオン、0=アニメオフ
d3:
d2:
d1:カラーd1
d0:カラーd0
$064B :DEF MOVE(6)
d7:8×8 1=通常 、0=Y反転
d6:8×8 1=通常 、0=X反転
d5:優先 1=BG後、0=BG前
d4:1=アニメオン、0=アニメオフ
d3:
d2:
d1:カラーd1
d0:カラーd0
$064C :DEF MOVE(7)
$0680−$0683:DEF SPRITE 0の文字式(キャラクタ)
$0684−$0687:DEF SPRITE 1の文字式(キャラクタ)
$0688−$068B:DEF SPRITE 2の文字式(キャラクタ)
$068C−$068F:DEF SPRITE 3の文字式(キャラクタ)
$0690−$0693:DEF SPRITE 4の文字式(キャラクタ)
$0694−$0697:DEF SPRITE 5の文字式(キャラクタ)
$0698−$069B:DEF SPRITE 6の文字式(キャラクタ)
$069C−$069F:DEF SPRITE 7の文字式(キャラクタ)
$06C0 :DEF MOVE(0) アニメキャラクタの種類
$06C1 :DEF MOVE(0) アニメキャラクタの動作の方向指定
$06C2 :DEF MOVE(0) アニメキャラクタの動かす速さカウンタ
$06C3 :DEF MOVE(0) アニメキャラクタの全移動量カウンタ
$06C4 :DEF MOVE(0) アニメキャラクタの動かす速さ
$06C5 :DEF MOVE(0) アニメキャラクタの全移動量
$06C6 :POSITION 0 X座標
$06C7 :POSITION 0 Y座標
$06C8 :DEF MOVE(1) アニメキャラクタの種類
$06C9 :DEF MOVE(1) アニメキャラクタの動作の方向指定
$06CA :DEF MOVE(1) アニメキャラクタの動かす速さカウンタ
$06CB :DEF MOVE(1) アニメキャラクタの全移動量カウンタ
$06CC :DEF MOVE(1) アニメキャラクタの動かす速さ
$06CD :DEF MOVE(1) アニメキャラクタの全移動量
$06CE :POSITION 1 X座標
$06CF :POSITION 1 Y座標
$06D0 :DEF MOVE(2) アニメキャラクタの種類
$06D1 :DEF MOVE(2) アニメキャラクタの動作の方向指定
$06D2 :DEF MOVE(2) アニメキャラクタの動かす速さカウンタ
$06D3 :DEF MOVE(2) アニメキャラクタの全移動量カウンタ
$06D4 :DEF MOVE(2) アニメキャラクタの動かす速さ
$06D5 :DEF MOVE(2) アニメキャラクタの全移動量
$06D6 :POSITION 2 X座標
$06D7 :POSITION 2 Y座標
$06D8 :DEF MOVE(3) アニメキャラクタの種類
$06D9 :DEF MOVE(3) アニメキャラクタの動作の方向指定
$06DA :DEF MOVE(3) アニメキャラクタの動かす速さカウンタ
$06DB :DEF MOVE(3) アニメキャラクタの全移動量カウンタ
$06DC :DEF MOVE(3) アニメキャラクタの動かす速さ
$06DD :DEF MOVE(3) アニメキャラクタの全移動量
$06DE :POSITION 3 X座標
$06DF :POSITION 3 Y座標
$06E0 :DEF MOVE(4) アニメキャラクタの種類
$06E1 :DEF MOVE(4) アニメキャラクタの動作の方向指定
$06E2 :DEF MOVE(4) アニメキャラクタの動かす速さカウンタ
$06E3 :DEF MOVE(4) アニメキャラクタの全移動量カウンタ
$06E4 :DEF MOVE(4) アニメキャラクタの動かす速さ
$06E5 :DEF MOVE(4) アニメキャラクタの全移動量
$06E6 :POSITION 4 X座標
$06E7 :POSITION 4 Y座標
$06E8 :DEF MOVE(5) アニメキャラクタの種類
$06E9 :DEF MOVE(5) アニメキャラクタの動作の方向指定
$06EA :DEF MOVE(5) アニメキャラクタの動かす速さカウンタ
$06EB :DEF MOVE(5) アニメキャラクタの全移動量カウンタ
$06EC :DEF MOVE(5) アニメキャラクタの動かす速さ
$06ED :DEF MOVE(5) アニメキャラクタの全移動量
$06EE :POSITION 5 X座標
$06EF :POSITION 5 Y座標
$06F0 :DEF MOVE(6) アニメキャラクタの種類
$06F1 :DEF MOVE(6) アニメキャラクタの動作の方向指定
$06F2 :DEF MOVE(6) アニメキャラクタの動かす速さカウンタ
$06F3 :DEF MOVE(6) アニメキャラクタの全移動量カウンタ
$06F4 :DEF MOVE(6) アニメキャラクタの動かす速さ
$06F5 :DEF MOVE(6) アニメキャラクタの全移動量
$06F6 :POSITION 6 X座標
$06F7 :POSITION 6 Y座標
$06F8 :DEF MOVE(7) アニメキャラクタの種類
$06F9 :DEF MOVE(7) アニメキャラクタの動作の方向指定
$06FA :DEF MOVE(7) アニメキャラクタの動かす速さカウンタ
$06FB :DEF MOVE(7) アニメキャラクタの全移動量カウンタ
$06FC :DEF MOVE(7) アニメキャラクタの動かす速さ
$06FD :DEF MOVE(7) アニメキャラクタの全移動量
$06FE :POSITION 7 X座標
$06FF :POSITION 7 Y座標
$0700−$077F:表示バッファ
PLAYバッファ
カラーパレット
BG−GRAPHICファイル バッファ
$0780−$079F:ストリングデータ バッファ
$7000−$7012:セレクト 前々回入力した名前
$7013−$7025:セレクト 前回入力した名前
$7026−$7038:セレクト 入力した名前
$7039 :BACK UP SWITCHテスト用
$703A :BACK UP SWITCHテスト用
$5A =データ有り
$5A以外=データ無し(コールドスタート)
$703B :BACK UP SWITCHテスト用
$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:BASIC BASICメニュー
ここでBASIC、BG GRPAHIC、END(セレクト )と
各場所へと実行されます
1:BASIC $80F0
2:BG GRAPHIC $80D4
3:END $C400
$8127:BASIC BASICのコールドスタート
出力:$0000=$59
BG2クリア、$0000=$59にして$81FFに飛びます
$8131:BASIC BASICメニューの表示
$814B:BASIC BG2クリア
入力:$009E
$009E=$81かチェックを行い$81以外ならBG2クリアを行います
$8154:BASIC BASICメニューメッセージの表示
入力:A=メッセージナンバ(0−3)
BASICメニュー内のメッセージを表示します
0=1−−BASIC
1=2−−BG GRAPHIC
2=3−−END
3=1,2,3 KEY IN !!
$819C:BASIC BASICメニューの枠の表示
メニューの枠の表示を行います。
$81D3:BASIC BASICメニューの枠の表示サブ0
入力:A=表示するVRAMアドレス上位
X=表示するVRAMアドレス下位
$00AD=枠の角のASCIIコード($DEまたは$E0)
使用:A、X、Y
枠の上と下のライン表示を行います
$81EA:BASIC BASICメニューの枠の表示サブ1
入力:A=表示するVRAMアドレス上位
X=表示するVRAMアドレス下位
$00AD=枠の角のASCIIコード($DEまたは$E0)
使用:A、X、Y
枠の縦のライン表示を行います
前もってポート$2000のd2=1にする必要があります
$81F1:BASIC VRAMをデータで埋める
入力:A=キャラクタデータ
Y=長さ
使用:A、Y
VRAMをYレジスタ分だけAレジスタの内容を埋めます
前もって埋めるVRAMアドレス、方向を設定しておきます
$81F8:BASIC PPUアドレスの指定
入力:A=PPUアドレスの上位
X=PPUアドレスの下位
使用:A、X
ポート$2006に各データをセットして
PPUアドレスの指定を行います。
$81FF:BASIC BASICコールドスタート
$820B:BASIC BASICのコマンド待ち(END文のエントリ)
プロンプト’OK’または’OK.’、$0A(NL)を出力して
コマンド待ちの状態になります
$8236:BASIC BASICのコマンド待ち
キー入力を行いBREAKならループ、RETURNキーが押されるまで待ち
スペースを読み飛ばして数字ならプログラムインプットモード
英字ならダイレクトコマンドモード
それぞれの処理を行います
$86B9:BASIC CMT STOPキーのチェック
出力:Zf=1 STOPキー オン
0 STOPキー オフ
使用:A
STOPキーが押されたかチェックします
$87F8:BASIC 文字列表示
入力:$0048=表示するカーソルX座標
$0049=表示するカーソルY座標
$0052=文字列データ アドレス下位
$0053=文字列データ アドレス上位
文字列データ...(エンドマーク$00)
使用:A、X、Y
$0028
$0029
$0032
$0047
$004C
$0062
$0069
$007E
|
$8808:BASIC VSYNCタスクの実行
入力:A=VSYNCタスクnn (nn=$01−$0F)
出力:$0063=$00 VSYNCタスク$00
VSYNCタスクによる
使用:VSYNCタスクによる
VSYNCタスクを実行、終了するまで待ちます
$8B5C:BASIC 符号付き 16ビットの乗算
入力:$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
符号付の16ビット × 16ビットを行います
$8BE59:BASIC 16ビットの減算
入力:$0028=被減数の下位
$0029=被減数の上位
$002C=減数の下位
$002D=減数の上位
出力:$0028=演算結果下位
$0029=演算結果上位
Cf=1 演算結果が正
0 演算結果が負
使用:A
16ビットの減算を行います
$0028−$0029をa、$002C−$002Dをbとすると
単純にa=a−bを実行します
$8CA1:汎用バッファ ポインタの16ビットインクリメント
入力:A=バッファデータ
出力:$0009=汎用バッファ ポインタ+1下位
$000A=汎用バッファ ポインタ+1上位
Zf=1 バッファ データ=$00
0 バッファ データ=$01−$FF
使用:A=バッファ データ
$0009=汎用バッファ ポインタ下位
$000A=汎用バッファ ポインタ上位
$0009から$000Aを16ビットとしてインクリメントしてから
AND $FFを行いAレジスタが$00(エンドマーク)か調べます
$8CAD:汎用バッファの16ビットインクリメント、データの取得
出力:$0009=汎用バッファ ポインタ+1下位
$000A=汎用バッファ ポインタ+1上位
A=ポインタ データ
使用:$0009=汎用バッファ ポインタ下位
$000A=汎用バッファ ポインタ上位
$0009から$000Aを16ビットとしてインクリメントしてから
そのポインタの内容を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オーバーなら?OV ERRORへ)
5.$0009−$000AをINCして1.から繰り返し
$8D3C:BASIC 16進数から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:BASIC CMT ファイルネーム バッファのクリア
使用:A、X、Y
$0580−$0590
ファイルネーム$0580−$058Fを$20で埋め
$0590を$00にします
$A1C3:ASCII 英字のチェック
入力:A=ASCIIコード
出力:Cf=1 英字以外
0 英字($41から$5A)
使用:A
キー入力等で得たASCIIコード1文字が英字か調べます
$A6C5:セレクト 、BASIC A=A*16
入力:A=データ
出力:A=入力したデータ*16
使用:A
ASL Aを4回実行します
$AAFE:BASIC VBLANK期間中になるまで待つ
使用:A
ポート$2002のd7=0(描画中)になるまで待ち
その後、d7=1(VBLANK)になるまで待ちます
始めにd7=1になるまで待たないのは
すぐにVBLNKが終わる可能性があるため
d7が0から1に変わった瞬間で
VBLANKの始まりを検知します
$AB09:BASIC カラーパレットの初期化
使用:A
$0052=文字列データ 下位
$0053=文字列データ 上位
$0065:文字列インデックスカラー $00=BGカラー、$01=OBJ カラー
$0700−$077F=VRAMバッファ
VRAMバッファを使用してカラーパレットの初期化を行います
$AB71:BASIC BG2クリア
出力:$0069=$00 ポート$2005(垂直)の内容
$009D=$00 ポート$2005(水平)の内容
$0600−0$0619=すべて$00 テキストライン フラグ
使用:$0032=ポート$2000の内容
$0033=$0E ポート$2001の内容1
$004F=$24にして下の$AB75を実行します
$AB75:BASIC BG1またはBG2クリア
入力:$004F=$20 BG1
$24 BG2
出力:$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=BG1またはBG2の上位アドレス $20 BG1
$24 BG2
$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:BASIC BG+OBJ オフ
使用:A
$AAFE(VBLANK待ち)をコールしてから
直接ポート$2001に$00を書き込みます
$ABFA:BASIC ポート$2001の設定
使用:A
$0033=ポート$2001の内容
$AAFE(VBLANK待ち)をコールしてから
$0033のデータをポート$2001に書き込む
$AC0D:BASIC 1文字表示
入力: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 ^G BEEP
使用: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:BASIC CMT エンドアドレスチェック
入力:$00AD=チェックアドレス下位
$00AE=チェックアドレス上位
$00AF=エンド アドレス下位
$00B0=エンド アドレス上位
出力:Zf=1 エンド アドレスと同じ値
0 エンド アドレスと同じ値では無い
$00ADから$00AEの値が$00AFから$00B0の値と
同じかチェックをします
$B3C4:BASIC CMT スタート、エンドアドレス変換
使用:A
入力:$0512=プログラムの長さ下位
$0513=プログラムの長さ上位
$0514=スタートアドレス下位
$0515=スタートアドレス上位
出力:$00AD=スタートアドレス下位
$00AE=スタートアドレス上位
$00AF=エンド アドレス下位
$00B0=エンド アドレス上位
CMTバッファにあるスタートアドレスと長さを足してエンドアドレスを求め
$00ADから$00B0のワークに書き込みを行います
$B3EB:BASIC NMI セット
入力:$0032=ポート$2000の内容
使用:A
ポート$2000を$0032のデータの書き込みを行います
$B3F1:BASIC NMI オン
使用:A
$0032=ポート$2000の内容
ポート$2000 d7=1にしてNMIオンにします
$B3F9:BASIC NMIセット、CMT データブロック ベリファイ
$B3F1をコール、A=$01にして$B406を実行します
$B401:BASIC NMIセット、CMT データブロック ロード
$B3F1をコール、A=$00にして$B406を実行します
$B406:BASIC CMT データブロック ロード
入力:A=$00 LOAD
$01 LOAD?
出力:A=$00 正常にロード
$02 エラー
Cf=1 STOPまたはエラー発生
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:BASIC CMT 本体ロード
出力:A=$00 正常にロード
$02 エラー
Cf=1 STOPまたはエラー発生
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:BASIC CMTリードデータの検知
出力:Cf=1 STOPキーが押された
0 CMTリードデータの検知
使用:A
STOPキーが押されたかチェックを行い
CMTリードのポート$4016のd1が1になるまで待ち
STOPキーが押されたかチェックを行い
CMTリードのポート$4016のd1が0になるまで待ちます
ビットデータ”1”と”0”の検知ではなく信号の1と0になります
$B4C0:BASIC CMT 1d リード
出力:Cf=1 STOP
0 CMTリード
Zf=1 CMT リードデータ ”1”
0 CMT リードデータ ”0”
使用:A、Y
CMTリードデータの検知を行い(HからL)
ディレイで時間稼ぎを行ってから
CMTリードのポート$4016のd1を読む事によって
リードデータが”0”か”1”の判断を行います
”0”はパルスが短いのでHからLからディレイ後の信号はHになります
”1”はパルスが長いのでHからLからディレイ後の信号はLになります
$B50D:BASIC CMT データ ブロックセーブ
入力:$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:BASIC CMT ブロックセーブ メイン
入力:$0091=書き込むテープマーク数
$00AD=スタート アドレス下位
$00AE=スタート アドレス上位
$00AE=エンド アドレス上位
$00AE=エンド アドレス上位
使用:A、X、Y
$0019=CMTテープマーク用
$0032=ポート$2000の内容
$0091=CMT チェックサム下位
$0092=CMT チェックサム上位
CMTにブロックデータをセーブします
ビットデータ”0”×20000
”1”×テープマーク数
”0”×テープマーク数
データ全体
チェックサム
”1”
NMIオン
$B56A:BASIC CMT 1バイト ライト
入力: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:BASIC CMT ビットデータ ”0”を出力
使用:A
$001B=CMTライト ビット ディレイ0 ”0”=$34
$001C=CMTライト ビット ディレイ1 ”0”=$34
これは本体が0と判断するパルスをCMTに出力します
$B590:BASIC CMT ビットデータ ”1”を出力
使用:A
$001B=CMTライト ビット ディレイ0 ”1”=$6A
$001C=CMTライト ビット ディレイ1 ”1”=$6A
これは本体が”1”と判断するパルスをCMTに出力します
$B7C4−$B7F4:BG TOOL用メッセージ
$B7F5−$B800:BG TOOL用メッセージ ポインタ
$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]”ハ [0D] イマ シュウリョウ シマシタ[FF]
$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*2 RAM OK
$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:$06 GAME BASIC[0D]
$CACD:$07 カリキュレータ ボード[0D]
$CAD9:$08 ミュージック ボード[0D]
$CAE4:$09 メッセージ ボード[0D]
$CAEE:$0A END[0D]
$CAF2:$0B HELLO[0D]
$CAF8:$0C オハヨウ[0D]
$CAFD:$0D コンニチハ[0D]
$CB03:$0E コンバンハ[0D]
$CB09:$0F [0D](RETURN)
$CB10:$10 [0D](RETURN)
$CB0A:$11 BASIC[0D]
$CB10:$12 CAL.[0D]
$CB15:$13 MUS.[0D]
$CB1A:$14 MES.[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=$03 RAMテスト成功
$55 RAMテスト失敗
$AA RAMテスト失敗
$008A=$03 RAMテスト成功の場合(メッセージナンバ$03 RAM OK)
$7000−$7FFF=テストするデータの値
Tキーを押しながら起動するとこのRAMテストを行いBASICメニューへジャンプします
RAMテストは
$7000−$7FFFを$AAで書き込み、読み込みチェック
$7000−$7FFFを$55で書き込み、読み込みチェック
チェックに失敗すると書き込んだデータを$007Bに出力
チェックに成功すると$007Bに$03を出力と
RAM OKを表示する為のメッセージナンバ$03を出力します
$7000−$7FFFの内容は全て壊れます
$CF48:セレクト バックアップ・スイッチのテスト
出力:Zf=1 BACKUP SWITCH=ON
0 BACKUP SWITCH=OFF
メモリ$7039に$55と$AAを書き込み、読み込みチェックをする事に
よってBACKUP SWITCHの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:BG1アトリビュート
$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のd2 XOR $0052のd2で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アドレス下位
コード d7:INCモード 1=Y方向、0=X方向
d6:書き込みモード 1=埋める、0=文字列
d5:長さ d5
d4:長さ d4
d3:長さ d3
d2:長さ d2
d1:長さ d1
d0:長さ 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バイト :d7−4=列数、d3−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:$CD93 RTS
$02:$DC77 カリキュレータ ボード
$03:$CD45 使用禁止 $00C6=$FFにしてタスク$06を実行
$04:$CF5B バックアップデータがあるかチェック
$05:$CED5 ウェイト、ランプのフラッシング
$06:$D2A4 文字列表示
$07:$CF78 バッファに$0D(RETURN)があるかチェック
$08:$CEF8 メッセージナンバの設定 (データを$008Aにセット)
$09:$CF06 CLS BG1、タスク$16の実行
$0A:$D515 セレクト 開始
$0B:$DB97 メッセージボード
$0C:$D44A ファンクションキーの定義
$0D:$CF1F キー入力した名前を$0500から$0512に書き込む
$0E:$CEF8 文字列の設定 (データを$008Aにセット)
$0F:$CF18 BG、OBJの表示、タスク$00にする
$10:$D0E8 名前の入力
$11:$D02A 名前のチェック
$12:$D107 JMP コマンド($0087)
$13:$CFC4 コマンドの照合
$14:$CF2D BACK UP SWITCHのチェック
$15:$D06E コマンド入力受付
$16:$CF10 OBJの表示をしない、タスク$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:$D103 JMP コマンド($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、$00 BG1クリア、OBJオフ
$08、$01 画面作成 $01(セレクト )
$0F、$00 BG、OBJオン
コマンド$01($CB8E)
$1E、$00 セレクト のファンクションキーの設定
$0A、$01 セレクト の開始
コマンド$02($CB92)
$06、$00、$00 ワタシハ ファミリーコンピュタ デス
$06、$00、$01 ドウサヲ カイシ シマス
コマンド$0F($CB98)
$14、$00 BACKUP SWITCHのチェック、OFFなら次のタスクから+7(コマンド$2Fの先頭)
$06、$00、$0B カセットノ バックアップスイッチヲ OFFニシテクダサイ
$05、$06 ウェイト、ランプのフラッシング
$FF、$0F JMP コマンド$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、$06 JMP コマンド$06
コマンド$05
$06、$00、$10 ツギハ ナニヲ シマショウ
$20、$00 次のボードネーム
コマンド$06、$07
$06、$00、$08 ”[C2]”ニ シマスカ?
$05、$03 ウェイト、ランプのフラッシング
$0C、$03 ファンクションキーの定義
$15、$00 コマンド インプット
$0C、$00 ファンクションキーの定義
$12、$00 JMP コマンド($0087)
コマンド$1B
$0C、$00 ファンクションキーの定義
$06、$00、$04 リョウカイ!
$06、$00、$0C [C2]ヲカイシ シマス
$05、$07 ウェイト、ランプのフラッシング
$09、$00 CLS BG1、タスク$16の実行
コマンド$1E
$12、$00 JMP コマンド($0087)
コマンド$08、$09
$0C、$00 ファンクションキーの定義
$06、$00、$08 ”[C2]”ニ シマスカ?
|
BASIC VSYNCタスク
BASIC上でNMI(VBLANK)が掛かると
OBJのDMA転送等、VYSNCタスクの実行を行います
$0063をコマンドとして各実行を行います(実行終了$0063=$00になる)
またMOVEコマンドが実行されるとMOVE処理とVSYNCタスクがNMI毎に交互に実行されます
<例 BGのCMTアクセス>
LDA #$0B ;VSYNCタスク$0C BG2を実行
STA $63
LOOP0:LDA $63 ;タスク終了($00)まで待つ
BNE LOOP0
|
CMTアクセスルーチン
|
LDA #$0C ;VSYNCタスク$0B BG1を実行
STA $63
LOOPZ:LDA $63 ;タスク終了($00)まで待つ
BNE LOOPZ
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画面(BG2)の選択 $8862
入力:$0033=ポート$2001の内容1
ポート$2001へ$0033の内容($0E)を書き込みます
主にBGのCMTアクセス後で使用
$0C=テキスト画面(BG1)の選択 $885F
ポート$2001へ$00を書き込みます
主にBGのCMTアクセス前で使用
$0D=スクリーンエディット INS $89CC
$0E=1ラインをバッファにコピーして次のVSYNCにタスク$0Fにする $8A02
$0F=Y座標を+1にして、そこからバッファにある1ラインデータをVRAMに書き込む $8A1A
Home へ戻る