source: abuse/tags/pd/macabuse/src/net/mac/ddplisten_ppc.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: 2.6 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 myStart                 0
14#define myEnd                   4
15#define myHeadPtr               8
16#define myTailPtr               12
17#define myBuffCnt       16
18
19// if on entry D0 = INIT, then call is to initialize, a1 must have a DDP handle.
20// with VM this code must be locked down as well as the buffer and the handle !!!
21
22#define PPC_DDP
23
24#ifdef PPC_DDP
25asm void main();
26
27asm void main()
28{
29#else
30asm void DDPEntry(char *buffer)
31{
32                move.l 4(sp),a1
33#endif
34InitDDPListener:
35                bra.s saveDDP                                                                   // jump to save, expects address of buffer in a1
36DDPListener:
37                move.w SR,-(sp)                                                                 // save status register
38                ori.w #0x2600,SR                                                                // disable interrupts
39               
40                move.l a5,-(sp)                                                                 // save this a5
41               
42                move.l data,a5                                                                  // put buffer struct in a5
43
44                move.l myHeadPtr(a5),a3                                                 // get head pointer
45
46                moveq #0,d3                                                                             // clear d3
47                move.w d1,d3                                                                    // we want to read the whole packet
48
49                move.l d3,(a3)                                                                  // save length as long
50
51                lea 8(a3),a3                                                                    // skip to buffer store
52
53                move.l (sp)+,a5                                                                 // recover a5
54                jsr 2(a4)                                                                               // go to ReadRest
55                beq.s getAddr                                                                   // if there was no error lets fill in DDP info
56               
57                move.w (sp)+,SR                                                                 // recover status register
58                rts                                                                                             // return otherwise (error)
59
60saveDDP:
61                lea data,a0
62                move.l a1,(a0)                                                                  // put this data in a0
63                rts                                                                                             // return to caller
64
65getAddr:
66                move.l a5,-(sp)                                                                 // save a5
67                move.l a3,-(sp)                                                                 // save a3
68
69                move.l data,a5                                                                  // put buffer struct a5
70                addi.l #1,myBuffCnt(a5)                                                 // increment count
71
72                move.l myHeadPtr(a5),a3                                                 // put head address in a3
73               
74                cmpi.b #2,3(a2)                                                                 // is this long lap header ?
75                beq.s longhead
76
77shorthead:
78                move.w 0x1A(a2),4(a3)                                                   // set source network address
79                move.b 2(a2),   6(a3)                                                   // set source node address
80                move.b 7(a2),   7(a3)                                                   // set source socket address
81
82                bra.s cont1
83
84longhead:
85                move.w 10(a2),4(a3)                                                             // set source network address
86                move.b 13(a2),6(a3)                                                             // set source node address
87                move.b 15(a2),7(a3)                                                             // set source socket number
88
89cont1:
90                move.l myHeadPtr(a5),d3                                                 // put head address in d3
91                addi.l #602,d3                                                                  // next buffer
92               
93                cmp.l myEnd(a5),d3                                                              // check against end
94
95                blo.s no_reset
96                move.l myStart(a5),d3                                                   // restart
97no_reset:
98                move.l d3,myHeadPtr(a5)
99
100                move.l (sp)+,a3                                                                 // recover a3
101                move.l (sp)+,a5                                                                 // recover a5
102                move.w (sp)+,SR                                                                 // recover status register
103                rts                                                                                             // return to protocol handler
104
105data:
106                dc.l    0                                                                               // data buffer address
107}
Note: See TracBrowser for help on using the repository browser.