aboutsummaryrefslogtreecommitdiff
path: root/dla2csv.c
diff options
context:
space:
mode:
Diffstat (limited to 'dla2csv.c')
-rw-r--r--dla2csv.c88
1 files changed, 57 insertions, 31 deletions
diff --git a/dla2csv.c b/dla2csv.c
index 413229d..8d25728 100644
--- a/dla2csv.c
+++ b/dla2csv.c
@@ -60,11 +60,6 @@ unsigned char masks[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
/* Uncomment this to see elapsed time in convert() */
#define PROFILE
-/* cc65 doesn't "localize" \b to the Atari backspace character, like it
- does for \n. If we needed it:
- #define BS CH_DEL
-*/
-
/* I like these colors. Also they match dla.xex. */
#define TEXT_COLOR 0x0e
#define TEXT_BG_COLOR 0x90
@@ -224,16 +219,10 @@ unsigned char masks[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
(*(OS.dosvec))();
}
- void backspace2(void) {
- OS.colcrs -= 2;
- }
-
void print_converting(void) {
printf("Press Ctrl-C to abort conversion.\n");
OS.crsinh = 1;
- printf("\nConverting... %%");
- putchar(0xa0);
- backspace2();
+ printf("\nConverting...\n");
}
#define enable_cursor() OS.crsinh = 0
@@ -271,10 +260,23 @@ unsigned char masks[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
}
}
+/* bar instead of percentage. j is chosen to range
+ 1 to 80 (not 0 to 79), and this should only be called
+ every other y loop. */
+ void update_progress(unsigned char i) {
+ int j = (i * 200 / 212) + 1;
+ if(j & 1) {
+ putchar(0x19); /* left half block */
+ OS.colcrs--;
+ } else {
+ putchar(0xa0); /* full block */
+ }
+ }
+
#ifdef PROFILE
#define start_profile_clock() OS.rtclok[0] = OS.rtclok[1] = OS.rtclok[2] = 0
#define print_profile_clock() \
- printf("\nElapsed time: %ds\n", ((OS.rtclok[1] << 8) | OS.rtclok[2]) / 60)
+ printf("Elapsed time: %ds\n", ((OS.rtclok[1] << 8) | OS.rtclok[2]) / 60)
#else
#define start_profile_clock()
#define print_profile_clock()
@@ -282,11 +284,6 @@ unsigned char masks[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
#else
/* non-Atari is assumed to be POSIX (and not something like
Commodore or Apple II). */
- #define BS '\b'
- void backspace2(void) {
- putchar(BS);
- putchar(BS);
- }
#define PERROR(x) perror(x)
#define print_banner() print_id()
#define noop()
@@ -298,11 +295,12 @@ unsigned char masks[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
#define start_profile_clock() noop()
#define print_profile_clock() noop()
#define fix_filename() noop()
+ #define update_progress(x) noop()
#define user_abort() 0
#define show_dir() 0
#define EXIT(x) exit(1)
#define exit_eof_stdin() exit(1)
- #define print_converting() printf("\nConverting... %%")
+ #define print_converting() printf("\nConverting...")
#define REGISTER
/* since utoa() only exists on cc65, can't use it on non-Atari. */
void writepoint(unsigned char x, unsigned char y) {
@@ -451,13 +449,30 @@ int read_file(void) {
return bytes;
}
-/* currently, on the 800 with atariserver, convert() takes:
- 5s for a DLA with no points (a file of zeroes).
- 16s for a DLA with 1000 points.
- 9s for the same DLA, with the fputs() in writepoint() commented out.
+/* currently, on the 800 with atariserver, a single-density disk image,
+ and MyDOS (no high-speed SIO) convert() takes:
+
+ - 15s for a DLA with 1000 points.
+ - 8s for the same DLA, with the fputs() in writepoint() commented out.
+ - 3s for a DLA with no points (a file of zeroes).
+
+ writing the same amount of data as the CSV file (6577 bytes)
+ with a single fwrite() takes 5.3s. comparing the first 2 times
+ above, we're taking 7s for our I/O. buffering it up and doing
+ a single write would save about 1.7s. however, for files with
+ lots of points, we might run out of memory (so have to do
+ multiple writes anyway). not worth doing really.
+
+ the progress bar adds very little overhead (around 0.3 sec),
+ compared to printing percentages (0.8 sec).
+
+ what would be worth doing: speed up the pixel-extraction (the
+ x loop and its inner j loop). it's doing ~200 particles/sec,
+ not counting the 3s overhead (~125/sec with overhead).
*/
int convert(void) {
unsigned char x, y, j, pixx;
+ char byte;
REGISTER char *inp = inbuf;
int particles = 0;
@@ -479,17 +494,16 @@ int convert(void) {
clear_keystroke();
return 0;
}
- if(y & 1) {
- backspace2();
- printf("%02d", y * 100 / HEIGHT); /* percentage */
- fflush(stdout);
- }
+ if(y & 1) update_progress(y);
for(x = 0; x < BYTEWIDTH; ++x) {
if(*inp) {
+ #if 1
+ byte = *inp;
pixx = x * 8;
for(j = 0; j < 8; ++j) {
- if(*inp & masks[j]) {
+ if(byte & masks[j]) {
writepoint(pixx + j, y);
+ /* commenting out the error-checking doesn't save time. */
if(ferror(outf)) {
PERROR(stringbuf);
fclose(outf);
@@ -499,6 +513,19 @@ int convert(void) {
particles++;
}
}
+ #else
+ /* unrolling the loop doesn't save time (!) */
+ byte = *inp;
+ pixx = x * 8;
+ if(byte & masks[0]) writepoint(pixx, y);
+ if(byte & masks[1]) writepoint(pixx + 1, y);
+ if(byte & masks[2]) writepoint(pixx + 2, y);
+ if(byte & masks[3]) writepoint(pixx + 3, y);
+ if(byte & masks[4]) writepoint(pixx + 4, y);
+ if(byte & masks[5]) writepoint(pixx + 5, y);
+ if(byte & masks[6]) writepoint(pixx + 6, y);
+ if(byte & masks[7]) writepoint(pixx + 7, y);
+ #endif
}
inp++;
}
@@ -541,8 +568,7 @@ int main(int argc, char **argv) {
if(result >= 0) {
done = 1;
- backspace2();
- printf("100%%\n%d particles.\n", result);
+ printf("%d particles.\n", result);
print_profile_clock();
} else {
if(!prompt_yn("Conversion failed, try again", 1))