1 /* Copyright (C) 1998, Cygnus Solutions
12 VectorUnitState vu1_state
;
14 static char vu1_umem_buffer
[VU1_MEM0_SIZE
];
15 static char vu1_mem_buffer
[VU1_MEM1_SIZE
];
18 void init_vu(VectorUnitState
*state
, char* umem_buffer
, char* mem_buffer
);
23 if (vu1_state
.runState
== VU_RUN
)
24 vpecallms_cycle(&vu1_state
);
28 vu1_io_read_register_window(device
*me
,
36 /* Slow and crappy hack ... */
40 char source_buffer
[VU1_REGISTER_WINDOW_SIZE
];
43 memcpy(source_buffer
, &vu1_state
.regs
.VF
[0][0], 0x200); /* copy VF registers */
44 for (i
= 0; i
<16; i
++ ) {
45 *(short*)&source_buffer
[0x200 + i
*16] = vu1_state
.regs
.VI
[i
];
47 *(u_long
*)&source_buffer
[VU1_MST
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MST
;
48 *(u_long
*)&source_buffer
[VU1_MMC
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MMC
;
49 *(u_long
*)&source_buffer
[VU1_MCP
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MCP
;
50 *(u_long
*)&source_buffer
[VU1_MR
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MR
;
51 *(u_long
*)&source_buffer
[VU1_MI
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MI
;
52 *(u_long
*)&source_buffer
[VU1_MQ
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MQ
;
53 *(u_long
*)&source_buffer
[VU1_MP
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MP
;
54 *(u_long
*)&source_buffer
[VU1_MTPC
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.MTPC
;
55 *(VpeStat
*)&source_buffer
[VPE1_STAT
- VU1_REGISTER_WINDOW_START
] = vu1_state
.regs
.VPE_STAT
;
57 printf("%s: Read: %x, %d, dest: %x, space: %d, %x!\n", me
->name
, addr
, nr_bytes
, dest
, space
, vu1_state
.regs
.VPE_STAT
);
58 printf(" vu1_state.regs.VPE_STAT = %x\n", vu1_state
.regs
.VPE_STAT
);
60 if (addr
+ nr_bytes
> VU1_REGISTER_WINDOW_END
) {
61 fprintf(stderr
, "Error: Read past end of vu1 register window!!!\n");
65 src
= &source_buffer
[0] + (addr
- VU1_REGISTER_WINDOW_START
);
66 memcpy(dest
, src
, nr_bytes
);
71 vu1_io_write_register_window(device
*me
,
81 if (addr
== VPE1_STAT
&& nr_bytes
== 4) {
82 /* Magic to switch VU to run state, until other methods are available. */
83 vu1_state
.runState
= VU_RUN
;
84 vu1_state
.regs
.VPE_STAT
.vbs
= 1;
85 printf("Magic start run...\n");
86 printf("%x,%x,%x,%x\n", &vu1_state
.regs
.VF
[0][0], &vu1_state
.regs
.VPE_STAT
,
87 ((char*)&vu1_state
.regs
.VPE_STAT
) - ((char*)&vu1_state
.regs
.VF
[0][0]),
88 ((char*)&vu1_state
.regs
.VPE_STAT
) - ((char*)&vu1_state
.regs
.VF
[0][0]) + VU1_REGISTER_WINDOW_START
91 printf("%x,%x,%x,%x\n", &vu1_state
.regs
.VF
[0][0], &vu1_state
.regs
.VI
[0],
92 ((char*)&vu1_state
.regs
.VI
[0]) - ((char*)&vu1_state
.regs
.VF
[0][0]),
93 ((char*)&vu1_state
.regs
.VI
[0]) - ((char*)&vu1_state
.regs
.VF
[0][0]) + VU1_REGISTER_WINDOW_START
95 printf("%x,%x,%x,%x\n", &vu1_state
.regs
.VF
[0][0], &vu1_state
.regs
.MST
,
96 ((char*)&vu1_state
.regs
.MST
) - ((char*)&vu1_state
.regs
.VF
[0][0]),
97 ((char*)&vu1_state
.regs
.MST
) - ((char*)&vu1_state
.regs
.VF
[0][0]) + VU1_REGISTER_WINDOW_START
102 printf("%s: Write: %x, %d, source: %x, space: %d!\n", me
->name
, addr
, nr_bytes
, source
, space
);
104 if (addr
+ nr_bytes
> VU1_REGISTER_WINDOW_END
) {
105 fprintf(stderr
, "Error: Read past end of vu1 register window!!!\n");
109 dest
= ((char*) (&vu1_state
.regs
)) + (addr
- VU1_REGISTER_WINDOW_START
);
111 memcpy(dest
, source
, nr_bytes
);
119 &vu1_io_read_register_window
,
120 &vu1_io_write_register_window
124 vu1_init(SIM_DESC sd
)
132 VU1_REGISTER_WINDOW_START
,
133 VU1_REGISTER_WINDOW_SIZE
/*nr_bytes*/,
143 VU1_MEM0_WINDOW_START
,
144 VU1_MEM0_SIZE
/*nr_bytes*/,
147 &vu1_umem_buffer
/*buffer*/);
154 VU1_MEM1_WINDOW_START
,
155 VU1_MEM1_SIZE
/*nr_bytes*/,
158 &vu1_mem_buffer
/*buffer*/);
162 vpecallms_init(&vu1_state
);
165 /****************************************************************************/
167 /* Sony Computer Entertainment CONFIDENTIAL */
168 /* (C) 1997 Sony Computer Entertainment Inc. All Rights Reserved */
172 /****************************************************************************/
175 #include <sys/types.h>
179 char ifilename
[64] = "vu.bin";
180 char ofilename
[64] = "";
181 char pfilename
[64] = "";
183 void abend2(char *fmt
, char* p
) {
184 fprintf(stderr
, fmt
, p
);
191 init_vu(&vu1_state
, &vu1_umem_buffer
[0], &vu1_mem_buffer
[0]);
194 void init_vu(VectorUnitState
*state
, char* umem_buffer
, char* mem_buffer
)
200 /* set up memory buffers */
201 state
->uMEM
= (uMEM_Entry_Type
*) umem_buffer
;
202 state
->MEM
= (MEM_Entry_Type
*) mem_buffer
;
204 /* set up run state */
205 state
->runState
= VU_READY
;
210 /* read instruction file (mandatory) */
212 if((fp
= fopen(ifilename
, "r")) == NULL
)
213 abend2("%s: can not open\n", ifilename
);
215 for (i
= 0; fread(&data
[0], 4, 1, fp
) != 0; i
++) {
216 fread(&data
[1], 4, 1, fp
);
217 LoadMMem(state
, i
, data
, 1);
222 /* PKE dirven simvpe */
224 /* initpke(pfilename); */
226 /* while (simpke() != -1)
230 /* conventional simvpe */
236 /* write result memory image (optional) */
238 if((fp
= fopen(ofilename
, "w")) == NULL
)
239 abend2("%s: can not open\n", ofilename
);
241 for(i
= 0; i
< 2048; i
++){
242 StoreVUMem(i
, data
, 1);
243 for(j
= 0; j
< 4; j
++)
244 fwrite(&data
[j
], 4, 1, fp
);
250 static void Usage(void)
252 fprintf(stderr
, "Usage: simvpe [options]\n");
253 fprintf(stderr
, "\t\t-i instruction-file\n");
254 fprintf(stderr
, "\t\t-o output-memory-file\n");
255 fprintf(stderr
, "\t\t-t PKE-file (text type)\n");
256 fprintf(stderr
, "\t\t-s start-address [default = 0]\n");
257 fprintf(stderr
, "\t\t-d [interactive mode enable: default desable]\n");
258 fprintf(stderr
, "\t\t-v [statistics mode enable: default desable]\n");
259 fprintf(stderr
, "\t\t-p [debug print mode enable: default desable]\n");
277 if(argv
[count
][0] == '-'){
278 switch(argv
[count
][1]){
280 strcpy(ifilename
, argv
[count
+1]);
284 strcpy(ofilename
, argv
[count
+1]);
288 strcpy(pfilename
, argv
[count
+1]);
292 sscanf(argv
[count
+1], "%d", &startline
);