90 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
|   | ; Handle the serial link cable | ||
|  | #IF HARDWARE_LINK | ||
|  | ; FF> = Idle | ||
|  | ; D6> = Read:  D0><[L] D1><[H] [HL]> | ||
|  | ; D9> = Write: D8><[L] D9><[H] DA><[^DATA] DB><[DATA] | ||
|  | ; DD> = OrW:   D8><[L] D9><[H] DA><[^DATA] DB><[DATA] (used to set flags without requiring a slow read,modify,write race condition) | ||
|  | 
 | ||
|  | handleSerialLink: | ||
|  |     ; Check if we got a byte from hardware | ||
|  |     ldh  a, [$01] | ||
|  | 
 | ||
|  |     cp   $D6 | ||
|  |     jr   z, serialReadMem | ||
|  |     cp   $D9 | ||
|  |     jr   z, serialWriteMem | ||
|  |     cp   $DD | ||
|  |     jr   z, serialOrMem | ||
|  | 
 | ||
|  | finishSerialLink: | ||
|  |     ; Do a new idle transfer. | ||
|  |     ld   a, $E4 | ||
|  |     ldh  [$01], a | ||
|  |     ld   a, $81 | ||
|  |     ldh  [$02], a | ||
|  |     ret | ||
|  | 
 | ||
|  | serialReadMem: | ||
|  |     ld   a, $D0 | ||
|  |     call serialTransfer | ||
|  |     ld   h, a | ||
|  |     ld   a, $D1 | ||
|  |     call serialTransfer | ||
|  |     ld   l, a | ||
|  |     ld   a, [hl] | ||
|  |     call serialTransfer | ||
|  |     jr   finishSerialLink | ||
|  | 
 | ||
|  | serialWriteMem: | ||
|  |     ld   a, $D8 | ||
|  |     call serialTransfer | ||
|  |     ld   h, a | ||
|  |     ld   a, $D9 | ||
|  |     call serialTransfer | ||
|  |     ld   l, a | ||
|  |     ld   a, $DA | ||
|  |     call serialTransfer | ||
|  |     cpl | ||
|  |     ld   c, a | ||
|  |     ld   a, $DB | ||
|  |     call serialTransfer | ||
|  |     cp   c | ||
|  |     jr   nz, finishSerialLink | ||
|  |     ld   [hl], a | ||
|  |     jr   finishSerialLink | ||
|  | 
 | ||
|  | serialOrMem: | ||
|  |     ld   a, $D8 | ||
|  |     call serialTransfer | ||
|  |     ld   h, a | ||
|  |     ld   a, $D9 | ||
|  |     call serialTransfer | ||
|  |     ld   l, a | ||
|  |     ld   a, $DA | ||
|  |     call serialTransfer | ||
|  |     cpl | ||
|  |     ld   c, a | ||
|  |     ld   a, $DB | ||
|  |     call serialTransfer | ||
|  |     cp   c | ||
|  |     jr   nz, finishSerialLink | ||
|  |     ld   c, a | ||
|  |     ld   a, [hl] | ||
|  |     or   c | ||
|  |     ld   [hl], a | ||
|  |     jr   finishSerialLink | ||
|  | 
 | ||
|  | ; Transfer A to the serial link and wait for it to be done and return the result in A | ||
|  | serialTransfer: | ||
|  |     ldh  [$01], a | ||
|  |     ld   a, $81 | ||
|  |     ldh  [$02], a | ||
|  | .loop: | ||
|  |     ldh  a, [$02] | ||
|  |     and  $80 | ||
|  |     jr   nz, .loop | ||
|  |     ldh  a, [$01] | ||
|  |     ret | ||
|  | 
 | ||
|  | #ENDIF |