2018-08-17 01:20:00 +00:00
|
|
|
package com.bytezone.diskbrowser.nib;
|
2018-08-11 00:07:50 +00:00
|
|
|
|
2019-09-04 20:44:43 +00:00
|
|
|
// -----------------------------------------------------------------------------------//
|
|
|
|
abstract class DiskReader
|
|
|
|
// -----------------------------------------------------------------------------------//
|
2018-08-11 00:07:50 +00:00
|
|
|
{
|
2019-09-05 12:34:34 +00:00
|
|
|
static final int SECTOR_SIZE = 256;
|
|
|
|
static final int BLOCK_SIZE = 512;
|
2018-08-11 00:07:50 +00:00
|
|
|
static final byte[] dataPrologue = { (byte) 0xD5, (byte) 0xAA, (byte) 0xAD };
|
|
|
|
|
2019-07-30 11:38:03 +00:00
|
|
|
static DiskReader reader13;
|
|
|
|
static DiskReader reader16;
|
2019-09-04 22:15:53 +00:00
|
|
|
static DiskReader readerGCR;
|
2019-07-30 11:38:03 +00:00
|
|
|
|
2018-08-11 04:12:21 +00:00
|
|
|
final int sectorsPerTrack;
|
2018-08-11 00:07:50 +00:00
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
|
|
DiskReader (int sectorsPerTrack)
|
2019-07-30 11:38:03 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2018-08-11 00:07:50 +00:00
|
|
|
{
|
|
|
|
this.sectorsPerTrack = sectorsPerTrack;
|
|
|
|
}
|
|
|
|
|
2019-07-30 11:38:03 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2019-08-06 04:54:04 +00:00
|
|
|
static DiskReader getInstance (int sectors)
|
2019-07-30 11:38:03 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
|
|
|
{
|
2019-09-04 20:44:43 +00:00
|
|
|
switch (sectors)
|
2019-07-30 11:38:03 +00:00
|
|
|
{
|
2019-09-04 20:44:43 +00:00
|
|
|
case 13:
|
|
|
|
if (reader13 == null)
|
|
|
|
reader13 = new DiskReader13Sector ();
|
|
|
|
return reader13;
|
2019-07-30 11:38:03 +00:00
|
|
|
|
2019-09-04 20:44:43 +00:00
|
|
|
case 16:
|
|
|
|
if (reader16 == null)
|
|
|
|
reader16 = new DiskReader16Sector ();
|
|
|
|
return reader16;
|
2019-08-06 04:54:04 +00:00
|
|
|
|
2019-09-04 20:44:43 +00:00
|
|
|
case 0:
|
2019-09-04 22:15:53 +00:00
|
|
|
if (readerGCR == null)
|
|
|
|
readerGCR = new DiskReaderGCR ();
|
|
|
|
return readerGCR;
|
2019-09-04 20:44:43 +00:00
|
|
|
|
|
|
|
default:
|
|
|
|
return null;
|
|
|
|
}
|
2019-07-30 11:38:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------//
|
2019-07-28 06:24:52 +00:00
|
|
|
byte[] decodeSector (byte[] buffer) throws DiskNibbleException
|
2019-07-30 11:38:03 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2019-07-28 06:24:52 +00:00
|
|
|
{
|
|
|
|
return decodeSector (buffer, 0);
|
|
|
|
}
|
|
|
|
|
2019-09-05 12:43:09 +00:00
|
|
|
// reverse 2 bits - 0 <= bits <= 3
|
2018-08-11 00:07:50 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2019-09-05 12:43:09 +00:00
|
|
|
static int reverse (int bits)
|
2018-08-11 00:07:50 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2019-09-05 12:43:09 +00:00
|
|
|
{
|
|
|
|
return bits == 1 ? 2 : bits == 2 ? 1 : bits;
|
|
|
|
}
|
2018-08-11 00:07:50 +00:00
|
|
|
|
2019-09-05 12:43:09 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2019-07-28 06:24:52 +00:00
|
|
|
abstract byte[] decodeSector (byte[] buffer, int offset) throws DiskNibbleException;
|
2019-09-05 12:43:09 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2018-08-11 00:07:50 +00:00
|
|
|
|
2019-09-05 12:43:09 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2018-08-11 00:07:50 +00:00
|
|
|
abstract byte[] encodeSector (byte[] buffer);
|
2019-09-05 12:43:09 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
2018-08-11 00:07:50 +00:00
|
|
|
}
|