; TEXT.S
; THIS ROUTINE HANDLES THE TEXT STRING DISPLAY, AND CONTAINS ALL TABLES
;         NEEDED FOR THE PROMPTS.
;

          GLBL    MTEXT
          GLBL    PROMPT,MKPROMPT

          GLBL    GOD
          GLBL    DLIST6,DLIST5,DLIST7
          GLBL    TXTLIST1,TXTLIST2,TXTLIST3
          GLBL    NULL2
          GLBL    TRUE,FALSE
          GLBL    NEWGAME,MKLOGO
          GLBL    COLORS

          GLBL    FINFO

          GLBL    TEXTTM1,TEXT0,TEXT1,TEXT2,TEXT4,TEXT5,TEXT6
          GLBL    TEXTLEN,TEXTPOS,PPTRL,PPTRH
          GLBL    FSTATE

GOTIME    EQU     $30

          RAMDEF                         ; ZERO PAGE

          RSEG    CODE1

; THE ROUTINE  "MKPROMPT" EXPECTS THE TYPE OF PROMPT IN A.
;         CURRENTLY ALL PROMPTS TAKE UP TWO LINES
;         IT SETS UP THE MODE AND THE TIME COUNT.
;   CURRENTLY, TRY THIS-- DON'T DO AN "RTS" UNTIL THE WAIT IS OVER
;         THIS WAY, I CAN RE-ENTER THE CODE EXACTLY WHERE THIS WAS CALLED.

MKPROMPT  ASL     A                      ; MULTIPLY BY TWO
          TAX                            ; FIND FIRST STRING HERE

          ONSCREEN                       wait until off-screen to hack
          INVBLANK                       display lists

          LDA     TEXTTM1,X
          STA     SYSCOUNT

          LDA     #FALSE
          STA     RUNLOAD                ; NO LOADER !

; ZERO OUT ALL THREE "TXTLIST" STRINGS:

          LDY     #$2A                   ; 13+14+15

T0LP      LDA     #NULL2
          STA     TXTLIST1,Y
          DEY
          BPL     T0LP

          CPX     #4                     ; INSTANT REPLAY MESSAGE
          BNE     TXTDL6

          LDY     LISTSIZE+7

          LDA     #L(TXTLIST3)
          STA     DLIST7,Y

          LDA     #H(TXTLIST3)
          STA     DLIST7+2,Y
          LDA     #$B2                   ; PALETTE 5, WIDTH 14
          STA     DLIST7+3,Y
          LDA     TEXTPOS,X
          STA     DLIST7+4,Y               ; HPOS

          LDA     #0
          STA     DLIST7+6,Y

; STORE PALW LAST OF ALL:
          LDY     LISTSIZE+7
          LDA     #$60
          STA     DLIST7+1,Y

; COPY THE TEXT STRING:

          LDA     PPTRL,X
          STA     LISTPTRA               ; POINTER TO THIS TEXT
          LDA     PPTRH,X
          STA     LISTPTRA+1

          LDY     TEXTLEN,X              ; NUMBER OF CHARACTERS

TXT3LP    LDA     (LISTPTRA),Y
          STA     TXTLIST3,Y
          DEY
          BPL     TXT3LP

          INX

; PUT TEXT IN DLIST6.  THIS WILL NORMALLY BE THE UPPERMOST LINE OF TEXT,
;         THE EXCEPTION BEING THE INSTANT REPLAY MESSAGE, WHICH
;         ALSO USES DLIST7.

TXTDL6    LDY     LISTSIZE+6             ; FIRST STRING DLIST 6

          LDA     #L(TXTLIST1)
          STA     DLIST6,Y

; STORE PALW LAST OF ALL

          LDA     #H(TXTLIST1)
          STA     DLIST6+2,Y
          LDA     #$B3                   ; PALETTE 5, WIDTH 13
          STA     DLIST6+3,Y
          LDA     TEXTPOS,X
          STA     DLIST6+4,Y               ; HPOS

          LDA     #0
          STA     DLIST6+6,Y

; STORE PALW LAST OF ALL, TO PREVENT ON-SCREEN GLITCH:

          LDY     LISTSIZE+6
          LDA     #$60
          STA     DLIST6+1,Y

; COPY THE TEXT STRING:

          LDA     PPTRL,X
          STA     LISTPTRA               ; POINTER TO THIS TEXT
          LDA     PPTRH,X
          STA     LISTPTRA+1

          LDY     TEXTLEN,X              ; NUMBER OF CHARACTERS

TXT1LP    LDA     (LISTPTRA),Y
          STA     TXTLIST1,Y
          DEY
          BPL     TXT1LP

          INX                            ; NEXT TEXT STRING

          LDY     LISTSIZE+5             ; NEXT LOWER DLIST

          LDA     #L(TXTLIST2)
          STA     DLIST5,Y
          LDA     #H(TXTLIST2)
          STA     DLIST5+2,Y
          LDA     #$B1                   ; PALETTE 5, 15 CHARACTER MAXIMUM
          STA     DLIST5+3,Y
          LDA     TEXTPOS,X
          STA     DLIST5+4,Y               ; HPOS

          LDA     #0
          STA     DLIST5+6,Y

