···7979 return;
8080 }
81818282+ // any botton press when at end of the book goes back to the last page
8383+ if (currentSpineIndex > 0 && currentSpineIndex >= epub->getSpineItemsCount()) {
8484+ currentSpineIndex = epub->getSpineItemsCount() - 1;
8585+ nextPageNumber = UINT16_MAX;
8686+ updateRequired = true;
8787+ return;
8888+ }
8989+8290 const bool skipChapter = inputManager.getHeldTime() > SKIP_CHAPTER_MS;
83918492 if (skipChapter) {
···143151 return;
144152 }
145153146146- if (currentSpineIndex >= epub->getSpineItemsCount() || currentSpineIndex < 0) {
154154+ // edge case handling for sub-zero spine index
155155+ if (currentSpineIndex < 0) {
147156 currentSpineIndex = 0;
157157+ }
158158+ // based bounds of book, show end of book screen
159159+ if (currentSpineIndex > epub->getSpineItemsCount()) {
160160+ currentSpineIndex = epub->getSpineItemsCount();
161161+ }
162162+163163+ // Show end of book screen
164164+ if (currentSpineIndex == epub->getSpineItemsCount()) {
165165+ renderer.clearScreen();
166166+ renderer.drawCenteredText(READER_FONT_ID, 300, "End of book", true, BOLD);
167167+ renderer.displayBuffer();
168168+ return;
148169 }
149170150171 if (!section) {