home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 2.ddi / OWLSRC.EXE / CSCAPE / SOURCE / PCVGRAB.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-10  |  5.9 KB  |  239 lines

  1. /*
  2.     viagrab.c
  3.  
  4.     % Jovian logic Video Image Acquisition board (VIA) code.
  5.  
  6.     01/16/89  by Ted.
  7.  
  8.     OWL 1.1
  9.     Copyright (c) 1988, by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14. */
  15.  
  16. #include "pcpriv.h"
  17. #include "viadecl.h"
  18.  
  19. OSTATIC unsigned DIGPRIV via_findaddr(_arg1(void));
  20. OSTATIC boolean DIGPRIV via_ismcb(_arg1(unsigned addr));
  21. OSTATIC void DIGPRIV via_setlevels(_arg4(via_type viainfo, byte brt, byte hue, byte sat));
  22. OSTATIC boolean DIGPRIV via_getloop(_arg1(unsigned addr));
  23. OSTATIC void DIGPRIV via_setloop(_arg2(unsigned addr, boolean loop));
  24. /* -------------------------------------------------------------------------- */
  25.  
  26. via_type via_init()
  27. /*
  28.     Init via board and return NULL if not ready.
  29. */
  30. {
  31.     via_type viainfo;
  32.     byte brt, hue, sat;
  33.  
  34.     if ((viainfo = (via_type) omalloc(OA_VIA, sizeof(struct via_struct))) == NULL) {
  35.         return(NULL);
  36.     }
  37.  
  38.     viainfo->seg = via_findaddr();
  39. #ifdef DEBUG
  40.     if (viainfo->seg == 0) viainfo->seg = 0xA222;
  41. #endif
  42.     if (viainfo->seg == 0) {
  43.         return(NULL);
  44.     }
  45.     if ((viainfo->mcb = via_ismcb(viainfo->seg)) == TRUE) {
  46.         viainfo->reg = 0x405;
  47.         brt = 0xC0;
  48.         hue = 0;
  49.         sat = 0;
  50.     }
  51.     else {
  52.         viainfo->reg = 0x407;
  53.         brt = 0x80;
  54.         hue = 0x80;
  55.         sat = 0xC0;
  56.     }
  57.     via_setlevels(viainfo, brt, hue, sat);  /* init levels */
  58.  
  59.     if (!via_testretrace(viainfo->seg)) { 
  60.         return(NULL);
  61.     }
  62.     return(viainfo);
  63. }
  64. /* -------------------------------------------------------------------------- */
  65.  
  66. boolean via_grab(viainfo, pmap, abortf)
  67.     via_type viainfo;
  68.     pmap_type pmap;
  69.     boolean (*abortf)(_arg1(void));
  70. /*
  71.     Grab a via image return FALSE if not ready or aborted.
  72. */
  73. {
  74.     if (pmap == NULL || pmap_GetWidth(pmap) != 320 ||
  75.         !((pcpmap_pixbits(pmap) == 1 &&
  76.           (pmap_GetHeight(pmap) == 120 || pmap_GetHeight(pmap) == 200 ||
  77.             pmap_GetHeight(pmap) == 240)) ||
  78.           (pcpmap_pixbits(pmap) == 8 && pmap_GetHeight(pmap) == 200))) {
  79.         return(FALSE);
  80.     }
  81.     if (!via_unfreeze(viainfo->seg)) {
  82.         return(FALSE);
  83.     }
  84.     if (!via_freeze(viainfo->seg)) {
  85.         return(FALSE);
  86.     }
  87.     if (pcpmap_pixbits(pmap) == 8) {
  88.         return(!via_mcgacapture(viainfo->seg, viainfo->reg,
  89.                 pcpmap_pixbuf(pmap), pcpmap_nplanes(pmap), abortf));
  90.     }
  91.     else {
  92.         if (pmap_GetHeight(pmap) == 120) {
  93.             return(!via_evgacapture(viainfo->seg, viainfo->reg,
  94.                     pcpmap_pixbuf(pmap), pcpmap_nplanes(pmap), abortf, 120));
  95.         }
  96.         else if (pmap_GetHeight(pmap) == 200) {
  97.             return(!via_evgacapture(viainfo->seg, viainfo->reg,
  98.                     pcpmap_pixbuf(pmap), pcpmap_nplanes(pmap), abortf, 200));
  99.         }
  100.         else { /* height == 240 */
  101.             return(!via_evgacapture(viainfo->seg, viainfo->reg,
  102.                     pcpmap_pixbuf(pmap), pcpmap_nplanes(pmap), abortf, 240));
  103.         }
  104.     }
  105. }
  106. /* -------------------------------------------------------------------------- */
  107. #define NADDRS    8
  108. static unsigned addrs[8] = {
  109.     0xCC00,
  110.     0xD000,
  111.     0xD400,
  112.     0xD800,
  113.     0xDC00,
  114.     0xC000,
  115.     0xC400,
  116.     0xC800
  117. };
  118. #define CRTCINDEX    0x400
  119. #define CRTCDATA    0x401
  120.  
  121. #define NVALS    (0x0D+1)
  122. static byte crtcvals[NVALS] = {
  123.     0xC5,
  124.     0xA0, 0xA6,
  125.     0x3F,
  126.     0x3F,
  127.     0x06,
  128.     0x3C,
  129.     0x3D,
  130.     0x01,
  131.     0x03,
  132.     0x00,
  133.     0x00,
  134.     0x00,
  135.     0x00
  136. };
  137. static byte crtcval1E = 0x00;
  138. static byte crtcval1F = 0x00;
  139. /* -------------------------------------------------------------------------- */
  140. /* Return segment address that via board is found at (changing retrace) */
  141.  
  142. static unsigned DIGPRIV via_findaddr()
  143. {
  144.     unsigned addr;
  145.     int i;
  146.     byte j;
  147.     byte testval;
  148.  
  149.     for (i = 0; i < NADDRS; i++) {
  150.         addr = addrs[i];
  151.         j = 0x0C;
  152.         testval = 0xD5;
  153.     /* Test for high 2 bits knocked out of CRTC register 0C */
  154.         ram_memtoseg(addr, CRTCINDEX, &j, 1);
  155.         ram_memtoseg(addr, CRTCDATA, &testval, 1);
  156.         ram_memtoseg(addr, CRTCINDEX, &j, 1);
  157.         ram_segtomem(addr, CRTCDATA, &testval, 1);
  158.     /* If VIA board found, init the CRTC registers and return the address */
  159.         if (testval == (0xD5 & ~0xC0)) {
  160.             for (j = 0; j < NVALS; j++) {
  161.                 ram_memtoseg(addr, CRTCINDEX, &j, 1);
  162.                 ram_memtoseg(addr, CRTCDATA, &crtcvals[j], 1);
  163.             }
  164.             j = 0x1E;
  165.             ram_memtoseg(addr, CRTCINDEX, &j, 1);
  166.             ram_memtoseg(addr, CRTCDATA, &crtcval1E, 1);
  167.             j = 0x1F;
  168.             ram_memtoseg(addr, CRTCINDEX, &j, 1);
  169.             ram_memtoseg(addr, CRTCDATA, &crtcval1F, 1);
  170.             return addr;
  171.         }
  172.     }
  173.     return 0;    /* they all timed out - fail. */
  174. }
  175. /* -------------------------------------------------------------------------- */
  176.  
  177. static boolean DIGPRIV via_ismcb(addr)
  178.     unsigned addr;
  179. {
  180.     boolean loop, loop2;
  181.  
  182.     loop = via_getloop(addr);            /* Get loopthrough bit */
  183.     via_setloop (addr, FALSE);            /* Set loopthrough bit */
  184.     loop2 = via_getloop(addr);            /* Test loopthrough bit */
  185.     via_setloop(addr, loop);            /* Restore loopthrough setting */
  186.     return(loop2);        /* MCB VIA always returns loopbit = 1 */
  187. }
  188. /* -------------------------------------------------------------------------- */
  189. #define BRTBYTE     0x404
  190. #define HUEBYTE     0x405
  191. #define SATBYTE     0x406
  192.  
  193. static void DIGPRIV via_setlevels(viainfo, brt, hue, sat)
  194.     via_type viainfo;
  195.     byte brt, hue, sat;
  196. /*
  197.     Poke the levels settings on the board
  198. */
  199. {
  200.     ram_memtoseg(viainfo->seg, BRTBYTE, &brt, 1);
  201.     if (!viainfo->mcb) {
  202.         ram_memtoseg(viainfo->seg, HUEBYTE, &hue, 1);
  203.         ram_memtoseg(viainfo->seg, SATBYTE, &sat, 1);
  204.     }
  205. }
  206. /* -------------------------------------------------------------------------- */
  207. #define LOOPBYTE    0x402
  208. #define LOOPBIT     0x80
  209.  
  210. static boolean DIGPRIV via_getloop(addr)
  211.     unsigned addr;
  212. /*
  213.     Return TRUE if via is set for loopthrough mode
  214. */
  215. {
  216.     byte reg;
  217.  
  218.     ram_segtomem(addr, LOOPBYTE, ®, 1);
  219.     return((reg & LOOPBIT) != 0);
  220. }
  221. /* -------------------------------------------------------------------------- */
  222.  
  223. static void DIGPRIV via_setloop(addr, loop)
  224.     unsigned addr;
  225.     boolean loop;
  226. /*
  227.     Poke the via's loopthrough mode
  228. */
  229. {
  230.     byte reg;
  231.  
  232.     ram_segtomem(addr, LOOPBYTE, ®, 1);
  233.     if (loop)    reg |= LOOPBIT;
  234.     else        reg &= ~LOOPBIT;
  235.     ram_memtoseg(addr, LOOPBYTE, ®, 1);
  236. }
  237. /* -------------------------------------------------------------------------- */
  238.  
  239.