.include "macros.inc"

.section .text, "ax"

.global __CARDGetFatBlock
__CARDGetFatBlock:
/* 803BA56C 003B74CC  80 63 00 88 */	lwz r3, 0x88(r3)
/* 803BA570 003B74D0  4E 80 00 20 */	blr

WriteCallback:
/* 803BA574 003B74D4  7C 08 02 A6 */	mflr r0
/* 803BA578 003B74D8  90 01 00 04 */	stw r0, 4(r1)
/* 803BA57C 003B74DC  94 21 FF E0 */	stwu r1, -0x20(r1)
/* 803BA580 003B74E0  93 E1 00 1C */	stw r31, 0x1c(r1)
/* 803BA584 003B74E4  93 C1 00 18 */	stw r30, 0x18(r1)
/* 803BA588 003B74E8  7C 9E 23 79 */	or. r30, r4, r4
/* 803BA58C 003B74EC  93 A1 00 14 */	stw r29, 0x14(r1)
/* 803BA590 003B74F0  3B A3 00 00 */	addi r29, r3, 0
/* 803BA594 003B74F4  1C BD 01 10 */	mulli r5, r29, 0x110
/* 803BA598 003B74F8  3C 60 80 57 */	lis r3, __CARDBlock@ha
/* 803BA59C 003B74FC  38 03 9A 58 */	addi r0, r3, __CARDBlock@l
/* 803BA5A0 003B7500  7F E0 2A 14 */	add r31, r0, r5
/* 803BA5A4 003B7504  41 80 00 48 */	blt lbl_803BA5EC
/* 803BA5A8 003B7508  80 7F 00 80 */	lwz r3, 0x80(r31)
/* 803BA5AC 003B750C  80 1F 00 88 */	lwz r0, 0x88(r31)
/* 803BA5B0 003B7510  38 83 60 00 */	addi r4, r3, 0x6000
/* 803BA5B4 003B7514  7C 00 20 40 */	cmplw r0, r4
/* 803BA5B8 003B7518  3C A3 00 01 */	addis r5, r3, 1
/* 803BA5BC 003B751C  38 A5 80 00 */	addi r5, r5, -32768
/* 803BA5C0 003B7520  40 82 00 18 */	bne lbl_803BA5D8
/* 803BA5C4 003B7524  90 BF 00 88 */	stw r5, 0x88(r31)
/* 803BA5C8 003B7528  38 65 00 00 */	addi r3, r5, 0
/* 803BA5CC 003B752C  38 A0 20 00 */	li r5, 0x2000
/* 803BA5D0 003B7530  4B C4 8E C1 */	bl memcpy
/* 803BA5D4 003B7534  48 00 00 18 */	b lbl_803BA5EC
lbl_803BA5D8:
/* 803BA5D8 003B7538  90 9F 00 88 */	stw r4, 0x88(r31)
/* 803BA5DC 003B753C  38 64 00 00 */	addi r3, r4, 0
/* 803BA5E0 003B7540  38 85 00 00 */	addi r4, r5, 0
/* 803BA5E4 003B7544  38 A0 20 00 */	li r5, 0x2000
/* 803BA5E8 003B7548  4B C4 8E A9 */	bl memcpy
lbl_803BA5EC:
/* 803BA5EC 003B754C  80 1F 00 D0 */	lwz r0, 0xd0(r31)
/* 803BA5F0 003B7550  28 00 00 00 */	cmplwi r0, 0
/* 803BA5F4 003B7554  40 82 00 10 */	bne lbl_803BA604
/* 803BA5F8 003B7558  38 7F 00 00 */	addi r3, r31, 0
/* 803BA5FC 003B755C  38 9E 00 00 */	addi r4, r30, 0
/* 803BA600 003B7560  4B FF E8 59 */	bl __CARDPutControlBlock
lbl_803BA604:
/* 803BA604 003B7564  80 1F 00 D8 */	lwz r0, 0xd8(r31)
/* 803BA608 003B7568  28 00 00 00 */	cmplwi r0, 0
/* 803BA60C 003B756C  7C 0C 03 78 */	mr r12, r0
/* 803BA610 003B7570  41 82 00 1C */	beq lbl_803BA62C
/* 803BA614 003B7574  38 00 00 00 */	li r0, 0
/* 803BA618 003B7578  7D 88 03 A6 */	mtlr r12
/* 803BA61C 003B757C  90 1F 00 D8 */	stw r0, 0xd8(r31)
/* 803BA620 003B7580  38 7D 00 00 */	addi r3, r29, 0
/* 803BA624 003B7584  38 9E 00 00 */	addi r4, r30, 0
/* 803BA628 003B7588  4E 80 00 21 */	blrl
lbl_803BA62C:
/* 803BA62C 003B758C  80 01 00 24 */	lwz r0, 0x24(r1)
/* 803BA630 003B7590  83 E1 00 1C */	lwz r31, 0x1c(r1)
/* 803BA634 003B7594  83 C1 00 18 */	lwz r30, 0x18(r1)
/* 803BA638 003B7598  83 A1 00 14 */	lwz r29, 0x14(r1)
/* 803BA63C 003B759C  38 21 00 20 */	addi r1, r1, 0x20
/* 803BA640 003B75A0  7C 08 03 A6 */	mtlr r0
/* 803BA644 003B75A4  4E 80 00 20 */	blr

