これは 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 ベクタ
アップロードしたデータを正しく処理するために、 次の手続きを実行する。
電源ONの後、最初のユーザコードに入る時に次の値がレジスタにセットされる。 A=0, X=0, Y=0, PSW=$02, SP=$EF
このアップローダに戻りたい時は、0x00F1 から IPL を有効にして、 P フラグをクリアして、 $FFC0 に単純にジャンプする (もしくはスタックとページ 0 のリセットをスキップして、$FFC9 にジャンプする)。