※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

「APU/IPL」の編集履歴(バックアップ)一覧はこちら

APU/IPL」の最新版変更点

追加された行は青色になります。

削除された行は赤色になります。

+***IPL (Initial Program Loader) ブート ROM [#e71ceeac]
 
+これは SPC700 のブート ROM イメージで、リセット時に実行される。
+
+ $CD $EF $BD $E8 $00 $C6 $1D $D0 $FC $8F $AA $F4 $8F $BB $F5 $78
+ $CC $F4 $D0 $FB $2F $19 $EB $F4 $D0 $FC $7E $F4 $D0 $0B $E4 $F5
+ $CB $F4 $D7 $00 $FC $D0 $F3 $AB $01 $10 $EF $7E $F4 $10 $EB $BA
+ $F6 $DA $00 $BA $F4 $C4 $F4 $DD $5D $D0 $DB $1F $00 $00 $C0 $FF
+
+ .ORG $FFC0
+         MOV X, #$EF    ; *** 初期化 ***
+         MOV SP, X      ; スタックのセットアップ
+         MOV A, #$00    ; ページ 0 RAM のクリア
+ -       MOV (X),A
+         DEC X
+         BNE -
+         MOV $F4,#$AA   ; "ready" 信号を 5A22 に送る: $2140-1 は #$BBAA を返す
+         MOV $F5,#$BB
+ -       CMP $F4,#$CC   ; 5A22 が $2140 に #$CC を書き込むまで待つ
+         BNE -
+         BRA Start
+ Trans:  MOV Y,$F4      ; *** 転送ルーチン ***
+         BNE Trans      ; 最初に、5A22 の $2140 から バイト 0 (準備完了) が書き込まれるのを待つ
+ -       CMP Y,$F4      ; ループスタート: $2140 から 次のバイト/終了 信号を待つ
+         BNE +
+         MOV A,$F5      ; 次のバイトを取得 ($2140 がバイトインデックスに一致するのを期待する)
+         MOV $F4,Y      ; $2141 からバイトを読み込み、$2140 にエコーする
+         MOV [$00]+Y,A  ; 準備。バイトを書き込み、カウンタを更新
+         INC Y
+         BNE -
+         INC $01        ; (handle $xxFF->$xx00 overflow case on increment)
+ +       BPL -
+         CMP Y,$F4      ; If "next byte/end" is not equal to expected next byte
+         BPL -          ; index, it's "end": drop back into the main loop.
+ Start:  MOVW YA,$F6    ; *** メインループ ***
+         MOVW $00,YA    ; 5A22 の $2142-3 からアドレスを取得
+         MOVW YA,$F4    ; $2141 からモードを取得, $2140 からエコーバック
+         MOV $F4,A
+         MOV A,Y
+         MOV X,A
+         BNE Trans      ; Mode non-0: 転送開始
+         JMP [$0000+X]  ; Mode 0: アドレスにジャンプ
+         .DW $FFC0      ; RESET ベクタ
+
+アップロードしたデータを正しく処理するために、
+次の手続きを実行する。
+
++$2140-1 から 16 ビット読み込み、$BBAA を返すまで待つ
++ターゲットアドレスを $2142-3 に書き込む
++$2141 に 0 以外の値を書き込む
++$2140 に $CC を書き込む
++$2140 が $CC を返すまで待つ
++最初のバイトを $2141 に書き込む
++$2140 にバイトインデックスを書き込む ($00 が最初のバイト)
++$2140 がセットしたバイトインデックスを返すまで待つ
++ステップ 6 に戻り、次のバイトを書き込み、++index を入れて完了まで続ける
++他のブロックを書き込みたい時、次のアドレスを $2142-3 に書き込み、
+0 以外の値を $2141 にセットし、index+2 を $2140 に入れ、
+エコーバックを待つ。
+そして、ステップ 6 に index=0 で戻る。
++アップロード後にどこかのコードへジャンプしたい時は、
+ターゲットアドレスを $2142-3 に書き込み、
+$2141 に $00 を、$2140 に index+2 を書き込み、
+エコーバックを待つ。
+すぐ後に、コードが実行される。
+
+電源ONの後、最初のユーザコードに入る時に次の値がレジスタにセットされる。
+A=0, X=0, Y=0, PSW=$02, SP=$EF
+
+このアップローダに戻りたい時は、[[0x00F1>IO ポート (サウンド)/SPC#p00F1]] から IPL を有効にして、
+P フラグをクリアして、 $FFC0 に単純にジャンプする
+(もしくはスタックとページ 0 のリセットをスキップして、$FFC9 にジャンプする)。