dmolony-DiskBrowser/src/com/bytezone/diskbrowser/nib/DiskReader.java

73 lines
2.5 KiB
Java
Raw Normal View History

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
}