wrtvid.c revision 1.4 1 1.4 scw /* $NetBSD: wrtvid.c,v 1.4 2001/10/19 17:09:16 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.4 scw u_long entry;
28 1.2 scw size_t len;
29 1.1 chuck
30 1.1 chuck if (argc == 0)
31 1.1 chuck filename = "a.out";
32 1.1 chuck else
33 1.1 chuck filename = argv[1];
34 1.1 chuck
35 1.2 scw marks[MARK_START] = 0;
36 1.2 scw if ((fd = loadfile(filename, marks, COUNT_TEXT|COUNT_DATA)) == -1)
37 1.2 scw return NULL;
38 1.2 scw (void)close(fd);
39 1.2 scw
40 1.2 scw len = (((marks[MARK_END] - marks[MARK_START]) + 511) / 512) * 2;
41 1.2 scw len *= 256;
42 1.2 scw filebuff = malloc(len);
43 1.2 scw
44 1.4 scw entry = marks[MARK_START];
45 1.4 scw marks[MARK_START] = (u_long)(filebuff - entry);
46 1.2 scw
47 1.2 scw if ((fd = loadfile(filename, marks, LOAD_TEXT|LOAD_DATA)) == -1)
48 1.2 scw return NULL;
49 1.2 scw (void)close(fd);
50 1.2 scw
51 1.1 chuck sprintf(fileext, "%c%cboot", filename[4], filename[5]);
52 1.1 chuck tape_vid = open(fileext, O_WRONLY|O_CREAT|O_TRUNC, 0644);
53 1.1 chuck sprintf(fileext, "boot%c%c", filename[4], filename[5]);
54 1.1 chuck tape_exe = open(fileext, O_WRONLY|O_CREAT|O_TRUNC,0644);
55 1.1 chuck
56 1.1 chuck pcpul = (struct cpu_disklabel *)malloc(sizeof(struct cpu_disklabel));
57 1.3 scw memset(pcpul, 0, sizeof(struct cpu_disklabel));
58 1.1 chuck
59 1.1 chuck strcpy(pcpul->vid_id, "NBSD");
60 1.1 chuck
61 1.1 chuck if (filename[5] == 't' ) {
62 1.1 chuck pcpul->vid_oss = 1;
63 1.1 chuck }else {
64 1.1 chuck pcpul->vid_oss = 2;
65 1.1 chuck }
66 1.2 scw pcpul->vid_osl = len / 256;
67 1.4 scw pcpul->vid_osa_u = entry >> 16;
68 1.4 scw pcpul->vid_osa_l = entry & 0xffff;
69 1.1 chuck pcpul->vid_cas = 1;
70 1.1 chuck pcpul->vid_cal = 1;
71 1.1 chuck /* do not want to write past end of structure, not null terminated */
72 1.1 chuck strncpy(pcpul->vid_mot, "MOTOROLA", 8);
73 1.1 chuck
74 1.1 chuck if (BYTE_ORDER != BIG_ENDIAN)
75 1.1 chuck swabvid(pcpul);
76 1.1 chuck
77 1.1 chuck pcpul->cfg_rec = 0x100;
78 1.1 chuck pcpul->cfg_psm = 0x200;
79 1.1 chuck
80 1.1 chuck if (BYTE_ORDER != BIG_ENDIAN)
81 1.1 chuck swabcfg(pcpul);
82 1.1 chuck
83 1.1 chuck write(tape_vid, pcpul, sizeof(struct cpu_disklabel));
84 1.1 chuck
85 1.1 chuck free(pcpul);
86 1.1 chuck
87 1.2 scw write(tape_exe, filebuff, len);
88 1.2 scw free(filebuff);
89 1.2 scw
90 1.1 chuck close(tape_vid);
91 1.1 chuck close(tape_exe);
92 1.1 chuck return (0);
93 1.1 chuck }
94 1.1 chuck
95 1.2 scw static void
96 1.1 chuck swabvid(pcpul)
97 1.1 chuck struct cpu_disklabel *pcpul;
98 1.1 chuck {
99 1.1 chuck M_32_SWAP(pcpul->vid_oss);
100 1.1 chuck M_16_SWAP(pcpul->vid_osl);
101 1.1 chuck /*
102 1.1 chuck M_16_SWAP(pcpul->vid_osa_u);
103 1.1 chuck M_16_SWAP(pcpul->vid_osa_l);
104 1.1 chuck */
105 1.1 chuck M_32_SWAP(pcpul->vid_cas);
106 1.1 chuck }
107 1.1 chuck
108 1.2 scw static void
109 1.1 chuck swabcfg(pcpul)
110 1.1 chuck struct cpu_disklabel *pcpul;
111 1.1 chuck {
112 1.1 chuck M_16_SWAP(pcpul->cfg_atm);
113 1.1 chuck M_16_SWAP(pcpul->cfg_prm);
114 1.1 chuck M_16_SWAP(pcpul->cfg_atm);
115 1.1 chuck M_16_SWAP(pcpul->cfg_rec);
116 1.1 chuck M_16_SWAP(pcpul->cfg_trk);
117 1.1 chuck M_16_SWAP(pcpul->cfg_psm);
118 1.1 chuck M_16_SWAP(pcpul->cfg_shd);
119 1.1 chuck M_16_SWAP(pcpul->cfg_pcom);
120 1.1 chuck M_16_SWAP(pcpul->cfg_rwcc);
121 1.1 chuck M_16_SWAP(pcpul->cfg_ecc);
122 1.1 chuck M_16_SWAP(pcpul->cfg_eatm);
123 1.1 chuck M_16_SWAP(pcpul->cfg_eprm);
124 1.1 chuck M_16_SWAP(pcpul->cfg_eatw);
125 1.1 chuck M_16_SWAP(pcpul->cfg_rsvc1);
126 1.1 chuck M_16_SWAP(pcpul->cfg_rsvc2);
127 1.1 chuck }
128