| 72 | } |
| 73 | |
| 74 | s32 __CARDAllocBlock(s32 chan, u32 cBlock, CARDCallback callback) { |
| 75 | CARDControl* card; |
| 76 | u16* fat; |
| 77 | u16 iBlock; |
| 78 | u16 startBlock; |
| 79 | u16 prevBlock; |
| 80 | u16 count; |
| 81 | |
| 82 | card = &__CARDBlock[chan]; |
| 83 | if (!card->attached) { |
| 84 | return CARD_RESULT_NOCARD; |
| 85 | } |
| 86 | |
| 87 | fat = __CARDGetFatBlock(card); |
| 88 | if (fat[3] < cBlock) { |
| 89 | return CARD_RESULT_INSSPACE; |
| 90 | } |
| 91 | |
| 92 | fat[3] -= cBlock; |
| 93 | startBlock = 0xFFFF; |
| 94 | iBlock = fat[4]; |
| 95 | count = 0; |
| 96 | while (0 < cBlock) { |
| 97 | if (card->cBlock - 5 < ++count) { |
| 98 | return CARD_RESULT_BROKEN; |
| 99 | } |
| 100 | |
| 101 | iBlock++; |
| 102 | if (!CARDIsValidBlockNo(card, iBlock)) { |
| 103 | iBlock = 5; |
| 104 | } |
| 105 | |
| 106 | if (fat[iBlock] == 0x0000u) { |
| 107 | if (startBlock == 0xFFFF) { |
| 108 | startBlock = iBlock; |
| 109 | } else { |
| 110 | fat[prevBlock] = iBlock; |
| 111 | } |
| 112 | prevBlock = iBlock; |
| 113 | fat[iBlock] = 0xFFFF; |
| 114 | --cBlock; |
| 115 | } |
| 116 | } |
| 117 | fat[4] = iBlock; |
| 118 | card->startBlock = startBlock; |
| 119 | |
| 120 | return __CARDUpdateFatBlock(chan, fat, callback); |
| 121 | } |
| 122 | |
| 123 | s32 __CARDFreeBlock(s32 chan, u16 nBlock, CARDCallback callback) { |
| 124 | CARDControl* card; |
no test coverage detected