/[gxemul]/trunk/src/promemul/yamon.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/src/promemul/yamon.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 22 by dpavlin, Mon Oct 8 16:19:37 2007 UTC revision 28 by dpavlin, Mon Oct 8 16:20:26 2007 UTC
# Line 25  Line 25 
25   *  SUCH DAMAGE.   *  SUCH DAMAGE.
26   *   *
27   *   *
28   *  $Id: yamon.c,v 1.3 2006/02/16 05:57:10 debug Exp $   *  $Id: yamon.c,v 1.5 2006/07/16 13:51:55 debug Exp $
29   *   *
30   *  YAMON emulation.   *  YAMON emulation. (Very basic, only what is needed to get NetBSD booting.)
31   */   */
32    
33  #include <stdio.h>  #include <stdio.h>
# Line 42  Line 42 
42  #include "memory.h"  #include "memory.h"
43  #include "misc.h"  #include "misc.h"
44    
   
45  #ifdef ENABLE_MIPS  #ifdef ENABLE_MIPS
46    
47  /*  #include "yamon.h"
  *  mem_readchar():  
  *    
  *  Reads a byte from emulated RAM, using a MIPS register as a base address.  
  *  (Helper function.)  
  */  
 static unsigned char mem_readchar(struct cpu *cpu, int regbase, int offset)  
 {  
         unsigned char ch;  
         cpu->memory_rw(cpu, cpu->mem, cpu->cd.mips.gpr[regbase] + offset,  
             &ch, sizeof(ch), MEM_READ, CACHE_DATA | NO_EXCEPTIONS);  
         return ch;  
 }  
48    
49    
50  /*  /*
# Line 67  static unsigned char mem_readchar(struct Line 54  static unsigned char mem_readchar(struct
54   */   */
55  int yamon_emul(struct cpu *cpu)  int yamon_emul(struct cpu *cpu)
56  {  {
57          int ofs = cpu->pc & 0xfff;          uint32_t ofs = (cpu->pc & 0xff) + YAMON_FUNCTION_BASE;
58            uint8_t ch;
59          int n;          int n;
60    
61          switch (ofs) {          switch (ofs) {
62          case 0x804:     /*  "print count": string at a1, count at a2  */  
63            case YAMON_PRINT_COUNT_OFS:
64                    /*
65                     *  print count:
66                     *      a1 = string
67                     *      a2 = count
68                     */
69                  n = 0;                  n = 0;
70                  while (n < (int)cpu->cd.mips.gpr[MIPS_GPR_A2]) {                  while (n < (int32_t)cpu->cd.mips.gpr[MIPS_GPR_A2]) {
71                          char ch = mem_readchar(cpu, MIPS_GPR_A1, n);                          cpu->memory_rw(cpu, cpu->mem, (int32_t)cpu->cd.mips.gpr
72                          console_putchar(cpu->machine->main_console_handle,                              [MIPS_GPR_A1] + n, &ch, sizeof(ch), MEM_READ,
73                              ch);                              CACHE_DATA | NO_EXCEPTIONS);
74                            console_putchar(cpu->machine->main_console_handle, ch);
75                          n++;                          n++;
76                  }                  }
77                  break;                  break;
78          case 0x820:     /*  "exit"  */  
79                  debug("[ yamon_emul(): exit ]\n");          case YAMON_EXIT_OFS:
80                    /*
81                     *  exit
82                     */
83                    debug("[ yamon_emul(): exit ]\n");
84                  cpu->running = 0;                  cpu->running = 0;
85                  break;                  break;
86          case 0x854:     /*  "syscon"  */  
87            /*  YAMON_FLUSH_CACHE_OFS: TODO  */
88            /*  YAMON_PRINT_OFS: TODO  */
89            /*  YAMON_REG_CPU_ISR_OFS: TODO  */
90            /*  YAMON_DEREG_CPU_ISR_OFS: TODO  */
91            /*  YAMON_REG_IC_ISR_OFS: TODO  */
92            /*  YAMON_DEREG_IC_ISR_OFS: TODO  */
93            /*  YAMON_REG_ESR_OFS: TODO  */
94            /*  YAMON_DEREG_ESR_OFS: TODO  */
95    
96            case YAMON_GETCHAR_OFS:
97                    n = console_readchar(cpu->machine->main_console_handle);
98                    /*  Note: -1 (if no char was available) becomes 0xff:  */
99                    ch = n;
100                    cpu->memory_rw(cpu, cpu->mem, (int32_t)cpu->cd.mips.gpr[
101                        MIPS_GPR_A1], &ch, sizeof(ch), MEM_WRITE,
102                        CACHE_DATA | NO_EXCEPTIONS);
103                    break;
104    
105            case YAMON_SYSCON_READ_OFS:
106                    /*
107                     *  syscon
108                     */
109                  fatal("[ yamon_emul(): syscon: TODO ]\n");                  fatal("[ yamon_emul(): syscon: TODO ]\n");
110    
111                  /*  TODO. For now, return some kind of "failure":  */                  /*  TODO. For now, return some kind of "failure":  */
112                  cpu->cd.mips.gpr[MIPS_GPR_V0] = 1;                  cpu->cd.mips.gpr[MIPS_GPR_V0] = 1;
113                  break;                  break;
114    
115          default:cpu_register_dump(cpu->machine, cpu, 1, 0);          default:cpu_register_dump(cpu->machine, cpu, 1, 0);
116                  printf("\n");                  printf("\n");
117                  fatal("[ yamon_emul(): unimplemented ofs 0x%x ]\n", ofs);                  fatal("[ yamon_emul(): unimplemented yamon function 0x%"
118                        PRIx32" ]\n", ofs);
119                  cpu->running = 0;                  cpu->running = 0;
120                  cpu->dead = 1;                  cpu->dead = 1;
121          }          }

Legend:
Removed from v.22  
changed lines
  Added in v.28

  ViewVC Help
Powered by ViewVC 1.1.26