Home | History | Annotate | Line # | Download | only in boot
init_main.c revision 1.16.54.1
      1  1.16.54.1  perseant /*	$NetBSD: init_main.c,v 1.16.54.1 2025/08/02 05:55:47 perseant 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.15   tsutsui const char *default_bootdev;
     92       1.14   tsutsui 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.7   tsutsui static const char prompt[] = "boot> ";
    112        1.1   tsutsui 
    113        1.8   tsutsui /*
    114        1.8   tsutsui  * PROM monitor's boot device info
    115        1.8   tsutsui  */
    116        1.8   tsutsui 
    117        1.8   tsutsui /* LUNA-I monitor's bootinfo structure */
    118        1.8   tsutsui /* This bootinfo data address is investigated on ROM Ver4.22 and Ver4.25 */
    119        1.8   tsutsui #define	LUNA1_BOOTINFOADDR	0x000008c0
    120        1.8   tsutsui struct luna1_bootinfo {
    121        1.8   tsutsui 	uint8_t	bi_xxx1[3];	/* 0x08c0: ??? */
    122        1.8   tsutsui 	uint8_t	bi_device;	/* 0x08c3: boot device */
    123        1.8   tsutsui #define	LUNA1_BTDEV_DK	0		/* Hard-Disk */
    124        1.8   tsutsui #define	LUNA1_BTDEV_FB	1		/* Floppy-Disk */
    125        1.8   tsutsui #define	LUNA1_BTDEV_SD	2		/* Streamer-Tape */
    126        1.8   tsutsui #define	LUNA1_BTDEV_P0	3		/* RS232c */
    127        1.8   tsutsui #define	LUNA1_BTDEV_ET	4		/* Ether-net */
    128        1.8   tsutsui #define	LUNA1_NBTDEV	5
    129        1.8   tsutsui 
    130        1.8   tsutsui 	struct {
    131        1.8   tsutsui 		uint8_t	bd_xxx1;	/*  0: ??? */
    132        1.8   tsutsui 		uint8_t	bd_boot;	/*  1: 1 == booted */
    133        1.8   tsutsui 		char	bd_name[2];	/*  2: device name (dk, fb, sd ... ) */
    134        1.9   tsutsui 		uint8_t	bd_drv;		/*  4: drive number (not ID) */
    135        1.8   tsutsui 		uint8_t	bd_xxx2;	/*  5: ??? */
    136        1.8   tsutsui 		uint8_t	bd_xxx3;	/*  6: ??? */
    137        1.8   tsutsui 		uint8_t	bd_part;	/*  7: dk partition / st record # */
    138        1.8   tsutsui 		uint8_t	bd_xxx4[4];	/*  8: ??? */
    139        1.8   tsutsui 		uint8_t	bd_xxx5[4];	/* 12: ??? */
    140        1.8   tsutsui 	} bi_devinfo[LUNA1_NBTDEV];
    141        1.8   tsutsui } __packed;
    142        1.8   tsutsui 
    143        1.8   tsutsui /* LUNA-II monitor's bootinfo structure */
    144        1.8   tsutsui /* This bootinfo data address is investigated on ROM Version 1.11 */
    145        1.8   tsutsui #define	LUNA2_BOOTINFOADDR	0x00001d80
    146        1.8   tsutsui struct luna2_bootinfo {
    147        1.8   tsutsui 	uint8_t	bi_xxx1[13];	/* 0x1d80: ??? */
    148        1.8   tsutsui 	uint8_t	bi_device;	/* 0x1d8d: boot device */
    149        1.8   tsutsui #define	LUNA2_BTDEV_DK	0		/* Hard-Disk */
    150        1.8   tsutsui #define	LUNA2_BTDEV_FT	1		/* Floppy-Disk */
    151        1.8   tsutsui #define	LUNA2_BTDEV_SD	2		/* Streamer-Tape */
    152        1.8   tsutsui #define	LUNA2_BTDEV_P0	3		/* RS232c */
    153        1.8   tsutsui #define	LUNA2_NBTDEV	4
    154        1.8   tsutsui 
    155        1.8   tsutsui 	struct {
    156        1.8   tsutsui 		uint8_t	bd_xxx1;	/*  0: ??? */
    157        1.8   tsutsui 		uint8_t	bd_boot;	/*  1: 1 == booted */
    158        1.8   tsutsui 		char	bd_name[4];	/*  2: device name (dk, ft, sd ... ) */
    159        1.8   tsutsui 		uint8_t	bd_xxx2;	/*  6: ??? */
    160        1.8   tsutsui 		uint8_t	bd_ctlr;	/*  7: SCSI controller number */
    161        1.9   tsutsui 		uint8_t	bd_id;		/*  8: SCSI ID number */
    162        1.8   tsutsui 		uint8_t	bd_xxx3;	/*  9: device number index? */
    163        1.8   tsutsui 		uint8_t	bd_xxx4;	/* 10: ??? */
    164        1.8   tsutsui 		uint8_t	bd_part;	/* 11: dk partition / st record # */
    165        1.8   tsutsui 		uint8_t	bd_xxx5[4];	/* 12: ??? */
    166        1.8   tsutsui 		uint8_t	bd_xxx6[4];	/* 16: ??? */
    167        1.8   tsutsui 	} bi_devinfo[LUNA2_NBTDEV];
    168        1.8   tsutsui } __packed;
    169        1.8   tsutsui 
    170        1.8   tsutsui /* #define BTINFO_DEBUG */
    171        1.8   tsutsui 
    172        1.1   tsutsui void
    173        1.1   tsutsui main(void)
    174        1.1   tsutsui {
    175       1.13   tsutsui 	int i, status = ST_NORMAL;
    176        1.2   tsutsui 	const char *machstr;
    177        1.8   tsutsui 	const char *bootdev;
    178       1.10   tsutsui 	uint32_t howto;
    179        1.6   tsutsui 	int unit, part;
    180        1.9   tsutsui 	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.13   tsutsui 	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.11   tsutsui 	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.8   tsutsui 	/* use sd(0,0) for the default boot device */
    225        1.8   tsutsui 	bootdev = "sd";
    226        1.8   tsutsui 	unit = 0;
    227        1.6   tsutsui 	part = 0;
    228        1.8   tsutsui 
    229  1.16.54.1  perseant /*
    230  1.16.54.1  perseant  * - LUNA1_BOOTINFOADDR is in the 0-th page [0, 0x1000), which causes
    231  1.16.54.1  perseant  *   -Warray-bounds for GCC12 and later.
    232  1.16.54.1  perseant  * - LUNA2_BOOTINFOADDR is also in the 0-th page, if we switch to
    233  1.16.54.1  perseant  *   8KB page.
    234  1.16.54.1  perseant  */
    235  1.16.54.1  perseant #pragma GCC diagnostic push
    236  1.16.54.1  perseant #pragma GCC diagnostic ignored "-Warray-bounds"
    237  1.16.54.1  perseant 
    238        1.8   tsutsui 	if (machtype == LUNA_I) {
    239        1.8   tsutsui 		const struct luna1_bootinfo *bi1 = (void *)LUNA1_BOOTINFOADDR;
    240        1.8   tsutsui 
    241        1.9   tsutsui 		bdev = bi1->bi_device;
    242        1.9   tsutsui 		switch (bdev) {
    243        1.8   tsutsui 		case LUNA1_BTDEV_DK:
    244        1.9   tsutsui 			/* note: bd_drv is not SCSI ID */
    245        1.9   tsutsui 			ctlr = 0;
    246        1.9   tsutsui 			id   = 6 - bi1->bi_devinfo[bdev].bd_drv;
    247        1.9   tsutsui 			unit = UNIT(ctlr, id);
    248        1.8   tsutsui 			break;
    249        1.8   tsutsui 		case LUNA1_BTDEV_ET:
    250        1.8   tsutsui 			bootdev = "le";
    251        1.8   tsutsui 			unit = 0;
    252        1.8   tsutsui 			break;
    253        1.8   tsutsui 		default:
    254        1.8   tsutsui 			/* not supported */
    255        1.8   tsutsui 			break;
    256        1.8   tsutsui 		}
    257        1.8   tsutsui #ifdef BTINFO_DEBUG
    258        1.8   tsutsui 		printf("bi1->bi_device = 0x%02x\n", bi1->bi_device);
    259        1.9   tsutsui 		printf("bi1->bi_devinfo[bdev].bd_boot = 0x%02x\n",
    260        1.9   tsutsui 		    bi1->bi_devinfo[bdev].bd_boot);
    261        1.9   tsutsui 		printf("bi1->bi_devinfo[bdev].bd_name = %c%c\n",
    262        1.9   tsutsui 		    bi1->bi_devinfo[bdev].bd_name[0],
    263        1.9   tsutsui 		    bi1->bi_devinfo[bdev].bd_name[1]);
    264        1.9   tsutsui 		printf("bi1->bi_devinfo[bdev].bd_drv = 0x%02x\n",
    265        1.9   tsutsui 		    bi1->bi_devinfo[bdev].bd_drv);
    266        1.9   tsutsui 		printf("bi1->bi_devinfo[bdev].bd_part = 0x%02x\n",
    267        1.9   tsutsui 		    bi1->bi_devinfo[bdev].bd_part);
    268        1.8   tsutsui #endif
    269        1.8   tsutsui 	} else {
    270        1.8   tsutsui 		const struct luna2_bootinfo *bi2 = (void *)LUNA2_BOOTINFOADDR;
    271        1.8   tsutsui 
    272        1.9   tsutsui 		bdev = bi2->bi_device;
    273        1.9   tsutsui 		switch (bdev) {
    274        1.8   tsutsui 		case LUNA2_BTDEV_DK:
    275        1.9   tsutsui 			ctlr = bi2->bi_devinfo[bdev].bd_ctlr;
    276        1.9   tsutsui 			id   = bi2->bi_devinfo[bdev].bd_id;
    277        1.9   tsutsui 			unit = UNIT(ctlr, id);
    278        1.8   tsutsui 			break;
    279        1.8   tsutsui 		default:
    280        1.8   tsutsui 			/* not supported */
    281        1.8   tsutsui 			break;
    282        1.8   tsutsui 		}
    283        1.8   tsutsui #ifdef BTINFO_DEBUG
    284        1.8   tsutsui 		printf("bi2->bi_device = 0x%02x\n", bi2->bi_device);
    285        1.9   tsutsui 		printf("bi2->bi_devinfo[bdev].bd_boot = 0x%02x\n",
    286        1.9   tsutsui 		    bi2->bi_devinfo[bdev].bd_boot);
    287        1.9   tsutsui 		printf("bi2->bi_devinfo[bdev].bd_name = %s\n",
    288        1.9   tsutsui 		    bi2->bi_devinfo[bdev].bd_name);
    289        1.9   tsutsui 		printf("bi2->bi_devinfo[bdev].bd_ctlr = 0x%02x\n",
    290        1.9   tsutsui 		    bi2->bi_devinfo[bdev].bd_ctlr);
    291        1.9   tsutsui 		printf("bi2->bi_devinfo[bdev].bd_id = 0x%02x\n",
    292        1.9   tsutsui 		    bi2->bi_devinfo[bdev].bd_id);
    293        1.9   tsutsui 		printf("bi2->bi_devinfo[bdev].bd_part = 0x%02x\n",
    294        1.9   tsutsui 		    bi2->bi_devinfo[bdev].bd_part);
    295        1.8   tsutsui #endif
    296        1.8   tsutsui 	}
    297        1.8   tsutsui 
    298  1.16.54.1  perseant #pragma GCC diagnostic pop
    299  1.16.54.1  perseant 
    300        1.6   tsutsui 	snprintf(default_file, sizeof(default_file),
    301        1.8   tsutsui 	    "%s(%d,%d)%s", bootdev, unit, part, "netbsd");
    302       1.15   tsutsui 	default_bootdev = bootdev;
    303       1.14   tsutsui 	default_unit = unit;
    304        1.6   tsutsui 
    305        1.1   tsutsui 	howto = reorder_dipsw(dipsw2);
    306        1.1   tsutsui 
    307        1.1   tsutsui 	if ((howto & 0xFE) == 0) {
    308        1.5   tsutsui 		char c;
    309        1.5   tsutsui 
    310        1.5   tsutsui 		printf("Press return to boot now,"
    311        1.5   tsutsui 		    " any other key for boot menu\n");
    312        1.5   tsutsui 		printf("booting %s - starting in ", default_file);
    313        1.5   tsutsui 		c = awaitkey("%d seconds. ", boot_timeout, true);
    314        1.5   tsutsui 		if (c == '\r' || c == '\n' || c == 0) {
    315        1.5   tsutsui 			printf("auto-boot %s\n", default_file);
    316       1.10   tsutsui 			bootnetbsd(default_file, 0);
    317        1.5   tsutsui 		}
    318        1.1   tsutsui 	}
    319        1.1   tsutsui 
    320        1.1   tsutsui 	/*
    321        1.1   tsutsui 	 * Main Loop
    322        1.1   tsutsui 	 */
    323        1.1   tsutsui 
    324        1.5   tsutsui 	printf("type \"help\" for help.\n");
    325        1.5   tsutsui 
    326        1.1   tsutsui 	do {
    327        1.1   tsutsui 		memset(buffer, 0, BUFFSIZE);
    328        1.1   tsutsui 		if (getline(prompt, buffer) > 0) {
    329       1.13   tsutsui 			argc = getargs(buffer, argv,
    330       1.13   tsutsui 			    sizeof(argv) / sizeof(char *));
    331        1.1   tsutsui 
    332        1.1   tsutsui 			status = parse(argc, argv);
    333        1.1   tsutsui 			if (status == ST_NOTFOUND)
    334       1.13   tsutsui 				printf("Command \"%s\" is not found !!\n",
    335       1.13   tsutsui 				    argv[0]);
    336        1.1   tsutsui 		}
    337       1.13   tsutsui 	} while (status != ST_EXIT);
    338        1.1   tsutsui 
    339        1.1   tsutsui 	exit(0);
    340        1.1   tsutsui }
    341        1.1   tsutsui 
    342       1.16   tsutsui static int
    343        1.1   tsutsui get_plane_numbers(void)
    344        1.1   tsutsui {
    345        1.1   tsutsui 	int r = ROM_plane;
    346        1.1   tsutsui 	int n = 0;
    347        1.1   tsutsui 
    348        1.1   tsutsui 	for (; r ; r >>= 1)
    349        1.1   tsutsui 		if (r & 0x1)
    350        1.1   tsutsui 			n++;
    351        1.1   tsutsui 
    352       1.13   tsutsui 	return n;
    353        1.1   tsutsui }
    354        1.1   tsutsui 
    355       1.16   tsutsui static int
    356        1.1   tsutsui reorder_dipsw(int dipsw)
    357        1.1   tsutsui {
    358        1.1   tsutsui 	int i, sw = 0;
    359        1.1   tsutsui 
    360        1.1   tsutsui 	for (i = 0; i < 8; i++) {
    361        1.1   tsutsui 		if ((dipsw & 0x01) == 0)
    362        1.1   tsutsui 			sw += 1;
    363        1.1   tsutsui 
    364        1.1   tsutsui 		if (i == 7)
    365        1.1   tsutsui 			break;
    366        1.1   tsutsui 
    367        1.1   tsutsui 		sw <<= 1;
    368        1.1   tsutsui 		dipsw >>= 1;
    369        1.1   tsutsui 	}
    370        1.1   tsutsui 
    371       1.13   tsutsui 	return sw;
    372        1.1   tsutsui }
    373