; Copyright 1996 Acorn Computers Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;     http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
; generated by Norcroft RISC OS ARM C vsn 5.05 (Acorn Computers Ltd) [Dec 23 1994]

        AREA |C$$code|, CODE, READONLY
|x$codeseg|

        EXPORT  memcpy
memcpy
        MOV      a4,a1
        MOV      ip,a3
        SUB      a3,a3,#1
        CMP      ip,#0
        MOVLSS   pc,lr
|L000014.J4.memcpy|
        LDRB     ip,[a2],#1
        STRB     ip,[a4],#1
        MOV      ip,a3
        SUB      a3,a3,#1
        CMP      ip,#0
        BHI      |L000014.J4.memcpy|
        MOVS     pc,lr

        EXPORT  strcpy
strcpy
        MOV      a3,a1
        LDRB     a4,[a2,#0]
        CMP      a4,#&1f
        MOVLES   pc,lr
|L000040.J4.strcpy|
        LDRB     a4,[a2],#1
        STRB     a4,[a3],#1
        LDRB     a4,[a2,#0]
        CMP      a4,#&1f
        BGT      |L000040.J4.strcpy|
        MOVS     pc,lr

        EXPORT  memset
memset
        MOV      a4,a1
        MOV      ip,a3
        SUB      a3,a3,#1
        CMP      ip,#0
        MOVLSS   pc,lr
        AND      a2,a2,#&ff
|L000070.J4.memset|
        STRB     a2,[a4],#1
        MOV      ip,a3
        SUB      a3,a3,#1
        CMP      ip,#0
        BHI      |L000070.J4.memset|
        MOVS     pc,lr

        IMPORT  exit
        EXPORT  panic_exit
panic_exit
        B        exit

get_2bytes
        MOV      a4,#&ff
        LDR      a2,[a1,#&38]
        LDR      a3,[a1,#&34]
        CMP      a3,a2
        LDRCCB   a2,[a3],#1
        STRCC    a3,[a1,#&34]
        MOVCS    a2,a4
        MOV      a3,a2
        ADD      ip,a1,#&34
        LDMIA    ip,{a2,ip}
        CMP      a2,ip
        LDRCCB   a4,[a2],#1
        STRCC    a2,[a1,#&34]!
        ADD      a1,a4,a3,LSL #8
        MOVS     pc,lr

skip_variable
        MOV      ip,sp
        STMDB    sp!,{v1,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        BL       get_2bytes
        SUB      a1,a1,#2
        CMP      a1,#0
        LDMLEDB  fp,{v1,fp,sp,pc}^
        LDR      a2,[v1,#&38]
|L0000ec.J4.skip_variable|
        LDR      a3,[v1,#&34]
        CMP      a3,a2
        ADDCC    a3,a3,#1
        STRCC    a3,[v1,#&34]
        SUB      a1,a1,#1
        CMP      a1,#0
        BGT      |L0000ec.J4.skip_variable|
        LDMDB    fp,{v1,fp,sp,pc}^

        IMPORT  newline
get_dht
        MOV      ip,sp
        STMDB    sp!,{v1-v6,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        SUB      sp,sp,#&114
        BL       get_2bytes
        SUB      v4,a1,#2
        CMP      v4,#0
        BLE      |L000258.J37.get_dht|
        MOV      v6,#0
        MOV      v5,#&ff
|L000138.J4.get_dht|
        ADD      a2,v1,#&34
        LDMIA    a2,{a1,a2}
        CMP      a1,a2
        LDRCCB   a2,[a1],#1
        STRCC    a1,[v1,#&34]
        MOVCS    a2,v5
        MOV      v2,a2
        STRB     v6,[sp,#&100]
        MOV      v3,#0
        MOV      a1,#1
|L000160.J10.get_dht|
        ADD      a3,v1,#&34
        LDMIA    a3,{a2,a3}
        CMP      a2,a3
        MOVCS    a2,v5
        BCS      |L000180.J11.get_dht|
        LDRB     a3,[a2],#1
        STR      a2,[v1,#&34]
        MOV      a2,a3
|L000180.J11.get_dht|
        ADD      a3,sp,#&100
        STRB     a2,[a3,a1]
        ADD      a2,sp,#&100
        LDRB     a2,[a2,a1]
        ADD      v3,a2,v3
        ADD      a1,a1,#1
        CMP      a1,#&10
        BLE      |L000160.J10.get_dht|
        CMP      v3,#&100
        BLGT     newline
        MOVGT    a1,#&b9
        ADDGT    a1,a1,#&4e00
        BLGT     exit
        MOV      a1,#0
        CMP      v3,#0
        BLE      |L0001f0.J18.get_dht|
|L0001c0.J17.get_dht|
        ADD      a3,v1,#&34
        LDMIA    a3,{a2,a3}
        CMP      a2,a3
        MOVCS    a2,v5
        BCS      |L0001e0.J20.get_dht|
        LDRB     a3,[a2],#1
        STR      a2,[v1,#&34]
        MOV      a2,a3
|L0001e0.J20.get_dht|
        STRB     a2,[sp,a1]
        ADD      a1,a1,#1
        CMP      a1,v3
        BLT      |L0001c0.J17.get_dht|
|L0001f0.J18.get_dht|
        ADD      a1,v3,#&11
        SUB      v4,v4,a1
        TST      v2,#&10
        SUBNE    v2,v2,#&10
        ADD      a1,v1,v2,LSL #2
        ADDEQ    v3,a1,#&64
        ADDNE    v3,a1,#&74
        CMP      v2,#0
        BLT      |L00021c.J28.get_dht|
        CMP      v2,#4
        BLT      |L00022c.J27.get_dht|
|L00021c.J28.get_dht|
        BL       newline
        MOV      a1,#&2c8
        ADD      a1,a1,#&4c00
        BL       exit
|L00022c.J27.get_dht|
        ADD      a2,sp,#&100
        MOV      a3,#&11
        LDR      a1,[v3,#0]
        BL       memcpy
        LDR      a1,[v3,#0]
        ADD      a1,a1,#&11
        MOV      a2,sp
        MOV      a3,#&100
        BL       memcpy
        CMP      v4,#0
        BGT      |L000138.J4.get_dht|
|L000258.J37.get_dht|
        LDMDB    fp,{v1-v6,fp,sp,pc}^

get_dac
        MOV      ip,sp
        STMDB    sp!,{v1-v5,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        BL       get_2bytes
        SUB      v4,a1,#2
        CMP      v4,#0
        LDMLEDB  fp,{v1-v5,fp,sp,pc}^
        MOV      v5,#&ff
|L000280.J4.get_dac|
        ADD      a2,v1,#&34
        LDMIA    a2,{a1,a2}
        CMP      a1,a2
        LDRCCB   a3,[a1],#1
        STRCC    a1,[v1,#&34]
        MOVCS    a3,v5
        MOV      v2,a3
        LDR      a1,[v1,#&34]
        CMP      a1,a2
        LDRCCB   a2,[a1],#1
        STRCC    a1,[v1,#&34]
        MOVCS    a2,v5
        MOV      v3,a2
        CMP      v2,#0
        BLT      |L0002c4.J14.get_dac|
        CMP      v2,#&20
        BLT      |L0002d4.J13.get_dac|
|L0002c4.J14.get_dac|
        BL       newline
        MOV      a1,#&2e8
        ADD      a1,a1,#&4c00
        BL       exit
|L0002d4.J13.get_dac|
        CMP      v2,#&10
        MOVGE    a1,v3
        ADDGE    a2,v1,v2
        STRGEB   a1,[a2,#&94]
        BGE      |L000314.J19.get_dac|
        AND      a1,v3,#&f
        ADD      a2,v1,v2
        STRB     a1,[a2,#&84]
        MOV      a3,v3,ASR #4
        AND      a3,a3,#&ff
        STRB     a3,[a2,#&94]
        CMP      a1,a3
        BLGT     newline
        MOVGT    a1,#&ef0
        ADDGT    a1,a1,#&4000
        BLGT     exit
|L000314.J19.get_dac|
        SUB      v4,v4,#2
        CMP      v4,#0
        BGT      |L000280.J4.get_dac|
        LDMDB    fp,{v1-v5,fp,sp,pc}^

get_dqt
        MOV      ip,sp
        STMDB    sp!,{v1-v5,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        BL       get_2bytes
        SUB      v2,a1,#2
        CMP      v2,#0
        LDMLEDB  fp,{v1-v5,fp,sp,pc}^
        MOV      v4,#&ff
|L000348.J4.get_dqt|
        ADD      a2,v1,#&34
        LDMIA    a2,{a1,a2}
        CMP      a1,a2
        MOVCS    a1,v4
        BCS      |L000368.J7.get_dqt|
        LDRB     a2,[a1],#1
        STR      a1,[v1,#&34]
        MOV      a1,a2
|L000368.J7.get_dqt|
        MOV      v3,a1,ASR #4
        AND      v5,a1,#&f
        CMP      v5,#4
        BLGE     newline
        MOVGE    a1,#&30c
        ADDGE    a1,a1,#&4c00
        BLGE     exit
        ADD      a1,v1,v5,LSL #2
        LDR      a4,[a1,#&54]!
        MOV      a1,#0
|L000390.J12.get_dqt|
        ADD      ip,v1,#&34
        LDMIA    ip,{a3,ip}
        CMP      a3,ip
        LDRCCB   a2,[a3],#1
        STRCC    a3,[v1,#&34]
        MOVCS    a2,v4
        MOV      a2,a2,LSL #16
        MOV      a2,a2,LSR #16
        TEQ      v3,#0
        BEQ      |L0003d8.J16.get_dqt|
        LDR      a3,[v1,#&34]
        CMP      a3,ip
        LDRCCB   ip,[a3],#1
        STRCC    a3,[v1,#&34]
        MOVCS    ip,v4
        ADD      a2,ip,a2,LSL #8
        MOV      a2,a2,LSL #16
        MOV      a2,a2,LSR #16
|L0003d8.J16.get_dqt|
        STR      a2,[a4,a1,LSL #2]
        ADD      a1,a1,#1
        CMP      a1,#&40
        BLT      |L000390.J12.get_dqt|
        MOV      a1,#0
|L0003ec.J22.get_dqt|
        ADD      a1,a1,#8
        CMP      a1,#&40
        BLT      |L0003ec.J22.get_dqt|
        SUB      v2,v2,#&41
        TEQ      v3,#0
        SUBNE    v2,v2,#&40
        CMP      v2,#0
        BGT      |L000348.J4.get_dqt|
        LDMDB    fp,{v1-v5,fp,sp,pc}^

get_dri
        MOV      ip,sp
        STMDB    sp!,{v1,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        BL       get_2bytes
        TEQ      a1,#4
        BLNE     newline
        MOVNE    a1,#&2d
        ADDNE    a1,a1,#&4f00
        BLNE     exit
        MOV      a1,v1
        BL       get_2bytes
        MOV      a1,a1,LSL #16
        MOV      a1,a1,LSR #16
        STR      a1,[v1,#&bc]!
        LDMDB    fp,{v1,fp,sp,pc}^

get_app0
        MOV      ip,sp
        STMDB    sp!,{v1,v2,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        SUB      sp,sp,#&10
        BL       get_2bytes
        SUB      v2,a1,#2
        CMP      v2,#&e
        BLT      |L000524.J25.get_app0|
        MOV      a1,#0
        MOV      a2,#&ff
|L00047c.J6.get_app0|
        LDR      a3,[v1,#&38]
        LDR      a4,[v1,#&34]
        CMP      a4,a3
        LDRCCB   a3,[a4],#1
        STRCC    a4,[v1,#&34]
        MOVCS    a3,a2
        STRB     a3,[sp,a1]
        ADD      a1,a1,#1
        CMP      a1,#&e
        BLT      |L00047c.J6.get_app0|
        SUB      v2,v2,#&e
        LDRB     a1,[sp,#0]
        TEQ      a1,#&4a
        LDREQB   a1,[sp,#1]
        TEQEQ    a1,#&46
        LDREQB   a1,[sp,#2]
        TEQEQ    a1,#&49
        LDREQB   a1,[sp,#3]
        TEQEQ    a1,#&46
        LDREQB   a1,[sp,#4]
        TEQEQ    a1,#0
        BNE      |L000524.J25.get_app0|
        LDRB     a1,[sp,#5]
        TEQ      a1,#1
        BLNE     newline
        MOVNE    a1,#&4d
        ADDNE    a1,a1,#&4f00
        BLNE     exit
        LDRB     a1,[sp,#7]
        STR      a1,[v1,#&40]
        LDRB     a1,[sp,#9]
        LDRB     a2,[sp,#8]
        ADD      a1,a1,a2,LSL #8
        STR      a1,[v1,#&44]
        LDRB     a2,[sp,#&b]
        LDRB     a1,[sp,#&a]
        ADD      a1,a2,a1,LSL #8
        STR      a1,[v1,#&48]
        LDR      a1,[v1,#&1c]
        TEQ      a1,#0
        MOVEQ    a1,#3
        STREQ    a1,[v1,#&1c]
|L000524.J25.get_app0|
        MOV      a1,v2
        SUB      v2,v2,#1
        CMP      a1,#0
        BLE      |L000558.J37.get_app0|
        LDR      a2,[v1,#&38]
|L000538.J26.get_app0|
        LDR      a1,[v1,#&34]
        CMP      a1,a2
        ADDCC    a1,a1,#1
        STRCC    a1,[v1,#&34]
        MOV      a1,v2
        SUB      v2,v2,#1
        CMP      a1,#0
        BGT      |L000538.J26.get_app0|
|L000558.J37.get_app0|
        LDMDB    fp,{v1,v2,fp,sp,pc}^

get_sof
        MOV      ip,sp
        STMDB    sp!,{v1-v3,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        BL       get_2bytes
        MOV      v3,a1
        MOV      v2,#&ff
        ADD      a2,v1,#&34
        LDMIA    a2,{a1,a2}
        CMP      a1,a2
        LDRCCB   a2,[a1],#1
        STRCC    a1,[v1,#&34]
        MOVCS    a2,v2
        STR      a2,[v1,#&3c]
        MOV      a1,v1
        BL       get_2bytes
        STR      a1,[v1,#&18]
        MOV      a1,v1
        BL       get_2bytes
        STR      a1,[v1,#&14]
        MOV      a2,a1
        ADD      a3,v1,#&34
        LDMIA    a3,{a1,a3}
        CMP      a1,a3
        MOVCS    a1,v2
        BCS      |L0005d0.J7.get_sof|
        LDRB     a3,[a1],#1
        STR      a1,[v1,#&34]
        MOV      a1,a3
|L0005d0.J7.get_sof|
        STR      a1,[v1,#&4c]
        LDR      a3,[v1,#&18]
        CMP      a3,#0
        CMPGT    a2,#0
        CMPGT    a1,#0
        BLLE     newline
        MOVLE    a1,#&82
        ADDLE    a1,a1,#&4f00
        BLLE     exit
        LDR      a1,[v1,#&3c]
        TEQ      a1,#8
        BLNE     newline
        MOVNE    a1,#&86
        ADDNE    a1,a1,#&4f00
        BLNE     exit
        LDR      a1,[v1,#&4c]
        ADD      a1,a1,a1,LSL #1
        ADD      a1,a1,#8
        TEQ      a1,v3
        BLNE     newline
        MOVNE    a1,#&92
        ADDNE    a1,a1,#&4f00
        BLNE     exit
        LDR      a1,[v1,#&4c]
        CMP      a1,#3
        BLGT     newline
        MOVGT    a1,#&96
        ADDGT    a1,a1,#&4f00
        BLGT     exit
        MOV      a1,#0
        LDR      a2,[v1,#&4c]
        CMP      a2,#0
        LDMLEDB  fp,{v1-v3,fp,sp,pc}^
        MOV      a2,#&f
|L000658.J21.get_sof|
        RSB      a4,a1,a1,LSL #3
        LDR      a3,[v1,#&50]
        ADD      a3,a3,a4,LSL #3
        STR      a1,[a3,#4]
        ADD      ip,v1,#&34
        LDMIA    ip,{a4,ip}
        CMP      a4,ip
        LDRCCB   ip,[a4],#1
        STRCC    a4,[v1,#&34]
        MOVCS    ip,v2
        STR      ip,[a3,#0]
        ADD      ip,v1,#&34
        LDMIA    ip,{a4,ip}
        CMP      a4,ip
        MOVCS    a4,v2
        BCS      |L0006a8.J27.get_sof|
        MOV      ip,a4
        LDRB     a4,[a4,#0]
        ADD      ip,ip,#1
        STR      ip,[v1,#&34]
|L0006a8.J27.get_sof|
        AND      ip,a2,a4,ASR #4
        AND      a4,a4,#&f
        STR      a4,[a3,#&c]
        STR      ip,[a3,#8]
        ADD      ip,v1,#&34
        LDMIA    ip,{a4,ip}
        CMP      a4,ip
        LDRCCB   ip,[a4],#1
        STRCC    a4,[v1,#&34]
        MOVCS    ip,v2
        ADD      a1,a1,#1
        MOV      a1,a1,LSL #16
        MOV      a1,a1,ASR #16
        STR      ip,[a3,#&10]!
        LDR      a3,[v1,#&4c]
        CMP      a1,a3
        BLT      |L000658.J21.get_sof|
        LDMDB    fp,{v1-v3,fp,sp,pc}^

get_sos
        MOV      ip,sp
        STMDB    sp!,{v1-v6,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        BL       get_2bytes
        MOV      v4,#&ff
        ADD      a3,v1,#&34
        LDMIA    a3,{a2,a3}
        CMP      a2,a3
        LDRCCB   a3,[a2],#1
        STRCC    a2,[v1,#&34]
        MOVCS    a3,v4
        MOV      v3,a3
        SUB      v2,a1,#3
        MOV      a1,#3
        STR      a3,[v1,#&c8]
        ADD      a1,a1,a3,LSL #1
        TEQ      a1,v2
        BNE      |L00074c.J8.get_sos|
        CMP      v3,#1
        BLT      |L00074c.J8.get_sos|
        CMP      v3,#4
        BLE      |L00075c.J7.get_sos|
|L00074c.J8.get_sos|
        BL       newline
        MOV      a1,#&3bc
        ADD      a1,a1,#&4c00
        BL       exit
|L00075c.J7.get_sos|
        MOV      v5,#0
        CMP      v3,#0
        BLE      |L000818.J13.get_sos|
|L000768.J12.get_sos|
        ADD      a2,v1,#&34
        LDMIA    a2,{a1,a2}
        CMP      a1,a2
        LDRCCB   a3,[a1],#1
        STRCC    a1,[v1,#&34]
        MOVCS    a3,#&ff
        LDR      a1,[v1,#&34]
        CMP      a1,a2
        LDRCCB   a2,[a1],#1
        STRCC    a1,[v1,#&34]
        MOVCS    a2,#&ff
        MOV      v6,a2
        SUB      v2,v2,#2
        MOV      v4,#0
        LDR      a1,[v1,#&4c]
        CMP      a1,#0
        BLE      |L0007d0.J22.get_sos|
        LDR      a2,[v1,#&50]
|L0007b0.J21.get_sos|
        RSB      a4,v4,v4,LSL #3
        ADD      a4,a2,a4,LSL #3
        LDR      a4,[a4,#0]
        TEQ      a4,a3
        BEQ      |L0007d0.J22.get_sos|
        ADD      v4,v4,#1
        CMP      v4,a1
        BLT      |L0007b0.J21.get_sos|
|L0007d0.J22.get_sos|
        CMP      v4,a1
        BLGE     newline
        MOVGE    a1,#&ca
        ADDGE    a1,a1,#&4f00
        BLGE     exit
        RSB      a1,v4,v4,LSL #3
        LDR      a2,[v1,#&50]
        ADD      a1,a2,a1,LSL #3
        ADD      a2,v1,v5,LSL #2
        STR      a1,[a2,#&cc]!
        MOV      a2,#&f
        AND      a2,a2,v6,ASR #4
        STR      a2,[a1,#&14]
        AND      a2,v6,#&f
        ADD      v5,v5,#1
        CMP      v5,v3
        STR      a2,[a1,#&18]!
        BLT      |L000768.J12.get_sos|
|L000818.J13.get_sos|
        CMP      v2,#0
        LDMLEDB  fp,{v1-v6,fp,sp,pc}^
        LDR      a1,[v1,#&38]
|L000824.J30.get_sos|
        LDR      a2,[v1,#&34]
        CMP      a2,a1
        ADDCC    a2,a2,#1
        STRCC    a2,[v1,#&34]
        SUB      v2,v2,#1
        CMP      v2,#0
        BGT      |L000824.J30.get_sos|
        LDMDB    fp,{v1-v6,fp,sp,pc}^

get_soi
        STMDB    sp!,{lr}
        MOV      a2,#0
        MOV      ip,#0
        MOV      a4,#1
        MOV      lr,#5
|L000858.J4.get_soi|
        ADD      a3,a1,a2
        STRB     ip,[a3,#&84]
        STRB     a4,[a3,#&94]
        STRB     lr,[a3,#&a4]
        ADD      a2,a2,#1
        CMP      a2,#&10
        BLT      |L000858.J4.get_soi|
        STR      ip,[a1,#&bc]
        STR      a4,[a1,#&44]
        STR      ip,[a1,#&40]
        STR      a4,[a1,#&48]!
        STR      ip,[a1,#&70]!
        LDMIA    sp!,{pc}^

next_marker
        MOV      a3,#&ff
        LDR      a2,[a1,#&38]
|L000894.J5.next_marker|
        LDR      ip,[a1,#&34]
        CMP      ip,a2
        LDRCCB   a4,[ip],#1
        STRCC    ip,[a1,#&34]
        MOVCS    a4,a3
        TEQ      a4,#&ff
        BNE      |L000894.J5.next_marker|
|L0008b0.J10.next_marker|
        LDR      ip,[a1,#&34]
        CMP      ip,a2
        LDRCCB   a4,[ip],#1
        STRCC    ip,[a1,#&34]
        MOVCS    a4,a3
        TEQ      a4,#&ff
        BEQ      |L0008b0.J10.next_marker|
        TEQ      a4,#0
        BEQ      |L000894.J5.next_marker|
        MOV      a1,a4
        MOVS     pc,lr

process_tables
        MOV      ip,sp
        STMDB    sp!,{v1,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
|L0008ec.J4.process_tables|
        MOV      a1,v1
        BL       next_marker
        MOV      a2,a1
        CMP      a1,#&ce
        LDMEQDB  fp,{v1,fp,sp,pc}^
        BGT      |L000984.J39.process_tables|
        CMP      a1,#&c6
        LDMEQDB  fp,{v1,fp,sp,pc}^
        BGT      |L000958.J42.process_tables|
        CMP      a1,#&c2
        LDMEQDB  fp,{v1,fp,sp,pc}^
        BGT      |L000934.J45.process_tables|
        TEQ      a1,#1
        BEQ      |L0008ec.J4.process_tables|
        TEQ      a1,#&c0
        TEQNE    a1,#&c1
        LDMEQDB  fp,{v1,fp,sp,pc}^
        B        |L000a08.J7.process_tables|
|L000934.J45.process_tables|
        TEQ      a1,#&c3
        LDMEQDB  fp,{v1,fp,sp,pc}^
        TEQ      a1,#&c4
        MOVEQ    a1,v1
        BLEQ     get_dht
        BEQ      |L0008ec.J4.process_tables|
        TEQ      a1,#&c5
        LDMEQDB  fp,{v1,fp,sp,pc}^
        B        |L000a08.J7.process_tables|
|L000958.J42.process_tables|
        SUB      a3,a1,#&c7
        CMP      a3,#6
        ADDLS    pc,pc,a3,LSL #2
        B        |L000a08.J7.process_tables|
        LDMDB    fp,{v1,fp,sp,pc}^
        LDMDB    fp,{v1,fp,sp,pc}^
        LDMDB    fp,{v1,fp,sp,pc}^
        LDMDB    fp,{v1,fp,sp,pc}^
        LDMDB    fp,{v1,fp,sp,pc}^
        B        |L0009e4.J25.process_tables|
        LDMDB    fp,{v1,fp,sp,pc}^
|L000984.J39.process_tables|
        SUB      a3,a1,#&cf
        CMP      a3,#&11
        ADDLS    pc,pc,a3,LSL #2
        B        |L000a08.J7.process_tables|
        LDMDB    fp,{v1,fp,sp,pc}^
        B        |L0008ec.J4.process_tables|
        B        |L0008ec.J4.process_tables|
        B        |L0008ec.J4.process_tables|
        B        |L0008ec.J4.process_tables|
        B        |L0008ec.J4.process_tables|
        B        |L0008ec.J4.process_tables|
        B        |L0008ec.J4.process_tables|
        B        |L0008ec.J4.process_tables|
        LDMDB    fp,{v1,fp,sp,pc}^
        LDMDB    fp,{v1,fp,sp,pc}^
        LDMDB    fp,{v1,fp,sp,pc}^
        B        |L0009f0.J10.process_tables|
        B        |L000a08.J7.process_tables|
        B        |L0009fc.J9.process_tables|
        B        |L000a08.J7.process_tables|
        B        |L000a08.J7.process_tables|
        MOV      a1,v1
        BL       get_app0
        B        |L0008ec.J4.process_tables|
|L0009e4.J25.process_tables|
        MOV      a1,v1
        BL       get_dac
        B        |L0008ec.J4.process_tables|
|L0009f0.J10.process_tables|
        MOV      a1,v1
        BL       get_dqt
        B        |L0008ec.J4.process_tables|
|L0009fc.J9.process_tables|
        MOV      a1,v1
        BL       get_dri
        B        |L0008ec.J4.process_tables|
|L000a08.J7.process_tables|
        MOV      a1,v1
        BL       skip_variable
        B        |L0008ec.J4.process_tables|

read_file_header
        MOV      ip,sp
        STMDB    sp!,{v1-v3,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        LDR      a3,[a1,#&34]
        LDR      a1,[a1,#&38]
        MOV      a2,#&ff
        CMP      a3,a1
        LDRCCB   a1,[a3],#1
        STRCC    a3,[v1,#&34]
        MOVCS    a1,a2
        TEQ      a1,#&ff
        BNE      |L000a64.J5.read_file_header|
        ADD      a3,v1,#&34
        LDMIA    a3,{a1,a3}
        CMP      a1,a3
        LDRCCB   a2,[a1],#1
        STRCC    a1,[v1,#&34]
        TEQ      a2,#&d8
        BEQ      |L000a74.J4.read_file_header|
|L000a64.J5.read_file_header|
        BL       newline
        MOV      a1,#&67
        ADD      a1,a1,#&5000
        BL       exit
|L000a74.J4.read_file_header|
        MOV      a1,v1
        BL       get_soi
        MOV      a1,v1
        BL       process_tables
        MOV      v3,#0
        MOV      v2,#1
        TEQ      a1,#&c0
        TEQNE    a1,#&c1
        BEQ      |L000ab4.J17.read_file_header|
        TEQ      a1,#&c9
        BNE      |L000ac8.J15.read_file_header|
        MOV      a2,a1
        MOV      a1,v1
        BL       get_sof
        STR      v2,[v1,#&b4]
        B        |L000ad8.J14.read_file_header|
|L000ab4.J17.read_file_header|
        MOV      a2,a1
        MOV      a1,v1
        BL       get_sof
        STR      v3,[v1,#&b4]
        B        |L000ad8.J14.read_file_header|
|L000ac8.J15.read_file_header|
        BL       newline
        MOV      a1,#&7b
        ADD      a1,a1,#&5000
        BL       exit
|L000ad8.J14.read_file_header|
        LDR      a1,[v1,#&4c]
        TEQ      a1,#1
        STREQ    v2,[v1,#&1c]!
        LDMEQDB  fp,{v1-v3,fp,sp,pc}^
        TEQ      a1,#3
        BEQ      |L000b04.J25.read_file_header|
        TEQ      a1,#4
        STRNE    v3,[v1,#&1c]!
        LDMNEDB  fp,{v1-v3,fp,sp,pc}^
        MOV      a1,#5
        B        |L000b64.J44.read_file_header|
|L000b04.J25.read_file_header|
        LDR      a1,[v1,#&1c]
        TEQ      a1,#0
        LDMNEDB  fp,{v1-v3,fp,sp,pc}^
        LDR      a2,[v1,#&50]
        LDR      a1,[a2,#0]
        MOV      a4,a1,LSL #16
        MOV      a4,a4,ASR #16
        LDR      a1,[a2,#&38]
        MOV      a1,a1,LSL #16
        MOV      a1,a1,ASR #16
        LDR      a2,[a2,#&70]
        MOV      a2,a2,LSL #16
        MOV      a2,a2,ASR #16
        MOV      a3,#3
        CMP      a4,#1
        BNE      |L000b50.J32.read_file_header|
        TEQ      a1,#2
        BEQ      |L000b6c.J37.read_file_header|
        B        |L000b54.J38.read_file_header|
|L000b50.J32.read_file_header|
        BNE      |L000b6c.J37.read_file_header|
|L000b54.J38.read_file_header|
        TEQ      a1,#4
        TEQEQ    a2,#5
        BNE      |L000b6c.J37.read_file_header|
        MOV      a1,#4
|L000b64.J44.read_file_header|
        STR      a1,[v1,#&1c]!
        LDMDB    fp,{v1-v3,fp,sp,pc}^
|L000b6c.J37.read_file_header|
        STR      a3,[v1,#&1c]!
        LDMDB    fp,{v1-v3,fp,sp,pc}^

read_scan_header
        MOV      ip,sp
        STMDB    sp!,{v1,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        BL       process_tables
        TEQ      a1,#&d9
        BEQ      |L000bb4.J4.read_scan_header|
        TEQ      a1,#&da
        MOVEQ    a1,v1
        BLEQ     get_sos
        MOVEQ    a1,#1
        LDMEQDB  fp,{v1,fp,sp,pc}^
        BL       newline
        MOV      a1,#&be
        ADD      a1,a1,#&5000
        BL       exit
|L000bb4.J4.read_scan_header|
        MOV      a1,#0
        LDMDB    fp,{v1,fp,sp,pc}^

        ;MPORT  huff_DECODE_buildshortcut
        IMPORT  assert
fix_huff_tbl
        MOV      ip,sp
        STMDB    sp!,{v1-v6,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v2,a1
        MOV      v1,a2
        SUB      sp,sp,#&308
        MOV      a2,#0
        MOV      a3,#1
|L000bdc.J4.fix_huff_tbl|
        MOV      a1,#1
        ADD      lr,v1,a3
        LDRB     a4,[lr,#0]
        CMP      a4,#1
        BLT      |L000c14.J6.fix_huff_tbl|
        AND      a4,a3,#&ff
|L000bf4.J5.fix_huff_tbl|
        MOV      v3,a2
        ADD      a2,a2,#1
        ADD      ip,sp,#&204
        STRB     a4,[ip,v3]
        ADD      a1,a1,#1
        LDRB     v3,[lr,#0]
        CMP      v3,a1
        BGE      |L000bf4.J5.fix_huff_tbl|
|L000c14.J6.fix_huff_tbl|
        ADD      a3,a3,#1
        CMP      a3,#&10
        BLE      |L000bdc.J4.fix_huff_tbl|
        MOV      a1,#0
        ADD      a3,sp,#&204
        STRB     a1,[a3,a2]
        MOV      a3,#0
        LDRB     a4,[sp,#&204]
        MOV      a2,#0
        LDRB     ip,[sp,#&204]
        TEQ      ip,#0
        BEQ      |L000ca8.J11.fix_huff_tbl|
|L000c44.J10.fix_huff_tbl|
        ADD      lr,sp,#&204
        LDRB     lr,[lr,a2]
        TEQ      lr,a4
        BNE      |L000c88.J14.fix_huff_tbl|
|L000c54.J13.fix_huff_tbl|
        MOV      lr,a2
        ADD      a2,a2,#1
        ADD      ip,sp,lr,LSL #1
        STRB     a3,[ip,#0]
        MOV      lr,a3,ASR #8
        STRB     lr,[ip,#1]
        ADD      a3,a3,#1
        MOV      a3,a3,LSL #16
        MOV      a3,a3,LSR #16
        ADD      lr,sp,#&204
        LDRB     lr,[lr,a2]
        TEQ      lr,a4
        BEQ      |L000c54.J13.fix_huff_tbl|
|L000c88.J14.fix_huff_tbl|
        MOV      a3,a3,LSL #1
        MOV      a3,a3,LSL #16
        MOV      a3,a3,LSR #16
        ADD      a4,a4,#1
        ADD      lr,sp,#&204
        LDRB     ip,[lr,a2]
        TEQ      ip,#0
        BNE      |L000c44.J10.fix_huff_tbl|
|L000ca8.J11.fix_huff_tbl|
        MOV      a2,#0
        MOV      a3,#1
        MVN      v6,#0
|L000cb4.J18.fix_huff_tbl|
        ADD      v3,v1,a3
        LDRB     a4,[v3,#0]
        TEQ      a4,#0
        BEQ      |L000d08.J19.fix_huff_tbl|
        ADD      lr,v1,a3,LSL #2
        STR      a2,[lr,#&15c]
        ADD      a4,lr,#&15c
        LDR      v4,[sp,a2,LSL #1]
        MOV      v4,v4,LSL #16
        MOV      v4,v4,LSR #16
        LDR      ip,[a4,#0]
        SUB      v4,ip,v4
        STR      v4,[a4,#0]
        LDRB     a4,[v3,#0]
        ADD      a2,a4,a2
        ADD      a4,sp,a2,LSL #1
        LDR      a4,[a4,#-2]
        MOV      a4,a4,LSL #16
        MOV      a4,a4,LSR #16
        STR      a4,[lr,#&114]!
        B        |L000d10.J21.fix_huff_tbl|
|L000d08.J19.fix_huff_tbl|
        ADD      a4,v1,a3,LSL #2
        STR      v6,[a4,#&114]!
|L000d10.J21.fix_huff_tbl|
        ADD      a3,a3,#1
        CMP      a3,#&10
        BLE      |L000cb4.J18.fix_huff_tbl|
        MVN      a2,#&ff00000
        ADD      a2,a2,#&10000000
        MOV      v3,#0
        MOV      v5,#&20
        STR      a2,[v1,#&158]
|L000d30.J23.fix_huff_tbl|
        MOV      a1,v3,LSL #24
        MOV      a2,v1
        ADD      v2,v2,#&104
        STMIA    v2,{a1,v5}
        SUB      v2,v2,#&104
        MOV      a1,v2
        BL       huff_DECODE_buildshortcut
        MOV      v4,a1
        LDR      a1,[v2,#&108]
        CMP      a1,#&18
        ADDLT    a1,v1,v3,LSL #2
        STRLT    v6,[a1,#&1a0]!
        BLT      |L000d8c.J26.fix_huff_tbl|
        CMP      v4,#0
        MOVLT    a1,#0
        MOVGE    a1,#1
        MOV      a2,#4
        BL       assert
        LDR      a1,[v2,#&108]
        SUB      a1,v5,a1
        ORR      a1,v4,a1,LSL #24
        ADD      a2,v1,v3,LSL #2
        STR      a1,[a2,#&1a0]!
|L000d8c.J26.fix_huff_tbl|
        ADD      v3,v3,#1
        CMP      v3,#&100
        BLT      |L000d30.J23.fix_huff_tbl|
        MOV      a1,#0
        STR      a1,[v2,#&108]
        STR      a1,[v2,#&104]!
        LDMDB    fp,{v1-v6,fp,sp,pc}^

get_bits
        MOV      ip,sp
        STMDB    sp!,{v1-v3,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        MOV      v2,a2
        LDR      a1,[a1,#&108]
        CMP      a2,a1
        BLE      |L000e40.J5.get_bits|
        MOV      v3,#&ff
|L000dcc.J4.get_bits|
        ADD      a2,v1,#&34
        LDMIA    a2,{a1,a2}
        CMP      a1,a2
        MOVCS    a1,v3
        BCS      |L000dec.J7.get_bits|
        LDRB     a3,[a1],#1
        STR      a1,[v1,#&34]
        MOV      a1,a3
|L000dec.J7.get_bits|
        LDR      a3,[v1,#&104]
        ORR      a3,a1,a3,LSL #8
        STR      a3,[v1,#&104]
        LDR      a3,[v1,#&108]
        ADD      a3,a3,#8
        TEQ      a1,#&ff
        STR      a3,[v1,#&108]
        BNE      |L000e34.J10.get_bits|
        LDR      a1,[v1,#&34]
        CMP      a1,a2
        LDRCCB   a2,[a1],#1
        STRCC    a1,[v1,#&34]
        MOVCS    a2,v3
        TEQ      a2,#0
        BLNE     newline
        MOVNE    a1,#&394
        ADDNE    a1,a1,#&2400
        BLNE     exit
|L000e34.J10.get_bits|
        LDR      a1,[v1,#&108]
        CMP      v2,a1
        BGT      |L000dcc.J4.get_bits|
|L000e40.J5.get_bits|
        LDR      a1,[v1,#&108]
        SUB      a1,a1,v2
        STR      a1,[v1,#&108]
        LDR      a2,[v1,#&104]!
        MOV      a1,a2,ASR a1
        MOV      a2,#1
        MOV      a2,a2,LSL v2
        SUB      a2,a2,#1
        AND      a1,a1,a2
        LDMDB    fp,{v1-v3,fp,sp,pc}^

huff_DECODE_buildshortcut
        MOV      ip,sp
        STMDB    sp!,{v1-v4,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        MOV      v2,a2
        LDR      a2,[a1,#&108]
        TEQ      a2,#0
        BEQ      |L000ea0.J5.huff_DECODE_buildshortcut|
        SUB      a2,a2,#1
        STR      a2,[v1,#&108]
        LDR      a1,[v1,#&104]
        MOV      a1,a1,ASR a2
        AND      a1,a1,#1
        B        |L000ea8.J4.huff_DECODE_buildshortcut|
|L000ea0.J5.huff_DECODE_buildshortcut|
        MOV      a2,#1
        BL       get_bits
|L000ea8.J4.huff_DECODE_buildshortcut|
        MOV      v4,a1
        MOV      v3,#1
        B        |L000eec.J8.huff_DECODE_buildshortcut|
|L000eb4.J7.huff_DECODE_buildshortcut|
        LDR      a1,[v1,#&108]
        TEQ      a1,#0
        BEQ      |L000ed8.J10.huff_DECODE_buildshortcut|
        SUB      a1,a1,#1
        STR      a1,[v1,#&108]
        LDR      a2,[v1,#&104]
        MOV      a1,a2,ASR a1
        AND      a1,a1,#1
        B        |L000ee4.J9.huff_DECODE_buildshortcut|
|L000ed8.J10.huff_DECODE_buildshortcut|
        MOV      a1,v1
        MOV      a2,#1
        BL       get_bits
|L000ee4.J9.huff_DECODE_buildshortcut|
        ADD      v4,a1,v4,LSL #1
        ADD      v3,v3,#1
|L000eec.J8.huff_DECODE_buildshortcut|
        ADD      a1,v2,v3,LSL #2
        LDR      a1,[a1,#&114]
        CMP      a1,v4
        BGE      |L000f04.J12.huff_DECODE_buildshortcut|
        CMP      v3,#8
        BLE      |L000eb4.J7.huff_DECODE_buildshortcut|
|L000f04.J12.huff_DECODE_buildshortcut|
        CMP      v3,#8
        MVNGT    a1,#0
        LDMGTDB  fp,{v1-v4,fp,sp,pc}^
        ADD      a1,v2,v3,LSL #2
        LDR      a1,[a1,#&15c]
        ADD      a1,a1,v4
        ADD      a1,v2,a1
        LDRB     a1,[a1,#&11]
        LDMDB    fp,{v1-v4,fp,sp,pc}^

huff_decoder_init
        MOV      a2,#0
        STR      a2,[a1,#&108]!
        MOVS     pc,lr

mono_convert_block
        STMDB    sp!,{v1,lr}
        MOV      ip,#0
|L000f3c.J4.mono_convert_block|
        MOV      a4,#0
|L000f40.J5.mono_convert_block|
        ADD      lr,ip,a4,LSL #3
        LDR      lr,[a1,lr,LSL #2]
        ADD      lr,lr,#&40000
        MOV      lr,lr,ASR #19
        ADDS     lr,lr,#&80
        MOVMI    lr,#0
        BMI      |L000f64.J8.mono_convert_block|
        CMP      lr,#&ff
        MOVGT    lr,#&ff
|L000f64.J8.mono_convert_block|
        ORR      v1,lr,lr,LSL #8
        ORR      lr,v1,lr,LSL #16
        STR      lr,[a2,a4,LSL #2]
        ADD      a4,a4,#1
        CMP      a4,#8
        BLT      |L000f40.J5.mono_convert_block|
        ADD      a2,a2,a3,LSL #2
        ADD      ip,ip,#1
        CMP      ip,#8
        BLT      |L000f3c.J4.mono_convert_block|
        LDMIA    sp!,{v1,pc}^

mono_convert_pixel
        ADDS     a1,a2,#&80
        MOVMI    a1,#0
        BMI      |L000fa4.J6.mono_convert_pixel|
        CMP      a1,#&ff
        MOVGT    a1,#&ff
|L000fa4.J6.mono_convert_pixel|
        ORR      a2,a1,a1,LSL #8
        ORR      a1,a2,a1,LSL #16
        MOVS     pc,lr

colour_convert_block
        MOV      ip,sp
        STMDB    sp!,{a1-a3,v1-v6,fp,ip,lr,pc}
        SUB      fp,ip,#4
        SUB      sp,sp,#&14
        MOV      v5,a1
        ADD      a1,a1,#&100
        STR      a1,[sp,#&10]
        ADD      a1,a1,#&100
        STR      a1,[sp,#&c]
        ADD      a1,a1,#&100
        STR      a1,[sp,#8]
        ADD      a1,a1,#&100
        STR      a1,[sp,#4]
        ADD      a1,a1,#&100
        MOV      a3,#0
        STR      a1,[sp,#0]
|L000ff0.J4.colour_convert_block|
        MOV      a1,#0
        AND      v3,a3,#7
        MOV      v2,a3,ASR #1
|L000ffc.J5.colour_convert_block|
        AND      a4,a1,#7
        ADD      ip,v3,a4,LSL #3
        CMP      a3,#8
        BGE      |L00101c.J7.colour_convert_block|
        CMP      a1,#8
        LDRGE    a4,[sp,#&10]
        MOVLT    a4,v5
        B        |L001028.J6.colour_convert_block|
|L00101c.J7.colour_convert_block|
        CMP      a1,#8
        LDRGE    a4,[sp,#8]
        LDRLT    a4,[sp,#&c]
|L001028.J6.colour_convert_block|
        LDR      a4,[a4,ip,LSL #2]
        MOV      ip,a1,ASR #1
        ADD      ip,v2,ip,LSL #3
        LDR      lr,[sp,#4]
        LDR      lr,[lr,ip,LSL #2]
        LDR      v1,[sp,#0]
        LDR      ip,[v1,ip,LSL #2]
        ADD      a4,a4,#&40000
        MOV      a4,a4,ASR #19
        ADD      a4,a4,#&80
        ADD      lr,lr,#&40000
        MOV      lr,lr,ASR #19
        ADD      ip,ip,#&40000
        MOV      v1,ip,ASR #19
        ADD      v4,v1,v1,LSL #5
        RSB      v4,v4,v4,LSL #3
        ADD      v4,v4,v1,LSL #7
        ADD      ip,lr,lr,LSL #1
        ADD      ip,ip,lr,LSL #3
        MOV      ip,ip,LSL #3
        RSB      v6,ip,#0
        ADD      ip,v1,v1,LSL #1
        RSB      ip,ip,v1,LSL #6
        ADD      ip,ip,ip,LSL #1
        SUB      v1,v6,ip
        ADD      ip,lr,lr,LSL #5
        RSB      ip,ip,lr,LSL #8
        ADD      ip,ip,lr,LSL #2
        MOV      ip,ip,LSL #1
        ADD      lr,v4,#&80
        ADDS     lr,a4,lr,ASR #8
        MOVMI    lr,#0
        BMI      |L0010b4.J15.colour_convert_block|
        CMP      lr,#&ff
        MOVGT    lr,#&ff
|L0010b4.J15.colour_convert_block|
        ADD      v1,v1,#&80
        ADDS     v1,a4,v1,ASR #8
        MOVMI    v1,#0
        BMI      |L0010cc.J19.colour_convert_block|
        CMP      v1,#&ff
        MOVGT    v1,#&ff
|L0010cc.J19.colour_convert_block|
        ADD      ip,ip,#&80
        ADDS     a4,a4,ip,ASR #8
        MOVMI    a4,#0
        BMI      |L0010e4.J23.colour_convert_block|
        CMP      a4,#&ff
        MOVGT    a4,#&ff
|L0010e4.J23.colour_convert_block|
        ORR      ip,lr,v1,LSL #8
        ORR      a4,ip,a4,LSL #16
        STR      a4,[a2,a1,LSL #2]
        ADD      a1,a1,#1
        CMP      a1,#&10
        BLT      |L000ffc.J5.colour_convert_block|
        LDR      a1,[fp,#-&28]
        ADD      a2,a2,a1,LSL #2
        ADD      a3,a3,#1
        CMP      a3,#&10
        BLT      |L000ff0.J4.colour_convert_block|
        LDMDB    fp,{v1-v6,fp,sp,pc}^

colour_convert_unusual_block
        MOV      ip,sp
        STMDB    sp!,{a1-a4}
        STMDB    sp!,{v1-v6,fp,ip,lr,pc}
        SUB      fp,ip,#&14
        SUB      sp,sp,#&20
        LDR      v3,[fp,#&14]
        STR      a1,[sp,#&14]
        ADD      a1,a1,#&100
        STR      a1,[sp,#&10]
        ADD      a1,a1,#&100
        STR      a1,[sp,#&c]
        ADD      a1,a1,#&100
        STR      a1,[sp,#8]
        ADD      a1,a1,#&100
        STR      a1,[sp,#4]
        ADD      a1,a1,#&100
        MOV      a3,#0
        CMP      a3,v3,LSL #3
        STR      a1,[sp,#0]
        BGE      |L0012a4.J35.colour_convert_unusual_block|
        SUB      a1,a4,#1
        STR      a1,[sp,#&1c]
|L00116c.J4.colour_convert_unusual_block|
        MOV      a1,#0
        CMP      a1,a4,LSL #3
        BGE      |L001290.J8.colour_convert_unusual_block|
        AND      v4,a3,#7
        SUB      lr,v3,#1
        MOV      ip,a3,ASR lr
        STR      ip,[sp,#&18]
|L001188.J7.colour_convert_unusual_block|
        AND      ip,a1,#7
        ADD      lr,v4,ip,LSL #3
        CMP      a3,#8
        BGE      |L0011a8.J11.colour_convert_unusual_block|
        CMP      a1,#8
        LDRGE    ip,[sp,#&10]
        LDRLT    ip,[sp,#&14]
        B        |L0011b4.J10.colour_convert_unusual_block|
|L0011a8.J11.colour_convert_unusual_block|
        CMP      a1,#8
        LDRGE    ip,[sp,#8]
        LDRLT    ip,[sp,#&c]
|L0011b4.J10.colour_convert_unusual_block|
        LDR      lr,[ip,lr,LSL #2]
        LDR      v1,[sp,#&1c]
        MOV      v1,a1,ASR v1
        LDR      ip,[sp,#&18]
        ADD      ip,ip,v1,LSL #3
        LDR      v1,[sp,#4]
        LDR      v1,[v1,ip,LSL #2]
        LDR      v2,[sp,#0]
        LDR      ip,[v2,ip,LSL #2]
        ADD      lr,lr,#&40000
        MOV      lr,lr,ASR #19
        ADD      lr,lr,#&80
        ADD      v1,v1,#&40000
        MOV      v1,v1,ASR #19
        ADD      ip,ip,#&40000
        MOV      v2,ip,ASR #19
        ADD      v5,v2,v2,LSL #5
        RSB      v5,v5,v5,LSL #3
        ADD      v5,v5,v2,LSL #7
        ADD      ip,v1,v1,LSL #1
        ADD      ip,ip,v1,LSL #3
        MOV      ip,ip,LSL #3
        RSB      v6,ip,#0
        ADD      ip,v2,v2,LSL #1
        RSB      ip,ip,v2,LSL #6
        ADD      ip,ip,ip,LSL #1
        SUB      v2,v6,ip
        ADD      ip,v1,v1,LSL #5
        RSB      ip,ip,v1,LSL #8
        ADD      ip,ip,v1,LSL #2
        MOV      ip,ip,LSL #1
        ADD      v1,v5,#&80
        ADDS     v1,lr,v1,ASR #8
        MOVMI    v1,#0
        BMI      |L001248.J19.colour_convert_unusual_block|
        CMP      v1,#&ff
        MOVGT    v1,#&ff
|L001248.J19.colour_convert_unusual_block|
        ADD      v2,v2,#&80
        ADDS     v2,lr,v2,ASR #8
        MOVMI    v2,#0
        BMI      |L001260.J23.colour_convert_unusual_block|
        CMP      v2,#&ff
        MOVGT    v2,#&ff
|L001260.J23.colour_convert_unusual_block|
        ADD      ip,ip,#&80
        ADDS     ip,lr,ip,ASR #8
        MOVMI    ip,#0
        BMI      |L001278.J27.colour_convert_unusual_block|
        CMP      ip,#&ff
        MOVGT    ip,#&ff
|L001278.J27.colour_convert_unusual_block|
        ORR      lr,v1,v2,LSL #8
        ORR      ip,lr,ip,LSL #16
        STR      ip,[a2,a1,LSL #2]
        ADD      a1,a1,#1
        CMP      a1,a4,LSL #3
        BLT      |L001188.J7.colour_convert_unusual_block|
|L001290.J8.colour_convert_unusual_block|
        LDR      a1,[fp,#&c]
        ADD      a2,a2,a1,LSL #2
        ADD      a3,a3,#1
        CMP      a3,v3,LSL #3
        BLT      |L00116c.J4.colour_convert_unusual_block|
|L0012a4.J35.colour_convert_unusual_block|
        LDMDB    fp,{v1-v6,fp,sp,pc}^

colour_convert_pixels
        STMDB    sp!,{v1-v3,lr}
        ADD      a2,a2,#4
        MOV      a2,a2,ASR #3
        ADD      a3,a3,#4
        MOV      a3,a3,ASR #3
        ADD      a4,a3,a3,LSL #5
        RSB      a4,a4,a4,LSL #3
        ADD      a4,a4,a3,LSL #7
        ADD      ip,a2,a2,LSL #1
        ADD      ip,ip,a2,LSL #3
        MOV      ip,ip,LSL #3
        RSB      lr,ip,#0
        ADD      ip,a3,a3,LSL #1
        RSB      a3,ip,a3,LSL #6
        ADD      a3,a3,a3,LSL #1
        SUB      a3,lr,a3
        ADD      ip,a2,a2,LSL #5
        RSB      ip,ip,a2,LSL #8
        ADD      a2,ip,a2,LSL #2
        MOV      a2,a2,LSL #1
        ADD      a4,a4,#&80
        MOV      v2,a4,ASR #8
        ADD      a3,a3,#&80
        MOV      v1,a3,ASR #8
        ADD      a2,a2,#&80
        MOV      lr,a2,ASR #8
        MOV      a4,#0
        MOV      v3,#&80
|L001318.J4.colour_convert_pixels|
        LDR      a2,[a1,a4,LSL #2]
        ADD      a2,a2,#4
        ADD      ip,v3,a2,ASR #3
        ADDS     a3,v2,ip
        MOVMI    a3,#0
        BMI      |L001338.J7.colour_convert_pixels|
        CMP      a3,#&ff
        MOVGT    a3,#&ff
|L001338.J7.colour_convert_pixels|
        ADDS     a2,v1,ip
        MOVMI    a2,#0
        BMI      |L00134c.J11.colour_convert_pixels|
        CMP      a2,#&ff
        MOVGT    a2,#&ff
|L00134c.J11.colour_convert_pixels|
        ADDS     ip,lr,ip
        MOVMI    ip,#0
        BMI      |L001360.J15.colour_convert_pixels|
        CMP      ip,#&ff
        MOVGT    ip,#&ff
|L001360.J15.colour_convert_pixels|
        ORR      a2,a3,a2,LSL #8
        ORR      a2,a2,ip,LSL #16
        STR      a2,[a1,a4,LSL #2]
        ADD      a4,a4,#1
        CMP      a4,#4
        BLT      |L001318.J4.colour_convert_pixels|
        LDMIA    sp!,{v1-v3,pc}^

        EXPORT  assembler_panic
assembler_panic
        MOVS     pc,lr

init_workspace
        MOV      ip,sp
        STMDB    sp!,{v1-v3,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        MOV      a3,a2
        MOV      a2,#0
        LDR      v2,[a1,#&20]
        LDR      v3,[a1,#&10]
        BL       memset
        STR      v2,[v1,#&20]
        STR      v3,[v1,#&10]
        ADD      a1,v1,#&1c
        ADD      a1,a1,#&800
        STR      a1,[v1,#&50]
        MOV      a1,#0
|L0013bc.J4.init_workspace|
        ADD      a2,v1,a1,LSL #8
        ADD      a2,a2,#&fc
        ADD      a2,a2,#&800
        ADD      a3,v1,a1,LSL #2
        ADD      a1,a1,#1
        CMP      a1,#4
        STR      a2,[a3,#&54]!
        BLT      |L0013bc.J4.init_workspace|
        MOV      a1,#0
|L0013e0.J6.init_workspace|
        RSB      a2,a1,a1,LSL #4
        ADD      a2,a2,a2,LSL #1
        ADD      a3,v1,a2,LSL #5
        SUB      a4,a3,#&304
        ADD      a4,a4,#&1000
        ADD      a2,v1,a1,LSL #2
        ADD      a3,a3,#&37c
        ADD      a3,a3,#&2000
        ADD      a1,a1,#1
        CMP      a1,#4
        STR      a4,[a2,#&64]!
        STR      a3,[a2,#&10]
        BLT      |L0013e0.J6.init_workspace|
        LDMDB    fp,{v1-v3,fp,sp,pc}^

save_huff_stream
        MOV      ip,sp
        STMDB    sp!,{v1-v4,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        MOV      v2,a2
        LDR      a1,[a1,#&108]
        MOV      v4,#1
        MOV      v3,#0
        CMP      a1,#&20
        MOVGE    a1,v3
        MOVLT    a1,v4
        MOV      a2,#2
        BL       assert
        LDR      a1,[v1,#&108]
        CMP      a1,#0
        MOVLT    a1,v3
        MOVGE    a1,v4
        MOV      a2,#2
        BL       assert
        ADD      a2,v1,#&30
        LDMIA    a2,{a1,a2}
        CMP      a1,a2
        MOVCS    a1,v3
        MOVCC    a1,v4
        MOV      a2,#2
        BL       assert
        LDR      a1,[v1,#&38]
        LDR      a2,[v1,#&34]
        CMP      a2,a1
        MOVCS    a1,v3
        MOVCC    a1,v4
        MOV      a2,#2
        BL       assert
        ADD      a2,v1,#&30
        LDMIA    a2,{a1,a2}
        SUB      a2,a2,a1
        LDR      a1,[v1,#&108]
        ADD      a1,a1,a2,LSL #5
        STR      a1,[v2,#0]
        LDR      a1,[v1,#&104]
        STR      a1,[v2,#4]
        LDR      a1,[v1,#&e4]
        STRB     a1,[v2,#8]
        MOV      a1,a1,ASR #8
        STRB     a1,[v2,#9]
        LDR      a1,[v1,#&e8]
        STRB     a1,[v2,#&a]
        MOV      a1,a1,ASR #8
        STRB     a1,[v2,#&b]
        LDR      a1,[v1,#&ec]
        STRB     a1,[v2,#&c]
        MOV      a1,a1,ASR #8
        STRB     a1,[v2,#&d]
        LDR      a1,[v1,#&c0]
        STRB     a1,[v2,#&10]
        MOV      a1,a1,ASR #8
        STRB     a1,[v2,#&11]
        LDR      a1,[v1,#&c4]!
        STRB     a1,[v2,#&12]
        MOV      a1,a1,ASR #8
        STRB     a1,[v2,#&13]
        LDMDB    fp,{v1-v4,fp,sp,pc}^

restore_huff_stream
        MOV      ip,sp
        STMDB    sp!,{v1-v3,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        LDR      a1,[a2,#4]
        STR      a1,[v1,#&104]
        LDR      a1,[a2,#0]
        CMP      a1,#0
        ADDLT    a1,a1,#&1f
        LDR      a3,[v1,#&30]
        ADD      a1,a3,a1,ASR #5
        STR      a1,[v1,#&34]
        LDR      a1,[a2,#0]
        AND      a1,a1,#&1f
        STR      a1,[v1,#&108]
        LDR      a1,[a2,#8]
        MOV      a1,a1,LSL #16
        MOV      a1,a1,ASR #16
        STR      a1,[v1,#&e4]
        LDR      a1,[a2,#&a]
        MOV      a1,a1,LSL #16
        MOV      a1,a1,ASR #16
        STR      a1,[v1,#&e8]
        LDR      a1,[a2,#&c]
        MOV      a1,a1,LSL #16
        MOV      a1,a1,ASR #16
        STR      a1,[v1,#&ec]
        LDR      a1,[a2,#&10]
        MOV      a1,a1,LSL #16
        MOV      a1,a1,ASR #16
        STR      a1,[v1,#&c0]
        LDR      a1,[a2,#&12]
        MOV      a1,a1,LSL #16
        MOV      a1,a1,ASR #16
        STR      a1,[v1,#&c4]
        MOV      v3,#1
        MOV      v2,#0
        ADD      a2,v1,#&30
        LDMIA    a2,{a1,a2}
        CMP      a1,a2
        MOVCS    a1,v2
        MOVCC    a1,v3
        MOV      a2,#4
        BL       assert
        ADD      v1,v1,#&30
        LDMIB    v1!,{a1,a2}
        CMP      a1,a2
        MOVCS    a1,v2
        MOVCC    a1,v3
        MOV      a2,#4
        LDMDB    fp,{v1-v3,fp,sp,lr}
        B        assert

process_restart
        MOV      ip,sp
        STMDB    sp!,{v1-v4,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        LDR      a1,[a1,#&34]
        LDRB     v4,[a1],#1
        STR      a1,[v1,#&34]
        MOV      v3,#1
        MOV      v2,#0
        LDR      a1,[v1,#&108]
        CMP      a1,#7
        MOVGT    a1,v2
        MOVLE    a1,v3
        MOV      a2,#2
        BL       assert
        TEQ      v4,#&ff
        MOVNE    a1,v2
        MOVEQ    a1,v3
        MOV      a2,#2
        BL       assert
        LDR      a1,[v1,#&34]
        LDRB     a1,[a1,#0]
        TEQ      a1,#&ff
        BNE      |L001658.J11.process_restart|
|L001640.J10.process_restart|
        LDR      a1,[v1,#&34]
        ADD      a1,a1,#1
        STR      a1,[v1,#&34]
        LDRB     a1,[a1,#0]
        TEQ      a1,#&ff
        BEQ      |L001640.J10.process_restart|
|L001658.J11.process_restart|
        LDR      a1,[v1,#&34]
        LDRB     v4,[a1],#1
        STR      a1,[v1,#&34]
        AND      a1,v4,#&f8
        TEQ      a1,#&d0
        MOVNE    a1,v2
        MOVEQ    a1,v3
        MOV      a2,#2
        BL       assert
        AND      a1,v4,#7
        LDR      a2,[v1,#&c4]
        TEQ      a1,a2
        MOVNE    a1,v2
        MOVEQ    a1,v3
        MOV      a2,#2
        BL       assert
        MOV      a2,v2
        STR      a2,[v1,#&108]
        STR      a2,[v1,#&104]
        LDR      a1,[v1,#&bc]
        STR      a1,[v1,#&c0]
        LDR      a1,[v1,#&c4]
        ADD      a1,a1,#1
        AND      a1,a1,#7
        STR      a1,[v1,#&c4]
        MOV      a1,#0
        LDR      a3,[v1,#&c8]
        CMP      a3,#0
        LDMLEDB  fp,{v1-v4,fp,sp,pc}^
|L0016cc.J20.process_restart|
        ADD      a3,v1,a1,LSL #2
        ADD      a1,a1,#1
        STR      a2,[a3,#&e4]!
        LDR      a3,[v1,#&c8]
        CMP      a1,a3
        BLT      |L0016cc.J20.process_restart|
        LDMDB    fp,{v1-v4,fp,sp,pc}^

        IMPORT  asm_huff_skip_blocks
do_huff_skip_blocks
        MOV      ip,sp
        STMDB    sp!,{a1-a4}
        STMDB    sp!,{v1-v6,fp,ip,lr,pc}
        SUB      fp,ip,#&14
        MOV      v1,a1
        MOV      v2,a2
        MOV      v3,a3
        LDR      v4,[fp,#&1c]
        LDR      v5,[fp,#&18]
        LDR      v6,[fp,#&14]
        LDR      a2,[a1,#&bc]
        TEQ      a2,#0
        BEQ      |L00178c.J4.do_huff_skip_blocks|
        CMP      v4,#0
        LDMLEDB  fp,{v1-v6,fp,sp,pc}^
        B        |L001730.J10.do_huff_skip_blocks|
|L001728.J6.do_huff_skip_blocks|
        TEQ      a1,#0
        BEQ      |L00174c.J9.do_huff_skip_blocks|
|L001730.J10.do_huff_skip_blocks|
        LDR      a1,[v1,#&c0]
        TEQ      a1,#0
        MOVEQ    a1,v1
        BLEQ     process_restart
        LDR      a1,[v1,#&c0]
        SUB      a1,a1,#1
        STR      a1,[v1,#&c0]
|L00174c.J9.do_huff_skip_blocks|
        MOV      a4,#1
        MOV      a3,v5
        MOV      a2,v6
        STMDB    sp!,{a2-a4}
        MOV      a3,v3
        MOV      a2,v2
        MOV      a1,v1
        LDR      a4,[fp,#&10]
        BL       asm_huff_skip_blocks
        ADD      sp,sp,#&c
        SUB      v4,v4,#1
        ADD      v2,v2,#&100
        CMP      v4,#0
        LDR      a1,[fp,#&20]
        BGT      |L001728.J6.do_huff_skip_blocks|
        LDMDB    fp,{v1-v6,fp,sp,pc}^
|L00178c.J4.do_huff_skip_blocks|
        MOV      a4,v4
        MOV      a3,v5
        MOV      a2,v6
        STMDB    sp!,{a2-a4}
        MOV      a3,v3
        MOV      a2,v2
        LDR      a4,[fp,#&10]
        BL       asm_huff_skip_blocks
        LDMDB    fp,{v1-v6,fp,sp,pc}^

        IMPORT  asm_huff_decode_blocks
do_huff_decode_blocks
        MOV      ip,sp
        STMDB    sp!,{a1-a4}
        STMDB    sp!,{v1-v6,fp,ip,lr,pc}
        SUB      fp,ip,#&14
        MOV      v1,a1
        MOV      v2,a2
        MOV      v3,a3
        LDR      v4,[fp,#&1c]
        LDR      v5,[fp,#&18]
        LDR      v6,[fp,#&14]
        LDR      a2,[a1,#&bc]
        TEQ      a2,#0
        BEQ      |L001854.J4.do_huff_decode_blocks|
        CMP      v4,#0
        LDMLEDB  fp,{v1-v6,fp,sp,pc}^
        B        |L0017f8.J10.do_huff_decode_blocks|
|L0017f0.J6.do_huff_decode_blocks|
        TEQ      a1,#0
        BEQ      |L001814.J9.do_huff_decode_blocks|
|L0017f8.J10.do_huff_decode_blocks|
        LDR      a1,[v1,#&c0]
        TEQ      a1,#0
        MOVEQ    a1,v1
        BLEQ     process_restart
        LDR      a1,[v1,#&c0]
        SUB      a1,a1,#1
        STR      a1,[v1,#&c0]
|L001814.J9.do_huff_decode_blocks|
        MOV      a4,#1
        MOV      a3,v5
        MOV      a2,v6
        STMDB    sp!,{a2-a4}
        MOV      a3,v3
        MOV      a2,v2
        MOV      a1,v1
        LDR      a4,[fp,#&10]
        BL       asm_huff_decode_blocks
        ADD      sp,sp,#&c
        SUB      v4,v4,#1
        ADD      v2,v2,#&100
        CMP      v4,#0
        LDR      a1,[fp,#&20]
        BGT      |L0017f0.J6.do_huff_decode_blocks|
        LDMDB    fp,{v1-v6,fp,sp,pc}^
|L001854.J4.do_huff_decode_blocks|
        MOV      a4,v4
        MOV      a3,v5
        MOV      a2,v6
        STMDB    sp!,{a2-a4}
        MOV      a3,v3
        MOV      a2,v2
        LDR      a4,[fp,#&10]
        BL       asm_huff_decode_blocks
        LDMDB    fp,{v1-v6,fp,sp,pc}^

        ;MPORT  jpeg_scan_file
do_jpeg_scan_file
        MOV      ip,sp
        STMDB    sp!,{v1,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      lr,a3
        MOV      ip,a4
        MOV      v1,a1
        STR      a2,[a1,#&10]
        MVN      a1,#0
        MOV      a4,#0
        MVN      a3,#0
        MVN      a2,#0
        STR      a1,[v1,#0]
        MVN      a1,#&80000000
        STMDB    sp!,{a1-a4}
        MOV      a3,ip
        MOV      a2,lr
        MOV      a1,v1
        BL       jpeg_scan_file
        LDMDB    fp,{v1,fp,sp,pc}^

do_jpeg_scan_file_16
        MOV      ip,sp
        STMDB    sp!,{v1,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      lr,a3
        MOV      ip,a4
        MOV      v1,a1
        STR      a2,[a1,#&10]
        MVN      a1,#0
        MOV      a4,#&10
        MVN      a3,#0
        MVN      a2,#0
        STR      a1,[v1,#0]
        MVN      a1,#&80000000
        STMDB    sp!,{a1-a4}
        MOV      a3,ip
        MOV      a2,lr
        MOV      a1,v1
        MOV      a4,#0
        BL       jpeg_scan_file
        LDMDB    fp,{v1,fp,sp,pc}^

        IMPORT  |__rt_sdiv|
jpeg_scan_file
        MOV      ip,sp
        STMDB    sp!,{a1-a4}
        STMDB    sp!,{v1-v6,fp,ip,lr,pc}
        SUB      fp,ip,#&14
        MOV      v1,a1
        MOV      v5,a2
        MOV      v4,a3
        MOV      v3,a4
        SUB      sp,sp,#&20
        LDR      v2,[fp,#&20]
        TST      v2,#2
        LDR      v6,[fp,#&14]
        BICNE    v2,v2,#&38
        CMP      v3,#0
        MOVLT    v3,#0
        TST      v2,#&28
        BEQ      |L001968.J8.jpeg_scan_file|
        SUBS     v3,v3,#&10
        MOVMI    v3,#0
        BIC      v3,v3,#&f
        ADD      v6,v6,#&10
|L001968.J8.jpeg_scan_file|
        LDR      a2,[v1,#0]
        CMP      a2,#0
        BNE      |L001a78.J12.jpeg_scan_file|
        LDR      a2,[v1,#&30]
        TEQ      a2,v5
        BNE      |L001a80.J42.jpeg_scan_file|
        LDR      a3,[v1,#&38]
        SUB      a2,a3,a2
        TEQ      a2,v4
        BNE      |L001a80.J42.jpeg_scan_file|
        LDR      a2,[fp,#&18]
        CMN      a2,#1
        LDRNE    a2,[v1,#&14]
        LDRNE    a3,[fp,#&18]
        TEQNE    a2,a3
        BNE      |L001a80.J42.jpeg_scan_file|
        LDR      a2,[fp,#&1c]
        CMN      a2,#1
        LDRNE    a2,[v1,#&18]
        LDRNE    a3,[fp,#&1c]
        TEQNE    a2,a3
        BNE      |L001a80.J42.jpeg_scan_file|
        MOVS     a2,v4
        ADDMI    a2,a2,#7
        MOV      a2,a2,ASR #3
        LDR      a2,[v5,a2,LSL #2]
        LDR      a3,[v1,#&10c]
        TEQ      a2,a3
        BNE      |L001a80.J42.jpeg_scan_file|
        MOV      a3,v4
        CMP      v4,#0
        ADDLT    a3,a3,#3
        MOV      a3,a3,ASR #2
        MOV      a2,v4
        ADDLT    a2,a2,#&f
        SUB      a2,a3,a2,ASR #4
        LDR      a3,[v5,a2,LSL #2]
        LDR      a2,[v1,#&110]
        TEQ      a3,a2
        BNE      |L001a80.J42.jpeg_scan_file|
        MOV      a2,v4
        CMP      v4,#0
        ADDLT    a2,a2,#3
        MOV      a2,a2,ASR #2
        MOV      a3,v4
        ADDLT    a3,a3,#&1f
        SUB      a2,a2,a3,ASR #5
        LDR      a3,[v5,a2,LSL #2]
        LDR      a2,[v1,#&114]
        TEQ      a3,a2
        LDREQ    a2,[v1,#&100]
        TEQEQ    a2,v2
        BNE      |L001a80.J42.jpeg_scan_file|
        LDR      a1,[v1,#&14]
        CMP      v6,a1
        MOVGT    v6,a1
        LDR      a1,[v1,#&f8]
        CMP      v3,a1
        BLT      |L001a60.J39.jpeg_scan_file|
        LDR      a1,[v1,#&fc]
        CMP      v6,a1
        BLE      |L001a68.J38.jpeg_scan_file|
|L001a60.J39.jpeg_scan_file|
        MVN      a1,#0
        STR      a1,[v1,#&f4]
|L001a68.J38.jpeg_scan_file|
        MOV      a1,#0
        ADD      v1,v1,#&f4
        STMIB    v1!,{v3,v6}
        B        |L0020bc.J135.jpeg_scan_file|
|L001a78.J12.jpeg_scan_file|
        MOVLT    a2,#0
        STRLT    a2,[v1,#&20]
|L001a80.J42.jpeg_scan_file|
        LDR      a2,[v1,#&10]
        BL       init_workspace
        LDR      a1,[v1,#&10]
        TEQ      a1,#0
        STREQ    a1,[v1,#&28]
        LDREQ    a1,[pc, #L001bc4-.-8]
        BEQ      |L001ab8.J134.jpeg_scan_file|
        ADD      a2,v1,#&1fc
        ADD      a2,a2,#&3800
        ADD      a1,a1,#&204
        SUB      a1,a1,#&3c00
        MOV      a1,a1,LSR #2
        BIC      a1,a1,#&f
        STR      a2,[v1,#&28]
|L001ab8.J134.jpeg_scan_file|
        STR      a1,[v1,#&2c]
        MOV      a1,v4
        CMP      v4,#0
        ADDLT    a1,a1,#7
        MOV      a1,a1,ASR #3
        LDR      a1,[v5,a1,LSL #2]
        MOV      a2,v4
        STR      a1,[v1,#&10c]
        ADDLT    a2,a2,#3
        MOV      a2,a2,ASR #2
        MOV      a1,v4
        ADDLT    a1,a1,#&f
        SUB      a1,a2,a1,ASR #4
        LDR      a1,[v5,a1,LSL #2]
        MOV      a2,v4
        STR      a1,[v1,#&110]
        ADDLT    a2,a2,#3
        MOV      a2,a2,ASR #2
        MOV      a1,v4
        ADDLT    a1,a1,#&1f
        SUB      a1,a2,a1,ASR #5
        LDR      a1,[v5,a1,LSL #2]
        STR      a1,[v1,#&114]
        STR      v5,[v1,#&30]
        STR      v5,[v1,#&34]
        ADD      a1,v5,v4
        STR      a1,[v1,#&38]
        MOV      a1,v1
        BL       read_file_header
        MOV      a1,v1
        BL       read_scan_header
        MOV      v4,#0
|L001b38.J57.jpeg_scan_file|
        ADD      v5,v1,v4,LSL #2
        MOV      a1,v1
        LDR      a2,[v5,#&64]
        BL       fix_huff_tbl
        MOV      a1,v1
        LDR      a2,[v5,#&74]!
        BL       fix_huff_tbl
        ADD      v4,v4,#1
        CMP      v4,#4
        BLT      |L001b38.J57.jpeg_scan_file|
        MOV      a1,v1
        BL       huff_decoder_init
        MVN      a1,#0
        STR      a1,[v1,#&f4]
        LDR      a1,[v1,#&bc]
        STR      a1,[v1,#&c0]
        MOV      a1,#0
        STR      a1,[v1,#&c4]
        LDR      v4,[v1,#&14]
        CMP      v6,v4
        MOVGT    v6,v4
        CMP      v3,v6
        MOVGT    v3,v6
        STR      v2,[v1,#&100]
        ADD      v1,v1,#&f8
        STMIA    v1,{v3,v6}
        SUB      v1,v1,#&f8
        LDR      a1,[v1,#&3c]
        TEQ      a1,#8
        BEQ      |L001bc8.J63.jpeg_scan_file|
        MOV      a2,#1
        STR      a1,[v1,#4]
        STR      a2,[v1,#0]
        MOV      a1,#1
        B        |L0020bc.J135.jpeg_scan_file|
L001bc4
        DCD     &05f5e100
|L001bc8.J63.jpeg_scan_file|
        LDR      a1,[v1,#&c8]
        LDR      v3,[v1,#&4c]
        TEQ      v3,a1
        MOVNE    a1,#3
        STRNE    a1,[v1,#0]
        BNE      |L0020bc.J135.jpeg_scan_file|
        LDR      a1,[fp,#&18]
        TEQ      v4,a1
        LDRNE    a1,[fp,#&18]
        CMNNE    a1,#1
        BEQ      |L001c00.J67.jpeg_scan_file|
        MOV      a1,#7
        STMIA    v1,{a1,v4}
        B        |L0020bc.J135.jpeg_scan_file|
|L001c00.J67.jpeg_scan_file|
        LDR      a2,[v1,#&18]
        STR      a2,[sp,#&1c]
        LDR      a1,[fp,#&1c]
        TEQ      a2,a1
        LDRNE    a1,[fp,#&1c]
        CMNNE    a1,#1
        BEQ      |L001c34.J70.jpeg_scan_file|
        MOV      a1,#6
        STR      a1,[v1,#0]
        LDR      a1,[sp,#&1c]
        STR      a1,[v1,#4]!
        MOV      a1,#6
        B        |L0020bc.J135.jpeg_scan_file|
|L001c34.J70.jpeg_scan_file|
        LDR      v6,[v1,#&50]
        LDR      a1,[v6,#&c]
        MOV      v5,a1,LSL #3
        LDR      a1,[sp,#&1c]
        ADD      a1,a1,v5
        SUB      a2,a1,#1
        MOV      a1,v5
        BL       |__rt_sdiv|
        ADD      a1,a1,a1,LSL #2
        MOV      a1,a1,LSL #2
        LDR      a2,[v1,#&28]
        MOV      a1,a1,LSR #2
        STR      a2,[v1,#&818]
        ADD      a2,a2,a1,LSL #2
        STR      a2,[v1,#&28]
        LDR      a2,[v1,#&2c]
        SUB      a2,a2,a1
        MOV      a1,v5
        STR      a2,[v1,#&2c]
        BL       |__rt_sdiv|
        MOV      a2,a1
        CMP      a1,v4
        BGE      |L001ca8.J73.jpeg_scan_file|
        MOV      a1,#&a
        STMIA    v1,{a1,v4}
        MOV      a1,a2
        STR      a1,[v1,#8]!
        MOV      a1,#&a
        B        |L0020bc.J135.jpeg_scan_file|
|L001ca8.J73.jpeg_scan_file|
        MOV      a2,#8
        MOV      a1,#5
        ADD      v5,v1,#&e4
        TEQ      v3,#1
        BNE      |L001db8.J75.jpeg_scan_file|
        LDR      a3,[v1,#&1c]
        TEQ      a3,#1
        MOVNE    a1,#8
        STMNEIA  v1,{a2,a3}
        BNE      |L0020bc.J135.jpeg_scan_file|
        LDR      a2,[v6,#8]
        TEQ      a2,#1
        LDREQ    a2,[v6,#&c]
        TEQEQ    a2,#1
        BEQ      |L001d00.J79.jpeg_scan_file|
        STR      a1,[v1,#0]
        LDR      a1,[v6,#8]
        STR      a1,[v1,#4]
        LDR      a1,[v6,#&c]!
        STR      a1,[v1,#8]!
        MOV      a1,#5
        B        |L0020bc.J135.jpeg_scan_file|
|L001d00.J79.jpeg_scan_file|
        SUB      sp,sp,#8
        MOV      v4,#0
        LDR      a1,[v1,#&cc]
        LDR      a2,[a1,#&14]
        ADD      a2,v1,a2,LSL #2
        LDR      v6,[a2,#&64]!
        LDR      a2,[a1,#&18]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&74]
        STR      a2,[sp,#4]
        LDR      a1,[a1,#&10]
        ADD      a1,v1,a1,LSL #2
        LDR      a1,[a1,#&54]
        MOV      v3,#0
        STR      a1,[sp,#0]
        LDR      a1,[sp,#&24]
        CMP      a1,#0
        BLE      |L001dac.J84.jpeg_scan_file|
        ADD      a1,v1,#&118
        STR      a1,[sp,#&20]
|L001d50.J83.jpeg_scan_file|
        ADD      a1,v3,v3,LSL #2
        LDR      a2,[v1,#&818]
        ADD      a2,a2,a1,LSL #2
        MOV      a1,v1
        BL       save_huff_stream
        ADD      v3,v3,#1
        MOV      a4,#1
        LDR      a1,[v1,#&14]
        ADD      a1,a1,#7
        MOV      a3,a1,ASR #3
        MOV      a2,v5
        LDR      a1,[sp,#0]
        STMDB    sp!,{a1-a4}
        MOV      a3,v6
        MOV      a1,v1
        LDR      a2,[sp,#&30]
        LDR      a4,[sp,#&14]
        BL       do_huff_skip_blocks
        ADD      sp,sp,#&10
        ADD      v4,v4,#8
        LDR      a1,[v1,#&18]
        CMP      v4,a1
        BLT      |L001d50.J83.jpeg_scan_file|
|L001dac.J84.jpeg_scan_file|
        ADD      sp,sp,#8
        BIC      v2,v2,#&30
        B        |L00203c.J87.jpeg_scan_file|
|L001db8.J75.jpeg_scan_file|
        TEQ      v3,#3
        BNE      |L0020b4.J88.jpeg_scan_file|
        LDR      a3,[v6,#&c]
        STR      a3,[sp,#-4]!
        LDR      a4,[v6,#8]
        MOV      v3,a4
        CMP      a4,#2
        CMPLE    a3,#2
        BLE      |L001df0.J90.jpeg_scan_file|
        STR      a1,[v1,#0]
        LDR      a1,[v6,#8]
        STR      a1,[v1,#4]
        LDR      a1,[v6,#&c]!
        B        |L001e3c.J137.jpeg_scan_file|
|L001df0.J90.jpeg_scan_file|
        LDR      a3,[v6,#&40]
        TEQ      a3,#1
        LDREQ    a3,[v6,#&44]
        TEQEQ    a3,#1
        BEQ      |L001e18.J94.jpeg_scan_file|
        STR      a1,[v1,#0]
        LDR      a1,[v6,#&40]
        STR      a1,[v1,#4]
        LDR      a1,[v6,#&44]!
        B        |L001e3c.J137.jpeg_scan_file|
|L001e18.J94.jpeg_scan_file|
        LDR      a3,[v6,#&78]
        TEQ      a3,#1
        LDREQ    a3,[v6,#&7c]
        TEQEQ    a3,#1
        BEQ      |L001e48.J98.jpeg_scan_file|
        STR      a1,[v1,#0]
        LDR      a1,[v6,#&78]
        STR      a1,[v1,#4]
        LDR      a1,[v6,#&7c]!
|L001e3c.J137.jpeg_scan_file|
        STR      a1,[v1,#8]!
        MOV      a1,#5
        B        |L001e60.J138.jpeg_scan_file|
|L001e48.J98.jpeg_scan_file|
        LDR      a1,[v1,#&1c]
        TEQ      a1,#3
        BEQ      |L001e64.J102.jpeg_scan_file|
        STR      a1,[v1,#4]
        STR      a2,[v1,#0]
        MOV      a1,#8
|L001e60.J138.jpeg_scan_file|
        LDMDB    fp,{v1-v6,fp,sp,pc}^
|L001e64.J102.jpeg_scan_file|
        TEQ      v3,#2
        LDREQ    a1,[sp,#0]
        TEQEQ    a1,#2
        BICNE    v2,v2,#&30
        SUB      sp,sp,#&28
        MOV      a1,#0
        MOV      v4,#0
        STR      a1,[sp,#&24]
        LDR      a1,[v1,#&cc]
        LDR      a2,[a1,#&14]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&64]
        STR      a2,[sp,#&20]
        LDR      a2,[a1,#&18]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&74]
        STR      a2,[sp,#&1c]
        LDR      a1,[a1,#&10]
        ADD      a1,v1,a1,LSL #2
        LDR      a1,[a1,#&54]
        STR      a1,[sp,#&18]
        LDR      a1,[v1,#&d0]
        LDR      a2,[a1,#&14]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&64]
        STR      a2,[sp,#&14]
        LDR      a2,[a1,#&18]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&74]
        STR      a2,[sp,#&10]
        LDR      a1,[a1,#&10]
        ADD      a1,v1,a1,LSL #2
        LDR      a1,[a1,#&54]
        STR      a1,[sp,#&c]
        LDR      a1,[v1,#&d4]
        LDR      a2,[a1,#&14]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&64]
        STR      a2,[sp,#8]
        LDR      a2,[a1,#&18]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&74]
        STR      a2,[sp,#4]
        LDR      a1,[a1,#&10]
        ADD      a1,v1,a1,LSL #2
        LDR      a1,[a1,#&54]
        STR      a1,[sp,#0]
        LDR      a1,[sp,#&48]
        CMP      a1,#0
        BLE      |L002038.J109.jpeg_scan_file|
        LDR      a2,[sp,#&28]
        MUL      a1,a2,v3
        ADD      a2,v1,#&218
        STR      a2,[sp,#&3c]
        ADD      a2,v1,#&e8
        STR      a2,[sp,#&38]
        ADD      a2,v1,#&218
        ADD      a2,a2,#&400
        STR      a2,[sp,#&34]
        ADD      a2,v1,#&ec
        STR      a1,[sp,#&40]
        ADD      a1,v1,#&318
        ADD      a1,a1,#&400
        STR      a1,[sp,#&2c]
        STR      a2,[sp,#&30]
|L001f68.J108.jpeg_scan_file|
        ADD      a1,v4,v4,LSL #2
        LDR      a2,[v1,#&818]
        ADD      a2,a2,a1,LSL #2
        MOV      a1,v1
        BL       save_huff_stream
        ADD      v4,v4,#1
        MOV      v6,#0
        LDR      a1,[v1,#&14]
        CMP      a1,#0
        BLE      |L00201c.J112.jpeg_scan_file|
|L001f90.J111.jpeg_scan_file|
        MOV      a4,#0
        MOV      a2,v5
        LDR      a1,[sp,#&18]
        LDR      a3,[sp,#&40]
        STMDB    sp!,{a1-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&4c]
        LDR      a3,[sp,#&30]
        LDR      a4,[sp,#&2c]
        BL       do_huff_skip_blocks
        ADD      sp,sp,#&10
        MOV      a4,#1
        LDR      a2,[sp,#&c]
        LDR      a3,[sp,#&38]
        STMDB    sp!,{a2-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&40]
        LDR      a3,[sp,#&20]
        LDR      a4,[sp,#&1c]
        BL       asm_huff_skip_blocks
        ADD      sp,sp,#&c
        MOV      a4,#1
        LDR      a2,[sp,#0]
        LDR      a3,[sp,#&30]
        STMDB    sp!,{a2-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&38]
        LDR      a3,[sp,#&14]
        LDR      a4,[sp,#&10]
        BL       asm_huff_skip_blocks
        ADD      sp,sp,#&c
        ADD      v6,v6,v3,LSL #3
        LDR      a1,[v1,#&14]
        CMP      v6,a1
        BLT      |L001f90.J111.jpeg_scan_file|
|L00201c.J112.jpeg_scan_file|
        ADD      a2,sp,#&24
        LDMIA    a2,{a1,a2}
        ADD      a2,a1,a2,LSL #3
        STR      a2,[sp,#&24]
        LDR      a1,[v1,#&18]
        CMP      a2,a1
        BLT      |L001f68.J108.jpeg_scan_file|
|L002038.J109.jpeg_scan_file|
        ADD      sp,sp,#&2c
|L00203c.J87.jpeg_scan_file|
        TST      v2,#4
        BEQ      |L002078.J117.jpeg_scan_file|
        LDR      a1,[v1,#&50]
        LDR      a1,[a1,#8]
        MOV      a1,a1,LSL #3
        LDR      a2,[v1,#&2c]
        BL       |__rt_sdiv|
        LDR      a2,[v1,#&14]
        CMP      a1,a2,LSL #1
        LDRLT    a1,[v1,#&100]
        BICLT    a1,a1,#4
        STRLT    a1,[v1,#&100]
        LDRGE    a1,[v1,#4]
        ORRGE    a1,a1,#4
        STRGE    a1,[v1,#4]
|L002078.J117.jpeg_scan_file|
        TST      v2,#8
        LDRNE    a1,[v1,#4]
        ORRNE    a1,a1,#8
        STRNE    a1,[v1,#4]
        TST      v2,#&10
        LDRNE    a1,[v1,#4]
        ORRNE    a1,a1,#&10
        STRNE    a1,[v1,#4]
        TST      v2,#&20
        LDRNE    a1,[v1,#4]
        ORRNE    a1,a1,#&20
        STRNE    a1,[v1,#4]
        STR      v2,[v1,#&100]
        LDR      a1,[v1,#0]
        B        |L0020bc.J135.jpeg_scan_file|
|L0020b4.J88.jpeg_scan_file|
        MOV      a1,#9
        STMIA    v1,{a1,v3}
|L0020bc.J135.jpeg_scan_file|
        LDMDB    fp,{v1-v6,fp,sp,pc}^

        IMPORT  asm_j_rev_dct
        IMPORT  asm_mono_convert_block
        IMPORT  asm_colour_convert_block_16
        IMPORT  asm_colour_convert_block
        IMPORT  asm_colour_convert_block_8
        IMPORT  asm_get_table32k
        IMPORT  asm_diffuse_to_8bpp
jpeg_find_line
        MOV      ip,sp
        STMDB    sp!,{a1-a3,v1-v6,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        LDR      a1,[a1,#&50]
        LDR      a1,[a1,#&c]
        ADD      a1,a1,#2
        STR      a1,[sp,#-&34]!
        LDR      a1,[v1,#&2c]
        LDR      a2,[sp,#0]
        MOV      v4,a1,ASR a2
        LDR      a1,[v1,#&18]
        LDR      a2,[fp,#-&2c]
        SUB      a1,a1,a2
        SUBS     a1,a1,#1
        MOV      v2,#0
        STR      a1,[fp,#-&2c]
        MOVMI    a1,v2
        MOVPL    a1,#1
        MOV      a2,#4
        BL       assert
        LDR      a2,[fp,#-&2c]
        LDR      a1,[v1,#&18]
        CMP      a2,a1
        MOVGE    a1,v2
        MOVLT    a1,#1
        MOV      a2,#4
        BL       assert
        LDR      a2,[fp,#-&2c]
        LDR      a1,[sp,#0]
        MOV      a2,a2,ASR a1
        STR      a2,[sp,#4]
        LDR      a1,[v1,#&f4]
        TEQ      a2,a1
        BEQ      |L00297c.J10.jpeg_find_line|
        SUB      sp,sp,#4
        LDR      a1,[v1,#&28]
        TEQ      a1,#0
        MOVEQ    a1,v2
        MOVNE    a1,#1
        MOV      a2,#4
        BL       assert
        MVN      a1,#0
        STR      a1,[v1,#&f4]
        LDR      a1,[sp,#8]
        ADD      a2,a1,a1,LSL #2
        LDR      a1,[v1,#&818]
        ADD      a2,a1,a2,LSL #2
        MOV      a1,v1
        BL       restore_huff_stream
        LDR      a1,[v1,#&4c]
        ADD      a3,v1,#&e4
        ADD      v6,v1,#&118
        ADD      a2,v1,#&218
        TEQ      a1,#1
        STR      a2,[sp,#&30]
        STR      a3,[sp,#&34]
        BNE      |L00233c.J15.jpeg_find_line|
        SUB      sp,sp,#8
        MOV      v3,#0
        LDR      a1,[v1,#&cc]
        LDR      v2,[v1,#&28]
        LDR      a2,[a1,#&10]
        ADD      a2,v1,a2,LSL #2
        LDR      v5,[a2,#&54]!
        LDR      a2,[a1,#&14]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&64]
        STR      a2,[sp,#4]
        LDR      a1,[a1,#&18]
        ADD      a1,v1,a1,LSL #2
        LDR      a1,[a1,#&74]
        STR      a1,[sp,#0]
        LDR      a1,[v1,#&f8]
        CMP      a1,#8
        BLT      |L002234.J17.jpeg_find_line|
        SUB      a1,a1,#8
        MOV      a1,a1,ASR #3
        MOV      a4,#1
        STR      a1,[sp,#-4]!
        MOV      a3,a1
        MOV      a1,v5
        LDR      a2,[sp,#&40]
        STMDB    sp!,{a1-a4}
        MOV      a2,v6
        MOV      a1,v1
        LDR      a3,[sp,#&18]
        LDR      a4,[sp,#&14]
        BL       do_huff_skip_blocks
        LDR      a1,[sp,#&10]!
        ADD      v3,v3,a1,LSL #3
        ADD      v2,v2,a1,LSL #5
        ADD      sp,sp,#4
|L002234.J17.jpeg_find_line|
        LDR      a1,[v1,#&100]
        TST      a1,#2
        LDR      a1,[v1,#&fc]
        BEQ      |L0022c8.J19.jpeg_find_line|
        CMP      v3,a1
        BGE      |L0022c0.J22.jpeg_find_line|
|L00224c.J21.jpeg_find_line|
        MOV      a4,#1
        MOV      a3,#1
        MOV      a1,v5
        LDR      a2,[sp,#&3c]
        STMDB    sp!,{a1-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&48]
        LDR      a3,[sp,#&14]
        LDR      a4,[sp,#&10]
        BL       do_huff_skip_blocks
        ADD      sp,sp,#&10
        LDR      a2,[v1,#&e4]
        LDR      a1,[v5,#0]
        MUL      a2,a1,a2
        MOV      a1,v1
        BL       mono_convert_pixel
        STR      a1,[v2,#0]
        STR      a1,[v2,#4]
        STR      a1,[v2,#8]
        STR      a1,[v2,#&c]
        STR      a1,[v2,#&10]
        STR      a1,[v2,#&14]
        STR      a1,[v2,#&18]
        ADD      v3,v3,#8
        STR      a1,[v2,#&1c]!
        ADD      v2,v2,#4
        LDR      a1,[v1,#&fc]
        CMP      v3,a1
        BLT      |L00224c.J21.jpeg_find_line|
|L0022c0.J22.jpeg_find_line|
        MOV      a1,#1
        B        |L002334.J130.jpeg_find_line|
|L0022c8.J19.jpeg_find_line|
        CMP      v3,a1
        BGE      |L002330.J27.jpeg_find_line|
|L0022d0.J26.jpeg_find_line|
        MOV      a4,#1
        MOV      a3,#1
        MOV      a1,v5
        LDR      a2,[sp,#&3c]
        STMDB    sp!,{a1-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&48]
        LDR      a3,[sp,#&14]
        LDR      a4,[sp,#&10]
        BL       do_huff_decode_blocks
        ADD      sp,sp,#&10
        MOV      a1,v1
        MOV      a3,#1
        LDR      a2,[sp,#&38]
        BL       asm_j_rev_dct
        MOV      a1,v6
        MOV      a3,v4
        MOV      a2,v2
        BL       asm_mono_convert_block
        ADD      v3,v3,#8
        ADD      v2,v2,#&20
        LDR      a1,[v1,#&fc]
        CMP      v3,a1
        BLT      |L0022d0.J26.jpeg_find_line|
|L002330.J27.jpeg_find_line|
        MOV      a1,#8
|L002334.J130.jpeg_find_line|
        STR      a1,[sp,#8]!
        B        |L0028a8.J30.jpeg_find_line|
|L00233c.J15.jpeg_find_line|
        SUB      sp,sp,#&28
        MOV      v5,#0
        LDR      a1,[v1,#&cc]
        LDR      v2,[v1,#&28]
        LDR      a2,[a1,#&14]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&64]
        STR      a2,[sp,#&24]
        LDR      a2,[a1,#&18]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&74]
        STR      a2,[sp,#&20]
        LDR      a1,[a1,#&10]
        ADD      a1,v1,a1,LSL #2
        LDR      a1,[a1,#&54]
        STR      a1,[sp,#&1c]
        LDR      a1,[v1,#&d0]
        LDR      a2,[a1,#&14]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&64]
        STR      a2,[sp,#&18]
        LDR      a2,[a1,#&18]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&74]
        STR      a2,[sp,#&14]
        LDR      a1,[a1,#&10]
        ADD      a1,v1,a1,LSL #2
        LDR      a1,[a1,#&54]
        STR      a1,[sp,#&10]
        LDR      a1,[v1,#&d4]
        LDR      a2,[a1,#&14]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&64]
        STR      a2,[sp,#&c]
        LDR      a2,[a1,#&18]
        ADD      a2,v1,a2,LSL #2
        LDR      a2,[a2,#&74]
        STR      a2,[sp,#8]
        LDR      a1,[a1,#&10]
        ADD      a1,v1,a1,LSL #2
        LDR      a1,[a1,#&54]
        STR      a1,[sp,#4]
        LDR      a1,[v1,#&50]
        LDR      a2,[a1,#&c]
        STR      a2,[sp,#0]
        LDR      v3,[a1,#8]!
        ADD      a2,v5,v3,LSL #3
        LDR      a1,[v1,#&f8]
        ADD      a4,v1,#&e8
        ADD      a3,v1,#&ec
        CMP      a2,a1
        STR      a3,[sp,#&50]
        STR      a4,[sp,#&54]
        BGT      |L0024cc.J32.jpeg_find_line|
        LDR      a2,[sp,#0]
        MUL      a1,a2,v3
        STR      a1,[sp,#&4c]
|L002420.J31.jpeg_find_line|
        MOV      a4,#0
        LDR      a1,[sp,#&1c]
        LDR      a2,[sp,#&5c]
        LDR      a3,[sp,#&4c]
        STMDB    sp!,{a1-a4}
        MOV      a2,v6
        MOV      a1,v1
        LDR      a3,[sp,#&34]
        LDR      a4,[sp,#&30]
        BL       do_huff_skip_blocks
        ADD      sp,sp,#&10
        MOV      a4,#1
        LDR      a2,[sp,#&10]
        LDR      a3,[sp,#&54]
        STMDB    sp!,{a2-a4}
        MOV      a2,v6
        MOV      a1,v1
        LDR      a3,[sp,#&24]
        LDR      a4,[sp,#&20]
        BL       asm_huff_skip_blocks
        ADD      sp,sp,#&c
        MOV      a4,#1
        LDR      a2,[sp,#4]
        LDR      a3,[sp,#&50]
        STMDB    sp!,{a2-a4}
        MOV      a2,v6
        MOV      a1,v1
        LDR      a3,[sp,#&18]
        LDR      a4,[sp,#&14]
        BL       asm_huff_skip_blocks
        ADD      sp,sp,#&c
        ADD      v5,v5,v3,LSL #3
        LDR      a1,[v1,#&100]
        TST      a1,#&10
        ADDNE    v2,v2,v3,LSL #4
        BNE      |L0024bc.J36.jpeg_find_line|
        TST      a1,#&20
        ADDEQ    v2,v2,v3,LSL #5
        ADDNE    v2,v2,v3,LSL #3
|L0024bc.J36.jpeg_find_line|
        ADD      a1,v5,v3,LSL #3
        LDR      a2,[v1,#&f8]
        CMP      a1,a2
        BLE      |L002420.J31.jpeg_find_line|
|L0024cc.J32.jpeg_find_line|
        LDR      a1,[v1,#&100]
        TST      a1,#2
        ADD      a1,v1,#&318
        ADD      a1,a1,#&400
        STR      a1,[sp,#&48]
        MOV      a1,#2
        ADD      a3,v1,#&218
        ADD      a3,a3,#&400
        STR      a3,[sp,#&44]
        LDR      a2,[v1,#&fc]
        BEQ      |L0026a8.J41.jpeg_find_line|
        CMP      v5,a2
        BGE      |L0026a0.J44.jpeg_find_line|
        LDR      a2,[sp,#0]
        MUL      a1,a2,v3
        STR      a1,[sp,#&40]
|L00250c.J43.jpeg_find_line|
        SUB      sp,sp,#&10
        MOV      a4,#0
        MOV      a3,#1
        LDR      a1,[sp,#&2c]
        LDR      a2,[sp,#&6c]
        STMDB    sp!,{a1-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&78]
        LDR      a3,[sp,#&44]
        LDR      a4,[sp,#&40]
        BL       do_huff_skip_blocks
        ADD      sp,sp,#&10
        LDR      a1,[v1,#&e4]
        LDR      a2,[sp,#&2c]
        LDR      a2,[a2,#0]
        MUL      a1,a2,a1
        MOV      v6,#1
        STR      a1,[sp,#0]
        LDR      a1,[sp,#&50]
        CMP      a1,#1
        BLE      |L0025b0.J47.jpeg_find_line|
|L002560.J46.jpeg_find_line|
        MOV      a4,#1
        LDR      a2,[sp,#&2c]
        LDR      a3,[sp,#&6c]
        STMDB    sp!,{a2-a4}
        ADD      a1,v1,v6,LSL #8
        ADD      a2,a1,#&218
        MOV      a1,v1
        LDR      a3,[sp,#&40]
        LDR      a4,[sp,#&3c]
        BL       asm_huff_skip_blocks
        ADD      sp,sp,#&c
        LDR      a2,[v1,#&e4]
        LDR      a1,[sp,#&2c]
        LDR      a1,[a1,#0]
        MUL      a2,a1,a2
        STR      a2,[sp,v6,LSL #2]
        ADD      v6,v6,#1
        LDR      a1,[sp,#&50]
        CMP      a1,v6
        BGT      |L002560.J46.jpeg_find_line|
|L0025b0.J47.jpeg_find_line|
        MOV      a4,#1
        LDR      a2,[sp,#&20]
        LDR      a3,[sp,#&64]
        STMDB    sp!,{a2-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&60]
        LDR      a3,[sp,#&34]
        LDR      a4,[sp,#&30]
        BL       asm_huff_skip_blocks
        ADD      sp,sp,#&c
        MOV      a4,#1
        LDR      a2,[sp,#&14]
        LDR      a3,[sp,#&60]
        STMDB    sp!,{a2-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&64]
        LDR      a3,[sp,#&28]
        LDR      a4,[sp,#&24]
        BL       asm_huff_skip_blocks
        ADD      sp,sp,#&c
        LDR      a2,[v1,#&e8]
        LDR      a1,[sp,#&20]
        LDR      a1,[a1,#0]
        MUL      a2,a1,a2
        LDR      a3,[v1,#&ec]
        LDR      a1,[sp,#&14]
        LDR      a1,[a1,#0]
        MUL      a3,a1,a3
        MOV      a1,sp
        BL       colour_convert_pixels
        MOV      v6,#0
        MOV      a3,#2
        MOV      a4,#1
|L002634.J50.jpeg_find_line|
        LDR      a1,[sp,#0]
        STR      a1,[v2,v6,LSL #2]
        TEQ      v3,#2
        ADDEQ    a2,v2,v6,LSL #2
        LDREQ    a1,[sp,#4]
        STREQ    a1,[a2,#&20]!
        LDR      a1,[sp,#&10]
        TEQ      a1,#2
        BNE      |L00267c.J53.jpeg_find_line|
        CMP      v3,#2
        MOVNE    a1,a4
        MOVEQ    a1,a3
        LDR      a2,[sp,a1,LSL #2]
        ADD      a1,v4,v6
        STR      a2,[v2,a1,LSL #2]
        ADDEQ    a1,v2,a1,LSL #2
        LDREQ    a2,[sp,#&c]
        STREQ    a2,[a1,#&20]!
|L00267c.J53.jpeg_find_line|
        ADD      v6,v6,#1
        CMP      v6,#8
        BLT      |L002634.J50.jpeg_find_line|
        ADD      v5,v5,v3,LSL #3
        ADD      v2,v2,v3,LSL #5
        ADD      sp,sp,#&10
        LDR      a1,[v1,#&fc]
        CMP      v5,a1
        BLT      |L00250c.J43.jpeg_find_line|
|L0026a0.J44.jpeg_find_line|
        LDR      a1,[sp,#0]
        B        |L0028a4.J131.jpeg_find_line|
|L0026a8.J41.jpeg_find_line|
        CMP      v5,a2
        BGE      |L00289c.J64.jpeg_find_line|
        ADD      a1,v1,#&18
        ADD      a1,a1,#&400
        STR      a1,[sp,#&3c]
        LDR      a2,[sp,#0]
        MUL      a1,a2,v3
        STR      a1,[sp,#&38]
|L0026c8.J63.jpeg_find_line|
        MOV      a4,#0
        LDR      a1,[sp,#&1c]
        LDR      a2,[sp,#&5c]
        LDR      a3,[sp,#&38]
        STMDB    sp!,{a1-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&68]
        LDR      a3,[sp,#&34]
        LDR      a4,[sp,#&30]
        BL       do_huff_decode_blocks
        ADD      sp,sp,#&10
        MOV      a4,#1
        LDR      a2,[sp,#&10]
        LDR      a3,[sp,#&54]
        STMDB    sp!,{a2-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&50]
        LDR      a3,[sp,#&24]
        LDR      a4,[sp,#&20]
        BL       asm_huff_decode_blocks
        ADD      sp,sp,#&c
        MOV      a4,#1
        LDR      a2,[sp,#4]
        LDR      a3,[sp,#&50]
        STMDB    sp!,{a2-a4}
        MOV      a1,v1
        LDR      a2,[sp,#&54]
        LDR      a3,[sp,#&18]
        LDR      a4,[sp,#&14]
        BL       asm_huff_decode_blocks
        ADD      sp,sp,#&c
        LDR      a1,[v1,#&100]
        TST      a1,#1
        BEQ      |L0027d8.J66.jpeg_find_line|
        MOV      a1,v1
        LDR      a2,[sp,#&58]
        LDR      a3,[sp,#&38]
        BL       asm_j_rev_dct
        MOV      a1,v6
        MOV      a3,v4
        MOV      a2,v2
        BL       asm_mono_convert_block
        TEQ      v3,#2
        BNE      |L002788.J68.jpeg_find_line|
        ADD      a2,v2,#&20
        MOV      a3,v4
        LDR      a1,[sp,#&58]
        BL       asm_mono_convert_block
|L002788.J68.jpeg_find_line|
        LDR      a1,[sp,#0]
        TEQ      a1,#2
        BNE      |L002870.J77.jpeg_find_line|
        ADD      a2,v2,v4,LSL #5
        TEQ      v3,#1
        STR      a2,[sp,#&34]
        MOVNE    a1,#2
        MOVEQ    a1,#1
        ADD      a1,v1,a1,LSL #8
        ADD      a1,a1,#&118
        MOV      a3,v4
        BL       asm_mono_convert_block
        TEQ      v3,#2
        BNE      |L002870.J77.jpeg_find_line|
        LDR      a1,[sp,#&34]
        ADD      a2,a1,#&20
        MOV      a3,v4
        LDR      a1,[sp,#&3c]
        BL       asm_mono_convert_block
        B        |L002870.J77.jpeg_find_line|
|L0027d8.J66.jpeg_find_line|
        LDR      a1,[sp,#&38]
        TEQ      a1,#4
        BNE      |L002830.J78.jpeg_find_line|
        MOV      a1,v1
        MOV      a3,#6
        LDR      a2,[sp,#&58]
        BL       asm_j_rev_dct
        LDR      a1,[v1,#&100]
        TST      a1,#&10
        BEQ      |L002814.J80.jpeg_find_line|
        MOV      a1,v6
        MOV      a3,v4
        MOV      a2,v2
        BL       asm_colour_convert_block_16
        B        |L002870.J77.jpeg_find_line|
|L002814.J80.jpeg_find_line|
        TST      a1,#&20
        MOV      a1,v6
        MOV      a3,v4
        MOV      a2,v2
        BLEQ     asm_colour_convert_block
        BLNE     asm_colour_convert_block_8
        B        |L002870.J77.jpeg_find_line|
|L002830.J78.jpeg_find_line|
        MOV      a1,v1
        LDR      a2,[sp,#&58]
        LDR      a3,[sp,#&38]
        BL       asm_j_rev_dct
        MOV      a1,v1
        MOV      a3,#2
        LDR      a2,[sp,#&44]
        BL       asm_j_rev_dct
        LDR      a4,[sp,#0]
        STMDB    sp!,{a4}
        MOV      a1,v6
        MOV      a4,v3
        MOV      a3,v4
        MOV      a2,v2
        BL       colour_convert_unusual_block
        ADD      sp,sp,#4
|L002870.J77.jpeg_find_line|
        ADD      v5,v5,v3,LSL #3
        LDR      a1,[v1,#&100]
        TST      a1,#&10
        ADDNE    v2,v2,v3,LSL #4
        BNE      |L002890.J89.jpeg_find_line|
        TST      a1,#&20
        ADDEQ    v2,v2,v3,LSL #5
        ADDNE    v2,v2,v3,LSL #3
|L002890.J89.jpeg_find_line|
        LDR      a1,[v1,#&fc]
        CMP      v5,a1
        BLT      |L0026c8.J63.jpeg_find_line|
|L00289c.J64.jpeg_find_line|
        LDR      a1,[sp,#0]
        MOV      a1,a1,LSL #3
|L0028a4.J131.jpeg_find_line|
        STR      a1,[sp,#&28]!
|L0028a8.J30.jpeg_find_line|
        LDR      a1,[v1,#&100]
        TST      a1,#8
        BEQ      |L002970.J94.jpeg_find_line|
        LDR      a1,[v1,#&20]
        TEQ      a1,#0
        BNE      |L0028e0.J96.jpeg_find_line|
        LDR      a1,[v1,#&24]
        TEQ      a1,#0
        BNE      |L0028e0.J96.jpeg_find_line|
        BL       asm_get_table32k
        STR      a1,[v1,#&20]
        TEQ      a1,#0
        MOVEQ    a1,#1
        STREQ    a1,[v1,#&24]
|L0028e0.J96.jpeg_find_line|
        LDR      a1,[v1,#&f8]
        LDR      a4,[v1,#&28]
        ADD      v3,a4,a1,LSL #2
        LDR      a3,[v1,#&fc]
        SUB      a3,a3,a1
        ADD      v6,a4,a1
        ADD      a3,a3,#&f
        BIC      v2,a3,#&f
        LDR      a3,[v1,#&14]
        SUB      a2,a3,a1
        CMP      a2,v2
        MOVLT    v2,a2
        LDR      a2,[v1,#&100]
        TST      a2,#4
        ADDNE    v3,v3,a1,LSL #2
        MOVNE    v2,v2,LSL #1
        CMP      v2,#0
        BLE      |L002970.J94.jpeg_find_line|
|L002928.J105.jpeg_find_line|
        CMP      v2,#&20
        MOVLT    v5,v2
        MOVGE    v5,#&10
        MOV      a3,v4
        LDR      a4,[fp,#-&28]
        LDR      a2,[sp,#0]
        STMDB    sp!,{a2-a4}
        MOV      a3,v6
        MOV      a2,v5
        MOV      a1,v3
        LDR      a4,[v1,#&20]
        BL       asm_diffuse_to_8bpp
        ADD      sp,sp,#&c
        ADD      v3,v3,v5,LSL #2
        ADD      v6,v6,v5
        SUB      v2,v2,v5
        CMP      v2,#0
        BGT      |L002928.J105.jpeg_find_line|
|L002970.J94.jpeg_find_line|
        LDR      a1,[sp,#8]
        ADD      sp,sp,#4
        STR      a1,[v1,#&f4]
|L00297c.J10.jpeg_find_line|
        LDR      a1,[v1,#&28]!
        LDR      a2,[v1,#&d8]!
        TST      a2,#2
        LDR      a2,[sp,#0]
        BEQ      |L0029ac.J112.jpeg_find_line|
        TEQ      a2,#4
        BNE      |L0029c8.J132.jpeg_find_line|
        LDR      a2,[fp,#-&2c]
        AND      a2,a2,#&f
        CMP      a2,#8
        ADDGE    a1,a1,v4,LSL #2
        B        |L0029c8.J132.jpeg_find_line|
|L0029ac.J112.jpeg_find_line|
        MOV      a3,#1
        MOV      a2,a3,LSL a2
        SUB      a2,a2,#1
        LDR      a3,[fp,#-&2c]
        AND      a2,a2,a3
        MUL      a2,v4,a2
        ADD      a1,a1,a2,LSL #2
|L0029c8.J132.jpeg_find_line|
        LDMDB    fp,{v1-v6,fp,sp,pc}^

looks_like_jpeg
        LDR      a2,[a1,#0]
        ADD      ip,a2,#&1f000000
        ADD      ip,ip,#&2700
        CMN      ip,#1
        BNE      |L002a10.J5.looks_like_jpeg|
        LDRB     a2,[a1,#6]
        TEQ      a2,#&4a
        LDREQB   a2,[a1,#7]
        TEQEQ    a2,#&46
        LDREQB   a2,[a1,#8]
        TEQEQ    a2,#&49
        LDREQB   a2,[a1,#9]
        TEQEQ    a2,#&46
        LDREQB   a1,[a1,#&a]
        TEQEQ    a1,#0
        MOVEQ    a1,#1
        MOVEQS   pc,lr
|L002a10.J5.looks_like_jpeg|
        MOV      a1,#0
        MOVS     pc,lr

find_image_dims
        MOV      ip,sp
        STMDB    sp!,{v1-v4,fp,ip,lr,pc}
        SUB      fp,ip,#4
        MOV      v1,a1
        MOV      v2,a2
        MOV      v4,#0
        LDR      v3,[fp,#4]
        AND      a2,v3,#3
        BL       looks_like_jpeg
        TEQ      a1,#0
        ADDNE    v1,v1,#2
        BNE      |L002a60.J9.find_image_dims|
        B        |L002ae8.J15.find_image_dims|
|L002a4c.J8.find_image_dims|
        LDRB     a2,[v1,#3]
        LDRB     a1,[v1,#2]
        ADD      a1,a2,a1,LSL #8
        ADD      a1,a1,v1
        ADD      v1,a1,#2
|L002a60.J9.find_image_dims|
        LDRB     a1,[v1,#0]
        TEQ      a1,#&ff
        LDRB     a1,[v1,#1]
        BNE      |L002a84.J10.find_image_dims|
        TEQ      a1,#&c0
        TEQNE    a1,#&c1
        TEQNE    a1,#&c9
        BNE      |L002a4c.J8.find_image_dims|
        B        |L002a94.J16.find_image_dims|
|L002a84.J10.find_image_dims|
        TEQ      a1,#&c0
        TEQNE    a1,#&c1
        TEQNE    a1,#&c9
        BNE      |L002ae8.J15.find_image_dims|
|L002a94.J16.find_image_dims|
        LDRB     a1,[v1,#6]
        LDRB     a2,[v1,#5]
        ADD      a1,a1,a2,LSL #8
        LDRB     a2,[v1,#8]
        LDRB     ip,[v1,#7]
        ADD      a2,a2,ip,LSL #8
        LDRB     ip,[v1,#9]
        ORR      lr,ip,v4
        CMP      v3,#1
        BLE      |L002b0c.J21.find_image_dims|
        CMP      lr,#1
        MOVNE    ip,#&10
        MOVEQ    ip,#8
        ADD      v1,a2,#&f
        MUL      ip,v1,ip
        MOV      v4,ip,LSL #2
        BNE      |L002af0.J27.find_image_dims|
        ADDS     v1,a1,#7
        ADDMI    v1,v1,#7
        MOV      v1,v1,ASR #3
        B        |L002af4.J26.find_image_dims|
|L002ae8.J15.find_image_dims|
        MOV      a1,#1
        LDMDB    fp,{v1-v4,fp,sp,pc}^
|L002af0.J27.find_image_dims|
        MOV      v1,a1
|L002af4.J26.find_image_dims|
        ADD      ip,v1,v1,LSL #2
        ADD      ip,v4,ip,LSL #2
        ADD      ip,ip,#&ff
        ADD      ip,ip,#&3d00
        BIC      ip,ip,#3
        STR      ip,[v3,#0]
|L002b0c.J21.find_image_dims|
        TEQ      a3,#0
        STRNE    a1,[a3,#0]
        TEQ      v2,#0
        STRNE    a2,[v2,#0]
        TEQ      a4,#0
        STRNE    lr,[a4,#0]
        MOV      a1,#0
        LDMDB    fp,{v1-v4,fp,sp,pc}^

        AREA |C$$data|,DATA

|x$dataseg|

        END