From e8d7907a7d17b7f25aa6002af37a4325d4523cb6 Mon Sep 17 00:00:00 2001 From: ivanli88 Date: Fri, 3 Nov 2017 17:17:56 +0800 Subject: [PATCH] add 40 track support --- src/dskwrite.c | 197 +++++++++++++++++++++++++++---------------------- 1 file changed, 109 insertions(+), 88 deletions(-) diff --git a/src/dskwrite.c b/src/dskwrite.c index 2922063..71b6617 100755 --- a/src/dskwrite.c +++ b/src/dskwrite.c @@ -1,88 +1,109 @@ -#include "a2lib.c" - -char online[] = { -// ORG $301 - 0x20, 0x00, 0xBF, // JSR $BF00 (PRODOS) - 0xC5, // DB ON_LINE - 0x08, 0x03, // DW PARAMS - 0x60, // RTS -// PARAMS @ $308 - 0x02, // PARAM_COUNT - 0x60, // UNIT_NUM = DRIVE 0, SLOT 6 - 0x00, 0x20 // DATA_BUFFER = $2000 -}; -char writeblk[] = { -// ORG $301 - 0x20, 0x00, 0xBF, // JSR $BF00 (PRODOS) - 0x81, // DB WRITE_BLOCK - 0x08, 0x03, // DW PARAMS - 0x60, // RTS -// PARAMS @ $308 - 0x03, // PARAM_COUNT - 0x60, // UNIT_NUM = DRIVE 0, SLOT 6 - 0x00, 0x20, // DATA_BUFFER = $2000 - 0x00, 0x00 // BLOCK_NUM -}; -#define ORG 0x0301 -#define BLOCK_NUM 0x030C -#define DATA_BUFFER 0x2000 -char dsk[280][512]; - -int main(int argc, char **argv) -{ - FILE *dskfile; - char count[2], volname[21]; - int i, result, fd; - int pifd = a2open(argc > 2 ? argv[2] : "127.0.0.1"); - if (pifd < 0) - { - perror("Unable to connect to Apple II Pi"); - exit(EXIT_FAILURE); - } - if (argc < 2) - { - perror("Usage: dskwrite [ip address]\n"); - exit(EXIT_FAILURE); - } - sleep(1); - fflush(stdin); - a2write(pifd, ORG, sizeof(online), online); - a2call(pifd, ORG, &result); - if (result == 0) - { - a2read(pifd, DATA_BUFFER, 16, volname); - volname[(volname[0] & 0x0F) + 1] = '\0'; - printf("Are you sure you want to overwrite volume :%s?", volname + 1); - fflush(stdout); - fgets(count, 2, stdin); - if (count[0] != 'y' && count[0] != 'Y') - { - a2close(pifd); - exit(EXIT_FAILURE); - } - } - if ((dskfile = fopen(argv[1], "rb"))) - { - fread(dsk, 1, 280*512, dskfile); - fclose(dskfile); - } - else - { - perror("Unable to read .PO file\n"); - a2close(pifd); - exit(EXIT_FAILURE); - } - a2write(pifd, ORG, sizeof(writeblk), writeblk); - for (i = 0; i < 280; i++) - { - printf("Writing block #%d\r", i); - fflush(stdout); - count[0] = i; - count[1] = i >> 8; - a2write(pifd, DATA_BUFFER, 512, dsk[i]); - a2write(pifd, BLOCK_NUM, 2, count); - a2call(pifd, ORG, &result); - } - a2close(pifd); - return EXIT_SUCCESS; -} +#include "a2lib.c" + +char online[] = { +// ORG $301 + 0x20, 0x00, 0xBF, // JSR $BF00 (PRODOS) + 0xC5, // DB ON_LINE + 0x08, 0x03, // DW PARAMS + 0x60, // RTS +// PARAMS @ $308 + 0x02, // PARAM_COUNT + 0x60, // UNIT_NUM = DRIVE 0, SLOT 6 + 0x00, 0x20 // DATA_BUFFER = $2000 +}; +char writeblk[] = { +// ORG $301 + 0x20, 0x00, 0xBF, // JSR $BF00 (PRODOS) + 0x81, // DB WRITE_BLOCK + 0x08, 0x03, // DW PARAMS + 0x60, // RTS +// PARAMS @ $308 + 0x03, // PARAM_COUNT + 0x60, // UNIT_NUM = DRIVE 0, SLOT 6 + 0x00, 0x20, // DATA_BUFFER = $2000 + 0x00, 0x00 // BLOCK_NUM +}; +char chgmtrk[] = { +// ORG $301 + 0xAD, 0x8B, 0xC0, 0xAD, 0x8B, 0xC0, 0xAD, 0xE3, + 0xD6, 0xC9, 0x18, 0xD0, 0x05, 0xA9, 0x40, 0x8D, + 0xE3, 0xD6, 0xAD, 0x81, 0xC0, 0x60 +}; +#define ORG 0x0301 +#define BLOCK_NUM 0x030C +#define DATA_BUFFER 0x2000 + +char dsk[320][512]; + +int main(int argc, char **argv) +{ + FILE *dskfile; + char count[2], volname[21]; + long fsize; + int i, result, fd, dblock; + int pifd = a2open(argc > 2 ? argv[2] : "127.0.0.1"); + if (pifd < 0) + { + perror("Unable to connect to Apple II Pi"); + exit(EXIT_FAILURE); + } + if (argc < 2) + { + perror("Usage: dskwrite [ip address]\n"); + exit(EXIT_FAILURE); + } + sleep(1); + fflush(stdin); + + a2write(pifd, ORG, sizeof(online), online); + a2call(pifd, ORG, &result); + + if (result == 0) + { + a2read(pifd, DATA_BUFFER, 16, volname); + volname[(volname[0] & 0x0F) + 1] = '\0'; + printf("Are you sure you want to overwrite volume :%s?", volname + 1); + fflush(stdout); + fgets(count, 2, stdin); + if (count[0] != 'y' && count[0] != 'Y') + { + a2close(pifd); + exit(EXIT_FAILURE); + } + } + a2write(pifd, ORG, sizeof(chgmtrk), chgmtrk); + a2call(pifd, ORG, &result); + + if ((dskfile = fopen(argv[1], "rb"))) + { + + fseek(dskfile, 0, SEEK_END); + fsize = ftell(dskfile); + fseek(dskfile, 0 , SEEK_SET); + + dblock = fsize / 512; + fread(dsk, 1, fsize , dskfile); + fclose(dskfile); + } + else + { + perror("Unable to read .PO file\n"); + a2close(pifd); + exit(EXIT_FAILURE); + } + a2write(pifd, ORG, sizeof(writeblk), writeblk); + + for (i = 0; i < dblock; i++) + { + printf("Writing block #%d\r", i); + fflush(stdout); + count[0] = i; + count[1] = i >> 8; + a2write(pifd, DATA_BUFFER, 512, dsk[i]); + a2write(pifd, BLOCK_NUM, 2, count); + a2call(pifd, ORG, &result); + } + + a2close(pifd); + return EXIT_SUCCESS; +}