2018-06-24 07:09:41 -07:00
|
|
|
Serial::
|
2013-08-29 16:11:39 -07:00
|
|
|
; The serial interrupt.
|
|
|
|
|
|
|
|
push af
|
|
|
|
push bc
|
|
|
|
push de
|
|
|
|
push hl
|
|
|
|
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hMobileReceive]
|
2013-08-29 16:11:39 -07:00
|
|
|
and a
|
2015-12-15 15:59:49 -08:00
|
|
|
jr nz, .mobile
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2016-05-11 14:16:03 -07:00
|
|
|
ld a, [wPrinterConnectionOpen]
|
2013-08-29 16:11:39 -07:00
|
|
|
bit 0, a
|
2015-12-15 15:59:49 -08:00
|
|
|
jr nz, .printer
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialConnectionStatus]
|
2018-01-19 11:49:43 -08:00
|
|
|
inc a ; is it equal to CONNECTION_NOT_ESTABLISHED?
|
|
|
|
jr z, .establish_connection
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [rSB]
|
|
|
|
ldh [hSerialReceive], a
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialSend]
|
|
|
|
ldh [rSB], a
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialConnectionStatus]
|
2018-01-19 11:49:43 -08:00
|
|
|
cp USING_INTERNAL_CLOCK
|
2015-12-15 15:59:49 -08:00
|
|
|
jr z, .player2
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (0 << rSC_ON) | (0 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (1 << rSC_ON) | (0 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2015-12-15 15:59:49 -08:00
|
|
|
jr .player2
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2015-12-15 15:59:49 -08:00
|
|
|
.mobile
|
|
|
|
call MobileReceive
|
|
|
|
jr .end
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2015-12-15 15:59:49 -08:00
|
|
|
.printer
|
|
|
|
call PrinterReceive
|
|
|
|
jr .end
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2018-01-19 11:49:43 -08:00
|
|
|
.establish_connection
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [rSB]
|
2018-01-19 11:49:43 -08:00
|
|
|
cp USING_EXTERNAL_CLOCK
|
2015-12-15 15:59:49 -08:00
|
|
|
jr z, .player1
|
2018-01-19 11:49:43 -08:00
|
|
|
cp USING_INTERNAL_CLOCK
|
2015-12-15 15:59:49 -08:00
|
|
|
jr nz, .player2
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2015-12-15 15:59:49 -08:00
|
|
|
.player1
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialReceive], a
|
|
|
|
ldh [hSerialConnectionStatus], a
|
2018-01-19 11:49:43 -08:00
|
|
|
cp USING_INTERNAL_CLOCK
|
2015-12-15 15:59:49 -08:00
|
|
|
jr z, ._player2
|
2013-08-29 16:11:39 -07:00
|
|
|
|
|
|
|
xor a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSB], a
|
2020-10-29 11:45:40 -07:00
|
|
|
|
2018-01-19 11:49:43 -08:00
|
|
|
ld a, 3
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rDIV], a
|
2020-10-29 11:45:40 -07:00
|
|
|
.delay_loop
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [rDIV]
|
2013-08-29 16:11:39 -07:00
|
|
|
bit 7, a
|
2020-10-29 11:45:40 -07:00
|
|
|
jr nz, .delay_loop
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (0 << rSC_ON) | (0 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (1 << rSC_ON) | (0 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2015-12-15 15:59:49 -08:00
|
|
|
jr .player2
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2015-12-15 15:59:49 -08:00
|
|
|
._player2
|
2013-08-29 16:11:39 -07:00
|
|
|
xor a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSB], a
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2015-12-15 15:59:49 -08:00
|
|
|
.player2
|
2018-01-19 11:49:43 -08:00
|
|
|
ld a, TRUE
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialReceivedNewData], a
|
2018-01-19 11:49:43 -08:00
|
|
|
ld a, SERIAL_NO_DATA_BYTE
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialSend], a
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2015-12-15 15:59:49 -08:00
|
|
|
.end
|
2013-08-29 16:11:39 -07:00
|
|
|
pop hl
|
|
|
|
pop de
|
|
|
|
pop bc
|
|
|
|
pop af
|
|
|
|
reti
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
Serial_ExchangeBytes::
|
2020-11-02 16:32:14 -08:00
|
|
|
; send bc bytes from hl, receive bc bytes to de
|
2020-10-29 11:45:40 -07:00
|
|
|
ld a, TRUE
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialIgnoringInitialData], a
|
2020-10-29 11:45:40 -07:00
|
|
|
|
2015-12-20 09:54:08 -08:00
|
|
|
.loop
|
2013-08-29 16:11:39 -07:00
|
|
|
ld a, [hl]
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialSend], a
|
2018-01-19 11:49:43 -08:00
|
|
|
call Serial_ExchangeByte
|
2013-08-29 16:11:39 -07:00
|
|
|
push bc
|
|
|
|
ld b, a
|
|
|
|
inc hl
|
2020-10-29 11:45:40 -07:00
|
|
|
|
|
|
|
ld a, 48
|
2015-12-20 09:54:08 -08:00
|
|
|
.wait
|
2013-08-29 16:11:39 -07:00
|
|
|
dec a
|
2015-12-20 09:54:08 -08:00
|
|
|
jr nz, .wait
|
2020-10-29 11:45:40 -07:00
|
|
|
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialIgnoringInitialData]
|
2013-08-29 16:11:39 -07:00
|
|
|
and a
|
|
|
|
ld a, b
|
|
|
|
pop bc
|
2015-12-20 09:54:08 -08:00
|
|
|
jr z, .load
|
2013-08-29 16:11:39 -07:00
|
|
|
dec hl
|
2018-01-19 11:49:43 -08:00
|
|
|
cp SERIAL_PREAMBLE_BYTE
|
2015-12-20 09:54:08 -08:00
|
|
|
jr nz, .loop
|
2013-08-29 16:11:39 -07:00
|
|
|
xor a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialIgnoringInitialData], a
|
2015-12-20 09:54:08 -08:00
|
|
|
jr .loop
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2015-12-20 09:54:08 -08:00
|
|
|
.load
|
2013-08-29 16:11:39 -07:00
|
|
|
ld [de], a
|
|
|
|
inc de
|
|
|
|
dec bc
|
|
|
|
ld a, b
|
|
|
|
or c
|
2015-12-20 09:54:08 -08:00
|
|
|
jr nz, .loop
|
2013-08-29 16:11:39 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
Serial_ExchangeByte::
|
2020-10-29 11:45:40 -07:00
|
|
|
.timeout_loop
|
2013-08-29 16:11:39 -07:00
|
|
|
xor a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialReceivedNewData], a
|
|
|
|
ldh a, [hSerialConnectionStatus]
|
2018-01-19 11:49:43 -08:00
|
|
|
cp USING_INTERNAL_CLOCK
|
2016-05-11 18:19:52 -07:00
|
|
|
jr nz, .not_player_2
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (0 << rSC_ON) | (1 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (1 << rSC_ON) | (1 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2016-05-11 18:19:52 -07:00
|
|
|
.not_player_2
|
2020-10-29 11:45:40 -07:00
|
|
|
.loop
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialReceivedNewData]
|
2013-08-29 16:11:39 -07:00
|
|
|
and a
|
2020-10-29 11:45:40 -07:00
|
|
|
jr nz, .await_new_data
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialConnectionStatus]
|
2018-01-19 11:49:43 -08:00
|
|
|
cp USING_EXTERNAL_CLOCK
|
2020-10-29 11:45:40 -07:00
|
|
|
jr nz, .not_player_1_or_timed_out
|
|
|
|
call CheckLinkTimeoutFramesNonzero
|
|
|
|
jr z, .not_player_1_or_timed_out
|
|
|
|
call .ShortDelay
|
2013-08-29 16:11:39 -07:00
|
|
|
push hl
|
2016-05-15 18:50:31 -07:00
|
|
|
ld hl, wLinkTimeoutFrames + 1
|
2013-08-29 16:11:39 -07:00
|
|
|
inc [hl]
|
2016-05-11 18:19:52 -07:00
|
|
|
jr nz, .no_rollover_up
|
2013-08-29 16:11:39 -07:00
|
|
|
dec hl
|
|
|
|
inc [hl]
|
|
|
|
|
2016-05-11 18:19:52 -07:00
|
|
|
.no_rollover_up
|
2013-08-29 16:11:39 -07:00
|
|
|
pop hl
|
2020-10-29 11:45:40 -07:00
|
|
|
call CheckLinkTimeoutFramesNonzero
|
|
|
|
jr nz, .loop
|
2016-05-11 18:19:52 -07:00
|
|
|
jp SerialDisconnected
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2020-10-29 11:45:40 -07:00
|
|
|
.not_player_1_or_timed_out
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [rIE]
|
2018-01-19 11:49:43 -08:00
|
|
|
and (1 << SERIAL) | (1 << TIMER) | (1 << LCD_STAT) | (1 << VBLANK)
|
|
|
|
cp 1 << SERIAL
|
2020-10-29 11:45:40 -07:00
|
|
|
jr nz, .loop
|
|
|
|
ld a, [wLinkByteTimeout]
|
2013-08-29 16:11:39 -07:00
|
|
|
dec a
|
2020-10-29 11:45:40 -07:00
|
|
|
ld [wLinkByteTimeout], a
|
|
|
|
jr nz, .loop
|
|
|
|
ld a, [wLinkByteTimeout + 1]
|
2013-08-29 16:11:39 -07:00
|
|
|
dec a
|
2020-10-29 11:45:40 -07:00
|
|
|
ld [wLinkByteTimeout + 1], a
|
|
|
|
jr nz, .loop
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialConnectionStatus]
|
2018-01-19 11:49:43 -08:00
|
|
|
cp USING_EXTERNAL_CLOCK
|
2020-10-29 11:45:40 -07:00
|
|
|
jr z, .await_new_data
|
2016-05-15 18:50:31 -07:00
|
|
|
|
2016-05-11 18:19:52 -07:00
|
|
|
ld a, 255
|
2020-10-29 11:45:40 -07:00
|
|
|
.long_delay_loop
|
2013-08-29 16:11:39 -07:00
|
|
|
dec a
|
2020-10-29 11:45:40 -07:00
|
|
|
jr nz, .long_delay_loop
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2020-10-29 11:45:40 -07:00
|
|
|
.await_new_data
|
2013-08-29 16:11:39 -07:00
|
|
|
xor a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialReceivedNewData], a
|
|
|
|
ldh a, [rIE]
|
2018-01-19 11:49:43 -08:00
|
|
|
and (1 << SERIAL) | (1 << TIMER) | (1 << LCD_STAT) | (1 << VBLANK)
|
|
|
|
sub 1 << SERIAL
|
2020-10-29 11:45:40 -07:00
|
|
|
jr nz, .non_serial_interrupts_enabled
|
2016-05-15 18:50:31 -07:00
|
|
|
|
2020-10-29 13:43:28 -07:00
|
|
|
; a == 0
|
|
|
|
assert LOW(SERIAL_LINK_BYTE_TIMEOUT) == 0
|
2020-10-29 11:45:40 -07:00
|
|
|
ld [wLinkByteTimeout], a
|
2020-10-29 13:43:28 -07:00
|
|
|
ld a, HIGH(SERIAL_LINK_BYTE_TIMEOUT)
|
2020-10-29 11:45:40 -07:00
|
|
|
ld [wLinkByteTimeout + 1], a
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2020-10-29 11:45:40 -07:00
|
|
|
.non_serial_interrupts_enabled
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialReceive]
|
2018-01-19 11:49:43 -08:00
|
|
|
cp SERIAL_NO_DATA_BYTE
|
2013-08-29 16:11:39 -07:00
|
|
|
ret nz
|
2020-10-29 11:45:40 -07:00
|
|
|
call CheckLinkTimeoutFramesNonzero
|
|
|
|
jr z, .timed_out
|
2013-08-29 16:11:39 -07:00
|
|
|
push hl
|
2016-05-15 18:50:31 -07:00
|
|
|
ld hl, wLinkTimeoutFrames + 1
|
2013-08-29 16:11:39 -07:00
|
|
|
ld a, [hl]
|
|
|
|
dec a
|
|
|
|
ld [hld], a
|
|
|
|
inc a
|
2016-05-11 18:19:52 -07:00
|
|
|
jr nz, .no_rollover
|
2013-08-29 16:11:39 -07:00
|
|
|
dec [hl]
|
|
|
|
|
2016-05-11 18:19:52 -07:00
|
|
|
.no_rollover
|
2013-08-29 16:11:39 -07:00
|
|
|
pop hl
|
2020-10-29 11:45:40 -07:00
|
|
|
call CheckLinkTimeoutFramesNonzero
|
2016-05-11 18:19:52 -07:00
|
|
|
jr z, SerialDisconnected
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2020-10-29 11:45:40 -07:00
|
|
|
.timed_out
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [rIE]
|
2018-01-19 11:49:43 -08:00
|
|
|
and (1 << SERIAL) | (1 << TIMER) | (1 << LCD_STAT) | (1 << VBLANK)
|
|
|
|
cp 1 << SERIAL
|
|
|
|
ld a, SERIAL_NO_DATA_BYTE
|
2013-08-29 16:11:39 -07:00
|
|
|
ret z
|
|
|
|
ld a, [hl]
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialSend], a
|
2013-08-29 16:11:39 -07:00
|
|
|
call DelayFrame
|
2020-10-29 11:45:40 -07:00
|
|
|
jp .timeout_loop
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2020-10-29 11:45:40 -07:00
|
|
|
.ShortDelay:
|
2016-05-11 18:19:52 -07:00
|
|
|
ld a, 15
|
2020-10-29 11:45:40 -07:00
|
|
|
.short_delay_loop
|
2013-08-29 16:11:39 -07:00
|
|
|
dec a
|
2020-10-29 11:45:40 -07:00
|
|
|
jr nz, .short_delay_loop
|
2013-08-29 16:11:39 -07:00
|
|
|
ret
|
|
|
|
|
2020-10-29 11:45:40 -07:00
|
|
|
CheckLinkTimeoutFramesNonzero::
|
2013-08-29 16:11:39 -07:00
|
|
|
push hl
|
2016-05-15 18:50:31 -07:00
|
|
|
ld hl, wLinkTimeoutFrames
|
2013-08-29 16:11:39 -07:00
|
|
|
ld a, [hli]
|
|
|
|
or [hl]
|
|
|
|
pop hl
|
|
|
|
ret
|
|
|
|
|
2020-10-29 11:45:40 -07:00
|
|
|
; This sets wLinkTimeoutFrames to $ffff, since
|
|
|
|
; a is always 0 when it is called.
|
2018-06-24 07:09:41 -07:00
|
|
|
SerialDisconnected::
|
2020-10-29 11:45:40 -07:00
|
|
|
dec a
|
2016-05-15 18:50:31 -07:00
|
|
|
ld [wLinkTimeoutFrames], a
|
|
|
|
ld [wLinkTimeoutFrames + 1], a
|
2013-08-29 16:11:39 -07:00
|
|
|
ret
|
|
|
|
|
2018-01-19 11:49:43 -08:00
|
|
|
; This is used to exchange the button press and selected menu item on the link menu.
|
|
|
|
; The data is sent thrice and read twice to increase reliability.
|
2018-06-24 07:09:41 -07:00
|
|
|
Serial_ExchangeLinkMenuSelection::
|
2015-11-23 13:04:53 -08:00
|
|
|
ld hl, wPlayerLinkAction
|
|
|
|
ld de, wOtherPlayerLinkMode
|
2018-01-19 11:49:43 -08:00
|
|
|
ld c, 2
|
|
|
|
ld a, TRUE
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialIgnoringInitialData], a
|
2020-10-05 08:24:47 -07:00
|
|
|
.exchange
|
2013-08-29 16:11:39 -07:00
|
|
|
call DelayFrame
|
|
|
|
ld a, [hl]
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialSend], a
|
2018-01-19 11:49:43 -08:00
|
|
|
call Serial_ExchangeByte
|
2013-08-29 16:11:39 -07:00
|
|
|
ld b, a
|
|
|
|
inc hl
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialIgnoringInitialData]
|
2013-08-29 16:11:39 -07:00
|
|
|
and a
|
2018-01-19 11:49:43 -08:00
|
|
|
ld a, FALSE
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialIgnoringInitialData], a
|
2020-10-05 08:24:47 -07:00
|
|
|
jr nz, .exchange
|
2013-08-29 16:11:39 -07:00
|
|
|
ld a, b
|
|
|
|
ld [de], a
|
|
|
|
inc de
|
|
|
|
dec c
|
2020-10-05 08:24:47 -07:00
|
|
|
jr nz, .exchange
|
2013-08-29 16:11:39 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
Serial_PrintWaitingTextAndSyncAndExchangeNybble::
|
2020-02-13 09:30:13 -08:00
|
|
|
call LoadTilemapToTempTilemap
|
2017-12-24 09:47:30 -08:00
|
|
|
callfar PlaceWaitingText
|
2016-05-15 18:50:31 -07:00
|
|
|
call WaitLinkTransfer
|
2020-02-13 09:30:13 -08:00
|
|
|
jp SafeLoadTempTilemapToTilemap
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2020-10-26 12:45:57 -07:00
|
|
|
Serial_SyncAndExchangeNybble:: ; unreferenced
|
2020-02-13 09:30:13 -08:00
|
|
|
call LoadTilemapToTempTilemap
|
2017-12-24 09:47:30 -08:00
|
|
|
callfar PlaceWaitingText
|
2020-10-29 11:45:40 -07:00
|
|
|
jp WaitLinkTransfer ; pointless
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
WaitLinkTransfer::
|
2013-08-29 16:11:39 -07:00
|
|
|
ld a, $ff
|
2015-11-23 13:04:53 -08:00
|
|
|
ld [wOtherPlayerLinkAction], a
|
|
|
|
.loop
|
2015-12-01 18:54:11 -08:00
|
|
|
call LinkTransfer
|
2013-08-29 16:11:39 -07:00
|
|
|
call DelayFrame
|
2020-10-29 11:45:40 -07:00
|
|
|
call CheckLinkTimeoutFramesNonzero
|
2015-11-23 13:04:53 -08:00
|
|
|
jr z, .check
|
2013-08-29 16:11:39 -07:00
|
|
|
push hl
|
2016-05-15 18:50:31 -07:00
|
|
|
ld hl, wLinkTimeoutFrames + 1
|
2013-08-29 16:11:39 -07:00
|
|
|
dec [hl]
|
2015-11-23 13:04:53 -08:00
|
|
|
jr nz, .skip
|
2013-08-29 16:11:39 -07:00
|
|
|
dec hl
|
|
|
|
dec [hl]
|
2015-11-23 13:04:53 -08:00
|
|
|
jr nz, .skip
|
2016-05-11 18:19:52 -07:00
|
|
|
; We might be disconnected
|
2013-08-29 16:11:39 -07:00
|
|
|
pop hl
|
|
|
|
xor a
|
2016-05-11 18:19:52 -07:00
|
|
|
jp SerialDisconnected
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2015-11-23 13:04:53 -08:00
|
|
|
.skip
|
2013-08-29 16:11:39 -07:00
|
|
|
pop hl
|
|
|
|
|
2015-11-23 13:04:53 -08:00
|
|
|
.check
|
|
|
|
ld a, [wOtherPlayerLinkAction]
|
2013-08-29 16:11:39 -07:00
|
|
|
inc a
|
2015-11-23 13:04:53 -08:00
|
|
|
jr z, .loop
|
|
|
|
|
|
|
|
ld b, 10
|
|
|
|
.receive
|
2013-08-29 16:11:39 -07:00
|
|
|
call DelayFrame
|
2015-12-01 18:54:11 -08:00
|
|
|
call LinkTransfer
|
2013-08-29 16:11:39 -07:00
|
|
|
dec b
|
2015-11-23 13:04:53 -08:00
|
|
|
jr nz, .receive
|
|
|
|
|
|
|
|
ld b, 10
|
|
|
|
.acknowledge
|
2013-08-29 16:11:39 -07:00
|
|
|
call DelayFrame
|
2015-12-01 18:54:11 -08:00
|
|
|
call LinkDataReceived
|
2013-08-29 16:11:39 -07:00
|
|
|
dec b
|
2015-11-23 13:04:53 -08:00
|
|
|
jr nz, .acknowledge
|
|
|
|
|
|
|
|
ld a, [wOtherPlayerLinkAction]
|
|
|
|
ld [wOtherPlayerLinkMode], a
|
2013-08-29 16:11:39 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
LinkTransfer::
|
2013-08-29 16:11:39 -07:00
|
|
|
push bc
|
2015-11-23 13:04:53 -08:00
|
|
|
ld b, SERIAL_TIMECAPSULE
|
2015-10-19 07:23:58 -07:00
|
|
|
ld a, [wLinkMode]
|
2015-11-23 13:04:53 -08:00
|
|
|
cp LINK_TIMECAPSULE
|
|
|
|
jr z, .got_high_nybble
|
|
|
|
ld b, SERIAL_TIMECAPSULE
|
|
|
|
jr c, .got_high_nybble
|
|
|
|
cp LINK_TRADECENTER
|
|
|
|
ld b, SERIAL_TRADECENTER
|
|
|
|
jr z, .got_high_nybble
|
|
|
|
ld b, SERIAL_BATTLE
|
|
|
|
|
|
|
|
.got_high_nybble
|
|
|
|
call .Receive
|
|
|
|
ld a, [wPlayerLinkAction]
|
2013-08-29 16:11:39 -07:00
|
|
|
add b
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialSend], a
|
|
|
|
ldh a, [hSerialConnectionStatus]
|
2018-01-19 11:49:43 -08:00
|
|
|
cp USING_INTERNAL_CLOCK
|
2015-11-23 13:04:53 -08:00
|
|
|
jr nz, .player_1
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (0 << rSC_ON) | (1 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (1 << rSC_ON) | (1 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2013-08-29 16:11:39 -07:00
|
|
|
|
2015-11-23 13:04:53 -08:00
|
|
|
.player_1
|
|
|
|
call .Receive
|
2013-08-29 16:11:39 -07:00
|
|
|
pop bc
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.Receive:
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hSerialReceive]
|
2015-11-23 13:04:53 -08:00
|
|
|
ld [wOtherPlayerLinkMode], a
|
2013-08-29 16:11:39 -07:00
|
|
|
and $f0
|
|
|
|
cp b
|
|
|
|
ret nz
|
|
|
|
xor a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialReceive], a
|
2015-11-23 13:04:53 -08:00
|
|
|
ld a, [wOtherPlayerLinkMode]
|
2013-08-29 16:11:39 -07:00
|
|
|
and $f
|
2015-11-23 13:04:53 -08:00
|
|
|
ld [wOtherPlayerLinkAction], a
|
2013-08-29 16:11:39 -07:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
LinkDataReceived::
|
2015-11-23 13:04:53 -08:00
|
|
|
; Let the other system know that the data has been received.
|
2013-08-29 16:11:39 -07:00
|
|
|
xor a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialSend], a
|
|
|
|
ldh a, [hSerialConnectionStatus]
|
2018-01-19 11:49:43 -08:00
|
|
|
cp USING_INTERNAL_CLOCK
|
2013-08-29 16:11:39 -07:00
|
|
|
ret nz
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (0 << rSC_ON) | (1 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (1 << rSC_ON) | (1 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2013-08-29 16:11:39 -07:00
|
|
|
ret
|
|
|
|
|
2020-10-21 21:53:54 -07:00
|
|
|
SetBitsForTimeCapsuleRequestIfNotLinked:: ; unreferenced
|
|
|
|
; Similar to SetBitsForTimeCapsuleRequest (see engine/link/link.asm).
|
2015-10-19 07:23:58 -07:00
|
|
|
ld a, [wLinkMode]
|
2013-08-29 16:11:39 -07:00
|
|
|
and a
|
|
|
|
ret nz
|
2018-01-19 11:49:43 -08:00
|
|
|
ld a, USING_INTERNAL_CLOCK
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSB], a
|
2013-08-29 16:11:39 -07:00
|
|
|
xor a
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [hSerialReceive], a
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (0 << rSC_ON) | (0 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2019-05-05 09:14:46 -07:00
|
|
|
ld a, (1 << rSC_ON) | (0 << rSC_CLOCK)
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh [rSC], a
|
2013-08-29 16:11:39 -07:00
|
|
|
ret
|