;================================================================================ ;モジュール console ;ver 1.00 ; コンソール関連 ; llmod.asが必要です ;================================================================================ ; consoleモジュール命令一覧 ; ; console コンソールウィンドウの作成 ; console_end コンソールウィンドウを閉じる ; puts コンソールに文字列を書き込む ; gets コンソールから文字列を読み込む ; console_color コンソールのテキストの色設定 ; console_pos コンソールの文字表示位置設定 ; ; 計 6個 ; このファイルの最後にHSPで作成したプログラムをコンソールプログラムに ; 変換するスクリプトがあります。 ;使い方 ;================================================================================ ; console コンソールウィンドウの作成 ; ; パラメータ無し ;================================================================================ ; ;<>説明 ; コンソールウィンドウを作成します。 ; ;<>この命令を呼び出した後のstatの値 ; 0 成功 ; 1 失敗 ; ;================================================================================ ; console_end コンソールウィンドウを閉じる ; ; パラメータ無し ;================================================================================ ; ;<>説明 ; コンソールウィンドウを閉じます。 ; ;<>この命令を呼び出した後のstatの値 ; 0 成功 ; 1 失敗 ; ;================================================================================ ; puts v1 コンソールに文字列を書き込む ; ; v1 : コンソールに表示する文字列が入った文字列変数 ;================================================================================ ; ;<>説明 ; コンソールに文字列を表示します。 ; (putzを使うとv1に直接文字列を代入することができます。) ; ;================================================================================ ; gets v1,n2 コンソールから文字列を読み込む ; ; v1 : コンソールからの文字列を取得する変数 ; n2 : 取得する文字の数 ;================================================================================ ; ;<>説明 ; コンソールから文字列を取得します。 ; n2を省略したときの値は63です。 ; ;================================================================================ ; console_color n1 コンソールのテキストの色設定 ; ; n1 : コンソールの文字列の色 ;================================================================================ ; ;<>説明 ; コンソールに表示する文字列の色を設定します。 ; n1は以下の値を組み合わせて使います。1+4だと紫になります。 ; 1+4+8で明るい紫になります。 ; ; n1の値 色 ; 1 青 ; 2 緑 ; 4 赤 ; 8 強調 ; $10 青(背景) ; $20 緑(背景) ; $40 赤(背景) ; $80 強調(背景) ; ;================================================================================ ; console_pos n1,n2 コンソールの文字表示位置設定 ; ; n1 : x座標 ; n2 : y座標 ;================================================================================ ; ;<>説明 ; 文字列を表示する座標を設定します。 ; ;module始め>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #module "console" ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;console ;Consoleの作成 ;................................................................................ #deffunc console int mref v1 mref stt,64 if v1=0 { dllproc "AllocConsole",prm,0,D_KERNEL if stat=0 : stt=1 : return } ;#define STD_INPUT_HANDLE 0xfffffff6 ;#define STD_OUTPUT_HANDLE 0xfffffff5 ;#define STD_ERROR_HANDLE 0xfffffff4 dll_getfunc func,"GetStdHandle",D_KERNEL if func=0 : stt=1 : return prm=STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE prm=0xfffffff6,0xfffffff5,0xfffffff4 repeat 3 ll_callfunc@ prm.cnt,1,func std.cnt=dllret@ loop #define S_INPUT 0 #define S_OUTPUT 1 #define S_ERROR 2 stt=0 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;console_end ;Consoleの終了 ;................................................................................ #deffunc console_end dllproc "FreeConsole",prm,0,D_KERNEL if stat=0 : stt=1 : else stt=0 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;console_color ;Consoleのテキストの色設定 ;................................................................................ #deffunc console_color int mref v1 ;text ;#define FOREGROUND_BLUE 1 ;#define FOREGROUND_GREEN 2 ;#define FOREGROUND_RED 4 ;#define FOREGROUND_INTENSITY 8 ;#define BACKGROUND_BLUE $10 ;#define BACKGROUND_GREEN $20 ;#define BACKGROUND_RED $40 ;#define BACKGROUND_INTENSITY $80 prm=std.S_OUTPUT prm.1=v1 dllproc "SetConsoleTextAttribute",prm,2,D_KERNEL return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;console_pos ;Consoleのテキストの色設定 ;................................................................................ #deffunc console_pos int,int mref v1 ;x mref v2,1 ;y prm=std.S_OUTPUT prm.1=v1|(v2<<16) dllproc "SetConsoleCursorPosition",prm,2,D_KERNEL return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;console_size ;Consoleウィンドウのサイズ設定 ;................................................................................ #deffunc console_size int,int,int,int,int mref v1 ;left mref v2,1 ;top mref v3,2 ;right mref v4,3 ;bottom mref v5,4 ;flag prm=std.S_OUTPUT v1=v1|(v2<<16),v3|(v4<<16) prm.1=v5 getptr prm.2,v1 dllproc "SetConsoleWindowInfo",prm,3,D_KERNEL return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;console_sizeget ;Consoleウィンドウのサイズ取得 ;................................................................................ #deffunc console_sizeget val mref v1,16 prm=std.S_OUTPUT getptr prm.1,a dllproc "GetConsoleScreenBufferInfo",prm,2,D_KERNEL repeat 11 peek v1.cnt ,a,cnt*2 loop return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;puts ;Consoleに文字列を書き込む ;................................................................................ #deffunc putz str mref v1,32 goto @f #deffunc puts val mref v1,24 *@ strlen l,v1 : if l>=64 : sdim s,l+1 s=v1 prm=std.S_OUTPUT getptr prm.1,s strlen prm.2,s getptr prm.3,a prm.4=0 dllproc "WriteConsoleA",prm,5,D_KERNEL stt=prm.3 return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;gets ;Consoleから文字列を読み込む ;................................................................................ #deffunc gets val,int mref v1,24 mref v2,1 if v2=0 : v2=63 prm=std.S_INPUT getptr prm.1,v1 prm.2=v2 getptr prm.3,a prm.4=0 dllproc "ReadConsoleA",prm,5,D_KERNEL stt=prm.3 return #undef S_INPUT #undef S_OUTPUT #undef S_ERROR ;module終わり>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #global ; ; ;HSPで作成したプログラムをコンソールプログラムにする ; ; ; ;コンソールプログラムにした場合は ; ; console 1 ; ;を実行してから ; ;puts、putzで文字列を表示できます。 ; ; exename="test.exe" ;変換するexeファイル ; new_exename="c_"+exename ;変換したexeファイルの保存名 ; ; exist exename ; bufsize=strsize ; if bufsize=-1 : dialog exename+"が見つかりません" : end ; ; ;exeファイル読み込み ; alloc buf,bufsize ; bload exename,buf,bufsize ; ; ;new header address offset $3C(60) ; new_hdr_adr=buf.15 ; ; ;optional header address ; opt_hdr_adr=new_hdr_adr+4+20 ; ; ;subsystemを調べる ; subsystem_adr=opt_hdr_adr+$44 ; wpeek sub,buf,subsystem_adr ; ; ;1にするとサブシステムを表示して停止 ; #define CHECK_SUBSYSTEM 0 ; ; if CHECK_SUBSYSTEM { ; sdim subsystem_str,64,6 ; subsystem_str.0 = "[IMAGE_SUBSYSTEM_UNKNOWN]" ; subsystem_str.1 = "[IMAGE_SUBSYSTEM_NATIVE]" ; subsystem_str.2 = "[IMAGE_SUBSYSTEM_WINDOWS_GUI]" ;GUI ; subsystem_str.3 = "[IMAGE_SUBSYSTEM_WINDOWS_CUI]" ;コンソール ; subsystem_str.4 = "[IMAGE_SUBSYSTEM_OS2_CUI]" ; subsystem_str.5 = "[IMAGE_SUBSYSTEM_POSIX_CUI]" ; mes subsystem_str.sub+"("+sub+")" ; stop ; } ; ; ;サブシステムをコンソールにして保存 ; sub=3 ;3 コンソール ; wpoke buf,subsystem_adr,sub ; bsave new_exename,buf,bufsize ;