Revision 1328
Added by markw about 4 years ago
| atari_chips/pokeyv2/clockgensid.vhd | ||
|---|---|---|
| 
     ---------------------------------------------------------------------------
 
   | 
||
| 
     -- (c) 2020 mark watson
 
   | 
||
| 
     -- I am happy for anyone to use this for non-commercial use.
 
   | 
||
| 
     -- If my vhdl files are used commercially or otherwise sold,
 
   | 
||
| 
     -- please contact me for explicit permission at scrameta (gmail).
 
   | 
||
| 
     -- This applies for source and binary form and derived works.
 
   | 
||
| 
     ---------------------------------------------------------------------------
 
   | 
||
| 
     | 
||
| 
     LIBRARY ieee;
 
   | 
||
| 
     USE ieee.std_logic_1164.all; 
 
   | 
||
| 
     use ieee.numeric_std.all;
 
   | 
||
| 
     USE IEEE.STD_LOGIC_UNSIGNED.ALL;
 
   | 
||
| 
     use IEEE.STD_LOGIC_MISC.all;
 
   | 
||
| 
     | 
||
| 
     LIBRARY work;
 
   | 
||
| 
     | 
||
| 
     ENTITY clockgensid IS 
 
   | 
||
| 
     	PORT
 
   | 
||
| 
     	(
 
   | 
||
| 
     		CLK : IN STD_LOGIC;
 
   | 
||
| 
     		RESET_N : IN STD_LOGIC;
 
   | 
||
| 
     | 
||
| 
     		PAL : IN STD_LOGIC;
 
   | 
||
| 
     		PHI2 : IN STD_LOGIC; -- C64 1MHz
 
   | 
||
| 
     | 
||
| 
     		MHZ179 : OUT STD_LOGIC; -- C64 method, 1% error
 
   | 
||
| 
     		MHZ358 : OUT STD_LOGIC -- 2x C64 method, 1% error
 
   | 
||
| 
     	);
 
   | 
||
| 
     END clockgensid;		
 
   | 
||
| 
     | 
||
| 
     -- C64 output
 
   | 
||
| 
     --PAL: XL: 2*4.43361875/5, C64: 2*4.43361875/9 -> i.e. XL/C64 = 9/5 -> 2x is 18/5
 
   | 
||
| 
     --NTSC: XL: (315/88)/2, C64: 2*(315/88)/7 -> i.e. XL/C64 = 7/4 -> 2x i 14/4
 
   | 
||
| 
     | 
||
| 
     ARCHITECTURE vhdl OF clockgensid IS
 
   | 
||
| 
     	signal cycle_count_next : unsigned(3 downto 0);
 
   | 
||
| 
     	signal cycle_count_reg : unsigned(3 downto 0);
 
   | 
||
| 
     	signal clk_count_next : unsigned(8 downto 0);
 
   | 
||
| 
     	signal clk_count_reg : unsigned(8 downto 0);
 
   | 
||
| 
     	signal err_next : signed(13 downto 0);
 
   | 
||
| 
     	signal err_reg : signed(13 downto 0);
 
   | 
||
| 
     | 
||
| 
     	signal state_next : std_logic_vector(1 downto 0);
 
   | 
||
| 
     	signal state_reg : std_logic_vector(1 downto 0);
 
   | 
||
| 
     	constant state_sync : std_logic_vector(1 downto 0) := "00";
 
   | 
||
| 
     	constant state_count : std_logic_vector(1 downto 0) := "01";
 
   | 
||
| 
     	constant state_genbegin : std_logic_vector(1 downto 0) := "10";
 
   | 
||
| 
     	constant state_gen : std_logic_vector(1 downto 0) := "11";
 
   | 
||
| 
     | 
||
| 
     	signal everyother_next : std_logic;
 
   | 
||
| 
     	signal everyother_reg : std_logic;
 
   | 
||
| 
     BEGIN
 
   | 
||
| 
     	process(clk,reset_n)
 
   | 
||
| 
     	begin
 
   | 
||
| 
     		if (reset_n='0') then
 
   | 
||
| 
     			cycle_count_reg <= (others=>'0');
 
   | 
||
| 
     			clk_count_reg <= (others=>'0');
 
   | 
||
| 
     			err_reg <= (others=>'0');
 
   | 
||
| 
     			state_reg <= state_sync;
 
   | 
||
| 
     			everyother_reg <= '0';
 
   | 
||
| 
     		elsif (clk'event and clk='1') then
 
   | 
||
| 
     			cycle_count_reg <= cycle_count_next;
 
   | 
||
| 
     			clk_count_reg <= clk_count_next;
 
   | 
||
| 
     			err_reg <= err_next;
 
   | 
||
| 
     			state_reg <= state_next;
 
   | 
||
| 
     			everyother_reg <= everyother_next;
 
   | 
||
| 
     		end if;
 
   | 
||
| 
     	end process;
 
   | 
||
| 
     | 
||
| 
     	process(clk_count_reg,cycle_count_reg,everyother_reg,pal,phi2,state_reg,err_reg)
 
   | 
||
| 
     		variable threshold : unsigned(3 downto 0);
 
   | 
||
| 
     		variable adj1 : unsigned(17 downto 0); 
 
   | 
||
| 
     		variable adj : signed(13 downto 0); -- 8.6 fixed point
 
   | 
||
| 
     		variable trig : std_logic;
 
   | 
||
| 
     		variable cycle_inc : std_logic;
 
   | 
||
| 
     		variable clk_inc : std_logic;
 
   | 
||
| 
     		variable thresh_match : std_logic;
 
   | 
||
| 
     | 
||
| 
     		variable multby : unsigned(8 downto 0);
 
   | 
||
| 
     	begin
 
   | 
||
| 
     		cycle_count_next <= cycle_count_reg;
 
   | 
||
| 
     		clk_count_next <= clk_count_reg;
 
   | 
||
| 
     		state_next <= state_reg;
 
   | 
||
| 
     		err_next <= err_reg;
 
   | 
||
| 
     		everyother_next <= everyother_reg;
 
   | 
||
| 
     | 
||
| 
     		trig := '0';
 
   | 
||
| 
     		cycle_inc := '0';
 
   | 
||
| 
     		clk_inc := '0';
 
   | 
||
| 
     | 
||
| 
     		mhz179 <= '0';
 
   | 
||
| 
     		mhz358 <= '0';
 
   | 
||
| 
     | 
||
| 
     		-- TODO: adjust threshold and multby!
 
   | 
||
| 
     		-- old: pal: threshold=1001, multby = 51  -> 10/9
 
   | 
||
| 
     		-- old: ntsc: threshold=0111, multby = 64 -> 8/7
 
   | 
||
| 
     		if (pal='1') then
 
   | 
||
| 
     			multby := to_unsigned(28,9);
 
   | 
||
| 
     		else
 
   | 
||
| 
     			multby := to_unsigned(36,9);
 
   | 
||
| 
     		end if;
 
   | 
||
| 
     		adj1:= multby * clk_count_reg;
 
   | 
||
| 
     		adj:= signed(adj1(16 downto 3)) - to_signed(64,14);
 
   | 
||
| 
     | 
||
| 
     		--threshold: = "0100"; ntsc
 
   | 
||
| 
     		--threshold: = "0101"; pal
 
   | 
||
| 
     		threshold(0) := pal;
 
   | 
||
| 
     		threshold(1) := '0';
 
   | 
||
| 
     		threshold(2) := '1';
 
   | 
||
| 
     		threshold(3) := '0';
 
   | 
||
| 
     | 
||
| 
     		thresh_match := '0';
 
   | 
||
| 
     		if (cycle_count_reg=threshold) then
 
   | 
||
| 
     			thresh_match := '1';
 
   | 
||
| 
     		end if;
 
   | 
||
| 
     | 
||
| 
     		err_next(13 downto 0) <= err_reg(13 downto 0) + to_signed(64,14);
 
   | 
||
| 
     | 
||
| 
     		case state_reg is
 
   | 
||
| 
     			when state_sync =>
 
   | 
||
| 
     				if (phi2='1') then
 
   | 
||
| 
     					state_next <= state_count;
 
   | 
||
| 
     				end if;
 
   | 
||
| 
     			when state_count =>
 
   | 
||
| 
     				clk_inc := '1';
 
   | 
||
| 
     				if (phi2='1') then
 
   | 
||
| 
     					cycle_inc := '1';
 
   | 
||
| 
     				end if;
 
   | 
||
| 
     				if (thresh_match='1') then
 
   | 
||
| 
     					state_next <= state_gen;
 
   | 
||
| 
     					clk_inc := '0';
 
   | 
||
| 
     				end if;
 
   | 
||
| 
     			when state_genbegin =>
 
   | 
||
| 
     				if (phi2='1') then
 
   | 
||
| 
     					cycle_count_next <= (others=>'0');
 
   | 
||
| 
     					state_next <= state_gen;
 
   | 
||
| 
     					err_next <= -adj;
 
   | 
||
| 
     					trig := '1';
 
   | 
||
| 
     				end if;
 
   | 
||
| 
     			when state_gen =>
 
   | 
||
| 
     				-- threshold here is other size -1, which happens to match!
 
   | 
||
| 
     				if (err_reg(13) = '0') then
 
   | 
||
| 
     					err_next <= err_reg - adj;
 
   | 
||
| 
     					trig := '1';
 
   | 
||
| 
     					cycle_inc := '1';
 
   | 
||
| 
     				end if;
 
   | 
||
| 
     				if (thresh_match='1') then
 
   | 
||
| 
     					state_next <= state_genbegin;
 
   | 
||
| 
     				end if;
 
   | 
||
| 
     			when others=>
 
   | 
||
| 
     				state_next <= state_sync;
 
   | 
||
| 
     		end case;
 
   | 
||
| 
     | 
||
| 
     		if (cycle_inc='1') then
 
   | 
||
| 
     			cycle_count_next <= cycle_count_reg+1;
 
   | 
||
| 
     		end if;
 
   | 
||
| 
     | 
||
| 
     		if (clk_inc='1') then
 
   | 
||
| 
     			clk_count_next <= clk_count_reg + 1;
 
   | 
||
| 
     		end if;
 
   | 
||
| 
     | 
||
| 
     		if (trig='1') then
 
   | 
||
| 
     			mhz358 <= '1';
 
   | 
||
| 
     			everyother_next <= not(everyother_reg);
 
   | 
||
| 
     			mhz179 <= everyother_reg;
 
   | 
||
| 
     		end if;
 
   | 
||
| 
     	end process;
 
   | 
||
| 
     | 
||
| 
     | 
||
| 
     --enable_psg_div2 : entity work.syncreset_enable_divider
 
   | 
||
| 
     --  generic map (COUNT=>29,RESETCOUNT=>6) -- 28-22
 
   | 
||
| 
     --  port map(clk=>clk,syncreset=>'0',reset_n=>reset_n,enable_in=>'1',enable_out=>mhz2);
 
   | 
||
| 
     --
 
   | 
||
| 
     --enable_psg_div1 : entity work.syncreset_enable_divider
 
   | 
||
| 
     --  generic map (COUNT=>58,RESETCOUNT=>6) -- 28-22
 
   | 
||
| 
     --  port map(clk=>clk,syncreset=>'0',reset_n=>reset_n,enable_in=>'1',enable_out=>mhz1);
 
   | 
||
| 
     | 
||
| 
     | 
||
| 
     end vhdl;	
 
   | 
||
| atari_chips/pokeyv2/compile_sidcfg | ||
|---|---|---|
| 
     ~/fpga/svn/cc65/bin/cl65 -O -t c64 -DC64 sidcfg.c -o sidcfg.prg 
 
   | 
||
| 
     | 
||
| 
     c1541 -format "sidmaxcf","01" d81 sidmaxcf.d81
 
   | 
||
| 
     c1541 sidmaxcf.d81 -write sidcfg.prg 
 
   | 
||
| 
     c1541 sidmaxcf.d81 -write build_sidmax_10M08_full/output_files/core.bin
 
   | 
||
| atari_chips/pokeyv2/sidcfg.c | ||
|---|---|---|
| 
     #include <conio.h>
 
   | 
||
| 
     #include <stdlib.h>
 
   | 
||
| 
     #include <stdio.h>
 
   | 
||
| 
     #include <unistd.h>
 
   | 
||
| 
     | 
||
| 
     unsigned char * sid = (unsigned char *) 0xd400;
 
   | 
||
| 
     unsigned char * config = (unsigned char *) 0xd4f0;
 
   | 
||
| 
     | 
||
| 
     #define MENU_VERSION 1
 
   | 
||
| 
     #define MENU_DETECT 2
 
   | 
||
| 
     #define MENU_CH4 3 
 
   | 
||
| 
     #define MENU_MONO 4 
 
   | 
||
| 
     #define MENU_DIVIDE 5 
 
   | 
||
| 
     #define MENU_POKEYMIX 6 
 
   | 
||
| 
     #define MENU_PSGFREQ 7 
 
   | 
||
| 
     #define MENU_PSGCH 8 
 
   | 
||
| 
     #define MENU_PSGENV 9 
 
   | 
||
| 
     #define MENU_PSGVOL 10 
 
   | 
||
| 
     #define MENU_RESTRICT 11 
 
   | 
||
| 
     #define MENU_PAL 12 
 
   | 
||
| 
     #define MENU_END MENU_PAL 
 
   | 
||
| 
     | 
||
| 
     unsigned char has_flash()
 
   | 
||
| 
     {
 
   | 
||
| 
     	return ((config[1]&0x40) == 0x40);
 
   | 
||
| 
     }
 
   | 
||
| 
     unsigned long readFlash(unsigned long addr, unsigned char cfgarea)
 
   | 
||
| 
     {
 
   | 
||
| 
     	unsigned long res;
 
   | 
||
| 
     	unsigned char al;
 
   | 
||
| 
     | 
||
| 
     	addr = addr<<2;
 
   | 
||
| 
     | 
||
| 
     	al = addr&0xff;
 
   | 
||
| 
     	config[13] = al|3;
 
   | 
||
| 
     	config[14] = (addr>>8)&0xff;
 
   | 
||
| 
     | 
||
| 
     	config[11] = (((addr>>16)&0x7)<<3)|cfgarea<<2|2|1;
 
   | 
||
| 
     | 
||
| 
     	res = config[15];
 
   | 
||
| 
     	config[13] = al|2;
 
   | 
||
| 
     	res = res<<8;
 
   | 
||
| 
     	res |= config[15];
 
   | 
||
| 
     	config[13] = al|1;
 
   | 
||
| 
     	res = res<<8;
 
   | 
||
| 
     	res |= config[15];
 
   | 
||
| 
     	config[13] = al|0;
 
   | 
||
| 
     	res = res<<8;
 
   | 
||
| 
     	res |= config[15];
 
   | 
||
| 
     | 
||
| 
     	return res;
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void writeFlash(unsigned long addr, unsigned char cfgarea, unsigned long data)
 
   | 
||
| 
     {
 
   | 
||
| 
     	unsigned char al;
 
   | 
||
| 
     | 
||
| 
     	addr = addr<<2;
 
   | 
||
| 
     | 
||
| 
     	al = addr&0xff;
 
   | 
||
| 
     	config[13] = al|0;
 
   | 
||
| 
     	config[14] = (addr>>8)&0xff;
 
   | 
||
| 
     | 
||
| 
     	config[15] = data&0xff;
 
   | 
||
| 
     	config[13] = al|1;
 
   | 
||
| 
     	data = data>>8;
 
   | 
||
| 
     	config[15] = data&0xff;
 
   | 
||
| 
     	config[13] = al|2;
 
   | 
||
| 
     	data = data>>8;
 
   | 
||
| 
     	config[15] = data&0xff;
 
   | 
||
| 
     	config[13] = al|3;
 
   | 
||
| 
     	data = data>>8;
 
   | 
||
| 
     	config[15] = data;
 
   | 
||
| 
     | 
||
| 
     	config[11] = (((addr>>16)&0x7)<<3)|cfgarea<<2|2|0;
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     //void displayFlash(
 
   | 
||
| 
     //{
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x0, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x1, 0));
 
   | 
||
| 
     //	cprintf("%lx ",eadFlash(config, 0x2, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x3, 0));
 
   | 
||
| 
     //	cprintf("\r\n");
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x2000, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x2001, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x2002, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x2003, 0));
 
   | 
