–³—¿
-
o‰ï‚¢
-
‰Ô
-
ƒ‰ƒCƒ”ƒ`ƒƒƒbƒg
-
ƒAƒNƒZƒX‰ðÍ
プリンターã®ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ï¼ˆMSX用16ドットプリンタ)をPNGファイルã«å¤‰æ›ã™ã‚‹ãƒ„ールã®ã‚½ãƒ¼ã‚¹
本題
Common Source Code Projectã‚„openMSXãªã©ã§å‡ºåŠ›ã§ãã‚‹ã€ãƒ—リンタ(MSX用)ã®ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’PNGファイルã«å¤‰æ›ã™ã‚‹ãƒ„ールã§ã™ã€‚
ãŸã ã—ã€å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã¯é…布ã—ã¾ã›ã‚“。C#ã®ã‚½ãƒ¼ã‚¹ã ã‘ç½®ã„ã¦ãŠãã¾ã™ã€‚
未実装機能やä¸å‚™ã‚‚多ã„ã§ã™ãŒæ”¹å–„予定ã¯æœªå®šãªã®ã§ã€(JUNK)ã¨ã—ã¦ãŠãã¾ã™ã€‚
サンプル1(アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚¹ãªã—)
サンプル2(アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚¹ã‚り)
実行ファイル生æˆã«ã¤ã„ã¦
C#ã®ã‚½ãƒ¼ã‚¹ã¯ã€.NET Frameworkã®ãƒ—ãƒã‚°ãƒ©ãƒ ãŒå‹•ä½œã™ã‚‹Windows環境ã§ã‚ã‚Œã°ã‚³ãƒžãƒ³ãƒ‰ãƒ—ãƒãƒ³ãƒ—トã‹ã‚‰
C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe lptlog2png.cs
ã¿ãŸã„ãªã®ã§å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã‚’生æˆã§ãるよã†ãªæ°—ãŒã—ã¾ã™ãŒã€â€v3.5â€ã®éƒ¨åˆ†ã‚’変更ã™ã‚‹å¿…è¦ãŒã‚ã£ãŸã‚Šã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
v2.0ç³»ã§ã‚‚OKã§ã™ãŒã€v1.1ç³»ã§ã¯ãƒ€ãƒ¡ã§ã™ã€‚
Linux(Mono)ç‰ã¯æœªç¢ºèªã§ã™ã€‚
コマンドライン
パラメータ無ã—ã§å®Ÿè¡Œã™ã‚Œã°å¤§ä½“ã‚ã‹ã‚‹ã‚“ã˜ã‚ƒãªã„ã‹ã¨æ€ã„ã¾ã™ãŒã€
lptlog2png.exe prn_2015-10-16_22-35-16.txt prn_2015-10-16_22-38-52.txt
ãªæ„Ÿã˜ã§ã€‚パラメータã¯å…¨ã¦ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«åã¨ã—ã¦è§£é‡ˆã•ã‚Œã¾ã™ã€‚
複数パラメータを入力ã—ãŸå ´åˆã€ãƒ‘ラメータをソートã—ã¦ã‹ã‚‰ã€ãã®é †ç•ªã«å…¥åŠ›ã•ã‚Œã¾ã™ã€‚ソートãŒä¸è¦ã§ã‚ã‚Œã°ã€ã‚½ãƒ¼ã‚¹ã® System.Array.Sort(args); をコメントアウトã—ã¦ä¸‹ã•ã„。
基本
HX-P560ã¨ã„ã†ã€MSX用ã®16ドットプリンタ(日本å‘ã‘ã€æ¼¢å—éžå¯¾å¿œã€ã‚«ãƒ©ãƒ¼éžå¯¾å¿œï¼‰ã‚’モデルã«ã—ã¦ã„ã¾ã™ã€‚B4用紙相当ã®ç”»åƒãƒ•ã‚¡ã‚¤ãƒ«ã«å‡ºåŠ›ã—ã¾ã™ã€‚ãŸã ã—ã€ä½™ç™½ãªã©ã¯å®Ÿè£…ã—ã¦ã„ã¾ã›ã‚“。
ç”»åƒãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«åã¯ã€printer0001.png, printer0002.png, ...ã¨ã„ã†æ„Ÿã˜ã§ã™ã€‚カレントフォルダã«ã€ç„¡æ¡ä»¶ã§ä¸Šæ›¸ã出力ã—ã¾ã™ã€‚
プリンタã®ãƒ•ã‚©ãƒ³ãƒˆROMã¯å†…蔵ã—ã¦ã„ãªã„ã®ã§ã€æ–‡å—ã®éƒ¨åˆ†ã¯é©å½“ã«ç”Ÿæˆã—ã¾ã™ã€‚ãªã®ã§ã€å®Ÿè¡Œç’°å¢ƒã«ã‚ˆã£ã¦å‡ºåŠ›ç”»åƒã¯å¤‰ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
未実装機能も色々ã¨ã‚ã‚Šã¾ã™ã€‚MSX用プリンタã¨ã—ã¦æœ€ä½Žé™å¿…è¦ãªåˆ¶å¾¡ã‚³ãƒ¼ãƒ‰ã¯å®Ÿè£…ã—ã¦ã„ã‚‹ã¯ãšã§ã™ã€‚
ソースを少ã—変更ã™ã‚Œã°ã€å‡ºåŠ›ãƒ•ã‚¡ã‚¤ãƒ«åã®å¤‰æ›´ã€ãƒ•ã‚©ãƒ³ãƒˆã®ã‚¢ãƒ³ãƒã‚¨ã‚¤ãƒªã‚¢ã‚¹ã®æœ‰ç„¡åˆ‡ã‚Šæ›¿ãˆã‚„ã€å‡ºåŠ›ç”»åƒã®dpi変更ãªã©ã‚‚ã‚る程度ã¯å¯èƒ½ã§ã™ã€‚
è¿½åŠ å®Ÿè£…æ©Ÿèƒ½
・漢å—手抜ã出力(ESC K ã®ã¿ã€‚詳細ãªä»•æ§˜ã¯çŸ¥ã‚‰ãªã„ã®ã§é©å½“。漢å—コードã®é•ã„ã€ãƒ•ã‚©ãƒ³ãƒˆå¹…ï¼ãƒ”ッãƒãªã©ã¯è€ƒæ…®ã—ã¦ã„ã¾ã›ã‚“。)
・24ドットビットイメージ手抜ã出力(ドットを間引ã„ã¦ç¸¦16ドットã«å¤‰æ›ã—ã¾ã™ã€‚ã¾ãŸã€æ”¹è¡Œå¹…制御ç‰ã¨ã®å…¼ãåˆã„ã§è¡Œé–“ãŒé–‹ã„ãŸã‚Šé‡ãªã£ãŸã‚Šã™ã‚‹å¯èƒ½æ€§ã‚‚ã‚ã‚Šã¾ã™ã—ã€æ¨ªå¹…ãŒè¶³ã‚Šãªãã¦é€”ä¸ã§æ”¹è¡Œã™ã‚‹å¯èƒ½æ€§ã‚‚ã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。縦横比も考慮ã—ã¾ã›ã‚“。)
・プãƒãƒãƒ¼ã‚·ãƒ§ãƒŠãƒ«ãƒ¢ãƒ¼ãƒ‰ï¼ˆESC Pã€ã¨ã‚Šã‚ãˆãšãƒ•ã‚©ãƒ³ãƒˆå¹…ãŒä¸å®šãªã ã‘。他ã®ãƒ¢ãƒ¼ãƒ‰ã¨ã®çµ±ä¸€æ„Ÿãªã—。)
未実装機能
・水平タブ
・垂直タブã¨ã‹VFUã¨ã‹ã€ãã®ã¸ã‚“
・余白ï¼ãƒžãƒ¼ã‚¸ãƒ³
・ドットアドレッシング
・拡大文å—
・逆方å‘改行
・アンダーライン
ãªã©ã€‚
ä¸å‚™
・フォントãŒç¾Žã—ããªã‹ã£ãŸã‚Šã€æ¿ç‚¹ã‚„åŠæ¿ç‚¹ã®ä¸Šã®ã»ã†ãŒæ¬ ã‘ãŸã‚Šã€åˆ¥ã®æ–‡å—ã¯ä¸‹ã®ã»ã†ãŒæ¬ ã‘ãŸã‚Šã€ç¸¦ç·šãŒæ¶ˆãˆãŸã‚Šã€ä¸€éƒ¨åˆ†ã®ãƒ•ã‚©ãƒ³ãƒˆãŒé•ã£ã¦ã„ãŸã‚Šã™ã‚‹ã‹ã‚‚ã—ã‚Œãªã„
・ビットイメージã®ç¸¦æ¨ªæ¯”ã¨ã‹ã€æ–‡å—ã®ã‚µã‚¤ã‚ºã¨ã®å…¼ãåˆã„ã¯è€ƒæ…®ã—ã¦ã„ãªã„
・(ç§ãŒæ°—付ã„ã¦ã„ãªã„ä¸å…·åˆã‚‚色々ã¨ã‚ã‚‹ã§ã—ょã†â€¦â€¦ï¼‰
・(ソースã®ä¸èº«ã«é–¢ã—ã¦ã‚‚ã€ã¾ã‚色々ã¨â€¦â€¦ï¼‰
ãªã©ã€‚
駄文1
201PL(PC-PR201ã¨ã‹ã€ãã®è¾ºï¼‰ã®åˆ¶å¾¡ã‚³ãƒ¼ãƒ‰ã‚‚基本ã¯åŒã˜ã‚ˆã†ãªæ„Ÿã˜ã®ã¯ãšãªã®ã§ã€æµç”¨ã‚‚ã—ãã¯å…±é€šåŒ–ã‚‚ã§ãã‚‹ã‹ã‚‚ã—ã‚Œãªã„ã‘ã©ã€ãŸã¶ã‚“ç§ã¯ã‚„ã‚Šã¾ã›ã‚“。
2015-10-31ã®æ™‚点ã§Common Source Code Projectã®MSXã¯ãƒ—リンタ出力ã«å¯¾å¿œã—ã¦ã„ãªã„ã®ã§ã™ãŒã€å¯¾å¿œã¯é›£ã—ããªã„ã¿ãŸã„ãªã®ã§ã€ç§ã‚’å«ã‚ãŸèª°ã‹ãŒãã®ã†ã¡ã‚„ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。やらãªã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
駄文2
ä¸å…·åˆä¿®æ£ãƒ»æ©Ÿèƒ½è¿½åŠ ・仕様変更・醜ã„ソースã®æ”¹å–„・英文ã®ã¤ã‚‚ã‚Šã‹ã‚‚ã—ã‚Œãªã„箇所ã®è¡¨è¨˜ä¿®æ£ãªã©ã‚’è¡Œã†äººãŒç¾ã‚Œã‚‹ã‹ã©ã†ã‹ã¯ã‚ã‹ã‚Šã¾ã›ã‚“ãŒã€ã‚‚ã—ãã†ã„ã†ã®ã‚’é…布ã™ã‚‹å ´åˆã¯ã€ãƒãƒ³ãƒ‰ãƒ«ãƒãƒ¼ãƒ ã¨æ—¥ä»˜ã¨ã‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ãªã‚“ã‹ãŒå®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚‚å«ã¾ã‚Œã‚‹ã‚ˆã†ã«ã—ã¦ã€æ”¹å¤‰ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’容易ã«åˆ¤åˆ¥ã§ãるよã†ã«ã™ã‚Œã°ã„ã„ã‚“ã˜ã‚ƒãªã„ã‹ãªã¨æ€ã„ã¾ã™ã€‚
C# lptlog2png.cs (use Unicode)
using System; using System.IO; using System.Text; using System.Drawing; using System.Drawing.Text; using System.Drawing.Imaging; class ProgramMain { static void Main(string[] args) { Lptlog2PNG plog2png = new Lptlog2PNG(); try { if (args.Length<1) { string av0; av0 = System.Windows.Forms.Application.ExecutablePath; av0 = System.IO.Path.GetFileName(av0); Console.WriteLine(plog2png.comment(0)); Console.WriteLine(plog2png.comment(1)); Console.WriteLine(" usage: {0} logfile1 [logfile2 [...]]", av0); Console.WriteLine(" example: {0} prn_2015-10-16_22-35-16.txt prn_2015-10-16_22-36-52.txt", av0); return; } System.Array.Sort(args); plog2png.set_format_png_filename("printer{0:0000}.png"); foreach(string str in args) { Console.WriteLine("input: {0}", str); using (FileStream fs_lptlog = File.OpenRead(str)) { while(true) { byte[] lptlogbuf = new byte[4]; int sz; sz = fs_lptlog.Read(lptlogbuf, 0, lptlogbuf.Length); if (0 == sz) break; int i; for(i=0; i
0) {write_multi(d); return;} else if ((0x00 < d) && (0x20 > d)) write_ctrl1(d); else if (!flag_kanji) {if (0x00 < d) write_char1(d);} else if (0 > byte_kanji_1st) byte_kanji_1st = (int)d; else {write_char2((byte)byte_kanji_1st, d); byte_kanji_1st = -1;} } void write_ctrl1(byte d) { switch(d) { case 0x0A: write_lf(); break; case 0x0D: write_cr(); break; case 0x0C: write_ff(); break; case 0x18: write_can(); break; default: if ((d == 0x01) || (d == 0x1B) || (d == 0x1C) || (d == 0x1A)) { add1_buf_command(d); } break; } } void write_multi(byte d) { switch(buf_command[0]) { case 0x01: if ((d >= 0x40) && (d < 0x60)) write_char1((byte)(d - 0x40)); clear_buf_command(); break; case 0x1B: write_multi_0x1B(d); break; default: clear_buf_command(); break; } } void write_multi_0x1B(byte d) { add1_buf_command(d); int len = get_len_buf_command(); switch(buf_command[1]) { case (byte)'N': width_dot_font = dpi_paper/10.0F; flag_kanji = false; clear_buf_command(); break; case (byte)'H': width_dot_font = dpi_paper/10.0F; flag_kanji = false; clear_buf_command(); break; case (byte)'E': width_dot_font = dpi_paper/12.0F; flag_kanji = false; clear_buf_command(); break; case (byte)'Q': width_dot_font = dpi_paper/17.0F; flag_kanji = false; clear_buf_command(); break; case (byte)'P': width_dot_font = -1; flag_kanji = false; clear_buf_command(); break; case (byte)'K': flag_kanji = true; byte_kanji_1st = -1; clear_buf_command(); break; case (byte)'A': lf_dot = dpi_paper/6; clear_buf_command(); break; case (byte)'B': lf_dot = dpi_paper/8; clear_buf_command(); break; case (byte)'T': if (len == 4) { lf_dot = dpi_paper * get_num_buf_command(2, 2)/120.0F; clear_buf_command(); } break; case (byte)'R': if (len == 6) { int i = get_num_buf_command(2, 3); for(; i>0; i--) write_char1(buf_command[5]); clear_buf_command(); } break; case (byte)'S': if (len == 7) { write_graphic(1); del_buf_command(1); count_graphics--; if (0 == count_graphics) clear_buf_command(); } else if (len == 6) { count_graphics = get_num_buf_command(2, 4); } break; case (byte)'I': if (len == 8) { write_graphic(2); del_buf_command(2); count_graphics--; if (0 == count_graphics) clear_buf_command(); } else if (len == 6) { count_graphics = get_num_buf_command(2, 4); } break; case (byte)'J': if (len == 9) { write_graphic(3); del_buf_command(3); count_graphics--; if (0 == count_graphics) clear_buf_command(); } else if (len == 6) { count_graphics = get_num_buf_command(2, 4); } break; case (byte)'V': if (len == 7) { int i = get_num_buf_command(2, 4); for(; i>0; i--) write_graphic(1); clear_buf_command(); } break; case (byte)'W': if (len == 8) { int i = get_num_buf_command(2, 4); for(; i>0; i--) write_graphic(2); clear_buf_command(); } break; case (byte)'U': if (len == 9) { int i = get_num_buf_command(2, 4); for(; i>0; i--) write_graphic(3); clear_buf_command(); } break; default: clear_buf_command(); break; } } void write_cr() { flush_line_to_page(); header_dot_x = 0; } void write_lf() { flush_line_to_page(); header_dot_y += lf_dot; if (/*bmp_page.Height < header_dot_y + bmp_line.Height*/(Math.Ceiling(height_mm_paper*dpi_paper/25.4F)) < header_dot_y + (dot_printer*dpi_paper/dpi_printer)) { if (null == bmp_page) { create_bmp_page(false); } save_page(); header_dot_y = 0; } } void write_ff() { flush_line_to_page(); if (null == bmp_page) { create_bmp_page(false); } save_page(); header_dot_y = 0; } void write_can() { rel_bmp_line(); header_dot_x = 0; } void write_char1(byte d) { string str_char = new String(chr1byte[d], 1); write_char(str_char, width_dot_font); } void write_char2(byte d1, byte d2) { if (0 == d1) { string str_char = new String(chr1byte[d2], 1); write_char(str_char, dpi_paper/10.0F); } else { Encoding jisEnc = Encoding.GetEncoding("iso-2022-jp"); byte[] bytes = new byte[] {0x1B, 0x24, 0x42, 0, 0}; bytes[3] = d1; bytes[4] = d2; string str_char = jisEnc.GetString(bytes); write_char(str_char, dpi_paper*3/20.0F); } } void write_char(string str_char, float width_dot) { // I don't have printer font ROM!!! if (null == bmp_line) { create_bmp_line(false); } SizeF szf; if (width_dot < 0) { szf = grp_line.MeasureString(str_char, draw_font_p, new PointF(0.0F, 0.0F), sf); if (bmp_line.Width < header_dot_x + Math.Ceiling(szf.Width)) {write_cr(); write_lf(); create_bmp_line(true);} grp_line.DrawString(str_char, draw_font_p, draw_brush, (int)header_dot_x, 0, sf); header_dot_x += (float)Math.Ceiling(szf.Width); } else { szf = grp_line.MeasureString(str_char, draw_font, new PointF(0.0F, 0.0F), sf); if (bmp_line.Width < header_dot_x + width_dot) {write_cr(); write_lf(); create_bmp_line(true);} Bitmap bmp_font = null; Graphics grp_font = null; create_bmp(ref bmp_font, ref grp_font, (int)Math.Ceiling(szf.Width), (int)Math.Ceiling(szf.Height)); grp_font.DrawString(str_char, draw_font, draw_brush, 0, 0, sf); if (!flag_anti_alias) bmp_font.MakeTransparent(Color.White); grp_line.DrawImage(bmp_font, (int)header_dot_x, 0, (int)width_dot, (int)Math.Ceiling(szf.Height)); header_dot_x += width_dot; grp_font.Dispose(); bmp_font.Dispose(); } } void write_graphic(int bytes) { if (null == bmp_line) { create_bmp_line(false); } if (bmp_line.Width < header_dot_x + dpi_paper/dpi_printer) {write_cr(); write_lf(); create_bmp_line(true);} bool[] dot = new bool[16]; int i; if (1 == bytes) { for(i=0; i<8; i++) { dot[i*2] = ((buf_command[6] & (1<
ã‚‚ã†ã€ã¤ã„ã§ã«æ›¸ã„ã¦ãŠãã‘ã©ã€msx.cppã§
io->set_iomap_range_rw(0x90, 0x91, printer);
printer.cppã‚’æ–°è¦è¿½åŠ ã—ã¦
void PRINTER::write_io8(uint32 addr, uint32 data) { switch(addr & 0xff) { case 0x90: emu->printer_strobe((data & 0x01) == 0); break; case 0x91: emu->printer_out(data & 0xff); break; } } uint32 PRINTER::read_io8(uint32 addr) { switch(addr & 0xff) { case 0x90: return busy ? 0xff : 0xfd; } return 0xff; }
ã¿ãŸã„ãªæ„Ÿã˜ã§ã€Common Source Code Projectã®MSXもプリンタãƒã‚°å‡ºåŠ›ã§ãるよã†ã§ã™ã€‚ã§ã‚‚今ã¯ã€ãƒã‚¤ãƒŠãƒªå…¬é–‹ã—ã¾ã›ã‚“。é¢å€’ãªã®ã§ã€‚
戻る
š
š
ƒAƒNƒZƒX‰ðÍ
SEO
/
SEO‘Îô
š
FC2
:
Text
AD
:
ŠJ”E’ñ‹ŸF‡ŠFC2
–³—¿ƒz[ƒ€ƒy[ƒW
–³—¿ƒT[ƒrƒXƒ‰ƒ“ƒLƒ“ƒO
ƒVƒ‡ƒbƒsƒ“ƒOƒJ[ƒg
BBS
ƒ‰ƒCƒuƒ`ƒƒƒbƒg
ƒJƒEƒ“ƒ^[
“Š•[
ƒhƒƒCƒ““o˜^798‰~`
ƒŒƒ“ƒ^ƒ‹ƒT[ƒo[
ƒAƒvƒŠƒP[ƒVƒ‡ƒ“ŠJ”
–³—¿I‰Âˆ¤‚¢o‰ï‚¢