CCL Home Page
Up Directory CCL common
/* This is a quickly-hacked-together test of some of the stuff in
 * c50lib.c. The idea is to test the things I'm least certain about.
 * At the moment, those are:
 *
 *   Branches, Interrupts, Pipeline Operation, Cycle Timing
 *
 * and also general stuff, i.e. did I get *any* of it right?
 */

#include 
#include 
#include "c50lib.h"

typedef void (*voidfunc) (void);

enum PHASE
  {
    FETCH = 0, DECODE = 1, OPERAND = 2, EXECUTE = 3
  };

typedef struct
  {
    char valid;
    int instruction;
    voidfunc f;
    uint operand_address, spare_arg;
    long int operand, old_accum;
  }
pipeline_layer;

extern pipeline_layer pipeline[4];

/****** First, define off-chip memory. ********/

#define ROMSIZE 0x2000
#define RAMSIZE 0x8000
#define RAMSTART ((unsigned long) 0x8000)
int program_rom[ROMSIZE], data_ram[RAMSIZE];

void
write_program_off_chip (uint address, int data)
{
  printf ("Trying to write program memory at 0x%04X\n", address);
}

int
read_program_off_chip (uint address)
{
  if (address < ROMSIZE)
    return program_rom[address];
  printf ("Trying to read program memory at 0x%04X\n", address);
  return 0;
}

void
write_data_off_chip (uint address, int data)
{
  if (address < RAMSTART)
    printf("Trying to write off-chip data memory at %04X\n", address);
  else if (address < RAMSTART + RAMSIZE)
    data_ram[address] = data;
  else
    printf("Trying to write off-chip data memory at %04X\n", address);
}

int
read_data_off_chip (uint address)
{
  if (address < RAMSTART)
    printf("Trying to read off-chip data memory at %04X\n", address);
  else if (address < RAMSTART + RAMSIZE)
    return data_ram[address];
  else
    printf("Trying to read off-chip data memory at %04X\n", address);
  return 0;
}

void
handle_error (void)
{
  fprintf (stderr, "%s\n", error_string);
  /* exit (1); */
}

void
write_io_port (uint a, int d)
{
}

int
read_io_port (uint a)
{
  return 0;
}

void
step_with_printout (int newline)
{
  uint x = pc;

  advance ();
  printf ("%04X %04X %-6s %-6s %-6s %-6s",
	  x,
	  pipeline[FETCH].instruction,
	  pipeline[FETCH].valid ?
	  disassemble(pipeline[FETCH].instruction) : "---   ",
	  pipeline[DECODE].valid ?
	  disassemble(pipeline[DECODE].instruction) : "---   ",
	  pipeline[OPERAND].valid ?
	  disassemble(pipeline[OPERAND].instruction) : "---   ",
	  pipeline[EXECUTE].valid ?
	  disassemble(pipeline[EXECUTE].instruction) : "---   ");
  if (newline)
    printf("\n");
}
Modified: Sat Mar 30 17:00:00 1996 GMT
Page accessed 5074 times since Sat Apr 17 22:02:49 1999 GMT