screen01 中身確認

これ、面白い。とりあえず graphics card とやりとりする手段を確保したのだけれど、やりとりするフォーマットはどこで規定されているのか、と。で、回答としてはやりたいようにやんなさい、という事が書いてあるように見えるんですが本当なのかなぁ。

とりあえず

無問題、な旨の 0 が戻ってくるフォーマットが以下なのだろうという事で。

.section .data
.align 12
.globl FrameBufferInfo 
FrameBufferInfo:
.int 1024 /* #0 Width */
.int 768 /* #4 Height */
.int 1024 /* #8 vWidth */
.int 768 /* #12 vHeight */
.int 0 /* #16 GPU - Pitch */
.int 16 /* #20 Bit Dpeth */
.int 0 /* #24 X */
.int 0 /* #28 Y */
.int 0 /* #32 GPU - Pointer */
.int 0 /* #36 GPU - Size */

ええと alignment な関係の記述があるんですがこのあたり、よく分からんな。とは言え実装を確認してみたところでは

  • 引数のチェックして
  • FrameBufferInfo の属性に引数で設定された値を格納して
  • MailboxWrite を呼び出して
  • MainboxRead を呼び出して
    • 戻りの確認 (0 なら失敗扱い)
    • Pointer な属性を取得して 0 なら取得リトライ
  • 最後に FrameBufferInfo なアドレスを戻して終わり

という形なのか。

main.s

初期設定は以下な形。

mov r0,#1024
mov r1,#768
mov r2,#16
bl InitialiseFrameBuffer

これで frameBuffer なソレを準備しておいてエラーチェックをしてます。不具合発生であれば ACT な LED が点きっぱになるのかな。
で、最後に fremeBuffer を走査して云々、みたいなことしてますね。

render$:
        fbAddr .req r3
        ldr fbAddr,[fbInfoAddr,#32]

FrameBufferInfo の GPU - Pointer な属性を r3 (fbAddr) に load して

        colour .req r0
        y .req r1
        mov y,#768
        drawRow$:
                x .req r2
                mov x,#1024
                drawPixel$:
                        strh colour,[fbAddr]
                        add fbAddr,#2

その番地に色な情報を store しているのが分かります。最初 fbAddr を増分しているのが意味不明だったのですが、1024x768 な領域が確保されてて、そこに書き込んでいるのか、という事は一目瞭然ですね。
以降の部分は後始末と無限 loop の処理な記述です。

                        sub x,#1
                        teq x,#0
                        bne drawPixel$

                sub y,#1
                add colour,#1
                teq y,#0
                bne drawRow$

        b render$

.unreq fbAddr
.unreq fbInfoAddr

とりあえず、RasPi な graphic memory を使ってハロワ、な実装、ってことで。
元気があれば次を確認したいと思います。