#include <xc.h>//beep4bit.c #include "common.h" #define TRUE 1 __attribute__((address( 0x80005000 ))) void start_boot(void); void start_boot() { extern void start_main(); _HANDLES[_IDX_INIT_SUB_FUNC] = start_main; //起動時に動作する関数に、下記start_mainを登録 } void start_main() { int flag2 = 0; while( flag2 == 0){ // 0の識別番号で、0x01(ー・・・のパターンの音)を登録 int flag0 = _debug_hex4(0,0x01,TRUE); // (音の登録は、第1引数の識別番号が未登録の時だけです。登録後は鳴り続けます。) int sw2 = (PORTB & 0x80) == 0;// SW2のスイッチを押すと1にセット // 「sw2 && flag0 」が0でなければ、2の識別番号で、0x0e(ー・・・のパターンの音)を登録 flag2 = _debug_hex4(2,0x0e, sw2 && flag0 ); // flag0の1を得た _debug_hex4の後に、上記を実行しているか確かめることができる。 } } |
80005000 <start_boot>: 80005000: 27bdfff8 addiu sp,sp,-8 80005004: afbe0004 sw s8,4(sp) 80005008: 03a0f021 move s8,sp 8000500c: 3c02a000 lui v0,0xa000 80005010: 344240c8 ori v0,v0,0x40c8 80005014: 3c038000 lui v1,0x8000 80005018: 24635034 addiu v1,v1,20532 8000501c: ac430000 sw v1,0(v0) 80005020: 03c0e821 move sp,s8 80005024: 8fbe0004 lw s8,4(sp) 80005028: 27bd0008 addiu sp,sp,8 8000502c: 03e00008 jr ra 80005030: 00000000 nop 80005034 <start_main>: 80005034: 27bdffd8 addiu sp,sp,-40 80005038: afbf0024 sw ra,36(sp) 8000503c: afbe0020 sw s8,32(sp) 80005040: 03a0f021 move s8,sp 80005044: afc00010 sw zero,16(s8) 80005048: 08001436 j 800050d8 <.LBE2> 8000504c: 00000000 nop 80005050 <.LBB2>: 80005050: 3c02a000 lui v0,0xa000 80005054: 3442420c ori v0,v0,0x420c 80005058: 8c420000 lw v0,0(v0) 8000505c: 00002021 move a0,zero 80005060: 24050001 li a1,1 80005064: 24060001 li a2,1 80005068: 0040f809 jalr v0 8000506c: 00000000 nop 80005070: afc20014 sw v0,20(s8) 80005074: 3c02bf88 lui v0,0xbf88 80005078: 8c426120 lw v0,24864(v0) 8000507c: 30420080 andi v0,v0,0x80 80005080: 2c420001 sltiu v0,v0,1 80005084: 304200ff andi v0,v0,0xff 80005088: afc20018 sw v0,24(s8) 8000508c: 3c02a000 lui v0,0xa000 80005090: 3442420c ori v0,v0,0x420c 80005094: 8c430000 lw v1,0(v0) 80005098: 8fc20018 lw v0,24(s8) 8000509c: 10400007 beqz v0,800050bc <.LBB2+0x6c> 800050a0: 00000000 nop 800050a4: 8fc20014 lw v0,20(s8) 800050a8: 10400004 beqz v0,800050bc <.LBB2+0x6c> 800050ac: 00000000 nop 800050b0: 24020001 li v0,1 800050b4: 08001430 j 800050c0 <.LBB2+0x70> 800050b8: 00000000 nop 800050bc: 00001021 move v0,zero 800050c0: 24040002 li a0,2 800050c4: 2405000e li a1,14 800050c8: 00403021 move a2,v0 800050cc: 0060f809 jalr v1 800050d0: 00000000 nop 800050d4: afc20010 sw v0,16(s8) 800050d8 <.LBE2>: 800050d8: 8fc20010 lw v0,16(s8) 800050dc: 1040ffdc beqz v0,80005050 <.LBB2> 800050e0: 00000000 nop 800050e4: 03c0e821 move sp,s8 800050e8: 8fbf0024 lw ra,36(sp) 800050ec: 8fbe0020 lw s8,32(sp) 800050f0: 27bd0028 addiu sp,sp,40 800050f4: 03e00008 jr ra 800050f8: 00000000 nop |
以下に、上記の実際に動作した、アセンブリリストを示します。上のC言語の逆アセンブルリストをコードにしてみました。
予め、pythonが動作するターミナル(コマンドプロンプト)を、開いて準備して置くとよいでしょう。
以下では、R:\workを作業位置(カレントディレクトリ)にして説明しています。
また、pythonプログラムでは、serialモジュールを追加しておく必要があります。
「pip show serial」のコマンド操作で、インストールされているか確認できます。
インストールされていない場合は、「pip install pyserial」の操作で、インストールしておくと良いでしょう。
上記の「アセンブラ編集部」の直下にある「アセンブル」ボタンをクリックします。
(このボタン右下の、指定アドレスから実行させるコード埋め込み用のチェックボックスがチェックされていること確認して行う)
「アセンブラ編集部」のソースにエラーが無ければ、[UME専用Hexコマンド]のテキストが、その下の TextArea に表示されます。
(エラーがあれば、エラーが無くHEXコードが生成されるまで、「アセンブラ編集部」の修正とアセンブル」を繰り返します)
メモ帳などで、「command.txt」のファイルを生成して開き、
上記操作で得られたTextAreaの[UME専用Hexコマンド]のテキストを、 コピー(CTRL+A CTRL+C)操作し、
それを「command.txt」編集画面で貼り付け((CTRL+V)して、保存します。
保存位置は、pythonが動作するターミナルの作業位置(カレントディレクトリ)です。(後述例では、R:\workで示しています)
上記で作った「instruct.py」と[command.txt」が存在する位置で、
pythonが動作するターミナル(コマンドプロンプト)を開きます。
以下では、この作業位置(カレントディレクトリ)が、R:\workである場合の例で説明しています。
まず [UMEHOSHI ITA]基板と、PCをUSBで接続します。
次にターミナルプロンプトを『powershell』にして、
『Get-CimInstance Win32_PnPEntity | Where-Object {$_ -like "*(COM*"} | Select-Object Caption』
のコマンド操作で、USBのシリアル デバイスのCOM番号を調べます。
R:\work>powershell Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. 新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6 PS R:\work> Get-CimInstance Win32_PnPEntity | Where-Object {$_ -like "*(COM*"} | Select-Object Caption Caption ------- Bluetooth リンク経由の標準シリアル (COM10) USB シリアル デバイス (COM4) Bluetooth リンク経由の標準シリアル (COM11) PS R:\work>
この実行例から、USB シリアル デバイス がCOM4が使える状態になっていることが分かります。
(このリンクページで示すように、デバイスマネージャで確認することもできます)
この番号の4を記憶して次の転送プログラム実行に進むのですが、
そのUSB シリアル デバイス が見つからない場合、次の点が考えられます。
R:\work>python instruct.py USB シリアル デバイスで、使用するCOMの番号を入力>>4 S108000500000F8FFBD270400BEAF21F0A00300A0023C 3Eチェックサム: 0 USB受信● b'S108000500000F8FFBD270400BEAF21F0A00300A0023C3E\r\n' USB受信● b'SET:80005000\r\n' S108000501000C84042340080033C34506324000043AC CBチェックサム: 0 USB受信● b'S108000501000C84042340080033C34506324000043ACCB\r\n' USB受信● b'SET:80005010\r\n' S10800050200021E8C0030400BE8F0800BD270800E003 87チェックサム: 0 USB受信● b'S10800050200021E8C0030400BE8F0800BD270800E00387\r\n' USB受信● b'SET:80005020\r\n' S10800050300000000000D8FFBD272400BFAF2000BEAF 40チェックサム: 0 USB受信● b'S10800050300000000000D8FFBD272400BFAF2000BEAF40\r\n' USB受信● b'SET:80005030\r\n' S10800050400021F0A0031000C0AF3614000800000000 DDチェックサム: 0 USB受信● b'S10800050400021F0A0031000C0AF3614000800000000DD\r\n' USB受信● b'SET:80005040\r\n' S10800050500000A0023C0C4242340000428C21200000 E5チェックサム: 0 USB受信● b'S10800050500000A0023C0C4242340000428C21200000E5\r\n' USB受信● b'SET:80005050\r\n' S108000506000010005240100062409F8400000000000 15チェックサム: 0 USB受信● b'S108000506000010005240100062409F840000000000015\r\n' USB受信● b'SET:80005060\r\n' S1080005070001400C2AF88BF023C2061428C80004230 8Cチェックサム: 0 USB受信● b'S1080005070001400C2AF88BF023C2061428C800042308C\r\n' USB受信● b'SET:80005070\r\n' S1080005080000100422CFF0042301800C2AF00A0023C 98チェックサム: 0 USB受信● b'S1080005080000100422CFF0042301800C2AF00A0023C98\r\n' USB受信● b'SET:80005080\r\n' S1080005090000C4242340000438C1800C28F07004010 C6チェックサム: 0 USB受信● b'S1080005090000C4242340000438C1800C28F07004010C6\r\n' USB受信● b'SET:80005090\r\n' S10800050A000000000001400C28F0400401000000000 0Dチェックサム: 0 USB受信● b'S10800050A000000000001400C28F04004010000000000D\r\n' USB受信● b'SET:800050A0\r\n' S10800050B00001000224301400080000000021100000 30チェックサム: 0 USB受信● b'S10800050B0000100022430140008000000002110000030\r\n' USB受信● b'SET:800050B0\r\n' S10800050C000020004240E0005242130400009F86000 E9チェックサム: 0 USB受信● b'S10800050C000020004240E0005242130400009F86000E9\r\n' USB受信● b'SET:800050C0\r\n' S10800050D000000000001000C2AF1000C28FDCFF4010 82チェックサム: 0 USB受信● b'S10800050D000000000001000C2AF1000C28FDCFF401082\r\n' USB受信● b'SET:800050D0\r\n' S10800050E0000000000021E8C0032400BF8F2000BE8F 81チェックサム: 0 USB受信● b'S10800050E0000000000021E8C0032400BF8F2000BE8F81\r\n' USB受信● b'SET:800050E0\r\n' S0C800050F0002800BD270800E00300000000 5Eチェックサム: 0 USB受信● b'S0C800050F0002800BD270800E003000000005E\r\n' USB受信● b'SET:800050F0\r\n' R008000500000 61チェックサム: 0 実行スタートの Enter >> USB受信● b'R00800050000061\r\n' USB受信● b'START:80005000\r\n' 終了確認の Enter >>> R:\work>
[command.txt」の中に"R008000500000"のような実行コマンドが存在すると、実行スタートの Enter >>の
プロンプトが出て、一時停止します。
上記例では、そこでENTERキーを入力することで、"R00800050000061"が送られ、UMEHOSHI ITA基板で「0x80005000」番地から実行しますが、
まだ実行しません。
実行するのは
_HANDLES[_IDX_INIT_SUB_FUNC] = start_main相当の登録処理です。
この登録の実行の後で、リセットボタンを押すと、登録関数実行が始まります。