Home | History | Annotate | Line # | Download | only in wrtvid
wrtvid.c revision 1.2
      1  1.2    scw /*	$NetBSD: wrtvid.c,v 1.2 2000/12/04 21:24:34 scw Exp $	*/
      2  1.1  chuck 
      3  1.1  chuck #include <sys/types.h>
      4  1.1  chuck #include <fcntl.h>
      5  1.1  chuck #include <unistd.h>
      6  1.1  chuck #include <stdio.h>
      7  1.2    scw #include <stdlib.h>
      8  1.2    scw #include <strings.h>
      9  1.1  chuck #define __DBINTERFACE_PRIVATE
     10  1.1  chuck #include <db.h>
     11  1.1  chuck #include <machine/disklabel.h>
     12  1.1  chuck 
     13  1.2    scw #include "loadfile.h"
     14  1.2    scw 
     15  1.2    scw static void swabcfg(struct cpu_disklabel *);
     16  1.2    scw static void swabvid(struct cpu_disklabel *);
     17  1.2    scw 
     18  1.2    scw int
     19  1.2    scw main(int argc, char **argv)
     20  1.1  chuck {
     21  1.1  chuck 	struct cpu_disklabel *pcpul;
     22  1.2    scw 	int tape_vid, tape_exe, fd;
     23  1.1  chuck 	char *filename;
     24  1.2    scw 	char *filebuff;
     25  1.1  chuck 	char fileext[256];
     26  1.2    scw 	u_long marks[MARK_MAX];
     27  1.2    scw 	size_t len;
     28  1.1  chuck 
     29  1.1  chuck 	if (argc == 0)
     30  1.1  chuck 		filename = "a.out";
     31  1.1  chuck 	else
     32  1.1  chuck 		filename = argv[1];
     33  1.1  chuck 
     34  1.2    scw 	marks[MARK_START] = 0;
     35  1.2    scw 	if ((fd = loadfile(filename, marks, COUNT_TEXT|COUNT_DATA)) == -1)
     36  1.2    scw 		return NULL;
     37  1.2    scw 	(void)close(fd);
     38  1.2    scw 
     39  1.2    scw 	len = (((marks[MARK_END] - marks[MARK_START]) + 511) / 512) * 2;
     40  1.2    scw 	len *= 256;
     41  1.2    scw 	filebuff = malloc(len);
     42  1.2    scw 
     43  1.2    scw 	marks[MARK_START] = (u_long)(filebuff - marks[MARK_START]);
     44  1.2    scw 
     45  1.2    scw 	if ((fd = loadfile(filename, marks, LOAD_TEXT|LOAD_DATA)) == -1)
     46  1.2    scw 		return NULL;
     47  1.2    scw 	(void)close(fd);
     48  1.2    scw 
     49  1.1  chuck 	sprintf(fileext, "%c%cboot", filename[4], filename[5]);
     50  1.1  chuck 	tape_vid = open(fileext, O_WRONLY|O_CREAT|O_TRUNC, 0644);
     51  1.1  chuck 	sprintf(fileext, "boot%c%c", filename[4], filename[5]);
     52  1.1  chuck 	tape_exe = open(fileext, O_WRONLY|O_CREAT|O_TRUNC,0644);
     53  1.1  chuck 
     54  1.1  chuck 	pcpul = (struct cpu_disklabel *)malloc(sizeof(struct cpu_disklabel));
     55  1.1  chuck 	bzero(pcpul, sizeof(struct cpu_disklabel));
     56  1.1  chuck 
     57  1.1  chuck 	strcpy(pcpul->vid_id, "NBSD");
     58  1.1  chuck 
     59  1.1  chuck 	if (filename[5] == 't' ) {
     60  1.1  chuck 		pcpul->vid_oss = 1;
     61  1.1  chuck 	}else {
     62  1.1  chuck 		pcpul->vid_oss = 2;
     63  1.1  chuck 	}
     64  1.2    scw 	pcpul->vid_osl = len / 256;
     65  1.1  chuck 
     66  1.1  chuck 	/* check this, it may not work in both endian. */
     67  1.1  chuck 	{
     68  1.1  chuck 		union {
     69  1.1  chuck 			struct s {
     70  1.1  chuck 				unsigned short s1;
     71  1.1  chuck 				unsigned short s2;
     72  1.1  chuck 			} s;
     73  1.1  chuck 			unsigned long l;
     74  1.1  chuck 		} a;
     75  1.2    scw 		a.l = marks[MARK_ENTRY];
     76  1.1  chuck 		pcpul->vid_osa_u = a.s.s1;
     77  1.1  chuck 		pcpul->vid_osa_l = a.s.s2;
     78  1.1  chuck 
     79  1.1  chuck 	}
     80  1.1  chuck 	pcpul->vid_cas = 1;
     81  1.1  chuck 	pcpul->vid_cal = 1;
     82  1.1  chuck 	/* do not want to write past end of structure, not null terminated */
     83  1.1  chuck 	strncpy(pcpul->vid_mot, "MOTOROLA", 8);
     84  1.1  chuck 
     85  1.1  chuck 	if (BYTE_ORDER != BIG_ENDIAN)
     86  1.1  chuck 		swabvid(pcpul);
     87  1.1  chuck 
     88  1.1  chuck 	pcpul->cfg_rec = 0x100;
     89  1.1  chuck 	pcpul->cfg_psm = 0x200;
     90  1.1  chuck 
     91  1.1  chuck 	if (BYTE_ORDER != BIG_ENDIAN)
     92  1.1  chuck 		swabcfg(pcpul);
     93  1.1  chuck 
     94  1.1  chuck 	write(tape_vid, pcpul, sizeof(struct cpu_disklabel));
     95  1.1  chuck 
     96  1.1  chuck 	free(pcpul);
     97  1.1  chuck 
     98  1.2    scw 	write(tape_exe, filebuff, len);
     99  1.2    scw 	free(filebuff);
    100  1.2    scw 
    101  1.1  chuck 	close(tape_vid);
    102  1.1  chuck 	close(tape_exe);
    103  1.1  chuck 	return (0);
    104  1.1  chuck }
    105  1.1  chuck 
    106  1.2    scw static void
    107  1.1  chuck swabvid(pcpul)
    108  1.1  chuck 	struct cpu_disklabel *pcpul;
    109  1.1  chuck {
    110  1.1  chuck 	M_32_SWAP(pcpul->vid_oss);
    111  1.1  chuck 	M_16_SWAP(pcpul->vid_osl);
    112  1.1  chuck 	/*
    113  1.1  chuck 	M_16_SWAP(pcpul->vid_osa_u);
    114  1.1  chuck 	M_16_SWAP(pcpul->vid_osa_l);
    115  1.1  chuck 	*/
    116  1.1  chuck 	M_32_SWAP(pcpul->vid_cas);
    117  1.1  chuck }
    118  1.1  chuck 
    119  1.2    scw static void
    120  1.1  chuck swabcfg(pcpul)
    121  1.1  chuck 	struct cpu_disklabel *pcpul;
    122  1.1  chuck {
    123  1.1  chuck 	M_16_SWAP(pcpul->cfg_atm);
    124  1.1  chuck 	M_16_SWAP(pcpul->cfg_prm);
    125  1.1  chuck 	M_16_SWAP(pcpul->cfg_atm);
    126  1.1  chuck 	M_16_SWAP(pcpul->cfg_rec);
    127  1.1  chuck 	M_16_SWAP(pcpul->cfg_trk);
    128  1.1  chuck 	M_16_SWAP(pcpul->cfg_psm);
    129  1.1  chuck 	M_16_SWAP(pcpul->cfg_shd);
    130  1.1  chuck 	M_16_SWAP(pcpul->cfg_pcom);
    131  1.1  chuck 	M_16_SWAP(pcpul->cfg_rwcc);
    132  1.1  chuck 	M_16_SWAP(pcpul->cfg_ecc);
    133  1.1  chuck 	M_16_SWAP(pcpul->cfg_eatm);
    134  1.1  chuck 	M_16_SWAP(pcpul->cfg_eprm);
    135  1.1  chuck 	M_16_SWAP(pcpul->cfg_eatw);
    136  1.1  chuck 	M_16_SWAP(pcpul->cfg_rsvc1);
    137  1.1  chuck 	M_16_SWAP(pcpul->cfg_rsvc2);
    138  1.1  chuck }
    139