||
| 
     //	cprintf("\r\n");
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x0, 1));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x1, 1));
 
   | 
||
| 
     //	cprintf("\r\n");
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x4000, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x4001, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x4002, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x4003, 0));
 
   | 
||
| 
     //	cprintf("\r\n");
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x6000, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x6001, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x6002, 0));
 
   | 
||
| 
     //	cprintf("%lx ",readFlash(config, 0x6003, 0));
 
   | 
||
| 
     //	cprintf("\r\n");
 
   | 
||
| 
     //}
 
   | 
||
| 
     | 
||
| 
     void writeFlashContentsToFile()
 
   | 
||
| 
     {
 
   | 
||
| 
     	FILE * output;
 
   | 
||
| 
     	unsigned long addr;
 
   | 
||
| 
     	unsigned long * buffer = (unsigned long *)malloc(1024);
 
   | 
||
| 
     | 
||
| 
     	output = fopen("d3:flash.bin","w");
 
   | 
||
| 
     	for (addr=0;addr!=0xe600;addr+=256)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		unsigned short i;
 
   | 
||
| 
     		for (i=0;i!=256;++i)
 
   | 
||
| 
     			buffer[i] = readFlash(addr+i,0);
 
   | 
||
| 
     		fwrite(&buffer[0],1024,1,output);
 
   | 
||
| 
     	}
 
   | 
||
| 
     | 
||
| 
     	fclose(output);
 
   | 
||
| 
     | 
||
| 
     	free(buffer);
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void writeProtect(unsigned char onoff)
 
   | 
