home *** CD-ROM | disk | FTP | other *** search
- ;; LibHead.asm
- ;; Copyright 1986, James M Synge
- ;;
- ;; This file contains the data structures and an
- ;; initialization routine.
- ;;
- far code ; Absolute addresses please.
- far data ; Me too!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; To protect against the library accidentally being invoked
- ;; as a program, we return an error value. This code must
- ;; be the first thing in the library.
-
- cseg ; Code segment
- moveq.l #20,d0 ; AmigaDOS Fatal Error
- rts
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; Declaration Section:
- ;;
- ;; Imported Global Variables and Constants:
-
- dseg ; Data segment
-
- public _LibraryName ; char * LibraryName
- public _LibraryId ; char * LibraryId
-
- public LibVersion ; Current version number.
- ; Will be checked by
- ; OpenLibrary() against the
- ; requested version number.
-
- public _LibInitBlock ; Defined in Library.c
-
- public _SysBase ; Library Base Pointer for
- ; exec.library
-
- ;; Exported Global Variables:
-
- global _LibraryBase,4 ; Address of this library.
-
- global _LibSegList,4 ; Address of first entry in
- ; this library's seg list.
- ;; Imported Functions:
-
- cseg
-
- public _LibraryInit ; This is the routine which
- ; handles most of the
- ; details of preparing the
- ; library, except for regs.
- ;; Exported Functions:
-
- public __LibInitCode ; Referenced by LibInitBlock
- ; in Library.c
-
- public _regA6 ; Returns register A6.
-
- ;; Constants:
- ;; (These should be set in the Amiga supplied include files
- ;; but these aren't available for Manx 3.2a)
-
- RTC_MATCHWORD EQU $4afc ; An illegal instruction
- RTF_AUTOINIT EQU (1 << 7)
- NT_LIBRARY EQU 9 ; As defined in exec/nodes.i
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; Resident (RomTag) Structure
- ;; This structure must be in the first hunk (AmigaDOS Hunk)
- ;; of the library. Defined in "exec/resident.h"
-
- RomTag:
- DC.W RTC_MATCHWORD ; This value is an illegal
- ; instruction. It is used
- ; to mark the beginning of a
- ; rom tag. The next
- ; longword confirms it.
-
- DC.L RomTag ; The RomTag points to
- ; itself as confirmation
- ; that this is a RomTag.
-
- DC.L EndMarker ; The address of a location
- ; after this structure, but
- ; still in the same hunk.
- ; The simplest solution is
- ; to place the label right
- ; after this structure.
-
- DC.B RTF_AUTOINIT ; Auto-initialize flag, see
- ; Library.c for description
-
- DC.B LibVersion ; Library version, will be
- ; checked against the value
- ; requested in the
- ; OpenLibrary() call.
-
- DC.B NT_LIBRARY ; This is the Resident
- ; struct of a library.
-
- DC.B 0 ; Execution priority.
- ; Not used in libraries.
-
- DC.L _LibraryName ; Pointer to library name.
-
- DC.L _LibraryId ; Pointer to full library id
-
- DC.L _LibInitBlock ; Pointer to initialization
- ; descriptor block or code.
- ; See Library.c
- ;; End of the RomTag
-
- EndMarker ; Simplest place for this marker
-
- ; See Interface.asm for a complete explanation of:
- AztecBugList: reg a4/a6
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; LibInitCode, is called from within MakeLibrary(), after
- ;; all the memory has been allocated, the jump table has
- ;; been constructed, and the InitStruct() call has been
- ;; made. It is identified as the initialization code by
- ;; LibInitBlock in Library.c. LibraryInit() returns the
- ;; value (in D0 as per the calling standard) which is then
- ;; returned to MakeLibrary(). If it is zero, the library
- ;; wouldn't be added to the exec's library list and thus
- ;; cann't be opened.
-
- __LibInitCode:
- move.l a6,_SysBase ; Store away these three
- ; registers which tell us
- move.l d0,_LibraryBase ; we are and where the rest
- move.l a0,_LibSegList ; of the world can be found.
-
- ; Forgive me, Oh Lord, for I have sinned...
- movem.l AztecBugList,-(sp)
-
- ; Now call the C routine LibraryInit() with the
- ; address of our Library struct as its only argument.
-
- move.l d0,-(sp) ; Push LibraryBase
- jsr _LibraryInit ; Call
- addq.l #4,sp ; Pop LibraryBase
-
- ; Restore the registers
- movem.l (sp)+,AztecBugList
-
- rts ; Now return to our caller.
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; This trite little routine is included so that those
- ;; library specific routines which wish to access the struct
- ;; Library may do so by calling regA6() in order to get the
- ;; value of the Library Base Pointer.
- ;; Example Code Fragment:
- ;;
- ;; struct Library *lib, *regA6();
- ;; lib = regA6();
- ;; return(lib -> lib_IdString);
- ;;
- ;; An alternate (and perhaps safer method) is to use the
- ;; _LibraryBase global variable which is setup by the
- ;; __LibInitCode routine.
-
- public _regA6
- _regA6: move.l a6,d0
- rts
-
- ds.w 0 ; Align to a word boundary
- END
-