Implement vipUntil()
This commit is contained in:
		
							parent
							
								
									eecc55bbd7
								
							
						
					
					
						commit
						7a8cf8952a
					
				|  | @ -121,6 +121,7 @@ struct VB { | ||||||
|             uint32_t fbSrc;   /* Source frame buffer address */ |             uint32_t fbSrc;   /* Source frame buffer address */ | ||||||
|             int32_t  repeat;  /* Current column table repeat value */ |             int32_t  repeat;  /* Current column table repeat value */ | ||||||
|             int      step;    /* Processing phase */ |             int      step;    /* Processing phase */ | ||||||
|  |             uint32_t until;   /* Clocks until interrupt condition */ | ||||||
|         } dp; |         } dp; | ||||||
| 
 | 
 | ||||||
|         /* Pixel processor */ |         /* Pixel processor */ | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								core/vip.c
								
								
								
								
							
							
						
						
									
										15
									
								
								core/vip.c
								
								
								
								
							|  | @ -382,16 +382,18 @@ static int vipOnFrame(VB *sim) { | ||||||
| static int vipEmulateDisplay(VB *sim, uint32_t clocks) { | static int vipEmulateDisplay(VB *sim, uint32_t clocks) { | ||||||
| 
 | 
 | ||||||
|     /* Process all clocks */ |     /* Process all clocks */ | ||||||
|     while (clocks != 0) { |     for (;;) { | ||||||
| 
 | 
 | ||||||
|         /* The next event is after the time remaining */ |         /* The next event is after the time remaining */ | ||||||
|         if (sim->vip.dp.clocks > clocks) { |         if (sim->vip.dp.clocks > clocks) { | ||||||
|             sim->vip.dp.clocks -= clocks; |             sim->vip.dp.clocks -= clocks; | ||||||
|  |             sim->vip.dp.until  -= clocks; | ||||||
|             return 0; |             return 0; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /* Advance forward the component's number of clocks */ |         /* Advance forward the component's number of clocks */ | ||||||
|         clocks            -= sim->vip.dp.clocks; |         clocks            -= sim->vip.dp.clocks; | ||||||
|  |         sim->vip.dp.until -= sim->vip.dp.clocks; | ||||||
|         sim->vip.dp.clocks = 0; |         sim->vip.dp.clocks = 0; | ||||||
| 
 | 
 | ||||||
|         /* Processing by operation phase */ |         /* Processing by operation phase */ | ||||||
|  | @ -401,6 +403,7 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) { | ||||||
|                 sim->vip.dp.clocks = vipClocksMs(3); |                 sim->vip.dp.clocks = vipClocksMs(3); | ||||||
|                 sim->vip.dp.fclk   = 1; |                 sim->vip.dp.fclk   = 1; | ||||||
|                 sim->vip.dp.step   = 1; |                 sim->vip.dp.step   = 1; | ||||||
|  |                 sim->vip.dp.until  = vipClocksMs(8); | ||||||
|                 vipThrow(sim, 0x0010); /* FRAMESTART */ |                 vipThrow(sim, 0x0010); /* FRAMESTART */ | ||||||
|                 /* TODO: Initiate drawing, throw GAMESTART */ |                 /* TODO: Initiate drawing, throw GAMESTART */ | ||||||
|                 /* ELSE: Set OVERTIME, throw TIMEERR */ |                 /* ELSE: Set OVERTIME, throw TIMEERR */ | ||||||
|  | @ -437,6 +440,7 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) { | ||||||
|                 else sim->vip.dp.l1bsy = 0; |                 else sim->vip.dp.l1bsy = 0; | ||||||
|                 sim->vip.dp.clocks = vipClocksMs(2); |                 sim->vip.dp.clocks = vipClocksMs(2); | ||||||
|                 sim->vip.dp.step   = 4; |                 sim->vip.dp.step   = 4; | ||||||
|  |                 sim->vip.dp.until  = vipClocksMs(10); | ||||||
|                 vipThrow(sim, 0x0002); /* LFBEND */ |                 vipThrow(sim, 0x0002); /* LFBEND */ | ||||||
|                 break; |                 break; | ||||||
| 
 | 
 | ||||||
|  | @ -460,10 +464,14 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) { | ||||||
| 
 | 
 | ||||||
|                 /* Fallthrough */ |                 /* Fallthrough */ | ||||||
|             case 6: /* 13ms-18ms - Display right frame buffer */ |             case 6: /* 13ms-18ms - Display right frame buffer */ | ||||||
|  |                 if ((sim->vip.dp.column & 3) == 0) | ||||||
|  |                     vipComputeBrightness(sim); | ||||||
|                 vipTransferColumn(sim, 1); |                 vipTransferColumn(sim, 1); | ||||||
|                 sim->vip.dp.clocks = |                 sim->vip.dp.clocks = | ||||||
|                     260 + (0xA94 >> sim->vip.dp.column % 12 & 1); |                     260 + (0xA94 >> sim->vip.dp.column % 12 & 1); | ||||||
|                 sim->vip.dp.column++; |                 sim->vip.dp.column++; | ||||||
|  |                 if ((sim->vip.dp.column & 3) == 0) | ||||||
|  |                     sim->vip.dp.cta -= 2; | ||||||
|                 if (sim->vip.dp.column == 384) |                 if (sim->vip.dp.column == 384) | ||||||
|                     sim->vip.dp.step = 7; |                     sim->vip.dp.step = 7; | ||||||
|                 break; |                 break; | ||||||
|  | @ -474,6 +482,7 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) { | ||||||
|                 else sim->vip.dp.r1bsy = 0; |                 else sim->vip.dp.r1bsy = 0; | ||||||
|                 sim->vip.dp.clocks = vipClocksMs(2); |                 sim->vip.dp.clocks = vipClocksMs(2); | ||||||
|                 sim->vip.dp.step   = 0; |                 sim->vip.dp.step   = 0; | ||||||
|  |                 sim->vip.dp.until  = vipClocksMs(2); | ||||||
|                 vipThrow(sim, 0x0004); /* RFBEND */ |                 vipThrow(sim, 0x0004); /* RFBEND */ | ||||||
|                 if (vipOnFrame(sim)) |                 if (vipOnFrame(sim)) | ||||||
|                     return 1; |                     return 1; | ||||||
|  | @ -587,8 +596,8 @@ static void vipReset(VB *sim) { | ||||||
| 
 | 
 | ||||||
| /* Determine how many clocks are guaranteed to process */ | /* Determine how many clocks are guaranteed to process */ | ||||||
| static uint32_t vipUntil(VB *sim, uint32_t clocks) { | static uint32_t vipUntil(VB *sim, uint32_t clocks) { | ||||||
|     (void) sim; |     if (clocks > sim->vip.dp.until) | ||||||
|     /* Don't allow clocks to exceed interrupt conditions, even if disabled */ |         clocks = sim->vip.dp.until; | ||||||
|     return clocks; |     return clocks; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue