**
** $Source: HOG:Other/networking/sana2/src/slip/RCS/slip_device.asm,v $
** $State: Exp $
** $Revision: 38.1 $
** $Date: 94/02/17 14:17:31 $
** $Author: kcd $
**
** Amiga SANA2 SLIP Device Driver
**
** (C) Copyright 1992-1998 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 "utility/hooks.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

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

	ds.w   0

Init:
	dc.l	SLIPDev_Sizeof	; data space size
	dc.l	funcTable	; pointer to function initializers
	dc.l	dataTable	; pointer to data initializers
	dc.l	initRoutine	; routine to run

**
** Standard System Routines
**

	XREF	_DevOpen
	XREF	_DevClose
	XREF	_DevExpunge
	XREF	_DevBeginIO
	XREF	_DevAbortIO
	XDEF	_ExtDeviceBase
	XDEF	_DevProcEntry
	XDEF	@IPToNum
	XDEF	_SANA2BuffCall
	XREF	_DevProcCEntry

funcTable:
	dc.l	_DevOpen
	dc.l	_DevClose
	dc.l	_DevExpunge
	dc.l	Null
	dc.l	_DevBeginIO
	dc.l	_DevAbortIO
	dc.l	-1

dataTable:
	INITBYTE	LN_TYPE,NT_DEVICE	;Must be LN_TYPE!
	INITLONG	LN_NAME,SLIPName
	INITBYTE	LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
	INITWORD	LIB_VERSION,VERSION
	INITWORD	LIB_REVISION,REVISION
	INITLONG	LIB_IDSTRING,idString
	DC.W   0	;terminate list

_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
** a5 - Pointer to device struct
** a6 - Pointer to Exec Base

initRoutine:
	movem.l	d1-d7/a0-a5,-(sp)
	movea.l	d0,a5
	move.l	a6,sd_SysLib(a5)
	move.l	a0,sd_SegList(a5)
	lea.l	FakePFHookEntry(pc),a0
	move.l	a0,sd_DummyPFHook+h_Entry(a5)
	lea.l	sd_Lock(a5),a0
	jsrlib	InitSemaphore
	move.l	a5,d0
Init_Exit:
	movem.l	(sp)+,d1-d7/a0-a5
	rts

Null:
	moveq.l	#0,d0
	rts

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

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

_DevProcEntry:
	movea.l	_ExtDeviceBase(pc),a6
	jmp	_DevProcCEntry

_SANA2BuffCall:
	jmp	(a2)

FakePFHookEntry:
	moveq.l	#1,d0
	rts

	end
