forked from MightyPork/crsn
parent
ff84a7a481
commit
0a182fb91a
@ -0,0 +1,125 @@ |
|||||||
|
( |
||||||
|
; This program parses and shows bmp. |
||||||
|
; Only 32-bit RGB format is supported at the moment. |
||||||
|
|
||||||
|
(def HUGEPIXELS 1) |
||||||
|
|
||||||
|
(ld r0 @cin_r)(cmp r0 'B' (ne? (fault "Bad magic"))) |
||||||
|
(ld r1 @cin_r)(cmp r1 'M' (ne? (fault "Bad magic"))) |
||||||
|
(ldn _ @cin_r 8) |
||||||
|
|
||||||
|
(sym datastart r6) |
||||||
|
(call rd4) (ld datastart res0) |
||||||
|
|
||||||
|
(sym hlen r7) |
||||||
|
(call rd4) (ld hlen res0) |
||||||
|
|
||||||
|
(sym w r8) (sym h r9) |
||||||
|
(call rd4) (ld w res0) |
||||||
|
(call rd4) (ld h res0) |
||||||
|
|
||||||
|
(ldn _ @cin_r 2) ; planes |
||||||
|
|
||||||
|
(sym bits r10) |
||||||
|
(call rd2) (ld bits res0) |
||||||
|
|
||||||
|
(call rd4) (tst res0 (nz? (fault "Compression not implemented"))) |
||||||
|
(ldn _ @cin_r 12) ; image size + resolutions |
||||||
|
|
||||||
|
(sym usedcolors r11) |
||||||
|
(call rd4) (ld usedcolors res0) |
||||||
|
(ldn _ @cin_r 4) ; read to the end of the 40-byte header |
||||||
|
|
||||||
|
(cmp bits 32 (ne? (fault "Only 32-bit supported now"))) |
||||||
|
|
||||||
|
; Skip the palette if any |
||||||
|
(ld r0 datastart) |
||||||
|
(sub r0 54) |
||||||
|
|
||||||
|
; Discard bytes until the start of image data. This contains the palette! |
||||||
|
; TODO load to a buffer when indexed BMP support is added |
||||||
|
(ldn _ @cin_r r0) |
||||||
|
|
||||||
|
(sym x r4) |
||||||
|
(sym y r5) |
||||||
|
(sym dy r12) |
||||||
|
(ld x 0)(ld y h)(ld dy -1)(dec y) |
||||||
|
|
||||||
|
; test if height is negative |
||||||
|
(and r0 h 0x80000000 |
||||||
|
(nz? |
||||||
|
(or h 0xFFFFFFFF_00000000) ; sign extend |
||||||
|
(mul h -1) |
||||||
|
(ld dy 1) ; going downward |
||||||
|
(ld y 0) |
||||||
|
(dec y) |
||||||
|
)) |
||||||
|
|
||||||
|
(ld r0 w)(ld r1 h) |
||||||
|
(tst HUGEPIXELS (z? (j :nohuge1))) |
||||||
|
(mul r0 8)(mul r1 8)(sub r1 8) |
||||||
|
(:nohuge1) |
||||||
|
(sc-init r0 r1) |
||||||
|
|
||||||
|
; Here comes the parsing |
||||||
|
|
||||||
|
(:nx) |
||||||
|
(call rd4) |
||||||
|
(tst HUGEPIXELS |
||||||
|
(z? (sc-px x y res0)) |
||||||
|
(nz? (call bigpixel x y res0))) |
||||||
|
(add x 1) |
||||||
|
(cmp x w (ne? (j :nx))) |
||||||
|
(ld x 0) |
||||||
|
(add y dy (z? (j :end))) |
||||||
|
(cmp y h (eq? (j :end))) |
||||||
|
(j :nx) |
||||||
|
|
||||||
|
(:end) |
||||||
|
(sc-blit) |
||||||
|
(:endl) |
||||||
|
(sc-poll) |
||||||
|
(mslp 10) |
||||||
|
(j :endl) |
||||||
|
|
||||||
|
(proc bigpixel x y rgb |
||||||
|
(ld r4 x)(ld r1 y)(sub r1 1) |
||||||
|
(mul r4 8)(mul r1 8) |
||||||
|
(ld r2 r4)(add r2 8) |
||||||
|
(ld r3 r1)(add r3 8) |
||||||
|
(ld r0 r4) |
||||||
|
(:nx) |
||||||
|
(sc-px r0 r1 rgb) |
||||||
|
(add r0 1) |
||||||
|
(cmp r0 r2 (ne? (j :nx))) |
||||||
|
(ld r0 r4) |
||||||
|
(add r1 1) |
||||||
|
(cmp r1 r3 (eq? (ret))) |
||||||
|
(j :nx) |
||||||
|
) |
||||||
|
|
||||||
|
(proc rd4 |
||||||
|
; Read 4 bytes as little endian |
||||||
|
(ld8 r0 @cin_r)(lsl r0 8) |
||||||
|
(ld8 r0 @cin_r)(lsl r0 8) |
||||||
|
(ld8 r0 @cin_r)(lsl r0 8) |
||||||
|
(ld8 r0 @cin_r) |
||||||
|
(sw32 r0) |
||||||
|
(rev r0) |
||||||
|
(ret r0) |
||||||
|
) |
||||||
|
|
||||||
|
(proc rd2 |
||||||
|
; Read 2 bytes as little endian |
||||||
|
(ld8 r0 @cin_r)(sw8 r0) |
||||||
|
(ld8 r0 @cin_r)(sw8 r0) |
||||||
|
(ret r0) |
||||||
|
) |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
After Width: | Height: | Size: 24 KiB |
Loading…
Reference in new issue