Fix sector wrap issue, validate sector
This commit is contained in:
parent
04ef236601
commit
fec0e14465
|
@ -335,7 +335,7 @@ export interface TrackNibble {
|
||||||
* @param sector sector number to read
|
* @param sector sector number to read
|
||||||
* @returns An array of sector data bytes.
|
* @returns An array of sector data bytes.
|
||||||
*/
|
*/
|
||||||
export function findSector(disk: NibbleDisk, track: byte, sector: byte): TrackNibble | null {
|
export function findSector(disk: NibbleDisk, track: byte, sector: byte): TrackNibble {
|
||||||
const _sector = disk.format === 'po' ? _PO[sector] : _DO[sector];
|
const _sector = disk.format === 'po' ? _PO[sector] : _DO[sector];
|
||||||
let val, state = 0;
|
let val, state = 0;
|
||||||
let idx = 0;
|
let idx = 0;
|
||||||
|
@ -385,7 +385,22 @@ export function findSector(disk: NibbleDisk, track: byte, sector: byte): TrackNi
|
||||||
break;
|
break;
|
||||||
case 4: // Data
|
case 4: // Data
|
||||||
if (s === _sector && t === track) {
|
if (s === _sector && t === track) {
|
||||||
return { track, sector, nibble: idx };
|
// Save start of data
|
||||||
|
const nibble = idx;
|
||||||
|
|
||||||
|
// Do checksum on data
|
||||||
|
let last = 0;
|
||||||
|
for (let jdx = 0; jdx < 0x156; jdx++) {
|
||||||
|
last = detrans62[_readNext() - 0x80] ^ last;
|
||||||
|
}
|
||||||
|
const checkSum = detrans62[_readNext() - 0x80] ^ last;
|
||||||
|
// Validate checksum before returning
|
||||||
|
if (!checkSum) {
|
||||||
|
return { track, sector, nibble };
|
||||||
|
} else {
|
||||||
|
debug('Invalid data checksum:', toHex(last), toHex(track), toHex(sector), toHex(checkSum));
|
||||||
|
}
|
||||||
|
_skipBytes(3); // Skip footer
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_skipBytes(0x159); // Skip data, checksum and footer
|
_skipBytes(0x159); // Skip data, checksum and footer
|
||||||
|
@ -395,7 +410,7 @@ export function findSector(disk: NibbleDisk, track: byte, sector: byte): TrackNi
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
throw new Error(`Unable to locate track ${track}, sector ${sector}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -410,20 +425,17 @@ export function findSector(disk: NibbleDisk, track: byte, sector: byte): TrackNi
|
||||||
*/
|
*/
|
||||||
export function readSector(disk: NibbleDisk, track: byte, sector: byte): Uint8Array {
|
export function readSector(disk: NibbleDisk, track: byte, sector: byte): Uint8Array {
|
||||||
const trackNibble = findSector(disk, track, sector);
|
const trackNibble = findSector(disk, track, sector);
|
||||||
if (!trackNibble) {
|
|
||||||
return new Uint8Array(0);
|
|
||||||
}
|
|
||||||
const { nibble } = trackNibble;
|
const { nibble } = trackNibble;
|
||||||
const cur = disk.tracks[track];
|
const cur = disk.tracks[track];
|
||||||
|
|
||||||
let idx = nibble;
|
let idx = nibble;
|
||||||
function _readNext() {
|
const _readNext = () => {
|
||||||
const result = cur[idx++];
|
const result = cur[idx++];
|
||||||
if (nibble >= cur.length) {
|
if (idx >= cur.length) {
|
||||||
idx = 0;
|
idx = 0;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
};
|
||||||
|
|
||||||
const data = new Uint8Array(256);
|
const data = new Uint8Array(256);
|
||||||
const data2 = [];
|
const data2 = [];
|
||||||
|
@ -443,6 +455,7 @@ export function readSector(disk: NibbleDisk, track: byte, sector: byte): Uint8Ar
|
||||||
const checkSum = detrans62[_readNext() - 0x80] ^ last;
|
const checkSum = detrans62[_readNext() - 0x80] ^ last;
|
||||||
if (checkSum) {
|
if (checkSum) {
|
||||||
debug('Invalid data checksum:', toHex(last), toHex(track), toHex(sector), toHex(checkSum));
|
debug('Invalid data checksum:', toHex(last), toHex(track), toHex(sector), toHex(checkSum));
|
||||||
|
throw new Error(`Unable to read track ${track}, sector ${sector}`);
|
||||||
}
|
}
|
||||||
for (let kdx = 0, jdx = 0x55; kdx < 0x100; kdx++) {
|
for (let kdx = 0, jdx = 0x55; kdx < 0x100; kdx++) {
|
||||||
data[kdx] <<= 1;
|
data[kdx] <<= 1;
|
||||||
|
|
Loading…
Reference in New Issue