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