HSP | 数値以外のデータからビット単位で切り抜いたり書き込んだり色々
HSP | 数値以外のデータからビット単位で切り抜いたり書き込んだり色々
// ビット単位でデータ操作
// by kerupani129 (http://blogs.yahoo.co.jp/kerupani/)
// 注意
// インデックス1・2というのは、下のように考える
// 例:インデックス1が 2 、インデックス2が 3 の所から4ビット
// ┌─ 1バイト目─┐┌─ 2バイト目─┐ 3ビット ┌──┐
// □□□□□□□□ □□□□□□□□ □■■■■□□□
#module "kerupanium_bit"
// 計算楽にするため用
#defcfunc advance int _p1,int _p2
// 繰り上げ(?)
// val=advance(p1,p2)
// p1=0~ : 元の数
// p2=0~ : これが0で無いときにp1に1足す
advance_a=_p1
if _p2!0 : advance_a+
return advance_a
// 基本の命令
#defcfunc bit_peek val _p1,int _p2,int _p3
// バッファから1bit読み出し
// val=bit_peek(p1,p2,p3)
// p1=変数 : 内容を読み出す元の変数名
// p2=0~ : バッファのインデックス1(1byte単位)
// p3=0~7 : 〃 2(1bit単位)
return (peek(_p1,_p2)>>_p3)&1
#deffunc bit_poke val _p1,int _p2,int _p3,int _p4
// バッファに1bit書き込み
// bit_poke p1,p2,p3,p4
// p1=変数 : バッファを割り当てた変数名
// p2=0~ : バッファのインデックス1(1byte単位)
// p3=0~7 : 〃 2(1bit単位)
// p4=0~1 : バッファに書き込む値(1bit単位)
if bit_peek(_p1,_p2,_p3)!_p4 : poke _p1,_p2,peek(_p1,_p2)^(1<<_p3)
return
#deffunc bit_expand var _p1,int _p2,int _p3
// ビットブロック(?)の再確保
// bit_power p1,p2,p3
// p1=変数 : 対象となる変数
// p2=0~ : 再確保サイズ1(1byte単位)
// p3=0~7 : 〃 2(1bit単位)
//
// statに、何byte確保したかの数値が返る
expand_len=advance(_p2,_p3)
memexpand _p1,expand_len
return expand_len
#deffunc bit_copy var _p1,var _p2,int _p3,int _p4,int _p5,int _p6,int _p7,int _p8
// ビットブロック(?)のコピー
// bit_copy p1,p2,p3,p4,p5,p6,p7,p8
// p1=変数 : コピー先の変数
// p2=変数 : コピー元の変数
// p3=0~ : コピーするサイズ1(1byte単位)
// p4=0~7 : 〃 2(1bit単位)
// p5=0~ : コピー先の変数メモリオフセット1(1byte単位)
// p6=0~7 : 〃 2(1bit単位)
// p7=0~ : コピー元の変数メモリオフセット1(1byte単位)
// p8=0~7 : 〃 2(1bit単位)
; この命令はとりあえずアバウトに作りました。
; いつか修正します。すいません。
repeat _p3*8+_p4
bit_poke _p1,_p5+(_p6+cnt)/8,(_p6+cnt)\8,bit_peek(_p2,_p7+(_p8+cnt)/8,(_p8+cnt)\8)
loop
return
#deffunc bit_set var _p1,int _p2,int _p3,int _p4,int _p5,int _p6
// ビットブロック(?)のクリア
// bit_set p1,p2,p3,p4,p5,p6
// p1=変数 : 書き込み先の変数
// p2=0~1 : クリアする値(1bit)
// p3=0~ : クリアするサイズ1(1byte単位)
// p4=0~7 : 〃 2(1bit単位)
// p5=0~ : 書き込み先の変数メモリオフセット1(1byte単位)
// p6=0~7 : 〃 2(1bit単位)
; この命令はとりあえずアバウトに作りました。
; いつか修正します。すいません。
repeat _p3*8+_p4
bit_poke _p1,_p5+(_p6+cnt)/8,(_p6+cnt)\8,_p2
loop
return
#global
※前回作っていたものとは全然違うソースなのでまったく互換性はありません。
a=10
repeat 4
mes bit_peek(a,0,cnt)
loop
mes ""
bit_poke a,0,0,1
bit_poke a,0,2,1
repeat 4
mes bit_peek(a,0,cnt)
loop
bit_set a,0,0,2,0,1
mes ""
repeat 4
mes bit_peek(a,0,cnt)
loop
mes ""
;bit_power b,9
;mes b
;mes ""
bit_copy c,a,0,4,0,0,0,0
repeat 4
mes bit_peek(c,0,cnt)
loop