Home | History | Annotate | Line # | Download | only in loadbsd
      1  1.1  phx 	.text
      2  1.1  phx 
      3  1.1  phx 	.globl	_startit
      4  1.1  phx _startit:
      5  1.1  phx 	move.l	sp,a3
      6  1.1  phx 	move.l	4,a6
      7  1.1  phx 	lea	(start_super,pc),a5
      8  1.1  phx 	jmp	(-0x1e,a6)		| supervisor-call
      9  1.1  phx 
     10  1.1  phx start_super:
     11  1.1  phx 	move.w	#0x2700,sr
     12  1.1  phx 
     13  1.1  phx 	| the BSD kernel wants values into the following registers:
     14  1.1  phx 	| a0:  fastmem-start
     15  1.1  phx 	| d0:  fastmem-size
     16  1.1  phx 	| d1:  chipmem-size
     17  1.1  phx 	| d3:  Amiga specific flags
     18  1.1  phx 	| d4:  E clock frequency
     19  1.1  phx 	| d5:  AttnFlags (cpuid)
     20  1.1  phx 	| d7:  boothowto
     21  1.1  phx 	| a4:  esym location
     22  1.1  phx 	| a2:  Inhibit sync flags
     23  1.1  phx 	| All other registers zeroed for possible future requirements.
     24  1.1  phx 
     25  1.1  phx 	lea	(_startit,pc),sp	| make sure we have a good stack ***
     26  1.1  phx 
     27  1.1  phx 	move.l	(4,a3),a1		| loaded kernel
     28  1.1  phx 	move.l	(8,a3),d2		| length of loaded kernel
     29  1.1  phx |	move.l	(12,a3),sp		| entry point in stack pointer
     30  1.1  phx 	move.l	(12,a3),a6		| push entry point		***
     31  1.1  phx 	move.l	(16,a3),a0		| fastmem-start
     32  1.1  phx 	move.l	(20,a3),d0		| fastmem-size
     33  1.1  phx 	move.l	(24,a3),d1		| chipmem-size
     34  1.1  phx 	move.l	(28,a3),d7		| boothowto
     35  1.1  phx 	move.l	(32,a3),a4		| esym
     36  1.1  phx 	move.l	(36,a3),d5		| cpuid
     37  1.1  phx 	move.l	(40,a3),d4		| E clock frequency
     38  1.1  phx 	move.l	(44,a3),d3		| Amiga flags
     39  1.1  phx 	move.l	(48,a3),a2		| Inhibit sync flags
     40  1.1  phx 	move.l	(52,a3),d6		| Load to fastmem flag
     41  1.1  phx 	sub.l	a5,a5			| target, load to 0
     42  1.1  phx 
     43  1.1  phx 	cmp.b	#0x7D,(36,a3)		| is it DraCo?
     44  1.1  phx 	beq	nott			| yes, switch off MMU later
     45  1.1  phx 
     46  1.1  phx 					| no, it is an Amiga:
     47  1.1  phx 
     48  1.1  phx |	move.w	#0xf00,0xdff180		|red
     49  1.1  phx |	move.b	#0,0x200003c8
     50  1.1  phx |	move.b	#63,0x200003c9
     51  1.1  phx |	move.b	#0,0x200003c9
     52  1.1  phx |	move.b	#0,0x200003c9
     53  1.1  phx 
     54  1.1  phx 	move.w	#(1<<9),0xdff096	| disable DMA on Amigas.
     55  1.1  phx 
     56  1.1  phx | ------ mmu off start -----
     57  1.1  phx 
     58  1.1  phx 	btst	#3,d5			| AFB_68040,SysBase->AttnFlags
     59  1.1  phx 	beq	not040
     60  1.1  phx 
     61  1.1  phx | Turn off 68040/060 MMU
     62  1.1  phx 
     63  1.1  phx 	sub.l	a3,a3
     64  1.1  phx 	.word 0x4e7b,0xb003		| movec a3,tc
     65  1.1  phx 	.word 0x4e7b,0xb806		| movec a3,urp
     66  1.1  phx 	.word 0x4e7b,0xb807		| movec a3,srp
     67  1.1  phx 	.word 0x4e7b,0xb004		| movec a3,itt0
     68  1.1  phx 	.word 0x4e7b,0xb005		| movec a3,itt1
     69  1.1  phx 	.word 0x4e7b,0xb006		| movec a3,dtt0
     70  1.1  phx 	.word 0x4e7b,0xb007		| movec a3,dtt1
     71  1.1  phx 	bra	nott
     72  1.1  phx 
     73  1.1  phx not040:
     74  1.1  phx 	lea	(zero,pc),a3
     75  1.1  phx 	pmove	(a3),tc			| Turn off MMU
     76  1.1  phx 	lea	(nullrp,pc),a3
     77  1.1  phx 	pmove	(a3),crp		| Turn off MMU some more
     78  1.1  phx 	pmove	(a3),srp		| Really, really, turn off MMU
     79  1.1  phx 
     80  1.1  phx | Turn off 68030 TT registers
     81  1.1  phx 
     82  1.1  phx 	btst	#2,d5			| AFB_68030,SysBase->AttnFlags
     83  1.1  phx 	beq	nott			| Skip TT registers if not 68030
     84  1.1  phx 	lea	(zero,pc),a3
     85  1.1  phx 	.word 0xf013,0x0800		| pmove a3@,tt0 (gas only knows about 68851 ops..)
     86  1.1  phx 	.word 0xf013,0x0c00		| pmove a3@,tt1 (gas only knows about 68851 ops..)
     87  1.1  phx 
     88  1.1  phx nott:
     89  1.1  phx | ---- mmu off end ----
     90  1.1  phx |	move.w	#0xf60,0xdff180		| orange
     91  1.1  phx |	move.b	#0,0x200003c8
     92  1.1  phx |	move.b	#63,0x200003c9
     93  1.1  phx |	move.b	#24,0x200003c9
     94  1.1  phx |	move.b	#0,0x200003c9
     95  1.1  phx 
     96  1.1  phx | ---- copy kernel start ----
     97  1.1  phx 
     98  1.1  phx 	tst.l	d6			| Can we load to fastmem?
     99  1.1  phx 	beq	L0			| No, leave destination at 0
    100  1.1  phx 	move.l	a0,a5			| Move to start of fastmem chunk
    101  1.1  phx 	add.l	a0,a6			| relocate kernel entry point
    102  1.1  phx L0:
    103  1.1  phx 	move.l	(a1)+,(a5)+
    104  1.1  phx 	sub.l	#4,d2
    105  1.1  phx 	bcc	L0
    106  1.1  phx 
    107  1.1  phx 	lea	(ckend,pc),a1
    108  1.1  phx 	move.l	a5,-(sp)
    109  1.1  phx 	move.l	#_startit_end-ckend,d2
    110  1.1  phx L2:
    111  1.1  phx 	move.l	(a1)+,(a5)+
    112  1.1  phx 	sub.l	#4,d2
    113  1.1  phx 	bcc	L2
    114  1.1  phx 
    115  1.1  phx 	btst	#3,d5
    116  1.1  phx 	jeq	L1
    117  1.1  phx 	.word	0xf4f8
    118  1.1  phx L1:
    119  1.1  phx 	moveq.l	#0,d2			| switch off cache to ensure we use
    120  1.1  phx 	movec	d2,cacr			| valid kernel data
    121  1.1  phx 
    122  1.1  phx |	move.w	#0xFF0,0xdff180		| yellow
    123  1.1  phx |	move.b	#0,0x200003c8
    124  1.1  phx |	move.b	#63,0x200003c9
    125  1.1  phx |	move.b	#0,0x200003c9
    126  1.1  phx |	move.b	#0,0x200003c9
    127  1.1  phx 	rts
    128  1.1  phx 
    129  1.1  phx | ---- copy kernel end ----
    130  1.1  phx 
    131  1.1  phx ckend:
    132  1.1  phx |	move.w	#0x0ff,0xdff180		| petrol
    133  1.1  phx |	move.b	#0,0x200003c8
    134  1.1  phx |	move.b	#0,0x200003c9
    135  1.1  phx |	move.b	#63,0x200003c9
    136  1.1  phx |	move.b	#63,0x200003c9
    137  1.1  phx 
    138  1.1  phx 	move.l	d5,d2
    139  1.1  phx 	rol.l	#8,d2
    140  1.1  phx 	cmp.b	#0x7D,d2
    141  1.1  phx 	jne	noDraCo
    142  1.1  phx 
    143  1.1  phx | DraCo: switch off MMU now:
    144  1.1  phx 
    145  1.1  phx 	sub.l	a3,a3
    146  1.1  phx 	.word 0x4e7b,0xb003		| movec a3,tc
    147  1.1  phx 	.word 0x4e7b,0xb806		| movec a3,urp
    148  1.1  phx 	.word 0x4e7b,0xb807		| movec a3,srp
    149  1.1  phx 	.word 0x4e7b,0xb004		| movec a3,itt0
    150  1.1  phx 	.word 0x4e7b,0xb005		| movec a3,itt1
    151  1.1  phx 	.word 0x4e7b,0xb006		| movec a3,dtt0
    152  1.1  phx 	.word 0x4e7b,0xb007		| movec a3,dtt1
    153  1.1  phx 
    154  1.1  phx noDraCo:
    155  1.1  phx 	moveq	#0,d2			| zero out unused registers
    156  1.1  phx 	moveq	#0,d6			| (might make future compatibility
    157  1.1  phx 	move.l	d6,a1			|  would have known contents)
    158  1.1  phx 	move.l	d6,a3
    159  1.1  phx 	move.l	d6,a5
    160  1.1  phx 	move.l	a6,sp			| entry point into stack pointer
    161  1.1  phx 	move.l	d6,a6
    162  1.1  phx 
    163  1.1  phx |	move.w	#0x0F0,0xdff180		| green
    164  1.1  phx |	move.b	#0,0x200003c8
    165  1.1  phx |	move.b	#0,0x200003c9
    166  1.1  phx |	move.b	#63,0x200003c9
    167  1.1  phx |	move.b	#0,0x200003c9
    168  1.1  phx 
    169  1.1  phx 	jmp	(sp)			| jump to kernel entry point
    170  1.1  phx 
    171  1.1  phx | A do-nothing MMU root pointer (includes the following long as well)
    172  1.1  phx 
    173  1.1  phx nullrp:	.long	0x7fff0001
    174  1.1  phx zero:	.long	0
    175  1.1  phx 
    176  1.1  phx _startit_end:
    177  1.1  phx 
    178  1.1  phx 	.data
    179  1.1  phx 	.globl	_startit_sz
    180  1.1  phx _startit_sz: .long _startit_end-_startit
    181