OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [rel-0-3-0-rc1/] [or1ksim/] [cpu/] [or1k/] [sprs.c] - Diff between revs 644 and 728

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 644 Rev 728
Line 26... Line 26...
#include "sprs.h"
#include "sprs.h"
#include "abstract.h"
#include "abstract.h"
#include "sim-config.h"
#include "sim-config.h"
 
 
extern int cont_run;   /* defined in toplevel.c */
extern int cont_run;   /* defined in toplevel.c */
extern int tt_stopped; /* defined in tick.c */
 
extern int flag;
extern int flag;
 
 
sprword sprs[MAX_SPRS];
sprword sprs[MAX_SPRS];
 
 
int audio_cnt = 0;
int audio_cnt = 0;
Line 38... Line 37...
static FILE *fo = 0;
static FILE *fo = 0;
/* Set a specific SPR with a value. */
/* Set a specific SPR with a value. */
inline void
inline void
mtspr(const int regno, const sprword value)
mtspr(const int regno, const sprword value)
{
{
  int ofs = regno % MAX_SPRS_PER_GRP;
  regno %= MAX_SPRS;
  extern unsigned long pc_phy;
  sprs[regno] = value;
  extern unsigned long reg[32];
 
 
 
  /* MM: Register hooks.  */
  /* MM: Register hooks.  */
  switch (regno) {
  switch (regno) {
  case 0xFFFD:
 
    fo = fopen ("audiosim.pcm", "wb+");
 
    if (!fo) printf("Cannot open audiosim.pcm\n");
 
    printf("Audio opened.\n");
 
    return;
 
  case 0xFFFE:
 
    if (!fo) printf("audiosim.pcm not opened\n");
 
    fputc (value & 0xFF, fo);
 
    if ((audio_cnt % 1024) == 0)
 
      printf("%i\n", audio_cnt);
 
    audio_cnt++;
 
    return;
 
  case 0xFFFF:
 
    fclose(fo);
 
    printf("Audio closed.\n");
 
    cont_run = 0;
 
    return;
 
  case SPR_TTCR:
  case SPR_TTCR:
    tt_stopped = 0;
    spr_write_ttcr (value);
 
    break;
 
  case SPR_TTMR:
 
    spr_write_ttmr (value);
    break;
    break;
  case SPR_SR:
  case SPR_SR:
    if(value & SPR_SR_F)
    /* Set internal flag also */
      flag = 1;
    if(value & SPR_SR_F) flag = 1;
    else
    else flag = 0;
      flag = 0;
 
    break;
    break;
  case SPR_NPC:
  case SPR_NPC:
    {
    {
      extern unsigned long pc;
      extern unsigned long pc;
      extern unsigned long pcnext;
      extern unsigned long pcnext;
Line 92... Line 75...
      /* Clear any pending delay slot jumps also */
      /* Clear any pending delay slot jumps also */
      delay_insn = 0;
      delay_insn = 0;
      pcnext = value + 4;
      pcnext = value + 4;
    }
    }
    break;
    break;
 
  case 0xFFFD:
 
    fo = fopen ("audiosim.pcm", "wb+");
 
    if (!fo) printf("Cannot open audiosim.pcm\n");
 
    printf("Audio opened.\n");
 
    break;
 
  case 0xFFFE:
 
    if (!fo) printf("audiosim.pcm not opened\n");
 
    fputc (value & 0xFF, fo);
 
    if ((audio_cnt % 1024) == 0)
 
      printf("%i\n", audio_cnt);
 
    audio_cnt++;
 
    break;
 
  case 0xFFFF:
 
    fclose(fo);
 
    printf("Audio closed.\n");
 
    cont_run = 0;
 
    break;
  default:
  default:
    /* Links to GPRS */
    /* Links to GPRS */
    if(regno >= 0x0400 && regno < 0x0420)
    if(regno >= 0x0400 && regno < 0x0420) {
 
      extern unsigned long reg[32];
      reg[regno - 0x0400] = value;
      reg[regno - 0x0400] = value;
    break;
 
  }
  }
 
    break;
  if (regno < MAX_SPRS)
 
    sprs[regno] = value;
 
  else if (config.sim.verbose)
 
    printf("WARNING: write out of SPR range %08X\n", regno);
 
}
 
 
 
#if 0
 
/* Get a specific SPR. */
 
inline sprword
 
mfspr_(const int regno)
 
{
 
  extern unsigned long reg[32];
 
  extern unsigned long pc;
 
  extern unsigned long pcprev;
 
 
 
  switch (regno) {
 
  case SPR_SR:
 
    /* Exceptions are always enabled */
 
    return sprs[regno] | SPR_SR_EXR;
 
  case SPR_NPC:
 
    return pc;
 
  case SPR_PPC:
 
    return pcprev;
 
  default:
 
    /* Links to GPRS */
 
    if(regno >= 0x0400 && regno < 0x0420)
 
      return reg[regno - 0x0400];
 
    else if (regno < MAX_SPRS)
 
      return sprs[regno];
 
  }
  }
  if (config.sim.verbose)
 
    printf ("WARNING: read out of SPR range %08X\n", regno);
 
  return 0;
 
}
}
#endif
 
 
 
/* Show status of important SPRs. */
/* Show status of important SPRs. */
void sprs_status()
void sprs_status()
{
{
  printf("VR   : 0x%.8x  UPR  : 0x%.8x\n", mfspr(SPR_VR), mfspr(SPR_UPR));
  printf("VR   : 0x%.8x  UPR  : 0x%.8x\n", mfspr(SPR_VR), mfspr(SPR_UPR));

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.