#99 Article 277 Posted at 1992/05/19 18:54:43 by きつねりす (MAP542) [BASIC.ML1]
Subject: Re: Re: Re: BASIC版ML1ローダー /273 /269 /267
ランダムアクセスしてファイルの大きさを取得すれば 大丈夫みたいですね。 あとは順にヘッダから読み込んで処理していけば良い・・・ っと問題の一つはクリアしました。 ヘッダーは96バイトですし、31Byte目にファイルの大きさが格納されているので、 100 OPEN FILENAME$ FOR RANDOM AS #1 LEN = 1 101 'OPEN "R",#1,FILENAME$,1 ''for FM-7,FM-77 MB-S1 etc. 110 GET #1,31,A 120 GET #1,32,B 130 FILEIZE=A*256+B とすればML1ファイルのサイズが得られるわけですね。 また機種によbトはファイルサイズを取得できる関数がある場合がありその時はどっ ちを使ってもいいのでは? ついでだから配列を取る時にランダムアクセスして縦×横のデータから大きさがもと まるので、取得したあとで配列を宣言したらよいかも・・・・(これは蛇足。160 *100に固定してしまおう) またメモリの節約についてはやはり PEEK POKE を使うのはさけて(使えば楽だけど、 格納場所が各機種に依存してしまう)文字列で扱おうと思います。 文字列変数が最大256文字までだったかとおもいますが、どうでしょうか?そうす れば160文字の文字列が100個ですみますから 10 DIM ML1$(100) で宣言すればよいのかな?、でパレット用の配列は 20 DIM PAL(128) でいいよね。ここまでは簡単だでも、ここからが問題なのだ。BASICの苦手なビット 操作なのね。97バイト目からデータだから、97バイト目を読み込んで色圧縮モー ドを読み取る。色圧縮モードは先頭から2bitで表わされていて 200 GET #1,97,A 210 COLORMODE = A \ 64 :'割り算の商を求めてる[ INT(A/64) ]と同等だね。 で取得できる。このカラーモード別にパレット情報を読み出そう。まずは色圧縮モー ド0の場合だ。色圧縮モード0では128色分すべて10ビットづつで記録されている ので10ビットづつ取り出して配列PAL(n)に格納していけばいい。必ず2Byteにまたがる から先頭のビットが番バイト目の何ビット目にあるかを計算して2バイト読み込ん で計算することにしよう。97Byte目の2bit目から10Byteごとだ。つまり等差数列を 考えてn番目のパレット情報は771+10(n-1)bit(=Sbit)目から始まっていることは 容易に分かるだろう。また768bitは96byteである。だから(Sbit \ 8)バイト目の上 から((Sbit-8) MOD 8 +8) bit から10bit取り出せば良い。 300 'COLORMODE =0 の時 310 FOR N=1 TO N 320 SBIT=761+10*N 330 A=SBIT \ 8 340 B=(SBIT-1) MOD 8 +1 350 GET #1,A,C 360 GET #1,A+1,D 370 PAL(N)=(C MOD 2^(9-B))*2^(B+1)+D \ 2^(7-B) 'もっと簡単になる? 380 NEXT 色圧縮モードが1と2の場合、デコードする場合は同等なので一緒のルーチンで 記述します。色圧縮モードに続く7bitで使用する色の数が書かれていますから、 それを読み出します。そのあと7bitでカラー番号が続く10bitでパレット番号が 記述されていますから使った色の数だけ読み出します。 400 'COLORMODE=1or2 410 GET #1,97,A:GET #1,98,B 420 CNUMBER=(A MOD 64)*2+B \ 128 +1 430 FOR CN=1 TO CNUMBER 440 SBIT=761+17*CN 450 A=SBIT\8:B=(SBIT-1) MOD 8 +1 460 GET #1,A,C:GET #1,A+1,D 470 N=((C*256+D)MOD 2^(17-B)) \ 2^(10-B) 480 SBIT=SBIT+7 490 A=SBIT \ 8 500 B=(SBIT-1) MOD 8 +1 510 GET #1,A,C 520 GET #1,A+1,D 530 PAL(N)=(C MOD 2^(9-B))*2^(B+1)+D \ 2^(7-B) 'もっと簡単になる? 540 NEXT こんな感じかな? どなたか添削してね。データ部分のデコードは次回まわしだよ きつねりす