;=============================================================================
;                   CNET PCMCIA Network Card Test
;=============================================================================

 opt d+

 output ram:card_test

 include start.i
 include pcmcia.i
 include cnet.i

 include printf.i

_main:
 dos     output
 move.l  d0,ohandle
 move.l  4.w,a6
 lea     cardname(pc),a1
 jsr     _LVOOpenResource(a6)         ; open credit card resource
 move.l  d0,cardres
 beq.s   .error
 move.l  d0,a6
 lea     card_handle(pc),a1
 lea     cardremoved(pc),a0
 move.l  a0,cah_CardRemoved(a1)
 lea     cardinserted(pc),a0
 move.l  a0,cah_CardInserted(a1)      ; set interrupt vectors
 lea     cardstatus(pc),a0
 move.l  a0,cah_CardStatus(a1)
 lea     ourname(pc),a0
 move.l  a0,ln_name(a1)
 move.b  #20,ln_pri(a1)
 move.b  #CARDF_IFAVAILABLE,cah_cardflags(a1)
 jsr     _LVOOwnCard(a6)              ; own card (sets up interrupt vectors)
 tst.l   d0
 beq.s   .ok
.error:
 moveq   #-1,d0                       ; error if can't own card
 bra     _done
.ok:
 jsr     _LVOGetCardMap(a6)
 move.l  d0,cmm                       ; get card memory map
 beq     _releasecard

 lea     card_handle(pc),a1
 move.l  #CARDF_DISABLE_WP|CARDF_ENABLE_DIGAUDIO,d1
 jsr     _LVOCardMiscControl(a6)      ; enable card I/O functions

 lea     card_handle(pc),a1
 jsr     _LVOCardResetCard(a6)        ; reset card

_start:
 move.l  cmm(pc),a2
 move.l  cmm_AttributeMemory(a2),a0   ; set I/O offset to $0300
 move.b  #$20,Config_Register(a0)     ; (these values are for CN40BC)

 move.l  cmm_IOMemory(a2),d0
 add.l   #IOBase,d0
 move.l  d0,ioaddr                    ; calculate I/O base address

; do your card-specific stuff here

_releasecard:
 lea     card_handle(pc),a1
 moveq   #CARDF_REMOVEHANDLE,d0
 move.l  cardres(pc),a6
 jsr     _LVOReleaseCard(a6)

 printf  <"%ld interrupt(s) were detected",10,10>,ints

_done:
 rts


;============================================================
;             PCMCIA status change interrupt handler
;============================================================
;  input:   d0 = status change(s)
;           a1 = user defined
;
;  output:  d0 must be preserved!
;
;
status_int_code:
 addq.l    #1,ints
 rts


card_inserted_code:
 rts

card_removed_code:
 rts

ourname:
 dc.b "pcmcia test interrupt",0
cardname:
 dc.b "card.resource",0
 even

cardremoved:
 dc.l 0,0
 dc.b 0,0
 dc.l 0
 dc.l 0
 dc.l card_removed_code

cardinserted:
 dc.l 0,0
 dc.b 0,0
 dc.l 0
 dc.l 0
 dc.l card_inserted_code

cardstatus:
 dc.l 0,0
 dc.b 0,0
 dc.l 0
 dc.l 0                 ; value to placed in A1 at interrupt time
 dc.l status_int_code


;--------------------------------------------------------
;                     Global data
;--------------------------------------------------------

cardres:
  dc.l 0             ; card.resource base

cmm:
  dc.l 0             ; pointer to card memory map

ioaddr:
  dc.l 0             ; I/O address of CNet card registers

ints:
  dc.l 0             ; number of status change interrupts

card_handle:
  ds.b  cah_sizeof   ; handle for our card

