ファミリーベーシック 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 へ戻る