Category : Files from Magazines
Archive   : CUJ9203.ZIP
Filename : 1003058A
* LISTING 6
*
* Filename: ctl.c
* Summary: Test IOCTL program for tape
* device driver
* Author: T.W. Nelson
* Compile options:
* Version: 1.00
* Date: 29-Sep-1991
* Notes:
*
* ------------------------------------------------- */
#include
#include
#include
#include
#include
#include
#include "tape.h"
#define IOCTL_OK 0x4000 //ioctl check bit
#define IM_A_DEVICE 0x0080 //device check bit
#define IO_BUF_SIZE sizeof(CMDARG)
union REGS regs;
struct SREGS sregs;
char Dname[] = "TAPEXXXX";
int ioHandle;
CMDARG ioArg;
char *Menu[] = {
"",
"Power ON .............0",
"Power OFF ............1",
"Insert Cassette ......2",
"Eject Cassette .......3",
"Record ...............4",
"Play .................5",
"Fast Forward .........6",
"Rewind ...............7",
"Check Status .........8",
"Stop .................9",
"Quit .................
"",
0
};
extern int _doserrno;
int _dos_dev_info( int handle,
size_t *info )
{
/* Get information about specified handle assoc
* with a file or device and return it in 'info'.
* Returns 0 if successful, !0 if not. Error code
* contained in global '_doserrno'.
*/
regs.x.ax = 0x4400; //DOS IOCTL get device info
regs.x.bx = handle;
intdos( ®s, ®s );
*info = regs.x.dx; //assign device info word
return regs.x.cflag; //CY signals error
}
int _dos_ioctl_read( int handle,
void *iobuf,
size_t nbytes )
{
/* Read ioctl data from a character device driver
* into 'iobuf'. Returns 0 if successful, !0 if not.
* Error code contained in global '_doserrno'. This
* call ends up as the device driver's cmd code 3,
* ioctl_read.
*/
regs.x.ax = 0x4402; //DOS read ioctl data
regs.x.bx = handle;
regs.x.cx = nbytes;
sregs.ds = FP_SEG( iobuf );
regs.x.dx = FP_OFF( iobuf );
intdosx( ®s, ®s, &sregs );
return regs.x.cflag; //CY signals error
}
int _dos_ioctl_write( int handle,
void *iobuf,
size_t nbytes )
{
/* Write ioctl data to a character device driver
* from 'iobuf'. Returns 0 if successful, !0 if not.
* Error code contained in global '_doserrno'. This
* call ends up as the device driver's cmd code 12,
* ioctl_write.
*/
regs.x.ax = 0x4403; //DOS write ioctl data
regs.x.bx = handle;
regs.x.cx = nbytes;
sregs.ds = FP_SEG( iobuf );
regs.x.dx = FP_OFF( iobuf );
intdosx( ®s, ®s, &sregs );
return regs.x.cflag; //CY signals error
}
void print_menu(void )
{
char **p;
for( p = Menu; *p; p++ )
printf( "%s\n", *p );
}
main( int argc, char **argv )
{
int cmd;
size_t d_info;
ioHandle = open( Dname, O_RDWR );
if( ioHandle == -1 ) {
printf( "Unable to open TAPE device\n" );
return 1;
}
//Verify that TAPE is a device and that
//it supports ioctl calls .....
_dos_dev_info( ioHandle, &d_info );
if( (d_info & IM_A_DEVICE) == 0 ) {
printf("Sorry, '%s' is a file\n", Dname );
return 1;
}
if( (d_info & IOCTL_OK) == 0 ) {
printf("Sorry, TAPE doesn't support IOCTL\n");
return 1;
}
//Initialize the device at 'boot-up' ....
ioArg.c_state = OFF;
ioArg.cmd = CMD_POWER_ON;
_dos_ioctl_write( ioHandle, (void *) &ioArg,
IO_BUF_SIZE );
//Execute user control loop .....
while( 1 ) {
print_menu();
printf( "Enter selection: " );
cmd = bioskey(0);
cmd &= 0x00ff; //zap scan code
if( cmd == 27 )
break;
printf( "%c\n\n", cmd ); //echo cmd
ioArg.cmd = cmd - '0'; //to integer
_dos_ioctl_read( ioHandle,
(void *) &ioArg,
IO_BUF_SIZE );
}
return 0;
}
/* ----- End of File ------------------------------- */
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/