Intel8051の子孫によるＬチカと、ＣＰＵのステップ実行

# 経緯
　アリエクで自分で組み立てる(半田付け)電卓のDIY.KITを購入した。
　CPUとしてSTC15W408AS-35i-28が付いて居た。
　Intel8051の子孫(派生型)だが、普通のDIPサイズ。
　◆◆◆　大きくてはんだ付けが楽だな　◆◆◆
　ＤＩＰサイズで商売になるのかな、之は呼び水として教育目的なのかな。

# 8051とSTC15W408について
　8051はIntelが1980年に売り出した、組み込み用８ビットワンチップマイコン。
　RAM(128B),MASK,ROM(4KB),カウンタ(2),シリアル(1)を有する。
　クロック12MHzを与えて、１MIPS程度の性能を出す。
　ビット操作が高速なのが特徴で、売れに売れたらしい。
　之を真似て出来た子孫は、全世界で千種類以上存在するとか。
　Intelが正当性を認知しているかは不明だが。

　STC15W408もこの子孫に当たり、ソフトはほぼ変更せず其の儘で動作する。
　ハードも基本部分は踏襲されており、新機能を追加したような構成を取っている。
　このチップは中国の宏晶社の製品だが、容量違いなど数えると此処だけで数百種有る模様。
　オリジナルより性能は向上しており、売り文句では７～１２倍高速だとしてる。
　　※クロックで3倍、更にマシンサイクルで3倍程度に高速化が図られている。
　　　サイクルだけで12倍に向上している製品も存在する。

　日本ではマイナーな様で応用例も少ない、一応密林でも売っていた。
　アリエクには多数出品されており、其れなりにメジャーなような。
　かの国では、この様なチップを使ったマイコン教育がされているのだろうか。
  
# 開発環境(ハード)
　◇チップ
　　DIP型のSTC15W408、16/20/28ピンと異なってもIOの数が異なるだけの筈。
　◇USBシリアル
　　チップへの書き込みに使用する。電源に使える5V出力付きが望ましい。
　　　※書き込みに専用ハードは不要。但し電源の操作が必要。

# 接続
　USBシリアルのTXをチップのRXに、RXをその逆に接続し、5Vも接続する。
　DIP28の場合は下記となる。
　シリアル　チップ
　ＴＸ　　　15ピン(P3.0/RX)
　ＲＸ　　　16ピン(P3.1/RXD)
　５Ｖ　　　12ピン(Vcc)
　ＧＮＤ　　14ピン(Gnd)

# 開発環境(ソフト)
　◇コンパイラ
　　SDCC(Small Device C Compiler)
　　　※[sourceforge](https://sourceforge.net/projects/sdcc/)の物を使用している。
　◇書き込みソフト
　　[シンセン国芯人工智能有限公司](https://www.stcai.com/gjrj)より「AIアプリ-ISP-V6.95N」を落す。
　　　※何方もちゃんと動いて居るが、ご使用は自己責任で。

# Ｌチカ
　チップをUSBシリアルに接続。
　チップのP1.0(DIP28なら、3ピン)にLEDを接続。
　　※LEDのカソード側(足の短い方)を繋ぎ、アノード側は抵抗(1～5K)を介してVCCへ。
  　　写真のLEDは抵抗内蔵しており電源に直結可。
![Image4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/f71cc424-1638-43a5-ac26-c05f9e7ba0b1.jpeg)

　[ＬＥＤ点滅ソフト](https://github.com/hi631/Child_of_8051/tree/master/STC15W408_led)をダウンロード。
　_cmd.batの書き換え。
　　※PATH = ～　binの間を、sdccを格納した位置に書き換え。
　_cmd.batを実行すると、led.hexが出来上がる。
　書き込みソフト(ISP)を起動し、設定を変更。
　　※MCP TypeをSTC15W408ASに。
　　　Scna PortをUSBシリアルを接続した番号に。
　　　Open Code Fileでled.hexを指定。
![Image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/1275aee8-335b-4a8c-95ef-b3f77e4bba48.jpeg)
　左下のDowmload/Programを押す。Stopが押せるようになる。
![Image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/26f16de4-61d8-46d1-872f-b43bed870184.jpeg)
　チップの電源を一旦切り、再度投入。※ここ重要。
　右下の表示が流れ、Completeが表示されたら完了。LEDは点滅している筈。

# プログラムのステップ実行
　◇前説
　[ステップ実行](https://github.com/hi631/Child_of_8051/tree/master/STC15W408_step)では、8051の機械語(アセンブラ)レベルのステップ実行が可能。
　但し下記のような制限を有する。
　　ステップ実行するプログラムは、デバッグプログラム(setp.c)と同時にコンパイル。
　　実行中のプログラムの書き換えは出来ない。
　　デバッグプログラムが使用しているリソースにアクセスした場合、デバッグが狂う。
　◇操作方法
　step.cの中に、デバッグするプログラムを関数として書込む。
　　※関数名dbgprg()
　sdccでコンパイルし、step.rstを見てデバッグ部分を確認する。
　　※デバッグプログラム例
![Image6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/8d1d42f2-a222-4012-a72e-5420994f70cb.jpeg)
　step.hexを書込み、ターミナル(teraterm等)を起動する。
　(Enter)キーを押すと、プロンプト(">")が現れる。
　コマンド"TT"を入力すると、実行前の各レジスタが表示される。
　　※bt=bits,a=acc,b=b,dl=dpl,dh=dph,sw=pswの略。
　レジスタ変更コマンドは用意して無いので、メモリ書き換えコマンドで行う。
　　※各レジスタは変数dbgad(0x40)以降に配置。
　コマンド"T"で、一ステップ進む。
　コマンド"Tnn"で、nnステップ進む。
![Image3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/954c950e-7629-454a-a196-7df4616ae4e8.jpeg)
　◇補助コマンド
　Dnnnn　nnnn番地以降を128バイト表示
　Mnnnn　nnnn番地を書き換え(.で終了)。

# ステップ実行の仕掛け
　ステップ実行は次のような仕掛けで行っている。
　1.モニター同に使用したレジスタをセーブ、デバッグ用にレジスタをセット。
　2.起動後に数サイクルで割り込みが入るようにして、タイマースタート。
　3.デバッグにジャンプ、直後に割り込みが発生。
　4.デバッグ用レジスタをセーブして、モニターレジスタをロード。
　　※タイマーで利込みが入れば、どんなマイコンでも実現可能(元ネタ有り)。
　　　とは言っても信号が外から見えないから、動かないと原因不明だが。

# 感想
　SDCCさえ動けば動作させる事が出来る。Arduinoよりプログラミングの敷居は低いとも言える。
　実は8051の機械語(アセンブラ)は良く知らないので、SDCCの出力結果を参考にして弄っていた。
　販売元のチップのレパートリーは豊富であり、8051の子孫の需要は十分に有るのだろうが、
　32ビットの安価なチップも出てきており、世代交代しているのかも。
　マニュアルの中にもチップ単価が0.1元単位で書かれており、競争が厳しいのだろう。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。