EraseCallback:
/* 803BA648 003B75A8  7C 08 02 A6 */	mflr r0
/* 803BA64C 003B75AC  90 01 00 04 */	stw r0, 4(r1)
/* 803BA650 003B75B0  94 21 FF D8 */	stwu r1, -0x28(r1)
/* 803BA654 003B75B4  93 E1 00 24 */	stw r31, 0x24(r1)
/* 803BA658 003B75B8  3B E3 00 00 */	addi r31, r3, 0
/* 803BA65C 003B75BC  3C 60 80 57 */	lis r3, __CARDBlock@ha
/* 803BA660 003B75C0  93 C1 00 20 */	stw r30, 0x20(r1)
/* 803BA664 003B75C4  1C BF 01 10 */	mulli r5, r31, 0x110
/* 803BA668 003B75C8  93 A1 00 1C */	stw r29, 0x1c(r1)
/* 803BA66C 003B75CC  38 03 9A 58 */	addi r0, r3, __CARDBlock@l
/* 803BA670 003B75D0  7C 9D 23 79 */	or. r29, r4, r4
/* 803BA674 003B75D4  7F C0 2A 14 */	add r30, r0, r5
/* 803BA678 003B75D8  41 80 00 3C */	blt lbl_803BA6B4
/* 803BA67C 003B75DC  80 BE 00 88 */	lwz r5, 0x88(r30)
/* 803BA680 003B75E0  3C 60 80 3C */	lis r3, WriteCallback@ha
/* 803BA684 003B75E4  80 1E 00 80 */	lwz r0, 0x80(r30)
/* 803BA688 003B75E8  38 E3 A5 74 */	addi r7, r3, WriteCallback@l
/* 803BA68C 003B75EC  80 7E 00 0C */	lwz r3, 0xc(r30)
/* 803BA690 003B75F0  7C 00 28 50 */	subf r0, r0, r5
/* 803BA694 003B75F4  54 00 9B 7E */	srwi r0, r0, 0xd
/* 803BA698 003B75F8  7C 83 01 D6 */	mullw r4, r3, r0
/* 803BA69C 003B75FC  38 C5 00 00 */	addi r6, r5, 0
/* 803BA6A0 003B7600  38 7F 00 00 */	addi r3, r31, 0
/* 803BA6A4 003B7604  38 A0 20 00 */	li r5, 0x2000
/* 803BA6A8 003B7608  4B FF FE 61 */	bl __CARDWrite
/* 803BA6AC 003B760C  7C 7D 1B 79 */	or. r29, r3, r3
/* 803BA6B0 003B7610  40 80 00 44 */	bge lbl_803BA6F4
lbl_803BA6B4:
/* 803BA6B4 003B7614  80 1E 00 D0 */	lwz r0, 0xd0(r30)
/* 803BA6B8 003B7618  28 00 00 00 */	cmplwi r0, 0
/* 803BA6BC 003B761C  40 82 00 10 */	bne lbl_803BA6CC
/* 803BA6C0 003B7620  38 7E 00 00 */	addi r3, r30, 0
/* 803BA6C4 003B7624  38 9D 00 00 */	addi r4, r29, 0
/* 803BA6C8 003B7628  4B FF E7 91 */	bl __CARDPutControlBlock
lbl_803BA6CC:
/* 803BA6CC 003B762C  80 1E 00 D8 */	lwz r0, 0xd8(r30)
/* 803BA6D0 003B7630  28 00 00 00 */	cmplwi r0, 0
/* 803BA6D4 003B7634  7C 0C 03 78 */	mr r12, r0
/* 803BA6D8 003B7638  41 82 00 1C */	beq lbl_803BA6F4
/* 803BA6DC 003B763C  38 00 00 00 */	li r0, 0
/* 803BA6E0 003B7640  7D 88 03 A6 */	mtlr r12
/* 803BA6E4 003B7644  90 1E 00 D8 */	stw r0, 0xd8(r30)
/* 803BA6E8 003B7648  38 7F 00 00 */	addi r3, r31, 0
/* 803BA6EC 003B764C  38 9D 00 00 */	addi r4, r29, 0
/* 803BA6F0 003B7650  4E 80 00 21 */	blrl
lbl_803BA6F4:
/* 803BA6F4 003B7654  80 01 00 2C */	lwz r0, 0x2c(r1)
/* 803BA6F8 003B7658  83 E1 00 24 */	lwz r31, 0x24(r1)
/* 803BA6FC 003B765C  83 C1 00 20 */	lwz r30, 0x20(r1)
/* 803BA700 003B7660  83 A1 00 1C */	lwz r29, 0x1c(r1)
/* 803BA704 003B7664  38 21 00 28 */	addi r1, r1, 0x28
/* 803BA708 003B7668  7C 08 03 A6 */	mtlr r0
/* 803BA70C 003B766C  4E 80 00 20 */	blr

