fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 338 lines 8.3 kB view raw
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}