home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 3
/
Meeting_Pearls_III.iso
/
Pearls
/
comm
/
Networking
/
ProNET
/
source.lzx
/
drivers
/
internal-parallel.s
next >
Wrap
Text File
|
1991-06-20
|
10KB
|
489 lines
**
** ProNET-Driver `internal-parallel'
**
** 07-05-95 Started
** 29-05-95 bset -> or etc..
** 31-05-95 machine priority system :-(
** 05-06-95 init: flags argument
; Format of one packet is:
; 2bytes LENGTH of data including next two words in WORDS-1 !!!!!
; 2bytes Destination port
; 2bytes Source port
; xbytes DATA
DISABLEINTS macro
move.w #$4000,$dff09a
endm
ENABLEINTS macro
move.w #$c000,$dff09a
endm
include "A:OSmacros.i"
include "exec/exec.i"
include "resources/misc.i"
include "hardware/cia.i"
include "a:ProNET/include/devices/pronet.i"
include "exec_lib.i"
include "intuition_lib.i"
include "dos_lib.i"
; -- Initialization routine
Init ; a0 *DriverData
; a1 *ConfigString after driver ID
; d0 "RST!" for Identification
; d1 Flags
; RETURNS d0 <>0 if everything OK, else NULL!
movem.l d2-d7/a2-a6,-(sp)
move.l a0,a4
move.l a1,a5
cmp.l #"RST!",d0 ;compare ID
bne .error
tst.l d1
bne .error ;unknown Flags!
bsr AllocPPort
tst.w d0
bne .error
move.l a5,a0
bsr dec2slong
move.w d1,MACHINE
bsr dec2slong
move.w d1,PRIORITY
bsr InitTransfer
bsr TrapOpenDevice
move.l 4.w,a6
move.l ThisTask(a6),a1
move.w PRIORITY(pc),d0
LIBCALL SetTaskPri
move.b INTsigbit(pc),(a4) ;Read Signalbit
move.l #ReadQuery,2(a4)
move.l #Read,6(a4)
move.l #Write,10(a4)
moveq #-1,d0
bra.s .ende
.error moveq #0,d0
.ende movem.l (sp)+,d2-d7/a2-a6
rts
dc.b "$VER: pronet-driver `internal-parallel' (05-06-95)",13,10,0
even
PRIORITY dc.w 0
MACHINE dc.w 0
dec2slong ; konvertiert Dezimalstring ab (a0) zu Longword in D1 !!
; SIGNED!
moveq #0,d1
moveq #0,d3
move.b (a0),d0
cmp.b #"-",d0
bne.s .loop
addq.l #1,a0
st d3
.loop moveq #0,d0
move.b (a0)+,d0
sub.b #"0",d0
cmp.b #9,d0
bhi.s .oki
move.l d1,d2
lsl.l #3,d1
add.l d2,d1
add.l d2,d1
add.l d0,d1
bra.s .loop
.oki tst.w d3
beq.s .ende
neg.l d1
.ende rts
; -- Read Query routine
ReadQuery ; RETURNS d0 length of pure data to come or NULL
; d1 destport
; d2 sourceport
movem.l d3-d7/a2-a6,-(sp)
lea $bfd000,a2 ; test if packet is pending
btst #0,(a2)
bne.s .error
lea $bfd200,a3 ; ciab ddra
bset #1,(a3) ; set ack line to output
lea buffer-2(pc),a4 ; first word is `empty'
moveq #3,d4 ; (due to handshake init)
bsr ReceiveData
movem.w buffer(pc),d0-d2
subq.w #2-1,d0
add.w d0,d0
movem.l (sp)+,d3-d7/a2-a6
rts
.error moveq #0,d0
movem.l (sp)+,d3-d7/a2-a6
rts
; -- Read routine
Read ; a0 *destination
movem.l d2-d7/a2-a6,-(sp)
move.l a0,a4
move.w buffer(pc),d4
subq.w #2,d4
bsr ReceiveData
lea $bfd200,a3 ; ciab ddra
bclr #1,(a3) ; set ack line to input
movem.l (sp)+,d2-d7/a2-a6
rts
; -- Write routine
Write ; a0 *data1
; d0.l datalength1 (even)
; a1 *data2
; d1.l datalength2 (even)
; d2 Destination Port
; d3 Source Port
; d0+d1 <= $4000
; d1=0 --> only first chunk is sent, else second is appended
; to first one and sent as one chunk!
; RETURNS d0 <>0 on error, else NULL
movem.l d2-d7/a2-a6,-(sp)
lea buffer(pc),a5
movem.l d0/d1/a0/a1,6(a5)
move.w d2,(a5)
move.w d3,2(a5)
move.w d0,d4
add.w d1,d4
lsr.w #1,d4
addq.w #2-1,d4
bsr AcquireLine
tst.w d0 ;Line is busy now! Try later
bne.s .ende
move.l a5,a4
moveq #1,d4
moveq #0,d6
bsr SendData
move.l 14(a5),a4
move.l 6(a5),d4
lsr.w #1,d4
subq.w #1,d4
tst.w 12(a5)
beq.s .0
bsr SendData
move.l 18(a5),a4
move.l 10(a5),d4
lsr.w #1,d4
subq.w #1,d4
.0 subq.w #1,d4
bmi.s .lastone
bsr SendData
.lastone DISABLEINTS * We don't take too long here
moveq #0,d4 * in case the other machine wants
bsr SendData * to send something...
lea $bfd200,a3
and.b #%11111000,(a3) ; all control lines input
lea $bfe301,a1
sf (a1) ; data lines input, too
lea $bfd000,a2 ; ciab pra ==> CONTROL LINES
or.b #%00000111,(a2)
ENABLEINTS
moveq #0,d0
.ende movem.l (sp)+,d2-d7/a2-a6
rts
dc.w 0
buffer dc.w 0,0,0
dc.l 0,0,0,0
** -----------------------------------------------------------------------
**
**
**
**
**
** Parallel.device trapping
**
**
**
**
**
** -----------------------------------------------------------------------
TrapOpenDevice move.l 4.w,a6
move.l a6,a1
move.l #_LVOOpenDevice,a0
move.l #.trap,d0
LIBCALL SetFunction
move.l d0,orgopendev
rts
.trap movem.l a0/a1/d0/d1,-(sp)
lea parname(pc),a1
bsr CompareStrings
tst.w d0
bne.s .openit
movem.l (sp)+,a0/a1/d0/d1
move.b #-1,IO_ERROR(a1)
moveq #-1,d0 ;IOERR_OPENFAIL
rts
.openit movem.l (sp)+,a0/a1/d0/d1
move.l a2,-(sp)
move.l orgopendev(pc),a2
jsr (a2)
move.l (sp)+,a2
rts
orgopendev dc.l 0
; -- Compare two null-terminated strings. Case-insensitive
CompareStrings ; a0 *String1
; a1 *String2
; RETURNS d0 = 0 --> Strings equal
move.l d2,-(sp)
moveq #-1,d0
.loop move.b (a0)+,d1
move.b (a1)+,d2
bclr #5,d1
bclr #5,d2
cmp.b d1,d2
bne.s .ende
tst.b d1
bne.s .loop
moveq #0,d0
.ende move.l (sp)+,d2
rts
parname dc.b "parallel.device",0
** -----------------------------------------------------------------------
**
**
**
**
**
** Built-in Parallel Port Transfer routines
**
**
**
**
**
** -----------------------------------------------------------------------
; -- Allocate Parallel Port Registers
AllocPPort lea miscname(pc),a1
move.l 4.w,a6
LIBCALL OpenResource
move.l d0,a6
move.l #MR_PARALLELPORT,d0
lea INTname(pc),a1
jsr -6(a6) ;AllocMiscResource
tst.w d0
bne.s .err1
move.l #MR_PARALLELBITS,d0
lea INTname(pc),a1
jsr -6(a6)
tst.w d0
bne.s .err2
moveq #0,d0
rts
.err2 move.l #MR_PARALLELPORT,d0
jsr -12(a6) ;FreeMiscResource
.err1 move.l 4.w,a6
moveq #-1,d0
rts
miscname dc.b "misc.resource",0
ciaaname dc.b "ciaa.resource",0
even
ciaabase dc.l 0
; -- Init Transfer routines
InitTransfer movem.l d7/a2/a3/a6,-(sp)
move.l 4.w,a6
move.l ThisTask(a6),INTsigtask
moveq #-1,d0
LIBCALL AllocSignal
move.b d0,INTsigbit
bsr InitParallel
lea ciaaname(pc),a1
move.l 4.w,a6
LIBCALL OpenResource
move.l d0,a6
move.l d0,ciaabase
moveq #CIAICRB_FLG,d0
lea INTstruct(pc),a1
jsr -6(a6)
movem.l (sp)+,d7/a2/a3/a6
rts
INTsigtask dc.l 0
INTsigbit dc.w 0
INTstruct dc.l 0,0
dc.b 2,127
dc.l INTname
dc.l 0,INTcode
INTname dc.b "ProNET Internal-Parallel Driver",0
even
INTcode lea $bfd000,a0 ;check if the interrupt
btst #0,(a0) ;was `correct' or caused
bne.s .no ;by switching on the remote
move.l 4.w,a6 ;machine
move.l INTsigtask(pc),a1
move.b INTsigbit(pc),d1
moveq #0,d0
bset d1,d0
LIBCALL Signal
.no moveq #1,d0
rts
;:---------------------------------------------------------------------------
;:-- InitParallel
InitParallel
lea $bfe101,a0 ; ciaa prb ==> DATA LINES
lea $bfe301,a1 ; ciaa ddrb
lea $bfd000,a2 ; ciab pra ==> CONTROL LINES
lea $bfd200,a3 ; ciab ddra
and.b #%11111000,(a3) ; all control lines input ---|
sf (a1) ; [[data lines input, too]] v
or.b #%00000111,(a2) ; and 1 when we set them to output
rts
;:---------------------------------------------------------------------------
;:-- AcquireLine
;:-- d4 Number of words-1 that will be sent !
;:-- !!!!!! RETURNS d0=0 if no error
;:-- d0<>0 if line was busy
AcquireLine
lea $bfd000,a2 ; ciab pra ==> CONTROL LINES
lea $bfd200,a3 ; ciab ddra
DISABLEINTS
btst #0,(a2)
bne.s .free
ENABLEINTS
moveq #-1,d0
rts
.free bset #0,(a3)
bclr #0,(a2)
bset #2,(a3) ; cause interrupt by quickly toggling
bclr #2,(a2) ; the FLAG input of the other
bset #2,(a2) ; machine
bclr #2,(a3)
move.l ciaabase(pc),a6 ; reset interrupt flag which was
moveq #CIAICRF_FLG,d0 ; set on our machine, too
jsr -24(a6) ; (SEL&ACK connected at parallel port)
ENABLEINTS
lea $bfe101,a0 ; ciaa prb ==> DATA LINES
lea $bfe301,a1 ; ciaa ddrb
tst.w firstpacketflag ; no timeout for the first packet!
beq.s .acknotimeout
tst.w MACHINE ; no timeout for machine 1!
bne.s .acknotimeout
move.l #100000,d0
.ack0 btst #1,(a2) ; wait for it to respond...
beq.s .ack0ok
subq.l #1,d0
bne.s .ack0
bset #0,(a2)
and.b #%11111000,(a3) ; TIMEOUT! reset all lines
or.b #%00000111,(a2)
bsr INTcode
moveq #-1,d0
rts
.acknotimeout btst #1,(a2)
bne.s .acknotimeout
.ack0ok st firstpacketflag
bset #0,(a2) ; and initialize handshake sequence
.ack1 btst #1,(a2)
beq.s .ack1
st (a1) ; set data lines to output now
ror.w #8,d4 ; and hand the length word over
move.b d4,(a0) ; to the remote machine
bclr #0,(a2)
ror.w #8,d4
.ack2 btst #1,(a2)
bne.s .ack2
move.b d4,(a0)
bset #0,(a2)
.ack3 btst #1,(a2)
beq.s .ack3
moveq #0,d0
rts
firstpacketflag dc.w 0
;:---------------------------------------------------------------------------
;:-- SendData
;:-- a4 *data
;:-- d4 datalength in words-1
SendData
lea $bfe101,a0 ; ciaa prb ==> DATA LINES
lea $bfd000,a2 ; ciab pra ==> CONTROL LINES
move.b #%11111110,d0
move.b #%00000001,d1
.loop move.b (a4)+,(a0) ; fully handshaked data txfer
and.b d0,(a2)
.ack0 btst #1,(a2)
bne.s .ack0
move.b (a4)+,(a0)
or.b d1,(a2)
.ack1 btst #1,(a2)
beq.s .ack1
dbra d4,.loop
rts
;:---------------------------------------------------------------------------
;:-- ReceiveData
;:-- a4 *datadest
;:-- d4 datalength in words-1
ReceiveData
lea $bfe101,a0 ; ciaa prb ==> DATA LINES
lea $bfd000,a2 ; ciab pra ==> CONTROL LINES
move.b #%11111101,d0
move.b #%00000010,d1
.loop btst #0,(a2)
bne.s .loop
move.b (a0),(a4)+
and.b d0,(a2)
.ack0 btst #0,(a2)
beq.s .ack0
move.b (a0),(a4)+
or.b d1,(a2)
dbra d4,.loop
rts