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