@@ -218,24 +218,23 @@ static void GBVideoSoftwareRendererDeinit(struct GBVideoRenderer* renderer) {
218
218
UNUSED (softwareRenderer );
219
219
}
220
220
221
- static void GBVideoSoftwareRendererUpdateWindow (struct GBVideoSoftwareRenderer * renderer , bool before , bool after ) {
222
- if (renderer -> lastY >= GB_VIDEO_VERTICAL_PIXELS || after == before ) {
221
+ static void GBVideoSoftwareRendererUpdateWindow (struct GBVideoSoftwareRenderer * renderer , bool before , bool after , uint8_t oldWy ) {
222
+ if (renderer -> lastY >= GB_VIDEO_VERTICAL_PIXELS || !( after || before ) ) {
223
223
return ;
224
224
}
225
- if (renderer -> lastY >= renderer -> wy ) {
225
+ if (renderer -> lastY >= oldWy ) {
226
226
if (!after ) {
227
227
renderer -> currentWy -= renderer -> lastY ;
228
228
renderer -> hasWindow = true;
229
- } else {
229
+ } else if (! before ) {
230
230
if (!renderer -> hasWindow ) {
231
- if (renderer -> lastY > renderer -> wy ) {
232
- renderer -> currentWy = GB_VIDEO_VERTICAL_PIXELS ;
233
- } else {
234
- renderer -> currentWy = renderer -> lastY - renderer -> wy ;
235
- }
231
+ renderer -> currentWy = renderer -> lastY - renderer -> wy ;
236
232
} else {
237
233
renderer -> currentWy += renderer -> lastY ;
238
234
}
235
+ } else if (renderer -> wy != oldWy ) {
236
+ renderer -> currentWy += oldWy - renderer -> wy ;
237
+ renderer -> hasWindow = true;
239
238
}
240
239
}
241
240
}
@@ -246,10 +245,11 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer*
246
245
GBVideoCacheWriteVideoRegister (renderer -> cache , address , value );
247
246
}
248
247
bool wasWindow = _inWindow (softwareRenderer );
248
+ uint8_t wy = softwareRenderer -> wy ;
249
249
switch (address ) {
250
250
case REG_LCDC :
251
251
softwareRenderer -> lcdc = value ;
252
- GBVideoSoftwareRendererUpdateWindow (softwareRenderer , wasWindow , _inWindow (softwareRenderer ));
252
+ GBVideoSoftwareRendererUpdateWindow (softwareRenderer , wasWindow , _inWindow (softwareRenderer ), wy );
253
253
break ;
254
254
case REG_SCY :
255
255
softwareRenderer -> scy = value ;
@@ -259,11 +259,11 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer*
259
259
break ;
260
260
case REG_WY :
261
261
softwareRenderer -> wy = value ;
262
- GBVideoSoftwareRendererUpdateWindow (softwareRenderer , wasWindow , _inWindow (softwareRenderer ));
262
+ GBVideoSoftwareRendererUpdateWindow (softwareRenderer , wasWindow , _inWindow (softwareRenderer ), wy );
263
263
break ;
264
264
case REG_WX :
265
265
softwareRenderer -> wx = value ;
266
- GBVideoSoftwareRendererUpdateWindow (softwareRenderer , wasWindow , _inWindow (softwareRenderer ));
266
+ GBVideoSoftwareRendererUpdateWindow (softwareRenderer , wasWindow , _inWindow (softwareRenderer ), wy );
267
267
break ;
268
268
case REG_BGP :
269
269
softwareRenderer -> lookup [0 ] = value & 3 ;
@@ -498,9 +498,13 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i
498
498
}
499
499
if (GBRegisterLCDCIsBgEnable (softwareRenderer -> lcdc ) || softwareRenderer -> model >= GB_MODEL_CGB ) {
500
500
int wy = softwareRenderer -> wy + softwareRenderer -> currentWy ;
501
- if (GBRegisterLCDCIsWindow (softwareRenderer -> lcdc ) && wy <= y && endX >= softwareRenderer -> wx - 7 ) {
502
- if (softwareRenderer -> wx - 7 > 0 && !softwareRenderer -> d .disableBG ) {
503
- GBVideoSoftwareRendererDrawBackground (softwareRenderer , maps , startX , softwareRenderer -> wx - 7 , softwareRenderer -> scx - softwareRenderer -> offsetScx , softwareRenderer -> scy + y - softwareRenderer -> offsetScy );
501
+ int wx = softwareRenderer -> wx - 7 ;
502
+ if (GBRegisterLCDCIsWindow (softwareRenderer -> lcdc ) && wy == y && wx <= endX ) {
503
+ softwareRenderer -> hasWindow = true;
504
+ }
505
+ if (GBRegisterLCDCIsWindow (softwareRenderer -> lcdc ) && softwareRenderer -> hasWindow && wx <= endX ) {
506
+ if (wx > 0 && !softwareRenderer -> d .disableBG ) {
507
+ GBVideoSoftwareRendererDrawBackground (softwareRenderer , maps , startX , wx , softwareRenderer -> scx - softwareRenderer -> offsetScx , softwareRenderer -> scy + y - softwareRenderer -> offsetScy );
504
508
}
505
509
506
510
maps = & softwareRenderer -> d .vram [GB_BASE_MAP ];
0 commit comments