src/lib/formats/sc3000_bit.c
| r0 | r15545 | |
| 1 | /********************************************************************* |
| 2 | |
| 3 | formats/sc3000_bit.c |
| 4 | |
| 5 | Cassette code for Sega SC-3000 *.bit files |
| 6 | |
| 7 | *********************************************************************/ |
| 8 | |
| 9 | #include "sc3000_bit.h" |
| 10 | |
| 11 | /*************************************************************************** |
| 12 | PARAMETERS |
| 13 | ***************************************************************************/ |
| 14 | |
| 15 | #define LOG 0 |
| 16 | |
| 17 | /*************************************************************************** |
| 18 | IMPLEMENTATION |
| 19 | ***************************************************************************/ |
| 20 | |
| 21 | /*------------------------------------------------- |
| 22 | CassetteModulation sc3000_bit_modulation |
| 23 | -------------------------------------------------*/ |
| 24 | |
| 25 | static const struct CassetteModulation sc3000_bit_modulation = |
| 26 | { |
| 27 | CASSETTE_MODULATION_SINEWAVE, |
| 28 | 1200.0 - 300, 1200.0, 1200.0 + 300, |
| 29 | 2400.0 - 600, 2400.0, 2400.0 + 600 |
| 30 | }; |
| 31 | |
| 32 | /*------------------------------------------------- |
| 33 | sc3000_bit_identify - identify cassette |
| 34 | -------------------------------------------------*/ |
| 35 | |
| 36 | static casserr_t sc3000_bit_identify(cassette_image *cassette, struct CassetteOptions *opts) |
| 37 | { |
| 38 | return cassette_modulation_identify( cassette, &sc3000_bit_modulation, opts); |
| 39 | } |
| 40 | |
| 41 | /*------------------------------------------------- |
| 42 | sc3000_bit_load - load cassette |
| 43 | -------------------------------------------------*/ |
| 44 | |
| 45 | #define MODULATE(_value) \ |
| 46 | for (int i = 0; i < (_value ? 2 : 1); i++) { \ |
| 47 | err = cassette_put_modulated_data_bit(cassette, 0, time_index, _value, &sc3000_bit_modulation, &time_displacement);\ |
| 48 | if (err) return err;\ |
| 49 | time_index += time_displacement;\ |
| 50 | } |
| 51 | |
| 52 | static casserr_t sc3000_bit_load(cassette_image *cassette) |
| 53 | { |
| 54 | casserr_t err; |
| 55 | UINT64 image_size = cassette_image_size(cassette); |
| 56 | UINT64 image_pos = 0; |
| 57 | double time_index = 0.0; |
| 58 | double time_displacement; |
| 59 | UINT8 data; |
| 60 | |
| 61 | while (image_pos < image_size) |
| 62 | { |
| 63 | cassette_image_read(cassette, &data, image_pos, 1); |
| 64 | |
| 65 | switch (data) |
| 66 | { |
| 67 | case '1': |
| 68 | MODULATE(1); |
| 69 | break; |
| 70 | |
| 71 | case '0': |
| 72 | MODULATE(0); |
| 73 | break; |
| 74 | |
| 75 | case ' ': |
| 76 | err = cassette_put_sample( cassette, 0, time_index, 1/1200.0, 0); |
| 77 | if (err) return err; |
| 78 | time_index += 1/1200.0; |
| 79 | break; |
| 80 | } |
| 81 | |
| 82 | image_pos++; |
| 83 | } |
| 84 | |
| 85 | return CASSETTE_ERROR_SUCCESS; |
| 86 | } |
| 87 | |
| 88 | /*------------------------------------------------- |
| 89 | CassetteFormat sc3000_bit_cassette_format |
| 90 | -------------------------------------------------*/ |
| 91 | |
| 92 | const struct CassetteFormat sc3000_bit_format = |
| 93 | { |
| 94 | "bit", |
| 95 | sc3000_bit_identify, |
| 96 | sc3000_bit_load, |
| 97 | NULL |
| 98 | }; |
| 99 | |
| 100 | CASSETTE_FORMATLIST_START( sc3000_cassette_formats ) |
| 101 | CASSETTE_FORMAT(sc3000_bit_format) |
| 102 | CASSETTE_FORMATLIST_END |