;モジュール "PINGA1.21" ;PINGU1.2x互換の動作をします。 ; PINGUは色情報を弄ってファイルを隠蔽するので、 ;その動作をエミュレートしたこのモジュール自体は何も必要としません。 ;命令リファレンス ; 基本的にstat=0が正常終了。 ;PINGA_GetSize n1 ; gselで指定されたscreen(buffer)を読み取って、 ; n1にファイルサイズを返します。 ;PINGA_GetName v1 ; gselで指定されたscreen(buffer)を読み取って、 ; v1にファイルの名前を返します。 ;PINGA_GetFile v1 ; v1に隠蔽されたファイルを格納します。 ; refstrにはファイル名が返ります。 ; 失敗した場合はstatに1が返ります。 ;PINGA_GetMaxSize v1 ; v1に、 ; 現在の画面に隠蔽可能なサイズを返します。 ;PINGA_SetBuffer v1,s2,n3 ; v1の中身を現在のscreen(buffer)に埋め込みます。 ; s2にはファイルネームを、 ; n3には隠蔽するサイズを正確に指定して下さい。 ; サイズが0だったり、隠蔽可能なサイズを超えている場合は、statに1が返ります。 ;PINGA_SetName s1 ; 画面内にファイル名情報を埋め込みます。 ; フルパスを指定された場合も、ファイル名のみを抜き出します。 ;PINGA_SetSize n1 ; 画面内にファイルサイズ情報を埋め込みます。 ; サイズが0だったり、隠蔽可能なサイズを超えている場合は、statに1が返ります。 ; PINGA_Buffer命令は、内部でこの命令を呼び出しています。 ; (実質使うのはSetBufferでOKということ) ;PINGA_SetMode n1 ; 隠蔽後の色を指定します。 ; ちょこっと色味が変わります。 ; 0 = 灰色 ; 1 = 水 ; 2 = 紫 ; 3 = 黄 #module "PINGA" #deffunc _GetMaxPos mref bmscr,67 x=bmscr.1 y=bmscr.2 max=x*y return #deffunc PINGA_GetSize val mref size,16 mref vram,66 mref stt,64 _GetMaxPos repeat 4,0 gosub *getbyte:if _err=1:break poke size,cnt,byte loop stt=_err return #deffunc PINGA_GetName val mref name,24 mref stt,64 mref vram,66 _GetMaxPos dpos=0 repeat 256,4 gosub *getbyte if (byte=00) | (_err=1) :break poke name,dpos,byte dpos++ loop stt=_err ;dialog ""+name,2:if stat=7:end return #deffunc PINGA_GetBuffer val mref data,48 mref stt,64 mref ref,65 mref vram,66 _GetMaxPos redraw 0 PINGA_GetSize _size if size>max:stt=1:return dpos=0 repeat size,256 gosub *getbyte:if _err=1:break poke data,dpos,byte dpos++ loop sdim _name,256:PINGA_Getname _name:ref=_name _err=stt redraw 1 return #deffunc PINGA_SetSize int mref size,0 mref vram,66 _GetMaxPos if (size=>max)&(size=0):stt=1:return repeat 4,0 peek byte,size,cnt gosub *setbyte loop return #deffunc PINGA_SetName str mref name,32 mref vram,66 _GetMaxPos strlen namesize,name repeat namesize if cnt=>namesize:break peek code,name,cnt if code^$20-$A1 & $FF <= $3B :continue cnt+2 if code='\':lastcode=cnt loop strmid name,name,lastcode+1,namesize strlen namesize,name dpos=0 repeat namesize,4 ;dialog ""+byte peek byte,name,dpos gosub *setbyte dpos++ loop repeat 1,4+namesize byte=0 gosub *setbyte loop repeat 256-namesize,5+namesize randomize rnd byte,256 gosub *setbyte loop return #deffunc PINGA_SetBuffer val,str,int mref data,48 mref name,33 mref setsize,2 mref vram,66 mref stt,64 _GetMaxPos redraw 0 _max=max-256 if setsize=0:stt=1:return if setsize>_max:stt=1:return PINGA_SetSize setsize PINGA_SetName name dpos=0 repeat setsize,256 peek byte,data,dpos ; randomize ; rnd byte,256 ; byte=$FF gosub *setbyte dpos++ loop _size=_max-setsize-256 repeat _size,setsize+256 randomize rnd byte,256 gosub *setbyte loop stt=0 return #deffunc PINGA_SetMode int mref mode,0 mref stt,64 if mode>3:stt=1:mode=0 return #deffunc PINGA_GetMaxSize val mref maxsize,16 _GetMaxPos maxsize=max-256 return *setbyte ;title ""+byte vpos=cnt*3 low=byte&$F high=byte-low high=high/16 if mode=0 { randomize rnd _base,3 } if mode=1 : _base=0 if mode=2 : _base=1 if mode=3 : _base=2 peek R,vram,vpos peek G,vram,vpos+1 peek B,vram,vpos+2 base=(R+G+B)/3 ;dialog ""+base,2:if stat=7:end if base=0:base++ if base>$F0:base=$F0 R=base G=base B=base ;dialog ""+R+"/"+G+"/"+B+"\n"+high+"/"+low if _base=0 { R-- B+high G+low } if _base=1 { G-- B+high R+low } if _base=2 { B-- G+high R+low } ;dialog ""+R+"/"+G+"/"+B poke vram,vpos,R poke vram,vpos+1,G poke vram,vpos+2,B return *getbyte _err=0 vpos=cnt*3 peek R,vram,vpos peek G,vram,vpos+1 peek B,vram,vpos+2 if (R$0F) | (test<$00) :_err=1:return test=low-(base+1) if (test>$0F) | (test<$00) :_err=1:return byte =(high-(base+1)*16) + (low-(base+1)) return #global