home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ENTERPRS
/
CPM
/
UTILS
/
S
/
ZMP-SRC.LZH
/
ZMTERM3.C
< prev
next >
Wrap
Text File
|
2000-06-30
|
6KB
|
275 lines
/* TERM module File 3 */
#include "zmp.h"
#ifdef AZTEC_C
#include "libc.h"
#else
#include <stdio.h>
#endif
static short Lines, Entries;
directory()
{
short factor, cpm3;
long *lp = (long *) CPMBUF;
unsigned i, dtotal, atotal, allen, remaining, bls, dirbufsize;
char *grabmem(), *alloca, *p, *dirbuf;
struct dpb *thedpb;
cls();
sprintf(Buf,"Directory for Drive %c%d:",Currdrive,Curruser);
putlabel(Buf);
bdos(SETDMA,CPMBUF); /* set dma address */
cpm3 = (bdoshl(12) >= 0x30); /* get cp/m version (BCD) */
dirbuf = grabmem(&dirbufsize);
if (dirbuf != (char *) MEMORY_FULL)
sorted_dir(dirbuf,dirbufsize);
else /* not enough room */
unsort_dir(); /* do unsorted directory */
/* Now print free space on disk */
if (cpm3) { /* cp/m 3 */
bdos(46,Currdrive - 'A');
p = (char *) (CPMBUF + 3);
*p = 0; /* clear hi byte for long */
remaining = (short) (*lp / 8L);
}
else { /* cp/m 2.2 */
thedpb = (struct dpb *) bdoshl(GETDPB,NULL); /* fill dpb */
alloca = (char *) bdoshl(GETALL,NULL);
bls = 0x0001;
bls <<= thedpb->bsh + 7;
factor = bls/1024;
dtotal = factor * (thedpb->dsm+1);
allen = (thedpb->dsm / 8) + 1;
for (atotal = i = 0; i < allen; i++)
atotal += cntbits(*(alloca + i));
atotal *= factor;
remaining = dtotal - atotal;
}
if (Lines >= DIRLINES - 1)
domore();
if (Entries)
printf("\n\t%d",Entries);
else
printf("\n\tNo");
printf(" File(s).\t\t");
printf("Space remaining on %c: %dk\n",Currdrive,remaining);
}
/* Do sorted directory with filesizes */
sorted_dir(dirbuf,dirbufsize)
unsigned char *dirbuf;
unsigned dirbufsize;
{
short count, limit, dirsort(), dircode, ksize, i;
unsigned size;
char filename[15];
unsigned char *p, *q;
struct sortentry *se;
struct fcb srcfcb;
q = dirbuf;
Lines = 2;
memset(srcfcb.filename,'?',14); /* all filenames, all extents */
limit = dirbufsize / sizeof(struct sortentry); /* how many */
dircode = bdos(17,&srcfcb); /* search first */
for (count = 0; dircode != -1; count++) {
p = ((unsigned char *) CPMBUF + dircode * 32);
for (i = 0; i < 16; i++)
*q++ = *p++ & ((i > 0 && i < 12)
? 0x7f : 0xff);
if (count == limit) { /* can't fit them in */
free(dirbuf);
unsort_dir(); /* do unsorted directory */
return;
}
dircode = bdos(18,&srcfcb); /* search next */
}
qsort(dirbuf,count,16,dirsort); /* sort in alpha order */
/* ok, now print them all */
se = (struct sortentry *) dirbuf;
for (i = Entries = 0; i < count; i++) {
if (!i || memcmp(se, se - 1, 12)) {
size = se->rc + (se->s2 * 32
+ se->ex) * 128;
ksize = (size / 8) + ((size % 8) ? 1 : 0);
memcpy(filename,se->name,8);
filename[8] = '.';
memcpy(filename + 9,se->type,3);
filename[12] = '\0';
printf("%s%4dk",filename,ksize);
if (printsep(SORTCOLS))
break;
Entries++;
}
se++;
}
free(dirbuf);
if (Entries % SORTCOLS)
printf("\n");
}
/* Do unsorted directory */
unsort_dir()
{
short dircode, i;
struct direntry *dp;
Lines = 2;
dircode = getfirst("????????.???");
for (Entries = 0; dircode != 0xff; Entries++) {
dp = (struct direntry *) (CPMBUF + dircode * 32);
memcpy(Pathname,dp->flname,8);
Pathname[8]= '.';
memcpy(Pathname+9,dp->ftype,3);
Pathname[12] = '\0';
for (i = 0; i < 11; i++) /* remove attributes */
Pathname[i] = Pathname[i] & 0x7f;
printf("%s",Pathname);
if (printsep(UNSORTCOLS))
break;
dircode = getnext();
}
if (Entries % UNSORTCOLS)
printf("\n");
}
/* Print separator between directory entries. Do [more] if page full */
/* Return TRUE if end of page and ctl-c or ctl-k typed */
printsep(count)
short count;
{
if ((Entries % count) == count - 1) {
printf("\n");
if (++Lines == DIRLINES) { /* bump line count */
Lines = 0; /* pause if done a page */
return domore(); /* then do [more] */
}
}
else
printf(" | ");
return FALSE;
}
/* Print [more] and wait for a key. Return TRUE if user hit ctl-c or ctl-k */
domore()
{
char c;
printf("[more]");
flush();
while (!(c = bdos(DIRCTIO,INPUT))); /* loop till we get one */
printf("\b\b\b\b\b\b \b\b\b\b\b\b");
if (c == CTRLC || c == CTRLK)
return TRUE;
else
return FALSE;
}
/* Function for qsort to compare two directory entries */
dirsort(p1,p2)
char *p1, *p2;
{
short j;
if (j = memcmp(p1,p2,12))
return j;
/* Both are the same file -- sort on extent */
if ((j = (p1[14] * 32 + p1[12]) - (p2[14] * 32 + p2[12])) > 0)
return -1;
else
return 1;
}
/* Compare memory */
memcmp(p1,p2,count)
char *p1, *p2;
int count;
{
short i, j;
for (i = 0; i < count; i++)
if (j = p1[i] - p2[i])
return j;
return 0; /* both equal */
}
cntbits(byte)
char byte;
{
static int i,count;
for (count=i=0; i<8; i++) {
count += (byte & 1);
byte >>= 1;
}
return count;
}
resetace() /* to default values */
{
Current.cbaudindex = Line.baudindex;
Current.cparity = Line.parity;
Current.cdatabits = Line.databits;
Current.cstopbits = Line.stopbits;
updateace();
}
updateace()
{
initace(Current.cbaudindex,Current.cparity,
Current.cdatabits,Current.cstopbits);
}
hangup()
{
stndout();
printf("\n ZMP: Disconnect (Y/N) <N>? \007");
stndend();
if (toupper(dio()) != 'Y') {
printf("\n");
return;
}
printf("\nHanging up...\n");
dtroff(); /* Turn DTR off for a bit */
mswait(200); /* Like 200 ms */
dtron(); /* Then back on again */
mstrout(Modem.hangup,FALSE);
resetace();
}
tlabel() /*print level 1 labels on the 25th line*/
{
/* Removed for now
killlabel();
printf(
"%s1> \033pReceive%s Log %s Dir %sPrScr%s Send%sHangup%s Level %s Help %s",
Stline,Vl,Vl,Vl,Vl,Vl,Vl,Vl,Vl);
printf(
"Quit%s%02d%c%d%d%s%s%s%s%s%s\033q%s",Vl,Baudtable[Current.cbaudindex]/100,
Current.cparity,Current.cdatabits,Current.cstopbits,Vl,BFlag?"LG":"--",Vl,
PFlag?"PR":"--",Vl,FDx?"FDX":"HDX",Endline);
*/
}
/* Prompt user and get any key */
waitakey()
{
char c;
printf("\n Any key to continue: ");
flush();
while (!(c = bdos(DIRCTIO,INPUT)));
return c;
}
/* End of TERM module */