/* Program: DEVICE Author: Richard Conn Version: 1.0 Date: 22 Aug 82 Previous Versions: None */ #define ver 10 /* Version Number */ #define defname "DEVICE.COM" /* Default File Name */ /* DEVICE -- a program for assigning mnemonic names to the CP/M physical devices and allowing these devices to be selected by the assigned names Command Forms: DEV CON: USERNAME <-- Select Device LST: USERNAME RDR: USERNAME PUN: USERNAME DEV // <-- HELP DEV /DISPLAY <-- Display USERNAMEs and current settings DEV /SET <-- Define USERNAMEs and comments Concept and Examples: DEV CON: REMOTE <-- Select Remote Console DEV LST: MODEM <-- Select Modem Output DEV /D <-- Display UNs and Settings CON: Mnemonic Devices -- TTY CRT MODEM CRT/MODEM LST: Mnemonic Devices -- TTY CRT REMOTE MODEM RDR: Mnemonic Devices -- TTY CRT CLOCK MODEM PUN: Mnemonic Devices -- TTY CRT CLOCK MODEM Current Settings -- CON: = CRT LST: = MODEM RDR: = CLOCK PUN: = CLOCK */ /* Global Definitions and Variables */ char username[16][9]; /* 16 User Names of 8 Chars + Ending NULL Each */ /* Main Program */ main(argc,argv) int argc; char **argv; { printf("DEVICE, Version %d.%d",ver/10,ver%10); switch (argc) { case 2 : if (*argv[1] == '/') option(argv[1]); else help(); break; case 3 : set(argv[1], argv[2]); break; default : help(); break; } } /* Option Processor */ option(ostr) char *ostr; { char *tstr; tstr = ostr; /* assign temp ptr */ printf(" -- Option: "); switch (*++tstr) { case 'D' : printf("Display Device Mnemonics and Status"); display(); break; case 'S' : printf("Setup of Device Mnemonics"); setup(); break; default : printf("Help"); help(); break; } } /* Help Message */ help() { printf("\n\tDEVICE Program Help Information\n"); printf("\nDEVICE is a program used to assign mnemonic names to"); printf("\nthe CP/M physical devices and allow these devices to"); printf("\nbe selected by these names."); printf("\n"); printf("\nThe forms of this command are --"); printf("\n\tDEVICE ldev mnemonic\t<-- select device"); printf("\n\t\tldev may be one of:"); printf("\n\t\t\tCON LST PUN RDR"); printf("\n\t\t-- only first letter is required"); printf("\n\tDEVICE /DISPLAY\t<-- display mnemonics and current "); printf("settings"); printf("\n\tDEVICE /SET\t<-- define mnemonics"); printf("\n\tDEVICE //\t<-- print HELP information\n"); } /* Display Mnemonics and Current Settings */ display() { int i,dev; printf("\nPhysical Device Mnemonics --"); for (dev = 0; dev < 4; dev++) { prdev(dev); /* Print Device Names */ printf(" Mnemonic Names --\n\t"); for (i = dev*4; i < (dev+1)*4; i++) { printf("\t"); prun(i); /* Print User Name */ } } disp2(); } /* Display Current Device Assignments */ disp2() { int dev,i; printf("\n\nCurrent Device Assignments --"); for (dev = 0; dev < 4; dev++) { prdev(dev); printf(" = "); i = dev*4 + binit(dev); /* Get Number of User Name */ prun(i); /* Print User Name */ } printf("\n"); } /* Print Names of Devices */ prdev(dev) int dev; { printf("\n\t"); switch (dev) { case 0 : printf("CON:"); break; case 1 : printf("RDR:"); break; case 2 : printf("PUN:"); break; case 3 : printf("LST:"); break; } } /* Print User Name */ prun(map) int map; { printf(username[map]); } /* Extract Binit Number for Logical Device */ binit(dev) int dev; { int stat,i; stat = bdos(7,0); /* Get current I/O Byte */ for (i = 0; i < dev; i++) stat = stat >> 2; stat &= 3; /* 2 LSB only */ return(stat); } /* Set up Mnemonic Names */ setup() { char cmd, fname[40]; int i,j,fd; unsigned cend,base; printf("\nDEVICE Setup Subsystem"); do { printf("\nSetup Command (? for Help)? "); cmd = toupper(getchar()); /* Get Response */ switch (cmd) { case 'C' : while(setdev(0) == 0); break; case 'R' : while(setdev(1) == 0); break; case 'P' : while(setdev(2) == 0); break; case 'L' : while(setdev(3) == 0); break; case 'I' : initdev(); break; case 'D' : display(); break; case 'Q' : printf("\tVerify Abort (Y/N)? "); if (toupper(getchar()) == 'Y') return(-1); break; case 'X' : break; default : sethlp(); break; } } while (cmd != 'X'); printf("\tWrite New File (Y/N)? "); if (toupper(getchar()) != 'Y') return(-1); printf("\nName of File (RETURN = %s)? ",defname); dots(12); scanf("%s",fname); strcap(fname); /* Input and Capitalize File Name */ if (strlen(fname) == 0) strcpy(fname,defname); /* Set FN if none */ if (strscan(fname) == 0) strcat(fname,".COM"); /* Make type COM */ printf("\nWriting File %s to Disk ...",fname); fd = creat(fname); /* Delete old file and open new one */ if (fd == -1) { printf("\nError -- Can't Create File %s",fname); return(-1); } cend = codend()/128; /* Determine last 128-byte block of code */ write(fd,0x100,cend); /* Write file to disk */ close(fd); /* Close file -- done */ printf(" File %s Written to Disk\n",fname); } /* Set Mnemonic String for Device Number Given; return -1 to abort */ setdev(devno) int devno; { int i; char name[20]; printf("\n\tPhysical Device Number (RETURN=Done or 0-3)? "); i = getchar() - '0'; /* Get response and convert to binary */ if ((i < 0) || (i > 4)) /* i is out of range */ return(-1); do { printf("\n\tDevice Name (RETURN = Clear Device Name)? "); dots(8); scanf("%s",name); strcap(name); /* Get and Capitalize Name */ if (strlen(name) > 8) printf("Device Name is too Long -- Reenter"); } while (strlen(name) > 8); i = devno*4 + i; username[i][0]='\0'; /* Pt to name and clear it */ if (strlen(name) == 0) { printf("\nName Cleared"); return(-1); } strcat(username[i],name); /* Make entry in array */ return(0); /* Continue Flag */ } /* Initialize all devices to clear */ initdev() { int i; char ans; printf("\tVerify Initialization (Y/N)? "); if (toupper(getchar()) != 'Y') { printf("\nInitialization Aborted"); return(-1); } for (i=0; i<16; i++) username[i][0] = '\0'; printf("\nAll Mnemonic Device Names Cleared"); } /* Set Binit in I/O Byte for Device (String 1) Mnemonic (String 2) */ set(devs,user) char *devs, *user; { int dev,i,match,iobyte,mask; switch (*devs) { case 'C' : dev = 0; break; case 'R' : dev = 1; break; case 'P' : dev = 2; break; case 'L' : dev = 3; break; default : printf("\nError -- Invalid Logical Device Name\n"); help(); return(-1); } match = -1; for (i = dev*4; i < (dev+1)*4; i++) if (strcmp(username[i],user) == 0) match = i-dev*4; if (match == -1) { printf("\nError -- Invalid Device Mnemonic\n"); help(); return(-1); } iobyte = bdos(7,0); /* Get I/O Byte */ mask = 3; /* Set Mask */ for (i = 0; i < dev; i++) { mask = mask << 2; /* Set Mask on Target */ match = match << 2; /* Set Match on Target */ } iobyte = iobyte & ~mask; /* Complement Mask and Set Target to 0 */ iobyte |= match; /* Map In New Binit onto Target */ bdos(8,iobyte); /* Set New I/O Byte */ disp2(); /* Display New Settings */ return(0); /* Return with Continuation Flag Set */ } /* Capitalize String */ strcap(str) char *str; { char *tstr; tstr = str; while (*tstr != '\0') { *tstr = toupper(*tstr); tstr++; } } /* Help File for Interactive Setup Commands */ sethlp() { printf("\nDEVICE Setup Subsystem Command Summary"); printf("\n\tC, R, P, L -- Define Mnemonic for CON:, RDR:, PUN:, "); printf("or LST: Devices"); printf("\n\tD -- Display Currently-Defined Device Mnemonics"); printf("\n\tI -- Initialize and Clear All Device Mnemonics"); printf("\n\tQ -- Quit without Changing Program on Disk"); printf("\n\tX -- Exit and Update Program on Disk"); } /* Print num dots followed by num on screen */ dots(num) int num; { int i; for (i=0; i