0001: ;; FILE: sflag.nsc 0002: ;; MODULE: sflag 0003: ;; BRIEF: 文字列フラグを操作する。 0004: *sflag 0005: defsub sflaginit 0006: defsub sflagon 0007: defsub sflagoff 0008: defsub sflagat 0009: defsub sflagonall 0010: defsub sflagoffall 0011: numalias flag_arg,100 0012: numalias flag_self,flag_arg 0013: numalias flag_ret,flag_arg+1 0014: numalias flag_pos,flag_arg+2 0015: numalias flag_len,flag_arg+3 0016: return 0017: 0018: 0019: ;; FUNC: 文字列フラグを初期化する。 0020: ;; USAGE: sflaginit $フラグ,フラグ数 0021: ;; NOTE: フラグ数は1以上を指定すること。 0022: *sflaginit 0023: getparam s%flag_self,%flag_len 0024: if %flag_len<1 mesbox "sflag: invalid length","ASSERT!":end 0025: mov $%flag_self,"" 0026: for %flag_len=%flag_len to 1 step -1 0027: add $%flag_self,"0" 0028: next 0029: return 0030: 0031: 0032: ;; FUNC: 文字列フラグの指定位置を立てる。 0033: ;; USAGE: sflagon $フラグ,位置 0034: ;; NOTE: 位置は0以上フラグ数未満であること。 0035: *sflagon 0036: getparam s%flag_self,%flag_pos 0037: len %flag_len,$%flag_self 0038: if %flag_pos<0 mesbox "sflagon: negative index","ASSERT!":end 0039: if %flag_pos>=%flag_len mesbox "sflagon: over max index","ASSERT!":end 0040: mid $flag_self,$%flag_self,0,%flag_pos 0041: mid $%flag_self,$%flag_self,%flag_pos+1,%flag_len 0042: mov $%flag_self,$flag_self+"1"+$%flag_self 0043: return 0044: 0045: 0046: ;; FUNC: 文字列フラグの指定位置をおろす。 0047: ;; USAGE: sflagoff $フラグ,位置 0048: ;; NOTE: 位置は0以上フラグ数未満であること。 0049: *sflagoff 0050: getparam s%flag_self,%flag_pos 0051: len %flag_len,$%flag_self 0052: if %flag_pos<0 mesbox "sflagoff: negative index","ASSERT!":end 0053: if %flag_pos>=%flag_len mesbox "sflagoff: over max index","ASSERT!":end 0054: mid $flag_self,$%flag_self,0,%flag_pos 0055: mid $%flag_self,$%flag_self,%flag_pos+1,%flag_len 0056: mov $%flag_self,$flag_self+"0"+$%flag_self 0057: return 0058: 0059: 0060: ;; FUNC: 文字列フラグの指定位置の値を取得する。 0061: ;; USAGE: sflagat %値(0:off、1:on),$フラグ,位置 0062: ;; NOTE: 位置は0以上フラグ数未満であること。 0063: *sflagat 0064: getparam i%flag_ret,s%flag_self,%flag_pos 0065: mid $flag_ret,$%flag_self,%flag_pos,1 0066: atoi %%flag_ret,$flag_ret 0067: return 0068: 0069: 0070: ;; FUNC: 文字列フラグのすべての位置を立てる。 0071: ;; USAGE: sflagonall $フラグ 0072: ;; NOTE: 0073: *sflagonall 0074: getparam s%flag_self 0075: len %flag_len,$%flag_self 0076: mov $%flag_self,"" 0077: for %flag_len=%flag_len to 1 step -1 0078: add $%flag_self,"1" 0079: next 0080: return 0081: 0082: 0083: ;; FUNC: 文字列フラグのすべての位置をおろす。 0084: ;; USAGE: sflagoffall $フラグ 0085: ;; NOTE: 0086: *sflagoffall 0087: getparam s%flag_self 0088: len %flag_len,$%flag_self 0089: mov $%flag_self,"" 0090: for %flag_len=%flag_len to 1 step -1 0091: add $%flag_self,"0" 0092: next 0093: return