#include #include #include #ifndef UNIX #include #include #include #endif #include "aplinks.h" #include "disp_ctr.h" #ifdef UNIX #include "stricmp.h" #include "kbhit.h" #include "getch.h" #endif #ifndef UNIX extern unsigned _stklen = (unsigned)40000L; extern unsigned _ovrbuffer = 0x0000; #endif int main(int argc, char *argv[]) { int i, j; int mode; /* 容量 128 kB -> 1, 512kB -> 5 (デフォルト値は aplinks.h 中の値 */ unsigned char *fat_buffer[FAT_SIZE_512 + 1]; unsigned char *dir_buffer[DIR_SIZE_512 + 1]; unsigned char *data_buffer[DATA_SIZE_512 + 1]; FAT_RANGE fat_range; /* FAT の範囲記憶用 */ DIR_RANGE dir_range; /* DIR エントリの範囲記憶用 */ DATA_RANGE data_range; /* DATA セクタの範囲記憶用 */ /* これらの範囲は 0 からはじまる絶対値で記憶される。 たとえば、data_range.end の値は 容量 128kB 時に 1023 になる。 これらの値は、set_mode 関数で設定される。適切に処理すれば、 実行時に容量を変化させることも可能である。容量減少時には、 捨てられてしまうセクタの内容のファイル化処理が必要。 */ int alloc_chk; /* メモリが割り当てられたセクタ数調べ */ char port_name[256]; /* 接続ポート名(デバイス名) (デフォルト値は aplinks.h 中の値 */ unsigned int bps; /* 転送速度(デフォルト値は aplinks.h 中の値) */ unsigned int sector; /* アクセス要求セクタ番号(絶対値) */ int x, y; /* 表示用汎用変数 */ int m_column, m_row; /* テキスト画面サイズ */ int loop; /* ループ制御 */ int stat; /* ポケコンからの要求調べ */ int prestat; /* ポケコンからのひとつ前の要求を憶えておく */ #if 0 int lastacc_x; /* ポケコンから最後にアクセスされたセクタの表示桁 */ int lastacc_y; /* ポケコンから最後にアクセスされたせクタの表示行 */ #endif int rmode; /* ファイル探索モード */ int mdir; /* ディレクトリ作成モード */ int timg; /* ファイル取り込みモード */ char output_dir[MAX_DIR_LEN]; int wtimes; int last_acc; char *sfile[SFILE_NUM]; char sdir[MAX_DIR_LEN]; unsigned int rewrite; cls(); title(); if(usage(argc, argv) != 0){ #ifndef UNIX fk_on(); #endif exit(0); } #ifndef UNIX fk_off(); printf("_stklen を %u に拡張しました。\n", _stklen); printf("オーバーレイ・バッファサイズ _ovrbuffer を %u に設定しました。\n", _ovrbuffer); /* c_printf(5, "改行キーを押してください。\n"); */ rewrite = (DEFAULT_REWRITE / 8); while(1){ if(kbhit() != 0){ getch(); break; } else if(rewrite == 0){ /* c_printf(2, "待ちきれな〜いっ(^^;\n"); */ delay(200); break; } rewrite--; } cls(); exec_alloc(16384); /* プログラム動作に必要なメモリを セクタに割り当てないように、 あらかじめ予約しておく */ #endif get_winsize(&m_column, &m_row); /* 30 行モード未対応 */ /* kterm 対応 */ sig_anim(chk_anim(argc, argv), m_column, m_row); title(); /* ドライブ容量設定 */ mode = chk_mode(argc, argv); xyc_printf(CAPA_X, CAPA_Y, -1, "容量 mode\n"); if(mode == 1){ xyc_printf(CAPA_X + 4, CAPA_Y, CAPA_COLOR, " 128 kB\n"); } else if(mode == 5){ xyc_printf(CAPA_X + 4, CAPA_Y, CAPA_COLOR, " 512 kB\n"); } set_mode(mode, &fat_range, &dir_range, &data_range); /* ログ表示初期化 */ if(init_displist(m_column, m_row, DEFAULT_LOGBUF_LINE, data_range) == -1){ c_fprintf(2, stderr, "alloc error!\n"); free_sector(fat_buffer, dir_buffer, data_buffer, fat_range, dir_range, data_range); close_port(); exit(0); } /* ドライブ容量設定にしたがって、セクタにメモリを確保 */ alloc_chk = init_sector(fat_buffer, dir_buffer, data_buffer, fat_range, dir_range, data_range, m_column); exec_free(); /* プログラムが動作するために予約したメモリを プログラムに解放 */ if(alloc_chk == 0){ c_fprintf(2, stderr, "セクタのためのメモリが確保できませんでした。\n"); exit(-1); } else if(alloc_chk < (data_range.end + 1)){ displist_c_printf(6, "すべてのセクタのメモリは確保できませんでしたが、続行します。\n"); displist_c_printf(6, "改行キーを押してください。\n"); rewrite = DEFAULT_REWRITE; while(1){ if(kbhit() != 0){ key_event(); break; } else if(rewrite == 0){ displist_c_printf(2, "待ちきれな〜いっ(^^;\n"); break; } rewrite--; } } /* 出力ポート設定 */ set_port_name(argc, argv, port_name); xyc_printf(PORT_X, PORT_Y, -1, "接続ポート: "); c_printf(PORT_COLOR, "%s", port_name); c_printf(-1, "\n"); /* 転送速度設定 */ chk_bps(argc, argv, &bps); xyc_printf(BPS_X, BPS_Y, -1, "通信速度 "); c_printf(BPS_COLOR, "%u", bps); c_printf(-1, " bps\n", bps); /* ポート・オープン */ if(open_port(port_name, bps) == -1){ c_fprintf(2, stderr, "接続ポート %s が開けませんでした。\n", port_name); free_sector(fat_buffer, dir_buffer, data_buffer, fat_range, dir_range, data_range); exit(-1); } /* 出力ディレクトリ設定 */ set_outdir(argc, argv, output_dir); xyc_printf(OUTD_X, OUTD_Y, -1, "出力ディレクトリ: "); c_printf(OUTD_COLOR, "%s\n", output_dir); /* 再帰下降モード設定 */ chk_recur(argc, argv, &rmode); /* 起動時ファイル取り込み時ディレクトリ作成モード設定 */ chk_makedir(argc, argv, &mdir); /* ディスクイメージ順ファイル取り込みモード設定 */ /* for MS-DOS 版、近日実装予定 */ chk_takeimg(argc, argv, &timg); #ifdef UNIX if((sfile[0] = malloc(sizeof(char)*MAX_DIR_LEN)) == NULL){ displist_c_printf(2, "ファイル取り込みのためのメモリを確保できませんでした。\n"); free_sector(fat_buffer, dir_buffer, data_buffer, fat_range, dir_range, data_range); free_displist(); xyc_printf(1, 25, -1, "\n"); exit(-1); } for(i = 1; i < argc; i++){ if(argv[i][0] == '-'){ /* 先頭が - の引数はオプション指定とみなす */ if(stricmp(argv[i], "-O") == 0){ /* -O のあとに空白があるときは */ i++; /* その次のファイル名は出力デ */ } /* ィレクトリである。 */ continue; } else if(argv[i][strlen(argv[i]) - 1] == '.'){ continue; } set_sdir_sfile(argv[i], sdir, sfile[0]); takedir(sdir, 1, sfile, fat_buffer, dir_buffer, data_buffer, fat_range, dir_range, data_range, rmode, mdir, timg); } #else /* UNIX OS でないときは、凝った取り込みを行う。 */ if(timg == ON){ /* 近日、実装予定 */ for(i = 1; i < argc; i++){ if((sfile[i - 1] = malloc(sizeof(char)*MAX_DIR_LEN)) == NULL){ displist_c_printf(2, "ディスクイメージ順取り込みのためのメモリを確保できませんでした。\n"); for(j = 1; j < argc; j++){ free(sfile[j - 1]); } free_sector(fat_buffer, dir_buffer, data_buffer, fat_range, dir_range, data_range); free_displist(); xyc_printf(1, 25, -1, "\n"); exit(-1); } } c_printf(2, "takeimg == ON is unimplement!\n"); c_printf(6, "近日、実装予定! 乞う、ご期待!(^^) From NOIKE\n\n"); for(i = 1; i < argc; i++){ free(sfile[i - 1]); } exit(0); } else{ if((sfile[0] = malloc(sizeof(char)*MAX_DIR_LEN)) == NULL){ displist_c_printf(2, "ファイル取り込みのためのメモリを確保できませんでした。\n"); free_sector(fat_buffer, dir_buffer, data_buffer, fat_range, dir_range, data_range); free_displist(); xyc_printf(1, 25, -1, "\n"); exit(-1); } for(i = 1; i < argc; i++){ if(argv[i][0] == '-'){ /*先頭が - の引数は、オプション指定とみなす */ if(stricmp(argv[i], "-O") == 0){ /* -O のあとに空白があるとき、次の引数は出力ディレクトリ */ i++; /* 出力ディレクトリを飛ばす */ } continue; } set_sdir_sfile(argv[i], sdir, sfile[0]); takedir(sdir, 1, sfile, fat_buffer, dir_buffer, data_buffer, fat_range, dir_range, data_range, rmode, mdir, timg); } } #endif /* 書き出しファイルタイムスタンプモード設定 */ chk_w_timestamp(argc, argv, &wtimes); /* disp_filelist(fat_buffer, dir_buffer, data_buffer, dir_range, DEFAULT_DELETED_SHOW, DEFAULT_UPTHISDIR_SHOW, DEFAULT_DIR_INDENT); */ loop = 1; x = 5; y = FAT_MAP_Y; prestat = -1; last_acc = 0; #ifdef UNIX init_getch(); #endif rewrite = 0; while(loop){ if(kbhit() != 0){ if((loop = key_event()) == 0){ break; } } else{ if(prestat != 0){ xyc_printf(STAT_X, STAT_Y, -1, "["); c_printf(ONLINE_COLOR, "Online"); c_printf(-1, "]\n\n"); } if((stat = nowait_get_port()) != 0){ if(last_acc != -1){ xyc_printf(x, y, ALLOC_COLOR, ".\n"); } else{ xyc_printf(x, y, BAD_COLOR, "x\n"); } } } switch(stat){ case 0: if(prestat == -1){ disp_filelist(fat_buffer, dir_buffer, data_buffer, dir_range, DEFAULT_DELETED_SHOW, DEFAULT_UPTHISDIR_SHOW, DEFAULT_DIR_INDENT); rewrite = DEFAULT_REWRITE + 1; break; } else if(prestat == 0){ #ifndef UNIX if(rewrite < DEFAULT_REWRITE){ #else if(rewrite < (DEFAULT_REWRITE * 2)){ #endif rewrite++; } #ifndef UNIX else if(rewrite == DEFAULT_REWRITE){ #else else if(rewrite == (DEFAULT_REWRITE * 2)){ #endif displist_c_printf(-1, " \n"); disp_filelist(fat_buffer, dir_buffer, data_buffer, dir_range, DEFAULT_DELETED_SHOW, DEFAULT_UPTHISDIR_SHOW, DEFAULT_DIR_INDENT); xy(LAST_X, LAST_Y); rewrite++; } } else if((prestat == 'W') || (prestat == 'R')){ rewrite = 0; } break; case 'R': /* xyc_printf(STAT_X, STAT_Y, -1, "["); c_printf(READ_COLOR, "Read "); c_printf(-1, "]"); */ sector = get_port(); /* sector low byte */ sector = (get_port() << 8) + sector;/* sector high byte */ xyc_printf(STAT_X, STAT_Y, -1, "["); c_printf(READ_COLOR, "Read "); c_printf(-1, "]"); if(sector <= fat_range.end){ x = (sector + 1 + 4); y = FAT_MAP_Y; xyc_printf(x, y, READ_COLOR, "R\n"); fflush(stdout); last_acc = put_sector(fat_buffer, sector); xyc_printf(x, y, READ_COLOR, "@\n"); } else if(sector <= dir_range.end){ x = (sector - dir_range.start + 1 + 4); y = DIR_MAP_Y; xyc_printf(x, y, READ_COLOR, "R\n"); fflush(stdout); last_acc = put_sector(dir_buffer, (sector - dir_range.start)); xyc_printf(x, y, READ_COLOR, "@\n"); } else{ x = ((sector - data_range.start) / SEC_PER_P) + 1; y = ((x - 1) / m_column) + DATA_MAP_Y + 1; x = ((x - 1) % m_column) + 1; xyc_printf(x, y, READ_COLOR, "R\n"); fflush(stdout); last_acc = put_sector(data_buffer, (sector-data_range.start)); xyc_printf(x, y, READ_COLOR, "@\n"); } break; case 'W': /* xyc_printf(STAT_X, STAT_Y, -1, "["); c_printf(WRITE_COLOR, "Write "); c_printf(-1, "]\n"); */ sector = get_port(); /* sector low byte */ sector = (get_port() << 8) + sector; /* sector high byte */ xyc_printf(STAT_X, STAT_Y, -1, "["); c_printf(WRITE_COLOR, "Write "); c_printf(-1, "]\n"); if(sector <= fat_range.end){ x = sector + 1 + 4; y = FAT_MAP_Y; xyc_printf(x, y, WRITE_COLOR, "W\n"); fflush(stdout); last_acc = get_sector(fat_buffer, sector); xyc_printf(x, y, WRITE_COLOR, "@\n"); } else if(sector <= dir_range.end){ x = sector - dir_range.start + 1 + 4; y = DIR_MAP_Y; xyc_printf(x, y, WRITE_COLOR, "W\n"); fflush(stdout); last_acc = get_sector(dir_buffer, (sector - dir_range.start)); xyc_printf(x, y, WRITE_COLOR, "@\n"); } else{ x = ((sector - data_range.start) / SEC_PER_P) + 1; y = (x - 1)/ m_column + DATA_MAP_Y + 1; x = ((x - 1) % m_column) + 1; xyc_printf(x, y, WRITE_COLOR, "W\n"); fflush(stdout); last_acc = get_sector(data_buffer, (sector-data_range.start)); xyc_printf(x, y, WRITE_COLOR, "@\n"); } break; case 'D': loop = 0; break; case 'F': bc_fprintf(2, stderr, "Sorry, not implemented, yet.\n"); break; default: displist_c_printf(2, "Sorry, Unknown protocol \'%c(%x)\'.\n", stat, stat); break; } /* セクタへの最終アクセス状態の表示(キャッシュの効果がわかる) */ switch(stat){ case 'R': xyc_printf(LAST_X, LAST_Y, READ_COLOR, "Last access sector %d ", sector); xy(LAST_X + 20, LAST_Y); break; case 'W': xyc_printf(LAST_X, LAST_Y, WRITE_COLOR, "Last access sector %d ", sector); xy(LAST_X + 20, LAST_Y); break; } prestat = stat; } xyc_printf(STAT_X, STAT_Y, -1, "["); c_printf(ONLINE_COLOR, "******"); c_printf(-1, "]\n\n"); displist_c_printf(6, "\nDisconnect.\n"); epilogue(output_dir, fat_buffer, dir_buffer, data_buffer, dir_range, wtimes); free_sector(fat_buffer, dir_buffer, data_buffer, fat_range, dir_range, data_range); displist_c_printf(5, "改行キーを押してください。\n"); rewrite = DEFAULT_REWRITE; loop = 1; while(loop){ if(kbhit() != 0){ rewrite = DEFAULT_REWRITE; switch(key_event()){ case 0x0d: case 0x0a: loop = 0; break; default: break; } } #ifndef UNIX else if(rewrite == 0){ displist_c_printf(2, "待ちきれな〜いっ(^^;\n"); break; } rewrite--; #endif } free_displist(); free_namelist(); xyc_printf(1, 25, -1, "\n"); #ifndef UNIX fk_on(); #endif #ifdef UNIX close_getch(); #endif return 0; }