NetBSD/sys/arch/amiga/stand/bootblock/boot/bbstart.s

185 lines
4.3 KiB
ArmAsm

/*
* $NetBSD: bbstart.s,v 1.2 1997/01/21 18:26:10 is Exp $
*
* Copyright (c) 1996 Ignatios Souvatzis
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Ignatios Souvatzis
* for the NetBSD project.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "aout2bb.h"
#define LVOAllocMem -0x0c6
#define LVODoIO -0x1c8
#define LVOCacheClearU -0x27c
#define IOcmd 28
#define IOerr 31
#define IOlen 36
#define IObuf 40
#define IOoff 44
#define Cmd_Rd 2
.globl _configure
.globl _pain
.text
Lzero: .asciz "DOS" | "DOS type"
/*
* We put the relocator version here, for aout2bb, which replaces
* it with the bootblock checksum.
*/
Chksum: .long RELVER_RELATIVE_BYTES_FORWARD
Filesz: .long 8192 | dummy
/*
* Entry point from Kickstart.
* A1 points to an IOrequest, A6 points to ExecBase, we have a stack.
* _must_ be at offset 12.
*/
.globl _start
_start:
#ifdef AUTOLOAD
jra Lautoload
#else
jra Lrelocate
#endif
Lreltab:
.word 0 | aout2bb puts the reloc table address here
#ifdef AUTOLOAD
/*
* autoload
*/
Lautoload:
movl a6,sp@- |SysBase
movl a1,sp@- |IORequest
movl #AUTOLOAD,d0 |Howmuch
movl d0,a1@(IOlen) | for the actual read...
movl #0x10001,d1 |MEMF_CLEAR|MEMF_PUBLIC
jsr a6@(LVOAllocMem)
movl sp@+,a1 |IORequest
movl sp@+,a6 |SysBase
orl d0,d0
jne Lgotmem
movql #1,d0
rts
Lgotmem:
movl d0,sp@- |Address
movl a1@(IOoff),sp@- |Old offset
movl a1,sp@-
movl a6,sp@-
/* we've set IOlen above */
movl d0,a1@(IObuf)
movw #Cmd_Rd,a1@(IOcmd)
jsr a6@(LVODoIO)
movl sp@+,a6
movl sp@+,a1
movl sp@+,a1@(IOoff)
tstb a1@(IOerr)
jne Lioerr
addl #Lrelocate-Lzero,sp@
movl a6,sp@-
jsr a6@(LVOCacheClearU)
movl sp@+,a6
rts
Lioerr:
movql #1,d0
addql #4,sp
rts
#endif
/*
* Relocate ourselves, at the same time clearing the relocation table
* (in case it overlaps with BSS).
*
* Register usage:
* A2: points into the reloc table, located at our end.
* A0: pointer to the longword to relocate.
* D0: word offset of longword to relocate
* D1: points to our start.
*
* Table has relative byte offsets, if a byte offset is zero, it is
* followed by an absolute word offset. If this is zero, too, table
* end is reached.
*/
Lrelocate:
lea pc@(Lzero),a0
movl a0,d1
movw pc@(Lreltab),a2
addl d1,a2
jra Loopend
Loopw:
clrw a2@+
movl d1,a0 | for a variant with relative words, erase this line
Loopb:
addl d0,a0
addl d1,a0@
Loopend:
movq #0,d0
movb a2@,d0
clrb a2@+ | bfclr a2@+{0:8} is still two shorts
tstb d0 | we could save one short by using casb d0,d0,a2@+
jne Loopb
movw a2@,d0
jne Loopw
Lendtab:
movl a6,sp@-
jsr a6@(LVOCacheClearU)
movl sp@+,a6
/* We are relocated. Now it is safe to initialize _SysBase: */
movl a6,_SysBase
movl a1,sp@-
bsr _configure
addql #4,sp
tstl d0
jne Lerr
bsr _pain
Lerr:
movq #1,d0
rts
.comm _SysBase,4