@@ -394,11 +394,12 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) {
394
394
if ((address & (SIZE_VRAM | 0x00014000)) == SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { \
395
395
mLOG(GBA_MEM, GAME_ERROR, "Bad VRAM Load32: 0x%08X", address); \
396
396
value = 0; \
397
- break; \
397
+ } else { \
398
+ LOAD_32(value, address & 0x00017FFC, gba->video.vram); \
398
399
} \
399
- address &= 0x00017FFC; \
400
+ } else { \
401
+ LOAD_32(value, address & 0x0001FFFC, gba->video.vram); \
400
402
} \
401
- LOAD_32(value, address & 0x0001FFFC, gba->video.vram); \
402
403
wait += waitstatesRegion[REGION_VRAM];
403
404
404
405
#define LOAD_OAM LOAD_32(value, address & (SIZE_OAM - 4), gba->video.oam.raw);
@@ -530,9 +531,10 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) {
530
531
value = 0 ;
531
532
break ;
532
533
}
533
- address &= 0x00017FFE ;
534
+ LOAD_16 (value , address & 0x00017FFE , gba -> video .vram );
535
+ } else {
536
+ LOAD_16 (value , address & 0x0001FFFE , gba -> video .vram );
534
537
}
535
- LOAD_16 (value , address & 0x0001FFFE , gba -> video .vram );
536
538
break ;
537
539
case REGION_OAM :
538
540
LOAD_16 (value , address & (SIZE_OAM - 2 ), gba -> video .oam .raw );
@@ -645,9 +647,10 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) {
645
647
value = 0 ;
646
648
break ;
647
649
}
648
- address &= 0x00017FFF ;
650
+ value = ((uint8_t * ) gba -> video .vram )[address & 0x00017FFF ];
651
+ } else {
652
+ value = ((uint8_t * ) gba -> video .vram )[address & 0x0001FFFF ];
649
653
}
650
- value = ((uint8_t * ) gba -> video .vram )[address & 0x0001FFFF ];
651
654
break ;
652
655
case REGION_OAM :
653
656
value = ((uint8_t * ) gba -> video .oam .raw )[address & (SIZE_OAM - 1 )];
@@ -732,15 +735,21 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) {
732
735
if ((address & 0x0001FFFF) >= SIZE_VRAM) { \
733
736
if ((address & (SIZE_VRAM | 0x00014000)) == SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { \
734
737
mLOG(GBA_MEM, GAME_ERROR, "Bad VRAM Store32: 0x%08X", address); \
735
- break; \
738
+ } else { \
739
+ LOAD_32(oldValue, address & 0x00017FFC, gba->video.vram); \
740
+ if (oldValue != value) { \
741
+ STORE_32(value, address & 0x00017FFC, gba->video.vram); \
742
+ gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x00017FFC) + 2); \
743
+ gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x00017FFC)); \
744
+ } \
745
+ } \
746
+ } else { \
747
+ LOAD_32(oldValue, address & 0x0001FFFC, gba->video.vram); \
748
+ if (oldValue != value) { \
749
+ STORE_32(value, address & 0x0001FFFC, gba->video.vram); \
750
+ gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x0001FFFC) + 2); \
751
+ gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x0001FFFC)); \
736
752
} \
737
- address &= 0x00017FFC; \
738
- } \
739
- LOAD_32(oldValue, address & 0x0001FFFC, gba->video.vram); \
740
- if (oldValue != value) { \
741
- STORE_32(value, address & 0x0001FFFC, gba->video.vram); \
742
- gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x0001FFFC) + 2); \
743
- gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x0001FFFC)); \
744
753
} \
745
754
wait += waitstatesRegion[REGION_VRAM];
746
755
@@ -855,12 +864,17 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle
855
864
mLOG (GBA_MEM , GAME_ERROR , "Bad VRAM Store16: 0x%08X" , address );
856
865
break ;
857
866
}
858
- address &= 0x00017FFE ;
859
- }
860
- LOAD_16 (oldValue , address & 0x0001FFFE , gba -> video .vram );
861
- if (value != oldValue ) {
862
- STORE_16 (value , address & 0x0001FFFE , gba -> video .vram );
863
- gba -> video .renderer -> writeVRAM (gba -> video .renderer , address & 0x0001FFFE );
867
+ LOAD_16 (oldValue , address & 0x00017FFE , gba -> video .vram );
868
+ if (value != oldValue ) {
869
+ STORE_16 (value , address & 0x00017FFE , gba -> video .vram );
870
+ gba -> video .renderer -> writeVRAM (gba -> video .renderer , address & 0x00017FFE );
871
+ }
872
+ } else {
873
+ LOAD_16 (oldValue , address & 0x0001FFFE , gba -> video .vram );
874
+ if (value != oldValue ) {
875
+ STORE_16 (value , address & 0x0001FFFE , gba -> video .vram );
876
+ gba -> video .renderer -> writeVRAM (gba -> video .renderer , address & 0x0001FFFE );
877
+ }
864
878
}
865
879
break ;
866
880
case REGION_OAM :
0 commit comments