|
| 1 | +;============================================================================== |
| 2 | +; ASM Testcase |
| 3 | +; flype, 2015-09-29 |
| 4 | +; load-ilbm.asm |
| 5 | +;============================================================================== |
| 6 | + |
| 7 | +; DC.L 0 |
| 8 | +; DC.L START |
| 9 | + SECTION .FASTRAM |
| 10 | + |
| 11 | +;============================================================================== |
| 12 | +; CONSTANTS |
| 13 | +;============================================================================== |
| 14 | + |
| 15 | +; Assert register |
| 16 | + |
| 17 | +ASSERT_ZERO EQU $00D0000C |
| 18 | + |
| 19 | +; Error codes |
| 20 | + |
| 21 | +ERROR_FORM EQU 1 ; Not a FORM chunk |
| 22 | +ERROR_ILBM EQU 2 ; Not a ILBM chunk |
| 23 | +ERROR_SIZE EQU 3 ; Incorrect or corrupted chunk size |
| 24 | + |
| 25 | +; Chunk Names |
| 26 | + |
| 27 | +ID_FORM EQU 'FORM' ; International File Format (IFF) |
| 28 | +ID_ILBM EQU 'ILBM' ; Interleaved Bitmap |
| 29 | +ID_BMHD EQU 'BMHD' ; BitmapHeader |
| 30 | +ID_CMAP EQU 'CMAP' ; ColorMap |
| 31 | +ID_CAMG EQU 'CAMG' ; ViewModes |
| 32 | +ID_DPI EQU 'DPI ' ; DPI |
| 33 | +ID_BODY EQU 'BODY' ; Image data |
| 34 | + |
| 35 | +; Struct BitmapHeader |
| 36 | + |
| 37 | +BmWidth EQU 0 |
| 38 | +BmHeight EQU 2 |
| 39 | +BmDepth EQU 8 |
| 40 | +BmCompr EQU 10 |
| 41 | + |
| 42 | +;============================================================================== |
| 43 | +; MAIN PROGRAM |
| 44 | +;============================================================================== |
| 45 | + |
| 46 | +START: |
| 47 | + CLR.L D0 ; FORM Name |
| 48 | + CLR.L D1 ; Chunk name (4 bytes) |
| 49 | + CLR.L D2 ; Chunk Size (in bytes) |
| 50 | + CLR.L D6 ; Chunk counter |
| 51 | + CLR.L D7 ; Error code |
| 52 | + LEA PIC,A1 ; Load Picture in A1 |
| 53 | +GETFORM: |
| 54 | + CMPI.L #ID_FORM,(A1)+ ; FORM ? |
| 55 | + BEQ GETSIZE ; If so, continue |
| 56 | + MOVE.L #ERROR_FORM,D7 ; D7 = Error |
| 57 | + BRA EXIT ; Stop |
| 58 | +GETSIZE: |
| 59 | + MOVE.L (A1)+,D0 ; D0 = FORM Size |
| 60 | + SUB.L #PICSZ-PIC-8,D0 ; If D0 = ( PICSIZE - PIC - 8 ) |
| 61 | + BEQ GETILBM ; Then continue |
| 62 | + MOVE.L #ERROR_SIZE,D7 ; D7 = Error |
| 63 | + BRA EXIT ; Stop |
| 64 | +GETILBM: |
| 65 | + CMP.L #ID_ILBM,(A1)+ ; ILBM ? |
| 66 | + BEQ GETCHUNKS ; If so, continue |
| 67 | + MOVE.L #ERROR_ILBM,D7 ; D7 = Error |
| 68 | + BRA EXIT ; Stop |
| 69 | +GETCHUNKS: |
| 70 | + MOVE.L (A1)+,D1 ; Chunk Name |
| 71 | + MOVE.L (A1)+,D0 ; Chunk Size |
| 72 | + CMPI.L #ID_BMHD,D1 ; D1 = BHMD ? |
| 73 | + BEQ GETBMHD ; If so, parse BitmapHeader chunk |
| 74 | + CMPI.L #ID_CMAP,D1 ; D1 = CMAP ? |
| 75 | + BEQ GETCMAP ; If so, parse ColorMap chunk |
| 76 | + CMPI.L #ID_CAMG,D1 ; D1 = CAMG ? |
| 77 | + BEQ GETCAMG ; If so, parse ViewModes chunk |
| 78 | + CMPI.L #ID_DPI,D1 ; D1 = DPI ? |
| 79 | + BEQ GETDPI ; If so, parse DPI chunk |
| 80 | + CMPI.L #ID_BODY,D1 ; D1 = BODY ? |
| 81 | + BEQ GETBODY ; If so, parse Body chunk |
| 82 | +GETNEXT: |
| 83 | + ADDA.L D0,A1 ; A1 + Chunk Size |
| 84 | + BRA GETCHUNKS ; Branch to Next chunk |
| 85 | +GETBMHD: |
| 86 | + LEA width,A2 |
| 87 | + MOVE.W BmWidth(A1),(A2) ; $280=640 |
| 88 | + LEA height,A2 |
| 89 | + MOVE.W BmHeight(A1),(A2) ; $100=256 |
| 90 | + LEA depth,A2 |
| 91 | + MOVE.B BmDepth(A1),(A2) ; $05 |
| 92 | + LEA compr,A2 |
| 93 | + MOVE.B BmCompr(A1),(A2) ; $01 |
| 94 | + ADDQ #1,D6 ; Increment Chunk counter |
| 95 | + BRA GETNEXT ; Continue |
| 96 | +GETCMAP: |
| 97 | + MOVE.L D0,D3 ; Store size |
| 98 | + DIVU.W #3,D3 ; Size / 3 bytes per color |
| 99 | + ;SUBI.L #32,D3 ; Should be 32 colors |
| 100 | + ;MOVE.L D3,ASSERT_ZERO ; Assert no error |
| 101 | + ;MOVE.L #31,D3 ; Store size |
| 102 | + MOVEA.L A1,A2 ; Store ColorMap address |
| 103 | +GETCMAP_LOOP: |
| 104 | + MOVE.B (A2)+,D4 ; Red |
| 105 | + MOVE.B (A2)+,D5 ; Green |
| 106 | + MOVE.B (A2)+,D6 ; Blue |
| 107 | + DBF D3,GETCMAP_LOOP ; Next color |
| 108 | + ADDQ #1,D6 ; Increment Chunk counter |
| 109 | + BRA GETNEXT ; Continue |
| 110 | +GETCAMG: |
| 111 | + MOVE.L (A1),D3 ; Viewmodes |
| 112 | + SUBI.L #$50091000,D3 ; Should be $50091000 |
| 113 | + MOVE.L D3,ASSERT_ZERO ; Assert no error |
| 114 | + ADDQ #1,D6 ; Increment Chunk counter |
| 115 | + BRA GETNEXT ; Continue |
| 116 | +GETDPI: |
| 117 | + MOVE.L (A1),D3 ; DPI |
| 118 | + SUBI.L #$0029002C,D3 ; Should be $0029002C |
| 119 | + MOVE.L D3,ASSERT_ZERO ; Assert no error |
| 120 | + ADDQ #1,D6 ; Increment Chunk counter |
| 121 | + BRA GETNEXT ; Continue |
| 122 | +GETBODY: |
| 123 | + ADDQ #1,D6 ; Increment Chunk counter |
| 124 | +EXIT: |
| 125 | + SUBI.L #5,D6 ; Check number of chunks in ILBM file. |
| 126 | + MOVE.L D6,ASSERT_ZERO ; Assert no error |
| 127 | + MOVE.L D7,ASSERT_ZERO ; Assert no error |
| 128 | + RTS |
| 129 | + |
| 130 | +;============================================================================== |
| 131 | +; Data Section |
| 132 | +;============================================================================== |
| 133 | + |
| 134 | +width: DC.W 0 |
| 135 | +height: DC.W 0 |
| 136 | +depth: DC.B 0 |
| 137 | +compr: DC.B 0 |
| 138 | + |
| 139 | +PIC: |
| 140 | + INCBIN "Demo640x256x5.ilbm" |
| 141 | + |
| 142 | +PICSZ: |
| 143 | + *-PIC1 |
| 144 | + |
| 145 | +;============================================================================== |
| 146 | +; End of file |
| 147 | +;============================================================================== |
0 commit comments