home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / OWLSCR / PCVGRAB.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-22  |  5.9 KB  |  237 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-PC 1.2
  9.     Copyright (c) 1988, by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      3/27/90 jmd    changed via_init/grab to via_Init/Grab
  15.      3/28/90 jmd    ansi-fied
  16. */
  17.  
  18. #include "pcpriv.h"
  19. #include "viadecl.h"
  20.  
  21. OSTATIC unsigned DIGPRIV via_findaddr(void);
  22. OSTATIC boolean  DIGPRIV via_ismcb(unsigned addr);
  23. OSTATIC void      DIGPRIV via_setlevels(via_type viainfo, byte brt, byte hue, byte sat);
  24. OSTATIC boolean  DIGPRIV via_getloop(unsigned addr);
  25. OSTATIC void      DIGPRIV via_setloop(unsigned addr, boolean loop);
  26.  
  27. /* -------------------------------------------------------------------------- */
  28.  
  29. via_type via_Init(void)
  30. /*
  31.     Init via board and return NULL if not ready.
  32. */
  33. {
  34.     via_type viainfo;
  35.     byte brt, hue, sat;
  36.  
  37.     if ((viainfo = (via_type) omalloc(OA_VIA, sizeof(struct via_struct))) == NULL) {
  38.         return(NULL);
  39.     }
  40.  
  41.     viainfo->seg = via_findaddr();
  42. #ifdef DEBUG
  43.     if (viainfo->seg == 0) viainfo->seg = 0xA222;
  44. #endif
  45.     if (viainfo->seg == 0) {
  46.         return(NULL);
  47.     }
  48.     if ((viainfo->mcb = via_ismcb(viainfo->seg)) == TRUE) {
  49.         viainfo->reg = 0x405;
  50.         brt = 0xC0;
  51.         hue = 0;
  52.         sat = 0;
  53.     }
  54.     else {
  55.         viainfo->reg = 0x407;
  56.         brt = 0x80;
  57.         hue = 0x80;
  58.         sat = 0xC0;
  59.     }
  60.     via_setlevels(viainfo, brt, hue, sat);  /* init levels */
  61.  
  62.     if (!via_testretrace(viainfo->seg)) { 
  63.         return(NULL);
  64.     }
  65.     return(viainfo);
  66. }
  67. /* -------------------------------------------------------------------------- */
  68.  
  69. boolean via_Grab(via_type viainfo, pmap_type pmap, viabort_fptr abortf)
  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(void)
  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(unsigned addr)
  178. {
  179.     boolean loop, loop2;
  180.  
  181.     loop = via_getloop(addr);            /* Get loopthrough bit */
  182.     via_setloop (addr, FALSE);            /* Set loopthrough bit */
  183.     loop2 = via_getloop(addr);            /* Test loopthrough bit */
  184.     via_setloop(addr, loop);            /* Restore loopthrough setting */
  185.     return(loop2);        /* MCB VIA always returns loopbit = 1 */
  186. }
  187. /* -------------------------------------------------------------------------- */
  188. #define BRTBYTE     0x404
  189. #define HUEBYTE     0x405
  190. #define SATBYTE     0x406
  191.  
  192. static void DIGPRIV via_setlevels(via_type viainfo, byte brt, byte hue, byte sat)
  193. /*
  194.     Poke the levels settings on the board
  195. */
  196. {
  197.     ram_memtoseg(viainfo->seg, BRTBYTE, &brt, 1);
  198.     if (!viainfo->mcb) {
  199.         ram_memtoseg(viainfo->seg, HUEBYTE, &hue, 1);
  200.         ram_memtoseg(viainfo->seg, SATBYTE, &sat, 1);
  201.     }
  202. }
  203. /* -------------------------------------------------------------------------- */
  204. #define LOOPBYTE    0x402
  205. #define LOOPBIT     0x80
  206.  
  207. static boolean DIGPRIV via_getloop(unsigned addr)
  208. /*
  209.     Return TRUE if via is set for loopthrough mode
  210. */
  211. {
  212.     byte reg;
  213.  
  214.     ram_segtomem(addr, LOOPBYTE, ®, 1);
  215.     return((reg & LOOPBIT) != 0);
  216. }
  217. /* -------------------------------------------------------------------------- */
  218.  
  219. static void DIGPRIV via_setloop(unsigned addr, boolean loop)
  220. /*
  221.     Poke the via's loopthrough mode
  222. */
  223. {
  224.     byte reg;
  225.  
  226.     ram_segtomem(addr, LOOPBYTE, ®, 1);
  227.     if (loop) {
  228.         reg |= LOOPBIT;
  229.     }
  230.     else {
  231.         reg &= ~LOOPBIT;
  232.     }
  233.     ram_memtoseg(addr, LOOPBYTE, ®, 1);
  234. }
  235. /* -------------------------------------------------------------------------- */
  236.  
  237.