summaryrefslogtreecommitdiff
path: root/nuttx/arch/z80/src/ez80/ez80_startup.asm
blob: 2173f80a42d238cae6f626e7eed3d6d5dbf047b6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
;**************************************************************************
; arch/z80/src/ez80/ez80_startup.asm
;
;   Copyright (C) 2008 Gregory Nutt. All rights reserved.
;   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
;
; 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. Neither the name NuttX nor the names of its contributors may be
;    used to endorse or promote products derived from this software
;    without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
; "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
; COPYRIGHT OWNER 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.
;
;**************************************************************************

;**************************************************************************
; Included Files
;**************************************************************************

;**************************************************************************
; Constants
;**************************************************************************

;**************************************************************************
; Global symbols used
;**************************************************************************

	xref	__stack
	xref	_ez80_init
	xref	_ez80_initvectors
	xref	_ez80_initsysclk
	xref	_ez80_lowinit
	xref	__low_bss	; Low address of bss segment
	xref	__len_bss	; Length of bss segment

	xref	__low_data	; Address of initialized data section
	xref	__low_romdata	; Addr of initialized data section in ROM
	xref	__len_data	; Length of initialized data section

	xref	__copy_code_to_ram
	xref	__len_code
	xref	__low_code
	xref	__low_romcode
	xref	_os_start
	xdef	_ez80_startup
	xdef	_ez80_halt

;**************************************************************************
; Code
;**************************************************************************

	segment	CODE
	.assume ADL=1

;**************************************************************************
; System reset start logic
;**************************************************************************

_ez80_startup:
	; Set up the stack pointer at the location determined the lincmd
	; file

	ld	sp, __stack

	; Peform chip-specific initialization

	call	_ez80_init

	; initialize the interrupt vector table

	call 	_ez80_initvectors

	; Initialize the system clock

	call	_ez80_initsysclk

	; Perform C initializations
	; Clear the uninitialized data section

	ld	bc, __len_bss		; Check for non-zero length
	ld	a, __len_bss >> 16
	or	a, c
	or	a, b
	jr	z, _ez80_bssdone	; BSS is zero-length ...
	xor	a, a
	ld	(__low_bss), a
	sbc	hl, hl			; hl = 0
	dec	bc			; 1st byte's taken care of
	sbc	hl, bc
	jr	z, _ez80_bssdone	; Just 1 byte ...
	ld	hl, __low_bss		; reset hl
	ld	de, __low_bss + 1	; [de] = bss + 1
	ldir
_ez80_bssdone:

	; Copy the initialized data section
	ld	bc, __len_data		; [bc] = data length
	ld	a, __len_data >> 16	; Check for non-zero length
	or	a, c
	or	a, b
	jr	z, _ez80_datadone	; __len_data is zero-length ...
	ld	hl, __low_romdata	; [hl] = data_copy
	ld	de, __low_data		; [de] = data
	ldir				; Copy the data section
_ez80_datadone:

	; Copy CODE (which may be in FLASH) to RAM if the
	; copy_code_to_ram symbol is set in the link control file
	ld	a, __copy_code_to_ram
	or	a, a
	jr	z, _ez80_codedone
	ld	bc, __len_code		; [bc] = code length
	ld	a, __len_code >> 16	; Check for non-zero length
	or	a, c
	or	a, b
	jr	z, _ez80_codedone	; __len_code is zero-length
	ld	hl, __low_romcode	; [hl] = code_copy
	ld	de, __low_code		; [de] = code
	ldir				; Copy the code section
_ez80_codedone:

	; Perform board-specific intialization

	call	_ez80_lowinit

	; Then start NuttX

	call	_os_start		; jump to the OS entry point

	; NuttX will never return, but just in case...

_ez80_halt:
	halt				; We should never get here
	jp	_ez80_halt