エラーの原因がわからないのでお願いします
ブートローダーをアセンブリ言語で書き、それ以降はcで書きたいです。
リンクさせる方法がわからないので
あらかじめどこのアドレスから制御を渡すか決めておいて
そこにcのプログラムを配置して何とか動かしています。
gcc -c ファイル名.c objcopy -O binary -j .text ファイル名.o bin.file
これで生成されたrawバイナリファイルの先頭から制御を渡せばそのまま実行できるはず
#define Fontdata_Base 0x7C00 + 512 * 8 #define Vram_Base_Address 0xA0000 void loop(void); void DisplayMessage_Small(char*,int,int); void DisplayMessage_Small_Loop(char *,char *); void DidplayMessage_Small_Strings(char *,int,int,int); void main_kernel(void){ char message_loding[] = "loding plese wait"; DidplayMessage_Small_Strings(message_loding,17,28,400); loop(); } void loop(void){ for(;;){} } void DidplayMessage_Small_Strings(char *Asciicode_String_Address,int String_Count,int X,int Y){ int Count; int X_Count; for(Count = 0; Count < String_Count ; Count++){ char * Asciicode_Address = Asciicode_String_Address + Count; X_Count = X + Count; DisplayMessage_Small(Asciicode_Address,X_Count,Y); } } void DisplayMessage_Small(char *Asciicode_Address,int X,int Y){ char *Fontdata_Address = (Fontdata_Base + (0x200 * 26) + (*Asciicode_Address * 16)); //*Asciicode_Address char *Vram_Address = Vram_Base_Address; Vram_Address = Vram_Address + X + (Y * 80); DisplayMessage_Small_Loop(Fontdata_Address,Vram_Address); } void DisplayMessage_Small_Loop(char *Asciicode_Address,char * Vram_Address){ int count; for(count = 0; count< 16; count++){ char Asciicode = *(Asciicode_Address + count); char *Vram = Vram_Address + (80 * count); *Vram = Asciicode; } }
display~は画面上に文字を表示させる関数です。
そしてプログラムはmain_kernel関数から実行されていきます。
結果がこちらです。
youtube
"run next stage"コマンドを実行すると上記のcプログラムへ制御が移ります。
見た限りうまく動作しています。
#define Fontdata_Base 0x7C00 + 512 * 8 #define Vram_Base_Address 0xA0000 void loop(void); void DisplayMessage_Small(char*,int,int); void DisplayMessage_Small_Loop(char *,char *); void DidplayMessage_Small_Strings(char *,int,int,int); void DisplayMessage_Big(char*,int,int); void DisplayMessage_Big_Loop(char *,char *); void main_kernel(void){ char message_loding[] = "loding plese wait"; DidplayMessage_Small_Strings(message_loding,17,28,400); loop(); } void loop(void){ for(;;){} } void DisplayMessage_Big(char *Asciicode_Address,int X,int Y){ char *Fontdata_Address = (Fontdata_Base + ((*Asciicode_Address) - 0x41) * 512); //*Asciicode_Address char *Vram_Address = Vram_Base_Address; Vram_Address = Vram_Address + X + (Y * 80); DisplayMessage_Big_Loop(Fontdata_Address,Vram_Address); } void DisplayMessage_Big_Loop(char *Asciicode_Address,char * Vram_Address){ int Round1_Count = 0; //縦 int Round2_Count = 0; char *Vram; char Data; for(Round1_Count = 0; Round1_Count< 64; Round1_Count++){ Vram = Vram_Address + (Round1_Count * 80); for(Round2_Count = 0; Round2_Count< 8; Round2_Count++){ Data = *(Asciicode_Address + Round2_Count + (Round1_Count * 8)); *Vram = Data; Vram = Vram + 1; } } } void DidplayMessage_Small_Strings(char *Asciicode_String_Address,int String_Count,int X,int Y){ int Count; int X_Count; for(Count = 0; Count < String_Count ; Count++){ char * Asciicode_Address = Asciicode_String_Address + Count; X_Count = X + Count; DisplayMessage_Small(Asciicode_Address,X_Count,Y); } } void DisplayMessage_Small(char *Asciicode_Address,int X,int Y){ char *Fontdata_Address = (Fontdata_Base + (0x200 * 26) + (*Asciicode_Address * 16)); //*Asciicode_Address char *Vram_Address = Vram_Base_Address; Vram_Address = Vram_Address + X + (Y * 80); DisplayMessage_Small_Loop(Fontdata_Address,Vram_Address); } void DisplayMessage_Small_Loop(char *Asciicode_Address,char * Vram_Address){ int count; for(count = 0; count< 16; count++){ char Asciicode = *(Asciicode_Address + count); char *Vram = Vram_Address + (80 * count); *Vram = Asciicode; } }
DisplayMessage_Big、DisplayMessage_Big_Loop関数を追加で配置しました。
これは64×64のフォントを表示させる関数です。
main_kernel内で呼び出していないので実行されることはないです。
呼び出されないので結果はさっきのと変わらないはずと思いきや・・・
ちなみにbig関数とsmall関数の定義する順番(上下)を入れ替えたところエラーは出なくなりました。
bigとsamllのプロトタイプ宣言の上下を入れ替えたところエラーは出なくなりましたが
何故か画面に"loding please wait"が表示されませんでした。
何が原因でこのようになるのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/05 07:52 編集
2020/11/05 07:56
2020/11/05 07:59
2020/11/05 08:44
2020/11/07 15:30
2020/11/08 02:13
2020/11/08 03:09