fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation

psi: Suppport loading and saving raw images in HCS mode

+148 -27
+104 -18
src/drivers/psi/psi-img-raw.c
··· 5 5 /***************************************************************************** 6 6 * File name: src/drivers/psi/psi-img-raw.c * 7 7 * Created: 2010-08-13 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 2010-2013 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2010-2016 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 127 127 } 128 128 129 129 static 130 - int raw_load_fp (FILE *fp, psi_img_t *img, const psi_geometry_t *geo) 130 + int raw_load_fp (FILE *fp, psi_img_t *img, const psi_geometry_t *geo, int hcs) 131 131 { 132 132 unsigned c, h, s; 133 + unsigned ci, hi, ti; 133 134 unsigned long size; 134 135 psi_trk_t *trk; 135 136 psi_sct_t *sct; ··· 144 145 145 146 for (c = 0; c < geo->c; c++) { 146 147 for (h = 0; h < geo->h; h++) { 147 - trk = psi_img_get_track (img, c, h, 1); 148 + if (hcs) { 149 + ti = c * geo->h + h; 150 + ci = ti % geo->c; 151 + hi = ti / geo->c; 152 + 153 + if ((hcs < 0) && (hi & 1)) { 154 + ci = geo->c - ci - 1; 155 + } 156 + } 157 + else { 158 + ci = c; 159 + hi = h; 160 + } 161 + 162 + trk = psi_img_get_track (img, ci, hi, 1); 148 163 149 164 if (trk == NULL) { 150 165 return (1); 151 166 } 152 167 153 168 for (s = 0; s < geo->s; s++) { 154 - sct = psi_sct_new (c, h, s + 1, geo->ssize); 169 + sct = psi_sct_new (ci, hi, s + 1, geo->ssize); 155 170 156 171 if (sct == NULL) { 157 172 return (1); ··· 174 189 return (0); 175 190 } 176 191 177 - psi_img_t *psi_load_st (FILE *fp) 192 + psi_img_t *raw_load_img (FILE *fp, const psi_geometry_t *geo, int hcs) 178 193 { 179 194 psi_img_t *img; 180 195 ··· 182 197 return (NULL); 183 198 } 184 199 185 - if (raw_load_fp (fp, img, disk_sizes_st)) { 200 + if (raw_load_fp (fp, img, geo, hcs)) { 186 201 psi_img_del (img); 187 202 return (NULL); 188 203 } ··· 190 205 return (img); 191 206 } 192 207 193 - psi_img_t *psi_load_raw (FILE *fp) 208 + psi_img_t *psi_load_st (FILE *fp) 194 209 { 195 - psi_img_t *img; 210 + return (raw_load_img (fp, disk_sizes_st, 0)); 211 + } 196 212 197 - img = psi_img_new(); 213 + psi_img_t *psi_load_raw_hcs (FILE *fp) 214 + { 215 + return (raw_load_img (fp, disk_sizes, 1)); 216 + } 198 217 199 - if (img == NULL) { 200 - return (NULL); 201 - } 202 - 203 - if (raw_load_fp (fp, img, disk_sizes)) { 204 - psi_img_del (img); 205 - return (NULL); 206 - } 218 + psi_img_t *psi_load_raw_hts (FILE *fp) 219 + { 220 + return (raw_load_img (fp, disk_sizes, -1)); 221 + } 207 222 208 - return (img); 223 + psi_img_t *psi_load_raw (FILE *fp) 224 + { 225 + return (raw_load_img (fp, disk_sizes, 0)); 209 226 } 210 227 211 228 ··· 239 256 return (sct); 240 257 } 241 258 259 + static 260 + unsigned raw_get_head_cnt (const psi_img_t *img) 261 + { 262 + unsigned c, hn; 263 + 264 + hn = 0; 265 + 266 + for (c = 0; c < img->cyl_cnt; c++) { 267 + if ((img->cyl[c] != NULL) && (img->cyl[c]->trk_cnt > hn)) { 268 + hn = img->cyl[c]->trk_cnt; 269 + } 270 + } 271 + 272 + return (hn); 273 + } 274 + 242 275 int psi_save_st (FILE *fp, const psi_img_t *img) 243 276 { 244 277 return (psi_save_raw (fp, img)); 278 + } 279 + 280 + static 281 + int psi_save_raw_hcs_hts (FILE *fp, const psi_img_t *img, int hts) 282 + { 283 + unsigned c, ci, h, s, hn; 284 + const psi_trk_t *trk; 285 + const psi_sct_t *sct; 286 + 287 + hn = raw_get_head_cnt (img); 288 + 289 + for (h = 0; h < hn; h++) { 290 + for (c = 0; c < img->cyl_cnt; c++) { 291 + if (hts && (h & 1)) { 292 + ci = img->cyl_cnt - c - 1; 293 + } 294 + else { 295 + ci = c; 296 + } 297 + 298 + trk = psi_img_get_track ((psi_img_t *) img, ci, h, 0); 299 + 300 + if (trk == NULL) { 301 + continue; 302 + } 303 + 304 + s = 0; 305 + 306 + sct = raw_get_next_sector (trk, &s); 307 + 308 + while (sct != NULL) { 309 + if (fwrite (sct->data, 1, sct->n, fp) != sct->n) { 310 + return (1); 311 + } 312 + 313 + sct = raw_get_next_sector (trk, &s); 314 + } 315 + } 316 + } 317 + 318 + fflush (fp); 319 + 320 + return (0); 321 + } 322 + 323 + int psi_save_raw_hcs (FILE *fp, const psi_img_t *img) 324 + { 325 + return (psi_save_raw_hcs_hts (fp, img, 0)); 326 + } 327 + 328 + int psi_save_raw_hts (FILE *fp, const psi_img_t *img) 329 + { 330 + return (psi_save_raw_hcs_hts (fp, img, 1)); 245 331 } 246 332 247 333 int psi_save_raw (FILE *fp, const psi_img_t *img)
+4
src/drivers/psi/psi-img-raw.h
··· 40 40 const psi_geometry_t *psi_get_geometry_from_size (unsigned long size, unsigned long mask); 41 41 42 42 psi_img_t *psi_load_st (FILE *fp); 43 + psi_img_t *psi_load_raw_hcs (FILE *fp); 44 + psi_img_t *psi_load_raw_hts (FILE *fp); 43 45 psi_img_t *psi_load_raw (FILE *fp); 44 46 45 47 int psi_save_st (FILE *fp, const psi_img_t *img); 48 + int psi_save_raw_hcs (FILE *fp, const psi_img_t *img); 49 + int psi_save_raw_hts (FILE *fp, const psi_img_t *img); 46 50 int psi_save_raw (FILE *fp, const psi_img_t *img); 47 51 48 52 int psi_probe_raw_fp (FILE *fp);
+13 -1
src/drivers/psi/psi-img.c
··· 5 5 /***************************************************************************** 6 6 * File name: src/drivers/psi/psi-img.c * 7 7 * Created: 2012-02-14 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 2012-2015 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2012-2016 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 148 148 case PSI_FORMAT_RAW: 149 149 return (psi_load_raw (fp)); 150 150 151 + case PSI_FORMAT_RAW_HCS: 152 + return (psi_load_raw_hcs (fp)); 153 + 154 + case PSI_FORMAT_RAW_HTS: 155 + return (psi_load_raw_hts (fp)); 156 + 151 157 case PSI_FORMAT_ST: 152 158 return (psi_load_st (fp)); 153 159 ··· 235 241 236 242 case PSI_FORMAT_RAW: 237 243 return (psi_save_raw (fp, img)); 244 + 245 + case PSI_FORMAT_RAW_HCS: 246 + return (psi_save_raw_hcs (fp, img)); 247 + 248 + case PSI_FORMAT_RAW_HTS: 249 + return (psi_save_raw_hts (fp, img)); 238 250 239 251 case PSI_FORMAT_ST: 240 252 return (psi_save_st (fp, img));
+9 -6
src/drivers/psi/psi-img.h
··· 5 5 /***************************************************************************** 6 6 * File name: src/drivers/psi/psi-img.h * 7 7 * Created: 2012-02-14 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 2012-2015 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2012-2016 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 41 41 #define PSI_FORMAT_PFDC4 11 42 42 #define PSI_FORMAT_PSI 12 43 43 #define PSI_FORMAT_RAW 13 44 - #define PSI_FORMAT_ST 14 45 - #define PSI_FORMAT_STX 15 46 - #define PSI_FORMAT_TC 16 47 - #define PSI_FORMAT_TD0 17 48 - #define PSI_FORMAT_XDF 18 44 + #define PSI_FORMAT_RAW_CHS PSI_FORMAT_RAW 45 + #define PSI_FORMAT_RAW_HCS 14 46 + #define PSI_FORMAT_RAW_HTS 15 47 + #define PSI_FORMAT_ST 16 48 + #define PSI_FORMAT_STX 17 49 + #define PSI_FORMAT_TC 18 50 + #define PSI_FORMAT_TD0 19 51 + #define PSI_FORMAT_XDF 20 49 52 50 53 51 54 unsigned psi_guess_type (const char *fname);
+10 -1
src/utils/psi/main.c
··· 5 5 /***************************************************************************** 6 6 * File name: src/utils/psi/main.c * 7 7 * Created: 2010-08-13 by Hampa Hug <hampa@hampa.ch> * 8 - * Copyright: (C) 2010-2015 Hampa Hug <hampa@hampa.ch> * 8 + * Copyright: (C) 2010-2016 Hampa Hug <hampa@hampa.ch> * 9 9 *****************************************************************************/ 10 10 11 11 /***************************************************************************** ··· 507 507 } 508 508 else if (strcmp (name, "raw") == 0) { 509 509 *val = PSI_FORMAT_RAW; 510 + } 511 + else if (strcmp (name, "raw-chs") == 0) { 512 + *val = PSI_FORMAT_RAW; 513 + } 514 + else if (strcmp (name, "raw-hcs") == 0) { 515 + *val = PSI_FORMAT_RAW_HCS; 516 + } 517 + else if (strcmp (name, "raw-hts") == 0) { 518 + *val = PSI_FORMAT_RAW_HTS; 510 519 } 511 520 else if (strcmp (name, "st") == 0) { 512 521 *val = PSI_FORMAT_ST;
+8 -1
src/utils/psi/psi.1
··· 129 129 The native PCE sector image file format. 130 130 .TP 131 131 .B raw 132 - A raw sector dump. 132 + A raw sector dump in CHS format. 133 + .TP 134 + .B raw-hcs 135 + A raw sector dump in HCS format. 136 + .TP 137 + .B raw-hts 138 + A raw sector dump in HCS format. Additionally, the order of tracks on odd 139 + heads is reversed. 133 140 .TP 134 141 .B st 135 142 The same as raw, but the auto-detected disk geometries are the ones