Files
upx/src/stub/src/mipsel.r3000-ps1.asm
T
2006-08-11 11:18:01 +02:00

291 lines
7.2 KiB
NASM

/*
; mipsel.r3000-ps1.asm -- ps1/exe program entry & decompressor
;
; This file is part of the UPX executable compressor.
;
; Copyright (C) 1996-2006 Markus Franz Xaver Johannes Oberhumer
; Copyright (C) 1996-2006 Laszlo Molnar
; Copyright (C) 2002-2006 Jens Medoch
; All Rights Reserved.
;
; UPX and the UCL library are free software; you can redistribute them
; and/or modify them under the terms of the GNU General Public License as
; published by the Free Software Foundation; either version 2 of
; the License, or (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; see the file COPYING.
; If not, write to the Free Software Foundation, Inc.,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;
; Markus F.X.J. Oberhumer Laszlo Molnar
; <mfx@users.sourceforge.net> <ml1050@users.sourceforge.net>
;
; Jens Medoch
; <jssg@users.sourceforge.net>
;
*/
.set mips1
.altmacro
.set noreorder
.set noat
#include "arch/mips/mipsel.r3000/macros.ash"
#include "arch/mips/mipsel.r3000/bits.ash"
/*
=============
============= none
=============
*/
.if (PS1)
SZ_REG = 4
.else
SZ_REG = 8
.endif
.macro mCDBOOT s
.if (\s == 1)
REG_SZ = (5*SZ_REG)
CDBOOT = 1
.else
REG_SZ = (6*SZ_REG)
CDBOOT = 0
.endif
.endm
.macro regs _w, ok
\_w pc,SZ_REG*0(sp)
\_w src,SZ_REG*1(sp)
\_w cnt,SZ_REG*2(sp)
\_w a3,SZ_REG*3(sp)
\_w ra,SZ_REG*4(sp)
REG_SZ = (5*SZ_REG)
.if (\ok == 1)
\_w tmp,SZ_REG*5(sp)
REG_SZ = (6*SZ_REG)
.endif
.endm
.macro push ok = 0
.if (PS1)
regs sw,\ok
.else
regs sd,\ok
.endif
.endm
.macro pop ok = 0
.if (PS1)
regs lw,\ok
.else
regs ld,\ok
.endif
.endm
.macro SysFlushCache
.if (PS1)
PRINT ("SYSCALL PS1")
li t2,160
jalr ra,t2
li t1,68
.else
PRINT ("SYSCALL PS2")
move a0, zero
li v1, 100
syscall
.endif
.endm
#define CLzmaDecoderState a0 /* CLzmaDecoderState */
#define inStream a1
#define inSize a2
#define pinSizeprocessed a3 /* inSizeprocessed */
#define outStream t0
#define outSize t1
#define poutSizeProcessed t2
#define dst_save 0*SZ_REG
#define outSizeProcessed 1*SZ_REG
#define inSizeProcessed 2*SZ_REG
lzma_args_sz = 4*SZ_REG
/*
=============
============= ENTRY POINT cd-boot
=============
*/
mCDBOOT 1
section cdb.start
la t0,PSVR // prepare to compute value
subu t0,s0,t0 // get stored header offset in mem
jr t0
subiu sp,REG_SZ // prep to adjust stack
section cdb.entry
push // push used regs
la src,CPDO // load compressed data offset
section cdb.start.lzma
la t0,PSVR // prepare to compute value
subu t0,s0,t0 // get stored header offset in mem
li tmp,%lo(LS+REG_SZ) // size of decomp. routine
jr t0
subu sp,tmp // adjust the stack with this size
section cdb.entry.lzma
push 1 // push used regs
addiu src,t0,lzma_cpr // load compressed data offset
addiu dst,sp,REG_SZ
section cdb.lzma.cpr
la src,CPDO // load compressed data offset
section cdb.dec.ptr
la dst,DECO // load decompress data offset
section cdb.dec.ptr.hi
lui dst,%hi(DECO)
section cdb.exit
SysFlushCache
pop // pop used regs with marker for entry
j entry
addiu sp,REG_SZ
/*
=============
============= ENTRY POINT console
=============
*/
mCDBOOT 0
section con.start
li tmp,%lo(LS+REG_SZ) // size of decomp. routine
subu sp,tmp // adjust the stack with this size
push 1 // push used regs
subiu cnt,tmp,REG_SZ // cnt = counter copyloop
addiu pc,sp,REG_SZ // get offset for decomp. routine
move dst,pc
la src,DCRT // load decompression routine's offset
section con.mcpy
1: lw var,0(src) // memcpy
subiu cnt,4
sw var,0(dst)
addiu src,4
bnez cnt,1b
addiu dst,4
section lzma.prep
addiu pc,dst,%lo(lzma_init_off)
section con.padcd
addiu src,%lo(PAD) // pointer compressed data
section dec.ptr
lui dst,%hi(DECO) // load decompress data offset
jr pc
addiu dst,%lo(DECO)
section dec.ptr.hi
jr pc
lui dst,%hi(DECO)
section con.entry
section con.exit
SysFlushCache
pop 1 // pop used regs with marker for entry
j entry
addu sp,tmp
// =============
section memset.short
li cnt,%lo(SC) // amount of removed zero's at eof
1: sw zero,0(dst)
subiu cnt,1
bnez cnt,1b
addiu dst,4
section memset.long
li cnt,%lo(SC) // amount of removed zero's at eof
sll cnt,3 // (cd mode 2 data sector alignment)
1: sw zero,0(dst)
subiu cnt,1
bnez cnt,1b
addiu dst,4
/*
=============
============= DECOMPRESSION
=============
*/
#include "arch/mips/mipsel.r3000/nrv2b_d.ash"
#include "arch/mips/mipsel.r3000/nrv2d_d.ash"
#include "arch/mips/mipsel.r3000/nrv2e_d.ash"
// ========== cd-boot
UCL_init 8,0,1
section nrv2b.8bit
build full, nrv2b
section nrv2d.8bit
build full, nrv2d
section nrv2e.8bit
build full, nrv2e
UCL_init 32,0,1
section nrv2b.32bit
build full, nrv2b
section nrv2d.32bit
build full, nrv2d
section nrv2e.32bit
build full, nrv2e
// ========== console-run
UCL_init 8,1,0
section gb.8bit.sub
build sub_only
UCL_init 32,1,0
section gb.32bit.sub
build sub_only
section nrv2b.small
build without_sub, nrv2b
section nrv2d.small
build without_sub, nrv2d
section nrv2e.small
build without_sub, nrv2e
section nrv.small.done
decomp_done:
#include "arch/mips/mipsel.r3000/lzma_d.S"
#include "include/header2.ash"
// vi:ts=8:et:nowrap