/* VIEWER 03/19/92 */ /* Programmed by Terry Newton */ /* This program runs Binary and */ /* Basic programs, read text or */ /* display bitmap graphic files */ /* (normal and compressed) */ /* Requires... */ /* ACECIO.CCC Functions */ /* CMP6D40.OBJ Compress ML */ /* GR7P6F00.OBJ GR15 ML */ /* BRUN0590.OBJ Bin Load ML */ /* ENGINE.OBJ Ace Runtime */ int check1,reentry,basic; int cr0,cr1,cr2,cr3,cr4,grmode; int key,err,esc,i,n,dircnt,func; int halfpnt,reread,ftype,a,b,c,d,e; int menucnt,pagenum,gr7,picmode; int drvnum,esc3,blksfree,exitflg; int lpos,llen,wpos; int check2,flen,scrval; int eof,size,bufptr,len; char word[80],darr[129*12],fext[4]; char path[80],fspec[80],inpstr[80]; char *tmptr,*start,*temp,*ptr; char *scrbuf,*filebuf; main() $( if(peek(0x6F00)>0)check1=0; if(check1!=12345||check2!=12345) $( drvnum=peek(0x0021); strcpy(path,"D1:"); poke(path+1,drvnum+48); reentry=0; $) else reentry=1; /* set Sparta RUNLOC */ if(peek(dpeek(10)+28)==128|| peek(0x0700)==0x53) dpoke(dpeek(10)+61,0x3635); if(dpeek(0xBFFA)==0xA000)basic=1; else basic=0; poke(0x6F00,0);scrval=0; scrbuf=0x7000;filebuf=0x7400; check1=0;check2=0;exitflg=0; if(reentry==0) $( readdsk();pagenum=0; $) else reentry=0; while(exitflg==0) $( pickfile(); if(func==1)readdsk(); if(func==2)loadfile(); if(func==3)exitflg=1; $) check1=12345;check2=12345; printf("↰");poke(752,0);exit(); $) /* set colors */ setcols() $( poke(708,cr0);poke(709,cr1); poke(710,cr2);poke(711,cr3); poke(712,cr4); $) /* text mode */ textmode() $( graphics(0);poke(82,2); poke(752,1);printf("↰"); cr0=0;cr1=12;cr2=0; cr3=0;cr4=0;setcols(); $) /* error!!! */ errtrap() $( err=abs(err);closeall(); textmode();position(2,5); printf("Error #%d\n",err); func=999;getkb(); $) /* no attract getkey */ getkb() $( while(peek(764)==255)poke(77,0); key=getkey(); $) /* read directory into array */ readdsk() $( blksfree=0;dircnt=0; scrval=0;pagenum=0; textmode();position(2,10); strcpy(fspec,path); strcat(fspec,"*.*"); printf("Reading %s\n",fspec); err=open(1,6,0,fspec); if(err<0) errtrap(); else $( dircnt=0;esc=0; while(esc==0) $( err=cgets(inpstr,1); if(err>0) $( temp=strlen(inpstr); if(temp>=17) $( move(inpstr+1,fspec,12); poke(fspec+12,0); if(strcmp(fspec+9,"DIR")==0) $( poke(fspec,'.'); strcpy(fspec+9," "); $) temp=dircnt*12;temp+=darr; move(fspec,temp,12);dircnt++; $) else $( move(inpstr,fspec,4); blksfree=val(fspec); $) $) else esc=1; err=0; $) $) close(1); $) /* File Selection Menu */ pickfile() $( textmode(); if(scrval) move(scrbuf,dpeek(88),960); else $( temp=pagenum*36; if(dircnt<temp+37) menucnt=dircnt-temp; else menucnt=36; printf("%s %d FILES %d FREE",path,dircnt,blksfree); halfpnt=(menucnt+1)/2;position(2,2); if(menucnt>0) $( for(i=0;i<halfpnt&&i<menucnt;i++) $( temp=i+65;prtname(); $) position(2,2); for(i=halfpnt;i<menucnt;i++) $( temp=i+65;if(temp>90)temp=i+22; printf("→→→→→→→→→→→→→→→→→→→"); prtname(); $) $) position(2,22); printf(" ESC "); if(strlen(path)==3) printf("Disk"); else printf("Main"); printf(" RET DOS "); if(dircnt>36) printf(" SPC Page"); if(basic)printf("\n(BASIC ON)↑"); printf("\n");poke(764,255); move(dpeek(88),scrbuf,960);scrval=1; $) func=0;while(func==0) $( getkb();key=toupper(key); if(key=='␛') $( func=999;err=128; while(err>2) $( if(strlen(path)==3) $( printf("↰↓↓Select Drive (1-8)"); drvnum=0; while(drvnum<1||drvnum>8) $( drvnum=getkey()-48; $) $) strcpy(path,"D1:"); poke(path+1,drvnum+48); readdsk();pagenum=0;key=0; $) $) if(key==32&&dircnt>36) $( func=999;pagenum++;scrval=0; if(pagenum*36>dircnt)pagenum=0; $) if(key==155)func=3; /* Determine File to Load */ temp=999; if(key>='A'&&key<='Z')temp=key-65; if(key>='0'&&key<='9')temp=key-22; if(temp<menucnt&&temp>=0) $( temp+=36*pagenum; temp*=12;tmptr=temp+darr+1; /* build fspec */ move(tmptr+8,fext,3); poke(fext+3,0); move(tmptr,fspec,8); poke(fspec+8,0); for(i=0;i<8;i++) $( if(peek(fspec+i)==32) poke(fspec+i,0); $) if(peek(fext)!=32) $( for(i=0;i<3;i++) $( if(peek(fext+i)==32) poke(fext+i,0); $) strcat(fspec,"."); strcat(fspec,fext); $) strcpy(inpstr,fspec); strcpy(fspec,path); strcat(fspec,inpstr); i=strlen(fspec); for(;i<80;i++)poke(fspec+i,0); /* subdirectory? */ if(peek(tmptr-1)!='.')func=2; else $( strcat(fspec,">"); strcpy(path,fspec);func=1; $) $) $) $) /* print filename */ prtname() $( printf(" %c ",temp+128); tmptr=i;tmptr+=pagenum*36; tmptr*=12;tmptr+=darr; move(tmptr,fspec,12); poke(fspec+12,0); printf("%s\n",fspec); $) /* Determine file type and load */ loadfile() $( err=open(1,4,0,fspec); if(err<0)errtrap(); else $( a=cgetc(1);b=cgetc(1);close(1); picmode=0;if(strcmp(fext,"MIC")==0) $( picmode=1;loadima(); $) else if(a==255&&b==255)binload(); else if(a==0&&b==0)basload(); else if(a>0&&a<32)loadima(); else disptext(); $) $) /* binary load */ binload() $( if(strcmp(fext,"COM")==0) poke(0x0589,1); else poke(0x0589,0); textmode();position(6,4); printf("Loading %s\n\n",fspec); poke(752,0);brun(fspec);scrval=0; $) /* basic load */ basload() $( if(basic) $( poke(752,0); printf("↰↓↓↓RUN\34%s\34\n",fspec); printf("↑↑↑");poke(764,12);basrun(); $) else disptext(); $) /* load image file */ loadima() $( len=0;open(1,4,0,fspec); gr7=0;grmode=8;cr0=0;cr1=12; cr2=0;cr3=0;cr4=0; if(picmode==0) $( grmode=cgetc(1)&15; if(grmode==15) $(grmode=8;gr7=1;$) cr0=cgetc(1);cr1=cgetc(1); cr2=cgetc(1);cr3=cgetc(1); cr4=cgetc(1); $) if(grmode>6) $( graphics(grmode+16);setcols(); start=dpeek(0x0058); flen=7680;if(grmode==7)flen=3840; if(cr3!=254)bgets(start,flen,1); else if(basic==0) decode(start,flen,1); if(gr7) $( graphics(8+48);gr7plus();setcols(); $) clear(filebuf,500); len=bgets(filebuf,500,1); close(1);getkb(); if(key=='┼') $( graphics(grmode+32); if(gr7)gr7plus();setcols(); printf("↰*** SAVE IMAGE ***\n"); printf("1) Normal 2) Bitmap "); key=getkey(); if(key=='1'&&basic)key=0; if(key=='1'||key=='2') $( printf("%c\n",key);picmode=key-49; printf("Filename >");gets(fspec); if(picmode)normalize(fspec,"MIC"); else normalize(fspec,"PIC"); err=open(1,8,0,fspec); if(err<0)errtrap; else $( graphics(grmode+48);setcols(); if(gr7)gr7plus(); if(picmode)bputs(start,flen,1); else $( if(gr7)cputc(15,1); else cputc(grmode,1); cputc(cr0,1);cputc(cr1,1); cputc(cr2,1);cputc(254,1); cputc(cr4,1); encode(start,flen,1); if(len>1)bputs(filebuf,len,1); $) $) $) $) $) close(1); $) /* ML Links */ encode() asm 0x6D40; decode() asm 0x6D43; brun() asm 0x0590; basrun() asm 0xA000; gr7plus() asm 0x6F01; /* display text file */ disptext() $( poke(82,0);printf("↰"); llen=40;esc=0;lpos=0;wpos=0; open(1,4,0,fspec); size=bgets(filebuf,2048,1); if(size<2048)eof=1;else eof=0; bufptr=0;err=0; while(esc==0) $( temp=*(filebuf+bufptr);bufptr++; if(bufptr>=size) $( if(eof==0) $( bufptr=0; size=bgets(filebuf,2048,1); if(size<2048)eof=1;else eof=0; $) else err=128; $) if(err>1)esc=1;else $( poke(word+wpos,temp);wpos++; if(temp==32||wpos>78||temp==155) $( if(lpos+wpos>llen) $( if(lpos<llen)printf("\n"); lpos=0; $) d=0;while(d<wpos) $( c=peek(word+d); printf("␛%c",c);d++; $) lpos=lpos+wpos;wpos=0; if(temp==155)lpos=0; key=peek(764);if(key<255) $( poke(764,255); if(key==28)esc=2; /* ESC */ if(key==33) $( /* SPC */ getkb();if(key=='␛')esc=2; $) $) $) $) $) close(1);if(esc==1) $( d=0;while(d<wpos) $( c=peek(word+d); printf("␛%c",c);d++; $) getkb(); $) $)