1 /* Copyright (C) 1998, Cygnus Solutions
7 #include "sky-device.h"
9 #include "sky-libvpe.h"
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
, (int)addr
, nr_bytes
, (int)dest
, space
, *(int*)&(vu1_state
.regs
.VPE_STAT
));
58 printf(" vu1_state.regs.VPE_STAT = %x\n", *(int*)&(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");
87 printf("%x,%x,%x,%x\n", &vu1_state
.regs
.VF
[0][0], &vu1_state
.regs
.VPE_STAT
,
88 ((char*)&vu1_state
.regs
.VPE_STAT
) - ((char*)&vu1_state
.regs
.VF
[0][0]),
89 ((char*)&vu1_state
.regs
.VPE_STAT
) - ((char*)&vu1_state
.regs
.VF
[0][0]) + VU1_REGISTER_WINDOW_START
92 printf("%x,%x,%x,%x\n", &vu1_state
.regs
.VF
[0][0], &vu1_state
.regs
.VI
[0],
93 ((char*)&vu1_state
.regs
.VI
[0]) - ((char*)&vu1_state
.regs
.VF
[0][0]),
94 ((char*)&vu1_state
.regs
.VI
[0]) - ((char*)&vu1_state
.regs
.VF
[0][0]) + VU1_REGISTER_WINDOW_START
96 printf("%x,%x,%x,%x\n", &vu1_state
.regs
.VF
[0][0], &vu1_state
.regs
.MST
,
97 ((char*)&vu1_state
.regs
.MST
) - ((char*)&vu1_state
.regs
.VF
[0][0]),
98 ((char*)&vu1_state
.regs
.MST
) - ((char*)&vu1_state
.regs
.VF
[0][0]) + VU1_REGISTER_WINDOW_START
104 printf("%s: Write: %x, %d, source: %x, space: %d!\n", me
->name
, (int)addr
, nr_bytes
, (int)source
, space
);
106 if (addr
+ nr_bytes
> VU1_REGISTER_WINDOW_END
) {
107 fprintf(stderr
, "Error: Read past end of vu1 register window!!!\n");
111 dest
= ((char*) (&vu1_state
.regs
)) + (addr
- VU1_REGISTER_WINDOW_START
);
113 memcpy(dest
, source
, nr_bytes
);
121 &vu1_io_read_register_window
,
122 &vu1_io_write_register_window
126 vu1_init(SIM_DESC sd
)
134 VU1_REGISTER_WINDOW_START
,
135 VU1_REGISTER_WINDOW_SIZE
/*nr_bytes*/,
145 VU1_MEM0_WINDOW_START
,
146 VU1_MEM0_SIZE
/*nr_bytes*/,
149 &vu1_umem_buffer
/*buffer*/);
156 VU1_MEM1_WINDOW_START
,
157 VU1_MEM1_SIZE
/*nr_bytes*/,
160 &vu1_mem_buffer
/*buffer*/);
164 vpecallms_init(&vu1_state
);
167 /****************************************************************************/
169 /* Sony Computer Entertainment CONFIDENTIAL */
170 /* (C) 1997 Sony Computer Entertainment Inc. All Rights Reserved */
174 /****************************************************************************/
177 #include <sys/types.h>
179 #include "sky-libvpe.h"
181 char ifilename
[64] = "vu.bin";
182 char ofilename
[64] = "";
183 char pfilename
[64] = "";
185 static void abend2(char *fmt
, char* p
) {
186 fprintf(stderr
, fmt
, p
);
190 void getoption(void);
192 void init_vu1(void) {
193 init_vu(&vu1_state
, &vu1_umem_buffer
[0], &vu1_mem_buffer
[0]);
196 void init_vu(VectorUnitState
*state
, char* umem_buffer
, char* mem_buffer
)
202 /* set up memory buffers */
203 state
->uMEM
= (uMEM_Entry_Type
*) umem_buffer
;
204 state
->MEM
= (MEM_Entry_Type
*) mem_buffer
;
206 /* set up run state */
207 state
->runState
= VU_READY
;
212 /* read instruction file (mandatory) */
214 if((fp
= fopen(ifilename
, "r")) != NULL
) {
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);
223 /* PKE dirven simvpe */
225 /* initpke(pfilename); */
227 /* while (simpke() != -1)
231 /* conventional simvpe */
237 /* write result memory image (optional) */
239 if((fp
= fopen(ofilename
, "w")) == NULL
)
240 abend2("%s: can not open\n", ofilename
);
242 for(i
= 0; i
< 2048; i
++){
243 StoreVUMem(state
, i
, data
, 1);
244 for(j
= 0; j
< 4; j
++)
245 fwrite(&data
[j
], 4, 1, fp
);
252 static void Usage(void)
254 fprintf(stderr
, "Usage: simvpe [options]\n");
255 fprintf(stderr
, "\t\t-i instruction-file\n");
256 fprintf(stderr
, "\t\t-o output-memory-file\n");
257 fprintf(stderr
, "\t\t-t PKE-file (text type)\n");
258 fprintf(stderr
, "\t\t-s start-address [default = 0]\n");
259 fprintf(stderr
, "\t\t-d [interactive mode enable: default desable]\n");
260 fprintf(stderr
, "\t\t-v [statistics mode enable: default desable]\n");
261 fprintf(stderr
, "\t\t-p [debug print mode enable: default desable]\n");
282 if(argv
[count
][0] == '-'){
283 switch(argv
[count
][1]){
285 strcpy(ifilename
, argv
[count
+1]);
289 strcpy(ofilename
, argv
[count
+1]);
293 strcpy(pfilename
, argv
[count
+1]);
297 sscanf(argv
[count
+1], "%d", &startline
);