Subversion Repositories zxusbnet

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

;
;       $Id: Cstartup.s01 1.24 2001/01/04 12:19:06 IPEO Exp $
;

;----------------------------------------------------------;
;                                                          ;
;                   CSTARTUP.S01                           ;
;                                                          ;
; This file contains the Z80/HD64180 C startup routine     ;
; and must usually be tailored to suit customer's hardware.;
;                                                          ;
; Version:  4.00 [ 28/Apr/94 IJAR]                         ;
;----------------------------------------------------------;

#define proc64180 ((__TID__&0x010)==0x010)

        NAME    CSTARTUP

        EXTERN  main                    ; where to begin execution
        EXTERN  ?C_EXIT                 ; where to go when program is done

#ifdef banking
#if proc64180

CBAR_addr EQU   3AH            ; define I/O ports to MMU registers
CBR_addr  EQU   38H            ; (See also defines in debug.s01 and l08.s01)

        EXTERN  CBAR_value
        EXTERN  CBR_value
#endif

        EXTERN  ?BANK_CALL_DIRECT_L08
#endif

;---------------------------------------------------------------;
;  CSTACK - The C stack segment                                 ;
;                                                               ;
;  Please, see in the link file lnk*.xcl how to increment       ;
;  the stack size without having to reassemble cstartup.s01 !   ;
;---------------------------------------------------------------;

        RSEG    CSTACK
        DEFS    0                        ; a bare minimum !

;---------------------------------------------------------------;
;  Forward declarations of segment used during initialization   ;
;---------------------------------------------------------------;
        RSEG    UDATA0
        RSEG    IDATA0
        RSEG    ECSTR
        RSEG    TEMP
        RSEG    DATA0
        RSEG    WCSTR

        RSEG    CDATA0
        RSEG    CCSTR
        RSEG    CONST
        RSEG    CSTR

        ASEG
        ORG     0x6000
init_A
        DI
        JP      init_C

;---------------------------------------------------------------;
;  RCODE - where the execution actually begins                  ;
;---------------------------------------------------------------;
        RSEG    RCODE
init_C
        LD      SP,.SFE.(CSTACK-1)      ; from high to low address

;---------------------------------------------------------------;
; If hardware must be initiated from assembly or if interrupts  ;
; should be on when reaching main, this is the place to insert  ;
; such code.                                                    ;
;---------------------------------------------------------------;

#ifdef banking
#if proc64180

;---------------------------------------------------------------;
; Setting of MMU registers - see chapter "Linking" of manual.   ;
;---------------------------------------------------------------;

        LD      A,CBAR_value                    ; set CBAR value
        OUT0    (CBAR_addr),A

        LD      A,CBR_value                     ; set CBR value
        OUT0    (CBR_addr),A

#endif
#endif

;---------------------------------------------------------------;
; If it is not a requirement that static/global data is set     ;
; to zero or to some explicit value at startup, the following   ;
; line refering to seg_init can be deleted, or commented.       ;
;---------------------------------------------------------------;

        CALL    seg_init
        
#ifdef banking

        LD      HL,LWRD(main)           ; banked call to main()
        LD      A,BYTE3(main)
        CALL    ?BANK_CALL_DIRECT_L08
#else
        CALL    main                    ; non-banked call to main()
#endif

;---------------------------------------------------------------;
; Now when we are ready with our C program we must perform a    ;
; system-dependent action.  In this case we just stop.          ;
;---------------------------------------------------------------;
; DO NOT CHANGE THE NEXT LINE OF CSTARTUP IF YOU WANT TO RUN    ;
; YOUR SOFTWARE WITH THE HELP OF THE C-SPY HLL DEBUGGER.        ;
;---------------------------------------------------------------;

        JP      ?C_EXIT 

;---------------------------------------------------------------;
; Copy initialized PROMmed code to shadow RAM and clear         ;
; uninitialized variables.                                      ;
;---------------------------------------------------------------;

seg_init

;---------------------------------------;
; Zero out UDATA0                       ;
;---------------------------------------;
        LD      HL,.SFE.(UDATA0)
        LD      DE,.SFB.(UDATA0)
        CALL    zero_mem

;---------------------------------------;
; Copy CDATA0 into IDATA0               ;
;---------------------------------------;
        LD      DE,.SFB.(IDATA0)                ;destination address
        LD      HL,.SFE.(CDATA0)
        LD      BC,.SFB.(CDATA0)
        CALL    copy_mem

;---------------------------------------;
; Copy CCSTR into ECSTR                 ;
;---------------------------------------;
        LD      DE,.SFB.(ECSTR)                 ;destination address
        LD      HL,.SFE.(CCSTR)
        LD      BC,.SFB.(CCSTR)

        ; Just fall in to the copy_mem function

;---------------------------------------;
; Copy memory                           ;
;---------------------------------------;
copy_mem
        XOR     A
        SBC     HL,BC
        PUSH    BC
        LD      C,L
        LD      B,H                             ; BC - that many bytes
        POP     HL                              ; source address
        RET     Z                               ; If block size = 0 return now
        LDIR
        RET

;---------------------------------------;
; Clear memory                          ;
;---------------------------------------;
zero_mem
        XOR     A
again   PUSH    HL
        SBC     HL,DE
        POP     HL
        RET     Z
        LD      (DE),A
        INC     DE
        JR      again

;---------------------------------------------------------------;
; Interrupt vectors must be inserted here by the user.          ;
;---------------------------------------------------------------;

        COMMON  INTVEC

        ENDMOD  init_A

;---------------------------------------------------------------;
; Function/module: exit (int code)                              ;
;                                                               ;
; When C-SPY is used this code will automatically be replaced   ;
; by a 'debug' version of exit().                               ;
;---------------------------------------------------------------;
        MODULE  exit

        PUBLIC  exit
        PUBLIC  ?C_EXIT

        RSEG    RCODE

?C_EXIT
exit    EQU     ?C_EXIT

;--------------------------------------------------------------;
; The next line can be replaced by user defined code.          ;
;--------------------------------------------------------------;
        NOP
        JR      $                       ; loop forever

        END