HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0719
HSP2年生VRAMについて教えてください6解決


HSP2年生

リンク

2007/7/19(Thu) 22:20:03|NO.9612

VRAMについて教えてください。

VRAMはウィンドウの左下から右上に向かってBGRの順に輝度値が格納されているということで
すが、以下はウィンドウの周りに2ドット分の枠を作るサンプルですがうまくいきません。
lx=200 だとOKですが何故でしょうか?ちなみにpsetでやるとlxに関係なくOKです。



ly=100 lx=205 ;lx=200 ;OK screen 0,lx,ly,8 mref vram1,66 repeat ly vy=cnt repeat lx if vy > 1 & vy < (ly-2) & cnt > 1 & cnt < (lx-2) :continue vpos=vy*lx*3+cnt*3 ;pset cnt,vy ;OK poke vram1,vpos,0 :poke vram1,vpos+1,0 :poke vram1,vpos+2,0 loop loop redraw 1



この記事に返信する


f

リンク

2007/7/19(Thu) 22:58:48|NO.9613

SDKのvramの記述によると、座標からアドレスの計算は

(フルカラーモード(1670万色)時)
x = X座標;
y = Y座標;
width = ((sx*3)+3)&~3;
vram_adr = pBit + ( ( sy - 1 - y ) * width ) + ( x * 3 );

と、なっておるね。

よって

	vpos = vy * lx * 3 + cnt * 3

	vwidth = ( ( lx * 3 ) + 3 ) & 0xfffffffc
	vpos   = ( ( ly - 1 - vy ) * vwidth ) + ( cnt * 3 )

にでも直せばOK。



f

リンク

2007/7/19(Thu) 23:05:17|NO.9614

vramは(内部的には)横方向には4の倍数単位分(のメモリが)確保されてると言う事じゃね。

だから計算結果のつじつまが合う時だけは、正常動作していた。
だから、lxが200の時の他に、単純に204とか208でも正常動作する。

psetでやるとOKだったのは、ソレを踏まえて作られているからじゃね。



hsp2年生

リンク

2007/7/20(Fri) 12:52:35|NO.9619

fさんありがとうございます。

>vwidth = ( ( lx * 3 ) + 3 ) & 0xfffffffc
>vpos = ( ( ly - 1 - vy ) * vwidth ) + ( cnt * 3 )

そうなんですか。
HSP開発wiki↓の
http://hspwiki.tm.land.to/?%BE%AE%A5%EF%A5%B6%2FVRAM%A4%F2%C4%BE%C0%DC%C1%E0%BA%EE%A4%B7%A4%C6%A4%DF%A4%EB#navigator

VRAMの構造を参考にしてウィンドウPOSに変換する必要ないのでvpos=vy*lx*3+cnt*3で良いと
思ったのですが・・・・

>vramは(内部的には)横方向には4の倍数単位分(のメモリが)確保されてると言う事じゃね。
3バイトづつ連続的にwinx X winy分格納されているのではないのですか?

VRAMの構造をもう少し正確に理解したいのでこれをもう少し詳しく説明してくれませんか?



f

リンク

2007/7/20(Fri) 13:21:31|NO.9620

自分も何処かで説明書読んだ訳でなくて、
	mes " x  : SDK :"
mes "---------------" for x,200,221 a = strf( "%03d", x ) b = strf( "%03d", ( ( x * 3 ) + 3 ) & 0xfffffffc ) c = strf( "%03d", x * 3 ) mes a + " : " + b + " : " + c next stop

こんな計算してみて、数字を見て「ああ、こーゆーもんか」と思っただけだから。
これみると、実際に必要な「横の分の容量」は、4の倍数になってる事が見て取れる。

横の分のピクセル数*3バイトの計算と、横の分のバイト数(ピクセル*3したあと4の倍数に
繰り上げ)の計算が一致した時(つまり、横サイズが4の倍数だった時)正常動作していた
理由は分かると思う。



f

リンク

2007/7/20(Fri) 13:26:47|NO.9621

逆に言えば、640*480とか普通に使う画面サイズなら、最初から4の倍数なので
余計な事考えなくていいって事じゃね?

これがWindowsの仕様なのかHSPの仕様なのかは知らない。



HSP2年生

リンク

2007/7/20(Fri) 22:14:45|NO.9628

ありがとうございます。ようやくわかりました。

>vwidth = ( ( lx * 3 ) + 3 ) & 0xfffffffc
は正確な横幅のバイト数なのですね。この式は直近の4の整数倍に切りあける式ですね。
メモリーは4バイト(32BIT)単位にアクセスするから・・・かな?

VRAMの構造がなんとなく分かりました。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.