; VF=C:\DATA\MOOS\RFIO\firmware\cstart.asm
; VF=C:\DATA\MOOS\RFIO\firmware\cstart.asm
; VL=1 ; @(#) cstart.asm 1.7 02/11/08 14:09:38 @(#) 
; @(#) cstart.asm 1.7 02/11/08 14:09:38 @(#) 
; VL=2 ;
;
; VL=3 ;  C startup
;  C startup
; VL=4 ;
;
; VL=5 ;
;
; VL=6 ; set reset interrupt vector to point to cstart
; set reset interrupt vector to point to cstart
; VL=7 ;
;
; VL=8 	.pseg reset_vector,abs=0xfffe
	.segment	reset_vector,memtype=0,wordsize=16,locinc=2,abs = 0xfffe,rom,align=2 
; VL=9 
;
; VL=10 	.data cstart
	WORD# cstart 
; VL=11 
;
; VL=12 ;
;
; VL=13 ; C runtime startup code
; C runtime startup code
; VL=14 ;
;
; VL=15 	.pseg cstartup$code
	.segment	cstartup$code,memtype=0,wordsize=16,locinc=2,rom,align=2 
; VL=16 
;
; VL=17 	.global cstart
	 .global cstart 
; VL=18 	.global __main_returned
	 .global __main_returned 
; VL=19 
;
; VL=20 	.extern __rominit
	 .extern __rominit 
; VL=21 	.extern _main
	 .extern _main 
; VL=22 	.extern __max_ram0_
	 .extern __max_ram0_ 
; VL=23 cstart:
cstart:
; VL=24 	mov #0x5a80,&0x120 ; turn off watchdog timer
	mov Sreg# r0 d_not_reg word imm_ind_mod r2 
	WORD# 0x5a80 
	WORD# 0x120 
; VL=25 	mov #__max_ram0_ + 1,sp ; set stack to max ram address + 1
	mov Sreg# r0 d_reg word imm_ind_mod sp 
	WORD# __max_ram0_+1 
; VL=26 	call #__rominit ; initialize RAM from ROM
	call word imm_ind_mod r0 
	WORD# __rominit 
; VL=27 	call #_main     ; run the C program
	call word imm_ind_mod r0 
	WORD# _main 
; VL=28 __main_returned:
__main_returned:
; VL=29 	jmp __main_returned ; loop forever if main returns
	.ifa (__main_returned-.-2),-1024,1022 
	jmp DISP# .bits(0, 9,  (__main_returned - . - 2)/2  ) 
	.else 
	mov Sreg# r0 d_reg word imm_ind_mod r0 
	WORD# __main_returned 
	.endif 
; VL=30 ;
;
; VL=31 ; provide a null initialization descriptor, in case there is no 
; provide a null initialization descriptor, in case there is no 
; VL=32 ; RAM initialization required, so we don't get complaints from
; RAM initialization required, so we don't get complaints from
; VL=33 ; the linker when trying to link rominit, which will refer
; the linker when trying to link rominit, which will refer
; VL=34 ; to the initialization descriptor segment.
; to the initialization descriptor segment.
; VL=35 ;
;
; VL=36 	.iseg _idesc
	.segment	_idesc,memtype=0,wordsize=8,locinc=1,rom,align=2 
; VL=37 	.data 0
	BYTE# .bits(0, 7,0) 
	BYTE# .bits(8, 15,0) 
; VL=38 	.data 0
	BYTE# .bits(0, 7,0) 
	BYTE# .bits(8, 15,0) 
; VL=39 	.data 0
	BYTE# .bits(0, 7,0) 
	BYTE# .bits(8, 15,0) 
