// CCS PCM C Compiler, Version 3.181, 17845
#include "D:\Mes documents\CCS\PROG\Oscilloscope VGA\oscilloscope_vga.h"

#byte port_A = 5
#byte port_B = 6

#define VIDEO_LINE 0 //pin#6
#define HORIZ_SYNC 1 //pin#7
#define FRAME      2 //pin#8
#define VERT_SYNC  3 //pin#9
#define LINE_TEST  4 //pin#10

void main()
{
 unsigned long line_counter;

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

 set_tris_B(0); // toutes les pattes port B en sorties
 port_B = 4+8; // FRAME & VERT_SYNC a 1.
               // VIDEO_LINE & HORIZ_SYNC a 0.

 bit_set(port_B, VIDEO_LINE);
 bit_set(port_B, HORIZ_SYNC);
 delay_us(2);
 #asm
    nop
    nop
    nop
    nop
 #endasm

 while(1)
  {

   for(line_counter=0;line_counter<600;line_counter++) // 600 DECI = 0x0258, 300 DECI = 0x012C
    {
     // delai 20 usec (D)
     // verifie # de ligne ici
     if(line_counter<0x0200)
 	  {
       delay_us(4);
       #asm
          nop
	  nop
	  nop
       #endasm
      }
     else
 	  {
       delay_us(3);
       #asm
          nop
          nop
	  nop
	  nop
       #endasm
      }
     port_B &= (byte)(0x0010 & line_counter); // laisse passer seulement bit 4 (video vert, center line)
     delay_us(9);
     #asm
      	nop
	nop
     #endasm
     bit_clear(port_B, VIDEO_LINE);

    // delai 1 usec (E)
     #asm
      	nop
	nop
	nop
	nop
     #endasm
     bit_clear(port_B, HORIZ_SYNC);

     // delai 3.2 usec (B)
     delay_us(3);

     bit_set(port_B, HORIZ_SYNC);

     // delai 2.2 usec (C)
     delay_us(2);

     // debut ligne video..
     bit_set(port_B, VIDEO_LINE);

    } // for...




   bit_clear(port_B, VIDEO_LINE);
   delay_us(21);
     #asm
	nop
	nop
     #endasm

 ////////////////////////////////////////////
 //////////// section verticale /////////////
 ////////////////////////////////////////////
   bit_clear(port_B, VERT_SYNC);

   bit_clear(port_B, HORIZ_SYNC); //1ere pulse H
   // delai 3.2 usec (B)
   delay_us(3);
   bit_set(port_B, HORIZ_SYNC);
   delay_us(23);

   bit_clear(port_B, HORIZ_SYNC); //2ieme pulse H
   // delai 3.2 usec (B)
   delay_us(3);
   bit_set(port_B, HORIZ_SYNC);
   delay_us(23);

   bit_clear(port_B, HORIZ_SYNC); //3ieme pulse H
   // delai 3.2 usec (B)
   delay_us(3);
   bit_set(port_B, HORIZ_SYNC);
   delay_us(23);

   bit_clear(port_B, HORIZ_SYNC); //4ieme pulse H
   // delai 3.2 usec (B)
   delay_us(3);
   bit_set(port_B, HORIZ_SYNC);
   delay_us(23);

   bit_clear(port_B, HORIZ_SYNC);

   bit_set(port_B, VERT_SYNC);
 //////////////////////////////////////////////
   delay_us(3);
   bit_set(port_B, HORIZ_SYNC);
   #asm
      nop
      nop
   #endasm

  for(line_counter=0;line_counter<22;line_counter++) //lignes 1 a 22
   {
    delay_us(20);
    bit_clear(port_B, HORIZ_SYNC); //4ieme pulse H
    // delai 3.2 usec (B)
    delay_us(3);
    bit_set(port_B, HORIZ_SYNC);
    #asm
      nop
    #endasm
   }

  //23ieme ligne traitée ici...
    delay_us(19);
    #asm
      nop
      nop
      nop
      nop
    #endasm
    bit_clear(port_B, HORIZ_SYNC); //4ieme pulse H
    // delai 3.2 usec (B)
    delay_us(3);
    bit_set(port_B, HORIZ_SYNC);
    delay_us(2);


  }// while(1)


}

/*

SVGA 800X600 @ 60hz

Horizontal :
                ______________          _____________
               |              |        |
_______________|  VIDEO       |________|  VIDEO (next line)

___________   _____________________   ______________________
           |_|                     |_|
            B C <------D-----><-E->
            <----------A---------->


Vertical :
                ______________          _____________
               |              |        |
_______________|  VIDEO       |________|  VIDEO (next frame)

___________   _____________________   ______________________
           |_|                     |_|
            P Q <------R-----><-S->
            <----------O---------->

For VESA 800*600 @ 60Hz:
Fh (kHz) :37.88
A  (us)  :26.4
B  (us)  :3.2
C  (us)  :2.2
D  (us)  :20.0
E  (us)  :1.0

Fv (Hz)  :60.32
O  (ms)  :16.579
P  (ms)  :0.106
Q  (ms)  :0.607
R  (ms)  :15.84
S  (ms)  :0.026

*/
