/* * getioaddr.c -- get ioaddress,irq,dma chanel * * Copyright (C) 1997 by Sony Computer Entertainment * All rights Reserved */ #include #include #include #include "getioadr.h" /*========== I/O port address =============*/ #define C8259M 0x20 /* master 8259A control port */ #define D8259M ( C8259M + 1 ) /* master 8259A data port */ #define C8259S 0xA0 /* slave 8259A control port */ #define D8259S ( C8259S + 1 ) /* slave 8259A data port */ #define EOICWD 0x20 /* EOI command word for 8259A */ unsigned psxbase; unsigned irq; unsigned long dmach; unsigned irqvect; unsigned irqcport; unsigned irqmport; unsigned char irqmask; unsigned dmapagereg; static unsigned irq2vect[] = { 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77 }; static unsigned char irqmask_tbl[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, }; static unsigned irqctrlport_tbl[] = { C8259M, C8259M, C8259M, C8259M, C8259M, C8259M, C8259M, C8259M, C8259S, C8259S, C8259S, C8259S, C8259S, C8259S, C8259S, C8259S, }; static unsigned irqmaskport_tbl[] = { D8259M, D8259M, D8259M, D8259M, D8259M, D8259M, D8259M, D8259M, D8259S, D8259S, D8259S, D8259S, D8259S, D8259S, D8259S, D8259S, }; static unsigned dmach2page[] = { 0x8f, 0x8b, 0x89, 0x8a }; void getioaddr(int argc, char *argv[]) { int base; int intnum; long ch; int ap; char *env; env = NULL; /* RS-232C initial values */ psxbase = 0x2f8; irq = 3; dmach = 57600; if( getenv("DTLH3000") != NULL ) { env = getenv("DTLH3000"); } if( env != NULL ) { switch( sscanf( env, "%x,%d,%ld",&base,&intnum,&ch) ) { case 3: dmach = ch; case 2: irq = intnum; case 1: psxbase = base; default: break; } } for( ap = 1 ; ap < argc ; ap++ ) { if( argv[ap][0] == '-' && argv[ap][1] == 'p' ) { env = argv[ap]+2; } } if( env != NULL ) { switch( sscanf( env, "%x,%d,%ld",&base,&intnum,&ch) ) { case 3: dmach = ch; case 2: irq = intnum; case 1: psxbase = base; default: break; } } if( psxbase == 0 ) { fprintf(stdout, "I/O address not define !\n"); fprintf(stdout, "abort !\n"); fprintf(stdout, "Please set DTLH3000 envelopment variable\n"); exit(1); } fprintf(stdout," I/O addr = 0x%04X",psxbase); if( irq > 0 ) { irqvect = irq2vect[irq]; irqmask = irqmask_tbl[irq]; irqcport = irqctrlport_tbl[irq]; irqmport = irqmaskport_tbl[irq]; /* if( !(_inp( irqmport) & irqmask) ) { fprintf(stdout,", IRQ=%d is used by other program",irq); irq = 0; irqvect = 0; irqmask = 0; irqcport = 0; irqmport = 0; } else {*/ fprintf(stdout,", IRQ=%d(vect=0x%04X,8259=%02x)", irq, irqvect, irqcport); // } } fprintf(stdout,"\n"); }