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

Last change on this file since 49 was 49, checked in by Sam Hocevar, 11 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 3.7 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
16#define myStart                 0
17#define myEnd                   4
18#define myHeadPtr               8
19#define myTailPtr               12
20#define myBuffCnt       16
21
22// if on entry D0 = INIT, then call is to initialize, a1 must have a DDP handle.
23// with VM this code must be locked down as well as the buffer and the handle !!!
24
25asm void main();
26
27asm void main()
28{
29InitDDPListener:
30                bra.s saveDDP                                                                   // jump to save, expects address of ccb in a1
31DDPListener:
32                // d1.w holds length
33
34                move.w SR,-(sp)                                                                 // save status register
35                ori.w #0x2600,SR                                                                // disable interrupts
36                move.l a5,-(sp)                                                                 // save this a5
37                move.l a4,-(sp)                                                                 // save this a4
38               
39                lea data,a5                                                                             // put my data in a5
40
41                move.l tDDPBuffer(a5),a4                                                // set buffer struct address in a4
42               
43                // a4 = struct
44               
45                addi.l #1,myBuffCnt(a4)                                                 // increment count
46                move.l myHeadPtr(a4),a5                                                 // get head pointer
47
48                move.l a5,a3                                                                    // put buffer address in a3
49                                               
50                addi.l #592,a5                                                                  // next buffer
51               
52                cmp.l a5,myEnd(a4)                                                              // check against end
53                blo     no_reset
54                move.l myStart(a4),a5                                                   // restart
55no_reset:
56                move.l a5,myHeadPtr(a4)
57
58                move.w #0,(a3)+                                                                 // save length as long
59                move.w d1,(a3)+
60
61                moveq #0,d3                                                                             // clear d3
62                move.w d1,d3                                                                    // we want to read the whole packet
63
64                move.l (sp)+,a4                                                                 // recover a4
65                move.l (sp)+,a5                                                                 // recover a5
66                jsr 2(a4)                                                                               // go to ReadRest
67                beq.s getAddr                                                                   // if there was no error lets fill in DDP info
68                move.w (sp)+,SR                                                                 // recover status register
69                rts                                                                                             // return otherwise (error)
70
71saveDDP:
72                lea data,a0                                                                             // put this data in a0
73                move.l a1,tDDPRec(a0)                                                   // save my DDP pointer there
74                move.l ddpDataPtr(a1),tDDPBuffer(a0)                    // save address of buffer there too
75                rts                                                                                             // return to caller
76
77getAddr:
78                move.l a5,-(sp)                                                                 // save a5
79                lea data,a5                                                                             // put my data in a5
80                move.w tDDPLen(a5),d1                                                   // put packet length back in d1
81                move.l tDDPRec(a5),a5                                                   // put the DDP pointer in a5
82                clr.l d3                                                                                // clear d3
83                clr.w ddpResult(a5)                                                             // set result to zero (noErr)
84                move.w d1,ddpActCount(a5)                                               // set actual count read
85                move.b 1(a2),d3                                                                 // put destination node in d3
86                move.w d3,ddpNodeID(a5)                                                 // set destination node
87                cmpi.b #2,3(a2)                                                                 // is this long lap header ?
88                beq.s longhead
89                move.b 6(a2),d3                                                                 // put destination socket in d3
90                move.w d3,ddpSocket(a5)                                                 // set destination socket
91                move.b 8(a2),d3                                                                 // put ddpType in d3
92                move.w d3,ddpType(a5)                                                   // set ddpType
93                move.w 0x1A(a2),ddpAddress(a5)                                  // set source network address
94                move.b 2(a2),ddpAddress+2(a5)                                   // set source node address
95                move.b 7(a2),ddpAddress+3(a5)                                   // set source socket address
96                move.l (sp)+,a5                                                                 // recover a5
97                move.w (sp)+,SR                                                                 // recover status register
98                rts                                                                                             // return to protocol handler
99
100longhead:
101                move.w 10(a2),ddpAddress(a5)                                    // set source network address
102                move.b 13(a2),ddpAddress+2(a5)                                  // set source node address
103                move.b 15(a2),ddpAddress+3(a5)                                  // set source socket number
104                move.b 14(a2),d3                                                                // put destination socket in d3
105                move.w d3,ddpSocket(a5)                                                 // set destination socket
106                move.b 16(a2),d3                                                                // put ddpType in d3
107                move.w d3,ddpType(a5)                                                   // set ddpType
108                move.l (sp)+,a5                                                                 // recover a5
109                move.w (sp)+,SR                                                                 // recover status register
110                rts                                                                                             // return to protocol handler
111
112data:
113                dc.l    0       // DDP record pointer
114                dc.l    0       // DDPBuffer address
115}
Note: See TracBrowser for help on using the repository browser.