mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 10:07:38 -04:00
Make sure files which aren't windows-specific use \n line endings only
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26893 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
3d2b1cfa6e
commit
c0bd4173aa
23 changed files with 14136 additions and 14136 deletions
|
@ -1,226 +1,226 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id:
|
* $Id:
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 by Andree Buschmann
|
* Copyright (C) 2009 by Andree Buschmann
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
.section .text, "ax", %progbits
|
.section .text, "ax", %progbits
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* void atrac3_iqmf_matrixing(int32_t *dest,
|
* void atrac3_iqmf_matrixing(int32_t *dest,
|
||||||
* int32_t *inlo,
|
* int32_t *inlo,
|
||||||
* int32_t *inhi,
|
* int32_t *inhi,
|
||||||
* unsigned int count);
|
* unsigned int count);
|
||||||
*
|
*
|
||||||
* Matrixing step within iqmf of atrac3 synthesis. Reference implementation:
|
* Matrixing step within iqmf of atrac3 synthesis. Reference implementation:
|
||||||
*
|
*
|
||||||
* for(i=0; i<counter; i+=2){
|
* for(i=0; i<counter; i+=2){
|
||||||
* dest[2*i+0] = inlo[i ] + inhi[i ];
|
* dest[2*i+0] = inlo[i ] + inhi[i ];
|
||||||
* dest[2*i+1] = inlo[i ] - inhi[i ];
|
* dest[2*i+1] = inlo[i ] - inhi[i ];
|
||||||
* dest[2*i+2] = inlo[i+1] + inhi[i+1];
|
* dest[2*i+2] = inlo[i+1] + inhi[i+1];
|
||||||
* dest[2*i+3] = inlo[i+1] - inhi[i+1];
|
* dest[2*i+3] = inlo[i+1] - inhi[i+1];
|
||||||
* }
|
* }
|
||||||
* Note: r12 is a scratch register and can be used without restorage.
|
* Note: r12 is a scratch register and can be used without restorage.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
.align 2
|
.align 2
|
||||||
.global atrac3_iqmf_matrixing
|
.global atrac3_iqmf_matrixing
|
||||||
.type atrac3_iqmf_matrixing, %function
|
.type atrac3_iqmf_matrixing, %function
|
||||||
|
|
||||||
atrac3_iqmf_matrixing:
|
atrac3_iqmf_matrixing:
|
||||||
/* r0 = dest */
|
/* r0 = dest */
|
||||||
/* r1 = inlo */
|
/* r1 = inlo */
|
||||||
/* r2 = inhi */
|
/* r2 = inhi */
|
||||||
/* r3 = counter */
|
/* r3 = counter */
|
||||||
stmfd sp!, {r4-r9, lr} /* save non-scratch registers */
|
stmfd sp!, {r4-r9, lr} /* save non-scratch registers */
|
||||||
|
|
||||||
.iqmf_matrixing_loop:
|
.iqmf_matrixing_loop:
|
||||||
ldmia r1!, { r4, r6, r8, r12} /* load inlo[0...3] */
|
ldmia r1!, { r4, r6, r8, r12} /* load inlo[0...3] */
|
||||||
ldmia r2!, { r5, r7, r9, lr } /* load inhi[0...3] */
|
ldmia r2!, { r5, r7, r9, lr } /* load inhi[0...3] */
|
||||||
add r4, r4, r5 /* r4 = inlo[0] + inhi[0] */
|
add r4, r4, r5 /* r4 = inlo[0] + inhi[0] */
|
||||||
sub r5, r4, r5, asl #1 /* r5 = inlo[0] - inhi[0] */
|
sub r5, r4, r5, asl #1 /* r5 = inlo[0] - inhi[0] */
|
||||||
add r6, r6, r7 /* r6 = inlo[1] + inhi[1] */
|
add r6, r6, r7 /* r6 = inlo[1] + inhi[1] */
|
||||||
sub r7, r6, r7, asl #1 /* r7 = inlo[1] - inhi[1] */
|
sub r7, r6, r7, asl #1 /* r7 = inlo[1] - inhi[1] */
|
||||||
add r8, r8, r9 /* r8 = inlo[2] + inhi[2] */
|
add r8, r8, r9 /* r8 = inlo[2] + inhi[2] */
|
||||||
sub r9, r8, r9, asl #1 /* r9 = inlo[2] - inhi[2] */
|
sub r9, r8, r9, asl #1 /* r9 = inlo[2] - inhi[2] */
|
||||||
add r12, r12, lr /* r12 = inlo[3] + inhi[3] */
|
add r12, r12, lr /* r12 = inlo[3] + inhi[3] */
|
||||||
sub lr , r12, lr, asl #1 /* lr = inlo[3] - inhi[3] */
|
sub lr , r12, lr, asl #1 /* lr = inlo[3] - inhi[3] */
|
||||||
stmia r0!, {r4-r9, r12, lr} /* store results to dest */
|
stmia r0!, {r4-r9, r12, lr} /* store results to dest */
|
||||||
subs r3, r3, #4 /* counter -= 4 */
|
subs r3, r3, #4 /* counter -= 4 */
|
||||||
bgt .iqmf_matrixing_loop
|
bgt .iqmf_matrixing_loop
|
||||||
|
|
||||||
ldmpc regs=r4-r9 /* restore registers */
|
ldmpc regs=r4-r9 /* restore registers */
|
||||||
|
|
||||||
.atrac3_iqmf_matrixing_end:
|
.atrac3_iqmf_matrixing_end:
|
||||||
.size atrac3_iqmf_matrixing,.atrac3_iqmf_matrixing_end-atrac3_iqmf_matrixing
|
.size atrac3_iqmf_matrixing,.atrac3_iqmf_matrixing_end-atrac3_iqmf_matrixing
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* atrac3_iqmf_dewindowing(int32_t *out,
|
* atrac3_iqmf_dewindowing(int32_t *out,
|
||||||
* int32_t *in,
|
* int32_t *in,
|
||||||
* int32_t *win,
|
* int32_t *win,
|
||||||
* unsigned int nIn);
|
* unsigned int nIn);
|
||||||
*
|
*
|
||||||
* Dewindowing step within iqmf of atrac3 synthesis. Reference implementation:
|
* Dewindowing step within iqmf of atrac3 synthesis. Reference implementation:
|
||||||
*
|
*
|
||||||
* for (j = nIn; j != 0; j--) {
|
* for (j = nIn; j != 0; j--) {
|
||||||
* s1 = fixmul32(in[0], win[0]);
|
* s1 = fixmul32(in[0], win[0]);
|
||||||
* s2 = fixmul32(in[1], win[1]);
|
* s2 = fixmul32(in[1], win[1]);
|
||||||
* for (i = 2; i < 48; i += 2) {
|
* for (i = 2; i < 48; i += 2) {
|
||||||
* s1 += fixmul32(in[i ], win[i ]);
|
* s1 += fixmul32(in[i ], win[i ]);
|
||||||
* s2 += fixmul32(in[i+1], win[i+1]);
|
* s2 += fixmul32(in[i+1], win[i+1]);
|
||||||
* }
|
* }
|
||||||
* out[0] = s2 << 1;
|
* out[0] = s2 << 1;
|
||||||
* out[1] = s1 << 1;
|
* out[1] = s1 << 1;
|
||||||
* in += 2;
|
* in += 2;
|
||||||
* out += 2;
|
* out += 2;
|
||||||
* }
|
* }
|
||||||
* Note: r12 is a scratch register and can be used without restorage.
|
* Note: r12 is a scratch register and can be used without restorage.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
.align 2
|
.align 2
|
||||||
.global atrac3_iqmf_dewindowing
|
.global atrac3_iqmf_dewindowing
|
||||||
.type atrac3_iqmf_dewindowing, %function
|
.type atrac3_iqmf_dewindowing, %function
|
||||||
|
|
||||||
atrac3_iqmf_dewindowing:
|
atrac3_iqmf_dewindowing:
|
||||||
/* r0 = dest */
|
/* r0 = dest */
|
||||||
/* r1 = input samples */
|
/* r1 = input samples */
|
||||||
/* r2 = window coefficients */
|
/* r2 = window coefficients */
|
||||||
/* r3 = counter */
|
/* r3 = counter */
|
||||||
stmfd sp!, {r4-r9, lr} /* save non-scratch registers */
|
stmfd sp!, {r4-r9, lr} /* save non-scratch registers */
|
||||||
|
|
||||||
.iqmf_dewindow_outer_loop: /* outer loop 0...counter-1 */
|
.iqmf_dewindow_outer_loop: /* outer loop 0...counter-1 */
|
||||||
/* 0.. 7 */
|
/* 0.. 7 */
|
||||||
ldmia r2!, {r4, r5} /* load win[0..1] */
|
ldmia r2!, {r4, r5} /* load win[0..1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[0..1] */
|
ldmia r1!, {r6, r7} /* load in[0..1] */
|
||||||
smull lr , r9, r4, r6 /* s1 = win[0] * in[0] */
|
smull lr , r9, r4, r6 /* s1 = win[0] * in[0] */
|
||||||
smull r12, r8, r5, r7 /* s2 = win[1] * in[1] */
|
smull r12, r8, r5, r7 /* s2 = win[1] * in[1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
/* 8..15 */
|
/* 8..15 */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
/* 16..23 */
|
/* 16..23 */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
/* 24..31 */
|
/* 24..31 */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
/* 32..39 */
|
/* 32..39 */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
/* 40..47 */
|
/* 40..47 */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
ldmia r2!, {r4, r5} /* load win[i...i+1] */
|
||||||
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
ldmia r1!, {r6, r7} /* load in[i...i+1] */
|
||||||
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */
|
||||||
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */
|
||||||
|
|
||||||
mov lr , lr , lsr #31
|
mov lr , lr , lsr #31
|
||||||
orr r9, lr , r9, lsl #1 /* s1 = low>>31 || hi<<1 */
|
orr r9, lr , r9, lsl #1 /* s1 = low>>31 || hi<<1 */
|
||||||
mov r12, r12, lsr #31
|
mov r12, r12, lsr #31
|
||||||
orr r8, r12, r8, lsl #1 /* s2 = low>>31 || hi<<1 */
|
orr r8, r12, r8, lsl #1 /* s2 = low>>31 || hi<<1 */
|
||||||
|
|
||||||
stmia r0!, {r8, r9} /* store result out[0]=s2, out[1]=s1 */
|
stmia r0!, {r8, r9} /* store result out[0]=s2, out[1]=s1 */
|
||||||
sub r1, r1, #184 /* roll back 64 entries = 184 bytes */
|
sub r1, r1, #184 /* roll back 64 entries = 184 bytes */
|
||||||
sub r2, r2, #192 /* roll back 48 entries = 192 bytes = win[0] */
|
sub r2, r2, #192 /* roll back 48 entries = 192 bytes = win[0] */
|
||||||
|
|
||||||
subs r3, r3, #1 /* outer loop -= 1 */
|
subs r3, r3, #1 /* outer loop -= 1 */
|
||||||
bgt .iqmf_dewindow_outer_loop
|
bgt .iqmf_dewindow_outer_loop
|
||||||
|
|
||||||
ldmpc regs=r4-r9 /* restore registers */
|
ldmpc regs=r4-r9 /* restore registers */
|
||||||
|
|
||||||
.atrac3_iqmf_dewindowing_end:
|
.atrac3_iqmf_dewindowing_end:
|
||||||
.size atrac3_iqmf_dewindowing,.atrac3_iqmf_dewindowing_end-atrac3_iqmf_dewindowing
|
.size atrac3_iqmf_dewindowing,.atrac3_iqmf_dewindowing_end-atrac3_iqmf_dewindowing
|
||||||
|
|
|
@ -1,64 +1,64 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Original Copyright
|
Original Copyright
|
||||||
FILE........: AK2LSPD.H
|
FILE........: AK2LSPD.H
|
||||||
TYPE........: Turbo C header file
|
TYPE........: Turbo C header file
|
||||||
COMPANY.....: Voicetronix
|
COMPANY.....: Voicetronix
|
||||||
AUTHOR......: James Whitehall
|
AUTHOR......: James Whitehall
|
||||||
DATE CREATED: 21/11/95
|
DATE CREATED: 21/11/95
|
||||||
|
|
||||||
Modified by Jean-Marc Valin
|
Modified by Jean-Marc Valin
|
||||||
|
|
||||||
This file contains functions for converting Linear Prediction
|
This file contains functions for converting Linear Prediction
|
||||||
Coefficients (LPC) to Line Spectral Pair (LSP) and back. Note that the
|
Coefficients (LPC) to Line Spectral Pair (LSP) and back. Note that the
|
||||||
LSP coefficients are not in radians format but in the x domain of the
|
LSP coefficients are not in radians format but in the x domain of the
|
||||||
unit circle.
|
unit circle.
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
@file lsp.h
|
@file lsp.h
|
||||||
@brief Line Spectral Pair (LSP) functions.
|
@brief Line Spectral Pair (LSP) functions.
|
||||||
*/
|
*/
|
||||||
/* Speex License:
|
/* Speex License:
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions
|
modification, are permitted provided that the following conditions
|
||||||
are met:
|
are met:
|
||||||
|
|
||||||
- Redistributions of source code must retain the above copyright
|
- Redistributions of source code must retain the above copyright
|
||||||
notice, this list of conditions and the following disclaimer.
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
- Redistributions in binary form must reproduce the above copyright
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
notice, this list of conditions and the following disclaimer in the
|
notice, this list of conditions and the following disclaimer in the
|
||||||
documentation and/or other materials provided with the distribution.
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
- Neither the name of the Xiph.org Foundation nor the names of its
|
- Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
contributors may be used to endorse or promote products derived from
|
contributors may be used to endorse or promote products derived from
|
||||||
this software without specific prior written permission.
|
this software without specific prior written permission.
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
||||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __AK2LSPD__
|
#ifndef __AK2LSPD__
|
||||||
#define __AK2LSPD__
|
#define __AK2LSPD__
|
||||||
|
|
||||||
#include "arch.h"
|
#include "arch.h"
|
||||||
|
|
||||||
int lpc_to_lsp (spx_coef_t *a, int lpcrdr, spx_lsp_t *freq, int nb, spx_word16_t delta, char *stack);
|
int lpc_to_lsp (spx_coef_t *a, int lpcrdr, spx_lsp_t *freq, int nb, spx_word16_t delta, char *stack);
|
||||||
void lsp_to_lpc(spx_lsp_t *freq, spx_coef_t *ak, int lpcrdr, char *stack);
|
void lsp_to_lpc(spx_lsp_t *freq, spx_coef_t *ak, int lpcrdr, char *stack);
|
||||||
|
|
||||||
/*Added by JMV*/
|
/*Added by JMV*/
|
||||||
void lsp_enforce_margin(spx_lsp_t *lsp, int len, spx_word16_t margin);
|
void lsp_enforce_margin(spx_lsp_t *lsp, int len, spx_word16_t margin);
|
||||||
|
|
||||||
void lsp_interpolate(spx_lsp_t *old_lsp, spx_lsp_t *new_lsp, spx_lsp_t *interp_lsp, int len, int subframe, int nb_subframes);
|
void lsp_interpolate(spx_lsp_t *old_lsp, spx_lsp_t *new_lsp, spx_lsp_t *interp_lsp, int len, int subframe, int nb_subframes);
|
||||||
|
|
||||||
#endif /* __AK2LSPD__ */
|
#endif /* __AK2LSPD__ */
|
||||||
|
|
22782
apps/lang/ukrainian.lang
22782
apps/lang/ukrainian.lang
File diff suppressed because it is too large
Load diff
|
@ -1,174 +1,174 @@
|
||||||
##########################################################################
|
##########################################################################
|
||||||
# IMPORTANT NOTE #
|
# IMPORTANT NOTE #
|
||||||
# #
|
# #
|
||||||
# This is the readme file of the ProFont distribution for #
|
# This is the readme file of the ProFont distribution for #
|
||||||
# Apple Macintosh. I've added it because it felt wrong to distribute #
|
# Apple Macintosh. I've added it because it felt wrong to distribute #
|
||||||
# a Windows version of ProFont without the words of the original #
|
# a Windows version of ProFont without the words of the original #
|
||||||
# authors. #
|
# authors. #
|
||||||
# !! Please note that some of the information provided below is #
|
# !! Please note that some of the information provided below is #
|
||||||
# NOT valid for ProFont/Windows !! Just figure it out ... ;-) #
|
# NOT valid for ProFont/Windows !! Just figure it out ... ;-) #
|
||||||
# The Windows version was created using the files from the #
|
# The Windows version was created using the files from the #
|
||||||
# “ProFontWindows 2.2 ƒ” folder mentioned below. #
|
# “ProFontWindows 2.2 ƒ” folder mentioned below. #
|
||||||
# #
|
# #
|
||||||
# Comparing Mac + Win version, you'll see that all font sizes are #
|
# Comparing Mac + Win version, you'll see that all font sizes are #
|
||||||
# off by 1. This means that Win 8pt version displays like Mac 9pt #
|
# off by 1. This means that Win 8pt version displays like Mac 9pt #
|
||||||
# version. #
|
# version. #
|
||||||
# #
|
# #
|
||||||
# For questions about the windows version of ProFont, contact: #
|
# For questions about the windows version of ProFont, contact: #
|
||||||
# mail@tobias-jung.de (please write in english or german language) #
|
# mail@tobias-jung.de (please write in english or german language) #
|
||||||
# Tobias Jung, August 2002 #
|
# Tobias Jung, August 2002 #
|
||||||
##########################################################################
|
##########################################################################
|
||||||
# For version information, #
|
# For version information, #
|
||||||
# PLEASE READ v1_vs_v2.txt ! #
|
# PLEASE READ v1_vs_v2.txt ! #
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
ProFont Distribution 2.2
|
ProFont Distribution 2.2
|
||||||
21 July 1997
|
21 July 1997
|
||||||
SQ Software
|
SQ Software
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
• What is ProFont?
|
• What is ProFont?
|
||||||
|
|
||||||
ProFont began life as a better version of “Monaco 9” which is especially good for programmers. It was created circa 1987 by Andrew Welch.
|
ProFont began life as a better version of “Monaco 9” which is especially good for programmers. It was created circa 1987 by Andrew Welch.
|
||||||
|
|
||||||
In version 1.1 of the ProFont distribution, ProFont ceased being just a 9 point bitmap font. Carl Osterwald contributed bitmaps at several larger sizes and an outline version of ProFont in both TrueType and Adobe Type 1 (ATM) formats.
|
In version 1.1 of the ProFont distribution, ProFont ceased being just a 9 point bitmap font. Carl Osterwald contributed bitmaps at several larger sizes and an outline version of ProFont in both TrueType and Adobe Type 1 (ATM) formats.
|
||||||
|
|
||||||
In version 1.2 of the ProFont distribution, Carl extended ProFont to include the entire Macintosh character set including accented characters with ASCII codes from 0x80 to 0xFF.
|
In version 1.2 of the ProFont distribution, Carl extended ProFont to include the entire Macintosh character set including accented characters with ASCII codes from 0x80 to 0xFF.
|
||||||
|
|
||||||
In version 2.0 of the ProFont distribution, Carl provided an ISOLatin1 encoded version of ProFont. The shapes of several of the characters have been modified for improved readability, and a 7 pt bitmap version of ProFont is included.
|
In version 2.0 of the ProFont distribution, Carl provided an ISOLatin1 encoded version of ProFont. The shapes of several of the characters have been modified for improved readability, and a 7 pt bitmap version of ProFont is included.
|
||||||
|
|
||||||
In version 2.2 of the ProFont distribution, Carl produced a version of ProFont that uses the Windows character set. Once again the shapes of several of the characters have been modified for improved readability--especially when the fonts are anti-aliased.
|
In version 2.2 of the ProFont distribution, Carl produced a version of ProFont that uses the Windows character set. Once again the shapes of several of the characters have been modified for improved readability--especially when the fonts are anti-aliased.
|
||||||
|
|
||||||
• What is the ProFont Distribution?
|
• What is the ProFont Distribution?
|
||||||
|
|
||||||
ProFont was originally released as shareware by Andrew Welch. At that time, it was distributed inside an installer application which could replace Apple’s Monaco 9 with ProFont 9. This made using ProFont as a substitute for Monaco 9 very easy. When the Mac II and SE came out, the magic used by the original installer became ineffective. Over the years I (Steve Gilardi) have figured out how to install ProFont 9 in place of Monaco 9 through the various releases of the System Software. After a time I asked Andrew for permission to distribute ProFont along with my instructions and he agreed and also decided to change ProFont’s status from shareware to freeware.
|
ProFont was originally released as shareware by Andrew Welch. At that time, it was distributed inside an installer application which could replace Apple’s Monaco 9 with ProFont 9. This made using ProFont as a substitute for Monaco 9 very easy. When the Mac II and SE came out, the magic used by the original installer became ineffective. Over the years I (Steve Gilardi) have figured out how to install ProFont 9 in place of Monaco 9 through the various releases of the System Software. After a time I asked Andrew for permission to distribute ProFont along with my instructions and he agreed and also decided to change ProFont’s status from shareware to freeware.
|
||||||
|
|
||||||
The methods for accomplishing the substitution for Monaco 9 have gone through significant changes over the years as the Macintosh font architecture has evolved. The various releases of what has become the “ProFont Distribution” have been my effort to share my knowledge of how to use ProFont as a replacement for Monaco 9.
|
The methods for accomplishing the substitution for Monaco 9 have gone through significant changes over the years as the Macintosh font architecture has evolved. The various releases of what has become the “ProFont Distribution” have been my effort to share my knowledge of how to use ProFont as a replacement for Monaco 9.
|
||||||
|
|
||||||
Since Carl Osterwald became involved with the project, ProFont has blossomed into a full-fledged font in its own right and most recently into a suite of related fonts. ProFont is unusual among fonts in that the outline version was designed to closely follow the original 9 pt bitmap version. More often, fonts are conceived as outlines and then rendered at the various point sizes.
|
Since Carl Osterwald became involved with the project, ProFont has blossomed into a full-fledged font in its own right and most recently into a suite of related fonts. ProFont is unusual among fonts in that the outline version was designed to closely follow the original 9 pt bitmap version. More often, fonts are conceived as outlines and then rendered at the various point sizes.
|
||||||
|
|
||||||
Earlier versions of the ProFont Distribution have included very involved instructions and utility programs to allow installation of ProFont as a replacement for Monaco 9. Release 2.2 contains none of those instructions. Instead, I have developed a control panel called “Monaco Tuner” which allows you to substitute a font of your choosing for Monaco. The substitution can be just for Monaco 9 or for all sizes of Monaco. Of course, I think the best substitute font to use is ProFont! See the information in the “Monaco Tuner 1.1.1 ƒ” folder for details.
|
Earlier versions of the ProFont Distribution have included very involved instructions and utility programs to allow installation of ProFont as a replacement for Monaco 9. Release 2.2 contains none of those instructions. Instead, I have developed a control panel called “Monaco Tuner” which allows you to substitute a font of your choosing for Monaco. The substitution can be just for Monaco 9 or for all sizes of Monaco. Of course, I think the best substitute font to use is ProFont! See the information in the “Monaco Tuner 1.1.1 ƒ” folder for details.
|
||||||
|
|
||||||
• What does ProFont 2.2 look like?
|
• What does ProFont 2.2 look like?
|
||||||
|
|
||||||
Here’s a sample:
|
Here’s a sample:
|
||||||
[ see "provsmonaco.gif" and "profomac.gif" ]
|
[ see "provsmonaco.gif" and "profomac.gif" ]
|
||||||
|
|
||||||
|
|
||||||
Also, each font folder in the ProFont distribution contains a file showing the font’s character set at 9 and 18 point sizes. You don’t need to install the corresponding font to see the character set.
|
Also, each font folder in the ProFont distribution contains a file showing the font’s character set at 9 and 18 point sizes. You don’t need to install the corresponding font to see the character set.
|
||||||
|
|
||||||
• What is included in this distribution?
|
• What is included in this distribution?
|
||||||
|
|
||||||
The distribution includes 7 items:
|
The distribution includes 7 items:
|
||||||
|
|
||||||
+ “About ProFont Distribution 2.2” SimpleText document
|
+ “About ProFont Distribution 2.2” SimpleText document
|
||||||
This is the file you are reading now.
|
This is the file you are reading now.
|
||||||
|
|
||||||
+ “ProFont Quick Start” SimpleText document
|
+ “ProFont Quick Start” SimpleText document
|
||||||
Quick instructions for installing ProFont and Monaco Tuner.
|
Quick instructions for installing ProFont and Monaco Tuner.
|
||||||
|
|
||||||
+ “ProFont 2.2 ƒ” folder
|
+ “ProFont 2.2 ƒ” folder
|
||||||
Version 2.2 of the “ProFont” font. This includes both TrueType and ATM versions of ProFont.
|
Version 2.2 of the “ProFont” font. This includes both TrueType and ATM versions of ProFont.
|
||||||
|
|
||||||
+ “ProFontISOLatin1 2.2 ƒ” folder
|
+ “ProFontISOLatin1 2.2 ƒ” folder
|
||||||
Version 2.2 of the “ProFontISOLatin1” font. TrueType and ATM versions of ProFontISOLatin1 are included.
|
Version 2.2 of the “ProFontISOLatin1” font. TrueType and ATM versions of ProFontISOLatin1 are included.
|
||||||
|
|
||||||
+ “ProFontClassic 1.2 ƒ” folder
|
+ “ProFontClassic 1.2 ƒ” folder
|
||||||
ProFontClassic 1.2 is the 9 pt size of ProFont from the 1.2 release of the ProFont distribution. It’s included mainly for those who prefer the look of ProFont 1.2 to that of ProFont 2.2 and who are only interested in substituting ProFontClassic for Monaco 9 using Monaco Tuner.
|
ProFontClassic 1.2 is the 9 pt size of ProFont from the 1.2 release of the ProFont distribution. It’s included mainly for those who prefer the look of ProFont 1.2 to that of ProFont 2.2 and who are only interested in substituting ProFontClassic for Monaco 9 using Monaco Tuner.
|
||||||
|
|
||||||
+ “ProFontWindows 2.2 ƒ” folder
|
+ “ProFontWindows 2.2 ƒ” folder
|
||||||
Version 2.2 of the “ProFontWindows” font. This is the first release of this font, but it is version 2.2 to keep its version number in sync with that of the “ProFont” font. TrueType and ATM versions of ProFontWindows are included. This font can be useful for viewing files that originate on Windows machines.
|
Version 2.2 of the “ProFontWindows” font. This is the first release of this font, but it is version 2.2 to keep its version number in sync with that of the “ProFont” font. TrueType and ATM versions of ProFontWindows are included. This font can be useful for viewing files that originate on Windows machines.
|
||||||
|
|
||||||
+ “Monaco Tuner 1.1.1 ƒ” folder
|
+ “Monaco Tuner 1.1.1 ƒ” folder
|
||||||
“Monaco Tuner” is a control panel which replaces the complicated instructions for installing “ProFont(Monaco)” included in previous releases. It lets you pick a font (such as ProFont) to be substituted for Monaco in all applications. See the file “About Monaco Tuner” inside this folder for details.
|
“Monaco Tuner” is a control panel which replaces the complicated instructions for installing “ProFont(Monaco)” included in previous releases. It lets you pick a font (such as ProFont) to be substituted for Monaco in all applications. See the file “About Monaco Tuner” inside this folder for details.
|
||||||
|
|
||||||
• What kind of Macintosh and System Software do I need to use ProFont?
|
• What kind of Macintosh and System Software do I need to use ProFont?
|
||||||
|
|
||||||
The family of ProFont fonts are standard Macintosh fonts and should work on any Macintosh (or compatible) running any version of System 7 or Mac OS 8. The fonts may be compatible with System 6.0.8, but that has not been tested. Monaco Tuner requires System 7 or better and has been tested on several machines including a PowerBook 100 running System 7.0.1 and a PowerMac 8100/100 running System 7.5.3 and Mac OS 8 with and without QuickDraw GX.
|
The family of ProFont fonts are standard Macintosh fonts and should work on any Macintosh (or compatible) running any version of System 7 or Mac OS 8. The fonts may be compatible with System 6.0.8, but that has not been tested. Monaco Tuner requires System 7 or better and has been tested on several machines including a PowerBook 100 running System 7.0.1 and a PowerMac 8100/100 running System 7.5.3 and Mac OS 8 with and without QuickDraw GX.
|
||||||
|
|
||||||
• What happens if I have problems with ProFont Distribution?
|
• What happens if I have problems with ProFont Distribution?
|
||||||
|
|
||||||
“ProFont Distribution” is provided in the hope that it will be useful. However, it is provided AS IS and carries NO WARRANTY that it will do anything good and NO WARRANTY that it will not do anything bad. Your use of the fonts and software that make up “ProFont Distribution” is ENTIRELY AT YOUR OWN RISK. SQ Software, Stephen C. Gilardi, Carl R. Osterwald and Tobias Jung hereby disclaim any and all liability for any difficulty you may have as a result of using any part of “ProFont Distribution”. If these terms are not acceptable to you, then you must not use any part of “ProFont Distribution”.
|
“ProFont Distribution” is provided in the hope that it will be useful. However, it is provided AS IS and carries NO WARRANTY that it will do anything good and NO WARRANTY that it will not do anything bad. Your use of the fonts and software that make up “ProFont Distribution” is ENTIRELY AT YOUR OWN RISK. SQ Software, Stephen C. Gilardi, Carl R. Osterwald and Tobias Jung hereby disclaim any and all liability for any difficulty you may have as a result of using any part of “ProFont Distribution”. If these terms are not acceptable to you, then you must not use any part of “ProFont Distribution”.
|
||||||
|
|
||||||
That being said, if you do have any difficulties or any suggestions, I’ll be very appreciative if you let me know about them so I can attempt to improve future releases of ProFont Distribution.
|
That being said, if you do have any difficulties or any suggestions, I’ll be very appreciative if you let me know about them so I can attempt to improve future releases of ProFont Distribution.
|
||||||
|
|
||||||
• How do I install the various versions of ProFont?
|
• How do I install the various versions of ProFont?
|
||||||
|
|
||||||
The various versions of ProFont included in this release are standard Macintosh fonts. You install them into any version of System 7 or Mac OS 8 by dragging the font suitcase containing the font you want to install onto the System Folder icon on your startup disk.
|
The various versions of ProFont included in this release are standard Macintosh fonts. You install them into any version of System 7 or Mac OS 8 by dragging the font suitcase containing the font you want to install onto the System Folder icon on your startup disk.
|
||||||
|
|
||||||
“ProFont 2.2”, “ProFontISOLatin1 2.2”, and “ProFontWindows 2.2” also include ATM versions. Since the System Software prefers TrueType fonts to ATM fonts, special suitcases are included in the distribution which do not contain the TrueType outline version of the font. These suitcases and the corresponding PostScript font files are inside a folder called “ATM Version” within each font’s folder. To install the ATM version of one of these fonts, drag the two files contained in its “ATM Version” folder onto the System Folder icon on your startup disk.
|
“ProFont 2.2”, “ProFontISOLatin1 2.2”, and “ProFontWindows 2.2” also include ATM versions. Since the System Software prefers TrueType fonts to ATM fonts, special suitcases are included in the distribution which do not contain the TrueType outline version of the font. These suitcases and the corresponding PostScript font files are inside a folder called “ATM Version” within each font’s folder. To install the ATM version of one of these fonts, drag the two files contained in its “ATM Version” folder onto the System Folder icon on your startup disk.
|
||||||
|
|
||||||
Note: During testing it was discovered that some internal tables in “ProFontISOLatin1” suitcase can be damaged if you use the Finder to remove the TrueType version by dragging it out of the suitcase. Fortunately, you don’t need to do that because ProFont Distribution includes the suitcase called “ProFontISOLatin1 Bitmaps” which is does not contain the TrueType version. As the instructions above indicate, please use the “ProFontISOLatin1 Bitmaps” suitcase if you want to use ProFontISOLatin1 with ATM.
|
Note: During testing it was discovered that some internal tables in “ProFontISOLatin1” suitcase can be damaged if you use the Finder to remove the TrueType version by dragging it out of the suitcase. Fortunately, you don’t need to do that because ProFont Distribution includes the suitcase called “ProFontISOLatin1 Bitmaps” which is does not contain the TrueType version. As the instructions above indicate, please use the “ProFontISOLatin1 Bitmaps” suitcase if you want to use ProFontISOLatin1 with ATM.
|
||||||
|
|
||||||
• Can I redistribute ProFont Distribution?
|
• Can I redistribute ProFont Distribution?
|
||||||
|
|
||||||
“ProFont Distribution” is Copyright © 1997, SQ Software. The ProFont fonts are Copyright © 1997, Carl R. Osterwald. It is our intention that “ProFont Distribution” get the widest possible distribution. You may redistribute unmodified copies of “ProFont Distriubtion” as long as it is accompanied by an unmodified copy of “About ProFont Distribution 2.2” (this file). You may not charge anyone money for the “ProFont Distribution” package itself. The “ProFont Distribution” package can be distributed for free along with products for which you do charge money. The “ProFont Distribution” package can also be distributed for free as part of collections of more than 10 third party products sold as a collection (such as on the Apprentice CD series). If you do distribute “ProFont Distribution” along with another product or as part of a collection, Stephen C. Gilardi and Carl R. Osterwald would appreciate very much each receiving a complimentary copy of the whole distribution (e.g., any CD-ROM it appears on), but this is not a requirement. If you have questions about redistribution, please contact Stephen C. Gilardi at squeegee@usa.net.
|
“ProFont Distribution” is Copyright © 1997, SQ Software. The ProFont fonts are Copyright © 1997, Carl R. Osterwald. It is our intention that “ProFont Distribution” get the widest possible distribution. You may redistribute unmodified copies of “ProFont Distriubtion” as long as it is accompanied by an unmodified copy of “About ProFont Distribution 2.2” (this file). You may not charge anyone money for the “ProFont Distribution” package itself. The “ProFont Distribution” package can be distributed for free along with products for which you do charge money. The “ProFont Distribution” package can also be distributed for free as part of collections of more than 10 third party products sold as a collection (such as on the Apprentice CD series). If you do distribute “ProFont Distribution” along with another product or as part of a collection, Stephen C. Gilardi and Carl R. Osterwald would appreciate very much each receiving a complimentary copy of the whole distribution (e.g., any CD-ROM it appears on), but this is not a requirement. If you have questions about redistribution, please contact Stephen C. Gilardi at squeegee@usa.net.
|
||||||
|
|
||||||
• Who is responsible for ProFont?
|
• Who is responsible for ProFont?
|
||||||
|
|
||||||
+ Andrew Welch
|
+ Andrew Welch
|
||||||
The original “ProFont” was created by Andrew Welch. It was originally shareware. Andrew generously gave his permission for it to be distributed freely: “let’s make it free though [...] just credit me for making the font in the first place, and you’re good to go!” Andrew’s ProFont 9 font is no longer distributed in the ProFont Distribution, but the fonts included in ProFont Distribution 2.2 are based on it.
|
The original “ProFont” was created by Andrew Welch. It was originally shareware. Andrew generously gave his permission for it to be distributed freely: “let’s make it free though [...] just credit me for making the font in the first place, and you’re good to go!” Andrew’s ProFont 9 font is no longer distributed in the ProFont Distribution, but the fonts included in ProFont Distribution 2.2 are based on it.
|
||||||
|
|
||||||
Thanks Andrew!
|
Thanks Andrew!
|
||||||
|
|
||||||
+ Carl Osterwald
|
+ Carl Osterwald
|
||||||
The fonts included in ProFont Distribution 2.2 were created by Carl Osterwald. Carl created the outline versions of ProFont and implemented the Macintosh Extended ASCII Character Set for all versions of ProFont. Most recently Carl created the ProFontWindows font and did the modifications of the character shapes for ProFont 2.2. Please send praise, comments, etc., about the fonts in “ProFont Distribution 2.2” to him.
|
The fonts included in ProFont Distribution 2.2 were created by Carl Osterwald. Carl created the outline versions of ProFont and implemented the Macintosh Extended ASCII Character Set for all versions of ProFont. Most recently Carl created the ProFontWindows font and did the modifications of the character shapes for ProFont 2.2. Please send praise, comments, etc., about the fonts in “ProFont Distribution 2.2” to him.
|
||||||
|
|
||||||
Thanks Carl!
|
Thanks Carl!
|
||||||
|
|
||||||
Carl can be reached at “carl_osterwald@usa.net”.
|
Carl can be reached at “carl_osterwald@usa.net”.
|
||||||
|
|
||||||
+ Steve Gilardi
|
+ Steve Gilardi
|
||||||
I am the author of the “modern” (post Mac II/Mac SE era) ProFont distributions. I have gotten ProFont to work with successive System releases for my personal use, and have shared the methods with other folks from time to time through these distributions. Most recently I developed the “Monaco Tuner” control panel to ease the use of ProFont as a replacement for Monaco 9. Please send comments, suggestions, and questions about Monaco Tuner, ProFont in general, or the ProFont Distribution as a whole to me.
|
I am the author of the “modern” (post Mac II/Mac SE era) ProFont distributions. I have gotten ProFont to work with successive System releases for my personal use, and have shared the methods with other folks from time to time through these distributions. Most recently I developed the “Monaco Tuner” control panel to ease the use of ProFont as a replacement for Monaco 9. Please send comments, suggestions, and questions about Monaco Tuner, ProFont in general, or the ProFont Distribution as a whole to me.
|
||||||
|
|
||||||
I can be reached at “squeegee@usa.net”.
|
I can be reached at “squeegee@usa.net”.
|
||||||
|
|
||||||
Enjoy ProFont!
|
Enjoy ProFont!
|
||||||
|
|
||||||
--Steve
|
--Steve
|
||||||
|
|
||||||
Stephen C. Gilardi
|
Stephen C. Gilardi
|
||||||
SQ Software
|
SQ Software
|
||||||
21 July 1997
|
21 July 1997
|
||||||
|
|
||||||
• Version History:
|
• Version History:
|
||||||
|
|
||||||
Version 2.2:
|
Version 2.2:
|
||||||
+ ProFont 2.2 and ProFontISOLatin1 2.2 include modifications to several characters
|
+ ProFont 2.2 and ProFontISOLatin1 2.2 include modifications to several characters
|
||||||
for improved readability especially when anti-aliased.
|
for improved readability especially when anti-aliased.
|
||||||
+ Several small bugs fixed in the fonts.
|
+ Several small bugs fixed in the fonts.
|
||||||
+ Improved QuickDraw GX compatibility
|
+ Improved QuickDraw GX compatibility
|
||||||
+ ProFontWindows 2.2 introduced.
|
+ ProFontWindows 2.2 introduced.
|
||||||
+ Monaco Tuner version bumped to 1.1.1 for minor documentation updates.
|
+ Monaco Tuner version bumped to 1.1.1 for minor documentation updates.
|
||||||
|
|
||||||
Version 2.1:
|
Version 2.1:
|
||||||
+ Monaco Tuner 1.1 adds “Resizing of Monaco 9” and works around a bug which
|
+ Monaco Tuner 1.1 adds “Resizing of Monaco 9” and works around a bug which
|
||||||
affected desk accessories on Power Macs.
|
affected desk accessories on Power Macs.
|
||||||
|
|
||||||
Version 2.0:
|
Version 2.0:
|
||||||
+ ProFont 2.0 includes modifications to several characters
|
+ ProFont 2.0 includes modifications to several characters
|
||||||
+ ProFont 2.0 includes a 7 pt bitmap version
|
+ ProFont 2.0 includes a 7 pt bitmap version
|
||||||
+ ProFontISOLatin1 2.0 released in response to requests from international users
|
+ ProFontISOLatin1 2.0 released in response to requests from international users
|
||||||
+ Monaco Tuner 1.0 replaces far-too-complicated “ProFont(Monaco)” installation
|
+ Monaco Tuner 1.0 replaces far-too-complicated “ProFont(Monaco)” installation
|
||||||
instructions
|
instructions
|
||||||
+ ProFontClassic 1.2 is the 9 pt size of ProFont from the version 1.2 release
|
+ ProFontClassic 1.2 is the 9 pt size of ProFont from the version 1.2 release
|
||||||
|
|
||||||
Version 1.2:
|
Version 1.2:
|
||||||
+ Both versions of ProFont now implement the full Macintosh Extended ASCII
|
+ Both versions of ProFont now implement the full Macintosh Extended ASCII
|
||||||
character set.
|
character set.
|
||||||
|
|
||||||
Version 1.1.1:
|
Version 1.1.1:
|
||||||
+ “ProFont Info” (this file) now actually prints on LaserWriters. Sorry!
|
+ “ProFont Info” (this file) now actually prints on LaserWriters. Sorry!
|
||||||
+ Added item labeled “What about Monaco 12?”
|
+ Added item labeled “What about Monaco 12?”
|
||||||
+ Minor editing of “ProFont Info”
|
+ Minor editing of “ProFont Info”
|
||||||
|
|
||||||
Version 1.1:
|
Version 1.1:
|
||||||
+ “ProFont (ProFont)” now includes TrueType and Type 1 Outline Fonts!
|
+ “ProFont (ProFont)” now includes TrueType and Type 1 Outline Fonts!
|
||||||
+ Includes instructions for installation under System 7.5.1.
|
+ Includes instructions for installation under System 7.5.1.
|
||||||
+ I think ProFont needs an installer. If you agree, please read the bullet item labeled
|
+ I think ProFont needs an installer. If you agree, please read the bullet item labeled
|
||||||
“Aren’t those instructions a little bit too complicated?”.
|
“Aren’t those instructions a little bit too complicated?”.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
folder:808080
|
folder:808080
|
||||||
ipod:00B0B0
|
ipod:00B0B0
|
||||||
mp3:00FF00
|
mp3:00FF00
|
||||||
flac:00FF00
|
flac:00FF00
|
||||||
ogg:00FF00
|
ogg:00FF00
|
||||||
txt:FF0000
|
txt:FF0000
|
||||||
cfg:D00000
|
cfg:D00000
|
||||||
|
|
|
@ -1,27 +1,27 @@
|
||||||
/*
|
/*
|
||||||
* (C) Copyright 2007 Catalin Patulea <cat@vv.carleton.ca>
|
* (C) Copyright 2007 Catalin Patulea <cat@vv.carleton.ca>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of
|
* published by the Free Software Foundation; either version 2 of
|
||||||
* the License, or (at your option) any later version.
|
* the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||||
* MA 02111-1307 USA
|
* MA 02111-1307 USA
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifndef DSP_H
|
#ifndef DSP_H
|
||||||
#define DSP_H
|
#define DSP_H
|
||||||
|
|
||||||
/* DSP memory is mapped into ARM space via HPIB. */
|
/* DSP memory is mapped into ARM space via HPIB. */
|
||||||
#define DSP_(addr) (*(volatile unsigned short *)(0x40000 + ((addr) << 1)))
|
#define DSP_(addr) (*(volatile unsigned short *)(0x40000 + ((addr) << 1)))
|
||||||
|
|
||||||
/* A "DSP image" is an array of these, terminated by raw_data_size_half = 0. */
|
/* A "DSP image" is an array of these, terminated by raw_data_size_half = 0. */
|
||||||
struct dsp_section {
|
struct dsp_section {
|
||||||
|
@ -34,9 +34,9 @@ struct dsp_section {
|
||||||
|
|
||||||
/* Must define struct dsp_section before including the image. */
|
/* Must define struct dsp_section before including the image. */
|
||||||
#include "dsp/dsp-image.h"
|
#include "dsp/dsp-image.h"
|
||||||
|
|
||||||
void dsp_wake(void);
|
void dsp_wake(void);
|
||||||
void dsp_load(const struct dsp_section *im);
|
void dsp_load(const struct dsp_section *im);
|
||||||
void dsp_reset(void);
|
void dsp_reset(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,60 +1,60 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 by Maurus Cuelenaere
|
* Copyright (C) 2008 by Maurus Cuelenaere
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "registers.h"
|
#include "registers.h"
|
||||||
|
|
||||||
/* based on http://archopen.svn.sourceforge.net/viewvc/archopen/ArchOpen/trunk/libdsp/aic23.c?revision=213&view=markup */
|
/* based on http://archopen.svn.sourceforge.net/viewvc/archopen/ArchOpen/trunk/libdsp/aic23.c?revision=213&view=markup */
|
||||||
void audiohw_init(void)
|
void audiohw_init(void)
|
||||||
{
|
{
|
||||||
/* port config */
|
/* port config */
|
||||||
#if 0
|
#if 0
|
||||||
SPCR10 = 0; /* DLB = 0 ** RJUST = 0 ** CLKSTP = 0 ** DXENA = 0 ** ABIS = 0 ** RINTM = 0 ** RSYNCER = 0 ** RFULL = 0 ** RRDY = 0 ** RRST = 0 */
|
SPCR10 = 0; /* DLB = 0 ** RJUST = 0 ** CLKSTP = 0 ** DXENA = 0 ** ABIS = 0 ** RINTM = 0 ** RSYNCER = 0 ** RFULL = 0 ** RRDY = 0 ** RRST = 0 */
|
||||||
SPCR20 = (1 << 9); /* FREE = 1 ** SOFT = 0 ** FRST = 0 ** GRST = 0 ** XINTM = 0 ** XSYNCER = 0 ** XEMPTY = 0 ** XRDY = 0 ** XRST = 0 */
|
SPCR20 = (1 << 9); /* FREE = 1 ** SOFT = 0 ** FRST = 0 ** GRST = 0 ** XINTM = 0 ** XSYNCER = 0 ** XEMPTY = 0 ** XRDY = 0 ** XRST = 0 */
|
||||||
RCR10 = (1 << 8) | (2 << 5); /* RFRLEN1 = 1 ** RWDLEN1 = 2 */
|
RCR10 = (1 << 8) | (2 << 5); /* RFRLEN1 = 1 ** RWDLEN1 = 2 */
|
||||||
RCR20 = 0; /* RPHASE = 0 ** RFRLEN2 = 0 ** RWDLEN2 = 0 ** RCOMPAND = 0 ** RFIG = 0 ** RDATDLY = 0 */
|
RCR20 = 0; /* RPHASE = 0 ** RFRLEN2 = 0 ** RWDLEN2 = 0 ** RCOMPAND = 0 ** RFIG = 0 ** RDATDLY = 0 */
|
||||||
XCR10 = (1 << 8) | (2 << 5); /* XFRLEN1 = 1 ** XWDLEN1 = 2 */
|
XCR10 = (1 << 8) | (2 << 5); /* XFRLEN1 = 1 ** XWDLEN1 = 2 */
|
||||||
XCR20 = 0; /* XPHASE = 0 ** XFRLEN2 = 0 ** XWDLEN2 = 0 ** XCOMPAND = 0 ** XFIG = 0 ** XDATDLY = 0 */
|
XCR20 = 0; /* XPHASE = 0 ** XFRLEN2 = 0 ** XWDLEN2 = 0 ** XCOMPAND = 0 ** XFIG = 0 ** XDATDLY = 0 */
|
||||||
SRGR10 = 0; /* FWID = 0 ** CLKGDV = 0 */
|
SRGR10 = 0; /* FWID = 0 ** CLKGDV = 0 */
|
||||||
SRGR20 = 0; /* FREE = 0 ** CLKSP = 0 ** CLKSM = 0 ** FSGM = 0 ** FPER = 0 */
|
SRGR20 = 0; /* FREE = 0 ** CLKSP = 0 ** CLKSM = 0 ** FSGM = 0 ** FPER = 0 */
|
||||||
PCR0 = (1 << 1) | 1; /* IDLEEN = 0 ** XIOEN = 0 ** RIOEN = 0 ** FSXM = 0 ** FSRM = 0 ** SCLKME = 0 ** CLKSSTAT = 0 ** DXSTAT = 0 ** DRSTAT = 0 ** CLKXM = 0 ** CLKRM = 0 ** FSXP = 0 ** FSRP = 0 ** CLKXP = 1 ** CLKRP = 1 */
|
PCR0 = (1 << 1) | 1; /* IDLEEN = 0 ** XIOEN = 0 ** RIOEN = 0 ** FSXM = 0 ** FSRM = 0 ** SCLKME = 0 ** CLKSSTAT = 0 ** DXSTAT = 0 ** DRSTAT = 0 ** CLKXM = 0 ** CLKRM = 0 ** FSXP = 0 ** FSRP = 0 ** CLKXP = 1 ** CLKRP = 1 */
|
||||||
#else
|
#else
|
||||||
SPCR10 = 0;
|
SPCR10 = 0;
|
||||||
SPCR20 = 0x0200; /* SPCR : free running mode */
|
SPCR20 = 0x0200; /* SPCR : free running mode */
|
||||||
|
|
||||||
RCR10 = 0x00A0;
|
RCR10 = 0x00A0;
|
||||||
RCR20 = 0x00A1; /* RCR : 32 bit receive data length */
|
RCR20 = 0x00A1; /* RCR : 32 bit receive data length */
|
||||||
|
|
||||||
XCR10 = 0x00A0;
|
XCR10 = 0x00A0;
|
||||||
XCR20 = 0x00A0; /* XCR : 32 bit transmit data length */
|
XCR20 = 0x00A0; /* XCR : 32 bit transmit data length */
|
||||||
|
|
||||||
SRGR10 = 0;
|
SRGR10 = 0;
|
||||||
SRGR20 = 0x3000; /* SRGR 1 & 2 */
|
SRGR20 = 0x3000; /* SRGR 1 & 2 */
|
||||||
|
|
||||||
PCR0 = 0x000E - 8; /* PCR : FSX, FSR active low, external FS/CLK source */
|
PCR0 = 0x000E - 8; /* PCR : FSX, FSR active low, external FS/CLK source */
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void audiohw_postinit(void)
|
void audiohw_postinit(void)
|
||||||
{
|
{
|
||||||
/* Trigger first XEVT0 */
|
/* Trigger first XEVT0 */
|
||||||
SPCR20 |= 1;
|
SPCR20 |= 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 by Maurus Cuelenaere
|
* Copyright (C) 2008 by Maurus Cuelenaere
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef AUDIO_H
|
#ifndef AUDIO_H
|
||||||
#define AUDIO_H
|
#define AUDIO_H
|
||||||
|
|
||||||
void audiohw_init(void);
|
void audiohw_init(void);
|
||||||
void audiohw_postinit(void);
|
void audiohw_postinit(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,233 +1,233 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 by Catalin Patulea
|
* Copyright (C) 2008 by Catalin Patulea
|
||||||
* Copyright (C) 2008 by Maurus Cuelenaere
|
* Copyright (C) 2008 by Maurus Cuelenaere
|
||||||
* Copyright (C) 2009 by Karl Kurbjun
|
* Copyright (C) 2009 by Karl Kurbjun
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "registers.h"
|
#include "registers.h"
|
||||||
#include "arm.h"
|
#include "arm.h"
|
||||||
#include "ipc.h"
|
#include "ipc.h"
|
||||||
|
|
||||||
/* Size of data buffer in words (16 bit) */
|
/* Size of data buffer in words (16 bit) */
|
||||||
#define DSP_BUFFER_SIZE (0x1000)
|
#define DSP_BUFFER_SIZE (0x1000)
|
||||||
|
|
||||||
/* Put the "data" buffer in it's own .dma section so that it can
|
/* Put the "data" buffer in it's own .dma section so that it can
|
||||||
* be handled in the linker.cmd. */
|
* be handled in the linker.cmd. */
|
||||||
#pragma DATA_SECTION (data, ".dma")
|
#pragma DATA_SECTION (data, ".dma")
|
||||||
|
|
||||||
/* This is the "data" buffer on the DSP side used for SARAM to McBSP (IIS) */
|
/* This is the "data" buffer on the DSP side used for SARAM to McBSP (IIS) */
|
||||||
static signed short data[DSP_BUFFER_SIZE];
|
static signed short data[DSP_BUFFER_SIZE];
|
||||||
|
|
||||||
/* These two describe the location of the buffer on the ARM (set in DSPHINT) */
|
/* These two describe the location of the buffer on the ARM (set in DSPHINT) */
|
||||||
volatile unsigned short sdem_addrh;
|
volatile unsigned short sdem_addrh;
|
||||||
volatile unsigned short sdem_addrl;
|
volatile unsigned short sdem_addrl;
|
||||||
|
|
||||||
/* This is the size of the ARM buffer (set in DSPHINT) */
|
/* This is the size of the ARM buffer (set in DSPHINT) */
|
||||||
volatile unsigned short sdem_dsp_size;
|
volatile unsigned short sdem_dsp_size;
|
||||||
|
|
||||||
/* These two variables keep track of the buffer level in the DSP, dsp_level,
|
/* These two variables keep track of the buffer level in the DSP, dsp_level,
|
||||||
* (SARAM to McBSP) and the level on the ARM buffer (sdem_level).
|
* (SARAM to McBSP) and the level on the ARM buffer (sdem_level).
|
||||||
* sdem_level is used in the main firmware to keep track of the current
|
* sdem_level is used in the main firmware to keep track of the current
|
||||||
* playback status. dsp_level is only used in this function. */
|
* playback status. dsp_level is only used in this function. */
|
||||||
static unsigned short dsp_level;
|
static unsigned short dsp_level;
|
||||||
volatile unsigned short sdem_level;
|
volatile unsigned short sdem_level;
|
||||||
|
|
||||||
/* This is used to keep track of the last SDRAM to SARAM transfer */
|
/* This is used to keep track of the last SDRAM to SARAM transfer */
|
||||||
static unsigned short last_size;
|
static unsigned short last_size;
|
||||||
|
|
||||||
/* This tells us which half of the DSP buffer (data) is free */
|
/* This tells us which half of the DSP buffer (data) is free */
|
||||||
static unsigned short dma0_unlocked;
|
static unsigned short dma0_unlocked;
|
||||||
|
|
||||||
/* This is used by the ARM to flag playback status and start/stop the DMA
|
/* This is used by the ARM to flag playback status and start/stop the DMA
|
||||||
* transfers. */
|
* transfers. */
|
||||||
volatile unsigned short dma0_stopped;
|
volatile unsigned short dma0_stopped;
|
||||||
|
|
||||||
/* This is used to effectively flag whether the ARM has new data ready or not */
|
/* This is used to effectively flag whether the ARM has new data ready or not */
|
||||||
short waiting;
|
short waiting;
|
||||||
|
|
||||||
|
|
||||||
/* rebuffer sets up the next SDRAM to SARAM transfer and tells the ARM when DMA
|
/* rebuffer sets up the next SDRAM to SARAM transfer and tells the ARM when DMA
|
||||||
* needs a new buffer.
|
* needs a new buffer.
|
||||||
*
|
*
|
||||||
* Note: The upper limit on larger buffers is the size of a short. If larger
|
* Note: The upper limit on larger buffers is the size of a short. If larger
|
||||||
* buffer sizes are needed the code on the ARM side needs to be changed to
|
* buffer sizes are needed the code on the ARM side needs to be changed to
|
||||||
* update a full long.
|
* update a full long.
|
||||||
*/
|
*/
|
||||||
void rebuffer(void)
|
void rebuffer(void)
|
||||||
{
|
{
|
||||||
unsigned long sdem_addr;
|
unsigned long sdem_addr;
|
||||||
|
|
||||||
if(dma0_stopped==1 || dma0_stopped==2) /* Stop / Pause */
|
if(dma0_stopped==1 || dma0_stopped==2) /* Stop / Pause */
|
||||||
{
|
{
|
||||||
/* Stop MCBSP DMA0 */
|
/* Stop MCBSP DMA0 */
|
||||||
DMPREC &= 0xFFFE;
|
DMPREC &= 0xFFFE;
|
||||||
/* Shut the transmitter down */
|
/* Shut the transmitter down */
|
||||||
audiohw_stop();
|
audiohw_stop();
|
||||||
|
|
||||||
/* Stop the HPIB transfer if it is running */
|
/* Stop the HPIB transfer if it is running */
|
||||||
DMA_TRG = 0;
|
DMA_TRG = 0;
|
||||||
|
|
||||||
/* Reset the following variables for DMA restart */
|
/* Reset the following variables for DMA restart */
|
||||||
sdem_level = 0;
|
sdem_level = 0;
|
||||||
dsp_level = 0;
|
dsp_level = 0;
|
||||||
last_size = 0;
|
last_size = 0;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the sdem_level is equal to the buffer size the ARM code gave
|
/* If the sdem_level is equal to the buffer size the ARM code gave
|
||||||
* (sdem_dsp_size) then reset the size and ask the arm for another buffer
|
* (sdem_dsp_size) then reset the size and ask the arm for another buffer
|
||||||
*/
|
*/
|
||||||
if(sdem_level == sdem_dsp_size)
|
if(sdem_level == sdem_dsp_size)
|
||||||
{
|
{
|
||||||
sdem_level=0;
|
sdem_level=0;
|
||||||
|
|
||||||
/* Get a new buffer (location and size) from ARM */
|
/* Get a new buffer (location and size) from ARM */
|
||||||
status.msg = MSG_REFILL;
|
status.msg = MSG_REFILL;
|
||||||
waiting=1;
|
waiting=1;
|
||||||
|
|
||||||
/* trigger DSPHINT on the ARM */
|
/* trigger DSPHINT on the ARM */
|
||||||
int_arm();
|
int_arm();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!waiting)
|
if(!waiting)
|
||||||
{
|
{
|
||||||
/* Size is in bytes (but forced 32 bit transfers). Comparison is
|
/* Size is in bytes (but forced 32 bit transfers). Comparison is
|
||||||
* against DSP_BUFFER_SIZE because it is in words and this needs to
|
* against DSP_BUFFER_SIZE because it is in words and this needs to
|
||||||
* compare against half the total size in bytes. */
|
* compare against half the total size in bytes. */
|
||||||
if( dsp_level + sdem_dsp_size - sdem_level > DSP_BUFFER_SIZE)
|
if( dsp_level + sdem_dsp_size - sdem_level > DSP_BUFFER_SIZE)
|
||||||
{
|
{
|
||||||
last_size = DSP_BUFFER_SIZE - dsp_level;
|
last_size = DSP_BUFFER_SIZE - dsp_level;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
last_size = sdem_dsp_size - sdem_level;
|
last_size = sdem_dsp_size - sdem_level;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DSP addresses are 16 bit (word). dsp_level is in bytes so it needs to
|
/* DSP addresses are 16 bit (word). dsp_level is in bytes so it needs to
|
||||||
* be converted to words. */
|
* be converted to words. */
|
||||||
DSP_ADDRL = (unsigned short)data + dma0_unlocked + (dsp_level >> 1);
|
DSP_ADDRL = (unsigned short)data + dma0_unlocked + (dsp_level >> 1);
|
||||||
DSP_ADDRH = 0;
|
DSP_ADDRH = 0;
|
||||||
|
|
||||||
/* SDRAM addresses are 8 bit (byte)
|
/* SDRAM addresses are 8 bit (byte)
|
||||||
* Warning: These addresses are forced to 32 bit alignment!
|
* Warning: These addresses are forced to 32 bit alignment!
|
||||||
*/
|
*/
|
||||||
sdem_addr = ((unsigned long)sdem_addrh << 16 | sdem_addrl) + sdem_level;
|
sdem_addr = ((unsigned long)sdem_addrh << 16 | sdem_addrl) + sdem_level;
|
||||||
SDEM_ADDRL = sdem_addr & 0xffff;
|
SDEM_ADDRL = sdem_addr & 0xffff;
|
||||||
SDEM_ADDRH = sdem_addr >> 16;
|
SDEM_ADDRH = sdem_addr >> 16;
|
||||||
|
|
||||||
/* Set the size of the SDRAM to SARAM transfer (demac transfer) */
|
/* Set the size of the SDRAM to SARAM transfer (demac transfer) */
|
||||||
DMA_SIZE = last_size;
|
DMA_SIZE = last_size;
|
||||||
|
|
||||||
DMA_CTRL = 0;
|
DMA_CTRL = 0;
|
||||||
|
|
||||||
/* These are just debug signals that are not used/needed right now */
|
/* These are just debug signals that are not used/needed right now */
|
||||||
status.payload.refill._DMA_TRG = DMA_TRG;
|
status.payload.refill._DMA_TRG = DMA_TRG;
|
||||||
status.payload.refill._SDEM_ADDRH = SDEM_ADDRH;
|
status.payload.refill._SDEM_ADDRH = SDEM_ADDRH;
|
||||||
status.payload.refill._SDEM_ADDRL = SDEM_ADDRL;
|
status.payload.refill._SDEM_ADDRL = SDEM_ADDRL;
|
||||||
status.payload.refill._DSP_ADDRH = DSP_ADDRH;
|
status.payload.refill._DSP_ADDRH = DSP_ADDRH;
|
||||||
status.payload.refill._DSP_ADDRL = DSP_ADDRL;
|
status.payload.refill._DSP_ADDRL = DSP_ADDRL;
|
||||||
|
|
||||||
/* Start the demac transfer */
|
/* Start the demac transfer */
|
||||||
DMA_TRG = 1;
|
DMA_TRG = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This interupt handler is for the SARAM (on DSP) to McBSP IIS DMA transfer.
|
/* This interupt handler is for the SARAM (on DSP) to McBSP IIS DMA transfer.
|
||||||
* It interupts at 1/2 empty and empty so that we can start filling a new buffer
|
* It interupts at 1/2 empty and empty so that we can start filling a new buffer
|
||||||
* from SDRAM when a half is free. dsp_level should always be full when this
|
* from SDRAM when a half is free. dsp_level should always be full when this
|
||||||
* interupt occurs except for the initial start. */
|
* interupt occurs except for the initial start. */
|
||||||
interrupt void handle_dma0(void)
|
interrupt void handle_dma0(void)
|
||||||
{
|
{
|
||||||
/* Byte offset to half-buffer locked by DMA0.
|
/* Byte offset to half-buffer locked by DMA0.
|
||||||
0 for top, DSP_BUFFER_SIZE/2 for bottom */
|
0 for top, DSP_BUFFER_SIZE/2 for bottom */
|
||||||
unsigned short dma0_locked;
|
unsigned short dma0_locked;
|
||||||
|
|
||||||
IFR = 1 << 6;
|
IFR = 1 << 6;
|
||||||
|
|
||||||
/* DMSRC0 is the beginning of the DMA0-locked SARAM half-buffer. */
|
/* DMSRC0 is the beginning of the DMA0-locked SARAM half-buffer. */
|
||||||
DMSA = 0x00 /* DMSRC0 (banked register, see page 133 of SPRU302B */;
|
DMSA = 0x00 /* DMSRC0 (banked register, see page 133 of SPRU302B */;
|
||||||
|
|
||||||
/* Note that these address offsets (dma0_locked and dma0_unlocked are in
|
/* Note that these address offsets (dma0_locked and dma0_unlocked are in
|
||||||
* words. */
|
* words. */
|
||||||
dma0_locked = DMSDN & (DSP_BUFFER_SIZE>>1);
|
dma0_locked = DMSDN & (DSP_BUFFER_SIZE>>1);
|
||||||
dma0_unlocked = dma0_locked ^ (DSP_BUFFER_SIZE>>1);
|
dma0_unlocked = dma0_locked ^ (DSP_BUFFER_SIZE>>1);
|
||||||
|
|
||||||
dsp_level = 0;
|
dsp_level = 0;
|
||||||
|
|
||||||
/* Start the SDRAM to SARAM copy */
|
/* Start the SDRAM to SARAM copy */
|
||||||
rebuffer();
|
rebuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This interupt handler runs every time a DMA transfer is complete from SDRAM
|
/* This interupt handler runs every time a DMA transfer is complete from SDRAM
|
||||||
* to the SARAM buffer. It is used to update the SARAM buffer level
|
* to the SARAM buffer. It is used to update the SARAM buffer level
|
||||||
* (dsp_level), the SDRAM buffer level (sdem_level) and to rebuffer if the dsp
|
* (dsp_level), the SDRAM buffer level (sdem_level) and to rebuffer if the dsp
|
||||||
* buffer is not full. */
|
* buffer is not full. */
|
||||||
interrupt void handle_dmac(void) {
|
interrupt void handle_dmac(void) {
|
||||||
IFR = 1 << 11; /* Clear interrupt */
|
IFR = 1 << 11; /* Clear interrupt */
|
||||||
|
|
||||||
/* dsp_level and sdem_level are in bytes */
|
/* dsp_level and sdem_level are in bytes */
|
||||||
dsp_level += last_size;
|
dsp_level += last_size;
|
||||||
sdem_level += last_size;
|
sdem_level += last_size;
|
||||||
|
|
||||||
/* compare to DSP_BUFFER_SIZE without a divide because it is in words and
|
/* compare to DSP_BUFFER_SIZE without a divide because it is in words and
|
||||||
* we want half the total size in bytes. */
|
* we want half the total size in bytes. */
|
||||||
if(dsp_level < DSP_BUFFER_SIZE)
|
if(dsp_level < DSP_BUFFER_SIZE)
|
||||||
{
|
{
|
||||||
rebuffer();
|
rebuffer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dma_init(void) {
|
void dma_init(void) {
|
||||||
/* Initialize some of the global variables to known values avoiding the
|
/* Initialize some of the global variables to known values avoiding the
|
||||||
* .cinit section. */
|
* .cinit section. */
|
||||||
dsp_level = 0;
|
dsp_level = 0;
|
||||||
sdem_level = 0;
|
sdem_level = 0;
|
||||||
|
|
||||||
last_size = 0;
|
last_size = 0;
|
||||||
dma0_unlocked = 0;
|
dma0_unlocked = 0;
|
||||||
dma0_stopped = 1;
|
dma0_stopped = 1;
|
||||||
|
|
||||||
waiting = 0;
|
waiting = 0;
|
||||||
|
|
||||||
/* Configure SARAM to McBSP DMA */
|
/* Configure SARAM to McBSP DMA */
|
||||||
|
|
||||||
/* Event XEVT0, 32-bit transfers, 0 frame count */
|
/* Event XEVT0, 32-bit transfers, 0 frame count */
|
||||||
DMSFC0 = 2 << 12 | 1 << 11;
|
DMSFC0 = 2 << 12 | 1 << 11;
|
||||||
|
|
||||||
/* Interrupts generated, Half and full buffer.
|
/* Interrupts generated, Half and full buffer.
|
||||||
* ABU mode, From data space with postincrement, to data space with no
|
* ABU mode, From data space with postincrement, to data space with no
|
||||||
* change
|
* change
|
||||||
*/
|
*/
|
||||||
DMMCR0 = 1 << 14 | 1 << 13 |
|
DMMCR0 = 1 << 14 | 1 << 13 |
|
||||||
1 << 12 | 1 << 8 | 1 << 6 | 1;
|
1 << 12 | 1 << 8 | 1 << 6 | 1;
|
||||||
|
|
||||||
/* Set the source (incrementing) location */
|
/* Set the source (incrementing) location */
|
||||||
DMSRC0 = (unsigned short)&data;
|
DMSRC0 = (unsigned short)&data;
|
||||||
|
|
||||||
/* Set the destination (static) location to the McBSP IIS interface */
|
/* Set the destination (static) location to the McBSP IIS interface */
|
||||||
DMDST0 = (unsigned short)&DXR20;
|
DMDST0 = (unsigned short)&DXR20;
|
||||||
|
|
||||||
/* Set the size of the buffer */
|
/* Set the size of the buffer */
|
||||||
DMCTR0 = sizeof(data);
|
DMCTR0 = sizeof(data);
|
||||||
|
|
||||||
/* Setup DMA0 interrupts and start the transfer */
|
/* Setup DMA0 interrupts and start the transfer */
|
||||||
DMPREC = 2 << 6;
|
DMPREC = 2 << 6;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,32 +1,32 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 by Maurus Cuelenaere
|
* Copyright (C) 2008 by Maurus Cuelenaere
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef DMA_H
|
#ifndef DMA_H
|
||||||
#define DMA_H
|
#define DMA_H
|
||||||
|
|
||||||
void dma_init(void);
|
void dma_init(void);
|
||||||
void rebuffer(void);
|
void rebuffer(void);
|
||||||
|
|
||||||
extern int waiting;
|
extern int waiting;
|
||||||
|
|
||||||
extern volatile unsigned short dma0_stopped;
|
extern volatile unsigned short dma0_stopped;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,46 +1,46 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 by Catalin Patulea
|
* Copyright (C) 2008 by Catalin Patulea
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "registers.h"
|
#include "registers.h"
|
||||||
|
|
||||||
void audiohw_init(void)
|
void audiohw_init(void)
|
||||||
{
|
{
|
||||||
/* Configure McBSP */
|
/* Configure McBSP */
|
||||||
SPCR10 = 0; /* Receiver reset */
|
SPCR10 = 0; /* Receiver reset */
|
||||||
SPCR20 = 3 << 4; /* Rate gen disabled, RINT=XSYNCERR, TX disabled for now */
|
SPCR20 = 3 << 4; /* Rate gen disabled, RINT=XSYNCERR, TX disabled for now */
|
||||||
PCR0 = 1 << 1; /* Serial port pins, external frame sync, external clock,
|
PCR0 = 1 << 1; /* Serial port pins, external frame sync, external clock,
|
||||||
frame sync FSX is active-high,
|
frame sync FSX is active-high,
|
||||||
TX data sampled on falling clock */
|
TX data sampled on falling clock */
|
||||||
XCR10 = 0x00a0; /* 1 word per frame, 32 bits per word */
|
XCR10 = 0x00a0; /* 1 word per frame, 32 bits per word */
|
||||||
XCR20 = 0; /* Single-phase, unexpected frame pulse restarts xfer,
|
XCR20 = 0; /* Single-phase, unexpected frame pulse restarts xfer,
|
||||||
0-bit data delay */
|
0-bit data delay */
|
||||||
}
|
|
||||||
|
|
||||||
void audiohw_start(void)
|
|
||||||
{
|
|
||||||
/* Trigger first XEVT0 */
|
|
||||||
SPCR20 |= 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void audiohw_start(void)
|
||||||
|
{
|
||||||
|
/* Trigger first XEVT0 */
|
||||||
|
SPCR20 |= 1;
|
||||||
|
}
|
||||||
|
|
||||||
void audiohw_stop(void)
|
void audiohw_stop(void)
|
||||||
{
|
{
|
||||||
/* Reset the transmitter */
|
/* Reset the transmitter */
|
||||||
|
|
|
@ -1,31 +1,31 @@
|
||||||
#ifndef DSP_IMAGE_HELLOWORLD
|
#ifndef DSP_IMAGE_HELLOWORLD
|
||||||
#define DSP_IMAGE_HELLOWORLD
|
#define DSP_IMAGE_HELLOWORLD
|
||||||
/*
|
/*
|
||||||
* This is just a dummy DSP image so that dsp-dm320.c compiles.
|
* This is just a dummy DSP image so that dsp-dm320.c compiles.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of
|
* published by the Free Software Foundation; either version 2 of
|
||||||
* the License, or (at your option) any later version.
|
* the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||||
* MA 02111-1307 USA
|
* MA 02111-1307 USA
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const struct dsp_section dsp_image_helloworld[] = {
|
static const struct dsp_section dsp_image_helloworld[] = {
|
||||||
{NULL, 0, 0}
|
{NULL, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Symbol table, usable with the DSP_() macro (see dsp-target.h). */
|
/* Symbol table, usable with the DSP_() macro (see dsp-target.h). */
|
||||||
#define _status 0x0000
|
#define _status 0x0000
|
||||||
#define _acked 0x0000
|
#define _acked 0x0000
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,32 +1,32 @@
|
||||||
/*
|
/*
|
||||||
* (C) Copyright 2007 Catalin Patulea <cat@vv.carleton.ca>
|
* (C) Copyright 2007 Catalin Patulea <cat@vv.carleton.ca>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
* published by the Free Software Foundation; either version 2 of
|
* published by the Free Software Foundation; either version 2 of
|
||||||
* the License, or (at your option) any later version.
|
* the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||||
* MA 02111-1307 USA
|
* MA 02111-1307 USA
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifndef UART_H
|
#ifndef UART_H
|
||||||
#define UART_H
|
#define UART_H
|
||||||
|
|
||||||
void uart_init(void);
|
void uart_init(void);
|
||||||
bool uart1_available(void);
|
bool uart1_available(void);
|
||||||
|
|
||||||
int uart1_gets_queue(char *, int);
|
int uart1_gets_queue(char *, int);
|
||||||
void uart1_puts(const char *str, int size);
|
void uart1_puts(const char *str, int size);
|
||||||
void uart1_gets(char *str, int size);
|
void uart1_gets(char *str, int size);
|
||||||
void uart1_putc(char ch);
|
void uart1_putc(char ch);
|
||||||
|
|
||||||
void uart1_clear_queue(void);
|
void uart1_clear_queue(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
@ -1,2 +1,2 @@
|
||||||
SUBDIRS = rbutilqt
|
SUBDIRS = rbutilqt
|
||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
|
@ -1,25 +1,25 @@
|
||||||
CFLAGS=-Wall -W -D_LARGEFILE64_SOURCE
|
CFLAGS=-Wall -W -D_LARGEFILE64_SOURCE
|
||||||
|
|
||||||
ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN)
|
ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN)
|
||||||
CROSS=
|
CROSS=
|
||||||
CFLAGS+=-mno-cygwin
|
CFLAGS+=-mno-cygwin
|
||||||
else
|
else
|
||||||
ifeq ($(findstring MINGW,$(shell uname)),MINGW)
|
ifeq ($(findstring MINGW,$(shell uname)),MINGW)
|
||||||
CROSS=
|
CROSS=
|
||||||
else
|
else
|
||||||
CROSS=i586-mingw32msvc-
|
CROSS=i586-mingw32msvc-
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
NATIVECC = gcc
|
NATIVECC = gcc
|
||||||
CC = $(CROSS)gcc
|
CC = $(CROSS)gcc
|
||||||
WINDRES = $(CROSS)windres
|
WINDRES = $(CROSS)windres
|
||||||
|
|
||||||
|
|
||||||
all: bin2c
|
all: bin2c
|
||||||
|
|
||||||
bin2c: bin2c.c
|
bin2c: bin2c.c
|
||||||
$(NATIVECC) $(CFLAGS) -o bin2c bin2c.c
|
$(NATIVECC) $(CFLAGS) -o bin2c bin2c.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) bin2c bin2c.exe
|
$(RM) bin2c bin2c.exe
|
||||||
|
|
|
@ -1,232 +1,232 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (c) 2009, Dave Chapman
|
* Copyright (c) 2009, Dave Chapman
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
* met:
|
* met:
|
||||||
*
|
*
|
||||||
* * Redistributions of source code must retain the above copyright
|
* * Redistributions of source code must retain the above copyright
|
||||||
* notice, this list of conditions and the following disclaimer.
|
* notice, this list of conditions and the following disclaimer.
|
||||||
*
|
*
|
||||||
* * Redistributions in binary form must reproduce the above
|
* * Redistributions in binary form must reproduce the above
|
||||||
* copyright notice, this list of conditions and the following
|
* copyright notice, this list of conditions and the following
|
||||||
* disclaimer in the documentation and/or other materials provided
|
* disclaimer in the documentation and/or other materials provided
|
||||||
* with the distribution.
|
* with the distribution.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
#include "mtp_common.h"
|
#include "mtp_common.h"
|
||||||
|
|
||||||
#include "../MTP_DLL/MTP_DLL.h"
|
#include "../MTP_DLL/MTP_DLL.h"
|
||||||
|
|
||||||
|
|
||||||
static int filesize(const char* filename);
|
static int filesize(const char* filename);
|
||||||
|
|
||||||
|
|
||||||
int mtp_init(struct mtp_info_t* mtp_info)
|
int mtp_init(struct mtp_info_t* mtp_info)
|
||||||
{
|
{
|
||||||
/* Fill the info struct with zeros - mainly for the strings */
|
/* Fill the info struct with zeros - mainly for the strings */
|
||||||
memset(mtp_info, 0, sizeof(struct mtp_info_t));
|
memset(mtp_info, 0, sizeof(struct mtp_info_t));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int mtp_finished(struct mtp_info_t* mtp_info)
|
int mtp_finished(struct mtp_info_t* mtp_info)
|
||||||
{
|
{
|
||||||
(void)mtp_info;
|
(void)mtp_info;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mtp_scan(struct mtp_info_t* mtp_info)
|
int mtp_scan(struct mtp_info_t* mtp_info)
|
||||||
{
|
{
|
||||||
wchar_t name[256];
|
wchar_t name[256];
|
||||||
wchar_t manufacturer[256];
|
wchar_t manufacturer[256];
|
||||||
DWORD version;
|
DWORD version;
|
||||||
int num = 0;
|
int num = 0;
|
||||||
|
|
||||||
num = mtp_description(name, manufacturer, &version);
|
num = mtp_description(name, manufacturer, &version);
|
||||||
|
|
||||||
wcstombs(mtp_info->manufacturer, manufacturer, 200);
|
wcstombs(mtp_info->manufacturer, manufacturer, 200);
|
||||||
wcstombs(mtp_info->modelname, name, 200);
|
wcstombs(mtp_info->modelname, name, 200);
|
||||||
|
|
||||||
sprintf(mtp_info->version, "%x", (unsigned int)version);
|
sprintf(mtp_info->version, "%x", (unsigned int)version);
|
||||||
return (num > 0) ? num : -1;
|
return (num > 0) ? num : -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void callback(unsigned int progress, unsigned int max)
|
static void callback(unsigned int progress, unsigned int max)
|
||||||
{
|
{
|
||||||
int percent = (progress * 100) / max;
|
int percent = (progress * 100) / max;
|
||||||
|
|
||||||
printf("[INFO] Progress: %u of %u (%d%%)\r", progress, max, percent);
|
printf("[INFO] Progress: %u of %u (%d%%)\r", progress, max, percent);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int mtp_send_firmware(struct mtp_info_t* mtp_info, unsigned char* fwbuf,
|
int mtp_send_firmware(struct mtp_info_t* mtp_info, unsigned char* fwbuf,
|
||||||
int fwsize)
|
int fwsize)
|
||||||
{
|
{
|
||||||
HANDLE hTempFile;
|
HANDLE hTempFile;
|
||||||
DWORD dwRetVal;
|
DWORD dwRetVal;
|
||||||
DWORD dwBytesWritten;
|
DWORD dwBytesWritten;
|
||||||
UINT uRetVal;
|
UINT uRetVal;
|
||||||
TCHAR szTempName[1024];
|
TCHAR szTempName[1024];
|
||||||
TCHAR lpPathBuffer[1024];
|
TCHAR lpPathBuffer[1024];
|
||||||
BOOL fSuccess;
|
BOOL fSuccess;
|
||||||
wchar_t *tmp;
|
wchar_t *tmp;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
(void)mtp_info;
|
(void)mtp_info;
|
||||||
|
|
||||||
/* Get the path for temporary files */
|
/* Get the path for temporary files */
|
||||||
dwRetVal = GetTempPath(sizeof(lpPathBuffer), lpPathBuffer);
|
dwRetVal = GetTempPath(sizeof(lpPathBuffer), lpPathBuffer);
|
||||||
if (dwRetVal > sizeof(lpPathBuffer) || (dwRetVal == 0))
|
if (dwRetVal > sizeof(lpPathBuffer) || (dwRetVal == 0))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] GetTempPath failed (%d)\n", (int)GetLastError());
|
fprintf(stderr, "[ERR] GetTempPath failed (%d)\n", (int)GetLastError());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the temporary file */
|
/* Create the temporary file */
|
||||||
uRetVal = GetTempFileName(lpPathBuffer, TEXT("NKBIN"), 0, szTempName);
|
uRetVal = GetTempFileName(lpPathBuffer, TEXT("NKBIN"), 0, szTempName);
|
||||||
if (uRetVal == 0)
|
if (uRetVal == 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] GetTempFileName failed (%d)\n", (int)GetLastError());
|
fprintf(stderr, "[ERR] GetTempFileName failed (%d)\n", (int)GetLastError());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now create the file */
|
/* Now create the file */
|
||||||
hTempFile = CreateFile((LPTSTR) szTempName, // file name
|
hTempFile = CreateFile((LPTSTR) szTempName, // file name
|
||||||
GENERIC_READ | GENERIC_WRITE, // open r-w
|
GENERIC_READ | GENERIC_WRITE, // open r-w
|
||||||
0, // do not share
|
0, // do not share
|
||||||
NULL, // default security
|
NULL, // default security
|
||||||
CREATE_ALWAYS, // overwrite existing
|
CREATE_ALWAYS, // overwrite existing
|
||||||
FILE_ATTRIBUTE_NORMAL,// normal file
|
FILE_ATTRIBUTE_NORMAL,// normal file
|
||||||
NULL); // no template
|
NULL); // no template
|
||||||
if (hTempFile == INVALID_HANDLE_VALUE)
|
if (hTempFile == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Could not create %s\n", szTempName);
|
fprintf(stderr, "[ERR] Could not create %s\n", szTempName);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fSuccess = WriteFile(hTempFile, fwbuf, fwsize, &dwBytesWritten, NULL);
|
fSuccess = WriteFile(hTempFile, fwbuf, fwsize, &dwBytesWritten, NULL);
|
||||||
if (!fSuccess)
|
if (!fSuccess)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] WriteFile failed (%d)\n", (int)GetLastError());
|
fprintf(stderr, "[ERR] WriteFile failed (%d)\n", (int)GetLastError());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fSuccess = CloseHandle (hTempFile);
|
fSuccess = CloseHandle (hTempFile);
|
||||||
if (!fSuccess)
|
if (!fSuccess)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] CloseHandle failed (%d)\n", (int)GetLastError());
|
fprintf(stderr, "[ERR] CloseHandle failed (%d)\n", (int)GetLastError());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp = (LPWSTR)malloc(_tcslen(szTempName)*2+1);
|
tmp = (LPWSTR)malloc(_tcslen(szTempName)*2+1);
|
||||||
mbstowcs(tmp, (char*)szTempName, _tcslen(szTempName)*2+1);
|
mbstowcs(tmp, (char*)szTempName, _tcslen(szTempName)*2+1);
|
||||||
|
|
||||||
fprintf(stderr, "[INFO] Sending firmware...\n");
|
fprintf(stderr, "[INFO] Sending firmware...\n");
|
||||||
if (mtp_sendnk(tmp, fwsize, &callback))
|
if (mtp_sendnk(tmp, fwsize, &callback))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
fprintf(stderr, "[INFO] Firmware sent successfully\n");
|
fprintf(stderr, "[INFO] Firmware sent successfully\n");
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
fprintf(stderr, "[ERR] Error occured during sending.\n");
|
fprintf(stderr, "[ERR] Error occured during sending.\n");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
free(tmp);
|
free(tmp);
|
||||||
|
|
||||||
if (!DeleteFile(szTempName))
|
if (!DeleteFile(szTempName))
|
||||||
fprintf(stderr,"[WARN] Could not remove temporary file %s\n",szTempName);
|
fprintf(stderr,"[WARN] Could not remove temporary file %s\n",szTempName);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int mtp_send_file(struct mtp_info_t* mtp_info, const char* filename)
|
int mtp_send_file(struct mtp_info_t* mtp_info, const char* filename)
|
||||||
{
|
{
|
||||||
wchar_t *fn;
|
wchar_t *fn;
|
||||||
|
|
||||||
fn = (LPWSTR)malloc(strlen(filename)*2+1);
|
fn = (LPWSTR)malloc(strlen(filename)*2+1);
|
||||||
mbstowcs(fn, filename, strlen(filename)*2+1);
|
mbstowcs(fn, filename, strlen(filename)*2+1);
|
||||||
|
|
||||||
if (mtp_init(mtp_info) < 0) {
|
if (mtp_init(mtp_info) < 0) {
|
||||||
fprintf(stderr,"[ERR] Can not init MTP\n");
|
fprintf(stderr,"[ERR] Can not init MTP\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* Scan for attached MTP devices. */
|
/* Scan for attached MTP devices. */
|
||||||
if (mtp_scan(mtp_info) < 0)
|
if (mtp_scan(mtp_info) < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"[ERR] No devices found\n");
|
fprintf(stderr,"[ERR] No devices found\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "[INFO] Sending firmware...\n");
|
fprintf(stderr, "[INFO] Sending firmware...\n");
|
||||||
if (mtp_sendnk(fn, filesize(filename), &callback))
|
if (mtp_sendnk(fn, filesize(filename), &callback))
|
||||||
{
|
{
|
||||||
/* keep progress on screen */
|
/* keep progress on screen */
|
||||||
printf("\n");
|
printf("\n");
|
||||||
fprintf(stderr, "[INFO] Firmware sent successfully\n");
|
fprintf(stderr, "[INFO] Firmware sent successfully\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Error occured during sending.\n");
|
fprintf(stderr, "[ERR] Error occured during sending.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
mtp_finished(mtp_info);
|
mtp_finished(mtp_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int filesize(const char* filename)
|
static int filesize(const char* filename)
|
||||||
{
|
{
|
||||||
struct _stat sb;
|
struct _stat sb;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
res = _stat(filename, &sb);
|
res = _stat(filename, &sb);
|
||||||
if(res == -1) {
|
if(res == -1) {
|
||||||
fprintf(stderr, "Error getting filesize!\n");
|
fprintf(stderr, "Error getting filesize!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return sb.st_size;
|
return sb.st_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,87 +1,87 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 Maurus Cuelenaere
|
* Copyright (C) 2008 Maurus Cuelenaere
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "MTP_DLL/MTP_DLL.h"
|
#include "MTP_DLL/MTP_DLL.h"
|
||||||
|
|
||||||
void usage(void)
|
void usage(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "usage: sendfirm <local filename>\n");
|
fprintf(stderr, "usage: sendfirm <local filename>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int filesize(char* filename)
|
int filesize(char* filename)
|
||||||
{
|
{
|
||||||
FILE* fd;
|
FILE* fd;
|
||||||
int tmp;
|
int tmp;
|
||||||
fd = fopen(filename, "r");
|
fd = fopen(filename, "r");
|
||||||
if(fd == NULL)
|
if(fd == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Error while opening %s!\n", filename);
|
fprintf(stderr, "Error while opening %s!\n", filename);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fseek(fd, 0, SEEK_END);
|
fseek(fd, 0, SEEK_END);
|
||||||
tmp = ftell(fd);
|
tmp = ftell(fd);
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void callback(unsigned int progress, unsigned int max)
|
void callback(unsigned int progress, unsigned int max)
|
||||||
{
|
{
|
||||||
unsigned int normalized = progress*1000/max;
|
unsigned int normalized = progress*1000/max;
|
||||||
printf("Progress: %d.%d%%\r", normalized/10, normalized%10);
|
printf("Progress: %d.%d%%\r", normalized/10, normalized%10);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
usage();
|
usage();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t *tmp;
|
wchar_t *tmp;
|
||||||
|
|
||||||
tmp = (LPWSTR)malloc(strlen(argv[1])*2+1);
|
tmp = (LPWSTR)malloc(strlen(argv[1])*2+1);
|
||||||
mbstowcs(tmp, argv[1], strlen(argv[1])*2+1);
|
mbstowcs(tmp, argv[1], strlen(argv[1])*2+1);
|
||||||
|
|
||||||
wprintf(tmp);
|
wprintf(tmp);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
fprintf(stdout, "Sending firmware...\n");
|
fprintf(stdout, "Sending firmware...\n");
|
||||||
|
|
||||||
if(mtp_sendnk(tmp, filesize(argv[1]), &callback))
|
if(mtp_sendnk(tmp, filesize(argv[1]), &callback))
|
||||||
fprintf(stdout, "Firmware sent successfully!\n");
|
fprintf(stdout, "Firmware sent successfully!\n");
|
||||||
else
|
else
|
||||||
fprintf(stdout, "Error occured during sending!\n");
|
fprintf(stdout, "Error occured during sending!\n");
|
||||||
|
|
||||||
free(tmp);
|
free(tmp);
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,423 +1,423 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define ULONG uint32_t
|
#define ULONG uint32_t
|
||||||
#define UCHAR uint8_t
|
#define UCHAR uint8_t
|
||||||
|
|
||||||
#define FRMT "0x%x" // "0x%x"
|
#define FRMT "0x%x" // "0x%x"
|
||||||
#define SHFTFRMC "%s %s #%d" // "%s %s %d"
|
#define SHFTFRMC "%s %s #%d" // "%s %s %d"
|
||||||
#define SHFTFRMR "%s %s %s" // "%s %s %s"
|
#define SHFTFRMR "%s %s %s" // "%s %s %s"
|
||||||
//#define FRMT "0x%x"
|
//#define FRMT "0x%x"
|
||||||
//#define SHFTFRMC "%s %s %d"
|
//#define SHFTFRMC "%s %s %d"
|
||||||
//#define SHFTFRMR "%s %s %s"
|
//#define SHFTFRMR "%s %s %s"
|
||||||
|
|
||||||
char *cond[16] = { "eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc", "hi", "ls", "ge", "lt", "gt", "le", "", "nv" };
|
char *cond[16] = { "eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc", "hi", "ls", "ge", "lt", "gt", "le", "", "nv" };
|
||||||
char *cnd1[16] = { "eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc", "hi", "ls", "ge", "lt", "gt", "le", " ", "nv" };
|
char *cnd1[16] = { "eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc", "hi", "ls", "ge", "lt", "gt", "le", " ", "nv" };
|
||||||
char *opcd[16] = {"and","eor","sub","rsb","add","adc","sbc","rsc","tst","teq","cmp","cmn","orr","mov","bic","mvn" };
|
char *opcd[16] = {"and","eor","sub","rsb","add","adc","sbc","rsc","tst","teq","cmp","cmn","orr","mov","bic","mvn" };
|
||||||
char setc[32] = {0,115,0,115,0,115,0,115,0,115,0,115,0,115,0,115,0, 0 ,0, 0 ,0, 0 ,0, 0 ,0,115,0,115,0,115,0,115 };
|
char setc[32] = {0,115,0,115,0,115,0,115,0,115,0,115,0,115,0,115,0, 0 ,0, 0 ,0, 0 ,0, 0 ,0,115,0,115,0,115,0,115 };
|
||||||
char *regs[16] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" };
|
char *regs[16] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" };
|
||||||
|
|
||||||
char *shfts[4] = { "lsl", "lsr", "asr", "ror" };
|
char *shfts[4] = { "lsl", "lsr", "asr", "ror" };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
31-28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
31-28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
||||||
Cond 0 0 I ---Opcode--- S |----Rn----- ----Rd----- --------Operand 2-------- Data Processing /PSR Transfer
|
Cond 0 0 I ---Opcode--- S |----Rn----- ----Rd----- --------Operand 2-------- Data Processing /PSR Transfer
|
||||||
Cond 0 0 0 0 | 0 0 A S |----Rd----- ----Rn----- ---Rs---- 1 0 0 1 --Rm--- Multiply
|
Cond 0 0 0 0 | 0 0 A S |----Rd----- ----Rn----- ---Rs---- 1 0 0 1 --Rm--- Multiply
|
||||||
Cond 0 0 0 0 | 1 U A S |---RdHi---- ---RdLo---- ---Rn---- 1 0 0 1 --Rm--- Multiply Long
|
Cond 0 0 0 0 | 1 U A S |---RdHi---- ---RdLo---- ---Rn---- 1 0 0 1 --Rm--- Multiply Long
|
||||||
Cond 0 0 0 1 | 0 B 0 0 |----Rn----- ----Rd----- 0 0 0 0 1 0 0 1 --Rm--- Single Data Swap
|
Cond 0 0 0 1 | 0 B 0 0 |----Rn----- ----Rd----- 0 0 0 0 1 0 0 1 --Rm--- Single Data Swap
|
||||||
Cond 0 0 0 1 | 0 0 1 0 |1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 --Rn--- Branch and Exchange
|
Cond 0 0 0 1 | 0 0 1 0 |1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 --Rn--- Branch and Exchange
|
||||||
Cond 0 0 0 P | U 0 W L |----Rn----- ----Rd----- 0 0 0 0 1 S H 1 --Rm--- Halfword Data Transfer: register offset
|
Cond 0 0 0 P | U 0 W L |----Rn----- ----Rd----- 0 0 0 0 1 S H 1 --Rm--- Halfword Data Transfer: register offset
|
||||||
Cond 0 0 0 P | U 1 W L |----Rn----- ----Rd----- --Offset- 1 S H 1 -Offset Halfword Data Transfer: immediate offset
|
Cond 0 0 0 P | U 1 W L |----Rn----- ----Rd----- --Offset- 1 S H 1 -Offset Halfword Data Transfer: immediate offset
|
||||||
Cond 0 1 I P | U B W L |----Rn----- ----Rd----- --------Offset----------- Single Data Transfer
|
Cond 0 1 I P | U B W L |----Rn----- ----Rd----- --------Offset----------- Single Data Transfer
|
||||||
Cond 0 1 1 1 | x x x x |x x x x x x x x x x x x x x x 1 x x x x Undefined
|
Cond 0 1 1 1 | x x x x |x x x x x x x x x x x x x x x 1 x x x x Undefined
|
||||||
Cond 1 0 0 P | U S W L |----Rn----- -----------Register List------------- Block Data Transfer
|
Cond 1 0 0 P | U S W L |----Rn----- -----------Register List------------- Block Data Transfer
|
||||||
Cond 1 0 1 L | -------------------------Offset------------------------------ Branch
|
Cond 1 0 1 L | -------------------------Offset------------------------------ Branch
|
||||||
Cond 1 1 0 P | U N W L |----Rn----- ----CRd---- ---CP#--- -----Offset---- Coprocessor Data Transfer
|
Cond 1 1 0 P | U N W L |----Rn----- ----CRd---- ---CP#--- -----Offset---- Coprocessor Data Transfer
|
||||||
Cond 1 1 1 0 | --CP Opc---|----CRn---- ----CRd---- ---CP#--- -CP-- 0 --CRm-- Coprocessor Data Operation
|
Cond 1 1 1 0 | --CP Opc---|----CRn---- ----CRd---- ---CP#--- -CP-- 0 --CRm-- Coprocessor Data Operation
|
||||||
Cond 1 1 1 0 | CP Opc L |----CRn---- ----Rd----- ---CP#--- -CP-- 1 --CRm-- Coprocessor Register Transfer
|
Cond 1 1 1 0 | CP Opc L |----CRn---- ----Rd----- ---CP#--- -CP-- 1 --CRm-- Coprocessor Register Transfer
|
||||||
Cond 1 1 1 1 | x x x x |x x x x x x x x x x x x x x x x x x x x Software Interrupt
|
Cond 1 1 1 1 | x x x x |x x x x x x x x x x x x x x x x x x x x Software Interrupt
|
||||||
|
|
||||||
0x04200000
|
0x04200000
|
||||||
0001 0 0 0 0 0 1 1 0 6 e 1 1 1 0 1 8
|
0001 0 0 0 0 0 1 1 0 6 e 1 1 1 0 1 8
|
||||||
================================================================================
|
================================================================================
|
||||||
Cond 0 1 I P | U B W L |----Rn----- ----Rd----- --------Offset----------- Single Data Transfer
|
Cond 0 1 I P | U B W L |----Rn----- ----Rd----- --------Offset----------- Single Data Transfer
|
||||||
|
|
||||||
|
|
||||||
EQ 0 Z set equal
|
EQ 0 Z set equal
|
||||||
NE 1 Z clear not equal
|
NE 1 Z clear not equal
|
||||||
CS 2 C set unsigned higher or same
|
CS 2 C set unsigned higher or same
|
||||||
CC 3 C clear unsigned lower
|
CC 3 C clear unsigned lower
|
||||||
MI 4 N set negative
|
MI 4 N set negative
|
||||||
PL 5 N clear positive or zero
|
PL 5 N clear positive or zero
|
||||||
VS 6 V set overflow
|
VS 6 V set overflow
|
||||||
VC 7 V clear no overflow
|
VC 7 V clear no overflow
|
||||||
HI 8 C set and Z clear unsigned higher
|
HI 8 C set and Z clear unsigned higher
|
||||||
LS 9 C clear or Z set unsigned lower or same
|
LS 9 C clear or Z set unsigned lower or same
|
||||||
GE A N equals V greater or equal
|
GE A N equals V greater or equal
|
||||||
LT B N not equal to V less than
|
LT B N not equal to V less than
|
||||||
GT C Z clear AND (N equals V) greater than
|
GT C Z clear AND (N equals V) greater than
|
||||||
LE D Z set OR (N not equal to V) less than or equal
|
LE D Z set OR (N not equal to V) less than or equal
|
||||||
AL E (ignored) always
|
AL E (ignored) always
|
||||||
|
|
||||||
AND 0 operand1 AND operand2
|
AND 0 operand1 AND operand2
|
||||||
EOR 1 operand1 EOR operand2
|
EOR 1 operand1 EOR operand2
|
||||||
SUB 2 operand1 - operand2
|
SUB 2 operand1 - operand2
|
||||||
RSB 3 operand2 - operand1
|
RSB 3 operand2 - operand1
|
||||||
ADD 4 operand1 + operand2
|
ADD 4 operand1 + operand2
|
||||||
ADC 5 operand1 + operand2 + carry
|
ADC 5 operand1 + operand2 + carry
|
||||||
SBC 6 operand1 - operand2 + carry - 1
|
SBC 6 operand1 - operand2 + carry - 1
|
||||||
RSC 7 operand2 - operand1 + carry - 1
|
RSC 7 operand2 - operand1 + carry - 1
|
||||||
TST 8 AND, but result is not written
|
TST 8 AND, but result is not written
|
||||||
TEQ 9 as EOR, but result is not written
|
TEQ 9 as EOR, but result is not written
|
||||||
CMP A as SUB, but result is not written
|
CMP A as SUB, but result is not written
|
||||||
CMN B as ADD, but result is not written
|
CMN B as ADD, but result is not written
|
||||||
ORR C operand1 OR operand2
|
ORR C operand1 OR operand2
|
||||||
MOV D operand2 (operand1 is ignored)
|
MOV D operand2 (operand1 is ignored)
|
||||||
BIC E operand1 AND NOT operand2 (Bit clear)
|
BIC E operand1 AND NOT operand2 (Bit clear)
|
||||||
MVN F NOT operand2 (operand1 is ignored)
|
MVN F NOT operand2 (operand1 is ignored)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void multiply_stg(char *stg, ULONG val)
|
void multiply_stg(char *stg, ULONG val)
|
||||||
{
|
{
|
||||||
if((val&0xc00000) == 0) // simple mul
|
if((val&0xc00000) == 0) // simple mul
|
||||||
{
|
{
|
||||||
if(val & 0x100000) // set condition flags
|
if(val & 0x100000) // set condition flags
|
||||||
if(val & 0x200000) sprintf(stg+strlen(stg), "mla%ss ", cond[val>>28]);
|
if(val & 0x200000) sprintf(stg+strlen(stg), "mla%ss ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "mul%ss ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "mul%ss ", cond[val>>28]);
|
||||||
else
|
else
|
||||||
if(val & 0x200000) sprintf(stg+strlen(stg), "mla%s ", cnd1[val>>28]);
|
if(val & 0x200000) sprintf(stg+strlen(stg), "mla%s ", cnd1[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "mul%s ", cnd1[val>>28]);
|
else sprintf(stg+strlen(stg), "mul%s ", cnd1[val>>28]);
|
||||||
|
|
||||||
if(val & 0x200000) // accumulate
|
if(val & 0x200000) // accumulate
|
||||||
sprintf(stg+strlen(stg), "%s, %s, %s, %s", regs[(val>>16)&15], regs[(val>>0)&15], regs[(val>>8)&15], regs[(val>>12)&15]);
|
sprintf(stg+strlen(stg), "%s, %s, %s, %s", regs[(val>>16)&15], regs[(val>>0)&15], regs[(val>>8)&15], regs[(val>>12)&15]);
|
||||||
else
|
else
|
||||||
sprintf(stg+strlen(stg), "%s, %s, %s", regs[(val>>16)&15], regs[(val>>0)&15], regs[(val>>8)&15]);
|
sprintf(stg+strlen(stg), "%s, %s, %s", regs[(val>>16)&15], regs[(val>>0)&15], regs[(val>>8)&15]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(val & 0x100000) // set condition flags
|
if(val & 0x100000) // set condition flags
|
||||||
if(val & 0x200000) // accumulate
|
if(val & 0x200000) // accumulate
|
||||||
if(val & 0x400000) sprintf(stg+strlen(stg), "smlal%ss ", cond[val>>28]);
|
if(val & 0x400000) sprintf(stg+strlen(stg), "smlal%ss ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "umlal%ss ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "umlal%ss ", cond[val>>28]);
|
||||||
else
|
else
|
||||||
if(val & 0x400000) sprintf(stg+strlen(stg), "smull%ss ", cond[val>>28]);
|
if(val & 0x400000) sprintf(stg+strlen(stg), "smull%ss ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "umull%ss ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "umull%ss ", cond[val>>28]);
|
||||||
else
|
else
|
||||||
if(val & 0x200000)
|
if(val & 0x200000)
|
||||||
if(val & 0x400000) sprintf(stg+strlen(stg), "smlal%s ", cond[val>>28]);
|
if(val & 0x400000) sprintf(stg+strlen(stg), "smlal%s ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "umlal%s ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "umlal%s ", cond[val>>28]);
|
||||||
else
|
else
|
||||||
if(val & 0x400000) sprintf(stg+strlen(stg), "smull%s ", cond[val>>28]);
|
if(val & 0x400000) sprintf(stg+strlen(stg), "smull%s ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "umull%s ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "umull%s ", cond[val>>28]);
|
||||||
|
|
||||||
sprintf(stg+strlen(stg), "%s, %s, %s, %s", regs[(val>>12)&15], regs[(val>>16)&15], regs[(val>>0)&15], regs[(val>>8)&15]);
|
sprintf(stg+strlen(stg), "%s, %s, %s, %s", regs[(val>>12)&15], regs[(val>>16)&15], regs[(val>>0)&15], regs[(val>>8)&15]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void halfword_stg(char *stg, ULONG val)
|
void halfword_stg(char *stg, ULONG val)
|
||||||
{
|
{
|
||||||
ULONG off = ((val>>4) & 0xf0) + (val & 0x0f);
|
ULONG off = ((val>>4) & 0xf0) + (val & 0x0f);
|
||||||
|
|
||||||
if(val & 0x100000) sprintf(stg+strlen(stg), "ldr%s", cond[val>>28]);
|
if(val & 0x100000) sprintf(stg+strlen(stg), "ldr%s", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "str%s", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "str%s", cond[val>>28]);
|
||||||
|
|
||||||
switch((val>>5) & 3) // SWP, HW, SB, SH
|
switch((val>>5) & 3) // SWP, HW, SB, SH
|
||||||
{
|
{
|
||||||
case 0: sprintf(stg+strlen(stg), "error: SWP"); break;
|
case 0: sprintf(stg+strlen(stg), "error: SWP"); break;
|
||||||
case 1: sprintf(stg+strlen(stg), "h "); break;
|
case 1: sprintf(stg+strlen(stg), "h "); break;
|
||||||
case 2: sprintf(stg+strlen(stg), "sb "); break;
|
case 2: sprintf(stg+strlen(stg), "sb "); break;
|
||||||
case 3: sprintf(stg+strlen(stg), "sh "); break;
|
case 3: sprintf(stg+strlen(stg), "sh "); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(val & 0x400000) // immidiate offset
|
if(val & 0x400000) // immidiate offset
|
||||||
if(val & 0x1000000) // pre index
|
if(val & 0x1000000) // pre index
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s, "FRMT"]!", regs[(val>>12)&15], regs[(val>>16)&15], off);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s, "FRMT"]!", regs[(val>>12)&15], regs[(val>>16)&15], off);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s, -"FRMT"]!", regs[(val>>12)&15], regs[(val>>16)&15], off);
|
else sprintf(stg+strlen(stg), "%s, [%s, -"FRMT"]!", regs[(val>>12)&15], regs[(val>>16)&15], off);
|
||||||
else
|
else
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s, "FRMT"]", regs[(val>>12)&15], regs[(val>>16)&15], off);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s, "FRMT"]", regs[(val>>12)&15], regs[(val>>16)&15], off);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s, -"FRMT"]", regs[(val>>12)&15], regs[(val>>16)&15], off);
|
else sprintf(stg+strlen(stg), "%s, [%s, -"FRMT"]", regs[(val>>12)&15], regs[(val>>16)&15], off);
|
||||||
else
|
else
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
sprintf(stg+strlen(stg), "error 'write back' on post indexed");
|
sprintf(stg+strlen(stg), "error 'write back' on post indexed");
|
||||||
else
|
else
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s], "FRMT, regs[(val>>12)&15], regs[(val>>16)&15], off);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s], "FRMT, regs[(val>>12)&15], regs[(val>>16)&15], off);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s], -"FRMT, regs[(val>>12)&15], regs[(val>>16)&15], off);
|
else sprintf(stg+strlen(stg), "%s, [%s], -"FRMT, regs[(val>>12)&15], regs[(val>>16)&15], off);
|
||||||
else
|
else
|
||||||
if(val & 0x1000000) // pre index
|
if(val & 0x1000000) // pre index
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s, %s]!", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s, %s]!", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s, -%s]!", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
else sprintf(stg+strlen(stg), "%s, [%s, -%s]!", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
||||||
else
|
else
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s, %s]", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s, %s]", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s, -%s]", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
else sprintf(stg+strlen(stg), "%s, [%s, -%s]", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
||||||
else
|
else
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
sprintf(stg+strlen(stg), "error 'write back' on post indexed");
|
sprintf(stg+strlen(stg), "error 'write back' on post indexed");
|
||||||
else
|
else
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s], %s", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "%s, [%s], %s", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s], -%s", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
else sprintf(stg+strlen(stg), "%s, [%s], -%s", regs[(val>>12)&15], regs[(val>>16)&15], regs[val&15]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void branch_stg(char *stg, ULONG val, ULONG pos)
|
void branch_stg(char *stg, ULONG val, ULONG pos)
|
||||||
{
|
{
|
||||||
ULONG off = pos + (((int32_t)val << 8) >> 6) + 8;
|
ULONG off = pos + (((int32_t)val << 8) >> 6) + 8;
|
||||||
|
|
||||||
if((val & 0x0ffffff0) == 0x012fff10) // bx instruction
|
if((val & 0x0ffffff0) == 0x012fff10) // bx instruction
|
||||||
{ sprintf(stg+strlen(stg), "bx%s %s", cond[val>>28], regs[val&15]); }
|
{ sprintf(stg+strlen(stg), "bx%s %s", cond[val>>28], regs[val&15]); }
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(((val>>24)&15) == 10) sprintf(stg+strlen(stg), "b%s ", cond[val>>28]);
|
if(((val>>24)&15) == 10) sprintf(stg+strlen(stg), "b%s ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "bl%s ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "bl%s ", cond[val>>28]);
|
||||||
|
|
||||||
sprintf(stg+strlen(stg), "0x%x", off);
|
sprintf(stg+strlen(stg), "0x%x", off);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void opcode_stg(char *stg, ULONG val, ULONG off)
|
void opcode_stg(char *stg, ULONG val, ULONG off)
|
||||||
{
|
{
|
||||||
ULONG des, op1;
|
ULONG des, op1;
|
||||||
char op2[80];
|
char op2[80];
|
||||||
char *st = stg + strlen(stg);
|
char *st = stg + strlen(stg);
|
||||||
|
|
||||||
if(((val & 0x0ffffff0) == 0x012fff10) && (val & 16))
|
if(((val & 0x0ffffff0) == 0x012fff10) && (val & 16))
|
||||||
{ branch_stg(stg, val, off); return; }
|
{ branch_stg(stg, val, off); return; }
|
||||||
else if(((val & 0x0f000000) == 0x00000000) && ((val & 0xf0) == 0x90))
|
else if(((val & 0x0f000000) == 0x00000000) && ((val & 0xf0) == 0x90))
|
||||||
{ multiply_stg(stg, val); return; }
|
{ multiply_stg(stg, val); return; }
|
||||||
else if(((val & 0x0f000000) <= 0x01000000) && ((val & 0x90) == 0x90) && ((val & 0xf0) > 0x90) && ((val & 0x01200000) != 0x00200000))
|
else if(((val & 0x0f000000) <= 0x01000000) && ((val & 0x90) == 0x90) && ((val & 0xf0) > 0x90) && ((val & 0x01200000) != 0x00200000))
|
||||||
{ halfword_stg(stg, val); return; }
|
{ halfword_stg(stg, val); return; }
|
||||||
|
|
||||||
sprintf(stg+strlen(stg), "%s%s%s ", opcd[(val>>21) & 15], cond[val>>28], setc[(val>>20) & 31]?"s":" ");
|
sprintf(stg+strlen(stg), "%s%s%s ", opcd[(val>>21) & 15], cond[val>>28], setc[(val>>20) & 31]?"s":" ");
|
||||||
|
|
||||||
des = (val>>12) & 15;
|
des = (val>>12) & 15;
|
||||||
op1 = (val>>16) & 15;
|
op1 = (val>>16) & 15;
|
||||||
|
|
||||||
if(val & 0x2000000) // immidiate
|
if(val & 0x2000000) // immidiate
|
||||||
{
|
{
|
||||||
off = (ULONG)((uint64_t)(val&0xff) << (32 - 2 * ((val >> 8) & 15))) | ((val&0xff) >> 2 * ((val >> 8) & 15));
|
off = (ULONG)((uint64_t)(val&0xff) << (32 - 2 * ((val >> 8) & 15))) | ((val&0xff) >> 2 * ((val >> 8) & 15));
|
||||||
sprintf(op2, FRMT" ", off);
|
sprintf(op2, FRMT" ", off);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(val & 16) // shift type
|
if(val & 16) // shift type
|
||||||
sprintf(op2, SHFTFRMR, regs[val&15], shfts[(val>>5)&3], regs[(val>>8)&15]);
|
sprintf(op2, SHFTFRMR, regs[val&15], shfts[(val>>5)&3], regs[(val>>8)&15]);
|
||||||
else
|
else
|
||||||
if((val>>7) & 31)
|
if((val>>7) & 31)
|
||||||
sprintf(op2, SHFTFRMC, regs[val&15], shfts[(val>>5)&3], (val>>7) & 31);
|
sprintf(op2, SHFTFRMC, regs[val&15], shfts[(val>>5)&3], (val>>7) & 31);
|
||||||
else
|
else
|
||||||
sprintf(op2, "%s ", regs[val&15]);
|
sprintf(op2, "%s ", regs[val&15]);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch((val>>21) & 15)
|
switch((val>>21) & 15)
|
||||||
{
|
{
|
||||||
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 12:
|
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 12:
|
||||||
case 14: sprintf(stg+strlen(stg), "%s, %s, %s", regs[des], regs[op1], op2); break;
|
case 14: sprintf(stg+strlen(stg), "%s, %s, %s", regs[des], regs[op1], op2); break;
|
||||||
|
|
||||||
case 8: case 9: case 10:
|
case 8: case 9: case 10:
|
||||||
case 11: if(val & 0x100000) // set status
|
case 11: if(val & 0x100000) // set status
|
||||||
sprintf(stg+strlen(stg), "%s, %s", regs[op1], op2); // standard TEQ,TST,CMP,CMN
|
sprintf(stg+strlen(stg), "%s, %s", regs[op1], op2); // standard TEQ,TST,CMP,CMN
|
||||||
else
|
else
|
||||||
{ //special MRS/MSR opcodes
|
{ //special MRS/MSR opcodes
|
||||||
if((((val>>23) & 31) == 2) && ((val & 0x3f0fff) == 0x0f0000))
|
if((((val>>23) & 31) == 2) && ((val & 0x3f0fff) == 0x0f0000))
|
||||||
{ sprintf(st, "mrs%s %s, %s", cnd1[val>>28], regs[des], val&0x400000?"SPSR_xx":"CPSR"); }
|
{ sprintf(st, "mrs%s %s, %s", cnd1[val>>28], regs[des], val&0x400000?"SPSR_xx":"CPSR"); }
|
||||||
else
|
else
|
||||||
if((((val>>23) & 31) == 2) && ((val & 0x30fff0) == 0x20f000))
|
if((((val>>23) & 31) == 2) && ((val & 0x30fff0) == 0x20f000))
|
||||||
{ sprintf(st, "msr%s %s, %s", cnd1[val>>28], val&0x400000?"SPSR_xx":"CPSR", regs[val&15]); }
|
{ sprintf(st, "msr%s %s, %s", cnd1[val>>28], val&0x400000?"SPSR_xx":"CPSR", regs[val&15]); }
|
||||||
else
|
else
|
||||||
if((((val>>23) & 31) == 6) && ((val & 0x30f000) == 0x20f000))
|
if((((val>>23) & 31) == 6) && ((val & 0x30f000) == 0x20f000))
|
||||||
{ sprintf(st, "msr%s %s, %s", cnd1[val>>28], val&0x400000?"SPSR_xx":"CPSR_cf", op2); }
|
{ sprintf(st, "msr%s %s, %s", cnd1[val>>28], val&0x400000?"SPSR_xx":"CPSR_cf", op2); }
|
||||||
else
|
else
|
||||||
if((((val>>23) & 31) == 2) && ((val & 0x300ff0) == 0x000090))
|
if((((val>>23) & 31) == 2) && ((val & 0x300ff0) == 0x000090))
|
||||||
{ sprintf(st, "swp%s%s %s, %s, [%s]", val&0x400000?"b":"", cnd1[val>>28], regs[(val>>12)&15], regs[val&15], regs[(val>>16)&15]); }
|
{ sprintf(st, "swp%s%s %s, %s, [%s]", val&0x400000?"b":"", cnd1[val>>28], regs[(val>>12)&15], regs[val&15], regs[(val>>16)&15]); }
|
||||||
else
|
else
|
||||||
{ sprintf(stg+strlen(stg), "??????????????"); }
|
{ sprintf(stg+strlen(stg), "??????????????"); }
|
||||||
} break;
|
} break;
|
||||||
case 13:
|
case 13:
|
||||||
case 15: sprintf(stg+strlen(stg), "%s, %s", regs[des], op2); break;
|
case 15: sprintf(stg+strlen(stg), "%s, %s", regs[des], op2); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void opcode_cop(char *stg, ULONG val, ULONG off)
|
void opcode_cop(char *stg, ULONG val, ULONG off)
|
||||||
{
|
{
|
||||||
char* op;
|
char* op;
|
||||||
int opcode1 = (val >> 21) & 0x7;
|
int opcode1 = (val >> 21) & 0x7;
|
||||||
int CRn = (val >> 16) & 0xf;
|
int CRn = (val >> 16) & 0xf;
|
||||||
int Rd = (val >> 12) & 0xf;
|
int Rd = (val >> 12) & 0xf;
|
||||||
int cp_num = (val >> 8) & 0xf;
|
int cp_num = (val >> 8) & 0xf;
|
||||||
int opcode2 = (val >> 5) & 0x7;
|
int opcode2 = (val >> 5) & 0x7;
|
||||||
int CRm = val & 0xf;
|
int CRm = val & 0xf;
|
||||||
|
|
||||||
|
|
||||||
// ee073f5e mcr 15, 0, r3, cr7, cr14, {2}
|
// ee073f5e mcr 15, 0, r3, cr7, cr14, {2}
|
||||||
|
|
||||||
if (val & (1<<4)) {
|
if (val & (1<<4)) {
|
||||||
if (val & (1<<20)) {
|
if (val & (1<<20)) {
|
||||||
op = "mrc";
|
op = "mrc";
|
||||||
} else {
|
} else {
|
||||||
op = "mcr";
|
op = "mcr";
|
||||||
}
|
}
|
||||||
opcode1 = (val >> 21) & 0x7;
|
opcode1 = (val >> 21) & 0x7;
|
||||||
CRn = (val >> 16) & 0xf;
|
CRn = (val >> 16) & 0xf;
|
||||||
Rd = (val >> 12) & 0xf;
|
Rd = (val >> 12) & 0xf;
|
||||||
cp_num = (val >> 8) & 0xf;
|
cp_num = (val >> 8) & 0xf;
|
||||||
opcode2 = (val >> 5) & 0x7;
|
opcode2 = (val >> 5) & 0x7;
|
||||||
CRm = val & 0xf;
|
CRm = val & 0xf;
|
||||||
|
|
||||||
sprintf(stg+strlen(stg), "%s%s %d, %d, r%d, cr%d, cr%d, {%d}", op, cnd1[val>>28], cp_num, opcode1, Rd, CRn, CRm, opcode2);
|
sprintf(stg+strlen(stg), "%s%s %d, %d, r%d, cr%d, cr%d, {%d}", op, cnd1[val>>28], cp_num, opcode1, Rd, CRn, CRm, opcode2);
|
||||||
} else {
|
} else {
|
||||||
op = "cdp";
|
op = "cdp";
|
||||||
|
|
||||||
opcode1 = (val >> 20) & 0xf;
|
opcode1 = (val >> 20) & 0xf;
|
||||||
CRn = (val >> 16) & 0xf;
|
CRn = (val >> 16) & 0xf;
|
||||||
Rd = (val >> 12) & 0xf;
|
Rd = (val >> 12) & 0xf;
|
||||||
cp_num = (val >> 8) & 0xf;
|
cp_num = (val >> 8) & 0xf;
|
||||||
opcode2 = (val >> 5) & 0x7;
|
opcode2 = (val >> 5) & 0x7;
|
||||||
CRm = val & 0xf;
|
CRm = val & 0xf;
|
||||||
|
|
||||||
sprintf(stg+strlen(stg), "%s%s %d, %d, cr%d, cr%d, cr%d, {%d}", op, cnd1[val>>28], cp_num, opcode1, Rd, CRn, CRm, opcode2);
|
sprintf(stg+strlen(stg), "%s%s %d, %d, cr%d, cr%d, cr%d, {%d}", op, cnd1[val>>28], cp_num, opcode1, Rd, CRn, CRm, opcode2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void single_data(char *stg, ULONG val)
|
void single_data(char *stg, ULONG val)
|
||||||
{
|
{
|
||||||
char op2[80];
|
char op2[80];
|
||||||
|
|
||||||
if(((val & 0x0e000000) == 0x06000000) && (val & 16))
|
if(((val & 0x0e000000) == 0x06000000) && (val & 16))
|
||||||
{ sprintf(stg+strlen(stg), "undef%s", cond[val>>28]);
|
{ sprintf(stg+strlen(stg), "undef%s", cond[val>>28]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(val & 0x400000)
|
if(val & 0x400000)
|
||||||
if(val & 0x100000) sprintf(stg+strlen(stg), "ldr%sb ", cond[val>>28]);
|
if(val & 0x100000) sprintf(stg+strlen(stg), "ldr%sb ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "str%sb ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "str%sb ", cond[val>>28]);
|
||||||
else
|
else
|
||||||
if(val & 0x100000) sprintf(stg+strlen(stg), "ldr%s ", cnd1[val>>28]);
|
if(val & 0x100000) sprintf(stg+strlen(stg), "ldr%s ", cnd1[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "str%s ", cnd1[val>>28]);
|
else sprintf(stg+strlen(stg), "str%s ", cnd1[val>>28]);
|
||||||
|
|
||||||
if(val & 0x2000000) {// reg offset
|
if(val & 0x2000000) {// reg offset
|
||||||
if(val & 16) // shift type
|
if(val & 16) // shift type
|
||||||
sprintf(op2, "error: reg defined shift");
|
sprintf(op2, "error: reg defined shift");
|
||||||
else
|
else
|
||||||
if((val>>7) & 31)
|
if((val>>7) & 31)
|
||||||
sprintf(op2, SHFTFRMC, regs[val&15], shfts[(val>>5)&3], (val>>7) & 31);
|
sprintf(op2, SHFTFRMC, regs[val&15], shfts[(val>>5)&3], (val>>7) & 31);
|
||||||
else
|
else
|
||||||
sprintf(op2, "%s", regs[val&15]);
|
sprintf(op2, "%s", regs[val&15]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(val & 0x2000000) // reg offset
|
if(val & 0x2000000) // reg offset
|
||||||
if(val & 0x1000000) // pre index
|
if(val & 0x1000000) // pre index
|
||||||
if(val & 0x800000) // up offset (+)
|
if(val & 0x800000) // up offset (+)
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
sprintf(stg+strlen(stg), "%s, [%s, %s]!", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
sprintf(stg+strlen(stg), "%s, [%s, %s]!", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
||||||
else
|
else
|
||||||
sprintf(stg+strlen(stg), "%s, [%s, %s]", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
sprintf(stg+strlen(stg), "%s, [%s, %s]", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
||||||
else
|
else
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
sprintf(stg+strlen(stg), "%s, [%s, -%s]!", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
sprintf(stg+strlen(stg), "%s, [%s, -%s]!", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
||||||
else
|
else
|
||||||
sprintf(stg+strlen(stg), "%s, [%s, -%s]", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
sprintf(stg+strlen(stg), "%s, [%s, -%s]", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
||||||
else
|
else
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
sprintf(stg+strlen(stg), "error 'write back' set");
|
sprintf(stg+strlen(stg), "error 'write back' set");
|
||||||
else
|
else
|
||||||
if(val & 0x800000) // up offset (+)
|
if(val & 0x800000) // up offset (+)
|
||||||
sprintf(stg+strlen(stg), "%s, [%s], %s", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
sprintf(stg+strlen(stg), "%s, [%s], %s", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
||||||
else
|
else
|
||||||
sprintf(stg+strlen(stg), "%s, [%s], -%s", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
sprintf(stg+strlen(stg), "%s, [%s], -%s", regs[(val>>12)&15], regs[(val>>16)&15], op2);
|
||||||
else
|
else
|
||||||
if(val & 0x1000000) // pre index
|
if(val & 0x1000000) // pre index
|
||||||
if(val & 0x800000) // up offset (+)
|
if(val & 0x800000) // up offset (+)
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s, "FRMT"]!", regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s, "FRMT"]!", regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s]!", regs[(val>>12)&15], regs[(val>>16)&15]);
|
else sprintf(stg+strlen(stg), "%s, [%s]!", regs[(val>>12)&15], regs[(val>>16)&15]);
|
||||||
else
|
else
|
||||||
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s, "FRMT"]", regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s, "FRMT"]", regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s]", regs[(val>>12)&15], regs[(val>>16)&15]);
|
else sprintf(stg+strlen(stg), "%s, [%s]", regs[(val>>12)&15], regs[(val>>16)&15]);
|
||||||
else
|
else
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s, -"FRMT"]!", regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s, -"FRMT"]!", regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s]!", regs[(val>>12)&15], regs[(val>>16)&15]);
|
else sprintf(stg+strlen(stg), "%s, [%s]!", regs[(val>>12)&15], regs[(val>>16)&15]);
|
||||||
else
|
else
|
||||||
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s, -"FRMT"]", regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s, -"FRMT"]", regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s]", regs[(val>>12)&15], regs[(val>>16)&15]);
|
else sprintf(stg+strlen(stg), "%s, [%s]", regs[(val>>12)&15], regs[(val>>16)&15]);
|
||||||
else
|
else
|
||||||
if(val & 0x200000) // write back
|
if(val & 0x200000) // write back
|
||||||
sprintf(stg+strlen(stg), "error 'write back' set");
|
sprintf(stg+strlen(stg), "error 'write back' set");
|
||||||
else
|
else
|
||||||
if(val & 0x800000) // up offset (+)
|
if(val & 0x800000) // up offset (+)
|
||||||
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s], "FRMT, regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s], "FRMT, regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s]", regs[(val>>12)&15], regs[(val>>16)&15]);
|
else sprintf(stg+strlen(stg), "%s, [%s]", regs[(val>>12)&15], regs[(val>>16)&15]);
|
||||||
else
|
else
|
||||||
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s], -"FRMT, regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
if(val & 0xfff) sprintf(stg+strlen(stg), "%s, [%s], -"FRMT, regs[(val>>12)&15], regs[(val>>16)&15], val & 0xfff);
|
||||||
else sprintf(stg+strlen(stg), "%s, [%s]", regs[(val>>12)&15], regs[(val>>16)&15]);
|
else sprintf(stg+strlen(stg), "%s, [%s]", regs[(val>>12)&15], regs[(val>>16)&15]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void block_data(char *stg, ULONG val)
|
void block_data(char *stg, ULONG val)
|
||||||
{
|
{
|
||||||
char lst[80];
|
char lst[80];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
strcpy(lst, "{");
|
strcpy(lst, "{");
|
||||||
for(i=0; i<16; i++)
|
for(i=0; i<16; i++)
|
||||||
if(val & (1<<i))
|
if(val & (1<<i))
|
||||||
sprintf(lst+strlen(lst), "%s, ", regs[i]);
|
sprintf(lst+strlen(lst), "%s, ", regs[i]);
|
||||||
if(strlen(lst)>2)
|
if(strlen(lst)>2)
|
||||||
strcpy(lst+strlen(lst)-2, "}");
|
strcpy(lst+strlen(lst)-2, "}");
|
||||||
else
|
else
|
||||||
strcpy(lst+strlen(lst), "}");
|
strcpy(lst+strlen(lst), "}");
|
||||||
|
|
||||||
if(val & 0x400000) // load psr or force user mode
|
if(val & 0x400000) // load psr or force user mode
|
||||||
strcpy(lst+strlen(lst), "^");
|
strcpy(lst+strlen(lst), "^");
|
||||||
|
|
||||||
|
|
||||||
if(val & 0x100000) // load
|
if(val & 0x100000) // load
|
||||||
if(val & 0x1000000) // pre offset
|
if(val & 0x1000000) // pre offset
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "ldm%sib ", cond[val>>28]);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "ldm%sib ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "ldm%sdb ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "ldm%sdb ", cond[val>>28]);
|
||||||
else
|
else
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "ldm%sia ", cond[val>>28]);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "ldm%sia ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "ldm%sda ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "ldm%sda ", cond[val>>28]);
|
||||||
else
|
else
|
||||||
if(val & 0x1000000)
|
if(val & 0x1000000)
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "stm%sib ", cond[val>>28]);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "stm%sib ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "stm%sdb ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "stm%sdb ", cond[val>>28]);
|
||||||
else
|
else
|
||||||
if(val & 0x800000) sprintf(stg+strlen(stg), "stm%sia ", cond[val>>28]);
|
if(val & 0x800000) sprintf(stg+strlen(stg), "stm%sia ", cond[val>>28]);
|
||||||
else sprintf(stg+strlen(stg), "stm%sda ", cond[val>>28]);
|
else sprintf(stg+strlen(stg), "stm%sda ", cond[val>>28]);
|
||||||
|
|
||||||
switch((val>>21)&3)
|
switch((val>>21)&3)
|
||||||
{
|
{
|
||||||
case 0: sprintf(stg+strlen(stg), "%s, %s", regs[(val>>16)&15], lst); break;
|
case 0: sprintf(stg+strlen(stg), "%s, %s", regs[(val>>16)&15], lst); break;
|
||||||
case 1: sprintf(stg+strlen(stg), "%s!, %s", regs[(val>>16)&15], lst); break;
|
case 1: sprintf(stg+strlen(stg), "%s!, %s", regs[(val>>16)&15], lst); break;
|
||||||
case 2: sprintf(stg+strlen(stg), "%s, %s", regs[(val>>16)&15], lst); break;
|
case 2: sprintf(stg+strlen(stg), "%s, %s", regs[(val>>16)&15], lst); break;
|
||||||
case 3: sprintf(stg+strlen(stg), "%s!, %s", regs[(val>>16)&15], lst); break;
|
case 3: sprintf(stg+strlen(stg), "%s!, %s", regs[(val>>16)&15], lst); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dis_asm(ULONG off, ULONG val, char *stg)
|
void dis_asm(ULONG off, ULONG val, char *stg)
|
||||||
{
|
{
|
||||||
sprintf(stg, "%6x: %08x ", off, val);
|
sprintf(stg, "%6x: %08x ", off, val);
|
||||||
|
|
||||||
switch((val >> 24) & 15)
|
switch((val >> 24) & 15)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
case 3: opcode_stg(stg, val, off); break;
|
case 3: opcode_stg(stg, val, off); break;
|
||||||
case 4:
|
case 4:
|
||||||
case 5:
|
case 5:
|
||||||
case 6:
|
case 6:
|
||||||
case 7: single_data(stg, val); break;
|
case 7: single_data(stg, val); break;
|
||||||
case 8:
|
case 8:
|
||||||
case 9: block_data(stg, val); break;
|
case 9: block_data(stg, val); break;
|
||||||
case 10:
|
case 10:
|
||||||
case 11: branch_stg(stg, val, off); break;
|
case 11: branch_stg(stg, val, off); break;
|
||||||
case 12:
|
case 12:
|
||||||
case 13: sprintf(stg+strlen(stg), "cop%s", cnd1[val>>28]); break;
|
case 13: sprintf(stg+strlen(stg), "cop%s", cnd1[val>>28]); break;
|
||||||
case 14: opcode_cop(stg, val, off); break;
|
case 14: opcode_cop(stg, val, off); break;
|
||||||
case 15: sprintf(stg+strlen(stg), "swi%s", cnd1[val>>28]); break;
|
case 15: sprintf(stg+strlen(stg), "swi%s", cnd1[val>>28]); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,132 +1,132 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define ULONG uint32_t
|
#define ULONG uint32_t
|
||||||
#define USHORT uint16_t
|
#define USHORT uint16_t
|
||||||
#define UCHAR uint8_t
|
#define UCHAR uint8_t
|
||||||
|
|
||||||
ULONG isdata[1000000]; /* each bit defines one byte as: code=0, data=1 */
|
ULONG isdata[1000000]; /* each bit defines one byte as: code=0, data=1 */
|
||||||
|
|
||||||
extern void dis_asm(ULONG off, ULONG val, char *stg);
|
extern void dis_asm(ULONG off, ULONG val, char *stg);
|
||||||
|
|
||||||
int static inline le2int(unsigned char* buf)
|
int static inline le2int(unsigned char* buf)
|
||||||
{
|
{
|
||||||
int32_t res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
|
int32_t res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
FILE *in, *out;
|
FILE *in, *out;
|
||||||
char *ptr, stg[256];
|
char *ptr, stg[256];
|
||||||
unsigned char buf[4];
|
unsigned char buf[4];
|
||||||
ULONG pos, sz, val, loop;
|
ULONG pos, sz, val, loop;
|
||||||
int offset, offset1;
|
int offset, offset1;
|
||||||
USHORT regid;
|
USHORT regid;
|
||||||
|
|
||||||
if(argc == 1 || strcmp(argv[1], "--help") == 0)
|
if(argc == 1 || strcmp(argv[1], "--help") == 0)
|
||||||
{ printf("Usage: arm_disass [input file]\n");
|
{ printf("Usage: arm_disass [input file]\n");
|
||||||
printf(" disassembles input file to 'disasm.txt'\n");
|
printf(" disassembles input file to 'disasm.txt'\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
in = fopen(argv[1], "rb");
|
in = fopen(argv[1], "rb");
|
||||||
if(in == NULL)
|
if(in == NULL)
|
||||||
{ printf("Cannot open %s", argv[1]);
|
{ printf("Cannot open %s", argv[1]);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
out = fopen("disasm.txt", "w");
|
out = fopen("disasm.txt", "w");
|
||||||
if(out == NULL) exit(-1);
|
if(out == NULL) exit(-1);
|
||||||
|
|
||||||
fseek(in, 0, SEEK_END);
|
fseek(in, 0, SEEK_END);
|
||||||
sz = ftell(in);
|
sz = ftell(in);
|
||||||
|
|
||||||
/* first loop only sets data/code tags */
|
/* first loop only sets data/code tags */
|
||||||
for(loop=0; loop<2; loop++)
|
for(loop=0; loop<2; loop++)
|
||||||
{
|
{
|
||||||
for(pos=0; pos<sz; pos+=4)
|
for(pos=0; pos<sz; pos+=4)
|
||||||
{
|
{
|
||||||
/* clear disassembler string start */
|
/* clear disassembler string start */
|
||||||
memset(stg, 0, 40);
|
memset(stg, 0, 40);
|
||||||
/* read next code dword */
|
/* read next code dword */
|
||||||
fseek(in, pos, SEEK_SET);
|
fseek(in, pos, SEEK_SET);
|
||||||
fread(buf, 1, 4, in);
|
fread(buf, 1, 4, in);
|
||||||
|
|
||||||
val = le2int(buf);
|
val = le2int(buf);
|
||||||
|
|
||||||
/* check for data tag set: if 1 byte out of 4 is marked => assume data */
|
/* check for data tag set: if 1 byte out of 4 is marked => assume data */
|
||||||
if((isdata[pos>>5] & (0xf << (pos & 31))) || (val & 0xffff0000) == 0)
|
if((isdata[pos>>5] & (0xf << (pos & 31))) || (val & 0xffff0000) == 0)
|
||||||
{
|
{
|
||||||
sprintf(stg, "%6x: %08x", pos, val);
|
sprintf(stg, "%6x: %08x", pos, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dis_asm(pos, val, stg);
|
dis_asm(pos, val, stg);
|
||||||
|
|
||||||
/* check for instant mov operation */
|
/* check for instant mov operation */
|
||||||
if(memcmp(stg+17, "mov ", 4) == 0 && (ptr=strstr(stg, "0x")) != NULL)
|
if(memcmp(stg+17, "mov ", 4) == 0 && (ptr=strstr(stg, "0x")) != NULL)
|
||||||
{
|
{
|
||||||
regid = *(USHORT*)(stg+22);
|
regid = *(USHORT*)(stg+22);
|
||||||
|
|
||||||
sscanf(ptr+2, "%x", &offset);
|
sscanf(ptr+2, "%x", &offset);
|
||||||
if(ptr[-1] == '-')
|
if(ptr[-1] == '-')
|
||||||
offset = -offset;
|
offset = -offset;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* check for add/sub operation */
|
/* check for add/sub operation */
|
||||||
if((ptr=strstr(stg, "0x")) != NULL
|
if((ptr=strstr(stg, "0x")) != NULL
|
||||||
&& (memcmp(stg+17, "add ", 4) == 0 || memcmp(stg+17, "sub ", 4) == 0))
|
&& (memcmp(stg+17, "add ", 4) == 0 || memcmp(stg+17, "sub ", 4) == 0))
|
||||||
{
|
{
|
||||||
if(regid == *(USHORT*)(stg+22) && regid == *(USHORT*)(stg+26))
|
if(regid == *(USHORT*)(stg+22) && regid == *(USHORT*)(stg+26))
|
||||||
{
|
{
|
||||||
sscanf(ptr+2, "%x", &offset1);
|
sscanf(ptr+2, "%x", &offset1);
|
||||||
if(ptr[-1] == '-')
|
if(ptr[-1] == '-')
|
||||||
offset1 = -offset1;
|
offset1 = -offset1;
|
||||||
|
|
||||||
if(memcmp(stg+17, "add ", 4) == 0) offset += offset1;
|
if(memcmp(stg+17, "add ", 4) == 0) offset += offset1;
|
||||||
else offset -= offset1;
|
else offset -= offset1;
|
||||||
|
|
||||||
/* add result to disassembler string */
|
/* add result to disassembler string */
|
||||||
sprintf(stg+strlen(stg), " <- 0x%x", offset);
|
sprintf(stg+strlen(stg), " <- 0x%x", offset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
regid = 0;
|
regid = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
regid = 0;
|
regid = 0;
|
||||||
|
|
||||||
/* check for const data */
|
/* check for const data */
|
||||||
if(memcmp(stg+26, "[pc, ", 5) == 0 && (ptr=strstr(stg, "0x")) != NULL)
|
if(memcmp(stg+26, "[pc, ", 5) == 0 && (ptr=strstr(stg, "0x")) != NULL)
|
||||||
{
|
{
|
||||||
sscanf(ptr+2, "%x", &offset);
|
sscanf(ptr+2, "%x", &offset);
|
||||||
if(ptr[-1] == '-')
|
if(ptr[-1] == '-')
|
||||||
offset = -offset;
|
offset = -offset;
|
||||||
|
|
||||||
/* add data tag */
|
/* add data tag */
|
||||||
isdata[(pos+offset+8)>>5] |= 1 << ((pos+offset+8) & 31);
|
isdata[(pos+offset+8)>>5] |= 1 << ((pos+offset+8) & 31);
|
||||||
|
|
||||||
/* add const data to disassembler string */
|
/* add const data to disassembler string */
|
||||||
fseek(in, pos+offset+8, SEEK_SET);
|
fseek(in, pos+offset+8, SEEK_SET);
|
||||||
fread(&buf, 1, 4, in);
|
fread(&buf, 1, 4, in);
|
||||||
offset = le2int(buf);
|
offset = le2int(buf);
|
||||||
|
|
||||||
sprintf(stg+strlen(stg), " <- 0x%x", offset);
|
sprintf(stg+strlen(stg), " <- 0x%x", offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remove trailing spaces */
|
/* remove trailing spaces */
|
||||||
while(stg[strlen(stg)-1] == 32)
|
while(stg[strlen(stg)-1] == 32)
|
||||||
stg[strlen(stg)-1] = 0;
|
stg[strlen(stg)-1] = 0;
|
||||||
|
|
||||||
if(loop == 1)
|
if(loop == 1)
|
||||||
fprintf(out, "%s\n", stg);
|
fprintf(out, "%s\n", stg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(in);
|
fclose(in);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,321 +1,321 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 by Maurus Cuelenaere
|
* Copyright (C) 2008 by Maurus Cuelenaere
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
#define VERSION "0.2"
|
#define VERSION "0.2"
|
||||||
|
|
||||||
static unsigned char* int2le(unsigned int val)
|
static unsigned char* int2le(unsigned int val)
|
||||||
{
|
{
|
||||||
static unsigned char addr[4];
|
static unsigned char addr[4];
|
||||||
addr[0] = val & 0xff;
|
addr[0] = val & 0xff;
|
||||||
addr[1] = (val >> 8) & 0xff;
|
addr[1] = (val >> 8) & 0xff;
|
||||||
addr[2] = (val >> 16) & 0xff;
|
addr[2] = (val >> 16) & 0xff;
|
||||||
addr[3] = (val >> 24) & 0xff;
|
addr[3] = (val >> 24) & 0xff;
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int le2int(unsigned char* buf)
|
static unsigned int le2int(unsigned char* buf)
|
||||||
{
|
{
|
||||||
unsigned int res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
|
unsigned int res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define PATH_SEPARATOR "\\"
|
#define PATH_SEPARATOR "\\"
|
||||||
#else
|
#else
|
||||||
#define PATH_SEPARATOR "/"
|
#define PATH_SEPARATOR "/"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
||||||
#define MIN(a, b) (a > b ? b : a)
|
#define MIN(a, b) (a > b ? b : a)
|
||||||
static char* replace(char* str)
|
static char* replace(char* str)
|
||||||
{
|
{
|
||||||
static char tmp[255];
|
static char tmp[255];
|
||||||
memcpy(tmp, str, MIN(strlen(str), 255));
|
memcpy(tmp, str, MIN(strlen(str), 255));
|
||||||
char *ptr = tmp;
|
char *ptr = tmp;
|
||||||
while(*ptr != 0)
|
while(*ptr != 0)
|
||||||
{
|
{
|
||||||
if(*ptr == 0x2F) /* /*/
|
if(*ptr == 0x2F) /* /*/
|
||||||
*ptr = 0x5C; /* \ */
|
*ptr = 0x5C; /* \ */
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool is_dir(const char* name1, const char* name2)
|
static bool is_dir(const char* name1, const char* name2)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
DIR *directory;
|
DIR *directory;
|
||||||
name = (char*)malloc(strlen(name1)+strlen(name2)+1);
|
name = (char*)malloc(strlen(name1)+strlen(name2)+1);
|
||||||
strcpy(name, name1);
|
strcpy(name, name1);
|
||||||
strcat(name, name2);
|
strcat(name, name2);
|
||||||
directory = opendir(name);
|
directory = opendir(name);
|
||||||
free(name);
|
free(name);
|
||||||
if(directory)
|
if(directory)
|
||||||
{
|
{
|
||||||
closedir(directory);
|
closedir(directory);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int _filesize(FILE* fd)
|
unsigned int _filesize(FILE* fd)
|
||||||
{
|
{
|
||||||
unsigned int tmp, oldpos;
|
unsigned int tmp, oldpos;
|
||||||
oldpos = ftell(fd);
|
oldpos = ftell(fd);
|
||||||
fseek(fd, 0, SEEK_END);
|
fseek(fd, 0, SEEK_END);
|
||||||
tmp = ftell(fd);
|
tmp = ftell(fd);
|
||||||
fseek(fd, oldpos, SEEK_SET);
|
fseek(fd, oldpos, SEEK_SET);
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
#define WRITE(x, len) if(fwrite(x, len, 1, outfile) != 1) \
|
#define WRITE(x, len) if(fwrite(x, len, 1, outfile) != 1) \
|
||||||
{ \
|
{ \
|
||||||
closedir(indir_handle); \
|
closedir(indir_handle); \
|
||||||
if(filesize > 0) \
|
if(filesize > 0) \
|
||||||
free(buffer); \
|
free(buffer); \
|
||||||
fprintf(stderr, "[ERR] Error writing to file\n"); \
|
fprintf(stderr, "[ERR] Error writing to file\n"); \
|
||||||
return; \
|
return; \
|
||||||
}
|
}
|
||||||
static void merge_hxf(const char* indir, FILE* outfile, const char* add)
|
static void merge_hxf(const char* indir, FILE* outfile, const char* add)
|
||||||
{
|
{
|
||||||
DIR *indir_handle;
|
DIR *indir_handle;
|
||||||
struct dirent *dirs;
|
struct dirent *dirs;
|
||||||
char dir[255];
|
char dir[255];
|
||||||
strcpy(dir, indir);
|
strcpy(dir, indir);
|
||||||
strcat(dir, add);
|
strcat(dir, add);
|
||||||
|
|
||||||
if((indir_handle = opendir(dir)) == NULL)
|
if((indir_handle = opendir(dir)) == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Error opening dir %s\n", indir);
|
fprintf(stderr, "[ERR] Error opening dir %s\n", indir);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while((dirs = readdir(indir_handle)) != NULL)
|
while((dirs = readdir(indir_handle)) != NULL)
|
||||||
{
|
{
|
||||||
if(strcmp(dirs->d_name, "..") != 0 &&
|
if(strcmp(dirs->d_name, "..") != 0 &&
|
||||||
strcmp(dirs->d_name, ".") != 0)
|
strcmp(dirs->d_name, ".") != 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[INFO] %s\%s\n", add, dirs->d_name);
|
fprintf(stderr, "[INFO] %s\%s\n", add, dirs->d_name);
|
||||||
if(is_dir(dir, dirs->d_name))
|
if(is_dir(dir, dirs->d_name))
|
||||||
{
|
{
|
||||||
char dir2[255];
|
char dir2[255];
|
||||||
strcpy(dir2, add);
|
strcpy(dir2, add);
|
||||||
strcat(dir2, dirs->d_name);
|
strcat(dir2, dirs->d_name);
|
||||||
strcat(dir2, PATH_SEPARATOR);
|
strcat(dir2, PATH_SEPARATOR);
|
||||||
merge_hxf(indir, outfile, dir2);
|
merge_hxf(indir, outfile, dir2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FILE *filehandle;
|
FILE *filehandle;
|
||||||
unsigned char *buffer;
|
unsigned char *buffer;
|
||||||
char file[255];
|
char file[255];
|
||||||
unsigned int filesize;
|
unsigned int filesize;
|
||||||
strcpy(file, dir);
|
strcpy(file, dir);
|
||||||
strcat(file, dirs->d_name);
|
strcat(file, dirs->d_name);
|
||||||
if((filehandle = fopen(file, "rb")) == NULL)
|
if((filehandle = fopen(file, "rb")) == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Cannot open %s\n", file);
|
fprintf(stderr, "[ERR] Cannot open %s\n", file);
|
||||||
closedir(indir_handle);
|
closedir(indir_handle);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
filesize = _filesize(filehandle);
|
filesize = _filesize(filehandle);
|
||||||
if(filesize > 0)
|
if(filesize > 0)
|
||||||
{
|
{
|
||||||
buffer = (unsigned char*)malloc(filesize);
|
buffer = (unsigned char*)malloc(filesize);
|
||||||
if(buffer == NULL)
|
if(buffer == NULL)
|
||||||
{
|
{
|
||||||
fclose(filehandle);
|
fclose(filehandle);
|
||||||
closedir(indir_handle);
|
closedir(indir_handle);
|
||||||
fprintf(stderr, "[ERR] Cannot allocate memory\n");
|
fprintf(stderr, "[ERR] Cannot allocate memory\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(fread(buffer, filesize, 1, filehandle) != 1)
|
if(fread(buffer, filesize, 1, filehandle) != 1)
|
||||||
{
|
{
|
||||||
fclose(filehandle);
|
fclose(filehandle);
|
||||||
closedir(indir_handle);
|
closedir(indir_handle);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
fprintf(stderr, "[ERR] Cannot read from %s%s%s\n", add, PATH_SEPARATOR, dirs->d_name);
|
fprintf(stderr, "[ERR] Cannot read from %s%s%s\n", add, PATH_SEPARATOR, dirs->d_name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(filehandle);
|
fclose(filehandle);
|
||||||
|
|
||||||
if(strlen(add)>0)
|
if(strlen(add)>0)
|
||||||
{
|
{
|
||||||
#ifdef _DIRENT_HAVE_D_NAMLEN
|
#ifdef _DIRENT_HAVE_D_NAMLEN
|
||||||
WRITE(int2le(dirs->d_namlen+strlen(add)), 4);
|
WRITE(int2le(dirs->d_namlen+strlen(add)), 4);
|
||||||
#else
|
#else
|
||||||
WRITE(int2le(strlen(dirs->d_name)+strlen(add)), 4);
|
WRITE(int2le(strlen(dirs->d_name)+strlen(add)), 4);
|
||||||
#endif
|
#endif
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
WRITE(replace((char*)add), strlen(add)-1);
|
WRITE(replace((char*)add), strlen(add)-1);
|
||||||
#else
|
#else
|
||||||
WRITE(add, strlen(add)-1);
|
WRITE(add, strlen(add)-1);
|
||||||
#endif
|
#endif
|
||||||
WRITE(PATH_SEPARATOR, 1);
|
WRITE(PATH_SEPARATOR, 1);
|
||||||
#ifdef _DIRENT_HAVE_D_NAMLEN
|
#ifdef _DIRENT_HAVE_D_NAMLEN
|
||||||
WRITE(dirs->d_name, dirs->d_namlen);
|
WRITE(dirs->d_name, dirs->d_namlen);
|
||||||
#else
|
#else
|
||||||
WRITE(dirs->d_name, strlen(dirs->d_name));
|
WRITE(dirs->d_name, strlen(dirs->d_name));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef _DIRENT_HAVE_D_NAMLEN
|
#ifdef _DIRENT_HAVE_D_NAMLEN
|
||||||
WRITE(int2le(dirs->d_namlen), 4);
|
WRITE(int2le(dirs->d_namlen), 4);
|
||||||
WRITE(dirs->d_name, dirs->d_namlen);
|
WRITE(dirs->d_name, dirs->d_namlen);
|
||||||
#else
|
#else
|
||||||
WRITE(int2le(strlen(dirs->d_name)), 4);
|
WRITE(int2le(strlen(dirs->d_name)), 4);
|
||||||
WRITE(dirs->d_name, strlen(dirs->d_name));
|
WRITE(dirs->d_name, strlen(dirs->d_name));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
WRITE(int2le(filesize), 4);
|
WRITE(int2le(filesize), 4);
|
||||||
if(filesize>0)
|
if(filesize>0)
|
||||||
{
|
{
|
||||||
WRITE(buffer, filesize);
|
WRITE(buffer, filesize);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir(indir_handle);
|
closedir(indir_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_usage(void)
|
static void print_usage(void)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
fprintf(stderr, "Usage: hxfmerge.exe [INPUT_DIR] [FW]\n\n");
|
fprintf(stderr, "Usage: hxfmerge.exe [INPUT_DIR] [FW]\n\n");
|
||||||
fprintf(stderr, "Example: hxfmerge.exe VX747_extracted\\ VX747.HXF\n\n");
|
fprintf(stderr, "Example: hxfmerge.exe VX747_extracted\\ VX747.HXF\n\n");
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "Usage: HXFmerge [INPUT_DIR] [FW]\n\n");
|
fprintf(stderr, "Usage: HXFmerge [INPUT_DIR] [FW]\n\n");
|
||||||
fprintf(stderr, "Example: HXFmerge VX747_extracted/ VX747.HXF\n\n");
|
fprintf(stderr, "Example: HXFmerge VX747_extracted/ VX747.HXF\n\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int checksum(FILE *file)
|
static int checksum(FILE *file)
|
||||||
{
|
{
|
||||||
int oldpos = ftell(file);
|
int oldpos = ftell(file);
|
||||||
int ret=0, i, filesize = _filesize(file)-0x40;
|
int ret=0, i, filesize = _filesize(file)-0x40;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
|
|
||||||
buf = (unsigned char*)malloc(filesize);
|
buf = (unsigned char*)malloc(filesize);
|
||||||
|
|
||||||
if(buf == NULL)
|
if(buf == NULL)
|
||||||
{
|
{
|
||||||
fseek(file, oldpos, SEEK_SET);
|
fseek(file, oldpos, SEEK_SET);
|
||||||
fprintf(stderr, "[ERR] Error while allocating memory\n");
|
fprintf(stderr, "[ERR] Error while allocating memory\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fseek(file, 0x40, SEEK_SET);
|
fseek(file, 0x40, SEEK_SET);
|
||||||
if(fread(buf, filesize, 1, file) != 1)
|
if(fread(buf, filesize, 1, file) != 1)
|
||||||
{
|
{
|
||||||
free(buf);
|
free(buf);
|
||||||
fseek(file, oldpos, SEEK_SET);
|
fseek(file, oldpos, SEEK_SET);
|
||||||
fprintf(stderr, "[ERR] Error while reading from file\n");
|
fprintf(stderr, "[ERR] Error while reading from file\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "[INFO] Computing checksum...");
|
fprintf(stderr, "[INFO] Computing checksum...");
|
||||||
|
|
||||||
for(i = 0; i < filesize; i+=4)
|
for(i = 0; i < filesize; i+=4)
|
||||||
ret += le2int(&buf[i]);
|
ret += le2int(&buf[i]);
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
fseek(file, oldpos, SEEK_SET);
|
fseek(file, oldpos, SEEK_SET);
|
||||||
|
|
||||||
fprintf(stderr, " Done!\n");
|
fprintf(stderr, " Done!\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
FILE *outfile;
|
FILE *outfile;
|
||||||
|
|
||||||
fprintf(stderr, "HXFmerge v" VERSION " - (C) 2008 Maurus Cuelenaere\n");
|
fprintf(stderr, "HXFmerge v" VERSION " - (C) 2008 Maurus Cuelenaere\n");
|
||||||
fprintf(stderr, "This is free software; see the source for copying conditions. There is NO\n");
|
fprintf(stderr, "This is free software; see the source for copying conditions. There is NO\n");
|
||||||
fprintf(stderr, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
|
fprintf(stderr, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
|
||||||
|
|
||||||
if(argc != 3)
|
if(argc != 3)
|
||||||
{
|
{
|
||||||
print_usage();
|
print_usage();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if(strcmp((char*)(argv[1]+strlen(argv[1])-1), "\\") != 0)
|
if(strcmp((char*)(argv[1]+strlen(argv[1])-1), "\\") != 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Input path must end with a \\\n");
|
fprintf(stderr, "[ERR] Input path must end with a \\\n");
|
||||||
#else
|
#else
|
||||||
if(strcmp((char*)(argv[1]+strlen(argv[1])-1), "/") != 0)
|
if(strcmp((char*)(argv[1]+strlen(argv[1])-1), "/") != 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Input path must end with a /\n");
|
fprintf(stderr, "[ERR] Input path must end with a /\n");
|
||||||
#endif
|
#endif
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((outfile = fopen(argv[2], "wb+")) == NULL)
|
if((outfile = fopen(argv[2], "wb+")) == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Cannot open %s\n", argv[2]);
|
fprintf(stderr, "[ERR] Cannot open %s\n", argv[2]);
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
fseek(outfile, 0x40, SEEK_SET);
|
fseek(outfile, 0x40, SEEK_SET);
|
||||||
|
|
||||||
merge_hxf(argv[1], outfile, "");
|
merge_hxf(argv[1], outfile, "");
|
||||||
|
|
||||||
fflush(outfile);
|
fflush(outfile);
|
||||||
|
|
||||||
fprintf(stderr, "[INFO] Filling header...\n");
|
fprintf(stderr, "[INFO] Filling header...\n");
|
||||||
|
|
||||||
#undef WRITE
|
#undef WRITE
|
||||||
#define WRITE(x, len) if(fwrite(x, len, 1, outfile) != 1) \
|
#define WRITE(x, len) if(fwrite(x, len, 1, outfile) != 1) \
|
||||||
{ \
|
{ \
|
||||||
fprintf(stderr, "[ERR] Cannot write to %s\n", argv[1]); \
|
fprintf(stderr, "[ERR] Cannot write to %s\n", argv[1]); \
|
||||||
fclose(outfile); \
|
fclose(outfile); \
|
||||||
return 4; \
|
return 4; \
|
||||||
}
|
}
|
||||||
fflush(outfile);
|
fflush(outfile);
|
||||||
fseek(outfile, 0, SEEK_SET);
|
fseek(outfile, 0, SEEK_SET);
|
||||||
WRITE("WADF0100200804111437", 20);
|
WRITE("WADF0100200804111437", 20);
|
||||||
WRITE(int2le(_filesize(outfile)), 4);
|
WRITE(int2le(_filesize(outfile)), 4);
|
||||||
WRITE(int2le(checksum(outfile)), 4);
|
WRITE(int2le(checksum(outfile)), 4);
|
||||||
WRITE(int2le(0), 4);
|
WRITE(int2le(0), 4);
|
||||||
WRITE("Chinachip PMP firmware V1.0\0\0\0\0\0", 32);
|
WRITE("Chinachip PMP firmware V1.0\0\0\0\0\0", 32);
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
|
|
||||||
fprintf(stderr, "[INFO] Done!\n");
|
fprintf(stderr, "[INFO] Done!\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,242 +1,242 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 by Maurus Cuelenaere
|
* Copyright (C) 2008 by Maurus Cuelenaere
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
#define VERSION "0.1"
|
#define VERSION "0.1"
|
||||||
|
|
||||||
static unsigned char* int2le(unsigned int val)
|
static unsigned char* int2le(unsigned int val)
|
||||||
{
|
{
|
||||||
static unsigned char addr[4];
|
static unsigned char addr[4];
|
||||||
addr[0] = val & 0xff;
|
addr[0] = val & 0xff;
|
||||||
addr[1] = (val >> 8) & 0xff;
|
addr[1] = (val >> 8) & 0xff;
|
||||||
addr[2] = (val >> 16) & 0xff;
|
addr[2] = (val >> 16) & 0xff;
|
||||||
addr[3] = (val >> 24) & 0xff;
|
addr[3] = (val >> 24) & 0xff;
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int le2int(unsigned char* buf)
|
static unsigned int le2int(unsigned char* buf)
|
||||||
{
|
{
|
||||||
unsigned int res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
|
unsigned int res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int _filesize(FILE* fd)
|
unsigned int _filesize(FILE* fd)
|
||||||
{
|
{
|
||||||
unsigned int tmp, oldpos;
|
unsigned int tmp, oldpos;
|
||||||
oldpos = ftell(fd);
|
oldpos = ftell(fd);
|
||||||
fseek(fd, 0, SEEK_END);
|
fseek(fd, 0, SEEK_END);
|
||||||
tmp = ftell(fd);
|
tmp = ftell(fd);
|
||||||
fseek(fd, oldpos, SEEK_SET);
|
fseek(fd, oldpos, SEEK_SET);
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_usage(void)
|
static void print_usage(void)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
fprintf(stderr, "Usage: hxfreplace.exe [IN_FW] [OUT_FW] [BIN_FILE]\n\n");
|
fprintf(stderr, "Usage: hxfreplace.exe [IN_FW] [OUT_FW] [BIN_FILE]\n\n");
|
||||||
fprintf(stderr, "Example: hxfreplace.exe VX747.HXF out.hxf ccpmp.bin\n\n");
|
fprintf(stderr, "Example: hxfreplace.exe VX747.HXF out.hxf ccpmp.bin\n\n");
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "Usage: HXFreplace [IN_FW] [OUT_FW] [BIN_FILE]\n\n");
|
fprintf(stderr, "Usage: HXFreplace [IN_FW] [OUT_FW] [BIN_FILE]\n\n");
|
||||||
fprintf(stderr, "Example: HXFreplace VX747.HXF out.hxf ccpmp.bin\n\n");
|
fprintf(stderr, "Example: HXFreplace VX747.HXF out.hxf ccpmp.bin\n\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int checksum(FILE *file)
|
static int checksum(FILE *file)
|
||||||
{
|
{
|
||||||
int oldpos = ftell(file);
|
int oldpos = ftell(file);
|
||||||
int ret=0, i, filesize = _filesize(file)-0x40;
|
int ret=0, i, filesize = _filesize(file)-0x40;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
|
|
||||||
buf = (unsigned char*)malloc(filesize);
|
buf = (unsigned char*)malloc(filesize);
|
||||||
|
|
||||||
if(buf == NULL)
|
if(buf == NULL)
|
||||||
{
|
{
|
||||||
fseek(file, oldpos, SEEK_SET);
|
fseek(file, oldpos, SEEK_SET);
|
||||||
fprintf(stderr, "[ERR] Error while allocating memory\n");
|
fprintf(stderr, "[ERR] Error while allocating memory\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fseek(file, 0x40, SEEK_SET);
|
fseek(file, 0x40, SEEK_SET);
|
||||||
if(fread(buf, filesize, 1, file) != 1)
|
if(fread(buf, filesize, 1, file) != 1)
|
||||||
{
|
{
|
||||||
free(buf);
|
free(buf);
|
||||||
fseek(file, oldpos, SEEK_SET);
|
fseek(file, oldpos, SEEK_SET);
|
||||||
fprintf(stderr, "[ERR] Error while reading from file\n");
|
fprintf(stderr, "[ERR] Error while reading from file\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "[INFO] Computing checksum...");
|
fprintf(stderr, "[INFO] Computing checksum...");
|
||||||
|
|
||||||
for(i = 0; i < filesize; i+=4)
|
for(i = 0; i < filesize; i+=4)
|
||||||
ret += le2int(&buf[i]);
|
ret += le2int(&buf[i]);
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
fseek(file, oldpos, SEEK_SET);
|
fseek(file, oldpos, SEEK_SET);
|
||||||
|
|
||||||
fprintf(stderr, " Done!\n");
|
fprintf(stderr, " Done!\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
FILE *infile, *outfile, *fw;
|
FILE *infile, *outfile, *fw;
|
||||||
|
|
||||||
fprintf(stderr, "HXFreplace v" VERSION " - (C) 2008 Maurus Cuelenaere\n");
|
fprintf(stderr, "HXFreplace v" VERSION " - (C) 2008 Maurus Cuelenaere\n");
|
||||||
fprintf(stderr, "This is free software; see the source for copying conditions. There is NO\n");
|
fprintf(stderr, "This is free software; see the source for copying conditions. There is NO\n");
|
||||||
fprintf(stderr, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
|
fprintf(stderr, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
|
||||||
|
|
||||||
if(argc != 4)
|
if(argc != 4)
|
||||||
{
|
{
|
||||||
print_usage();
|
print_usage();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((infile = fopen(argv[1], "rb")) == NULL)
|
if((infile = fopen(argv[1], "rb")) == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Cannot open %s\n", argv[1]);
|
fprintf(stderr, "[ERR] Cannot open %s\n", argv[1]);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fseek(infile, 0x40, SEEK_SET) != 0)
|
if(fseek(infile, 0x40, SEEK_SET) != 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Cannot seek to 0x40\n");
|
fprintf(stderr, "[ERR] Cannot seek to 0x40\n");
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "[INFO] Searching for ccpmp.bin...\n");
|
fprintf(stderr, "[INFO] Searching for ccpmp.bin...\n");
|
||||||
|
|
||||||
int found = -1;
|
int found = -1;
|
||||||
int filenamesize;
|
int filenamesize;
|
||||||
char *filename;
|
char *filename;
|
||||||
unsigned char tmp[4];
|
unsigned char tmp[4];
|
||||||
|
|
||||||
#define READ(x, len) if(fread(x, len, 1, infile) != 1) \
|
#define READ(x, len) if(fread(x, len, 1, infile) != 1) \
|
||||||
{ \
|
{ \
|
||||||
fprintf(stderr, "[ERR] Cannot read from %s\n", argv[1]); \
|
fprintf(stderr, "[ERR] Cannot read from %s\n", argv[1]); \
|
||||||
fclose(infile); \
|
fclose(infile); \
|
||||||
return 4; \
|
return 4; \
|
||||||
}
|
}
|
||||||
while(found < 0)
|
while(found < 0)
|
||||||
{
|
{
|
||||||
READ(&tmp[0], 4);
|
READ(&tmp[0], 4);
|
||||||
filenamesize = le2int(tmp);
|
filenamesize = le2int(tmp);
|
||||||
filename = (char*)malloc(filenamesize);
|
filename = (char*)malloc(filenamesize);
|
||||||
READ(filename, filenamesize);
|
READ(filename, filenamesize);
|
||||||
if(strcmp(filename, "ccpmp.bin") == 0)
|
if(strcmp(filename, "ccpmp.bin") == 0)
|
||||||
found = ftell(infile);
|
found = ftell(infile);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
READ(&tmp[0], 4);
|
READ(&tmp[0], 4);
|
||||||
fseek(infile, le2int(tmp), SEEK_CUR);
|
fseek(infile, le2int(tmp), SEEK_CUR);
|
||||||
}
|
}
|
||||||
free(filename);
|
free(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "[INFO] Found ccpmp.bin at 0x%x\n", found);
|
fprintf(stderr, "[INFO] Found ccpmp.bin at 0x%x\n", found);
|
||||||
|
|
||||||
if((outfile = fopen(argv[2], "wb+")) == NULL)
|
if((outfile = fopen(argv[2], "wb+")) == NULL)
|
||||||
{
|
{
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
fprintf(stderr, "[ERR] Cannot open %s\n", argv[2]);
|
fprintf(stderr, "[ERR] Cannot open %s\n", argv[2]);
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define WRITE(x, len) if(fwrite(x, len, 1, outfile) != 1) \
|
#define WRITE(x, len) if(fwrite(x, len, 1, outfile) != 1) \
|
||||||
{ \
|
{ \
|
||||||
fprintf(stderr, "[ERR] Cannot write to %s\n", argv[2]); \
|
fprintf(stderr, "[ERR] Cannot write to %s\n", argv[2]); \
|
||||||
fclose(outfile); \
|
fclose(outfile); \
|
||||||
if(fw != NULL) \
|
if(fw != NULL) \
|
||||||
fclose(fw); \
|
fclose(fw); \
|
||||||
return 5; \
|
return 5; \
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char* buffer;
|
unsigned char* buffer;
|
||||||
|
|
||||||
buffer = (unsigned char*)malloc(found);
|
buffer = (unsigned char*)malloc(found);
|
||||||
fseek(infile, 0, SEEK_SET);
|
fseek(infile, 0, SEEK_SET);
|
||||||
READ(buffer, found);
|
READ(buffer, found);
|
||||||
WRITE(buffer, found);
|
WRITE(buffer, found);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
|
||||||
if((fw = fopen(argv[3], "rb")) == NULL)
|
if((fw = fopen(argv[3], "rb")) == NULL)
|
||||||
{
|
{
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
fprintf(stderr, "[ERR] Cannot open %s\n", argv[3]);
|
fprintf(stderr, "[ERR] Cannot open %s\n", argv[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
int fw_filesize = _filesize(fw);
|
int fw_filesize = _filesize(fw);
|
||||||
|
|
||||||
#define READ2(x, len) if(fread(x, len, 1, fw) != 1) \
|
#define READ2(x, len) if(fread(x, len, 1, fw) != 1) \
|
||||||
{ \
|
{ \
|
||||||
fprintf(stderr, "[ERR] Cannot read from %s\n", argv[3]); \
|
fprintf(stderr, "[ERR] Cannot read from %s\n", argv[3]); \
|
||||||
fclose(infile); \
|
fclose(infile); \
|
||||||
fclose(outfile); \
|
fclose(outfile); \
|
||||||
return 6; \
|
return 6; \
|
||||||
}
|
}
|
||||||
buffer = (unsigned char*)malloc(fw_filesize);
|
buffer = (unsigned char*)malloc(fw_filesize);
|
||||||
READ2(buffer, fw_filesize);
|
READ2(buffer, fw_filesize);
|
||||||
fputc(0x20, outfile); /* Padding */
|
fputc(0x20, outfile); /* Padding */
|
||||||
WRITE(int2le(fw_filesize), 4);
|
WRITE(int2le(fw_filesize), 4);
|
||||||
WRITE(buffer, fw_filesize);
|
WRITE(buffer, fw_filesize);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
fclose(fw);
|
fclose(fw);
|
||||||
fw = NULL;
|
fw = NULL;
|
||||||
|
|
||||||
fseek(infile, found+1, SEEK_SET);
|
fseek(infile, found+1, SEEK_SET);
|
||||||
READ(&tmp, 4);
|
READ(&tmp, 4);
|
||||||
if(fseek(infile, le2int(&tmp[0]), SEEK_CUR) != 0)
|
if(fseek(infile, le2int(&tmp[0]), SEEK_CUR) != 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[INFO] Cannot seek into %s\n", argv[1]);
|
fprintf(stderr, "[INFO] Cannot seek into %s\n", argv[1]);
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
return 7;
|
return 7;
|
||||||
}
|
}
|
||||||
found = ftell(infile);
|
found = ftell(infile);
|
||||||
|
|
||||||
int other_size = _filesize(infile) - found;
|
int other_size = _filesize(infile) - found;
|
||||||
buffer = (unsigned char*)malloc(other_size);
|
buffer = (unsigned char*)malloc(other_size);
|
||||||
READ(buffer, other_size);
|
READ(buffer, other_size);
|
||||||
WRITE(buffer, other_size);
|
WRITE(buffer, other_size);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
|
|
||||||
fflush(outfile);
|
fflush(outfile);
|
||||||
fseek(outfile, 0x14, SEEK_SET);
|
fseek(outfile, 0x14, SEEK_SET);
|
||||||
WRITE(int2le(_filesize(outfile)), 4);
|
WRITE(int2le(_filesize(outfile)), 4);
|
||||||
WRITE(int2le(checksum(outfile)), 4);
|
WRITE(int2le(checksum(outfile)), 4);
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
|
|
||||||
fprintf(stderr, "[INFO] Done!\n");
|
fprintf(stderr, "[INFO] Done!\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,321 +1,321 @@
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* __________ __ ___.
|
* __________ __ ___.
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 by Maurus Cuelenaere
|
* Copyright (C) 2008 by Maurus Cuelenaere
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#define VERSION "0.2"
|
#define VERSION "0.2"
|
||||||
|
|
||||||
struct header{
|
struct header{
|
||||||
char main_header[20];
|
char main_header[20];
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
unsigned int checksum;
|
unsigned int checksum;
|
||||||
unsigned int unknown;
|
unsigned int unknown;
|
||||||
char other_header[32];
|
char other_header[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
static char* basepath(char* path)
|
static char* basepath(char* path)
|
||||||
{
|
{
|
||||||
static char tmp[255];
|
static char tmp[255];
|
||||||
char *ptr, *ptr2, *ptr3;
|
char *ptr, *ptr2, *ptr3;
|
||||||
ptr = path;
|
ptr = path;
|
||||||
ptr2 = (char*)tmp;
|
ptr2 = (char*)tmp;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
ptr3 = strrchr(path, 0x5C);
|
ptr3 = strrchr(path, 0x5C);
|
||||||
#else
|
#else
|
||||||
ptr3 = strrchr(path, 0x2F);
|
ptr3 = strrchr(path, 0x2F);
|
||||||
#endif
|
#endif
|
||||||
while((int)ptr < (int)ptr3)
|
while((int)ptr < (int)ptr3)
|
||||||
{
|
{
|
||||||
*ptr2 = *ptr;
|
*ptr2 = *ptr;
|
||||||
ptr++;
|
ptr++;
|
||||||
ptr2++;
|
ptr2++;
|
||||||
}
|
}
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
*ptr2 = 0x5C;
|
*ptr2 = 0x5C;
|
||||||
#else
|
#else
|
||||||
*ptr2 = 0x2F;
|
*ptr2 = 0x2F;
|
||||||
#endif
|
#endif
|
||||||
ptr2++;
|
ptr2++;
|
||||||
*ptr2 = 0;
|
*ptr2 = 0;
|
||||||
return (char*)tmp;
|
return (char*)tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
static void replace(char* str)
|
static void replace(char* str)
|
||||||
{
|
{
|
||||||
char *ptr = str;
|
char *ptr = str;
|
||||||
while(*ptr != 0)
|
while(*ptr != 0)
|
||||||
{
|
{
|
||||||
if(*ptr == 0x5C) /* \ */
|
if(*ptr == 0x5C) /* \ */
|
||||||
*ptr = 0x2F; /* / */
|
*ptr = 0x2F; /* / */
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static unsigned int le2int(unsigned char* buf)
|
static unsigned int le2int(unsigned char* buf)
|
||||||
{
|
{
|
||||||
unsigned int res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
|
unsigned int res = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define PATH_SEPARATOR '\\'
|
#define PATH_SEPARATOR '\\'
|
||||||
#else
|
#else
|
||||||
#define PATH_SEPARATOR '/'
|
#define PATH_SEPARATOR '/'
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static unsigned int __mkdir(const char *path)
|
static unsigned int __mkdir(const char *path)
|
||||||
{
|
{
|
||||||
char opath[256];
|
char opath[256];
|
||||||
char *p;
|
char *p;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
strncpy(opath, path, sizeof(opath));
|
strncpy(opath, path, sizeof(opath));
|
||||||
len = strlen(opath);
|
len = strlen(opath);
|
||||||
if(opath[len - 1] == PATH_SEPARATOR)
|
if(opath[len - 1] == PATH_SEPARATOR)
|
||||||
opath[len - 1] = '\0';
|
opath[len - 1] = '\0';
|
||||||
for(p = opath; *p; p++)
|
for(p = opath; *p; p++)
|
||||||
if(*p == PATH_SEPARATOR)
|
if(*p == PATH_SEPARATOR)
|
||||||
{
|
{
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
if(access(opath, F_OK))
|
if(access(opath, F_OK))
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
mkdir(opath);
|
mkdir(opath);
|
||||||
#else
|
#else
|
||||||
mkdir(opath, S_IRWXU);
|
mkdir(opath, S_IRWXU);
|
||||||
#endif
|
#endif
|
||||||
*p = PATH_SEPARATOR;
|
*p = PATH_SEPARATOR;
|
||||||
}
|
}
|
||||||
if(access(opath, F_OK))
|
if(access(opath, F_OK))
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
return mkdir(opath);
|
return mkdir(opath);
|
||||||
#else
|
#else
|
||||||
return mkdir(opath, S_IRWXU);
|
return mkdir(opath, S_IRWXU);
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static bool dir_exists(const char *dir)
|
static bool dir_exists(const char *dir)
|
||||||
{
|
{
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
memset(&buf, 0, sizeof(struct stat));
|
memset(&buf, 0, sizeof(struct stat));
|
||||||
printf("start: %s\n", dir);
|
printf("start: %s\n", dir);
|
||||||
char *dir_cpy = (char*)malloc(strlen(dir));
|
char *dir_cpy = (char*)malloc(strlen(dir));
|
||||||
strcpy(dir_cpy, dir);
|
strcpy(dir_cpy, dir);
|
||||||
printf("%s\n", dir_cpy);
|
printf("%s\n", dir_cpy);
|
||||||
int tmp = (int)dir_cpy;
|
int tmp = (int)dir_cpy;
|
||||||
while(*dir_cpy != 0)
|
while(*dir_cpy != 0)
|
||||||
{
|
{
|
||||||
dir_cpy++;
|
dir_cpy++;
|
||||||
if(*dir_cpy == PATH_SEPARATOR && *(dir_cpy+1) == 0)
|
if(*dir_cpy == PATH_SEPARATOR && *(dir_cpy+1) == 0)
|
||||||
*dir_cpy = 0;
|
*dir_cpy = 0;
|
||||||
}
|
}
|
||||||
printf("while_done\n");
|
printf("while_done\n");
|
||||||
dir_cpy = (char*)tmp;
|
dir_cpy = (char*)tmp;
|
||||||
printf("statting %s...\n", dir_cpy);
|
printf("statting %s...\n", dir_cpy);
|
||||||
tmp = stat(dir_cpy, &buf);
|
tmp = stat(dir_cpy, &buf);
|
||||||
printf("chk_dir(%s) = %d\n", dir_cpy, tmp);
|
printf("chk_dir(%s) = %d\n", dir_cpy, tmp);
|
||||||
free(dir_cpy);
|
free(dir_cpy);
|
||||||
return tmp == 0;
|
return tmp == 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool file_exists(const char *file)
|
static bool file_exists(const char *file)
|
||||||
{
|
{
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
return stat(file, &buf) == 0;
|
return stat(file, &buf) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int split_hxf(const unsigned char* infile, unsigned int size, const char* outpath)
|
static int split_hxf(const unsigned char* infile, unsigned int size, const char* outpath)
|
||||||
{
|
{
|
||||||
FILE *outfile;
|
FILE *outfile;
|
||||||
char *filename;
|
char *filename;
|
||||||
unsigned int filenamesize, filesize;
|
unsigned int filenamesize, filesize;
|
||||||
while(size > 0)
|
while(size > 0)
|
||||||
{
|
{
|
||||||
filenamesize = le2int((unsigned char*)infile);
|
filenamesize = le2int((unsigned char*)infile);
|
||||||
infile += 4;
|
infile += 4;
|
||||||
size -= 4;
|
size -= 4;
|
||||||
if(size > 0)
|
if(size > 0)
|
||||||
{
|
{
|
||||||
filename = (char*)calloc(1, filenamesize+1+strlen(outpath));
|
filename = (char*)calloc(1, filenamesize+1+strlen(outpath));
|
||||||
memcpy(filename, outpath, strlen(outpath));
|
memcpy(filename, outpath, strlen(outpath));
|
||||||
memcpy(&filename[strlen(outpath)], infile, filenamesize);
|
memcpy(&filename[strlen(outpath)], infile, filenamesize);
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
replace(filename);
|
replace(filename);
|
||||||
#endif
|
#endif
|
||||||
infile += filenamesize + 1; /* + padding */
|
infile += filenamesize + 1; /* + padding */
|
||||||
size -= filenamesize + 1;
|
size -= filenamesize + 1;
|
||||||
|
|
||||||
filesize = le2int((unsigned char*)infile);
|
filesize = le2int((unsigned char*)infile);
|
||||||
infile += 4;
|
infile += 4;
|
||||||
size -= 4;
|
size -= 4;
|
||||||
#if 0
|
#if 0
|
||||||
if(!dir_exists(basepath(filename)))
|
if(!dir_exists(basepath(filename)))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
printf("[INFO] %s\n", basepath(filename));
|
printf("[INFO] %s\n", basepath(filename));
|
||||||
if(__mkdir(basepath(filename)) != 0)
|
if(__mkdir(basepath(filename)) != 0)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
fprintf(stderr, "[ERR] Error creating directory %s\n", basepath(filename));
|
fprintf(stderr, "[ERR] Error creating directory %s\n", basepath(filename));
|
||||||
return -3;
|
return -3;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!file_exists(filename))
|
if(!file_exists(filename))
|
||||||
{
|
{
|
||||||
printf("[INFO] %s: %d bytes\n", filename, filesize);
|
printf("[INFO] %s: %d bytes\n", filename, filesize);
|
||||||
if((outfile = fopen(filename, "wb")) == NULL)
|
if((outfile = fopen(filename, "wb")) == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Error opening file %s\n", filename);
|
fprintf(stderr, "[ERR] Error opening file %s\n", filename);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(filesize>0)
|
if(filesize>0)
|
||||||
{
|
{
|
||||||
if(fwrite(infile, filesize, 1, outfile) != 1)
|
if(fwrite(infile, filesize, 1, outfile) != 1)
|
||||||
{
|
{
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
fprintf(stderr, "[ERR] Error writing to file %s\n", filename);
|
fprintf(stderr, "[ERR] Error writing to file %s\n", filename);
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
infile += filesize;
|
infile += filesize;
|
||||||
size -= filesize;
|
size -= filesize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_usage(void)
|
static void print_usage(void)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
fprintf(stderr, "Usage: hxfsplit.exe [FW] [OUTPUT_DIR]\n\n");
|
fprintf(stderr, "Usage: hxfsplit.exe [FW] [OUTPUT_DIR]\n\n");
|
||||||
fprintf(stderr, "Example: hxfsplit.exe VX747.HXF VX747_extracted\\\n\n");
|
fprintf(stderr, "Example: hxfsplit.exe VX747.HXF VX747_extracted\\\n\n");
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "Usage: HXFsplit [FW] [OUTPUT_DIR]\n\n");
|
fprintf(stderr, "Usage: HXFsplit [FW] [OUTPUT_DIR]\n\n");
|
||||||
fprintf(stderr, "Example: HXFsplit VX747.HXF VX747_extracted/\n\n");
|
fprintf(stderr, "Example: HXFsplit VX747.HXF VX747_extracted/\n\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
FILE *infile;
|
FILE *infile;
|
||||||
struct header hdr;
|
struct header hdr;
|
||||||
unsigned char *inbuffer;
|
unsigned char *inbuffer;
|
||||||
|
|
||||||
fprintf(stderr, "HXFsplit v" VERSION " - (C) 2008 Maurus Cuelenaere\n");
|
fprintf(stderr, "HXFsplit v" VERSION " - (C) 2008 Maurus Cuelenaere\n");
|
||||||
fprintf(stderr, "This is free software; see the source for copying conditions. There is NO\n");
|
fprintf(stderr, "This is free software; see the source for copying conditions. There is NO\n");
|
||||||
fprintf(stderr, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
|
fprintf(stderr, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
|
||||||
|
|
||||||
if(argc != 3)
|
if(argc != 3)
|
||||||
{
|
{
|
||||||
print_usage();
|
print_usage();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if(strcmp((char*)(argv[2]+strlen(argv[2])-1), "\\") != 0)
|
if(strcmp((char*)(argv[2]+strlen(argv[2])-1), "\\") != 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Output path must end with a \\\n");
|
fprintf(stderr, "[ERR] Output path must end with a \\\n");
|
||||||
#else
|
#else
|
||||||
if(strcmp((char*)(argv[2]+strlen(argv[2])-1), "/") != 0)
|
if(strcmp((char*)(argv[2]+strlen(argv[2])-1), "/") != 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Output path must end with a /\n");
|
fprintf(stderr, "[ERR] Output path must end with a /\n");
|
||||||
#endif
|
#endif
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((infile = fopen(argv[1], "rb")) == NULL)
|
if((infile = fopen(argv[1], "rb")) == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "[ERR] Cannot open %s\n", argv[1]);
|
fprintf(stderr, "[ERR] Cannot open %s\n", argv[1]);
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((inbuffer = (unsigned char*)malloc(sizeof(struct header))) == NULL)
|
if((inbuffer = (unsigned char*)malloc(sizeof(struct header))) == NULL)
|
||||||
{
|
{
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
fprintf(stderr, "[ERR] Error allocating %d bytes buffer\n", sizeof(struct header));
|
fprintf(stderr, "[ERR] Error allocating %d bytes buffer\n", sizeof(struct header));
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fread(inbuffer, sizeof(struct header), 1, infile) != 1)
|
if(fread(inbuffer, sizeof(struct header), 1, infile) != 1)
|
||||||
{
|
{
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
fprintf(stderr, "Cannot read header of %s\n", argv[1]);
|
fprintf(stderr, "Cannot read header of %s\n", argv[1]);
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(hdr.main_header, inbuffer, 20);
|
memcpy(hdr.main_header, inbuffer, 20);
|
||||||
hdr.size = le2int(&inbuffer[20]);
|
hdr.size = le2int(&inbuffer[20]);
|
||||||
hdr.checksum = le2int(&inbuffer[24]);
|
hdr.checksum = le2int(&inbuffer[24]);
|
||||||
hdr.unknown = le2int(&inbuffer[28]);
|
hdr.unknown = le2int(&inbuffer[28]);
|
||||||
memcpy(hdr.other_header, &inbuffer[32], 32);
|
memcpy(hdr.other_header, &inbuffer[32], 32);
|
||||||
free(inbuffer);
|
free(inbuffer);
|
||||||
|
|
||||||
if(strcmp(hdr.other_header, "Chinachip PMP firmware V1.0") != 0)
|
if(strcmp(hdr.other_header, "Chinachip PMP firmware V1.0") != 0)
|
||||||
{
|
{
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
fprintf(stderr, "[ERR] Header doesn't match\n");
|
fprintf(stderr, "[ERR] Header doesn't match\n");
|
||||||
return 6;
|
return 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((inbuffer = (unsigned char*)malloc(hdr.size)) == NULL)
|
if((inbuffer = (unsigned char*)malloc(hdr.size)) == NULL)
|
||||||
{
|
{
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
fprintf(stderr, "[ERR] Error allocating %d bytes buffer\n", hdr.size);
|
fprintf(stderr, "[ERR] Error allocating %d bytes buffer\n", hdr.size);
|
||||||
return 7;
|
return 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
fseek(infile, sizeof(struct header), SEEK_SET);
|
fseek(infile, sizeof(struct header), SEEK_SET);
|
||||||
|
|
||||||
if(fread(inbuffer, hdr.size-sizeof(struct header), 1, infile) != 1)
|
if(fread(inbuffer, hdr.size-sizeof(struct header), 1, infile) != 1)
|
||||||
{
|
{
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
free(inbuffer);
|
free(inbuffer);
|
||||||
fprintf(stderr, "[ERR] Cannot read file in buffer\n");
|
fprintf(stderr, "[ERR] Cannot read file in buffer\n");
|
||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
|
|
||||||
split_hxf(inbuffer, hdr.size-sizeof(struct header), argv[2]);
|
split_hxf(inbuffer, hdr.size-sizeof(struct header), argv[2]);
|
||||||
|
|
||||||
free(inbuffer);
|
free(inbuffer);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue