summaryrefslogtreecommitdiff
path: root/engine/serial.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/serial.asm')
-rw-r--r--engine/serial.asm408
1 files changed, 408 insertions, 0 deletions
diff --git a/engine/serial.asm b/engine/serial.asm
new file mode 100644
index 000000000..fca9d82c3
--- /dev/null
+++ b/engine/serial.asm
@@ -0,0 +1,408 @@
+Serial: ; 6ef
+; The serial interrupt.
+
+ push af
+ push bc
+ push de
+ push hl
+
+ ld a, [$ffc9]
+ and a
+ jr nz, .asm_71c
+
+ ld a, [$c2d4]
+ bit 0, a
+ jr nz, .asm_721
+
+ ld a, [$ffcb]
+ inc a
+ jr z, .asm_726
+
+ ld a, [rSB]
+ ld [hSerialReceive], a
+
+ ld a, [hSerialSend]
+ ld [rSB], a
+
+ ld a, [$ffcb]
+ cp $2
+ jr z, .asm_752
+
+ ld a, 0 << rSC_ON
+ ld [rSC], a
+ ld a, 1 << rSC_ON
+ ld [rSC], a
+ jr .asm_752
+
+.asm_71c
+ call Function3e80
+ jr .asm_75a
+
+.asm_721
+ call Function2057
+ jr .asm_75a
+
+.asm_726
+ ld a, [rSB]
+ cp $1
+ jr z, .asm_730
+ cp $2
+ jr nz, .asm_752
+
+.asm_730
+ ld [hSerialReceive], a
+ ld [$ffcb], a
+ cp $2
+ jr z, .asm_74f
+
+ xor a
+ ld [rSB], a
+ ld a, $3
+ ld [rDIV], a
+
+.asm_73f
+ ld a, [rDIV]
+ bit 7, a
+ jr nz, .asm_73f
+
+ ld a, 0 << rSC_ON
+ ld [rSC], a
+ ld a, 1 << rSC_ON
+ ld [rSC], a
+ jr .asm_752
+
+.asm_74f
+ xor a
+ ld [rSB], a
+
+.asm_752
+ ld a, $1
+ ld [$ffca], a
+ ld a, $fe
+ ld [hSerialSend], a
+
+.asm_75a
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+; 75f
+
+Function75f: ; 75f
+ ld a, $1
+ ld [$ffcc], a
+.asm_763
+ ld a, [hl]
+ ld [hSerialSend], a
+ call Function78a
+ push bc
+ ld b, a
+ inc hl
+ ld a, $30
+.asm_76e
+ dec a
+ jr nz, .asm_76e
+ ld a, [$ffcc]
+ and a
+ ld a, b
+ pop bc
+ jr z, .asm_782
+ dec hl
+ cp $fd
+ jr nz, .asm_763
+ xor a
+ ld [$ffcc], a
+ jr .asm_763
+
+.asm_782
+ ld [de], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_763
+ ret
+; 78a
+
+Function78a: ; 78a
+ xor a
+ ld [$ffca], a
+ ld a, [$ffcb]
+ cp $2
+ jr nz, .asm_79b
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+
+.asm_79b
+ ld a, [$ffca]
+ and a
+ jr nz, .asm_7e5
+ ld a, [$ffcb]
+ cp $1
+ jr nz, .asm_7c0
+ call Function82b
+ jr z, .asm_7c0
+ call .asm_825
+ push hl
+ ld hl, $cf5c
+ inc [hl]
+ jr nz, .asm_7b7
+ dec hl
+ inc [hl]
+
+.asm_7b7
+ pop hl
+ call Function82b
+ jr nz, .asm_79b
+ jp Function833
+
+.asm_7c0
+ ld a, [rIE]
+ and $f
+ cp $8
+ jr nz, .asm_79b
+ ld a, [$cf5d]
+ dec a
+ ld [$cf5d], a
+ jr nz, .asm_79b
+ ld a, [$cf5e]
+ dec a
+ ld [$cf5e], a
+ jr nz, .asm_79b
+ ld a, [$ffcb]
+ cp $1
+ jr z, .asm_7e5
+ ld a, $ff
+.asm_7e2
+ dec a
+ jr nz, .asm_7e2
+
+.asm_7e5
+ xor a
+ ld [$ffca], a
+ ld a, [rIE]
+ and $f
+ sub $8
+ jr nz, .asm_7f8
+ ld [$cf5d], a
+ ld a, $50
+ ld [$cf5e], a
+
+.asm_7f8
+ ld a, [hSerialReceive]
+ cp $fe
+ ret nz
+ call Function82b
+ jr z, .asm_813
+ push hl
+ ld hl, $cf5c
+ ld a, [hl]
+ dec a
+ ld [hld], a
+ inc a
+ jr nz, .asm_80d
+ dec [hl]
+
+.asm_80d
+ pop hl
+ call Function82b
+ jr z, Function833
+
+.asm_813
+ ld a, [rIE]
+ and $f
+ cp $8
+ ld a, $fe
+ ret z
+ ld a, [hl]
+ ld [hSerialSend], a
+ call DelayFrame
+ jp Function78a
+
+.asm_825
+ ld a, $f
+.asm_827
+ dec a
+ jr nz, .asm_827
+ ret
+; 82b
+
+Function82b: ; 82b
+ push hl
+ ld hl, $cf5b
+ ld a, [hli]
+ or [hl]
+ pop hl
+ ret
+; 833
+
+Function833: ; 833
+ dec a
+ ld [$cf5b], a
+ ld [$cf5c], a
+ ret
+; 83b
+
+Function83b: ; 83b
+ ld hl, $cf56
+ ld de, $cf51
+ ld c, $2
+ ld a, $1
+ ld [$ffcc], a
+.asm_847
+ call DelayFrame
+ ld a, [hl]
+ ld [hSerialSend], a
+ call Function78a
+ ld b, a
+ inc hl
+ ld a, [$ffcc]
+ and a
+ ld a, $0
+ ld [$ffcc], a
+ jr nz, .asm_847
+ ld a, b
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .asm_847
+ ret
+; 862
+
+Function862: ; 862
+ call Function309d
+ callab Function4000
+ call Function87d
+ jp Function30b4
+; 871
+
+
+Function871: ; 871
+ call Function309d
+ callab Function4000
+ jp Function87d
+; 87d
+
+
+
+Function87d: ; 87d
+ ld a, $ff
+ ld [$cf52], a
+.asm_882
+ call Function8c1
+ call DelayFrame
+ call Function82b
+ jr z, .asm_89e
+ push hl
+ ld hl, $cf5c
+ dec [hl]
+ jr nz, .asm_89d
+ dec hl
+ dec [hl]
+ jr nz, .asm_89d
+ pop hl
+ xor a
+ jp Function833
+
+.asm_89d
+ pop hl
+
+.asm_89e
+ ld a, [$cf52]
+ inc a
+ jr z, .asm_882
+ ld b, $a
+.asm_8a6
+ call DelayFrame
+ call Function8c1
+ dec b
+ jr nz, .asm_8a6
+ ld b, $a
+.asm_8b1
+ call DelayFrame
+ call Function908
+ dec b
+ jr nz, .asm_8b1
+ ld a, [$cf52]
+ ld [$cf51], a
+ ret
+; 8c1
+
+Function8c1: ; 8c1
+ push bc
+ ld b, $60
+ ld a, [InLinkBattle]
+ cp $1
+ jr z, .asm_8d7
+ ld b, $60
+ jr c, .asm_8d7
+ cp $2
+ ld b, $70
+ jr z, .asm_8d7
+ ld b, $80
+
+.asm_8d7
+ call Function8f3
+ ld a, [$cf56]
+ add b
+ ld [hSerialSend], a
+ ld a, [$ffcb]
+ cp $2
+ jr nz, .asm_8ee
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+
+.asm_8ee
+ call Function8f3
+ pop bc
+ ret
+; 8f3
+
+Function8f3: ; 8f3
+ ld a, [hSerialReceive]
+ ld [$cf51], a
+ and $f0
+ cp b
+ ret nz
+ xor a
+ ld [hSerialReceive], a
+ ld a, [$cf51]
+ and $f
+ ld [$cf52], a
+ ret
+; 908
+
+Function908: ; 908
+ xor a
+ ld [hSerialSend], a
+ ld a, [$ffcb]
+ cp $2
+ ret nz
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ret
+; 919
+
+Function919: ; 919
+ ld a, [InLinkBattle]
+ and a
+ ret nz
+ ld a, $2
+ ld [rSB], a
+ xor a
+ ld [hSerialReceive], a
+ ld a, $0
+ ld [rSC], a
+ ld a, $80
+ ld [rSC], a
+ ret
+; 92e
+
+