アクリル板で絶縁 | ポリイミドテープで絶縁 | ポリイミドテープで絶縁2 | ポリイミドテープ | コルクボード |
※更新補足 ・PMD形式の再生 pmdset.zipをDLし、ZIPファイルを展開してpmd86.binをSDカードのルートディレクトリにコピーしてください 後は、再生したいPMDの曲ファイルをSDカードのサブディレクトリに格納しておけば再生されます 制限事項 ・PMDファイルはサブディレクトリに配置してください pmd86.binを見つけた後に、発見した曲ファイルが有効になる為、ルートディレクトリに配置されたpmdファイルは読み込まれるかどうか不明です スキャンはディレクトリエントリ順に処理されるため ・PMD曲の再生は固定で2分の再生時間となっています。曲が早めに終わっても2分間は次の曲に自動的には進みません これはPMD86.BINのパッチによるもので、再生終了フラグなどを見てない為です。そのうち対応するかもしれません ZIP内のファイルについて ・pmd86.bin OPNAMで演奏できるようにパッチを当てたpmd音源ドライバです。SDカードのルートディレクトリにはこのファイルを配置してください パッチ内容としては、OPNAMがチェックするバッファとの橋渡し、割り込み周りの処理、I/Oで2回inportしている処理の削除などです。 パッチ箇所が多いですが、高速化のためにつぶしている部分が多い為です ・PMD86.COM PMD86の98x1用のFM音源ドライバです。 オリジナルのドライバとしてセットしていますが、OPNAMでは使いません ・pmd_patch.exe PMD86.COMにパッチをあて、pmd86.binを作る為のパッチプログラムです オリジナルドライバからの作成用として同梱しています 今回、PMDドライバの配布に関してはKAJA氏に許可をいただきました。ありがとうございました!
q | 終了 | n | アクセス用ファイル名を指定 | l | ターゲットファイルを読み込みます。ファイル名は省略可能です。 | w | ターゲットファイルを保存します。ファイル名は省略可能です。 | wc | ウェイトキャンセル機能の有効・無効を切り替えます。有効の場合loop $等をスキップします | wait (数値) | 実行モード中の'wait'命令の時間を指定します | p | 次の行にブレークポイントを設定し、実行します。サブルーチンを飛び越える場合に便利ですが、アセンブラだと帰ってこないとかよくあるので万能ではありません。 実行時にヒストリをクリアしてから実行します。ヒストリが32000に達したら停止します。 |
h | 実行アドレスのヒストリをon/offします。実行したプログラムのアドレスがヒストリに保存されます。 ヒストリはxコマンドの実行時になどにhistory.txtでPG直下に書き出されます。 この記事を書いた後に、ヒストリーにフルバージョンを追加しました。 off→シンプル(この記事と同じモード)→フル→offのように切り替わります。 フルは大量に出力されますので注意してください。 |
hw | ヒストリを追記書き出しし、ヒストリをクリアします。 | g <停止アドレス> | 現在のアドレスからPGを実行します。停止アドレスを指定した場合停止アドレスで停止します。 ヒストリ対応、ブレークポイント対応、int 3を見つけたら停止、ヒストリが32000に達したら停止します。 |
x <停止アドレス> | 現在のアドレスからPGを実行します。停止アドレスを指定した場合停止アドレスで停止します。 xコマンド専用ヒストリ(命令などつき)を直接ファイルに書き出します。 実行中にQキーを検出すると停止します。(WinAPIのGetKeyStateを使っているので、フォーカスを失っていても別ウィンドウでもQキーが押されたら停止します) |
bc | ブレークポイントをクリアします。 | be <番号> | 指定した番号のブレークポイントを有効にします。省略時全有効。 | bd <番号> | 指定した番号のブレークポイントを無効にします。省略時全無効。 | bp | ブレークポイント一覧を表示します。 | bp <アドレス> | ブレークポイントを設定します。同じアドレスを指定するとクリアします。 | t | ステップトレースです。1命令実行します。 | u <アドレス> | 現在のアドレスから8行逆アセンブルします。アドレスを指定せずに連続して実行すると、前回アドレスから行います。 | d <アドレス> | 現在のアドレスからダンプリストを表示します。 アドレスを指定せずに連続実行すると、続きから表示します。 |
display | I/Oアクセスを表示するようにします。トグル動作します。 | e <アドレス> | 指定したアドレスからデータ入力する入力モードになります。エンターキーで抜けます。 スペースとかタブキーとかでスキップしたりとか色々あります。 |
e アドレス <データ> | データを指定したアドレスに入れ込みます。 | r | 現在のレジスタと実行アドレスの命令を逆アセンブルして表示します。 その他に現在アドレスのバッファなども設定するので、1回は実行してから処理してください。 |
r <レジスタ> | レジスタの値を表示&入力するモードになります。 | r <レジスタ> <データ> | レジスタの値を設定します。 | m 転送元 転送先 サイズ | 転送元アドレスから転送先アドレスへサイズ分だけデータを転送します。 | f 開始アドレス サイズ データ | 開始アドレスから指定したデータで埋めます。 | fs ファイルサイズ | ファイルサイズを設定します | fr | FM音源ボードへリセットコマンドを送信します。 | fe | FM音源ボードのYM2608へ、レジスタ0x29へ0x80を発行します。(2203→2608拡張モードへ切り替え) | c | アクセスカバレッジ記録モードの有効・無効を切り替えます。 | cc | アクセスカバレッジをクリアします。 | cs | 現在のカバレッジ情報のサイズを表示します。 | co | 現在のカバレッジ情報を出力します。coverage.txtは毎回新規出力します。 コードカバレッジ(4桁)→メモリカバレッジ(8桁)の順番で出力されます。 |
io | I/Oアクセスをiow.txtファイルに記録するモードを切り替えます。トグル動作します。 |
stmain: cld ;駐在管理部 mov ax,cs mov ds,ax ;タイトル表示 mov dx,offset mes_tit mov ah,9 int 21h ;割り込みベクタ 14hを調べて、自分の制御部がいるか見る mov ax,3514h int 21h mov di,bx mov si,offset pmain mov cx,20 rep cmpsb jnz stay ;制御部の常駐解除を呼び出す remv: mov ax,0ffffh int 0d2h ;FM音源のキーを全部OFF call all_key_off ;解除メッセージ表示 push cs pop ds mov dx,offset mes_rmv mov ah,9 int 21h ;プログラム終了 mov ax,4c00h int 21h ;ベクタ14hの内容を保存して書き換える stay: mov ds:vect14,bx mov ds:vect14+2,es mov ax,2514h mov dx,offset pmain int 21h ;ベクタd2の内容を保存して書き換える mov ax,35d2h int 21h mov ds:vectd2,bx mov ds:vectd2+2,es mov ax,25d2h mov dx,offset cmain int 21h ;常駐メッセージ表示 mov dx,offset mes_sty mov ah,9 int 21h ;常駐を呼び出して終了 mov ax,3100h mov dx,offset rb shr dx,4 add dx,25600/16 int 21h
mov ax,25d2h mov dx,offset cmain int 21h
cmain: pusha push ds es cs pop ds cmp ax,0ffffh jz remvm cmp ax,14+1 jnb cend shl ax,1 mov si,ax call [ds:si+jptblcm] cend: pop es ds popa iret
;制御コマンド jptblcm dw reset ;リセット dw pam_set ;パラメータセット dw fload ;ファイルロード+Pセット dw sound_s ;再生 dw sound_t ;停止 dw fsound ;reset+pamset dw all_key_off ;キーのオフ dw fead_in ;フェードイン dw fead_out ;フェードアウト dw baf_in ;バッファにパラメータをセーブ dw baf_out ;バッファからロード dw reg_cnt ;レジスタコントロール dw baf_cnt ; dw baf_cnt2 ; dw mvolc ;Mボリューム設定
reset: call sound_t ;リセット mov ax,cs mov es,ax xor ax,ax mov di,offset ench mov cx,27 rep stosw ret
sound_t: cli ;サウンドオフ mov ax,3027h call outdat in al,10 or al,10h out 10,al sti call all_key_off ret all_key_off: mov ax,0028h ;音を止める call outdat mov ax,0128h call outdat mov ax,0228h call outdat mov ax,3f07h call outdat ret outdat: call nbusy ;2203へのデータ出力 mov dx,188h out dx,al out 5fh,al out 5fh,al out 5fh,al out 5fh,al mov al,ah mov dx,18ah out dx,al ret nbusy: push ax dx mov dx,188h nb2: in al,dx shl al,1 jb nb2 pop dx ax ret
fload: push cs ;データをバッファにロード pop es mov di,offset rb shr cx,1 rep movsw rcl cx,1 rep movsb pam_set: mov si,offset rb ;パラメータセット mov bx,offset pb00 lodsw mov [ds:bx+2],ax lodsw mov [ds:bx+10],ax lodsw mov [ds:bx+18],ax lodsw mov [ds:bx+26],ax lodsw mov [ds:bx+34],ax lodsw mov [ds:bx+42],ax mov word ptr ds:ench,0 mov word ptr ds:flg0,0 ret
sound_s: cli ;サウンドスタート in al,10 and al,0efh out 10,al mov ax,ds:tempo mov ah,al mov al,26h call outdat mov ax,3a27h call outdat sti ret
;演奏初期化 mov ax,1 int 15h mov ax,3 int 15h ;演奏処理 loop: int 14h wait jmp loop
int main(int argc, char* argv[]) { char *x = new char [1048576]; memset(x,0,1048576); //ドライバ読み込み FILE *fr = fopen("fmdrv.com","rb"); if (!fr) { return 0; } fread(x + 0x600,1,32768,fr); fclose(fr); //このあたりにデータ埋め込みのコード入れる //かき出し FILE *fw = fopen("test.dat","wb"); fwrite(x,1,1048576,fw); fclose(fw); delete[] x; return 0; }
>l test.dat load file comp.[test.dat][1048576(00100000)] >d 600 0000:0600 e9 73 09 90 00 00 00 00-00 00 00 00 00 00 00 00 駸.・........... 0000:0610 00 00 00 00 80 00 00 01-3f 00 00 00 00 00 00 00 .......?....... 0000:0620 00 00 00 00 00 00 00 00-00 00 00 00 87 db 87 db ............・・ 0000:0630 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0640 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0650 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0660 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0670 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >d 0000:0680 60 1e 06 8c c8 8e d8 e8-88 00 ff 06 0c 01 83 3e `..己借闊....・ 0000:0690 0c 01 03 73 02 eb 65 e8-b7 00 c7 06 0c 01 00 00 ...s.・霍.ヌ..... 0000:06a0 33 c9 f7 06 0e 01 01 00-75 06 bb 30 01 e8 84 01 3ノ・....u.サ0.閼. 0000:06b0 f7 06 0e 01 02 00 75 07-41 bb 38 01 e8 75 01 f7 ・....u.Aサ8.鑾.・ 0000:06c0 06 0e 01 04 00 75 07 41-bb 40 01 e8 66 01 f7 06 .....u.Aサ@.鑁.・ 0000:06d0 0e 01 08 00 75 08 33 c9-bb 48 01 e8 c9 01 f7 06 ....u.3ノサH.靄.・ 0000:06e0 0e 01 10 00 75 07 41 bb-50 01 e8 ba 01 f7 06 0e ....u.AサP.霄.・. 0000:06f0 01 20 00 75 07 41 bb 58-01 e8 ab 01 b0 20 e6 08 . .u.AサX.隲.ー ・
>e 400 b8 01 00 cd 15 b8 03 00 cd 15 cd 14 9b eb fb
>d 400 0000:0400 b8 01 00 cd 15 b8 03 00-cd 15 cd 14 9b eb fb 00 ク.ヘ..ク.ヘ..ヘ.幎・ 0000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0460 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >u 400 0000:0400 b80100 mov ax,0001 0000:0403 cd15 int 15 0000:0405 b80300 mov ax,0003 0000:0408 cd15 int 15 0000:040a cd14 int 14 0000:040c 9b wait 0000:040d ebfb jmp 040a 0000:040f 0000 add [bx+si],al
>e 50 80 01 50 00 e0 06 50 00 >d 0 0000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0050 80 01 50 00 e0 06 50 00-00 00 00 00 00 00 00 00 .P.・P......... 0000:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
>w save file comp.[test.dat] >q exit!
>l test.dat load file comp.[test.dat][1048576(00100000)] >d 0 0000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0050 80 01 50 00 e0 06 50 00-00 00 00 00 00 00 00 00 .P.・P......... 0000:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >d 400 0000:0400 b8 01 00 cd 15 b8 03 00-cd 15 cd 14 9b eb fb 00 ク.ヘ..ク.ヘ..ヘ.幎・ 0000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0460 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >
reset:01 >l test.dat load file comp.[test.dat][1048576(00100000)] >rip 400 >r ax:0000 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0000 es:0000 ss:0000 cs:0000 ip:0400 NV UP EI PL NZ NA PO NC 0000:0400 b80100 mov ax,0001 >
>t ax:0001 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0000 es:0000 ss:0000 cs:0000 ip:0403 NV UP EI PL NZ NA PO NC 0000:0403 cd15 int 15 >t ax:0001 bx:0000 cx:0000 dx:0000 sp:fff2 bp:0000 si:0000 di:0000 ds:0000 es:0000 ss:0000 cs:0050 ip:06e0 NV UP EI PL NZ NA PO NC 0050:06e0 60 pusha >u 0050:06e1 1e push ds 0050:06e2 06 push es 0050:06e3 0e push cs 0050:06e4 1f pop ds 0050:06e5 3dffff cmp ax,ffff 0050:06e8 7411 jz 06fb 0050:06ea 3d0f00 cmp ax,000f 0050:06ed 7308 jnc 06f7 >
>x break! ax:0003 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0000 es:0000 ss:0000 cs:0000 ip:040d NV UP EI PL NZ NA PO NC 0000:040d ebfb jmp 040a >
x86_init(); switch(load_file_type) { case 0: x86_r.ip = 0x3360; x86_r.cs = 0x0000; x86_r.ds = 0x0000; x86_r.es = 0x0000; x86_r.ss = 0x0000; x86_r.sp = 0x7ff8; request_interrupt = 2; break; case 1: x86_r.ip = 0x1960; x86_r.cs = 0x0000; x86_r.ds = 0x0000; x86_r.es = 0x0000; x86_r.ss = 0x0000; x86_r.sp = 0x7ff8; request_interrupt = 2; break; case 2: x86_r.ip = x86_get_m16_(0x384); x86_r.cs = x86_get_m16_(0x380); x86_r.ds = x86_get_m16_(0x382); x86_r.es = 0x0000; x86_r.ss = 0x0000; x86_r.sp = 0x7ff8; request_interrupt = x86_m[0x389]; fade_looptimeout = x86_get_m16_(0x38a); waitloop_cancel = x86_m[0x38d]; break; }
>e 380 0000:0380 00-00 00-00 00-00 00-00 00-00 00-04 00-00 00-00 0000:0388 00-00 00-02 00-c8 00- >d 380 0000:0380 00 00 00 00 00 04 00 00-00 02 c8 00 00 00 00 00 ................ 0000:0390 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03a0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03b0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03c0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03d0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03f0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >
>w save file comp.[test.dat]
>fs 8000 set filesize -> [32768] >w save file comp.[test.dat] >
reset:01 >l test.dat load file comp.[test.dat][32768(00008000)] >d 400 0000:0400 b8 01 00 cd 15 b8 03 00-cd 15 cd 14 9b eb fb 00 ク..ヘ.ク..ヘ.ヘ.幎・ 0000:0410 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0420 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0430 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0440 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0450 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0460 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0470 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >d 600 0000:0600 e9 73 09 90 00 00 00 00-00 00 00 00 00 00 00 00 駸.・........... 0000:0610 00 00 00 00 80 00 00 01-3f 00 00 00 00 00 00 00 .......?....... 0000:0620 00 00 00 00 00 00 00 00-00 00 00 00 87 db 87 db ............・・ 0000:0630 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0640 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0650 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0660 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0670 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >d 0 0000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0050 80 01 50 00 e0 06 50 00-00 00 00 00 00 00 00 00 .P.・P......... 0000:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >d 380 0000:0380 00 00 00 00 00 04 00 00-00 02 c8 00 00 00 00 00 ................ 0000:0390 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03a0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03b0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03c0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03d0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03f0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >
>fm_dat_edit test.dat 1.TimerA .. Disable 2.TimerB .. Enable 3.LimitTime .. 200 4.Fadeout DriverMode .. Disable 5.2203 GraphicECMode .. Disable 6.LimitEnd Flag .. Disable 8.Save End 9.Exit
cmd ..5 1.TimerA .. Disable 2.TimerB .. Enable 3.LimitTime .. 200 4.Fadeout DriverMode .. Disable 5.2203 GraphicECMode .. Enable 6.LimitEnd Flag .. Disable 8.Save End 9.Exit
cmd ..6 1.TimerA .. Disable 2.TimerB .. Enable 3.LimitTime .. 200 4.Fadeout DriverMode .. Disable 5.2203 GraphicECMode .. Enable 6.LimitEnd Flag .. Enable 8.Save End 9.Exit
cmd ..8 save end!
reset:01 >l test.dat load file comp.[test.dat][32768(00008000)] >rip 400 >r ax:0000 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0000 es:0000 ss:0000 cs:0000 ip:0400 NV UP EI PL NZ NA PO NC 0000:0400 b80100 mov ax,0001 >c set coverage on. >x break! ax:0003 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0000 es:0000 ss:0000 cs:0000 ip:040d NV UP EI PL NZ NA PO NC 0000:040d ebfb jmp 040a >cs code coverage 426entry. data coverage 55entry. >co writing..done. >
0180 0181 0182 0183 0185 . . . 略 . . . 078e 0790 0793 0796 0799 079a 0000060c 0000060e 00000610 00000616 00000618 . . . 略 . . . 00000d78 00000d7e 00000d88 00000d8a 00000d8e 00000d98 00000d9c
reset:01 >l test.dat load file comp.[test.dat][32768(00008000)] >rip 400 >h history on >x break! ax:0003 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0000 es:0000 ss:0000 cs:0000 ip:040d NV UP EI PL NZ NA PO NC 0000:040d ebfb jmp 040a >hw write history..0 >
0000:0400 mov ax,0001 0050:0403 int 15 0050:06e0 pusha 0050:06e1 push ds 0050:06e2 push es 0050:06e3 push cs 0050:06e4 pop ds 0050:06e5 cmp ax,ffff 0050:06e8 jz 06fb 0050:06ea cmp ax,000f 0050:06ed jnc 06f7 0050:06ef shl ax,1 0050:06f1 mov si,ax 0050:06f3 call [si+0896] (00d98:0750) 上記でint 15hを実行した直後から、int 15hの実行先であるpushaに移動しています。 #よく見るとint 15hは0000:403にあるのですが、実行後にヒストリテキストを書き出しているので変ってしまってました。後で直しときます ←しときました 0050:0750 mov si,08c0 0050:0753 mov bx,0130 0050:0756 lodsw 0050:0757 mov [bx+02],ax (00632:0000) 0050:075a lodsw 0050:075b mov [bx+0a],ax (0063a:0000) 0050:075e lodsw 0050:075f mov [bx+12],ax (00642:0000) 0050:0762 lodsw 0050:0763 mov [bx+1a],ax (0064a:0000) 0050:0766 lodsw 0050:0767 mov [bx+22],ax (00652:0000) 0050:076a lodsw 0050:076b mov [bx+2a],ax (0065a:0000) 書き込み先のメモリの内容が表示されています。 #lodswで読み込んだ値も表示されたら嬉しかったですね
→追加しときました 0050:076e mov word ptr [010e],00 (0060e:0000) 0050:0774 mov word ptr [0110],00 (00610:0000) 0050:077a ret 0050:06f7 pop es 0050:06f8 pop ds 0050:06f9 popa 0000:06fa iret ここで元のアドレスに戻っていっています。 0000:0405 mov ax,0003 0050:0408 int 15 0050:06e0 pusha 0050:06e1 push ds 0050:06e2 push es 0050:06e3 push cs 0050:06e4 pop ds 0050:06e5 cmp ax,ffff 0050:06e8 jz 06fb 0050:06ea cmp ax,000f 0050:06ed jnc 06f7 0050:06ef shl ax,1 0050:06f1 mov si,ax 0050:06f3 call [si+0896] (00d9c:0782) 0050:0782 cli 0050:0783 in al,0a 0050:0785 and al,ef 0050:0787 out 0a,al 0050:0789 mov ax,[0114] ( 614:0080) 0050:078c mov ah,al 0050:078e mov al,26 0050:0790 call 021b 0050:021b call 0231 0050:0231 push ax 0050:0232 push dx 条件分岐命令は条件を満たしていないのでスルーされていることがわかります。 またcall命令を実行した直後にジャンプ先に移動しています。 0050:0233 mov dx,0188 0050:0236 in al,dx 0050:0237 shl al,1 0050:0239 jc 0236 0050:023b pop dx 0050:023c pop ax 0050:023d ret 0050:021e mov dx,0188 0050:0221 out dx,al 0050:0222 out 5f,al 0050:0224 out 5f,al 0050:0226 out 5f,al 0050:0228 out 5f,al 0050:022a mov al,ah 0050:022c mov dx,018a 0050:022f out dx,al 0050:0230 ret 0050:0793 mov ax,3a27 0050:0796 call 021b 0050:021b call 0231 0050:0231 push ax 0050:0232 push dx 0050:0233 mov dx,0188 0050:0236 in al,dx 0050:0237 shl al,1 0050:0239 jc 0236 0050:023b pop dx 0050:023c pop ax 0050:023d ret 0050:021e mov dx,0188 0050:0221 out dx,al 0050:0222 out 5f,al 0050:0224 out 5f,al 0050:0226 out 5f,al 0050:0228 out 5f,al 0050:022a mov al,ah 0050:022c mov dx,018a 0050:022f out dx,al 0050:0230 ret 0050:0799 sti 0050:079a ret 0050:06f7 pop es 0050:06f8 pop ds 0050:06f9 popa 0000:06fa iret 0050:040a int 14 0050:0180 pusha 0050:0181 push ds 0050:0182 push es 0050:0183 mov ax,cs 0050:0185 mov ds,ax 0050:0187 call 0212 0050:0212 mov ax,3827 0050:0215 call 021b 0050:021b call 0231 0050:0231 push ax 0050:0232 push dx 0050:0233 mov dx,0188 0050:0236 in al,dx 0050:0237 shl al,1 0050:0239 jc 0236 0050:023b pop dx 0050:023c pop ax 0050:023d ret 0050:021e mov dx,0188 0050:0221 out dx,al 0050:0222 out 5f,al 0050:0224 out 5f,al 0050:0226 out 5f,al 0050:0228 out 5f,al 0050:022a mov al,ah 0050:022c mov dx,018a 0050:022f out dx,al 0050:0230 ret 0050:0218 mov ax,3a27 0050:021b call 0231 0050:0231 push ax 0050:0232 push dx 0050:0233 mov dx,0188 0050:0236 in al,dx 0050:0237 shl al,1 0050:0239 jc 0236 0050:023b pop dx 0050:023c pop ax 0050:023d ret 0050:021e mov dx,0188 0050:0221 out dx,al 0050:0222 out 5f,al 0050:0224 out 5f,al 0050:0226 out 5f,al 0050:0228 out 5f,al 0050:022a mov al,ah 0050:022c mov dx,018a 0050:022f out dx,al 0050:0230 ret 0050:018a inc word ptr [010c] (0060c:0000) 0050:018e cmp byte ptr [010c],03 (0060c:0001) 0050:0193 jnc 0197 0050:0195 jmp 01fc 0050:01fc mov al,20 0050:01fe out 08,al 0050:0200 mov al,0b 0050:0202 out 08,al 0050:0204 in al,08 0050:0206 or al,al 0050:0208 jnz 020e 0050:020a mov al,20 0050:020c out 00,al 0050:020e pop es 0050:020f pop ds 0050:0210 popa 0000:0211 iret 0000:040c wait 0000:040d jmp 040a 0050:040a int 14 0050:0180 pusha 0050:0181 push ds 0050:0182 push es 0050:0183 mov ax,cs 0050:0185 mov ds,ax 0050:0187 call 0212 0050:0212 mov ax,3827 0050:0215 call 021b 0050:021b call 0231 0050:0231 push ax 0050:0232 push dx 0050:0233 mov dx,0188 0050:0236 in al,dx 0050:0237 shl al,1 0050:0239 jc 0236 0050:023b pop dx 0050:023c pop ax 0050:023d ret . . .
2608play.exe test.dat
アドレス | サイズ | 方向 | 意味 |
0x380 | unsigned short | ドライバ→制御 | 初期状態のコードセグメントレジスタ(cs)の値 |
0x382 | unsigned short | ドライバ→制御 | 初期状態のデータセグメントレジスタ(ds)の値 |
0x384 | unsigned short | ドライバ→制御 | 初期状態のインストラクションポインタレジスタ(ip)の値 |
0x386 | unsigned char | ドライバ→制御 | 演奏終了フラグ 0x01で制御側に終了が来た事を通知 |
0x387 | unsigned char | ドライバ→制御 | ループカウンタ ループブレイカー設定が有効な時、ここが2以上であった場合ループを中断して次の曲へと進めます |
0x388 | unsigned char | 制御→ドライバ | 0x01の時、制御部がフェードアウトを要求しています |
0x389 | unsigned char | ドライバ->制御 | 割り込みタイプ b0:タイマーA有効 b1:タイマーB有効 |
0x38a | unsigned short | ドライバ→制御 | 曲の長さ(0.1秒単位) ex.200 = 20秒 省略する時は0秒で |
0x38c | unsigned char | ドライバ→制御 | 制御フラグ b0:フェードアウトを自前で実行 b1:2203用表示 b3:時間が来たら終了 |
0x38d | unsigned char | ドライバ→制御 | ウェイトループキャンセラ。0x01で有効。 loop $+2をキャンセルします。ドライバによってはループでウェイトしているものがあるので、 キャンセルする場合に有効にします。 |
0x38e | unsigned char | ドライバ->制御 | 識別子:0x55 |
0x38f | unsigned char | ドライバ->制御 | 識別子:0xaa |
>l fmp.com load file comp.[fmp.com][31073(00007961)] >d 0 0000:0000 e9 5d 4d 00 00 00 00 00-00 00 00 00 00 00 00 00 饐M............. 0000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0030 00 00 23 6f 6f 00 00 00-00 00 00 00 00 00 00 00 ..#oo........... 0000:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >
>m 0 500 7fff >d 500 0000:0500 e9 5d 4d 00 00 00 00 00-00 00 00 00 00 00 00 00 饐M............. 0000:0510 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0520 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0530 00 00 23 6f 6f 00 00 00-00 00 00 00 00 00 00 00 ..#oo........... 0000:0540 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0550 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0560 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0570 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >
>fs 8000 set filesize -> [32768] >n test.dat set filename [test.dat] >w save file comp.[test.dat] >
>rcs 40 >rds 40 >r ax:0000 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0040 es:0000 ss:0000 cs:0040 ip:0100 NV UP EI PL NZ NA PO NC 0040:0100 e95d4d jmp 4e60 >
>e 80 02 20 73 0d >d 80 0040:0080 02 20 73 0d 00 00 00 00-00 00 00 00 00 00 00 00 . s............. 0040:0090 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0040:00a0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0040:00b0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0040:00c0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0040:00d0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0040:00e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0040:00f0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >
>w save file comp.[test.dat] >
>x change alloc memory block dealloc memory block change alloc memory block Music driver 「FMP」 Ver 4.28u Copyright (C)1990-98 by Guu read interrupt vector read interrupt vector set interrupt vector set interrupt vector division by zero ax:10a1 bx:0000 cx:0000 dx:0000 sp:8261 bp:0000 si:0082 di:011a ds:0040 es:0040 ss:0040 cs:0040 ip:53a0 NV UP EI PL ZF NA PO NC 0040:53a0 40 inc ax >
>x change alloc memory block dealloc memory block change alloc memory block read interrupt vector set interrupt vector not dos-function implement not dos-function implement read interrupt vector set interrupt vector read interrupt vector set interrupt vector - Theme of FMP - Composed & Arranged by KID Found YM2203, Access I/O = 0188h, Used INT0h, Hooked INT d2h, Loops = @2 メモリに常駐しました stay resident ax:3100 bx:0000 cx:0000 dx:08e7 sp:8261 bp:0000 si:4e7c di:1404 ds:0040 es:0040 ss:0040 cs:0040 ip:5733 NV UP EI PL NZ NA PO NC 0040:5733 f606a85d01 test byte ptr [5da8],01 (061a8:04) >
>l test.dat load file comp.[test.dat][32768(00008000)] >rcs 40 >rds 40 >r ax:0000 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0040 es:0000 ss:0000 cs:0040 ip:0100 NV UP EI PL NZ NA PO NC 0040:0100 e95d4d jmp 4e60
>bp 6087 set break point -> 0040:6087
>x change alloc memory block dealloc memory block change alloc memory block Music driver 「FMP」 Ver 4.28u Copyright (C)1990-98 by Guu read interrupt vector ax:0000 bx:5df1 cx:0004 dx:038a sp:825f bp:0000 si:0082 di:011a ds:0040 es:0040 ss:0040 cs:0040 ip:6087 NV UP EI PL NZ NA PO NC 0040:6087* 3b4702 cmp ax,[bx+02] (061f3:0041) <--bp:e
>e 5df3 0040:5df3 41-43 00-
>x ax:0043 bx:5df5 cx:0003 dx:0188 sp:825f bp:0000 si:0082 di:011a ds:0040 es:0040 ss:0040 cs:0040 ip:6087 NV UP EI PL NZ NA PO NC 0040:6087* 3b4702 cmp ax,[bx+02] (061f7:0000) <--bp:e
>bp 6087 clear break point -> 0040:6087
>x read interrupt vector set interrupt vector set interrupt vector division by zero ax:0850 bx:0000 cx:0000 dx:0000 sp:8261 bp:0000 si:0082 di:011a ds:0040 es:0040 ss:0040 cs:0040 ip:53a0 NV UP EI PL ZF NA PO NC 0040:53a0 40 inc ax
>x change alloc memory block dealloc memory block change alloc memory block read interrupt vector set interrupt vector not dos-function implement not dos-function implement read interrupt vector set interrupt vector read interrupt vector set interrupt vector - Theme of FMP - Composed & Arranged by KID Found YM2608, Access I/O = 0188h, Used INT0h, Hooked INT d2h, Loops = 81 「86ボード」を認識しました メモリに常駐しました stay resident ax:3100 bx:0002 cx:0000 dx:08e7 sp:8261 bp:0000 si:4e7c di:1404 ds:0040 es:0040 ss:0040 cs:0040 ip:5733 NV UP EI PL NZ NA PO NC 0040:5733 f606a85d01 test byte ptr [5da8],01 (061a8:04) >
>w save file comp.[test.dat] >
>rds 0 >d 0 0000:0000 e9 5d 4d 00 00 00 00 00-00 00 00 00 00 00 00 00 饐M............. 0000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0030 00 00 23 6f 6f 00 00 00-00 00 00 00 00 00 00 00 ..#oo........... 0000:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
>f 0 37f 0 >d 0 0000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >
>e 50 74 17 40 00 >d 0 0000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0050 74 17 40 00 00 00 00 00-00 00 00 00 00 00 00 00 t.@............. 0000:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ >rds 40 >
loop: int 14 wait jmp loop
>e 0 cd 14 9b eb fb >u 0 0040:0000 cd14 int 14 0040:0002 9b wait 0040:0003 ebfb jmp 0000 0040:0005 0000 add [bx+si],al 0040:0007 0000 add [bx+si],al 0040:0009 0000 add [bx+si],al 0040:000b 0000 add [bx+si],al 0040:000d 0000 add [bx+si],al >rip 0 >r ax:0000 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0040 es:0000 ss:0000 cs:0040 ip:0000 NV UP EI PL NZ NA PO NC 0040:0000 cd14 int 14 >
>w save file comp.[test.dat] >
>io io write enable. >
略 . . 0188 <- 27 0188 0188 018a <- 30 0068 <- 0b 0068 <- 0a 0188 0188 0188 <- 26 0188 0188 018a <- 00 0188 0188 0188 <- 27 0188 0188 . . 略
reset:01 >l test.dat load file comp.[test.dat][32768(00008000)] >rcs 40 >rds 40 >rip 0 >r ax:0000 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0040 es:0000 ss:0000 cs:0040 ip:0000 NV UP EI PL NZ NA PO NC 0040:0000 cd14 int 14 >
>x break! ax:ffa5 bx:02f1 cx:0626 dx:018c sp:1342 bp:0000 si:141e di:029a ds:0040 es:0040 ss:0040 cs:0040 ip:3234 NV UP DI PL NZ NA PO NC 0040:3234 e2fe loop 3234 >fr reset:01 fm reset! >
>wait 0 set wait 0 msec. >
>h history on >x break! ax:0609 bx:09e1 cx:03de dx:0188 sp:1340 bp:0000 si:50d6 di:098a ds:0040 es:0040 ss:0040 cs:0040 ip:323e NV UP DI PL ZF NA PO NC 0040:323e e2fe loop 323e >fr reset:01 fm reset! >h history off >
. . 0040:323e loop 323e 0040:323e loop 323e 0040:323e loop 323e 0040:323e loop 323e 0040:323e loop 323e . .
>wc wait loop cancel. >
reset:01 >l test.dat load file comp.[test.dat][32768(00008000)] >rcs 40 >rds 40 >rip 0 >r ax:0000 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0040 es:0000 ss:0000 cs:0040 ip:0000 NV UP EI PL NZ NA PO NC 0040:0000 cd14 int 14 >
>wc wait loop cancel. >wait 0 set wait 0 msec. >x
reset:01 >l test.dat load file comp.[test.dat][32768(00008000)] >rcs 40 >rds 40 >r ax:0000 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0040 es:0000 ss:0000 cs:0040 ip:0100 NV UP EI PL NZ NA PO NC 0040:0100 e95d00 jmp 0160 >rip 0 >r ax:0000 bx:0000 cx:0000 dx:0000 sp:fff8 bp:0000 si:0000 di:0000 ds:0040 es:0000 ss:0000 cs:0040 ip:0000 NV UP EI PL NZ NA PO NC 0040:0000 cd14 int 14 >c set coverage on. >wc wait loop cancel. >wait 0 set wait 0 msec. >x break! ax:0080 bx:0000 cx:0008 dx:0188 sp:1348 bp:0000 si:0c26 di:0000 ds:0040 es:0040 ss:0040 cs:0040 ip:1b75 NV UP EI PL ZF NA PO NC 0040:1b75 740c jz 1b83 >cs code coverage 1161entry. data coverage 705entry. >
>co writing..done. >
0000 0002 0003 1774 1775 1778 1779 177e 17ad . . . 3e7c 3e7d 3e81 3e84 3e87 3e8d 3eb7 00000502 00000503 0000050d 0000050f 00000511 00000512 . . . 000054fb 00005537 0000553a 0000554a 0000554d 00005590
fm_dat_edit.exe test.dat 1.TimerA .. Disable 2.TimerB .. Disable 3.LimitTime .. 0 4.Fadeout DriverMode .. Disable 5.2203 GraphicECMode .. Disable 6.LimitEnd Flag .. Disable 8.Save End 9.Exit cmd ..2 1.TimerA .. Disable 2.TimerB .. Enable 3.LimitTime .. 0 4.Fadeout DriverMode .. Disable 5.2203 GraphicECMode .. Disable 6.LimitEnd Flag .. Disable 8.Save End 9.Exit cmd ..3 time ? 100 1.TimerA .. Disable 2.TimerB .. Enable 3.LimitTime .. 100 4.Fadeout DriverMode .. Disable 5.2203 GraphicECMode .. Disable 6.LimitEnd Flag .. Disable 8.Save End 9.Exit cmd ..6 1.TimerA .. Disable 2.TimerB .. Enable 3.LimitTime .. 100 4.Fadeout DriverMode .. Disable 5.2203 GraphicECMode .. Disable 6.LimitEnd Flag .. Enable 8.Save End 9.Exit cmd ..8 save end!
reset:01 >l test.dat load file comp.[test.dat][32768(00008000)] >d 380 0000:0380 00 00 00 00 00 01 00 00-00 02 64 00 08 00 55 aa ..........d...Uェ 0000:0390 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03a0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03b0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03c0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03d0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03f0 00 00 00 00 00 00 00 00-46 4d 50 20 34 2e 32 38 ........FMP 4.28 >e 38d 1 >d 380 0000:0380 00 00 00 00 00 01 00 00-00 02 64 00 08 01 55 aa ..........d...Uェ 0000:0390 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03a0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03b0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03c0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03d0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03f0 00 00 00 00 00 00 00 00-46 4d 50 20 34 2e 32 38 ........FMP 4.28 >w save file comp.[test.dat] >
cld
mov cx,9
mov si,3a8h
lp:
mov dx,188h
lodsb
out dx,al
mov dl,8ah
lodsb
out dx,al
loop lp
soundloop:
int 14h
wait
jmp soundloop
※以下のがよかったかも
lodsw
out dx,al
mov dl,8a
mov al,ah
out dx,al
loop lp
26,00 27,2a 22,00 b4,c0 b5,c0 b6,c0 07,38 26,ca 27,2a
>e 380 0000:0380 00- 00- 00- 00- 00-90 01-03 00- >e 390 0000:0390 00-fc 00-b9 00-09 00-00 00-be 00-a8 00-03 00-ba 0000:0398 00-88 00-01 00-ac 00-ee 00-b2 00-8a 00-ac 00-ee 0000:03a0 00-e2 00-f5 00-cd 00-14 00-9b 00-eb 00-fb 00- >e 3a8 0000:03a8 00-26 00-00 00-27 00-2a 00-22 00-00 00-b4 00-c0 0000:03b0 00-b5 00-c0 00-b6 00-c0 00-07 00-38 00-26 00-ca 0000:03b8 00-27 00-2a 00- >d 380 0000:0380 00 00 00 00 90 03 00 00-00 02 64 00 08 01 55 aa ....・....d...Uェ 0000:0390 fc b9 09 00 be a8 03 ba-88 01 ac ee b2 8a ac ee ・..セィ.コ・ャホ堪・ 0000:03a0 e2 f5 cd 14 9b eb fb 00-26 00 27 2a 22 00 b4 c0 糢ヘ.幎・&.'*".エタ 0000:03b0 b5 c0 b6 c0 07 38 26 ca-27 2a 00 00 00 00 00 00 オタカタ.8&ハ'*...... 0000:03c0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03d0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0000:03f0 00 00 00 00 00 00 00 00-46 4d 50 20 34 2e 32 38 ........FMP 4.28 >w save file comp.[test.dat] >
0040:56af test byte ptr [5da8],02 (061a8:04) 0040:56b4 jnz 56d0 0040:56b6 mov si,65e0 0040:56b9 mov dx,57af 0040:56bc cmp byte ptr [5263],00 (05663:00) 0040:56c1 jz 56c9 0040:56c9 mov ah,09 0040:56cb int 21 0040:56cd call 4b30
>d 57af 0040:57af 20 2d 20 54 68 65 6d 65-20 6f 66 20 46 4d 50 20 - Theme of FMP 0040:57bf 2d 20 20 20 43 6f 6d 70-6f 73 65 64 20 26 20 41 - Composed & A 0040:57cf 72 72 61 6e 67 65 64 20-62 79 20 4b 49 44 0d 0a rranged by KID.. 0040:57df 0a 24 20 2d 20 42 61 6c-61 6e 63 65 20 74 65 73 .$ - Balance tes 0040:57ef 74 20 2d 20 20 20 43 6f-6d 70 6f 73 65 64 20 26 t - Composed & 0040:57ff 20 41 72 72 61 6e 67 65-64 20 62 79 20 4b 49 44 Arranged by KID 0040:580f 0d 0a 0a 24 20 2d 20 56-6f 6c 75 6d 65 20 63 68 ...$ - Volume ch 0040:581f 61 6e 67 65 20 2d 0d 0a-0a 24 41 63 63 65 73 73 ange -...$Access
>u 56c1 0040:56c1 7406 jz 56c9 0040:56c3 bee268 mov si,68e2 0040:56c6 bae157 mov dx,57e1 0040:56c9 b409 mov ah,09 0040:56cb cd21 int 21 0040:56cd e860f4 call 4b30 0040:56d0 33db xor bx,bx 0040:56d2 8a1e560b mov bl,[0b56]
>u 32e5 0040:32e5 2ec6060201fe mov byte ptr cs:[0102],fe 0040:32eb 3c15 cmp al,15 0040:32ed 7711 ja 3300 0040:32ef 2ec606020100 mov byte ptr cs:[0102],00 0040:32f5 33db xor bx,bx 0040:32f7 8ad8 mov bl,al 0040:32f9 d1e3 shl bx,1 0040:32fb 2eff974633 call cs:[bx+3346]
>d 3346 0040:3346 72 3d fe 3e 3c 40 30 4b-72 33 fa 33 3c 3a ff 39 r=><@0Kr3・<:9 0040:3356 b8 3e c5 34 8d 39 bf 39-96 36 8c 39 c4 36 69 37 ク>ナ4・ソ9・・ト6i7 略 >
reset:01 >l demo.ozi load file comp.[demo.ozi][10552(00002938)] #ここではdemo.oziファイルをロードしています >m 0 a000 3000 #一度データを移動しておきます >l fmp.com load file comp.[fmp.com][31073(00007961)] #fmpをロードします >m 0 500 7fff #現在の位置では割り込みベクタの上なので、セグメント40hに移動します >rcs 40 >rds 40 #セグメントを更新します >e 80 02 20 73 0d #常駐コマンドラインを書き込みます >bp 6087 set break point -> 0040:6087 #86ボード認識用にブレークポイントを設定します >x change alloc memory block dealloc memory block change alloc memory block Music driver 「FMP」 Ver 4.28u Copyright (C)1990-98 by Guu read interrupt vector [d2][0000:0000] ax:0000 bx:5df1 cx:0004 dx:038a sp:825f bp:0000 si:0082 di:011a ds:0040 es:0040 ss:0040 cs:0040 ip:6087 NV UP EI PL NZ NA PO NC 0040:6087* 3b4702 cmp ax,[bx+02] (061f3:0041) <--bp:e >bp 6087 clear break point -> 0040:6087 >e 4df3 0040:4df3 06- >e 5df3 0040:5df3 41-43 00- #86ボード認識用設定にデータを変更し、ブレークポイントを解除します >x read interrupt vector [08][0000:0000] set interrupt vector [08][0040:62d5] set interrupt vector [08][0000:0000] division by zero ax:0850 bx:0000 cx:0000 dx:0000 sp:8261 bp:0000 si:0082 di:011a ds:0040 es:0040 ss:0040 cs:0040 ip:53a0 NV UP EI PL ZF NA PO NC 0040:53a0 40 inc ax #0除算エラーでとまるので、再度実行します >x change alloc memory block dealloc memory block change alloc memory block read interrupt vector [0b][0000:0000] set interrupt vector [0b][0040:1774] not dos-function implement not dos-function implement read interrupt vector [d2][0000:0000] set interrupt vector [d2][0040:32a0] read interrupt vector [1b][0000:0000] set interrupt vector [1b][0040:327c] - Theme of FMP - Composed & Arranged by KID Found YM2608, Access I/O = 0188h, Used INT0h, Hooked INT d2h, Loops = 81 「86ボード」を認識しました メモリに常駐しました stay resident ax:3100 bx:0002 cx:0000 dx:08e7 sp:8261 bp:0000 si:4e7c di:1404 ds:0040 es:0040 ss:0040 cs:0040 ip:5733 NV UP EI PL NZ NA PO NC 0040:5733 f606a85d01 test byte ptr [5da8],01 (061a8:04) #メモリに常駐したところで自動で停止します >e 0 be 00 9c b0 03 cd d2 9b cd 0b 9b eb fb >u 0 0040:0000 be009c mov si,9c00 0040:0003 b003 mov al,03 0040:0005 cdd2 int d2 0040:0007 9b wait 0040:0008 cd0b int 0b 0040:000a 9b wait 0040:000b ebfb jmp 0008 0040:000d 0000 add [bx+si],al #先ほど調べた曲データロードコマンドのコードを書き込みます。移動先は0a000hなのですが、セグメントが40hなので400hほど戻して、9c00hになっています 順序変えて、 mov si,9c00 mov al,3 int d2 loop: wait int 0b jmp loop のがよかったですね >rip 0 >r ax:3100 bx:0002 cx:0000 dx:08e7 sp:8261 bp:0000 si:4e7c di:1404 ds:0040 es:0040 ss:0040 cs:0040 ip:0000 NV UP EI PL NZ NA PO NC 0040:0000 be009c mov si,9c00 #ipレジスタを0に設定します >wc wait loop cancel. >wait 2 set wait 2 msec. #ついでにデバッガの設定を変更します >x #いざ実行! break! ax:8181 bx:043e cx:0000 dx:018a sp:1342 bp:0c81 si:141e di:002e ds:0040 es:0040 ss:0040 cs:0040 ip:3249 NV UP DI PL NZ NA PO NC 0040:3249 58 pop ax >fr reset:01 fm reset! >
mov ah,0 int 60h loop: wait int 14h jmp loopここまでで、ドライバイメージにしておきます。
in al,dx in al,dx test al,2 jc xxxxのようにコードを組まれると、実チップでは2回目でも同じ値が返って来ますが、
TeraTermなどをご利用いただけます。 改行コードはLFのみなので、CRLFに変換するなどのオプションを指定してください。
シリアルコンソールを起動してEnterキーなどを押下することで、シリアルコンソールモードになります。 ※SCCIを利用する場合は、SCCI対応ソフトを起動することで従来通り強制的にSCCIに切り替わります。 繋がった場合は、まずhキーを押してエンターキーを押してください。 コマンドヘルプが表示されます。 -h Welcome to OPNAM(4759) Console Version 1.01 command reset cpu|fm ... reset cpu/fm chip out/o 2151/M|2608/A reg dat ... output fm register clock 2151/M|2608/A 3.57|4|7.98|8 ... select fm frequency eeprom [datas(hex)]|checksum|load ... eeprom read/write/checksum/load setting button ... button test led on|off ... led control lcd init|cls|light|string ... lcd control light on|off string x y string oled init|on|off|cls|bright|string ... oled control bright brightness(hex) string x y color(hex) string sd init|dir|read/r|write/w|set|dump ... sd control read readsector(hex) write writesector(hex) dump set address datas play [filename(8+3)] ... playfile/information stop ... stop play cd directory ... change current directory fm ... dump fm register temp ... cpu temperature help/h/? ... this message unlock yes ... unlock safety switch pin/p 2151/M|2608/A pinname 0|1 ... output pin level (safety unlock only) pinname:IC|WR|RD|CS|D0..D7|A0|A1 コマンドの記述方法について 例1. reset cpu|fm ... reset cpu/fm chip コマンド+オプションを指定します reset cpu reset fm のように記述します。 「cpu|fm」は、cpuまたはfmのどちらかを記述できるという意味です。 例2. out/o 2151/M|2608/A reg dat ... output fm register コマンド+オプションを3つ指定します out 2151 10 2a out M 28 2a out 2608 7 3f o A 7 3f のように記述できます。 「2151/M」は、2151またはMを記述できるという意味です。 例3. oled init|on|off|cls|bright|string ... oled control bright brightness(hex) string x y color(hex) string oled init oled bright ff oled off oled string 12 16 ff test! のように記述できます。 一部オプションでは、追加引数があります。そのようなコマンドは下に追加が必要な場合のオプションが追記されています。 (hex)となっている引数は16進数で指定してください 例4. play [filename(8+3)] ... playfile/information play play testdat~1.vgm のように記述できます。「[]」は省略可能の意味です。 コマンドの簡易説明 reset CPU又はFM音源をリセットします。 clock FM音源に供給するクロックを指定できます。あらかじめ決められた組み合わせ以外は指定できません。 eeprom オプション設定を管理するEEPROMの内容を表示したり、書き換えたり、書き換えた場合のチェックサム合わせや、 内容をオプション設定に反映したりできます →この機能はスタンダードなOPNAM(4759)では実装されていません button ボタンの押下状態を表示します。負論理の為押下していない状態では7となります。 押したボタンのビットが0になります。全部押すと0になります。 この数値が意図した状態と違う場合、ボタンの半田がおかしい可能性があります。 led LEDの点灯・消灯を制御します lcd LCDの初期化、クリア、バックライト制御、文字列表示を行います oled OLEDの初期化、表示・非表示、クリア、輝度(正確にはコントラスト00〜ffで、00が半分くらいの輝度です)、文字列表示を行います →この機能はスタンダードなOPNAM(4759)では実装されていません sd SDの制御を行います。SDカードのSPIモード初期化、ディレクトリエントリの表示、セクタ読み込み、書き込み、データ設定、ダンプなどが行えます。 SDカードはSPIモード初期化を行うことでデータの読み書きができるようになります。SDカードを初期化するわけではありません。 sd init まずこのコマンドでSDカードを使えるようにしてください。(SDカードを挿入した状態でボードを起動していた場合、すでに初期化済みです) SPIモード初期化コマンドです sd dir FAT32のディレクトリエントリを確認できます。8+3ファイル名のみです。 sd r 0 リードコマンドで指定したセクタを読み込みます。SDバッファに読み込み、バッファをついでにダンプして表示します sd w 0 SDバッファの内容を書き込みます sd set 10 01 02 03 04 .. バッファの内容を書き換えます。setの後に、アドレスを指定し、そのあとにデータを指定します。 コマンドの有効最大長はそこまで長くありません。 長いデータを書き換える場合は複数回指定してください。 通常はsd readコマンドでバッファに読み込み、sd setコマンドで必要な場所だけを書き換え、sd writeコマンドでバッファの内容を書き込むという使い方をします。 play ファイルの再生を指定しています。8+3ファイル名のみです。 ファイル名を省略した場合、再生中のファイル情報を表示します。 stop ファイルの再生を直ちに終了します。 cd 現在のカレントディレクトリを、指定したディレクトリに変更します。 ルートディレクトリに直接戻る場合はcd /のように指定してください。1つ上はcd ..を指定してください。 fm FM音源チップのレジスタバッファにある情報を出力します。 内部的に保持しているレジスタ情報の為、実際のチップの情報ではありません。大体同じです。 temp 現在のCPU温度を表示します。 →この機能はスタンダードなOPNAM(4759)では実装されていません help 簡易ヘルプを表示します。 unlock yes ピン制御のロックを解除します。セーフティ解除は作成時のみに利用してください。 音源チップをつけたままピンを制御しないでください。 pin ピンの出力を制御します。通常状態ではこのコマンドは実行できません。セーフティを解除する必要があります。 ピン名としては IC WR RD CS D0 D1 D2 D3 D4 D5 D6 D7 A0 A1を指定できます。 pin 2151 WR 1 pin M IC 1 のように指定できます。
SDカードのフォルダ内に設定ファイル「SETTING.CFG」を配置しておくことで、そのフォルダ内の演奏に限定して設定を行うことができる機能について、 設定ファイルのサンプルだけでしか記載していなかったので、専用に章を設けて解説します。 ※v1.07から追加された機能です ファームウェアのバージョンによっては利用できない可能性があります。アップデートしてください 一部の設定項目が使えない場合もバージョンアップしてください ■どういう機能なのですか? 曲によっては、この曲だけ、音量を下げたい/上げたい!などという事があります。 対象の曲ファイルをフォルダに入れ、音量を調整する設定を入れた設定ファイルを同時に配置することで、 そのフォルダ内だけ設定を適用することができます。 ■設定ファイルについて テキストファイルです。 コメントも記載できます。 文字コードはおそらくどれでも大丈夫です。 改行コードはCRLFです。 要は、メモ帳で作成してOKということです。 適用したい曲ファイルの入っているフォルダに「SETTING.CFG」というファイル名で配置します。 ■設定について 変更が必要な設定のみを記載してください。 変更が必要ない設定の記載は必要ありません。 現状の設定がそのまま引き継がれます。 ■記載方法について 設定項目と設定値を1行ずつ記載していく形式です。 例. LoopBreaker=on 設定項目と設定値の間は=を記載してください。 スペースやタブは自動的に省略されます。 例. 2151PanInv = invert 設定値は、行の先頭から記載してください。 コメント行は先頭を#から開始してください。 例. #以下の設定は〜です ■簡単な記載例 #このフォルダの曲は適切に初期化しない為、チップ自体のハードリセットを強制します ResetFMChips=hard #SSG音量が低い為、音量を+2(設定値2)にします SSGV.Adjust=2 . . . ※サンプルはv107(ファームウェアのところにあるzipファイルです)にあります ■設定項目と設定値について 設定項目は大文字小文字を区別します。正確に記載してください。空白は途中に入りません。 設定値は数字及びアルファベット小文字で構成しています。 NGとなった設定行は無視されます。特にエラーなどは出ません。 設定が効いていないと思った場合は、設定ファイルの記載を確認してください。 また、設定しても意味がない設定については機能しません。 例えば、SCCIモードなどです。これはSDカードからの自動演奏中には意味がありません。 ■設定項目/設定値一覧 設定項目と設定する項目値を記載します。 わかりにくい設定値についてのみ解説を記載しています。 ・LoopBreaker on off inifinite ・Shuffle on off ・ResetFMChips soft hard off ・BackLight - 0 3 5 10 30 60 ・SCCIMode normal normalf light lightf ・2151Volume 15〜0 16〜31 ※15が100%で、0が50%です。 16が100%で、31は180%程度まで増加します ・SubDirectory disable enable ・YM2608Wait heavy light ・DisplayMode 0〜7 ※0 2608標準 FM1-6,SSG,Rythm,ADPCMすべて表示 1 2608簡易 FM1-3,FM4-6,SSG,Rythm,ADPCMをまとめて表示 2 2151標準 FM1-8(2151) 3 4759標準1 FM1-3,FM4-6,SSG,Rythm,ADPCM, FM1-3(2151),FM4-6(2151),FM7-8(2151) 4 4759標準2 FM1-6,SSG,Rythm,ADPCM, FM1-2(2151),FM3-4(2151),FM5-6(2151),FM7-8(2151) 5 4759簡易 2608すべて,2151すべて 6 2151拡張 2151標準+クロック表示付き 7 auto ・SDSpeed 機能しません ・2203/2608 2608 2203 ・SDLED enable disable ・Comment comment graphic ・2151Clock auto 3.57 4.00 ・2608Clock auto 8.00 7.98 ・Hold enable disable ・PlayList disable enable ・ManualReset 機能しません ・OLEDSaver 0 30 60 90 ※0が無限 ・OLEDOff 0 60 120 180 ※0が無限 ・OLEDResume screen direct ・EEPROM overwr only ・PlayHold enable disable ・SCCIWait 0〜7 ※0〜3 Lv.0 〜 Lv.3 4〜7 LV.-1 〜 Lv.-4 ・OpeningBGM disable enable ・SpecialTitle enable disable ・SortEntry enable disable ・BlankWait 0 1 2 3 ※0がOff 1〜3は、1秒〜3秒に対応 ・2151PanInv invert normal ・2608PanInv invert normal ・SSGV.Adjust 0〜7 ※0〜4が、+-0 〜 +4 5〜7が、-1 〜 -3 ・2608Volume 0〜31 ※15が100%で、0が50%です。 16が100%で、31は180%程度まで増加します ・ADPCMW-Wait light normal ・SDWait heavy light ・OLEDPan 機能しません ・IOPS 機能しません ・PDXEmulation 機能しません ・PDXM.Volume 機能しません ・PDXVolume 機能しません ・AutoSkip 0〜3 ※0 off 1 60秒 2 120秒 3 180秒