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ようのと比べてみるー。