Files
seta75D 2e8a93c394 Init
2021-10-11 18:20:23 -03:00

114 lines
3.0 KiB
ArmAsm

.data
.asciz "@(#)srt0.s 1.1 92/07/30 SMI";
.even
#include "assym.s"
| This variable is used in the DELAY macro. 5 is the right value for
| 68010's running 10MHz. 3 is the right value for 68020's running 16MHz
| with cache on. (4x as fast at doing the delay loop.) Other values
| should be empirically determined as needed.
|
| It's critical that the value be no SMALLER than required, e.g. the
| DELAY macro guarantees a MINIMUM delay, not a maximum.
.globl _cpudelay
_cpudelay:
.long 3 | Multiplier for DELAY macro.
.text
| Copyright (c) 1988 by Sun Microsystems, Inc.
|
| Startup code for standalone system
|
.globl _end
.globl _edata
.globl _main
.globl __exit
.globl __exitto
HIGH = 0x2700
.globl _start
_start:
#ifdef BOOTBLOCK
| The following globals are filled in by installboot (qv)
| after bootxx is built. They contain the block numbers
| where /boot may be found.
|
| This data table must be above _start, since only what is
| above _start is copied to high memory. That means we
| have to jump over the data, hence _start1.
|
.globl start1, _bootb, _bbsize, _bbchecksum
jmp start1
_bootb:
| should be NBLKENTRIES (64), see installboot.c
.long 0,0,0,0,0,0,0,0 | room for boot_tab
.long 0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0
.long 0,0,0,0,0,0,0,0
_bbsize: .long 0
_bbchecksum: .long 0
start1:
#endif /* BOOTBLOCK */
movw #HIGH,sr | just in case
leax: lea pc@(_start-(leax+2)),a0 | True current location of "_start"
lea _start:l,a1 | Desired location of "_start"
movl a0,d3 | save source address (njl)
movl a1,d4 | save destination address (njl)
cmpl a0,a1
jeq gobegin | If the same, just go do it.
movl #_end,d0 | Desired end of program
subl a1,d0 | Calculate length, round up.
lsrl #2,d0
movl d0,d5 | save length in words (njl)
movc: movl a0@+,a1@+ | Move it where it belongs.
dbra d0,movc
| Turn on the cache...
moveq #CACR_CLEAR+CACR_ENABLE,d0
movc d0,cacr
jmp begin:l | Force non-PCrel jump
begin:
| We create a stack below the booter for use by the thing we are loading
movl sp,LOAD-4:l
movl #LOAD-4,sp
movl #_edata,a0
clr:
clrl a0@+
cmpl #_end,a0
ble clr
#ifdef sun2
jsr _setkcontext
#endif
| reset translation table to prevent YYY
movl V_TRANSLATION,a0
movl a0@, d0
movl #1, a0@
clrl sp@- | argv = 0 for now.
clrl sp@- | argc = 0 for now.
jsr _main
addqw #8,sp
jsr _exit | after main() returns, call exit().
| Just fall thru into __exit if exit() ever returns.
__exit:
movl LOAD-4:l,sp | Restore caller's stack pointer
rts | Return to caller (PROM probably)
| Transfer control to a new program, passing on the same arguments that
| we (srt0.s) received when we were started. Note that this does NOT call
| exit() -- you'd better close your files yourself.
__exitto:
movl sp@(4),a0 | Address to call
movl LOAD-4:l,sp | Restore caller's stack pointer
jra a0@ | Jump to callee using caller's stk