xref: /openbsd-src/usr.sbin/mopd/common/dl.c (revision 916fc46c69f8c89b8887b1395a44cf34ad8adb8c)
1*916fc46cSflorian /*	$OpenBSD: dl.c,v 1.11 2017/07/29 07:18:03 florian Exp $ */
2e08c8b61Smaja 
3bff609efSmaja /*
4bff609efSmaja  * Copyright (c) 1993-95 Mats O Jansson.  All rights reserved.
5bff609efSmaja  *
6bff609efSmaja  * Redistribution and use in source and binary forms, with or without
7bff609efSmaja  * modification, are permitted provided that the following conditions
8bff609efSmaja  * are met:
9bff609efSmaja  * 1. Redistributions of source code must retain the above copyright
10bff609efSmaja  *    notice, this list of conditions and the following disclaimer.
11bff609efSmaja  * 2. Redistributions in binary form must reproduce the above copyright
12bff609efSmaja  *    notice, this list of conditions and the following disclaimer in the
13bff609efSmaja  *    documentation and/or other materials provided with the distribution.
14bff609efSmaja  *
15bff609efSmaja  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16bff609efSmaja  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17bff609efSmaja  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18bff609efSmaja  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19bff609efSmaja  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20bff609efSmaja  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21bff609efSmaja  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22bff609efSmaja  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23bff609efSmaja  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24bff609efSmaja  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25bff609efSmaja  */
26bff609efSmaja 
27bff609efSmaja #include "os.h"
28bff609efSmaja #include "common/get.h"
29bff609efSmaja #include "common/print.h"
30bff609efSmaja #include "common/mopdef.h"
31bff609efSmaja 
32bff609efSmaja void
mopDumpDL(FILE * fd,u_char * pkt,int trans)3327ce7e35Shenning mopDumpDL(FILE *fd, u_char *pkt, int trans)
34bff609efSmaja {
353cd9cd14Smaja 	int	i, idx = 0;
36bff609efSmaja 	long	tmpl;
37bff609efSmaja 	u_char	tmpc, c, program[17], code, *ucp;
38bff609efSmaja 	u_short	len, tmps, moplen;
39bff609efSmaja 
40bff609efSmaja 	len = mopGetLength(pkt, trans);
41bff609efSmaja 
42bff609efSmaja 	switch (trans) {
43bff609efSmaja 	case TRANS_8023:
443cd9cd14Smaja 		idx = 22;
45bff609efSmaja 		moplen = len - 8;
46bff609efSmaja 		break;
47bff609efSmaja 	default:
483cd9cd14Smaja 		idx = 16;
49bff609efSmaja 		moplen = len;
50bff609efSmaja 	}
513cd9cd14Smaja 	code = mopGetChar(pkt, &idx);
52bff609efSmaja 
53bff609efSmaja 	switch (code) {
54bff609efSmaja 	case MOP_K_CODE_MLT:
553cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Load Number */
5627ce7e35Shenning 		fprintf(fd, "Load Number  :   %02x\n", tmpc);
57bff609efSmaja 
58bff609efSmaja 		if (moplen > 6) {
593cd9cd14Smaja 			tmpl = mopGetLong(pkt, &idx);/* Load Address */
6027ce7e35Shenning 			fprintf(fd, "Load Address : %08lx\n", tmpl);
61bff609efSmaja 		}
62bff609efSmaja 
63bff609efSmaja 		if (moplen > 10) {
64bff609efSmaja 			for (i = 0; i < (moplen - 10); i++) {
65bff609efSmaja 				if ((i % 16) == 0) {
6627ce7e35Shenning 					if ((i / 16) == 0)
6727ce7e35Shenning 						fprintf(fd,
68bff609efSmaja 						    "Image Data   : %04x ",
69bff609efSmaja 						    moplen-10);
7027ce7e35Shenning 					else
7127ce7e35Shenning 						fprintf(fd,
72bff609efSmaja 						    "                    ");
73bff609efSmaja 				}
74bff609efSmaja 
753cd9cd14Smaja 				fprintf(fd, "%02x ", mopGetChar(pkt, &idx));
76bff609efSmaja 				if ((i % 16) == 15)
7727ce7e35Shenning 					fprintf(fd, "\n");
78bff609efSmaja 			}
79bff609efSmaja 
80bff609efSmaja 			if ((i % 16) != 15)
8127ce7e35Shenning 				fprintf(fd, "\n");
82bff609efSmaja 		}
83bff609efSmaja 
843cd9cd14Smaja 		tmpl = mopGetLong(pkt, &idx);	/* Load Address */
8527ce7e35Shenning 		fprintf(fd, "Xfer Address : %08lx\n", tmpl);
86bff609efSmaja 		break;
87bff609efSmaja 	case MOP_K_CODE_DCM:
88bff609efSmaja 		/* Empty Message */
89bff609efSmaja 		break;
90bff609efSmaja 	case MOP_K_CODE_MLD:
913cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Load Number */
9227ce7e35Shenning 		fprintf(fd, "Load Number  :   %02x\n", tmpc);
93bff609efSmaja 
943cd9cd14Smaja 		tmpl = mopGetLong(pkt, &idx);	/* Load Address */
9527ce7e35Shenning 		fprintf(fd, "Load Address : %08lx\n", tmpl);
96bff609efSmaja 
97bff609efSmaja 		if (moplen > 6) {
98bff609efSmaja 			for (i = 0; i < (moplen - 6); i++) {
9920ac30d6Skrw 				if ((i % 16) == 0) {
10027ce7e35Shenning 					if ((i / 16) == 0)
10127ce7e35Shenning 						fprintf(fd,
102bff609efSmaja 						    "Image Data   : %04x ",
103bff609efSmaja 						    moplen-6);
10427ce7e35Shenning 					else
10527ce7e35Shenning 						fprintf(fd,
106bff609efSmaja 						    "                    ");
10720ac30d6Skrw 				}
10827ce7e35Shenning 
1093cd9cd14Smaja 				fprintf(fd, "%02x ", mopGetChar(pkt, &idx));
110bff609efSmaja 				if ((i % 16) == 15)
11127ce7e35Shenning 					fprintf(fd, "\n");
112bff609efSmaja 			}
113bff609efSmaja 
114bff609efSmaja 			if ((i % 16) != 15)
11527ce7e35Shenning 				fprintf(fd, "\n");
116bff609efSmaja 		}
117bff609efSmaja 		break;
118bff609efSmaja 	case MOP_K_CODE_ASV:
119bff609efSmaja 		/* Empty Message */
120bff609efSmaja 		break;
121bff609efSmaja 	case MOP_K_CODE_RMD:
1223cd9cd14Smaja 		tmpl = mopGetLong(pkt, &idx);	/* Memory Address */
12327ce7e35Shenning 		fprintf(fd, "Mem Address  : %08lx\n", tmpl);
1243cd9cd14Smaja 		tmps = mopGetShort(pkt, &idx);	/* Count */
12527ce7e35Shenning 		fprintf(fd, "Count        : %04x (%d)\n", tmps, tmps);
126bff609efSmaja 		break;
127bff609efSmaja 	case MOP_K_CODE_RPR:
1283cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Device Type */
12927ce7e35Shenning 		fprintf(fd, "Device Type  :   %02x ", tmpc);
13027ce7e35Shenning 		mopPrintDevice(fd, tmpc);
13127ce7e35Shenning 		fprintf(fd, "\n");
132bff609efSmaja 
1333cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Format Version */
13427ce7e35Shenning 		fprintf(fd, "Format       :   %02x\n", tmpc);
135bff609efSmaja 
1363cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Program Type */
13727ce7e35Shenning 		fprintf(fd, "Program Type :   %02x ", tmpc);
13827ce7e35Shenning 		mopPrintPGTY(fd, tmpc);
13927ce7e35Shenning 		fprintf(fd, "\n");
140bff609efSmaja 
141bff609efSmaja 		program[0] = 0;
1423cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Software ID Len */
143bff609efSmaja 		for (i = 0; i < tmpc; i++) {
1443cd9cd14Smaja 			program[i] = mopGetChar(pkt, &idx);
145bff609efSmaja 			program[i + 1] = '\0';
146bff609efSmaja 		}
147bff609efSmaja 
14827ce7e35Shenning 		fprintf(fd, "Software     :   %02x '%s'\n", tmpc, program);
149bff609efSmaja 
1503cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Processor */
15127ce7e35Shenning 		fprintf(fd, "Processor    :   %02x ", tmpc);
15227ce7e35Shenning 		mopPrintBPTY(fd, tmpc);
15327ce7e35Shenning 		fprintf(fd, "\n");
154bff609efSmaja 
1553cd9cd14Smaja 		mopPrintInfo(fd, pkt, &idx, moplen, code, trans);
156bff609efSmaja 
157bff609efSmaja 		break;
158bff609efSmaja 	case MOP_K_CODE_RML:
159bff609efSmaja 
1603cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Load Number */
16127ce7e35Shenning 		fprintf(fd, "Load Number  :   %02x\n", tmpc);
162bff609efSmaja 
1633cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Error */
1643cd9cd14Smaja 		fprintf(fd, "Error        :   %02x (", tmpc);
165*916fc46cSflorian 		if (tmpc == 0)
16627ce7e35Shenning 			fprintf(fd, "no error)\n");
16727ce7e35Shenning 		else
16827ce7e35Shenning 			fprintf(fd, "error)\n");
169bff609efSmaja 
170bff609efSmaja 		break;
171bff609efSmaja 	case MOP_K_CODE_RDS:
172bff609efSmaja 
1733cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Device Type */
17427ce7e35Shenning 		fprintf(fd, "Device Type  :   %02x ", tmpc);
17527ce7e35Shenning 		mopPrintDevice(fd, tmpc);
17627ce7e35Shenning 		fprintf(fd, "\n");
177bff609efSmaja 
1783cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Format Version */
17927ce7e35Shenning 		fprintf(fd, "Format       :   %02x\n", tmpc);
180bff609efSmaja 
1813cd9cd14Smaja 		tmpl = mopGetLong(pkt, &idx);	/* Memory Size */
18227ce7e35Shenning 		fprintf(fd, "Memory Size  : %08lx\n", tmpl);
183bff609efSmaja 
1843cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Bits */
18527ce7e35Shenning 		fprintf(fd, "Bits         :   %02x\n", tmpc);
186bff609efSmaja 
1873cd9cd14Smaja 		mopPrintInfo(fd, pkt, &idx, moplen, code, trans);
188bff609efSmaja 
189bff609efSmaja 		break;
190bff609efSmaja 	case MOP_K_CODE_MDD:
191bff609efSmaja 
1923cd9cd14Smaja 		tmpl = mopGetLong(pkt, &idx);	/* Memory Address */
19327ce7e35Shenning 		fprintf(fd, "Mem Address  : %08lx\n", tmpl);
194bff609efSmaja 
195bff609efSmaja 		if (moplen > 5) {
196bff609efSmaja 			for (i = 0; i < (moplen - 5); i++) {
197bff609efSmaja 				if ((i % 16) == 0) {
19827ce7e35Shenning 					if ((i / 16) == 0)
19927ce7e35Shenning 						fprintf(fd,
200bff609efSmaja 						    "Image Data   : %04x ",
201bff609efSmaja 						    moplen-5);
20227ce7e35Shenning 					else
20327ce7e35Shenning 						fprintf(fd,
204bff609efSmaja 						    "                    ");
205bff609efSmaja 				}
2063cd9cd14Smaja 				fprintf(fd, "%02x ",  mopGetChar(pkt, &idx));
207bff609efSmaja 				if ((i % 16) == 15)
20827ce7e35Shenning 					fprintf(fd, "\n");
209bff609efSmaja 			}
210bff609efSmaja 			if ((i % 16) != 15)
21127ce7e35Shenning 				fprintf(fd, "\n");
212bff609efSmaja 		}
213bff609efSmaja 
214bff609efSmaja 		break;
215bff609efSmaja 	case MOP_K_CODE_PLT:
216bff609efSmaja 
2173cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Load Number */
21827ce7e35Shenning 		fprintf(fd, "Load Number  :   %02x\n", tmpc);
219bff609efSmaja 
2203cd9cd14Smaja 		tmpc = mopGetChar(pkt, &idx);	/* Parameter Type */
221bff609efSmaja 		while (tmpc != MOP_K_PLTP_END) {
2223cd9cd14Smaja 			c = mopGetChar(pkt, &idx);	/* Parameter Length */
223bff609efSmaja 			switch (tmpc) {
224bff609efSmaja 			case MOP_K_PLTP_TSN:		/* Target Name */
22580e63575Smaja 				fprintf(fd, "Target Name  :   %02x '", c);
22627ce7e35Shenning 				for (i = 0; i < c; i++)
22727ce7e35Shenning 					fprintf(fd, "%c",
2283cd9cd14Smaja 					    mopGetChar(pkt, &idx));
22927ce7e35Shenning 				fprintf(fd, "'\n");
230bff609efSmaja 				break;
231bff609efSmaja 			case MOP_K_PLTP_TSA:		/* Target Address */
23227ce7e35Shenning 				fprintf(fd, "Target Addr  :   %02x ", c);
23327ce7e35Shenning 				for (i = 0; i < c; i++)
23427ce7e35Shenning 					fprintf(fd, "%02x ",
2353cd9cd14Smaja 					    mopGetChar(pkt, &idx));
23627ce7e35Shenning 				fprintf(fd, "\n");
237bff609efSmaja 				break;
238bff609efSmaja 			case MOP_K_PLTP_HSN:		/* Host Name */
23980e63575Smaja 				fprintf(fd, "Host Name    :   %02x '", c);
24027ce7e35Shenning 				for (i = 0; i < c; i++)
24127ce7e35Shenning 					fprintf(fd, "%c",
2423cd9cd14Smaja 					    mopGetChar(pkt, &idx));
24327ce7e35Shenning 				fprintf(fd, "'\n");
244bff609efSmaja 				break;
245bff609efSmaja 			case MOP_K_PLTP_HSA:		/* Host Address */
24627ce7e35Shenning 				fprintf(fd, "Host Addr    :   %02x ", c);
24727ce7e35Shenning 				for (i = 0; i < c; i++)
24827ce7e35Shenning 					fprintf(fd, "%02x ",
2493cd9cd14Smaja 					    mopGetChar(pkt, &idx));
25027ce7e35Shenning 				fprintf(fd, "\n");
251bff609efSmaja 				break;
252bff609efSmaja 			case MOP_K_PLTP_HST:		/* Host Time */
2533cd9cd14Smaja 				ucp = pkt + idx; idx = idx + 10;
25427ce7e35Shenning 				fprintf(fd, "Host Time    : ");
255bff609efSmaja 				mopPrintTime(fd, ucp);
25627ce7e35Shenning 				fprintf(fd, "\n");
257bff609efSmaja 				break;
258bff609efSmaja 			default:
259bff609efSmaja 				break;
260bff609efSmaja 			}
2613cd9cd14Smaja 			tmpc = mopGetChar(pkt, &idx);	/* Parameter Type */
262bff609efSmaja 		}
263bff609efSmaja 
2643cd9cd14Smaja 		tmpl = mopGetLong(pkt, &idx);	/* Transfer Address */
2653cd9cd14Smaja 		fprintf(fd, "Transfer Addr: %08lx\n", tmpl);
266bff609efSmaja 
267bff609efSmaja 		break;
268bff609efSmaja 	default:
269bff609efSmaja 		break;
270bff609efSmaja 	}
271bff609efSmaja }
272