Prev: 75F6 Up: Map Next: 76EC
75FA: Parse THEN or a full stop
Used by the routines at PARSE_AND and PARSE_VERB.
PARSE_THEN 75FA BIT 1,E No verb yet, and no earlier frame to borrow one from...
75FC JR Z,END_COMMAND
75FE LD A,(COMMAND_FRAMES)
7601 AND A
7602 JR NZ,END_COMMAND
7604 LD A,(LAST_CLASS) ...an empty line: nothing to do
7607 CP $C0
7609 JR NZ,PARSE_THEN_0
760B CP D
760C JR Z,IN_ORDER_ONLY
PARSE_THEN_0 760E CALL PARSING_ORDER ...no verb outside a quotation: "what ?"
7611 JP Z,QUOTE_LEFT_OPEN
This entry point is used by the routine at PARSE_COMMAND.
END_COMMAND 7614 LD A,(ALL_EXCEPT) ALL_EXCEPT = 1 means ALL: set bit 7 of the verb's second byte
7617 DEC A
7618 JR NZ,PARSE_THEN_1
761A SET 7,(IY+$01)
PARSE_THEN_1 761E LD HL,COMMAND_FRAMES Count the frame, except for the AND in ALL EXCEPT
7621 DEC A
7622 LD A,D
7623 JR NZ,PARSE_THEN_2
7625 CP $A0
7627 JR Z,PARSE_THEN_3
PARSE_THEN_2 7629 INC (HL)
PARSE_THEN_3 762A CALL FRAME_BELOW_THEN_SWAP On to the next frame; if an AND ended this one, keep going: TAKE THE MAP AND THE KEY
762D CP $A0
762F JP Z,PARSE_NEXT_COMMAND
7632 LD A,(QUESTION_WAITING) Finishing a command that was left unfinished?
7635 AND A
7636 JR Z,PARSE_THEN_10
7638 PUSH DE Compare the new frame's noun with the old command's...
7639 LD E,A
763A LD D,$00
763C LD HL,COMMAND_FRAME
763F ADD HL,DE
7640 PUSH IY
7642 LD IY,NEXT_FRAME
7646 LD A,(IY+$08)
7649 OR (IY+$09)
764C LD DE,$B9B8
764F JR Z,PARSE_THEN_5
7651 LD A,(IY+$08)
7654 CP (HL)
7655 JR NZ,PARSE_THEN_4
7657 LD A,(IY+$09)
765A INC HL
765B CP (HL)
765C DEC HL
765D JR Z,PARSE_THEN_5
PARSE_THEN_4 765F LD A,(IY+$12) ...or its second noun...
7662 OR (IY+$13)
7665 LD DE,$B9C2
PARSE_THEN_5 7668 POP IY
766A JR NZ,PARSE_THEN_9 ...and copy the new words into whichever of the old noun and adjectives are empty
766C EX DE,HL
766D LD B,$03
PARSE_THEN_6 766F LD A,(HL)
7670 INC HL
7671 OR (HL)
7672 DEC HL
7673 JR NZ,PARSE_THEN_7
7675 LD A,(DE)
7676 LD (HL),A
PARSE_THEN_7 7677 INC HL
7678 INC DE
7679 JR NZ,PARSE_THEN_8
767B LD A,(DE)
767C LD (HL),A
PARSE_THEN_8 767D INC HL
767E INC DE
767F DJNZ PARSE_THEN_6
PARSE_THEN_9 7681 POP DE
PARSE_THEN_10 7682 PUSH IY Every frame with no verb takes the verb of the frame before
7684 LD IY,ROOM_POINTERS
7688 LD A,(COMMAND_FRAMES)
768B LD B,A
768C PUSH BC
768D CALL FRAME_BELOW_SWAP
PARSE_THEN_11 7690 LD A,B
7691 AND A
7692 JR Z,PARSE_THEN_12
7694 CALL FRAME_BELOW_SWAP
7697 LD A,(IY+$01)
769A AND $7F
769C OR (IY+$00)
769F CALL Z,COPY_VERB_ON
76A2 JR PARSE_THEN_11
PARSE_THEN_12 76A4 POP BC And a frame with the same verb but no second phrase borrows the one before's: PUT THE MAP AND THE KEY IN THE CHEST
76A5 POP IY
76A7 PUSH IY
76A9 CALL FRAME_SWAP_DOWN
PARSE_THEN_13 76AC LD A,B
76AD AND A
76AE JP Z,PARSE_THEN_14
76B1 CALL FRAME_SWAP_DOWN
76B4 LD A,(IY+$12)
76B7 OR (IY+$13)
76BA JR NZ,PARSE_THEN_13
76BC LD A,(IY+$00)
76BF CP (IX+$00)
76C2 JR NZ,PARSE_THEN_13
76C4 LD A,(IY+$01)
76C7 CP (IX+$01)
76CA JR NZ,PARSE_THEN_13
76CC LD A,(IX+$0E)
76CF OR (IX+$0F)
76D2 JR Z,PARSE_THEN_13
76D4 EXX
76D5 LD DE,$000E
76D8 CALL COPY_VERB_PHRASE
76DB JP PARSE_THEN_13
PARSE_THEN_14 76DE POP IY Nothing more on the line: done
76E0 LD A,(MORE_COMMANDS)
76E3 AND A
76E4 RET Z
76E5 CALL PARSING_ORDER More: outside a quotation, go back to the main loop for it; inside one, carry straight on
76E8 RET Z
76E9 JP PARSE_NEXT_COMMAND
Prev: 75F6 Up: Map Next: 76EC