1;
2;	$Id: Cstartup.s01 1.24 2001/01/04 12:19:06 IPEO Exp $
3;
4
5;----------------------------------------------------------;
6;						      	   ;
7;		    CSTARTUP.S01		      	   ;
8;						      	   ;
9; This file contains the Z80/HD64180 C startup routine     ;
10; and must usually be tailored to suit customer's hardware.;
11;						      	   ;
12; Version:  4.00 [ 28/Apr/94 IJAR]                         ;
13;----------------------------------------------------------;
14
15#define proc64180 ((__TID__&0x010)==0x010)
16
17	NAME	CSTARTUP
18
19	EXTERN	main			; where to begin execution
20	EXTERN	?C_EXIT			; where to go when program is done
21
22#ifdef banking
23#if proc64180
24
25CBAR_addr EQU	3AH	       ; define I/O ports to MMU registers
26CBR_addr  EQU	38H	       ; (See also defines in debug.s01 and l08.s01)
27
28	EXTERN  CBAR_value
29	EXTERN  CBR_value
30#endif
31
32	EXTERN	?BANK_CALL_DIRECT_L08
33#endif
34
35;---------------------------------------------------------------;
36;  CSTACK - The C stack segment					;
37;  								;
38;  Please, see in the link file lnk*.xcl how to increment	;
39;  the stack size without having to reassemble cstartup.s01 !	;
40;---------------------------------------------------------------;
41
42	RSEG	CSTACK
43	DEFS	0			; a bare minimum !
44
45;---------------------------------------------------------------;
46;  Forward declarations of segment used during initialization	;
47;---------------------------------------------------------------;
48	RSEG	UDATA0
49	RSEG	IDATA0
50	RSEG	ECSTR
51	RSEG	TEMP
52	RSEG	DATA0
53	RSEG	WCSTR
54
55	RSEG	CDATA0
56	RSEG	CCSTR
57	RSEG	CONST
58	RSEG	CSTR
59
60	ASEG
61	ORG	0
62init_A
63	JP	init_C
64
65;---------------------------------------------------------------;
66;  RCODE - where the execution actually begins			;
67;---------------------------------------------------------------;
68	RSEG	RCODE
69init_C
70   DI           ;;;;;;;; DISABLE INTERRUPTS
71	LD	SP,.SFE.(CSTACK-1)	; from high to low address
72
73;---------------------------------------------------------------;
74; If hardware must be initiated from assembly or if interrupts	;
75; should be on when reaching main, this is the place to insert	;
76; such code.							;
77;---------------------------------------------------------------;
78
79#ifdef banking
80#if proc64180
81
82;---------------------------------------------------------------;
83; Setting of MMU registers - see chapter "Linking" of manual.	;
84;---------------------------------------------------------------;
85
86	LD	A,CBAR_value			; set CBAR value
87	OUT0	(CBAR_addr),A
88
89	LD	A,CBR_value			; set CBR value
90	OUT0	(CBR_addr),A
91
92#endif
93#endif
94
95;---------------------------------------------------------------;
96; If it is not a requirement that static/global data is set	;
97; to zero or to some explicit value at startup, the following	;
98; line refering to seg_init can be deleted, or commented.	;
99;---------------------------------------------------------------;
100
101	CALL	seg_init
102
103#ifdef banking
104
105	LD	HL,LWRD(main)		; banked call to main()
106	LD	A,BYTE3(main)
107	CALL	?BANK_CALL_DIRECT_L08
108#else
109	CALL	main			; non-banked call to main()
110#endif
111
112;---------------------------------------------------------------;
113; Now when we are ready with our C program we must perform a    ;
114; system-dependent action.  In this case we just stop.		;
115;---------------------------------------------------------------;
116; DO NOT CHANGE THE NEXT LINE OF CSTARTUP IF YOU WANT TO RUN    ;
117; YOUR SOFTWARE WITH THE HELP OF THE C-SPY HLL DEBUGGER.        ;
118;---------------------------------------------------------------;
119
120	JP	?C_EXIT
121
122;---------------------------------------------------------------;
123; Copy initialized PROMmed code to shadow RAM and clear		;
124; uninitialized variables.					;
125;---------------------------------------------------------------;
126
127seg_init
128
129;---------------------------------------;
130; Zero out UDATA0			;
131;---------------------------------------;
132	LD	HL,.SFE.(UDATA0)
133	LD	DE,.SFB.(UDATA0)
134	CALL	zero_mem
135
136;---------------------------------------;
137; Copy CDATA0 into IDATA0		;
138;---------------------------------------;
139	LD	DE,.SFB.(IDATA0)		;destination address
140	LD	HL,.SFE.(CDATA0)
141	LD	BC,.SFB.(CDATA0)
142	CALL	copy_mem
143
144;---------------------------------------;
145; Copy CCSTR into ECSTR			;
146;---------------------------------------;
147	LD	DE,.SFB.(ECSTR)			;destination address
148	LD	HL,.SFE.(CCSTR)
149	LD	BC,.SFB.(CCSTR)
150
151	; Just fall in to the copy_mem function
152
153;---------------------------------------;
154; Copy memory				;
155;---------------------------------------;
156copy_mem
157	XOR	A
158	SBC	HL,BC
159	PUSH	BC
160	LD	C,L
161	LD	B,H				; BC - that many bytes
162	POP	HL				; source address
163	RET	Z				; If block size = 0 return now
164	LDIR
165	RET
166
167;---------------------------------------;
168; Clear memory				;
169;---------------------------------------;
170zero_mem
171	XOR	A
172again	PUSH	HL
173	SBC	HL,DE
174	POP	HL
175	RET	Z
176	LD	(DE),A
177	INC	DE
178	JR	again
179
180;---------------------------------------------------------------;
181; Interrupt vectors must be inserted here by the user.		;
182;---------------------------------------------------------------;
183
184	COMMON	INTVEC
185
186	ENDMOD	init_A
187
188;---------------------------------------------------------------;
189; Function/module: exit (int code)				;
190;								;
191; When C-SPY is used this code will automatically be replaced   ;
192; by a 'debug' version of exit().				;
193;---------------------------------------------------------------;
194	MODULE	exit
195
196	PUBLIC	exit
197	PUBLIC	?C_EXIT
198
199	RSEG	RCODE
200
201?C_EXIT
202exit	EQU	?C_EXIT
203
204;--------------------------------------------------------------;
205; The next line can be replaced by user defined code.          ;
206;--------------------------------------------------------------;
207        NOP
208	jr $
209
210	END
211