This is very confusing naming:
> write pointer: the next address to write to
OK
> peek pointer: the address of the next frame to read > read pointer: the address where data can be overwritten
What? If the "write pointer" is the "the next address to write to" then the "read pointer" had better be "the next address to read from".
The "peek pointer" should be the "read pointer", and the pointer to the end of the free sector should be the "stop pointer" or "unfreed pointer" or "in-use pointer" or literally anything else. Even "third pointer" would be less confusing!