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