Annotation of researchv9/sys/boot/stand/srt0.s, revision 1.1.1.1

1.1       root        1:        .data
                      2:        .asciz  "@(#)srt0.s     1.1 86/02/03    Copyr 1985 Sun Micro";
                      3:        .even
                      4: | This variable is used in the DELAY macro.  5 is the right value for
                      5: | 68010's running 10MHz.  3 is the right value for 68020's running 16MHz
                      6: | with cache on.  (4x as fast at doing the delay loop.)  Other values
                      7: | should be empirically determined as needed.  Srt0.s sets this value
                      8: | based on the actual runtime environment encountered.
                      9: |
                     10: | It's critical that the value be no SMALLER than required, e.g. the
                     11: | DELAY macro guarantees a MINIMUM delay, not a maximum.
                     12:        .globl  _cpudelay
                     13: _cpudelay:
                     14:        .long   5                       | Multiplier for DELAY macro.
                     15: 
                     16:        .text
                     17: 
                     18: |      Copyright (c) 1985 by Sun Microsystems, Inc.
                     19: 
                     20: |
                     21: | Startup code for standalone system
                     22: |
                     23: 
                     24:        .globl  _end
                     25:        .globl  _edata
                     26:        .globl  _main
                     27:        .globl  __exit
                     28:        .globl  __exitto
                     29: 
                     30: HIGH = 0x2700
                     31: 
                     32: | FIXME!!! These should come from statreg.h or assym.h
                     33: CACR_CLEAR = 0x8
                     34: CACR_ENABLE = 0x1
                     35: 
                     36:        .globl  entry
                     37: entry:
                     38:        movw    #HIGH,sr                | just in case
                     39: leax:  lea     pc@(entry-(leax+2)),a0  | True current location of "entry"
                     40:        lea     entry:l,a1              | Desired      location of "entry"
                     41:        cmpl    a0,a1
                     42:        jeq     gobegin                 | If the same, just go do it.
                     43:        movl    #_end,d0                | Desired end of program
                     44:        subl    a1,d0                   | Calculate length, round up.
                     45:        lsrl    #2,d0
                     46: movc:  movl    a0@+,a1@+               | Move it where it belongs.
                     47:        dbra    d0,movc
                     48: 
                     49: |      Test if 68020: Use the 68020 scaled indexing mode, which is ignored by
                     50: |      68000/68010.
                     51: gobegin:
                     52:        moveq   #is020-is010,d0         | Set up jump offset
                     53: |      jmp     pc@((is010-.)-(is020-is010),d0:w*2)     | Jump if 68010
                     54:        .word   0x4EFB
                     55: J:     .word   0x0200+(is010-J)-(is020-is010)
                     56: is020:
                     57: | Turn on the cache...
                     58:        moveq   #CACR_CLEAR+CACR_ENABLE,d0
                     59:        .long   0x4e7b0002              | movc  d0,cacr
                     60:        moveq   #3,d0                   | Set the delay factor for 68020
                     61:        movl    d0,_cpudelay
                     62: is010:
                     63:        jmp     begin:l                 | Force non-PCrel jump
                     64: 
                     65: begin:
                     66:        movl    sp,entry-4:l            | Save old stack pointer value
                     67:        lea     entry-4:l,sp            | Set up new stack below load point
                     68:        movl    #_edata,a0
                     69: clr:
                     70:        clrl    a0@+
                     71:        cmpl    #_end,a0
                     72:        ble     clr
                     73: #ifdef SUN2
                     74:        jsr     _setkcontext
                     75: #endif
                     76:        clrl    sp@-                    | argv = 0 for now.
                     77:        clrl    sp@-                    | argc = 0 for now.
                     78:        jsr     _main
                     79:        addqw   #8,sp
                     80:        jsr     _exit                   | after main() returns, call exit().
                     81: | Just fall thru into __exit if exit() ever returns.
                     82: 
                     83: __exit:
                     84:        movl    entry-4:l,sp            | Restore caller's stack pointer
                     85:        rts                             | Return to caller (PROM probably)
                     86: 
                     87: | Transfer control to a new program, passing on the same arguments that
                     88: | we (srt0.s) received when we were started.  Note that this does NOT call
                     89: | exit() -- you'd better close your files yourself.
                     90: __exitto:
                     91:        movl    sp@(4),a0               | Address to call
                     92:        movl    entry-4:l,sp            | Restore caller's stack pointer
                     93:        jra     a0@                     | Jump to callee using caller's stk

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.