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 を使ってハロワ、な実装、ってことで。
元気があれば次を確認したいと思います。