1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-06-25 12:29:34 +00:00

Refactor code to pass image type in

This commit is contained in:
Peter Evans 2018-02-21 00:23:12 -06:00
parent 8706a81d1f
commit 61eb880f49
5 changed files with 52 additions and 53 deletions

View File

@ -3,9 +3,9 @@
#include "vm_segment.h" #include "vm_segment.h"
extern int apple2_dec_dos(vm_segment *, vm_segment *); extern int apple2_dec_dos(int, vm_segment *, vm_segment *);
extern int apple2_dec_nib(vm_segment *, vm_segment *); extern int apple2_dec_nib(vm_segment *, vm_segment *);
extern int apple2_dec_sector(vm_segment *, vm_segment *, int, int); extern int apple2_dec_sector(vm_segment *, vm_segment *, int, int);
extern int apple2_dec_track(vm_segment *, vm_segment *, int, int); extern int apple2_dec_track(int, vm_segment *, vm_segment *, int, int);
#endif #endif

View File

@ -193,7 +193,7 @@ apple2_dd_decode(apple2dd *drive)
case DD_DOS33: case DD_DOS33:
case DD_PRODOS: case DD_PRODOS:
apple2_dec_dos(drive->image, drive->data); apple2_dec_dos(drive->image_type, drive->image, drive->data);
break; break;
default: default:

View File

