home *** CD-ROM | disk | FTP | other *** search
- /*
- viagrab.c
-
- % Jovian logic Video Image Acquisition board (VIA) code.
-
- 01/16/89 by Ted.
-
- OWL 1.1
- Copyright (c) 1988, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- */
-
- #include "pcpriv.h"
- #include "viadecl.h"
-
- OSTATIC unsigned DIGPRIV via_findaddr(_arg1(void));
- OSTATIC boolean DIGPRIV via_ismcb(_arg1(unsigned addr));
- OSTATIC void DIGPRIV via_setlevels(_arg4(via_type viainfo, byte brt, byte hue, byte sat));
- OSTATIC boolean DIGPRIV via_getloop(_arg1(unsigned addr));
- OSTATIC void DIGPRIV via_setloop(_arg2(unsigned addr, boolean loop));
- /* -------------------------------------------------------------------------- */
-
- via_type via_init()
- /*
- 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(viainfo, pmap, abortf)
- via_type viainfo;
- pmap_type pmap;
- boolean (*abortf)(_arg1(void));
- /*
- 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()
- {
- 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(addr)
- 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(viainfo, brt, hue, sat)
- via_type viainfo;
- byte brt, hue, 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(addr)
- 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(addr, loop)
- 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);
- }
- /* -------------------------------------------------------------------------- */
-