From 3fdb8a0d8995746d5605136ece384516338489b0 Mon Sep 17 00:00:00 2001 From: YamaArashi Date: Sat, 7 Feb 2015 02:43:08 -0800 Subject: serial/trade/misc --- home/serial.asm | 617 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 313 insertions(+), 304 deletions(-) (limited to 'home/serial.asm') 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 -- cgit v1.2.3