magore@watdcsu.waterloo.edu (Mike Gore, Institute Computer Research - ICR) (03/03/89)
2400HZ Crystal phase lock Weather Satellite decoder
Updated by Mike Gore March 1989
Part 3 of 3
===========
: This is a shar archive. Extract with sh, not csh.
: The rest of this file will extract:
: makefile sat.h sup.h disp.c dofloyd.c dohist.c get.c sup.c
echo Extracting makefile
sed 's/^X//' > makefile << 'e-o-f'
X# Mark Williams version 3.0.9 C for the ATARI ST
X#
XCFLAGS= -O -c
XLDFLAGS=
X
XSUP= dofloyd.o dohist.o sup.o
X
Xall: get.ttp disp.ttp
X
Xget.ttp: get.o setrte.o sup.o
X cc $(LDFLAGS) get.o sup.o setrte.o -o get.ttp
X
Xdisp.ttp: $(SUP) disp.o
X cc $(LDFLAGS) disp.o $(SUP) -o disp.ttp -lm
X
Xdisp.o: disp.c
X cc $(CFLAGS) disp.c
X
Xdofloyd.o: dofloyd.c
X cc $(CFLAGS) dofloyd.c
X
Xdohist.o: dohist.c
X cc $(CFLAGS) dohist.c
X
Xsup.o: sup.c
X cc $(CFLAGS) sup.c
X
Xget.o: get.c
X cc $(CFLAGS) get.c
X
Xsetrte.o: setrte.s
X cc $(CFLAGS) setrte.s
e-o-f
echo Extracting sat.h
sed 's/^X//' > sat.h << 'e-o-f'
X/*
X * Mike Gore
X * March 1989
X * watmath!watdcsu!magore
X * watmath!mgvax!mike
X*/
X
X#define HSIZE 1200
X#define GREY 256
X#define BITS 8
e-o-f
echo Extracting sup.h
sed 's/^X//' > sup.h << 'e-o-f'
X/*
X * Mike Gore
X * March 1989
X * watmath!watdcsu!magore
X * watmath!mgvax!mike
X*/
X
X#define setres(a) ( *((char *) 0xff8260L) = (int) (a))
X#define getres() ( *((char *) 0xff8260L) & 0xff)
X#define extsync() ( *((char *) 0xff820aL) = (1) )
X#define intsync() ( *((char *) 0xff820aL) = (0) )
X#define giport(a) ( *((char *) 0xff8800L) = (a) )
X#define giwrite(a) ( *((char *) 0xff8802L) = (a) )
X#define giread() ( *((unsigned char *) 0xff8800L) )
X#define strobeon() ( giport(14), giwrite(giread() | 0x20) )
X#define strobeoff() ( giport(14), giwrite(giread() & ~0x20) )
X#define stat() ( *((char *) 0xfffa01L) )
X#define setcol(a,b) ( *((int *) (0xff8240L+((int)(a)<<1)) ) = ((int)(b))&0x1ff )
X#define getcol(a) ( *((int *) (0xff8240L+((int)(a)<<1)) ) & 0x1ff )
e-o-f
echo Extracting disp.c
sed 's/^X//' > disp.c << 'e-o-f'
X/*
X * Mike Gore
X * March 1989
X * watmath!watdcsu!magore
X * watmath!mgvax!mike
X*/
X
X#include <osbind.h>
X#include <linea.h>
X#include <math.h>
X#include <stdio.h>
X
X#include "sat.h"
X#include "sup.h"
X
X
Xint XMAX = 300;
Xint YMAX = 200;
X
X#define USAGE "line offset [-hcys1234]
X
Xlong histb[GREY];
Xunsigned char mapb[GREY];
X
Xunsigned char inbuf[HSIZE+1], outbuf[HSIZE+1], tmpbuf[HSIZE+1];
X
Xchar line[256];
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
X int fp;
X int Lskip = 0;
X int Loff = 0;
X int Lswap = 0;
X long Vpos = 0L;
X int nres, ores;
X int hflag = 0;
X int cflag = 0;
X int yflag = 0;
X int sflag = 1;
X int val,vmin,vmax;
X
X int i,s,x,y;
X char *ptr = "";
X
X
X long lseek();
X
X
X if(argc < 4 || argc > 5) {
X fprintf(stderr,"Usage: %s\n",argv[0],USAGE);
X exit(1);
X }
X if(argc == 5) {
X ptr= argv[4];
X if(*ptr != '-') {
X fprintf(stderr,"Usage: %s\n",argv[0],USAGE);
X exit(1);
X }
X
X for(i=1;ptr[i];++i) {
X switch(ptr[i]) {
X case '1':
X case '2':
X case '3':
X case '4':
X sflag = ptr[i] - '0';
X break;
X case 'h':
X hflag = 1;
X break;
X case 's':
X Lswap = 1;
X break;
X case 'c':
X cflag = 1;
X break;
X case 'y':
X yflag = 1;
X break;
X default:
X fprintf(stderr,
X "%s: unknown mode:%s\n",
X argv[0],ptr);
X exit(1);
X }
X }
X
X }
X if((fp=open(argv[1],0)) < 0 ) {
X fprintf(stderr,"%s:Can't open:%s\n",argv[0],argv[1]);
X exit(1);
X }
X
X Lskip = atoi(argv[2]);
X Loff = atoi(argv[3]);
X
X Vpos = (long)HSIZE*Lskip + (long)Loff;
X
X map_init(mapb);
X
X ores = Getrez();
X nres = (ores == 2) ? 2 : 0;
X scrinit(nres);
X
X switch(nres) {
X case 0:
X XMAX = 320;
X YMAX = 200;
X break;
X case 1:
X XMAX = 500;
X YMAX = 200;
X break;
X case 2:
X floyd_init();
X XMAX = 500;
X YMAX = 400;
X break;
X }
X
X for(y=0; y<YMAX; y += sflag) {
X
X if(lseek(fp, Vpos, 0)<0)
X break;
X if(read(fp, inbuf, XMAX)<XMAX)
X break;
X Vpos += HSIZE;
X
X if(yflag) {
X if(lseek(fp, Vpos, 0)<0)
X break;
X if(read(fp, tmpbuf, XMAX)<XMAX)
X break;
X Vpos += HSIZE;
X for(i=0;i<XMAX;++i)
X inbuf[i] = (inbuf[i]+tmpbuf[i])>>1;
X }
X
X if(cflag) {
X vmin = 255;
X vmax = 0;
X for(i=0;i<XMAX;++i) {
X val = inbuf[i];
X if(val > vmax)
X vmax += ((val-vmax)/2);
X if(val < vmin)
X vmin -= ((vmin-val)/2);
X }
X val = vmax - vmin + 1;
X for(i=0;i<GREY;++i) {
X if(i < vmin)
X mapb[i] = 0;
X else if(i > vmax)
X mapb[i] = 255;
X else
X mapb[i] = (i-vmin)*256/val;
X }
X }
X
X if(hflag) {
X hist_init(histb);
X hist_add(histb, inbuf, XMAX/sflag);
X hist_to_map(histb, mapb);
X }
X
X if(sflag == 1) {
X map(mapb, inbuf, outbuf, XMAX);
X }
X else {
X map(mapb, inbuf, tmpbuf, XMAX/sflag);
X scale(tmpbuf,outbuf,XMAX,sflag);
X }
X
X if(nres) {
X floyd(outbuf,tmpbuf,XMAX);
X for(s=0;s<sflag;++s) {
X if(Lswap == 1)
X wline1(tmpbuf, YMAX-(y+s)-1, XMAX, 1);
X else
X wline1(tmpbuf, (y+s), XMAX, 0);
X }
X }
X else {
X for(s=0;s<sflag;++s) {
X if(Lswap == 1)
X wline4(outbuf, YMAX-(y+s)-1, XMAX, 1);
X else
X wline4(outbuf, (y+s), XMAX, 0);
X }
X }
X }
X gets(line);
X screxit(ores);
X close(fp);
X}
X
Xscale(iptr,optr,len,mag)
Xregister unsigned char *iptr, *optr;
Xint len,mag;
X{
X register int i,s;
X
X for(i=0;i<len; i+= mag) {
X for(s=0;s<mag;++s)
X *optr++ = *iptr;
X iptr++;
X }
X}
e-o-f
echo Extracting dofloyd.c
sed 's/^X//' > dofloyd.c << 'e-o-f'
X#include "sat.h"
X
X/*
X * The Original code for this routine was writen by Alan Paeth
X * watmath!watcgl!awpaeth
X */
X
Xstatic int errtab[HSIZE+1];
X
Xfloyd_init()
X{
X int i;
X
X for(i=0;i<HSIZE;++i)
X errtab[i] = 0;
X}
X
X
X/*
X * fast conversion loop
X */
X
Xfloyd(invec,outvec, count)
Xregister unsigned char *invec, *outvec;
Xregister int count;
X{
X
X register int err, err4, err16;
X register int *errv;
X register int maxval, maxval2, diag, down;
X
X errv = errtab;
X
X err4 = err16 = diag = down = 0;
X maxval = (1L<<BITS)-1;
X maxval2 = maxval>>1;
X
X do {
X err = (*invec++)+(errv[1])+err4+err4-err16;
X if (err >= maxval2) {
X *outvec++ = 1;
X err -= maxval;
X }
X else *outvec++ = 0;
X err4 = err>>2;
X err16 = err>>4;
X *errv++ = down + err4 - err16;
X down = diag + err4 + err16;
X diag = err16;
X } while (--count > 0);
X *errv++ = down;
X}
e-o-f
echo Extracting dohist.c
sed 's/^X//' > dohist.c << 'e-o-f'
X/*
X * Mike Gore
X * March 1989
X * watmath!watdcsu!magore
X * watmath!mgvax!mike
X*/
X
X#include "sat.h"
X
X
Xhist_init(hist_buf)
Xlong *hist_buf;
X{
X register int x;
X
X for(x=0;x<GREY;++x)
X hist_buf[x] = 0L;
X}
X
Xhist_add(hist_buf, inbuf, len)
Xregister long *hist_buf;
Xregister unsigned char *inbuf;
Xregister int len;
X{
X register int x;
X
X for(x=0;x<len;++x)
X ++hist_buf[inbuf[x]];
X}
X
Xhist_to_map(hist_buf, map)
Xregister long *hist_buf;
Xregister unsigned char *map;
X{
X register int x;
X register long Hsum,Hcnt;
X
X for(Hcnt=0L,x=0;x<GREY;++x)
X Hcnt += hist_buf[x];
X
X for(Hsum=0L,x=0;x<GREY;++x) {
X Hsum += hist_buf[x];
X map[x] = (Hsum << 8) / (Hcnt+1);
X }
X}
X
Xmap_init(map)
Xregister unsigned char *map;
X{
X register int x;
X
X for(x=0;x<GREY;++x)
X map[x] = x;
X}
X
X
Xmap(map,inbuf,outbuf,len)
Xregister unsigned char *map, *inbuf, *outbuf;
Xregister int len;
X{
X register int x;
X
X for(x=0;x<len;++x)
X outbuf[x] = map[inbuf[x]&0xff];
X}
e-o-f
echo Extracting get.c
sed 's/^X//' > get.c << 'e-o-f'
X/*
X * Mike Gore
X * March 1989
X * watmath!watdcsu!magore
X * watmath!mgvax!mike
X*/
X
X#include <osbind.h>
X#include <linea.h>
X#include <stdio.h>
X
X#include "sup.h"
X#include "sat.h"
X
Xint XMAX = 300;
Xint YMAX = 200;
X
X#define EXT
X
X#define VMEM (16L*(long)HSIZE)
X
Xlong save_ssp;
Xunsigned char *mptr;
Xunsigned int Vsum = 0;
Xunsigned int Vsize = 0L;
Xunsigned int Vhead = 0L;
Xunsigned int Vtail = 0L;
Xint Verror = 0;
Xint Vcnt = 0;
X
Xint pmin = 0;
Xint pmax = 0;
X
Xunsigned char scan[HSIZE+1];
Xunsigned char Vbuff[HSIZE+1];
X
X#ifdef EXT
Xvoid extstrobe()
X{
X setrte();
X if(Vsize < VMEM) {
X giport(15);
X mptr[Vhead++] = giread();
X if(Vhead >= VMEM)
X Vhead = 0;
X Vsize++;
X }
X else {
X Verror = 1;
X }
X *((char *) 0xfffa11L) &= ~0x01;
X}
X
X#else
X
Xvoid timetick()
X{
X setrte();
X if(++Vcnt >= 2) {
X if(Vsize < VMEM) {
X mptr[Vhead++] = Vsum>>1;
X if(Vhead >= VMEM)
X Vhead = 0;
X Vsize++;
X }
X else {
X Verror = 1;
X }
X Vcnt = 0;
X Vsum = 0;
X }
X giport(15);
X Vsum += giread();
X strobeoff();
X strobeon();
X *((char *) 0xfffa0fL) &= ~0x20;
X}
X
X#endif
X
X
Xmain(argc,argv)
Xint argc; char *argv[];
X{
X register unsigned char *ptr1;
X register int i;
X int x,y;
X
X int nres, ores;
X int val = 0;
X int line = 0;
X long *vecp = (long *) 0x100L;
X long oldvec = 0L;
X unsigned int oldmask = 0;
X int fp;
X
X
X if(argc < 2) {
X printf("Usage: vmain OUTfile\n");
X exit(1);
X }
X
X if((fp=creat(argv[1],1)) < 0) {
X printf("Can't open: %s\n",argv[1]);
X exit(1);
X }
X fflush(stdout);
X
X init();
X ores = Getrez();
X nres = (ores == 2) ? 2 : 0;
X scrinit(nres);
X
X switch(nres) {
X case 0:
X XMAX = 320;
X YMAX = 200;
X break;
X case 1:
X XMAX = 640;
X YMAX = 200;
X break;
X case 2:
X XMAX = 640;
X YMAX = 400;
X break;
X }
X
X save_ssp = Super(0L);
X#ifdef EXT
X Jdisint(0);
X oldvec = vecp[0];
X vecp[0] = (long) extstrobe;
X oldmask = *((char *) 0xfffa03L);
X *((char *) 0xfffa03L) |= 0x01;
X Jenabint(0);
X#else
X Xbtimer(0,3,32,timetick);
X#endif
X Super(save_ssp);
X
X while(Verror == 0) {
X if(Cconis() != 0) {
X Verror = 1;
X printf("\n\n");
X break;
X }
X if(Vsize < HSIZE )
X continue;
X ptr1 = (unsigned char *) &mptr[Vtail];
X for(i=0;i<HSIZE; i++ ) {
X val = *ptr1++;
X Vbuff[i] = val;
X switch(nres) {
X case 0:
X if((i&3)==0) {
X x = i >> 2;
X y = 128 - (val>>1);
X clr4(x,scan[x],15);
X set4(x,y,15);
X scan[x] = y;
X }
X break;
X case 1:
X if((i&1)==0) {
X x = i >> 1;
X y = 128 - (val>>1);
X clr2(x,scan[x],3);
X set2(x,y,3);
X scan[x] = y;
X }
X break;
X case 2:
X if((i&1)==0) {
X x = i >> 1;
X y = 256 - val;
X clr1(x,scan[x],1);
X set1(x,y,1);
X scan[x] = y;
X }
X break;
X }
X }
X Vsize -= HSIZE;
X Vtail += HSIZE;
X if(Vtail >= VMEM)
X Vtail = 0;
X if(write(fp,Vbuff,(int)HSIZE) != (int)HSIZE ) {
X printf("Write error: %s\n", argv[1]);
X Verror = 1;
X break;
X }
X ++line;
X printf("line:%5d, Vsize:%5d\r",line, Vsize);
X fflush(stdout);
X }
X
X save_ssp = Super(0L);
X#ifdef EXT
X Jdisint(0);
X vecp[0] = oldvec;
X oldmask = *((char *) 0xfffa03L) = oldmask;
X#else
X Xbtimer(0,0,0,0L);
X#endif
X Super(save_ssp);
X
X close(fp);
X screxit(ores);
X portout();
X}
X
X
Xinit()
X{
X register int i;
X
X Vsize = 0;
X Vhead = 0;
X Vtail = 0;
X Verror = 0;
X
X portin();
X mptr = (unsigned char *) Malloc((long)(VMEM)+1L);
X if(mptr == 0L) {
X printf("Malloc Failed\n");
X exit(1);
X }
X for(i=0;i<VMEM;++i)
X mptr[i] = 0;
X}
e-o-f
echo Extracting sup.c
sed 's/^X//' > sup.c << 'e-o-f'
X#include <osbind.h>
X#include <linea.h>
X#include <stdio.h>
X#include "sup.h"
X
Xunsigned int disp[] = {
X 0x000,0x001,0x011,0x111,
X 0x112,0x222,0x223,0x333,
X 0x334,0x444,0x445,0x555,
X 0x556,0x666,0x667,0x777
X};
X
Xunsigned int Smap[] = {
X 0x000,0x001,0x011,0x111,
X 0x112,0x222,0x223,0x333,
X 0x334,0x444,0x445,0x555,
X 0x556,0x666,0x667,0x777
X};
X
Xlong Vbase;
Xlong save_ssp;
X
Xvclr(ptr,size)
Xregister unsigned char *ptr;
Xregister long size;
X{
X while(size--)
X *ptr++ = 0;
X}
X
Xvcopy(dest, src, size)
Xregister unsigned char *dest, *src;
Xregister long size;
X{
X while(size--)
X *dest++ = *src++;
X}
X
Xscrinit(mode)
Xint mode;
X{
X Cursconf(0,30);
X Getpallete(Smap);
X Setscreen(-1L, -1L, mode);
X Setpallete(disp);
X linea0();
X Vbase = Physbase();
X vclr(Vbase, 0x8000L);
X}
X
Xscrexit(mode)
Xint mode;
X{
X Setscreen(-1L, -1L, mode);
X Setpallete(Smap);
X Cursconf(1,30);
X}
X
Xportin()
X{
X save_ssp = Super(0L);
X strobeon();
X giport(7);
X giwrite( (giread() & 0x7f) );
X *((char *) 0xfffa0fL) &= ~0x20;
X Super(save_ssp);
X
X}
X
Xportout()
X{
X save_ssp = Super(0L);
X giport(7);
X giwrite( (giread() | 0x80) );
X strobeon();
X Super(save_ssp);
X}
X
XGetpallete(pal)
Xunsigned int *pal;
X{
X int i;
X
X save_ssp = Super(0L);
X for(i=0;i<16;++i)
X *pal++ = getcol(i);
X Super(save_ssp);
X}
X
Xset1(x,y,color)
Xregister unsigned int x,y,color;
X{
X register unsigned int mask = ((unsigned) 0x8000) >> (x & 0xf);
X register unsigned int *ptr = Vbase + (80L * y) + ((x & 0xfff0)>>3);
X *ptr |= ((color & 1) ? mask : 0);
X}
X
Xclr1(x,y,color)
Xregister unsigned int x,y,color;
X{
X register unsigned int mask = ((unsigned) 0x8000) >> (x & 0xf);
X register unsigned int *ptr = Vbase + (80L * y) + ((x & 0xfff0)>>3);
X *ptr &= ~((color & 1) ? mask : 0);
X}
X
Xset4(x,y,color)
Xregister unsigned int x,y,color;
X{
X register unsigned int mask = ((unsigned) 0x8000) >> (x & 0xf);
X register unsigned int *ptr = Vbase + (160L * y) + ((x & 0xfff0)>>1);
X *ptr++ |= ((color & 1) ? mask : 0);
X *ptr++ |= ((color & 2) ? mask : 0);
X *ptr++ |= ((color & 4) ? mask : 0);
X *ptr |= ((color & 8) ? mask : 0);
X}
X
Xclr4(x,y,color)
Xregister unsigned int x,y,color;
X{
X register unsigned int mask = ((unsigned) 0x8000) >> (x & 0xf);
X register unsigned int *ptr = Vbase + (160L * y) + ((x & 0xfff0)>>1);
X *ptr++ &= ~((color & 1) ? mask : 0);
X *ptr++ &= ~((color & 2) ? mask : 0);
X *ptr++ &= ~((color & 4) ? mask : 0);
X *ptr &= ~((color & 8) ? mask : 0);
X}
X
Xwline1(buf, y, len, swap)
Xregister unsigned char *buf;
Xint y, len, swap;
X{
X register unsigned int tmp;
X register unsigned int mask;
X register unsigned int *ptr = Vbase + (80L * y);
X
X if(!swap) {
X while(len>0) {
X for(tmp=0,mask=0x8000;mask>0 && len>0;mask >>= 1)
X tmp |= (*buf++ ? mask : 0);
X *ptr++ = tmp;
X len -= 16;
X }
X }
X else {
X buf += (len-1);
X while(len>0) {
X for(tmp=0,mask=0x8000;mask>0 && len>0;mask >>= 1)
X tmp |= (*buf-- ? mask : 0);
X *ptr++ = tmp;
X len -= 16;
X }
X }
X}
X
Xwline4(buf, y, len, swap)
Xregister unsigned char *buf;
Xint y, len, swap;
X{
X register unsigned int mask;
X register unsigned int *ptr = Vbase + (160L * y);
X register unsigned int val;
X
X if(!swap) {
X while(len>0) {
X for(mask=0x8000;mask>0 && len>0;mask >>= 1) {
X val = *buf++ >> 4;
X ptr[0] |= ((val & 1) ? mask : 0);
X ptr[1] |= ((val & 2) ? mask : 0);
X ptr[2] |= ((val & 4) ? mask : 0);
X ptr[3] |= ((val & 8) ? mask : 0);
X }
X ptr += 4;
X len -= 16;
X }
X }
X else {
X buf += (len-1);
X while(len>0) {
X for(mask=0x8000;mask>0 && len>0;mask >>= 1) {
X val = *buf-- >> 4;
X ptr[0] |= ((val & 1) ? mask : 0);
X ptr[1] |= ((val & 2) ? mask : 0);
X ptr[2] |= ((val & 4) ? mask : 0);
X ptr[3] |= ((val & 8) ? mask : 0);
X }
X ptr += 4;
X len -= 16;
X }
X }
X}
X
X
X
X/* set2 & clr2 are untested */
Xset2(x,y,color)
Xregister unsigned int x,y,color;
X{
X register unsigned int mask = ((unsigned) 0x8000) >> (x & 0xf);
X register unsigned int *ptr = Vbase + (160L * y) + ((x & 0xfff0)>>2);
X *ptr++ |= ((color & 1) ? mask : 0);
X *ptr |= ((color & 2) ? mask : 0);
X}
X
Xclr2(x,y,color)
Xregister unsigned int x,y,color;
X{
X register unsigned int mask = ((unsigned) 0x8000) >> (x & 0xf);
X register unsigned int *ptr = Vbase + (160L * y) + ((x & 0xfff0)>>2);
X *ptr++ &= ~((color & 1) ? mask : 0);
X *ptr &= ~((color & 2) ? mask : 0);
X}
X
e-o-f
exit 0