aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2022-11-09 17:12:04 -0500
committerB. Watson <urchlay@slackware.uk>2022-11-09 17:12:04 -0500
commit72e6cbfc6a4b4606f11a6d5285de65238dc0dbd4 (patch)
tree7abed0201fbfb1529c479b1d9f7bed4c77945f69
parent31e99ed8e4f83d98afb744fbc880b1c9685b556b (diff)
downloaddla-asm-72e6cbfc6a4b4606f11a6d5285de65238dc0dbd4.tar.gz
Added dla2csv, dla2img. Split up docs.
-rw-r--r--.gitignore1
-rw-r--r--ALGORITHM.txt24
-rw-r--r--BUILD.txt33
-rw-r--r--Makefile32
-rw-r--r--NOTES.txt54
-rw-r--r--README.txt141
-rw-r--r--avgtime.pl19
-rw-r--r--dla2csv.c155
-rwxr-xr-xdla2img.sh68
-rw-r--r--dlatbl.s2077
-rw-r--r--mkdlatbl.pl11
11 files changed, 2540 insertions, 75 deletions
diff --git a/.gitignore b/.gitignore
index 8d68f59..a211ed5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
-dlatbl.s
.*.swp
*.o
*.xex
diff --git a/ALGORITHM.txt b/ALGORITHM.txt
new file mode 100644
index 0000000..5b6e00b
--- /dev/null
+++ b/ALGORITHM.txt
@@ -0,0 +1,24 @@
+DLA Algorithm
+-------------
+
+The algorithm works like this:
+
+1. The initial "seed" pixels are drawn.
+
+2. Each particle starts on the edge of a circle whose center is the
+ center of the screen. The circle's radius depends on the number
+ of particles that have been rendered so far: radius is 15 for
+ particles 1 to 100, 30 for particles 101 to 300, 45 for particles
+ 301 to 600, and 75 for particles 601 and up.
+
+3. Walk the particle around randomly. For each step, pick a random one
+ of the 4 cardinal directions (no diagonals).
+
+4. If the particle goes "out of bounds" (see below), respawn it and
+ try again (without incrementing the particle counter).
+
+5. If the particle is ever adjacent to a set pixel, it gets stuck
+ there, the particle counter is incremented, and we go back to step 2.
+
+When the particle counter reaches the max (the number the user
+entered), the process is complete.
diff --git a/BUILD.txt b/BUILD.txt
new file mode 100644
index 0000000..e28a41e
--- /dev/null
+++ b/BUILD.txt
@@ -0,0 +1,33 @@
+To build the DLA suite, you need a Unix/GNU like system (which might
+even be modern Windows), with the following software installed:
+
+- Required: A "make" command. This can be GNU or BSD make. The
+ Makefile doesn't use any special features, so pretty much any
+ version should be OK.
+
+- Required: "cl65", from CC65, the cross-compiler for the 6502. Any
+ recent version should do; I used 2.19.
+
+- Optional: "perl", the Perl 5 interpreter. Only used to generate the
+ file dlatbl.s. You only need Perl if you're going to modify the data
+ tables (the mkdlatbl.pl script).
+
+- Optional: "cc", a host C compiler (e.g. gcc or clang). Only used for
+ compiling dla2csv for the host.
+
+You should be able to build everything from a terminal by typing
+"make" in the source directory.
+
+Ideally, all the software should be found in your $PATH. If not,
+you can set the full paths by defining them on the make command line.
+Example that sets all 3:
+
+make CL65=/opt/cc65/bin/cl65 PERL=/usr/local/perl/bin/perl5 CC=/usr/bin/clang
+
+Also you could set CFLAGS and CL65FLAGS, if you can think of a reason
+to do that.
+
+If you have trouble building on Linux, ask me for help. I can be found
+on irc.libera.chat in the ##atari channel, as user name Urchlay. If
+you have trouble on other OSes, ask someone who actually knows about
+your OS (not me, I don't do Windows or Mac).
diff --git a/Makefile b/Makefile
index 2c28fc8..802a2bd 100644
--- a/Makefile
+++ b/Makefile
@@ -1,20 +1,42 @@
-CL65 = cl65
-CL65FLAGS =
-PERL = perl
+# Makefile for dla-asm.
+# See https://slackware.uk/~urchlay/repos/dla-asm
-all: dla.xex
+CL65=cl65
+CL65FLAGS=
+
+PERL=perl
+
+CC=cc
+CFLAGS=-O2 -Wall
+
+all: dla.xex dla2csv dla2csv.xex
dla.xex: dla.s io.s dlatbl.s xex.inc printint.s render.s drunkwalk.s
$(CL65) $(CL65FLAGS) -l dla.list -Ln dla.labels -t none -o dla.xex dla.s
+dla2csv.xex: dla2csv.c
+
dlatbl.s: mkdlatbl.pl
$(PERL) mkdlatbl.pl > dlatbl.s
+dla2csv: dla2csv.c
+ @echo $(CC) $(CFLAGS) -o dla2csv dla2csv.c ; \
+ $(CC) $(CFLAGS) -o dla2csv dla2csv.c \
+ || echo "Couldn't build host dla2csv; continuing without it"
+
clean:
- rm -f dla.xex dlatbl.s dla.list dla.labels *.o
+ rm -f dla.xex dla2csv dla2csv.xex dla.list dla.labels *.o
+
+distclean: clean
+ rm -f dlatbl.s
test: all
atari800 dla.xex
%.xex: %.s
$(CL65) $(CL65FLAGS) -t none -o $@ $<
+
+# turn off unused parameter warnings because cc65 insists on complaining
+# that argc and argv are unused.
+%.xex: %.c
+ $(CL65) $(CL65FLAGS) -t atari -W -unused-param -o $@ $<
diff --git a/NOTES.txt b/NOTES.txt
new file mode 100644
index 0000000..f6b0a72
--- /dev/null
+++ b/NOTES.txt
@@ -0,0 +1,54 @@
+dla.xex notes
+-------------
+
+The way I use ca65 is unusual: I build Atari code with "-t none"
+instead of "-t atari", and I generate my own XEX file headers (see
+xex.inc) instead of using the cc65 linker. This is because cc65's
+default atari linker script doesn't support multi-segment executables,
+and it's a royal PITA to write a custom cc65 linker scripts. Also
+because it makes ca65 behave more like Mac/65, which was my go-to
+assembler back in the old days.
+
+It might be possible to optimize this a bit further, maybe shave a
+few percent off the run time. drunkwalk.s contains the innermost loop,
+which has been unrolled and cycle-counted.
+
+During generation, the ANTIC chip's DMA is disabled, to speed things
+up. There wouldn't be anything to see anyway: the generation process
+works with unpacked pixels (one per byte), so the ANTIC couldn't
+display them properly. At the end, when all the particles are done,
+the unpacked pixels are packed into bytes for display. Using unpacked
+pixels is faster than doing all the shift-and-mask operations needed
+for packed pixels, but it also uses a lot of memory (48K required, so
+it won't run on my poor old 400).
+
+Packing the pixels is a slow process, takes about 0.6 seconds. Since
+it happens only once at the end of a 3+ minute process, it's probably
+not worth trying to optimize. See render.s. Also, at the start of
+generation, 28K of memory has to be cleared, which takes 0.3 seconds.
+
+There might be a quick way to limit the particles' movement outside
+the initial circle's radius. Right now, it's limited to a square area;
+width and height are the diameter of the circle plus 10 pixels. The
+corners of this square waste a lot of time; it'd be better to come up
+with a way to do an octagon (the square with the corners cut off),
+which shouldn't slow down the inner loop too much... I actually did
+implement this, but it was too slow (the time spent in calculations
+was longer than the time saved by doing them).
+
+Rather than calculate points on a circle in asm code, the tables of
+points for the 4 circle sizes are pre-calculated by a perl script
+and included in the executable verbatim. The tables bloat the code
+some (2KB), but the speed boost is well worth it. Also, the graphics
+mode used is "graphics 8", but in ANTIC narrow playfield mode, so
+the X resolution is 256... meaning I don't need two bytes for the X
+cursor position (which saves a good bit of time). The code that plots
+pixels doesn't use CIO to do so (it writes directly to the screen
+memory), which also saves time. There's no floating point math in the
+generation process: if there were, the asm version wouldn't be all
+that much faster than the BASIC one...
+
+It *does* use floating point to print integers (the default number of
+particles in the prompt) and calculate the elapsed time in mmss.s. I
+thought it would be easier to code that way; I'd forgot what a PITA
+the FP ROM is. It works now, so I won't change it.
diff --git a/README.txt b/README.txt
index 0c64a2c..ea245a6 100644
--- a/README.txt
+++ b/README.txt
@@ -8,23 +8,29 @@ form aggregates of such particles.
For a good description of DLA, see:
https://en.wikipedia.org/wiki/Diffusion_limited_aggregation
-This Atari 8-bit implementation is written in 6502 assembly, using the
-ca65 assembler from the cc65 suite: https://cc65.github.io/
+The original version of this was in Atari BASIC, by ChrisTOS. It can
+be found at https://github.com/ctzio/DLA/
+
+This assembly version is by B. Watson (urchlay@slackware.com, Urchlay
+on libera.chat IRC). The code is licensed under the WTFPL: do WTF you
+want with it. It's written in 6502 assembly, using the ca65 assembler
+from the cc65 suite: https://cc65.github.io/
+
+Also included are support tools to convert the results to CSV or
+image files.
+
+This file explains how to use the generator and tools. Other
+documentation:
-Building
---------
+ALGORITHM.txt - English description of what the program does.
-You need a Unix/GNU like system (which might even be modern
-Windows), with GNU (or possibly BSD) make, Perl 5, and the CC65 tools
-installed. Provided you have all that, simply type "make" to assemble
-the source.
+BUILD.txt - Instructions for building from source. Most users won't
+want or need to do this, since Atari executables are provided.
-If you have trouble building on Linux, ask me for help. If you have
-trouble on other OSes, ask someone who actually knows about your OS
-(not me, I don't do Windows or Mac).
+NOTES.txt - Technical details about the implementation.
-Running
--------
+Using dla.xex
+-------------
The executable is called "dla.xex", and is a standard Atari binary
load file. It can be run in the same way you run any other .xex files,
@@ -45,14 +51,10 @@ center of the screen. Other seeds generate different types of image,
and run faster than the dot; try them all.
After you enter the seed type, the screen will clear and go solid
-black, while the image is generated. The ANTIC chip's DMA is disabled,
-to speed things up. However, you can "peek" at the progress of the
-generator by holding down the Start key. This will show the work in
-progress, but it will slow things down noticeably.
+black, while the image is generated. Be patient...
-After the image is finished generating, the screen DMA will be turned
-back on, so you can see it. The bottom line shows a menu, from which
-you can choose to:
+After the image is finished generating, the image will be displayed.
+The bottom line shows a menu, from which you can choose to:
- Save: Save the image to disk. You'll be prompted for a filename,
which must be a complete filespec (examples: D:TEST.DLA,
@@ -69,64 +71,69 @@ you can choose to:
The only way to exit the program (for now) is to press Reset or power
cycle the Atari.
-Algorithm
----------
+Using dla2csv.xex (or just dla2csv)
+-----------------------------------
-The algorithm works like this:
+This program operates almost identically whether it's running on an
+Atari or a modern machine.
-1. The initial "seed" pixels are drawn.
+First, you will be prompted for an input filename. On the Atari, you
+must include the drive specifier (e.g. D:TEST.DLA or D2:FOO.DLA). This
+must be a file created by the Save option in dla.xex. The file is read
+into memory immediately.
-2. Each particle starts on the edge of a circle whose center is the
-center of the screen. The circle's radius depends on the number of
-particles that have been rendered so far: radius is 15 for particles 1
-to 100, 30 for particles 101 to 300, 45 for particles 301 to 600, and
-75 for particles 601 and up.
+Next, choose the line-ending type. Choices are Atari, Unix, and MS
+(aka MS-DOS or Windows). Choose the system under which you'll be
+actually using the CSV file.
-3. Walk the particle around randomly. For each step, pick a random one
-of the 4 cardinal directions (no diagonals).
+Next, you're asked for the output filename. On the Atari, this must
+include the drive specifier (e.g. D:OUTPUT.CSV). This file will be
+overwritten if it exists (unless of course it can't be overwritten due
+to permissions or the Atari locked-file bit).
-4. If the particle goes "out of bounds" (see below), respawn it and
-try again (without incrementing the particle counter).
+Next, the conversion process starts. This takes about one minute on
+the Atari, and is instantaneous on a modern machine. Progress is shown
+as a percentage. When it's finished, the output CSV file has been
+written.
-5. If the particle is ever adjacent to a set pixel, it gets stuck
-there, the particle counter is incremented, and we go back to step 2.
+Last, you're asked whether to convert another file. Answering N here
+will exit the program. On the Atari, you should be returned to the DOS
+menu or prompt, but your mileage may vary (it works on DOS 2.0S, at
+least). Answering Y (or just pressing Return) starts the whole process
+over at the input filename prompt.
-When the particle counter reaches the max (the number the user
-entered), the process is complete.
+Using dla2img.sh
+----------------
-Notes
------
+This is a shell script that calls ImageMagick's "magick" binary. For
+it to work, you'll have to install your OS's image-magick package(s)
+(or whatever it's actually called), or (I suppose) compile your own
+ImageMagick from source (not recommended).
-It should be possible to optimize this a bit further, maybe shave
-another 5% to 10% off the run time.
+Run dla2img.sh from a terminal (a shell). The script has built-in
+help, which can be viewed by running it with no arguments.
-There might be a quick way to limit the particles' movement outside
-the initial circle's radius. Right now, it's limited to a square area;
-width and height are the diameter of the circle plus 10 pixels. The
-corners of this square waste a lot of time; it'd be better to come up
-with a way to do an octagon (the square with the corners cut off),
-which shouldn't slow down the inner loop too much... I actually did
-implement this, but it was too slow (the time spent in calculations
-was longer than the time saved by doing them).
+Examples:
-Tech stuff: rather than calculate points on a circle in asm code,
-the tables of points for the 4 circle sizes are pre-calculated by a
-perl script and included in the executable verbatim. The tables bloat
-the code some (2KB), but the speed boost is well worth it. Also, the
-graphics mode used is "graphics 8", but in ANTIC narrow playfield
-mode, so the X resolution is 256... meaning I don't need two bytes
-for the X cursor position (which saves a good bit of time). The code
-that plots pixels doesn't use CIO to do so (it writes directly to the
-screen memory), which also saves time. There's no floating point math
-in the generation process: if there were, the asm version wouldn't be
-all that much faster than the BASIC one...
+# convert TEST.DLA to a 256x170 PNG image:
+./dla2img.sh TEST.DLA test.png
-Author
-------
+# as above, but automatically crop the black borders:
+./dla2img.sh TEST.DLA test.png -trim
-The original version of this was in Atari BASIC, by ChrisTOS. It can
-be found at https://github.com/ctzio/DLA/
+# other image types are supported ("magick -list format" to see them all):
+./dla2img.sh TEST.DLA test.bmp
+./dla2img.sh TEST.DLA test.jpg
+./dla2img.sh TEST.DLA test.tiff
-This assembly version is by B. Watson (urchlay@slackware.com, Urchlay
-on libera.chat IRC). The code is licensed under the WTFPL: do WTF you
-want with it.
+If the conversion succeeds, there is no output in the terminal (no
+news is good news). If you get a "magick: command not found" error,
+you don't have ImageMagick installed correctly.
+
+If your magick binary is in a non-standard location (not in the
+shell's $PATH), you can run it as e.g.:
+
+MAGICK=/path/to/magick ./dla2img.sh [arguments]
+
+dla2img.sh has been tested with various shells, including bash, zsh, ksh93,
+mksh, and dash.
diff --git a/avgtime.pl b/avgtime.pl
new file mode 100644
index 0000000..8d7f656
--- /dev/null
+++ b/avgtime.pl
@@ -0,0 +1,19 @@
+#!/usr/bin/perl -w
+
+my $total;
+my $count;
+
+while(<>) {
+ my ($mm, $ss, $cc) = /^(\d+):(\d+)\.(\d+)/;
+ my $sec = $mm * 60 + $ss + $cc / 100;
+ $total += $sec;
+ $count++;
+}
+
+$avg = $total / $count;
+$mm = int($avg / 60);
+$ss = $avg - ($mm * 60);
+$cs = $ss - int($ss);
+$cs *= 100;
+$ss = int($ss);
+printf "avg time: %02d:%02d.%02d\n", $mm, $ss, $cs;
diff --git a/dla2csv.c b/dla2csv.c
new file mode 100644
index 0000000..4605761
--- /dev/null
+++ b/dla2csv.c
@@ -0,0 +1,155 @@
+/* dla2csv.c - convert dla.xex save files to CSV.
+ Rather bloated and slow by Atari standards. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define HEIGHT 170
+#define WIDTH 256
+
+/* cc65 doesn't fold constants, it won't let us do this:
+ #define INBUF_SIZE (WIDTH * HEIGHT)
+ ...it has to be a *constant*. */
+#define INBUF_SIZE 5440
+
+/* cc65 doesn't "localize" \b to the Atari backspace character, so: */
+#ifdef __ATARI__
+ #define BS '\x7e'
+#else
+ #define BS '\b'
+#endif
+
+char inbuf[INBUF_SIZE];
+
+FILE *inf, *outf;
+
+char stringbuf[256];
+
+/* don't use "\n" or "\r\n" on the right hand side, use explicit
+ hex codes, to avoid cc65 tampering with them. */
+char *eoltypes[][2] = {
+ { "Atari ($9B)", "\x9b" },
+ { "Unix (\\n)", "\x0a" },
+ { "MS (\\r\\n)", "\x0d\x0a" },
+ { NULL, NULL }
+};
+
+/* read a string from stdin (E: on the Atari). there could
+ be error checking here, but there's not. */
+void readstring(void) {
+ fgets(stringbuf, 256, stdin);
+}
+
+/* prompt for a filename, try to open it. if there's an error,
+ show error message and retry. will not return until it
+ opens the file.
+ there could be code here to prepend D: if it's missing, but
+ there isn't.
+ */
+FILE *prompt_filename(const char *name, const char *mode) {
+ FILE *f = NULL;
+ while(f == NULL) {
+ printf("\n%s file: ", name);
+ fflush(stdout);
+ readstring();
+ stringbuf[strlen(stringbuf) - 1] = '\0';
+ f = fopen(stringbuf, mode);
+ if(!f) perror(stringbuf);
+ }
+ return f;
+}
+
+/* prompt for and read EOL type, retry if needed. will not return
+ until a valid number was entered. */
+char *prompt_eol(void) {
+ int i;
+
+ putchar('\n');
+ for(i = 0; eoltypes[i][0] != NULL; i++) {
+ printf("%d:%s ", i + 1, eoltypes[i][0]);
+ }
+ putchar('\n');
+
+ i = -1;
+ while(i == -1) {
+ printf("Line ending type[1]? ");
+ fflush(stdout);
+ readstring();
+ if(stringbuf[0] == '\n') {
+ i = 0;
+ } else {
+ i = stringbuf[0] - 49; /* ascii 1-3 => 0-2 */
+ if(i < 0 || i > 2)
+ i = -1;
+ }
+ }
+ return eoltypes[i][1];
+}
+
+void backspace3(void) {
+ putchar(BS);
+ putchar(BS);
+ putchar(BS);
+}
+
+int main(int argc, char **argv) {
+ char *inp, *eol;
+ int bytes = 0, x, y, xmask;
+
+ printf("DLA to CSV converter.\n");
+ while(1) {
+ /* read whole input file into memory */
+ inf = prompt_filename("Input DLA", "rb");
+ printf("Reading...");
+ fflush(stdout);
+ bytes = fread(inbuf, 1, INBUF_SIZE, inf);
+ if(bytes <= 0) {
+ perror(stringbuf);
+ continue;
+ }
+ fclose(inf);
+ printf("Read %d bytes.\n", bytes);
+
+ eol = prompt_eol();
+
+ outf = prompt_filename("Output CSV", "wb");
+
+ printf("\nConverting... ");
+ fflush(stdout);
+
+ /* CSV file header row (column names) */
+ fprintf(outf, "x,y%s", eol);
+
+ /* write output file one line at a time */
+ inp = inbuf;
+ xmask = 0x80;
+ bytes = 0;
+ for(y = 0; y < HEIGHT; y++) {
+ backspace3();
+ printf("%02d%%", y * 100 / HEIGHT); /* percentage */
+ fflush(stdout);
+ for(x = 0; x < WIDTH; x++) {
+ if(*inp & xmask) {
+ fprintf(outf, "%d,%d%s", x, y, eol);
+ bytes++;
+ }
+ xmask >>= 1;
+ if(!xmask) {
+ xmask = 0x80;
+ inp++;
+ }
+ }
+ }
+ fclose(outf);
+ backspace3();
+ printf("100%%\n%d particles.\n", bytes);
+
+ printf("\nConvert another file[Y/n]? ");
+ fflush(stdout);
+ readstring();
+ if(stringbuf[0] == 'n' || stringbuf[0] == 'N')
+ return 0;
+ }
+}
diff --git a/dla2img.sh b/dla2img.sh
new file mode 100755
index 0000000..f765b69
--- /dev/null
+++ b/dla2img.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+
+# This script tested with bash 5.1, zsh 5.8, ksh 93u, and dash 0.5.11.4.
+# If your environment doesn't have a shell compatible with one of those,
+# I can't help you.
+
+SELF="$(basename $0)"
+
+# allow overriding magick path via environment.
+MAGICK=${MAGICK:-magick}
+
+# only change this if the save file size changes in dla.xex.
+SIZE="256x170"
+
+usage() {
+ cat <<EOF
+$SELF - convert saved files from dla.xex to image files.
+
+Usage: $SELF [dla-file] [image-file] <magick-arguments ...>
+
+[dla-file] is a file created by the Save option in dla.xex.
+
+[image-file] is the output file: any image file that ImageMagick
+knows how to create. Image type is determined by filename extension,
+e.g. "filename.png" or "filename.bmp". Try "magick -list format|less"
+to see the the full list.
+
+If any arguments after the [image-file] are present, they will be
+passed to the magick executable as-is. The most useful argument here
+is probably -trim, which will automatically crop the black borders
+around the image. See the ImageMagick documentation for the full list
+of supported arguments.
+
+See also: https://slackware.uk/~urchlay/repos/dla-asm
+EOF
+}
+
+INFILE="$1"
+OUTFILE="$2"
+
+if [ -z "$INFILE" -o -z "$OUTFILE" -o "$INFILE" = "-h" -o "$INFILE" = "--help" ]; then
+ usage
+ exit 0
+fi
+
+shift 2
+
+# do the conversion... if $OUTFILE has an unknown extension, we will
+# not get an error, and the conversion will succeed (the output will
+# just be a copy of the input!)
+$MAGICK convert -size "$SIZE" -depth 1 "$@" gray:"$INFILE" "$OUTFILE"
+
+# if magick fails, exit with its error status (it already printed its
+# error messages to stderr).
+S="$?"
+if [ "$S" != "0" ]; then
+ exit "$S"
+fi
+
+# if magick "succeeds" but the output is identical to the input, let
+# the user know.
+if cmp "$INFILE" "$OUTFILE" >/dev/null 2>&1; then
+ rm -f "$OUTFILE"
+ echo "$SELF: Unsupported filename extension; see ImageMagick docs." 1>&2
+ exit 1
+fi
+
+exit 0
diff --git a/dlatbl.s b/dlatbl.s
new file mode 100644
index 0000000..805e4f6
--- /dev/null
+++ b/dlatbl.s
@@ -0,0 +1,2077 @@
+; data tables for dla.s
+; generated file, do not edit.
+; make changes in mkdlatbl.pl instead.
+
+center_x = 85
+center_y = 85
+
+xmin:
+ .byte 60
+ .byte 45
+ .byte 30
+ .byte 0
+xmax:
+ .byte 110
+ .byte 125
+ .byte 140
+ .byte 169
+ymin:
+ .byte 60
+ .byte 45
+ .byte 30
+ .byte 0
+ymax:
+ .byte 110
+ .byte 125
+ .byte 140
+ .byte 169
+points_x:
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 96
+ .byte 96
+ .byte 96
+ .byte 96
+ .byte 95
+ .byte 95
+ .byte 95
+ .byte 95
+ .byte 94
+ .byte 94
+ .byte 94
+ .byte 93
+ .byte 93
+ .byte 93
+ .byte 92
+ .byte 92
+ .byte 92
+ .byte 91
+ .byte 91
+ .byte 91
+ .byte 90
+ .byte 90
+ .byte 90
+ .byte 89
+ .byte 89
+ .byte 89
+ .byte 88
+ .byte 88
+ .byte 88
+ .byte 87
+ .byte 87
+ .byte 86
+ .byte 86
+ .byte 86
+ .byte 85
+ .byte 85
+ .byte 85
+ .byte 84
+ .byte 84
+ .byte 84
+ .byte 83
+ .byte 83
+ .byte 82
+ .byte 82
+ .byte 82
+ .byte 81
+ .byte 81
+ .byte 81
+ .byte 80
+ .byte 80
+ .byte 80
+ .byte 79
+ .byte 79
+ .byte 79
+ .byte 78
+ .byte 78
+ .byte 78
+ .byte 77
+ .byte 77
+ .byte 77
+ .byte 76
+ .byte 76
+ .byte 76
+ .byte 75
+ .byte 75
+ .byte 75
+ .byte 75
+ .byte 74
+ .byte 74
+ .byte 74
+ .byte 74
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 74
+ .byte 74
+ .byte 74
+ .byte 74
+ .byte 75
+ .byte 75
+ .byte 75
+ .byte 75
+ .byte 76
+ .byte 76
+ .byte 76
+ .byte 77
+ .byte 77
+ .byte 77
+ .byte 78
+ .byte 78
+ .byte 78
+ .byte 79
+ .byte 79
+ .byte 79
+ .byte 80
+ .byte 80
+ .byte 80
+ .byte 81
+ .byte 81
+ .byte 81
+ .byte 82
+ .byte 82
+ .byte 82
+ .byte 83
+ .byte 83
+ .byte 84
+ .byte 84
+ .byte 84
+ .byte 85
+ .byte 85
+ .byte 85
+ .byte 86
+ .byte 86
+ .byte 86
+ .byte 87
+ .byte 87
+ .byte 88
+ .byte 88
+ .byte 88
+ .byte 89
+ .byte 89
+ .byte 89
+ .byte 90
+ .byte 90
+ .byte 90
+ .byte 91
+ .byte 91
+ .byte 91
+ .byte 92
+ .byte 92
+ .byte 92
+ .byte 93
+ .byte 93
+ .byte 93
+ .byte 94
+ .byte 94
+ .byte 94
+ .byte 95
+ .byte 95
+ .byte 95
+ .byte 95
+ .byte 96
+ .byte 96
+ .byte 96
+ .byte 96
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 113
+ .byte 113
+ .byte 113
+ .byte 113
+ .byte 112
+ .byte 112
+ .byte 112
+ .byte 111
+ .byte 111
+ .byte 111
+ .byte 110
+ .byte 110
+ .byte 110
+ .byte 109
+ .byte 109
+ .byte 108
+ .byte 108
+ .byte 107
+ .byte 107
+ .byte 106
+ .byte 106
+ .byte 105
+ .byte 105
+ .byte 104
+ .byte 103
+ .byte 103
+ .byte 102
+ .byte 102
+ .byte 101
+ .byte 100
+ .byte 100
+ .byte 99
+ .byte 98
+ .byte 98
+ .byte 97
+ .byte 96
+ .byte 96
+ .byte 95
+ .byte 94
+ .byte 94
+ .byte 93
+ .byte 92
+ .byte 92
+ .byte 91
+ .byte 90
+ .byte 89
+ .byte 89
+ .byte 88
+ .byte 87
+ .byte 86
+ .byte 86
+ .byte 85
+ .byte 84
+ .byte 84
+ .byte 83
+ .byte 82
+ .byte 81
+ .byte 81
+ .byte 80
+ .byte 79
+ .byte 78
+ .byte 78
+ .byte 77
+ .byte 76
+ .byte 76
+ .byte 75
+ .byte 74
+ .byte 74
+ .byte 73
+ .byte 72
+ .byte 72
+ .byte 71
+ .byte 70
+ .byte 70
+ .byte 69
+ .byte 68
+ .byte 68
+ .byte 67
+ .byte 67
+ .byte 66
+ .byte 65
+ .byte 65
+ .byte 64
+ .byte 64
+ .byte 63
+ .byte 63
+ .byte 62
+ .byte 62
+ .byte 61
+ .byte 61
+ .byte 60
+ .byte 60
+ .byte 60
+ .byte 59
+ .byte 59
+ .byte 59
+ .byte 58
+ .byte 58
+ .byte 58
+ .byte 57
+ .byte 57
+ .byte 57
+ .byte 57
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 57
+ .byte 57
+ .byte 57
+ .byte 57
+ .byte 58
+ .byte 58
+ .byte 58
+ .byte 59
+ .byte 59
+ .byte 59
+ .byte 60
+ .byte 60
+ .byte 60
+ .byte 61
+ .byte 61
+ .byte 62
+ .byte 62
+ .byte 63
+ .byte 63
+ .byte 64
+ .byte 64
+ .byte 65
+ .byte 65
+ .byte 66
+ .byte 67
+ .byte 67
+ .byte 68
+ .byte 68
+ .byte 69
+ .byte 70
+ .byte 70
+ .byte 71
+ .byte 72
+ .byte 72
+ .byte 73
+ .byte 74
+ .byte 74
+ .byte 75
+ .byte 76
+ .byte 76
+ .byte 77
+ .byte 78
+ .byte 78
+ .byte 79
+ .byte 80
+ .byte 81
+ .byte 81
+ .byte 82
+ .byte 83
+ .byte 84
+ .byte 84
+ .byte 85
+ .byte 86
+ .byte 86
+ .byte 87
+ .byte 88
+ .byte 89
+ .byte 89
+ .byte 90
+ .byte 91
+ .byte 92
+ .byte 92
+ .byte 93
+ .byte 94
+ .byte 94
+ .byte 95
+ .byte 96
+ .byte 96
+ .byte 97
+ .byte 98
+ .byte 98
+ .byte 99
+ .byte 100
+ .byte 100
+ .byte 101
+ .byte 102
+ .byte 102
+ .byte 103
+ .byte 103
+ .byte 104
+ .byte 105
+ .byte 105
+ .byte 106
+ .byte 106
+ .byte 107
+ .byte 107
+ .byte 108
+ .byte 108
+ .byte 109
+ .byte 109
+ .byte 110
+ .byte 110
+ .byte 110
+ .byte 111
+ .byte 111
+ .byte 111
+ .byte 112
+ .byte 112
+ .byte 112
+ .byte 113
+ .byte 113
+ .byte 113
+ .byte 113
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 129
+ .byte 129
+ .byte 129
+ .byte 129
+ .byte 128
+ .byte 128
+ .byte 128
+ .byte 127
+ .byte 127
+ .byte 127
+ .byte 126
+ .byte 126
+ .byte 125
+ .byte 125
+ .byte 124
+ .byte 124
+ .byte 123
+ .byte 122
+ .byte 122
+ .byte 121
+ .byte 120
+ .byte 120
+ .byte 119
+ .byte 118
+ .byte 118
+ .byte 117
+ .byte 116
+ .byte 115
+ .byte 114
+ .byte 114
+ .byte 113
+ .byte 112
+ .byte 111
+ .byte 110
+ .byte 109
+ .byte 108
+ .byte 107
+ .byte 106
+ .byte 105
+ .byte 104
+ .byte 103
+ .byte 102
+ .byte 101
+ .byte 100
+ .byte 99
+ .byte 98
+ .byte 97
+ .byte 96
+ .byte 95
+ .byte 94
+ .byte 93
+ .byte 92
+ .byte 91
+ .byte 89
+ .byte 88
+ .byte 87
+ .byte 86
+ .byte 85
+ .byte 84
+ .byte 83
+ .byte 82
+ .byte 81
+ .byte 79
+ .byte 78
+ .byte 77
+ .byte 76
+ .byte 75
+ .byte 74
+ .byte 73
+ .byte 72
+ .byte 71
+ .byte 70
+ .byte 69
+ .byte 68
+ .byte 67
+ .byte 66
+ .byte 65
+ .byte 64
+ .byte 63
+ .byte 62
+ .byte 61
+ .byte 60
+ .byte 59
+ .byte 58
+ .byte 57
+ .byte 56
+ .byte 56
+ .byte 55
+ .byte 54
+ .byte 53
+ .byte 52
+ .byte 52
+ .byte 51
+ .byte 50
+ .byte 50
+ .byte 49
+ .byte 48
+ .byte 48
+ .byte 47
+ .byte 46
+ .byte 46
+ .byte 45
+ .byte 45
+ .byte 44
+ .byte 44
+ .byte 43
+ .byte 43
+ .byte 43
+ .byte 42
+ .byte 42
+ .byte 42
+ .byte 41
+ .byte 41
+ .byte 41
+ .byte 41
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 41
+ .byte 41
+ .byte 41
+ .byte 41
+ .byte 42
+ .byte 42
+ .byte 42
+ .byte 43
+ .byte 43
+ .byte 43
+ .byte 44
+ .byte 44
+ .byte 45
+ .byte 45
+ .byte 46
+ .byte 46
+ .byte 47
+ .byte 48
+ .byte 48
+ .byte 49
+ .byte 50
+ .byte 50
+ .byte 51
+ .byte 52
+ .byte 52
+ .byte 53
+ .byte 54
+ .byte 55
+ .byte 56
+ .byte 56
+ .byte 57
+ .byte 58
+ .byte 59
+ .byte 60
+ .byte 61
+ .byte 62
+ .byte 63
+ .byte 64
+ .byte 65
+ .byte 66
+ .byte 67
+ .byte 68
+ .byte 69
+ .byte 70
+ .byte 71
+ .byte 72
+ .byte 73
+ .byte 74
+ .byte 75
+ .byte 76
+ .byte 77
+ .byte 78
+ .byte 79
+ .byte 81
+ .byte 82
+ .byte 83
+ .byte 84
+ .byte 85
+ .byte 86
+ .byte 87
+ .byte 88
+ .byte 89
+ .byte 91
+ .byte 92
+ .byte 93
+ .byte 94
+ .byte 95
+ .byte 96
+ .byte 97
+ .byte 98
+ .byte 99
+ .byte 100
+ .byte 101
+ .byte 102
+ .byte 103
+ .byte 104
+ .byte 105
+ .byte 106
+ .byte 107
+ .byte 108
+ .byte 109
+ .byte 110
+ .byte 111
+ .byte 112
+ .byte 113
+ .byte 114
+ .byte 114
+ .byte 115
+ .byte 116
+ .byte 117
+ .byte 118
+ .byte 118
+ .byte 119
+ .byte 120
+ .byte 120
+ .byte 121
+ .byte 122
+ .byte 122
+ .byte 123
+ .byte 124
+ .byte 124
+ .byte 125
+ .byte 125
+ .byte 126
+ .byte 126
+ .byte 127
+ .byte 127
+ .byte 127
+ .byte 128
+ .byte 128
+ .byte 128
+ .byte 129
+ .byte 129
+ .byte 129
+ .byte 129
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 159
+ .byte 159
+ .byte 159
+ .byte 159
+ .byte 158
+ .byte 158
+ .byte 157
+ .byte 157
+ .byte 156
+ .byte 156
+ .byte 155
+ .byte 154
+ .byte 154
+ .byte 153
+ .byte 152
+ .byte 151
+ .byte 150
+ .byte 149
+ .byte 148
+ .byte 147
+ .byte 146
+ .byte 145
+ .byte 144
+ .byte 143
+ .byte 142
+ .byte 141
+ .byte 139
+ .byte 138
+ .byte 137
+ .byte 135
+ .byte 134
+ .byte 133
+ .byte 131
+ .byte 130
+ .byte 128
+ .byte 127
+ .byte 125
+ .byte 124
+ .byte 122
+ .byte 120
+ .byte 119
+ .byte 117
+ .byte 115
+ .byte 114
+ .byte 112
+ .byte 110
+ .byte 109
+ .byte 107
+ .byte 105
+ .byte 103
+ .byte 101
+ .byte 100
+ .byte 98
+ .byte 96
+ .byte 94
+ .byte 92
+ .byte 91
+ .byte 89
+ .byte 87
+ .byte 85
+ .byte 83
+ .byte 81
+ .byte 79
+ .byte 78
+ .byte 76
+ .byte 74
+ .byte 72
+ .byte 70
+ .byte 69
+ .byte 67
+ .byte 65
+ .byte 63
+ .byte 61
+ .byte 60
+ .byte 58
+ .byte 56
+ .byte 55
+ .byte 53
+ .byte 51
+ .byte 50
+ .byte 48
+ .byte 46
+ .byte 45
+ .byte 43
+ .byte 42
+ .byte 40
+ .byte 39
+ .byte 37
+ .byte 36
+ .byte 35
+ .byte 33
+ .byte 32
+ .byte 31
+ .byte 29
+ .byte 28
+ .byte 27
+ .byte 26
+ .byte 25
+ .byte 24
+ .byte 23
+ .byte 22
+ .byte 21
+ .byte 20
+ .byte 19
+ .byte 18
+ .byte 17
+ .byte 16
+ .byte 16
+ .byte 15
+ .byte 14
+ .byte 14
+ .byte 13
+ .byte 13
+ .byte 12
+ .byte 12
+ .byte 11
+ .byte 11
+ .byte 11
+ .byte 11
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 11
+ .byte 11
+ .byte 11
+ .byte 11
+ .byte 12
+ .byte 12
+ .byte 13
+ .byte 13
+ .byte 14
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 16
+ .byte 17
+ .byte 18
+ .byte 19
+ .byte 20
+ .byte 21
+ .byte 22
+ .byte 23
+ .byte 24
+ .byte 25
+ .byte 26
+ .byte 27
+ .byte 28
+ .byte 29
+ .byte 31
+ .byte 32
+ .byte 33
+ .byte 35
+ .byte 36
+ .byte 37
+ .byte 39
+ .byte 40
+ .byte 42
+ .byte 43
+ .byte 45
+ .byte 46
+ .byte 48
+ .byte 50
+ .byte 51
+ .byte 53
+ .byte 55
+ .byte 56
+ .byte 58
+ .byte 60
+ .byte 61
+ .byte 63
+ .byte 65
+ .byte 67
+ .byte 69
+ .byte 70
+ .byte 72
+ .byte 74
+ .byte 76
+ .byte 78
+ .byte 79
+ .byte 81
+ .byte 83
+ .byte 85
+ .byte 87
+ .byte 89
+ .byte 91
+ .byte 92
+ .byte 94
+ .byte 96
+ .byte 98
+ .byte 100
+ .byte 101
+ .byte 103
+ .byte 105
+ .byte 107
+ .byte 109
+ .byte 110
+ .byte 112
+ .byte 114
+ .byte 115
+ .byte 117
+ .byte 119
+ .byte 120
+ .byte 122
+ .byte 124
+ .byte 125
+ .byte 127
+ .byte 128
+ .byte 130
+ .byte 131
+ .byte 133
+ .byte 134
+ .byte 135
+ .byte 137
+ .byte 138
+ .byte 139
+ .byte 141
+ .byte 142
+ .byte 143
+ .byte 144
+ .byte 145
+ .byte 146
+ .byte 147
+ .byte 148
+ .byte 149
+ .byte 150
+ .byte 151
+ .byte 152
+ .byte 153
+ .byte 154
+ .byte 154
+ .byte 155
+ .byte 156
+ .byte 156
+ .byte 157
+ .byte 157
+ .byte 158
+ .byte 158
+ .byte 159
+ .byte 159
+ .byte 159
+ .byte 159
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 160
+points_y:
+ .byte 85
+ .byte 85
+ .byte 86
+ .byte 86
+ .byte 86
+ .byte 87
+ .byte 87
+ .byte 88
+ .byte 88
+ .byte 88
+ .byte 89
+ .byte 89
+ .byte 89
+ .byte 90
+ .byte 90
+ .byte 90
+ .byte 91
+ .byte 91
+ .byte 91
+ .byte 92
+ .byte 92
+ .byte 92
+ .byte 93
+ .byte 93
+ .byte 93
+ .byte 94
+ .byte 94
+ .byte 94
+ .byte 95
+ .byte 95
+ .byte 95
+ .byte 95
+ .byte 96
+ .byte 96
+ .byte 96
+ .byte 96
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 100
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 99
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 98
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 97
+ .byte 96
+ .byte 96
+ .byte 96
+ .byte 96
+ .byte 95
+ .byte 95
+ .byte 95
+ .byte 95
+ .byte 94
+ .byte 94
+ .byte 94
+ .byte 93
+ .byte 93
+ .byte 93
+ .byte 92
+ .byte 92
+ .byte 92
+ .byte 91
+ .byte 91
+ .byte 91
+ .byte 90
+ .byte 90
+ .byte 90
+ .byte 89
+ .byte 89
+ .byte 89
+ .byte 88
+ .byte 88
+ .byte 88
+ .byte 87
+ .byte 87
+ .byte 86
+ .byte 86
+ .byte 86
+ .byte 85
+ .byte 85
+ .byte 85
+ .byte 84
+ .byte 84
+ .byte 84
+ .byte 83
+ .byte 83
+ .byte 82
+ .byte 82
+ .byte 82
+ .byte 81
+ .byte 81
+ .byte 81
+ .byte 80
+ .byte 80
+ .byte 80
+ .byte 79
+ .byte 79
+ .byte 79
+ .byte 78
+ .byte 78
+ .byte 78
+ .byte 77
+ .byte 77
+ .byte 77
+ .byte 76
+ .byte 76
+ .byte 76
+ .byte 75
+ .byte 75
+ .byte 75
+ .byte 75
+ .byte 74
+ .byte 74
+ .byte 74
+ .byte 74
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 70
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 71
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 72
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 73
+ .byte 74
+ .byte 74
+ .byte 74
+ .byte 74
+ .byte 75
+ .byte 75
+ .byte 75
+ .byte 75
+ .byte 76
+ .byte 76
+ .byte 76
+ .byte 77
+ .byte 77
+ .byte 77
+ .byte 78
+ .byte 78
+ .byte 78
+ .byte 79
+ .byte 79
+ .byte 79
+ .byte 80
+ .byte 80
+ .byte 80
+ .byte 81
+ .byte 81
+ .byte 81
+ .byte 82
+ .byte 82
+ .byte 82
+ .byte 83
+ .byte 83
+ .byte 84
+ .byte 84
+ .byte 84
+ .byte 85
+ .byte 85
+ .byte 86
+ .byte 86
+ .byte 87
+ .byte 88
+ .byte 89
+ .byte 89
+ .byte 90
+ .byte 91
+ .byte 92
+ .byte 92
+ .byte 93
+ .byte 94
+ .byte 94
+ .byte 95
+ .byte 96
+ .byte 96
+ .byte 97
+ .byte 98
+ .byte 98
+ .byte 99
+ .byte 100
+ .byte 100
+ .byte 101
+ .byte 102
+ .byte 102
+ .byte 103
+ .byte 103
+ .byte 104
+ .byte 105
+ .byte 105
+ .byte 106
+ .byte 106
+ .byte 107
+ .byte 107
+ .byte 108
+ .byte 108
+ .byte 109
+ .byte 109
+ .byte 110
+ .byte 110
+ .byte 110
+ .byte 111
+ .byte 111
+ .byte 111
+ .byte 112
+ .byte 112
+ .byte 112
+ .byte 113
+ .byte 113
+ .byte 113
+ .byte 113
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 115
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 114
+ .byte 113
+ .byte 113
+ .byte 113
+ .byte 113
+ .byte 112
+ .byte 112
+ .byte 112
+ .byte 111
+ .byte 111
+ .byte 111
+ .byte 110
+ .byte 110
+ .byte 110
+ .byte 109
+ .byte 109
+ .byte 108
+ .byte 108
+ .byte 107
+ .byte 107
+ .byte 106
+ .byte 106
+ .byte 105
+ .byte 105
+ .byte 104
+ .byte 103
+ .byte 103
+ .byte 102
+ .byte 102
+ .byte 101
+ .byte 100
+ .byte 100
+ .byte 99
+ .byte 98
+ .byte 98
+ .byte 97
+ .byte 96
+ .byte 96
+ .byte 95
+ .byte 94
+ .byte 94
+ .byte 93
+ .byte 92
+ .byte 92
+ .byte 91
+ .byte 90
+ .byte 89
+ .byte 89
+ .byte 88
+ .byte 87
+ .byte 86
+ .byte 86
+ .byte 85
+ .byte 84
+ .byte 84
+ .byte 83
+ .byte 82
+ .byte 81
+ .byte 81
+ .byte 80
+ .byte 79
+ .byte 78
+ .byte 78
+ .byte 77
+ .byte 76
+ .byte 76
+ .byte 75
+ .byte 74
+ .byte 74
+ .byte 73
+ .byte 72
+ .byte 72
+ .byte 71
+ .byte 70
+ .byte 70
+ .byte 69
+ .byte 68
+ .byte 68
+ .byte 67
+ .byte 67
+ .byte 66
+ .byte 65
+ .byte 65
+ .byte 64
+ .byte 64
+ .byte 63
+ .byte 63
+ .byte 62
+ .byte 62
+ .byte 61
+ .byte 61
+ .byte 60
+ .byte 60
+ .byte 60
+ .byte 59
+ .byte 59
+ .byte 59
+ .byte 58
+ .byte 58
+ .byte 58
+ .byte 57
+ .byte 57
+ .byte 57
+ .byte 57
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 55
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 56
+ .byte 57
+ .byte 57
+ .byte 57
+ .byte 57
+ .byte 58
+ .byte 58
+ .byte 58
+ .byte 59
+ .byte 59
+ .byte 59
+ .byte 60
+ .byte 60
+ .byte 60
+ .byte 61
+ .byte 61
+ .byte 62
+ .byte 62
+ .byte 63
+ .byte 63
+ .byte 64
+ .byte 64
+ .byte 65
+ .byte 65
+ .byte 66
+ .byte 67
+ .byte 67
+ .byte 68
+ .byte 68
+ .byte 69
+ .byte 70
+ .byte 70
+ .byte 71
+ .byte 72
+ .byte 72
+ .byte 73
+ .byte 74
+ .byte 74
+ .byte 75
+ .byte 76
+ .byte 76
+ .byte 77
+ .byte 78
+ .byte 78
+ .byte 79
+ .byte 80
+ .byte 81
+ .byte 81
+ .byte 82
+ .byte 83
+ .byte 84
+ .byte 84
+ .byte 85
+ .byte 86
+ .byte 87
+ .byte 88
+ .byte 89
+ .byte 91
+ .byte 92
+ .byte 93
+ .byte 94
+ .byte 95
+ .byte 96
+ .byte 97
+ .byte 98
+ .byte 99
+ .byte 100
+ .byte 101
+ .byte 102
+ .byte 103
+ .byte 104
+ .byte 105
+ .byte 106
+ .byte 107
+ .byte 108
+ .byte 109
+ .byte 110
+ .byte 111
+ .byte 112
+ .byte 113
+ .byte 114
+ .byte 114
+ .byte 115
+ .byte 116
+ .byte 117
+ .byte 118
+ .byte 118
+ .byte 119
+ .byte 120
+ .byte 120
+ .byte 121
+ .byte 122
+ .byte 122
+ .byte 123
+ .byte 124
+ .byte 124
+ .byte 125
+ .byte 125
+ .byte 126
+ .byte 126
+ .byte 127
+ .byte 127
+ .byte 127
+ .byte 128
+ .byte 128
+ .byte 128
+ .byte 129
+ .byte 129
+ .byte 129
+ .byte 129
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 130
+ .byte 129
+ .byte 129
+ .byte 129
+ .byte 129
+ .byte 128
+ .byte 128
+ .byte 128
+ .byte 127
+ .byte 127
+ .byte 127
+ .byte 126
+ .byte 126
+ .byte 125
+ .byte 125
+ .byte 124
+ .byte 124
+ .byte 123
+ .byte 122
+ .byte 122
+ .byte 121
+ .byte 120
+ .byte 120
+ .byte 119
+ .byte 118
+ .byte 118
+ .byte 117
+ .byte 116
+ .byte 115
+ .byte 114
+ .byte 114
+ .byte 113
+ .byte 112
+ .byte 111
+ .byte 110
+ .byte 109
+ .byte 108
+ .byte 107
+ .byte 106
+ .byte 105
+ .byte 104
+ .byte 103
+ .byte 102
+ .byte 101
+ .byte 100
+ .byte 99
+ .byte 98
+ .byte 97
+ .byte 96
+ .byte 95
+ .byte 94
+ .byte 93
+ .byte 92
+ .byte 91
+ .byte 89
+ .byte 88
+ .byte 87
+ .byte 86
+ .byte 85
+ .byte 84
+ .byte 83
+ .byte 82
+ .byte 81
+ .byte 79
+ .byte 78
+ .byte 77
+ .byte 76
+ .byte 75
+ .byte 74
+ .byte 73
+ .byte 72
+ .byte 71
+ .byte 70
+ .byte 69
+ .byte 68
+ .byte 67
+ .byte 66
+ .byte 65
+ .byte 64
+ .byte 63
+ .byte 62
+ .byte 61
+ .byte 60
+ .byte 59
+ .byte 58
+ .byte 57
+ .byte 56
+ .byte 56
+ .byte 55
+ .byte 54
+ .byte 53
+ .byte 52
+ .byte 52
+ .byte 51
+ .byte 50
+ .byte 50
+ .byte 49
+ .byte 48
+ .byte 48
+ .byte 47
+ .byte 46
+ .byte 46
+ .byte 45
+ .byte 45
+ .byte 44
+ .byte 44
+ .byte 43
+ .byte 43
+ .byte 43
+ .byte 42
+ .byte 42
+ .byte 42
+ .byte 41
+ .byte 41
+ .byte 41
+ .byte 41
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 40
+ .byte 41
+ .byte 41
+ .byte 41
+ .byte 41
+ .byte 42
+ .byte 42
+ .byte 42
+ .byte 43
+ .byte 43
+ .byte 43
+ .byte 44
+ .byte 44
+ .byte 45
+ .byte 45
+ .byte 46
+ .byte 46
+ .byte 47
+ .byte 48
+ .byte 48
+ .byte 49
+ .byte 50
+ .byte 50
+ .byte 51
+ .byte 52
+ .byte 52
+ .byte 53
+ .byte 54
+ .byte 55
+ .byte 56
+ .byte 56
+ .byte 57
+ .byte 58
+ .byte 59
+ .byte 60
+ .byte 61
+ .byte 62
+ .byte 63
+ .byte 64
+ .byte 65
+ .byte 66
+ .byte 67
+ .byte 68
+ .byte 69
+ .byte 70
+ .byte 71
+ .byte 72
+ .byte 73
+ .byte 74
+ .byte 75
+ .byte 76
+ .byte 77
+ .byte 78
+ .byte 79
+ .byte 81
+ .byte 82
+ .byte 83
+ .byte 84
+ .byte 85
+ .byte 87
+ .byte 89
+ .byte 91
+ .byte 92
+ .byte 94
+ .byte 96
+ .byte 98
+ .byte 100
+ .byte 101
+ .byte 103
+ .byte 105
+ .byte 107
+ .byte 109
+ .byte 110
+ .byte 112
+ .byte 114
+ .byte 115
+ .byte 117
+ .byte 119
+ .byte 120
+ .byte 122
+ .byte 124
+ .byte 125
+ .byte 127
+ .byte 128
+ .byte 130
+ .byte 131
+ .byte 133
+ .byte 134
+ .byte 135
+ .byte 137
+ .byte 138
+ .byte 139
+ .byte 141
+ .byte 142
+ .byte 143
+ .byte 144
+ .byte 145
+ .byte 146
+ .byte 147
+ .byte 148
+ .byte 149
+ .byte 150
+ .byte 151
+ .byte 152
+ .byte 153
+ .byte 154
+ .byte 154
+ .byte 155
+ .byte 156
+ .byte 156
+ .byte 157
+ .byte 157
+ .byte 158
+ .byte 158
+ .byte 159
+ .byte 159
+ .byte 159
+ .byte 159
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 160
+ .byte 159
+ .byte 159
+ .byte 159
+ .byte 159
+ .byte 158
+ .byte 158
+ .byte 157
+ .byte 157
+ .byte 156
+ .byte 156
+ .byte 155
+ .byte 154
+ .byte 154
+ .byte 153
+ .byte 152
+ .byte 151
+ .byte 150
+ .byte 149
+ .byte 148
+ .byte 147
+ .byte 146
+ .byte 145
+ .byte 144
+ .byte 143
+ .byte 142
+ .byte 141
+ .byte 139
+ .byte 138
+ .byte 137
+ .byte 135
+ .byte 134
+ .byte 133
+ .byte 131
+ .byte 130
+ .byte 128
+ .byte 127
+ .byte 125
+ .byte 124
+ .byte 122
+ .byte 120
+ .byte 119
+ .byte 117
+ .byte 115
+ .byte 114
+ .byte 112
+ .byte 110
+ .byte 109
+ .byte 107
+ .byte 105
+ .byte 103
+ .byte 101
+ .byte 100
+ .byte 98
+ .byte 96
+ .byte 94
+ .byte 92
+ .byte 91
+ .byte 89
+ .byte 87
+ .byte 85
+ .byte 83
+ .byte 81
+ .byte 79
+ .byte 78
+ .byte 76
+ .byte 74
+ .byte 72
+ .byte 70
+ .byte 69
+ .byte 67
+ .byte 65
+ .byte 63
+ .byte 61
+ .byte 60
+ .byte 58
+ .byte 56
+ .byte 55
+ .byte 53
+ .byte 51
+ .byte 50
+ .byte 48
+ .byte 46
+ .byte 45
+ .byte 43
+ .byte 42
+ .byte 40
+ .byte 39
+ .byte 37
+ .byte 36
+ .byte 35
+ .byte 33
+ .byte 32
+ .byte 31
+ .byte 29
+ .byte 28
+ .byte 27
+ .byte 26
+ .byte 25
+ .byte 24
+ .byte 23
+ .byte 22
+ .byte 21
+ .byte 20
+ .byte 19
+ .byte 18
+ .byte 17
+ .byte 16
+ .byte 16
+ .byte 15
+ .byte 14
+ .byte 14
+ .byte 13
+ .byte 13
+ .byte 12
+ .byte 12
+ .byte 11
+ .byte 11
+ .byte 11
+ .byte 11
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 11
+ .byte 11
+ .byte 11
+ .byte 11
+ .byte 12
+ .byte 12
+ .byte 13
+ .byte 13
+ .byte 14
+ .byte 14
+ .byte 15
+ .byte 16
+ .byte 16
+ .byte 17
+ .byte 18
+ .byte 19
+ .byte 20
+ .byte 21
+ .byte 22
+ .byte 23
+ .byte 24
+ .byte 25
+ .byte 26
+ .byte 27
+ .byte 28
+ .byte 29
+ .byte 31
+ .byte 32
+ .byte 33
+ .byte 35
+ .byte 36
+ .byte 37
+ .byte 39
+ .byte 40
+ .byte 42
+ .byte 43
+ .byte 45
+ .byte 46
+ .byte 48
+ .byte 50
+ .byte 51
+ .byte 53
+ .byte 55
+ .byte 56
+ .byte 58
+ .byte 60
+ .byte 61
+ .byte 63
+ .byte 65
+ .byte 67
+ .byte 69
+ .byte 70
+ .byte 72
+ .byte 74
+ .byte 76
+ .byte 78
+ .byte 79
+ .byte 81
+ .byte 83
diff --git a/mkdlatbl.pl b/mkdlatbl.pl
index 37fb31b..a1377f6 100644
--- a/mkdlatbl.pl
+++ b/mkdlatbl.pl
@@ -28,8 +28,15 @@ for $r (15, 30, 45, 75) {
}
}
-print "center_x = $centerx\n";
-print "center_y = $centery\n";
+print <<EOF;
+; data tables for dla.s
+; generated file, do not edit.
+; make changes in mkdlatbl.pl instead.
+
+center_x = $centerx
+center_y = $centery
+
+EOF
print "xmin:\n";
for(@xmin) {