7
7
*********************************************************************/
12
9
#include "formats/ami_dsk.h"
13
#include "formats/basicdsk.h"
17
/*****************************************************************************
18
Amiga floppy core functions
19
*****************************************************************************/
22
static FLOPPY_IDENTIFY( amiga_dsk_identify )
28
/* first check the size of the image */
29
size = floppy_image_size(floppy);
30
if ((size != 901120) && (size != 1802240))
33
return FLOPPY_ERROR_SUCCESS;
37
static FLOPPY_CONSTRUCT( amiga_dsk_construct )
39
struct basicdsk_geometry geometry;
41
/* setup geometry with standard values */
42
memset(&geometry, 0, sizeof(geometry));
45
geometry.first_sector_id = 0;
46
geometry.sector_length = 512;
51
geometry.sectors = option_resolution_lookup_int(params, PARAM_SECTORS);
56
UINT64 size = floppy_image_size(floppy);
57
geometry.sectors = size/512/80/2;
58
if (geometry.sectors != 11 && geometry.sectors != 22)
59
return FLOPPY_ERROR_INVALIDIMAGE;
62
return basicdsk_construct(floppy, &geometry);
67
/*****************************************************************************
69
*****************************************************************************/
72
FLOPPY_OPTIONS_START( amiga )
76
"Amiga floppy disk image",
86
FLOPPY_OPTIONS_START( amiga_only )
90
"Amiga floppy disk image",
11
adf_format::adf_format() : floppy_image_format_t()
15
const char *adf_format::name() const
20
const char *adf_format::description() const
22
return "Amiga ADF floppy disk image";
25
const char *adf_format::extensions() const
30
bool adf_format::supports_save() const
35
int adf_format::identify(io_generic *io)
37
UINT64 size = io_generic_size(io);
38
if ((size == 901120) || (size == 1802240))
45
bool adf_format::load(io_generic *io, floppy_image *image)
48
UINT8 sectdata[512*11];
49
for(int i=0; i<11; i++) {
50
sectors[i].data = sectdata + 512*i;
51
sectors[i].size = 512;
52
sectors[i].sector_id = i;
55
for(int track=0; track < 80; track++) {
56
for(int side=0; side < 2; side++) {
57
io_generic_read(io, sectdata, (track*2 + side)*512*11, 512*11);
58
generate_track(amiga_11, track, side, sectors, 11, 100000, image);
65
UINT32 adf_format::g32(const UINT8 *trackbuf, int track_size, int pos)
67
if(pos >= 0 && track_size-pos >= 40) {
71
(trackbuf[pp] << (24+dp)) |
72
(trackbuf[pp+1] << (16+dp)) |
73
(trackbuf[pp+2] << (8+dp)) |
74
(trackbuf[pp+3] << dp) |
75
(trackbuf[pp+4] >> (8-dp));
78
for(int i=0; i<32; i++) {
79
int pp = (pos+i) % track_size;
80
if(trackbuf[pp>>3] & (0x80 >> (pp & 7)))
81
res |= 0x80000000 >> i;
87
UINT32 adf_format::checksum(const UINT8 *trackbuf, int track_size, int pos, int long_count)
90
for(int i=0; i<long_count; i++)
91
check ^= g32(trackbuf, track_size, pos+32*i);
92
return check & 0x55555555;
95
bool adf_format::save(io_generic *io, floppy_image *image)
98
UINT8 sectdata[512*11];
99
UINT8 trackbuf[150000/8];
100
for(int track=0; track < 80; track++) {
101
for(int side=0; side < 2; side++) {
103
generate_bitstream_from_track(track, side, 2000, trackbuf, track_size, image);
105
for(int i=0; i<track_size; i++)
106
if(g32(trackbuf, track_size, i) == 0x44894489 &&
107
(g32(trackbuf, track_size, i+384) & 0x55555555) == checksum(trackbuf, track_size, i+32, 10) &&
108
(g32(trackbuf, track_size, i+448) & 0x55555555) == checksum(trackbuf, track_size, i+480, 256)) {
110
UINT32 head = ((g32(trackbuf, track_size, i+32) & 0x55555555) << 1) | (g32(trackbuf, track_size, i+64) & 0x55555555);
111
int sect = (head >> 8) & 0xff;
115
UINT8 *dest = sectdata + 512*sect;
116
for(int j=0; j<128; j++) {
117
UINT32 val = ((g32(trackbuf, track_size, i+480+32*j) & 0x55555555) << 1) | (g32(trackbuf, track_size, i+4576+32*j) & 0x55555555);
124
io_generic_write(io, sectdata, (track*2 + side)*512*11, 512*11);
131
const floppy_format_type FLOPPY_ADF_FORMAT = &floppy_image_format_creator<adf_format>;