forked from MirrorRepos/RomWBW
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
465 lines
8.8 KiB
465 lines
8.8 KiB
/* map.c 9/4/2012 dwg - added support for four more drives I: to L: */
|
|
/* map.c 8/3/2012 dwg - added DEV_PPPSD and DEV_HDSK, fixed end of drives */
|
|
/* map.c 6/7/2012 dwg - */
|
|
|
|
#include "portab.h"
|
|
|
|
#include "globals.h"
|
|
|
|
#include "stdio.h"
|
|
|
|
#include "stdlib.h"
|
|
|
|
#include "memory.h"
|
|
|
|
#include "cpmbind.h"
|
|
|
|
/* #include "cbioshdr.h" */
|
|
|
|
#include "infolist.h"
|
|
|
|
#include "dphdpb.h"
|
|
|
|
#include "dphmap.h"
|
|
|
|
#include "metadata.h"
|
|
|
|
#include "clogical.h"
|
|
|
|
#include "applvers.h"
|
|
|
|
#include "diagnose.h"
|
|
|
|
#include "cnfgdata.h"
|
|
|
|
#include "syscfg.h"
|
|
|
|
/* #define MAXDRIVE 12 */
|
|
|
|
#define BDOS 5 /* memory address of BDOS invocation */
|
|
#define HIGHSEG 0x0C000 /* memory address of system config */
|
|
|
|
#define GETSYSCFG 0x0F000 /* HBIOS function for Get System Configuration */
|
|
|
|
/* Drive List Geometry */
|
|
#define COL1 5
|
|
#define COL2 25
|
|
#define COL3 45
|
|
#define COL4 65
|
|
|
|
#define LINE 3
|
|
|
|
/* Logical Unit List Geometry */
|
|
#define LGUT 5
|
|
#define COL1A 0
|
|
#define COL2A (80/3)
|
|
#define COL3A (2*COL2A)
|
|
|
|
/* Nomenclature Geometry */
|
|
#define LINE2 9
|
|
|
|
/* Misc Info Geometry */
|
|
#define CDLINE 7
|
|
|
|
/* BDOS Function number */
|
|
#define RETCURR 25
|
|
|
|
/* function defined in bdoscall.asm */
|
|
extern lurst();
|
|
|
|
struct BIOS * pBIOS;
|
|
|
|
struct DPH * pDPH;
|
|
|
|
struct CNFGDATA * pCNFGDATA;
|
|
struct SYSCFG * pSYSCFG;
|
|
|
|
|
|
|
|
int devunit;
|
|
int dev;
|
|
int unit;
|
|
int currlu;
|
|
int numlu;
|
|
int drivenum;
|
|
int drive;
|
|
int deflu;
|
|
|
|
char szTemp[128];
|
|
|
|
int readsec(drive,track,sector,buffer)
|
|
int drive;
|
|
int track;
|
|
int sector;
|
|
unsigned int buffer;
|
|
{
|
|
ireghl = pSELDSK;
|
|
iregbc = drive;
|
|
iregde = 0;
|
|
bioscall();
|
|
|
|
ireghl = pSETTRK;
|
|
iregbc = track;
|
|
bioscall();
|
|
|
|
ireghl = pSETSEC;
|
|
iregbc = sector;
|
|
bioscall();
|
|
|
|
ireghl = pSETDMA;
|
|
iregbc = buffer;
|
|
bioscall();
|
|
|
|
ireghl = pREAD;
|
|
bioscall();
|
|
return irega;
|
|
}
|
|
|
|
|
|
|
|
|
|
int haslu(dr)
|
|
int dr;
|
|
{
|
|
if(0 < lugnum(dr)) {
|
|
return TRUE;
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void dispdph(l,c,drive,ptr)
|
|
int l;
|
|
int c;
|
|
char drive;
|
|
struct DPH *ptr;
|
|
{
|
|
|
|
/*
|
|
unsigned int xlt;
|
|
unsigned int rv1;
|
|
unsigned int rv2;
|
|
unsigned int rv3;
|
|
unsigned int dbf;
|
|
unsigned int dpb;
|
|
unsigned int csv;
|
|
unsigned int alv;
|
|
unsigned char sigl;
|
|
unsigned char sigu;
|
|
unsigned int current;
|
|
unsigned int number;
|
|
*/
|
|
|
|
|
|
/* 8/3/2012 dwg - detect end of drives properly */
|
|
ireghl = pGETLU;
|
|
iregbc = drive-'A';
|
|
bioscall();
|
|
if(1 == irega) {
|
|
return;
|
|
}
|
|
|
|
crtlc(l,c);
|
|
printf("%c: ",drive);
|
|
|
|
|
|
devunit = lugdu(drive-'A');
|
|
|
|
|
|
dev = devunit & 0xf0;
|
|
unit = devunit & 0x0f;
|
|
|
|
currlu = lugcur(drive-'A');
|
|
switch(dev) {
|
|
case DEV_MD:
|
|
if(0 == unit) printf("ROM");
|
|
if(1 == unit) printf("RAM");
|
|
break;
|
|
case DEV_FD:
|
|
printf("FD%d",unit);
|
|
break;
|
|
case DEV_IDE:
|
|
printf("IDE%d",unit);
|
|
break;
|
|
case DEV_ATAPI:
|
|
printf("ATAPI%d",unit);
|
|
break;
|
|
case DEV_PPIDE:
|
|
printf("PPIDE%d",unit);
|
|
break;
|
|
case DEV_SD:
|
|
printf("SD%d",unit);
|
|
break;
|
|
case DEV_PRPSD:
|
|
printf("PRPSD%d",unit);
|
|
break;
|
|
case DEV_PPPSD:
|
|
printf("PPPSD%d",unit);
|
|
break;
|
|
case DEV_HDSK:
|
|
printf("HDSK%d",unit);
|
|
break;
|
|
default:
|
|
printf("UNK");
|
|
break;
|
|
};
|
|
|
|
if('L' == (unsigned char)ptr->sigl) {
|
|
if('U' == (unsigned char)ptr->sigu) {
|
|
/* printf("-LU%d",(int)ptr->current); */
|
|
printf("-LU%d",currlu);
|
|
}
|
|
}
|
|
|
|
/* printf("dpb=0x%04x, ",(unsigned int)ptr->dpb);
|
|
printf("sigl=0x%02x, ",(unsigned char)ptr->sigl);
|
|
printf("sigu=0x%02x, ",(unsigned char)ptr->sigu);
|
|
printf("curr=0x%04x, ",(unsigned int)ptr->current);
|
|
printf("numb=0x%04x", (unsigned int)ptr->number);
|
|
*/
|
|
|
|
}
|
|
|
|
int main(argc,argv)
|
|
int argc;
|
|
char *argv[];
|
|
{
|
|
int i;
|
|
int mylu;
|
|
int drivenum;
|
|
int column;
|
|
int l;
|
|
int line;
|
|
int startlu;
|
|
int limit;
|
|
char bRunning;
|
|
char szDrive[32];
|
|
char szLuNum[32];
|
|
char szWP[2];
|
|
struct INFOLIST * pINFOLIST;
|
|
|
|
if(argc == 3) {
|
|
|
|
strcpy(szDrive,argv[1]);
|
|
strcpy(szLuNum,argv[2]);
|
|
|
|
mylu = atoi(szLuNum);
|
|
|
|
if(strlen(szDrive) == 2) {
|
|
if(':' == szDrive[1]) {
|
|
switch(szDrive[0]) {
|
|
case 'a':
|
|
case 'A':
|
|
luscur(0,mylu);
|
|
break;
|
|
case 'b':
|
|
case 'B':
|
|
luscur(1,mylu);
|
|
break;
|
|
case 'c':
|
|
case 'C':
|
|
luscur(2,mylu);
|
|
break;
|
|
case 'd':
|
|
case 'D':
|
|
luscur(3,mylu);
|
|
break;
|
|
case 'e':
|
|
case 'E':
|
|
luscur(4,mylu);
|
|
break;
|
|
case 'f':
|
|
case 'F':
|
|
luscur(5,mylu);
|
|
break;
|
|
case 'g':
|
|
case 'G':
|
|
luscur(6,mylu);
|
|
break;
|
|
case 'h':
|
|
case 'H':
|
|
luscur(7,mylu);
|
|
break;
|
|
|
|
case 'i':
|
|
case 'I':
|
|
luscur(8,mylu);
|
|
break;
|
|
case 'j':
|
|
case 'J':
|
|
luscur(9,mylu);
|
|
break;
|
|
case 'k':
|
|
case 'K':
|
|
luscur(10,mylu);
|
|
break;
|
|
case 'l':
|
|
case 'L':
|
|
luscur(11,mylu);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
exit(1);
|
|
}
|
|
|
|
|
|
pBIOS = BIOSAD;
|
|
|
|
|
|
hregbc = GETSYSCFG; /* function = Get System Config */
|
|
hregde = HIGHSEG; /* addr of dest (must be high) */
|
|
diagnose(); /* invoke the NBIOS function */
|
|
pSYSCFG = HIGHSEG;
|
|
crtinit(pSYSCFG->cnfgdata.termtype);
|
|
crtclr();
|
|
crtlc(0,0);
|
|
|
|
printf("MAP.COM %d/%d/%d v%d.%d.%d (%d)",
|
|
A_MONTH,A_DAY,A_YEAR,A_RMJ,A_RMN,A_RUP,A_RTP);
|
|
printf(" dwg - System Storage Drives and Logical Units");
|
|
|
|
ireghl = pGETINFO;
|
|
bioscall();
|
|
pINFOLIST = ireghl;
|
|
|
|
crtlc(CDLINE,COL3A+LGUT);
|
|
printf("infolist.version %d\n",pINFOLIST->version);
|
|
|
|
pDPHMAP = (struct DPHMAPA *)pINFOLIST->dphmap;
|
|
|
|
|
|
dispdph(LINE, COL1,'A',(struct DPH *)pDPHMAP->drivea);
|
|
dispdph(LINE+1,COL1,'B',(struct DPH *)pDPHMAP->driveb);
|
|
dispdph(LINE+2,COL1,'C',(struct DPH *)pDPHMAP->drivec);
|
|
dispdph(LINE ,COL2,'D',(struct DPH *)pDPHMAP->drived);
|
|
dispdph(LINE+1,COL2,'E',(struct DPH *)pDPHMAP->drivee);
|
|
dispdph(LINE+2,COL2,'F',(struct DPH *)pDPHMAP->drivef);
|
|
dispdph(LINE, COL3,'G',(struct DPH *)pDPHMAP->driveg);
|
|
dispdph(LINE+1,COL3,'H',(struct DPH *)pDPHMAP->driveh);
|
|
dispdph(LINE+2,COL3,'I',(struct DPH *)pDPHMAP->drivei);
|
|
dispdph(LINE ,COL4,'J',(struct DPH *)pDPHMAP->drivej);
|
|
dispdph(LINE+1,COL4,'K',(struct DPH *)pDPHMAP->drivek);
|
|
dispdph(LINE+2,COL4,'L',(struct DPH *)pDPHMAP->drivel);
|
|
|
|
dregbc = RETCURR;
|
|
bdoscall();
|
|
drive = drega;
|
|
|
|
crtlc(CDLINE,5);
|
|
printf("Current drive is %c:",'A'+drive);
|
|
|
|
devunit = lugdu(drive);
|
|
dev = devunit & 0xf0;
|
|
unit = devunit & 0x0f;
|
|
currlu = lugcur(drive);
|
|
deflu = currlu;
|
|
numlu = lugnum(drive);
|
|
|
|
crtlc(CDLINE,COL2A+LGUT);
|
|
printf("Number of LUs is %d\n",lugnum(drive));
|
|
|
|
if(0<numlu) {
|
|
crtlc(LINE2,COL1A+LGUT-1);
|
|
printf("LU P -----Label------");
|
|
crtlc(LINE2,COL2A+LGUT-1);
|
|
printf("LU P -----Label------");
|
|
crtlc(LINE2,COL3A+LGUT-1);
|
|
printf("LU P -----Label------");
|
|
|
|
startlu = 0;
|
|
limit = startlu+39;
|
|
if(limit>numlu) limit = numlu;
|
|
bRunning = 1;
|
|
|
|
while(1 == bRunning) {
|
|
|
|
line = LINE2+1;
|
|
column = 0;
|
|
|
|
for(l=0;l<13;l++) {
|
|
crtlc(line+l,0);
|
|
/* 1 2 3 4 */
|
|
/* 1234567890123456789012345678901234567890 */
|
|
printf(" ");
|
|
/* 5 6 7 */
|
|
/* 123456789012345678901234567890123456789 */
|
|
printf(" ");
|
|
}
|
|
|
|
for(i=startlu;i<limit;i++) {
|
|
luscur(drive,i);
|
|
readsec(drive,0,11,&metadata);
|
|
metadata.term = 0;
|
|
|
|
|
|
if(TRUE == metadata.writeprot) strcpy(szWP,"*");
|
|
else strcpy(szWP," ");
|
|
|
|
switch(column++) {
|
|
case 0:
|
|
crtlc(line,COL1A+LGUT-2);
|
|
printf("%3d %s %s",i,szWP,metadata.label);
|
|
break;
|
|
case 1:
|
|
crtlc(line,COL2A+LGUT-2);
|
|
printf("%3d %s %s",i,szWP,metadata.label);
|
|
break;
|
|
case 2:
|
|
crtlc(line,COL3A+LGUT-2);
|
|
printf("%3d %s %s",i,szWP,metadata.label);
|
|
column = 0;
|
|
line++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
crtlc(23,0);
|
|
printf("Options( N(ext), P(revious), Q(uit) )? ");
|
|
|
|
dregbc = 1; /* CONIN */
|
|
bdoscall();
|
|
|
|
switch(drega) {
|
|
case 'Q':
|
|
case 'q':
|
|
case 'X':
|
|
case 'x':
|
|
case 3:
|
|
bRunning = 0;
|
|
break;
|
|
case 'N':
|
|
case 'n':
|
|
case ' ':
|
|
startlu += 39;
|
|
if(startlu>numlu) startlu=0;
|
|
limit = startlu+39;
|
|
if(limit > numlu) limit = numlu;
|
|
break;
|
|
case 'P':
|
|
case 'p':
|
|
startlu -= 39;
|
|
if(startlu < 0) startlu = 0;
|
|
limit = startlu+39;
|
|
if (limit > numlu) limit = numlu;
|
|
break;
|
|
default:
|
|
printf("%c",7);
|
|
break;
|
|
}
|
|
|
|
} /* end of (1==bRunning) */
|
|
|
|
luscur(drive,deflu);
|
|
}
|
|
}
|
|
|
|
/****************/
|
|
/* eof - cmap.c */
|
|
/****************/
|