Home | History | Annotate | Line # | Download | only in boot
init_main.c revision 1.5.6.4
      1  1.5.6.2  tls /*	$NetBSD: init_main.c,v 1.5.6.4 2014/08/20 00:03:10 tls Exp $	*/
      2  1.5.6.2  tls 
      3  1.5.6.2  tls /*
      4  1.5.6.2  tls  * Copyright (c) 1992 OMRON Corporation.
      5  1.5.6.2  tls  *
      6  1.5.6.2  tls  * This code is derived from software contributed to Berkeley by
      7  1.5.6.2  tls  * OMRON Corporation.
      8  1.5.6.2  tls  *
      9  1.5.6.2  tls  * Redistribution and use in source and binary forms, with or without
     10  1.5.6.2  tls  * modification, are permitted provided that the following conditions
     11  1.5.6.2  tls  * are met:
     12  1.5.6.2  tls  * 1. Redistributions of source code must retain the above copyright
     13  1.5.6.2  tls  *    notice, this list of conditions and the following disclaimer.
     14  1.5.6.2  tls  * 2. Redistributions in binary form must reproduce the above copyright
     15  1.5.6.2  tls  *    notice, this list of conditions and the following disclaimer in the
     16  1.5.6.2  tls  *    documentation and/or other materials provided with the distribution.
     17  1.5.6.2  tls  * 3. All advertising materials mentioning features or use of this software
     18  1.5.6.2  tls  *    must display the following acknowledgement:
     19  1.5.6.2  tls  *	This product includes software developed by the University of
     20  1.5.6.2  tls  *	California, Berkeley and its contributors.
     21  1.5.6.2  tls  * 4. Neither the name of the University nor the names of its contributors
     22  1.5.6.2  tls  *    may be used to endorse or promote products derived from this software
     23  1.5.6.2  tls  *    without specific prior written permission.
     24  1.5.6.2  tls  *
     25  1.5.6.2  tls  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     26  1.5.6.2  tls  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     27  1.5.6.2  tls  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     28  1.5.6.2  tls  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     29  1.5.6.2  tls  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     30  1.5.6.2  tls  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     31  1.5.6.2  tls  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32  1.5.6.2  tls  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     33  1.5.6.2  tls  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     34  1.5.6.2  tls  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     35  1.5.6.2  tls  * SUCH DAMAGE.
     36  1.5.6.2  tls  *
     37  1.5.6.2  tls  *	@(#)init_main.c	8.2 (Berkeley) 8/15/93
     38  1.5.6.2  tls  */
     39  1.5.6.2  tls /*
     40  1.5.6.2  tls  * Copyright (c) 1992, 1993
     41  1.5.6.2  tls  *	The Regents of the University of California.  All rights reserved.
     42  1.5.6.2  tls  *
     43  1.5.6.2  tls  * This code is derived from software contributed to Berkeley by
     44  1.5.6.2  tls  * OMRON Corporation.
     45  1.5.6.2  tls  *
     46  1.5.6.2  tls  * Redistribution and use in source and binary forms, with or without
     47  1.5.6.2  tls  * modification, are permitted provided that the following conditions
     48  1.5.6.2  tls  * are met:
     49  1.5.6.2  tls  * 1. Redistributions of source code must retain the above copyright
     50  1.5.6.2  tls  *    notice, this list of conditions and the following disclaimer.
     51  1.5.6.2  tls  * 2. Redistributions in binary form must reproduce the above copyright
     52  1.5.6.2  tls  *    notice, this list of conditions and the following disclaimer in the
     53  1.5.6.2  tls  *    documentation and/or other materials provided with the distribution.
     54  1.5.6.2  tls  * 3. Neither the name of the University nor the names of its contributors
     55  1.5.6.2  tls  *    may be used to endorse or promote products derived from this software
     56  1.5.6.2  tls  *    without specific prior written permission.
     57  1.5.6.2  tls  *
     58  1.5.6.2  tls  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     59  1.5.6.2  tls  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     60  1.5.6.2  tls  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     61  1.5.6.2  tls  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     62  1.5.6.2  tls  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     63  1.5.6.2  tls  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     64  1.5.6.2  tls  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     65  1.5.6.2  tls  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     66  1.5.6.2  tls  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     67  1.5.6.2  tls  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     68  1.5.6.2  tls  * SUCH DAMAGE.
     69  1.5.6.2  tls  *
     70  1.5.6.2  tls  *	@(#)init_main.c	8.2 (Berkeley) 8/15/93
     71  1.5.6.2  tls  */
     72  1.5.6.2  tls 
     73  1.5.6.2  tls #include <sys/param.h>
     74  1.5.6.3  tls #include <sys/boot_flag.h>
     75  1.5.6.2  tls #include <machine/cpu.h>
     76  1.5.6.2  tls #include <luna68k/stand/boot/samachdep.h>
     77  1.5.6.2  tls #include <luna68k/stand/boot/romvec.h>
     78  1.5.6.2  tls #include <luna68k/stand/boot/status.h>
     79  1.5.6.2  tls #include <lib/libsa/loadfile.h>
     80  1.5.6.2  tls #ifdef SUPPORT_ETHERNET
     81  1.5.6.2  tls #include <lib/libsa/dev_net.h>
     82  1.5.6.2  tls #endif
     83  1.5.6.2  tls 
     84  1.5.6.2  tls static int get_plane_numbers(void);
     85  1.5.6.2  tls static int reorder_dipsw(int);
     86  1.5.6.2  tls 
     87  1.5.6.2  tls int cpuspeed;	/* for DELAY() macro */
     88  1.5.6.2  tls int hz = 60;
     89  1.5.6.2  tls int machtype;
     90  1.5.6.3  tls char default_file[64];
     91  1.5.6.4  tls const char *default_bootdev;
     92  1.5.6.4  tls int default_unit;
     93  1.5.6.2  tls 
     94  1.5.6.2  tls #define	VERS_LOCAL	"Phase-31"
     95  1.5.6.2  tls 
     96  1.5.6.2  tls int nplane;
     97  1.5.6.2  tls 
     98  1.5.6.2  tls /* for command parser */
     99  1.5.6.2  tls 
    100  1.5.6.2  tls #define BUFFSIZE 100
    101  1.5.6.2  tls #define MAXARGS  30
    102  1.5.6.2  tls 
    103  1.5.6.2  tls char buffer[BUFFSIZE];
    104  1.5.6.2  tls 
    105  1.5.6.2  tls int   argc;
    106  1.5.6.2  tls char *argv[MAXARGS];
    107  1.5.6.2  tls 
    108  1.5.6.2  tls #define BOOT_TIMEOUT 10
    109  1.5.6.2  tls int boot_timeout = BOOT_TIMEOUT;
    110  1.5.6.2  tls 
    111  1.5.6.4  tls static const char prompt[] = "boot> ";
    112  1.5.6.4  tls 
    113  1.5.6.4  tls /*
    114  1.5.6.4  tls  * PROM monitor's boot device info
    115  1.5.6.4  tls  */
    116  1.5.6.4  tls 
    117  1.5.6.4  tls /* LUNA-I monitor's bootinfo structure */
    118  1.5.6.4  tls /* This bootinfo data address is investigated on ROM Ver4.22 and Ver4.25 */
    119  1.5.6.4  tls #define	LUNA1_BOOTINFOADDR	0x000008c0
    120  1.5.6.4  tls struct luna1_bootinfo {
    121  1.5.6.4  tls 	uint8_t	bi_xxx1[3];	/* 0x08c0: ??? */
    122  1.5.6.4  tls 	uint8_t	bi_device;	/* 0x08c3: boot device */
    123  1.5.6.4  tls #define	LUNA1_BTDEV_DK	0		/* Hard-Disk */
    124  1.5.6.4  tls #define	LUNA1_BTDEV_FB	1		/* Floppy-Disk */
    125  1.5.6.4  tls #define	LUNA1_BTDEV_SD	2		/* Streamer-Tape */
    126  1.5.6.4  tls #define	LUNA1_BTDEV_P0	3		/* RS232c */
    127  1.5.6.4  tls #define	LUNA1_BTDEV_ET	4		/* Ether-net */
    128  1.5.6.4  tls #define	LUNA1_NBTDEV	5
    129  1.5.6.4  tls 
    130  1.5.6.4  tls 	struct {
    131  1.5.6.4  tls 		uint8_t	bd_xxx1;	/*  0: ??? */
    132  1.5.6.4  tls 		uint8_t	bd_boot;	/*  1: 1 == booted */
    133  1.5.6.4  tls 		char	bd_name[2];	/*  2: device name (dk, fb, sd ... ) */
    134  1.5.6.4  tls 		uint8_t	bd_drv;		/*  4: drive number (not ID) */
    135  1.5.6.4  tls 		uint8_t	bd_xxx2;	/*  5: ??? */
    136  1.5.6.4  tls 		uint8_t	bd_xxx3;	/*  6: ??? */
    137  1.5.6.4  tls 		uint8_t	bd_part;	/*  7: dk partition / st record # */
    138  1.5.6.4  tls 		uint8_t	bd_xxx4[4];	/*  8: ??? */
    139  1.5.6.4  tls 		uint8_t	bd_xxx5[4];	/* 12: ??? */
    140  1.5.6.4  tls 	} bi_devinfo[LUNA1_NBTDEV];
    141  1.5.6.4  tls } __packed;
    142  1.5.6.4  tls 
    143  1.5.6.4  tls /* LUNA-II monitor's bootinfo structure */
    144  1.5.6.4  tls /* This bootinfo data address is investigated on ROM Version 1.11 */
    145  1.5.6.4  tls #define	LUNA2_BOOTINFOADDR	0x00001d80
    146  1.5.6.4  tls struct luna2_bootinfo {
    147  1.5.6.4  tls 	uint8_t	bi_xxx1[13];	/* 0x1d80: ??? */
    148  1.5.6.4  tls 	uint8_t	bi_device;	/* 0x1d8d: boot device */
    149  1.5.6.4  tls #define	LUNA2_BTDEV_DK	0		/* Hard-Disk */
    150  1.5.6.4  tls #define	LUNA2_BTDEV_FT	1		/* Floppy-Disk */
    151  1.5.6.4  tls #define	LUNA2_BTDEV_SD	2		/* Streamer-Tape */
    152  1.5.6.4  tls #define	LUNA2_BTDEV_P0	3		/* RS232c */
    153  1.5.6.4  tls #define	LUNA2_NBTDEV	4
    154  1.5.6.4  tls 
    155  1.5.6.4  tls 	struct {
    156  1.5.6.4  tls 		uint8_t	bd_xxx1;	/*  0: ??? */
    157  1.5.6.4  tls 		uint8_t	bd_boot;	/*  1: 1 == booted */
    158  1.5.6.4  tls 		char	bd_name[4];	/*  2: device name (dk, ft, sd ... ) */
    159  1.5.6.4  tls 		uint8_t	bd_xxx2;	/*  6: ??? */
    160  1.5.6.4  tls 		uint8_t	bd_ctlr;	/*  7: SCSI controller number */
    161  1.5.6.4  tls 		uint8_t	bd_id;		/*  8: SCSI ID number */
    162  1.5.6.4  tls 		uint8_t	bd_xxx3;	/*  9: device number index? */
    163  1.5.6.4  tls 		uint8_t	bd_xxx4;	/* 10: ??? */
    164  1.5.6.4  tls 		uint8_t	bd_part;	/* 11: dk partition / st record # */
    165  1.5.6.4  tls 		uint8_t	bd_xxx5[4];	/* 12: ??? */
    166  1.5.6.4  tls 		uint8_t	bd_xxx6[4];	/* 16: ??? */
    167  1.5.6.4  tls 	} bi_devinfo[LUNA2_NBTDEV];
    168  1.5.6.4  tls } __packed;
    169  1.5.6.4  tls 
    170  1.5.6.4  tls /* #define BTINFO_DEBUG */
    171  1.5.6.2  tls 
    172  1.5.6.2  tls void
    173  1.5.6.2  tls main(void)
    174  1.5.6.2  tls {
    175  1.5.6.4  tls 	int i, status = ST_NORMAL;
    176  1.5.6.2  tls 	const char *machstr;
    177  1.5.6.4  tls 	const char *bootdev;
    178  1.5.6.4  tls 	uint32_t howto;
    179  1.5.6.3  tls 	int unit, part;
    180  1.5.6.4  tls 	int bdev, ctlr, id;
    181  1.5.6.2  tls 
    182  1.5.6.2  tls 	/*
    183  1.5.6.2  tls 	 * Initialize the console before we print anything out.
    184  1.5.6.2  tls 	 */
    185  1.5.6.2  tls 	if (cputype == CPU_68030) {
    186  1.5.6.2  tls 		machtype = LUNA_I;
    187  1.5.6.2  tls 		machstr  = "LUNA-I";
    188  1.5.6.2  tls 		cpuspeed = MHZ_25;
    189  1.5.6.2  tls 		hz = 60;
    190  1.5.6.2  tls 	} else {
    191  1.5.6.2  tls 		machtype = LUNA_II;
    192  1.5.6.2  tls 		machstr  = "LUNA-II";
    193  1.5.6.2  tls 		cpuspeed = MHZ_25 * 2;	/* XXX */
    194  1.5.6.2  tls 		hz = 100;
    195  1.5.6.2  tls 	}
    196  1.5.6.2  tls 
    197  1.5.6.4  tls 	nplane = get_plane_numbers();
    198  1.5.6.2  tls 
    199  1.5.6.2  tls 	cninit();
    200  1.5.6.2  tls 
    201  1.5.6.2  tls 	printf("\n");
    202  1.5.6.2  tls 	printf(">> %s, Revision %s\n", bootprog_name, bootprog_rev);
    203  1.5.6.2  tls 	printf(">> (based on Stinger ver 0.0 [%s])\n", VERS_LOCAL);
    204  1.5.6.2  tls 	printf("\n");
    205  1.5.6.2  tls 
    206  1.5.6.4  tls 	i = ROM_memsize;
    207  1.5.6.2  tls 	printf("Machine model   = %s\n", machstr);
    208  1.5.6.2  tls 	printf("Physical Memory = 0x%x  ", i);
    209  1.5.6.2  tls 	i >>= 20;
    210  1.5.6.2  tls 	printf("(%d MB)\n", i);
    211  1.5.6.2  tls 	printf("\n");
    212  1.5.6.2  tls 
    213  1.5.6.2  tls 	/*
    214  1.5.6.2  tls 	 * IO configuration
    215  1.5.6.2  tls 	 */
    216  1.5.6.2  tls 
    217  1.5.6.2  tls #ifdef SUPPORT_ETHERNET
    218  1.5.6.2  tls 	try_bootp = 1;
    219  1.5.6.2  tls #endif
    220  1.5.6.2  tls 
    221  1.5.6.2  tls 	find_devs();
    222  1.5.6.2  tls 	printf("\n");
    223  1.5.6.2  tls 
    224  1.5.6.4  tls 	/* use sd(0,0) for the default boot device */
    225  1.5.6.4  tls 	bootdev = "sd";
    226  1.5.6.4  tls 	unit = 0;
    227  1.5.6.3  tls 	part = 0;
    228  1.5.6.4  tls 
    229  1.5.6.4  tls 	if (machtype == LUNA_I) {
    230  1.5.6.4  tls 		const struct luna1_bootinfo *bi1 = (void *)LUNA1_BOOTINFOADDR;
    231  1.5.6.4  tls 
    232  1.5.6.4  tls 		bdev = bi1->bi_device;
    233  1.5.6.4  tls 		switch (bdev) {
    234  1.5.6.4  tls 		case LUNA1_BTDEV_DK:
    235  1.5.6.4  tls 			/* note: bd_drv is not SCSI ID */
    236  1.5.6.4  tls 			ctlr = 0;
    237  1.5.6.4  tls 			id   = 6 - bi1->bi_devinfo[bdev].bd_drv;
    238  1.5.6.4  tls 			unit = UNIT(ctlr, id);
    239  1.5.6.4  tls 			break;
    240  1.5.6.4  tls 		case LUNA1_BTDEV_ET:
    241  1.5.6.4  tls 			bootdev = "le";
    242  1.5.6.4  tls 			unit = 0;
    243  1.5.6.4  tls 			break;
    244  1.5.6.4  tls 		default:
    245  1.5.6.4  tls 			/* not supported */
    246  1.5.6.4  tls 			break;
    247  1.5.6.4  tls 		}
    248  1.5.6.4  tls #ifdef BTINFO_DEBUG
    249  1.5.6.4  tls 		printf("bi1->bi_device = 0x%02x\n", bi1->bi_device);
    250  1.5.6.4  tls 		printf("bi1->bi_devinfo[bdev].bd_boot = 0x%02x\n",
    251  1.5.6.4  tls 		    bi1->bi_devinfo[bdev].bd_boot);
    252  1.5.6.4  tls 		printf("bi1->bi_devinfo[bdev].bd_name = %c%c\n",
    253  1.5.6.4  tls 		    bi1->bi_devinfo[bdev].bd_name[0],
    254  1.5.6.4  tls 		    bi1->bi_devinfo[bdev].bd_name[1]);
    255  1.5.6.4  tls 		printf("bi1->bi_devinfo[bdev].bd_drv = 0x%02x\n",
    256  1.5.6.4  tls 		    bi1->bi_devinfo[bdev].bd_drv);
    257  1.5.6.4  tls 		printf("bi1->bi_devinfo[bdev].bd_part = 0x%02x\n",
    258  1.5.6.4  tls 		    bi1->bi_devinfo[bdev].bd_part);
    259  1.5.6.4  tls #endif
    260  1.5.6.4  tls 	} else {
    261  1.5.6.4  tls 		const struct luna2_bootinfo *bi2 = (void *)LUNA2_BOOTINFOADDR;
    262  1.5.6.4  tls 
    263  1.5.6.4  tls 		bdev = bi2->bi_device;
    264  1.5.6.4  tls 		switch (bdev) {
    265  1.5.6.4  tls 		case LUNA2_BTDEV_DK:
    266  1.5.6.4  tls 			ctlr = bi2->bi_devinfo[bdev].bd_ctlr;
    267  1.5.6.4  tls 			id   = bi2->bi_devinfo[bdev].bd_id;
    268  1.5.6.4  tls 			unit = UNIT(ctlr, id);
    269  1.5.6.4  tls 			break;
    270  1.5.6.4  tls 		default:
    271  1.5.6.4  tls 			/* not supported */
    272  1.5.6.4  tls 			break;
    273  1.5.6.4  tls 		}
    274  1.5.6.4  tls #ifdef BTINFO_DEBUG
    275  1.5.6.4  tls 		printf("bi2->bi_device = 0x%02x\n", bi2->bi_device);
    276  1.5.6.4  tls 		printf("bi2->bi_devinfo[bdev].bd_boot = 0x%02x\n",
    277  1.5.6.4  tls 		    bi2->bi_devinfo[bdev].bd_boot);
    278  1.5.6.4  tls 		printf("bi2->bi_devinfo[bdev].bd_name = %s\n",
    279  1.5.6.4  tls 		    bi2->bi_devinfo[bdev].bd_name);
    280  1.5.6.4  tls 		printf("bi2->bi_devinfo[bdev].bd_ctlr = 0x%02x\n",
    281  1.5.6.4  tls 		    bi2->bi_devinfo[bdev].bd_ctlr);
    282  1.5.6.4  tls 		printf("bi2->bi_devinfo[bdev].bd_id = 0x%02x\n",
    283  1.5.6.4  tls 		    bi2->bi_devinfo[bdev].bd_id);
    284  1.5.6.4  tls 		printf("bi2->bi_devinfo[bdev].bd_part = 0x%02x\n",
    285  1.5.6.4  tls 		    bi2->bi_devinfo[bdev].bd_part);
    286  1.5.6.4  tls #endif
    287  1.5.6.4  tls 	}
    288  1.5.6.4  tls 
    289  1.5.6.3  tls 	snprintf(default_file, sizeof(default_file),
    290  1.5.6.4  tls 	    "%s(%d,%d)%s", bootdev, unit, part, "netbsd");
    291  1.5.6.4  tls 	default_bootdev = bootdev;
    292  1.5.6.4  tls 	default_unit = unit;
    293  1.5.6.3  tls 
    294  1.5.6.2  tls 	howto = reorder_dipsw(dipsw2);
    295  1.5.6.2  tls 
    296  1.5.6.2  tls 	if ((howto & 0xFE) == 0) {
    297  1.5.6.2  tls 		char c;
    298  1.5.6.2  tls 
    299  1.5.6.2  tls 		printf("Press return to boot now,"
    300  1.5.6.2  tls 		    " any other key for boot menu\n");
    301  1.5.6.2  tls 		printf("booting %s - starting in ", default_file);
    302  1.5.6.2  tls 		c = awaitkey("%d seconds. ", boot_timeout, true);
    303  1.5.6.2  tls 		if (c == '\r' || c == '\n' || c == 0) {
    304  1.5.6.2  tls 			printf("auto-boot %s\n", default_file);
    305  1.5.6.4  tls 			bootnetbsd(default_file, 0);
    306  1.5.6.2  tls 		}
    307  1.5.6.2  tls 	}
    308  1.5.6.2  tls 
    309  1.5.6.2  tls 	/*
    310  1.5.6.2  tls 	 * Main Loop
    311  1.5.6.2  tls 	 */
    312  1.5.6.2  tls 
    313  1.5.6.2  tls 	printf("type \"help\" for help.\n");
    314  1.5.6.2  tls 
    315  1.5.6.2  tls 	do {
    316  1.5.6.2  tls 		memset(buffer, 0, BUFFSIZE);
    317  1.5.6.2  tls 		if (getline(prompt, buffer) > 0) {
    318  1.5.6.4  tls 			argc = getargs(buffer, argv,
    319  1.5.6.4  tls 			    sizeof(argv) / sizeof(char *));
    320  1.5.6.2  tls 
    321  1.5.6.2  tls 			status = parse(argc, argv);
    322  1.5.6.2  tls 			if (status == ST_NOTFOUND)
    323  1.5.6.4  tls 				printf("Command \"%s\" is not found !!\n",
    324  1.5.6.4  tls 				    argv[0]);
    325  1.5.6.2  tls 		}
    326  1.5.6.4  tls 	} while (status != ST_EXIT);
    327  1.5.6.2  tls 
    328  1.5.6.2  tls 	exit(0);
    329  1.5.6.2  tls }
    330  1.5.6.2  tls 
    331  1.5.6.2  tls int
    332  1.5.6.2  tls get_plane_numbers(void)
    333  1.5.6.2  tls {
    334  1.5.6.2  tls 	int r = ROM_plane;
    335  1.5.6.2  tls 	int n = 0;
    336  1.5.6.2  tls 
    337  1.5.6.2  tls 	for (; r ; r >>= 1)
    338  1.5.6.2  tls 		if (r & 0x1)
    339  1.5.6.2  tls 			n++;
    340  1.5.6.2  tls 
    341  1.5.6.4  tls 	return n;
    342  1.5.6.2  tls }
    343  1.5.6.2  tls 
    344  1.5.6.2  tls int
    345  1.5.6.2  tls reorder_dipsw(int dipsw)
    346  1.5.6.2  tls {
    347  1.5.6.2  tls 	int i, sw = 0;
    348  1.5.6.2  tls 
    349  1.5.6.2  tls 	for (i = 0; i < 8; i++) {
    350  1.5.6.2  tls 		if ((dipsw & 0x01) == 0)
    351  1.5.6.2  tls 			sw += 1;
    352  1.5.6.2  tls 
    353  1.5.6.2  tls 		if (i == 7)
    354  1.5.6.2  tls 			break;
    355  1.5.6.2  tls 
    356  1.5.6.2  tls 		sw <<= 1;
    357  1.5.6.2  tls 		dipsw >>= 1;
    358  1.5.6.2  tls 	}
    359  1.5.6.2  tls 
    360  1.5.6.4  tls 	return sw;
    361  1.5.6.2  tls }
    362