home *** CD-ROM | disk | FTP | other *** search
- *--------------------------------------------------------------------*
- * Library startup module, not as funky as Jimm's example
- * Aztec code, but (hopefully) okay for Aztec 5.0.
- *
- * Note: Register usage has been rearranged to allow
- * library init call with parameters in registers.
- *
- * Based on LibStart.A68 (with some of the bugs taken out),
- * Copyright (C) 1986, 1987 by Manx Software Systems, Inc.
- *--------------------------------------------------------------------*
-
- include 'exec/types.i'
- include 'exec/nodes.i'
- include 'exec/resident.i'
-
- *--------------------------------------------------------------------*
- * Here we start the code generation.
- *--------------------------------------------------------------------*
-
- section LibCode,code
-
- *--------------------------------------------------------------------*
- * Not executable (also does long word alignment).
- *--------------------------------------------------------------------*
-
- moveq #-1,d0 ; Fail if run from Shell
- rts
-
- *--------------------------------------------------------------------*
- * Library version, this should match the lib ID string.
- *--------------------------------------------------------------------*
-
- LIBVERSION equ 36
-
- *--------------------------------------------------------------------*
- * Global symbols (rather in a bunch than sprenkled).
- *--------------------------------------------------------------------*
-
- public _LibRomTag,_LibName,_LibId,_LibInitTab,_LibInit
- public _LibMain,.begin,_geta4,__H0_org
-
- *--------------------------------------------------------------------*
- * The RomTag structure, must be in first hunk.
- *--------------------------------------------------------------------*
-
- _LibRomTag:
-
- dc.w RTC_MATCHWORD ; Tag ID (680x0 ILLEGAL)
-
- dc.l _LibRomTag ; Points to beginning of tag
- dc.l _LibEndTag ; Points to end of tag
-
- dc.b RTF_AUTOINIT ; Auto init library
- dc.b LIBVERSION ; Library version
- dc.b NT_LIBRARY ; This is a library, not a device
- dc.b 0 ; Priority (leave it zero)
-
- dc.l _LibName ; Pointer to lib name
- dc.l _LibId ; Pointer to lib ID
- dc.l _LibInitTab ; Pointer to library init table
-
- _LibEndTag:
-
- *--------------------------------------------------------------------*
- * This is supposed to be the lib entry point.
- *--------------------------------------------------------------------*
-
- .begin ; First hunk
-
- *--------------------------------------------------------------------*
- * Set up the lib environment and call the main init routine.
- *
- * Register usage: D0 - APTR to library base
- * A0 - BPTR to library segment list
- *
- * Main init routine is expected to return the library base
- * in D0 if library is ready to be used.
- *--------------------------------------------------------------------*
-
- _LibInit:
-
- movem.l d2-d7/a2-a6,-(sp) ; Save registers
- bsr _geta4 ; Get A4
- lea __H1_end,a1
- lea __H2_org,a2
- cmp.l a1,a2 ; Check if BSS and DATA together
- bne Start ; No, don't have to clear
- move.w #((__H2_end-__H2_org)/4)-1,d1
- bmi Start ; Skip if no bss
-
- moveq #0,d2
- 1$ move.l d2,(a1)+ ; Clear out memory
- dbra d1,1$
-
- Start move.l A6,_SysBase ; Put it where we can get it
-
- jsr _LibMain ; Call 'C' init routine
-
- movem.l (sp)+,d2-d7/a2-a6 ; Restore registers
- rts ; And return
-
- *--------------------------------------------------------------------*
- * Set up A4 to point into the middle of the data segment.
- *--------------------------------------------------------------------*
-
- _geta4: far data
- lea __H1_org+32766,a4
- rts
-
- *--------------------------------------------------------------------*
- * Data segment (globals/hunks).
- *--------------------------------------------------------------------*
-
- section LibData,data
-
- public _SysBase,_DOSBase,__H1_org,__H1_end,__H2_org,__H2_end
-
- end
-