home *** CD-ROM | disk | FTP | other *** search
- /*
- viagrab.c
-
- % Jovian logic Video Image Acquisition board (VIA) code.
-
- 01/16/89 by Ted.
-
- OWL-PC 1.2
- Copyright (c) 1988, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 3/27/90 jmd changed via_init/grab to via_Init/Grab
- 3/28/90 jmd ansi-fied
- */
-
- #include "pcpriv.h"
- #include "viadecl.h"
-
- OSTATIC unsigned DIGPRIV via_findaddr(void);
- OSTATIC boolean DIGPRIV via_ismcb(unsigned addr);
- OSTATIC void DIGPRIV via_setlevels(via_type viainfo, byte brt, byte hue, byte sat);
- OSTATIC boolean DIGPRIV via_getloop(unsigned addr);
- OSTATIC void DIGPRIV via_setloop(unsigned addr, boolean loop);
-
- /* -------------------------------------------------------------------------- */
-
- via_type via_Init(void)
- /*
- Init via board and return NULL if not ready.
- */
- {
- via_type viainfo;
- byte brt, hue, sat;
-
- if ((viainfo = (via_type) omalloc(OA_VIA, sizeof(struct via_struct))) == NULL) {
- return(NULL);
- }
-
- viainfo->seg = via_findaddr();
- #ifdef DEBUG
- if (viainfo->seg == 0) viainfo->seg = 0xA222;
- #endif
- if (viainfo->seg == 0) {
- return(NULL);
- }
- if ((viainfo->mcb = via_ismcb(viainfo->seg)) == TRUE) {
- viainfo->reg = 0x405;
- brt = 0xC0;
- hue = 0;
- sat = 0;
- }
- else {
- viainfo->reg = 0x407;
- brt = 0x80;
- hue = 0x80;
- sat = 0xC0;
- }
- via_setlevels(viainfo, brt, hue, sat); /* init levels */
-
- if (!via_testretrace(viainfo->seg)) {
- return(NULL);
- }
- return(viainfo);
- }
- /* -------------------------------------------------------------------------- */
-
- boolean via_Grab(via_type viainfo, pmap_type pmap, viabort_fptr abortf)
- /*
- Grab a via image return FALSE if not ready or aborted.
- */
- {
- if (pmap == NULL || pmap_GetWidth(pmap) != 320 ||
- !((pcpmap_pixbits(pmap) == 1 &&
- (pmap_GetHeight(pmap) == 120 || pmap_GetHeight(pmap) == 200 ||
- pmap_GetHeight(pmap) == 240)) ||
- (pcpmap_pixbits(pmap) == 8 && pmap_GetHeight(pmap) == 200))) {
- return(FALSE);
- }
- if (!via_unfreeze(viainfo->seg)) {
- return(FALSE);
- }
- if (!via_freeze(viainfo->seg)) {
- return(FALSE);
- }
- if (pcpmap_pixbits(pmap) == 8) {
- return(!via_mcgacapture(viainfo->seg, viainfo->reg,
- pcpmap_pixbuf(pmap), pcpmap_nplanes(pmap), abortf));
- }
- else {
- if (pmap_GetHeight(pmap) == 120) {
- return(!via_evgacapture(viainfo->seg, viainfo->reg,
- pcpmap_pixbuf(pmap), pcpmap_nplanes(pmap), abortf, 120));
- }
- else if (pmap_GetHeight(pmap) == 200) {
- return(!via_evgacapture(viainfo->seg, viainfo->reg,
- pcpmap_pixbuf(pmap), pcpmap_nplanes(pmap), abortf, 200));
- }
- else { /* height == 240 */
- return(!via_evgacapture(viainfo->seg, viainfo->reg,
- pcpmap_pixbuf(pmap), pcpmap_nplanes(pmap), abortf, 240));
- }
- }
- }
- /* -------------------------------------------------------------------------- */
- #define NADDRS 8
- static unsigned addrs[8] = {
- 0xCC00,
- 0xD000,
- 0xD400,
- 0xD800,
- 0xDC00,
- 0xC000,
- 0xC400,
- 0xC800
- };
- #define CRTCINDEX 0x400
- #define CRTCDATA 0x401
-
- #define NVALS (0x0D+1)
- static byte crtcvals[NVALS] = {
- 0xC5,
- 0xA0, 0xA6,
- 0x3F,
- 0x3F,
- 0x06,
- 0x3C,
- 0x3D,
- 0x01,
- 0x03,
- 0x00,
- 0x00,
- 0x00,
- 0x00
- };
- static byte crtcval1E = 0x00;
- static byte crtcval1F = 0x00;
- /* -------------------------------------------------------------------------- */
- /* Return segment address that via board is found at (changing retrace) */
-
- static unsigned DIGPRIV via_findaddr(void)
- {
- unsigned addr;
- int i;
- byte j;
- byte testval;
-
- for (i = 0; i < NADDRS; i++) {
- addr = addrs[i];
- j = 0x0C;
- testval = 0xD5;
- /* Test for high 2 bits knocked out of CRTC register 0C */
- ram_memtoseg(addr, CRTCINDEX, &j, 1);
- ram_memtoseg(addr, CRTCDATA, &testval, 1);
- ram_memtoseg(addr, CRTCINDEX, &j, 1);
- ram_segtomem(addr, CRTCDATA, &testval, 1);
- /* If VIA board found, init the CRTC registers and return the address */
- if (testval == (0xD5 & ~0xC0)) {
- for (j = 0; j < NVALS; j++) {
- ram_memtoseg(addr, CRTCINDEX, &j, 1);
- ram_memtoseg(addr, CRTCDATA, &crtcvals[j], 1);
- }
- j = 0x1E;
- ram_memtoseg(addr, CRTCINDEX, &j, 1);
- ram_memtoseg(addr, CRTCDATA, &crtcval1E, 1);
- j = 0x1F;
- ram_memtoseg(addr, CRTCINDEX, &j, 1);
- ram_memtoseg(addr, CRTCDATA, &crtcval1F, 1);
- return addr;
- }
- }
- return 0; /* they all timed out - fail. */
- }
- /* -------------------------------------------------------------------------- */
-
- static boolean DIGPRIV via_ismcb(unsigned addr)
- {
- boolean loop, loop2;
-
- loop = via_getloop(addr); /* Get loopthrough bit */
- via_setloop (addr, FALSE); /* Set loopthrough bit */
- loop2 = via_getloop(addr); /* Test loopthrough bit */
- via_setloop(addr, loop); /* Restore loopthrough setting */
- return(loop2); /* MCB VIA always returns loopbit = 1 */
- }
- /* -------------------------------------------------------------------------- */
- #define BRTBYTE 0x404
- #define HUEBYTE 0x405
- #define SATBYTE 0x406
-
- static void DIGPRIV via_setlevels(via_type viainfo, byte brt, byte hue, byte sat)
- /*
- Poke the levels settings on the board
- */
- {
- ram_memtoseg(viainfo->seg, BRTBYTE, &brt, 1);
- if (!viainfo->mcb) {
- ram_memtoseg(viainfo->seg, HUEBYTE, &hue, 1);
- ram_memtoseg(viainfo->seg, SATBYTE, &sat, 1);
- }
- }
- /* -------------------------------------------------------------------------- */
- #define LOOPBYTE 0x402
- #define LOOPBIT 0x80
-
- static boolean DIGPRIV via_getloop(unsigned addr)
- /*
- Return TRUE if via is set for loopthrough mode
- */
- {
- byte reg;
-
- ram_segtomem(addr, LOOPBYTE, ®, 1);
- return((reg & LOOPBIT) != 0);
- }
- /* -------------------------------------------------------------------------- */
-
- static void DIGPRIV via_setloop(unsigned addr, boolean loop)
- /*
- Poke the via's loopthrough mode
- */
- {
- byte reg;
-
- ram_segtomem(addr, LOOPBYTE, ®, 1);
- if (loop) {
- reg |= LOOPBIT;
- }
- else {
- reg &= ~LOOPBIT;
- }
- ram_memtoseg(addr, LOOPBYTE, ®, 1);
- }
- /* -------------------------------------------------------------------------- */
-
-