; STORE PALW LAST OF ALL:
          LDY     LISTSIZE+5
          LDA     #$60
          STA     DLIST5+1,Y

; COPY THIS TEXT STRING:

          LDY     TEXTLEN,X

          LDA     PPTRL,X
          STA     LISTPTRA
          LDA     PPTRH,X
          STA     LISTPTRA+1

TXT2LP    LDA     (LISTPTRA),Y
          STA     TXTLIST2,Y
          DEY
          BPL     TXT2LP

;  NOTE-- IF THIS MESSAGE IS "PLAYER N", FILL IN THE PLAYER NUMBER

          MOVE    #0,TEMP4               used as an indicator for GAME OVER

          CPX     #1                     ; "EAT THE CONE!"
          BEQ     TXTADDPL
          CPX     #3                     ; "GAME OVER"
          BEQ     TXTGOVER
          CPX     #6
          BNE     TXTCONT0               if equal, an IR message

; If this is the "GAME OVER" message, set up the counters which
;         make the palettes flash.
;   Use the RAM location FINFO, which was being used for the cone timing.

TXTIROVR
          MOVE    #$80,TEMP4             flag for IR message
          MOVE    COLORS+15,TEMP5        start with this color
          JMP     TXTCONT0

TXTGOVER  MOVE    #GOTIME,FINFO
          MOVE    #0,FSTATE
          MOVE    #$40,TEMP4             flag for GAME OVER message

TXTADDPL  LDA     CURRENT                ; 0 OR 1
          ASL     A                      ; 0 OR 2
          CLC
          ADC     #$D8                   ; LOW BYTE FOR DIGIT "1"
          STA     TXTLIST2+7

TXTCONT0  LDA     MODE                   ; KEEP TO RESTORE LATER
          STA     TEMP0

          MOVEWORD  GODPTR,TEMP2           ; SAVE POINTER AS WELL

          LDA     #MTEXT
          STA     MODE

          NEWSTATE  PROMPT

          ENDCYCLE

; THIS ROUTINE JUST WAITS UNTIL IT'S TIME TO GET RID OF THE TEXT.
;         AT THIS TIME, LET THE LOADER RUN AGAIN, THEREBY ERASING
;         THE TEXT AS A SIDE EFFECT OF "MLOADER".  ALSO , RESTORE
;         THE PREVIOUS MODE FROM "TEMP0".
;   FIRST POLL THE RESET AND SELECT BUTTONS TO CHANGE MODES
;
; Addition: If this is the GAME OVER message, then decrement the timer
;         to see if a new palette is due for the message.  FSTATE
;         tells whether the colors are palette 4 or 5.

PROMPT    LDA     FPRESET                ; IF RESET WAS PUSHED, GO TO GAME
          BPL     PRCONT2

          LDA     RESREADY
          BPL     PRCONT2

          LDA     #FALSE                 ; DON'T LET IT GO AGAIN !
          STA     RESREADY

          JMP     NEWGAME                ; START A NEW GAME AND RETURN

PRCONT2   LDA     FPSELECT               ; SELECT SWITCH
          BEQ     PRCONT3                ; IF IT'S NOT PRESSED

          JMP     MKLOGO                 ; START MENU MODE AND RETURN

PRCONT3   LDA     NUMCYCLE               ; ONLY ONCE PER FRAME !
          CMP     #1
          BNE     PCONT00

          DEC     SYSCOUNT
          BNE     PCONT00

; IF WE GET HERE, THE WAIT IS OVER; RESTORE STUFF AND FINALLY DO THE
;         "RTS" TO WHATEVER LOCATION CALLED "MKPROMPT"

          LDA     TEMP0
          STA     MODE

          MOVEWORD   TEMP2,GODPTR

          RTS

; If TEMP4 is non-zero, this is the GAME OVER message.

PCONT00   LDA     TEMP4
          BPL     PCONT10                not IR message

          INC     TEMP5                  actually stored in DLI2

          JMP     PCONT01

PCONT10   ASL     A
          BPL     PCONT01                not GAME OVER either

          DEC     FINFO                  else, this is the GAME OVER message
          BNE     PCONT01

          LDA     FSTATE                 only flash 4 times:
          CMP     #4                     (yellow)->red->yellow->red->yellow
          BPL     PCONT01

          LDX     #$93
          LSR     A
          BCC     PCONT02                time for palette 4, RED

                                         ;time for YELLOW again
          LDX     #$B3

PCONT02
          INC     FSTATE

          LDA     LISTSIZE+6
          CLC
          ADC     #3
          TAY
          TXA
          STA     DLIST6,Y

          LDA     LISTSIZE+5
          CLC
          ADC     #3
          TAY
          TXA
          STA     DLIST5,Y

          LDA     #GOTIME
          STA     FINFO

PCONT01   ENDCYCLE

          END

