; $NetBSD$

;
; Copyright (c) 1994 Mark Brinicombe.
; Copyright (c) 1994 Brini.
; All rights reserved.
;
; This code is derived from software written for Brini by Mark Brinicombe
;
; 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 Brini.
; 4. The name of the company nor the name of the author may be used to
;    endorse or promote products derived from this software without specific
;    prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY BRINI ``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 REGENTS OR CONTRIBUTORS 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.
;
; RiscBSD kernel project
;
; _main.s
;
; boot loader entry point
;
; Created      : 12/09/94
; Last updated : 12/09/94
;
; Based on kate/boot/_main.s
;
;    $Id$
;

	GET	h.asmregs

        AREA	|C$$code|, CODE, READONLY

	ENTRY

        IMPORT  |_main|
        EXPORT  |__main|

|__main|
        SWI     &20010                  ; OS_GetEnv
        MOV     sp,a2
        SUB     sl,sp,#2048

        LDR     a4,[pc,#|__cli_ptr|-.-8]
        STR     a1,[a4,#0]
        LDR     a4,[pc,#|__himem_ptr|-.-8]
        STR     a2,[a4,#0]
        LDR     a4,[pc,#|__stack_ptr|-.-8]
        STR     sl,[a4,#0]
        LDMIA   a3,{a1,a2}
        AND     a2,a2,#&ff
        LDR     a3,[pc,#|__time_ptr|-.-8]
        STMIA   a3,{a1,a2}
        LDR     a4,[pc,#|__robase_ptr|-.-8]
        LDR     a1,[a4,#0]
        LDR     a4,[pc,#|__base_ptr|-.-8]
        STR     a1,[a4,#0]
        LDR     a4,[pc,#|__rwlimit_ptr|-.-8]
        LDR     a1,[a4,#0]
        LDR     a4,[pc,#|__lomem_ptr|-.-8]
        STR     a1,[a4,#0]
        LDR     a4,[pc,#|__break_ptr|-.-8]
        STR     a1,[a4,#0]

        CMP     sl,a1
        MOVLSS  pc,lr                   ; no stack - exit fast
        ADD     sl,sl,#256
        MOV     fp,#0
        LDR     a1,[pc,#|__alloca_list_ptr|-.-8]
        CMP     a1,#0
        STRNE   fp,[a1,#0]
        B       |_main|


        IMPORT  |Image$$RO$$Base|
        IMPORT  |Image$$RW$$Base|
        IMPORT  |Image$$RW$$Limit|

|__cli_ptr|
        DCD     |__cli|

|__robase_ptr|
        DCD     |__robase|
|__base_ptr|
        DCD     |__base|
|__rwbase_ptr|
        DCD     |__rwbase|
|__rwlimit_ptr|
        DCD     |__rwlimit|
|__himem_ptr|
        DCD     |__himem|
|__lomem_ptr|
        DCD     |__lomem|

|__break_ptr|
        DCD     |__break|
|__stack_ptr|
        DCD     |__stack|

|__time_ptr|
        DCD     |__time|

        IMPORT  |__alloca_list|,WEAK
|__alloca_list_ptr|
        DCD     |__alloca_list|

        IMPORT  |__uname_dont_pack|,WEAK
        EXPORT  |__uname_dont_pack_ptr|
|__uname_dont_pack_ptr|
        DCD     |__uname_dont_pack|



        EXPORT  |__cli|         ; CLI from OS_GetEnv
|__cli|
        DCD     0

        EXPORT  |__base|        ; BASE (application = 0x8000)
|__robase|
        DCD     |Image$$RO$$Base|
|__base|
        DCD     0
        EXPORT  |__lomem|       ; LOMEM
|__rwbase|
        DCD     |Image$$RW$$Base|
|__rwlimit|
        DCD     |Image$$RW$$Limit|
|__lomem|
        DCD     0
        EXPORT  |__himem|       ; HIMEM from OS_GetEnv
|__himem|
        DCD     0

        EXPORT  |__break|       ; the 'break'
|__break|
        DCD     0
        EXPORT  |__stack|       ; stack limit
|__stack|
        DCD     0

        EXPORT  |__time|        ; start time - 5 byte format
|__time|
        DCD     0               ; low word
        DCD     0               ; high byte

        END
