1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
|
/* Pcsx - Pc Psx Emulator
* Copyright (C) 1999-2002 Pcsx Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <string.h>
#include "PsxCommon.h"
#ifdef __WIN32__
#pragma warning(disable:4244)
#endif
#define HW_DMA0_MADR (psxHu32(0x1080)) // MDEC in DMA
#define HW_DMA0_BCR (psxHu32(0x1084))
#define HW_DMA0_CHCR (psxHu32(0x1088))
#define HW_DMA1_MADR (psxHu32(0x1090)) // MDEC out DMA
#define HW_DMA1_BCR (psxHu32(0x1094))
#define HW_DMA1_CHCR (psxHu32(0x1098))
#define HW_DMA2_MADR (psxHu32(0x10a0)) // GPU DMA
#define HW_DMA2_BCR (psxHu32(0x10a4))
#define HW_DMA2_CHCR (psxHu32(0x10a8))
#define HW_DMA3_MADR (psxHu32(0x10b0)) // CDROM DMA
#define HW_DMA3_BCR (psxHu32(0x10b4))
#define HW_DMA3_CHCR (psxHu32(0x10b8))
#define HW_DMA4_MADR (psxHu32(0x10c0)) // SPU DMA
#define HW_DMA4_BCR (psxHu32(0x10c4))
#define HW_DMA4_CHCR (psxHu32(0x10c8))
#define HW_DMA6_MADR (psxHu32(0x10e0)) // GPU DMA (OT)
#define HW_DMA6_BCR (psxHu32(0x10e4))
#define HW_DMA6_CHCR (psxHu32(0x10e8))
#define HW_DMA_PCR (psxHu32(0x10f0))
#define HW_DMA_ICR (psxHu32(0x10f4))
void psxHwReset() {
if (Config.Sio) psxHu32(0x1070) |= 0x80;
if (Config.SpuIrq) psxHu32(0x1070) |= 0x200;
memset(psxH, 0, 0x10000);
mdecInit(); //intialize mdec decoder
cdrReset();
psxRcntInit();
}
u8 psxHwRead8(u32 add) {
unsigned char hard;
switch (add) {
case 0x1f801040: hard = sioRead8();break;
// case 0x1f801050: hard = serial_read8(); break;//for use of serial port ignore for now
case 0x1f801800: hard = cdrRead0(); break;
case 0x1f801801: hard = cdrRead1(); break;
case 0x1f801802: hard = cdrRead2(); break;
case 0x1f801803: hard = cdrRead3(); break;
default:
hard = psxHu8(add);
#ifdef PSXHW_LOG
PSXHW_LOG("*Unkwnown 8bit read at address %lx\n", add);
#endif
return hard;
}
#ifdef PSXHW_LOG
PSXHW_LOG("*Known 8bit read at address %lx value %x\n", add, hard);
#endif
return hard;
}
u16 psxHwRead16(u32 add) {
unsigned short hard;
switch (add) {
#ifdef PSXHW_LOG
case 0x1f801070: PSXHW_LOG("IREG 16bit read %x\n", psxHu16(0x1070));
return psxHu16(0x1070);
#endif
#ifdef PSXHW_LOG
case 0x1f801074: PSXHW_LOG("IMASK 16bit read %x\n", psxHu16(0x1074));
return psxHu16(0x1074);
#endif
case 0x1f801040:
hard = sioRead8();
hard|= sioRead8() << 8;
#ifdef PAD_LOG
PAD_LOG("sio read16 %lx; ret = %x\n", add&0xf, hard);
#endif
return hard;
case 0x1f801044:
hard = StatReg;
#ifdef PAD_LOG
PAD_LOG("sio read16 %lx; ret = %x\n", add&0xf, hard);
#endif
return hard;
case 0x1f801048:
hard = ModeReg;
#ifdef PAD_LOG
PAD_LOG("sio read16 %lx; ret = %x\n", add&0xf, hard);
#endif
return hard;
case 0x1f80104a:
hard = CtrlReg;
#ifdef PAD_LOG
PAD_LOG("sio read16 %lx; ret = %x\n", add&0xf, hard);
#endif
return hard;
case 0x1f80104e:
hard = BaudReg;
#ifdef PAD_LOG
PAD_LOG("sio read16 %lx; ret = %x\n", add&0xf, hard);
#endif
return hard;
//Serial port stuff not support now ;P
// case 0x1f801050: hard = serial_read16(); break;
// case 0x1f801054: hard = serial_status_read(); break;
// case 0x1f80105a: hard = serial_control_read(); break;
// case 0x1f80105e: hard = serial_baud_read(); break;
case 0x1f801100:
hard = psxRcntRcount(0);
#ifdef PSXHW_LOG
PSXHW_LOG("T0 count read16: %x\n", hard);
#endif
return hard;
case 0x1f801104:
hard = psxCounters[0].mode;
#ifdef PSXHW_LOG
PSXHW_LOG("T0 mode read16: %x\n", hard);
#endif
return hard;
case 0x1f801108:
hard = psxCounters[0].target;
#ifdef PSXHW_LOG
PSXHW_LOG("T0 target read16: %x\n", hard);
#endif
return hard;
case 0x1f801110:
hard = psxRcntRcount(1);
#ifdef PSXHW_LOG
PSXHW_LOG("T1 count read16: %x\n", hard);
#endif
return hard;
case 0x1f801114:
hard = psxCounters[1].mode;
#ifdef PSXHW_LOG
PSXHW_LOG("T1 mode read16: %x\n", hard);
#endif
return hard;
case 0x1f801118:
hard = psxCounters[1].target;
#ifdef PSXHW_LOG
PSXHW_LOG("T1 target read16: %x\n", hard);
#endif
return hard;
case 0x1f801120:
hard = psxRcntRcount(2);
#ifdef PSXHW_LOG
PSXHW_LOG("T2 count read16: %x\n", hard);
#endif
return hard;
case 0x1f801124:
hard = psxCounters[2].mode;
#ifdef PSXHW_LOG
PSXHW_LOG("T2 mode read16: %x\n", hard);
#endif
return hard;
case 0x1f801128:
hard = psxCounters[2].target;
#ifdef PSXHW_LOG
PSXHW_LOG("T2 target read16: %x\n", hard);
#endif
return hard;
//case 0x1f802030: hard = //int_2000????
//case 0x1f802040: hard =//dip switches...??
default:
if (add>=0x1f801c00 && add<0x1f801e00) {
hard = SPU_readRegister(add);
} else {
hard = psxHu16(add);
#ifdef PSXHW_LOG
PSXHW_LOG("*Unkwnown 16bit read at address %lx\n", add);
#endif
}
return hard;
}
#ifdef PSXHW_LOG
PSXHW_LOG("*Known 16bit read at address %lx value %x\n", add, hard);
#endif
return hard;
}
u32 psxHwRead32(u32 add) {
u32 hard;
switch (add) {
case 0x1f801040:
hard = sioRead8();
hard|= sioRead8() << 8;
hard|= sioRead8() << 16;
hard|= sioRead8() << 24;
#ifdef PAD_LOG
PAD_LOG("sio read32 ;ret = %lx\n", hard);
#endif
return hard;
// case 0x1f801050: hard = serial_read32(); break;//serial port
#ifdef PSXHW_LOG
case 0x1f801060:
PSXHW_LOG("RAM size read %lx\n", psxHu32(0x1060));
return psxHu32(0x1060);
#endif
#ifdef PSXHW_LOG
case 0x1f801070: PSXHW_LOG("IREG 32bit read %x\n", psxHu32(0x1070));
return psxHu32(0x1070);
#endif
#ifdef PSXHW_LOG
case 0x1f801074: PSXHW_LOG("IMASK 32bit read %x\n", psxHu32(0x1074));
return psxHu32(0x1074);
#endif
case 0x1f801810:
hard = GPU_readData();
#ifdef PSXHW_LOG
PSXHW_LOG("GPU DATA 32bit read %lx\n", hard);
#endif
return hard;
case 0x1f801814:
hard = GPU_readStatus();
#ifdef PSXHW_LOG
PSXHW_LOG("GPU STATUS 32bit read %lx\n", hard);
#endif
return hard;
case 0x1f801820: hard = mdecRead0(); break;
case 0x1f801824: hard = mdecRead1(); break;
#ifdef PSXHW_LOG
case 0x1f8010a0:
PSXHW_LOG("DMA2 MADR 32bit read %lx\n", psxHu32(0x10a0));
return HW_DMA2_MADR;
case 0x1f8010a4:
PSXHW_LOG("DMA2 BCR 32bit read %lx\n", psxHu32(0x10a4));
return HW_DMA2_BCR;
case 0x1f8010a8:
PSXHW_LOG("DMA2 CHCR 32bit read %lx\n", psxHu32(0x10a8));
return HW_DMA2_CHCR;
#endif
#ifdef PSXHW_LOG
case 0x1f8010b0:
PSXHW_LOG("DMA3 MADR 32bit read %lx\n", psxHu32(0x10b0));
return HW_DMA3_MADR;
case 0x1f8010b4:
PSXHW_LOG("DMA3 BCR 32bit read %lx\n", psxHu32(0x10b4));
return HW_DMA3_BCR;
case 0x1f8010b8:
PSXHW_LOG("DMA3 CHCR 32bit read %lx\n", psxHu32(0x10b8));
return HW_DMA3_CHCR;
#endif
#ifdef PSXHW_LOG
/* case 0x1f8010f0:
PSXHW_LOG("DMA PCR 32bit read %x\n", psxHu32(0x10f0));
return HW_DMA_PCR; // dma rest channel
case 0x1f8010f4:
PSXHW_LOG("DMA ICR 32bit read %x\n", psxHu32(0x10f4));
return HW_DMA_ICR; // interrupt enabler?*/
#endif
// time for rootcounters :)
case 0x1f801100:
hard = psxRcntRcount(0);
#ifdef PSXHW_LOG
PSXHW_LOG("T0 count read32: %lx\n", hard);
#endif
return hard;
case 0x1f801104:
hard = psxCounters[0].mode;
#ifdef PSXHW_LOG
PSXHW_LOG("T0 mode read32: %lx\n", hard);
#endif
return hard;
case 0x1f801108:
hard = psxCounters[0].target;
#ifdef PSXHW_LOG
PSXHW_LOG("T0 target read32: %lx\n", hard);
#endif
return hard;
case 0x1f801110:
hard = psxRcntRcount(1);
#ifdef PSXHW_LOG
PSXHW_LOG("T1 count read32: %lx\n", hard);
#endif
return hard;
case 0x1f801114:
hard = psxCounters[1].mode;
#ifdef PSXHW_LOG
PSXHW_LOG("T1 mode read32: %lx\n", hard);
#endif
return hard;
case 0x1f801118:
hard = psxCounters[1].target;
#ifdef PSXHW_LOG
PSXHW_LOG("T1 target read32: %lx\n", hard);
#endif
return hard;
case 0x1f801120:
hard = psxRcntRcount(2);
#ifdef PSXHW_LOG
PSXHW_LOG("T2 count read32: %lx\n", hard);
#endif
return hard;
case 0x1f801124:
hard = psxCounters[2].mode;
#ifdef PSXHW_LOG
PSXHW_LOG("T2 mode read32: %lx\n", hard);
#endif
return hard;
case 0x1f801128:
hard = psxCounters[2].target;
#ifdef PSXHW_LOG
PSXHW_LOG("T2 target read32: %lx\n", hard);
#endif
return hard;
default:
hard = psxHu32(add);
#ifdef PSXHW_LOG
PSXHW_LOG("*Unkwnown 32bit read at address %lx\n", add);
#endif
return hard;
}
#ifdef PSXHW_LOG
PSXHW_LOG("*Known 32bit read at address %lx\n", add);
#endif
return hard;
}
void psxHwWrite8(u32 add, u8 value) {
switch (add) {
case 0x1f801040: sioWrite8(value); break;
// case 0x1f801050: serial_write8(value); break;//serial port
case 0x1f801800: cdrWrite0(value); break;
case 0x1f801801: cdrWrite1(value); break;
case 0x1f801802: cdrWrite2(value); break;
case 0x1f801803: cdrWrite3(value); break;
default:
psxHu8(add) = value;
#ifdef PSXHW_LOG
PSXHW_LOG("*Unknown 8bit write at address %lx value %x\n", add, value);
#endif
return;
}
psxHu8(add) = value;
#ifdef PSXHW_LOG
PSXHW_LOG("*Known 8bit write at address %lx value %x\n", add, value);
#endif
}
void psxHwWrite16(u32 add, u16 value) {
switch (add) {
case 0x1f801040:
sioWrite8((unsigned char)value);
sioWrite8((unsigned char)(value>>8));
#ifdef PAD_LOG
PAD_LOG ("sio write16 %lx, %x\n", add&0xf, value);
#endif
return;
case 0x1f801044:
#ifdef PAD_LOG
PAD_LOG ("sio write16 %lx, %x\n", add&0xf, value);
#endif
return;
case 0x1f801048:
ModeReg = value;
#ifdef PAD_LOG
PAD_LOG ("sio write16 %lx, %x\n", add&0xf, value);
#endif
return;
case 0x1f80104a: // control register
sioWriteCtrl16(value);
#ifdef PAD_LOG
PAD_LOG ("sio write16 %lx, %x\n", add&0xf, value);
#endif
return;
case 0x1f80104e: // baudrate register
BaudReg = value;
#ifdef PAD_LOG
PAD_LOG ("sio write16 %lx, %x\n", add&0xf, value);
#endif
return;
//serial port ;P
// case 0x1f801050: serial_write16(value); break;
// case 0x1f80105a: serial_control_write(value);break;
// case 0x1f80105e: serial_baud_write(value); break;
// case 0x1f801054: serial_status_write(value); break;
case 0x1f801070:
#ifdef PSXHW_LOG
PSXHW_LOG("IREG 16bit write %x\n", value);
#endif
if (Config.Sio) psxHu16(0x1070) |= 0x80;
if (Config.SpuIrq) psxHu16(0x1070) |= 0x200;
psxHu16(0x1070) &= (psxHu16(0x1074) & value);
return;
#ifdef PSXHW_LOG
case 0x1f801074: PSXHW_LOG("IMASK 16bit write %x\n", value);
psxHu16(0x1074) = value;
return;
#endif
case 0x1f801100:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 0 COUNT 16bit write %x\n", value);
#endif
psxRcntWcount(0, value); return;
case 0x1f801104:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 0 MODE 16bit write %x\n", value);
#endif
psxRcntWmode(0, value); return;
case 0x1f801108:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 0 TARGET 16bit write %x\n", value);
#endif
psxRcntWtarget(0, value); return;
case 0x1f801110:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 1 COUNT 16bit write %x\n", value);
#endif
psxRcntWcount(1, value); return;
case 0x1f801114:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 1 MODE 16bit write %x\n", value);
#endif
psxRcntWmode(1, value); return;
case 0x1f801118:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 1 TARGET 16bit write %x\n", value);
#endif
psxRcntWtarget(1, value); return;
case 0x1f801120:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 2 COUNT 16bit write %x\n", value);
#endif
psxRcntWcount(2, value); return;
case 0x1f801124:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 2 MODE 16bit write %x\n", value);
#endif
psxRcntWmode(2, value); return;
case 0x1f801128:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 2 TARGET 16bit write %x\n", value);
#endif
psxRcntWtarget(2, value); return;
default:
if (add>=0x1f801c00 && add<0x1f801e00) {
SPU_writeRegister(add, value);
return;
}
psxHu16(add) = value;
#ifdef PSXHW_LOG
PSXHW_LOG("*Unknown 16bit write at address %lx value %x\n", add, value);
#endif
return;
}
psxHu16(add) = value;
#ifdef PSXHW_LOG
PSXHW_LOG("*Known 16bit write at address %lx value %x\n", add, value);
#endif
}
#define DMA_INTERRUPT(n) \
if (HW_DMA_ICR & (1 << (16 + n))) { \
HW_DMA_ICR|= (1 << (24 + n)); \
psxHu32(0x1070) |= 8; \
}
#define DmaExec(n) { \
if (HW_DMA##n##_CHCR & 0x01000000 && HW_DMA_PCR & (8 << (n * 4))) { \
psxDma##n##(HW_DMA##n##_MADR, HW_DMA##n##_BCR, HW_DMA##n##_CHCR); \
HW_DMA##n##_CHCR &= ~0x01000000; \
DMA_INTERRUPT(n); \
} \
}
void psxHwWrite32(u32 add, u32 value) {
switch (add) {
case 0x1f801040:
sioWrite8((unsigned char)value);
sioWrite8((unsigned char)((value&0xff) >> 8));
sioWrite8((unsigned char)((value&0xff) >> 16));
sioWrite8((unsigned char)((value&0xff) >> 24));
#ifdef PAD_LOG
PAD_LOG("sio write32 %lx\n", value);
#endif
return;
// case 0x1f801050: serial_write32(value); break;//serial port
#ifdef PSXHW_LOG
case 0x1f801060:
PSXHW_LOG("RAM size write %lx\n", value);
psxHu32(add) = value;
return; // Ram size
#endif
case 0x1f801070:
#ifdef PSXHW_LOG
PSXHW_LOG("IREG 32bit write %lx\n", value);
#endif
if (Config.Sio) psxHu32(0x1070) |= 0x80;
if (Config.SpuIrq) psxHu32(0x1070) |= 0x200;
psxHu32(0x1070) &= (psxHu32(0x1074) & value);
return;
#ifdef PSXHW_LOG
case 0x1f801074:
PSXHW_LOG("IMASK 32bit write %lx\n", value);
psxHu32(0x1074) = value;
return;
#endif
#ifdef PSXHW_LOG
case 0x1f801080:
PSXHW_LOG("DMA0 MADR 32bit write %lx\n", value);
HW_DMA0_MADR = value; return; // DMA0 madr
case 0x1f801084:
PSXHW_LOG("DMA0 BCR 32bit write %lx\n", value);
HW_DMA0_BCR = value; return; // DMA0 bcr
#endif
case 0x1f801088:
#ifdef PSXHW_LOG
PSXHW_LOG("DMA0 CHCR 32bit write %lx\n", value);
#endif
HW_DMA0_CHCR = value; // DMA0 chcr (MDEC in DMA)
DmaExec(0);
return;
#ifdef PSXHW_LOG
case 0x1f801090:
PSXHW_LOG("DMA1 MADR 32bit write %lx\n", value);
HW_DMA1_MADR = value; return; // DMA1 madr
case 0x1f801094:
PSXHW_LOG("DMA1 BCR 32bit write %lx\n", value);
HW_DMA1_BCR = value; return; // DMA1 bcr
#endif
case 0x1f801098:
#ifdef PSXHW_LOG
PSXHW_LOG("DMA1 CHCR 32bit write %lx\n", value);
#endif
HW_DMA1_CHCR = value; // DMA1 chcr (MDEC out DMA)
DmaExec(1);
return;
#ifdef PSXHW_LOG
case 0x1f8010a0:
PSXHW_LOG("DMA2 MADR 32bit write %lx\n", value);
HW_DMA2_MADR = value; return; // DMA2 madr
case 0x1f8010a4:
PSXHW_LOG("DMA2 BCR 32bit write %lx\n", value);
HW_DMA2_BCR = value; return; // DMA2 bcr
#endif
case 0x1f8010a8:
#ifdef PSXHW_LOG
PSXHW_LOG("DMA2 CHCR 32bit write %lx\n", value);
#endif
HW_DMA2_CHCR = value; // DMA2 chcr (GPU DMA)
DmaExec(2);
return;
#ifdef PSXHW_LOG
case 0x1f8010b0:
PSXHW_LOG("DMA3 MADR 32bit write %lx\n", value);
HW_DMA3_MADR = value; return; // DMA3 madr
case 0x1f8010b4:
PSXHW_LOG("DMA3 BCR 32bit write %lx\n", value);
HW_DMA3_BCR = value; return; // DMA3 bcr
#endif
case 0x1f8010b8:
#ifdef PSXHW_LOG
PSXHW_LOG("DMA3 CHCR 32bit write %lx\n", value);
#endif
HW_DMA3_CHCR = value; // DMA3 chcr (CDROM DMA)
DmaExec(3);
return;
#ifdef PSXHW_LOG
case 0x1f8010c0:
PSXHW_LOG("DMA4 MADR 32bit write %lx\n", value);
HW_DMA4_MADR = value; return; // DMA4 madr
case 0x1f8010c4:
PSXHW_LOG("DMA4 BCR 32bit write %lx\n", value);
HW_DMA4_BCR = value; return; // DMA4 bcr
#endif
case 0x1f8010c8:
#ifdef PSXHW_LOG
PSXHW_LOG("DMA4 CHCR 32bit write %lx\n", value);
#endif
HW_DMA4_CHCR = value; // DMA4 chcr (SPU DMA)
DmaExec(4);
return;
#if 0
case 0x1f8010d0: break; //DMA5write_madr();
case 0x1f8010d4: break; //DMA5write_bcr();
case 0x1f8010d8: break; //DMA5write_chcr(); // Not yet needed??
#endif
#ifdef PSXHW_LOG
case 0x1f8010e0:
PSXHW_LOG("DMA6 MADR 32bit write %lx\n", value);
HW_DMA6_MADR = value; return; // DMA6 bcr
case 0x1f8010e4:
PSXHW_LOG("DMA6 BCR 32bit write %lx\n", value);
HW_DMA6_BCR = value; return; // DMA6 bcr
#endif
case 0x1f8010e8:
#ifdef PSXHW_LOG
PSXHW_LOG("DMA6 CHCR 32bit write %lx\n", value);
#endif
HW_DMA6_CHCR = value; // DMA6 chcr (OT clear)
DmaExec(6);
return;
#ifdef PSXHW_LOG
case 0x1f8010f0:
PSXHW_LOG("DMA PCR 32bit write %lx\n", value);
HW_DMA_PCR = value;
return;
#endif
case 0x1f8010f4:
#ifdef PSXHW_LOG
PSXHW_LOG("DMA ICR 32bit write %lx\n", value);
#endif
{
u32 tmp = (~value) & HW_DMA_ICR;
HW_DMA_ICR = ((tmp ^ value) & 0xffffff) ^ tmp;
return;
}
case 0x1f801810:
#ifdef PSXHW_LOG
PSXHW_LOG("GPU DATA 32bit write %lx\n", value);
#endif
GPU_writeData(value); return;
case 0x1f801814:
#ifdef PSXHW_LOG
PSXHW_LOG("GPU STATUS 32bit write %lx\n", value);
#endif
GPU_writeStatus(value); return;
case 0x1f801820:
mdecWrite0(value); break;
case 0x1f801824:
mdecWrite1(value); break;
case 0x1f801100:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 0 COUNT 32bit write %lx\n", value);
#endif
psxRcntWcount(0, value & 0xffff); return;
case 0x1f801104:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 0 MODE 32bit write %lx\n", value);
#endif
psxRcntWmode(0, value); return;
case 0x1f801108:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 0 TARGET 32bit write %lx\n", value);
#endif
psxRcntWtarget(0, value & 0xffff); return; // HW_DMA_ICR&= (~value)&0xff000000;
case 0x1f801110:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 1 COUNT 32bit write %lx\n", value);
#endif
psxRcntWcount(1, value & 0xffff); return;
case 0x1f801114:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 1 MODE 32bit write %lx\n", value);
#endif
psxRcntWmode(1, value); return;
case 0x1f801118:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 1 TARGET 32bit write %lx\n", value);
#endif
psxRcntWtarget(1, value & 0xffff); return;
case 0x1f801120:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 2 COUNT 32bit write %lx\n", value);
#endif
psxRcntWcount(2, value & 0xffff); return;
case 0x1f801124:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 2 MODE 32bit write %lx\n", value);
#endif
psxRcntWmode(2, value); return;
case 0x1f801128:
#ifdef PSXHW_LOG
PSXHW_LOG("COUNTER 2 TARGET 32bit write %lx\n", value);
#endif
psxRcntWtarget(2, value & 0xffff); return;
default:
psxHu32(add) = value;
#ifdef PSXHW_LOG
PSXHW_LOG("*Unknown 32bit write at address %lx value %lx\n", add, value);
#endif
return;
}
psxHu32(add) = value;
#ifdef PSXHW_LOG
PSXHW_LOG("*Known 32bit write at address %lx value %lx\n", add, value);
#endif
}
int psxHwFreeze(gzFile f, int Mode) {
char Unused[4096];
gzfreezel(Unused);
return 0;
}
|