.global __CARDAllocBlock
__CARDAllocBlock:
/* 803BA710 003B7670  7C 08 02 A6 */	mflr r0
/* 803BA714 003B7674  1C E3 01 10 */	mulli r7, r3, 0x110
/* 803BA718 003B7678  90 01 00 04 */	stw r0, 4(r1)
/* 803BA71C 003B767C  94 21 FF E0 */	stwu r1, -0x20(r1)
/* 803BA720 003B7680  3C C0 80 57 */	lis r6, __CARDBlock@ha
/* 803BA724 003B7684  38 06 9A 58 */	addi r0, r6, __CARDBlock@l
/* 803BA728 003B7688  93 E1 00 1C */	stw r31, 0x1c(r1)
/* 803BA72C 003B768C  7D 20 3A 14 */	add r9, r0, r7
/* 803BA730 003B7690  93 C1 00 18 */	stw r30, 0x18(r1)
/* 803BA734 003B7694  80 09 00 00 */	lwz r0, 0(r9)
/* 803BA738 003B7698  2C 00 00 00 */	cmpwi r0, 0
/* 803BA73C 003B769C  40 82 00 0C */	bne lbl_803BA748
/* 803BA740 003B76A0  38 60 FF FD */	li r3, -3
/* 803BA744 003B76A4  48 00 00 CC */	b lbl_803BA810
lbl_803BA748:
/* 803BA748 003B76A8  81 09 00 88 */	lwz r8, 0x88(r9)
/* 803BA74C 003B76AC  A0 08 00 06 */	lhz r0, 6(r8)
/* 803BA750 003B76B0  7C 00 20 40 */	cmplw r0, r4
/* 803BA754 003B76B4  40 80 00 0C */	bge lbl_803BA760
/* 803BA758 003B76B8  38 60 FF F7 */	li r3, -9
/* 803BA75C 003B76BC  48 00 00 B4 */	b lbl_803BA810
lbl_803BA760:
/* 803BA760 003B76C0  7C 04 00 50 */	subf r0, r4, r0
/* 803BA764 003B76C4  B0 08 00 06 */	sth r0, 6(r8)
/* 803BA768 003B76C8  3C C0 00 01 */	lis r6, 0x0000FFFF@ha
/* 803BA76C 003B76CC  39 86 FF FF */	addi r12, r6, 0x0000FFFF@l
/* 803BA770 003B76D0  A1 68 00 08 */	lhz r11, 8(r8)
/* 803BA774 003B76D4  38 0C 00 00 */	addi r0, r12, 0
/* 803BA778 003B76D8  3B C0 00 00 */	li r30, 0
/* 803BA77C 003B76DC  48 00 00 7C */	b lbl_803BA7F8
lbl_803BA780:
/* 803BA780 003B76E0  A1 49 00 10 */	lhz r10, 0x10(r9)
/* 803BA784 003B76E4  3B DE 00 01 */	addi r30, r30, 1
/* 803BA788 003B76E8  57 C6 04 3E */	clrlwi r6, r30, 0x10
/* 803BA78C 003B76EC  38 EA FF FB */	addi r7, r10, -5
/* 803BA790 003B76F0  7C 07 30 00 */	cmpw r7, r6
/* 803BA794 003B76F4  40 80 00 0C */	bge lbl_803BA7A0
/* 803BA798 003B76F8  38 60 FF FA */	li r3, -6
/* 803BA79C 003B76FC  48 00 00 74 */	b lbl_803BA810
lbl_803BA7A0:
/* 803BA7A0 003B7700  39 6B 00 01 */	addi r11, r11, 1
/* 803BA7A4 003B7704  55 66 04 3E */	clrlwi r6, r11, 0x10
/* 803BA7A8 003B7708  28 06 00 05 */	cmplwi r6, 5
/* 803BA7AC 003B770C  41 80 00 0C */	blt lbl_803BA7B8
/* 803BA7B0 003B7710  7C 06 50 40 */	cmplw r6, r10
/* 803BA7B4 003B7714  41 80 00 08 */	blt lbl_803BA7BC
lbl_803BA7B8:
/* 803BA7B8 003B7718  39 60 00 05 */	li r11, 5
lbl_803BA7BC:
/* 803BA7BC 003B771C  55 66 0B FC */	rlwinm r6, r11, 1, 0xf, 0x1e
/* 803BA7C0 003B7720  7C E8 32 14 */	add r7, r8, r6
/* 803BA7C4 003B7724  A0 C7 00 00 */	lhz r6, 0(r7)
/* 803BA7C8 003B7728  28 06 00 00 */	cmplwi r6, 0
/* 803BA7CC 003B772C  40 82 00 2C */	bne lbl_803BA7F8
/* 803BA7D0 003B7730  55 86 04 3E */	clrlwi r6, r12, 0x10
/* 803BA7D4 003B7734  28 06 FF FF */	cmplwi r6, 0xffff
/* 803BA7D8 003B7738  40 82 00 0C */	bne lbl_803BA7E4
/* 803BA7DC 003B773C  7D 6C 5B 78 */	mr r12, r11
/* 803BA7E0 003B7740  48 00 00 0C */	b lbl_803BA7EC
lbl_803BA7E4:
/* 803BA7E4 003B7744  57 E6 0B FC */	rlwinm r6, r31, 1, 0xf, 0x1e
/* 803BA7E8 003B7748  7D 68 33 2E */	sthx r11, r8, r6
lbl_803BA7EC:
/* 803BA7EC 003B774C  B0 07 00 00 */	sth r0, 0(r7)
/* 803BA7F0 003B7750  3B EB 00 00 */	addi r31, r11, 0
/* 803BA7F4 003B7754  38 84 FF FF */	addi r4, r4, -1
lbl_803BA7F8:
/* 803BA7F8 003B7758  28 04 00 00 */	cmplwi r4, 0
/* 803BA7FC 003B775C  40 82 FF 84 */	bne lbl_803BA780
/* 803BA800 003B7760  B1 68 00 08 */	sth r11, 8(r8)
/* 803BA804 003B7764  7D 04 43 78 */	mr r4, r8
/* 803BA808 003B7768  B1 89 00 BE */	sth r12, 0xbe(r9)
/* 803BA80C 003B776C  48 00 00 B9 */	bl __CARDUpdateFatBlock
lbl_803BA810:
/* 803BA810 003B7770  80 01 00 24 */	lwz r0, 0x24(r1)
/* 803BA814 003B7774  83 E1 00 1C */	lwz r31, 0x1c(r1)
/* 803BA818 003B7778  83 C1 00 18 */	lwz r30, 0x18(r1)
/* 803BA81C 003B777C  38 21 00 20 */	addi r1, r1, 0x20
/* 803BA820 003B7780  7C 08 03 A6 */	mtlr r0
/* 803BA824 003B7784  4E 80 00 20 */	blr

