1 /** targa.c **/
2 
3 #ifdef __TURBOC__
4 #       pragma  warn -par
5 #endif
6 
7 #define TARGA_DATA
8 
9 #include        <string.h>
10 #ifndef XFRACT
11 #include        <conio.h>
12 #endif
13 
14   /* see Fractint.c for a description of the "include"  hierarchy */
15 #include "port.h"
16 #include "prototyp.h"
17 #include "targa.h"
18 
19 /*************  ****************/
20 
21 void    WriteTGA( int x, int y, int index );
22 int     ReadTGA ( int x, int y );
23 void    EndTGA  ( void );
24 void    StartTGA( void );
25 void    ReopenTGA( void );
26 
27 /*************  ****************/
28 
29 static unsigned _fastcall near Row16Calculate(unsigned,unsigned);
30 static void     _fastcall near PutPix16(int,int,int);
31 static unsigned _fastcall near GetPix16(int,int);
32 static unsigned _fastcall near Row32Calculate(unsigned,unsigned);
33 static void     _fastcall near PutPix32(int,int,int);
34 static unsigned _fastcall near GetPix32(int,int);
35 static void     _fastcall near DoFirstPixel(int,int,int);
36 static void _fastcall fatalerror(char far *);
37 static int  GetLine(int);
38 static void _fastcall near SetDispReg(int,int);
39 static int  VWait(void);
40 static void _fastcall SetVBorder(int,int);
41 static void _fastcall SetBorderColor(long);
42 static void _fastcall SetVertShift(int);
43 static void _fastcall SetInterlace(int);
44 static void _fastcall SetBlndReg(int);
45 static void _fastcall SetRGBorCV(int);
46 static void _fastcall SetVCRorCamera(int);
47 static void _fastcall SetMask(int);
48 static void _fastcall SetBlndReg(int);
49 static void _fastcall SetContrast(int);
50 static void _fastcall SetHue(int);
51 static void _fastcall SetSaturation(int);
52 static void _fastcall SetHBorder(int,int);
53 static void SetFixedRegisters(void);
54 static void _fastcall VCenterDisplay(int);
55 static void _fastcall SetOverscan(int);
56 static void _fastcall near TSetMode(int);
57 static int  GraphInit(void);
58 static void GraphEnd(void);
59 
60 /*************  ****************/
61 
62 int          xorTARGA;
63 unsigned far *tga16 = NULL;  /* [256] */
64 long     far *tga32;         /* [256] */
65 static int   last = 0;
66 
67 /*************  ****************/
68 
69 static int      initialized;
70 
71 /*************  ****************/
72 
73 static void     (near _fastcall *DoPixel) ( int x, int y, int index );
74 static void     (near _fastcall *PutPixel)( int x, int y, int index );
75 static unsigned (near _fastcall *GetPixel)( int x, int y );
76 
77 /**************************************************************************/
78 #ifdef __BORLANDC__
79 #if(__BORLANDC__ > 2)
80    #pragma warn -eff
81 #endif
82 #endif
83 
Row16Calculate(unsigned line,unsigned x1)84 static unsigned _fastcall near Row16Calculate( unsigned line, unsigned x1 )
85 {
86         outp( DESTREG, (line >> 5) );
87         return( ((line & 31) << 10) | (x1 << 1) ); /* calc the pixel offset */
88 }
89 
90 /**************************************************************************/
91 
PutPix16(int x,int y,int index)92 static void _fastcall near PutPix16( int x, int y, int index )
93 {
94 unsigned far * ip;
95 
96         /**************/
97         ip = MK_FP( MEMSEG, Row16Calculate( y, x ) );
98         if( ! xorTARGA )
99                 *ip = tga16[index];
100         else
101                 *ip = *ip ^ 0x7fff;
102 }
103 
104 /**************************************************************************/
105 
GetPix16(int x,int y)106 static unsigned _fastcall near GetPix16( int x, int y )
107 {
108 register unsigned pixel, index;
109 unsigned far * ip;
110         /**************/
111         ip = MK_FP( MEMSEG, Row16Calculate( y, x ) );
112         pixel = *ip & 0x7FFF;
113         if( pixel == tga16[last] ) return( last );
114         for( index = 0; index < 256; index++ )
115                 if( pixel == tga16[index] ) {
116                         last = index;
117                         return( index );
118                 }
119         return( 0 );
120 }
121 
122 /**************************************************************************/
123 
Row32Calculate(unsigned line,unsigned x1)124 static unsigned _fastcall near Row32Calculate( unsigned line, unsigned x1 )
125 {
126         outp( DESTREG, (line >> 4) );
127         return ( ((line & 15) << 11) | (x1 << 2) ); /* calc the pixel offset */
128 }
129 
130 /**************************************************************************/
131 
PutPix32(int x,int y,int index)132 static void _fastcall near PutPix32( int x, int y, int index )
133 {
134 long far * lp;
135         lp = MK_FP( MEMSEG, Row32Calculate( y, x ) );
136         if( ! xorTARGA )
137                 *lp = tga32[index];
138         else
139                 *lp = *lp ^ 0x00FFFFFFL;
140 }
141 
142 /**************************************************************************/
143 
GetPix32(int x,int y)144 static unsigned _fastcall near GetPix32( int x, int y )
145 {
146 register int index;
147 long    pixel;
148 long    far * lp;
149 
150         lp = MK_FP( MEMSEG, Row32Calculate( y, x ) );
151         pixel = *lp & 0x00FFFFFFL;
152         if( pixel == tga32[last] ) return( last );
153         for( index = 0; index < 256; index++ )
154                 if( pixel == tga32[index] ) {
155                         last = index;
156                         return( index );
157                 }
158         return( 0 );
159 }
160 
161 /**************************************************************************/
162 
DoFirstPixel(int x,int y,int index)163 static void _fastcall near DoFirstPixel( int x, int y, int index )
164 {
165 int cnt;
166         TSetMode( targa.mode | 1 );
167         for( cnt = 0; cnt < targa.MaxBanks; cnt += 2 ) { /* erase */
168                 outp( DESTREG, cnt );
169                 outp( SRCREG,  cnt + 1 );
170                 erasesegment(targa.memloc,0);  /** general.asm **/
171         }
172         TSetMode( targa.mode & 0xFFFE );
173         PutPixel = DoPixel;
174         (*PutPixel)( x, y, index );
175 }
176 
177 #ifdef __BORLANDC__
178 #if(__BORLANDC__ > 2)
179    #pragma warn +eff
180 #endif
181 #endif
182 
183 /***************************************************************************/
184 
WriteTGA(int x,int y,int index)185 void WriteTGA( int x, int y, int index )
186 {
187         OUTPORTB(MODEREG, targa.mode |= 1 );    /* TSetMode inline for speed */
188         (*PutPixel)( x, sydots-y, index&0xFF ); /* fix origin to match EGA/VGA */
189         OUTPORTB(MODEREG, targa.mode &= 0xFFFE );
190 }
191 
192 /***************************************************************************/
193 
ReadTGA(int x,int y)194 int ReadTGA( int x, int y )
195 {
196 int val;
197         OUTPORTB(MODEREG, targa.mode |= 1 );    /* TSetMode inline for speed */
198         val = (*GetPixel)( x, sydots-y );
199         OUTPORTB(MODEREG, targa.mode &= 0xFFFE );
200         return( val );
201 }
202 
203 /***************************************************************************/
204 
EndTGA(void)205 void EndTGA( void )
206 {
207         if( initialized ) {
208                 GraphEnd();
209                 initialized = 0;
210         }
211 }
212 
213 /***************************************************************************/
214 
StartTGA()215 void StartTGA()
216 {
217 int     i;
218 /*
219    This overlayed data safe because used in this file, any only used for
220    fatal error message!
221 */
222 static FCODE couldntfind[]={"Could not find Targa card"};
223 static FCODE noenvvar[]={"TARGA environment variable missing"};
224 static FCODE insuffmem[]={"Insufficient memory for Targa"};
225 
226         /****************/
227         if( initialized ) return;
228         initialized = 1;
229 
230         /****************/
231         /* note that video.asm has already set the regualar video adapter */
232         /* to text mode (ax in Targa table entries is 3);                 */
233         /* that's necessary because TARGA can live at 0xA000, we DO NOT   */
234         /* want to have an EGA/VGA in graphics mode!!                     */
235         ReopenTGA(); /* clear text screen and display message */
236 
237         /****************/
238         /*** look for and activate card ***/
239         if ((i = GraphInit()) != 0)
240                 fatalerror((i == -1) ? couldntfind : noenvvar);
241 
242         VCenterDisplay( sydots + 1 );
243 
244         if (tga16 == NULL)
245             if ( (tga16 = (unsigned far *)farmemalloc(512L)) == NULL
246               || (tga32 = (long     far *)farmemalloc(1024L)) == NULL)
247                 fatalerror(insuffmem);
248 
249         SetTgaColors();
250 
251         if( targa.boardType == 16 ) {
252                 GetPixel = (unsigned (near _fastcall *)(int, int))GetPix16;
253                 DoPixel = PutPix16;
254         }
255         else {
256                 GetPixel = (unsigned (near _fastcall *)(int, int))GetPix32;
257                 DoPixel = PutPix32;
258         }
259         PutPixel = DoFirstPixel;        /* on first pixel --> erase */
260 
261         if( sydots == 482 ) SetOverscan( 1 );
262 
263         TSetMode( targa.mode & 0xFFFE );
264 
265         /****************/
266         if (mapdacbox == NULL && SetColorPaletteName("default") != 0)
267                 exit( 1 ); /* stopmsg has already been issued */
268 
269 }
270 
ReopenTGA()271 void ReopenTGA()
272 {
273 static FCODE runningontarga[]={"Running On TrueVision TARGA Card"};
274         helptitle();
275         putstring(2,20,7,runningontarga);
276         movecursor(6,0); /* in case of brutal exit */
277 }
278 
fatalerror(char far * msg)279 static void _fastcall fatalerror(char far *msg)
280 {
281 static FCODE abortmsg[]={"...aborting!"};
282         putstring(4,20,15,msg);
283         putstring(5,20,15,abortmsg);
284         movecursor(8,0);
285         exit(1);
286 }
287 
288 
289 
290 /***  the rest of this module used to be separate, in tgasubs.c,  ***/
291 /***  has now been merged into a single source                    ***/
292 
293 /*******************************************************************/
294 
VCenterDisplay(int nLines)295 static void _fastcall VCenterDisplay( int nLines )
296 {
297 int     lines;
298 int top, bottom;
299 long color;
300 
301         lines  = nLines >> 1;           /* half value of last line 0..x */
302         top    = 140 - (lines >> 1);
303         bottom = top + lines;
304         SetVBorder( top, bottom );
305         SetVertShift( 255 - lines );    /* skip lines we're not using */
306 
307         if( targa.boardType == 16 )
308                 color = (12 << 10) | (12 << 5) | 12;
309         else
310                 color = ((long)80 << 16) | (80 << 8) | 80;
311         SetBorderColor( color );
312 }
313 
314 
315 /*****************************************************************/
316 
SetDispReg(int reg,int value)317 static void _fastcall near SetDispReg(int reg, int value)
318 {
319         targa.DisplayRegister[reg] = value;
320 
321         TSetMode(targa.mode&MSK_REGWRITE);  /* select Index Register write */
322         OUTPORTB(DRREG, reg);   /* select sync register */
323         /*
324          *              Set Mask register to write value to
325          *              display register and to set Bit 9 in the DR
326          */
327         TSetMode( ((targa.mode|(~MSK_REGWRITE))     /* turn on write bit */
328                                    & MSK_BIT9      )     /* turn off Bit 9 */
329                            | ((value&0x0100)>>1)); /* set bit 9 for value */
330         OUTPORTB(DRREG, value); /* select sync register */
331  }
332 
333 /*****************************************************************/
334 
335 #define   WAITCOUNT  60000L
336 
VWait()337 static int VWait()
338 {
339 int     rasterreg;
340 unsigned GiveUp;
341 
342         rasterreg = RASTERREG;
343 
344         /*
345          *      If beyond bottom of frame wait for next field
346          */
347         GiveUp= WAITCOUNT;
348         while ( (--GiveUp) && (GetLine(rasterreg) == 0) ) { }
349         if (GiveUp) {
350            /*
351             *      Wait for the bottom of the border
352             */
353            GiveUp= WAITCOUNT;
354            while ( (--GiveUp) && (GetLine(rasterreg) > 0) ) { }
355            }
356 
357         return ( ( GiveUp ) ? 0 : -1);
358 }
359 
360 
361 /*****************************************************************/
362 
SetVBorder(int top,int bottom)363 static void _fastcall SetVBorder(int top, int bottom)
364 {
365         /* top border */
366         if ( top < MIN_TOP ) top=MIN_TOP;
367         SetDispReg(TOPBORDER,top);
368         /* bottom border */
369         if ( bottom > MAX_BOTTOM ) bottom=MAX_BOTTOM;
370         SetDispReg(BOTTOMBORDER,bottom);
371 
372         SetDispReg(DR10,top);
373         SetDispReg(DR11,bottom);
374 }
375 
376 
377 /*****************************************************************/
378 
SetRGBorCV(int type)379 static void _fastcall SetRGBorCV(int type)
380 {
381         /*  set the contrast level */
382         targa.RGBorCV = type;
383         targa.VCRCon = ( targa.VCRCon  & MSK_RGBORCV ) |
384                                         (targa.RGBorCV<<SHF_RGBORCV) ;
385         OUTPORTB(VCRCON, targa.VCRCon );
386 }
387 
388 /*****************************************************************/
389 
SetVCRorCamera(int type)390 static void _fastcall SetVCRorCamera(int type)
391 {
392         targa.VCRorCamera = type&1;
393         targa.VCRCon = ( targa.VCRCon  & MSK_VCRORCAMERA ) |
394                                         (targa.VCRorCamera<<SHF_VCRORCAMERA) ;
395         OUTPORTB(VCRCON, targa.VCRCon );
396 }
397 
398 
399 /*****************************************************************/
400 
SetBorderColor(long color)401 static void _fastcall SetBorderColor(long color)
402 {
403         targa.BorderColor = color;
404         OUTPORTB(BORDER, (int)(0x0000ffffL&(color)));
405         OUTPORTB((BORDER+2), (int)((color)>>16));
406 }
407 
408 /*****************************************************************/
409 
SetMask(int mask)410 static void _fastcall SetMask(int mask)
411 {
412         /* mask to valid values and output to mode register */
413         targa.Mask = mask;
414         OUTPORTB(MASKREG, mask);
415 }
416 
417 
418 /*****************************************************************/
419 
SetVertShift(int preshift)420 static void _fastcall SetVertShift(int preshift)
421 {
422         /*  set the Vertical Preshift count  level */
423         targa.VertShift = preshift;
424         OUTPORTB(VERTPAN, preshift);
425 }
426 
427 
428 /*****************************************************************/
429 
SetOverscan(int mode)430 static void _fastcall SetOverscan(int mode)
431 {
432 long tempColor;
433 
434         targa.ovrscnOn = mode;
435         if ( mode == 0 ) {
436                         INPORTB(UNDERREG);  /*  select underscan mode */
437                         SetHBorder(     (DEF_LEFT+targa.xOffset),
438                                                 (DEF_RIGHT+targa.xOffset));
439                         SetDispReg(4,352);
440                         SetDispReg(5,1);
441                         SetBorderColor(targa.BorderColor);
442         }
443         else    {
444                         INPORTB(OVERREG);   /*  select overrscan mode */
445                         SetDispReg(0,64);   /*  Set four of the display registers */
446                         SetDispReg(1,363);  /*  to values required for Overscan */
447                         SetDispReg(4,363);
448                         SetDispReg(5,17);
449                         tempColor = targa.BorderColor;
450                         SetBorderColor(0L);
451                         targa.BorderColor = tempColor;
452         }
453 }
454 
455 
456 /*****************************************************************/
457 
SetInterlace(int type)458 static void _fastcall SetInterlace(int type)
459 {
460         targa.InterlaceMode= type & MSK_INTERLACE;
461         SetDispReg(INTREG, targa.InterlaceMode);
462         /*
463          *      SET THE INTERLACE BIT TO MATCH THE INTERLACE MODE AND
464          *      SCREEN RESOLUTION -  SCREEN PAGE
465          */
466         if ( ( targa.InterlaceMode >= 2 ) &&
467                  ( targa.PageMode> 1 )  &&
468                  ( (targa.PageMode&1) != 0 )  )
469                 TSetMode(targa.mode|(~MSK_IBIT) );
470         else
471                 TSetMode(targa.mode& MSK_IBIT);
472 }
473 
474 
475 /*****************************************************************/
476 
SetBlndReg(int value)477 static void _fastcall SetBlndReg(int value)
478 {
479         /*  set the Vertical Preshift count  level */
480         if ( targa.boardType == 32 ) {
481                 targa.VCRCon = (targa.VCRCon&0xfe) | value;
482                 OUTPORTB(BLNDREG, value);
483                 }
484 }
485 
486 
487 /*****************************************************************/
488 
TSetMode(int mode)489 static void _fastcall near TSetMode(int mode)
490 {
491         /* mask to valid values and output to mode register */
492         OUTPORTB(MODEREG, mode );
493         targa.mode = mode;
494 }
495 
496 
497 /*****************************************************************/
498 
SetContrast(int level)499 static void _fastcall SetContrast(int level)
500 {
501         /*  set the contrast level */
502         targa.Contrast = level &((~MSK_CONTRAST)>>SHF_CONTRAST);
503         targa.VCRCon = ( targa.VCRCon  & MSK_CONTRAST ) |
504                         (targa.Contrast<<SHF_CONTRAST) ;
505         OUTPORTB(VCRCON, targa.VCRCon );
506 }
507 
508 
509 /*****************************************************************/
510 
SetHue(int level)511 static void _fastcall SetHue(int level)
512 {
513         /*  set the hue level -  Mask to valid value */
514         targa.Hue = level&((~MSK_HUE)>>SHF_HUE);
515         /* mask to valid range */
516         targa.SatHue = (targa.SatHue&MSK_HUE) | (targa.Hue<<SHF_HUE);
517         OUTPORTB(SATHUE, targa.SatHue );
518 }
519 
520 
521 /*****************************************************************/
522 
SetSaturation(int level)523 static void _fastcall SetSaturation(int level)
524 {
525         /*  set the saturation level */
526         targa.Saturation= level&( (~MSK_SATURATION)>>SHF_SATURATION);
527         targa.SatHue =  (targa.SatHue&MSK_SATURATION) |
528                          (targa.Saturation<<SHF_SATURATION);
529         OUTPORTB(SATHUE , targa.SatHue );
530 }
531 
532 
533 /*************************************************************/
534 
535 /*** UNUSED
536 static void _fastcall SetPageMode(int pageMode)
537 {
538         pageMode &= 0x07;
539         targa.PageMode = pageMode;
540         VWait();
541         TSetMode( (targa.mode)&(MSK_RES) |((pageMode<<SHF_RES)&(~MSK_RES)) ) ;
542         if ( ( targa.DisplayRegister[20] >= 2 ) &&
543                  ( pageMode> 1 )  &&
544                  ( (pageMode&1) != 0 )    )     TSetMode(targa.mode|(~MSK_IBIT) );
545         else
546                 TSetMode(targa.mode& MSK_IBIT);
547 }
548 ***/
549 
550 
551 /*****************************************************************/
552 
SetHBorder(int left,int right)553 static void _fastcall SetHBorder(int left, int right)
554 {
555         SetDispReg(LEFTBORDER, left);   /* set horizontal left border */
556         SetDispReg(RIGHTBORDER,right);  /* set horizontal right border */
557 /*
558  *                                      Set DR 8 and 9 since they
559  *                                      default to tracking DR0 and DR 1
560  */
561         SetDispReg(DR8,left);
562         SetDispReg(DR9,left);
563 }
564 
565 
566 /*****************************************************************/
567 
568 /*** UNUSED
569 static void _fastcall SetGenlock(int OnOrOff)
570 {
571         TSetMode( (targa.mode)&(MSK_GENLOCK)
572                         |((OnOrOff<<SHF_GENLOCK)&(~MSK_GENLOCK)) );
573 }
574 ***/
575 
576 
577 /*****************************************************************/
578 /* was asm, TC fast enough on AT */
579 
GetLine(int port)580 static int GetLine( int port )
581 {
582 int cnt;
583 int val1, val2;
584 
585         val1 = INPORTB( port );
586         for( cnt = 0; cnt < 20; cnt++ ) {
587                 val2 = INPORTB( port );
588                 if( val1 == val2 )
589                         break;
590                 val1 = val2;
591         }
592         return( val1 );
593 }
594 
595 
596 /**********************************************************************
597                           TINIT
598 **********************************************************************/
599 
GraphInit()600 static int GraphInit()
601 {
602 int i;
603 int bottom, top;
604 char *envptr;
605 unsigned switches, got_switches;
606 
607         memset( &targa, 0, sizeof(targa) );
608 
609         targa.boardType = TYPE_16;              /* default to T16 */
610         targa.xOffset = 0;  targa.yOffset = 0;  /* default to no offset */
611         targa.LinesPerField= DEF_ROWS/2;        /*  number of lines per field */
612         targa.AlwaysGenLock = DEF_GENLOCK;      /* default to genlock off */
613         targa.PageMode = 0;
614         targa.InterlaceMode = DEF_INT;          /* Defalut:  Interlace Mode 0 */
615         targa.Contrast= DEF_CONTRAST;
616         targa.Saturation = DEF_SATURATION;
617         targa.Hue = DEF_HUE;
618         targa.RGBorCV = CV;                     /* default to Composite video */
619         targa.VCRorCamera = CAMERA;
620         targa.PanXOrig = 0; targa.PanYOrig = 0;
621         targa.PageUpper= 0xffff;                /* set the bank flags to illega& values */
622         targa.PageLower= 0xffff;                /* so that they will be set the first time */
623         targa.ovrscnAvail = 0;                  /* Assume no Overscan option */
624         targa.ovrscnOn = 0;
625 
626         if ((envptr = getenv("TARGA")) == NULL)
627            return(-2);
628         switches = got_switches = 0;
629         while (*envptr) {
630            if (*envptr != ' ') ++got_switches;
631            if (*envptr >= '2' && *envptr <= '8')
632               switches |= (1 << ('8' - *envptr));
633            ++envptr;
634            }
635         if (got_switches == 0) { /* all blanks, use default */
636            targa.memloc = (signed int)0xA000;
637            targa.iobase = 0x220;
638            }
639         else {
640            targa.memloc = 0x8000 + ((switches & 0x70) << 8);
641            targa.iobase = 0x200  + ((switches & 0x0f) << 4);
642            }
643 
644         if ((envptr = getenv("TARGASET")) != NULL) {
645            for(;;) { /* parse next parameter */
646               while (*envptr == ' ' || *envptr == ',') ++envptr;
647               if (*envptr == 0) break;
648               if (*envptr >= 'a' && *envptr <= 'z') *envptr -= ('a'-'A');
649               i = atoi(envptr+1);
650               switch (*envptr) {
651                  case 'T':
652                     if (i == 16) targa.boardType = TYPE_16;
653                     if (i == 24) targa.boardType = TYPE_24;
654                     if (i == 32) targa.boardType = TYPE_32;
655                     break;
656                  /* case 'E' not done, meaning not clear */
657                  case 'X':
658                     targa.xOffset = i;
659                     break;
660                  case 'Y':
661                     targa.yOffset = i;
662                     break;
663                  case 'I':
664                     targa.InterlaceMode = i;
665                     break;
666                  /* case 'N' not done, I don't know how to handle it */
667                  case 'R':
668                     targa.RGBorCV = RGB;
669                     break;
670                  case 'B':
671                     targa.VCRorCamera = CAMERA;
672                     break;
673                  case 'V':
674                     targa.VCRorCamera = VCR;
675                     break;
676                  case 'G':
677                     targa.AlwaysGenLock = 1;
678                     break;
679                  case 'C':
680                     targa.Contrast = i * 31 / 100;
681                     break;
682                  case 'S':
683                     targa.Saturation = i * 7 / 100;
684                     break;
685                  case 'H':
686                     targa.Hue = i * 31 / 100;
687                     break;
688                  /* note: 'A' and 'O' defined but apply only to type M8 */
689                  /* case 'P' not handled cause I don't know how */
690                  }
691               while (*(++envptr) >= '0' && *envptr <= '9') { }
692               }
693            }
694 
695         if ( targa.boardType == TYPE_16 ) {
696                 targa.MaxBanks = 16;
697                 targa.BytesPerPixel = 2;
698         }
699         if ( targa.boardType == TYPE_24 ) {
700                 targa.MaxBanks = 32;
701                 targa.BytesPerPixel = 3;
702         }
703         if ( targa.boardType == TYPE_32 ) {
704                 targa.MaxBanks = 32;
705                 targa.BytesPerPixel = 4;
706         }
707 
708         /****** Compute # of rows per 32K bank  ********/
709         targa.RowsPerBank = 512/(targa.MaxBanks);
710         targa.AddressShift =  targa.MaxBanks>>4;
711 
712         /*      if initializing CVA:  set these before we quit  */
713         SetSaturation(targa.Saturation);
714         SetHue(targa.Hue);
715         SetContrast( targa.Contrast);
716 
717         /*      Set Genlock bit if always genlocked */
718         /*      Set before flipping and jerking screen */
719         TSetMode( (targa.AlwaysGenLock<<SHF_GENLOCK) | DEF_MODE);
720 
721         SetBlndReg(0);          /*  disable blend mode on TARGA 32 */
722 
723         SetInterlace(targa.InterlaceMode);
724         SetFixedRegisters();
725         SetOverscan( 0 );
726 
727         top    = 140 - (targa.LinesPerField / 2);
728         bottom = top + targa.LinesPerField;
729         SetVBorder(top,bottom);
730         SetVertShift(256-targa.LinesPerField);
731 
732         SetMask(DEF_MASK);
733         SetRGBorCV (targa.RGBorCV );
734         SetVCRorCamera(targa.VCRorCamera);
735 
736         /*      See if the raster register is working correctly and
737                 return error flag if its not         */
738         return (( VWait() == -1) ? -1 : 0);
739 
740 }
741 
742 
743 /**************************************************************/
744 
GraphEnd()745 static void GraphEnd()
746 {
747         TSetMode( (targa.mode)&MSK_MSEL );     /*  disable memory */
748 }
749 
750 
751 /**************************************************************/
752 /* Set the registers which have required values */
753 
754 #define FIXED_REGS      10
755 
756 static int FixedRegs[] = {
757         DR6,DR7,DR12,DR13,DR14,DR15,DR16,DR17,DR18,DR19
758 };
759 
760 static int FixedValue[] = {
761         DEF_DR6,DEF_DR7,DEF_DR12,DEF_DR13,DEF_DR14,
762         DEF_DR15,DEF_DR16,DEF_DR17,DEF_DR18,DEF_DR19
763 };
764 
SetFixedRegisters()765 static void SetFixedRegisters()
766 {
767 int reg;
768 
769         for ( reg=0; reg<FIXED_REGS; reg++)
770                 SetDispReg(FixedRegs[reg],FixedValue[reg]);
771 }
772 
773