@ -7,6 +7,7 @@
#include <stdbool.h> #include <stdbool.h>
#include "apple2.dd.h"
#include "apple2.dec.h" #include "apple2.dec.h"
#include "apple2.enc.h" #include "apple2.enc.h"
#include "vm_segment.h" #include "vm_segment.h"
@ -33,7 +34,7 @@ static vm_8bit conv6bit[] = {
* given segment. * given segment.
*/ */
int int
apple2_dec_dos(vm_segment *dest, vm_segment *src) apple2_dec_dos(int sectype, vm_segment *dest, vm_segment *src)
{ {
int i, doff, tracklen; int i, doff, tracklen;
@ -42,7 +43,7 @@ apple2_dec_dos(vm_segment *dest, vm_segment *src)
} }
for (i = 0, doff = 0; i < ENC_NUM_TRACKS; i++) { for (i = 0, doff = 0; i < ENC_NUM_TRACKS; i++) {
tracklen = apple2_dec_track(dest, src, doff, i); tracklen = apple2_dec_track(sectype, dest, src, doff, i);
// Something went wrong... // Something went wrong...
if (tracklen != ENC_DTRACK) { if (tracklen != ENC_DTRACK) {
@ -80,18 +81,18 @@ apple2_dec_nib(vm_segment *dest, vm_segment *src)
* This should return ENC_DTRACK bytes; if not, something went wrong. * This should return ENC_DTRACK bytes; if not, something went wrong.
*/ */
int int
apple2_dec_track(vm_segment *dest, vm_segment *src, int doff, int track) apple2_dec_track(int sectype, vm_segment *dest, vm_segment *src, int doff, int track)
{ {
int soff = track * ENC_ETRACK;
int orig = doff; int orig = doff;
int sect, sectlen; int sect, sectlen, soff;
// Tracks have 48 bytes of filler... at least, as we build them soff = (track * ENC_ETRACK) + ENC_ETRACK_HEADER;
// (actual disk media may have more or less, it seems). Let's skip
// what we see.
soff += ENC_ETRACK_HEADER;
for (sect = 0; sect < ENC_NUM_SECTORS; sect++) { for (sect = 0; sect < ENC_NUM_SECTORS; sect++) {
doff =
(track * ENC_DTRACK) +
(apple2_dd_sector_num(sectype, sect) * ENC_DSECTOR);
// This is going to be 256, for all intents and purposes // This is going to be 256, for all intents and purposes
sectlen = apple2_dec_sector(dest, src, doff, soff + ENC_ESECTOR_HEADER); sectlen = apple2_dec_sector(dest, src, doff, soff + ENC_ESECTOR_HEADER);
@ -101,13 +102,7 @@ apple2_dec_track(vm_segment *dest, vm_segment *src, int doff, int track)
return 0; return 0;
} }
doff += sectlen; soff += ENC_ESECTOR;
soff += ENC_ESECTOR + ENC_ESECTOR_HEADER;
}
// Something isn't right...
if (doff - orig != ENC_DTRACK) {
return 0;
} }
return ENC_DTRACK; return ENC_DTRACK;
@ -171,7 +166,7 @@ apple2_dec_sector(vm_segment *dest, vm_segment *src, int doff, int soff)
// The footer_ok variable will be true if the ending byte markers we // The footer_ok variable will be true if the ending byte markers we
// expect to see are actually there. // expect to see are actually there.
int footer = soff + 9 + 0x157; int footer = soff + 3 + 0x157;
bool footer_ok = bool footer_ok =
vm_segment_get(src, footer) == 0xde && vm_segment_get(src, footer) == 0xde &&
vm_segment_get(src, footer + 1) == 0xaa && vm_segment_get(src, footer + 1) == 0xaa &&
@ -186,7 +181,7 @@ apple2_dec_sector(vm_segment *dest, vm_segment *src, int doff, int soff)
// Here we mean to convert the 6-and-2 encoded bytes back into its // Here we mean to convert the 6-and-2 encoded bytes back into its
// first intermediate form // first intermediate form
for (i = 0; i < 0x157; i++) { for (i = 0; i < 0x157; i++) {
conv[i] = conv6bit[vm_segment_get(src, soff + i + 9) & 0x7f]; conv[i] = conv6bit[vm_segment_get(src, soff + i + 3) & 0x7f];
} }
// Originally, we XOR'd each byte when encoding; so we need to do // Originally, we XOR'd each byte when encoding; so we need to do

View File

@ -38,30 +38,34 @@ static vm_8bit f_sector[] = {
* Same as above -- ripped from apple2.enc.c * Same as above -- ripped from apple2.enc.c
*/ */
static vm_8bit f_enc_sector[] = { static vm_8bit f_enc_sector[] = {
0xd5, 0xaa, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xaf, 0x9a, 0xd3, 0xfd, 0xb6, 0xcb, //0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xb5, 0xfa, 0xb5, 0xe6, 0xb9, 0xf3, 0xea, 0xe7, 0xd6, 0xdb, 0xad, 0xb9, 0xfe, 0xe7, 0xfd, 0xeb, //0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfa, 0xee, 0xf3, 0xe9, 0xb7, 0xfa, 0xde, 0xcb, 0xf6, 0xcb, 0xcb, 0x96, 0xfa, 0xec, 0xaf, 0xaf, //0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xcb, 0xcb, 0xf7, 0xee, 0xec, 0xd3, 0xd9, 0xbb, 0xf6, 0xd9, 0xab, 0xbf, 0xcb, 0xcb, 0xb2, 0xa6, 0xd5, 0xaa, 0x96, 0xff, 0xfe, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xfe, 0xde, 0xaa, 0xeb, 0xff, 0xff,
0xcb, 0x97, 0xf4, 0xf5, 0xac, 0xed, 0xb9, 0xad, 0xae, 0xdf, 0xce, 0xe9, 0xb5, 0xb5, 0x9f, 0xab, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xaa, 0xad, 0xf5, 0xaf, 0x9a, 0xd3, 0xfd, 0xb6, 0xcb, 0xb5, 0xfa,
0xe9, 0xbc, 0x9e, 0xde, 0x9a, 0xb3, 0xb6, 0xd3, 0xdd, 0xbe, 0xd7, 0xb2, 0xd6, 0xb5, 0xac, 0xfc, 0xb5, 0xe6, 0xb9, 0xf3, 0xea, 0xe7, 0xd6, 0xdb, 0xad, 0xb9, 0xfe, 0xe7, 0xfd, 0xeb, 0xfa, 0xee,
0xce, 0xbe, 0x9e, 0x9f, 0xaf, 0xac, 0xe6, 0xcf, 0xcb, 0x9b, 0xfe, 0xac, 0xbc, 0xdc, 0xea, 0x9e, 0xf3, 0xe9, 0xb7, 0xfa, 0xde, 0xcb, 0xf6, 0xcb, 0xcb, 0x96, 0xfa, 0xec, 0xaf, 0xaf, 0xcb, 0xcb,
0xcd, 0xdd, 0xff, 0xfe, 0x9b, 0xf2, 0xbc, 0xce, 0xcf, 0xbd, 0xdc, 0xda, 0xfe, 0xcb, 0xb4, 0xb6, 0xf7, 0xee, 0xec, 0xd3, 0xd9, 0xbb, 0xf6, 0xd9, 0xab, 0xbf, 0xcb, 0xcb, 0xb2, 0xa6, 0xcb, 0x97,
0xdf, 0x9d, 0xb3, 0xde, 0xf2, 0x9a, 0xf9, 0x9b, 0xb5, 0xf9, 0xfc, 0xe9, 0xce, 0xff, 0xfc, 0xbd, 0xf4, 0xf5, 0xac, 0xed, 0xb9, 0xad, 0xae, 0xdf, 0xce, 0xe9, 0xb5, 0xb5, 0x9f, 0xab, 0xe9, 0xbc,
0x9a, 0xad, 0xce, 0xbc, 0xbd, 0x97, 0xf4, 0xb5, 0xad, 0x9b, 0xb6, 0xfa, 0xa6, 0xf3, 0xfc, 0xb2, 0x9e, 0xde, 0x9a, 0xb3, 0xb6, 0xd3, 0xdd, 0xbe, 0xd7, 0xb2, 0xd6, 0xb5, 0xac, 0xfc, 0xce, 0xbe,
0xaf, 0xdf, 0xd7, 0xb6, 0xf4, 0xdb, 0xbd, 0xac, 0xfc, 0xfb, 0xeb, 0x96, 0xcd, 0xaf, 0xfc, 0xb6, 0x9e, 0x9f, 0xaf, 0xac, 0xe6, 0xcf, 0xcb, 0x9b, 0xfe, 0xac, 0xbc, 0xdc, 0xea, 0x9e, 0xcd, 0xdd,
0xf5, 0xf4, 0x9f, 0xdc, 0xe6, 0xb3, 0xa7, 0xba, 0xbd, 0xcb, 0xe7, 0xed, 0x9d, 0xee, 0xf5, 0xea, 0xff, 0xfe, 0x9b, 0xf2, 0xbc, 0xce, 0xcf, 0xbd, 0xdc, 0xda, 0xfe, 0xcb, 0xb4, 0xb6, 0xdf, 0x9d,
0xbb, 0xcd, 0xbd, 0xce, 0xfa, 0xf5, 0xb6, 0x97, 0xce, 0xf6, 0xbd, 0xf4, 0xad, 0xed, 0xbe, 0xfa, 0xb3, 0xde, 0xf2, 0x9a, 0xf9, 0x9b, 0xb5, 0xf9, 0xfc, 0xe9, 0xce, 0xff, 0xfc, 0xbd, 0x9a, 0xad,
0xdc, 0xf2, 0xfb, 0xdf, 0xbd, 0xbb, 0xb2, 0xbc, 0xf4, 0xfe, 0xed, 0xa7, 0xdd, 0xab, 0xdf, 0xda, 0xce, 0xbc, 0xbd, 0x97, 0xf4, 0xb5, 0xad, 0x9b, 0xb6, 0xfa, 0xa6, 0xf3, 0xfc, 0xb2, 0xaf, 0xdf,
0xee, 0xdc, 0xfa, 0xda, 0xeb, 0xb3, 0xd7, 0xb3, 0xdd, 0xfe, 0xbd, 0xb6, 0xbf, 0xb2, 0xb3, 0xf9, 0xd7, 0xb6, 0xf4, 0xdb, 0xbd, 0xac, 0xfc, 0xfb, 0xeb, 0x96, 0xcd, 0xaf, 0xfc, 0xb6, 0xf5, 0xf4,
0xda, 0xeb, 0xcd, 0xfb, 0xf2, 0xae, 0x9e, 0xdd, 0xe7, 0xec, 0xe6, 0xf3, 0xee, 0xcd, 0xd6, 0xd9, 0x9f, 0xdc, 0xe6, 0xb3, 0xa7, 0xba, 0xbd, 0xcb, 0xe7, 0xed, 0x9d, 0xee, 0xf5, 0xea, 0xbb, 0xcd,
0xb6, 0xa6, 0x9a, 0xf5, 0xdf, 0xe9, 0xa7, 0xba, 0xf3, 0x9f, 0xf3, 0xab, 0xb2, 0x97, 0xda, 0xef, 0xbd, 0xce, 0xfa, 0xf5, 0xb6, 0x97, 0xce, 0xf6, 0xbd, 0xf4, 0xad, 0xed, 0xbe, 0xfa, 0xdc, 0xf2,
0xf3, 0xb5, 0xb4, 0xee, 0x9f, 0xfb, 0xff, 0xb9, 0xee, 0xdb, 0xdd, 0xaf, 0xdb, 0xce, 0xbf, 0xe7, 0xfb, 0xdf, 0xbd, 0xbb, 0xb2, 0xbc, 0xf4, 0xfe, 0xed, 0xa7, 0xdd, 0xab, 0xdf, 0xda, 0xee, 0xdc,
0xe5, 0x97, 0xdb, 0xbe, 0xe9, 0x9f, 0x9a, 0x9b, 0xab, 0xaf, 0xdc, 0x9b, 0xcb, 0x96, 0x9b, 0xa7, 0xfa, 0xda, 0xeb, 0xb3, 0xd7, 0xb3, 0xdd, 0xfe, 0xbd, 0xb6, 0xbf, 0xb2, 0xb3, 0xf9, 0xda, 0xeb,
0xfb, 0xaf, 0xf2, 0xcb, 0xea, 0xf5, 0xf9, 0xce, 0x9a, 0xfc, 0xdc, 0xef, 0xbb, 0xeb, 0xfa, 0xde, 0xcd, 0xfb, 0xf2, 0xae, 0x9e, 0xdd, 0xe7, 0xec, 0xe6, 0xf3, 0xee, 0xcd, 0xd6, 0xd9, 0xb6, 0xa6,
0xb3, 0xbb, 0xb3, 0xaf, 0xbe, 0xb9, 0xbc, 0x97, 0xad, 0xcd, 0xea, 0xba, 0x9b, 0xea, 0xfe, 0xe7, 0x9a, 0xf5, 0xdf, 0xe9, 0xa7, 0xba, 0xf3, 0x9f, 0xf3, 0xab, 0xb2, 0x97, 0xda, 0xef, 0xf3, 0xb5,
0xf3, 0xb5, 0xd6, 0xad, 0xf9, 0xee, 0xea, 0xe6, 0xfd, 0xdb, 0x9b, 0xfd, 0xf4, 0x96, 0xdf, 0xdf, 0xb4, 0xee, 0x9f, 0xfb, 0xff, 0xb9, 0xee, 0xdb, 0xdd, 0xaf, 0xdb, 0xce, 0xbf, 0xe7, 0xe5, 0x97,
0xde, 0xaa, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbe, 0xe9, 0x9f, 0x9a, 0x9b, 0xab, 0xaf, 0xdc, 0x9b, 0xcb, 0x96, 0x9b, 0xa7, 0xfb, 0xaf,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xcb, 0xea, 0xf5, 0xf9, 0xce, 0x9a, 0xfc, 0xdc, 0xef, 0xbb, 0xeb, 0xfa, 0xde, 0xb3, 0xbb,
0xb3, 0xaf, 0xbe, 0xb9, 0xbc, 0x97, 0xad, 0xcd, 0xea, 0xba, 0x9b, 0xea, 0xfe, 0xe7, 0xf3, 0xb5,
0xd6, 0xad, 0xf9, 0xee, 0xea, 0xe6, 0xfd, 0xdb, 0x9b, 0xfd, 0xf4, 0x96, 0xdf, 0xdf, 0xde, 0xaa,
0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
}; };
static vm_segment *seg; static vm_segment *seg;
@ -83,13 +87,13 @@ TestSuite(apple2_dec, .init = setup, .fini = teardown);
Test(apple2_dec, sector) Test(apple2_dec, sector)
{ {
vm_segment *src, *dest; vm_segment *src, *dest;
int len;
src = vm_segment_create(1000); src = vm_segment_create(1000);
dest = vm_segment_create(1000); dest = vm_segment_create(1000);
vm_segment_copy_buf(src, f_enc_sector, 0, 0, 382); vm_segment_copy_buf(src, f_enc_sector, 0, 0, 396);
cr_assert_eq(apple2_dec_sector(dest, src, 0, ENC_ESECTOR_HEADER), 256);
cr_assert_eq(apple2_dec_sector(dest, src, 0, 0), 256);
for (int i = 0; i < 256; i++) { for (int i = 0; i < 256; i++) {
cr_assert_eq(vm_segment_get(dest, i), f_sector[i]); cr_assert_eq(vm_segment_get(dest, i), f_sector[i]);
@ -111,8 +115,8 @@ Test(apple2_dec, track)
vm_segment_set(orig, i, 0xff); vm_segment_set(orig, i, 0xff);
} }
apple2_enc_track(enc, orig, sectab, 0, 0); apple2_enc_track(DD_DOS33, enc, orig, 0, 0);
apple2_dec_track(dec, enc, 0, 0); apple2_dec_track(DD_DOS33, dec, enc, 0, 0);
for (i = 0; i < ENC_DTRACK; i++) { for (i = 0; i < ENC_DTRACK; i++) {
cr_assert_eq(vm_segment_get(dec, i), cr_assert_eq(vm_segment_get(dec, i),
@ -128,10 +132,10 @@ Test(apple2_dec, dos)
int i; int i;
vm_segment_fread(seg, fp, 0, _140K_); vm_segment_fread(seg, fp, 0, _140K_);
enc = apple2_enc_dos(seg, sectab); enc = apple2_enc_dos(DD_DOS33, seg);
dec = vm_segment_create(1000000); dec = vm_segment_create(_140K_);
apple2_dec_dos(dec, enc); cr_assert_eq(apple2_dec_dos(DD_DOS33, dec, enc), OK);
for (i = 0; i < seg->size; i++) { for (i = 0; i < seg->size; i++) {
cr_assert_eq(vm_segment_get(seg, i), cr_assert_eq(vm_segment_get(seg, i),

Binary file not shown.