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
|
|
|
{
|
|
|
|
static final int BLOCK_SIZE = 256;
|
|
|
|
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 20:44:43 +00:00
|
|
|
static DiskReader readerGRC;
|
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:
|
|
|
|
if (readerGRC == null)
|
|
|
|
readerGRC = new DiskReaderGRC ();
|
|
|
|
return readerGRC;
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2018-08-11 00:07:50 +00:00
|
|
|
// ---------------------------------------------------------------------------------//
|
|
|
|
// abstract functions
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
|
|
|
2019-07-28 06:24:52 +00:00
|
|
|
abstract byte[] decodeSector (byte[] buffer, int offset) throws DiskNibbleException;
|
2018-08-11 00:07:50 +00:00
|
|
|
|
|
|
|
abstract byte[] encodeSector (byte[] buffer);
|
|
|
|
|
|
|
|
abstract int expectedDataSize ();
|
|
|
|
}
|