ProDos sector ordering for .po files

This commit is contained in:
Brad Grantham 2016-12-03 10:06:48 -08:00
parent 5418de45aa
commit ebd5d06e87

View File

@ -175,7 +175,7 @@ unsigned char floppy_doSector[16] = {
unsigned char floppy_poSector[16] = { unsigned char floppy_poSector[16] = {
0x0, 0x8, 0x1, 0x9, 0x2, 0xA, 0x3, 0xB, 0x4, 0xC, 0x5, 0xD, 0x6, 0xE, 0x7, 0xF }; 0x0, 0x8, 0x1, 0x9, 0x2, 0xA, 0x3, 0xB, 0x4, 0xC, 0x5, 0xD, 0x6, 0xE, 0x7, 0xF };
void floppy_NybblizeImage(unsigned char *image, unsigned char *nybblized) void floppy_NybblizeImage(unsigned char *image, unsigned char *nybblized, unsigned char *skew)
{ {
// Format of a sector is header (23) + nybbles (343) + footer (30) = 396 // Format of a sector is header (23) + nybbles (343) + footer (30) = 396
// (short by 20 bytes of 416 [413 if 48 byte header is one time only]) // (short by 20 bytes of 416 [413 if 48 byte header is one time only])
@ -223,12 +223,7 @@ void floppy_NybblizeImage(unsigned char *image, unsigned char *nybblized)
p += 21; p += 21;
unsigned char * bytes = image; unsigned char * bytes = image;
// if (diskType[driveNum] == DT_DOS33) bytes += (skew[sector] * 256) + (trk * 256 * 16);
bytes += (floppy_doSector[sector] * 256) + (trk * 256 * 16);
// else if (diskType[driveNum] == DT_PRODOS)
// bytes += (poSector[sector] * 256) + (trk * 256 * 16);
// else
// bytes += (sector * 256) + (trk * 256 * 16);
// Convert the 256 8-bit bytes into 342 6-bit bytes. // Convert the 256 8-bit bytes into 342 6-bit bytes.
@ -325,7 +320,12 @@ struct DISKIIboard : board_base
throw "Couldn't read floppy"; throw "Couldn't read floppy";
floppy_present[number] = true; floppy_present[number] = true;
floppy_NybblizeImage(floppy_image[number], floppy_nybblized[number]); unsigned char *skew;
if(strcmp(name + strlen(name) - 3, ".po"))
skew = floppy_poSector;
else
skew = floppy_doSector;
floppy_NybblizeImage(floppy_image[number], floppy_nybblized[number], skew);
} }
} }
@ -381,7 +381,7 @@ struct DISKIIboard : board_base
{ {
if(addr < 0xC0E0 || addr > 0xC0EF) if(addr < 0xC0E0 || addr > 0xC0EF)
return false; return false;
if(debug & DEBUG_RW) printf("DISK II unhandled write of %02X to %04X (%s)\n", data, addr, io[addr].c_str()); if(debug & DEBUG_WARN) printf("DISK II unhandled write of %02X to %04X (%s)\n", data, addr, io[addr].c_str());
return false; return false;
} }
virtual bool read(int addr, unsigned char &data) virtual bool read(int addr, unsigned char &data)
@ -442,7 +442,7 @@ struct DISKIIboard : board_base
// disable other drive? // disable other drive?
return true; return true;
} }
printf("DISK II unhandled read from %04X (%s)\n", addr, io[addr].c_str()); if(debug & DEBUG_WARN) printf("DISK II unhandled read from %04X (%s)\n", addr, io[addr].c_str());
data = 0; data = 0;
return true; return true;
} }
@ -1945,6 +1945,17 @@ struct CPU6502
break; break;
} }
case 0x2E: { // ROL abs
int addr = read_pc_inc(bus) + read_pc_inc(bus) * 256;
m = bus.read(addr);
bool c = isset(C);
flag_change(C, m & 0x80);
set_flags(N | Z, m = (c ? 0x01 : 0x00) | (m << 1));
bus.write(addr, m);
break;
}
case 0x26: { // ROL case 0x26: { // ROL
unsigned char zpg = read_pc_inc(bus); unsigned char zpg = read_pc_inc(bus);
bool c = isset(C); bool c = isset(C);
@ -2241,6 +2252,14 @@ struct CPU6502
break; break;
} }
case 0x40: { // RTI
p = stack_pull(bus);
unsigned char pcl = stack_pull(bus);
unsigned char pch = stack_pull(bus);
pc = pcl + pch * 256 + 1;
break;
}
case 0x60: { // RTS case 0x60: { // RTS
unsigned char pcl = stack_pull(bus); unsigned char pcl = stack_pull(bus);
unsigned char pch = stack_pull(bus); unsigned char pch = stack_pull(bus);