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
							 |