サイトトップへ
OSASK.NET
  サイトトップへ       新掲示板(閉鎖済)   Wiki(凍結済)   旧掲示板(廃止済)   ニュース(廃止済)  

osalink1を.g01化! anchor.png

  • なんで?
    • osalink1は簡単そうだからだ!  <絶対痛い目見るぞコイツ・・・
Page Top

メイクの流れ anchor.png

.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
Page Top

28GOcc1の段階でエラーがドバーっと! anchor.png

  • #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 ←こういう命令で読み書きをしてるのが解ってきたぞ。

ここに手がかりがあったがすこし違う。もしかして新しくなってる?

Page Top

一旦棚上げ(毎度乙!) anchor.png

fprintfって、ファイルに書き込む命令でそ? こっちでとりあえず読み込みがわかったので、まずは書くのは後回し(コメントアウトとかで)して、osalink1.optとかを読み込んでみよう

Page Top

再開・・・ anchor.png

まずはこういう手の表記。

	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;
	}

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

ちょっと面白いこと発見。この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)

Page Top

とりあえず動いたぞ(笑 anchor.png

この辺から取れますw

あとはコマンドラインを受け取れるようにしたいんだが・・・うーん・・・・

Page Top

ダメだ。一旦固める! anchor.png

コマンドライン引数のファイルパスタイプの「規定値」がどうしてもわからん。しょうがないので、オプションファイルの指定は文字列型で受け取ってお茶を濁そう・・・

  • ・・・どうも、intタイプ以外のコマンドライン取得関数は規定値を持たない仕様らしい・・・仕方がないので自前でコードを書くか・・・
  • があぁぁぁん! testslot関数は廃止されている!?? じゃ、やっぱ、readやwriteで計るno???
  • ・・・まいったなぁ・・・g01アプリでは、ファイルをオープンしてみて、ダメならその時点でエラーっていう処理が出来ない!? ・・・・いや、そんなバカなはずは・・・
  • 確認しました。testslotは無効にされているようです(#ifdefをとれば復活できますが)。ファイルオープンに失敗したらアプリに帰らずエラーという仕様は、efg01のグローバル変数errmodを0にすればやめられるようです。その場合、エラーチェックをefgにまかせているアプリが誤動作すると思われます。 -- Sero編集 2010/02/08 19:30ごろ

一般用コメント一覧

一般用コメント欄は使用できません
トップ   凍結解除 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ
新着

目次
メンバー一覧


最新の20件
2016-10-01 2016-09-08
  • @MenuBar.
2016-09-07 2016-09-04 2016-08-15 2015-09-23 2014-07-30 2014-07-04 2014-02-04 2013-10-26 2013-06-21 2013-06-17 2013-06-15 2013-04-02 2013-02-09 2013-02-04 2012-12-25 2012-12-01 2012-05-28 2012-03-31

トピック一覧
一般用コメント最新
新掲示板lina
2016/9/5 20:58
SandBoxゲスト
2016/9/4 12:01
RecentDeletedlina
2015/6/2 19:29
Old-OSASK-MLlina
2014/6/29 9:14
hideyosi/メールhideyosi
2014/1/6 20:17
hideyosi/募集中lina
2013/11/8 19:56

このサイトは川合秀実から委託を受けて、OSASKコミュニティによって管理・運営されています。