lisp/lisph/itosp_text
数値を(利用者にとって)簡単にスプライト表示するための命令群。prnumよりもマシじゃないかと勝手に思ってたり。
numalias itosp_num ; 値そのもの numalias itosp_lnum ; 整数部 numalias itosp_rnum ; 小数部 numalias itosp_result ; 結果を返す変数番号を格納する変数 numalias itosp_initflag ; 初期化したかどうかのフラグ numalias itosp_fontx numalias itosp_fonty numalias itosp_fontsp numalias itosp_color numalias itosp_widthflag ; 半角か全角かのフラグ numalias itosp_rotate ; 表示する桁をずらす。+にすると大きく、−にすると小さく。 numalias itosp_digit ; 桁のカンマを入れるか入れないか。 numalias itosp_sgn ; 先頭に+か-を入れるか入れないか。 numalias itosp_loop ; ループ用変数 numalias itosp_temp ; 一時変数 numalias itosp_temp1 ; 一時変数 numalias itosp_temp2 ; 一時変数 numalias itosp_len ; 長さを意味する一般数値 numalias itosp_head ; 変換後の数値の頭につける文字列 numalias itosp_tail ; 変換後の数値の末尾につける文字列 numalias itosp_tag numalias itosp_sp numalias itosp_x numalias itosp_y numalias itosp_alpha numalias itosp_itext ------ ------ ;============================== ; lisp/lisph ;============================== ;機能:文字スプライトのラッパー。 ;引数:スプライト番号,文字の幅,文字の高さ,文字間,色,表示したい数値,横位置,縦位置,透過度,(半角か全角か),(3桁毎にカンマを入れるか入れないか),(+記号を表示するか),(桁をずらすか=0はずらさない。+は桁が大きくなる。−は桁が小さくなる),(数値の先頭に表示する文字列),(数値の末尾に表示する文字列) *lisp mov %itosp_initflag,1 getparam %itosp_sp,%itosp_fontx,%itosp_fonty,%itosp_fontsp,$itosp_color,%itosp_num,%itosp_x,%itosp_y,%itosp_alpha,%itosp_widthflag,%itosp_digit,%itosp_sgn,%itosp_rotate,$itosp_head,$itosp_tail itosp_stag $itosp_tag itosp_text $itosp_itext,%itosp_num add $itosp_tag,$itosp_itext lsp %itosp_sp,$itosp_tag,%itosp_x,%itosp_y,%itosp_alpha return *lisph mov %itosp_initflag,1 getparam %itosp_sp,%itosp_fontx,%itosp_fonty,%itosp_fontsp,$itosp_color,%itosp_num,%itosp_x,%itosp_y,%itosp_alpha,%itosp_widthflag,%itosp_digit,%itosp_sgn,%itosp_rotate,$itosp_head,$itosp_tail itosp_stag $itosp_tag itosp_text $itosp_itext,%itosp_num add $itosp_tag,$itosp_itext lsph %itosp_sp,$itosp_tag,%itosp_x,%itosp_y,%itosp_alpha return ;============================== ; itosp_text ;============================== ;機能:与えられた数値を、文字スプライトに使える文字列にする。 ;引数:結果を返す文字列変数、内容 ;付記:様々な数値フラグを変更することで、動作が変わる。 ;付記:itosp_widthflag ; 0なら半角、1なら全角 ;付記:itosp_rotate ; 数値を実際よりも小さく(小数点をつけて)表現する。1で1桁右にずらす。 *itosp_text if %itosp_initflag = 0 itosp_init ; 初期化していなければ、初期化する。 getparam s%itosp_result,%itosp_num ; 引数を取得する。 mov $%itosp_result,"" ;============================== ; 整数部と小数部に分ける ;============================== if %itosp_rotate = 0 mov %itosp_lnum,%itosp_num:mov %itosp_rnum,0:goto *itosp_split_last if %itosp_rotate < 0 goto *itosp_split_small ;============================== ; 整数部のみの場合 ;============================== mov %itosp_rnum,0 mov %itosp_lnum,%itosp_num for %itosp_loop = 1 to %itosp_rotate mul %itosp_lnum,10 next goto *itosp_split_last ;============================== ; 小数部がある場合 ;============================== *itosp_split_small mov %itosp_lnum,%itosp_num for %itosp_loop = -1 to %itosp_rotate step -1 div %itosp_lnum,10 next mov %itosp_temp,%itosp_lnum for %itosp_loop = -1 to %itosp_rotate step -1 mul %itosp_temp,10 next mov %itosp_rnum,%itosp_num-%itosp_temp *itosp_split_last ;============================== ; 整数部を処理する(文字列に変換する) ;============================== abs %itosp_lnum,%itosp_lnum itoa $itosp_lnum,%itosp_lnum if %itosp_digit = 0 goto *itosp_nodigit mov $itosp_temp,$itosp_lnum mov $itosp_temp1,"" mov $itosp_temp2,"" *itosp_digitloop len %itosp_len,$itosp_temp if %itosp_lnum < 0 dec %itosp_len if %itosp_len < 4 goto *itosp_digitloop_last rl_split $itosp_temp,$itosp_temp1,$itosp_temp,3 addleft $itosp_temp2,$itosp_temp1 addleft $itosp_temp2,"," goto *itosp_digitloop *itosp_digitloop_last add $itosp_temp,$itosp_temp2 mov $itosp_lnum,$itosp_temp *itosp_nodigit ;============================== ; 少数部を処理する(文字列に変換する) ;============================== if %itosp_rotate > -1 goto *itosp_nosmall abs %itosp_rnum,%itosp_rnum itoa $itosp_rnum,%itosp_rnum abs %itosp_temp,%itosp_rotate ; 桁の足りないところは"0"で埋める。 fillleft $itosp_rnum,$itosp_rnum,%itosp_temp,"0" *itosp_nosmall ;============================== ; 整数部と小数部を結合する。 ;============================== mov $itosp_num,"" if %itosp_sgn = 1 && %itosp_num > -1 add $itosp_num,"+" if %itosp_num < 0 add $itosp_num,"-" add $itosp_num,$itosp_lnum notif %itosp_rotate < 0 goto *itosp_last add $itosp_num,"." add $itosp_num,$itosp_rnum *itosp_last len %itosp_len,$itosp_num ;もし、全角なら、全角に変換する。 if %itosp_widthflag = 1 h2z $itosp_num,$itosp_num:mul %itosp_len,2 ;============================== ; 最終的に結合する。 ;============================== len %itosp_temp,$itosp_head:add %itosp_len,%itosp_temp len %itosp_temp,$itosp_tail:add %itosp_len,%itosp_temp is_odd %itosp_temp,%itosp_len add $%itosp_result,$itosp_head if %itosp_temp = 1 inc %itosp_len:add $%itosp_result,"_" add $%itosp_result,$itosp_num add $%itosp_result,$itosp_tail return ;============================== ; itosp_stag ;============================== ;機能:文字列スプライトのタグの先頭部分を作成する。 *itosp_stag getparam s%itosp_tag mov $%itosp_tag,":s/" itoa $itosp_fontx,%itosp_fontx:add $%itosp_tag,$itosp_fontx:add $%itosp_tag,"," itoa $itosp_fonty,%itosp_fonty:add $%itosp_tag,$itosp_fonty:add $%itosp_tag,"," itoa $itosp_fontsp,%itosp_fontsp:add $%itosp_tag,$itosp_fontsp:add $%itosp_tag,";" add $%itosp_tag,$itosp_color return ;============================== ; itosp_len ;============================== ;機能:直前のitosp命令で作られた文字列の長さを取得する。 ;引数:結果を格納する数値変数 *itosp_len getparam i%itosp_temp mov %%itosp_temp,%itosp_len return ;============================== ; 初期化ルーチン ;============================== *itosp_init mov %itosp_fontx,16 mov %itosp_fonty,16 mov %itosp_fontsp,2 mov $itosp_color,"#FFFFFF" mov %itosp_rotate,0 mov %itosp_digit,0 mov %itosp_sgn,0 mov %itosp_initflag,1 return
後で、NScripterようのと比べてみるー。