source: abuse/tags/pd/macabuse/src/net/mac/ddplisten.c @ 49

Last change on this file since 49 was 49, checked in by Sam Hocevar, 12 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 3.3 KB
Line 
1#include "ddplisten.hpp"
2
3#define ddpResult                       2
4#define ddpType                         8
5#define ddpSocket                       10
6#define ddpAddress                      12
7#define ddpReqCount                     16
8#define ddpActCount                     18
9#define ddpDataPtr                      20
10#define ddpNodeID                       24
11
12
13#define tDDPRec                  0
14#define tDDPBuffer               4
15#define tDDPLen                  8
16
17// if on entry D0 = INIT, then call is to initialize, a1 must have a DDP handle.
18// with VM this code must be locked down as well as the buffer and the handle !!!
19
20pascal asm void DDPListener()
21{
22                cmp.l #'INIT',d0                                        // is this my init call ?
23                beq saveDDP                                                     // save the address of my DDP handle
24                move.w SR,-(sp)                                         // save status register
25                ori.w #0x2600,SR                                        // disable interrupts
26                move.l a5,-(sp)                                         // save this a5
27                lea data,a5                                                     // put my data in a5
28                move.w d1,tDDPLen(a5)                           // save the len of this packet
29                moveq #0,d3                                                     // clear d3
30                move.w d1,d3                                            // we want to read the whole packet
31                move.l tDDPBuffer(a5),a3                        // set buffer address in a3
32                move.l (sp)+,a5                                         // recover a5
33                jsr 2(a4)                                                       // go to ReadRest
34                beq.s getAddr                                           // if there was no error lets fill in DDP info
35                move.w (sp)+,SR                                         // recover status register
36                rts                                                                     // return otherwise (error)
37
38getAddr:
39                move.l a5,-(sp)                                         // save a5
40                lea data,a5                                                     // put my data in a5
41                move.w tDDPLen(a5),d1                           // put packet length back in d1
42                move.l tDDPRec(a5),a5                           // put the DDP pointer in a5
43                clr.l d3                                                        // clear d3
44                clr.w ddpResult(a5)                                                     // set result to zero (noErr)
45                move.w d1,ddpActCount(a5)                                               // set actual count read
46                move.b 1(a2),d3                                                                 // put destination node in d3
47                move.w d3,ddpNodeID(a5)                                                 // set destination node
48                cmpi.b #2,3(a2)                                                                 // is this long lap header ?
49                beq.s longhead
50                move.b 6(a2),d3                                                                 // put destination socket in d3
51                move.w d3,ddpSocket(a5)                                                 // set destination socket
52                move.b 8(a2),d3                                                                 // put ddpType in d3
53                move.w d3,ddpType(a5)                                                   // set ddpType
54                move.w 0x1A(a2),ddpAddress(a5)                                  // set source network address
55                move.b 2(a2),ddpAddress+2(a5)                                   // set source node address
56                move.b 7(a2),ddpAddress+3(a5)                                   // set source socket address
57                move.l (sp)+,a5                                                                 // recover a5
58                move.w (sp)+,SR                                                                 // recover status register
59                rts                                                                                             // return to protocol handler
60
61longhead:
62                move.w 10(a2),ddpAddress(a5)                                    // set source network address
63                move.b 13(a2),ddpAddress+2(a5)                                  // set source node address
64                move.b 15(a2),ddpAddress+3(a5)                                  // set source socket number
65                move.b 14(a2),d3                                                                // put destination socket in d3
66                move.w d3,ddpSocket(a5)                                                 // set destination socket
67                move.b 16(a2),d3                                                                // put ddpType in d3
68                move.w d3,ddpType(a5)                                                   // set ddpType
69                move.l (sp)+,a5                                                                 // recover a5
70                move.w (sp)+,SR                                                                 // recover status register
71                rts                                                                                             // return to protocol handler
72
73saveDDP:
74                lea data,a0                                                             // put this data in a0
75                move.l a1,tDDPRec(a0)                                   // save my DDP pointer there
76                move.l ddpDataPtr(a1),tDDPBuffer(a0)    // save address of buffer there too
77                rts                                                                             // return to caller
78data:
79                dc.l    0       // DDP record pointer
80                dc.l    0       // DDPBuffer address
81                dc.w    0       // packet lenght
82}
83
84asm void InitDDPListener(ATDDPRec *ddp)
85{
86        move.l #'INIT',d0       // set our init flag in d0
87        move.l 4(sp),a1         // put the ddp record pointer we are passed in a1
88        jsr DDPListener         // go initialaze our socket listener
89        rts
90}
Note: See TracBrowser for help on using the repository browser.