59 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
  glcc -o PlayVGM.gt1 PlayVGM.c -map=64k
 | 
						|
*/
 | 
						|
#include <stdio.h>
 | 
						|
#include <gigatron/sys.h>
 | 
						|
 | 
						|
#include <gigatron/libc.h>
 | 
						|
#include <stdarg.h>
 | 
						|
 | 
						|
#include "ChrisKelly.h"							// Include song data
 | 
						|
//#include "vgmdata.h"
 | 
						|
 | 
						|
char i,j,d;
 | 
						|
int  timer;
 | 
						|
 | 
						|
int idx, count;
 | 
						|
unsigned char iByte;
 | 
						|
 | 
						|
void wr_sn76489(char val)
 | 
						|
{
 | 
						|
	SYS_ExpanderControl(0x0010 | (val << 8));	// send data to 74377
 | 
						|
	SYS_ExpanderControl(0x0000);				// /WR on low
 | 
						|
	SYS_ExpanderControl(0x0100);    			// /WR on high (approx. 242 us)
 | 
						|
}
 | 
						|
 | 
						|
void SilenceAllChannels()
 | 
						|
{
 | 
						|
  wr_sn76489(0x9f);
 | 
						|
  wr_sn76489(0xbf);
 | 
						|
  wr_sn76489(0xdf);
 | 
						|
  wr_sn76489(0xff);
 | 
						|
}
 | 
						|
 | 
						|
void main()
 | 
						|
{
 | 
						|
  SilenceAllChannels();
 | 
						|
  for(;;)
 | 
						|
  {
 | 
						|
    idx = 0;
 | 
						|
    count = _vgm_song[idx];						// Number of following data bytes 0..11
 | 
						|
    while (count != 255)						// 0xff is end of song
 | 
						|
    {
 | 
						|
    
 | 
						|
      while(count > 0)							// if count = 0 just wait 20ms, no new data
 | 
						|
      {
 | 
						|
        count--;
 | 
						|
        idx++;
 | 
						|
        iByte = _vgm_song[idx];
 | 
						|
        wr_sn76489(iByte);
 | 
						|
      }
 | 
						|
      _wait(2);									// delay 20ms
 | 
						|
      idx++;
 | 
						|
      count = _vgm_song[idx];
 | 
						|
    }
 | 
						|
    SilenceAllChannels();
 | 
						|
	_wait(200);									// Pause for endless loop
 | 
						|
  }
 | 
						|
}
 |