koreth@ssyx.ucsc.edu (Steven Grimm) (01/19/89)
Submitted-by: cs.buffalo.edu!sigmast!dgy
Posting-number: Volume 1, Issue 93
Archive-name: starchrt/part02
#!/bin/sh
# this is part 2 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file planet.dif continued
#
CurArch=2
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
exit 1; fi
( read Scheck
if test "$Scheck" != $CurArch
then echo "Please unpack part $Scheck next!"
exit 1;
else exit 0; fi
) < s2_seq_.tmp || exit 1
sed 's/^X//' << 'SHAR_EOF' >> planet.dif
X! }
X! #endif /* ST_MWC */
X exit(0);
X } /* end of program main */
X
X***************
X*** 1023,1031 ****
X--- 1075,1089 ----
X double aint(z)
X double z;
X {
X+ #ifdef ST_MWC /* In Mark Williams C ints are 16 bits long, so use longs */
X+ long trunk;
X+
X+ trunk = (long)z;
X+ #else /* !ST_MWC */
X int trunk;
X
X trunk = (int)z;
X+ #endif /* ST_MWC */
X z = (double) trunk;
X return(z);
X }
SHAR_EOF
chmod 0600 planet.dif || echo "restore of planet.dif fails"
sed 's/^X//' << 'SHAR_EOF' > staranim.c &&
X#include <stdio.h>
X#include <osbind.h> /* Needed for Cconws() and Crawcin() */
X
Xextern char *getenv();
X
Xint daysinmonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X int debug = 0, i, j, month;
X char *eargv[20], *eenv[2], label[10], picture[14], sday[2], smonth[3];
X
X if (argc < 4) {
X Cconws("Usage: ");
X Cconws(argv[0]);
X Cconws(" <month> <year> <arguments ... >\r\n");
X Cconws(" <month> is an integer from 1 to 12.\r\n");
X Cconws(" <year> is a four-digit integer.\r\n");
X Cconws(" <arguments> are passed to starst.\r\n");
X Cconws("Portions of this program, copyright 1984, ");
X Cconws("Mark Williams Company.\r\n");
X /* We want to hold the screen if invoked from the GEM desktop;
X the desktop doesn't usually set any environment variables,
X and if getenv() does find anything, it's probably a NULL string. */
X if (((getenv("PATH")) == 0) || (strlen(getenv("PATH")) == 0)) {
X Cconws("press any key to continue: ");
X i = Crawcin(); /* Read raw character input */
X }
X exit(1);
X }
X if (strlen(argv[2]) != 4) {
X Cconws("Year must be in 4-digit form (e.g. 1988).\r\n");
X if (((getenv("PATH")) == 0) || (strlen(getenv("PATH")) == 0)) {
X Cconws("press any key to continue: ");
X i = Crawcin(); /* Read raw character input */
X }
X exit(1);
X }
X if ((month = atoi(argv[1])) > 100) {
X month -= 100;
X ++debug;
X }
X if ((month < 1) || (month > 12)) {
X Cconws("Month must be an integer from 1 to 12.\r\n");
X if (((getenv("PATH")) == 0) || (strlen(getenv("PATH")) == 0)) {
X Cconws("press any key to continue: ");
X i = Crawcin(); /* Read raw character input */
X }
X exit(1);
X }
X for (i = 1; i <= daysinmonth[month - 1]; i++) {
X sprintf(smonth, "%d", month);
X sprintf(sday, "%d", i);
X eargv[0] = "planet.ttp";
X eargv[1] = "-y";
X eargv[2] = argv[2];
X eargv[3] = "-m";
X eargv[4] = smonth;
X eargv[5] = "-d";
X eargv[6] = sday;
X eargv[7] = "-t";
X eargv[8] = "12";
X eargv[9] = "-z";
X eargv[10] = "0";
X eargv[11] = eenv[1] = 0;
X eenv[0] = "PATH=."; /* Make programs think they came from shell */
X if (debug) {
X Cconws("\r\n");
X for (j = 0; eargv[j] != '\0'; j++) {
X Cconws(eargv[j]);
X Cconws(" ");
X }
X } else {
X execve(eargv[0], eargv, eenv);
X }
X sprintf(label, "%02d/%02d/%2s", month, i, argv[2] + 2);
X sprintf(picture, "star%02d%02d.pi1", month, i);
X eargv[0] = "starst.ttp";
X eargv[1] = "-t";
X eargv[2] = label;
X eargv[3] = "-x";
X eargv[4] = picture;
X for (j = 3; j < argc; j++) {
X eargv[j + 2] = argv[j];
X }
X eargv[j + 2] = '\0';
X if (debug) {
X Cconws("\r\n");
X for (j = 0; eargv[j] != '\0'; j++) {
X Cconws(eargv[j]);
X Cconws(" ");
X }
X Cconws("\r\n");
X } else {
X execve(eargv[0], eargv, eenv);
X }
X } /* End of "for" loop */
X if (debug && ((getenv("PATH")) == 0) || (strlen(getenv("PATH")) == 0)) {
X Cconws("press any key to continue: ");
X i = Crawcin(); /* Read raw character input */
X }
X}
SHAR_EOF
chmod 0600 staranim.c || echo "restore of staranim.c fails"
sed 's/^X//' << 'SHAR_EOF' > starargs.c &&
X/*
X** Written by Dave Yearke (dgy@sigmast), September 1988.
X** Portions of this program (c) Mark Williams Company.
X*/
X
X#include <osbind.h> /* Needed for Cconws() and Crawcin() */
X
Xmain()
X{
X char *argptr, command[130], *eargv[20], *eenv[2];
X int i;
X
X Cconws("STARARGS - Utility for running Starchart ");
X Cconws("software from the desktop.\r\n");
X Cconws("Portions of this program, copyright 1984, ");
X Cconws("Mark Williams Company.");
X for (;;) {
X *command = 128; /* Number of characters Cconrs() should read */
X Cursconf(1, 0); /* Show cursor */
X Cconws("\r\n\nPlease enter the full name of the program to be run ");
X Cconws("(e.g. starst.ttp)\r\n");
X Cconws("and its arguments, or an empty line to quit:\r\n");
X Cconrs(command); /* Read an edited string from standard input */
X if (*(command + 1) == 0) /* Number of chars actually read */
X exit();
X Cconws("\r\n");
X command[*(command + 1) + 2] = '\0'; /* Make sure it's terminated */
X i = 0;
X argptr = command + 2;
X do {
X eargv[i] = argptr;
X while ((*++argptr != ' ') && (*argptr != '\0'))
X ; /* Browse until space or end of string */
X if (*argptr == ' ') /* If we found a space */
X *argptr++ = '\0'; /* End the string preceding this point */
X while ((*argptr == ' ') && (*argptr != '\0'))
X ++argptr; /* Browse until non-space or end of string */
X Cconws(eargv[i++]);
X Cconws(" ");
X } while (*argptr != '\0');
X eargv[i] = eenv[1] = 0;
X eenv[0] = "PATH=."; /* The programs will think they're being run */
X Cconws("\r\n"); /* from a shell. */
X execve(eargv[0], eargv, eenv);
X }
X}
SHAR_EOF
chmod 0600 starargs.c || echo "restore of starargs.c fails"
sed 's/^X//' << 'SHAR_EOF' > starchrt.dif &&
X*** ../starchart/starchart.c Mon Sep 19 09:12:20 1988
X--- starchrt.c Mon Sep 26 23:50:39 1988
X***************
X*** 58,72 ****
X--- 58,87 ----
X ![11] the -g flag sets a mag limit for star proper names, else use codes
X */
X
X+ #ifdef ST_MWC /* Mark Williams C for the Atari ST */
X+ #define SYSV /* MWC is almost SYSV compatible */
X+ #endif /* ST_MWC */
X+
X #include <stdio.h>
X #include <math.h>
X #ifndef SYSV
X #include <strings.h>
X #else
X+ #define index strchr
X+ #ifndef SYSVR3 /* System V release 3 doesn't have this header file */
X+ #ifndef ST_MWC
X #include <string.h>
X+ #else /* ST_MWC */
X+ char *strchr();
X+ #endif /* ST_MWC */
X+ #endif /* SYSVR3 */
X #endif
X #include <ctype.h>
X+ #ifndef ST_MWC
X #include "starchart.h"
X+ #else /* ST_MWC */
X+ #include "starchrt.h"
X+ #endif /* ST_MWC */
X
X /*
X * default datasets are local, unless defined in Makefile
X***************
X*** 122,127 ****
X--- 137,149 ----
X int annodetail, objdetail; /* flags to control output */
X int annoswitch, objswitch; /* switches as seen on command line */
X float olat, olon; /* save areas for track clipping */
X+ #ifdef ST_MWC
X+ #ifdef INTERACTIVE
X+ extern int oldrez; /* Used to see if we've initialized the screen. */
X+ int exit_and_save = FALSE; /* Don't wait for keypress when done, save file */
X+ char picturefile[15]; /* into "picturefile" (def = star.pi1) and exit */
X+ #endif /* INTERACTIVE */
X+ #endif /* ST_MWC */
X
X /* the code */
X
X***************
X*** 253,258 ****
X--- 275,297 ----
X case 'b': bigflag = TRUE; break;
X case 'a': annoswitch = TRUE; break;
X case 'o': objswitch = TRUE; break;
X+ #ifdef ST_MWC
X+ #ifdef INTERACTIVE
X+ /* Exit immediately, saving the picture in a DEGAS or
X+ NeoChrome file (Chosen by .pi1 or .neo extender */
X+ case 'x': exit_and_save = TRUE;
X+ if (((j+1) < argc) && (argv[j+1][0] != '-'))
X+ strcpy(picturefile, argv[++j]);
X+ else
X+ strcpy(picturefile, "star.pi1");
X+ break;
X+ #else /* !INTERACTIVE */
X+ /* Help for the GEM Desktop, which cannot redirect. */
X+ case 'x': if (((j+1) < argc) && (argv[j+1][0] != '-'))
X+ freopen(argv[++j], "wb", stdout);
X+ break;
X+ #endif /* INTERACTIVE */
X+ #endif /* ST_MWC */
X default: die("unknown switch - %s", argv[j]); break;
X }
X if (j == argc) die("trailing command line flag - %s", argv[j-1]);
X***************
X*** 373,379 ****
X--- 412,426 ----
X if (!title) title = "LEGEND";
X rastr(ras, chart->racen);
X declstr(dls, chart->dlcen);
X+ #ifdef ST_MWC
X+ #ifdef INTERACTIVE /* This bleeds over into the thumbnail, so trim it */
X+ sprintf(outstr, "(%s,%s)", ras, dls, chart->maglim);
X+ #else /* !INTERACTIVE */
X sprintf(outstr, "(%s,%s lim: %2.1f)", ras, dls, chart->maglim);
X+ #endif /* INTERACTIVE */
X+ #else /* !ST_MWC */
X+ sprintf(outstr, "(%s,%s lim: %2.1f)", ras, dls, chart->maglim);
X+ #endif /* ST_MWC */
X /*
X * there are reports that large point sizes (eg "16", below) cause characters
X * to overlap on some (pic?) output devices. To fix, set values to "10".
X***************
X*** 417,422 ****
X--- 464,481 ----
X
X pvecsize(10); pvecsyms( 95,75,"double"); pdrawStar( 65,75, 2, 'D', NULL);
X pvecsize(10); pvecsyms(260,75,"variable"); pdrawStar(230,75, 2, 'V', NULL);
X+ #ifdef ST_MWC
X+ #ifdef INTERACTIVE /* Adjust the legend so symbols don't overlap labels */
X+ pvecsize(10); pvecsyms( 95,50,"planet"); pdrawPlan( 75,50, 1, 'S', NULL);
X+ pdrawPlan( 55,50, 1, 's', NULL);
X+ pdrawPlan( 35,50, 1, 'V', NULL);
X+ pvecsize(10); pvecsyms(260,50,"galaxy"); pdrawGalx(240,50, 1, 'E', NULL);
X+ pdrawGalx(215,50, 1, 'S', NULL);
X+ pvecsize(10); pvecsyms( 95,25,"nebula"); pdrawNebu( 75,25, 1, 'D', NULL);
X+ pdrawNebu( 45,25, 1, 'P', NULL);
X+ pvecsize(10); pvecsyms(260,25,"cluster"); pdrawClus(240,25, 1, 'O', NULL);
X+ pdrawClus(215,25, 1, 'G', NULL);
X+ #else /* !INTERACTIVE */
X pvecsize(10); pvecsyms( 95,50,"planet"); pdrawPlan( 65,50, 1, 'S', NULL);
X pvecsize(10); pvecsyms(260,50,"galaxy"); pdrawGalx(230,50, 1, 'E', NULL);
X pdrawGalx(205,50, 1, 'S', NULL);
X***************
X*** 424,429 ****
X--- 483,490 ----
X pdrawNebu( 40,25, 1, 'P', NULL);
X pvecsize(10); pvecsyms(260,25,"cluster"); pdrawClus(230,25, 1, 'O', NULL);
X pdrawClus(205,25, 1, 'G', NULL);
X+ #endif /* INTERACTIVE */
X+ #endif /* ST_MWC */
X }
X
X chartbanner(chart)
X***************
X*** 495,501 ****
X if (sbuf[11] != 0)
X code[0] = sbuf[15];
X subcode[0] = sbuf[16];
X! color [0] = '\0'; strcpy (color, " "); /* set unknowns to blanks */
X label [0] = '\0';
X name [0] = '\0'; strncat (name, &sbuf[17], strlen (&sbuf [17]) - 1);
X }
X--- 556,562 ----
X if (sbuf[11] != 0)
X code[0] = sbuf[15];
X subcode[0] = sbuf[16];
X! strcpy(color, " "); /* set unknowns to blanks */
X label [0] = '\0';
X name [0] = '\0'; strncat (name, &sbuf[17], strlen (&sbuf [17]) - 1);
X }
X***************
X*** 554,566 ****
X--- 615,635 ----
X /*
X * extract color, label and name
X */
X+ #ifdef ST_MWC
X+ len = strlen(sbuf);
X+ if (len > 16)
X+ #endif /* ST_MWC */
X strncat (color, &sbuf[16], 2);
X+ #ifdef ST_MWC
X+ if (len > 18)
X+ #endif /* ST_MWC */
X strncat (label, &sbuf[18], strlen (&sbuf [18]) - 1);
X if ((len = strlen (label)) > 5)
X {
X strncat (name, &label[5], len - 5);
X label [5] = '\0';
X }
X+ break;
X }
X }
X return(0);
X***************
X*** 896,901 ****
X--- 965,971 ----
X return (new -= b);
X }
X
X+ #ifndef INTERACTIVE
X die(a,b)
X char *a, *b;
X {
X***************
X*** 904,909 ****
X--- 974,980 ----
X fprintf(stderr,"\n");
X exit(1);
X }
X+ #endif /* !INTERACTIVE */
X
X #define LINELEN 80
X static char legend[LINELEN];
SHAR_EOF
chmod 0600 starchrt.dif || echo "restore of starchrt.dif fails"
sed 's/^X//' << 'SHAR_EOF' > starlase.dif &&
X*** ../starchart/starlaser.c Mon Sep 19 09:11:19 1988
X--- starlase.c Mon Sep 26 23:41:46 1988
X***************
X*** 25,31 ****
X--- 25,35 ----
X */
X
X #include <stdio.h>
X+ #ifndef ST_MWC
X #include "starchart.h"
X+ #else /* ST_MWC */
X+ #include "starchrt.h"
X+ #endif /* ST_MWC */
X
X char *calloc ();
X
SHAR_EOF
chmod 0600 starlase.dif || echo "restore of starlase.dif fails"
sed 's/^X//' << 'SHAR_EOF' > starpost.dif &&
X*** ../starchart/starpost.c Mon Sep 19 09:11:50 1988
X--- starpost.c Mon Sep 26 23:43:16 1988
X***************
X*** 15,21 ****
X--- 15,25 ----
X */
X
X #include <stdio.h>
X+ #ifndef ST_MWC
X #include "starchart.h"
X+ #else /* ST_MWC */
X+ #include "starchrt.h"
X+ #endif /* ST_MWC */
X
X /*
X * Chart parameters (limiting magnitude and window x,y,w,h)
SHAR_EOF
chmod 0600 starpost.dif || echo "restore of starpost.dif fails"
sed 's/^X//' << 'SHAR_EOF' > starst.c &&
X/*
X** Atari ST driver for starchart.
X** Works on color systems only, compiled with Mark Williams C.
X** Written by Dave Yearke (dgy@sigmast), September 1988.
X** Portions of this program (c) Mark Williams Company.
X** Thanks to the authors of the other starchart drivers for giving
X** me some examples to work from.
X*/
X
Xextern int exit_and_save;
Xextern char *getenv(), picturefile[];
X
X#include <ctype.h> /* isprint(), iscntrl(), etc. */
X#include <linea.h> /* Line A (low-level graphics) routines. */
X#include <osbind.h> /* Operating system bindings */
X#include <vdibind.h> /* The virtual device interface routines */
X#include <xbios.h> /* Extended BIOS bindings */
X#include "starchrt.h" /* Starchart information */
X
X/* Global line A variables used by vdi; MUST be included */
Xint contrl[12], intin[128], ptsin[128], intout[128], ptsout[128];
X/* Array used by vs_clip() */
Xint cliparray[] = { 1, 1, 319, 199 };
X/* Arrays used by v_opvwk() */
Xint work_in[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2 };
Xint work_out[57];
X
X#define TRUE 1
X#define NULL 0
X
X/*
X** Starchart was designed for 1024x768 pixels. These macros scale the
X** image to the 320x200 Atari ST low-resolution (16-color) mode. Also,
X** the y coord is subtracted from 200 so the image isn't upside-down.
X*/
X#define xadjust(x) ((x) * 0.3125)
X#define yadjust(y) (200 - ((y) * 0.2604167))
X
Xstruct la_font *fontp; /* Line A font header. */
Xchar line[100], linemode, *p;
Xchar scr_wrk[1024];
Xint vdihandle; /* Virtual device's handle */
X
Xint CURRX, CURRY, currez, old_color[16], oldrez = 99; /* 99 is impossible! */
X
X/*
X** Settings for the palette, given as RGB, 3 bits for each color (512 total).
X** I tried to use different registers for different types of objects so they
X** could be set individually (for example, in DEGAS you could blink a register
X** for an object you're trying to point out).
X*/
Xint new_color[16] = { 0x000, /* Black - Background color */
X 0x777, /* White - 1st and higher mag. stars */
X 0x666, /* White - 2nd mag. stars */
X 0x555, /* White - 3rd mag. stars */
X 0x444, /* White - 4th mag. stars */
X 0x333, /* White - 5th mag. stars */
X 0x222, /* White - 6th and lower mag. stars */
X 0x222, /* White - Nebulae, Galaxies, Clusters */
X 0x007, /* Blue - 1st and higher mag. stars */
X 0x700, /* Red - 1st and higher mag. stars */
X 0x770, /* Yellow - Sol */
X 0x704, /* Pink - Inferior Planets */
X 0x404, /* Purple - Superior Planets */
X 0x020, /* Dark Green - Dotted lines */
X 0x200, /* Dark Red - Hyphenated lines */
X 0x003 }; /* Deep Blue - Text and borders */
X
X/*
X** These are reverse-image colors for the background and stars, used when the
X** 'r' key is hit when the program pauses before exiting. Switching these
X** registers makes a nice output image for a screen dump to a printer.
X*/
Xint rev_color[8] = { 0x777, /* White - Background color */
X 0x000, /* Black - 1st and higher mag. stars */
X 0x222, /* Black - 2nd mag. stars */
X 0x333, /* Black - 3rd mag. stars */
X 0x444, /* Black - 4th mag. stars */
X 0x555, /* Black - 5th mag. stars */
X 0x666, /* Black - 6th and lower mag. stars */
X 0x666 }; /* Black - Nebulae, Galaxies, Clusters */
X
X/*
X** Chart parameters (limiting magnitude and window x,y,w,h)
X*/
X
Xmapblock thumbnail = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
X 3.2, 1.0, 2.05, 420, 35, 480, 195, 0.0 };
X
Xmapblock master = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
X 8.0, 2.0, 2.05, 20, 265, 880, 500, 0.0 };
X
Xmapblock bigmaster = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
X 8.0, 2.5, 2.5, 20, 65, 880, 700, 0.0 };
X
X/*
X** Generic functions
X*/
X
X/*
X** Initialize the graphics mode
X*/
Xvecopen()
X{
X int i;
X
X Cconws("\033H\033J"); /* Clear the screen */
X if ((oldrez = Getrez()) == GR_HIGH) {
X die("%s\n", "Sorry, this works on color systems only.");
X Pterm(1);
X } else if (oldrez == GR_MED)
X Setscreen((char *)-1, (char *)-1, GR_LOW); /* Set low resolution */
X currez = GR_LOW;
X appl_init(); /* Initialize the application and register it with AES */
X vdihandle = graf_handle(&i, &i, &i, &i); /* Get a VDI handle */
X v_opnvwk(work_in, &vdihandle, work_out); /* Open the virtual workscreen */
X vs_clip(vdihandle, 1, cliparray); /* Set the clipping rectangle */
X for (i = 0; i < 16; i++) /* Save and set the palette */
X old_color[i] = Setcolor(i, new_color[i]);
X
X linea0(); /* Initialize the line A routines */
X lineaa(); /* Hide mouse pointer */
X Cursconf(0, 0); /* Hide cursor */
X
X WMODE = 0; /* Writing mode = replace */
X STYLE = 0; /* Normal Letters */
X SRCY = 0; /* Y coord of character in font */
X LITEMSK = 0x5555; /* Lightening and skewing masks for text */
X SKEWMSK = 0x1111;
X TEXTFG = 15; /* Text foreground dark blue */
X SCRTCHP = scr_wrk; /* Scratch area for graphics */
X LNMASK = -1; /* Solid lines */
X WEIGHT = 1; /* Thickening factor for lines */
X LSTLIN = -1;
X}
X
X/*
X** Clean up
X*/
Xvecclose ()
X{
X register int i;
X
X if (exit_and_save)
X savepic();
X else
X while (1) { /* Loop if 'r' is pressed, return for anything else */
X switch (i = Crawcin()) { /* Wait for keypress before quitting */
X case 'r': /* Reverse the color registers */
X if (Setcolor(0, -1) == 0) { /* If normal, reverse it */
X for (i = 0; i < 8; i++)
X Setcolor(i, rev_color[i]);
X } else { /* Make it normal */
X for (i = 0; i < 8; i++)
X Setcolor(i, new_color[i]);
X }
X continue; /* Restart the loop */
X break;
X case 's': /* Save as a DEGAS picture */
X strcpy(picturefile, "star.pi1");
X savepic();
X break;
X case 'S': /* Save as a NeoChrome picture */
X strcpy(picturefile, "star.neo");
X savepic();
X break;
X default:
X break;
X }
X break;
X }
X vecreset();
X}
X
X/*
X** Restore the screen
X*/
Xvecreset()
X{
X int i;
X
X v_clsvwk(vdihandle); /* Close the virtual workscreen */
X appl_exit(); /* Remove the application from AES */
X Cconws("\033H\033J"); /* Clear the screen */
X Setscreen((char *)-1, (char *)-1, oldrez); /* Set resolution */
X for (i = 0; i < 16; i++) /* Set the colors back to their saved values */
X Setcolor(i, old_color[i]);
X if (((getenv("PATH")) == 0) || (strlen(getenv("PATH")) == 0))
X linea9(); /* Show mouse pointer */
X else /* If called from a shell */
X Cursconf(1, 0); /* Show cursor */
X}
X
X/*
X** Save the screen as a DEGAS or NeoChrome picture
X*/
Xsavepic()
X{
X int neo = 0, file; /* Assume DEGAS file */
X
X if (strrchr(picturefile, '.') != NULL) { /* Extender given */
X if ((!strncmp(picturefile + strrchr(picturefile, '.'), ".neo", 4)) ||
X (!strncmp(picturefile + strrchr(picturefile, '.'), ".NEO", 4)))
X ++neo; /* Save as a NeoChrome picture */
X } else
X strcat(picturefile, ".pi1");
X if ((file = creat(picturefile, 0)) == -1)
X die("Cannot open %s.", picturefile);
X if (neo) /* NeoChrome has two extra null bytes at the beginning */
X if (write(file, &currez, 2) != 2)
X die("Write failure on file %s.", picturefile);
X if (write(file, &currez, 2) != 2) /* Write the resolution */
X die("Write failure on file %s.", picturefile);
X if (write(file, &new_color[0], 32) != 32) /* Write the palette info */
X die("Write failure on file %s.", picturefile);
X if (neo) /* NeoChrome has a 128-byte header, so we'll pad with 94 bytes */
X for (neo = 0; neo < 47; ++neo) /* Recycle the variable "neo" */
X if (write(file, &currez, 2) != 2)
X die("Write failure on file %s.", picturefile);
X if (write(file, Physbase(), 32000) != 32000) /* Write the screen */
X die("Write failure on file %s.", picturefile);
X close(file); /* Done! (that wasn't too bad, was it?) */
X}
X
X/*
X** This function is duplicated in starchrt.c for non-ST versions, using
X** the INTERACTIVE manifest constant.
X*/
Xdie(a,b)
Xchar *a, *b;
X{
X char buf[80];
X int i;
X
X if (oldrez != 99) /* See if we ever initialized the screen. */
X vecreset(); /* Reset the screen to something sane */
X if (!strncmp(b, "\nusage", 6)) { /* Sub in the ST's usage */
X Cconws("\n\rusage:\tstar* [ Ra Dcl Scale Title Maglim Labellim ]\n");
X Cconws("\ror\tstar* [ -r Ra -d Dcl -s Scale -t Title -m Maglim -l ");
X Cconws("Labellim -f x.str ]\n\ror\tstar* [ -c con (3 or 4 letters ");
X Cconws("chosen from con.loc) -l ... ]\n\ror\tstarst -x [ file.PI1 ");
X Cconws("| file.NEO ] ... (to exit and save screen)\n\n\r");
X Cconws("Portions of this program, copyright 1984, ");
X Cconws("Mark Williams Company");
X } else {
X sprintf(buf, a, b);
X Cconws(buf);
X }
X Cconws("\n\r"); /* Cconws does not map \n into \n\r */
X /* We want to hold the screen if invoked from the GEM desktop;
X the desktop doesn't usually set any environment variables,
X and if getenv() does find anything, it's probably a NULL string. */
X if (((getenv("PATH")) == 0) || (strlen(getenv("PATH")) == 0)) {
X Cconws("press any key to continue: "); /* Hold screen if desktop */
X i = Crawcin(); /* Read raw character input */
X }
X exit(1);
X}
X
X/*
X** Functions for manipulating text.
X*/
X
X/*
X** This function sets the point size for text. (not applicable)
X*/
Xvecsize (points)
Xint points;
X{
X}
X
X/*
X** This function puts text on the screen.
X*/
Xvecsyms (x, y, s)
Xint x,y;
Xchar *s;
X{
X register char *ptr;
X register unsigned int tmp;
X
X if (*s == '\0') /* Don't bother if the string is empty */
X return; /* (A null char can make linea8() crash!) */
X fontp = la_init.li_a1[0]; /* 6x6 system font */
X FBASE = fontp->font_data; /* Pointer to start of font form */
X FWIDTH = fontp->font_width; /* Width of font form */
X DELY = fontp->font_height; /* Height of character in font */
X
X DSTX = xadjust(x);
X if ((DSTY = yadjust(y)) > 2)
X DSTY -= 2; /* This vertically centers the text on the line */
X if (DSTY > 191)
X DSTY = 191; /* Make sure the bottom line shows up */
X ptr = s;
X do { /* Output the characters until the end of the string is hit */
X if (!iscntrl(*ptr)) {
X tmp = *ptr - fontp->font_low_ade; /* Find the character data */
X SRCX = fontp->font_char_off[tmp]; /* within the font data */
X DELX = fontp->font_char_off[tmp + 1] - SRCX;
X /* Check screen boundaries */
X if ((DSTX > 0) && (DSTX < 311) && (DSTY > 0))
X if (isspace(*ptr)) {
X WMODE = 1; /* Writing mode = transparent */
X linea8();
X WMODE = 0; /* Writing mode = replace */
X } else
X linea8(); /* Line A trap for text blit routine */
X }
X } while (*++ptr != '\0');
X}
X
X/*
X** This function puts text on the screen using the greek alphabet.
X** (Well, not yet, but someday ... :-))
X*/
Xvecsymsgk(s, x, y)
Xchar *s;
X{
X vecsyms(s, x, y);
X}
X
X/*
X** Functions for drawing points and lines.
X*/
X
X/*
X** Change the current position of x and y.
X*/
Xvecmove (x, y)
Xint x,y;
X{
X CURRX = x;
X CURRY = y;
X}
X
X/*
X** Move to a new location (x1, y1) and draw a solid line to (x2, y2).
X*/
Xvecmovedraw (x1, y1, x2, y2)
Xint x1, y1, x2, y2;
X{
X vecmove(x1, y1);
X vecdraw(x2, y2);
X}
X
X/*
X** Draw a solid line to (x,y)
X*/
Xvecdraw (x, y)
Xint x,y;
X{
X if (linemode != 'S') {
X linemode = 'S';
X COLBIT0 = 1; /* Set the bit plane for line drawing (color 15) */
X COLBIT1 = 1;
X COLBIT2 = 1;
X COLBIT3 = 1;
X }
X X1 = xadjust(CURRX);
X Y1 = yadjust(CURRY);
X X2 = xadjust(CURRX = x);
X Y2 = yadjust(CURRY = y);
X linea3(); /* Line blit routine */
X}
X
X/*
X** Draw a dotted line (dark green on the ST) to (x,y)
X*/
Xvecdrawdot(x, y)
X{
X if (linemode != 'D') {
X linemode = 'D';
X COLBIT0 = 1; /* Set the bit plane for line drawing (color 13) */
X COLBIT1 = 0;
X COLBIT2 = 1;
X COLBIT3 = 1;
X }
X X1 = xadjust(CURRX);
X Y1 = yadjust(CURRY);
X X2 = xadjust(CURRX = x);
X Y2 = yadjust(CURRY = y);
X linea3();
X}
X
X/*
X** Draw a hyphenated line (dark red on the ST) to (x,y)
X*/
Xvecdrawhyph(x, y)
X{
X if (linemode != 'H') {
X linemode = 'H';
X COLBIT0 = 0; /* Set the bit plane for line drawing (color 14) */
X COLBIT1 = 1;
X COLBIT2 = 1;
X COLBIT3 = 1;
X }
X X1 = xadjust(CURRX);
X Y1 = yadjust(CURRY);
X X2 = xadjust(CURRX = x);
X Y2 = yadjust(CURRY = y);
X linea3();
X}
X
X/*
X** Draw a horizontal line.
X*/
Xdrawlen (x, y, dx, dy, len)
Xint x, y, dx, dy, len;
X{
X if (linemode != 'S') {
X linemode = 'S';
X COLBIT0 = 1; /* Set the bit plane for line drawing (color 15) */
X COLBIT1 = 1;
X COLBIT2 = 1;
X COLBIT3 = 1;
X }
X X1 = xadjust(x + dx);
X Y1 = yadjust(y + dy);
X X2 = xadjust(CURRX = x + dx + len - 1);
X Y2 = yadjust(CURRY = y + dy);
X linea3();
X}
X
X/*
X** Functions for astronomical objects.
X*/
X
X/*
X** Draw the sun or a planet
X*/
XdrawPlan(x, y, mag, type, color)
Xint x, y, mag, type;
Xchar *color;
X{
X if (type == 'S')
X INTIN[0] = 10; /* Yellow for the Sun */
X else if ((type == 'M') || (type == 'V'))
X INTIN[0] = 11; /* Pink for inferior planets (Mercury or Venus) */
X else
X INTIN[0] = 12; /* Purple for superior planets (m, J, s, U, or N) */
X PTSIN[0] = xadjust(CURRX = x);
X PTSIN[1] = yadjust(CURRY = y);
X if (linea2() == 0) /* See if there's anything there already */
X linea1(); /* Put a pixel on the screen */
X}
X
X/*
X** Draw a star.
X*/
XdrawStar(x, y, mag, type, color)
Xint x, y, mag, type;
Xchar *color;
X{
X if (mag > 6)
X INTIN[0] = 6;
X else if (mag < 1)
X INTIN[0] = 1;
X else
X INTIN[0] = mag; /* No conversion necessary, direct map into palette */
X if (mag < 2) /* Brightest stars will be in color if possible */
X if (color != NULL)
X if ((color[0] == 'O') || (color[0] == 'B'))
X INTIN[0] = 8; /* Color register 8 holds blue */
X else if ((color[0] == 'K') || (color[0] == 'M'))
X INTIN[0] = 9; /* Color register 9 holds red */
X PTSIN[0] = xadjust(CURRX = x);
X PTSIN[1] = yadjust(CURRY = y);
X if (mag < 1)
X drawBigStar(x, y); /* Bright stars clobber anything under them */
X else if (linea2() == 0) /* See if there's anything there already */
X linea1();
X}
X
X/*
X** Draw a bright star as a cross shape.
X*/
XdrawBigStar(x, y)
Xint x, y;
X{
X linea1(); /* x, y */
X --PTSIN[0];
X linea1(); /* x-1, y */
X ++PTSIN[0];
X --PTSIN[1];
X linea1(); /* x, y-1 */
X PTSIN[1] += 2;
X linea1(); /* x, y+1 */
X ++PTSIN[0];
X --PTSIN[1];
X linea1(); /* x+1, y */
X}
X
X/*
X** Draw a nebula. ('type' = 'D' for diffuse, 'P' for planetary)
X*/
XdrawNebu(x, y, mag, type, color)
Xint x, y, mag, type;
Xchar *color;
X{
X /* This isn't as clever as cstar() in starimag.c, but it's fast */
X INTIN[0] = 7; /* Make 'em faint, with this shape: */
X PTSIN[0] = xadjust(CURRX = x) - 1; /* ** */
X PTSIN[1] = yadjust(CURRY = y); /* * * */
X linea1(); /* x-1, y ** */
X ++PTSIN[1];
X linea1(); /* x-1, y+1 */
X ++PTSIN[0];
X ++PTSIN[1];
X linea1(); /* x, y+2 */
X PTSIN[1] -= 3;
X linea1(); /* x, y-1 */
X ++PTSIN[0];
X ++PTSIN[1];
X linea1(); /* x+1, y */
X ++PTSIN[1];
X linea1(); /* x+1, y+1 */
X}
X
X/*
X** Draw a galaxy. ('type' = 'P' for sphere, 'S' for spiral)
X*/
XdrawGalx(x, y, mag, type, color)
Xint x, y, mag, type;
Xchar *color;
X{
X int i;
X
X CURRX = x;
X CURRY = y;
X INTIN[0] = 7; /* Make 'em faint, with this shape: */
X PTSIN[0] = xadjust(CURRX = x) - 2; /* ** * */
X PTSIN[1] = yadjust(CURRY = y); /* ****** */
X for (i = 0; i < 6; ++i) { /* * ** */
X PTSIN[0] += 1;
X linea1(); /* (x-2)+i, y */
X }
X ++PTSIN[0];
X --PTSIN[1];
X linea1(); /* x+4, y-1 */
X PTSIN[0] -= 3;
X linea1(); /* x+1, y-1 */
X --PTSIN[0];
X linea1(); /* x, y-1 */
X PTSIN[1] += 2;
X linea1(); /* x, y+1 */
X ++PTSIN[0];
X linea1(); /* x+1, y+1 */
X PTSIN[0] -= 4;
X linea1(); /* x-3, y+1 */
X}
X
X/*
X** Draw a cluster. ('type' = 'G' for glob., 'O' for open, 'C' for Galactic)
X*/
XdrawClus(x, y, mag, type, color)
Xint x, y, mag, type;
Xchar *color;
X{
X INTIN[0] = 7; /* Make 'em faint, with this shape: */
X PTSIN[0] = xadjust(CURRX = x); /* * * */
X PTSIN[1] = yadjust(CURRY = y); /* * * * */
X linea1(); /* x, y * * */
X PTSIN[0] -= 2;
X linea1(); /* x-2, y */
X ++PTSIN[0];
X --PTSIN[1];
X linea1(); /* x-1, y-1 */
X PTSIN[0] += 2;
X linea1(); /* x+1, y-1 */
X PTSIN[1] += 2;
X linea1(); /* x+1, y+1 */
X PTSIN[0] -= 2;
X linea1(); /* x-1, y+1 */
X PTSIN[0] += 3;
X --PTSIN[1];
X linea1(); /* x+2, y */
X}
SHAR_EOF
chmod 0600 starst.c || echo "restore of starst.c fails"
rm -f s2_seq_.tmp
echo "You have unpacked the last part"
exit 0