Bresenham アルゴリズムを使用して、さまざまな半径の長さの円 (コンソールでユーザーが提供) を描画する 1 bpp BMP ファイルを作成して保存するプログラムを MIPS アセンブリで作成したいと考えています。
今のところ、直径の整数値用に明確に定義された BMP ファイルがありますが、さらに 2 つのことに苦労しています。
- ビットマップの正しいアドレスにピクセルを描画する
- 正しいBresenham アルゴリズムを実装すると、一度に 8 つのポイントが適用されます
これは、正しいアドレスの場所にピクセルを描画する責任があるテキスト セグメントのコードの一部です。
# $t2 - length of row + padding
# $t3 - initial address of a bitmap (header)
# $t4 - pointer to move values from BMP header parameters onto the heap
.macro drawPixel(%x,%y)
addiu $t4, $t3, 62 # starting address of a pixel map
mult %y, $t2 # pixel y-value multiplied by row length
mflo $a2
addu $t4, $t4, $a2 # y-value pixel address computation
divu $a2, %x, 8 # pixel x-value divided by 8 to obtain number of bytes
addu $t4, $t4, $a2 # x-value pixel address computation
mfhi $a3
#addiu $a3, $a3, -1
li $a2, 1
srlv $a2, $a2, $a3
lb $a3, ($t4) # loading byte at the address of pixel map start (="white" byte)
or $a3, $a3, $a2 # adds a new coloured byte to a "white" byte
sb $a3, ($t4) # loads byte with a coloured pixel
.end_macro
enter code here
以下の部分は、テスト目的の簡単な例であり、意図した場所にピクセルが表示されないことを示しています。
li $a0, 0
li $a1, 0
drawPixel($a0, $a1)
li $a0, 4
li $a1, 0
drawPixel($a0, $a1)
私のプログラムはピクセルを描画しますが、どういうわけか逆の順序になっています。これが MIPS アセンブリの異なるビッグ/リトルエンディアンに関連しているかどうか疑問に思います。もしそうなら、どうすれば修正できますか?
ご協力いただきありがとうございます。おそらく、この部分で私を導くことができれば、ブレゼンハムアルゴリズムに関する2番目の質問は必要ありません.