.global __CARDFreeBlock
__CARDFreeBlock:
/* 803BA828 003B7788  7C 08 02 A6 */	mflr r0
/* 803BA82C 003B778C  1C E3 01 10 */	mulli r7, r3, 0x110
/* 803BA830 003B7790  90 01 00 04 */	stw r0, 4(r1)
/* 803BA834 003B7794  3C C0 80 57 */	lis r6, __CARDBlock@ha
/* 803BA838 003B7798  94 21 FF F8 */	stwu r1, -8(r1)
/* 803BA83C 003B779C  38 06 9A 58 */	addi r0, r6, __CARDBlock@l
/* 803BA840 003B77A0  7D 20 3A 14 */	add r9, r0, r7
/* 803BA844 003B77A4  80 09 00 00 */	lwz r0, 0(r9)
/* 803BA848 003B77A8  2C 00 00 00 */	cmpwi r0, 0
/* 803BA84C 003B77AC  40 82 00 0C */	bne lbl_803BA858
/* 803BA850 003B77B0  38 60 FF FD */	li r3, -3
/* 803BA854 003B77B4  48 00 00 60 */	b lbl_803BA8B4
lbl_803BA858:
/* 803BA858 003B77B8  81 09 00 88 */	lwz r8, 0x88(r9)
/* 803BA85C 003B77BC  38 E0 00 00 */	li r7, 0
/* 803BA860 003B77C0  48 00 00 40 */	b lbl_803BA8A0
lbl_803BA864:
/* 803BA864 003B77C4  54 84 04 3E */	clrlwi r4, r4, 0x10
/* 803BA868 003B77C8  28 04 00 05 */	cmplwi r4, 5
/* 803BA86C 003B77CC  41 80 00 10 */	blt lbl_803BA87C
/* 803BA870 003B77D0  A0 09 00 10 */	lhz r0, 0x10(r9)
/* 803BA874 003B77D4  7C 04 00 40 */	cmplw r4, r0
/* 803BA878 003B77D8  41 80 00 0C */	blt lbl_803BA884
lbl_803BA87C:
/* 803BA87C 003B77DC  38 60 FF FA */	li r3, -6
/* 803BA880 003B77E0  48 00 00 34 */	b lbl_803BA8B4
lbl_803BA884:
/* 803BA884 003B77E4  54 80 08 3C */	slwi r0, r4, 1
/* 803BA888 003B77E8  7C C8 02 14 */	add r6, r8, r0
/* 803BA88C 003B77EC  A0 86 00 00 */	lhz r4, 0(r6)
/* 803BA890 003B77F0  B0 E6 00 00 */	sth r7, 0(r6)
/* 803BA894 003B77F4  A0 C8 00 06 */	lhz r6, 6(r8)
/* 803BA898 003B77F8  38 06 00 01 */	addi r0, r6, 1
/* 803BA89C 003B77FC  B0 08 00 06 */	sth r0, 6(r8)
lbl_803BA8A0:
/* 803BA8A0 003B7800  54 80 04 3E */	clrlwi r0, r4, 0x10
/* 803BA8A4 003B7804  28 00 FF FF */	cmplwi r0, 0xffff
/* 803BA8A8 003B7808  40 82 FF BC */	bne lbl_803BA864
/* 803BA8AC 003B780C  7D 04 43 78 */	mr r4, r8
/* 803BA8B0 003B7810  48 00 00 15 */	bl __CARDUpdateFatBlock
lbl_803BA8B4:
/* 803BA8B4 003B7814  80 01 00 0C */	lwz r0, 0xc(r1)
/* 803BA8B8 003B7818  38 21 00 08 */	addi r1, r1, 8
/* 803BA8BC 003B781C  7C 08 03 A6 */	mtlr r0
/* 803BA8C0 003B7820  4E 80 00 20 */	blr

