fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/utils/pri/encode.c *
7 * Created: 2013-12-19 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2013-2018 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#include "main.h"
24
25#include <stdio.h>
26#include <string.h>
27
28#include <drivers/psi/psi-img.h>
29#include <drivers/psi/psi.h>
30
31#include <drivers/pri/pri.h>
32#include <drivers/pri/pri-img.h>
33#include <drivers/pri/pri-enc-fm.h>
34#include <drivers/pri/pri-enc-gcr.h>
35#include <drivers/pri/pri-enc-mfm.h>
36
37
38extern pri_enc_fm_t par_enc_fm;
39extern pri_enc_mfm_t par_enc_mfm;
40
41
42static
43unsigned get_encoding (const psi_trk_t *trk)
44{
45 unsigned i;
46 psi_sct_t *sct;
47
48 for (i = 0; i < trk->sct_cnt; i++) {
49 sct = trk->sct[i];
50
51 switch (sct->encoding & PSI_ENC_MASK) {
52 case PSI_ENC_FM:
53 return (PSI_ENC_FM);
54
55 case PSI_ENC_MFM:
56 return (PSI_ENC_MFM);
57 }
58 }
59
60 return (PSI_ENC_UNKNOWN);
61}
62
63static
64int pri_encode_auto_img (pri_img_t *dimg, psi_img_t *simg)
65{
66 unsigned enc;
67 unsigned long c, h;
68 psi_cyl_t *cyl;
69 psi_trk_t *trk;
70 pri_trk_t *dtrk;
71
72 for (c = 0; c < simg->cyl_cnt; c++) {
73 cyl = simg->cyl[c];
74
75 for (h = 0; h < cyl->trk_cnt; h++) {
76 trk = cyl->trk[h];
77
78 dtrk = pri_img_get_track (dimg, c, h, 1);
79
80 if (dtrk == NULL) {
81 return (1);
82 }
83
84 enc = get_encoding (trk);
85
86 if (enc == PSI_ENC_FM) {
87 if (pri_trk_set_size (dtrk, par_enc_fm.track_size)) {
88 return (1);
89 }
90
91 pri_trk_set_clock (dtrk, par_enc_fm.clock);
92 pri_trk_clear_16 (dtrk, 0xffff);
93
94 if (pri_encode_fm_trk (dtrk, trk, &par_enc_fm)) {
95 return (1);
96 }
97 }
98 else {
99 if (pri_trk_set_size (dtrk, par_enc_mfm.track_size)) {
100 return (1);
101 }
102
103 pri_trk_set_clock (dtrk, par_enc_mfm.clock);
104 pri_trk_clear_16 (dtrk, 0x9254);
105
106 if (pri_encode_mfm_trk (dtrk, trk, &par_enc_mfm)) {
107 return (1);
108 }
109 }
110 }
111 }
112
113 return (0);
114}
115
116static
117pri_img_t *pri_encode_auto (psi_img_t *img)
118{
119 pri_img_t *dimg;
120
121 if ((dimg = pri_img_new()) == NULL) {
122 return (NULL);
123 }
124
125 if (pri_encode_auto_img (dimg, img)) {
126 pri_img_del (dimg);
127 return (NULL);
128 }
129
130 return (dimg);
131}
132
133int pri_encode (pri_img_t **img, const char *type, const char *fname)
134{
135 psi_img_t *simg;
136 pri_img_t *dimg;
137
138 if (strcmp (type, "text") == 0) {
139 return (pri_encode_text (*img, fname));
140 }
141
142 if ((simg = psi_load (fname, PSI_FORMAT_NONE)) == NULL) {
143 fprintf (stderr, "%s: loading failed (%s)\n", arg0, fname);
144 return (1);
145 }
146
147 if (strcmp (type, "auto") == 0) {
148 dimg = pri_encode_auto (simg);
149 }
150 else if (strcmp2 (type, "ibm-fm", "fm") == 0) {
151 dimg = pri_encode_fm (simg, &par_enc_fm);
152 }
153 else if (strcmp2 (type, "ibm-fm-sd-300", "fm-sd-300") == 0) {
154 par_enc_fm.clock = 250000;
155 par_enc_fm.track_size = 250000 / 5;
156 dimg = pri_encode_fm (simg, &par_enc_fm);
157 }
158 else if (strcmp2 (type, "mac-gcr", "gcr") == 0) {
159 dimg = pri_encode_gcr (simg);
160 }
161 else if (strcmp2 (type, "ibm-mfm", "mfm") == 0) {
162 dimg = pri_encode_mfm (simg, &par_enc_mfm);
163 }
164 else if (strcmp2 (type, "ibm-mfm-dd-300", "mfm-dd-300") == 0) {
165 par_enc_mfm.clock = 500000;
166 par_enc_mfm.track_size = 500000 / 5;
167 dimg = pri_encode_mfm (simg, &par_enc_mfm);
168 }
169 else if (strcmp2 (type, "ibm-mfm-hd-300", "mfm-hd-300") == 0) {
170 par_enc_mfm.clock = 1000000;
171 par_enc_mfm.track_size = 1000000 / 5;
172 dimg = pri_encode_mfm (simg, &par_enc_mfm);
173 }
174 else if (strcmp2 (type, "ibm-mfm-hd-360", "mfm-hd-360") == 0) {
175 par_enc_mfm.clock = 1000000;
176 par_enc_mfm.track_size = 1000000 / 6;
177 dimg = pri_encode_mfm (simg, &par_enc_mfm);
178 }
179 else {
180 fprintf (stderr, "%s: unknown encode type (%s)\n", arg0, type);
181 dimg = NULL;
182 }
183
184 if ((dimg != NULL) && (simg->comment_size > 0)) {
185 pri_img_set_comment (dimg, simg->comment, simg->comment_size);
186 }
187
188 psi_img_del (simg);
189
190 if (dimg == NULL) {
191 return (1);
192 }
193
194 pri_img_del (*img);
195
196 *img = dimg;
197
198 return (0);
199}