apple2pi/src/nibread.c
ivanli88 2ed471b804
dump a disk to nibble formate
use command "nibble 40" for 40 tracks
2017-11-03 17:25:55 +08:00

69 lines
2.4 KiB
C

#include "a2lib.c"
#include "stdlib.h"
char readblk[] = {
// ORG $2C0
0xA0, 0x00, 0xA6, 0x43, 0x86, 0x2B, 0xBD, 0x89, 0xC0, 0xAD, 0x8B, 0xC0, 0x98, 0x20, 0x0C, 0xD1,
0xA0, 0x07, 0x20, 0x85, 0xD3, 0x88, 0xD0, 0xFA, 0xA6, 0x43, 0xAD, 0x81, 0xC0, 0x20, 0xE6, 0x02,
0xA6, 0x43, 0xBC, 0x88, 0xC0, 0x60, 0xA9, 0x24, 0x85, 0x45, 0xA9, 0x00, 0x85, 0x44, 0x85, 0x3A,
0xA0, 0x00, 0xC6, 0x44, 0xD0, 0x04, 0xC6, 0x45, 0x30, 0x1F, 0xBD, 0x8C, 0xC0, 0x10, 0xFB, 0xDD,
0x8C, 0xC0, 0xF0, 0x02, 0xD0, 0xEA, 0xC8, 0xC0, 0x18, 0xD0, 0xEF, 0x85, 0x3A, 0xBD, 0x8C, 0xC0,
0x10, 0xFB, 0xC5, 0x3A, 0xF0, 0xF7, 0x85, 0x3B, 0xC8, 0xA9, 0x20, 0x85, 0x45, 0xA9, 0x00, 0x85,
0x44, 0xBD, 0x8C, 0xC0, 0x10, 0xFB, 0x91, 0x44, 0xC8, 0xD0, 0xF6, 0xE6, 0x45, 0xA5, 0x45, 0xC9,
0x3B, 0xD0, 0xEE, 0xA5, 0x3A, 0xF0, 0x5A, 0xA4, 0x3B, 0x8C, 0x18, 0x20, 0xA0, 0x17, 0x99, 0x00,
0x20, 0x88, 0x10, 0xFA, 0xC8, 0xC8, 0xF0, 0x49, 0xB9, 0x18, 0x20, 0xC5, 0x3A, 0xF0, 0xF6, 0x98,
0x18, 0x69, 0x18, 0x8D, 0x63, 0x03, 0xA9, 0x35, 0x85, 0x45, 0xA9, 0x00, 0x85, 0x44, 0xA8, 0xAA,
0xB1, 0x44, 0xDD, 0x18, 0x20, 0xD0, 0x07, 0xE0, 0x0B, 0xF0, 0x12, 0xE8, 0xD0, 0x02, 0xA2, 0x00,
0xC8, 0xD0, 0xED, 0xE6, 0x45, 0xA5, 0x45, 0xC9, 0x3B, 0xD0, 0xE5, 0xF0, 0x14, 0x98, 0x38, 0xE9,
0x0B, 0xA8, 0xA5, 0x3A, 0x91, 0x44, 0xC8, 0xD0, 0xFB, 0xE6, 0x45, 0xA5, 0x45, 0xC9, 0x3B, 0x90,
0xF1, 0x60
};
#define ORG 0x02C0
#define TRACK_NUM 0x02C1
#define DATA_BUFFER 0x2000
char dsk[42][6656];
int main(int argc, char **argv)
{
FILE *dskfile;
char count[2];
int i, result, fd, trk, pifd;
if (argc > 1)
{
i = strtol(argv[1],NULL,10);
pifd = a2open(i > 43 ? argv[1] : "127.0.0.1");
trk = (i < 43 ? i : 35);
}
else
{
pifd = a2open("127.0.0.1");
trk = 35;
}
if (pifd < 0)
{
perror("Unable to connect to Apple II Pi");
exit(EXIT_FAILURE);
}
char volname[] = "nibble.nib";
a2write(pifd, ORG, sizeof(readblk), readblk);
count[0] = 0;
a2write(pifd, TRACK_NUM, 1, count);
a2call(pifd, ORG, &result);
for (i = 0; i < trk; i++)
{
printf("Reading Track #%d\r", i);
fflush(stdout);
count[0] = i;
a2write(pifd, TRACK_NUM, 1, count);
a2call(pifd, ORG, &result);
a2read(pifd, DATA_BUFFER, 6656, dsk[i]);
}
a2close(pifd);
if ((dskfile = fopen(volname, "wb")))
{
fwrite(dsk, 1, trk*6656, dskfile);
fclose(dskfile);
}
return EXIT_SUCCESS;
}