fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/utils/psi/edit.c *
7 * Created: 2013-06-09 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2013-2023 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#include "edit.h"
25
26#include <stdlib.h>
27#include <stdio.h>
28#include <string.h>
29
30#include <drivers/psi/psi.h>
31
32
33static
34int psi_edit_c_cb (psi_img_t *img, psi_sct_t *sct,
35 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
36{
37 sct->c = (*(unsigned long *) p) & 0xff;
38 par_cnt += 1;
39 return (0);
40}
41
42static
43int psi_edit_crcid_cb (psi_img_t *img, psi_sct_t *sct,
44 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
45{
46 psi_sct_set_flags (sct, PSI_FLAG_CRC_ID, (*(unsigned long *) p) != 0);
47 par_cnt += 1;
48 return (0);
49}
50
51static
52int psi_edit_crcdata_cb (psi_img_t *img, psi_sct_t *sct,
53 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
54{
55 psi_sct_set_flags (sct, PSI_FLAG_CRC_DATA, (*(unsigned long *) p) != 0);
56 par_cnt += 1;
57 return (0);
58}
59
60static
61int psi_edit_data_cb (psi_img_t *img, psi_sct_t *sct,
62 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
63{
64 psi_sct_fill (sct, *(unsigned long *) p);
65 par_cnt += 1;
66 return (0);
67}
68
69static
70int psi_edit_deldam_cb (psi_img_t *img, psi_sct_t *sct,
71 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
72{
73 psi_sct_set_flags (sct, PSI_FLAG_DEL_DAM, (*(unsigned long *) p) != 0);
74 par_cnt += 1;
75 return (0);
76}
77
78static
79int psi_edit_fm_sd_cb (psi_img_t *img, psi_sct_t *sct,
80 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
81{
82 psi_sct_set_encoding (sct, PSI_ENC_FM_DD);
83 par_cnt += 1;
84 return (0);
85}
86
87static
88int psi_edit_fm_hd_cb (psi_img_t *img, psi_sct_t *sct,
89 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
90{
91 psi_sct_set_encoding (sct, PSI_ENC_FM_HD);
92 par_cnt += 1;
93 return (0);
94}
95
96static
97int psi_edit_gcr_cb (psi_img_t *img, psi_sct_t *sct,
98 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
99{
100 psi_sct_set_encoding (sct, PSI_ENC_GCR);
101 par_cnt += 1;
102 return (0);
103}
104
105static
106int psi_edit_h_cb (psi_img_t *img, psi_sct_t *sct,
107 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
108{
109 sct->h = (*(unsigned long *) p) & 0xff;
110 par_cnt += 1;
111 return (0);
112}
113
114static
115int psi_edit_mfm_dd_cb (psi_img_t *img, psi_sct_t *sct,
116 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
117{
118 psi_sct_set_encoding (sct, PSI_ENC_MFM_DD);
119 par_cnt += 1;
120 return (0);
121}
122
123static
124int psi_edit_mfm_ed_cb (psi_img_t *img, psi_sct_t *sct,
125 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
126{
127 psi_sct_set_encoding (sct, PSI_ENC_MFM_ED);
128 par_cnt += 1;
129 return (0);
130}
131
132static
133int psi_edit_mfm_hd_cb (psi_img_t *img, psi_sct_t *sct,
134 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
135{
136 psi_sct_set_encoding (sct, PSI_ENC_MFM_HD);
137 par_cnt += 1;
138 return (0);
139}
140
141static
142int psi_edit_mfm_size_cb (psi_img_t *img, psi_sct_t *sct,
143 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
144{
145 psi_sct_set_mfm_size (sct, *(unsigned long *)p);
146 par_cnt += 1;
147 return (0);
148}
149
150static
151int psi_edit_nodam_cb (psi_img_t *img, psi_sct_t *sct,
152 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
153{
154 psi_sct_set_flags (sct, PSI_FLAG_NO_DAM, (*(unsigned long *) p) != 0);
155 par_cnt += 1;
156 return (0);
157}
158
159static
160int psi_edit_position_cb (psi_img_t *img, psi_sct_t *sct,
161 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
162{
163 sct->position = (*(unsigned long *) p);
164 par_cnt += 1;
165 return (0);
166}
167
168static
169int psi_edit_round_time_cb (psi_img_t *img, psi_sct_t *sct,
170 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
171{
172 unsigned long time1, time2, range, diff;
173
174 time1 = 8UL * psi_sct_get_size (sct);
175 time2 = psi_sct_get_read_time (sct);
176 range = *(unsigned long *) p;
177
178 if ((time1 == 0) || (time2 == 0)) {
179 return (0);
180 }
181
182 diff = (time1 < time2) ? (time2 - time1) : (time1 - time2);
183 diff = (100UL * 100UL * diff + (time1 / 2)) / time1;
184
185 if (diff < range) {
186 psi_sct_set_read_time (sct, 0);
187 par_cnt += 1;
188 }
189
190 return (0);
191}
192
193static
194int psi_edit_s_cb (psi_img_t *img, psi_sct_t *sct,
195 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
196{
197 sct->s = (*(unsigned long *) p) & 0xff;
198 par_cnt += 1;
199 return (0);
200}
201
202static
203int psi_edit_size_cb (psi_img_t *img, psi_sct_t *sct,
204 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
205{
206 psi_sct_set_size (sct, *(unsigned long *) p, par_filler);
207 par_cnt += 1;
208 return (0);
209}
210
211static
212int psi_edit_tags_cb (psi_img_t *img, psi_sct_t *sct,
213 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
214{
215 unsigned char buf[12];
216
217 if ((*(unsigned long *) p) != 0) {
218 psi_sct_get_tags (sct, buf, 12);
219 psi_sct_set_tags (sct, buf, 12);
220 }
221 else {
222 psi_sct_set_tags (sct, NULL, 0);
223 }
224
225 par_cnt += 1;
226
227 return (0);
228}
229
230static
231int psi_edit_time_cb (psi_img_t *img, psi_sct_t *sct,
232 unsigned c, unsigned h, unsigned s, unsigned a, void *p)
233{
234 psi_sct_set_read_time (sct, *(unsigned long *) p);
235 par_cnt += 1;
236 return (0);
237}
238
239int psi_edit_sectors (psi_img_t *img, const char *what, const char *val)
240{
241 int r;
242 unsigned long v;
243 psi_sct_cb fct;
244
245 v = strtoul (val, NULL, 0);
246
247 if (strcmp (what, "c") == 0) {
248 fct = psi_edit_c_cb;
249 }
250 else if (strcmp (what, "crc") == 0) {
251 fct = psi_edit_crcdata_cb;
252 }
253 else if (strcmp (what, "crc-data") == 0) {
254 fct = psi_edit_crcdata_cb;
255 }
256 else if (strcmp (what, "crc-id") == 0) {
257 fct = psi_edit_crcid_cb;
258 }
259 else if (strcmp (what, "data") == 0) {
260 fct = psi_edit_data_cb;
261 }
262 else if (strcmp (what, "del-dam") == 0) {
263 fct = psi_edit_deldam_cb;
264 }
265 else if (strcmp (what, "fm") == 0) {
266 fct = psi_edit_fm_sd_cb;
267 }
268 else if (strcmp (what, "fm-sd") == 0) {
269 fct = psi_edit_fm_sd_cb;
270 }
271 else if (strcmp (what, "fm-hd") == 0) {
272 fct = psi_edit_fm_hd_cb;
273 }
274 else if (strcmp (what, "gcr") == 0) {
275 fct = psi_edit_gcr_cb;
276 }
277 else if (strcmp (what, "h") == 0) {
278 fct = psi_edit_h_cb;
279 }
280 else if (strcmp (what, "mfm") == 0) {
281 fct = psi_edit_mfm_dd_cb;
282 }
283 else if (strcmp (what, "mfm-dd") == 0) {
284 fct = psi_edit_mfm_dd_cb;
285 }
286 else if (strcmp (what, "mfm-hd") == 0) {
287 fct = psi_edit_mfm_hd_cb;
288 }
289 else if (strcmp (what, "mfm-ed") == 0) {
290 fct = psi_edit_mfm_ed_cb;
291 }
292 else if (strcmp (what, "mfm-size") == 0) {
293 fct = psi_edit_mfm_size_cb;
294 }
295 else if (strcmp (what, "no-dam") == 0) {
296 fct = psi_edit_nodam_cb;
297 }
298 else if (strcmp (what, "position") == 0) {
299 fct = psi_edit_position_cb;
300 }
301 else if (strcmp (what, "round-time") == 0) {
302 fct = psi_edit_round_time_cb;
303 }
304 else if (strcmp (what, "s") == 0) {
305 fct = psi_edit_s_cb;
306 }
307 else if (strcmp (what, "size") == 0) {
308 fct = psi_edit_size_cb;
309 }
310 else if (strcmp (what, "tags") == 0) {
311 fct = psi_edit_tags_cb;
312 }
313 else if (strcmp (what, "time") == 0) {
314 fct = psi_edit_time_cb;
315 }
316 else {
317 fprintf (stderr, "%s: unknown field (%s)\n", arg0, what);
318 return (1);
319 }
320
321 par_cnt = 0;
322
323 r = psi_for_all_sectors (img, fct, &v);
324
325 if (par_verbose) {
326 fprintf (stderr, "%s: edit %lu sectors (%s = %lu)\n",
327 arg0, par_cnt, what, v
328 );
329 }
330
331 if (r) {
332 fprintf (stderr, "%s: editing failed (%s = %lu)\n",
333 arg0, what, v
334 );
335 }
336
337 return (r);
338}