mirror of
https://github.com/pevans/erc-c.git
synced 2025-01-17 19:30:13 +00:00
Use nibbilized size for dest; allow offset to overflow
This commit is contained in:
parent
7ffe2cb527
commit
c031822063
@ -3,6 +3,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "apple2.enc.h"
|
#include "apple2.enc.h"
|
||||||
|
#include "apple2.dd.h"
|
||||||
#include "vm_segment.h"
|
#include "vm_segment.h"
|
||||||
|
|
||||||
static vm_8bit gcr62[] = {
|
static vm_8bit gcr62[] = {
|
||||||
@ -19,22 +20,19 @@ apple2_enc_dos(vm_segment *src)
|
|||||||
vm_segment *dest;
|
vm_segment *dest;
|
||||||
int i, doff = 0;
|
int i, doff = 0;
|
||||||
|
|
||||||
// FIXME: we need to find the actual size of a nibble-ized DO/PO
|
// Use the nibbilized size for a 140k image file
|
||||||
// order file
|
dest = vm_segment_create(_140K_NIB_);
|
||||||
dest = vm_segment_create(500000);
|
|
||||||
|
|
||||||
for (i = 0; i < 35; i++) {
|
for (i = 0; i < 35; i++) {
|
||||||
doff += apple2_enc_track(dest, src, doff, i);
|
doff += apple2_enc_track(dest, src, doff, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("len = %d\n", doff);
|
|
||||||
|
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
apple2_enc_track(vm_segment *dest, vm_segment *src,
|
apple2_enc_track(vm_segment *dest, vm_segment *src,
|
||||||
int doff, int track)
|
int doff, int track)
|
||||||
{
|
{
|
||||||
int soff = track * 4096;
|
int soff = track * 4096;
|
||||||
int orig = doff;
|
int orig = doff;
|
||||||
@ -53,7 +51,7 @@ apple2_enc_track(vm_segment *dest, vm_segment *src,
|
|||||||
doff += apple2_enc_sector(dest, src, doff, soff);
|
doff += apple2_enc_sector(dest, src, doff, soff);
|
||||||
|
|
||||||
// We're moving here in 256-byte blocks
|
// We're moving here in 256-byte blocks
|
||||||
soff += sect * 256;
|
soff += 256;
|
||||||
}
|
}
|
||||||
|
|
||||||
return doff - orig;
|
return doff - orig;
|
||||||
@ -68,7 +66,7 @@ apple2_enc_track(vm_segment *dest, vm_segment *src,
|
|||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
apple2_enc_sector(vm_segment *dest, vm_segment *src,
|
apple2_enc_sector(vm_segment *dest, vm_segment *src,
|
||||||
int doff, int soff)
|
int doff, int soff)
|
||||||
{
|
{
|
||||||
int i, di, orig;
|
int i, di, orig;
|
||||||
vm_8bit lastval, curval;
|
vm_8bit lastval, curval;
|
||||||
@ -86,15 +84,23 @@ apple2_enc_sector(vm_segment *dest, vm_segment *src,
|
|||||||
// initial array.
|
// initial array.
|
||||||
for (i = 0; i < 0x56; i++) {
|
for (i = 0; i < 0x56; i++) {
|
||||||
vm_8bit v = 0, vac, v56, v00;
|
vm_8bit v = 0, vac, v56, v00;
|
||||||
|
vm_8bit offac, off56;
|
||||||
|
|
||||||
|
// We compute the offsets for the values beginning at ac and 56
|
||||||
|
// here, specifically in 8bit variables, because we _want_ any
|
||||||
|
// overflow to be handled within the offset rather than spilling
|
||||||
|
// beyond the border of the segment.
|
||||||
|
offac = i + 0xAC;
|
||||||
|
off56 = i + 0x56;
|
||||||
|
|
||||||
// We do the write by working with the src segment in rough
|
// We do the write by working with the src segment in rough
|
||||||
// thirds. vac is the value offset by 0xAC, which is 0x56 * 2.
|
// thirds. vac is the value offset by 0xAC, which is 0x56 * 2.
|
||||||
// v56 is offset by 0x56, and v00 has no offset. In decimal
|
// v56 is offset by 0x56, and v00 has no offset. In decimal
|
||||||
// terms, vac is 172 bytes offset from 0, and v56 is 86 bytes
|
// terms, vac is 172 bytes offset from 0, and v56 is 86 bytes
|
||||||
// offset from 0.
|
// offset from 0.
|
||||||
vac = vm_segment_get(src, soff+i+0xAC);
|
vac = vm_segment_get(src, soff + offac);
|
||||||
v56 = vm_segment_get(src, soff+i+0x56);
|
v56 = vm_segment_get(src, soff + off56);
|
||||||
v00 = vm_segment_get(src, soff+i);
|
v00 = vm_segment_get(src, soff + i);
|
||||||
|
|
||||||
// The value we ultimately want to write into the dest segment
|
// The value we ultimately want to write into the dest segment
|
||||||
// is then mangled a bit. v begins life as zero, of course; it's
|
// is then mangled a bit. v begins life as zero, of course; it's
|
||||||
|
Loading…
x
Reference in New Issue
Block a user