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

「debug用関数を作る」の編集履歴(バックアップ)一覧に戻る

debug用関数を作る - (2015/08/31 (月) 15:39:27) の1つ前との変更点

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

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

+debug用関数を作る
 
+
+アセンブラやCを使っているとデバックがとても難しい。
+そこでDOSデバッカがなくとも使える簡易型のデバック表示機能を作る。
+
+使いかたはソースコード中でデバックしたい場所に関数を書いて実行すればよい。
+Cプログラムなどからアセンブラなどを呼び出す場合のデバックに使うと便利だ。
+DOS1/2だけでなくCPM汎用なので様々な機種で動作する。
+
+この機能が呼ばれるとCPU状態をメモリに保存しデバック表示するとともに
+コンピュータの実行を停止する。
+CPU状態の保存箇所はデフォルトでメモリアドレスの0xC000となる。MSX以外の
+ハードではアドレスを変えて使うことも可能だ。
+アセンブラのソースコード部分を工夫すればsdcc以外でもビルドできるかもしれない。
+
+stopdebug.asm
+ ;
+ _stopdebugtrace::
+ ;
+ 	di				;disable interrupt
+ ;
+ 	ld	(0xC000),a		;save registers
+ ;
+ 	ld	(0xC002),bc
+ 	ld	(0xC004),de
+ 	ld	(0xC006),hl
+ ;
+ 	ld	(0xC008),ix
+ 	ld	(0xC00a),iy
+ ;
+ 	ld	(0xC00c),sp
+ ;
+ 	ei
+ 	ret
+ ;	
+
+
+debug.c
+ #include <stdio.h>
+ 
+ extern void stopdebugtrace();
+ //extern void cls();
+ void debugdump();
+ 
+ //このソースはdebug機能サンプルです
+ void main(void){
+ 
+ 	//asmで書かれたコードで実行中レジスタを保存する
+ 	//デバックしたいコードラインの直前や直後にこの関数を書くこと
+ 	stopdebugtrace();
+ 
+ 	//debug結果を表示
+ 	debugdump();
+ 
+ 	//割り込み停止、実行を止める
+ 	__asm
+ 		DI
+ 		HALT
+ 	__endasm;
+ 
+ 	while(1);
+ }
+ 
+ void debugdump(void){
+ 	unsigned char * reg_a=(unsigned char *)0xC000;
+ 	unsigned int * reg_bc=(unsigned int *)0xC002;
+ 	unsigned int * reg_de=(unsigned int *)0xC004;
+ 	unsigned int * reg_hl=(unsigned int *)0xC006;
+ 	unsigned int * reg_ix=(unsigned int *)0xC008;
+ 	unsigned int * reg_iy=(unsigned int *)0xC00a;
+ 	unsigned int * reg_sp=(unsigned int *)0xC00c;
+ 	
+ 	unsigned int i;
+ 	unsigned char *p_stack;
+ 
+ //	cls();
+ 
+ 	printf("*** STOP (HALT_DUMP_CPU_DEBUG) \r\n");
+ 	printf("\r\n");
+ 	printf("A problem has been detected\r\n");
+ 	printf("If this is the first time you've seen this Stop debug screen,\r\n");
+ 	printf("Press RESET to restart your computer.\r\n\r\n");
+ 
+ 	//
+ 	printf("Techincal information:\r\n");
+ 	printf("REG: A=%02x BC=%04x DE=%04x \r\n",*reg_a, *reg_bc, *reg_de);
+ 	printf(" HL=%04x IX=%04x IY=%04x SP=%x",*reg_hl, *reg_ix, *reg_iy, *reg_sp);
+ 
+ 	p_stack=(unsigned char *)*reg_sp;
+ 	printf(" PC=%02x%02x \r\n\r\n",p_stack[1],p_stack[0]);
+ 
+ 	printf("STACK(%x): ",*reg_sp);
+ 	for(i=0; i<16; i++){
+ 		printf("%02x ",p_stack[i]);
+ 	}
+ 	printf("\r\n");
+ }
+
+実行結果画面
+ *** STOP (HALT_DUMP_CPU_DEBUG)
+ 
+ A problem has been detected
+ If this is the first time you've seen this Stop debug screen,
+ Press RESET to restart your computer.
+ 
+ Techincal information:
+ REG: A=00 BC=0000 DE=0000
+  HL=0000 IX=0000 IY=0000 SP=fcfc PC=0106
+ 
+ STACK(fcfc): 06 01 00 fd 76 00 00 00 00 00 00 00 00 00 00 00
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。