home *** CD-ROM | disk | FTP | other *** search
/ Photo CD Demo 1 / Demo.bin / fractint / fras1611.zip / TPLUS.C < prev    next >
C/C++ Source or Header  |  1991-05-29  |  12KB  |  498 lines

  1. /* TPLUS.C, (C) 1991 The Yankee Programmer
  2.    All Rights Reserved.
  3.  
  4.    This code may be distributed only when bundled with the Fractint
  5.    source code.
  6.  
  7.    Mark C. Peterson
  8.    The Yankee Programmer
  9.    405-C Queen Street, Suite #181
  10.    Southington, CT 06489
  11.    (203) 276-9721
  12.  
  13. */
  14.  
  15. #include <conio.h>
  16. #include <string.h>
  17. #include "tplus.h"
  18.  
  19. #ifdef __TURBOC__
  20.    #include <dos.h>
  21. #endif
  22.  
  23. struct TPWrite far WriteOffsets = {
  24.       0,       1,    2,     3,      0x400,   0x401,      0x402,
  25.       0x403,   0x800,    0x801,     0x802,   0x803,   0xc00,      0xc01,
  26.       0xc02,   0xc03
  27. };
  28.  
  29. struct TPRead far ReadOffsets = {
  30.       0,        2,     3,      0x400,   0x401,      0x402,
  31.       0x403,   0x800,    0x801,     0x802,   0x803,   0xc00,      0xc01,
  32.       0xc02,   0xc03
  33. };
  34.  
  35. struct _BOARD far TPlus;
  36. int TPlusErr = 0;
  37.  
  38. void WriteTPWord(unsigned Register, unsigned Number) {
  39.    outp(TPlus.Write.INDIRECT, Register);
  40.    outpw(TPlus.Write.WBL, Number);
  41. }
  42.  
  43. void WriteTPByte(unsigned Register, unsigned Number) {
  44.    outp(TPlus.Write.INDIRECT, Register);
  45.    outp(TPlus.Write.WBL, Number);
  46. }
  47.  
  48. unsigned ReadTPWord(unsigned Register) {
  49.    outp(TPlus.Write.INDIRECT, Register);
  50.    return(inpw(TPlus.Read.RBL));
  51. }
  52.  
  53. unsigned char ReadTPByte(unsigned Register) {
  54.    outp(TPlus.Write.INDIRECT, Register);
  55.    return((unsigned char)inp(TPlus.Read.RBL));
  56. }
  57.  
  58. void DisableMemory(void) {
  59.    unsigned Mode1;
  60.  
  61.    Mode1 = inp(TPlus.Read.MODE1);
  62.    Mode1 &= 0xfe;
  63.    outp(TPlus.Write.MODE1, Mode1);
  64. }
  65.  
  66. void EnableMemory(void) {
  67.    unsigned Mode1;
  68.  
  69.    Mode1 = inp(TPlus.Read.MODE1);
  70.    Mode1 |= 1;
  71.    outp(TPlus.Write.MODE1, Mode1);
  72. }
  73.  
  74. struct TPLUS_IO {
  75.    unsigned Cmd;
  76.    int Initx, Finalx, Inity, Finaly, Destx, Desty;
  77.    unsigned long Color;
  78.    unsigned RegsOffset, RegsSegment, RegListOffset, RegListSegment,
  79.         BoardNumber, StructSize;
  80. } far TPlusIO;
  81.  
  82. #include <dos.h>
  83.  
  84. /* TARGAP.SYS Commands */
  85. #define READALL    0
  86. #define WRITEALL   0
  87. #define NUMBOARDS  3
  88. #define FILLBLOCK  4
  89. #define GRABFIELD  4
  90. #define RESET       5
  91. #define GRABFRAME  5
  92. #define WAITFORVB  6
  93. #define SETBOARD   8
  94. #define IOBASE       9
  95.  
  96. /* DOS IO Commands */
  97. #define DOS_READ   0x4402
  98. #define DOS_WRITE  0x4403
  99.  
  100. int hTPlus = -1;
  101. unsigned NumTPlus = 0;
  102.  
  103. int TargapSys(int Command, unsigned DOS) {
  104.    struct TPLUS_IO far *IOPtr;
  105.    unsigned far *RegPtr;
  106.    union REGS r;
  107.    struct SREGS s;
  108.  
  109.    if(hTPlus != -1) {
  110.       r.x.ax = DOS;
  111.       r.x.bx = hTPlus;
  112.       r.x.cx = sizeof(TPlusIO);
  113.       IOPtr = &TPlusIO;
  114.       RegPtr = TPlus.Reg;
  115.       r.x.dx = FP_OFF(IOPtr);
  116.       s.ds = FP_SEG(IOPtr);
  117.       TPlusIO.Cmd = Command;
  118.       TPlusIO.StructSize = sizeof(TPlus.Reg);
  119.       TPlusIO.RegsOffset = FP_OFF(RegPtr);
  120.       TPlusIO.RegsSegment = FP_SEG(RegPtr);
  121.       intdosx(&r, &r, &s);
  122.       return(!r.x.cflag);
  123.    }
  124.    return(0);
  125. }
  126.  
  127. int _SetBoard(int BoardNumber) {
  128.    TPlusIO.BoardNumber = BoardNumber;
  129.    return(TargapSys(SETBOARD, DOS_WRITE));
  130. }
  131.  
  132. #include <stdio.h>
  133.  
  134. extern void findpath(char*, char*);
  135.  
  136. int TPlusLUT(unsigned char far *LUTData, unsigned Index, unsigned Number,
  137.              unsigned DosFlag)
  138. {
  139.    struct TPLUS_IO far *IOPtr;
  140.    union REGS r;
  141.    struct SREGS s;
  142.  
  143.    if(hTPlus != -1) {
  144.       r.x.ax = DosFlag;
  145.       r.x.bx = hTPlus;
  146.       r.x.cx = sizeof(TPlusIO);
  147.       IOPtr = &TPlusIO;
  148.       r.x.dx = FP_OFF(IOPtr);
  149.       s.ds = FP_SEG(IOPtr);
  150.       TPlusIO.Cmd = 9;
  151.       TPlusIO.StructSize = sizeof(TPlus.Reg);
  152.       TPlusIO.RegsOffset = FP_OFF(LUTData);
  153.       TPlusIO.RegsSegment = FP_SEG(LUTData);
  154.       TPlusIO.BoardNumber = Number;
  155.       TPlusIO.RegListOffset = Index;
  156.       intdosx(&r, &r, &s);
  157.       return(!r.x.cflag);
  158.    }
  159.    return(0);
  160. }
  161.  
  162. int SetVGA_LUT(void) {
  163.    char PathName[80];
  164.    FILE *Data;
  165.    unsigned char LUTData[256 * 3];
  166.  
  167.    findpath("tplus.dat", PathName);
  168.    if(PathName[0]) {
  169.       if((Data = fopen(PathName, "rb")) != 0) {
  170.      if(!fseek(Data, 16L << 8, SEEK_SET)) {
  171.         if(fread(LUTData, 1, sizeof(LUTData), Data) == sizeof(LUTData)) {
  172.            fclose(Data);
  173.            return(TPlusLUT(LUTData, 0, sizeof(LUTData), DOS_WRITE));
  174.         }
  175.      }
  176.       }
  177.    }
  178.    if(Data > 0)
  179.       fclose(Data);
  180.    return(0);
  181. }
  182.  
  183. int SetColorDepth(int Depth) {
  184.    if(TPlus.Reg[HIRES] && Depth == 4)
  185.       Depth = 2;
  186.    switch(Depth) {
  187.       case 1:
  188.      if(TPlus.Reg[XDOTS] > 512) {
  189.         TPlus.Reg[PERM] = 1;
  190.         TPlus.Reg[BYCAP] = 3;
  191.         TPlus.RowBytes = 10;
  192.      }
  193.      else {
  194.         TPlus.Reg[PERM] = 0;
  195.         TPlus.Reg[BYCAP] = 1;
  196.         TPlus.RowBytes = 9;
  197.      }
  198.      TPlus.Reg[BUFFPORTSRC] = 0;
  199.      TPlus.Reg[CM1] = 0;
  200.      TPlus.Reg[CM2] = 0;
  201.      TPlus.Reg[DEPTH] = 1;
  202.      TPlus.Reg[LIVE8] = 1;
  203.      TPlus.Reg[DISPMODE] = 0;
  204.      TPlus.Reg[LIVEPORTSRC] = 1;
  205.      TPlus.Reg[LUTBYPASS] = 0;
  206.      break;
  207.       case 2:
  208.      if(TPlus.Reg[XDOTS] > 512) {
  209.         TPlus.Reg[PERM] = 3;
  210.         TPlus.Reg[BYCAP] = 15;
  211.         TPlus.Reg[CM2] = 1;
  212.         TPlus.RowBytes = 11;
  213.      }
  214.      else {
  215.         TPlus.Reg[PERM] = 1;
  216.         TPlus.Reg[BYCAP] = 3;
  217.         TPlus.Reg[CM2] = 0;
  218.         TPlus.RowBytes = 10;
  219.      }
  220.      TPlus.Reg[BUFFPORTSRC] = 1;
  221.      TPlus.Reg[CM1] = 0;
  222.      TPlus.Reg[DEPTH] = 2;
  223.      TPlus.Reg[LIVE8] = 0;
  224.      TPlus.Reg[DISPMODE] = 0;
  225.      TPlus.Reg[LIVEPORTSRC] = 1;
  226.      TPlus.Reg[LUTBYPASS] = 1;
  227.      break;
  228.       case 3:
  229.       case 4:
  230.      TPlus.Reg[PERM] = (Depth == 3) ? 2 : 3;
  231.      TPlus.Reg[BYCAP] = 0xf;
  232.      TPlus.Reg[BUFFPORTSRC] = 3;
  233.      TPlus.Reg[CM1] = 1;
  234.      TPlus.Reg[CM2] = 1;
  235.      TPlus.Reg[DEPTH] = 4;
  236.      TPlus.Reg[LIVE8] = 0;
  237.      TPlus.Reg[DISPMODE] = 0;
  238.      TPlus.Reg[LIVEPORTSRC] = 1;
  239.      TPlus.Reg[LUTBYPASS] = 1;
  240.      TPlus.RowBytes = 11;
  241.      break;
  242.       default:
  243.      return(0);
  244.    }
  245.    TPlus.Plot = WriteTPlusBankedPixel;
  246.    TPlus.GetColor = ReadTPlusBankedPixel;
  247.    TPlus.Reg[LIVEMIXSRC] = 0;
  248.    TPlus.Reg[CM3] = 1;
  249.    TPlus.RowsPerBank = 16 - TPlus.RowBytes;
  250.    if(TargapSys(WRITEALL, DOS_WRITE)) {
  251.       if(Depth == 1)
  252.      SetVGA_LUT();
  253.       if(TPlus.ClearScreen)
  254.      ClearTPlusScreen();
  255.       TargapSys(READALL, DOS_READ);
  256.       return(Depth);
  257.    }
  258.    return(0);
  259. }
  260.  
  261. int SetBoard(int BoardNumber) {
  262.    unsigned ioBase, n;
  263.    unsigned long MemBase;
  264.  
  265.    if(TPlus.ThisBoard != -1)
  266.       DisableMemory();
  267.    if(!_SetBoard(BoardNumber))
  268.       return(0);
  269.    if(!TargapSys(READALL, DOS_READ))
  270.       return(0);
  271.    TPlus.VerPan       = TPlus.Reg[VPAN];
  272.    TPlus.HorPan       = TPlus.Reg[HPAN];
  273.    TPlus.Top          = TPlus.Reg[TOP];
  274.    TPlus.Bottom       = TPlus.Reg[BOT];
  275.    TPlus.Bank64k      = 0xffff;         /* Force a bank switch */
  276.  
  277.    MemBase      = TPlus.Reg[MEM_BASE];
  278.    MemBase += (TPlus.Reg[MEM_MAP] != 3) ? 8 : 0;
  279.    TPlus.Screen = (unsigned char far *)(MemBase << 28);
  280.  
  281.    if(!TargapSys(IOBASE, DOS_READ))
  282.       return(0);
  283.    ioBase = TPlusIO.BoardNumber;
  284.    TPlus.Read = ReadOffsets;
  285.    TPlus.Write = WriteOffsets;
  286.    for(n = 0; n < sizeof(TPlus.Read) / sizeof(unsigned); n++)
  287.       ((unsigned far *)&(TPlus.Read))[n] += ioBase;
  288.    for(n = 0; n < sizeof(TPlus.Write) / sizeof(unsigned); n++)
  289.       ((unsigned far *)&(TPlus.Write))[n] += ioBase;
  290.  
  291.    EnableMemory();
  292.    return(1);
  293. }
  294.  
  295. int ResetBoard(int BoardNumber) {
  296.    int CurrBoard, Status = 0;
  297.  
  298.    CurrBoard = TPlus.ThisBoard;
  299.    if(_SetBoard(BoardNumber))
  300.       Status = TargapSys(RESET, DOS_WRITE);
  301.    if(CurrBoard > 0)
  302.       _SetBoard(CurrBoard);
  303.    return(Status);
  304. }
  305.  
  306. #include <fcntl.h>
  307. #include <io.h>
  308.  
  309. int CheckForTPlus(void) {
  310.    unsigned n;
  311.  
  312.    if((hTPlus = open("TARGPLUS", O_RDWR | O_BINARY )) != -1) {
  313.       if(!TargapSys(NUMBOARDS, DOS_READ))
  314.      return(0);
  315.       NumTPlus = TPlusIO.BoardNumber;
  316.       TPlus.ThisBoard = -1;
  317.       TPlus.ClearScreen = 1;
  318.       for(n = 0; n < NumTPlus; n++)
  319.      if(!ResetBoard(n))
  320.         return(0);
  321.       if(SetBoard(0))
  322.      return(1);
  323.    }
  324.    return(0);
  325. }
  326.  
  327. int SetTPlusMode(int Mode, int NotIntFlag, int Depth, int Zoom) {
  328.    unsigned n;
  329.    char PathName[80];
  330.    FILE *Data;
  331.    unsigned NewRegs[128];
  332.  
  333.    findpath("tplus.dat", PathName);
  334.    if(PathName[0]) {
  335.       if((Data = fopen(PathName, "rb")) != 0) {
  336.      if(!fseek(Data, (long)Mode << 8, SEEK_SET)) {
  337.         if(fread(NewRegs, 1, 256, Data) == 256) {
  338.            fclose(Data);
  339.            NewRegs[PE] = TPlus.Reg[PE];
  340.            NewRegs[OVLE] = TPlus.Reg[OVLE];
  341.            NewRegs[RGB] = TPlus.Reg[RGB];
  342.            NewRegs[SVIDEO] = TPlus.Reg[SVIDEO];
  343.            NewRegs[DAC567DATA] = TPlus.Reg[DAC567DATA];
  344.            NewRegs[VGASRC] = TPlus.Reg[VGASRC];
  345.            for(n = 0; n < 128; n++)
  346.           TPlus.Reg[n] = NewRegs[n];
  347.            if(TPlus.Reg[VTOP + 1] == 0xffff)
  348.           TPlus.Reg[NOT_INT] = 0;
  349.            else if(TPlus.Reg[VTOP] == 0xffff && !NotIntFlag) {
  350.           TPlusErr = 1;
  351.           return(0);
  352.            }
  353.            else
  354.           TPlus.Reg[NOT_INT] = NotIntFlag;
  355.            TPlus.xdots = TPlus.Reg[XDOTS];
  356.            TPlus.ydots = TPlus.Reg[YDOTS];
  357.            if(Zoom) {
  358.           TPlus.Reg[ZOOM] = Zoom;
  359.           TPlus.xdots >>= Zoom;
  360.           TPlus.ydots >>= Zoom;
  361.            }
  362.            return(SetColorDepth(Depth));
  363.         }
  364.      }
  365.       }
  366.    }
  367.    if(Data > 0)
  368.       fclose(Data);
  369.    return(0);
  370. }
  371.  
  372. int FillTPlusRegion(unsigned x, unsigned y, unsigned xdots, unsigned ydots,
  373.            unsigned long Color) {
  374.    int Status = 0;
  375.  
  376.    TPlusIO.Initx = x;
  377.    TPlusIO.Inity = TPlus.Reg[YDOTS] - (y + ydots) - 2;
  378.    TPlusIO.Finalx = x + xdots - 1;
  379.    TPlusIO.Finaly = TPlus.Reg[YDOTS] - y - 1;
  380.    TPlusIO.Color = Color;
  381.    Status = TargapSys(FILLBLOCK, DOS_WRITE);
  382.    EnableMemory();
  383.    return(Status);
  384. }
  385.  
  386. void BlankScreen(unsigned long Color) {
  387.    unsigned BufferPort;
  388.  
  389.    outpw(TPlus.Write.COLOR0, ((unsigned*)&Color)[0]);
  390.    outp(TPlus.Write.COLOR2, ((unsigned*)&Color)[1]);
  391.    outp(TPlus.Write.COLOR3, 0xff);
  392.    BufferPort = ReadTPByte(0xe9);
  393.    BufferPort |= 3;
  394.    WriteTPByte(0xe9, BufferPort);
  395. }
  396.  
  397. void UnBlankScreen(void) {
  398.    unsigned BufferPort;
  399.  
  400.    BufferPort = ReadTPByte(0xe9);
  401.    BufferPort &= 0xfe;
  402.    WriteTPByte(0xe9, BufferPort);
  403. }
  404.  
  405. void EnableOverlayCapture(void) {
  406.    unsigned Mode2;
  407.  
  408.    Mode2 = inp(TPlus.Read.MODE2);
  409.    Mode2 |= (1 << 6);
  410.    Mode2 &= (0xff ^ (3 << 4));
  411.    Mode2 |= (1 << 5);
  412.    outp(TPlus.Write.MODE2, Mode2);
  413. }
  414.  
  415. void DisableOverlayCapture(void) {
  416.    unsigned Mode2;
  417.  
  418.    Mode2 = inp(TPlus.Read.MODE2);
  419.    Mode2 &= (0xff ^ (7 << 4));
  420.    outp(TPlus.Write.MODE2, Mode2);
  421. }
  422.  
  423. void ClearTPlusScreen(void) {
  424.    BlankScreen(0L);
  425.    EnableOverlayCapture();
  426.    TargapSys(WAITFORVB, DOS_READ);
  427.    TargapSys(WAITFORVB, DOS_READ);
  428.    TargapSys(WAITFORVB, DOS_READ);
  429.    DisableOverlayCapture();
  430.    UnBlankScreen();
  431. }
  432.  
  433. static struct {
  434.    unsigned xdots, ydots, Template, Zoom, Depth;
  435. } far ModeTable[] = {
  436.    512, 400, 0,  0, 4,
  437.    512, 476, 1,  0, 4,
  438.    512, 486, 2,  0, 4,
  439.    512, 576, 3,  0, 4,
  440.    640, 480, 4,  0, 2,
  441.    648, 486, 5,  0, 2,
  442.    720, 486, 6,  0, 2,
  443.    720, 576, 7,  0, 2,
  444.    756, 486, 8,  0, 2,
  445.    768, 576, 9,  0, 2,
  446.    800, 600, 10, 0, 2,
  447.    1024,768, 11, 0, 2,
  448.    640, 400, 13, 0, 2,
  449.    320, 200, 13, 1, 2,
  450.    512, 496, 14, 0, 4,
  451.    640, 496, 15, 0, 2,
  452. };
  453.  
  454. static unsigned TableSize = (sizeof(ModeTable) / sizeof(ModeTable[0]));
  455.  
  456. int MatchTPlusMode(unsigned xdots, unsigned ydots, unsigned MaxColorRes,
  457.            unsigned PixelZoom, unsigned NonInterlaced) {
  458.    unsigned n, Depth;
  459.  
  460.    for(n = 0; n < TableSize; n++) {
  461.       if(ModeTable[n].xdots == xdots && ModeTable[n].ydots == ydots)
  462.      break;
  463.    }
  464.    if(n < TableSize) {
  465.       if(ModeTable[n].Zoom)
  466.      PixelZoom += ModeTable[n].Zoom;
  467.       if(PixelZoom > 4)
  468.      PixelZoom = 4;
  469.       switch(MaxColorRes) {
  470.      case 24:
  471.         Depth = 4;
  472.         break;
  473.      case 16:
  474.         Depth = 2;
  475.         break;
  476.      case 8:
  477.      default:
  478.         Depth = 1;
  479.         break;
  480.       }
  481.       if(ModeTable[n].Depth < Depth)
  482.      Depth = ModeTable[n].Depth;
  483.       return(SetTPlusMode(ModeTable[n].Template, NonInterlaced, Depth,
  484.          PixelZoom));
  485.    }
  486.    return(0);
  487. }
  488.  
  489. void TPlusZoom(int Zoom) {
  490.    unsigned Mode2;
  491.  
  492.    Zoom &= 3;
  493.    Mode2 = inp(TPlus.Read.MODE2);
  494.    Mode2 &= (0xff ^ (3 << 2));
  495.    Mode2 |= (Zoom << 2);
  496.    outp(TPlus.Write.MODE2, Mode2);
  497. }
  498.