|
|
1.1 root 1: /* $Header: move.c,v 10.3 86/02/01 15:47:04 tony Rel $ */
2: /* move.c Routines to move data into and out of the workstation
3: *
4: * MoveObjectDownRom Use rom version to move an object down
5: * MoveObjectDown Move data into the workstation
6: * MoveBufferDown Move buffer into the workstation
7: * MoveBufferUp Move date out of the workstation
8: * SendToPeripheral Send data to peripheral
9: *
10: * MoveObjectDownRom should be used to download the firmware into the
11: * workstation; after that MoveObjectDown and MoveBufferDown should be used.
12: *
13: */
14:
15: /****************************************************************************
16: * *
17: * Copyright (c) 1983, 1984 by *
18: * DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts. *
19: * All rights reserved. *
20: * *
21: * This software is furnished on an as-is basis and may be used and copied *
22: * only with inclusion of the above copyright notice. This software or any *
23: * other copies thereof may be provided or otherwise made available to *
24: * others only for non-commercial purposes. No title to or ownership of *
25: * the software is hereby transferred. *
26: * *
27: * The information in this software is subject to change without notice *
28: * and should not be construed as a commitment by DIGITAL EQUIPMENT *
29: * CORPORATION. *
30: * *
31: * DIGITAL assumes no responsibility for the use or reliability of its *
32: * software on equipment which is not supplied by DIGITAL. *
33: * *
34: * *
35: ****************************************************************************/
36:
37: #include "vs100.h"
38:
39: extern int VSReloc;
40:
41: char *AllocateSpace();
42:
43: /* Move size bytes from src to dst. If rom = 1, use the rom-code version.
44: * This only works for objects which are <= MAXSIZE bytes;
45: */
46:
47: MoveObjectDownRom (src, dst, size)
48: caddr_t src, dst;
49: int size;
50: {
51: return (MoveObject(src + VSReloc, dst, size, 1));
52: }
53:
54: MoveObjectDown (src, dst, size)
55: caddr_t src, dst;
56: int size;
57: {
58: return (MoveObject(src + VSReloc, dst, size, 0));
59: }
60:
61: MoveBufferDown (src, dst, size)
62: caddr_t src, dst;
63: int size;
64: {
65: register int len;
66: caddr_t buf;
67:
68: while (len = size) {
69: if (len > VBUFSIZE) len = VBUFSIZE;
70: if ((buf = (caddr_t) AllocateSpace (len)) == NULL)
71: return (-1);
72: bcopy (src, buf, len);
73: if (MoveObject(buf + VSReloc, dst, len, 0))
74: return (-1);
75: src += len;
76: dst += len;
77: size -= len;
78: }
79: return (0);
80: }
81:
82: MoveBufferUp (src, dst, size)
83: caddr_t src, dst;
84: int size;
85: {
86: register int len;
87: caddr_t buf;
88:
89: while (len = size) {
90: if (len > VBUFSIZE) len = VBUFSIZE;
91: if ((buf = (caddr_t) AllocateSpace (len)) == NULL ||
92: MoveObject(src, buf + VSReloc, len, 0) ||
93: SynchWrites())
94: return (-1);
95: bcopy (buf, dst, len);
96: src += len;
97: dst += len;
98: size -= len;
99: }
100: return (0);
101: }
102:
103: MoveObject (src, dst, size, rom)
104: caddr_t src, dst;
105: int size, rom;
106: {
107: register MoveObjectPacket *mop;
108: #define h ((PacketHeader *) mop->mop_head)
109:
110: mop = (MoveObjectPacket *) AllocateSpace (sizeof (MoveObjectPacket));
111: if (mop == NULL) return (-1);
112:
113: /* Make sure size is a multiple of 2 */
114:
115: if (size & 0x1) size++;
116:
117: /* Format the packet */
118:
119: h->ph_modifier.emptymod = 0;
120: h->ph_opcode = (rom ? MOVE_OBJECT_ROM : MOVE_OBJECT);
121: *(long *) h->ph_next = NULL;
122:
123: mop->mop_objectType = 1;
124: *(caddr_t *) mop->mop_source = src;
125: *(caddr_t *) mop->mop_dest = dst;
126: *(long *) mop->mop_objectSize = size;
127:
128: return (WritePacket ((caddr_t) mop));
129: #undef h
130: }
131:
132: SendToPeripheral (src, size, device)
133: char *src;
134: int size, device;
135: {
136: register MoveObjectPacket *mop;
137: #define h ((PacketHeader *) mop->mop_head)
138:
139: mop = (MoveObjectPacket *) AllocateSpace (sizeof (MoveObjectPacket));
140: if (mop == NULL) return;
141:
142: /* Make sure size is a multiple of 2 */
143:
144: if (size & 0x1) size++;
145:
146: /* Format the packet */
147:
148: h->ph_modifier.emptymod = 0;
149: h->ph_opcode = MOVE_OBJECT;
150: *(long *) h->ph_next = NULL;
151:
152: mop->mop_objectType = 2;
153: *(caddr_t *) mop->mop_source = src + VSReloc;
154: *(int *) mop->mop_dest = device;
155: *(long *) mop->mop_objectSize = size;
156:
157: WritePacket ((caddr_t) mop);
158: #undef h
159: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.