home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 3
/
Meeting_Pearls_III.iso
/
Pearls
/
tcp
/
Networking
/
Sana-II
/
spar372.lha
/
Sources
/
Spar_device.asm
< prev
next >
Wrap
Assembly Source File
|
1993-12-10
|
5KB
|
227 lines
**
** $Source: DH1:network/parnet/Sana2/Sources/Spar_device.asm,v $
** $State: Exp $
** $Revision: 37.2 $
** $Date: 93/11/07 15:40:31 $
** $Author: S.A.Pechler $
**
** Amiga SANA-II Example PARnet Device Driver
**
** Based on the SANA-II Example SLIP Device Driver by kcd and rhslip.device by
** rhialto@mbfys.kun.nl (Olaf Seibert)
**
** Portions (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/sana2.i"
LIST
include "Spar_device.i"
include "Spar_rev.i"
ABSEXECBASE EQU 4 ;Absolute location of the pointer to exec.library base
**
** Standard System Routines
**
XREF _DevOpen
XREF _DevClose
XREF _DevExpunge
XREF _DevBeginIO
XREF _DevAbortIO
**
** Other misc. routines
**
XDEF _ExtDeviceBase
** XDEF _DevProcEntry
XDEF @IPToNum
** XDEF _SANA2BuffCall
XREF _DevProcCEntry
XREF _SPARName
XREF EndCode
**
** First executable location
**
FirstAddress:
moveq #-1,d0
rts
**
** A romtag structure. Your load module will be scanned for
** this structure to discover magic constants about you
** (such as where to start running you from...).
**
** Most people will not need a priority and should leave it at zero.
** The RT_PRI field is used for configuring the roms.
SPARPRI EQU 5
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 SPARPRI ; BYTE RT_PRI
DC.L _SPARName ; APTR RT_NAME (exec name)
DC.L idString ; APTR RT_IDSTRING (text string)
DC.L Init ; APTR RT_INIT
; LABEL RT_SIZE
** 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
** The romtag specified that we were "RTF_AUTOINIT". This means
** that the RT_INIT structure member points to one of these
** tables below. If the AUTOINIT bit was not set then RT_INIT
** would point to a routine to run.
Init:
DC.L SPARDev_Sizeof ; data space size
DC.L DevFuncTable ; pointer to function initializers
DC.L DevDataTable ; pointer to data initializers
DC.L DevInit ; routine to run
DevFuncTable:
dc.l _DevOpen
dc.l _DevClose
dc.l _DevExpunge
dc.l DevReserved
dc.l _DevBeginIO
dc.l _DevAbortIO
dc.l -1
** The data table initializes static data structures. The format is
** specified in exec/InitStruct routine's manual page. The
** INITBYTE/INITWORD/INITLONG macros are in the file "exec/initializers.i".
** The first argument is the offset from the device base for this
** byte/word/long. The second argument is the value to put in that cell.
** The table is null terminated.
DevDataTable:
INITBYTE LN_TYPE,NT_DEVICE ;Must be LN_TYPE!
INITLONG LN_NAME,_SPARName
INITBYTE LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
INITWORD LIB_VERSION,VERSION
INITWORD LIB_REVISION,REVISION
dc.l 0
**
** Rhialto: Our only global variable. Since it is constant as long as
** we're in existence, this is not harmful.
_ExtDeviceBase dc.l 0
**
** initRoutine
**
** This routine gets called after device has been allocated.
** The device pointer is in d0, the AmigaDOS segment list in a0.
** If it returns it's device pointer, then the device will be linked
** into the devices list. If it returns NULL, then the device will be
** unloaded.
**
** 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) ;already done in DevDataTable
move.l a6,sd_SysLib(a5) ;save a pointer to exec
move.l a0,sd_SegList(a5) ;save a pointer to our loaded code
lea.l sd_Lock(a5),a0 ;make sure the Open() function
jsrlib InitSemaphore ;will be single-threaded.
move.l a5,d0 ;return the device pointer
movem.l (sp)+,a0/a5
rts
**
** Device Reserved vector (returns 0L)
**
DevReserved:
moveq.l #0,d0
rts
@IPToNum:
movem.l d2,-(sp)
bsr StrToNum
lsl.w #8,d0
move.w d0,d2
bsr StrToNum
move.b d0,d2
swap d2
bsr StrToNum
lsl.w #8,d0
move.w d0,d2
bsr 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 2$
sub.b #'0',d1
mulu #10,d0
add.w d1,d0
bra 1$
2$ rts
** These things are not needed anymore.
**
** _SANA2BuffCall:
** jmp (a2)
**
**_DevProcEntry:
** movea.l _ExtDeviceBase(pc),a6
** jmp _DevProcCEntry
END