1 /* Copyright (C) 1998, Cygnus Solutions
6 #include "sim-endian.h"
8 #include "sky-device.h"
10 #include "sky-libvpe.h"
16 VectorUnitState vu1_state
;
18 #define sim_warning printf
20 static char* vu1_umem_buffer
= 0;
21 static char* vu1_mem_buffer
= 0;
24 void init_vu(VectorUnitState
*state
, char* umem_buffer
, char* mem_buffer
);
26 static void dump_mem() {
28 typedef int T
[2048][4];
29 T
*mem
= (T
*)&vu1_mem_buffer
;
31 for (i
= 0; i
< 200; i
++) {
32 printf("%d: %x %x %x %x\n", i
, (*mem
)[i
][0], (*mem
)[i
][1], (*mem
)[i
][2], (*mem
)[i
][3]);
39 if (vu1_state
.runState
== VU_RUN
)
40 vpecallms_cycle(&vu1_state
);
44 vu1_io_read_register_window(device
*me
,
52 /* Slow and crappy hack ... */
57 char source_buffer
[VU1_REGISTER_WINDOW_SIZE
];
60 assert(nr_bytes
== 1 || nr_bytes
== 2 || nr_bytes
== 4 || nr_bytes
== 8 || nr_bytes
== 16);
62 memcpy(source_buffer
, &vu1_state
.regs
.VF
[0][0], 0x200); /* copy VF registers */
63 for (i
= 0; i
<16; i
++ ) {
64 *(short*)&source_buffer
[0x200 + i
*16] = vu1_state
.regs
.VI
[i
];
66 *(u_long
*)&source_buffer
[VU1_MST
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MST
;
67 *(u_long
*)&source_buffer
[VU1_MMC
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MMC
;
68 *(u_long
*)&source_buffer
[VU1_MCP
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MCP
;
69 *(u_long
*)&source_buffer
[VU1_MR
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MR
;
70 *(u_long
*)&source_buffer
[VU1_MI
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MI
;
71 *(u_long
*)&source_buffer
[VU1_MQ
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MQ
;
72 *(u_long
*)&source_buffer
[VU1_MP
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MP
;
73 *(u_long
*)&source_buffer
[VU1_MTPC
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MTPC
;
78 if (vu1_state
.runState
== VU_RUN
|| vu1_state
.runState
== VU_BREAK
)
79 SET_BIT(stat
, VPU_STAT_VBS1_BIT
);
81 *(u_long
*)&source_buffer
[VPE1_STAT
- VU1_REGISTER_WINDOW_START
] = H2T_4(stat
);
84 *(u_long
*)&source_buffer
[VU1_CIA
- VU1_REGISTER_WINDOW_START
] = H2T_4(vu1_state
.junk
._vpepc
);
85 /* XXX: other H2T_N's needed around here. */
88 printf("%s: Read: %x, %d, dest: %x, space: %d, %x!\n", me
->name
, (int)addr
, nr_bytes
, (int)dest
, space
, *(int*)&(vu1_state
.regs
.VPE_STAT
));
89 printf(" vu1_state.regs.VPE_STAT = %x\n", *(int*)&(vu1_state
.regs
.VPE_STAT
));
92 if (addr
+ nr_bytes
> VU1_REGISTER_WINDOW_END
) {
93 fprintf(stderr
, "Error: Read past end of vu1 register window!!!\n");
97 src
= &source_buffer
[0] + (addr
- VU1_REGISTER_WINDOW_START
);
98 memcpy(dest
, src
, nr_bytes
);
103 vu1_io_write_register_window(device
*me
,
113 assert(nr_bytes
== 4);
115 if (addr
== VPE1_STAT
) {
116 /* Do nothing, read only register. */
117 sim_warning("vu1: Write to read/only register at address %lx.\n", (u_long
)addr
);
119 } else if (addr
== VU1_MST
) {
120 /* Magic switch to set _TOP register */
121 vu1_state
.junk
._TOP
= T2H_4(*(int*)source
);
123 } else if (addr
== VU1_CIA
) {
124 vu1_state
.junk
.pc
= vu1_state
.junk
._vpepc
= T2H_4(*(int*)source
);
125 vu1_state
.runState
= VU_RUN
;
126 vu1_state
.junk
.eflag
= 0;
127 vu1_state
.junk
.peflag
= 0;
131 /* Everything else does nothing... */
132 sim_warning("vu1: Write to unimplemented control register at address %lx.\n", (u_long
)addr
);
135 /*printf("%s: Write: %x, %d, source: %x, space: %d!\n", me->name, (int)addr, nr_bytes, (int)source, space);*/
137 if (addr
+ nr_bytes
> VU1_REGISTER_WINDOW_END
) {
138 fprintf(stderr
, "Error: Read past end of vu1 register window!!!\n");
142 dest
= ((char*) (&vu1_state
.regs
)) + (addr
- VU1_REGISTER_WINDOW_START
);
144 memcpy(dest
, source
, nr_bytes
);
152 &vu1_io_read_register_window
,
153 &vu1_io_write_register_window
157 vu1_init(SIM_DESC sd
)
165 VU1_REGISTER_WINDOW_START
,
166 VU1_REGISTER_WINDOW_SIZE
/*nr_bytes*/,
171 vu1_umem_buffer
= zalloc(VU1_MEM0_SIZE
);
177 VU1_MEM0_WINDOW_START
,
178 VU1_MEM0_SIZE
/*nr_bytes*/,
181 vu1_umem_buffer
/*buffer*/);
183 vu1_mem_buffer
= zalloc(VU1_MEM1_SIZE
);
189 VU1_MEM1_WINDOW_START
,
190 VU1_MEM1_SIZE
/*nr_bytes*/,
193 vu1_mem_buffer
/*buffer*/);
197 vpecallms_init(&vu1_state
);
200 /****************************************************************************/
202 /* Sony Computer Entertainment CONFIDENTIAL */
203 /* (C) 1997 Sony Computer Entertainment Inc. All Rights Reserved */
207 /****************************************************************************/
210 #include <sys/types.h>
212 #include "sky-libvpe.h"
214 char ifilename
[64] = "vu.bin";
215 char ofilename
[64] = "";
216 char pfilename
[64] = "";
218 static void abend2(char *fmt
, char* p
) {
219 fprintf(stderr
, fmt
, p
);
223 void getoption(VectorUnitState
* state
);
225 void init_vu1(void) {
226 init_vu(&vu1_state
, &vu1_umem_buffer
[0], &vu1_mem_buffer
[0]);
229 void init_vu(VectorUnitState
*state
, char* umem_buffer
, char* mem_buffer
)
235 /* set up memory buffers */
236 state
->uMEM
= (uMEM_Entry_Type
*) umem_buffer
;
237 state
->MEM
= (MEM_Entry_Type
*) mem_buffer
;
239 /* set up run state */
240 state
->runState
= VU_READY
;
245 /* read instruction file (mandatory) */
247 if((fp
= fopen(ifilename
, "r")) != NULL
) {
248 for (i
= 0; fread(&data
[0], 4, 1, fp
) != 0; i
++) {
249 fread(&data
[1], 4, 1, fp
);
250 LoadMMem(state
, i
, data
, 1);
256 /* PKE dirven simvpe */
258 /* initpke(pfilename); */
260 /* while (simpke() != -1)
264 /* conventional simvpe */
270 /* write result memory image (optional) */
272 if((fp
= fopen(ofilename
, "w")) == NULL
)
273 abend2("%s: can not open\n", ofilename
);
275 for(i
= 0; i
< 2048; i
++){
276 StoreVUMem(state
, i
, data
, 1);
277 for(j
= 0; j
< 4; j
++)
278 fwrite(&data
[j
], 4, 1, fp
);
285 static void Usage(void)
287 fprintf(stderr
, "Usage: simvpe [options]\n");
288 fprintf(stderr
, "\t\t-i instruction-file\n");
289 fprintf(stderr
, "\t\t-o output-memory-file\n");
290 fprintf(stderr
, "\t\t-t PKE-file (text type)\n");
291 fprintf(stderr
, "\t\t-s start-address [default = 0]\n");
292 fprintf(stderr
, "\t\t-d [interactive mode enable: default desable]\n");
293 fprintf(stderr
, "\t\t-v [statistics mode enable: default desable]\n");
294 fprintf(stderr
, "\t\t-p [debug print mode enable: default desable]\n");
298 void getoption(VectorUnitState
* state
)
305 state
->junk
._is_dbg
= 1;
306 state
->junk
._vpepc
= 0;
307 state
->junk
._is_verb
= 0;
308 state
->junk
._is_dump
= 0;
309 state
->junk
._pgpuif
= 4; /* MEMGPUIF */
310 state
->junk
._ITOP
= 20;
311 state
->junk
._TOP
= 10;
315 if(argv
[count
][0] == '-'){
316 switch(argv
[count
][1]){
318 strcpy(ifilename
, argv
[count
+1]);
322 strcpy(ofilename
, argv
[count
+1]);
326 strcpy(pfilename
, argv
[count
+1]);
330 sscanf(argv
[count
+1], "%d", &startline
);
331 state
->junk
._vpepc
= startline
;
335 state
->junk
._is_dbg
= 1;
339 state
->junk
._is_verb
= 1;
343 state
->junk
._is_dump
= 1;