ページへ戻る

+ Links

 印刷 

hideyosi​/osalink1でお勉強2 のバックアップソース(No.4) :: OSASK計画

osaskwiki:hideyosi/osalink1でお勉強2 のバックアップソース(No.4)

« Prev  Next »
*osalink1を.g01化! [#p94ff945]
-なんで?
--osalink1は簡単そうだからだ!  <絶対痛い目見るぞコイツ・・・

*メイクの流れ [#q0a09eb0]
.g01アプリはコンパイルの流れが今までと違う。こういう流れになる・・・はず。(たしか)

 hijk sjisconv sjis in:ターゲット.c out:ターゲット.ca
 28GOcc1 -I../z_tools/guigui01/  -Os -Wall -quiet -o ターゲット.gas ターゲット.ca
 hijk gas2nask -a D:4 -A in:ターゲット.gas out:ターゲット.nas
 hijk Nasuka in:ターゲット.nas out:ターゲット.obj
 hijk obj2bim rul:../z_tools/guigui01/guigui01.rul out:ターゲット.bim stack:0 map:ターゲット.map \
        rlm:ターゲット.rlm ../z_tools/guigui01/g01libc0.lib ターゲット.obj \
        ../z_tools/guigui01/g01libc1.lib
 hijk bim2g01 ターゲット.bim ターゲット.org ターゲット.rlm
 hijk tekmin0 ターゲット.org ターゲット.nho
 bim2bin -osacmp in:ターゲット.nho out:ターゲット.nh5
 hijk tekmin1 -efg01-noadc ターゲット.nh5 ターゲット.g01

まずはとにかく、Makefileをこう書き換えて、いきなりメイクしてみるwww

 include ../z_tools/command.txt

 TARGET = osalink1
 MODE   = g01
 OBJS   = $(TARGET).obj

 INCPATH    = ../z_tools/guigui01/
 include ../z_tools/com_mak.txt

*28GOcc1の段階でエラーがドバーっと! [#ebc6be65]
-#include <guigui01.h>
--まず最初。このプログラムは.g01。その意味においては、''まったく独自のOSで動くアプリ''とも言えるもの。なので、ほとんどの関数やらAPIやらは独自にコールせんといかん。そのため、このヘッダを最初にインクルードしとかんといかんわけ。
-GO1Main
--.g01アプリの最初の関数はこれになる。

 osalink1.ca: In function `G01Main':
 osalink1.ca:51: warning: implicit declaration of function `strcmp'
まずはこれ。string.hをインクルードすればOK。

 osalink1.ca:52: warning: implicit declaration of function `fprintf'
あっれぇ?guigui01には、fprintf関数がない・・・ぞ?~
うーん困ったな。解説書も見当たらないや・・・・しょうがないのでgas2naskとかsjisconvがどうやってるのか見てみよう・・・

jg01_fwrite1f_5 ←こういう命令で読み書きをしてるのが解ってきたぞ。

[[ここ>http://osask.net/w/201.html]]に手がかりがあったがすこし違う。もしかして新しくなってる?

**一旦棚上げ(毎度乙!) [#f1b254b3]
fprintfって、ファイルに書き込む命令でそ? [[こっち>http://osask.net/w/544.html]]でとりあえず読み込みがわかったので、まずは書くのは後回し(コメントアウトとかで)して、osalink1.optとかを読み込んでみよう

**再開・・・ [#tc628d7f]
まずはこういう手の表記。
 	FILE *fp0, *fp1;
.g01では''スロット''というものを使ってファイルハンドルと同じ操作をするので、これは撤廃。(当然fpとかの表記もコメントアウト)

 // OPTIONFILEの読み込みと各ファイルのサイズ取得
 	fp0 = fopen(optfile, "r");
 	if (fp0 == NULL) {
 		fprintf(stderr, "Can't open \"%s\".\n", optfile);
 		return 1;
 	}
ここでosalink1.optを開いてるよね。これを・・・・

 	// OPTIONFILEの読み込みと各ファイルのサイズ取得
 	char *buffer1 = g01_bss1a1;
 	jg01_fopen(1, 4, optfile);
 	jg01_fread0_4(2 * 1024 * 1024, buffer1);
 	if (strlen(buffer1) == 0) {
 	  g01_putstr0("Can't open optfile\n");
 	  return 1;
 	}

こういうことでいいのかな・・・

COLOR(red){ちょっと面白いこと発見。このosalink1は、元々内部コードで2MBのバッファを確保してるんだけど、これを文字列配列でやってたのよね。で、これがあると、G01Mainがまったく動かなくなっちゃうらしいww。ちゃんとmallocやg01_bss1a1で確保すると大丈夫だというwww}



g01のapiでは、''一行読み込み''はない。すでにbuffer1内に全部入っちゃってる。つーことは・・・・~
改行コードを元に、自分で配列とかを作って割ってやらないといけない・・・のかな。例えば・・・

 	//まずは改行コードを一旦統一する
 	for ( i = 0; i < strlen(buffer1); i++){
 	  //とりあえずLFに統一するか・・・
 	  if (buffer1[i] == 0x0D) buffer1[i] = 0x0A;
 	  //これで、CRが全部LFに置換されるはず。
 	}

 	//先頭にある邪魔なLFなどを排除するため、開始地点を探っておく
 	int stppoint; stppoint = 0;
 	for ( i =0; i < strlen(buffer1); i++){
 	  if ( buffer1[i] != 0x0A ){
 	    stppoint = i;
 	    break;
 	  }
 	}
 	//これでもし先頭にLFがあっても全て飛ばした位置から開始できる

 	//新しい配列変数を確保する。
 	int ii2; ii2 = 0;
 	int lfs; lfs = 0;
 	unsigned char files[strlen(buffer1)+1];
 	for ( i = stppoint; i < strlen(buffer1); i++){
 	  if ( buffer1[i] == 0x0A && buffer1[i-1] == 0x0A ){
 	    //  連続したLFだったらシカトして進める。
 	  }
 	  else {
 	    if ( buffer1[i] == 0x0A ){
 	      files[ii2] = 0;
 	      lfs++;
 	    }
 	    else {
 	      files[ii2] = buffer1[i];
 	    }
 	    ii2++;
 	    //  LFを終端コードに置換
 	  }
 	}
 	//最後に終端コードを打っておく
 	files[ii2+1] = 0;

 	//これで、0によって区切られた配列になったはず。
 	//files配列内の、0の位置を記憶する配列を用意する。
 	//厳密には0の前。行頭というべきか・・・
 	int zeropoint[lfs + 1];
 	//↑の処理で先頭は必ず行頭になってるはずなので・・・
 	zeropoint[0]=0;
 	int i3; i3 = 1;
 	for (i = 1; i < ii2 +1; i++){
 	    if (files[i] != 0 && files[i-1] == 0){
 	      //ここが行頭になるはず。位置を記憶
 	      zeropoint[i3] = i;
 	      i3++;
 	    }
 	}

 	//これで、有効な行数はi3個。lfpointが行の先頭になっているはず。

 	for ( i = 0; i < i3; i++){
 	g01_putstr0(files + zeropoint[i] );	g01_putstr0("\n");
 	}


これでどおぉぉぉだあぁぁぁ!! コンツクショー!!! (レベル低いですかそうですか・・・orz)

« Prev  Next »