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