From 72e6cbfc6a4b4606f11a6d5285de65238dc0dbd4 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Wed, 9 Nov 2022 17:12:04 -0500 Subject: Added dla2csv, dla2img. Split up docs. --- .gitignore | 1 - ALGORITHM.txt | 24 + BUILD.txt | 33 + Makefile | 32 +- NOTES.txt | 54 ++ README.txt | 141 ++-- avgtime.pl | 19 + dla2csv.c | 155 +++++ dla2img.sh | 68 ++ dlatbl.s | 2077 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mkdlatbl.pl | 11 +- 11 files changed, 2540 insertions(+), 75 deletions(-) create mode 100644 ALGORITHM.txt create mode 100644 BUILD.txt create mode 100644 NOTES.txt create mode 100644 avgtime.pl create mode 100644 dla2csv.c create mode 100755 dla2img.sh create mode 100644 dlatbl.s 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 +#include +#include +#include + +#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 < + +[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 <