mirror of
https://github.com/pevans/erc-c.git
synced 2025-02-07 03:30:28 +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:
parent
3ab654c306
commit
508be6458a
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user