
;**; configregs.i ;********************************************************
;
;  register and bit definitions for expansion boards
;
; Copyright (C) 1985,  Commodore-Amiga, Inc., All rights reserved.
;
; $Header: configregs.i,v 33.2 86/05/04 23:40:52 neil Exp $
;
; $Locker:  $
;
; $Log: configregs.i,v $
; Revision 33.2  86/05/04  23:40:52  neil
; added diag area
; 
; Revision 33.1  86/04/01  12:17:22  neil
; First version
; 
;
;***************************************************************************

        IFND    LIBRARIES_CONFIGREGS_I@
LIBRARIES_CONFIGREGS_I@  =     1

;; Expansion boards are actually organized such that only one nibble per
;; word (16 bits) are valid information.  This table is structured
;; as LOGICAL information.  This means that it never corresponds
;; exactly with a physical implementation.
;*
;; The expansion space is logically split into two regions:
;; a rom portion and a control portion.  The rom portion is
;; actually stored in one's complement form (except for the
;; er_type field).


 STRUCTURE ExpansionRom,0
    UBYTE       er_Type
    UBYTE       er_Product
    UBYTE       er_Flags
    UBYTE       er_Reserved03
    UWORD       er_Manufacturer
    ULONG       er_SerialNumber
    UWORD       er_InitDiagVec
    UBYTE       er_Reserved0c
    UBYTE       er_Reserved0d
    UBYTE       er_Reserved0e
    UBYTE       er_Reserved0f
    LABEL       ExpansionRom_SIZEOF

 STRUCTURE ExpansionControl,0
    UBYTE       ec_Interrupt            ; interrupt control register
    UBYTE       ec_Reserved11
    UBYTE       ec_BaseAddress          ; set new config address
    UBYTE       ec_Shutup               ; don't respond, pass config out
    UBYTE       ec_Reserved14
    UBYTE       ec_Reserved15
    UBYTE       ec_Reserved16
    UBYTE       ec_Reserved17
    UBYTE       ec_Reserved18
    UBYTE       ec_Reserved19
    UBYTE       ec_Reserved1a
    UBYTE       ec_Reserved1b
    UBYTE       ec_Reserved1c
    UBYTE       ec_Reserved1d
    UBYTE       ec_Reserved1e
    UBYTE       ec_Reserved1f
    LABEL       ExpansionControl_SIZEOF

;*
;; many of the constants below consist of a triplet of equivalent
;; definitions: xxMASK is a bit mask of those bits that matter.
;; xxBIT is the starting bit number of the field.  xxSIZE is the
;; number of bits that make up the definition.  This method is
;; used when the field is larger than one bit.
;*
;; If the field is only one bit wide then the xxB_xx and xxF_xx convention
;; is used (xxB_xx is the bit number, and xxF_xx is mask of the bit).
;*

;; manifest constants ;/
E_SLOTSIZE              EQU     $10000
E_SLOTMASK              EQU     $ffff
E_SLOTSHIFT             EQU     16

;; these define the two free regions of Zorro memory space.
;; THESE MAY WELL CHANGE FOR FUTURE PRODUCTS|
E_EXPANSIONBASE         EQU     $e80000
E_EXPANSIONSIZE         EQU     $080000
E_EXPANSIONSLOTS        EQU     8

E_MEMORYBASE            EQU     $200000
E_MEMORYSIZE            EQU     $800000
E_MEMORYSLOTS           EQU     128



;*****; ec_Type definitions ;/

;; board type -- ignore "old style" boards ;/
ERT_TYPEMASK            EQU     $c0
ERT_TYPEBIT             EQU     6
ERT_TYPESIZE            EQU     2
ERT_NEWBOARD            EQU     $c0


;; type field memory size ;/
ERT_MEMMASK             EQU     $07
ERT_MEMBIT              EQU     0
ERT_MEMSIZE             EQU     3


;; other bits defined in type field ;/
;        BITDEF  ERT,CHAINEDCONFIG,3
ERTB_CHAINEDCONFIG = 3
ERTF_CHAINEDCONFIG = 1<<3
;        BITDEF  ERT,DIAGVALID,4
ERTB_DIAGVALID = 4
ERTF_DIAGVALID = 1<<4
;        BITDEF  ERT,MEMLIST,5
ERTB_MEMLIST = 5
ERTF_MEMLIST = 1<<5


