diff --git a/WEGA/contrib/cpm/cpm3/blk_no_hdl.c b/WEGA/contrib/cpm/cpm3/blk_no_hdl.c new file mode 100644 index 0000000..635d0c9 --- /dev/null +++ b/WEGA/contrib/cpm/cpm3/blk_no_hdl.c @@ -0,0 +1,143 @@ +/* + * blk_no_hdl.c + * Behandlung der im Directory enthaltenen Blocknummern + * es werden zur Zeit 2 verschiedene Addressformate unterstuetzt + */ + +#include +#include "cpmio.h" +#include "cpmfio.h" + +extern int flp_fmt; + + +/* + * getblno + * bereitstellen der naechsten Blocknummer aus dem Directory + */ +getblno( fptr ) + C_FILE *fptr; +{ + int blockno; + int *blp; + + if( fptr->c_blk == 16 ) + return( EOF ); + switch( flp_fmt ) { + case 1: /* 8 bit Blockaddressen */ + blockno = fptr->c_dirp->pointers[ fptr->c_blk++ ] &0xff; + break; + case 2: /* 16 bit Blockaddressen */ + blp = ( int * )&(fptr->c_dirp->pointers[ fptr->c_blk ] ); + fptr->c_blk += 2; +#ifdef p8000 + blockno = *blp; + blockno = numswab( blockno ); +#else + blockno = *blp; +#endif p8000 + break; + default: + fprintf( stderr, "getblno: unknown addressformat %d\n", + flp_fmt ); + exit( 1 ); + break; + } +#ifdef DEBUG + fprintf( stderr, "getblno: block = %d\n", blockno ); +#endif + return( blockno ); +} + +/* + * putblno + * eintragen der naechsten Blocknummer in das Verzeichniss + */ +putblno( fptr, block ) + C_FILE *fptr; + int block; +{ + int *blp; + + if( fptr->c_blk == 16 ) + return( EOF ); + switch( flp_fmt ) { + case 1: /* 8 Bit Blockaddressen */ + fptr->c_dirp->pointers[ fptr->c_blk ] = block & 0xff; + fptr->c_blk++; + break; + case 2: /* 16 Bit Blockaddressen */ + blp = ( int * )&(fptr->c_dirp->pointers[ fptr->c_blk ] ); +#ifdef p8000 + *blp = numswab( block ); +#else + *blp = block; +#endif p8000 + fptr->c_blk += 2; + break; + default: + fprintf( stderr, "putblno: unknown addressformat %d\n", + flp_fmt ); + exit( 1 ); + break; + } +#ifdef DEBUG + fprintf( stderr, "putblno: block = %d\n", block ); +#endif + return( block ); +} + +/* + * extblno + * liefert blocknummern fuer build_bmap + */ + +extblno( pointer, ind ) + char pointer[]; + int ind; +{ + int *blp; + int blk; + + switch( flp_fmt ) { + case 1: + return( pointer[ind] & 0xff ); + break; + case 2: + blp = ( int * )&pointer[ind]; +#ifdef p8000 + blk = *blp; + blk = numswab( blk ); +#ifdef DEBUG + fprintf( stderr, "extblno: block = %d\n", blk ); +#endif DEBUG + return( blk ); +#else +#ifdef DEBUG + fprintf( stderr, "extblno: block = %d\n", blk ); +#endif DEBUG + return( *blp ); +#endif p8000 + break; + default: + fprintf( stderr, "extblno: unknown addressformat %d\n", + flp_fmt ); + exit( 1 ); + break; + } +} + +#ifdef p8000 +numswab( in ) + int in; +{ + char *ip, *op; + int out; + + ip = ( char * ) ∈ + op = ( char * ) &out; + op[1] = ip[0] & 0xff; + op[0] = ip[1] & 0xff; + return( out ); +} +#endif p8000 diff --git a/WEGA/contrib/cpm/cpm3/cfillbuf.c b/WEGA/contrib/cpm/cpm3/cfillbuf.c new file mode 100644 index 0000000..8d9550f --- /dev/null +++ b/WEGA/contrib/cpm/cpm3/cfillbuf.c @@ -0,0 +1,32 @@ +/* cfillbuf.c 1.6 83/05/13 */ +#include +#include "cpmio.h" +#include "cpmfio.h" + +c_fillbuf(fptr) + register C_FILE *fptr; +{ + + int getnext(), nsect; + int block; + + if ( ( block = getblno( fptr ) ) == EOF ) + if (fptr->c_dirp->blkcnt == (char) 0x80) { + /* find next extent (if it exists) */ + if (getnext(fptr) == NULL) + return (EOF); + if ((block = getblno(fptr)) == EOF) + return(EOF); /* Hahn */ + } + else + return (EOF); + nsect = (fptr->c_seccnt>blksiz/128) ? blksiz/128 : fptr->c_seccnt; + if (nsect == 0) + return (EOF); + fptr->c_seccnt -= nsect; + if (getblock( block, fptr->c_base, nsect) == EOF) + return (EOF); + fptr->c_buf = fptr->c_base; + fptr->c_cnt = nsect*128 -1; + return (*fptr->c_buf++&0xff); +}