以前、HSPでOSは作れるかというような質問があったと思います。
無論、現在の公式配布のもので開発は不可能です。
しかし、Windows上で動作するOSもどきというのを作ってみたら面白いのではないかと考え
(あくまでアート(art)的な意味で)いろいろ考えてみました。
そこで、OSには欠かせないHSP独自のファイルシステムを皆さんで開発しませんか?
Windows上で動作するために、実際本物のHDDを制御するわけにはいきません。
…ですので、1ファイルを1ディスクと見立てて仮想的なマシンがある状態で動作するというものを間が手見ました。
簡単な例が MS社の バーチャルPC ですね。あれも仮想HDDを使ってます。
今回は基礎であるファイルの I/O のみを作成しました。
GUI部分はまだ作ってません。誰かが作ってもいいです。
また気が向いたら改良したいですが、皆さんと一緒に開発したいので
(誰が作ったっていう概念はナシ。みんなで作るということ)
協力願います。
;-------- ; 現在勝手に決めた HSPFS の仕様。勝手に改良してやってください。(っというか、是非) ; ; 先頭から 5byte は必ず "HSPFS" となり、ファイルシステムをあらわす。(ファイルヘッダーにもなる) ; 6byte 以降 0x10 〜 0x11 の間はファイル名の情報が入る。 ; さらに、以降 0x11 〜 0x12 の間にはファイルサイズ情報が入る。 ; ファイル名、ファイルサイズを区切るときは 0x2A(*) を使う。 ; ; 例: [HSPFS |0x10| hsp3.exe**hsed3.exe |0x11| 159744**241664 |0x12|@ここからずっとデーター@] ; → 上の例では、1つ目のファイル、hsp3.exe (159744バイト) と 2つ目のファイルhsed3.exe(241664バイト) が混合していることになる。 ;-------- // すべてのディスクデーターが入るバッファサイズ v_BufferSize = 1024*1024*100 // 仮想ディスクのファイル名 FileDISK = "hspfs.hdd" // 一時的に開くフォルダ TempOpenPath = ""+dir_desktop+"\\" // ファイル名情報を収めるバッファ sdim FileNameList,1024*512 // ファイルサイズ情報を納めるバッファ sdim FileSizeList,1024*512 // 仮想ディスクが存在するかチェック exist FileDISK size = strsize SIZE_HDD = size if size = -1{ dialog "ディスク ["+FileDISK+"] が見つかりませんでした...",1,"ERROR [1]" } // バッファの分だけ確保 sdim buf,v_BufferSize bload FileDISK,buf,size // [ファイルシステムヘッダー]からファイルシステムを判断 if strmid(buf,0,5) ! "HSPFS"{ dialog "対応していないバーチャルディスクまたはファイルシステムです",1,"ERROR [2]" } // 何バイト目から何バイト目までが[ファイル情報、ファイルサイズ情報]か調べる repeat size if (peek(buf,cnt)==0x10){ NameHead_start = cnt } if (peek(buf,cnt)==0x11){ NameHead_end = cnt SizeHead_start = cnt } if (peek(buf,cnt)==0x12){ SizeHead_end = cnt ALLHead_end = cnt+1 break } loop NameHead_size = (NameHead_end-NameHead_start)-1 ; [ファイル名情報ヘッダー] サイズ SizeHead_size = (SizeHead_end-SizeHead_start)-1 ; [ファイルサイズ情報ヘッダー] サイズ // [ファイル情報ヘッダー] がゼロの場合は不正 if ((NameHead_start==0)or(NameHead_end==0)) { dialog "ディスク ["+FileDISK+"] は壊れているために使用できません",1,"ERROR [3]" } // ファイル名情報、ファイルサイズ情報を取得 memcpy FileNameList,buf,NameHead_size,0,7 memcpy FileSizeList,buf,SizeHead_size,0,NameHead_size+8 // 行形式に変換 repeat strlen(FileNameList) if (peek(FileNameList,cnt)==0x2A){ poke FileNameList,cnt,13 : poke FileNameList,cnt+1,10 } loop repeat strlen(FileSizeList) if (peek(FileSizeList,cnt)==0x2A){ poke FileSizeList,cnt,13 : poke FileSizeList,cnt+1,10 } loop // ウィンドウ。 screen 0,800,600 title "HSPFS シェル" syscolor 15 : boxf : syscolor 8 font "MS UI Gothic",24,1 objmode 2 pos 10,20 objsize 128,42 button gosub "開く",*OPEN pos 160,20 button gosub "追加",*IMPORT pos 310,20 button gosub "抽出",*EXPORT pos 460,20 button gosub "プロパティ",*INFO pos 0,80 objsize 800,325 listbox Sel_FileNameList,200,FileNameList stop *IMPORT // めんどくさくなった…orz dialog "誰かつくって(^^ゝ" return *EXPORT gosub *LB_GETINFO : if SIZE=0 : return // 一時的保存先 dialog getpath(NAME,18),17 if stat==0 : return tmp1 = refstr : tmp1+=getpath(NAME,2) // 一部を取り出して保存 sdim tmp2,SIZE memcpy tmp2,buf,SIZE,0,ALLHead_end bsave tmp1,tmp2,SIZE return *INFO gosub *LB_GETINFO : if SIZE=0 : return dialog "ファイル名 : "+NAME+"\nファイルサイズ : "+Size/1024+"KB ("+Size+" byte)\nファイルの種類 : "+getpath(name,2),0,"プロパティ" return *OPEN gosub *LB_GETINFO : if SIZE=0 : return // 一時的保存先 tmp1 = TempOpenPath tmp1+=NAME // 一部を取り出して保存 sdim tmp2,SIZE memcpy tmp2,buf,SIZE,0,ALLHead_end bsave tmp1,tmp2,SIZE // 実行ファイルかを調べる if (getpath(tmp1,18)==".exe")or(getpath(tmp1,18)==".scr"){ mode = 0 } else { mode = 16 } // 実行 exec tmp1,mode return *LB_GETINFO notesel FileSizeList noteget SIZE,Sel_FileName SIZE = int(SIZE) notesel FileNameList noteget NAME,Sel_FileName return
実験につかったファイルをアップロードしておきます。
http://briefcase.yahoo.co.jp/hsp_de_os