;; er_Flags byte -- for those things that didn't fit into the type byte ;/
;        BITDEF  ERF,MEMSPACE,7          ; wants to be in 8 meg space.  Also
ERFB_MEMSPACE = 7          ; wants to be in 8 meg space.  Also
ERFF_MEMSPACE = 1<<7          ; wants to be in 8 meg space.  Also
                                        ;     implies that board is moveable
;        BITDEF  ERF,NOSHUTUP,6          ; board can't be shut up.  Must not
ERFB_NOSHUTUP = 6          ; board can't be shut up.  Must not
ERFF_NOSHUTUP = 1<<6          ; board can't be shut up.  Must not
                                        ;     be a board.  Must be a box that
                                        ;     does not pass on the bus.


;; interrupt control register ;/
;        BITDEF  ECI,INTENA,1
ECIB_INTENA = 1
ECIF_INTENA = 1<<1
;        BITDEF  ECI,RESET,3
ECIB_RESET = 3
ECIF_RESET = 1<<3
;        BITDEF  ECI,INT2PEND,4
ECIB_INT2PEND = 4
ECIF_INT2PEND = 1<<4
;        BITDEF  ECI,INT6PEND,5
ECIB_INT6PEND = 5
ECIF_INT6PEND = 1<<5
;        BITDEF  ECI,INT7PEND,6
ECIB_INT7PEND = 6
ECIF_INT7PEND = 1<<6
;        BITDEF  ECI,INTERRUPTING,7
ECIB_INTERRUPTING = 7
ECIF_INTERRUPTING = 1<<7


;*************************************************************************
;*
;; these are the specifications for the diagnostic area.  If the Diagnostic
;; Address Valid bit is set in the Board Type byte (the first byte in
;; expansion space) then the Diag Init vector contains a valid offset.
;*
;; The Diag Init vector is actually a word offset from the base of the
;; board.  The resulting address points to the base of the DiagArea
;; structure.  The structure may be physically implemented either four,
;; eight, or sixteen bits wide.  The code will be copied out into
;; ram first before being called.
;*
;; The da_Size field, and both code offsets (da_DiagPoint and da_BootPoint)
;; are offsets from the diag area AFTER it has been copied into ram, and
;; "de-nibbleized" (if needed).  Inotherwords, the size is the size of
;; the actual information, not how much address space is required to
;; store it.
;*
;; All bits are encoded with uninverted logic (e.g. 5 volts on the bus
;; is a logic one).
;*
;; If your board is to make use of the boot facility then it must leave
;; its config area available even after it has been configured.  Your
;; boot vector will be called AFTER your board's final address has been
;; set.
;*
;*************************************************************************

 STRUCTURE DiagArea,0
    UBYTE       da_Config       ; see below for definitions
    UBYTE       da_Flags        ; see below for definitions
    UWORD       da_Size         ; the size (in bytes) of the total diag area
    UWORD       da_DiagPoint    ; where to start for diagnostics, or zero
    UWORD       da_BootPoint    ; where to start for booting
    UWORD       da_Name         ; offset in diag area where a string
                                ;   identifier can be found (or zero if no
                                ;   identifier is present).

    UWORD       da_Reserved01   ; two words of reserved data.  must be zero.
    UWORD       da_Reserved02
    LABEL       DiagArea_SIZEOF

; da_Config definitions
DAC_BUSWIDTH    EQU     $C0     ; two bits for bus width
DAC_NIBBLEWIDE  EQU     $00
DAC_BYTEWIDE    EQU     $40
DAC_WORDWIDE    EQU     $80

DAC_BOOTTIME    EQU     $30     ; two bits for when to boot
DAC_NEVER       EQU     $00     ; obvious
DAC_CONFIGTIME  EQU     $10     ; call da_BootPoint when first configing the
                                ;   the device
DAC_BINDTIME    EQU     $20     ; run when binding drivers to boards

;*
;; These are the calling conventions for Diag or Boot area
;*
;; A7 -- points to at least 2K of stack
;; A6 -- ExecBase
;; A5 -- ExpansionBase
;; A3 -- your board's ConfigDev structure
;; A2 -- Base of diag/init area that was copied
;; A0 -- Base of your board
;*
;; Your board should return a value in D0.  If this value is NULL, then
;; the diag/init area that was copied in will be returned to the free
;; memory pool.
;*


        ENDIF
        END

 