Up until now the 65C02 was only supplied with NOP operation. Including the reset and interrupt vectors making the CPU start execution at EAEA₁₆ while the first address of the ROM is 8000₁₆ which would also be the correct place to start the program.
So I updated the Ada program which generates the ROM image with so that the reset and interrupt vectors are all filled with 8000₁₆. Do read the comments for more informations on this over engendered code.
with Ada.Sequential_IO; with Ada.IO_Exceptions; with Ada.Command_Line; with Ada.Text_IO; with Interfaces; procedure Create_Reset is type Byte is new Interfaces.Unsigned_8; type Address is new Interfaces.Unsigned_16; -- One of the cool feature of Ada is it's ability to set the lower and -- upper bound of an array to any value you want. So we can set use the -- actual ROM addresses as array index an save ourself the work and -- remove one potential error source. -- type ROM_Type is array (Address range 16#8000# .. 16#FFFF#) of Byte; package ROM_IO is new Ada.Sequential_IO (ROM_Type); ROM_Output : ROM_IO.File_Type; -- 65C02 related constants as named in the original -- WDC design document -- NOP : constant Byte := 16#EA#; NMIB : constant Address := 16#FFFA#; RESB : constant Address := 16#FFFC#; BRK_IRQB : constant Address := 16#FFFE#; -- Another interesting feature Ada arrays is specifying the index of -- elements when initialising the array. As well specifying an value -- for all not explicitly initialised values. Makes setting up the -- ROM array super easy. -- ROM : constant ROM_Type := (NMIB + 0 => 16#00#, NMIB + 1 => 16#80#, RESB + 0 => 16#00#, RESB + 1 => 16#80#, BRK_IRQB + 0 => 16#00#, BRK_IRQB + 1 => 16#80#, others => NOP); begin if Ada.Command_Line.Argument_Count < 1 then Ada.Text_IO.Put_Line ("Syntax: Create_Reset <output file>"); else declare File_Name : constant String := Ada.Command_Line.Argument (1); begin ROM_IO.Create (ROM_Output, ROM_IO.Out_File, File_Name); exception when Ada.IO_Exceptions.Name_Error => Ada.Text_IO.Put_Line ("File “" & File_Name & "” couldn't be created."); Ada.Text_IO.Put_Line ("See stack trace below for more details."); raise; end; -- Just like Python Ada can write the whole array in one go. -- ROM_IO.Write (ROM_Output, ROM); ROM_IO.Close (ROM_Output); end if; end Create_Reset;
Write the ROM image
Test using the Arduino