home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 May / VPR0105A.BIN / OLS / BR98211 / br98211.lzh / BR98.CPP next >
C/C++ Source or Header  |  2001-02-05  |  147KB  |  5,568 lines

  1. //
  2. // Browser Returns for 9801
  3. // Ver2.11
  4. // Copyright (C) AsakaSoft 1999-2001
  5. //
  6. // Ver2.00 Release 2000/05/28
  7. // Ver2.10 for Network Release 2000/08/12
  8. // Ver2.11 Release 2001/02/05
  9. //
  10.  
  11. #include <stdio.h>
  12. #include <dos.h>
  13. #include <string.h>
  14. #include <jstring.h>
  15. #include <dir.h>
  16. #include <pc98.h>
  17. #include <jctype.h>
  18. #include <io.h>
  19. #include <math.h>
  20. #include <time.h>
  21. #include <stdlib.h>
  22. #include <process.h>
  23. #include <conio.h>
  24.  
  25. union REGS inregs, outregs;
  26. struct SREGS segregs;
  27.  
  28. const char apname[] = "\033[32mBrowser Returns for 9801 : Ver2.11 Rev[" __DATE__ "]  (C) AsakaSoft 1999-\033[36m2001\033[m";
  29.  
  30. //---------------------------------------------------------------------------
  31. // 宣言
  32.  
  33. enum { bufmax = 200 };
  34.  
  35. // 1対1対応
  36. typedef unsigned char uchar;
  37. typedef unsigned int uint;
  38. typedef unsigned long int ulong;
  39.  
  40. uchar* nextchar ( uchar *p );
  41.  
  42. enum { pathmax = 130 };
  43. struct fnsplit {
  44.     uchar sw;
  45.  
  46. //    uchar drive[MAXDRIVE];     // X: (3)
  47. //    uchar dir[MAXDIR];         // \dir\ (66)
  48. //    uchar name[MAXFILE];     // filename (9)
  49.     uchar ext[MAXEXT];         // .ext (5)
  50.  
  51.     uchar nhost[255]; // host"10.0.0.12:80" / drive"a:"
  52.     uchar npath[255]; // path"/~asaka/" / dir"/data/"
  53.     uchar nname[255]; // fname+ext"index.html"
  54. };
  55. int fnsplit2 ( uchar *path, struct fnsplit *fns );
  56. void fnmerge2 ( uchar *path, struct fnsplit *fns );
  57. void fnmerge3 ( uchar *path, struct fnsplit *fns );
  58. void fnmerge3slash ( uchar *path );
  59. void fnadd ( struct fnsplit *fns, uchar *fpos, uchar *name );
  60. void fn83 ( uchar *name );
  61. int fn_div ( uchar c );
  62.  
  63. const uint gseg[4] = { 0xe000, 0xa800, 0xb000, 0xb800 };
  64.  
  65. // ディスクエラー処理
  66. int err_handler(int errval,int ax,int bp,int si);
  67. FILE *fopen2(const char *filename, const char *mode);
  68.  
  69. // 設定ファイル
  70. struct inifile {
  71.     uchar isegc;
  72.     uchar gifbmpname[pathmax];
  73.     uchar jpegconvname[pathmax];
  74.     uchar pngconvname[pathmax];
  75.     uchar paletname[pathmax];
  76.     uchar imode;
  77.     uchar bmplcd;
  78.     uchar cursorspeed;
  79.  
  80.     uchar httpname[pathmax];
  81. } ini = { 0, "gifbmp", "jpg6cdb", "pngcdb", "palet.rgb", 0, 0, 8, "httpget" };
  82. uchar defpalet[48] = { 0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15 };
  83. int in_loadini ( void );
  84.  
  85. // ディレクトリ設定
  86. uchar apdir[pathmax], ininame[pathmax];
  87. uchar tempdir[pathmax];
  88. uchar tempdrive = 0;
  89. void dr_getapdir ( void );
  90. void dr_setapdir ( uchar *path );
  91. void dr_gettempdir ( void );
  92. void dr_settempdir ( uchar *path );
  93.  
  94. // USKCGM書体設定
  95. // 1Bytes全てと2BytesのABCひらがなカタカナはキャッシュ対象
  96. // 1Bytesの21~7Eとキャッシュ対象の2Bytesは書体読込対象
  97. uchar ft_anfont[256][16]; // 21-7E (4096+256)
  98. enum { ft_sw_unload = 0, ft_sw_builtin = 1, ft_sw_builtin2, ft_sw_file }; // 未読込=0 内蔵=1 別内蔵=2 ファイル=3
  99. uchar ft_answ[256];
  100. uchar ft_kjfont[3][94][32]; // 2321-237E, 2421-247E, 2521-257E (9024+282)
  101. uchar ft_onpufont[32] = {
  102.     0x00, 0x00,
  103.     0x00, 0x1e,
  104.     0x00, 0xfe,
  105.     0x07, 0xf2, //
  106.     0x07, 0x02,
  107.     0x04, 0x02,
  108.     0x04, 0x02,
  109.     0x04, 0x02, //
  110.     0x04, 0x02,
  111.     0x04, 0x02,
  112.     0x04, 0x1e,
  113.     0x04, 0x3e, //
  114.     0x3c, 0x38,
  115.     0x7c, 0x00,
  116.     0x70, 0x00,
  117.     0x00, 0x00 };
  118. uchar ft_kjsw[3][94];
  119. void ft_init ( void );
  120. void ft_getfont ( uint code, void *buf );
  121. enum { ft_ef_i = 1, ft_ef_b = 2, ft_ef_u = 4, ft_ef_s = 8, ft_ef_h = 16 }; // 斜体・太字・下線・取消線・縦縮小
  122. enum { ft_ank_1, ft_ank_2, ft_ank_1k, ft_ank_2k, ft_ank_bi1, ft_ank_bi2,
  123.     ft_kj_1an, ft_kj_2an, ft_kj_2hi, ft_kj_2ka, ft_kj_2mr, ft_kj_bi2 };
  124.  
  125. int ft_ankload ( uchar *filename, uint mode );
  126. void ft_checkank ( uint code );
  127. void ft_writeank ( uint code, uchar mode, uint x, uint y, uint ys, uint ye );
  128.  
  129. int ft_kjload ( uchar *filename, uint mode );
  130. void ft_writekj ( uint code, uchar mode, uint x, uint y, uint ys, uint ye );
  131.  
  132. enum { ft_km_auto, ft_km_sjis, ft_km_eucjp };
  133. // kmodeは参照形にしないと自動判定の結果がフィードバックされない
  134. // ft_km_autoにして呼び出すと判定結果がkmodeに戻ってくる(JISだったらautoのまま)
  135. uint ft_writestr ( uchar *str, uchar mode, uint x, uint y, uint ys, uint ye, uint &kmode );
  136. void ft_writestrs ( uchar *str, uchar *modestr, uint x, uint y, uint ys, uint ye, uint s );
  137.  
  138. // BMPファイル関連
  139. uint bm_convbmp ( uchar *convname, uchar *bmpname, uint &x, uint &y, uchar *bmpat );
  140. uint bm_convbmp2 ( uchar *convname, uchar *bmpname, uint &x, uint &y );
  141. void bm_setpixel ( uchar *buf, uint x, uint c, uchar dy );
  142. uchar bm_to15 ( uchar b, uchar g, uchar r );
  143. uint bm_writecdb ( uchar *convname, uint x, long y, uint sx, uint sy, uint ys, uint ye, uint xs, uint xe );
  144. uchar bm_pat[4][4] = {
  145. 16,  7, 14,  5,
  146.  3, 12,  1, 10,
  147. 13,  4, 15,  6,
  148.  0,  8,  2, 11 };
  149.  
  150. // Graphic BIOS関連
  151. void gb_init ( void );
  152. void gb_init2 ( void );
  153. void gb_gdcmode ( uchar m );
  154. void gb_gdctile ( uchar t );
  155. void gb_write ( uchar p );
  156. void gb_view ( uchar p );
  157. void gb_gcls ( void );
  158. void gb_gcls2 ( uint y1, uint y2 );
  159. void gb_gcls2 ( uint y1, uint y2, uint x1, uint x2 );
  160. void gb_loadrgb ( uchar* pbuf );
  161. uchar gb_sw = 0;
  162. void gb_pstart ( void );
  163. void gb_pend ( void );
  164.  
  165. // Add Ver2.10
  166. void gb_waitvsync ( void );
  167.  
  168. // GDC・描画関連(EGC対応)
  169. const uint gd_gseg[4] = { 0x0000, 0x4000, 0x8000, 0xc000 };
  170. uchar gd_is5 = 2;
  171. void gd_cmd ( uchar cmd );
  172. void gd_dat ( uchar dat );
  173. void gd_textw ( uchar dl, uchar dh );
  174. void gd_writemode ( uchar mode );
  175. void gd_csrw ( uchar plane, ulong ead, uchar dad );
  176. void gd_vecte ( void );
  177. void gd_waitdraw ( void );
  178. void gd_gline ( uint x1, uint y1, uint x2, uint y2, uchar color );
  179.  
  180. // Graphics EGC関連
  181. void eg_init ( void );
  182. void eg_color ( uchar c );
  183. uchar eg_ison = 0;
  184. void eg_on ( void );
  185. void eg_off ( void );
  186. void eg_operation ( uchar ope );
  187.  
  188. // ドライブ情報関連
  189. uchar di_daua[0x60];
  190. uchar di_noteram[2] = { 9, 9 };
  191. void di_initdaua ( void );
  192. uchar di_getdaua ( uchar drive );
  193.  
  194. // HTML変換関連
  195. uint convhtml ( uchar *cdhname, uchar *headname, uchar *htmlname, uchar &kmode, ulong &cdhx, ulong &cdhy );
  196. void convhtml2 ( FILE *cdhtmlfp, FILE *headerfp, FILE *htmlfp, ulong length, ulong *xl, uint tdepth, uint *hx, ulong *hy, uchar istext, uchar *chname );
  197.  
  198. ulong convhtmlpt[16][2];
  199. void convhtmlbar ( uchar ntable, ulong now, ulong size, uchar istext );
  200.  
  201. // フォルダ一覧補助
  202. void maketop ( uchar *buf, uchar *filename, uchar *ext, uint len );
  203.  
  204. // HTML文字効果
  205. enum { he_maxeff = 40 };
  206. struct {
  207.     uchar tag;
  208.     uchar eff;
  209. } htmleff[he_maxeff];
  210. uint neffs;
  211. void he_addeff ( uchar tag, uchar eff );
  212. uchar he_geteff ( void );
  213. void he_endeff ( uchar tag );
  214.  
  215. // HTMLテキストバッファ関連
  216. // バッファそのものは再帰不要だが、
  217. // struct txは再帰の必要がある(<li>内のtableなど)
  218. // 出力は常に1行単位
  219. uchar txbuf[100];
  220. uchar txeff[100];
  221. uchar linkto[500];
  222. uint linksx;
  223. enum { tx_align_l = 0, tx_align_c, tx_align_r };
  224. struct tx {
  225.     ulong nx, sx, ex, nl, sy; // 次行開始/現在開始/終了x / 現在テキスト幅(pixel) / 現在y
  226.     ulong maxx, maxy;
  227.     uchar linkline;
  228.     uchar align;
  229. };
  230. void tx_init ( struct tx *tx, ulong w );
  231. uint tx_nlcheck ( struct tx *tx, uchar sw );
  232. void tx_return ( struct tx *tx, FILE *cdhfp, FILE *headfp, uint yl );
  233. void tx_maxreturn ( struct tx *tx, FILE *cdhfp, FILE *headfp, uint yl, uchar sw );
  234. void tx_empreturn ( struct tx *tx, FILE *cdhfp, FILE *headfp, uint yl );
  235. void tx_setlink ( struct tx *tx, FILE *headfp, uchar *href );
  236. void tx_writelink ( struct tx *tx, FILE *headfp );
  237. void tx_addstr ( struct tx *tx, uchar ch, uchar sw, uchar eff, FILE *cdhfp, FILE *headfp, uint yl );
  238.  
  239. // CDH・HDR表示関連
  240. void writecdh ( uchar *filename, uint tx, uint sx, uint ty, uint s, long fy );
  241. void loadhdr ( uchar *filename, uchar *name, ulong &starty, ulong &maxy, uchar *title, uchar *fname );
  242. void extlink ( uchar *hdrname, uchar *hdr2name, ulong y1, ulong y2 );
  243. void getlink ( uchar *filename, uchar *linkto, uint x, ulong y );
  244. enum { titlemax = 200 };
  245.  
  246. // メイン処理
  247. void draw1 ( void );
  248. ulong tempfree = 0;
  249. void draw2 ( uchar *cdhname, long y, ulong maxy, uchar *title, uchar *fname, uchar *hdrname, uchar *hdr2name );
  250. void draw3 ( uchar *hdrname, uchar *linkto, long y, struct ip_joy &ipjoy );
  251. void makename ( uint number, uchar *cdhname, uchar *hdrname );
  252. uint inputline ( uchar *buf );
  253.  
  254. // リアルタイム処理関連
  255. int rt_sinbuf[60];
  256. void rt_init ( void );
  257. int rt_sin ( int min );
  258. int rt_cos ( int min );
  259. void rt_clock ( void );
  260.  
  261. // 入力処理関連
  262. uchar ip_joy = 4;
  263. uchar ip_mouse = 3;
  264. uint ip_joyport[4][2] = { 0, 0, 0x088, 0x08a, 0x188, 0x18a, 0x288, 0x28a };
  265. int ip_mx = 320, ip_my = 200; // カーソル座標保存
  266. uint ip_be = 0, ip_bb = 0; // カーソル座標保存
  267. uchar ip_sp[3] = { 16, 8, 4 };
  268. uchar ip_mvo = 1; // マウスカーソルがOFFになった回数
  269. struct ip_joy {
  270.     int mx;
  271.     int my;
  272.     char jx;
  273.     char jy;
  274.     char e;
  275.     char pe;
  276.     char s;
  277.     char b;
  278.     char pb;
  279.     uchar key[16];
  280. };
  281. void ip_sbout ( uchar data, uchar sw );
  282. uchar ip_sbin ( uchar sw );
  283. void ip_init ( uchar speed );
  284. void ip_structinit ( struct ip_joy &ipjoy );
  285. void ip_get ( struct ip_joy &ipjoy );
  286. void ip_mvon ( void );
  287. void ip_mvoff ( void );
  288. void ip_wmcursor ( struct ip_joy &ipjoy, uchar sw, uchar b );
  289.  
  290. // --------------------------------------------------------------------------
  291. // 主要関数
  292.  
  293. int main ( void ) {
  294. /*    struct fnsplit f;
  295.     uchar buf[250] = "";
  296.  
  297.     fnsplit2 ( *_argv, &f );
  298.     fnadd ( &f, buf, *(_argv+1) );
  299.     printf ( "sw%d host%s path%s name%s pos%s ext%s\n%s%s%s\n", f.sw, f.nhost, f.npath, f.nname, buf, f.ext, f.nhost, f.npath, f.nname );
  300.     return 0;
  301. */
  302.     printf ( "%s\n", apname );
  303.  
  304.     // 各種初期化
  305.     printf ( "    動作環境確認..." );
  306.     if ( ( peekb ( 0, 0x54c ) & 2 ) == 0 ) {
  307.         printf ( "\nグラフィックチャージャ(GRCG)を搭載していない機種では動作しません。\nPC-9801/E/F/Mは非搭載・PC-9801Uではオプションです。\n" );
  308.         getch();
  309.     }
  310.     if ( ( peekb ( 0, 0x54c ) & 4 ) == 0 ) {
  311.         printf ( "\n16色表示用VRAMを搭載していない機種では動作しません\nPC-9801/E/F/Mは非搭載・一部のPC-9801VF/VMではオプションです。\n" );
  312.         getch();
  313.     }
  314.     printf ( "\r    動作環境確認...完了\n" );
  315.     printf ( "    設定読込準備..." );
  316.     harderr ( err_handler );
  317.     ft_init ();
  318.     rt_init ();
  319.     gb_init ();
  320.     di_initdaua ();
  321.     dr_getapdir ();
  322.     dr_gettempdir ();
  323.     printf ( "完了\n" );
  324.     printf ( "    BR98ディレクトリ %s\n", apdir );
  325.     printf ( "    作業ディレクトリ %s\n", tempdir );
  326.     printf ( "    設定ファイル %s...\n", ininame );
  327.     in_loadini ();
  328.  
  329.     // in_loadiniの後に行う初期化
  330.     if ( ini.isegc > 0 ) eg_init ();
  331.     gb_init2 ();
  332.     ip_init( ini.cursorspeed );
  333.  
  334.     switch ( ip_mouse ) {
  335.     case 2:
  336.         printf ( "    MS規格マウスドライバ使用\n" );
  337.         break;
  338.     case 1:
  339.         printf ( "    NEC規格マウスドライバ使用\n" );
  340.         break;
  341.     default:
  342.         printf ( "    マウスの使用にはMOUSE.SYSかMOUSE.COMが必要です\n" );
  343.         break;
  344.     }
  345.  
  346.  
  347.     long i, j, backi = 0;
  348.     ulong hx, hy;
  349.     uchar b[200], b2[200], cdhn[pathmax], hdrn[pathmax], b3[pathmax], hdrn2[pathmax];
  350.     struct fnsplit f;
  351.     uchar kmode, a;
  352.     uchar ti[titlemax] = "", fn[pathmax] = "", lt[200] = "";
  353.     ulong sy, my;
  354.     struct ip_joy joy;
  355.     struct time timep, timep2;
  356.     uint k, nowf = 0;
  357.     dfree dfr;
  358.     uchar isb = 0;
  359.  
  360.     ip_structinit ( joy );
  361.     gettime ( &timep );
  362.     timep2 = timep;
  363.  
  364.     strcpy ( hdrn2, "$temp.hd2" );
  365.     dr_settempdir ( hdrn2 );
  366.  
  367.     b[0] = getdisk() + 'A';
  368.     b[1] = ':';
  369.     b[2] = '\\';
  370.     b[3] = '\0';
  371.     getcurdir ( 0, b + 3 );
  372.     i = strlen ( b );
  373.     if ( i > 3 ) {
  374.         b[i] = '\\';
  375.         b[i+1] = '\0';
  376.     }
  377.     fnsplit2 ( b, &f );
  378.     fnadd ( &f, b2, "./" );
  379.     fnadd ( &f, b2, *(_argv+1) );
  380.     fnmerge2 ( b, &f );
  381.     printf ( "%s : %s\n", b, b2 );
  382.     a = 2;
  383.  
  384.     printf ( "\033[2J\033[>3h\033[>1h\033[>5h\r" );
  385.  
  386.     kmode = ft_km_auto;
  387.     do {
  388.         if ( a == 2 ) {
  389.             gb_pstart ();
  390.             draw1 ();
  391.             gb_pend ();
  392.             gb_pstart ();
  393.             draw1 ();
  394.             gb_pend ();
  395.  
  396.             makename ( nowf, cdhn, hdrn );
  397.             remove ( cdhn );
  398.             remove ( hdrn );
  399. /*            if ( convhtml ( cdhn, hdrn, b, kmode, hx, hy ) == 2 ) {
  400.                 strcat ( b, "\\" );
  401. */
  402.                 convhtml ( cdhn, hdrn, b, kmode, hx, hy );
  403. /*            }
  404. */
  405.  
  406.             rt_clock ();
  407.             i = 0;
  408.             ti[0] = fn[0] = '\0';
  409.             loadhdr ( hdrn, b2, sy, my, ti, fn );
  410.             i = sy;
  411.             getdfree ( tempdrive, &dfr );
  412.             tempfree = (ulong)dfr.df_avail * (ulong)dfr.df_sclus * (ulong)dfr.df_bsec;
  413.         }
  414.         gb_pstart ();
  415.         draw2 ( cdhn, i, my, ti, fn, hdrn, hdrn2 );
  416.         gb_pend ();
  417.         a = 0;
  418. //        ip_mvon ();
  419.         ip_wmcursor ( joy, 1, isb );
  420.         while ( a == 0 ) {
  421.             draw3 ( hdrn2, lt, i, joy );
  422.             if ( lt[0] != '\0' ) isb = 1; else isb = 0;
  423.             ip_wmcursor ( joy, 0, isb );
  424.             if ( joy.pe > 0 ) {
  425.                 if ( joy.my >= 380 ) {
  426.                     // ファンクションキー
  427.                     k = joy.mx & 63;
  428.                     if ( ( k >= 8 ) && ( k <= 55 ) ) {
  429.                         k = joy.mx / 64;
  430.                         switch ( k ) {
  431.                         case 0:
  432.                             joy.e = joy.pe = -1;
  433.                             joy.key[12] |= 4;
  434.                             break;
  435.                         case 1:
  436.                             joy.key[12] |= 8;
  437.                             break;
  438.                         case 2:
  439.                             joy.key[12] |= 16;
  440.                             break;
  441.                         case 3:
  442.                             joy.key[12] |= 32;
  443.                             break;
  444.                         case 4:
  445.                             joy.key[12] |= 64;
  446.                             joy.b = joy.pb = 1;
  447.                             break;
  448.                         case 5:
  449.                             joy.key[12] |= 128;
  450.                             break;
  451.                         case 6:
  452.                             joy.key[13] |= 1;
  453.                             break;
  454.                         case 7:
  455.                             joy.key[13] |= 2;
  456.                             break;
  457.                         case 8:
  458.                             joy.key[13] |= 4;
  459.                             break;
  460.                         case 9:
  461.                             joy.key[13] |= 8;
  462.                             break;
  463.                         }
  464.                     }
  465.                 } else if ( joy.mx < 15 ) {
  466.                     if ( ( joy.my >= 42 ) && ( joy.my <= 357 ) ) {
  467.                         // スクロールバー
  468.                         i += ( (long)joy.my - 200 ) * 2;
  469.                         a = 1;
  470.                     }
  471.                 } else if ( lt[0] != '\0' ) {
  472.                     // リンク
  473.                     fnsplit2 ( b, &f );
  474.                     fnadd ( &f, b2, lt );
  475.                     fnmerge2 ( b, &f );
  476.                     nowf++;
  477.                     backi = i;
  478.                     makename ( nowf, cdhn, hdrn );
  479.                     kmode = ft_km_auto;
  480.                     a = 2;
  481.                 }
  482.             }
  483.             if ( joy.e > 0 ) {
  484.                 if ( joy.mx >= 627 ) {
  485.                     if ( ( joy.my >= 42 ) && ( joy.my <= 357 ) ) {
  486.                         // ゲージ
  487.                         i = ( (long)joy.my - 42 ) * my / 316 - 158;
  488.                         a = 1;
  489.                     }
  490.                 }
  491.             }
  492.             if ( joy.pb > 0 ) {
  493.                 // 前ファイルに戻る
  494.                 if ( nowf > 0 ) {
  495.                     nowf--;
  496.                     makename ( nowf, cdhn, hdrn );
  497.                     ti[0] = fn[0] = '\0';
  498.                     loadhdr ( hdrn, b2, sy, my, ti, fn );
  499.                     strcpy ( b, fn );
  500.                     b2[0] = '\0';
  501.                     i = backi;
  502.                     backi = 0;
  503.                     if ( i == 0 ) i = sy;
  504.                     a = 1;
  505.                 }
  506.             }
  507.             if ( joy.key[6] & 64 ) {
  508.                 // ROLL UP
  509.                 if ( joy.key[14] & 1 ) i += 150; else i += 300;
  510.                 a = 1;
  511.             }
  512.             if ( joy.key[6] & 128 ) {
  513.                 // ROLL DOWN
  514.                 if ( joy.key[14] & 1 ) i -= 150; else i -= 300;
  515.                 a = 1;
  516.             }
  517.             if ( ( joy.my == 399 ) && ( joy.jy > 0 ) ) {
  518.                 // 下端で↓
  519.                 i += 40;
  520.                 a = 1;
  521.             }
  522.             if ( ( joy.my == 0 ) && ( joy.jy < 0 ) ) {
  523.                 // 上端で↑
  524.                 i -= 40;
  525.                 a = 1;
  526.             }
  527.             if ( joy.key[13] & 2 ) {
  528.                 // F8
  529.                 fnsplit2 ( b, &f );
  530.                 fnadd ( &f, b2, ".\\" );
  531.                 fnmerge2 ( b, &f );
  532.                 nowf++;
  533.                 backi = i;
  534.                 makename ( nowf, cdhn, hdrn );
  535.                 kmode = ft_km_auto;
  536.                 a = 2;
  537.             }
  538.             if ( joy.key[13] & 1 ) {
  539.                 // F7
  540.                 i = my - 357 + 42;
  541.                 a = 1;
  542.             }
  543.             if ( joy.key[12] & 128 ) {
  544.                 // F6
  545.                 i = 0;
  546.                 a = 1;
  547.             }
  548.             if ( joy.key[12] & 32 ) {
  549.                 // F4
  550. //                ip_mvoff ();
  551.                 ip_wmcursor ( joy, 2, isb );
  552.                 b3[0] = '\0';
  553.                 k = inputline ( b3 );
  554.                 printf ( "\033[19;1H%-79.79s\033[3;1H\r", "" );
  555.                 if ( k == 0 ) {
  556.                     fnsplit2 ( b, &f );
  557.                     fnadd ( &f, b2, b3 );
  558.                     fnmerge2 ( b, &f );
  559.                     nowf++;
  560.                     backi = i;
  561.                     makename ( nowf, cdhn, hdrn );
  562.                     kmode = ft_km_auto;
  563.                     a = 2;
  564.                 } else ip_be = -1;
  565. //                ip_mvon ();
  566.                 ip_wmcursor ( joy, 1, isb );
  567.             }
  568.             if ( i > (long)my - 357 + 42 ) {
  569.                 // 下オーバー
  570.                 i = my - 357 + 42;
  571.             }
  572.             if ( i < 0 ) {
  573.                 // 上オーバー
  574.                 i = 0;
  575.             }
  576.             if ( joy.key[12] & 8 ) {
  577.                 // F2
  578.                 kmode = ft_km_sjis;
  579.                 a = 2;
  580.             }
  581.             if ( joy.key[12] & 16 ) {
  582.                 // F3
  583.                 kmode = ft_km_eucjp;
  584.                 a = 2;
  585.             }
  586.             if ( joy.pe < 0 ) a = 1;
  587.             if ( a == 0 ) {
  588.                 gettime ( &timep2 );
  589.                 if ( timep.ti_sec != timep2.ti_sec ) {
  590.                     timep = timep2;
  591. //                    ip_mvoff ();
  592.                     ip_wmcursor ( joy, 2, isb );
  593.                     rt_clock ();
  594. //                    ip_mvon ();
  595.                     ip_wmcursor ( joy, 1, isb );
  596.                 }
  597.             }
  598.         }
  599.         ip_wmcursor ( joy, 2, isb );
  600. //        ip_mvoff ();
  601.     } while ( joy.e >= 0 );
  602.     gb_write ( 1 );
  603.     gb_gcls();
  604.     gb_write ( 0 );
  605.     gb_gcls();
  606.     printf ( "\033[2J\033[>3l\033[>1l\033[>5l\r" );
  607.     printf ( "%s\n作業ファイルを消去しています...\r", apname );
  608.  
  609.     strcpy ( b2, "$*.*" );
  610.     dr_settempdir ( b2 );
  611.     sprintf ( b, "del %s", b2 );
  612.     system ( b );
  613.     printf ( "作業ファイルを消去しています...完了\n" );
  614.  
  615. //printf ( "gd_is5 %u\n", gd_is5 );
  616.     return ( 0 );
  617. }
  618.  
  619. //---------------------------------------------------------------------------
  620. // 共通関数
  621.  
  622. uchar* nextchar ( uchar *p ) {
  623.     if ( iskanji ( *p ) ) return ( p + 2 );
  624.     else return ( p + 1 );
  625. }
  626.  
  627. int fnsplit2 ( uchar *path, struct fnsplit *fns ) {
  628.     // 相対パスでの呼び出しは誤動作の原因
  629.  
  630. /*
  631.     // フォルダ名・ファイル名ともに8.3化処理が必要
  632.  
  633.     // pはpath(長いファイル名)上を動く
  634.     // p2はpathの名前開始点
  635.     // qはbuf(短いファイル名)上の書き込み点
  636.     uchar *p, *p2, *q;
  637.     uchar buf[pathmax] = "";
  638.     int i;
  639.  
  640.     if ( strnicmp ( "http://", path, 7 ) == 0 ) {
  641.         fns->sw = 1;
  642.         p = path + 7;
  643.         while ( *p != '\0' ) {
  644.             switch ( *p ) {
  645.             case '/':
  646.                 p2 = p + 1;
  647.                 *p2 = '\0';
  648.                 strcpy ( fns->nhost, path+7 );
  649.                 strcpy ( fns->npath, *p2 );
  650.                 *p2 = '/';
  651.                 return ( 0 );
  652.                 break;
  653.             }
  654.             p = nextchar ( p );
  655.         }
  656.         strcpy ( fns->nhost, path+7 );
  657.         return ( 0 );
  658.     }
  659.     fns->sw = 0;
  660.  
  661.     p = p2 = path;
  662.     q = buf;
  663.     while ( *p != '\0' ) {
  664.         switch ( *p ) {
  665.         case '\\':
  666.         case '/':
  667.             *p = '\0';
  668.             strcpy ( q, p2 );
  669.             *p = '\\';
  670.             fn83 ( q );
  671.             while ( *q != '\0' ) q++;
  672.             *q = '\\';
  673.             q++;
  674.             *q = '\0';
  675.             p2 = p + 1;
  676.             break;
  677.         case ':':
  678.             *p = '\0';
  679.             strcat ( q, p2 );
  680.             *p = ':';
  681.             while ( *q != '\0' ) q++;
  682.             *q = ':';
  683.             q++;
  684.             *q = '\0';
  685.             p2 = p + 1;
  686.             break;
  687.         }
  688.         p = nextchar ( p );
  689.     }
  690.     strcpy ( q, p2 );
  691.     fn83 ( q );
  692. */
  693. /*
  694.     p = buf;
  695.     q = NULL;
  696.     while ( *p != '\0' ) {
  697.         if ( ( *p == '\\' ) || ( *p == ':' ) ) q = p + 1;
  698.         p++;
  699.     }
  700.     if ( q != NULL ) {
  701.         fn83 ( q );
  702.     }
  703. */
  704. /*
  705.     return ( fnsplit ( buf, fns->drive, fns->dir, fns->name, fns->ext ) );
  706. */
  707.     uchar buf[255] = "";
  708.  
  709.     fnadd ( fns, buf, path );
  710.     return 0;
  711. }
  712.  
  713. void fnmerge2 ( uchar *path, struct fnsplit *fns ) {
  714. //    if ( fns->sw == 0 ) fnmerge ( path, fns->drive, fns->dir, fns->name, fns->ext );
  715. //    else sprintf ( path, "http://%s%s%s%s", fns->nhost, fns->npath, fns->nname, fns->nopt );
  716.  
  717.     // .extは読み取り専用として使う→getapdirは独自処理に変更
  718.  
  719.     uchar buf[500];
  720.     sprintf ( buf, "%s%s%s", fns->nhost, fns->npath, fns->nname );
  721.     if ( fns->sw ) sprintf ( path, "http://%s",buf );
  722.     else strcpy ( path, buf );
  723. }
  724.  
  725. void fnmerge3 ( uchar *path, struct fnsplit *fns ) {
  726.     // URLから作業ファイル名を作る
  727.     // table内のことを考えるとキャッシュが必要
  728.  
  729.     // 画面表示があるため呼出場所に注意
  730.     enum { bufmax = 300 };
  731.     uchar buf[500], buf2[bufmax], p[pathmax], buf3[500];
  732.     FILE *tp;
  733.     int i;
  734.     ulong l;
  735.  
  736.     fnmerge2 ( buf, fns );
  737.     if ( fns->sw ) {
  738.         path[0] = '\0';
  739.         l = 0;
  740.         strcpy ( p, "$temp.net" );
  741.         dr_settempdir ( p );
  742.         tp = fopen2 ( p, "r" );
  743.         if ( tp != NULL ) {
  744.             while ( !feof ( tp ) ) {
  745.                 buf2[0] = '\0';
  746.                 fgets ( buf2, bufmax, tp );
  747.                 if ( buf2[0] == '\0' ) break;
  748.                 i = strlen ( buf2 );
  749.                 if ( buf2[i-1] == '\n' ) buf2[i-1] = '\0';
  750.                 if ( stricmp ( buf, buf2 ) == 0 ) {
  751.                     fgets ( buf2, bufmax, tp );
  752.                     i = strlen ( buf2 );
  753.                     if ( buf2[i-1] == '\n' ) buf2[i-1] = '\0';
  754.                     strcpy ( path, buf2 );
  755.                     fclose ( tp );
  756.                     fnmerge3slash ( path );
  757.                     return;
  758.                 } else fgets ( buf2, bufmax, tp );
  759.                 l++;
  760.             }
  761.             // まだキャッシュされていない場合
  762.             fclose ( tp );
  763.         }
  764.         // $temp.netがない場合も同様
  765.         if ( fns->ext[0] == '\0' ) sprintf ( buf2, "$net%lu.htm", l);
  766.         else sprintf ( buf2, "$net%lu%s", l, fns->ext );
  767.         dr_settempdir ( buf2 );
  768.         remove ( buf2 );
  769.         sprintf ( buf3, "%s %s %s", ini.httpname, buf2, buf );
  770.         system ( buf3 );
  771.         strcpy ( path, buf2 );
  772.         tp = fopen2 ( buf2, "rb" );
  773.         if ( tp != NULL ) {
  774.             fclose ( tp );
  775.             tp = fopen2 ( p, "a" );
  776.             if ( tp != NULL ) {
  777.                 fprintf ( tp, "%s\n%s\n", buf, buf2 );
  778.                 fclose ( tp );
  779.             }
  780.         }
  781.     } else strcpy ( path, buf );
  782.     fnmerge3slash ( path );
  783. }
  784.  
  785. void fnmerge3slash ( uchar *path ) {
  786.     uchar *p;
  787.     p = path;
  788.     while ( *p != '\0' ) {
  789.         if ( *p == '/' ) *p = '\\';
  790.         p = nextchar ( p );
  791.     }
  792. }
  793.  
  794. void fnadd ( struct fnsplit *fns, uchar *fpos, uchar *name ) {
  795. /*    uchar *p;
  796.     uchar *q;
  797.     uchar *q2;
  798.     uchar *r;
  799.     uchar *r2;
  800.     uchar f = 0;
  801.     uchar fn[pathmax]; // ファイル名と拡張子を一括格納
  802.     uchar p2[pathmax];
  803. */
  804. /* URLも処理できるようになった
  805.     if ( strnicmp ( name, "http:", 5 ) == 0 ) {
  806.         fns->drive[0] = fns->dir[0] = fns->name[0] = fns->ext[0] = '\0';
  807.         return;
  808.     }
  809. */
  810. /*    fpos[0] = fn[0] = '\0'; // 現在の位置は無条件に破棄できる
  811.     p = name;
  812.     f = 0;
  813.     while ( *p != '\0' ) {
  814.         q = p;
  815.         if ( f == 0 ) {
  816.             while ( ( *q != '\0' ) && ( *q != '\\' ) && ( *q != '/' ) && ( *q != '#' ) ) {
  817.                 q = nextchar ( q );
  818.             }
  819.         } else {
  820.             while ( *q != '\0' ) {
  821.                 q = nextchar ( q );
  822.             }
  823.         }
  824.         if ( ( *(p+1) == ':' ) && ( p == name ) ) {
  825.             // ドライブ変更
  826.             fns->drive[0] = *p;
  827.             fns->dir[0] = '\\';
  828.             fns->dir[1] = '\0';
  829.             // ディスクが入っていないなどの場合はとりあえずrootにすべきなのかも
  830.             if ( *p <= 'Z' ) getcurdir ( *p - 'A' + 1, ( fns->dir ) + 1 );
  831.             else getcurdir ( *p - 'a' + 1, ( fns->dir ) + 1 );
  832.             fns->name[0] = fn[0] = fns->ext[0] = '\0'; // フォルダ指定ということはファイル名が消える
  833.             p += 2;
  834.             continue;
  835.         }
  836.         switch ( *q ) {
  837.         case '\0':
  838.             if ( f == 0 ) {
  839.                 // ファイル名
  840.                 // 8.3化処理が必要
  841.                 strcpy ( fn, p );
  842.                 fn83 ( fn );
  843.             } else {
  844.                 // 位置
  845.                 strcpy ( fpos, p );
  846.             }
  847.             break;
  848.         case '#':
  849.             // ファイル名
  850.             f = 1;
  851.             *q = '\0';
  852.             strcpy ( fn, p );
  853.             *q = '#';
  854.             break;
  855.         case '\\':
  856.         case '/':
  857.             // フォルダ名
  858.             // 8.3化処理が必要
  859.             *q = '\0';
  860.             fns->name[0] = fn[0] = fns->ext[0] = '\0'; // フォルダ指定ということはファイル名が消える
  861.             if ( *p == '\0' ) {
  862.                 // root
  863.                 strcpy ( fns->dir, "\\" );
  864.                 *q = '\\';
  865.                 break;
  866.             }
  867.             if ( *p == '.' ) {
  868.                 if ( *(p+1) == '.' ) {
  869.                     if ( *(p+2) == '\0' ) {
  870.                         // Up dir
  871.                         q2 = fns->dir, r = r2 = fns->dir;
  872.                         while ( *q2 != '\0' ) {
  873.                             q2 = nextchar ( q2 );
  874.                             if ( *q2 == '\\' ) {
  875.                                 r2 = r;
  876.                                 r = q2;
  877.                             }
  878.                         }
  879.                         *(r2+1) = '\0';
  880.                         *q = '\\';
  881.                         break;
  882.                     }
  883.                 } else if ( *(p+1) == '\0' ) {
  884.                     // Current dir
  885.                     // 移動不要
  886.                     *q = '\\';
  887.                     break;
  888.                 }
  889.             }
  890.             // Down dir
  891.             strcpy ( p2, p );
  892.             if ( *p != '.' ) fn83 ( p2 ); // ..などは変換しない
  893.             strcat ( fns->dir, p2 );
  894.             strcat ( fns->dir, "\\" );
  895.             *q = '\\';
  896.             break;
  897.         }
  898.         p = q + 1;
  899.         if ( *q == '\0' ) break;
  900.     }
  901.     if ( fn[0] != '\0' ) {
  902.         // ファイル名と拡張子を分割
  903.         q = fn;
  904.         while ( ( *q != '\0' ) && ( *q != '.' ) ) {
  905.             q = nextchar ( q );
  906.         }
  907.         if ( *q == '\0' ) {
  908.             strncpy ( fns->name, fn, 8 );
  909.             fns->name[8] = '\0';
  910.         } else {
  911.             strncpy ( fns->ext, q, 4 ); // extは点を含む
  912.             fns->ext[4] = '\0';
  913.             *q = '\0';
  914.             strncpy ( fns->name, fn, 8 );
  915.             fns->name[8] = '\0';
  916.         }
  917.     }
  918.  
  919.     // ディスクの入っていないドライブを指定すると
  920.     // DOSのエラー処理に入ってしまう
  921. */
  922.     // file://の記載を不許可として、\\と/を同一視すれば
  923.     // a:\data\index.htmlはa:/data/index.htmlとなり、
  924.     // host = a: / path = /data/ / name = index.html と容易に分けられる
  925.  
  926.     uint np = 0; // 1=次host 0=次path
  927.     uchar *ip;
  928.     uchar *bp;
  929.     uchar *ap;
  930.     uchar *b2p;
  931.     uchar *sp;
  932.     int i;
  933.  
  934.     // 初期化
  935.     fpos[0] = '\0';
  936.  
  937.     // 先に#を判定
  938.     ip = name;
  939.     sp = NULL;
  940.     while ( *ip != '\0' ) {
  941.         if ( *ip == '#' ) {
  942.             sp = ip;
  943.             strcpy ( fpos, nextchar ( sp ) );
  944.             *sp = '\0';
  945.         }
  946.         ip = nextchar ( ip );
  947.     }
  948.  
  949.     // 先頭特有の判定
  950.     ip = name;
  951.     if ( strnicmp ( name, "http://", 7 ) == 0 ) {
  952.         // 絶対URL
  953.         fns->sw = 1;
  954.         np = 1;
  955.         ip = name + 7;
  956.         fns->nhost[0] = fns->npath[1] = fns->nname[0] = '\0';
  957.         fns->npath[0] = '/';
  958.     } else if ( fn_div ( name[0] ) ) {
  959.         // ルート
  960.         np = 0;
  961.         ip = name + 1;
  962.         fns->npath[1] = fns->nname[0] = '\0';
  963.         fns->npath[0] = '/';
  964.     } else if ( ( name[1] == ':' ) && ( isalpha ( name[0] ) ) ) {
  965.         // ローカルドライブ(ドライブ指定は先頭でしか許容しない)
  966.         // カレントディレクトリの調査はせず、ルート基点に固定
  967.         fns->sw = 0;
  968.         fns->nhost[0] = name[0];
  969.         fns->nhost[1] = name[1];
  970.         fns->nhost[2] = '\0'; // "X:"
  971.         np = 0;
  972.         ip = name + 2;
  973.         if ( fn_div ( name[2] ) ) ip++;
  974.         fns->npath[1] = fns->nname[0] = '\0';
  975.         fns->npath[0] = '/';
  976.     }
  977.  
  978.     bp = ip;
  979.     while ( *ip != '\0' ) {
  980.         if ( fn_div ( *ip ) ) {
  981.             if ( np ) {
  982.                 // ここまでホスト名
  983.                 *ip = '\0';
  984.                 strcpy ( fns->nhost, bp );
  985.                 *ip = '/';
  986.                 np = 0;
  987.             } else {
  988.                 // ここまでフォルダ名
  989.                 *ip = '\0';
  990.                 if ( strcmp ( bp, ".." ) == 0 ) {
  991.                     // 親
  992.                     if ( strcmp ( fns->npath, "/" ) != 0 ) {
  993.                         ap = fns->npath;
  994.                         bp = b2p = NULL;
  995.                         while ( *ap != '\0' ) {
  996.                             if ( *ap == '/' ) {
  997.                                 b2p = bp;
  998.                                 bp = ap + 1;
  999.                             }
  1000.                             ap++;
  1001.                         }
  1002.                         if ( b2p != NULL ) *b2p = '\0';
  1003.                     }
  1004.                 } else if ( strcmp ( bp, "." ) != 0 ) {
  1005.                     strcat ( fns->npath, bp );
  1006.                     strcat ( fns->npath, "/" );
  1007.                 }
  1008.                 *ip = '/';
  1009.                 fns->nname[0] = '\0';
  1010.             }
  1011.             bp = nextchar ( ip );
  1012.         }
  1013.         ip = nextchar ( ip );
  1014.     }
  1015.     if ( bp != ip ) {
  1016.         // 最後に何かあった
  1017.         if ( np ) {
  1018.             // ホスト名しかなかった
  1019.             strcpy ( fns->nhost, bp );
  1020.         } else {
  1021.             // ファイル名などである
  1022.  
  1023.             // 途中
  1024.             strcpy ( fns->nname, bp );
  1025.         }
  1026.     }
  1027.  
  1028.     // 最後に判定用の3文字拡張子も作る(.xxx) ?対応
  1029.     ip = fns->nname;
  1030.     bp = NULL;
  1031.     while ( ( *ip != '\0' ) && ( *ip != '?' ) ) {
  1032.         if ( *ip == '.' ) bp = ip;
  1033.         ip++;
  1034.     }
  1035.     i = 0;
  1036.     if ( bp != NULL ) {
  1037.         ip = bp;
  1038.         for ( i = 0 ; i < 4 ; i++ ) {
  1039.             if ( ( *ip == '\0' ) && ( *ip == '?' ) ) break;
  1040.             fns->ext[i] = *ip;
  1041.             ip++;
  1042.         }
  1043.     }
  1044.     fns->ext[i] = '\0';
  1045.  
  1046.     if ( sp != NULL ) *sp = '#';
  1047. }
  1048.  
  1049. void fn83 ( uchar *name ) {
  1050.     // 長いファイル名が入ってくる
  1051.     // 前後によけいなものが来てはいけない
  1052.     uchar fname[9] = "";
  1053.     uchar fext[3] = "";
  1054.     uchar *p = name;
  1055.     uint i;
  1056.     i = 0;
  1057.     while ( ( *p != '\0' ) && ( *p != '.' ) ) {
  1058.         if ( iskanji ( *p ) ) {
  1059.             if ( i < 7 ) {
  1060.                 fname[i] = *p;
  1061.                 fname[i+1] = *(p+1);
  1062.                 fname[i+2] = '\0';
  1063.                 i+=2;
  1064.             }
  1065.             p+=2;
  1066.         } else {
  1067.             if ( ( i < 8 ) && ( *p != ' ' ) ) {
  1068.                 fname[i] = *p;
  1069.                 fname[i+1] = '\0';
  1070.                 i++;
  1071.             }
  1072.             p++;
  1073.         }
  1074.     }
  1075.     if ( *p == '.' ) {
  1076.         p++;
  1077.         i = 0;
  1078.         while ( *p != '\0' ) {
  1079.             if ( *p == '.' ) {
  1080.                 // .tar.gzなどは.gzにする
  1081.                 i = 0;
  1082.                 p++;
  1083.             } else if ( iskanji ( *p ) ) {
  1084.                 if ( i < 2 ) {
  1085.                     fext[i] = *p;
  1086.                     fext[i+1] = *(p+1);
  1087.                     fext[i+2] = '\0';
  1088.                     i+=2;
  1089.                 }
  1090.                 p+=2;
  1091.             } else {
  1092.                 if ( ( i < 3 ) && ( *p != ' ' ) ) {
  1093.                     fext[i] = *p;
  1094.                     fext[i+1] = '\0';
  1095.                     i++;
  1096.                 }
  1097.                 p++;
  1098.             }
  1099.         }
  1100.         sprintf ( name, "%s.%s", fname, fext );
  1101.     } else {
  1102.         strcpy ( name, fname );
  1103.     }
  1104. }
  1105.  
  1106. int fn_div ( uchar c ) {
  1107.     return ( ( c == '\\' ) || ( c == '/' ) );
  1108. }
  1109.  
  1110. //---------------------------------------------------------------------------
  1111. // 関数内容
  1112.  
  1113. #pragma warn -par
  1114. int err_handler(int errval,int ax,int bp,int si) {
  1115.     hardretn ( 0 );
  1116.     return ( 0 );
  1117. }
  1118. #pragma warn +par
  1119.  
  1120. FILE *fopen2(const char *filename, const char *mode) {
  1121.     FILE *fp;
  1122.     uchar c;
  1123.  
  1124.     fp = fopen ( filename, mode );
  1125.     if ( mode[0] != 'r' ) return fp; // 書き込み時は追加検査なし
  1126.  
  1127.     if ( fp == NULL ) return NULL;
  1128.     if ( fread ( ( void * )&c, 1, 1, fp ) == 0 ) {
  1129.         fclose ( fp );
  1130.         return NULL;
  1131.     }
  1132.     ungetc ( c, fp );
  1133.     return fp;
  1134. }
  1135.  
  1136. int in_loadini ( void ) {
  1137.     FILE *fp;
  1138.     uchar buf[bufmax*2]; // pの場所で~展開をするため大きめに
  1139.     uchar *p;
  1140.     uint i;
  1141.     FILE *palfp;
  1142.     uchar pal[48];
  1143.  
  1144.     fp = fopen2 ( ininame, "r" );
  1145.     if ( fp == NULL ) return ( 1 );
  1146.     while ( !feof ( fp ) ) {
  1147.         buf[0] = '\0';
  1148.         fgets ( buf, bufmax, fp );
  1149.         i = strlen ( buf );
  1150.         if ( i > 0 ) if ( buf[i-1] == '\n' ) buf[i-1] = '\0'; // 最後のReturnを除去
  1151.         if ( ( buf[0] != '\0' ) && ( buf[0] != ';' ) ) { // ;で始まるならコメント
  1152.             p = jstrchr ( buf, '=' );
  1153.             if ( p != NULL ) {
  1154.                 *p = '\0';
  1155.                 p++;
  1156.  
  1157.                 if ( stricmp ( buf, "isegc" ) == 0 ) {
  1158.                     if ( sscanf ( p, "%u", &i ) > 0 ) {
  1159.                         if ( i < 3 ) {
  1160.                             printf ( "      EGC使用 : " );
  1161.                             switch ( i ) {
  1162.                             case 2:
  1163.                                 if ( peekb ( 0, 0x54d ) & 64 ) {
  1164.                                     printf ( "自動...検出しました\n" );
  1165.                                     ini.isegc = 1;
  1166.                                 } else {
  1167.                                     printf ( "自動...検出されませんでした\n" );
  1168.                                     ini.isegc = 0;
  1169.                                 }
  1170.                                 break;
  1171.                             case 1:
  1172.                                 printf ( "する\n" );
  1173.                                 ini.isegc = 1;
  1174.                                 break;
  1175.                             case 0:
  1176.                             default:
  1177.                                 printf ( "しない\n" );
  1178.                                 ini.isegc = 0;
  1179.                                 break;
  1180.                             }
  1181.                         }
  1182.                     }
  1183.                 }
  1184.                 if ( stricmp ( buf, "isgdc5" ) == 0 ) {
  1185.                     if ( sscanf ( p, "%u", &i ) > 0 ) {
  1186.                         if ( i < 3 ) {
  1187.                             printf ( "      GDCクロック : " );
  1188.                             switch ( i ) {
  1189.                             case 2:
  1190.                                 printf ( "自動検出\n" );
  1191.                                 gd_is5 = 2;
  1192.                                 break;
  1193.                             case 1:
  1194.                                 printf ( "5MHz\n" );
  1195.                                 gd_is5 = 1;
  1196.                                 break;
  1197.                             case 0:
  1198.                             default:
  1199.                                 printf ( "2.5MHz\n" );
  1200.                                 gd_is5 = 0;
  1201.                                 break;
  1202.                             }
  1203.                         }
  1204.                     }
  1205.                 }
  1206.                 if ( stricmp ( buf, "ismouse" ) == 0 ) {
  1207.                     if ( sscanf ( p, "%u", &i ) > 0 ) {
  1208.                         if ( i < 4 ) {
  1209.                             printf ( "      マウスドライバ : " );
  1210.                             switch ( i ) {
  1211.                             case 3:
  1212.                                 printf ( "自動判別\n" );
  1213.                                 ip_mouse = 3;
  1214.                                 break;
  1215.                             case 2:
  1216.                                 printf ( "MS規格\n" );
  1217.                                 ip_mouse = 2;
  1218.                                 break;
  1219.                             case 1:
  1220.                                 printf ( "NEC規格\n" );
  1221.                                 ip_mouse = 1;
  1222.                                 break;
  1223.                             case 0:
  1224.                             default:
  1225.                                 printf ( "使用しない\n" );
  1226.                                 ip_mouse = 0;
  1227.                                 break;
  1228.                             }
  1229.                         }
  1230.                     }
  1231.                 }
  1232.                 if ( stricmp ( buf, "isjoy" ) == 0 ) {
  1233.                     if ( sscanf ( p, "%u", &i ) > 0 ) {
  1234.                         if ( i < 5 ) {
  1235.                             printf ( "      ジョイスティック : " );
  1236.                             switch ( i ) {
  1237.                             case 4:
  1238.                                 printf ( "自動判別\n" );
  1239.                                 ip_joy = 4;
  1240.                                 break;
  1241.                             case 3:
  1242.                             case 2:
  1243.                             case 1:
  1244.                                 printf ( "Port %03X,%03X\n", ip_joyport[i][0], ip_joyport[i][1] );
  1245.                                 ip_joy = i;
  1246.                                 break;
  1247.                             case 0:
  1248.                             default:
  1249.                                 printf ( "使用しない\n" );
  1250.                                 ip_joy = 0;
  1251.                                 break;
  1252.                             }
  1253.                         }
  1254.                     }
  1255.                 }
  1256.                 if ( stricmp ( buf, "gifbmp" ) == 0 ) {
  1257.                     strcpy ( ini.gifbmpname, p );
  1258.                     dr_setapdir ( ini.gifbmpname );
  1259.                     printf ( "      GIF→BMP画像変換 : %s\n", ini.gifbmpname );
  1260.                 }
  1261.                 if ( stricmp ( buf, "jpegconv" ) == 0 ) {
  1262.                     strcpy ( ini.jpegconvname, p );
  1263.                     dr_setapdir ( ini.jpegconvname );
  1264.                     printf ( "      JPEG画像読み込み : %s\n", ini.jpegconvname );
  1265.                 }
  1266.                 if ( stricmp ( buf, "pngconv" ) == 0 ) {
  1267.                     strcpy ( ini.pngconvname, p );
  1268.                     dr_setapdir ( ini.pngconvname );
  1269.                     printf ( "      PNG画像読み込み : %s\n", ini.pngconvname );
  1270.                 }
  1271.                 if ( stricmp ( buf, "palet" ) == 0 ) {
  1272.                     strcpy ( ini.paletname, p );
  1273.                     dr_setapdir ( ini.paletname );
  1274.                     palfp = fopen2 ( ini.paletname, "rb" );
  1275.                     if ( palfp != NULL ) {
  1276.                         fread ( pal, 48, 1, palfp );
  1277.                         fclose ( palfp );
  1278.                         gb_loadrgb ( pal );
  1279.                         printf ( "      パレットファイル : %s\n", ini.paletname );
  1280.                     }
  1281.                 }
  1282.                 if ( stricmp ( buf, "imode" ) == 0 ) {
  1283.                     if ( sscanf ( p, "%u", &i ) > 0 ) {
  1284.                         if ( i < 4 ) {
  1285.                             ini.imode = i;
  1286.                             printf ( "      斜体モード : Type %u\n", (uint)ini.imode );
  1287.                         }
  1288.                     }
  1289.                 }
  1290.                 if ( stricmp ( buf, "bmplcd" ) == 0 ) {
  1291.                     if ( sscanf ( p, "%u", &i ) > 0 ) {
  1292.                         if ( i < 2 ) {
  1293.                             ini.bmplcd = i;
  1294.                             printf ( "      LCD用BMP表示 : %s\n", ( ini.bmplcd == 0 ) ? "No" : "Yes" );
  1295.                         }
  1296.                     }
  1297.                 }
  1298.                 if ( stricmp ( buf, "cursorspeed" ) == 0 ) {
  1299.                     if ( sscanf ( p, "%u", &i ) > 0 ) {
  1300.                         if ( i < 256 ) {
  1301.                             ini.cursorspeed = i;
  1302.                             printf ( "      カーソル移動速度 : %u\n", (uint)ini.cursorspeed );
  1303.                         }
  1304.                     }
  1305.                 }
  1306.                 if ( stricmp ( buf, "1bytefont" ) == 0 ) {
  1307.                     if ( stricmp ( p, "*normal" ) == 0 ) {
  1308.                         printf ( "      半角書体/半角カタカナ書体 : 1バイト内蔵\n" );
  1309.                         ft_ankload ( "", ft_ank_bi1 );
  1310.                     } else if ( stricmp ( p, "*2han" ) == 0 ) {
  1311.                         ft_ankload ( "", ft_ank_bi2 );
  1312.                         printf ( "      半角書体/半角カタカナ書体 : 2バイト半角\n" );
  1313.                     } else {
  1314.                         dr_setapdir ( p );
  1315.                         if ( ft_ankload ( p, ft_ank_1 ) == 0 ) {
  1316.                             printf ( "      半角書体 : %s(半角用)\n", p );
  1317.                         }
  1318.                     }
  1319.                 }
  1320.                 if ( stricmp ( buf, "1bytefont2" ) == 0 ) {
  1321.                     dr_setapdir ( p );
  1322.                     if ( ft_ankload ( p, ft_ank_2 ) == 0 ) {
  1323.                         printf ( "      半角書体 : %s(全角用)\n", p );
  1324.                     }
  1325.                 }
  1326.                 if ( stricmp ( buf, "1bytefontk" ) == 0 ) {
  1327.                     dr_setapdir ( p );
  1328.                     if ( ft_ankload ( p, ft_ank_1k ) == 0 ) {
  1329.                         printf ( "      半角カタカナ書体 : %s(半角用)\n", p );
  1330.                     }
  1331.                 }
  1332. /*                if ( stricmp ( buf, "1bytefont2k" ) == 0 ) {
  1333.                     // 全角ひらがなカタカナ用フォントは文字のならびが違うため使用できないため、この流用スイッチは凍結
  1334.                     dr_setapdir ( p );
  1335.                     if ( ft_ankload ( p, ft_ank_2k ) == 0 ) {
  1336.                         printf ( "      半角カタカナ書体 : %s(全角用)\n", p );
  1337.                     }
  1338.                 }
  1339. */
  1340.                 if ( stricmp ( buf, "2bytesfonta" ) == 0 ) {
  1341.                     if ( stricmp ( p, "*normal" ) == 0 ) {
  1342.                         if ( ft_kjload ( "", ft_kj_bi2 ) == 0 ) {
  1343.                             printf ( "      全角英数書体 : 2バイト内蔵\n" );
  1344.                         }
  1345.                     } else {
  1346.                         dr_setapdir ( p );
  1347.                         if ( ft_kjload ( p, ft_kj_2an ) == 0 ) {
  1348.                             printf ( "      全角英数書体 : %s(全角用)\n", p );
  1349.                         }
  1350.                     }
  1351.                 }
  1352.                 if ( stricmp ( buf, "2bytesfonta1" ) == 0 ) {
  1353.                     dr_setapdir ( p );
  1354.                     if ( ft_kjload ( p, ft_kj_1an ) == 0 ) {
  1355.                         printf ( "      全角英数書体 : %s(半角EXFONT用)\n", p );
  1356.                     }
  1357.                 }
  1358.                 if ( stricmp ( buf, "2bytesfonth" ) == 0 ) {
  1359.                     dr_setapdir ( p );
  1360.                     if ( ft_kjload ( p, ft_kj_2hi ) == 0 ) {
  1361.                         printf ( "      全角ひらがな書体 : %s(EXFONT用)\n", p );
  1362.                     }
  1363.                 }
  1364.                 if ( stricmp ( buf, "2bytesfontk" ) == 0 ) {
  1365.                     dr_setapdir ( p );
  1366.                     if ( ft_kjload ( p, ft_kj_2ka ) == 0 ) {
  1367.                         printf ( "      全角カタカナ書体 : %s(EXFONT用)\n", p );
  1368.                     }
  1369.                 }
  1370.                 if ( stricmp ( buf, "2bytesfontm" ) == 0 ) {
  1371.                     dr_setapdir ( p );
  1372.                     if ( ft_kjload ( p, ft_kj_2mr ) == 0 ) {
  1373.                         printf ( "      全角書体 : %s(まるこむ98用)\n", p );
  1374.                     }
  1375.                 }
  1376.                 if ( stricmp ( buf, "httpget" ) == 0 ) {
  1377.                     strcpy ( ini.httpname, p );
  1378.                     dr_setapdir ( ini.httpname );
  1379.                     printf ( "      HTTP取得 : %s\n", ini.httpname );
  1380.                 }
  1381.             }
  1382.         }
  1383.     }
  1384.  
  1385.     fclose ( fp );
  1386.     return ( 0 );
  1387. }
  1388.  
  1389. void dr_getapdir ( void ) {
  1390. //    struct fnsplit ap;
  1391.     uchar adrive[MAXDRIVE];     // X: (3)
  1392.     uchar adir[MAXDIR];         // \dir\ (66)
  1393.     uchar aname[MAXFILE];     // filename (9)
  1394.     uchar aext[MAXEXT];         // .ext (5)
  1395.  
  1396. /*    fnsplit2 ( *_argv, &ap );
  1397.     // apdir
  1398.     strcpy ( apdir, ap.drive );
  1399.     strcat ( apdir, ap.dir );
  1400.     // ininame
  1401.     strcpy ( ap.ext, ".ini" );
  1402.     fnmerge2 ( ininame, &ap );
  1403. */
  1404.     fnsplit ( *_argv, adrive, adir, aname, aext );
  1405.     strcpy ( apdir, adrive );
  1406.     strcat ( apdir, adir );
  1407.     strcpy ( aext, ".ini" );
  1408.     fnmerge ( ininame, adrive, adir, aname, aext );
  1409. }
  1410.  
  1411. void dr_setapdir ( uchar *path ) {
  1412.     uchar path2[pathmax];
  1413.     if ( path[0] != '~' ) return;
  1414.     strcpy ( path2, path + 1 );
  1415.     strcpy ( path, apdir );
  1416.     strcat ( path, path2 );
  1417. }
  1418.  
  1419. //uchar tempdir[pathmax];
  1420. void dr_gettempdir ( void ) {
  1421.     // tempdirをセットできるならする
  1422.     // 上記にかかわらずtempdriveはセットする
  1423.  
  1424.     strcpy ( tempdir, getenv ( "TEMP" ) );
  1425.     if ( tempdir[0] == '\0' ) {
  1426.         strcpy ( tempdir, getenv ( "TMP" ) );
  1427.     }
  1428.     if ( tempdir[0] == '\0' ) {
  1429.         tempdrive = getdisk() + 1;
  1430.         return; // 補う処理は不要
  1431.     }
  1432.     if ( tempdir[strlen(tempdir)-1] != '\\' ) strcat ( tempdir, "\\" );
  1433.     if ( tempdir[1] == ':' ) {
  1434.         if ( tempdir[0] >= 'a' ) tempdrive = tempdir[0] - 'a' + 1;
  1435.         else tempdrive = tempdir[0] - 'A' + 1;
  1436.     } else tempdrive = getdisk() + 1;
  1437.  
  1438. }
  1439.  
  1440. void dr_settempdir ( uchar *path ) {
  1441.     uchar buf[pathmax];
  1442.     if ( tempdir[0] == '\0' ) return;
  1443.  
  1444.     strcpy ( buf, path );
  1445.     strcpy ( path, tempdir );
  1446.     strcat ( path, buf );
  1447. }
  1448.  
  1449.  
  1450. void ft_init ( void ) {
  1451.     uint i, j;
  1452.     uchar b[34];
  1453.  
  1454.     for ( i = 0 ; i < 256 ; i++ ) {
  1455.         ft_answ[i] = ft_sw_unload;
  1456.     }
  1457.     for ( i = 0 ; i < 94 ; i++ ) {
  1458.         for ( j = 0 ; j < 3 ; j++ ) ft_kjsw[j][i] = ft_sw_unload;
  1459.     }
  1460.     // 2Bytes半角利用がデフォルト *normal指定で打ち消せる
  1461.     ft_ankload ( "", ft_ank_bi2 );
  1462.     // 音符フォントがないなら内蔵フォントを使用
  1463.     ft_getfont ( 0x2276, b );
  1464.     j = 0;
  1465.     for ( i = 2 ; i < 34 ; i++ ) j |= b[i];
  1466.     if ( j != 0 ) {
  1467.         for ( i = 0 ; i < 32 ; i++ ) ft_onpufont[i] = b[i+2];
  1468.     }
  1469. }
  1470.  
  1471. void ft_getfont ( uint code, void *buf ) {
  1472.     int i;
  1473.     uchar *p;
  1474.     p = ( ( uchar * )buf ) + 2;
  1475.  
  1476.     if ( code >= 0x8000 ) {
  1477.         // ANK
  1478.         pc98getfont ( code, buf );
  1479.     } else if ( code >= 0x100 ) {
  1480.         // 2Bytes
  1481.         outportb ( 0xa3, ( code >> 8 ) - 0x20 );
  1482.         outportb ( 0xa1, code & 255 );
  1483.         outportb ( 0x68, 0x0b ); // KCG Bitmap Access
  1484.         switch ( code >> 8 ) {
  1485.         case 0x29:
  1486.         case 0x2a:
  1487.         case 0x2b:
  1488.             for ( i = 0 ; i < 16 ; i++ ) {
  1489.                 outportb ( 0xa5, i + 32 );
  1490.                 *(p+i) = inportb ( 0xa9 ); // 左側だけ読めばいい
  1491.             }
  1492.             break;
  1493.         default:
  1494.             for ( i = 0 ; i < 16 ; i++ ) {
  1495.                 outportb ( 0xa5, i + 32 );
  1496.                 *(p+i*2) = inportb ( 0xa9 );
  1497.                 outportb ( 0xa5, i );
  1498.                 *(p+i*2+1) = inportb ( 0xa9 );
  1499.             }
  1500.             break;
  1501.         }
  1502.         outportb ( 0x68, 0x0a ); // KCG Code Access
  1503.     } else {
  1504.         // 1/4 Size ANK
  1505.         pc98getfont ( code, buf );
  1506.     }
  1507. }
  1508.  
  1509. int ft_ankload ( uchar *filename, uint mode ) {
  1510.     FILE *fp;
  1511.     int i, j, j2, k, je;
  1512.     uchar buf[34], d, s;
  1513.  
  1514.     // 機械内からの読み出し
  1515.     switch ( mode ) {
  1516.     // 内蔵フォントは条件によっては読まない
  1517.     case ft_ank_bi1:
  1518.         for ( i = 0 ; i < 256 ; i++ ) if ( ft_answ[i] > ft_sw_builtin ) ft_answ[i] = ft_sw_unload;
  1519.         return ( 0 );
  1520.     case ft_ank_bi2:
  1521. //        for ( i = 0 ; i < 0x21 ; i++ ) if ( ft_answ[i] > ft_sw_builtin ) ft_answ[i] = ft_sw_unload;
  1522.         for ( i = 0x21 ; i < 0x7f ; i++ ) { // Numlic, Alphabet
  1523.             if ( ft_answ[i] != ft_sw_builtin2 ) {
  1524.                 ft_getfont ( 0x2900 + i, buf );
  1525.                 memcpy ( ft_anfont[i], &buf[2], 16 );
  1526.                 ft_answ[i] = ft_sw_builtin2;
  1527.             }
  1528.         }
  1529. //        for ( i = 0x7f ; i < 0xa1 ; i++ ) if ( ft_answ[i] > ft_sw_builtin ) ft_answ[i] = ft_sw_unload;
  1530.         for ( i = 0xa1 ; i < 0xe0 ; i++ ) { // 半角カタカナ
  1531.             if ( ft_answ[i] != ft_sw_builtin2 ) {
  1532.                 ft_getfont ( 0x2a00 + i - ( 0xa0 - 0x20 ), buf );
  1533.                 memcpy ( ft_anfont[i], &buf[2], 16 );
  1534.                 ft_answ[i] = ft_sw_builtin2;
  1535.             }
  1536.         }
  1537. //        for ( i = 0xe0 ; i < 256 ; i++ ) if ( ft_answ[i] > ft_sw_builtin ) ft_answ[i] = ft_sw_unload;
  1538.         return ( 0 );
  1539.     }
  1540.  
  1541.     switch ( mode ) {
  1542.     // j2 = 読み込み位置(AN/K) 0x21~0x7Eからいくつずれるか
  1543.     // je = どこで止めるか ANなら0x777E Kなら0x775F
  1544.     case ft_ank_1k:
  1545.     case ft_ank_2k:
  1546.         j2 = 0xa1 - 0x21;
  1547.         je = 0x775f;
  1548.         break;
  1549.     default:
  1550.         j2 = 0;
  1551.         je = 0x777e;
  1552.         break;
  1553.     }
  1554.  
  1555.     // ファイルからの読み出し
  1556.     fp = fopen2 ( filename, "rb" );
  1557.     if ( fp == NULL ) return ( 1 );
  1558.     fread ( buf, 34, 1, fp );
  1559.     switch ( mode ) {
  1560.     // 以前に同じファイルから読んだか分からないので必ず読む
  1561.     case ft_ank_1:
  1562.     case ft_ank_1k:
  1563.         for ( i = 0 ; i < 188 ; i++ ) {
  1564.             // 左半分を抽出
  1565.             fread ( buf, 34, 1, fp );
  1566.             j = buf[1] * 256 + buf[0];
  1567.             if ( ( j >= 0x7721 ) && ( j <= je ) ) {
  1568.                 j -= 0x7700;
  1569.                 for ( k = 0 ; k < 16 ; k++ ) ft_anfont[j+j2][k] = buf[k*2+2];
  1570.                 ft_answ[j+j2] = ft_sw_file;
  1571.             }
  1572.         }
  1573.         break;
  1574.     case ft_ank_2:
  1575.     case ft_ank_2k:
  1576.         for ( i = 0 ; i < 188 ; i++ ) {
  1577.             // 横幅を半分に
  1578.             fread ( buf, 34, 1, fp );
  1579.             j = buf[1] * 256 + buf[0];
  1580.             if ( ( j >= 0x7721 ) && ( j <= je ) ) {
  1581.                 j -= 0x7700;
  1582.                 for ( k = 0 ; k < 16 ; k++ ) {
  1583.                     // 思い浮かばないのでかなりいい加減である。遅そう。
  1584.                     d = 0;
  1585.                     s = buf[k*2+2];
  1586.                     if ( s & 0xc0 ) d += 0x80;
  1587.                     if ( s & 0x30 ) d += 0x40;
  1588.                     if ( s & 0x0c ) d += 0x20;
  1589.                     if ( s & 0x03 ) d += 0x10;
  1590.                     s = buf[k*2+3];
  1591.                     if ( s & 0xc0 ) d += 0x08;
  1592.                     if ( s & 0x30 ) d += 0x04;
  1593.                     if ( s & 0x0c ) d += 0x02;
  1594.                     if ( s & 0x03 ) d += 0x01;
  1595.                     ft_anfont[j+j2][k] = d;
  1596.                 }
  1597.                 ft_answ[j+j2] = ft_sw_file;
  1598.             }
  1599.         }
  1600.         break;
  1601.     default:
  1602.         fclose ( fp );
  1603.         return ( 1 );
  1604.     }
  1605.     fclose ( fp );
  1606.     return ( 0 );
  1607. }
  1608.  
  1609. void ft_checkank ( uint code ) {
  1610.     uchar buf[34], c2 = code & 255;
  1611.  
  1612.     if ( ft_answ[c2] == ft_sw_unload ) {
  1613.         ft_getfont ( 0x8000 + c2, buf );
  1614.         memcpy ( ft_anfont[c2], &buf[2], 16 );
  1615.         ft_answ[c2] = ft_sw_builtin;
  1616.     }
  1617. }
  1618.  
  1619. void ft_writeank ( uint code, uchar mode, uint x, uint y, uint ys, uint ye ) {
  1620.     uint i, j , sy, off;
  1621.     uchar c; // ここはunsignedであること。
  1622.  
  1623.     if ( x >= 80 ) return;
  1624.     if ( y >= ye ) return;
  1625.     if ( y + 18 <= ys ) return;
  1626.  
  1627.     gd_waitdraw();
  1628.     ft_checkank ( code );
  1629.     for ( i = 0 ; i < 18 ; i++ ) {
  1630.         sy = y + i;
  1631.         off = x + sy * 80;
  1632.         if ( ( sy >= ys ) && ( sy <= ye ) ) {
  1633.             // 文字色は15に固定
  1634.             if ( i < 16 ) {
  1635.                 if ( mode & ft_ef_h ) {
  1636.                     if ( ( i < 4 ) || ( i >= 12 ) ) continue;
  1637.                     else c = ft_anfont[code][(i-4)*2] | ft_anfont[code][(i-4)*2+1];
  1638.                 } else c = ft_anfont[code][i];
  1639.                 if ( mode & ft_ef_i ) { // 斜体
  1640.                     switch ( i ) {
  1641.                     case 0: case 1: case 2: case 3: case 4:
  1642.                         c = ( c >> 1 ) | ( c & 1 );
  1643.                         break;
  1644.                     case 5:
  1645.                         if ( ini.imode & 1 ) c |= c >> 1;
  1646.                         break;
  1647.                     case 10:
  1648.                         if ( ini.imode & 1 ) c |= c << 1;
  1649.                         break;
  1650.                     case 11: case 12: case 13: case 14: case 15:
  1651.                         c = ( c << 1 ) | ( c & 0x80 );
  1652.                         break;
  1653.                     default:
  1654.                         break;
  1655.                     }
  1656.                 }
  1657. //                if ( mode & ft_ef_b ) c |= c >> 1; // 太字
  1658.                 if ( mode & ft_ef_b ) c |= c << 1; // 太字
  1659.                 if ( ( mode & ft_ef_s ) && ( ( i == 6 ) || ( i == 10 ) ) ) c = 0xff; // 取消線
  1660.                 if ( eg_ison ) pokeb ( gseg[0], off, c );
  1661.                 else for ( j = 0 ; j < 4 ; j++ ) pokeb ( gseg[j], off, c );
  1662.             } else if ( i == 17 ) {
  1663.                 if ( mode & ft_ef_u ) {
  1664.                     if ( eg_ison ) pokeb ( gseg[0], off, 0xff );
  1665.                     else for ( j = 0 ; j < 4 ; j++ ) pokeb ( gseg[j], off, 0xff );
  1666.                 }
  1667.             }
  1668.         }
  1669.     }
  1670. }
  1671.  
  1672. //enum { ft_kj_2bi, ft_kj_1an, ft_kj_2an, ft_kj_2hi, ft_kj_2ka, ft_kj_2mr };
  1673. int ft_kjload ( uchar *filename, uint mode ) {
  1674.     FILE *fp;
  1675.     uint i, j, k, d1, d2, p;
  1676.     uchar buf[34], s;
  1677.  
  1678.     switch ( mode ) {
  1679.     case ft_kj_bi2:
  1680.         // 内蔵フォント
  1681.         for ( i = 0 ; i < 3 ; i++ ) {
  1682.             for ( j = 0 ; j < 94 ; j++ ) {
  1683.                 if ( ft_kjsw[i][j] > ft_sw_builtin ) ft_kjsw[i][j] = ft_sw_unload;
  1684.             }
  1685.         }
  1686.         return ( 0 );
  1687.     }
  1688.     fp = fopen2 ( filename, "rb" );
  1689.     if ( fp == NULL ) return ( 1 );
  1690.     fread ( buf, 34, 1, fp );
  1691.  
  1692.     switch ( mode ) { // EXFONT書体の書き込み位置
  1693.     case ft_kj_2hi:
  1694.         p = 1;
  1695.         break;
  1696.     case ft_kj_2ka:
  1697.         p = 2;
  1698.         break;
  1699.     case ft_kj_2an:
  1700.     default:
  1701.         p = 0;
  1702.         break;
  1703.     }
  1704.  
  1705.     switch ( mode ) {
  1706.     // 以前に同じファイルから読んだか分からないので必ず読む
  1707.     case ft_kj_1an:
  1708.         // 1byteAN書体
  1709.         for ( i = 0 ; i < 188 ; i++ ) {
  1710.             // 横幅を伸ばす
  1711.             fread ( buf, 34, 1, fp );
  1712.             j = buf[1] * 256 + buf[0];
  1713.             if ( ( j >= 0x7721 ) && ( j <= 0x777e ) ) {
  1714.                 j -= 0x7721;
  1715.                 for ( k = 0 ; k < 32 ; k+=2 ) {
  1716.                     d1 = d2 = 0;
  1717.                     s = buf[k+2];
  1718.                     if ( s & 0x80 ) d1 += 0xc0;
  1719.                     if ( s & 0x40 ) d1 += 0x30;
  1720.                     if ( s & 0x20 ) d1 += 0x0c;
  1721.                     if ( s & 0x10 ) d1 += 0x03;
  1722.                     if ( s & 0x08 ) d2 += 0xc0;
  1723.                     if ( s & 0x04 ) d2 += 0x30;
  1724.                     if ( s & 0x02 ) d2 += 0x0c;
  1725.                     if ( s & 0x01 ) d2 += 0x03;
  1726.                     ft_kjfont[0][j][k] = d1;
  1727.                     ft_kjfont[0][j][k+1] = d2;
  1728.                 }
  1729.                 ft_kjsw[0][j] = ft_sw_file;
  1730.             }
  1731.         }
  1732.         break;
  1733.     case ft_kj_2an:
  1734.     case ft_kj_2hi:
  1735.     case ft_kj_2ka:
  1736.         // 2bytesAN書体 / ひらがな書体 / カタカナ書体 EXFONT形
  1737.         for ( i = 0 ; i < 188 ; i++ ) {
  1738.             fread ( buf, 34, 1, fp );
  1739.             j = buf[1] * 256 + buf[0];
  1740.             if ( ( j >= 0x7721 ) && ( j <= 0x777e ) ) {
  1741.                 j -= 0x7721;
  1742.                 for ( k = 0 ; k < 32 ; k++ ) {
  1743.                     ft_kjfont[p][j][k] = buf[k+2];
  1744.                 }
  1745.                 ft_kjsw[p][j] = ft_sw_file;
  1746.             }
  1747.         }
  1748.         break;
  1749.     case ft_kj_2mr:
  1750.         // 2bytesまるこむ書体
  1751.         for ( i = 0 ; i < 188 ; i++ ) {
  1752.             fread ( buf, 34, 1, fp );
  1753.             j = buf[1] * 256 + buf[0];
  1754.             if ( ( j >= 0x7621 ) && ( j <= 0x7673 ) ) {
  1755.                 // ひらがな
  1756.                 j -= 0x7621;
  1757.                 for ( k = 0 ; k < 32 ; k++ ) {
  1758.                     ft_kjfont[1][j][k] = buf[k+2];
  1759.                 }
  1760.                 ft_kjsw[1][j] = ft_sw_file;
  1761.             } else if ( ( j >= 0x7675 ) && ( j <= 0x767e ) ) {
  1762.                 // 数字
  1763.                 j -= 0x7675;
  1764.                 j += 0x30 - 0x21;
  1765.                 for ( k = 0 ; k < 32 ; k++ ) {
  1766.                     ft_kjfont[0][j][k] = buf[k+2];
  1767.                 }
  1768.                 ft_kjsw[0][j] = ft_sw_file;
  1769.             } else if ( ( j >= 0x7721 ) && ( j <= 0x7776 ) ) {
  1770.                 // カタカナ
  1771.                 j -= 0x7721;
  1772.                 for ( k = 0 ; k < 32 ; k++ ) {
  1773.                     ft_kjfont[2][j][k] = buf[k+2];
  1774.                 }
  1775.                 ft_kjsw[2][j] = ft_sw_file;
  1776.             } else if ( j == 0x777b ) {
  1777.                 // P
  1778.                 j = 0x50 - 0x21;
  1779.                 for ( k = 0 ; k < 32 ; k++ ) {
  1780.                     ft_kjfont[0][j][k] = buf[k+2];
  1781.                 }
  1782.                 ft_kjsw[0][j] = ft_sw_file;
  1783.             }
  1784.         }
  1785.         break;
  1786.     }
  1787.  
  1788.     return ( 0 );
  1789. }
  1790.  
  1791. void ft_writekj ( uint code, uchar mode, uint x, uint y, uint ys, uint ye ) {
  1792.     uint i, sy, off, j, k, l;
  1793.     uint d, d2; // unsignedであること
  1794.     uchar buf[34], buf2[34];
  1795.  
  1796.     if ( x >= 80 ) return;
  1797.     if ( y >= ye ) return;
  1798.     if ( y + 18 <= ys ) return;
  1799.  
  1800.     gd_waitdraw();
  1801.     for ( j = 2 ; j < 34 ; j++ ) buf[j] = 0;
  1802.     k = code >> 8, l = code & 255;
  1803.     if ( code == 0x2276 ) {
  1804.         memcpy ( buf + 2, ft_onpufont, 32 );
  1805.     } else if ( ( k >= 0x23 ) && ( k <= 0x25 ) && ( l >= 0x21 ) && ( l <= 0x7e ) ) {
  1806.         k -= 0x23;
  1807.         l -= 0x21;
  1808.         if ( ft_kjsw[k][l] == ft_sw_unload ) {
  1809. // これでは2バイトずれる(buf先頭2バイトは使われない)→23~25が1ドットずれる
  1810. //            ft_getfont ( code, ft_kjfont[k][l] );
  1811.             ft_getfont ( code, buf );
  1812.             memcpy ( ft_kjfont[k][l], buf + 2, 32 );
  1813.             ft_kjsw[k][l] = ft_sw_builtin;
  1814.         } else {
  1815.             memcpy ( buf + 2, ft_kjfont[k][l], 32 );
  1816.         }
  1817.     } else ft_getfont ( code, buf );
  1818.  
  1819.     if ( mode & ft_ef_h ) {
  1820.         for ( i = 0 ; i < 34 ; i++ ) buf2[i] = buf[i];
  1821.         for ( i = 0 ; i < 34 ; i++ ) buf[i] = 0;
  1822.         for ( i = 0 ; i < 8 ; i++ ) {
  1823.             buf[10+i*2] = buf2[2+i*4] | buf2[4+i*4];
  1824.             buf[10+i*2+1] = buf2[3+i*4] | buf2[5+i*4];
  1825.         }
  1826.     }
  1827.  
  1828.     for ( i = 0 ; i < 18 ; i++ ) {
  1829.         sy = y + i;
  1830.         off = x + sy * 80;
  1831.         if ( ( sy >= ys ) && ( sy <= ye ) ) {
  1832.             if ( i < 16 ) {
  1833.                 if ( mode & ( ft_ef_b | ft_ef_i ) ) {
  1834.                     d = ( buf[i*2+2]<<8 ) + buf[i*2+3];
  1835.                     if ( mode & ft_ef_i ) { // 斜体
  1836.                         switch ( i ) {
  1837.                         case 0: case 1: case 2: case 3: case 4:
  1838.                             d = ( d >> 1 ) | ( d & 1 );
  1839.                             break;
  1840.                         case 5:
  1841.                             if ( ini.imode & 2 ) d |= d >> 1;
  1842.                             break;
  1843.                         case 10:
  1844.                             if ( ini.imode & 2 ) d |= d << 1;
  1845.                             break;
  1846.                         case 11: case 12: case 13: case 14: case 15:
  1847.                             d = ( d << 1 ) | ( d & 0x8000 );
  1848.                             break;
  1849.                         default:
  1850.                             break;
  1851.                         }
  1852.                     }
  1853. //                    if ( mode & ft_ef_b ) d |= d >> 1; // 太字
  1854.                     if ( mode & ft_ef_b ) d |= d << 1; // 太字
  1855.                     d2 = ( ( d & 0xff )<<8 ) + ( d >> 8 );
  1856.                 } else d2 = buf[i*2+2] + (buf[i*2+3]<<8);
  1857.                 if ( ( mode & ft_ef_s ) && ( ( i == 6 ) || ( i == 10 ) ) ) d2 = 0xffff; // 取消線
  1858.                 if ( eg_ison ) poke ( gseg[0], off, d2 );
  1859.                 else for ( j = 0 ; j < 4 ; j++ ) poke ( gseg[j], off, d2 );
  1860.             } else if ( i == 17 ) {
  1861.                 if ( mode & ft_ef_u ) {
  1862.                     if ( eg_ison ) poke ( gseg[0], off, 0xffff );
  1863.                     else for ( j = 0 ; j < 4 ; j++ ) poke ( gseg[j], off, 0xffff );
  1864.                 }
  1865.             }
  1866.         }
  1867.     }
  1868. }
  1869.  
  1870. //enum { ft_km_auto, ft_km_sjis, ft_km_eucjp };
  1871. uint ft_writestr ( uchar *str, uchar mode, uint x, uint y, uint ys, uint ye, uint &kmode ) {
  1872.     enum { n_ascii, n_kanji, n_kana };
  1873.     uchar nowmode = n_ascii;
  1874.     uchar *p = str, *q = p + 1;
  1875.     uint nx = x, c;
  1876.  
  1877.     gd_waitdraw();
  1878.     if ( ini.isegc ) {
  1879.         eg_on ();
  1880.         eg_color ( 15 );
  1881.     }
  1882.     while ( *p != '\0' ) {
  1883.         switch ( *p ) {
  1884.         case 0x1b:
  1885.             switch ( *q ) {
  1886.             case 0x24:
  1887.                 // to Kanji
  1888.                 nowmode = n_kanji;
  1889.                 p += 2;
  1890.                 break;
  1891.             case 0x28:
  1892.                 // to ASCII
  1893.                 if ( *(p+2) == 0x49 )
  1894.                     nowmode = n_kana;
  1895.                 else
  1896.                     nowmode = n_ascii;
  1897.                 p += 2;
  1898.                 break;
  1899.             }
  1900.             break;
  1901.         case 0x1e:
  1902.             // to Kana
  1903.             if ( nowmode == n_ascii ) nowmode = n_kana;
  1904.             break;
  1905.         case 0x1f:
  1906.             // to ASCII
  1907.             if ( nowmode == n_kana ) nowmode = n_ascii;
  1908.             break;
  1909.         default:
  1910.             // シフトコード以外
  1911.             c = *q;
  1912.             c += (*p)<<8;
  1913.             switch ( nowmode ) {
  1914.             case n_kanji:
  1915.                 // JIS漢字
  1916.                 ft_writekj ( c, mode, nx, y, ys, ye );
  1917.                 p++;
  1918.                 nx += 2;
  1919.                 break;
  1920.             case n_kana:
  1921.                 // JIS半角カタカナ
  1922.                 ft_writeank ( *p + 0xa1 - 0x21, mode, nx, y, ys, ye );
  1923.                 nx++;
  1924.                 break;
  1925.             default:
  1926.                 if ( kmode == ft_km_auto ) {
  1927.                     // 漢字コード判別作業中
  1928.                     // kmodeを変更すれば現在の文字から新コードで見る
  1929.                     if ( *p < 0x80 ) {
  1930.                         // ASCII
  1931.                         ft_writeank ( *p, mode, nx, y, ys, ye );
  1932.                         nx++;
  1933. /*                    } else if ( *p == 0x8e ) {
  1934.                         // 8E 次がA1~DFならEUCJP半角カタカナ/SJIS漢字
  1935.                         //    次が21~7EならSJIS確定
  1936.                         if ( *q < 0xa0 ) kmode = ft_km_sjis;
  1937.                         else kmode = ft_km_eucjp;
  1938. */
  1939.                     } else if ( *p < 0xa1 ) {
  1940.                         kmode = ft_km_sjis; // 80~8D 8E~A0はSJIS
  1941.                     } else {
  1942.                         // A1~FF 漢字第2バイトで判断
  1943.                         // この範囲がもう一度来たらEUCJP 違うならSJIS
  1944.                         // 半角カタカナ2連続だと誤判定する(逆方向の誤判定はないかな?)
  1945.                         if ( *q > 0xa0 ) {
  1946.                             kmode = ft_km_eucjp;
  1947.                         } else {
  1948.                             kmode = ft_km_sjis;
  1949.                         }
  1950.                     }
  1951.                 } // ここで一旦合流することで判断直後の漢字表示が可能に
  1952.                 switch ( kmode ) {
  1953.                 case ft_km_eucjp:
  1954.                     if ( *p == 0x8e ) {
  1955.                         // EUCJP半角カタカナ
  1956.                         ft_writeank ( *q, mode, nx, y, ys, ye );
  1957.                         p++;
  1958.                         nx++;
  1959.                     } else if ( ( *p >= 0xa1 ) && ( *p <= 0xfe ) ) {
  1960.                         // EUCJP漢字
  1961.                         ft_writekj ( c & 0x7f7f, mode, nx, y, ys, ye );
  1962.                         nx += 2;
  1963.                         p++;
  1964.                     } else {
  1965.                         // EUCJP AN
  1966.                         ft_writeank ( *p, mode, nx, y, ys, ye );
  1967.                         nx++;
  1968.                     }
  1969.                     break;
  1970.                 case ft_km_sjis:
  1971.                     if ( iskanji ( *p ) ) {
  1972.                         // SJIS漢字
  1973.                         ft_writekj ( jmstojis ( c ), mode, nx, y, ys, ye );
  1974.                         p++;
  1975.                         nx += 2;
  1976.                     } else {
  1977.                         // SJIS ANK
  1978.                         ft_writeank ( *p, mode, nx, y, ys, ye );
  1979.                         nx++;
  1980.                     }
  1981.                     break;
  1982.                 case ft_km_auto:
  1983.                     break;
  1984.                 }
  1985.                 break;
  1986.             }
  1987.             break;
  1988.         }
  1989.         p++;
  1990.         q = p + 1;
  1991.         if ( nx >= 80 ) break;
  1992.     }
  1993.     if ( ini.isegc ) eg_off ();
  1994.     return ( nx - x );
  1995. }
  1996.  
  1997. void ft_writestrs ( uchar *str, uchar *modestr, uint x, uint y, uint ys, uint ye, uint s ) {
  1998.     uchar *p = str, *q;
  1999.     uint nx = 0, nx2, c;
  2000.     uchar mode = 0;
  2001.  
  2002.     gd_waitdraw();
  2003.     if ( ini.isegc ) {
  2004.         eg_on ();
  2005.         eg_color ( 15 );
  2006.     }
  2007.     while ( ( *p != '\0' ) && ( nx < s ) ) {
  2008.         mode = *(modestr + nx);
  2009.         nx2 = x + nx;
  2010.         if ( iskanji ( *p ) ) {
  2011.             if ( nx + 1 >= s ) break;
  2012.             q = p + 1;
  2013.             c = *q;
  2014.             c += (*p)<<8;
  2015.             ft_writekj ( jmstojis ( c ), mode, nx2, y, ys, ye );
  2016.             p++;
  2017.             nx++;
  2018.         } else {
  2019.             ft_writeank ( *p, mode, nx2, y, ys, ye );
  2020.         }
  2021.         p++;
  2022.         nx++;
  2023.     }
  2024.     if ( ini.isegc ) eg_off ();
  2025. }
  2026.  
  2027. uint bm_convbmp ( uchar *convname, uchar *bmpname, uint &x, uint &y, uchar *bmpat ) {
  2028.     FILE *pat;
  2029.     FILE *tp;
  2030.     uchar buf[bufmax], buf2[bufmax], bmpname2[bufmax], bmpname3[bufmax], f;
  2031.     uint i, j;
  2032.     ulong fx, fy, l;
  2033.     struct fnsplit fns;
  2034.  
  2035. printf ( "\033[3;1H\033[>5l\r" );
  2036.     fnsplit2 ( bmpname, &fns );
  2037.     fnmerge3 ( bmpname3, &fns );
  2038. //    fnsplit2 ( bmpname3, &fns );
  2039.     strcpy ( bmpname2, bmpname3 );
  2040.  
  2041.     // まずは開けるか確認→ローカルに移してから
  2042.     pat = fopen2 ( bmpname3, "rb" );
  2043.     if ( pat == NULL ) {
  2044.         printf ( "\033[>5h\033[2J\r" );
  2045.         return ( 1 );
  2046.     }
  2047.     fclose ( pat );
  2048.  
  2049.     // GIFはBMPに変換する
  2050.     if ( stricmp ( fns.ext, ".gif" ) == 0 ) {
  2051.         strcpy ( buf, "$temp.gbc" );
  2052.         dr_settempdir ( buf );
  2053.         tp = fopen2 ( buf, "r" );
  2054.         l = 0, f = 0;
  2055.         if ( tp != NULL ) {
  2056.             while ( !feof ( tp ) ) {
  2057.                 buf[0] = '\0';
  2058.                 fgets ( buf, bufmax, tp );
  2059.                 if ( buf[0] == '\0' ) break;
  2060.                 i = strlen ( buf );
  2061.                 if ( buf[i-1] == '\n' ) buf[i-1] = '\0';
  2062.                 if ( stricmp ( buf, bmpname3 ) == 0 ) {
  2063.                     sprintf ( buf2, "$%lu.bmp", l );
  2064.                     dr_settempdir ( buf2 );
  2065.                     pat = fopen2 ( buf2, "rb" );
  2066.                     if ( pat == NULL ) { // ファイルがもうないならもう一度変換
  2067.                         sprintf ( buf2, "$%lu", l );
  2068.                         dr_settempdir ( buf2 );
  2069.                         sprintf ( buf, "%s %s %s", ini.gifbmpname, bmpname3, buf2 );
  2070.                         system ( buf );
  2071.                         strcat ( buf2, ".bmp" );
  2072.                     } else fclose ( pat );
  2073. //                    fnsplit2 ( buf2, &fns );
  2074.                     strcpy ( bmpname2, buf2 );
  2075.                     f = 1;
  2076.                     break;
  2077.                 }
  2078.                 l++;
  2079.             }
  2080.         }
  2081.         fclose ( tp );
  2082.         if ( f == 0 ) {
  2083.             sprintf ( buf2, "$%lu", l );
  2084.             dr_settempdir ( buf2 );
  2085.             remove ( buf2 );
  2086.             sprintf ( buf, "%s %s %s", ini.gifbmpname, bmpname3, buf2 );
  2087.             system ( buf );
  2088.             strcat ( buf2, ".bmp" );
  2089.             pat = fopen2 ( buf2, "rb" );
  2090.             if ( pat != NULL ) {
  2091.                 fclose ( pat );
  2092.                 strcpy ( buf, "$temp.gbc" );
  2093.                 dr_settempdir ( buf );
  2094.                 tp = fopen2 ( buf, "a" );
  2095.                 if ( tp != NULL ) {
  2096.                     fprintf ( tp, "%s\n", bmpname );
  2097.                     fclose ( tp );
  2098. //                    fnsplit2 ( buf2, &fns );
  2099.                     strcpy ( bmpname2, buf2 );
  2100.                 }
  2101.             }
  2102.         }
  2103.         printf ( "\033[>5h\r" );
  2104.     }
  2105. //    fnmerge2 ( bmpname2, &fns );
  2106.  
  2107.     l = 0;
  2108.     pat = fopen2 ( bmpat, "r" );
  2109.     if ( pat != NULL ) {
  2110.         while ( !feof ( pat ) ) {
  2111.             buf[0] = '\0';
  2112.             fgets ( buf, bufmax, pat );
  2113.             if ( buf[0] == '\0' ) break;
  2114.             i = strlen ( buf );
  2115.             if ( buf[i-1] == '\n' ) buf[i-1] = '\0';
  2116.             fgets ( buf2, bufmax, pat );
  2117.             if ( stricmp ( buf, bmpname2 ) == 0 ) {
  2118.                 fclose ( pat );
  2119.                 sscanf ( buf2, "%lu,%lu", &fx, &fy );
  2120.                 x = fx, y = fy;
  2121.                 if ( x > 640 ) x = 640;
  2122.                 sprintf ( convname, "$%lu.cdb", l );
  2123.                 dr_settempdir ( convname );
  2124.                 pat = fopen2 ( convname, "rb" );
  2125.                 if ( pat == NULL ) { // ファイルがもうないならもう一度変換
  2126.                     if ( stricmp ( fns.ext, ".jpg" ) == 0 ) {
  2127.                         remove ( convname );
  2128.                         sprintf ( buf, "%s %s %s", ini.jpegconvname, bmpname2, convname );
  2129.                         system ( buf );
  2130.                     } else if ( stricmp ( fns.ext, ".png" ) == 0 ) {
  2131.                         remove ( convname );
  2132.                         sprintf ( buf, "%s %s %s", ini.pngconvname, bmpname2, convname );
  2133.                         system ( buf );
  2134.                     } else {
  2135.                         bm_convbmp2 ( convname, bmpname2, x, y );
  2136.                     }
  2137.                 } else fclose ( pat );
  2138.                 printf ( "\033[>5h\033[2J\r" );
  2139.                 return ( 0 );
  2140.             }
  2141.             l++;
  2142.         }
  2143.         fclose ( pat );
  2144.     }
  2145.     sprintf ( convname, "$%lu.cdb", l );
  2146.     dr_settempdir ( convname );
  2147.     pat = fopen2 ( bmpat, "a" );
  2148.     if ( pat == NULL ) {
  2149.         printf ( "\033[>5h\033[2J\r" );
  2150.         return ( 1 );
  2151.     }
  2152.     if ( stricmp ( fns.ext, ".jpg" ) == 0 ) {
  2153.         remove ( convname );
  2154.         sprintf ( buf, "%s %s %s", ini.jpegconvname, bmpname2, convname );
  2155.         system ( buf );
  2156.         tp = fopen2 ( convname, "rb" );
  2157.         if ( tp == NULL ) j = 1;
  2158.         else {
  2159.             fread ( (void *)&fx, 4, 1, tp );
  2160. /*                fclose ( tp );
  2161.                 fclose ( pat );
  2162.                 x = y = 0;
  2163.                 printf ( "\033[>5h\033[2J\r" );
  2164.                 return ( 1 );
  2165.             }
  2166. */
  2167.             fread ( (void *)&fy, 4, 1, tp );
  2168.             x = fx;
  2169.             if ( x > 640 ) x = 640;
  2170.             y = fy;
  2171.             j = 0;
  2172.             fclose ( tp );
  2173.         }
  2174.     } else if ( stricmp ( fns.ext, ".png" ) == 0 ) {
  2175.         remove ( convname );
  2176.         sprintf ( buf, "%s %s %s", ini.pngconvname, bmpname2, convname );
  2177.         system ( buf );
  2178.         tp = fopen2 ( convname, "rb" );
  2179.         if ( tp == NULL ) j = 1;
  2180.         else {
  2181.             fread ( (void *)&fx, 4, 1, tp );
  2182. /*                fclose ( tp );
  2183.                 fclose ( pat );
  2184.                 x = y = 0;
  2185.                 printf ( "\033[>5h\033[2J\r" );
  2186.                 return ( 1 );
  2187.             }
  2188. */
  2189.             fread ( (void *)&fy, 4, 1, tp );
  2190.             x = fx;
  2191.             if ( x > 640 ) x = 640;
  2192.             y = fy;
  2193.             j = 0;
  2194.             fclose ( tp );
  2195.         }
  2196.     } else {
  2197.         j = bm_convbmp2 ( convname, bmpname2, x, y );
  2198.     }
  2199.     if ( j == 0 ) fprintf ( pat, "%s\n%u,%u,%s\n", bmpname2, x, y, convname );
  2200.     fclose ( pat );
  2201. printf ( "\033[>5h\033[2J\r" );
  2202.     return ( j );
  2203. }
  2204.  
  2205. uint bm_convbmp2 ( uchar *convname, uchar *bmpname, uint &x, uint &y ) {
  2206.     FILE *bfp;
  2207.     FILE *cfp;
  2208.     ulong i, j, k, colors, psize, rps, j2;
  2209.     uchar flag = 0; // 1なら上から格納するBMP
  2210.     ulong bx, by, n/*, ny*/;
  2211.     uchar pal[256], pt[4];
  2212.     uchar scr[320];
  2213.     uchar r[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
  2214.  
  2215.     struct bmphead { // 18 = 14 + 4
  2216.         uchar bm[2];
  2217.         ulong size;
  2218.         uint dummy[2];
  2219.         ulong start;
  2220.         ulong headsize;
  2221.     };
  2222.     union {
  2223.         uchar buf[18];
  2224.         struct bmphead r;
  2225.     } d;
  2226.     struct winhead { // 36 = 40 - 4
  2227.         long x;
  2228.         long y;
  2229.         uint dummy1;
  2230.         uint colors;
  2231.         ulong compress;
  2232.         ulong size;
  2233.         ulong dummy2[2];
  2234.         ulong rps;
  2235.         ulong dummy3;
  2236.     };
  2237.     struct os2head { // 8 = 12 - 4
  2238.         uint x;
  2239.         uint y;
  2240.         uint dummy1;
  2241.         uint colors;
  2242.     };
  2243.     union {
  2244.         uchar buf[36];
  2245.         struct winhead w;
  2246.         struct os2head o;
  2247.     } d2;
  2248.  
  2249.     bfp = fopen2 ( bmpname, "rb" );
  2250.     if ( bfp == NULL ) return ( 1 );
  2251.     cfp = fopen2 ( convname, "wb" );
  2252.     if ( cfp == NULL ) {
  2253.         fclose ( bfp );
  2254.         return ( 1 );
  2255.     }
  2256.     // ヘッダ読み込み
  2257.     fread ( d.buf, 18, 1, bfp );
  2258.     if ( ( d.r.bm[0] != 'B' ) || ( d.r.bm[1] != 'M' ) ) return ( 1 );
  2259.     fread ( d2.buf , d.r.headsize - 4, 1, bfp );
  2260.     switch ( d.r.headsize ) {
  2261.     case 40:
  2262.         // Windows Bitmap
  2263.         bx = d2.w.x;
  2264.         if ( d2.w.y < 0 ) {
  2265.             by = -d2.w.y;
  2266.             flag = 1;
  2267.         } else {
  2268.             by = d2.w.y;
  2269.             flag = 0;
  2270.         }
  2271.         colors = d2.w.colors;
  2272.         psize = 4;
  2273.         if ( d2.w.compress != 0 ) {
  2274.             // 圧縮データには対応しない
  2275.             fclose ( bfp );
  2276.             fclose ( cfp );
  2277.             return ( 1 );
  2278.         }
  2279.         if ( colors >= 16 ) rps = d2.w.rps; else rps = 0;
  2280.         break;
  2281.     case 12:
  2282.         // OS/2 Bitmap
  2283.         bx = d2.o.x;
  2284.         by = d2.o.y;
  2285.         colors = d2.o.colors;
  2286.         flag = 0;
  2287.         psize = 3;
  2288.         rps = 0;
  2289.         break;
  2290.     default:
  2291.         fclose ( bfp );
  2292.         fclose ( cfp );
  2293.         return ( 1 );
  2294.     }
  2295.     // パレット読み込み
  2296.     if ( colors >= 16 ) {
  2297.         // 今のところはパレット読み終了時点で読み飛ばしがあるためseek不要
  2298. //        fseek ( bfp, psize * rps, SEEK_CUR ); // 最適化カラーパレットを読みとばす
  2299.     } else {
  2300.         switch ( colors ) {
  2301.         case 1:
  2302.             rps = 2;
  2303.             break;
  2304.         case 4:
  2305.             rps = 16;
  2306.             break;
  2307.         case 8:
  2308.             rps = 256;
  2309.             break;
  2310.         default:
  2311.             fclose ( bfp );
  2312.             fclose ( cfp );
  2313.             return ( 1 );
  2314.         }
  2315.         for ( i = 0 ; i < rps ; i++ ) {
  2316.             fread ( pt, psize, 1, bfp );
  2317.             pal[i] = bm_to15 ( pt[0], pt[1], pt[2] );
  2318.         }
  2319.     }
  2320.     fseek ( bfp, d.r.start, SEEK_SET );
  2321.  
  2322.     // サイズ書き込み
  2323.     fputc ( bx & 255, cfp );
  2324.     fputc ( ( bx >> 8 ) & 255, cfp );
  2325.     fputc ( ( bx >> 16 ) & 255, cfp );
  2326.     fputc ( bx >> 24, cfp );
  2327.     fputc ( by & 255, cfp );
  2328.     fputc ( ( by >> 8 ) & 255, cfp );
  2329.     fputc ( ( by >> 16 ) & 255, cfp );
  2330.     fputc ( by >> 24, cfp );
  2331.     fputc ( flag, cfp );
  2332.  
  2333.     // データ読み込み
  2334.     j2 = ( bx + 7 ) / 8;
  2335.     if ( j2 > 80 ) j2 = 80;
  2336.     for ( i = 0 ; i < by ; i++ ) {
  2337.         for ( j = 0 ; j < 80 ; j++ ) for ( k = 0 ; k < 4 ; k++ ) scr[k*80+j] = 0;
  2338.         n = 0;
  2339. //        if ( flag ) ny = i; else ny = by - 1 - i;
  2340.         j = 0;
  2341.         while ( j < bx ) {
  2342.             switch ( colors ) {
  2343.             case 1:
  2344.                 pt[0] = fgetc ( bfp );
  2345.                 for ( k = 0 ; k < 8 ; k++ ) if ( j + k < bx ) {
  2346.                     if ( pt[0] && r[k] ) bm_setpixel ( scr, j + k, pal[1], i&3 );
  2347.                     else bm_setpixel ( scr, j + k, pal[0], i&3 );
  2348.                 }
  2349.                 j += 8;
  2350.                 n++;
  2351.                 break;
  2352.             case 4:
  2353.                 pt[0] = fgetc ( bfp );
  2354.                 bm_setpixel ( scr, j, pal[pt[0]>>4], i&3 );
  2355.                 if ( j + 1 < bx ) bm_setpixel ( scr, j + 1, pal[pt[0]&15], i&3 );
  2356.                 j += 2;
  2357.                 n++;
  2358.                 break;
  2359.             case 8:
  2360.                 pt[0] = fgetc ( bfp );
  2361.                 bm_setpixel ( scr, j, pal[pt[0]], i&3 );
  2362.                 j++;
  2363.                 n++;
  2364.                 break;
  2365.             case 16:
  2366.                 pt[0] = fgetc ( bfp );
  2367.                 pt[1] = fgetc ( bfp );
  2368.                 k = pt[1] * 256 + pt[0];
  2369.                 bm_setpixel ( scr, j, bm_to15 ( (k&31)*8, ((k>>5)&31)*8, ((k>>10)&31)*8 ), i&3 );
  2370.                 j++;
  2371.                 n += 2;
  2372.                 break;
  2373.             case 24:
  2374.                 for ( k = 0 ; k < 3 ; k++ ) pt[k] = fgetc ( bfp );
  2375.                 bm_setpixel ( scr, j, bm_to15 ( pt[0], pt[1], pt[2] ), i&3 );
  2376.                 j++;
  2377.                 n += 3;
  2378.                 break;
  2379.             case 32:
  2380.                 for ( k = 0 ; k < 4 ; k++ ) pt[k] = fgetc ( bfp );
  2381.                 bm_setpixel ( scr, j, bm_to15 ( pt[0], pt[1], pt[2] ), i&3 );
  2382.                 j++;
  2383.                 n += 4;
  2384.                 break;
  2385.             }
  2386.         }
  2387.         while ( n % 4 != 0 ) {
  2388.             fgetc ( bfp ); // DWORD区切りにあわせる
  2389.             n++;
  2390.         }
  2391. /*        if ( ny < 400 ) {
  2392.             for ( j = 0 ; j < 80 ; j++ ) {
  2393.                 for ( k = 0 ; k < 4 ; k++ ) {
  2394.                     pokeb ( gseg[k], j + ny * 80, scr[k*80+j] );
  2395.                 }
  2396.             }
  2397.         }
  2398. */
  2399.         for ( k = 0 ; k < 4 ; k++ ) {
  2400.             fwrite ( scr + k * 80, j2, 1, cfp );
  2401. /*            for ( j = 0 ; j < 80 ; j++ ) {
  2402.                 fputc ( scr[k*80+j], cfp );
  2403.             }
  2404. */
  2405.         }
  2406.         if ( ( i % 8 ) == 0 ) convhtmlbar ( 0, i, by, 4 );
  2407.     }
  2408.     x = bx; y = by;
  2409.     fclose ( bfp );
  2410.     fclose ( cfp );
  2411.     return ( 0 );
  2412. }
  2413.  
  2414. void bm_setpixel ( uchar *buf, uint x, uint c, uchar dy ) {
  2415.     uchar b[4] = { 1, 2, 4, 8 };
  2416.     uchar r[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
  2417.     uint i;
  2418.  
  2419.     if ( x >= 640 ) return;
  2420. /*    i = c % 17;
  2421.     c /= 17;
  2422.     if ( i >= bm_pat[x&3][dy] ) c++;
  2423. */
  2424.     c = ( c + bm_pat[x&3][dy] ) / 17;
  2425.  
  2426. //    if ( ini.bmplcd ) c = 15 - c;
  2427.     for ( i = 0 ; i < 4 ; i++ ) {
  2428.         if ( c & b[i] ) {
  2429.             *( buf + i * 80 + x / 8 ) |= r[x%8];
  2430.         } else {
  2431.             *( buf + i * 80 + x / 8 ) &= ~r[x%8];
  2432.         }
  2433.     }
  2434. }
  2435.  
  2436. uchar bm_to15 ( uchar b, uchar g, uchar r ) {
  2437.     return ( ( 151UL * g + 28UL * b + 77UL * r ) / 256 );
  2438. }
  2439.  
  2440. uint bm_writecdb ( uchar *convname, uint x, long y, uint sx, uint sy, uint ys, uint ye, uint xs, uint xe ) {
  2441.     FILE *fp;
  2442.     uint i, j, k, s2, s, s3, s4;
  2443.     uchar buf[4][80], flag;
  2444.     long y2;
  2445.     uchar *p;
  2446.     uchar far *farp;
  2447.     uchar b[8] = { 0x00, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01 };
  2448.     ulong ix;
  2449.  
  2450.     gd_waitdraw();
  2451.     fp = fopen2 ( convname, "rb" );
  2452.     if ( fp == NULL ) return ( 1 );
  2453.     p = ( uchar * )&ix;
  2454.     for ( i = 0 ; i < 4 ; i++ ) *( p + i ) = fgetc ( fp );
  2455.     for ( i = 0 ; i < 4 ; i++ ) fgetc ( fp ); // このxが画像幅 sxは表示幅
  2456.  
  2457.     // ix→s3は読み込みサイズ(Max80) sx→s2,s4は表示サイズ(byte)
  2458.     s3 = ( ix + 7 ) / 8;
  2459.     s2 = ( sx + 7 ) / 8;
  2460.     s4 = sx & 7;
  2461.     if ( s3 > 80 ) {
  2462.         s4 = 0;
  2463.         s3 = 80;
  2464.     }
  2465.  
  2466. /*    s2 = ( sx + 7 ) / 8;
  2467.     s4 = sx & 7;
  2468.     if ( s2 > 80 ) {
  2469.         s3 = 80;
  2470.         s4 = 0;
  2471.     } else s3 = s2;
  2472. */
  2473.     i = xe - xs + 1;
  2474.     if ( s2 > i ) s2 = i;
  2475.     flag = fgetc ( fp );
  2476.  
  2477.     if ( flag ) y2 = y; else y2 = y + sy - 1;
  2478.     for ( j = 0 ; j < sy ; j++ ) {
  2479.         for ( k = 0 ; k < 4 ; k++ ) {
  2480.             fread ( buf[k], s3, 1, fp );
  2481. //            if ( ini.bmplcd ) buf[k][s3-1] |= b[s4]; // bmplcd時 画像右の余白が15になるのを防ぐ
  2482.         }
  2483.         if ( y2 < ys ) {
  2484.             if ( !flag ) break;
  2485.         } else if ( y2 > ye ) {
  2486.             if ( flag ) break;
  2487.         } else {
  2488.             if ( ini.bmplcd ) for ( k = 0 ; k < 4 ; k++ ) {
  2489.                 buf[k][s3-1] |= b[s4]; // bmplcd時 画像右の余白が15になるのを防ぐ
  2490.             }
  2491.  
  2492. /*            for ( i = 0 ; i < s2 ; i++ ) {
  2493.                 for ( k = 0 ; k < 4 ; k++ ) {
  2494.                     pokeb ( gseg[k], y2 * 80 + i + xs + x / 8, buf[k][i] );
  2495.                 }
  2496.             }
  2497. */
  2498.             s = y2 * 80 + /*xs +*/ x / 8;
  2499.             for ( k = 0 ; k < 4 ; k++ ) {
  2500.                 farp = ( uchar far * ) MK_FP ( gseg[k], s );
  2501.                 p = buf[k];
  2502.                 for ( i = 0 ; i < s2 ; i++ ) {
  2503.                     if ( ini.bmplcd ) *farp = ~(*p);
  2504.                     else *farp = *p;
  2505.                     farp++;
  2506.                     p++;
  2507.                 }
  2508.             }
  2509.         }
  2510.         if ( flag ) y2++; else y2--;
  2511.     }
  2512.     fclose ( fp );
  2513.     return ( 0 );
  2514. }
  2515.  
  2516. void gb_init ( void ) {
  2517.     // gd_is5を使う作業はここでは行えない
  2518.     // gd_is5がiniファイルを読まないと決まらないが
  2519.     // 初期化を行わないとiniでパレットを読めないため。
  2520.  
  2521.     // Graphic BIOS
  2522.     inregs.h.ah = 0x40;
  2523.     int86 ( 0x18, &inregs, &outregs );
  2524.     inregs.h.ah = 0x42;
  2525.     inregs.h.ch = 0xc0;
  2526.     int86 ( 0x18, &inregs, &outregs );
  2527.  
  2528.     // Mode Flip Flop 1
  2529. /*
  2530.     outportb ( 0x68, 2 ); // Graphic ColorMode
  2531.     outportb ( 0x68, 8 ); // Graphic 400Line
  2532.     outportb ( 0x68, 15 ); // Graphic/Text On
  2533. */
  2534.     // Mode Flip Flop 2
  2535.     outportb ( 0x6a, 1 ); // 16 Colors
  2536.     outportb ( 0x6a, 0x40 ); // CRT Mode
  2537.     // Text GDC
  2538.     outportb ( 0x62, 0x0d ); // Text On
  2539.  
  2540.     // Graphic GDC
  2541.     // a2 = cmd / a0 = dat
  2542. /*
  2543.     // GGDC sync
  2544.     gd_cmd ( 0x0e );
  2545.     gd_dat ( 0x06 );
  2546.     if ( gd_is5 ) {
  2547.         gd_dat ( 0x4e );
  2548.         gd_dat ( 0x07 );
  2549.         gd_dat ( 0x25 );
  2550.         gd_dat ( 0x07 );
  2551.     } else {
  2552.         gd_dat ( 0x26 );
  2553.         gd_dat ( 0x03 );
  2554.         gd_dat ( 0x11 );
  2555.         gd_dat ( 0x03 );
  2556.     }
  2557.     gd_dat ( 0x07 );
  2558.     gd_dat ( 0x90 );
  2559.     gd_dat ( 0x65 );
  2560.  
  2561.     // GGDC zoom=0
  2562.     gd_cmd ( 0x46 );
  2563.     gd_dat ( 0x00 );
  2564.  
  2565.     // GGDC scrool
  2566.     gd_cmd ( 0x70 );
  2567.     gd_dat ( 0x00 );
  2568.     gd_dat ( 0x00 );
  2569.     gd_dat ( 0x00 );
  2570.     if ( gd_is5 ) gd_dat ( 0x59 ); else gd_dat ( 0x19 );
  2571.  
  2572.     // GGDC csrform=0
  2573.     gd_cmd ( 0x4b );
  2574.     gd_dat ( 0x00 );
  2575.  
  2576.     // GGDC pitch
  2577.     gd_cmd ( 0x47 );
  2578.     if ( gd_is5 ) gd_dat ( 0x50 ); else gd_dat ( 0x28 );
  2579. */
  2580.  
  2581.     // GGDC start
  2582.     gd_cmd ( 0x0d );
  2583.  
  2584.     // GGDC textw
  2585.     gd_textw ( 0xff, 0xff );
  2586.  
  2587.     gb_write ( 0 );
  2588.     gb_gcls ();
  2589.     gb_view ( 0 );
  2590.     gb_loadrgb ( defpalet );
  2591. }
  2592.  
  2593. void gb_init2 ( void ) {
  2594.     // GDCクロック自動取得
  2595.     if ( gd_is5 > 1 ) {
  2596.         if ( inportb ( 0x31 ) & 0x80 ) gd_is5 = 0; else gd_is5 = 1;
  2597.         if ( peekb ( 0, 0x54d ) & 4 ) gd_is5 = 1;/* else gd_is5 = 0;*/
  2598.     }
  2599. }
  2600.  
  2601. void gb_gdcmode ( uchar m ) {
  2602.     outportb ( 0x7c, m );
  2603.     pokeb ( 0, 0x495, m );
  2604. }
  2605.  
  2606. void gb_gdctile ( uchar t ) {
  2607.     uint i;
  2608.     for ( i = 0 ; i < 4 ; i++ ) {
  2609.         outportb ( 0x7e, t );
  2610.         pokeb ( 0, 0x496 + i, t );
  2611.     }
  2612. }
  2613.  
  2614. void gb_write ( uchar p ) {
  2615.     outportb ( 0xa6, p & 1 );
  2616. }
  2617.  
  2618. void gb_view ( uchar p ) {
  2619.     outportb ( 0xa4, p & 1 );
  2620. }
  2621.  
  2622. void gb_gcls ( void ) {
  2623.     uint i;
  2624.     gb_gdcmode ( 0x80 );
  2625.     gb_gdctile ( 0 );
  2626.     for ( i = 0 ; i < 0x8000; i += 2 ) poke ( 0xa800, i, 0 );
  2627.     gb_gdcmode ( 0 );
  2628. }
  2629.  
  2630. void gb_gcls2 ( uint y1, uint y2 ) {
  2631.     uint i;
  2632.     gb_gdcmode ( 0x80 );
  2633.     gb_gdctile ( 0 );
  2634.     for ( i = y1 * 80 ; i < y2 * 80 ; i += 2 ) poke ( 0xa800, i, 0 );
  2635.     gb_gdcmode ( 0 );
  2636. }
  2637.  
  2638. void gb_gcls2 ( uint y1, uint y2, uint x1, uint x2 ) {
  2639.     uint i, j;
  2640.     gb_gdcmode ( 0x80 );
  2641.     gb_gdctile ( 0 );
  2642.     for ( i = y1 * 80 ; i < y2 * 80 ; i += 80 ) {
  2643.         for ( j = x1 ; j <= x2 ; j++ ) pokeb ( 0xa800, i+j, 0 );
  2644.     }
  2645.     gb_gdcmode ( 0 );
  2646. }
  2647.  
  2648. void gb_loadrgb ( uchar* pbuf ) {
  2649.     uint i;
  2650.  
  2651.     for ( i = 0 ; i < 8 ; i++ ) {
  2652.         outportb ( 0xa8, i );
  2653.         outportb ( 0xac, *( pbuf + i * 6 + 0 ) );
  2654.         outportb ( 0xaa, *( pbuf + i * 6 + 1 ) );
  2655.         outportb ( 0xae, *( pbuf + i * 6 + 2 ) );
  2656.         outportb ( 0xa8, i + 8 );
  2657.         outportb ( 0xac, *( pbuf + i * 6 + 3 ) );
  2658.         outportb ( 0xaa, *( pbuf + i * 6 + 4 ) );
  2659.         outportb ( 0xae, *( pbuf + i * 6 + 5 ) );
  2660.     }
  2661. }
  2662.  
  2663. void gb_pstart ( void ) {
  2664.     gb_write ( 1 - gb_sw );
  2665. }
  2666.  
  2667. void gb_pend ( void ) {
  2668.     gb_sw = 1 - gb_sw;
  2669.     gb_view ( gb_sw );
  2670. }
  2671.  
  2672. //void gb_endchg ( void ) {
  2673. //    gb_write ( 1 - gb_sw );
  2674. //}
  2675.  
  2676. void gb_waitvsync ( void ) {
  2677.     int i;
  2678.  
  2679.     i = 0;
  2680.     while ( ( inportb ( 0x60 ) & 0x20 ) != 0 ) {
  2681.         i++;
  2682.         if ( i > 1000 ) return;
  2683.         if ( kbhit() ) getch();
  2684.     }
  2685.     while ( ( inportb ( 0x60 ) & 0x20 ) == 0 ) if ( kbhit() ) getch();
  2686. }
  2687.  
  2688. void gd_cmd ( uchar cmd ) {
  2689.     while ( inportb ( 0xa0 ) & 2 ) outportb ( 0x5f, 0 );
  2690.     outportb ( 0xa2, cmd );
  2691. }
  2692.  
  2693. void gd_dat ( uchar dat ) {
  2694.     while ( inportb ( 0xa0 ) & 2 ) outportb ( 0x5f, 0 );
  2695.     outportb ( 0xa0, dat );
  2696. }
  2697.  
  2698. void gd_textw ( uchar dl, uchar dh ) {
  2699.     gd_cmd ( 0x78 );
  2700.     gd_dat ( dl );
  2701.     gd_dat ( dh );
  2702. }
  2703.  
  2704. void gd_writemode ( uchar mode ) {
  2705.     gd_cmd ( 0x20 | ( mode & 3 ) );
  2706. }
  2707.  
  2708. void gd_csrw ( uchar plane, ulong ead, uchar dad ) {
  2709.     gd_cmd ( 0x49 );
  2710.     ead |= gd_gseg[plane%4];
  2711.     gd_dat ( ead & 0xff );
  2712.     gd_dat ( ( ead >> 8 ) & 0xff );
  2713.     gd_dat ( ( ( ead >> 16 ) & 3 ) | ( ( dad & 15 ) << 4 ) );
  2714. }
  2715.  
  2716. void gd_vecte ( void ) {
  2717.     gd_cmd ( 0x6c );
  2718.     while ( ( inportb ( 0xa0 ) & 4 ) == 0 ) outportb ( 0x5f, 0 );
  2719. }
  2720.  
  2721. void gd_waitdraw ( void ) {
  2722.     while ( ( inportb ( 0xa0 ) & 8 ) != 0 ) outportb ( 0x5f, 0 );
  2723. }
  2724.  
  2725. void gd_gline ( uint x1, uint y1, uint x2, uint y2, uchar color ) {
  2726.     uint gx1, gy1, gx2, gy2, zx, zy, i, le;
  2727.     int dx, dy, t;
  2728.     uchar p[4] = { 1, 2, 4, 8 }, dir;
  2729.     ulong l;
  2730.  
  2731.     if ( ini.isegc ) eg_on ();
  2732.     if ( x1 <= x2 ) {
  2733.         gx1 = x1, gy1 = y1;
  2734.         gx2 = x2, gy2 = y2;
  2735.     } else {
  2736.         gx1 = x2, gy1 = y2;
  2737.         gx2 = x1, gy2 = y1;
  2738.     }
  2739.     dx = (int)gx2 - (int)gx1;
  2740.     dy = (int)gy2 - (int)gy1;
  2741.     l = (ulong)gx1 + gy1 * 640UL;
  2742.  
  2743.     if ( dy > dx ) {
  2744.         dir = 0;
  2745.         t = dx; dx = dy; dy = t;
  2746.     } else if ( dy > 0 ) dir = 1;
  2747.     else if ( dy > -dx ) dir = 2;
  2748.     else {
  2749.         dir = 3;
  2750.         t = dx; dx = dy; dy = t;
  2751.     }
  2752.  
  2753.     if ( dx < 0 ) zx = -dx; else zx = dx;
  2754.     if ( dy < 0 ) zy = -dy; else zy = dy;
  2755.  
  2756.     if ( eg_ison ) {
  2757.         if ( color > 15 ) le = 1;
  2758.         else le = 2;
  2759.     } else le = 4;
  2760.  
  2761.     for ( i = 0 ; i < le ; i++ ) {
  2762. //        gd_waitdraw ();
  2763.         if ( eg_ison ) {
  2764.             gd_writemode ( 0 ); // GDCはreplaceモードを使い、重ね合せはEGCにさせる
  2765.             if ( color > 15 ) {
  2766.                 // 反転
  2767.                 eg_color ( 15 );
  2768.                 eg_operation ( 0x3c );
  2769.             } else if ( i == 0 ) {
  2770.                 // 描くプレーン
  2771.                 if ( color == 0 ) continue;
  2772.                 eg_color ( color );
  2773.                 eg_operation ( 0xfc );
  2774.             } else {
  2775.                 // 消すプレーン
  2776.                 if ( color == 15 ) continue;
  2777.                 eg_color ( 15 - color );
  2778.                 eg_operation ( 0x0c );
  2779.             }
  2780.         } else {
  2781.             if ( color > 15 ) gd_writemode ( 1 );
  2782.             else if ( color & p[i] ) gd_writemode ( 3 );
  2783.             else gd_writemode ( 2 );
  2784.         }
  2785.  
  2786.         // vectw
  2787.         gd_cmd ( 0x4c );
  2788.         gd_dat ( 0x08 | dir );
  2789.         gd_dat ( zx & 255 );
  2790.         t = ( zx >> 8 ) & 63;
  2791.         if ( gd_is5 ) t |= 0x40;
  2792.         gd_dat ( t );
  2793.         t = 2 * zy - zx;
  2794.         gd_dat ( t & 255 );
  2795.         gd_dat ( ( t >> 8 ) & 255 );
  2796.         t = 2 * zy - 2 * zx;
  2797.         gd_dat ( t & 255 );
  2798.         gd_dat ( ( t >> 8 ) & 255 );
  2799.         t = 2 * zy;
  2800.         gd_dat ( t & 255 );
  2801.         gd_dat ( ( t >> 8 ) & 255 );
  2802.         // csrw
  2803.         gd_csrw ( i, l >> 4, l & 15 );
  2804.         // vecte
  2805.         gd_vecte ();
  2806.         gd_waitdraw ();
  2807.     }
  2808. //    gd_waitdraw ();
  2809.     if ( ini.isegc ) eg_off ();
  2810.     else gd_waitdraw ();
  2811. }
  2812.  
  2813. void eg_init ( void ) {
  2814.     eg_on ();
  2815.     eg_color ( 15 );
  2816.     outport ( 0x4a2, 0x00ff );
  2817.     //    outport ( 0x4a4, 0x0400 );
  2818.     outport ( 0x4a8, 0xffff );
  2819.     outport ( 0x4ac, 0x0000 );
  2820.     outport ( 0x4ae, 0x000f );
  2821.     eg_off ();
  2822. }
  2823.  
  2824. void eg_color ( uchar c ) {
  2825.     uint c1, c2, c3;
  2826.     uchar a = 0;
  2827.     if ( eg_ison == 0 ) {
  2828.         a = 1;
  2829.         eg_on ();
  2830.     }
  2831.  
  2832.     c &= 15;
  2833.     c1 = c;
  2834.     c2 = ~(c1 >> 1);
  2835.     c3 = ~(( c1 & 1 ) << 3);
  2836.     outport ( 0x4a0, c2 & c3 );
  2837.  
  2838.     if ( a ) eg_off ();
  2839. }
  2840.  
  2841. void eg_on ( void ) {
  2842.     gb_gdcmode ( 0x80 );
  2843.     outportb ( 0x6a, 0x07 );
  2844.     outportb ( 0x6a, 0x05 );
  2845.     eg_ison = 1;
  2846. }
  2847.  
  2848. void eg_off ( void ) {
  2849.     gd_waitdraw();
  2850.     outport ( 0x4a0, 0xfff0 );
  2851.     outportb ( 0x6a, 0x04 );
  2852.     outportb ( 0x6a, 0x06 );
  2853.     gb_gdcmode ( 0 );
  2854.     eg_ison = 0;
  2855. }
  2856.  
  2857. void eg_operation ( uchar ope ) {
  2858.     // R7~R0を直接opeで受ける
  2859.     uchar a = 0;
  2860.     if ( eg_ison == 0 ) {
  2861.         eg_on ();
  2862.         a = 1;
  2863.     }
  2864.     outport ( 0x4a4, 0x0c00 | ope );
  2865.     if ( a ) eg_off ();
  2866. }
  2867.  
  2868. void di_initdaua ( void ) {
  2869.     uchar c;
  2870.  
  2871.     inregs.h.cl = 0x13;
  2872.     segread ( &segregs );
  2873.     segregs.ds = FP_SEG ( di_daua );
  2874.     inregs.x.dx = FP_OFF ( di_daua );
  2875.     int86x ( 0xdc, &inregs, &outregs, &segregs );
  2876.  
  2877.     // RAMドライブ判別
  2878.     di_noteram[0] = di_noteram[1] = 9;
  2879.     if ( peekb ( 0, 0x400 ) & 128 ) {
  2880.         c = peekb ( 0, 0x488 );
  2881.         if ( c & 128 ) di_noteram[1] = 3;
  2882.         if ( c & 64 ) di_noteram[1] = 2;
  2883.         if ( c & 32 ) di_noteram[1] = 1;
  2884.         if ( c & 16 ) di_noteram[1] = 0;
  2885.         if ( c & 8 ) di_noteram[0] = 3;
  2886.         if ( c & 4 ) di_noteram[0] = 2;
  2887.         if ( c & 2 ) di_noteram[0] = 1;
  2888.         if ( c & 1 ) di_noteram[0] = 0;
  2889.     }
  2890. }
  2891.  
  2892. uchar di_getdaua ( uchar drive ) {
  2893.     if ( drive > 25 ) return 0;
  2894.     return ( di_daua[drive*2+0x1b] );
  2895. }
  2896.  
  2897. uint convhtml ( uchar *cdhname, uchar *headname, uchar *htmlname, uchar &kmode, ulong &cdhx, ulong &cdhy ) {
  2898.     // 無意味に長いタグへの対応が前版ではできなかった
  2899.     FILE *cdhfp;
  2900.     FILE *headfp;
  2901.     FILE *htmlfp;
  2902.     FILE *htmlfp2;
  2903.     ulong flen;
  2904.     ulong scrx = 640 - 8 * 4;
  2905.     uchar istext = 0;
  2906.     struct fnsplit fns;
  2907.     uint hx;
  2908.     ulong hy;
  2909.  
  2910.     uchar ch, ch2;
  2911.     uint i, j;
  2912.     uchar ink = 0, inh = 0;
  2913.     uchar buf[pathmax], buf2[pathmax];
  2914.  
  2915.     ulong l, fl;
  2916.     uchar vs = 0;
  2917.  
  2918.     struct ffblk find;
  2919.     uint da[6];
  2920.  
  2921.  
  2922.     neffs = 0;
  2923.     cdhx = cdhy = 0;
  2924.  
  2925.     uchar localname[pathmax];
  2926.  
  2927.     fnsplit2 ( htmlname, &fns );
  2928. printf ( "\033[3;1H\033[>5l\r" );
  2929.     fnmerge3 ( localname, &fns );
  2930. printf ( "\033[>5h\033[2J\r" );
  2931.  
  2932.     // Ver2.10N 変更
  2933.     if ( ( fns.sw == 0 ) && ( fns.nname[0] == '\0' ) ) {
  2934.         // フォルダ対象
  2935.         cdhfp = fopen2 ( cdhname, "w" );
  2936.         if ( cdhname == NULL ) return ( 1 );
  2937.         headfp = fopen2 ( headname, "w" );
  2938.         if ( headname == NULL ) {
  2939.             fclose ( cdhfp );
  2940.             return ( 1 );
  2941.         }
  2942.         fprintf ( headfp, "F%s\n", htmlname );
  2943.         fprintf ( cdhfp, "E80,00000000000000000000000000000000000000000000000000000000000000000000000000000000\n" );
  2944.         fprintf ( cdhfp, "T0,0,現在のフォルダは\n" );
  2945.         fprintf ( cdhfp, "T0,20,%s\n", htmlname );
  2946.         fprintf ( cdhfp, "E80,66666666666600000000000000000000000000000000000000000000000000000000000000000000\n" );
  2947.  
  2948.         l = 60, fl = 0;
  2949.         strcpy ( buf, htmlname );
  2950.         strcat ( buf, "*.*" );
  2951.         i = findfirst ( buf, &find, 0x37 );
  2952.         while ( i == 0 ) {
  2953.             if ( ( strcmp ( find.ff_name, "." ) != 0 ) && ( find.ff_name[0] != '$' ) ) {// updir..は必要だがcurdir.は要らない・$temp.cdhなどを指定されるとたいへんなことになる
  2954.                 fl++;
  2955.                 strcpy ( buf2, htmlname );
  2956.                 strcat ( buf2, find.ff_name );
  2957.                 // リンク設定
  2958.                 if ( find.ff_attrib & FA_DIREC ) strcpy ( buf, "\\" ); else buf[0] = '\0';
  2959.                 fprintf ( headfp, "A0,%lu,95,%lu,%s%s\n", l, l + 15, find.ff_name, buf );
  2960.                 // ファイル名・拡張子展開
  2961.                 if ( strcmp ( find.ff_name, ".." ) == 0 ) {
  2962.                     ch2 = ' ';
  2963.                     ch = 2;
  2964.                 } else {
  2965.                     for ( ch2 = 0 ; ch2 < 12 ; ch2++ ) {
  2966.                         // 2byte目が'.'になる漢字はSJISにない
  2967.                         if ( find.ff_name[ch2] == '.' ) {
  2968.                             ch = ch2 + 1;
  2969.                             find.ff_name[ch2] = '\0';
  2970.                             break;
  2971.                         } else if ( find.ff_name[ch2] == '\0' ) {
  2972.                             ch = ch2;
  2973.                             break;
  2974.                         }
  2975.                     }
  2976.                     if ( find.ff_name[ch] == '\0' ) ch2 = ' '; else ch2 = '.';
  2977.                 }
  2978.                 fprintf ( cdhfp, "T0,%lu,%-8.8s%c%-3.3s", l, find.ff_name, ch2, find.ff_name + ch );
  2979.                 if ( find.ff_attrib & FA_DIREC ) {
  2980.                     if ( strcmp ( find.ff_name, ".." ) == 0 ) fprintf ( cdhfp, "  (Up  Folder)" );
  2981.                     else fprintf ( cdhfp, "  (Sub Folder)" );
  2982.                 } else {
  2983.                     sprintf ( buf, "%10ld", find.ff_fsize );
  2984.                     if ( find.ff_fsize >= 1000000000L ) {
  2985.                         buf[20] = buf[21] = buf[22] = ',';
  2986.                     } else if ( find.ff_fsize >= 1000000L ) {
  2987.                         buf[20] = ' ';
  2988.                         buf[21] = buf[22] = ',';
  2989.                     } else if ( find.ff_fsize >= 1000L ) {
  2990.                         buf[20] = buf[21] = ' ';
  2991.                         buf[22] = ',';
  2992.                     } else {
  2993.                         buf[20] = buf[21] = buf[22] = ' ';
  2994.                     }
  2995.                     fprintf ( cdhfp, " %c%c%c%c%c%c%c%c%c%c%c%c%c", buf[0], buf[20], buf[1], buf[2], buf[3], buf[21], buf[4], buf[5], buf[6], buf[22], buf[7], buf[8], buf[9] );
  2996.                 }
  2997.                 for ( j = 0 ; j < 6 ; j++ ) buf[j] = '.';
  2998.                 buf[6] = ' ';
  2999.                 if ( find.ff_attrib & FA_RDONLY ) buf[0] = 'R';
  3000.                 if ( find.ff_attrib & FA_HIDDEN ) buf[1] = 'H';
  3001.                 if ( find.ff_attrib & FA_SYSTEM ) buf[2] = 'S';
  3002.                 if ( find.ff_attrib & FA_ARCH ) buf[3] = 'A';
  3003.                 if ( find.ff_attrib & FA_LABEL ) buf[4] = 'V';
  3004.                 if ( find.ff_attrib & FA_DIREC ) buf[5] = 'D';
  3005.                 da[0] = ( find.ff_fdate >> 9 ) + 1980;
  3006.                 da[1] = ( find.ff_fdate >> 5 ) & 15;
  3007.                 da[2] = find.ff_fdate & 31;
  3008.                 da[3] = find.ff_ftime >> 11;
  3009.                 da[4] = ( find.ff_ftime >> 5 ) & 31;
  3010.                 da[5] = ( find.ff_ftime & 31 ) << 1;
  3011.                 if ( find.ff_attrib & FA_DIREC ) {
  3012.                     buf[7] = '\0';
  3013.                 } else {
  3014.                     maketop ( buf + 7, buf2, find.ff_name + ch, 22 );
  3015.                 }
  3016.                 fprintf ( cdhfp, " %4u/%2u/%2u %2u:%02u:%02u %s\n", da[0], da[1], da[2], da[3], da[4], da[5], buf );
  3017.                 l += 20;
  3018.             }
  3019.             i = findnext ( &find );
  3020.             convhtmlbar ( 0, fl, 0, 3 );
  3021.         }
  3022.         l += 20;
  3023.         fprintf ( cdhfp, "E80,66666666000000000000000000000000000000000000000000000000000000000000000000000000\n" );
  3024.         for ( i = 0 ; i < 26 ; i++ ) {
  3025.             ch = di_getdaua ( i );
  3026.             fprintf ( headfp, "A0,%lu,63,%lu,%c:\\\n", l, l + 15, 'A' + i );
  3027.             fprintf ( cdhfp, "T0,%lu,Drive %c:  (%02X)", l, 'A' + i, ch );
  3028.             ch2 = ch & 15;
  3029.             switch ( ch >> 4 ) {
  3030.             case 1:
  3031.                 if ( ch2 == di_noteram[0] ) fprintf ( cdhfp, " (RAM)" );
  3032.                 fprintf ( cdhfp, " FDD 1.2MB/640KB\n" );
  3033.                 break;
  3034.             case 2:
  3035.                 fprintf ( cdhfp, " SCSI\n" );
  3036.                 break;
  3037.             case 3:
  3038.                 if ( ch2 == di_noteram[0] ) fprintf ( cdhfp, " (RAM)" );
  3039.                 fprintf ( cdhfp, " FDD 1.2MB/1.44MB\n" );
  3040.                 break;
  3041.             case 4:
  3042.                 fprintf ( cdhfp, " RAM\n" );
  3043.                 break;
  3044.             case 5:
  3045.                 fprintf ( cdhfp, " FDD 320KB\n" );
  3046.                 break;
  3047.             case 6:
  3048.                 fprintf ( cdhfp, " Net BRANCH4670\n" );
  3049.                 break;
  3050.             case 7:
  3051.                 if ( ch2 == di_noteram[1] ) fprintf ( cdhfp, " (RAM)" );
  3052.                 fprintf ( cdhfp, " FDD 640KB\n" );
  3053.                 break;
  3054.             case 8:
  3055.                 fprintf ( cdhfp, " SASI/IDE\n" );
  3056.                 break;
  3057.             case 9:
  3058.                 if ( ch2 == di_noteram[0] ) fprintf ( cdhfp, " (RAM)" );
  3059.                 fprintf ( cdhfp, " FDD 1.2MB\n" );
  3060.                 break;
  3061.             case 10:
  3062.                 fprintf ( cdhfp, " SCSI\n" );
  3063.                 break;
  3064.             case 11:
  3065.                 if ( ch2 == di_noteram[0] ) fprintf ( cdhfp, " (RAM)" );
  3066.                 fprintf ( cdhfp, " FDD 1.2MB/1.44MB\n" );
  3067.                 break;
  3068.             case 12:
  3069.                 fprintf ( cdhfp, " SCSI\n" );
  3070.                 break;
  3071.             case 13:
  3072.                 fprintf ( cdhfp, " ROM\n" );
  3073.                 break;
  3074.             case 14:
  3075.                 fprintf ( cdhfp, " RAM\n" );
  3076.                 break;
  3077.             case 15:
  3078.                 if ( ch2 == di_noteram[1] ) fprintf ( cdhfp, " (RAM)" );
  3079.                 fprintf ( cdhfp, " FDD 640KB/1.2MB\n" );
  3080.                 break;
  3081.             case 0:
  3082.             default:
  3083.                 fprintf ( cdhfp, " Unknown\n" );
  3084.                 break;
  3085.             }
  3086.             l += 20;
  3087.             fl++;
  3088.             convhtmlbar ( 0, fl, 0, 3 );
  3089.         }
  3090.         fprintf ( headfp, "Y%lu\n", l );
  3091.         fclose ( headfp );
  3092.         fclose ( cdhfp );
  3093.         cdhx = 8 * ( 80 - 5 );
  3094.         cdhy = l;
  3095.         return ( 0 );
  3096.     }
  3097.  
  3098.     // これ以降はファイルが対象
  3099.  
  3100.     // 開けるか
  3101.     htmlfp2 = fopen2 ( localname, "rb" );
  3102.     if ( htmlfp2 == NULL ) {
  3103.         cdhfp = fopen2 ( cdhname, "w" );
  3104.         if ( cdhname == NULL ) return ( 1 );
  3105.         headfp = fopen2 ( headname, "w" );
  3106.         if ( headname == NULL ) {
  3107.             fclose ( cdhfp );
  3108.             return ( 1 );
  3109.         }
  3110.         fprintf ( headfp, "F%s\n", htmlname );
  3111.         fprintf ( cdhfp, "E000000000000000000000000\n" );
  3112.         fprintf ( cdhfp, "T0,0,ファイルが見つかりません\n" );
  3113.         i = 13*8;
  3114.         j = 20;
  3115.         fprintf ( headfp, "Y%u\n", (uint)j );
  3116.         fclose ( headfp );
  3117.         fclose ( cdhfp );
  3118.         cdhx = i, cdhy = j;
  3119.         return ( 2 );
  3120.     }
  3121.     fclose ( htmlfp2 );
  3122.  
  3123.     if ( ( stricmp ( fns.ext, ".bmp" ) == 0 ) || ( stricmp ( fns.ext, ".jpg" ) == 0 ) || ( stricmp ( fns.ext, ".png" ) == 0 ) || ( stricmp ( fns.ext, ".gif" ) == 0 ) ){
  3124.         // 画像のネット対応はここもいじること
  3125.         cdhfp = fopen2 ( cdhname, "w" );
  3126.         if ( cdhname == NULL ) return ( 1 );
  3127.         headfp = fopen2 ( headname, "w" );
  3128.         if ( headname == NULL ) {
  3129.             fclose ( cdhfp );
  3130.             return ( 1 );
  3131.         }
  3132.         strcpy ( buf2, "$temp.pat" );
  3133.         dr_settempdir ( buf2 );
  3134.         if ( bm_convbmp ( buf, localname, i, j, buf2 ) != 0 ) {
  3135.             fprintf ( headfp, "F%s\n", htmlname );
  3136.             fprintf ( cdhfp, "E00000000000000000000\n" );
  3137.             fprintf ( cdhfp, "T0,0,画像を読み込めません\n" );
  3138.             j = 20;
  3139.             fprintf ( headfp, "Y%u\n", (uint)j );
  3140.             fclose ( headfp );
  3141.             fclose ( cdhfp );
  3142.             return ( 1 );
  3143.         }
  3144.         fprintf ( headfp, "F%s\n", htmlname );
  3145.         fprintf ( cdhfp, "G0,0,%u,%u,%s\n", i, j, buf );
  3146.         fprintf ( headfp, "TImage %ux%u\n", i, j );
  3147.         fprintf ( headfp, "Y%u\n", j );
  3148.         fclose ( headfp );
  3149.         fclose ( cdhfp );
  3150.         cdhx = i, cdhy = j;
  3151.         return ( 0 );
  3152.     }
  3153.  
  3154.     htmlfp2 = fopen2 ( localname, "rb" );
  3155.     if ( htmlfp2 == NULL ) return ( 1 );
  3156.     strcpy ( buf, "$temp.htm" );
  3157.     dr_settempdir ( buf );
  3158.     htmlfp = fopen2 ( buf, "wb" );
  3159.     if ( htmlfp == NULL ) {
  3160.         fclose ( htmlfp2 );
  3161.         return ( 1 );
  3162.     }
  3163.  
  3164.     // ファイルかフォルダかの判定で既にfnsに入っている
  3165.     // 1文字読んでみてHTML判別
  3166.     // '<'で始まるか.htmか.shtかならばHTMLとして扱う
  3167.     istext = 1;
  3168.     if ( stricmp ( fns.ext, ".htm" ) == 0 ) istext = 0;
  3169.     if ( stricmp ( fns.ext, ".sht" ) == 0 ) istext = 0;
  3170.     ch = fgetc ( htmlfp2 );
  3171.     if ( ch == '<' ) istext = 0;
  3172.     ungetc ( ch, htmlfp2 );
  3173.  
  3174.     // 漢字コード切り替え(kmodeがautoでない場合はそのまま通過)
  3175.     // 判定
  3176.     while ( ( !feof ( htmlfp2 ) ) && ( kmode == ft_km_auto ) ) {
  3177.         ch = fgetc ( htmlfp2 );
  3178.         if ( ( ch >= 0x81 ) && ( ch <= 0xa0 ) ) {
  3179.             ch2 = fgetc ( htmlfp2 );
  3180.             switch ( ch ) {
  3181.             case 0x8e:
  3182.                 if ( ( ch2 <= 0xa0 ) || ( ch2 >= 0xe0 ) ) kmode = ft_km_sjis;
  3183.                 break;
  3184.             case 0x8f:
  3185.                 if ( ( ch2 <= 0xa0 ) || ( ch2 == 0xff ) ) kmode = ft_km_sjis;
  3186.                 else if ( ( ch2 == 0xfd ) || ( ch2 == 0xfe ) ) kmode = ft_km_eucjp;
  3187.                 break;
  3188.             default:
  3189.                 kmode = ft_km_sjis;
  3190.                 break;
  3191.             }
  3192.         } else if ( ( ch >= 0xa1 ) && ( ch <= 0xdf ) ) {
  3193.             ch2 = fgetc ( htmlfp2 );
  3194.             if ( ch2 <= 0xa0 ) kmode = ft_km_sjis;
  3195.             else if ( ( ( ch2 >= 0xf0 ) && ( ch2 <= 0xf9 ) ) || ( ch2 >= 0xfb ) ) kmode = ft_km_eucjp;
  3196.         } else if ( ( ( ch >= 0xe0 ) && ( ch <= 0xef ) ) || ( ch == 0xfa ) ) {
  3197.             ch2 = fgetc ( htmlfp2 );
  3198.             if ( ch2 <= 0xa0 ) kmode = ft_km_sjis;
  3199.             else if ( ch2 >= 0xfd ) kmode = ft_km_eucjp;
  3200.         } else if ( ch == 0x1b ) {
  3201.             kmode = ft_km_sjis; // JISはSJIS扱いに含める
  3202.         }
  3203.     }
  3204. /*
  3205. switch ( kmode ) {
  3206. case ft_km_auto: printf ( "Kanji : None\r" );break;
  3207. case ft_km_sjis: printf ( "Kanji : JIS or MS\r" );break;
  3208. case ft_km_eucjp: printf ( "Kanji : EUC-JP\r" );break;
  3209. }
  3210. */
  3211.     if ( kmode == ft_km_auto ) kmode = ft_km_sjis;
  3212.     // 変換
  3213.     fseek ( htmlfp2, 0, SEEK_SET );
  3214.     fl = filelength ( fileno ( htmlfp2 ) );
  3215.     l = 0, vs = 0;
  3216.     while ( !feof ( htmlfp2 ) ) {
  3217.         ch = fgetc ( htmlfp2 );
  3218.         l++;
  3219.         switch ( ch ) {
  3220.         case 0x1b:
  3221.             ch2 = fgetc ( htmlfp2 );
  3222.             l++;
  3223.             switch ( ch2 ) {
  3224.             case 0x24:
  3225.                 ink = 1;
  3226.                 break;
  3227.             case 0x28:
  3228.                 ink = 0;
  3229.                 break;
  3230.             }
  3231.             fgetc ( htmlfp2 );
  3232.             l++;
  3233.             break;
  3234.         case 0x0e:
  3235.             inh = 1;
  3236.             break;
  3237.         case 0x0f:
  3238.             inh = 0;
  3239.             break;
  3240.         default:
  3241.             if ( ( ch == '\n' ) || ( ch == '\r' ) ) fputc ( ch, htmlfp );
  3242.             else if ( ch == '\t' ) {
  3243.                 if ( istext ) fputc ( ' ', htmlfp );
  3244.                 else fputc ( '\t', htmlfp );
  3245.             } else if ( ch < ' ' ) {
  3246.                 fputc ( '^', htmlfp );
  3247.                 fputc ( ch + 0x40, htmlfp );
  3248.             }
  3249.             else if ( ink ) {
  3250.                 // JIS漢字
  3251.                 ch2 = fgetc ( htmlfp2 );
  3252.                 l++;
  3253.                 i = jistojms ( ch * 256U + ch2 );
  3254.                 if ( i != 0 ) {
  3255.                     fputc ( i >> 8, htmlfp );
  3256.                     fputc ( i & 255, htmlfp );
  3257.                 }
  3258.             } else if ( inh ) {
  3259.                 // JIS半角カナ
  3260.                 fputc ( ( ch & 127 ) + 0xa0 - 0x20, htmlfp );
  3261.             } else if ( kmode == ft_km_eucjp ) {
  3262.                 // EUC
  3263.                 if ( ch == 0x8e ) {
  3264.                     ch2 = fgetc ( htmlfp2 );
  3265.                     l++;
  3266.                     fputc ( ch2, htmlfp );
  3267.                 } else if ( ch == 0x8f ) {
  3268.                     // getのみ
  3269.                 } else if ( ch >= 0xa1 ) {
  3270.                     ch2 = fgetc ( htmlfp2 );
  3271.                     l++;
  3272.                     ch &= 127;
  3273.                     ch2 &= 127;
  3274.                     i = jistojms ( ch * 256U + ch2 );
  3275.                     if ( i != 0 ) {
  3276.                         fputc ( i >> 8, htmlfp );
  3277.                         fputc ( i & 255, htmlfp );
  3278.                     }
  3279.                 } else {
  3280.                     fputc ( ch, htmlfp );
  3281.                 }
  3282.             } else {
  3283.                 // SJIS
  3284.                 if ( ( ( ch >= 0x81 ) && ( ch <= 0x9f ) ) || ( ch >= 0xe0 ) ) {
  3285.                     ch2 = fgetc ( htmlfp2 );
  3286.                     l++;
  3287.                     if ( iskanji2 ( ch2 ) ) {
  3288.                         fputc ( ch, htmlfp );
  3289.                         fputc ( ch2, htmlfp );
  3290.                     }
  3291.                 } else {
  3292.                     fputc ( ch, htmlfp );
  3293.                 }
  3294.             }
  3295.             break;
  3296.         }
  3297.         vs++;
  3298.         if ( ( vs % 100 ) == 0 ) {
  3299.             vs = 0;
  3300.             convhtmlbar ( 0, l, fl, 2 );
  3301.         }
  3302.     }
  3303.     fclose ( htmlfp );
  3304.     fclose ( htmlfp2 );
  3305.  
  3306.  
  3307.     strcpy ( buf, "$temp.htm" );
  3308.     dr_settempdir ( buf );
  3309.     htmlfp = fopen2 ( buf, "rb" );
  3310.     if ( htmlfp == NULL ) return ( 1 );
  3311.     flen = filelength ( fileno ( htmlfp ) );
  3312.  
  3313.     cdhfp = fopen2 ( cdhname, "w" );
  3314.     if ( cdhname == NULL ) {
  3315.         fclose ( htmlfp );
  3316.         return ( 1 );
  3317.     }
  3318.  
  3319.     headfp = fopen2 ( headname, "w" );
  3320.     if ( headname == NULL ) {
  3321.         fclose ( htmlfp );
  3322.         fclose ( cdhfp );
  3323.         return ( 1 );
  3324.     }
  3325.     fprintf ( headfp, "F%s\n", htmlname );
  3326.  
  3327.     convhtml2 ( cdhfp, headfp, htmlfp, flen, &scrx, 0, &hx, &hy, istext, htmlname );
  3328.     cdhx = hx, cdhy = hy;
  3329.     fprintf ( headfp, "Y%lu\n", hy );
  3330.  
  3331.     fclose ( headfp );
  3332.     fclose ( cdhfp );
  3333.     fclose ( htmlfp );
  3334.     return ( 0 );
  3335. }
  3336.  
  3337. void convhtml2 ( FILE *cdhtmlfp, FILE *headerfp, FILE *htmlfp, ulong length, ulong *xl, uint tdepth, uint *hx, ulong *hy, uchar istext, uchar *chname ) {
  3338. uchar vsw = 0, vsw2 = 0;
  3339.     ulong c = 0,/* l,*/ l2;
  3340.     uint i, j[10];
  3341.     uchar ch, ch2;
  3342.     uchar *p;
  3343.     uint f, g;
  3344.     int in;
  3345.  
  3346.     FILE *cdhfp;
  3347.     FILE *headfp;
  3348.     FILE *tablefp;
  3349.     ulong cellx[40];
  3350.     cellx[0] = xl[0];
  3351.  
  3352.     cdhfp = cdhtmlfp, headfp = headerfp; // tableでは一旦別のfpに書いてそれを読むのでこうする
  3353.     tablefp = NULL; // tableタグのないtd,thを無視できるように
  3354.  
  3355.     // タグ処理
  3356.     enum { tagpmax = 20, retl = 20 };
  3357.     uchar tagbuf[1000], tagbuf2[1000], cbuf[4];
  3358.     uchar *tagp[tagpmax][2];
  3359.     uchar tagn = '\0';
  3360.     uint ntagl = 0, ntagp = 0;
  3361.     uint neff = 0; // tableタグを超えたエフェクト伝達はないのでローカルでよい
  3362.     uchar tralign = tx_align_l; // trタグでのalign
  3363.  
  3364.     uint ttx, tpx, tpx2, tbx;
  3365.     ulong tty, tty2, tpy, tpy2;
  3366.     uint ntd = 0, ntr = 0;
  3367.     uchar taddbuf[200];
  3368.     uchar *tap;
  3369.     ulong sy2;
  3370.  
  3371.     uchar inbody, inpre = istext, intitle = 0, incaption = 0, inspace = 0;
  3372.     uchar title[200];
  3373.     uint titlelen = 0;
  3374.  
  3375.     uint inblock = 0, indd = 0, inlist = 0;
  3376.     uint osx = 0, oex = xl[0];
  3377.  
  3378.     struct fnsplit fns;
  3379.  
  3380.     // テーブル再帰処理
  3381.     struct tx tx;
  3382.     tx.align = tx_align_l;
  3383.     uchar tableborder = 0;
  3384.     fpos_t fpt, tablestart, tableend, startp;
  3385.     fgetpos ( htmlfp, &startp );
  3386.     uint ntable; // tdepthとは別にすることで/tableを検出する 今回処理するのはntable=1の部分
  3387.     if ( tdepth > 0 ) {
  3388.         ntable = 0; // table処理中なら最初のtableは書式設定のため すぐにntable=0→1となるはず
  3389.         inbody = 1;
  3390.     } else {
  3391.         ntable = 1;
  3392. //        inbody = 0;
  3393.         inbody = 1;
  3394.     }
  3395.  
  3396.     // タグ代替テキスト用
  3397.     uchar tagtext[20];
  3398.  
  3399.     *hx = 0;
  3400.     *hy = 0;
  3401.     tx_init ( &tx, xl[0] );
  3402.  
  3403.     ch2 = '\0';
  3404.     while ( c < length ) {
  3405.         ch = fgetc ( htmlfp );
  3406.         if ( feof ( htmlfp ) ) break;
  3407.         if ( ( !istext ) && ( ch == '<' ) ) {
  3408.             ntagl = 0, ntagp = 0;
  3409.             fgetpos ( htmlfp, &fpt );
  3410.             // >まで読んでみて、-->でなかったら-->が出るまで読み飛ばす
  3411.             // <!-- <tag> <tag> -->
  3412.             //         ↑から    ↑までさらに読み飛ばすということ
  3413.  
  3414.             // タグ内容を読み込む
  3415.             ch = fgetc ( htmlfp ); // <は読み捨てる
  3416.             c++;
  3417.             while ( ( c < length ) && ( ch != '>' ) && ( !feof ( htmlfp ) ) ) {
  3418.                 tagbuf[ntagl] = ch;
  3419.                 ntagl++;
  3420.                 ch = fgetc ( htmlfp );
  3421.                 c++; // >も読み捨てる
  3422.             }
  3423.             tagbuf[ntagl] = '\0';
  3424.  
  3425.             // タグ内容を分割する
  3426.             p = tagbuf;
  3427.             f = 1 , ntagp = 0; // "内部ならf=0
  3428.             while ( ( ntagp < tagpmax ) && ( *p != '\0' ) ) {
  3429.                 if ( iskanji ( *p ) ) {
  3430.                     p += 2;
  3431.                     if ( *( p - 1 ) == '\0' ) p--;
  3432.                 } else {
  3433.                     switch ( *p ) {
  3434.                     case '"':
  3435.                         strcpy ( tagbuf2, p + 1 );
  3436.                         strcpy ( p, tagbuf2 );
  3437.                         f = 1 - f;
  3438.                         p--; // "のぶんがなくなったのでpは移動しない
  3439.                         break;
  3440.                     case ' ':
  3441.                     case '\r':
  3442.                     case '\n':
  3443.                         if ( f ) {
  3444.                             *p = '\0';
  3445.                             tagp[ntagp][0] = p + 1;
  3446.                             tagp[ntagp][1] = &tagn;
  3447.                             ntagp++;
  3448.                         }
  3449.                         break;
  3450.                     case '=':
  3451.                         // align=left=toだと、
  3452.                         // 「align」=「left=to」になる
  3453.                         if ( ( f ) && ( tagp[ntagp-1][1] == &tagn ) ) {
  3454.                             *p = '\0';
  3455.                             tagp[ntagp-1][1] = p + 1;
  3456.                         }
  3457.                         break;
  3458.                     default:
  3459.                         break;
  3460.                     }
  3461.                     p++;
  3462.                 }
  3463.             }
  3464.  
  3465. // for debug
  3466. // タグ内容の表示
  3467. //printf ( "%s\n", tagbuf );
  3468. //for ( i = 0 ; i < ntagp ; i++ ) printf ( "    %s = %s\n", tagp[i][0], tagp[i][1] );
  3469.  
  3470.             // タグ命令の判別
  3471.             if ( strncmp ( tagbuf, "!--", 3 ) == 0 ) {
  3472.                 // コメント
  3473.                 // -->でなければさらに読み飛ばす
  3474.  
  3475. //printf ( "........comment detected.\n" );
  3476.                 // 最終3文字を読む
  3477.                 cbuf[0] = tagbuf[ntagl-2];
  3478.                 cbuf[1] = tagbuf[ntagl-1];
  3479.                 cbuf[2] = '>';
  3480.                 cbuf[3] = '\0';
  3481.  
  3482.                 // -->になるまで読みとばす
  3483.                 while ( ( c < length ) && ( stricmp ( cbuf, "-->" ) != 0 ) ) {
  3484.                     cbuf[0] = cbuf[1];
  3485.                     cbuf[1] = cbuf[2];
  3486.                     cbuf[2] = fgetc ( htmlfp );
  3487.                     c++;
  3488.                 }
  3489.             }
  3490.  
  3491.             // 表関連
  3492.             if ( stricmp ( tagbuf, "table" ) == 0  ) {
  3493.                 switch ( ntable ) {
  3494.                 case 0:
  3495.                     // table処理中 現在のtableの書式
  3496.                     break;
  3497.                 case 1:
  3498.                     // 新規処理table 範囲開始
  3499.                     tx_empreturn ( &tx, cdhfp, headfp, retl ); // /tableで書き込みがあるので行の途中では困る
  3500.                     tablestart = fpt - 1; // tableタグ開始地点を起点にするのでfptが必要
  3501.                     tableborder = 0;
  3502.                     for ( i = 0 ; i < ntagp ; i++ ) {
  3503.                         if ( stricmp ( tagp[i][0], "border" ) == 0 ) {
  3504.                             if ( stricmp ( tagp[i][1], "0" ) == 0 ) tableborder = 0;
  3505.                             else tableborder = 1;
  3506.                         }
  3507.                     }
  3508.                     break;
  3509.                 default:
  3510.                     // 処理開始table内のtable 再帰内で処理
  3511.                     break;
  3512.                 }
  3513.                 ntable++;
  3514.             }
  3515.             if ( stricmp ( tagbuf, "/table" ) == 0  ) {
  3516.                 if ( ntable > 0 ) ntable--;
  3517.                 switch ( ntable ) {
  3518.                 case 1:
  3519.                     // table範囲終了・再帰
  3520.                     fgetpos ( htmlfp, &tableend );
  3521.                     // <table>  </table>
  3522.                     //↑start          ↑end
  3523.                     fpt = tableend - tablestart; // 再読み込み範囲となる
  3524.  
  3525.                     tdepth++;
  3526.  
  3527.                     sprintf ( tagbuf, "%s$table%02u.cdh", tempdir, tdepth );
  3528.                     cdhfp = fopen2 ( tagbuf, "w" );
  3529.                     sprintf ( tagbuf, "%s$table%02u.hdr", tempdir, tdepth );
  3530.                     headfp = fopen2 ( tagbuf, "w" );
  3531.  
  3532.                     if ( ( cdhfp != NULL ) && ( headfp != NULL ) ) {
  3533.                         // 第1回再帰呼び出し
  3534.                         for ( i = 0 ; i < 40 ; i++ ) cellx[i] = xl[ntd]- inblock - indd - inlist;
  3535.                         fsetpos ( htmlfp, &tablestart );
  3536.                         convhtml2 ( cdhfp, headfp, htmlfp, fpt, cellx, tdepth, &ttx, &tty, istext, chname );
  3537.  
  3538.                         fclose ( cdhfp );
  3539.                         fclose ( headfp );
  3540.  
  3541.                         // 幅計算
  3542.                         sprintf ( tagbuf, "%s$table%02u.cdh", tempdir, tdepth );
  3543.                         tablefp = fopen2 ( tagbuf, "r" );
  3544.                         for ( i = 0 ; i < 40 ; i++ ) cellx[i] = 0;
  3545.                         while ( !feof ( tablefp ) ) {
  3546.                             taddbuf[0] = '\0';
  3547.                             fgets ( taddbuf, 200, tablefp );
  3548.                             switch ( taddbuf[0] ) {
  3549.                             case 'C':
  3550.                                 sscanf ( &taddbuf[1], "%u,%u,%u", &j[0], &j[1], &j[2] ); // 横幅は640を超えないのでuintでよい
  3551.                                 if ( cellx[j[0]] < j[2] ) cellx[j[0]] = j[2];
  3552.                             }
  3553.                         }
  3554.                         fclose ( tablefp );
  3555. //for ( i = 1 ; i < 15 ; i++ ) printf ( "%3u ", cellx[i] );
  3556. //printf ( "\n" );
  3557.                         // 横幅の数をj[4]に
  3558.                         // 許容横幅はxl[ntd]- inblock - indd - inlist -j[4]*8-8になる
  3559.                         j[4] = 0;
  3560.                         for ( i = 1 ; i < 40 ; i++ ) if ( cellx[i] > 0 ) j[4] = i;
  3561.                         // 幅の合計をj[3]に
  3562.                         j[3] = 0;
  3563.                         for ( i = 1 ; i < 40 ; i++ ) j[3] += cellx[i];
  3564.                         // 幅の最大をj[5]に
  3565.                         j[5] = 0;
  3566.                         for ( i = 1 ; i < 40 ; i++ ) if ( cellx[i] > j[5] ) j[5] = cellx[i];
  3567.  
  3568.                         // 幅を調節する
  3569.                         j[6] = j[5];
  3570.                         while ( ( j[3] > xl[ntd] - inblock - indd  - inlist- j[4] * 8 - 8 ) && ( j[6] > 16 ) ) {
  3571.                             for ( i = 1 ; i < 40 ; i++ ) if ( cellx[i] == j[6] ) {
  3572.                                 cellx[i] -= 8;
  3573.                                 j[3] -= 8;
  3574.                             }
  3575.                             j[6] -= 8;
  3576.                         }
  3577. //for ( i = 1 ; i < 15 ; i++ ) printf ( "%3u ", cellx[i] );
  3578. //printf ( "\n" );
  3579.  
  3580.                         // 右端のことを考えて補正する(間違ってこの追加分に入っても罫線とだぶるだけで隣には行かない)
  3581.                         //中止for ( i = 1 ; i < 40 ; i++ ) cellx[i] += 8;
  3582.  
  3583.                         sprintf ( tagbuf, "%s$table%02u.cdh", tempdir, tdepth );
  3584.                         cdhfp = fopen2 ( tagbuf, "w" );
  3585.                         sprintf ( tagbuf, "%s$table%02u.hdr", tempdir, tdepth );
  3586.                         headfp = fopen2 ( tagbuf, "w" );
  3587.  
  3588.                         // 第2回再帰呼び出し
  3589.                         fsetpos ( htmlfp, &tablestart );
  3590.                         convhtml2 ( cdhfp, headfp, htmlfp, fpt, cellx, tdepth, &ttx, &tty, istext, chname );
  3591.  
  3592.                         fclose ( cdhfp );
  3593.                         fclose ( headfp );
  3594.  
  3595.                         cdhfp = cdhtmlfp;
  3596.                         headfp = headerfp;
  3597.  
  3598.                         // cellxを幅からx座標にする(cellx[f-1]で使う)
  3599.                         cellx[0] = 8;
  3600.                         for ( i = 1 ; i < 40 ; i++ ) {
  3601.                             cellx[i] += cellx[i-1];
  3602.                             cellx[i] += 8;
  3603.                         }
  3604.  
  3605.                         // 表の左端x座標を決める
  3606.                         // 表の幅はcellx[j[4]]にある
  3607.                         //if ( stricmp ( tagp[i][1], "right" ) == 0 ) tx.align = tx_align_r;
  3608.                         //else if ( stricmp ( tagp[i][1], "center" ) == 0 ) tx.align = tx_align_c;
  3609.                         //else tx.align = tx_align_l;
  3610.                         switch ( tx.align ) {
  3611.                         case tx_align_r:
  3612.                             if ( tx.ex < cellx[j[4]] ) tbx = 0;
  3613.                             else tbx = tx.ex - cellx[j[4]];
  3614.                             break;
  3615.                         case tx_align_c:
  3616.                             if ( tx.sx + tx.ex < cellx[j[4]] ) tbx = 0;
  3617.                             else tbx = ( tx.sx + tx.ex - cellx[j[4]] ) / 2;
  3618.                             break;
  3619.                         default:
  3620.                             tbx = tx.sx;
  3621.                             break;
  3622.                         }
  3623.  
  3624.                         // tablefpを使って書き込み 11,12,21,22,23という場合にも備えなければならない
  3625.                         sprintf ( tagbuf, "%s$table%02u.cdh", tempdir, tdepth );
  3626.                         tablefp = fopen2 ( tagbuf, "r" );
  3627.  
  3628.                         f = g = 0, tty = 0, j[6] = 0;
  3629.                         // l = ftell ( tablefp );
  3630.                         sy2 = tx.sy;
  3631.                         if ( tableborder ) {
  3632.                             fprintf ( cdhfp, "L%lu,%lu,%lu,%lu\n",(ulong)tbx+cellx[0]-5, tx.sy+2, (ulong)tbx+cellx[j[4]]-5, tx.sy+2 );
  3633.                         }
  3634.                         if ( tablefp != NULL ) while ( !feof ( tablefp ) ) {
  3635.                             taddbuf[0] = '\0';
  3636.                             fgets ( taddbuf, 200, tablefp );
  3637.                             switch ( taddbuf[0] ) {
  3638.                             case 'C':
  3639.                                 // セルの終了
  3640.                                 sscanf ( &taddbuf[1], "%u,%u,%u,%lu", &j[0], &j[1], &j[2], &tty2 );
  3641.                                 //if ( j[6] ) {
  3642.                                     // 2回目
  3643.                                     if ( tty < tty2 ) tty = tty2;
  3644.                                 //    l = ftell ( tablefp );
  3645.                                 //    j[6] = 0;
  3646.                                 break;
  3647.                             case 'S':
  3648.                                 // セルの開始
  3649.                                 sscanf ( &taddbuf[1], "%u,%u", &j[0], &j[1] );
  3650.                                 //} else {
  3651.                                     // 1回目(場所を記録)
  3652.                                     if ( g != j[1] ) {
  3653.                                         // 罫線(表が2行以上の場合の中央)
  3654.                                         if ( ( tableborder ) && ( tty > 0 ) ) {
  3655.                                             fprintf ( cdhfp, "L%lu,%lu,%lu,%lu\n", (ulong)tbx+cellx[0]-5, tx.sy + tty + 2, (ulong)tbx+cellx[j[4]]-5, tx.sy + tty + 2 );
  3656.                                         }
  3657.                                         // 次の行
  3658.                                         tx.sy += tty + 8;
  3659.                                         tty = 0;
  3660.                                     }
  3661.                                     f = j[0], g = j[1];
  3662.                                 //    fseek ( tablefp, l, SEEK_SET );
  3663.                                 //    j[6] = 1;
  3664.                                 //}
  3665.                                 break;
  3666.                             case 'T':
  3667.                                 // Txx,yy,str
  3668.                                 //if ( j[6] ) {
  3669.                                     // 2回目のみ
  3670.                                     sscanf ( &taddbuf[1], "%u,%lu", &tpx, &tpy );
  3671.                                     tap = &taddbuf[1];
  3672.                                     for ( i = 0 ; i < 2 ; i++ ) {
  3673.                                         while ( *tap != ',' ) tap++;
  3674.                                         tap++;
  3675.                                     }
  3676.                                     fprintf ( cdhfp, "T%lu,%lu,%s", (ulong)(tbx + cellx[f-1] + tpx), (ulong)(tx.sy + tpy), tap );
  3677.                                 //}
  3678.                                 break;
  3679.                             case 'L':
  3680.                                 // Txx,yy,xx,yy
  3681.                                 //if ( j[6] ) {
  3682.                                     // 2回目のみ
  3683.                                     sscanf ( &taddbuf[1], "%u,%lu,%u,%lu", &tpx, &tpy, &tpx2, &tpy2 );
  3684. /*                                    tap = &taddbuf[1];
  3685.                                     for ( i = 0 ; i < 2 ; i++ ) {
  3686.                                         while ( *tap != ',' ) tap++;
  3687.                                         tap++;
  3688.                                     }
  3689. */
  3690.                                     fprintf ( cdhfp, "L%lu,%lu,%lu,%lu\n", (ulong)(tbx + cellx[f-1] + tpx), (ulong)(tx.sy + tpy), (ulong)(tbx + cellx[f-1] + tpx2), (ulong)(tx.sy + tpy2) );
  3691.                                 //}
  3692.                                 break;
  3693.                             case 'G':
  3694.                                 sscanf ( &taddbuf[1], "%u,%lu,%u,%lu", &tpx, &tpy, &tpx2, &tpy2 );
  3695.                                 tap = &taddbuf[1];
  3696.                                 for ( i = 0 ; i < 4 ; i++ ) {
  3697.                                     while ( *tap != ',' ) tap++;
  3698.                                     tap++;
  3699.                                 }
  3700.                                 if ( tpx2 > cellx[f] - cellx[f-1] - 8 ) tpx2 = cellx[f] - cellx[f-1] - 8; // 表の幅より大きい画像は右カット
  3701.                                 fprintf ( cdhfp, "G%lu,%lu,%lu,%lu,%s\n", (ulong)(tbx + cellx[f-1] + tpx), (ulong)(tx.sy + tpy), (ulong)(tpx2), (ulong)(tpy2), tap );
  3702.                                 break;
  3703.                             default:
  3704.                                 // Eなど
  3705.                                 //if ( j[6] ) {
  3706.                                     fputs ( taddbuf, cdhfp );
  3707.                                 //}
  3708.                                 break;
  3709.                             }
  3710.                         }
  3711.                         fclose ( tablefp );
  3712.                         if ( tableborder ) {
  3713.                             tx.sy += tty + 2;
  3714.                             fprintf ( cdhfp, "L%lu,%lu,%lu,%lu\n",(ulong)tbx+cellx[0]-5, tx.sy, (ulong)tbx+cellx[j[4]]-5, tx.sy ); // 下のforを見てもわかるように0~j[4](ntd~ではない)
  3715.                             for ( i = 0 ; i <= j[4] ; i++ ) {
  3716.                                 fprintf ( cdhfp, "L%lu,%lu,%lu,%lu\n", (ulong)tbx+cellx[i]-5 , sy2+2, (ulong)tbx+cellx[i]-5, tx.sy );
  3717.                             }
  3718.                         }
  3719.  
  3720.                         tx.sy = sy2;
  3721.                         sprintf ( tagbuf, "%s$table%02u.hdr", tempdir, tdepth );
  3722.                         tablefp = fopen2 ( tagbuf, "r" );
  3723.                         f = g = 0, tty = 0, j[6] = 0;
  3724.                         //l = ftell ( tablefp );
  3725.                         if ( tablefp != NULL ) while ( !feof ( tablefp ) ) {
  3726.                             taddbuf[0] = '\0';
  3727.                             fgets ( taddbuf, 200, tablefp );
  3728.                             switch ( taddbuf[0] ) {
  3729.                             case 'C':
  3730.                                 sscanf ( &taddbuf[1], "%u,%u,%u,%lu", &j[0], &j[1], &j[2], &tty2 );
  3731.                                 //if ( j[6] ) {
  3732.                                     // 2回目
  3733.                                     if ( tty < tty2 ) tty = tty2;
  3734.                                 //    l = ftell ( tablefp );
  3735.                                 //    j[6] = 0;
  3736.                             case 'S':
  3737.                                 sscanf ( &taddbuf[1], "%u,%u", &j[0], &j[1] );
  3738.                                 //} else {
  3739.                                     // 1回目(場所を記録)
  3740.                                     if ( g != j[1] ) {
  3741.                                         // 次の行
  3742.                                         tx.sy += tty + 8;
  3743.                                         tty = 0;
  3744.                                     }
  3745.                                     f = j[0], g = j[1];
  3746.                                 //    fseek ( tablefp, l, SEEK_SET );
  3747.                                 //    j[6] = 1;
  3748.                                 //}
  3749.                                 break;
  3750.                             case 'A':
  3751.                                 // Axx,yy,xx,yy,str
  3752.                                 //if ( j[6] ) {
  3753.                                     // 2回目のみ
  3754.                                     sscanf ( &taddbuf[1], "%u,%lu,%u,%lu", &tpx, &tpy, &tpx2, &tpy2 );
  3755.                                     tap = &taddbuf[1];
  3756.                                     for ( i = 0 ; i < 4 ; i++ ) {
  3757.                                         while ( *tap != ',' ) tap++;
  3758.                                         tap++;
  3759.                                     }
  3760.                                     fprintf ( headfp, "A%lu,%lu,%lu,%lu,%s", (ulong)(tbx + cellx[f-1] + tpx), (ulong)(tx.sy + tpy), (ulong)(tbx + cellx[f-1] + tpx2), (ulong)(tx.sy + tpy2), tap );
  3761.                                 //}
  3762.                                 break;
  3763.                             case 'N':
  3764.                                 // Add Ver2.10
  3765.                                 // Nyy,str
  3766.                                 sscanf ( &taddbuf[1], "%lu", &tpy );
  3767.                                 tap = &taddbuf[1];
  3768.                                 for ( i = 0 ; i < 1 ; i++ ) {
  3769.                                     while ( *tap != ',' ) tap++;
  3770.                                     tap++;
  3771.                                 }
  3772.                                 fprintf ( headfp, "N%lu,%s", (ulong)(tx.sy + tpy), tap );
  3773.                                 break;
  3774.                             default:
  3775.                                 // Xなど
  3776.                                 //if ( j[6] ) {
  3777.                                     fputs ( taddbuf, headfp );
  3778.                                 //}
  3779.                                 break;
  3780.                             }
  3781.                         }
  3782.                         fclose ( tablefp );
  3783.                         tx.sy += tty + 8;
  3784.                         if ( tx.maxx < cellx[j[4]] /8 ) tx.maxx = cellx[j[4]] /8;
  3785.                         if ( tx.maxy < tx.sy ) tx.maxy = tx.sy;
  3786.                     } else {
  3787.                         cdhfp = cdhtmlfp;
  3788.                         headfp = headerfp;
  3789.                     }
  3790.  
  3791.                     tdepth--;
  3792.  
  3793.                     fsetpos ( htmlfp, &tableend );
  3794.                     break;
  3795.                 case 0:
  3796.                     // 表の最後のセルはここで
  3797.                     if ( ( ntd > 0 ) && ( ntr > 0 ) ) {
  3798.                         tx_empreturn ( &tx, cdhfp, headfp, retl );
  3799.                         fprintf ( cdhfp, "C%u,%u,%lu,%lu\n", ntd, ntr, (ulong)tx.maxx*8UL, (ulong)tx.maxy );
  3800.                         fprintf ( headfp, "C%u,%u,%lu,%lu\n", ntd, ntr, (ulong)tx.maxx*8UL, (ulong)tx.maxy );
  3801.                     }
  3802.                     // ここまでで書き終える そしてcase1:の再帰後へ
  3803.                 }
  3804.             }
  3805.             if ( ntable == 1 ) {
  3806.                 if ( ( stricmp ( tagbuf, "td" ) == 0 ) || ( stricmp ( tagbuf, "th" ) == 0 ) ) {
  3807.                     if ( stricmp ( tagbuf, "th" ) == 0 ) {
  3808.                         he_addeff ( 1, ft_ef_b );
  3809.                         //neff |= ft_ef_b;
  3810.                     } else {
  3811.                         he_endeff ( 1 ); // tdの開始ということはthの終了としてよい
  3812.                         // neff &= ~ft_ef_b;
  3813.                     }
  3814.                     tx.align = tralign;
  3815.                     for ( i = 0 ; i < ntagp ; i++ ) {
  3816.                         if ( stricmp ( tagp[i][0], "align" ) == 0 ) {
  3817.                             if ( stricmp ( tagp[i][1], "right" ) == 0 ) tx.align = tx_align_r;
  3818.                             else if ( stricmp ( tagp[i][1], "center" ) == 0 ) tx.align = tx_align_c;
  3819.                             else tx.align = tx_align_l;
  3820.                         }
  3821.                     }
  3822.                     if ( ( ntd > 0 ) && ( ntr > 0 ) ) {
  3823.                         tx_empreturn ( &tx, cdhfp, headfp, retl );
  3824.                         fprintf ( cdhfp, "C%u,%u,%lu,%lu\n", ntd, ntr, (ulong)tx.maxx*8UL, (ulong)tx.maxy );
  3825.                         fprintf ( headfp, "C%u,%u,%lu,%lu\n", ntd, ntr, (ulong)tx.maxx*8UL, (ulong)tx.maxy );
  3826.                     }
  3827.                     ntd++;
  3828.                     oex = xl[ntd]- inblock - indd - inlist;
  3829.                     if ( ntr > 0 ) {
  3830.                         fprintf ( cdhfp, "S%u,%u\n", ntd, ntr );
  3831.                         fprintf ( headfp, "S%u,%u\n", ntd, ntr );
  3832.                     }
  3833.  
  3834.                     tx_init ( &tx, xl[ntd] - inblock - indd  - inlist);
  3835.                 }
  3836.                 if ( stricmp ( tagbuf, "tr" ) == 0 ) {
  3837.                     // 行の最後のセルはここで(tr後のtdではもうntd,ntrが変わっている)
  3838.                     tralign = tx_align_l;
  3839.                     for ( i = 0 ; i < ntagp ; i++ ) {
  3840.                         if ( stricmp ( tagp[i][0], "align" ) == 0 ) {
  3841.                             if ( stricmp ( tagp[i][1], "right" ) == 0 ) tralign = tx_align_r;
  3842.                             else if ( stricmp ( tagp[i][1], "center" ) == 0 ) tralign = tx_align_c;
  3843.                             else tralign = tx_align_l;
  3844.                         }
  3845.                     }
  3846.                     if ( ( ntd > 0 ) && ( ntr > 0 ) ) {
  3847.                         tx_empreturn ( &tx, cdhfp, headfp, retl );
  3848.                         fprintf ( cdhfp, "C%u,%u,%lu,%lu\n", ntd, ntr, (ulong)tx.maxx*8UL, (ulong)tx.maxy );
  3849.                         fprintf ( headfp, "C%u,%u,%lu,%lu\n", ntd, ntr, (ulong)tx.maxx*8UL, (ulong)tx.maxy );
  3850.                     }
  3851.                     ntr++;
  3852.                     ntd = 0;
  3853.                     oex = xl[ntd]- inblock - indd - inlist;
  3854.                     tx_init ( &tx, xl[ntd] - inblock - indd - inlist );
  3855.                 }
  3856.                 if ( stricmp ( tagbuf, "caption" ) == 0 ) incaption = 1;
  3857.                 if ( stricmp ( tagbuf, "/caption" ) == 0 ) incaption = 0;
  3858.             }
  3859.  
  3860.             // style内は書かないようにする
  3861.             // body内を書くよりもstyleとscriptを書かない方がよいらしい
  3862. //            if ( stricmp ( tagbuf, "body" ) == 0 ) inbody = 1;
  3863. //            if ( stricmp ( tagbuf, "/body" ) == 0  ) inbody = 0;
  3864.             if ( stricmp ( tagbuf, "style" ) == 0 ) inbody = 0;
  3865.             if ( stricmp ( tagbuf, "/style" ) == 0  ) inbody = 1;
  3866.             if ( stricmp ( tagbuf, "script" ) == 0 ) inbody = 0;
  3867.             if ( stricmp ( tagbuf, "/script" ) == 0  ) inbody = 1;
  3868.  
  3869.             if ( ( inbody ) && ( ntable < 2 ) ) { // これ以後はtable内の仮読み中には感知されないようにする
  3870.                 if ( stricmp ( tagbuf, "title" ) == 0 ) {
  3871.                     intitle = 1;
  3872.                     titlelen = 0;
  3873.                     inspace = 2;
  3874.                 }
  3875.                 if ( stricmp ( tagbuf, "/title" ) == 0  ) {
  3876.                     intitle = 0;
  3877.                     title[titlelen] = '\0';
  3878.                     fprintf ( headfp, "T%s\n", title );
  3879.                     inspace = 2;
  3880.                 }
  3881.  
  3882.                 // 改行コードのBR化・無視
  3883.                 if ( stricmp ( tagbuf, "pre" ) == 0 ) inpre = 1;
  3884.                 if ( stricmp ( tagbuf, "/pre" ) == 0  ) inpre = 0;
  3885.                 if ( stricmp ( tagbuf, "xmp" ) == 0 ) inpre = 1;
  3886.                 if ( stricmp ( tagbuf, "/xmp" ) == 0  ) inpre = 0;
  3887.                 if ( stricmp ( tagbuf, "listing" ) == 0 ) inpre = 1;
  3888.                 if ( stricmp ( tagbuf, "/listing" ) == 0  ) inpre = 0;
  3889.  
  3890.  
  3891.                 // テキスト効果(neff関連)
  3892.                 if ( stricmp ( tagbuf, "i" ) == 0  ) he_addeff ( 2, ft_ef_i ); //neff |= ft_ef_i;
  3893.                 if ( stricmp ( tagbuf, "/i" ) == 0  ) he_endeff ( 2 );//neff &= ~ft_ef_i;
  3894.                 if ( stricmp ( tagbuf, "em" ) == 0  ) he_addeff ( 3, ft_ef_i );//neff |= ft_ef_i;
  3895.                 if ( stricmp ( tagbuf, "/em" ) == 0  ) he_endeff ( 3 );//neff &= ~ft_ef_i;
  3896.                 if ( stricmp ( tagbuf, "cite" ) == 0  ) he_addeff ( 4, ft_ef_i );//neff |= ft_ef_i;
  3897.                 if ( stricmp ( tagbuf, "/cite" ) == 0  ) he_endeff ( 4 );//neff &= ~ft_ef_i;
  3898.                 if ( stricmp ( tagbuf, "u" ) == 0  ) he_addeff ( 5, ft_ef_u );//neff |= ft_ef_u;
  3899.                 if ( stricmp ( tagbuf, "/u" ) == 0  ) he_endeff ( 5 );//neff &= ~ft_ef_u;
  3900.                 if ( stricmp ( tagbuf, "s" ) == 0  ) he_addeff ( 6, ft_ef_s );//neff |= ft_ef_s;
  3901.                 if ( stricmp ( tagbuf, "/s" ) == 0  ) he_endeff ( 6 );//neff &= ~ft_ef_s;
  3902.                 if ( stricmp ( tagbuf, "b" ) == 0  ) he_addeff ( 7, ft_ef_b );//neff |= ft_ef_b;
  3903.                 if ( stricmp ( tagbuf, "/b" ) == 0  ) he_endeff ( 7 );//neff &= ~ft_ef_b;
  3904.                 if ( stricmp ( tagbuf, "strong" ) == 0  ) he_addeff ( 8, ft_ef_b );//neff |= ft_ef_b;
  3905.                 if ( stricmp ( tagbuf, "/strong" ) == 0  ) he_endeff ( 8 );//neff &= ~ft_ef_b;
  3906.                 if ( ( ( tagbuf[0] == 'h' ) || ( tagbuf[0] == 'H' ) ) && ( tagbuf[1] > '0' ) && ( tagbuf[1] < '7' ) && ( tagbuf[2] == '\0' ) ) {
  3907.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  3908.                     he_addeff ( 9, ft_ef_b );
  3909.                     //neff |= ft_ef_b;
  3910.                     for ( i = 0 ; i < ntagp ; i++ ) {
  3911.                         if ( stricmp ( tagp[i][0], "align" ) == 0 ) {
  3912.                             if ( stricmp ( tagp[i][1], "right" ) == 0 ) tx.align = tx_align_r;
  3913.                             else if ( stricmp ( tagp[i][1], "center" ) == 0 ) tx.align = tx_align_c;
  3914.                             else tx.align = tx_align_l;
  3915.                         }
  3916.                     }
  3917.                 }
  3918.                 if ( ( tagbuf[0] == '/' ) && ( ( tagbuf[1] == 'h' ) || ( tagbuf[1] == 'H' ) ) && ( tagbuf[2] > '0' ) && ( tagbuf[2] < '7' ) && ( tagbuf[3] == '\0' ) ) {
  3919.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  3920.                     he_endeff ( 9 );
  3921.                     //neff &= ~ft_ef_b;
  3922.                     tx.align = tx_align_l;
  3923.                 }
  3924.                 if ( stricmp ( tagbuf, "font" ) == 0  ) {
  3925.                     f = 0;
  3926.                     for ( i = 0 ; i < ntagp ; i++ ) {
  3927.                         if ( stricmp ( tagp[i][0], "size" ) == 0 ) {
  3928.                             in = atoi ( tagp[i][1] );
  3929.                             // +1,-1(4,2)は特殊効果なしとする
  3930.                             if ( in < -1 ) {
  3931.                                 // 相対マイナス指定 -2~-7
  3932.                                 f = ft_ef_h;
  3933.                             } else if ( in > 0 ) {
  3934.                                 if ( tagp[i][1][0] == '+' ) {
  3935.                                     // 相対プラス指定 +2~+7
  3936.                                     if ( in > 1 ) f = ft_ef_b;
  3937.                                 } else {
  3938.                                     // 絶対指定 1~7
  3939.                                     switch ( in ) {
  3940.                                     case 1:
  3941.                                         f = ft_ef_h;
  3942.                                         break;
  3943.                                     case 5: case 6: case 7:
  3944.                                         f = ft_ef_b;
  3945.                                         break;
  3946.                                     }
  3947.                                 }
  3948.                             }
  3949.                         }
  3950.                     }
  3951.                     he_addeff ( 10, f );
  3952.                 }
  3953.                 if ( stricmp ( tagbuf, "/font" ) == 0  ) {
  3954.                     he_endeff ( 10 );
  3955.                 }
  3956.  
  3957.                 // リンク
  3958.                 if ( stricmp ( tagbuf, "a" ) == 0 ) {
  3959.                     for ( i = 0 ; i < ntagp ; i++ ) {
  3960.                         if ( stricmp ( tagp[i][0], "href" ) == 0 ) {
  3961.                             tx_setlink ( &tx, headfp, tagp[i][1] );
  3962.                             he_addeff ( 11, ft_ef_u );
  3963.                             //neff |= ft_ef_u;
  3964.                         }
  3965.                         if ( stricmp ( tagp[i][0], "name" ) == 0 ) {
  3966.                             fprintf ( headfp, "N%lu,%s\n", tx.sy, tagp[i][1] );
  3967.                         }
  3968.                     }
  3969.                 }
  3970.                 if ( stricmp ( tagbuf, "/a" ) == 0 ) {
  3971.                     tx_setlink ( &tx, headfp, "" );
  3972.                     he_endeff ( 11 );
  3973.                     //neff &= ~ft_ef_u;
  3974.                     linkto[0] = '\0';
  3975.                 }
  3976.                 if ( stricmp ( tagbuf, "frame" ) == 0 ) {
  3977.                     f = ntagp, g = ntagp;
  3978.                     for ( i = 0 ; i < ntagp ; i++ ) {
  3979.                         if ( stricmp ( tagp[i][0], "src" ) == 0 ) {
  3980.                             f = i;
  3981.                         } else if ( stricmp ( tagp[i][0], "name" ) == 0 ) {
  3982.                             g = i;
  3983.                         }
  3984.                     }
  3985.                     if ( f != ntagp ) {
  3986.                         tx_setlink ( &tx, headfp, tagp[f][1] );
  3987.                         he_addeff ( 12, ft_ef_u );
  3988.  
  3989.                         if ( g == ntagp ) g = f;
  3990.                         strcpy ( tagtext, "[Frame " );
  3991.                         neff = he_geteff();
  3992.                         for ( i = 0 ; i < strlen ( tagtext ) ; i++ ) tx_addstr ( &tx, tagtext[i], 1, neff, cdhfp, headfp, retl );
  3993.                         for ( i = 0 ; i < strlen ( tagp[g][1] ) ; i++ ) {
  3994.                             if ( iskanji ( tagp[g][1][i] ) ) {
  3995.                                 tx_addstr ( &tx, tagp[g][1][i], 0, neff, cdhfp, headfp, retl );
  3996.                                 i++;
  3997.                             }
  3998.                             tx_addstr ( &tx, tagp[g][1][i], 1, neff, cdhfp, headfp, retl );
  3999.                         }
  4000.                         strcpy ( tagtext, "]" );
  4001.                         for ( i = 0 ; i < strlen ( tagtext ) ; i++ ) tx_addstr ( &tx, tagtext[i], 1, neff, cdhfp, headfp, retl );
  4002.  
  4003.                         tx_setlink ( &tx, headfp, "" );
  4004.                         he_endeff ( 12 );
  4005.                         tx_return ( &tx, cdhfp, headfp, retl );
  4006.                     }
  4007.                 }
  4008.  
  4009.                 // 改行・左右配置
  4010.                 if ( stricmp ( tagbuf, "br" ) == 0 ) tx_return ( &tx, cdhfp, headfp, retl );
  4011.                 if ( stricmp ( tagbuf, "p" ) == 0 ) {
  4012.                     if ( ntagp == 0 ) {
  4013.                         // 改行としてのpとして扱う
  4014.                         tx_return ( &tx, cdhfp, headfp, retl * 3 / 2 );
  4015.                     } else {
  4016.                         tx_empreturn ( &tx, cdhfp, headfp, retl * 3 / 2 );
  4017.                         for ( i = 0 ; i < ntagp ; i++ ) {
  4018.                             if ( stricmp ( tagp[i][0], "align" ) == 0 ) {
  4019.                                 if ( stricmp ( tagp[i][1], "right" ) == 0 ) tx.align = tx_align_r;
  4020.                                 else if ( stricmp ( tagp[i][1], "center" ) == 0 ) tx.align = tx_align_c;
  4021.                                 else tx.align = tx_align_l;
  4022.                             }
  4023.                         }
  4024.                     }
  4025.                 }
  4026.                 if ( stricmp ( tagbuf, "/p" ) == 0 ) {
  4027.                     tx_empreturn ( &tx, cdhfp, headfp, retl * 3 / 2 );
  4028.                     tx.align = tx_align_l;
  4029.                 }
  4030.                 if ( stricmp ( tagbuf, "div" ) == 0 ) {
  4031.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4032.                     for ( i = 0 ; i < ntagp ; i++ ) {
  4033.                         if ( stricmp ( tagp[i][0], "align" ) == 0 ) {
  4034.                             if ( stricmp ( tagp[i][1], "right" ) == 0 ) tx.align = tx_align_r;
  4035.                             else if ( stricmp ( tagp[i][1], "center" ) == 0 ) tx.align = tx_align_c;
  4036.                             else tx.align = tx_align_l;
  4037.                         }
  4038.                     }
  4039.  
  4040.                 }
  4041.                 if ( stricmp ( tagbuf, "/div" ) == 0 ) {
  4042.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4043.                     tx.align = tx_align_l;
  4044.                 }
  4045.                 if ( stricmp ( tagbuf, "center" ) == 0 ) {
  4046.                         tx_empreturn ( &tx, cdhfp, headfp, retl );
  4047.                     tx.align = tx_align_c;
  4048.                 }
  4049.                 if ( stricmp ( tagbuf, "/center" ) == 0 ) {
  4050.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4051.                     tx.align = tx_align_l;
  4052.                 }
  4053.  
  4054.                 // 水平線
  4055.                 if ( stricmp ( tagbuf, "hr" ) == 0 ) {
  4056.                     tx_empreturn ( &tx, cdhfp, headfp, retl * 3 / 2 );
  4057.                     f = tx.ex - tx.sx;
  4058.                     if ( f < 8 ) f = 0; else f -= 8;
  4059.                     g = tx.align;
  4060.                     for ( i = 0 ; i < ntagp ; i++ ) {
  4061.                         if ( stricmp ( tagp[i][0], "align" ) == 0 ) {
  4062.                             if ( stricmp ( tagp[i][1], "right" ) == 0 ) g = tx_align_r;
  4063.                             else if ( stricmp ( tagp[i][1], "center" ) == 0 ) g = tx_align_c;
  4064.                             else g = tx_align_l;
  4065.                         } else if ( stricmp ( tagp[i][0], "width" ) == 0 ) {
  4066.                             in = atoi ( tagp[i][1] );
  4067.                             if ( in > 0 ) {
  4068.                                 tap = tagp[i][1];
  4069.                                 while ( ( *tap >= '0' ) && ( *tap <= '9' ) ) tap++;
  4070.                                 if ( *tap == '%' ) {
  4071.                                     // 相対指定
  4072.                                     if ( ( in >= 0 ) && ( in <= 100 ) ) f = (uint)((ulong)f * in / 100);
  4073.                                 } else {
  4074.                                     // 絶対指定
  4075.                                     if ( in < f ) f = in;
  4076.                                 }
  4077.                             }
  4078.                         }
  4079.                     }
  4080.                     switch ( g ) {
  4081.                     case tx_align_r:
  4082.                         in = tx.ex - tx.sx - 8 - f;
  4083.                         break;
  4084.                     case tx_align_c:
  4085.                         in = ( tx.ex - tx.sx - 8 - f ) / 2;
  4086.                         break;
  4087.                     case tx_align_l:
  4088.                     default:
  4089.                         in = 0;
  4090.                         break;
  4091.                     }
  4092.                     fprintf ( cdhfp, "L%u,%lu,%u,%lu\n", (uint)tx.sx + 4 + in, (ulong)tx.sy + retl / 2, (uint)(tx.sx + 4 + in + f), (ulong)tx.sy + retl / 2 );
  4093.                     //100%
  4094.                     //fprintf ( cdhfp, "L%u,%lu,%u,%lu\n", (uint)tx.sx + 4, (ulong)tx.sy + retl / 2, (uint)(tx.sx + f - 4 ), (ulong)tx.sy + retl / 2 );
  4095.                     tx_return ( &tx, cdhfp, headfp, retl );
  4096.                 }
  4097.  
  4098.                 if ( stricmp ( tagbuf, "img" ) == 0 ) {
  4099.                     f = 0;
  4100.                     g = ntagp;
  4101.                     for ( i = 0 ; i < ntagp ; i++ ) {
  4102.                         if ( stricmp ( tagp[i][0], "src" ) == 0 ) g = i;
  4103.                     }
  4104.                     if ( g != ntagp ) {
  4105.                         // tagpを展開する
  4106.                         strcpy ( tagbuf2 + 200, "$temp.pat" );
  4107.                         dr_settempdir ( tagbuf2 + 200 );
  4108.                         fnsplit2 ( chname, &fns );
  4109.                         *(tagbuf + 600) = '\0';
  4110.                         fnadd ( &fns, tagbuf + 600, tagp[g][1] );
  4111.                         fnmerge2 ( tagbuf + 400, &fns );
  4112.  
  4113.                         // 画像を読んでみる
  4114.                         if ( bm_convbmp ( tagbuf2, tagbuf + 400, ttx, tpx, tagbuf2 + 200 ) == 0 ) {
  4115.                             f = 1;
  4116.                             tx_empreturn ( &tx, cdhfp, headfp, retl );
  4117.                             switch ( tx.align ) {
  4118.                             case tx_align_r:
  4119.                                 if ( tx.ex < ttx ) tbx = 0;
  4120.                                 else tbx = tx.ex - ttx;
  4121.                                 break;
  4122.                             case tx_align_c:
  4123.                                 if ( tx.ex + tx.sx < ttx ) tbx = 0;
  4124.                                 else tbx = ( tx.ex - ttx + tx.sx ) / 2;
  4125.                                 break;
  4126.                             case tx_align_l:
  4127.                             default:
  4128.                                 tbx = tx.sx;
  4129.                                 break;
  4130.                             }
  4131.                             if ( ttx > tx.ex - tx.sx ) ttx = tx.ex - tx.sx, tbx = tx.sx;
  4132.                             fprintf ( cdhfp, "G%u,%lu,%u,%u,%s\n", (uint)tbx, (ulong)tx.sy, (uint)ttx, (uint)tpx, tagbuf2 );
  4133.                             tx.sy += tpx + 4;
  4134.                             if ( tx.sy > tx.maxy ) tx.maxy = tx.sy;
  4135.                             if ( tx.maxx < ttx ) tx.maxx = ttx;
  4136.                         }
  4137.                     }
  4138.                     if ( f == 0 ) {
  4139.                         // 画像が出せなかった
  4140.                         g = ntagp;
  4141.                         for ( i = 0 ; i < ntagp ; i++ ) {
  4142.                             if ( stricmp ( tagp[i][0], "alt" ) == 0 ) g = i;
  4143.                         }
  4144.                         if ( g == ntagp ) {
  4145.                             strcpy ( tagtext, "[Image]" );
  4146.                             neff = he_geteff();
  4147.                             for ( i = 0 ; i < strlen ( tagtext ) ; i++ ) tx_addstr ( &tx, tagtext[i], 1, neff, cdhfp, headfp, retl );
  4148.                         } else {
  4149.                             strcpy ( tagtext, "[" );
  4150.                             neff = he_geteff();
  4151.                             for ( i = 0 ; i < strlen ( tagtext ) ; i++ ) tx_addstr ( &tx, tagtext[i], 1, neff, cdhfp, headfp, retl );
  4152.                             for ( i = 0 ; i < strlen ( tagp[g][1] ) ; i++ ) {
  4153.                                 if ( iskanji ( tagp[g][1][i] ) ) {
  4154.                                     tx_addstr ( &tx, tagp[g][1][i], 0, neff, cdhfp, headfp, retl );
  4155.                                     i++;
  4156.                                 }
  4157.                                 tx_addstr ( &tx, tagp[g][1][i], 1, neff, cdhfp, headfp, retl );
  4158.                             }
  4159.                             tx_addstr ( &tx, ']', 1, neff, cdhfp, headfp, retl );
  4160.                         }
  4161.                     }
  4162.                 }
  4163.                 if ( stricmp ( tagbuf, "input" ) == 0 ) {
  4164.                     g = ntagp, f = ntagp;
  4165.                     for ( i = 0 ; i < ntagp ; i++ ) {
  4166.                         if ( stricmp ( tagp[i][0], "type" ) == 0 ) f = i;
  4167.                         if ( stricmp ( tagp[i][0], "value" ) == 0 ) g = i;
  4168.                     }
  4169.                     if ( f != ntagp ) {
  4170.                         if ( ( stricmp ( tagp[f][1], "submit" ) == 0 ) || ( stricmp ( tagp[f][1], "reset" ) == 0 ) ) {
  4171.                             if ( g == ntagp ) {
  4172.                                 if ( stricmp ( tagp[f][1], "submit" ) == 0 ) strcpy ( tagtext, "[送信]" ); else strcpy ( tagtext, "[リセット]" );
  4173.                                 neff = he_geteff();
  4174.                                 for ( i = 0 ; i < strlen ( tagtext ) ; i++ ) {
  4175.                                     if ( iskanji ( tagtext[i] ) ) {
  4176.                                         tx_addstr ( &tx, tagtext[i], 0, neff, cdhfp, headfp, retl );
  4177.                                         i++;
  4178.                                     }
  4179.                                     tx_addstr ( &tx, tagtext[i], 1, neff, cdhfp, headfp, retl );
  4180.                                 }
  4181.                             } else {
  4182.                                 strcpy ( tagtext, "[" );
  4183.                                 neff = he_geteff();
  4184.                                 for ( i = 0 ; i < strlen ( tagtext ) ; i++ ) tx_addstr ( &tx, tagtext[i], 1, neff, cdhfp, headfp, retl );
  4185.                                 for ( i = 0 ; i < strlen ( tagp[g][1] ) ; i++ ) {
  4186.                                     if ( iskanji ( tagp[g][1][i] ) ) {
  4187.                                         tx_addstr ( &tx, tagp[g][1][i], 0, neff, cdhfp, headfp, retl );
  4188.                                         i++;
  4189.                                     }
  4190.                                     tx_addstr ( &tx, tagp[g][1][i], 1, neff, cdhfp, headfp, retl );
  4191.                                 }
  4192.                                 tx_addstr ( &tx, ']', 1, neff, cdhfp, headfp, retl );
  4193.                             }
  4194.                         }
  4195.                     }
  4196.                 }
  4197.  
  4198.                 // 横幅変動
  4199.                 if ( stricmp ( tagbuf, "blockquote" ) == 0 ) {
  4200.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4201.                     tx_return ( &tx, cdhfp, headfp, retl / 2 );
  4202.                     inblock = 24;
  4203.                     tx.sx = tx.nx = osx + inblock + indd + inlist;
  4204.                     tx.ex = oex - inblock;
  4205.                 }
  4206.                 if ( stricmp ( tagbuf, "/blockquote" ) == 0 ) {
  4207.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4208.                     tx_return ( &tx, cdhfp, headfp, retl / 2 );
  4209.                     inblock = 0;
  4210.                     tx.sx = tx.nx = osx + inblock + indd + inlist;
  4211.                     tx.ex = oex - inblock;
  4212.                 }
  4213.                 if ( stricmp ( tagbuf, "dl" ) == 0 ) {
  4214.                     indd = 0;
  4215.                 }
  4216.                 if ( stricmp ( tagbuf, "/dl" ) == 0 ) {
  4217.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4218.                     indd = 0;
  4219.                     tx.sx = tx.nx = osx + inblock + indd + inlist;
  4220.                     tx.ex = oex - inblock;
  4221.                 }
  4222.                 if ( stricmp ( tagbuf, "dt" ) == 0 ) {
  4223.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4224.                     indd = 0;
  4225.                     tx.sx = tx.nx = osx + inblock + indd + inlist;
  4226.                     tx.ex = oex - inblock;
  4227.                 }
  4228.                 if ( stricmp ( tagbuf, "dd" ) == 0 ) {
  4229.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4230.                     indd = 24;
  4231.                     tx.sx = tx.nx = osx + inblock + indd + inlist;
  4232.                     tx.ex = oex - inblock;
  4233.                 }
  4234.                 if ( ( stricmp ( tagbuf, "ul" ) == 0 ) || ( stricmp ( tagbuf, "ol" ) == 0 ) ) {
  4235.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4236.                     inlist += 32;
  4237.                     tx.sx = tx.nx = osx + inblock + indd + inlist;
  4238.                     tx.ex = oex - inblock;
  4239.                 }
  4240.                 if ( ( stricmp ( tagbuf, "/ul" ) == 0 ) || ( stricmp ( tagbuf, "/ol" ) == 0 ) ) {
  4241.                     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4242.                     if ( inlist > 0 ) inlist -= 32;
  4243.                     tx.sx = tx.nx = osx + inblock + indd + inlist;
  4244.                     tx.ex = oex - inblock;
  4245.                 }
  4246.                 if ( ( stricmp ( tagbuf, "li" ) == 0 ) && ( inlist > 0 ) ) {
  4247.                     // このマークは文字効果なしで送る
  4248.                     tx_empreturn ( &tx, cdhfp, headfp, retl * 3 / 2 );
  4249.                     strcpy ( tagtext, " ● " );
  4250.                     ttx = tx.sx, tty = tx.sy;
  4251.                     tx.sx = tx.nx = osx + inblock + indd + inlist - 32;
  4252.                     for ( i = 0 ; i < strlen ( tagtext ) ; i++ ) {
  4253.                         if ( iskanji ( tagtext[i] ) ) {
  4254.                             tx_addstr ( &tx, tagtext[i], 0, 0, cdhfp, headfp, retl );
  4255.                             i++;
  4256.                         }
  4257.                         tx_addstr ( &tx, tagtext[i], 1, 0, cdhfp, headfp, retl );
  4258.                     }
  4259.                     tx_return ( &tx, cdhfp, headfp, retl );
  4260.                     tx.sx = tx.nx = ttx, tx.sy = tty;
  4261.                 }
  4262.                 if ( ( stricmp ( tagbuf, "lh" ) == 0 ) && ( inlist > 0 ) ) {
  4263.                     tx_empreturn ( &tx, cdhfp, headfp, retl * 3 / 2 );
  4264.                 }
  4265.  
  4266. //                if ( stricmp ( tagbuf, "" ) == 0 ) {
  4267. //                }
  4268.             }
  4269.         } else if ( intitle ) {
  4270.             if ( iskanji ( ch ) ) {
  4271.                 title[titlelen] = ch;
  4272.                 titlelen++;
  4273.                 ch = fgetc ( htmlfp );
  4274.                 c++;
  4275.             }
  4276.             if ( ( ch == ' ' ) || ( ch == '\t' ) ) {
  4277.                 if ( inspace == 0 ) {
  4278.                     title[titlelen] = ' ';
  4279.                     titlelen++;
  4280.                 }
  4281.                 inspace = 2;
  4282.             } else if ( ch > ' ' ) {
  4283.                 title[titlelen] = ch;
  4284.                 titlelen++;
  4285.             }
  4286.         } else if ( ( inbody ) && ( !incaption ) && ( ntable < 2 ) ) { // テキスト読み飛ばし判定
  4287.             if ( iskanji ( ch ) ) {
  4288.                 vsw = 1;
  4289.                 neff = he_geteff ();
  4290.                 tx_addstr ( &tx, ch, 0, neff, cdhfp, headfp, retl );
  4291.                 ch = fgetc ( htmlfp );
  4292.                 c++;
  4293.                 tx_addstr ( &tx, ch, 1, neff, cdhfp, headfp, retl );
  4294.             } else if ( ch == '\n' ) { // LFで次行へ
  4295.                 if ( inpre ) {
  4296.                     if ( ch2 != '\r' ) {
  4297.                         // CR LFではreturnしない LF単独のときのみreturn
  4298.                         tx_return ( &tx, cdhfp, headfp, retl );
  4299.                     }
  4300.                 } else inspace = 2;
  4301.             } else if ( ch == '\r' ) { // CRは空でないとき次行へ
  4302.                 // CR または CR LF
  4303.                 if ( inpre ) tx_return ( &tx, cdhfp, headfp, retl );
  4304.                 else inspace = 2;
  4305.             } else if ( ( ch == '\t' ) || ( ch == ' ' ) ) {
  4306.                 if ( ( inspace == 0 ) || ( inpre ) ) {
  4307.                     neff = he_geteff ();
  4308.                     tx_addstr ( &tx, ' ', 1, neff, cdhfp, headfp, retl );
  4309.                 }
  4310.                 inspace = 2;
  4311.             } else {
  4312.                 vsw = 1;
  4313.                 neff = he_geteff ();
  4314.                 tx_addstr ( &tx, ch, 1, neff, cdhfp, headfp, retl );
  4315.             }
  4316.         }
  4317.         if ( inspace ) inspace--;
  4318.         c++;
  4319.         ch2 = ch;
  4320.  
  4321.         // 進行状況
  4322.         if ( vsw ) vsw = 0;
  4323.         else {
  4324.             vsw2++;
  4325.             if ( vsw2 == 10 ) {
  4326.                 convhtmlbar ( tdepth, c, length, istext );
  4327.                 //printf ( "[%u]%lu/%lu                    \r", tdepth, c, length );
  4328.                 vsw2 = 0;
  4329.             }
  4330.         }
  4331.     }
  4332.     tx_empreturn ( &tx, cdhfp, headfp, retl );
  4333.     convhtmlbar ( tdepth, c, length, istext );
  4334.     //printf ( "[%u]%lu/%lu                    \n", tdepth, c, length );
  4335.     //printf ( "%lu,%lu\n", (ulong)tx.maxx*8UL, (ulong)tx.maxy );
  4336.     *hx = tx.maxx;
  4337.     *hy = tx.maxy;
  4338. }
  4339.  
  4340. void convhtmlbar ( uchar ntable, ulong now, ulong size, uchar istext ) {
  4341.     uint i, r, c;
  4342.     uchar buf[16], buf2[16];
  4343.     uchar bar[9] = { ' ', 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87 };
  4344.     static cbs = 0;
  4345.     static l = 0;
  4346.     if ( cbs == 0 ) {
  4347.         // 初期化
  4348.         for ( i = 0 ; i < 16 ; i++ ) {
  4349.             convhtmlpt[i][0] = 0;
  4350.             convhtmlpt[i][1] = 1;
  4351.         }
  4352.         cbs = 1;
  4353.     }
  4354.  
  4355.     switch ( istext ) {
  4356.     case 255:
  4357.     case 254:
  4358.         break;
  4359.     case 4:
  4360.         convhtmlpt[6][0] = now;
  4361.         convhtmlpt[6][1] = size;
  4362.         break;
  4363.     default:
  4364.         convhtmlpt[ntable][0] = now;
  4365.         convhtmlpt[ntable][1] = size;
  4366.         break;
  4367.     }
  4368.     switch ( istext ) {
  4369.     case 255:
  4370.         strcpy ( buf, "Browser" );
  4371.         strcpy ( buf2, "Returns" );
  4372.         break;
  4373.     case 254:
  4374.         strcpy ( buf, "Now    " );
  4375.         strcpy ( buf2, "Drawing" );
  4376.         break;
  4377.     case 4:
  4378.         strcpy ( buf, "BITMAP " );
  4379.         break;
  4380.     case 3:
  4381.         strcpy ( buf, "FOLDER " );
  4382.         sprintf ( buf2, "%6lu ", now );
  4383.         break;
  4384.     case 2:
  4385.         strcpy ( buf, "CODE   " );
  4386.         break;
  4387.     case 1:
  4388.         strcpy ( buf, "TEXT   " );
  4389.         break;
  4390.     default:
  4391.         sprintf ( buf, "HTML%2u ", ntable );
  4392.         l = ntable;
  4393.         break;
  4394.     }
  4395.  
  4396.     for ( i = 0 ; i < 7 ; i++ ) {
  4397.         poke ( 0xa000, 2 * ( 73 + i ), buf[i] );
  4398.         pokeb ( 0xa200, 2 * ( 73 + i ), 0xe1 );
  4399.     }
  4400.     switch ( istext ) {
  4401.     case 3:
  4402.     case 255:
  4403.     case 254:
  4404.         for ( i = 0 ; i < 7 ; i++ ) {
  4405.             poke ( 0xa000, 2 * ( 73 + i ) + 160, buf2[i] );
  4406.             pokeb ( 0xa200, 2 * ( 73 + i ) + 160, 0xe1 );
  4407.         }
  4408.         break;
  4409.     case 4:
  4410.         r = l;
  4411.         if ( r > 5 ) r = 5;
  4412.         for ( i = 0 ; i <= r ; i++ ) {
  4413.             if ( convhtmlpt[i][1] == 0 ) c = 0;
  4414.             else c = (uchar)( convhtmlpt[i][0] * 8 / convhtmlpt[i][1] );
  4415.             poke ( 0xa000, 2 * ( 73 + i ) + 160, bar[c] );
  4416.             pokeb ( 0xa200, 2 * ( 73 + i ) + 160, 0xe1 );
  4417.         }
  4418.         for ( i = r + 1 ; i <= 5 ; i++ ) {
  4419.             poke ( 0xa000, 2 * ( 73 + i ) + 160, ' ' );
  4420.             pokeb ( 0xa200, 2 * ( 73 + i ) + 160, 0xe1 );
  4421.         }
  4422.         if ( convhtmlpt[6][1] == 0 ) c = 0;
  4423.         else c = (uchar)( convhtmlpt[6][0] * 8 / convhtmlpt[6][1] );
  4424.         poke ( 0xa000, 2 * ( 73 + 6 ) + 160, bar[c] );
  4425.         pokeb ( 0xa200, 2 * ( 73 + 6 ) + 160, 0xe1 );
  4426.         break;
  4427.     default:
  4428.         r = ntable;
  4429.         if ( r > 5 ) r = 5;
  4430.         for ( i = 0 ; i <= r ; i++ ) {
  4431.             if ( convhtmlpt[i][1] == 0 ) c = 0;
  4432.             else c = (uchar)( convhtmlpt[i][0] * 8 / convhtmlpt[i][1] );
  4433.             poke ( 0xa000, 2 * ( 73 + i ) + 160, bar[c] );
  4434.             pokeb ( 0xa200, 2 * ( 73 + i ) + 160, 0xe1 );
  4435.         }
  4436.         for ( i = r + 1 ; i <= 5 ; i++ ) {
  4437.             poke ( 0xa000, 2 * ( 73 + i ) + 160, ' ' );
  4438.             pokeb ( 0xa200, 2 * ( 73 + i ) + 160, 0xe1 );
  4439.         }
  4440.         poke ( 0xa000, 2 * ( 73 + 6 ) + 160, ' ' );
  4441.         pokeb ( 0xa200, 2 * ( 73 + 6 ) + 160, 0xe1 );
  4442.         break;
  4443.     }
  4444. }
  4445.  
  4446. void maketop ( uchar *buf, uchar *filename, uchar *ext, uint len ) {
  4447.     uchar b[100], ch, s = 0, k = 0;
  4448.     FILE *fp;
  4449.     uint i = 0;
  4450.  
  4451.     *buf = '\0';
  4452.     b[0] = '\0';
  4453.     if ( ( stricmp ( ext, "exe" ) == 0 ) || ( stricmp ( ext, "com" ) == 0 ) ) return;
  4454.     fp = fopen2 ( filename, "rb" );
  4455.     if ( fp == NULL ) return;
  4456.     while ( ( !feof ( fp ) ) && ( i < len ) ) {
  4457.         ch = fgetc ( fp );
  4458.         if ( ( stricmp ( ext, "htm" ) == 0 ) || ( stricmp ( ext, "sht" ) == 0 ) ) {
  4459.             if ( k == 1 ) {
  4460.                 k = 0;
  4461.                 b[i] = ch;
  4462.                 if ( ( b[i-1] == 0x81 ) && ( b[i] == 0x40 ) ) i -= 2;
  4463.                 i++;
  4464.             } else if ( ch == '<' ) {
  4465.                 s = 1;
  4466.             } else if ( ch == '>' ) {
  4467.                 s = 0;
  4468.             } else if ( ( ch >= '!' ) && ( ch != 0x7f ) && ( s == 0 ) ) {
  4469.                 if ( iskanji ( ch ) ) {
  4470.                     if ( i == len - 1 ) break;
  4471.                     k = 1;
  4472.                 }
  4473.                 b[i] = ch;
  4474.                 i++;
  4475.             }
  4476.         } else {
  4477.             if ( ( ch >= '!' ) && ( ch != 0x7f ) && ( s == 0 ) ) {
  4478.                 if ( k == 1 ) {
  4479.                     k = 0;
  4480.                 } else if ( iskanji ( ch ) ) {
  4481.                     k = 1;
  4482.                     if ( i == len - 1 ) break;
  4483.                 }
  4484.                 b[i] = ch;
  4485.                 if ( ( b[i-1] == 0x81 ) && ( b[i] == 0x40 ) ) i -= 2;
  4486.                 i++;
  4487.             }
  4488.         }
  4489.     }
  4490.     b[i] = '\0';
  4491.     strcpy ( buf, b );
  4492.     fclose ( fp );
  4493. }
  4494.  
  4495. void he_addeff ( uchar tag, uchar eff ) {
  4496.     if ( neffs > he_maxeff ) return;
  4497.     htmleff[neffs].tag = tag;
  4498.     htmleff[neffs].eff = eff;
  4499.     neffs++;
  4500. }
  4501.  
  4502. uchar he_geteff ( void ) {
  4503.     uchar c = 0;
  4504.     uint i;
  4505.  
  4506.     for ( i = 0 ; i < neffs ; i++ ) {
  4507.         c |= htmleff[i].eff;
  4508.     }
  4509.     return ( c );
  4510. }
  4511.  
  4512. void he_endeff ( uchar tag ) {
  4513.     int i, j;
  4514.     if ( neffs == 0 ) return;
  4515.  
  4516.     for ( i = neffs - 1; i >= 0 ; i-- ) {
  4517.         if ( htmleff[i].tag == tag ) break;
  4518.     }
  4519.     if ( i < 0 ) return;
  4520.  
  4521.     for ( j = i ; j < neffs - 1 ; j++ ) {
  4522.         htmleff[j].tag = htmleff[j+1].tag;
  4523.         htmleff[j].eff = htmleff[j+1].eff;
  4524.     }
  4525.     neffs--;
  4526. }
  4527.  
  4528.  
  4529. void tx_init ( struct tx *tx, ulong w ) {
  4530.     txbuf[0] = linkto[0] = '\0';
  4531.     tx->nx = tx->sx = 0;
  4532.     tx->ex = w;
  4533.     tx->nl = 0;
  4534.     tx->sy = 0;
  4535.     tx->maxx = tx->maxy = 0;
  4536.     tx->linkline = 0;
  4537. }
  4538.  
  4539. uint tx_nlcheck ( struct tx *tx, uchar sw ) {
  4540.     // 8というのは、全角文字に対応するため
  4541.     //    ↓ここが右端
  4542.     // 漢字
  4543.     // ABC
  4544.     //   ↑ここまで達していればYesを返す
  4545.     if ( sw ) return ( tx->ex - tx->sx <= tx->nl );
  4546.     else return ( tx->ex - tx->sx <= tx->nl + 8 );
  4547. }
  4548.  
  4549. void tx_return ( struct tx *tx, FILE *cdhfp, FILE *headfp, uint yl ) {
  4550.     ulong x, x2, i, nl2;
  4551.     if ( tx->nl > 0 ) { // 何もなしに<br>の場合はアドレス変更のみでよいことになるのでパス
  4552.         switch ( tx->align ) {
  4553.         case tx_align_r:
  4554.             x = tx->ex - tx->nl;
  4555.             x2 = x - tx->sx;
  4556.             break;
  4557.         case tx_align_c:
  4558.             x = ( tx->sx + tx->ex - tx->nl ) / 2;
  4559.             x2 = x - tx->sx;
  4560.             break;
  4561.         case tx_align_l:
  4562.         default:
  4563.             x = tx->sx;
  4564.             x2 = 0;
  4565.             break;
  4566.         }
  4567.  
  4568.         nl2 = tx->nl >> 3;
  4569.         txbuf[nl2] = '\0';
  4570.         fprintf ( cdhfp, "E%lu,", (ulong)nl2 );
  4571.         for ( i = 0 ; i < nl2 ; i++ ) { // 文字単位の効果を16進出力(16~31はG~V)
  4572.             if ( txeff[i] > 9 ) fputc ( 'A' + txeff[i] - 10, cdhfp ); // 10だとA
  4573.             else fputc ( '0' + txeff[i], cdhfp );
  4574.         }
  4575.         fprintf ( cdhfp, "\nT%lu,%lu,%s\n", (ulong)x, (ulong)(tx->sy), (ulong)txbuf );
  4576.  
  4577.         if ( linkto[0] != '\0' ) {
  4578.             tx_writelink ( tx, headfp );
  4579.             linksx = tx->nx;
  4580.         }
  4581.         if ( tx->linkline ) {
  4582.             fprintf ( headfp, "X%lu\n", (ulong)x2 ); // 直前のリンクのx座標を補正(alignによる補正の前に出力するので座標がVer1のようにずれる、これを補正する)
  4583.             tx->linkline = 0;
  4584.         }
  4585.         if ( linkto[0] != '\0' ) tx->linkline = 1;
  4586.         txbuf[0] = '\0';
  4587.     }
  4588.     tx->sy += yl;
  4589.     if ( tx->sy > tx->maxy ) tx->maxy = tx->sy;
  4590.     tx->sx = tx->nx;
  4591.     tx->nl = 0;
  4592. }
  4593.  
  4594. void tx_maxreturn ( struct tx *tx, FILE *cdhfp, FILE *headfp, uint yl, uchar sw ) {
  4595.     if ( tx_nlcheck ( tx, sw ) ) tx_return ( tx, cdhfp, headfp, yl );
  4596. }
  4597.  
  4598. void tx_empreturn ( struct tx *tx, FILE *cdhfp, FILE *headfp, uint yl ) {
  4599.     if ( tx->nl > 0 ) tx_return ( tx, cdhfp, headfp, yl );
  4600. }
  4601.  
  4602. void tx_setlink ( struct tx *tx, FILE *headfp, uchar *href ) {
  4603.     tx->linkline = 1;
  4604.     if ( href[0] == '\0' ) {
  4605.         if ( linkto[0] != '\0' ) tx_writelink ( tx, headfp );
  4606.     } else {
  4607.         linksx = tx->sx + tx->nl;
  4608.     }
  4609.     strcpy ( linkto, href );
  4610. }
  4611.  
  4612. void tx_writelink ( struct tx *tx, FILE *headfp ) {
  4613.     if ( linksx < tx->sx + tx->nl ) // x1=x2の場合は必要ない
  4614.     fprintf ( headfp, "A%lu,%lu,%lu,%lu,%s\n", (ulong)linksx, (ulong)(tx->sy), (ulong)(tx->sx + tx->nl - 1), (ulong)(tx->sy + 15), linkto );
  4615. }
  4616.  
  4617. void tx_addstr ( struct tx *tx, uchar ch, uchar sw, uchar eff, FILE *cdhfp, FILE *headfp, uint yl ) {
  4618.     ulong nl2;
  4619.     uchar c;
  4620.  
  4621.     tx_maxreturn ( tx, cdhfp, headfp, yl, sw );
  4622.     nl2 = tx->nl >> 3;
  4623.     txbuf[nl2] = ch;
  4624.     txbuf[nl2+1]='\0'; // 特殊文字チェックを行うため必要
  4625.     txeff[nl2] = eff;
  4626.     tx->nl += 8;
  4627.     nl2++;
  4628.     if ( tx->sx + nl2 > tx->maxx ) tx->maxx = tx->sx + nl2;
  4629.  
  4630.     if ( ch == ';' ) {
  4631.             // 特殊文字チェックを行う(出現するならば末尾)
  4632.             // ただし、特殊文字の途中に改行が入ったら関知できない
  4633.             if ( ( jstrstr ( txbuf, ">" ) != NULL ) || ( jstrstr ( txbuf, ">" ) != NULL )) {
  4634.                 tx->nl -= 24, nl2 -= 3;
  4635.                 txbuf[nl2-1] = '>';
  4636.                 txbuf[nl2] = '\0';
  4637.             }
  4638.             if ( ( jstrstr ( txbuf, "<" ) != NULL ) || ( jstrstr ( txbuf, "<" ) != NULL )) {
  4639.                 tx->nl -= 24, nl2 -= 3;
  4640.                 txbuf[nl2-1] = '<';
  4641.                 txbuf[nl2] = '\0';
  4642.             }
  4643.             if ( ( jstrstr ( txbuf, "&" ) != NULL ) || ( jstrstr ( txbuf, "&" ) != NULL )) {
  4644.                 tx->nl -= 32, nl2 -= 4;
  4645.                 txbuf[nl2-1] = '&';
  4646.                 txbuf[nl2] = '\0';
  4647.             }
  4648.             if ( ( jstrstr ( txbuf, """ ) != NULL ) || ( jstrstr ( txbuf, """ ) != NULL ) ) {
  4649.                 tx->nl -= 40, nl2 -= 5;
  4650.                 txbuf[nl2-1] = '"';
  4651.                 txbuf[nl2] = '\0';
  4652.             }
  4653.             if ( ( jstrstr ( txbuf, " " ) != NULL ) || ( jstrstr ( txbuf, "&NBSP;" ) != NULL )) {
  4654.                 tx->nl -= 40, nl2 -= 5;
  4655.                 txbuf[nl2-1] = ' ';
  4656.                 txbuf[nl2] = '\0';
  4657.             }
  4658.             if ( ( jstrstr ( txbuf, "©" ) != NULL ) || ( jstrstr ( txbuf, "©" ) != NULL )) {
  4659.                 tx->nl -= 24, nl2 -= 3;
  4660.                 txbuf[nl2-3] = '(';
  4661.                 txbuf[nl2-2] = 'C';
  4662.                 txbuf[nl2-1] = ')';
  4663.                 txbuf[nl2] = '\0';
  4664.             }
  4665.             if ( ( jstrstr ( txbuf, "®" ) != NULL ) || ( jstrstr ( txbuf, "®" ) != NULL )) {
  4666.                 tx->nl -= 16, nl2 -= 2;
  4667.                 txbuf[nl2-3] = '(';
  4668.                 txbuf[nl2-2] = 'R';
  4669.                 txbuf[nl2-1] = ')';
  4670.                 txbuf[nl2] = '\0';
  4671.             }
  4672.             // 32~126が対象なので�は見なくてよい
  4673.             if ( ( nl2 > 5 ) && ( txbuf[nl2-6] == '&' ) && ( txbuf[nl2-5] == '#' ) && ( txbuf[nl2-4] >= '0' ) && ( txbuf[nl2-4] <= '9' ) && ( txbuf[nl2-3] >= '0' ) && ( txbuf[nl2-3] <= '9' ) && ( txbuf[nl2-2] >= '0' ) && ( txbuf[nl2-2] <= '9' ) ) {
  4674.                 // �
  4675.                 c = txbuf[nl2-4] - '0';
  4676.                 c *= 10;
  4677.                 c += txbuf[nl2-3] - '0';
  4678.                 c *= 10;
  4679.                 c += txbuf[nl2-2] - '0';
  4680.                 if ( ( c >= ' ' ) && ( c <= '~' ) ) {
  4681.                     tx->nl -= 40, nl2 -= 5;
  4682.                     txbuf[nl2-1] = c;
  4683.                     txbuf[nl2] = '\0';
  4684.                 } else switch ( c ) {
  4685.                 case 169:
  4686.                     // ©と同じ
  4687.                     tx->nl -= 16, nl2 -= 2;
  4688.                     txbuf[nl2-3] = '(';
  4689.                     txbuf[nl2-2] = 'R';
  4690.                     txbuf[nl2-1] = ')';
  4691.                     txbuf[nl2] = '\0';
  4692.                     break;
  4693.                 case 174:
  4694.                     // ®と同じ(但し元の長さが異なる)
  4695.                     tx->nl -= 24, nl2 -= 3; // ←注意
  4696.                     txbuf[nl2-3] = '(';
  4697.                     txbuf[nl2-2] = 'R';
  4698.                     txbuf[nl2-1] = ')';
  4699.                     txbuf[nl2] = '\0';
  4700.                     break;
  4701.                 }
  4702.             }
  4703.             if ( ( nl2 > 4 ) && ( txbuf[nl2-5] == '&' ) && ( txbuf[nl2-4] == '#' ) && ( txbuf[nl2-3] >= '0' ) && ( txbuf[nl2-3] <= '9' ) && ( txbuf[nl2-2] >= '0' ) && ( txbuf[nl2-2] <= '9' ) ) {
  4704.                 // �
  4705.                 c = txbuf[nl2-3] - '0';
  4706.                 c *= 10;
  4707.                 c += txbuf[nl2-2] - '0';
  4708.                 if ( ( c >= ' ' ) && ( c <= '~' ) ) {
  4709.                     tx->nl -= 32, nl2 -= 4;
  4710.                     txbuf[nl2-1] = c;
  4711.                     txbuf[nl2] = '\0';
  4712.                 }
  4713.             }
  4714.     }
  4715. }
  4716.  
  4717. void writecdh ( uchar *filename, uint tx, uint sx, uint ty, uint sy, long fy ) {
  4718.     long endy = sy + fy;
  4719.  
  4720.     uchar buf[200], ebuf[200], eb2[80], ebsw = 0;
  4721.     FILE *fp;
  4722.     uchar *p;
  4723.     uint i, j, c;
  4724.     int x1, x2, xe, xe2; // 1はファイル内座標値・2は画面内座標値
  4725.     long y1, y2, ye, ye2;
  4726.     uint x3, y3;
  4727.  
  4728.     fp = fopen2 ( filename, "r" );
  4729.     if ( fp == NULL ) return;
  4730.  
  4731.     do {
  4732.         while ( kbhit() ) getch();
  4733.         buf[0] = '\0'; // これがないと最後の行がだぶって実行される
  4734.         fgets ( buf, 200, fp );
  4735.         switch ( buf[0] ) {
  4736.         case '\0':
  4737.             break;
  4738.         case 'E':
  4739.         case 'e':
  4740.             strcpy ( ebuf, buf );
  4741.             ebsw = 0;
  4742.             break;
  4743.         case 'L':
  4744.         case 'l':
  4745.             p = buf + strlen ( buf ) - 1;
  4746.             if ( *p == '\n' ) *p = '\0';
  4747.             sscanf( buf + 1, "%d,%ld,%d,%ld", &x1, &y1, &xe, &ye );
  4748.             if ( ( y1 > endy ) && ( ye > endy ) ) break;
  4749.             if ( ( y1 < fy ) && ( ye < fy ) ) break;
  4750.             if ( ye < y1 ) {
  4751.                 // y1<=yeとなるように入れ換える
  4752.                 y2 = y1; y1 = ye; ye = y2;
  4753.                 x2 = x1; x1 = xe; xe = x2;
  4754.             }
  4755.             if ( ( y1 > endy ) || ( ye < fy ) ) break;
  4756.             if ( y1 < fy ) {
  4757.                 y1 = fy;
  4758.                 if ( x1 != xe ) x1 = x1 + ( xe - x1 ) * ( fy - y1 ) / ( ye - y1 );
  4759.             }
  4760.             if ( ye > endy ) {
  4761.                 ye = endy;
  4762.                 if ( x1 != xe ) xe = x1 + ( xe - x1 ) * ( endy - y1 ) / ( ye - y1 );
  4763.             }
  4764.             x2 = tx + x1;
  4765.             y2 = ty + y1 - fy;
  4766.             xe2 = tx + xe;
  4767.             ye2 = ty + ye - fy;
  4768.             gd_gline ( x2, y2, xe2, ye2, 15 );
  4769.             break;
  4770.         case 'T':
  4771.         case 't':
  4772.             p = buf + strlen ( buf ) - 1;
  4773.             if ( *p == '\n' ) *p = '\0'; // 判定しないと最終行の最後がおかしくなる
  4774.             sscanf( buf + 1, "%d,%ld", &x1, &y1 );
  4775.             if ( ( y1 >= fy - 20 ) && ( y1 <= endy ) ) {
  4776.                 if ( ebsw == 0 ) {
  4777.                     // Eは使うときに初めて変換する
  4778.                     sscanf ( ebuf + 1, "%u", &j );
  4779.                     p = ebuf + 1;
  4780.                     while ( *p != ',' ) p++;
  4781.                     p++;
  4782.                     if ( j > 80 ) j = 80;
  4783.                     for ( i = 0 ; i < j ; i++ ) {
  4784.                         c = *( p + i );
  4785.                         if ( c <= '9' ) eb2[i] = c - '0';
  4786.                         else eb2[i] = c - 'A' + 10;
  4787.                     }
  4788.                     for ( i = j ; i < 80 ; i++ ) eb2[i] = 0;
  4789.                     ebsw = 1;
  4790.                 }
  4791.                 p = buf + 1;
  4792.                 for ( i = 0 ; i < 2 ; i++ ) {
  4793.                     while ( *p != ',' ) p++;
  4794.                     p++;
  4795.                 }
  4796.                 x2 = tx + x1;
  4797.                 y2 = ty + y1 - fy;
  4798. //                gd_waitdraw(); // ここに入れないとGDC描画が終わっていないときに描いてしまう(gd_glineの最後に入れてはいるのだが?)
  4799.                 ft_writestrs ( p, eb2, x2/8, y2, ty, ty + sy, sx / 8 );
  4800.             }
  4801.             break;
  4802.         case 'G':
  4803.         case 'g':
  4804.             p = buf + strlen ( buf ) - 1;
  4805.             if ( *p == '\n' ) *p = '\0';
  4806.             sscanf( buf + 1, "%d,%ld,%u,%u", &x1, &y1, &x3, &y3 );
  4807.             if ( ( y1 + y3 >= fy ) && ( y1 <= endy ) ) {
  4808.                 p = buf + 1;
  4809.                 for ( i = 0 ; i < 4 ; i++ ) {
  4810.                     while ( *p != ',' ) p++;
  4811.                     p++;
  4812.                 }
  4813.                 x2 = tx + x1;
  4814.                 y2 = ty + y1 - fy;
  4815. //                gd_waitdraw();
  4816.                 bm_writecdb ( p, x2, y2, x3, y3, ty, ty + sy, 2, 77 );
  4817.             }
  4818.             break;
  4819.         default:
  4820.             break;
  4821.         }
  4822.     } while ( !feof ( fp ) );
  4823.  
  4824.     gd_waitdraw();
  4825.     fclose ( fp );
  4826. }
  4827.  
  4828. void loadhdr ( uchar *filename, uchar *name, ulong &starty, ulong &maxy, uchar *title, uchar *fname ) {
  4829.     FILE *fp;
  4830.     uchar buf[200];
  4831.     uint i;
  4832.     ulong l;
  4833.     uchar *p;
  4834.  
  4835.     *title = '\0';
  4836.     starty = 0;
  4837.     maxy = 0;
  4838.  
  4839.     fp = fopen2 ( filename, "r" );
  4840.     if ( fp == NULL ) return;
  4841.  
  4842.     do {
  4843.         buf[0] = '\0';
  4844.         fgets ( buf, 200, fp );
  4845.         i = strlen ( buf );
  4846.         if ( i > 0 ) {
  4847.             if ( buf[i-1]  == '\n' ) buf[i-1] = '\0';
  4848.         }
  4849.         switch ( buf[0] ) {
  4850.         case 'T':
  4851.         case 't':
  4852.             // タイトル
  4853.             p = buf + 1;
  4854.             i = 0;
  4855.             while ( *p != '\0' ) {
  4856.                 if ( iskanji ( *p ) ) {
  4857.                     if ( i >= 63 ) break;
  4858.                     title[i] = *p;
  4859.                     i++; p++;
  4860.                     title[i] = *p;
  4861.                     i++; p++;
  4862.                 } else {
  4863.                     if ( i >= 64 ) break;
  4864.                     title[i] = *p;
  4865.                     i++; p++;
  4866.                 }
  4867.             }
  4868.             title[i] = '\0';
  4869.             break;
  4870.         case 'F':
  4871.         case 'f':
  4872.             // ファイル名
  4873.             p = buf + 1;
  4874.             i = 0;
  4875.             while ( *p != '\0' ) {
  4876.                 if ( iskanji ( *p ) ) {
  4877.                     if ( i >= 63 ) break;
  4878.                     fname[i] = *p;
  4879.                     i++; p++;
  4880.                     fname[i] = *p;
  4881.                     i++; p++;
  4882.                 } else {
  4883.                     if ( i >= 64 ) break;
  4884.                     fname[i] = *p;
  4885.                     i++; p++;
  4886.                 }
  4887.             }
  4888.             fname[i] = '\0';
  4889.             break;
  4890.         case 'N':
  4891.         case 'n':
  4892.             // A NAME
  4893.             p = buf + 1;
  4894.             while ( ( *p != ',' ) && ( *p != '\0' ) ) p++;
  4895.             if ( *p == ',' ) p++;
  4896.             if ( strcmp ( p, name ) == 0 ) {
  4897.                 l = 0;
  4898.                 sscanf ( buf + 1, "%lu" , &l );
  4899.                 starty = l;
  4900.             }
  4901.         case 'Y':
  4902.         case 'y':
  4903.             // 縦幅
  4904.             sscanf ( buf + 1, "%lu", &maxy );
  4905.             break;
  4906.         default:
  4907.             break;
  4908.         }
  4909.     } while ( !feof ( fp ) );
  4910.     fclose ( fp );
  4911. }
  4912.  
  4913. void extlink ( uchar *hdrname, uchar *hdr2name, ulong y1, ulong y2 ) {
  4914.     FILE *fp;
  4915.     FILE *fp2;
  4916.     uint x1, x2, i;
  4917.     ulong fy1, fy2;
  4918.     uchar r, buf[200];
  4919.  
  4920.  
  4921.     fp = fopen2 ( hdrname, "r" );
  4922.     if ( fp == NULL ) return;
  4923.     remove ( hdr2name );
  4924.     fp2 = fopen2 ( hdr2name, "w" );
  4925.     if ( fp2 == NULL ) {
  4926.         fclose ( fp );
  4927.         return;
  4928.     }
  4929.     r = 0;
  4930.     do {
  4931.         buf[0] = '\0';
  4932.         fgets ( buf, 200, fp );
  4933.         i = strlen ( buf );
  4934.         if ( i > 0 ) {
  4935.             if ( buf[i-1]  == '\n' ) buf[i-1] = '\0';
  4936.         }
  4937.         switch ( buf[0] ) {
  4938.         case 'A':
  4939.             sscanf ( buf + 1, "%u,%lu,%u,%lu", &x1, &fy1, &x2, &fy2 );
  4940.             if ( !( ( fy2 < y1 ) || ( fy1 > y2 ) ) ) {
  4941.                 fprintf ( fp2, "%s\n", buf );
  4942.                 r = 1;
  4943.             }
  4944.             break;
  4945.         case 'X':
  4946.             if ( r ) {
  4947.                 fprintf ( fp2, "%s\n", buf );
  4948.                 r = 0;
  4949.             }
  4950.             break;
  4951.         default:
  4952.             break;
  4953.         }
  4954.     } while ( !feof ( fp ) );
  4955.     fclose ( fp2 );
  4956.     fclose ( fp );
  4957. }
  4958.  
  4959. void getlink ( uchar *filename, uchar *linkto, uint x, ulong y ) {
  4960.     FILE *fp;
  4961.     uint i;
  4962.     uchar buf[200];
  4963.     uint x1, x2;
  4964.     ulong y1, y2, mv;
  4965.     uchar *p;
  4966.     fpos_t f;
  4967.     uchar s;
  4968.  
  4969.     linkto[0] = '\0';
  4970.     fp = fopen2 ( filename, "r" );
  4971.     if ( fp == NULL ) return;
  4972.     s = 0, mv = 0;
  4973.     fgetpos ( fp, &f );
  4974.     do {
  4975.         buf[0] = '\0';
  4976.         fgets ( buf, 200, fp );
  4977.         i = strlen ( buf );
  4978.         if ( i > 0 ) {
  4979.             if ( buf[i-1]  == '\n' ) buf[i-1] = '\0';
  4980.         }
  4981.         switch ( buf[0] ) {
  4982.         // AとX以外も使うときはextlinkも変更する
  4983.         case 'A':
  4984.             if ( s == 0 ) break;
  4985.             sscanf ( buf + 1, "%u,%lu,%u,%lu", &x1, &y1, &x2, &y2 );
  4986.             x1 += mv;
  4987.             x2 += mv;
  4988.             if ( ( x1 <= x ) && ( x2 >= x ) && ( y1 <= y ) && ( y2 >= y ) ) {
  4989.                 p = buf + 1;
  4990.                 for ( i = 0 ; i < 4 ; i++ ) {
  4991.                     while ( *p != ',' ) p++;
  4992.                     p++;
  4993.                 }
  4994.                 strcpy ( linkto, p );
  4995.             }
  4996.             break;
  4997.         case 'X':
  4998.             if ( s ) {
  4999.                 fgetpos ( fp, &f );
  5000.                 s = 0;
  5001.             } else {
  5002.                 fsetpos ( fp, &f );
  5003.                 sscanf ( buf + 1, "%lu", &mv );
  5004.                 s = 1;
  5005.             }
  5006.             break;
  5007.         default:
  5008.             break;
  5009.         }
  5010.         if ( ( feof ( fp ) ) && ( s == 0 ) ) {
  5011.             fsetpos ( fp, &f );
  5012.             mv = 0;
  5013.             s = 1;
  5014.         }
  5015.     } while ( !feof ( fp ) );
  5016.     fclose ( fp );
  5017. }
  5018.  
  5019. void draw1 ( void ) {
  5020.     // draw1→HTML変換→draw2
  5021.     // このためHTML両脇スクロールバー部は表示しない
  5022.     uint i = ft_km_auto;
  5023.     gb_gcls ();
  5024.     printf ( "\033[2J\r" );
  5025.     rt_clock ();
  5026.     gd_gline ( 0, 0, 639, 0, 15 );
  5027.     gd_gline ( 0, 40, 639, 40, 15 );
  5028.     gd_gline ( 72, 20, 575, 20, 15 );
  5029.     gd_gline ( 70, 2, 70, 38, 15 );
  5030.     gd_gline ( 577, 2, 577, 38, 15 );
  5031.     gd_gline ( 0, 359, 639, 359, 15 );
  5032.     gd_gline ( 0, 399, 639, 399, 15 );
  5033.     gd_gline ( 0, 379, 639, 379, 15 );
  5034.     gd_waitdraw();
  5035.     ft_writestr ( "1終了   2漢SJIS 3漢EUC  4移動   5前ファイル 6先頭   7最終   8DIR    9       0       ", 0, 0, 382, 0, 399, i );
  5036. }
  5037.  
  5038. void draw2 ( uchar *cdhname, long y, ulong maxy, uchar *title, uchar *fname, uchar *hdrname, uchar *hdr2name ) {
  5039.     const long hei = 357 - 42;
  5040.     long y1, y2;
  5041.     uint i;
  5042.  
  5043.     printf ( "\033[19;1H%-79.79s\033[3;1H\r", "" );
  5044.     // タイトル・ファイル名
  5045.     i = ft_km_auto;
  5046.     gb_gcls2 ( 1, 19, 9, 71 );
  5047.     ft_writestr ( title, 0, 9, 2, 0, 399, i );
  5048.     gb_gcls2 ( 21, 39, 9, 71 );
  5049.     ft_writestr ( fname, 0, 9, 22, 0, 399, i );
  5050.  
  5051.     gb_gcls2 ( 41, 358 );
  5052.     ft_writestr ( "▲", 0, 0, 42, 0, 399, i );
  5053.     ft_writestr ( "■", 0, 0, 192, 0, 399, i );
  5054.     ft_writestr ( "▼", 0, 0, 357-15, 0, 399, i );
  5055.     gd_gline ( 625, 42, 625, 357, 15 );
  5056.     gd_gline ( 14, 42, 14, 357, 15 );
  5057.     rt_clock ();
  5058.     convhtmlbar ( 0, 0, 0, 254 );
  5059.     writecdh ( cdhname, 16, 616, 42, hei, y );
  5060.     extlink ( hdrname, hdr2name, y, y + 357 - 42 );
  5061.     // 右ゲージ
  5062.     if ( maxy > 0 ) {
  5063.         y1 = hei * y / (long)maxy;
  5064.         y2 = hei * ( y + hei ) / (long)maxy;
  5065.         if ( y1 <= 0 ) y1 = 0;
  5066.         if ( y1 >= hei ) y1 = hei;
  5067.         if ( y2 <= 0 ) y2 = 0;
  5068.         if ( y2 >= hei ) y2 = hei;
  5069.         y1 += 42;
  5070.         y2 += 42;
  5071.         gd_gline ( 627, y1, 639, y1, 15 );
  5072.         gd_gline ( 627, y2, 639, y2, 15 );
  5073.         gd_gline ( 627, y1, 627, y2, 15 );
  5074.         gd_gline ( 639, y1, 639, y2, 15 );
  5075.     }
  5076.     rt_clock ();
  5077.     convhtmlbar ( 0, 0, 0, 255 );
  5078.     gd_waitdraw();
  5079. }
  5080.  
  5081. void draw3 ( uchar *hdrname, uchar *linkto, long y, struct ip_joy &ipjoy ) {
  5082.     uchar buf[81], c;
  5083.     uint i, j;
  5084.  
  5085.     // added Ver2.1
  5086.     gb_waitvsync();
  5087.  
  5088.     ip_get ( ipjoy );
  5089.     while ( kbhit() ) getch();
  5090.     linkto[0] = '\0';
  5091.     if ( ( ipjoy.my >= 42 ) && ( ipjoy.my <= 357 ) ) {
  5092.         if ( ( ipjoy.mx == 15 ) || ( ipjoy.mx == 624 ) ) {
  5093.             buf[0] = '\0';
  5094.         } else if ( ipjoy.mx < 15 ) {
  5095.             // スクロール
  5096.             sprintf ( buf, "%4dドットスクロールします", ( (int)ipjoy.my - 200 ) * 2 );
  5097.         } else if ( ipjoy.mx > 624 ) {
  5098.             // ゲージ
  5099.             sprintf ( buf, "%3ld%%の位置へジャンプします", ( (long)ipjoy.my - 42 ) * 100 / ( 357 - 42 ) );
  5100.         } else {
  5101.             // リンク
  5102.             getlink ( hdrname, linkto, ipjoy.mx - 16, (long)ipjoy.my - 42 + y );
  5103.             strncpy ( buf, linkto, 80 );
  5104.             buf[80] = '\0';
  5105.         }
  5106.     } else if ( ipjoy.my >= 380 ) {
  5107.         // ファンクションキー
  5108.         i = ipjoy.mx & 63;
  5109.         j = ipjoy.mx / 64;
  5110.         if ( ( i > 7 ) && ( i < 56 ) ) {
  5111.             switch ( j ) {
  5112.             case 0:
  5113.                 strcpy ( buf, "ブラウザを終了します" );
  5114.                 break;
  5115.             case 1:
  5116.                 strcpy ( buf, "漢字コードをShiftJISに固定して読み直します(フォルダ一覧・画像には無効)" );
  5117.                 break;
  5118.             case 2:
  5119.                 strcpy ( buf, "漢字コードをEUC-JPに固定して読み直します(フォルダ一覧・画像には無効)" );
  5120.                 break;
  5121.             case 3:
  5122.                 strcpy ( buf, "キーボードで位置を入力して移動します" );
  5123.                 break;
  5124.             case 4:
  5125.                 strcpy ( buf, "前に見ていたファイルに戻ります" );
  5126.                 break;
  5127.             case 5:
  5128.                 strcpy ( buf, "一番上までスクロールします" );
  5129.                 break;
  5130.             case 6:
  5131.                 strcpy ( buf, "一番下までスクロールします" );
  5132.                 break;
  5133.             case 7:
  5134.                 strcpy ( buf, "現在見ているファイルがあるフォルダの一覧を出します" );
  5135.                 break;
  5136.             default:
  5137.                 buf[0] = '\0';
  5138.             }
  5139.         } else buf[0] = '\0';
  5140.     } else {
  5141.         buf[0] = '\0';
  5142.     }
  5143.     if ( buf[0] == '\0' ) {
  5144.         c = tempdrive + 'A' - 1;
  5145.         sprintf ( buf, "作業ドライブ%c: 空き%luバイト", c, tempfree );
  5146.     }
  5147.  
  5148.     printf ( "\033[19;1H%-79.79s\033[3;1H\r", buf );
  5149. }
  5150.  
  5151. void makename ( uint number, uchar *cdhname, uchar *hdrname ) {
  5152.     number %= 1000;
  5153.     sprintf ( cdhname, "$temp%u.cdh", number );
  5154.     dr_settempdir ( cdhname );
  5155.     sprintf ( hdrname, "$temp%u.hdr", number );
  5156.     dr_settempdir ( hdrname );
  5157. }
  5158.  
  5159. uint inputline ( uchar *buf ) {
  5160.     uchar c, r, k;
  5161.     uint i, j;
  5162.     uchar *p;
  5163.     uchar *q;
  5164.     r = 0;
  5165.     do {
  5166.         printf ( "\033[19;1H移動先:%-72.72s\033[19;8H%s\033[>5l", "", buf );
  5167.         i = strlen ( buf );
  5168.         c = getch();
  5169.         printf ( "\033[>5h\033[3;1H\r" );
  5170.         switch ( c ) {
  5171.         case '\n':
  5172.         case '\r':
  5173.             r = 1;
  5174.             break;
  5175.         case '\033':
  5176.             r = 2;
  5177.             break;
  5178.         case 8:
  5179.             p = q = buf;
  5180.             while ( *p != '\0' ) {
  5181.                 q = p;
  5182.                 p = nextchar ( p );
  5183.             }
  5184.             *q = '\0';
  5185.             break;
  5186.         default:
  5187.             if ( iskanji ( c ) ) {
  5188.                 if ( i < 71 ) {
  5189.                     buf[i] = c;
  5190.                     buf[i+1] = getch();
  5191.                     buf[i+2] = '\0';
  5192.                 }
  5193.             } else {
  5194.                 if ( i < 72 ) {
  5195.                     buf[i] = c;
  5196.                     buf[i+1] = '\0';
  5197.                 }
  5198.             }
  5199.         }
  5200.     } while ( r == 0 );
  5201.     return ( r - 1 );
  5202. }
  5203.  
  5204. void rt_init ( void ) {
  5205.     double s;
  5206.     double pai = 3.14159265358979;
  5207.     uint i;
  5208.  
  5209.     for ( i = 0 ; i < 60 ; i++ ) {
  5210.         s = sin ( pai * ( (double)i * 6.0 + 270.0 ) / 180.0 );
  5211.         rt_sinbuf[i] = (int)( s * 128 + .5);
  5212.     }
  5213. }
  5214.  
  5215. int rt_sin ( int min ) {
  5216.     return ( rt_sinbuf[( min + 60 ) % 60] );
  5217. }
  5218.  
  5219. int rt_cos ( int min ) {
  5220.     return ( rt_sinbuf[( min + 75 ) % 60] );
  5221. }
  5222.  
  5223. void rt_clock ( void ) {
  5224.     uint x, y, i;
  5225.     int x2, y2;
  5226.     struct time ti;
  5227.     struct date dt;
  5228.     uchar month[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  5229.     uint km = ft_km_auto;
  5230.     uchar buf[4];
  5231.  
  5232. //    if ( eg_ison ) eg_off ();
  5233.  
  5234.     //消去
  5235.     gb_gdcmode ( 0x80 );
  5236.     gb_gdctile ( 0 );
  5237.     for ( y = 1 ; y < 40 ; y++ ) {
  5238.         for ( x = 0 ; x < 7 ; x++ ) poke ( 0xa800, y * 80 + x, 0 );
  5239.     }
  5240.     gb_gdcmode ( 0 );
  5241.  
  5242.     gettime ( &ti );
  5243.  
  5244.     // 補助線
  5245.     for ( i = 0 ; i < 12 ; i++ ) {
  5246.         x2 = ( rt_cos ( i * 5 ) * 18 ) / 128 + 19;
  5247.         y2 = ( rt_sin ( i * 5 ) * 18 ) / 128 + 19;
  5248.         gd_gline ( x2, y2, x2 + 1, y2, 15 );
  5249.             gd_gline ( x2, y2 + 1, x2 + 1, y2 + 1, 15 );
  5250.     }
  5251.  
  5252.     // 時
  5253.     y = ( ti.ti_hour % 12 ) * 5 + ( ti.ti_min + 6 ) / 12;
  5254.     x2 = ( rt_cos ( y ) * 10 ) / 128 + 19;
  5255.     y2 = ( rt_sin ( y ) * 10 ) / 128 + 19;
  5256.     gd_gline ( 19, 19, x2, y2, 15 );
  5257.     gd_gline ( 19, 20, x2, y2 + 1, 15 );
  5258.     gd_gline ( 20, 19, x2 + 1, y2, 15 );
  5259.     gd_gline ( 20, 20, x2 + 1, y2 + 1, 15 );
  5260.  
  5261.     // 分
  5262.     y = ti.ti_min + ( ti.ti_sec + 30 ) / 60;
  5263.     x2 = ( rt_cos ( ti.ti_min ) * 14 ) / 128 + 19;
  5264.     y2 = ( rt_sin ( ti.ti_min ) * 14 ) / 128 + 19;
  5265.     gd_gline ( 19, 19, x2, y2, 15 );
  5266.     gd_gline ( 19, 20, x2, y2 + 1, 15 );
  5267.     gd_gline ( 20, 19, x2 + 1, y2, 15 );
  5268.     gd_gline ( 20, 20, x2 + 1, y2 + 1, 15 );
  5269.  
  5270.     // 秒
  5271.     //x2 = ( rt_cos ( ti.ti_sec ) * 15 ) / 128 + 20;
  5272.     //y2 = ( rt_sin ( ti.ti_sec ) * 15 ) / 128 + 20;
  5273.     //gd_gline ( 20, 20, x2, y2, 15 );
  5274.  
  5275.     getdate ( &dt );
  5276.  
  5277.     // 月
  5278.     ft_writestr ( month[dt.da_mon - 1], 0, 5, 22, 0, 399, km );
  5279.     // 日
  5280.     sprintf ( buf, "%2u", dt.da_day );
  5281.     ft_writestr ( buf, 0, 6, 2, 0, 399, km );
  5282. }
  5283.  
  5284. // sw=1ならデータ書き込み sw=0ならアドレス書き込み
  5285. void ip_sbout ( uchar data, uchar sw = 1 ) {
  5286.     uint i = 0;
  5287.     if ( ip_joy == 0 ) return;
  5288.     while ( ( i < 500 ) && ( inportb ( ip_joyport[ip_joy][0] ) & 0x80 ) ) i++;
  5289.     outportb ( ip_joyport[ip_joy][sw], data );
  5290. }
  5291.  
  5292. uchar ip_sbin ( uchar sw = 1 ) {
  5293.     if ( ip_joy == 0 ) return ( 0xff );
  5294.     return ( inportb ( ip_joyport[ip_joy][sw] ) );
  5295. }
  5296.  
  5297. void ip_init ( uchar speed ) {
  5298.     uint i, j, k;
  5299.  
  5300.     // Joystick
  5301.     if ( ip_joy > 3 ) {
  5302.         for ( i = 1 ; i <= 3 ; i++ ) {
  5303.             for ( j = 0 ; j < 20 ; j++ ) outportb ( 0x5f, 0 );
  5304.             k = inportb ( ip_joyport[i][0] );
  5305.             if ( k != 0xff ) ip_joy = i;
  5306.         }
  5307.  
  5308.         // Add Ver2.11 該当無しの場合
  5309.         if ( ip_joy > 3 ) ip_joy = 0;
  5310.     }
  5311.     if ( ip_joy ) {
  5312.         ip_sbout ( 7, 0 );
  5313.         i = inportb ( ip_joyport[ip_joy][1] );
  5314.         i &= 0x3f;
  5315.         i |= 0x80;
  5316.         ip_sbout ( i );
  5317.     }
  5318.  
  5319.     // Keyboard
  5320.     inregs.h.ah = 0x03;
  5321.     int86 ( 0x18, &inregs, &outregs );
  5322.  
  5323.     // Mouse
  5324.     if ( ip_mouse ) { // Added Ver2.11
  5325.         inregs.x.ax = 0x0000;
  5326.         inregs.x.bx = 0;
  5327.         int86 ( 0x33, &inregs, &outregs );
  5328.     }
  5329.     if ( ip_mouse == 3 ) {
  5330.         if ( outregs.x.ax == 0 ) {
  5331.             ip_mouse = 0;
  5332.         } else {
  5333.             if ( outregs.x.bx == 0 ) {
  5334.                 // NEC Function
  5335.                 ip_mouse = 1;
  5336.             } else {
  5337.                 // MS Function
  5338.                 ip_mouse = 2;
  5339.             }
  5340.         }
  5341.     }
  5342.     switch ( ip_mouse ) {
  5343.     case 1:
  5344.         inregs.x.ax = 0x12;
  5345.         inregs.x.bx = 2; // プレーン2
  5346.         int86 ( 0x33, &inregs, &outregs );
  5347.         ip_mvoff ();
  5348.         break;
  5349.     case 2:
  5350.         inregs.x.ax = 0xfd;
  5351.         inregs.x.bx = 1;
  5352.         int86 ( 0x33, &inregs, &outregs ); // プレーン3も使う
  5353.         inregs.x.ax = 0xff;
  5354.         inregs.x.bx = 15;
  5355.         int86 ( 0x33, &inregs, &outregs ); // プレーン0~3を使う
  5356.         ip_mvoff ();
  5357.         break;
  5358.     }
  5359.  
  5360.     ip_sp[0] = speed * 4;
  5361.     ip_sp[1] = speed * 2;
  5362.     ip_sp[2] = speed;
  5363. }
  5364.  
  5365. void ip_structinit ( struct ip_joy &ipjoy ) {
  5366.     uint i;
  5367.  
  5368.     ipjoy.mx = ip_mx;
  5369.     ipjoy.my = ip_my;
  5370.     ipjoy.jx = ipjoy.jy = 0;
  5371.     ipjoy.e = ipjoy.pe = ipjoy.s = ipjoy.b = ipjoy.pb = 0;
  5372.     for ( i = 0 ; i < 16 ; i++ ) ipjoy.key[i] = 0;
  5373. }
  5374.  
  5375. void ip_get ( struct ip_joy &ipjoy ) {
  5376.     uint i;
  5377.     char x = 0, y = 0, e = 0, s = 1, b = 0;
  5378.  
  5379.     for ( i = 0 ; i <= 15 ; i++ ) {
  5380.         inregs.h.ah = 0x04;
  5381.         inregs.h.al = i;
  5382.         int86 ( 0x18, &inregs, &outregs );
  5383.         ipjoy.key[i] = outregs.h.ah;
  5384.     }
  5385.     if ( ipjoy.key[0] & 1 ) e--; // ESC
  5386.     if ( ipjoy.key[3] & 16 ) e++; // Return
  5387.     i = ipjoy.key[7];
  5388.     if ( i & 4 ) y--; // Cursor
  5389.     if ( i & 8 ) x--;
  5390.     if ( i & 16 ) x++;
  5391.     if ( i & 32 ) y++;
  5392.     i = ipjoy.key[14];
  5393.     if ( i & 1 ) s++; // Shift
  5394.     if ( i & 16 ) s--; // Ctrl
  5395.     if ( ipjoy.key[1] & 64 ) b++; // BS
  5396.     i = ipjoy.key[12];
  5397.     if ( i & 4 ) e--; // f1終了
  5398.     if ( i & 64 ) b++; // f5戻る
  5399.  
  5400.     if ( ip_joy ) {
  5401.         // Joy1
  5402.         ip_sbout ( 0x0f, 0 );
  5403.         ip_sbout ( 0x8f );
  5404.         ip_sbout ( 0x0e, 0 );
  5405.         i = ip_sbin ();
  5406.         i = ~i;
  5407.         if ( i & 1 ) y--;
  5408.         if ( i & 2 ) y++;
  5409.         if ( ( i & 3 ) == 3 ) b++; // SELECT(上下同時)
  5410.         if ( i & 4 ) x--;
  5411.         if ( i & 8 ) x++;
  5412.         if ( ( i & 12 ) == 12 ) b++; // START(左右同時)
  5413.         if ( i & 16 ) e++;
  5414.         if ( i & 32 ) s++;
  5415.         // Joy2
  5416.         ip_sbout ( 0x0f, 0 );
  5417.         ip_sbout ( 0xcf );
  5418.         ip_sbout ( 0x0e, 0 );
  5419.         i = ip_sbin ();
  5420.         i = ~i;
  5421.         if ( i & 1 ) y--;
  5422.         if ( i & 2 ) y++;
  5423.         if ( ( i & 3 ) == 3 ) b++; // START・SELECTは戻る
  5424.         if ( i & 4 ) x--;
  5425.         if ( i & 8 ) x++;
  5426.         if ( ( i & 12 ) == 12 ) b++;
  5427.         if ( i & 16 ) e++;
  5428.         if ( i & 32 ) s++; // 第2は減速
  5429.     }
  5430.  
  5431.     // 座標値はマウス利用時はマウス座標・非利用時はip_mx・ip_my
  5432.     switch ( ip_mouse ) {
  5433.     case 2:
  5434.         inregs.x.ax = 3;
  5435.         int86 ( 0x33, &inregs, &outregs );
  5436.         ipjoy.mx = outregs.x.cx;
  5437.         ipjoy.my = outregs.x.dx;
  5438.         e += outregs.x.bx & 1;
  5439.         b += ( outregs.x.bx & 2 ) >> 1;
  5440.         break;
  5441.     case 1:
  5442.         inregs.x.ax = 3;
  5443.         int86 ( 0x33, &inregs, &outregs );
  5444.         ipjoy.mx = outregs.x.cx;
  5445.         ipjoy.my = outregs.x.dx;
  5446.         if ( outregs.x.ax ) e++;
  5447.         if ( outregs.x.bx ) b++;
  5448.         break;
  5449.     default:
  5450.         ipjoy.mx = ip_mx;
  5451.         ipjoy.my = ip_my;
  5452.         break;
  5453.     }
  5454.  
  5455.     if ( y > 1 ) y = 1;
  5456.     if ( y < -1 ) y = -1;
  5457.     if ( x > 1 ) x = 1;
  5458.     if ( x < -1 ) x = -1;
  5459.     if ( e > 1 ) e = 1;
  5460.     if ( e < -1 ) e = -1;
  5461.     if ( s > 2 ) s = 2;
  5462.     if ( s < 0 ) s = 0;
  5463.     if ( b > 1 ) b = 1;
  5464.  
  5465.     ipjoy.e = e;
  5466.     if ( ip_be == e ) ipjoy.pe = 0;
  5467.     else ipjoy.pe = e;
  5468.  
  5469.     ipjoy.b = b;
  5470.     if ( ip_bb == b ) ipjoy.pb = 0;
  5471.     else ipjoy.pb = b;
  5472.  
  5473.     ipjoy.s = s;
  5474.     ipjoy.jx = x;
  5475.     ipjoy.jy = y;
  5476.  
  5477.     // 新座標計算
  5478.     ipjoy.mx += (int)(x) * ip_sp[s];
  5479.     if ( ipjoy.mx < 0 ) ipjoy.mx = 0;
  5480.     if ( ipjoy.mx > 639 ) ipjoy.mx = 639;
  5481.     ipjoy.my += (int)(y) * ip_sp[s];
  5482.     if ( ipjoy.my < 0 ) ipjoy.my = 0;
  5483.     if ( ipjoy.my > 399 ) ipjoy.my = 399;
  5484.  
  5485.     // ip_mx・ip_myへの保存・マウス座標更新
  5486.     switch ( ip_mouse ) {
  5487.     case 2:
  5488.     case 1:
  5489.         inregs.x.ax = 4;
  5490.         inregs.x.cx = ipjoy.mx;
  5491.         inregs.x.dx = ipjoy.my;
  5492.         int86 ( 0x33, &inregs, &outregs );
  5493.         break;
  5494.     default:
  5495.         ip_mx = ipjoy.mx;
  5496.         ip_my = ipjoy.my;
  5497.         break;
  5498.     }
  5499.     ip_be = e;
  5500.     ip_bb = b;
  5501. }
  5502.  
  5503. void ip_mvon ( void ) {
  5504.     uint i;
  5505.     if ( ip_mouse ) {
  5506.         inregs.x.ax = 1;
  5507.         for ( i = 0 ; i < ip_mvo ; i++ )
  5508.             int86 ( 0x33, &inregs, &outregs );
  5509.         ip_mvo = 0;
  5510.     }
  5511. }
  5512.  
  5513. void ip_mvoff ( void ) {
  5514.     if ( ip_mouse ) {
  5515.         inregs.x.ax = 2;
  5516.         int86 ( 0x33, &inregs, &outregs );
  5517.         ip_mvo++;
  5518.     }
  5519. }
  5520.  
  5521. void ip_wmcursor ( struct ip_joy &ipjoy, uchar sw, uchar b ) {
  5522.     int static bx = 320, by = 200, bs = 0;
  5523.     int x1, y1, x2, y2;
  5524.  
  5525.     // ちらつき防止
  5526.     if ( ( sw == 0 ) && ( bs == b ) && ( ipjoy.mx == bx ) && ( ipjoy.my == by ) ) return;
  5527.  
  5528.     // 0通常 1描画のみ 2消去のみ
  5529.     if ( sw != 1 ) {
  5530.         // 前カーソル消去
  5531.         x1 = bx - 8;
  5532.         x2 = bx + 8;
  5533.         y1 = by - 8;
  5534.         y2 = by + 8;
  5535.         if ( x1 < 0 ) x1 = 0;
  5536.         if ( x2 > 639 ) x2 = 639;
  5537.         if ( y1 < 0 ) y1 = 0;
  5538.         if ( y2 > 399 ) y2 = 399;
  5539.         gd_gline ( x1, by, x2, by, 16 );
  5540.         gd_gline ( bx, y1, bx, y2, 16 );
  5541.         if ( bs ) {
  5542.             if ( by < 399 ) gd_gline ( x1, by+1, x2, by+1, 16 );
  5543.             if ( bx < 639 ) gd_gline ( bx+1, y1, bx+1, y2, 16 );
  5544.         }
  5545.     }
  5546.     // 新カーソル描画
  5547.     if ( sw != 2 ) {
  5548.         x1 = ipjoy.mx - 8;
  5549.         x2 = ipjoy.mx + 8;
  5550.         y1 = ipjoy.my - 8;
  5551.         y2 = ipjoy.my + 8;
  5552.         if ( x1 < 0 ) x1 = 0;
  5553.         if ( x2 > 639 ) x2 = 639;
  5554.         if ( y1 < 0 ) y1 = 0;
  5555.         if ( y2 > 399 ) y2 = 399;
  5556.         gd_gline ( x1, ipjoy.my, x2, ipjoy.my, 16 );
  5557.         gd_gline ( ipjoy.mx, y1, ipjoy.mx, y2, 16 );
  5558.         if ( b ) {
  5559.             if ( ipjoy.my < 399 ) gd_gline ( x1, ipjoy.my+1, x2, ipjoy.my+1, 16 );
  5560.             if ( ipjoy.mx < 639 ) gd_gline ( ipjoy.mx+1, y1, ipjoy.mx+1, y2, 16 );
  5561.         }
  5562.     }
  5563.     bx = ipjoy.mx;
  5564.     by = ipjoy.my;
  5565.     bs = b;
  5566. }
  5567.  
  5568.