Prev: B5CC Up: Map Next: B6C5
B5FC: Handler: New High Score
Used by the routine at GameOver_1UP.
NewHighScore B5FC LD HL,$9698 HL=1UP_Score_1.
B5FF LD DE,$969B DE=2UP_Score_1.
B602 CALL NewHighScore_Compare Call NewHighScore_Compare.
B605 LD A,$00 Write 00 to 96BA.
B607 LD ($96BA),A
B60A JR Z,NewHighScore_Process If there's either any carry or the zero flag is set then jump to NewHighScore_Process.
B60C JR C,NewHighScore_Process
B60E CPL Flip the bits.
B60F EX DE,HL Switch the registers containing the 1UP and 2UP score.
NewHighScore_Process B610 LD ($969E),A Write A to Flag_ActivePlayer.
B613 CALL NewHighScore_0 Call NewHighScore_0.
B616 EX DE,HL Switch back the registers containing the 1UP and 2UP score.
B617 LD A,($969E) A=Flag_ActivePlayer.
B61A CPL Flip the bits.
B61B LD ($969E),A Write A to Flag_ActivePlayer.
NewHighScore_0 B61E PUSH DE Stash DE and HL on the stack.
B61F PUSH HL
We hold six high scores.
B620 LD B,$06 B=06.
B622 LD DE,$B322 DE=Pos_6_HighScore_1.
NewHighScore_1 B625 CALL NewHighScore_Compare Call NewHighScore_Compare.
B628 JR NC,NewHighScore_2
B62A CALL NewHighScore_Next Call NewHighScore_Next.
B62D DJNZ NewHighScore_1
NewHighScore_2 B62F LD A,B
B630 CP $06
B632 JR Z,NewHighScore_5
B634 LD HL,$B322 HL=Pos_6_HighScore_1.
B637 LD DE,$B328 DE=New_HighScore_1.
B63A LD A,B A=B.
B63B NEG
B63D ADD A,$06 A=A+06.
B63F LD ($96BB),A Store the result at HighScorePosition.
NewHighScore_3 B642 LD BC,$0006 BC=0006.
B645 PUSH HL Stash HL on the stack.
B646 LDIR
B648 POP DE Restore DE from the stack.
B649 LD L,E HL=DE.
B64A LD H,D
B64B CALL NewHighScore_Next Call NewHighScore_Next.
B64E EX DE,HL
B64F DEC A Decrease A by one.
B650 JR NZ,NewHighScore_3
B652 POP HL
B653 PUSH HL
B654 LD BC,$0003 BC=0003.
B657 LDIR
B659 PUSH DE
B65A CALL Score_HI Call Score_HI.
B65D LD A,($96BA) If 96BA is not zero, jump to NewHighScore_4.
B660 AND A
B661 JR NZ,NewHighScore_4
B663 INC A Increment A by one.
B664 LD ($96BA),A Write A to 96BA.
B667 LD HL,$61C6 HL=Room_Special_MainMenu.
B66A CALL DrawRoom Call DrawRoom.
NewHighScore_4 B66D CALL HallOfFame_Clear Call HallOfFame_Clear.
Updates the text for the appropriate player number.
B670 LD A,($969E) A=Flag_ActivePlayer.
B673 AND A Is this 1UP or 2UP?
B674 LD A,$B1 A=B1 (ASCII "1"+80).
B676 JR Z,NewHighScore_Update_Player Jump to NewHighScore_Update_Player if the current player is 1UP.
B678 INC A Else, A=B2 (ASCII "2"+80).
Overwrite the copy:
Byte Copy
B1 "PLAYER 1"
B2 "PLAYER 2"
NewHighScore_Update_Player B679 LD ($B783),A Write A to B783.
Work out which of the HighScore_Suffixes to use.
B67C LD A,($96BB) B=HighScorePosition.
B67F LD B,A
B680 LD A,$FD A=FD (as FD+03=00 - so the offset is then pointing at the base address).
NewHighScore_Suffix_Loop B682 ADD A,$03 A=A+03.
B684 DJNZ NewHighScore_Suffix_Loop Decrease the position counter by one and loop back to NewHighScore_Suffix_Loop until the counter is zero.
Fetch the appropriate position suffix.
B686 LD C,A Create an offset in BC.
B687 LD B,$00
B689 LD HL,$B6C5 HL=HighScore_Suffixes + offset.
B68C ADD HL,BC
B68D LD DE,$B79C DE=B79C.
B690 LD BC,$0003 BC=03 (counter).
Overwrite the copy:
Byte Copy
00 "TODAYS 6TH HIGHEST"
01 "TODAYS 5TH HIGHEST"
02 "TODAYS 4TH HIGHEST"
03 "TODAYS 3RD HIGHEST"
04 "TODAYS 2ND HIGHEST"
B693 LDIR Copy 03 bytes of data from HL to B79C.
Print the messaging to the screen.
B695 LD DE,$B755 DE=NewHighScore_Attributes.
B698 EXX Switch to the shadow registers.
B699 LD HL,$B75D HL'=NewHighScore_Position.
B69C LD DE,$B76D DE'=NewHighScore_Text.
There are eight lines of text.
B69F LD B,$08 B=08.
B6A1 CALL GameMenu_Loop Call GameMenu_Loop.
B6A4 POP DE Restore DE from the stack.
B6A5 CALL $B6D7 Call B6D7.
NewHighScore_5 B6A8 POP HL Restore HL and DE from the stack.
B6A9 POP DE
B6AA RET Return.
Moves the High Score pointer to the next entry (we move from 6th to 1st).
NewHighScore_Next B6AB DEC DE Decrease DE by six.
B6AC DEC DE
B6AD DEC DE
B6AE DEC DE
B6AF DEC DE
B6B0 DEC DE
B6B1 RET Return.
Compares the scores pointed to by DE and HL.
NewHighScore_Compare B6B2 PUSH BC Stash BC, DE and HL on the stack.
B6B3 PUSH DE
B6B4 PUSH HL
Scores are held in three bytes.
B6B5 LD B,$03 B=03 (counter).
NewHighScore_Compare_Loop B6B7 LD A,(DE) A=the score digit held at DE.
B6B8 CP (HL) Compare this against the score digit held at HL.
B6B9 JR C,NewHighScore_Compare_Return If there's any carry over then jump to NewHighScore_Compare_Return to return.
B6BB JR NZ,NewHighScore_Compare_Return If the result is non-zero then jump to NewHighScore_Compare_Return to return.
B6BD INC HL Increment both HL and DE by one.
B6BE INC DE
B6BF DJNZ NewHighScore_Compare_Loop Decrease the score digit counter by one and loop back to NewHighScore_Compare_Loop until the counter is zero.
NewHighScore_Compare_Return B6C1 POP HL Restore HL, DE and BC from the stack.
B6C2 POP DE
B6C3 POP BC
B6C4 RET Return.
Prev: B5CC Up: Map Next: B6C5