**
** $Source: hog:Other/networking/sana2/src/slip/RCS/slip_device.asm,v $
** $State: Exp $
** $Revision: 37.3 $
** $Date: 92/08/25 16:42:36 $
** $Author: kcd $
**
** Amiga SANA2 Example SLIP Device Driver
**
** (C) Copyright 1992 Commodore-Amiga, Inc.
**


	SECTION	firstsection

	NOLIST

	include	"exec/types.i"
	include	"exec/devices.i"
	include	"exec/initializers.i"
	include	"exec/memory.i"
	include	"exec/resident.i"
	include	"exec/io.i"
	include	"exec/ables.i"
	include	"exec/errors.i"
	include	"exec/tasks.i"
	include	"utility/tagitem.i"
	include	"dos/dos.i"
	include	"dos/dosextens.i"
	include	"dos/dostags.i"
	include	"devices/serial.i"
	include	"devices/sana2.i"
	include	"slip_device.i"
include "slip_rev.i"

	LIST

ABSEXECBASE	EQU	4	;Absolute location of the pointer to exec.library base
**
** First executable location
**

FirstAddress:
	moveq	#-1,d0
	rts

SLIPPRI   EQU   5

	XREF	EndCode

initDDescrip:
					; STRUCTURE RT,0
	DC.W	RTC_MATCHWORD		; UWORD	RT_MATCHWORD (Magic cookie)
	DC.L	initDDescrip		; APTR	RT_MATCHTAG  (Back pointer)
	DC.L	EndCode			; APTR	RT_ENDSKIP   (To end of this hunk)
	DC.B	RTF_AUTOINIT		; UBYTE	RT_FLAGS     (magic-see "Init:")
	DC.B	VERSION			; UBYTE	RT_VERSION
	DC.B	NT_DEVICE		; UBYTE	RT_TYPE	     (must be correct)
	DC.B	SLIPPRI			; BYTE	RT_PRI
	DC.L	_SLIPName		; APTR	RT_NAME	     (exec name)
	DC.L	idString		; APTR	RT_IDSTRING  (text string)
	DC.L	Init			; APTR	RT_INIT
					; LABEL	RT_SIZE

	XDEF	_SLIPName
_SLIPName:	SLIPDEVNAME

** This is an identifier tag to help in supporting the device
** format is 'name version.revision (dd MON yyyy)',<cr>,<lf>,<null>

idString:	VSTRING

** Force word alignment

	CNOP	0,4

Init:
	DC.L	SLIPDev_Sizeof	; data space size
	DC.L	DevFuncTable	; pointer to function initializers
	DC.L	0		; pointer to data initializers (unused)
	DC.L	DevInit		; routine to run

**
** Standard System Routines
**

	XREF	_DevOpen
	XREF	_DevClose
	XREF	_DevExpunge
	XREF	_DevBeginIO
	XREF	_DevAbortIO

**
** Other misc. routines
**
	XDEF	_ExtDeviceBase
	XDEF	@IPToNum

V_DEF	MACRO
	DC.W	\1+(*-DevFuncTable)
	ENDM

DevFuncTable:
	DC.W	-1
	V_DEF	_DevOpen
	V_DEF	_DevClose
	V_DEF	_DevExpunge
	V_DEF	DevReserved
	V_DEF	_DevBeginIO
	V_DEF	_DevAbortIO
	DC.W	-1

**
** Rhialto: Our only global variable. Since it is constant as long as
** we're in existence, this is not harmful. And it's better than hoping
** (or praying, as they like to do in the USA) the compiler doesn't
** clobber A6.

_ExtDeviceBase	dc.l	0

**
** initRoutine
**
** Called after device has been allocated.
** This routine is single threaded
**
** Register Usage
**
** a3 - Pointer to temporary RAM
** a4 - Pointer to expansion.library base
** d0 - Pointer to device struct
** a6 - Pointer to Exec Base

DevInit:
	movem.l	a0/a5,-(sp)
	movea.l	d0,a5
	move.l	d0,_ExtDeviceBase		; Rhialto
	move.w	#REVISION,LIB_REVISION(a5)
	move.l	a6,sd_SysLib(a5)
	move.l	a0,sd_SegList(a5)
	lea.l	sd_Lock(a5),a0
	jsrlib	InitSemaphore
	move.l	a5,d0
	movem.l	(sp)+,a0/a5
	rts

DevReserved:
	moveq.l	#0,d0
	rts

@IPToNum:
	movem.l	d2,-(sp)
	bsr.s	StrToNum
	lsl.w	#8,d0
	move.w	d0,d2
	bsr.s	StrToNum
	move.b	d0,d2
	swap	d2
	bsr.s	StrToNum
	lsl.w	#8,d0
	move.w	d0,d2
	bsr.s	StrToNum
	move.b	d0,d2
	move.l	d2,d0
	movem.l	(sp)+,d2
	rts

StrToNum:
	moveq	#0,d0
	moveq	#0,d1
1$	move.b	(a0)+,d1
	cmp.b	#'0',d1
	bcs.s	2$			; was blo
	cmp.b	#'9',d1
	bhi.s	2$
	sub.b	#'0',d1
	mulu	#10,d0
	add.w	d1,d0
	bra.s	1$
2$	rts

	END
