1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-06-11 05:29:33 +00:00

Pass in sector table for logical-physical orders

We were not encoding data properly, because in DOS 3.3 and ProDOS,
sectors must be interleaved on disk media (whereas in the original image
form, data is laid out in a linear fashion).

This solves a bug where we erroneously encountered a "bad" opcode (a7)
in the program code.
This commit is contained in:
Peter Evans 2018-02-19 18:49:37 -06:00
parent 3ab654c306
commit 508be6458a
3 changed files with 23 additions and 11 deletions

View File

@ -62,8 +62,8 @@
extern int apple2_enc_4n4(vm_segment *, int, vm_8bit);
extern int apple2_enc_sector(vm_segment *, vm_segment *, int, int);
extern int apple2_enc_sector_header(vm_segment *, int, int, int);
extern int apple2_enc_track(vm_segment *, vm_segment *, int, int);
extern vm_segment *apple2_enc_dos(vm_segment *);
extern int apple2_enc_track(vm_segment *, vm_segment *, const int *, int, int);
extern vm_segment *apple2_enc_dos(vm_segment *, const int *);
extern vm_segment *apple2_enc_nib(vm_segment *);
#endif

View File

@ -14,6 +14,16 @@
#include "apple2.enc.h"
#include "apple2.h"
static int sector_dos33[] = {
0x0, 0x7, 0xe, 0x6, 0xd, 0x5, 0xc, 0x4,
0xb, 0x3, 0xa, 0x2, 0x9, 0x1, 0x8, 0xf,
};
static int sector_prodos[] = {
0x0, 0x8, 0x1, 0x9, 0x2, 0xa, 0x3, 0xb,
0x4, 0xc, 0x5, 0xd, 0x6, 0xe, 0x7, 0xf,
};
/*
* Create a new disk drive. We do not create a memory segment for the
* drive right away, as the size of said data can be variable based on
@ -113,8 +123,11 @@ apple2_dd_encode(apple2dd *drive)
break;
case DD_DOS33:
drive->data = apple2_enc_dos(drive->image, sector_dos33);
break;
case DD_PRODOS:
drive->data = apple2_enc_dos(drive->image);
drive->data = apple2_enc_dos(drive->image, sector_prodos);
break;
default:

View File

@ -39,7 +39,7 @@ static vm_8bit gcr62[] = {
* 3.2 and 3.1 (which use 5-and-3 encoding).
*/
vm_segment *
apple2_enc_dos(vm_segment *src)
apple2_enc_dos(vm_segment *src, const int *sectab)
{
vm_segment *dest;
int i, doff = 0;
@ -58,7 +58,7 @@ apple2_enc_dos(vm_segment *src)
// away with just using tracks-and-sectors. In particular, DOS 3.3
// has 35 tracks of 4096 bytes each.
for (i = 0; i < 35; i++) {
doff += apple2_enc_track(dest, src, doff, i);
doff += apple2_enc_track(dest, src, sectab, doff, i);
}
return dest;
@ -105,12 +105,12 @@ apple2_enc_nib(vm_segment *src)
* written into dest.
*/
int
apple2_enc_track(vm_segment *dest, vm_segment *src,
apple2_enc_track(vm_segment *dest, vm_segment *src, const int *sectab,
int doff, int track)
{
int soff = track * ENC_DTRACK;
int toff = track * ENC_DTRACK;
int orig = doff;
int sect, i;
int sect, i, soff;
// We'll start off with some self-sync bytes to separate this track
// from any other
@ -119,13 +119,12 @@ apple2_enc_track(vm_segment *dest, vm_segment *src,
}
for (sect = 0; sect < 16; sect++) {
soff = toff + (ENC_DSECTOR * sectab[sect]);
// Each sector has a header with some metadata, plus some
// markers and padding.
doff += apple2_enc_sector_header(dest, doff, track, sect);
doff += apple2_enc_sector(dest, src, doff, soff);
// We're moving here in 256-byte blocks
soff += ENC_DSECTOR;
}
return doff - orig;