||
| 
     {
 
   | 
||
| 
     	unsigned long data = readFlash(1, 1);
 
   | 
||
| 
     	unsigned long mask = 0x1f;
 
   | 
||
| 
     	unsigned long sectormask = 0x00700000;
 
   | 
||
| 
     	unsigned long pagemask =   0x000fffff;
 
   | 
||
| 
     	data = data|sectormask|pagemask; //Spurious erase fix!
 
   | 
||
| 
     	mask = mask << 23;
 
   | 
||
| 
     	if (onoff)
 
   | 
||
| 
     		data = data|mask;
 
   | 
||
| 
     	else
 
   | 
||
| 
     		data = data&~mask;
 
   | 
||
| 
     	writeFlash(1,1,data);
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void flashContentsFromFile()
 
   | 
||
| 
     {
 
   | 
||
| 
     	FILE * input;
 
   | 
||
| 
     	unsigned int addr;
 
   | 
||
| 
     	unsigned long * buffer = (unsigned long *)malloc(1024);
 
   | 
||
| 
     | 
||
| 
     	writeProtect(0);
 
   | 
||
| 
     | 
||
| 
     	input = fopen("d3:flash.bin","r");
 
   | 
||
| 
     	for (addr=0;addr!=0xe600;addr+=256)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		unsigned short i;
 
   | 
||
| 
     		fread(&buffer[0],1024,1,input);
 
   | 
||
| 
     		for (i=0;i!=256;++i)
 
   | 
||
| 
     			writeFlash(addr+i,0,buffer[i]);
 
   | 
||
| 
     	}
 
   | 
||
| 
     | 
||
| 
     	fclose(input);
 
   | 
||
| 
     | 
||
| 
     	writeProtect(1);
 
   | 
||
| 
     | 
||
| 
     	free(buffer);
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     int getPageSize()
 
   | 
||
| 
     {
 
   | 
||
| 
     	config[4] = 5; //e.g 114M08QC
 
   | 
||
| 
                    //    01234567
 
   | 
||
| 
     	return config[4]=='6' ? 1024 : 512; // 16Kb for up to 10M08, then 32Kb for 10M16
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void erasePageContainingAddress(unsigned long addr)
 
   | 
||
| 
     {
 
   | 
||
| 
     	unsigned long data;
 
   | 
||
| 
     	unsigned long sectormask = 0x00700000;
 
   | 
||
| 
     	unsigned long pagemask =   0x000fffff;
 
   | 
||
| 
     	unsigned long status;
 
   | 
||
| 
     | 
||
| 
     	data = readFlash(1,1);
 
   | 
||
| 
     	data = data|sectormask;
 
   | 
||
| 
     	data = data&~pagemask;
 
   | 
||
| 
     	data = data|addr; 
 
   | 
||
| 
     	writeFlash(1,1,data);
 
   | 
||
| 
     | 
||
| 
     	for(;;)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		status = readFlash(0,1);
 
   | 
||
| 
     		if ((status&0x3)==0) break;
 
   | 
||
| 
     	}
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void eraseSector(unsigned char sector)
 
   | 
||
| 
     {
 
   | 
||
| 
     	unsigned long data;
 
   | 
||
| 
     	unsigned long sectormask = 0x00700000;
 
   | 
||
| 
     	unsigned long pagemask =   0x000fffff;
 
   | 
||
| 
     	unsigned long status;
 
   | 
||
| 
     | 
||
| 
     	data = readFlash(1,1);
 
   | 
||
| 
     	data = data|pagemask;
 
   | 
||
| 
     	data = data&~sectormask;
 
   | 
||
| 
     	data = data|(((unsigned long)sector)<<20);
 
   | 
||
| 
     	writeFlash(1,1,data);
 
   | 
||
| 
     | 
||
| 
     	for(;;)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		status = readFlash(0,1);
 
   | 
||
| 
     		if ((status&0x3)==0) break;
 
   | 
||
| 
     	}
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void renderLine(unsigned long * flash1, unsigned long * flash2, unsigned char activeLine, unsigned char line, unsigned char col)
 
   | 
||
| 
     {
 
   | 
||
| 
         unsigned char val;
 
   | 
||
| 
         unsigned char i;
 
   | 
||
| 
     | 
||
| 
         gotoxy(0,line+3);
 
   | 
||
| 
         val = (*flash1)&0xff;
 
   | 
||
| 
     | 
||
| 
         switch(line)
 
   | 
||
| 
         {
 
   | 
||
| 
         case MENU_VERSION:
 
   | 
||
| 
             revers(activeLine==MENU_VERSION);
 
   | 
||
| 
             val = (*flash2)&0x1;
 
   | 
||
| 
             cprintf("SID version   : ");
 
   | 
||
| 
             revers(activeLine==MENU_VERSION && col==0);
 
   | 
||
| 
     	switch(val)
 
   | 
||
| 
     	{
 
   | 
||
| 
     	case 0:
 
   | 
||
| 
             	cprintf("1:8580     ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	case 1:
 
   | 
||
| 
                     cprintf("1:6581     ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	}
 
   | 
||
| 
             revers(activeLine==MENU_VERSION && col==1);
 
   | 
||
| 
             val = (*flash2)&0x10;
 
   | 
||
| 
     	switch(val)
 
   | 
||
| 
     	{
 
   | 
||
| 
     	case 0:
 
   | 
||
| 
             	cprintf("2:8580     ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	case 0x10:
 
   | 
||
| 
                     cprintf("2:6581     ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	}
 
   | 
||
| 
     	break;
 
   | 
||
| 
         case MENU_DETECT:
 
   | 
||
| 
             revers(activeLine==MENU_DETECT);
 
   | 
||
| 
             val = (*flash2)>>16;
 
   | 
||
| 
             cprintf("SID detect    : %s",((val&0x10)==0x10) ? "Auto" : "Manual");
 
   | 
||
| 
             break;
 
   | 
||
| 
         case MENU_CH4:
 
   | 
||
| 
             revers(activeLine==MENU_CH4);
 
   | 
||
| 
             val = ((*flash2)>>16)&0x3;
 
   | 
||
| 
             cprintf("SID channel 4 : ");
 
   | 
||
| 
             revers(activeLine==MENU_CH4 && col==0);
 
   | 
||
| 
     	switch(val)
 
   | 
||
| 
     	{
 
   | 
||
| 
     	case 0:
 
   | 
||
| 
             	cprintf("1:GND      ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	case 1:
 
   | 
||
| 
                     cprintf("1:Digifix  ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	case 2:
 
   | 
||
| 
                     cprintf("1:ADC      ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	}
 
   | 
||
| 
             revers(activeLine==MENU_CH4 && col==1);
 
   | 
||
| 
             val = ((*flash2)>>18)&0x3;
 
   | 
||
| 
     	switch(val)
 
   | 
||
| 
     	{
 
   | 
||
| 
     	case 0:
 
   | 
||
| 
             	cprintf("2:GND      ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	case 1:
 
   | 
||
| 
                     cprintf("2:Digifix  ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	case 2:
 
   | 
||
| 
                     cprintf("2:ADC      ");
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	}
 
   | 
||
| 
             break;
 
   | 
||
| 
         case MENU_MONO:
 
   | 
||
| 
             revers(activeLine==MENU_MONO);
 
   | 
||
| 
             cprintf("Mono support  : %s",((val&16)==16) ? "Play on both channels" : "Left only");
 
   | 
||
| 
             break;
 
   | 
||
| 
         case MENU_DIVIDE:	
 
   | 
||
| 
             revers(activeLine==MENU_DIVIDE);
 
   | 
||
| 
             cprintf("Post divide   : ");
 
   | 
||
| 
             val = ((*flash1)>>8)&0xff;
 
   | 
||
| 
             for (i=0;i!=4;++i)
 
   | 
||
| 
             {
 
   | 
||
| 
     		int tmp = col;
 
   | 
||
| 
                     unsigned char pd = (val&0x3);
 
   | 
||
| 
     		if (tmp>0)
 
   | 
||
| 
     			tmp=tmp+1;
 
   | 
||
| 
             	switch (pd)
 
   | 
||
| 
             	{
 
   | 
||
| 
             	        case 0:
 
   | 
||
| 
             	    	    pd = 1;
 
   | 
||
| 
             	    	    break;
 
   | 
||
| 
             	        case 1:
 
   | 
||
| 
             	    	    pd = 2;
 
   | 
||
| 
             	    	    break;
 
   | 
||
| 
             	        case 2:
 
   | 
||
| 
             	    	    pd = 4;
 
   | 
||
| 
             	    	    break;
 
   | 
||
| 
             	        case 3: 
 
   | 
||
| 
             	    	    pd = 8;
 
   | 
||
| 
             	    	    break;
 
   | 
||
| 
             	}
 
   | 
||
| 
                     revers(activeLine==MENU_DIVIDE && tmp==i);
 
   | 
||
| 
                     val = val>>2;
 
   | 
||
| 
     		if (i!=1)
 
   | 
||
| 
      	               cprintf("%d=%d ",i+1,pd);
 
   | 
||
| 
             }
 
   | 
||
| 
             break;
 
   | 
||
| 
         case MENU_POKEYMIX:
 
   | 
||
| 
             revers(activeLine==MENU_POKEYMIX);
 
   | 
||
| 
             cprintf("Pokey Mixing  : %s",((val&1)==1) ? "Non-linear" : "Linear");
 
   | 
||
| 
             break;
 
   | 
||
| 
         case MENU_PSGFREQ:
 
   | 
||
| 
             val = ((*flash1)>>24)&0xff;
 
   | 
||
| 
             revers(activeLine==MENU_PSGFREQ);
 
   | 
||
| 
             cprintf("PSG frequency : ");
 
   | 
||
| 
             switch (val&3)
 
   | 
||
| 
             {
 
   | 
||
| 
         	case 0:
 
   | 
||
| 
         		cprintf("2MHz");
 
   | 
||
| 
         	    break;
 
   | 
||
| 
         	case 1:
 
   | 
||
| 
         		cprintf("1MHz");
 
   | 
||
| 
         	    break;
 
   | 
||
| 
         	case 2:
 
   | 
||
| 
         		cprintf("PHI2");
 
   | 
||
| 
         	    break;
 
   | 
||
| 
             }
 
   | 
||
| 
             break;
 
   | 
||
| 
         case MENU_PSGCH:
 
   | 
||
| 
             val = ((*flash1)>>24)&0xff;
 
   | 
||
| 
             revers(activeLine==MENU_PSGCH);
 
   | 
||
| 
             cprintf("PSG stereo    : ");
 
   | 
||
| 
             switch ((val&12)>>2)
 
   | 
||
| 
             {
 
   | 
||
| 
             case 0:
 
   | 
||
| 
                     cprintf("mono   (L:ABC R:ABC)");
 
   | 
||
| 
                     break;
 
   | 
||
| 
             case 1:
 
   | 
||
| 
                     cprintf("polish (L:AB  R:BC )");
 
   | 
||
| 
                     break;
 
   | 
||
| 
             case 2:
 
   | 
||
| 
                     cprintf("czech  (L:AC  R:BC )");
 
   | 
||
| 
                     break;
 
   | 
||
| 
             case 3:
 
   | 
||
| 
                     cprintf("l/r    (L:111 R:222)");
 
   | 
||
| 
                     break;
 
   | 
||
| 
             }
 
   | 
||
| 
     	break;
 
   | 
||
| 
         case MENU_PSGENV:
 
   | 
||
| 
             val = ((*flash1)>>24)&0xff;
 
   | 
||
| 
             revers(activeLine==MENU_PSGENV);
 
   | 
||
| 
             cprintf("PSG envelope  : ");
 
   | 
||
| 
             if ((val&16)==16)
 
   | 
||
| 
                     cprintf("16 steps");
 
   | 
||
| 
             else
 
   | 
||
| 
                     cprintf("32 steps");
 
   | 
||
| 
             break;
 
   | 
||
| 
         case MENU_PSGVOL:
 
   | 
||
| 
             val = ((*flash1)>>24)&0xff;
 
   | 
||
| 
             revers(activeLine==MENU_PSGVOL);
 
   | 
||
| 
             cprintf("PSG volume    : ");
 
   | 
||
| 
             if (((val&0x60)>>5)==3)
 
   | 
||
| 
         	    cprintf("Linear");
 
   | 
||
| 
             else
 
   | 
||
| 
         	    cprintf("Log %d",(val>>5)&3);
 
   | 
||
| 
     	break;
 
   | 
||
| 
         case MENU_RESTRICT:
 
   | 
||
| 
             revers(activeLine==MENU_RESTRICT);
 
   | 
||
| 
             val = ((*flash2)>>8)&0x1f;
 
   | 
||
| 
             cprintf("Restrict      : ");
 
   | 
||
| 
             revers(activeLine==MENU_RESTRICT && col==0);
 
   | 
||
| 
             if (val&2)
 
   | 
||
| 
         	    cprintf("quad ");
 
   | 
||
| 
             else if (val&1)
 
   | 
||
| 
         	    cprintf("dual ");
 
   | 
||
| 
             else
 
   | 
||
| 
         	    cprintf("mono ");
 
   | 
||
| 
             revers(activeLine==MENU_RESTRICT && col==1);
 
   | 
||
| 
             if (val&4)
 
   | 
||
| 
         	    cprintf(" sid ");
 
   | 
||
| 
             else
 
   | 
||
| 
         	    cprintf("!sid ");
 
   | 
||
| 
             revers(activeLine==MENU_RESTRICT && col==2);
 
   | 
||
| 
             if (val&8)
 
   | 
||
| 
         	    cprintf(" psg ");
 
   | 
||
| 
             else
 
   | 
||
| 
         	    cprintf("!psg ");
 
   | 
||
| 
             revers(activeLine==MENU_RESTRICT && col==3);
 
   | 
||
| 
             if (val&16)
 
   | 
||
| 
         	    cprintf(" covox");
 
   | 
||
| 
             else
 
   | 
||
| 
         	    cprintf("!covox");
 
   | 
||
| 
     	break;
 
   | 
||
| 
         case MENU_PAL:
 
   | 
||
| 
             revers(activeLine==MENU_PAL);
 
   | 
||
| 
             cprintf("PHI->1.7MHz   : %s",((val&32)==32) ? "PAL (9/5)" : "NTSC (7/4)");
 
   | 
||
| 
     	break;
 
   | 
||
| 
         }
 
   | 
||
| 
         revers(0);
 
   | 
||
| 
         *flash2; // silence warning
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     | 
||
| 
     void render(unsigned long * flash1, unsigned long * flash2, unsigned char activeLine, unsigned char line, unsigned char col)
 
   | 
||
| 
     {
 
   | 
||
| 
         unsigned char pokeys;
 
   | 
||
| 
         unsigned char val;
 
   | 
||
| 
         unsigned char i;
 
   | 
||
| 
      //   unsigned char prev559;
 
   | 
||
| 
         if (line ==255)
 
   | 
||
| 
         {
 
   | 
||
| 
     	//    prev559 = *(unsigned char *)559;
 
   | 
||
| 
     	//    *(unsigned char *)559 = 0;
 
   | 
||
| 
     	    clrscr();
 
   | 
||
| 
     	    //textcolor(0xa);
 
   | 
||
| 
     	    chline(40);
 
   | 
||
| 
     	    cprintf("Sidmax config v1.1 ");
 
   | 
||
| 
                 cprintf(" Core:");
 
   | 
||
| 
                 for (i=0;i!=8;++i)
 
   | 
||
| 
                 {
 
   | 
||
| 
                         config[4] = i;
 
   | 
||
| 
                         cprintf("%c",config[4]);
 
   | 
||
| 
                 }
 
   | 
||
| 
     	    gotoxy(0,3);
 
   | 
||
| 
     	    chline(40);
 
   | 
||
| 
     | 
||
| 
     	    gotoxy(0,17);
 
   | 
||
| 
     	    chline(40);
 
   | 
||
| 
     	    cprintf("Options:\r\n");
 
   | 
||
| 
     	    cprintf("  (A)pply config\r\n");
 
   | 
||
| 
     	    if (has_flash())
 
   | 
||
| 
     	    {
 
   | 
||
| 
     		    cprintf("  (S)tore config\r\n");
 
   | 
||
| 
     		    cprintf("  (U)pdate core/ (V)erify core\r\n");
 
   | 
||
| 
     	    }
 
   | 
||
| 
     	    cprintf("  (Q)uit\r\n");
 
   | 
||
| 
     	    cprintf("Use arrows and enter to change config");
 
   | 
||
| 
         }
 
   | 
||
| 
         gotoxy(0,2);
 
   | 
||
| 
     | 
||
| 
         val = ((*flash2)>>8)&0x1f;
 
   | 
||
| 
         config[7] = val;
 
   | 
||
| 
         val = config[1];
 
   | 
||
| 
         pokeys = val&0x3;
 
   | 
||
| 
         switch (pokeys)
 
   | 
||
| 
         {
 
   | 
||
| 
     	    case 0:
 
   | 
||
| 
     		    pokeys = 1;
 
   | 
||
| 
     		    break;
 
   | 
||
| 
     	    case 1:
 
   | 
||
| 
     		    pokeys = 2;
 
   | 
||
| 
     		    break;
 
   | 
||
| 
     	    case 2:
 
   | 
||
| 
     		    pokeys = 4;
 
   | 
||
| 
     		    break;
 
   | 
||
| 
     	    case 3:
 
   | 
||
| 
     		    pokeys = 8;
 
   | 
||
| 
     		    break;
 
   | 
||
| 
         }
 
   | 
||
| 
         cprintf("Sid:%d pokey:%d psg:%d covox:%d sample:%d",(val&4)==4 ? 2 : 0,pokeys,(val&8)==8 ? 2 : 0,(val&16)==16 ? 1 : 0,(val&32)==32 ? 1 : 0);
 
   | 
||
| 
     | 
||
| 
         if (line==255)
 
   | 
||
| 
         {
 
   | 
||
| 
     	    for (line=1;line<=MENU_END;++line)
 
   | 
||
| 
     		    renderLine(flash1,flash2,activeLine, line,col);
 
   | 
||
| 
     	//    *(unsigned char *)559 = prev559;
 
   | 
||
| 
         }
 
   | 
||
| 
         else
 
   | 
||
| 
         {
 
   | 
||
| 
         	renderLine(flash1,flash2,activeLine, line,col);
 
   | 
||
| 
             if (wherex()>15)
 
   | 
||
| 
                 cclear(40-wherex());
 
   | 
||
| 
         }
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void changeValue(unsigned long * flash1, unsigned long * flash2, unsigned char line, unsigned char col)
 
   | 
||
| 
     {
 
   | 
||
| 
         unsigned char shift;
 
   | 
||
| 
         unsigned char mask=1;
 
   | 
||
| 
         unsigned char max=1;
 
   | 
||
| 
     | 
||
| 
         unsigned char val;
 
   | 
||
| 
         unsigned long tmp;
 
   | 
||
| 
     | 
||
| 
         unsigned long * flashaddr = flash1;
 
   | 
||
| 
     | 
||
| 
         switch(line)
 
   | 
||
| 
         {
 
   | 
||
| 
         case MENU_VERSION:
 
   | 
||
| 
                 flashaddr = flash2;
 
   | 
||
| 
     	    mask = 1;
 
   | 
||
| 
                 shift = 0 + (col<<2);
 
   | 
||
| 
     	    max = 1;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_DETECT:
 
   | 
||
| 
     	    flashaddr = flash2;
 
   | 
||
| 
     	    mask = 1;
 
   | 
||
| 
     	    shift = 20;
 
   | 
||
| 
     	    max = 1;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_CH4:
 
   | 
||
| 
                 flashaddr = flash2;
 
   | 
||
| 
     	    mask = 3;
 
   | 
||
| 
                 shift = 16 + (col<<1);
 
   | 
||
| 
     	    max = 2;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_MONO:
 
   | 
||
| 
     	    shift = 4;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_DIVIDE:
 
   | 
||
| 
     	    {
 
   | 
||
| 
     		    int tmp = col;
 
   | 
||
| 
     		    if (tmp>0)
 
   | 
||
| 
     			    tmp=tmp+1;
 
   | 
||
| 
     		    shift = 8 + (tmp<<1);
 
   | 
||
| 
     	    }
 
   | 
||
| 
     	    mask = 3;
 
   | 
||
| 
     	    max = 3;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_POKEYMIX:
 
   | 
||
| 
     	    shift = 0;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_PSGFREQ:
 
   | 
||
| 
     	    mask = 3;
 
   | 
||
| 
                 shift = 24;
 
   | 
||
| 
     	    max = 2;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_PSGCH:
 
   | 
||
| 
     	    mask = 3;
 
   | 
||
| 
                 shift = 26;
 
   | 
||
| 
     	    max = 3;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_PSGENV:
 
   | 
||
| 
                 shift = 28;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_PSGVOL:
 
   | 
||
| 
     	    mask = 3;
 
   | 
||
| 
                 shift = 29;
 
   | 
||
| 
     	    max = 3;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_RESTRICT:
 
   | 
||
| 
                 flashaddr = flash2;
 
   | 
||
| 
     	    if (col==0)
 
   | 
||
| 
     	    {
 
   | 
||
| 
     	    	mask = 3;
 
   | 
||
| 
                 	shift = 8;
 
   | 
||
| 
     	    	max = 2;
 
   | 
||
| 
     	    }
 
   | 
||
| 
     	    else
 
   | 
||
| 
     	    {
 
   | 
||
| 
     	    	mask = 1;
 
   | 
||
| 
                 	shift = 9 + col;
 
   | 
||
| 
     	    	max = 1;
 
   | 
||
| 
     	    }
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         case MENU_PAL:
 
   | 
||
| 
     	    shift = 5;
 
   | 
||
| 
     	    break;
 
   | 
||
| 
         }
 
   | 
||
| 
     | 
||
| 
         tmp = mask;
 
   | 
||
| 
         tmp = tmp<<shift;
 
   | 
||
| 
         val = ((*flashaddr)&tmp)>>shift;
 
   | 
||
| 
         *flashaddr = (*flashaddr)&~tmp;
 
   | 
||
| 
         val = val+1;
 
   | 
||
| 
         if (val>max) val=0;
 
   | 
||
| 
         tmp = val;
 
   | 
||
| 
         tmp = tmp<<shift;
 
   | 
||
| 
         *flashaddr |= tmp;
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void applyConfig(unsigned long flash1, unsigned long flash2)
 
   | 
||
| 
     {
 
   | 
||
| 
         clrscr();
 
   | 
||
| 
         bgcolor(0x7);
 
   | 
||
| 
         //textcolor(0xa);
 
   | 
||
| 
         chline(40);
 
   | 
||
| 
         cprintf("Applying config\r\n");
 
   | 
||
| 
         chline(40);
 
   | 
||
| 
     | 
||
| 
         cprintf("Press Y to confirm\r\n");
 
   | 
||
| 
         while(!kbhit());
 
   | 
||
| 
         if (cgetc()=='y') 
 
   | 
||
| 
         {
 
   | 
||
| 
     	config[0] = flash1&0xff;
 
   | 
||
| 
     	config[2] = (flash1>>8)&0xff;
 
   | 
||
| 
     	config[3] = (flash1>>16)&0xff;
 
   | 
||
| 
     	config[5] = (flash1>>24)&0xff;
 
   | 
||
| 
     | 
||
| 
     	config[6] = flash2&0xff;
 
   | 
||
| 
     	config[7] = (flash2>>8)&0xff;
 
   | 
||
| 
     //	                                   SATURATE_NEXT <= flash_do(0);
 
   | 
||
| 
     //                                        -- 1 reserved...
 
   | 
||
| 
     //                                CHANNEL_MODE_NEXT <= flash_do(2);
 
   | 
||
| 
     //                                IRQ_EN_NEXT <= flash_do(3);
 
   | 
||
| 
     //                                DETECT_RIGHT_NEXT <= flash_do(4);
 
   | 
||
| 
     //                                        -- 5-7 reserved
 
   | 
||
| 
     //                                POST_DIVIDE_NEXT <= flash_do(15 downto 8);
 
   | 
||
| 
     //                                GTIA_ENABLE_NEXT <= flash_do(19 downto 16);
 
   | 
||
| 
     //                                        -- 23 downto 20 reserved
 
   | 
||
| 
     //                                PSG_FREQ_NEXT <= flash_do(25 downto 24);
 
   | 
||
| 
     //                                PSG_STEREOMODE_NEXT <= flash_do(27 downto 26);
 
   | 
||
| 
     //                                PSG_ENVELOPE16_NEXT <= flash_do(28);
 
   | 
||
| 
     //                                        -- 31 downto 29 reserved
 
   | 
||
| 
         }
 
   | 
||
| 
     | 
||
| 
         bgcolor(0x00);
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void saveConfig(unsigned long flash1, unsigned long flash2)
 
   | 
||
| 
     {
 
   | 
||
| 
         clrscr();
 
   | 
||
| 
         bgcolor(0x7);
 
   | 
||
| 
         //textcolor(0xa);
 
   | 
||
| 
         chline(40);
 
   | 
||
| 
         cprintf("Saving config\r\n");
 
   | 
||
| 
         chline(40);
 
   | 
||
| 
     | 
||
| 
         cprintf("Press Y to confirm\r\n");
 
   | 
||
| 
         while(!kbhit());
 
   | 
||
| 
         if (cgetc()=='y') 
 
   | 
||
| 
         {
 
   | 
||
| 
     	unsigned int pagesize = getPageSize();
 
   | 
||
| 
             unsigned long * buffer = (unsigned long *)malloc(pagesize*4);
 
   | 
||
| 
     	unsigned short i = 0;
 
   | 
||
| 
     | 
||
| 
     	cprintf("Backing up page\r\n");
 
   | 
||
| 
     	for (i=2;i!=pagesize;++i)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		buffer[i] = readFlash(i,0);
 
   | 
||
| 
     	}
 
   | 
||
| 
     	writeProtect(0);
 
   | 
||
| 
     	cprintf("Erasing page\r\n");
 
   | 
||
| 
     	erasePageContainingAddress(0);
 
   | 
||
| 
     	cprintf("Writing new page\r\n");
 
   | 
||
| 
     	buffer[0] = flash1;
 
   | 
||
| 
     	buffer[1] = flash2;
 
   | 
||
| 
     	for (i=0;i!=pagesize;++i)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		writeFlash(i,0,buffer[i]);
 
   | 
||
| 
     	}
 
   | 
||
| 
     	writeProtect(1);
 
   | 
||
| 
     | 
||
| 
             free(buffer);
 
   | 
||
| 
         }
 
   | 
||
| 
     | 
||
| 
         bgcolor(0x00);
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void updateCore()
 
   | 
||
| 
     {
 
   | 
||
| 
         unsigned long flash1 = readFlash(0,0);
 
   | 
||
| 
         unsigned long flash2 = readFlash(1,0); //unused for now
 
   | 
||
| 
         char filename[] = "core.bin";
 
   | 
||
| 
     | 
||
| 
         clrscr();
 
   | 
||
| 
         bgcolor(0x8);
 
   | 
||
| 
         //textcolor(0xa);
 
   | 
||
| 
         chline(40);
 
   | 
||
| 
         cprintf("Updating core\r\n");
 
   | 
||
| 
         chline(40);
 
   | 
||
| 
     | 
||
| 
         cprintf("Please insert core.bin into drive\r\n");
 
   | 
||
| 
         cprintf("Press Y to confirm core update\r\n");
 
   | 
||
| 
         while(!kbhit());
 
   | 
||
| 
         if (cgetc()=='y') 
 
   | 
||
| 
         {
 
   | 
||
| 
         	FILE * input = fopen(filename,"rb");
 
   | 
||
| 
         	if (!input)
 
   | 
||
| 
         	{
 
   | 
||
| 
         		cprintf("Failed to open file!\r\n");
 
   | 
||
| 
         		sleep(3);
 
   | 
||
| 
         	}
 
   | 
||
| 
         	else
 
   | 
||
| 
         	{
 
   | 
||
| 
     	    unsigned char version[8];
 
   | 
||
| 
     	    unsigned char valid;
 
   | 
||
| 
     	    unsigned char i,j;
 
   | 
||
| 
     | 
||
| 
     	    cprintf("\r\n");
 
   | 
||
| 
                 chline(40);
 
   | 
||
| 
                 cprintf("DO NOT TURN OFF THE COMPUTER\r\n");
 
   | 
||
| 
                 chline(40);
 
   | 
||
| 
     	    cprintf("\r\n");
 
   | 
||
| 
     | 
||
| 
     	    cprintf("File opened\r\n");
 
   | 
||
| 
     	    fread(&version[0],8,1,input);
 
   | 
||
| 
     	    // Verify validity!
 
   | 
||
| 
     	    valid = 1;
 
   | 
||
| 
       	    for (i=3;i!=8;++i)
 
   | 
||
| 
       	    {
 
   | 
||
| 
       	            config[4] = i;
 
   | 
||
| 
                         if (config[4]!=version[i])
 
   | 
||
| 
     	            {
 
   | 
||
| 
     			  valid = 0;
 
   | 
||
| 
     | 
||
| 
     	          	  cprintf("Invalid core\r\n");
 
   | 
||
| 
     			  cprintf("Current:");
 
   | 
||
| 
     			  for (j=0;j!=8;++j)
 
   | 
||
| 
     			  {
 
   | 
||
| 
     				  config[4] = j;
 
   | 
||
| 
     				  cprintf("%c",config[4]);
 
   | 
||
| 
     			  }
 
   | 
||
| 
     			  cprintf("\r\nFile   :");
 
   | 
||
| 
     			  for (j=0;j!=8;++j)
 
   | 
||
| 
     				  cprintf("%c",version[j]);
 
   | 
||
| 
     | 
||
| 
     			  config[4] = 5;
 
   | 
||
| 
     			  if (config[4] == version[5])
 
   | 
||
| 
     			  {
 
   | 
||
| 
     			  	cprintf("\r\nPress any key to quit or f to force\r\n");
 
   | 
||
| 
         			  	if (cgetc()=='f') 
 
   | 
||
| 
     			  	{
 
   | 
||
| 
     			  	        cprintf("FORCED!\r\n");
 
   | 
||
| 
     					cprintf("You may need to change wiring!\r\n");
 
   | 
||
| 
     			  	        valid = 1;
 
   | 
||
| 
     			  	}
 
   | 
||
| 
     			  }
 
   | 
||
| 
     			  else
 
   | 
||
| 
     			  {
 
   | 
||
| 
     			  	cprintf("\r\nCore is for a different FPGA!\r\n");
 
   | 
||
| 
     			  	cprintf("Press any key to quit\r\n");
 
   | 
||
| 
                                     cgetc();
 
   | 
||
| 
     			  }
 
   | 
||
| 
     | 
||
| 
     	          	  break;
 
   | 
||
| 
     	            }
 
   | 
||
| 
       	    }
 
   | 
||
| 
     	    if (valid)
 
   | 
||
| 
     	    {
 
   | 
||
| 
     	    	//fseek(input,0,SEEK_SET);
 
   | 
||
| 
     	        fclose(input);
 
   | 
||
| 
     		input = fopen(filename,"r");
 
   | 
||
| 
     	    	writeProtect(0);
 
   | 
||
| 
     | 
||
| 
     	    	cprintf("Erasing");
 
   | 
||
| 
     	    	eraseSector(1);
 
   | 
||
| 
     	    	cputc('.');
 
   | 
||
| 
     	    	eraseSector(2);
 
   | 
||
| 
     	    	cputc('.');
 
   | 
||
| 
     	    	eraseSector(3);
 
   | 
||
| 
     	    	cputc('.');
 
   | 
||
| 
     	    	eraseSector(4);
 
   | 
||
| 
     	    	cprintf(" Done\r\n");
 
   | 
||
| 
     | 
||
| 
     		config[4] = 5; //e.g 114M08QC 
 
   | 
||
| 
     		               //    01234567
 
   | 
||
| 
     		j = config[4];
 
   | 
||
| 
     		config[4] = 4;
 
   | 
||
| 
     	    	cprintf("Flashing M%c%c... please wait",config[4],j);
 
   | 
||
| 
     	    	{
 
   | 
||
| 
     	    	    unsigned long addr;
 
   | 
||
| 
     	    	    unsigned long maxaddr;
 
   | 
||
| 
     	    	    unsigned long * buffer = (unsigned long *)malloc(1024);
 
   | 
||
| 
     		    unsigned char t=0;
 
   | 
||
| 
     | 
||
| 
                         config[4] = 5; 
 
   | 
||
| 
     		    maxaddr = config[4]=='4' ? 0xd600 : config[4]=='8' ? 0xe600 : 0x19800; // d600 for m04, e600 for m08. Default to 08 so DEVELPR works
 
   | 
||
| 
     | 
||
| 
     	    	    for (addr=0;addr!=maxaddr;addr+=256) 
 
   | 
||
| 
     	    	    {
 
   | 
||
| 
     	    	    	unsigned long i;
 
   | 
||
| 
     			gotoxy(0,20);
 
   | 
||
| 
     			cprintf("%c  %d/%d      ",(t ? '/' : '\\'),(unsigned short)(1+(addr>>8)),(unsigned short)(maxaddr>>8));
 
   | 
||
| 
     			t = !t;
 
   | 
||
| 
     | 
||
| 
     	    	    	i = fread(&buffer[0],1024,1,input);
 
   | 
||
| 
     			if (i!=1) 
 
   | 
||
| 
     			{
 
   | 
||
| 
     				cprintf("\r\nError reading disk!\r\n");
 
   | 
||
| 
     				cprintf("Press key then START AGAIN!\r\n");
 
   | 
||
| 
     				fclose(input);
 
   | 
||
| 
     | 
||
| 
         				while(!kbhit());
 
   | 
||
| 
     				return;
 
   | 
||
| 
     			}
 
   | 
||
| 
     	    	    	if (addr==0)
 
   | 
||
| 
     	    	    	{
 
   | 
||
| 
     				// keep our config...
 
   | 
||
| 
     	    	    		buffer[0] = flash1;
 
   | 
||
| 
     	    	    		buffer[1] = flash2;
 
   | 
||
| 
     	    	    	}
 
   | 
||
| 
     	    	    	for (i=0;i!=256;++i)
 
   | 
||
| 
     			{
 
   | 
||
| 
     				if (buffer[i]!=0xffffffff)
 
   | 
||
| 
     				{
 
   | 
||
| 
     					bordercolor(i);
 
   | 
||
| 
     		    	    		writeFlash(addr+i,0,buffer[i]);
 
   | 
||
| 
     				}
 
   | 
||
| 
     			}
 
   | 
||
| 
     	    	    }
 
   | 
||
| 
     | 
||
| 
     	    	    writeProtect(1);
 
   | 
||
| 
     | 
||
| 
     	    	    free(buffer);
 
   | 
||
| 
     	    	}
 
   | 
||
| 
     	    }
 
   | 
||
| 
         	}
 
   | 
||
| 
         	fclose(input);
 
   | 
||
| 
         }
 
   | 
||
| 
         bgcolor(0x00);
 
   | 
||
| 
         bordercolor(0x00);
 
   | 
||
| 
     | 
||
| 
         //writeFlashContentsToFile();
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     void verifyCore()
 
   | 
||
| 
     {
 
   | 
||
| 
         unsigned long flash1 = readFlash(0,0);
 
   | 
||
| 
         unsigned long flash2 = readFlash(1,0); //unused for now
 
   | 
||
| 
         char filename[] = "d4:core.bin";
 
   | 
||
| 
     | 
||
| 
         clrscr();
 
   | 
||
| 
         bgcolor(0x7);
 
   | 
||
| 
         //textcolor(0xa);
 
   | 
||
| 
         chline(40);
 
   | 
||
| 
         cprintf("Verifying core\r\n");
 
   | 
||
| 
         chline(40);
 
   | 
||
| 
     | 
||
| 
         cprintf("Please insert core.bin into D4\r\n");
 
   | 
||
| 
         cprintf("Press Y to confirm core verify\r\n");
 
   | 
||
| 
         while(!kbhit());
 
   | 
||
| 
         if (cgetc()=='y') 
 
   | 
||
| 
         {
 
   | 
||
| 
         	FILE * input = fopen(filename,"r");
 
   | 
||
| 
     	int j;
 
   | 
||
| 
         	unsigned long addr;
 
   | 
||
| 
         	unsigned long maxaddr;
 
   | 
||
| 
         	unsigned long * buffer = (unsigned long *)malloc(1024);
 
   | 
||
| 
     	unsigned char t=0;
 
   | 
||
| 
         	if (!input)
 
   | 
||
| 
         	{
 
   | 
||
| 
         		cprintf("Failed to open file!\r\n");
 
   | 
||
| 
         		sleep(3);
 
   | 
||
| 
         	}
 
   | 
||
| 
         	//fseek(input,0,SEEK_SET);
 
   | 
||
| 
             fclose(input);
 
   | 
||
| 
     	input = fopen(filename,"r");
 
   | 
||
| 
     | 
||
| 
     	config[4] = 5; //e.g 114M08QC 
 
   | 
||
| 
     	               //    01234567
 
   | 
||
| 
     	j = config[4];
 
   | 
||
| 
     	config[4] = 4;
 
   | 
||
| 
         	cprintf("Verifying M%c%c... please wait",config[4],j);
 
   | 
||
| 
     | 
||
| 
             config[4] = 5; 
 
   | 
||
| 
     	maxaddr = config[4]=='4' ? 0xd600 : config[4]=='8' ? 0xe600 : 0x19800; // d600 for m04, e600 for m08. Default to 08 so DEVELPR works
 
   | 
||
| 
     | 
||
| 
         	for (addr=0;addr!=maxaddr;addr+=256) 
 
   | 
||
| 
         	{
 
   | 
||
| 
         	    unsigned long i;
 
   | 
||
| 
     	    gotoxy(0,20);
 
   | 
||
| 
     	    cprintf("%c  %d/%d      ",(t ? '/' : '\\'),(unsigned short)(1+(addr>>8)),(unsigned short)(maxaddr>>8));
 
   | 
||
| 
     	    t = !t;
 
   | 
||
| 
     | 
||
| 
                 i = fread(&buffer[0],1024,1,input);
 
   | 
||
| 
     	    if (i!=1) 
 
   | 
||
| 
     	    {
 
   | 
||
| 
     	    	cprintf("\r\nError reading disk!\r\n");
 
   | 
||
| 
     	    	cprintf("Press key then START AGAIN!\r\n");
 
   | 
||
| 
     	    	fclose(input);
 
   | 
||
| 
     | 
||
| 
     	    	while(!kbhit());
 
   | 
||
| 
        		bgcolor(0x00);
 
   | 
||
| 
     		bordercolor(0x00);
 
   | 
||
| 
     	    	return;
 
   | 
||
| 
     	    }
 
   | 
||
| 
                 if (addr==0)
 
   | 
||
| 
                 {
 
   | 
||
| 
                 // keep our config...
 
   | 
||
| 
                 	buffer[0] = flash1;
 
   | 
||
| 
                 	buffer[1] = flash2;
 
   | 
||
| 
                 }
 
   | 
||
| 
                 for (i=0;i!=256;++i)
 
   | 
||
| 
     	    {
 
   | 
||
| 
     		unsigned long val;
 
   | 
||
| 
                     bordercolor(i);
 
   | 
||
| 
     		val = readFlash(addr+i,0);
 
   | 
||
| 
     		if (val!=buffer[i])
 
   | 
||
| 
     		{
 
   | 
||
| 
     	    		cprintf("\r\nError at address %08lx\r\n",addr+i);
 
   | 
||
| 
     			cprintf("disk:%08lx flash:%08lx\r\n",buffer[i],val);
 
   | 
||
| 
     	    		cprintf("Press key to continue\r\n");
 
   | 
||
| 
     	    		fclose(input);
 
   | 
||
| 
     | 
||
| 
     	    		while(!kbhit());
 
   | 
||
| 
     	    		return;
 
   | 
||
| 
     		}
 
   | 
||
| 
     	    }
 
   | 
||
| 
         	}
 
   | 
||
| 
     | 
||
| 
         	free(buffer);
 
   | 
||
| 
         	fclose(input);
 
   | 
||
| 
         }
 
   | 
||
| 
         bgcolor(0x00);
 
   | 
||
| 
         bordercolor(0x00);
 
   | 
||
| 
     | 
||
| 
         //writeFlashContentsToFile();
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     int main (void)
 
   | 
||
| 
     {
 
   | 
||
| 
         unsigned int i;
 
   | 
||
| 
         unsigned char prevline,line,col,quit;
 
   | 
||
| 
         unsigned long flash1;
 
   | 
||
| 
         unsigned long flash2;
 
   | 
||
| 
         unsigned char origbg;
 
   | 
||
| 
         unsigned char origbord;
 
   | 
||
| 
         if (config[12] != 1)
 
   | 
||
| 
         {
 
   | 
||
| 
     	    cprintf("Sidmax not found!");
 
   | 
||
| 
     	    sleep(5);
 
   | 
||
| 
     	    return -1;
 
   | 
||
| 
         }
 
   | 
||
| 
         origbg = bgcolor(0);
 
   | 
||
| 
         origbord = bordercolor(0);
 
   | 
||
| 
     | 
||
| 
         config[12] = 0x3f; // select config area
 
   | 
||
| 
     | 
||
| 
         // We have just 8 bytes of data for config
 
   | 
||
| 
         flash1 = 0; //readFlash(0,0);
 
   | 
||
| 
         flash2 = 0; //readFlash(1,0); //unused for now
 
   | 
||
| 
     | 
||
| 
         flash1 = 
 
   | 
||
| 
     	    (((unsigned long)config[5])<<24) |
 
   | 
||
| 
     	    (((unsigned long)config[3])<<16) |
 
   | 
||
| 
     	    (((unsigned long)config[2])<<8) |
 
   | 
||
| 
     	    (((unsigned long)config[0]));
 
   | 
||
| 
         flash2 =
 
   | 
||
| 
     	    (((unsigned long) config[8])<<16) |
 
   | 
||
| 
     	    (((unsigned long) config[7])<<8) |
 
   | 
||
| 
     	    ((unsigned long) config[6]);
 
   | 
||
| 
     | 
||
| 
         prevline = 255;
 
   | 
||
| 
         line = 1;
 
   | 
||
| 
         col = 0;
 
   | 
||
| 
         quit = 0;
 
   | 
||
| 
     | 
||
| 
         while (!quit)
 
   | 
||
| 
         {
 
   | 
||
| 
             render(&flash1,&flash2,line,prevline,col);
 
   | 
||
| 
             render(&flash1,&flash2,line,line,col);
 
   | 
||
| 
     | 
||
| 
     	prevline=line;
 
   | 
||
| 
     | 
||
| 
     	while (!kbhit());
 
   | 
||
| 
             switch (cgetc())
 
   | 
||
| 
     	{
 
   | 
||
| 
             case 145:
 
   | 
||
| 
     		if (line>1)
 
   | 
||
| 
     		    line = line-1;
 
   | 
||
| 
     		col = 0;
 
   | 
||
| 
     		break;
 
   | 
||
| 
             case 17:
 
   | 
||
| 
     		if (line<MENU_END)
 
   | 
||
| 
     		    line = line+1;
 
   | 
||
| 
     		col = 0;
 
   | 
||
| 
     		break;
 
   | 
||
| 
             case 157:
 
   | 
||
| 
     		if (col>0)
 
   | 
||
| 
     			col =col-1;
 
   | 
||
| 
     		break;
 
   | 
||
| 
             case 29:
 
   | 
||
| 
     		col =col+1;
 
   | 
||
| 
         		if (line==MENU_CH4 || line==MENU_VERSION)
 
   | 
||
| 
     		{
 
   | 
||
| 
     			if (col>1)
 
   | 
||
| 
     				col =1;
 
   | 
||
| 
     		}
 
   | 
||
| 
     		else if (line==MENU_DIVIDE)
 
   | 
||
| 
     		{
 
   | 
||
| 
     			if (col>2)
 
   | 
||
| 
     				col = 2;
 
   | 
||
| 
     		}
 
   | 
||
| 
     		else
 
   | 
||
| 
     		{
 
   | 
||
| 
     			if (col>3)
 
   | 
||
| 
     				col =3;
 
   | 
||
| 
     		}
 
   | 
||
| 
     		break;
 
   | 
||
| 
             case CH_ENTER:
 
   | 
||
| 
     		changeValue(&flash1,&flash2,line,col);
 
   | 
||
| 
     		break;
 
   | 
||
| 
             case 'a':
 
   | 
||
| 
     		// Apply config
 
   | 
||
| 
     		applyConfig(flash1,flash2);
 
   | 
||
| 
         		prevline = 255;
 
   | 
||
| 
     		break;
 
   | 
||
| 
             case 's':
 
   | 
||
| 
     		// Save config
 
   | 
||
| 
                     if (has_flash()) saveConfig(flash1,flash2);
 
   | 
||
| 
         		prevline = 255;
 
   | 
||
| 
     		break;
 
   | 
||
| 
             case 'u':
 
   | 
||
| 
     		// Update core
 
   | 
||
| 
                     if (has_flash()) updateCore();
 
   | 
||
| 
         		prevline = 255;
 
   | 
||
| 
     		break;
 
   | 
||
| 
     	case 'v':
 
   | 
||
| 
     		// Verify core
 
   | 
||
| 
     		if (has_flash()) verifyCore();
 
   | 
||
| 
     		prevline = 255;
 
   | 
||
| 
     		break;
 
   | 
||
| 
             case 'q':
 
   | 
||
| 
     		clrscr();
 
   | 
||
| 
     		quit = 1;
 
   | 
||
| 
     		break;
 
   | 
||
| 
             case 'x':
 
   | 
||
| 
     		clrscr();
 
   | 
||
| 
     		cprintf("Hex dump of flash from 0x400\r\n");
 
   | 
||
| 
     		for (i=0;i!=64;++i)
 
   | 
||
| 
     		{
 
   | 
||
| 
     			unsigned long val = readFlash(i+0x400, 0);
 
   | 
||
| 
     			cprintf("%08lx",val);
 
   | 
||
| 
     		}
 
   | 
||
| 
     		while (!kbhit());
 
   | 
||
| 
         		prevline = 255;
 
   | 
||
| 
     | 
||
| 
     		break;
 
   | 
||
| 
             }
 
   | 
||
| 
         }
 
   | 
||
| 
     | 
||
| 
     /*	    displayFlash(config);
 
   | 
||
| 
     	    //writeFlashContentsToFile(config);
 
   | 
||
| 
     	    //erasePageContainingAddress(config,0x0);
 
   | 
||
| 
     	    eraseSector(config,1);
 
   | 
||
| 
     	    eraseSector(config,2);
 
   | 
||
| 
     	    eraseSector(config,3);
 
   | 
||
| 
     	    eraseSector(config,4);
 
   | 
||
| 
     	    displayFlash(config);
 
   | 
||
| 
     	    flashContentsFromFile(config);
 
   | 
||
| 
     	    displayFlash(config);*/
 
   | 
||
| 
     | 
||
| 
         config[12] = 0x0; // deselect config area
 
   | 
||
| 
         bgcolor(origbg);
 
   | 
||
| 
         bordercolor(origbord);
 
   | 
||
| 
         return EXIT_SUCCESS;
 
   | 
||
| 
     }
 
   | 
||
| 
     | 
||
| 
     | 
||
| atari_chips/pokeyv2/sidmax.qpf | ||
|---|---|---|
| 
     # -------------------------------------------------------------------------- #
 
   | 
||
| 
     #
 
   | 
||
| 
     # Copyright (C) 2017  Intel Corporation. All rights reserved.
 
   | 
||
| 
     # Your use of Intel Corporation's design tools, logic functions 
 
   | 
||
| 
     # and other software and tools, and its AMPP partner logic 
 
   | 
||
| 
     # functions, and any output files from any of the foregoing 
 
   | 
||
| 
     # (including device programming or simulation files), and any 
 
   | 
||
| 
     # associated documentation or information are expressly subject 
 
   | 
||
| 
     # to the terms and conditions of the Intel Program License 
 
   | 
||
| 
     # Subscription Agreement, the Intel Quartus Prime License Agreement,
 
   | 
||
| 
     # the Intel MegaCore Function License Agreement, or other 
 
   | 
||
| 
     # applicable license agreement, including, without limitation, 
 
   | 
||
| 
     # that your use is for the sole purpose of programming logic 
 
   | 
||
| 
     # devices manufactured by Intel and sold by Intel or its 
 
   | 
||
| 
     # authorized distributors.  Please refer to the applicable 
 
   | 
||
| 
     # agreement for further details.
 
   | 
||
| 
     #
 
   | 
||
| 
     # -------------------------------------------------------------------------- #
 
   | 
||
| 
     #
 
   | 
||
| 
     # Quartus Prime
 
   | 
||
| 
     # Version 17.0.0 Build 595 04/25/2017 SJ Lite Edition
 
   | 
||
| 
     # Date created = 19:35:48  June 01, 2018
 
   | 
||
| 
     #
 
   | 
||
| 
     # -------------------------------------------------------------------------- #
 
   | 
||
| 
     | 
||
| 
     QUARTUS_VERSION = "17.0"
 
   | 
||
| 
     DATE = "19:35:48  June 01, 2018"
 
   | 
||
| 
     | 
||
| 
     # Revisions
 
   | 
||
| 
     | 
||
| 
     PROJECT_REVISION = "sidmax"
 
   | 
||
| atari_chips/pokeyv2/sidmax.sdc | ||
|---|---|---|
| 
     create_clock -period 1.0MHz [get_ports PHI2]
 
   | 
||
| 
     | 
||
| 
     create_clock -period 87.36MHz [get_ports CLK_SLOW]
 
   | 
||
| 
     derive_pll_clocks
 
   | 
||
| 
     derive_clock_uncertainty
 
   | 
||
| 
     | 
||
| 
     set_clock_groups -asynchronous \
 
   | 
||
| 
       -group { PHI2 } \
 
   | 
||
| 
       -group { CLK_SLOW } \
 
   | 
||
| 
       -group { \
 
   | 
||
| 
         pll_inst|altpll_component|auto_generated|pll1|clk[0] \
 
   | 
||
| 
         pll_inst|altpll_component|auto_generated|pll1|clk[1] \
 
   | 
||
| 
       }
 
   | 
||
| 
     | 
||
| 
     #		IOX_RST : OUT STD_LOGIC;
 
   | 
||
| 
     #		IOX_INT : IN STD_LOGIC;
 
   | 
||
| 
     #		IOX_SDA : INOUT STD_LOGIC;
 
   | 
||
| 
     #		IOX_SCL : INOUT STD_LOGIC
 
   | 
||
| 
     | 
||
| 
     #create_clock -period 56.67MHz -name cart_clk
 
   | 
||
| 
     #set_input_delay -clock cart_clk -max 0.0 [get_ports D[*]]
 
   | 
||
| 
     #set_input_delay -clock cart_clk -min 0.0 [get_ports D[*]] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_input_delay -clock cart_clk -max 0.0 [get_ports A[*]]
 
   | 
||
| 
     #set_input_delay -clock cart_clk -min 0.0 [get_ports A[*]] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_input_delay -clock cart_clk -max 0.0 [get_ports W_N]
 
   | 
||
| 
     #set_input_delay -clock cart_clk -min 0.0 [get_ports W_N] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_input_delay -clock cart_clk -max 0.0 [get_ports CS_COMB]
 
   | 
||
| 
     #set_input_delay -clock cart_clk -min 0.0 [get_ports CS_COMB] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_input_delay -clock cart_clk -max 0.0 [get_ports PADDLE]
 
   | 
||
| 
     #set_input_delay -clock cart_clk -min 0.0 [get_ports PADDLE] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_input_delay -clock cart_clk -max 0.0 [get_ports IRQ]
 
   | 
||
| 
     #set_input_delay -clock cart_clk -min 0.0 [get_ports IRQ] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_input_delay -clock cart_clk -max 0.0 [get_ports SID]
 
   | 
||
| 
     #set_input_delay -clock cart_clk -min 0.0 [get_ports SID] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_input_delay -clock cart_clk -max 0.0 [get_ports BCLK]
 
   | 
||
| 
     #set_input_delay -clock cart_clk -min 0.0 [get_ports BCLK] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_output_delay -clock cart_clk -max 0.0 [get_ports D[*]]
 
   | 
||
| 
     #set_output_delay -clock cart_clk -min 0.0 [get_ports D[*]] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_output_delay -clock cart_clk -max 0.0 [get_ports SOD]
 
   | 
||
| 
     #set_output_delay -clock cart_clk -min 0.0 [get_ports SOD] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_output_delay -clock cart_clk -max 0.0 [get_ports ACLK]
 
   | 
||
| 
     #set_output_delay -clock cart_clk -min 0.0 [get_ports ACLK] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_output_delay -clock cart_clk -max 0.0 [get_ports BCLK]
 
   | 
||
| 
     #set_output_delay -clock cart_clk -min 0.0 [get_ports BCLK] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_output_delay -clock cart_clk -max 0.0 [get_ports AUD[*]]
 
   | 
||
| 
     #set_output_delay -clock cart_clk -min 0.0 [get_ports AUD[*]] 
 
   | 
||
| 
     #
 
   | 
||
| 
     #set_output_delay -clock cart_clk -max 0.0 [get_ports IRQ]
 
   | 
||
| 
     #set_output_delay -clock cart_clk -min 0.0 [get_ports IRQ] 
 
   | 
||
| 
     #
 
   | 
||
| atari_chips/pokeyv2/sidmaxv1.qsf | ||
|---|---|---|
| 
     # -------------------------------------------------------------------------- #
 
   | 
||
| 
     #
 
   | 
||
| 
     # Copyright (C) 2017  Intel Corporation. All rights reserved.
 
   | 
||
| 
     # Your use of Intel Corporation's design tools, logic functions 
 
   | 
||
| 
     # and other software and tools, and its AMPP partner logic 
 
   | 
||
| 
     # functions, and any output files from any of the foregoing 
 
   | 
||
| 
     # (including device programming or simulation files), and any 
 
   | 
||
| 
     # associated documentation or information are expressly subject 
 
   | 
||
| 
     # to the terms and conditions of the Intel Program License 
 
   | 
||
| 
     # Subscription Agreement, the Intel Quartus Prime License Agreement,
 
   | 
||
| 
     # the Intel MegaCore Function License Agreement, or other 
 
   | 
||
| 
     # applicable license agreement, including, without limitation, 
 
   | 
||
| 
     # that your use is for the sole purpose of programming logic 
 
   | 
||
| 
     # devices manufactured by Intel and sold by Intel or its 
 
   | 
||
| 
     # authorized distributors.  Please refer to the applicable 
 
   | 
||
| 
     # agreement for further details.
 
   | 
||
| 
     #
 
   | 
||
| 
     # -------------------------------------------------------------------------- #
 
   | 
||
| 
     #
 
   | 
||
| 
     # Quartus Prime
 
   | 
||
| 
     # Version 17.0.0 Build 595 04/25/2017 SJ Lite Edition
 
   | 
||
| 
     # Date created = 19:35:48  June 01, 2018
 
   | 
||
| 
     #
 
   | 
||
| 
     # -------------------------------------------------------------------------- #
 
   | 
||
| 
     #
 
   | 
||
| 
     # Notes:
 
   | 
||
| 
     #
 
   | 
||
| 
     # 1) The default values for assignments are stored in the file:
 
   | 
||
| 
     #		sidmax_assignment_defaults.qdf
 
   | 
||
| 
     #    If this file doesn't exist, see file:
 
   | 
||
| 
     #		assignment_defaults.qdf
 
   | 
||
| 
     #
 
   | 
||
| 
     # 2) Altera recommends that you do not modify this file. This
 
   | 
||
| 
     #    file is updated automatically by the Quartus Prime software
 
   | 
||
| 
     #    and any changes you make may be lost or overwritten.
 
   | 
||
| 
     #
 
   | 
||
| 
     # -------------------------------------------------------------------------- #
 
   | 
||
| 
     | 
||
| 
     | 
||
| 
     set_global_assignment -name FAMILY "MAX 10"
 
   | 
||
| 
     set_global_assignment -name TOP_LEVEL_ENTITY sidmax
 
   | 
||
| 
     set_global_assignment -name ORIGINAL_QUARTUS_VERSION 17.0.0
 
   | 
||
| 
     set_global_assignment -name PROJECT_CREATION_TIME_DATE "19:35:48  JUNE 01, 2018"
 
   | 
||
| 
     set_global_assignment -name LAST_QUARTUS_VERSION "18.0.0 Lite Edition"
 
   | 
||
| 
     set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
 
   | 
||
| 
     set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
 
   | 
||
| 
     set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
 
   | 
||
| 
     set_global_assignment -name DEVICE_FILTER_PACKAGE UFBGA
 
   | 
||
| 
     set_global_assignment -name DEVICE_FILTER_PIN_COUNT 169
 
   | 
||
| 
     set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8
 
   | 
||
| 
     set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 256
 
   | 
||
| 
     | 
||
| 
     set_location_assignment PIN_B1 -to PHI2 #B1,LIN0,P6,PHI
 
   | 
||
| 
     set_location_assignment PIN_A2 -to RST_N #A2,LIN1,P5,RST
 
   | 
||
| 
     set_location_assignment PIN_B2 -to CS_N #B2,LIN2,P8,CS_N
 
   | 
||
| 
     set_location_assignment PIN_A3 -to W_N #A3,LIN3,P7,RW_N
 
   | 
||
| 
     set_location_assignment PIN_B3 -to A[0] #B3,LIN4,P9,A0
 
   | 
||
| 
     set_location_assignment PIN_A4 -to A[1] #A4,LIN5,P10,A1
 
   | 
||
| 
     set_location_assignment PIN_B4 -to A[2] #B4,LIN6,P11,A2
 
   | 
||
| 
     set_location_assignment PIN_A5 -to A[3] #A5,LIN7,P12,A3
 
   | 
||
| 
     set_location_assignment PIN_B5 -to A[4] #B5,LIN8,P13,A4
 
   | 
||
| 
     set_location_assignment PIN_A6 -to D[0] #A6,LIN9,P15,D0
 
   | 
||
| 
     set_location_assignment PIN_B6 -to D[1] #B6,LIN10,P16,D1
 
   | 
||
| 
     set_location_assignment PIN_A7 -to D[2] #A7,LIN11,P17,D2
 
   | 
||
| 
     set_location_assignment PIN_B7 -to D[3] #B7,LIN12,P18,D3
 
   | 
||
| 
     set_location_assignment PIN_A8 -to D[4] #A8,LIN13,P19,D4
 
   | 
||
| 
     set_location_assignment PIN_A9 -to D[7] #A9,LIN14,P22,D7
 
   | 
||
| 
     set_location_assignment PIN_A10 -to D[6] #A10,LIN15,P21,D6
 
   | 
||
| 
     set_location_assignment PIN_B10 -to D[5] #B10,LIN16,P20,D5
 
   | 
||
| 
     set_location_assignment PIN_A11 -to EXT[3] #A11,LIN17,EXT1
 
   | 
||
| 
     set_location_assignment PIN_B11 -to EXT[2] #B11,LIN18,EXT2
 
   | 
||
| 
     set_location_assignment PIN_A12 -to EXT[1] #A12,LIN19,EXT3
 
   | 
||
| 
     set_location_assignment PIN_B12 -to EXT[4] #B12,LIN20,EXT4
 
   | 
||
| 
     | 
||
| 
     set_location_assignment PIN_C9 -to AUDIO_LEFT ###C9,AUD3,AUDIO_LEFT
 
   | 
||
| 
     set_location_assignment PIN_D9 -to AUDIO_RIGHT ###D9,AUD4,AUDIO_RIGHT
 
   | 
||
| 
     set_location_assignment PIN_C10 -to AUDIO_INT ###C10,AUD1,AUDIO_INT
 
   | 
||
| 
     | 
||
| 
     set_location_assignment PIN_L10 -to EXT_IN_p #L10,LIN22,P26,EXT_IN
 
   | 
||
| 
     set_location_assignment PIN_M10 -to EXT_IN_n #ADC_RX #M10,ADC_RX,
 
   | 
||
| 
     set_location_assignment PIN_K8 -to ADC_TX_p #K8,ADC_TX,
 
   | 
||
| 
     set_location_assignment PIN_J8 -to ADC_TX_n #K8,ADC_TX,
 
   | 
||
| 
     | 
||
| 
     set_location_assignment PIN_K7 -to POTY_p #K7,LIN21,P23,POTY
 
   | 
||
| 
     set_location_assignment PIN_J7 -to POTY_n #K7,LIN21,P23,POTY
 
   | 
||
| 
     set_location_assignment PIN_K6 -to POTY_RESET #K6,POTY_RESET,
 
   | 
||
| 
     #set_location_assignment PIN_J6 -to POTY_RESET(n) ###J6,NC3,
 
   | 
||
| 
     set_location_assignment PIN_L11 -to POTX_p #L11,LIN23,P24,POTX
 
   | 
||
| 
     set_location_assignment PIN_M11 -to POTX_n #L11,LIN23,P24,POTX
 
   | 
||
| 
     set_location_assignment PIN_M12 -to POTX_RESET #M12,POTX_RESET,
 
   | 
||
| 
     #set_location_assignment PIN_M13 -to POTX_RESET(n) ###M13,NC2,
 
   | 
||
| 
     | 
||
| 
     set_instance_assignment -name IO_STANDARD LVDS -to ADC_TX_p
 
   | 
||
| 
     #set_instance_assignment -name IO_STANDARD LVDS -to ADC_TX_n
 
   | 
||
| 
     set_instance_assignment -name IO_STANDARD LVDS -to EXT_IN_p
 
   | 
||
| 
     #set_instance_assignment -name IO_STANDARD LVDS -to EXT_IN_n
 
   | 
||
| 
     | 
||
| 
     set_instance_assignment -name IO_STANDARD LVDS -to POTX_p
 
   | 
||
| 
     #set_instance_assignment -name IO_STANDARD LVDS -to POTX_n
 
   | 
||
| 
     set_instance_assignment -name IO_STANDARD "2.5 V" -to POTX_RESET
 
   | 
||
| 
     set_instance_assignment -name IO_STANDARD LVDS -to POTY_p
 
   | 
||
| 
     #set_instance_assignment -name IO_STANDARD LVDS -to POTY_n
 
   | 
||
| 
     set_instance_assignment -name IO_STANDARD "2.5 V" -to POTY_RESET
 
   | 
||
| 
     | 
||
| 
     set_instance_assignment -name IO_STANDARD LVDS -to VDDREDUCED_p
 
   | 
||
| 
     #set_instance_assignment -name IO_STANDARD LVDS -to VDDREDUCED_n
 
   | 
||
| 
     | 
||
| 
     set_location_assignment PIN_M7 -to VDDREDUCED_p #M7,VDDREDUCED,P28
 
   | 
||
| 
     set_location_assignment PIN_N6 -to VDDREDUCED_n #M7,VDDREDUCED,P28
 
   | 
||
| 
     | 
||
| 
     set_location_assignment PIN_G9 -to CLK_SLOW  #CLK2 - G9
 
   | 
||
| 
     set_location_assignment PIN_H8 -to CLK_OUT   #OUT  - H8
 
   | 
||
| 
     #set_location_assignment PIN_H6 -to CLK0      #CLK0 - H6
 
   | 
||
| 
     #set_location_assignment PIN_H4 -to CLK1      #CLK1 - H4
 
   | 
||
| 
     | 
||
| 
     #set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to PADDLE[0]
 
   | 
||
| 
     | 
||
| 
     set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to AUDIO_INT
 
   | 
||
| 
     set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to AUDIO_LEFT
 
   | 
||
| 
     set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to AUDIO_RIGHT
 
   | 
||
| 
     | 
||
| 
     set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
 
   | 
||
| 
     set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
 
   | 
||
| 
     set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
 
   | 
||
| 
     | 
||
| 
     set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW"
 
   | 
||
| 
     set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)"
 
   | 
||
| 
     set_global_assignment -name FLOW_ENABLE_POWER_ANALYZER ON
 
   | 
||
| 
     set_global_assignment -name POWER_DEFAULT_INPUT_IO_TOGGLE_RATE "12.5 %"
 
   | 
||
| 
     | 
||
| 
     set_global_assignment -name ENABLE_OCT_DONE OFF
 
   | 
||
| 
     set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF
 
   | 
||
| 
     set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "PASSIVE SERIAL"
 
   | 
||
| 
     set_global_assignment -name USE_CONFIGURATION_DEVICE ON
 
   | 
||
| 
     set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF
 
   | 
||
| 
     set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL"
 
   | 
||
SIDMAX