summaryrefslogtreecommitdiff
path: root/home
diff options
context:
space:
mode:
Diffstat (limited to 'home')
-rw-r--r--home/init.asm10
-rw-r--r--home/overworld.asm12
-rw-r--r--home/serial.asm617
-rw-r--r--home/text.asm8
4 files changed, 328 insertions, 319 deletions
diff --git a/home/init.asm b/home/init.asm
index e4c24001..cc89ad34 100644
--- a/home/init.asm
+++ b/home/init.asm
@@ -26,7 +26,7 @@ rLCDC_DEFAULT EQU %11100011
ld [$ff43], a
ld [$ff42], a
ld [rSB], a
- ld [$ff02], a
+ ld [rSC], a
ld [$ff4b], a
ld [$ff4a], a
ld [$ff06], a
@@ -67,8 +67,8 @@ rLCDC_DEFAULT EQU %11100011
xor a
ld [hTilesetType], a
ld [$ff41], a
- ld [$ffae], a
- ld [$ffaf], a
+ ld [hSCX], a
+ ld [hSCY], a
ld [$ff0f], a
ld a, 1 << VBLANK + 1 << TIMER + 1 << SERIAL
ld [rIE], a
@@ -79,8 +79,8 @@ rLCDC_DEFAULT EQU %11100011
ld a, 7
ld [rWX], a
- ld a, $ff
- ld [$ffaa], a
+ ld a, CONNECTION_NOT_ESTABLISHED
+ ld [hSerialConnectionStatus], a
ld h, vBGMap0 / $100
call ClearBgMap
diff --git a/home/overworld.asm b/home/overworld.asm
index 50791184..c5c180c7 100644
--- a/home/overworld.asm
+++ b/home/overworld.asm
@@ -1609,12 +1609,12 @@ AdvancePlayerSprite:: ; 0d27 (0:0d27)
ld c,a
sla b
sla c
- ld a,[$ffaf]
+ ld a,[hSCY]
add b
- ld [$ffaf],a ; update background scroll Y
- ld a,[$ffae]
+ ld [hSCY],a ; update background scroll Y
+ ld a,[hSCX]
add c
- ld [$ffae],a ; update background scroll X
+ ld [hSCX],a ; update background scroll X
; shift all the sprites in the direction opposite of the player's motion
; so that the player appears to move relative to them
ld hl,wSpriteStateData1 + $14
@@ -2310,8 +2310,8 @@ LoadMapData:: ; 1241 (0:1241)
ld [wMapViewVRAMPointer + 1],a
xor a
ld [wMapViewVRAMPointer],a
- ld [$ffaf],a
- ld [$ffae],a
+ ld [hSCY],a
+ ld [hSCX],a
ld [wWalkCounter],a
ld [wd119],a
ld [wWalkBikeSurfStateCopy],a
diff --git a/home/serial.asm b/home/serial.asm
index 02eb3534..fa3d4c8a 100644
--- a/home/serial.asm
+++ b/home/serial.asm
@@ -1,304 +1,313 @@
-Serial:: ; 2125 (0:2125)
- push af
- push bc
- push de
- push hl
- ld a, [$ffaa]
- inc a
- jr z, .asm_2142
- ld a, [$ff01]
- ld [$ffad], a
- ld a, [$ffac]
- ld [$ff01], a
- ld a, [$ffaa]
- cp $2
- jr z, .asm_2162
- ld a, $80
- ld [$ff02], a
- jr .asm_2162
-.asm_2142
- ld a, [$ff01]
- ld [$ffad], a
- ld [$ffaa], a
- cp $2
- jr z, .asm_215f
- xor a
- ld [$ff01], a
- ld a, $3
- ld [rDIV], a ; $ff04
-.asm_2153
- ld a, [rDIV] ; $ff04
- bit 7, a
- jr nz, .asm_2153
- ld a, $80
- ld [$ff02], a
- jr .asm_2162
-.asm_215f
- xor a
- ld [$ff01], a
-.asm_2162
- ld a, $1
- ld [$ffa9], a
- ld a, $fe
- ld [$ffac], a
- pop hl
- pop de
- pop bc
- pop af
- reti
-
-Func_216f:: ; 216f (0:216f)
- ld a, $1
- ld [$ffab], a
-.asm_2173
- ld a, [hl]
- ld [$ffac], a
- call Func_219a
- push bc
- ld b, a
- inc hl
- ld a, $30
-.asm_217e
- dec a
- jr nz, .asm_217e
- ld a, [$ffab]
- and a
- ld a, b
- pop bc
- jr z, .asm_2192
- dec hl
- cp $fd
- jr nz, .asm_2173
- xor a
- ld [$ffab], a
- jr .asm_2173
-.asm_2192
- ld [de], a
- inc de
- dec bc
- ld a, b
- or c
- jr nz, .asm_2173
- ret
-
-Func_219a:: ; 219a (0:219a)
- xor a
- ld [$ffa9], a
- ld a, [$ffaa]
- cp $2
- jr nz, .asm_21a7
- ld a, $81
- ld [$ff02], a
-.asm_21a7
- ld a, [$ffa9]
- and a
- jr nz, .asm_21f1
- ld a, [$ffaa]
- cp $1
- jr nz, .asm_21cc
- call Func_2237
- jr z, .asm_21cc
- call Func_2231
- push hl
- ld hl, wcc48
- inc [hl]
- jr nz, .asm_21c3
- dec hl
- inc [hl]
-.asm_21c3
- pop hl
- call Func_2237
- jr nz, .asm_21a7
- jp Func_223f
-.asm_21cc
- ld a, [rIE] ; $ffff
- and $f
- cp $8
- jr nz, .asm_21a7
- ld a, [W_NUMHITS] ; wd074
- dec a
- ld [W_NUMHITS], a ; wd074
- jr nz, .asm_21a7
- ld a, [wd075]
- dec a
- ld [wd075], a
- jr nz, .asm_21a7
- ld a, [$ffaa]
- cp $1
- jr z, .asm_21f1
- ld a, $ff
-.asm_21ee
- dec a
- jr nz, .asm_21ee
-.asm_21f1
- xor a
- ld [$ffa9], a
- ld a, [rIE] ; $ffff
- and $f
- sub $8
- jr nz, .asm_2204
- ld [W_NUMHITS], a ; wd074
- ld a, $50
- ld [wd075], a
-.asm_2204
- ld a, [$ffad]
- cp $fe
- ret nz
- call Func_2237
- jr z, .asm_221f
- push hl
- ld hl, wcc48
- ld a, [hl]
- dec a
- ld [hld], a
- inc a
- jr nz, .asm_2219
- dec [hl]
-.asm_2219
- pop hl
- call Func_2237
- jr z, Func_223f
-.asm_221f
- ld a, [rIE] ; $ffff
- and $f
- cp $8
- ld a, $fe
- ret z
- ld a, [hl]
- ld [$ffac], a
- call DelayFrame
- jp Func_219a
-
-Func_2231:: ; 2231 (0:2231)
- ld a, $f
-.asm_2233
- dec a
- jr nz, .asm_2233
- ret
-
-Func_2237:: ; 2237 (0:2237)
- push hl
- ld hl, wcc47
- ld a, [hli]
- or [hl]
- pop hl
- ret
-
-Func_223f:: ; 223f (0:223f)
- dec a
- ld [wcc47], a
- ld [wcc48], a
- ret
-
-Func_2247:: ; 2247 (0:2247)
- ld hl, wcc42
- ld de, wcc3d
- ld c, $2
- ld a, $1
- ld [$ffab], a
-.asm_2253
- call DelayFrame
- ld a, [hl]
- ld [$ffac], a
- call Func_219a
- ld b, a
- inc hl
- ld a, [$ffab]
- and a
- ld a, $0
- ld [$ffab], a
- jr nz, .asm_2253
- ld a, b
- ld [de], a
- inc de
- dec c
- jr nz, .asm_2253
- ret
-
-Func_226e:: ; 226e (0:226e)
- call SaveScreenTilesToBuffer1
- callab PrintWaitingText
- call Func_227f
- jp LoadScreenTilesFromBuffer1
-
-Func_227f:: ; 227f (0:227f)
- ld a, $ff
- ld [wcc3e], a
-.asm_2284
- call Func_22c3
- call DelayFrame
- call Func_2237
- jr z, .asm_22a0
- push hl
- ld hl, wcc48
- dec [hl]
- jr nz, .asm_229f
- dec hl
- dec [hl]
- jr nz, .asm_229f
- pop hl
- xor a
- jp Func_223f
-.asm_229f
- pop hl
-.asm_22a0
- ld a, [wcc3e]
- inc a
- jr z, .asm_2284
- ld b, $a
-.asm_22a8
- call DelayFrame
- call Func_22c3
- dec b
- jr nz, .asm_22a8
- ld b, $a
-.asm_22b3
- call DelayFrame
- call Func_22ed
- dec b
- jr nz, .asm_22b3
- ld a, [wcc3e]
- ld [wcc3d], a
- ret
-
-Func_22c3:: ; 22c3 (0:22c3)
- call asm_22d7
- ld a, [wcc42]
- add $60
- ld [$ffac], a
- ld a, [$ffaa]
- cp $2
- jr nz, asm_22d7
- ld a, $81
- ld [$ff02], a
-asm_22d7:: ; 22d7 (0:22d7)
- ld a, [$ffad]
- ld [wcc3d], a
- and $f0
- cp $60
- ret nz
- xor a
- ld [$ffad], a
- ld a, [wcc3d]
- and $f
- ld [wcc3e], a
- ret
-
-Func_22ed:: ; 22ed (0:22ed)
- xor a
- ld [$ffac], a
- ld a, [$ffaa]
- cp $2
- ret nz
- ld a, $81
- ld [$ff02], a
- ret
-
-Func_22fa:: ; 22fa (0:22fa)
- ld a, $2
- ld [$ff01], a
- xor a
- ld [$ffad], a
- ld a, $80
- ld [$ff02], a
- ret
+Serial:: ; 2125 (0:2125)
+ push af
+ push bc
+ push de
+ push hl
+ ld a, [hSerialConnectionStatus]
+ inc a
+ jr z, .connectionNotYetEstablished
+ ld a, [rSB]
+ ld [hSerialReceiveData], a
+ ld a, [hSerialSendData]
+ ld [rSB], a
+ ld a, [hSerialConnectionStatus]
+ cp USING_INTERNAL_CLOCK
+ jr z, .done
+; using external clock
+ ld a, START_TRANSFER_EXTERNAL_CLOCK
+ ld [rSC], a
+ jr .done
+.connectionNotYetEstablished
+ ld a, [rSB]
+ ld [hSerialReceiveData], a
+ ld [hSerialConnectionStatus], a
+ cp USING_INTERNAL_CLOCK
+ jr z, .usingInternalClock
+; using external clock
+ xor a
+ ld [rSB], a
+ ld a, $3
+ ld [rDIV], a
+.waitLoop
+ ld a, [rDIV]
+ bit 7, a
+ jr nz, .waitLoop
+ ld a, START_TRANSFER_EXTERNAL_CLOCK
+ ld [rSC], a
+ jr .done
+.usingInternalClock
+ xor a
+ ld [rSB], a
+.done
+ ld a, $1
+ ld [hSerialReceivedNewData], a
+ ld a, SERIAL_NO_DATA_BYTE
+ ld [hSerialSendData], a
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+
+; hl = send data
+; de = receive data
+; bc = length of data
+Serial_ExchangeBytes:: ; 216f (0:216f)
+ ld a, 1
+ ld [hSerialIgnoringInitialData], a
+.loop
+ ld a, [hl]
+ ld [hSerialSendData], a
+ call Serial_ExchangeByte
+ push bc
+ ld b, a
+ inc hl
+ ld a, 48
+.waitLoop
+ dec a
+ jr nz, .waitLoop
+ ld a, [hSerialIgnoringInitialData]
+ and a
+ ld a, b
+ pop bc
+ jr z, .storeReceivedByte
+ dec hl
+ cp SERIAL_PREAMBLE_BYTE
+ jr nz, .loop
+ xor a
+ ld [hSerialIgnoringInitialData], a
+ jr .loop
+.storeReceivedByte
+ ld [de], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .loop
+ ret
+
+Serial_ExchangeByte:: ; 219a (0:219a)
+ xor a
+ ld [hSerialReceivedNewData], a
+ ld a, [hSerialConnectionStatus]
+ cp USING_INTERNAL_CLOCK
+ jr nz, .asm_21a7
+ ld a, START_TRANSFER_INTERNAL_CLOCK
+ ld [rSC], a
+.asm_21a7
+ ld a, [hSerialReceivedNewData]
+ and a
+ jr nz, .asm_21f1
+ ld a, [hSerialConnectionStatus]
+ cp USING_EXTERNAL_CLOCK
+ jr nz, .asm_21cc
+ call IsUnknownCounterZero
+ jr z, .asm_21cc
+ call WaitLoop_15Iterations
+ push hl
+ ld hl, wUnknownSerialCounter + 1
+ inc [hl]
+ jr nz, .asm_21c3
+ dec hl
+ inc [hl]
+.asm_21c3
+ pop hl
+ call IsUnknownCounterZero
+ jr nz, .asm_21a7
+ jp SetUnknownCounterToFFFF
+.asm_21cc
+ ld a, [rIE]
+ and (1 << SERIAL) | (1 << TIMER) | (1 << LCD_STAT) | (1 << VBLANK)
+ cp (1 << SERIAL)
+ jr nz, .asm_21a7
+ ld a, [wUnknownSerialCounter2]
+ dec a
+ ld [wUnknownSerialCounter2], a
+ jr nz, .asm_21a7
+ ld a, [wUnknownSerialCounter2 + 1]
+ dec a
+ ld [wUnknownSerialCounter2 + 1], a
+ jr nz, .asm_21a7
+ ld a, [hSerialConnectionStatus]
+ cp USING_EXTERNAL_CLOCK
+ jr z, .asm_21f1
+ ld a, 255
+.waitLoop
+ dec a
+ jr nz, .waitLoop
+.asm_21f1
+ xor a
+ ld [hSerialReceivedNewData], a
+ ld a, [rIE]
+ and (1 << SERIAL) | (1 << TIMER) | (1 << LCD_STAT) | (1 << VBLANK)
+ sub (1 << SERIAL)
+ jr nz, .asm_2204
+ ld [wUnknownSerialCounter2], a
+ ld a, $50
+ ld [wUnknownSerialCounter2 + 1], a
+.asm_2204
+ ld a, [hSerialReceiveData]
+ cp SERIAL_NO_DATA_BYTE
+ ret nz
+ call IsUnknownCounterZero
+ jr z, .asm_221f
+ push hl
+ ld hl, wUnknownSerialCounter + 1
+ ld a, [hl]
+ dec a
+ ld [hld], a
+ inc a
+ jr nz, .asm_2219
+ dec [hl]
+.asm_2219
+ pop hl
+ call IsUnknownCounterZero
+ jr z, SetUnknownCounterToFFFF
+.asm_221f
+ ld a, [rIE]
+ and (1 << SERIAL) | (1 << TIMER) | (1 << LCD_STAT) | (1 << VBLANK)
+ cp (1 << SERIAL)
+ ld a, SERIAL_NO_DATA_BYTE
+ ret z
+ ld a, [hl]
+ ld [hSerialSendData], a
+ call DelayFrame
+ jp Serial_ExchangeByte
+
+WaitLoop_15Iterations:: ; 2231 (0:2231)
+ ld a, 15
+.waitLoop
+ dec a
+ jr nz, .waitLoop
+ ret
+
+IsUnknownCounterZero:: ; 2237 (0:2237)
+ push hl
+ ld hl, wUnknownSerialCounter
+ ld a, [hli]
+ or [hl]
+ pop hl
+ ret
+
+; a is always 0 when this is called
+SetUnknownCounterToFFFF:: ; 223f (0:223f)
+ dec a
+ ld [wUnknownSerialCounter], a
+ ld [wUnknownSerialCounter + 1], a
+ ret
+
+; 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.
+Serial_ExchangeLinkMenuSelection:: ; 2247 (0:2247)
+ ld hl, wLinkMenuSelectionSendBuffer
+ ld de, wLinkMenuSelectionReceiveBuffer
+ ld c, 2 ; number of bytes to save
+ ld a, 1
+ ld [hSerialIgnoringInitialData], a
+.loop
+ call DelayFrame
+ ld a, [hl]
+ ld [hSerialSendData], a
+ call Serial_ExchangeByte
+ ld b, a
+ inc hl
+ ld a, [hSerialIgnoringInitialData]
+ and a
+ ld a, 0
+ ld [hSerialIgnoringInitialData], a
+ jr nz, .loop
+ ld a, b
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .loop
+ ret
+
+Serial_PrintWaitingTextAndSyncAndExchangeByte:: ; 226e (0:226e)
+ call SaveScreenTilesToBuffer1
+ callab PrintWaitingText
+ call Serial_SyncAndExchangeNybble
+ jp LoadScreenTilesFromBuffer1
+
+Serial_SyncAndExchangeNybble:: ; 227f (0:227f)
+ ld a, $ff
+ ld [wSerialExchangeNybbleReceiveData], a
+.loop1
+ call Serial_ExchangeNybble
+ call DelayFrame
+ call IsUnknownCounterZero
+ jr z, .next1
+ push hl
+ ld hl, wUnknownSerialCounter + 1
+ dec [hl]
+ jr nz, .next2
+ dec hl
+ dec [hl]
+ jr nz, .next2
+ pop hl
+ xor a
+ jp SetUnknownCounterToFFFF
+.next2
+ pop hl
+.next1
+ ld a, [wSerialExchangeNybbleReceiveData]
+ inc a
+ jr z, .loop1
+ ld b, 10
+.loop2
+ call DelayFrame
+ call Serial_ExchangeNybble
+ dec b
+ jr nz, .loop2
+ ld b, 10
+.loop3
+ call DelayFrame
+ call Serial_SendZeroByte
+ dec b
+ jr nz, .loop3
+ ld a, [wSerialExchangeNybbleReceiveData]
+ ld [wSerialSyncAndExchangeNybbleReceiveData], a
+ ret
+
+; exchange one byte with value of $f or less
+Serial_ExchangeNybble:: ; 22c3 (0:22c3)
+ call .doExchange
+ ld a, [wSerialExchangeNybbleSendData]
+ add $60
+ ld [hSerialSendData], a
+ ld a, [hSerialConnectionStatus]
+ cp USING_INTERNAL_CLOCK
+ jr nz, .doExchange
+ ld a, START_TRANSFER_INTERNAL_CLOCK
+ ld [rSC], a
+.doExchange
+ ld a, [hSerialReceiveData]
+ ld [wSerialExchangeNybbleTempReceiveData], a
+ and $f0
+ cp $60
+ ret nz
+ xor a
+ ld [hSerialReceiveData], a
+ ld a, [wSerialExchangeNybbleTempReceiveData]
+ and $f
+ ld [wSerialExchangeNybbleReceiveData], a
+ ret
+
+Serial_SendZeroByte:: ; 22ed (0:22ed)
+ xor a
+ ld [hSerialSendData], a
+ ld a, [hSerialConnectionStatus]
+ cp USING_INTERNAL_CLOCK
+ ret nz
+ ld a, START_TRANSFER_INTERNAL_CLOCK
+ ld [rSC], a
+ ret
+
+Serial_TryEstablishingExternallyClockedConnection:: ; 22fa (0:22fa)
+ ld a, ESTABLISH_CONNECTION_WITH_EXTERNAL_CLOCK
+ ld [rSB], a
+ xor a
+ ld [hSerialReceiveData], a
+ ld a, START_TRANSFER_EXTERNAL_CLOCK
+ ld [rSC], a
+ ret \ No newline at end of file
diff --git a/home/text.asm b/home/text.asm
index aed89c33..362347cc 100644
--- a/home/text.asm
+++ b/home/text.asm
@@ -265,8 +265,8 @@ Char5F:: ; 1a91 (0:1a91)
ret
Char58:: ; 1a95 (0:1a95)
- ld a,[W_ISLINKBATTLE]
- cp 4
+ ld a,[wLinkState]
+ cp LINK_STATE_BATTLING
jp z,Next1AA2
ld a,$EE
Coorda 18, 16
@@ -506,8 +506,8 @@ TextCommand05:: ; 1bc5 (0:1bc5)
; 06
; (no arguments)
TextCommand06:: ; 1bcc (0:1bcc)
- ld a,[W_ISLINKBATTLE]
- cp a,$04
+ ld a,[wLinkState]
+ cp a,LINK_STATE_BATTLING
jp z,TextCommand0D
ld a,$ee ; down arrow
Coorda 18, 16 ; place down arrow in lower right corner of dialogue text box