1
2#define	MEM_END	0x00800000	/* Memory size 8Mb */
3
4#undef CRT_DEBUG
5
6.macro	PUTC CHAR
7#ifdef CRT_DEBUG
8	moveq	#\CHAR, %d7
9	jsr	putc
10#endif
11.endm
12
13	.global	_start
14	.global _rambase
15	.global _ramvec
16	.global	_ramstart
17	.global	_ramend
18
19	.data
20
21/*
22 *	Set up the usable of RAM stuff
23 */
24_rambase:
25	.long	0
26_ramvec:
27	.long	0
28_ramstart:
29	.long	0
30_ramend:
31	.long	0
32
33	.text
34
35_start:
36
37/*
38 * Setup initial stack
39 */
40	/* disable all interrupts */
41	movew	#0x2700, %sr
42	movel	#-1, 0xfffff304
43	movel	#MEM_END-4, %sp
44
45	PUTC	'\r'
46	PUTC	'\n'
47	PUTC	'A'
48	PUTC	'B'
49
50/*
51 *	Determine end of RAM
52 */
53
54	movel	#MEM_END, %a0
55	movel	%a0, _ramend
56
57	PUTC	'C'
58
59/*
60 *	Move ROM filesystem above bss :-)
61 */
62
63	moveal	#_sbss, %a0			/* romfs at the start of bss */
64	moveal	#_ebss, %a1			/* Set up destination  */
65	movel	%a0, %a2			/* Copy of bss start */
66
67	movel	8(%a0), %d1			/* Get size of ROMFS */
68	addql	#8, %d1				/* Allow for rounding */
69	andl	#0xfffffffc, %d1	/* Whole words */
70
71	addl	%d1, %a0			/* Copy from end */
72	addl	%d1, %a1			/* Copy from end */
73	movel	%a1, _ramstart		/* Set start of ram */
74
751:
76	movel	-(%a0), %d0			/* Copy dword */
77	movel	%d0, -(%a1)
78	cmpl	%a0, %a2			/* Check if at end */
79	bne	1b
80
81	PUTC	'D'
82
83/*
84 * Initialize BSS segment to 0
85 */
86
87	lea	_sbss, %a0
88	lea	_ebss, %a1
89
90	/* Copy 0 to %a0 until %a0 == %a1 */
912:	cmpal	%a0, %a1
92	beq	1f
93	clrl	(%a0)+
94	bra	2b
951:
96
97	PUTC	'E'
98
99/*
100 * Load the current task pointer and stack
101 */
102
103	lea	init_thread_union, %a0
104	lea	0x2000(%a0), %sp
105
106	PUTC	'F'
107	PUTC	'\r'
108	PUTC	'\n'
109
110/*
111 * Go
112 */
113
114	jmp	start_kernel
115
116/*
117 * Local functions
118 */
119
120#ifdef CRT_DEBUG
121putc:
122	moveb	%d7, 0xfffff907
1231:
124	movew	0xfffff906, %d7
125	andw	#0x2000, %d7
126	beq	1b
127	rts
128#endif
129