.global __CARDUpdateFatBlock
__CARDUpdateFatBlock:
/* 803BA8C4 003B7824  7C 08 02 A6 */	mflr r0
/* 803BA8C8 003B7828  90 01 00 04 */	stw r0, 4(r1)
/* 803BA8CC 003B782C  94 21 FF D8 */	stwu r1, -0x28(r1)
/* 803BA8D0 003B7830  93 E1 00 24 */	stw r31, 0x24(r1)
/* 803BA8D4 003B7834  93 C1 00 20 */	stw r30, 0x20(r1)
/* 803BA8D8 003B7838  3B C5 00 00 */	addi r30, r5, 0
/* 803BA8DC 003B783C  93 A1 00 1C */	stw r29, 0x1c(r1)
/* 803BA8E0 003B7840  3B A4 00 00 */	addi r29, r4, 0
/* 803BA8E4 003B7844  38 BD 00 00 */	addi r5, r29, 0
/* 803BA8E8 003B7848  93 81 00 18 */	stw r28, 0x18(r1)
/* 803BA8EC 003B784C  3B 83 00 00 */	addi r28, r3, 0
/* 803BA8F0 003B7850  38 DD 00 02 */	addi r6, r29, 2
/* 803BA8F4 003B7854  A0 64 00 04 */	lhz r3, 4(r4)
/* 803BA8F8 003B7858  1C 9C 01 10 */	mulli r4, r28, 0x110
/* 803BA8FC 003B785C  38 03 00 01 */	addi r0, r3, 1
/* 803BA900 003B7860  3C 60 80 57 */	lis r3, __CARDBlock@ha
/* 803BA904 003B7864  B0 1D 00 04 */	sth r0, 4(r29)
/* 803BA908 003B7868  38 03 9A 58 */	addi r0, r3, __CARDBlock@l
/* 803BA90C 003B786C  7F E0 22 14 */	add r31, r0, r4
/* 803BA910 003B7870  38 7D 00 04 */	addi r3, r29, 4
/* 803BA914 003B7874  38 80 1F FC */	li r4, 0x1ffc
/* 803BA918 003B7878  48 00 02 BD */	bl __CARDCheckSum
/* 803BA91C 003B787C  38 7D 00 00 */	addi r3, r29, 0
/* 803BA920 003B7880  38 80 20 00 */	li r4, 0x2000
/* 803BA924 003B7884  4B FC 41 BD */	bl DCStoreRange
/* 803BA928 003B7888  93 DF 00 D8 */	stw r30, 0xd8(r31)
/* 803BA92C 003B788C  3C 60 80 3C */	lis r3, EraseCallback@ha
/* 803BA930 003B7890  38 A3 A6 48 */	addi r5, r3, EraseCallback@l
/* 803BA934 003B7894  80 1F 00 80 */	lwz r0, 0x80(r31)
/* 803BA938 003B7898  7F 83 E3 78 */	mr r3, r28
/* 803BA93C 003B789C  80 9F 00 0C */	lwz r4, 0xc(r31)
/* 803BA940 003B78A0  7C 00 E8 50 */	subf r0, r0, r29
/* 803BA944 003B78A4  54 00 9B 7E */	srwi r0, r0, 0xd
/* 803BA948 003B78A8  7C 84 01 D6 */	mullw r4, r4, r0
/* 803BA94C 003B78AC  4B FF E2 89 */	bl __CARDEraseSector
/* 803BA950 003B78B0  80 01 00 2C */	lwz r0, 0x2c(r1)
/* 803BA954 003B78B4  83 E1 00 24 */	lwz r31, 0x24(r1)
/* 803BA958 003B78B8  83 C1 00 20 */	lwz r30, 0x20(r1)
/* 803BA95C 003B78BC  83 A1 00 1C */	lwz r29, 0x1c(r1)
/* 803BA960 003B78C0  83 81 00 18 */	lwz r28, 0x18(r1)
/* 803BA964 003B78C4  38 21 00 28 */	addi r1, r1, 0x28
/* 803BA968 003B78C8  7C 08 03 A6 */	mtlr r0
/* 803BA96C 003B78CC  4E 80 00 20 */	blr