| 
														
															@@ -180,6 +180,14 @@ static void refill_dmabuf() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     { 
														 | 
														
														 | 
														
															     { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         dst[(pos++) & DMA_BUF_MASK] = g_scsi_out_byte_to_bop[*src++]; 
														 | 
														
														 | 
														
															         dst[(pos++) & DMA_BUF_MASK] = g_scsi_out_byte_to_bop[*src++]; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    if (end < g_scsi_dma.dma_fillto) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // Partial buffer fill, this will get refilled from interrupt if we 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // get more data. Set next byte to an invalid parity value so that 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // any race conditions will get caught as parity error. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        dst[pos & DMA_BUF_MASK] = g_scsi_out_byte_to_bop[0] ^ SCSI_OUT_DBP; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 // Start DMA transfer 
														 | 
														
														 | 
														
															 // Start DMA transfer 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -319,12 +327,18 @@ extern "C" void SCSI_TIMER_DMACHB_IRQ() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 // Refill the buffer and ensure that the first byte of the new data gets 
														 | 
														
														 | 
														
															                 // Refill the buffer and ensure that the first byte of the new data gets 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 // written to outputs. 
														 | 
														
														 | 
														
															                 // written to outputs. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 __disable_irq(); 
														 | 
														
														 | 
														
															                 __disable_irq(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                uint32_t *first_data = &g_scsi_dma.dma_buf[g_scsi_dma.dma_idx & DMA_BUF_MASK]; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 refill_dmabuf(); 
														 | 
														
														 | 
														
															                 refill_dmabuf(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                GPIO_BOP(SCSI_OUT_PORT) = *first_data; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 __enable_irq(); 
														 | 
														
														 | 
														
															                 __enable_irq(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             } 
														 | 
														
														 | 
														
															             } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            // Verify the first byte of the new data has been written to outputs 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            // It may have been updated after the DMA write occurred. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            __disable_irq(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            uint32_t first_data_idx = g_scsi_dma.dma_idx - (g_scsi_dma.bytes_dma - g_scsi_dma.scheduled_dma); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            uint32_t first_data = g_scsi_dma.dma_buf[first_data_idx & DMA_BUF_MASK]; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            GPIO_BOP(SCSI_OUT_PORT) = first_data; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            __enable_irq(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             // Update the total number of bytes available for DMA 
														 | 
														
														 | 
														
															             // Update the total number of bytes available for DMA 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             uint32_t dma_to_schedule = g_scsi_dma.bytes_app - g_scsi_dma.scheduled_dma; 
														 | 
														
														 | 
														
															             uint32_t dma_to_schedule = g_scsi_dma.bytes_app - g_scsi_dma.scheduled_dma; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             DMA_CHCTL(SCSI_TIMER_DMA, SCSI_TIMER_DMACHB) &= ~DMA_CHXCTL_CHEN; 
														 | 
														
														 | 
														
															             DMA_CHCTL(SCSI_TIMER_DMA, SCSI_TIMER_DMACHB) &= ~DMA_CHXCTL_CHEN; 
														 |