;PONG GAME CONTROLLER
;(C) 2001 SPIKE TSASMALI
;
;PROGRAM WRITTEN FOR PIC 16C62 PROCESSOR 8MHz

INDR		EQU		0x00	;INDR REG
TMR0		EQU		0x01	;TMR 0
PCLO		EQU		0x02	;PC LOW BYTE
STATUS		EQU		0x03	;STATUS REG
FSR		EQU		0x04	;FILE SEL REG
PORTA		EQU		0x05	;PORT A
PORTB		EQU		0x06	;PORT B
PORTC		EQU		0x07	;PORT C
PCHI		EQU		0x0A	;PC HI LATCH
INTCON		EQU		0x0B	;INTERRUPT CONTROL REG
PIR1		EQU		0x0C	;PERIP INT REG
TMR1L		EQU		0x0E	;TMR 1 LOW
TMR1H		EQU		0x0F	;TMR 1 HIGH
T1CON		EQU		0x10	;TMR 1 CONTROL

OPTN		EQU		0x81	;OPTION REG
TRISA		EQU		0x85	;DDRA
TRISB		EQU		0x86	;DDRB
TRISC		EQU		0x87	;DDRC
PIE1		EQU		0x8C	;PERIP INT ENA REG
PCON		EQU		0x8E	;PERIP CONTROL REG


OFFSET          EQU             0x20    ;DATA TABLE OFFSET REG
DATAREG         EQU             0x21    ;DATA TABLE RETRIEVAL REG
LEN             EQU             0x22    ;DATA TABLE LEN NUMBER
TABADDR         EQU             0x23    ;DATA TABLE ADDRESS LOW
PGE             EQU             0x24    ;DATA TABLE ADDRESS HIGH
CREG            EQU             0x25    ;SERIAL DATA LOOP COUNTER
TQREG           EQU             0x26    ;CLEAR DISPLAY COUNTER
LENH            EQU             0x27    ;HIGH LEN BYTE FOR TABLRD RETRIEVAL
TSTOR           EQU             0x28    ;TEMP LEN STORAGE REG FOR RESTORAL
DEBREG          EQU             0x29    ;DEBOUNCE REGISTER
JREG            EQU             0x2A    ;PROCESSING REGISTER
QREG            EQU             0x2B    ;FRUGLE JUNK REGISTER
WSAV		EQU		0x2C	;W SAVE FOR INT
STATSAV		EQU		0x2D	;STATUS SAVE FOR INT
BUF1		EQU		0x2E	;SW BUF 1
BUF2		EQU		0x2F	;SW BUF 2

FLAGS1		EQU		0x31	;FLAGS REG 1
FLAGS2		EQU		0x32	;FLAGS REG 2
SVT		EQU		0x33	;SERVICE TIMER REG
SERV1		EQU		0x34	;SERVICE TIMER LSB
SERV2		EQU		0x35	;SERVICE TIMER MSB
CREDTMR		EQU		0x36	;COIN DEBOUNCER
METBUF		EQU		0x37	;CASH METER BUFFER
CREDIT		EQU		0x38	;CREDIT REGISTER
CASHREG		EQU		0x39	;METER DELAY REG
DBUF1		EQU		0x3A	;DISPLAY BUFFER 1
DBUF2		EQU		0x3B	;DISPLAY BUFFER 2
TEMP		EQU		0x3C	;TEMP REGISTER
TEMP2		EQU		0x3D	;TEMP 2 REGISTER
JS1		EQU		0x3E	;JOYSTICK TIMER 1
JS2		EQU		0x3F	;JOYSTICK TIMER 2
DIFREG		EQU		0x40	;PADDLE SPEED REG
TCELLCTR	EQU		0x41	;TEST MODE SEL COUNTER
SERVREG1	EQU		0x42	;SERVICE REGISTER 1
SERVREG2	EQU		0x43	;SERVICE REGISTER 2
SERVREG3	EQU		0x44	;SERVICE REGISTER 3
PADREG		EQU		0x45	;PADDLE POS REG
JT1		EQU		0x46	;J TIMER REG
JT2		EQU		0x47	;J TIMER REG

HPOS            EQU             0xA0    ;HORIZONTAL HOME POS
VPOS            EQU             0x90    ;VERTICAL HOME POS
SCRALEN         EQU             0255    ;SCREEN LEN LSB
SCRBLEN         EQU             033     ;SCREEN LEN MSB
SPCE            EQU             0x10    ;HEX CODE FOR SPACE
DEBTIME         EQU             255     ;DEBOUNCE TIME
SECTIME1	EQU		83	;ONE SECOND IN TIMER LSB
SECTIME2	EQU		06	;ONE SECOND IN TIMER MSB
CDEBTIME	EQU		16	;COIN DEBOUNCE TIME
CASHDEL		EQU		45	;METER DELAY TIME
JTIME1		EQU		03	;JOYSTICK TIME 1
JTIME2		EQU		01	;JOYSTICK TIME 2
EZLEV		EQU		06	;PADDLE SPEED EASY
HARDLEV		EQU		03	;PADDLE SPEED HARD
JATIME1		EQU		03	;JOYSTICK A TIME 1
JATIME2		EQU		05	;JOYSTICK A TIME 2

#DEFINE		P1UP		BUF1,0	;1 PLAYER UP
#DEFINE		P1DOWN		BUF1,1	;1 PLAYER DOWN
#DEFINE		P1START		BUF1,2	;1 PLAYER START
#DEFINE		P2UP		BUF1,3	;2 PLAYER UP
#DEFINE		P2DOWN		BUF1,4	;2 PLAYER DOWN
#DEFINE		P2START		BUF1,5	;2 PLAYER START
#DEFINE		COINSW		BUF1,6	;COIN SWITCH INPUT
#DEFINE		COINS		BUF1,7	;PRICING SWITCH

#DEFINE		FREE		BUF2,0	;FREE PLAY SWITCH
#DEFINE		TESTSW		BUF2,1	;TEST SWITCH INPUT



#DEFINE		SKILLBIT	FLAGS1,1	;SKILL LEVEL
#DEFINE		SERVON		FLAGS1,2	;SERV TIMER BIT
#DEFINE		SERVZERO	FLAGS1,3	;SERV TIME Z BIT
#DEFINE		CCREDBIT	FLAGS1,4	;CRED IN PROG BIT
#DEFINE		CASHBIT		FLAGS1,5	;METER IN PROG BIT
#DEFINE		SECONDPASS	FLAGS1,6	;SECOND PASS
#DEFINE		GOBIT		FLAGS1,7	;GAME OVER BIT

#DEFINE		P1JOYENA	FLAGS2,0	;P1 JOYSTICK ON
#DEFINE		P2JOYENA	FLAGS2,1	;P2 JOYSTICK ON
#DEFINE		JTZERO		FLAGS2,2	;J TEST TIMER
#DEFINE		JTON		FLAGS2,3	;J TEST TIME ON 

#DEFINE		Z		STATUS,2	;ZERO BIT

#DEFINE		JCLOCK		PORTA,5	;JOYSTICK EPOT CLOCK

#DEFINE		SERVE		PORTB,0	;SERVE TO TVP
#DEFINE		DIFLEV		PORTB,1	;DIFFICULTY LEV TO TVP
#DEFINE		METER		PORTB,3	;METER OUTPUT
#DEFINE		RESET		PORTB,4	;RESET LINE TO TVP

#DEFINE		E1ENA		PORTC,0	;EPOT 1 ENABLE BIT
#DEFINE         SDAT            PORTC,1 ;SERIAL DATA TO TVDC
#DEFINE         SSTROBE         PORTC,2 ;STROBE LINE TO TVDC
#DEFINE         SCLK            PORTC,3 ;SERIAL CLOCK TO TVDC
#DEFINE		E2ENA		PORTC,4	;EPOT 2 ENABLE BIT
#DEFINE		JOYDIR		PORTC,6	;JOYSTICK DIR BIT
#DEFINE		GAMESEL		PORTC,7	;GAME SEL TO TVP

#DEFINE		GIE		INTCON,7	;GLOBAL INT ENA
#DEFINE		TMR1IF		PIR1,0		;TMR 1 INT FLAG

;*****************************************************************************

;DEFINE MACROS 

;*****************************************************************************

BANK0   MACRO
        BCF	STATUS,5
        ENDM

BANK1   MACRO
        BSF	STATUS,5
        ENDM

	GOTO	START		;START PROGRAM

;*****************************************************************************

;INTERRUPT SERVICE ROUTINE

;*****************************************************************************

	ORG	0x04

	MOVWF	WSAV		;SAVE W
	SWAPF	STATUS,0
	MOVWF	STATSAV		;SAVE STATUS

  ;READ SWITCH INPUTS TO BUFFER

	CLRF	BUF1
	CLRF	BUF2		;PRE-SET BITS

TP1	BTFSC	PORTA,3		;1 UP
	BSF	BUF1,0
	BTFSC	PORTB,5		;1 DN
	BSF	BUF1,1
	BTFSC	PORTA,1		;1 ST
	BSF	BUF1,2
	BTFSC	PORTA,2		;2 UP
	BSF	BUF1,3
	BTFSC	PORTA,4		;2 DN
	BSF	BUF1,4
	BTFSC	PORTA,0		;2 ST
	BSF	BUF1,5	
	BTFSC	PORTB,6		;COIN 
	BSF	BUF1,6
	BTFSC	PORTB,2		;PRICING
	BSF	BUF1,7
	BTFSC	PORTB,7		;FREE PLAY
	BSF	BUF2,0	
	BTFSC	PORTC,5		;TEST
	BSF	BUF2,1

  ;SERVICE TIMER 

SERVTMR BTFSS	SERVON		;IS TIMER ON ?
	GOTO	CCRED		;SKIP TIMING IF NOT
	
	BTFSC	SERVZERO	;IS TIMER ZERO?
	GOTO	CCRED		;SKIP IF TIME IS ZERO

	DECFSZ	SERV1,1		;DECREMENT ONE SECOND REGISTER
	GOTO	CCRED		;EXIT FOR NOW...
	
	MOVLW	SECTIME1
	MOVWF	SERV1		;RESTORE LOW BYTE
	
	DECFSZ	SERV2,1		;DECREMENT HIGH BYTE
	GOTO	CCRED		;EXIT FOR NOW...
	
	MOVLW	SECTIME1
	MOVWF	SERV1		;RESTORE ONE SEC REGISTER
	MOVLW	SECTIME2
	MOVWF	SERV2

	DECFSZ	SVT,1		;DECREMENT TIME BUFFER
	GOTO	CCRED		;NOT YET ZERO

	BSF	SERVZERO	;TIME IS NOW ZERO
	BCF	SERVON		;TIMER IS NOW OFF
	
  ;CREDIT SERVICE ROUTINE

CCRED	BTFSS	FREE		;DO NOT DO THIS ROUTINE IN FREE PLAY
	GOTO	NOCRED

	BTFSS	TESTSW		;DO NOT DO THIS ROUTINE IF IN TEST
	GOTO	NOCRED
	
	BTFSC	CCREDBIT	;CHECK IF COIN CREDIT IN PROGRESS
	GOTO	DEBCRED

	BTFSC	COINSW		;CHECK COIN SWITCH
	GOTO	DOCOIN

	GOTO	NOCRED		;NO CREDIT INPUT AT THIS TIME

DOCOIN	BSF	CCREDBIT	;SET CREDIT IN PROGRESS BIT
	MOVLW	CDEBTIME
	MOVWF	CREDTMR
	
	GOTO	NOCRED		;EXIT THIS ROUTINE FOR NOW...

DEBCRED	DECFSZ	CREDTMR,1	;DECREMENT TIMER
	GOTO	NOCRED		;EXIT AGAIN, NOT YET DEBOUNCED

	BTFSC	COINSW		;CHECK IF COIN SWITCH IS DEBOUNCED

	GOTO	CTO		;TOOK TOO LONG, IGNORE THIS INPUT

	BCF	CCREDBIT	;RESET CREDIT IN PROGRESS BIT
	INCF	METBUF,1	;INCREMENT METER BUFFER REGISTER	
		
	MOVLW	0x63		;TEST FOR OVERFLOW
	XORWF	CREDIT,0	
	BTFSS	Z
	
	INCF	CREDIT,1	;INCREMENT CREDIT REGISTER
	BTFSS	GOBIT		;UPDATE CREDIT IF GAME OVER
	GOTO	NOCRED		;EXIT THIS ROUTINE..CREDIT GOOD
	BTFSC	P1JOYENA	;IF STICKS ARE ON, DON'T DO THIS
	GOTO	CTO
	BTFSC	P2JOYENA	;IF STICKS ARE ON, DON'T DO THIS
	GOTO	CTO
	CALL	CLRDISP		;CLEAR DISPLAY OF ALL OTHER PROMPTS
	CALL	DISPCRED	;DISPLAY CREDIT DATA
	CALL	PLPROMPT	;DISPLAY PROMPT FOR START

CTO	MOVLW	CDEBTIME
	MOVWF	CREDTMR
	
  ;UPDATE CASH METER

NOCRED	BTFSC	CASHBIT		;IS THERE ALREADY A PULSE IN PROGRESS?
	GOTO	CMPULSE
	
	BTFSC	SECONDPASS	;IS THIS A SECOND PASS TIMEOUT?
	GOTO	SECPASS

	MOVF	METBUF,0
	BTFSS	Z
	GOTO	NEWPULSE
	GOTO	ENDCRED		;THERE ARE NO METER PULSES LEFT

CMPULSE	DECFSZ	CASHREG,1	;TIME OUT YET?
	GOTO	ENDCRED		;NOT YET...
	BCF	CASHBIT		;RESET IN PROGRESS BIT	
	BCF	METER		;TURN OFF METER
	MOVLW	CASHDEL		;RESTORE TIMER
	MOVWF	CASHREG
	BSF	SECONDPASS	;SET SECOND PASS BIT
	GOTO	ENDCRED		;DONE WITH THIS PULSE...

SECPASS	DECFSZ	CASHREG,1	;TIME OUT AS USUAL...
	GOTO	ENDCRED		;NOT YET..
	BCF	SECONDPASS	;RESET SECOND PASS BIT
	MOVLW	CASHDEL
	MOVWF	CASHREG		;RESTORE DELAY TIME
	GOTO	ENDCRED		;END OF THIS PULSE

NEWPULSE
	DECF	METBUF,1	;DECREMENT METER BUFFER
	BSF	METER		;TURN ON CASH METER
	BSF	CASHBIT		;SET PULSE IN PROGRESS BIT

;*****************************************************************************

;JOYSTICK UPDATE ROUTINE

;*****************************************************************************

ENDCRED	BTFSC	P1JOYENA	;IS STICK ON?
	GOTO	JTMR
	
	BTFSC	P2JOYENA	;IS STICK ON?
	GOTO	JTMR

	GOTO	JSTMR		;NO TIMER -- STICK NOT ON
	
JTMR	DECFSZ	JS1,1		;DECREMENT ONE SECOND REGISTER
	GOTO	JSTMR		;EXIT FOR NOW...
	
	MOVF	DIFREG,0	;PADDLE SPEED CONTROL
	MOVWF	JS1		;RESTORE LOW BYTE
	
	DECFSZ	JS2,1		;DECREMENT HIGH BYTE
	GOTO	JSTMR		;EXIT FOR NOW...

	BTFSS	P1UP
	GOTO	PP1D

	BCF	E1ENA		;EPOT ONLINE
	BCF	JOYDIR		;SET FOR UP
	CALL	JOYCLOCK	;PULSE CLOCK
	BSF	E1ENA		;EPOT OFFLINE

PP1D	BTFSS	P1DOWN
	GOTO	PP2U

	BCF	E1ENA		;EPOT ONLINE
	BSF	JOYDIR		;SET FOR DOWN
	CALL	JOYCLOCK	;PULSE CLOCK
	BSF	E1ENA		;EPOT OFFLINE
	
PP2U	BTFSS	P2UP
	GOTO	PP2D

	BCF	E2ENA		;EPOT ONLINE
	BCF	JOYDIR		;SET FOR UP
	CALL	JOYCLOCK	;PULSE CLOCK
	BSF	E2ENA		;EPOT OFFLINE

PP2D	BTFSS	P2DOWN
	GOTO	UPCLOCK

	BCF	E2ENA		;EPOT ONLINE
	BSF	JOYDIR		;SET FOR DOWN
	CALL	JOYCLOCK	;PULSE CLOCK
	BSF	E2ENA		;EPOT OFFLINE
	GOTO	UPCLOCK		;DO CLOCK
	
JOYCLOCK	
	BCF	JCLOCK		;LOW CLOCK
	NOP
	NOP
	BSF	JCLOCK
	NOP
	NOP
	RETURN			;ONE CLOCK PULSE	

UPCLOCK
	MOVF	DIFREG,0	
	MOVWF	JS1		;RESTORE TIMING REGISTERS
	MOVLW	JTIME2
	MOVWF	JS2

JSTMR 	BTFSS	JTON		;IS TIMER ON ?
	GOTO	RESRET		;SKIP TIMING IF NOT
	
	BTFSC	JTZERO		;IS TIMER ZERO?
	GOTO	RESRET		;SKIP IF TIME IS ZERO

	DECFSZ	JT1,1		;DECREMENT ONE SECOND REGISTER
	GOTO	RESRET		;EXIT FOR NOW...
	
	MOVLW	JATIME1
	MOVWF	JT1		;RESTORE LOW BYTE
	
	DECFSZ	JT2,1		;DECREMENT HIGH BYTE
	GOTO	RESRET		;EXIT FOR NOW...
	
	MOVLW	JATIME1
	MOVWF	JT1		;RESTORE ONE SEC REGISTER
	MOVLW	JATIME2
	MOVWF	JT2

	BSF	JTZERO		;TIME IS NOW ZERO
	BCF	JTON		;TIMER IS NOW OFF

;*****************************************************************************

;RESTORE AND RETURN

;*****************************************************************************

RESRET	MOVLW	0xF0		;ADJUST INTERRUPT TIMER
	MOVWF	TMR1H			
	CLRF	TMR1L
	SWAPF	STATSAV,0
	MOVWF	STATUS		;RESTORE STATUS
	SWAPF	WSAV,1
	SWAPF	WSAV,0		;RESTORE W
	BCF	TMR1IF		;RE-ENABLE INT'S
	RETFIE			;RETURN FROM INTERRUPT


;*****************************************************************************

;INITIALIZE SYSTEM 

;*****************************************************************************

START	BANK0 			;BANK 1
        BCF     SSTROBE		;CLEAR PATH TO TVDC
        BCF     SDAT
        BCF     SCLK

        BANK1 			;BANK1
        MOVLW   B'00011111'
        MOVWF   TRISA  		;DATA DIRECTION PORT A
        
        BANK1
        MOVLW   B'11100100'             
        MOVWF   TRISB  		;DATA DIRECTION PORT B

        MOVLW   B'00100000'
        MOVWF   TRISC  		;DATA DIRECTION PORT C

	BANK0
	
	MOVLW	B'00111111'
	MOVWF	PORTA

	MOVLW	B'10010011'
	MOVWF	PORTB

	MOVLW	B'01110001'
	MOVWF	PORTC

  ;INITIALIZE TVP

	BCF	RESET		;PULSE RESET LINE
	CALL	DEBOUNCER
	BSF	RESET
	CALL	DEBOUNCER
	BCF	SERVE		;INITIALIZE TVP
	CALL	DEBOUNCER
	BSF	SERVE	
	
	MOVLW	10
	MOVWF	TEMP2
	MOVLW	150
	MOVWF	TEMP
DSVLP	CALL	DEBOUNCER
	DECFSZ	TEMP,1
	GOTO	DSVLP
	MOVLW	150
	MOVWF	TEMP
	DECFSZ	TEMP2,1
	GOTO	DSVLP
	BCF	RESET
	CALL	DEBOUNCER
	CALL	DEBOUNCER
	CALL	DEBOUNCER
	BSF	RESET
	CALL	DEBOUNCER
	
  ;INITIALIZE SYSTEM

	CLRF	FLAGS1		;ALL TIMERS OFF
	CLRF	FLAGS2		;CLEAR FLAGS
	CLRF	CREDIT
	CLRF	METBUF
	CLRF	BUF1		;CLEAR SW BUF'S
	CLRF	BUF2
	
	MOVLW	SECTIME1	;INITIALIZE SERVICE TIMER
	MOVWF	SERV1

	MOVLW	SECTIME2
	MOVWF	SERV2

	MOVLW	CASHDEL		;INITIALIZE CASH METER DELAY REGISTER
	MOVWF	CASHREG	

	MOVLW	JTIME1		;INITIALIZE DIFFICULTY DEFAULT
	MOVWF	JS1		;SETUP JOYSTICK TIMER
	MOVLW	JATIME1
	MOVWF	JT1
	MOVLW	JTIME2
	MOVWF	JS2
	MOVLW	JATIME2
	MOVWF	JT2
	BSF	GOBIT		;SET GAME OVER BIT

	BSF	SERVE		;CLEAR SERVE OUTPUT
	BSF	RESET		;CLEAR RESET OUTPUT
	BSF	DIFLEV		;DIF LEV TO EASY

	BSF	E1ENA		;EPOTS OFFLINE
	BSF	E2ENA	
	BSF	JOYDIR		;STICK UP
	BSF	JCLOCK		;CLOCK TO HIGH STATE

  	CALL	INITSTICKS	;INITIALIZE PADDLE POSITION

  ;INITIALIZE INTERRUPT SYSTEM

	CLRF	0x1D		;MODE SEL PWM/CCP OFF
	
	MOVLW	B'01000000'
	MOVWF	INTCON		;ENABLE PERIP INT'S
	
	BANK1
	MOVLW	B'00000001'	
	MOVWF	PIE1		;ENABLE TMR1 INT'S
	
	BANK0
	MOVLW	B'00000000'
	MOVWF	PIR1		;RESET PIR FLAGS

	
	MOVLW	B'00000001'
	MOVWF	T1CON		;ENABLE TIMER 1

;*****************************************************************************

;INITIALIZE TVDC          

;*****************************************************************************

INITV   CALL	INITDISP	;INITIALIZE TVDC

 	BSF	GIE		;TURN ON THE INTERRUPTS
	BCF	GAMESEL		;SELECT 2 PL GAME

;*****************************************************************************

;MAIN PROGRAM

;*****************************************************************************

MAIN	BCF	SERVZERO	;RESET SERVICE TIMER FLAG
	BSF	SERVE		;BE SURE SERVE IS OFF
	BCF	P1JOYENA	;TURN OFF JOYSTICK FOR P1
	BCF	P2JOYENA	;TURN OFF JOYSTICK FOR P2
	CALL	CLRDISP		;CLEAR DISPLAY
	CALL	DISPCRED	;DISPLAY CREDIT
	CALL	INITSTICKS	;RE-INITIALIZE PADDLE POSITION

	BTFSS	FREE	
	GOTO	STFREE		;FREE PLAY ROUTINE

	CALL	GAMEOVER	;DISPLAY GAME OVER PROMPT

	MOVF	CREDIT,0
	BTFSC	Z
	GOTO	RESCAN		;LOAD CHANGE TABLE IF NOT ZERO

	MOVLW	03
	MOVWF	SVT		;SERVICE TIMER
	BCF	SERVZERO	;RESET FLAG
	BSF	SERVON		;START TIMER

RESCAN	BTFSC	P1START		;1 PLAYER GAME?
	GOTO	P1GAME

	BTFSC	P2START		;2 PLAYER GAME?
	GOTO	P2GAME
	
	BTFSS	TESTSW		;TEST?
	GOTO 	SERVMODE	;DO SERVICE MODE
	
	BTFSS	SERVZERO	;SERVICE TIMER?
	GOTO	RESCAN		;WAIT HERE...
	CALL	CLRDISP		;CLEAR DISPLAY
	CALL	DISPCRED	;DISPLAY CREDITS
	CALL	PLPROMPT	;CHANGE MESSAGE...
	BCF	SERVZERO	;RESET FLAG
	GOTO	RESCAN
	
STFREE	CALL	GAMEOVER	;GAME OVER
	MOVLW	03
	MOVWF	SVT		;SERVICE TIMER
	BCF	SERVZERO	;RESET FLAG
	BSF	SERVON		;START TIMER
	
FLP1	BTFSC	P1START		;1 PLAYER FREE GAME?
	GOTO	BEG1PL

	BTFSC	P2START		;2 PLAYER FREE GAME?
	GOTO	BEG2PL
	
	BTFSS	SERVZERO	;SERVICE TIMER?
	GOTO	FLP1		;WAIT HERE...
	CALL	CLRDISP		;CLEAR DISPLAY
	CALL	DISPCRED	;DISPLAY CREDITS
	CALL	PLPROMPT	;CHANGE MESSAGE...
	BCF	SERVZERO	;RESET FLAG
	GOTO	FLP1		;LOOP HERE UNTIL GAME SEL

P1GAME	BTFSC	P1START		;WAIT UNTIL BUTTON IS RELEASED
	GOTO	P1GAME
	MOVF	CREDIT,0
	BTFSC	Z
	GOTO	RESCAN		;NO CREDIT, CAN'T START

	DECF	CREDIT,1	;DECREMENT CREDIT
	GOTO	BEG1PL

P2GAME	BTFSC	P2START		;WAIT UNTIL BUTTON IS RELEASED
	GOTO	P2GAME
	
	BTFSC	COINS		;1/2 OR 2/2?
	GOTO	TWOTWO

	MOVF	CREDIT,0
	BTFSC	Z
	GOTO	RESCAN		;NOT ENOUGH CREDIT

	DECF	CREDIT,1	;DECREMENT CREDIT
	GOTO	BEG2PL		;BEGIN 2 PLAYER GAME

TWOTWO	MOVLW	02
        SUBWF   CREDIT,0        ;CHECK FOR ENOUGH CREDIT
        BTFSS   STATUS,0        ;CHECK CARRY BIT
        GOTO	RESCAN		;NOT ENOUGH CREDIT
	DECF	CREDIT,1
	DECF	CREDIT,1	;DECREMENT CREDIT
	GOTO	BEG2PL

;*****************************************************************************

;1 PLAYER SETUP ROUTINE

;*****************************************************************************

BEG1PL	BTFSC	P1START		;WAIT UNTIL BUTTON IS RELEASED
	GOTO	BEG1PL
	CALL	CLRDISP		;OFF TVDC DATA
	CALL	SKILL		;SET SKILL LEVELS
	CALL	CLRDISP		;CLEAR DISPLAY AGAIN
	CALL	INITDISP	;INITIALIZE DISPLAY CONTROLLER

	BSF	P1JOYENA	;TURN ON JOYSTICK FOR P1
	BSF	GAMESEL		;SELECT 1 PL GAME
	
	GOTO	GAMECORE	;PLAY GAME

;*****************************************************************************

;2 PLAYER SETUP ROUTINE

;*****************************************************************************

BEG2PL	BTFSC	P2START		;WAIT UNTIL BUTTON IS RELEASED
	GOTO	BEG2PL
	CALL	CLRDISP		;OFF TVDC DATA
	CALL	SKILL		;SET SKILL LEVELS
	CALL	CLRDISP		;CLEAR DISPLAY AGAIN
	CALL	INITDISP	;INITIALIZE DISPLAY CONTROLLER
	
	BSF	P1JOYENA	;TURN ON JOYSTICK FOR P1
	BSF	P2JOYENA	;TURN ON JOYSTICK FOR P2
	BCF	GAMESEL		;SELECT 2 PL GAME
	
	GOTO	GAMECORE	;PLAY GAME

;*****************************************************************************

;GAME CORE ROUTINE

;*****************************************************************************

GAMECORE	
	BCF	RESET
	CALL	DEBOUNCER
	BSF	RESET		;RESET TVP

  ;INITIALIZE SERVICE TIMER FOR 1 SEC DELAY

	MOVLW	01
	MOVWF	SVT
	BCF	SERVZERO	;RESET FLAG
	BSF	SERVON		;TURN ON THE TIMER
	
STW	BTFSS	SERVZERO	;WAIT FOR TIMEOUT
	GOTO	STW

	MOVLW   LOW READYTAB    ;DATA TO TVDC
        MOVWF   TABADDR
        MOVLW   HIGH READYTAB
        MOVWF   PGE
        CALL    TVUPD           ;DISPLAY

	MOVLW	03
	MOVWF	SVT
	BCF	SERVZERO	;RESET FLAG
	BSF	SERVON		;TURN ON THE TIMER

STE	BTFSS	SERVZERO
	GOTO	STE

	CALL	CLRDISP		;CLEAR DISPLAY

	BCF	SERVE		;BEGIN GAME
	
  ;SET UP SERVICE TIMER FOR GAME OVER

TMRREST	CALL	SELTIME		;SELECT TIME FACTOR
	MOVWF	SVT
	BCF	SERVZERO	;RESET FLAG
	BSF	SERVON		;TURN ON THE TIMER

FGLOP	BTFSS	TESTSW
	GOTO	SERVMODE
	BTFSC	P1UP
	GOTO	TMRREST
	BTFSC	P1DOWN
	GOTO	TMRREST
	BTFSC	P2UP
	GOTO	TMRREST
	BTFSC	P2DOWN
	GOTO	TMRREST

	BTFSS	P1START
	GOTO	TZ

	BTFSS	FREE
	GOTO	FP1

	MOVF	CREDIT,0
	BTFSC	Z
	GOTO	TZ		;NO CREDIT, CAN'T START

FP1	BCF	P1JOYENA	;OFF STICK
	BCF	P2JOYENA	;OFF STICK
	BSF	SERVE		;SERVER OFF
	BCF	SERVON		;TIMER OFF

	BCF	SERVZERO
	MOVLW	02
	MOVWF	SVT		;2 SEC DELAY
	BSF	SERVON		;TIMER ON
	CALL	GAMEOVER	;DISPLAY GAME OVER
T1P1	BTFSS	SERVZERO
	GOTO	T1P1		;WAIT HERE
	GOTO	MAIN		;DO MAINS

TZ	BTFSS	P2START	
	GOTO	TA
	
	BTFSS	FREE
	GOTO	FP2		;FREE PLAY
	BTFSC	COINS		;1/2 OR 2/2?
	GOTO	TWO2

	MOVF	CREDIT,0
	BTFSC	Z
	GOTO	TA		;NOT ENOUGH CREDIT

	GOTO	FP1		;BEGIN  GAME

TWO2	MOVLW	02
        SUBWF   CREDIT,0        ;CHECK FOR ENOUGH CREDIT
        BTFSS   STATUS,0        ;CHECK CARRY BIT
        GOTO	TA		;NOT ENOUGH CREDIT
	GOTO	FP1		;BEGIN GAME
	
FP2	BCF	P1JOYENA	;OFF STICK
	BCF	P2JOYENA	;OFF STICK
	BSF	SERVE		;SERVER OFF
	BCF	SERVON		;TIMER OFF

	BCF	SERVZERO
	MOVLW	02
	MOVWF	SVT		;2 SEC DELAY
	BSF	SERVON		;TIMER ON
	CALL	GAMEOVER	;DISPLAY GAME OVER

T2P2	BTFSS	SERVZERO
	GOTO	T2P2		;WAIT HERE
	GOTO	MAIN		;DO MAINS

TA	BTFSC	SERVZERO	;HAS TIME OUT OCCURRED?
	GOTO	MAIN		;MAIN RESTART...
	GOTO	FGLOP		;LOOP HERE...

SELTIME	BTFSS	GAMESEL		;1 OR 2 PL GAME
	GOTO	P2TIME

	BTFSS	DIFLEV		;DETERMINE TIME
	RETLW	17		;1 PL EXPERT
	RETLW	32		;1 PL BEGINNER

P2TIME	BTFSS	DIFLEV		;DETERMINE TIME
	RETLW	17
	RETLW	32

;*****************************************************************************

;SKILL LEVEL SELECT ROUTINE

;*****************************************************************************

SKILL	BSF	SERVE
	BCF	RESET		;RESET TVP
	CALL	DEBOUNCER
	BSF	RESET		

	MOVLW   LOW SKILLTAB    ;DATA TO TVDC
        MOVWF   TABADDR
        MOVLW   HIGH SKILLTAB
        MOVWF   PGE
        CALL    TVUPD           ;DISPLAY

	BSF	SKILLBIT	;RESET SKILL TO EASY
	BSF	DIFLEV		;RESET ACTUAL BIT TO EASY
	CALL	EASYARROW	;PUT ARROW ON EASY

SKILSCAN
	BTFSC	P1UP		;SCAN FOR JOYSTICK
	GOTO	EASYUP
	BTFSC	P1DOWN		
	GOTO	HARDDOWN
	BTFSC	P1START		;CHECK FOR START
	GOTO	SETSKILL	;SET SKILL
	BTFSC	P2START
	GOTO	SETSKILL	;SET SKILL
	GOTO	SKILSCAN	;LOOP HERE

EASYUP	BSF	SKILLBIT	;SET FOR EASY
	CALL	EASYARROW	;DISPLAY ARROW
EEWT	BTFSC	P1UP		;WAIT UNTIL STICK IS RELEASED
	GOTO	EEWT
	GOTO	SKILSCAN

HARDDOWN
	BCF	SKILLBIT	;SET FOR HARD
	CALL	HARDARROW	;DISPLAY ARROW
HHWT	BTFSC	P1DOWN		;WAIT UNTIL STICK IS RELEASED
	GOTO	HHWT	
	GOTO	SKILSCAN	
	
SETSKILL	
	BCF	DIFLEV		;PRE-SET DIFFICULTY LEV TO HARD
	BTFSC	SKILLBIT	;CHECK TRUE SKILL SETTING
	BSF	DIFLEV		;SET TO HARD

	MOVLW	EZLEV
	MOVWF	DIFREG		;SET PADDLE SPEED
	MOVLW	HARDLEV
	BTFSS	SKILLBIT
	MOVWF	DIFREG		;SET PADDLE SPEED

	RETURN			;EXIT HERE!

EASYARROW
	MOVLW   LOW EASYTAB     ;DATA TO TVDC
        MOVWF   TABADDR
        MOVLW   HIGH EASYTAB
        MOVWF   PGE
        CALL    TVUPD           ;DISPLAY
	RETURN

HARDARROW
	MOVLW   LOW HARDTAB     ;DATA TO TVDC
        MOVWF   TABADDR
        MOVLW   HIGH HARDTAB
        MOVWF   PGE
        CALL    TVUPD           ;DISPLAY
	RETURN

;*****************************************************************************

;DISPLAY GAME OVER PROMPT

;*****************************************************************************

GAMEOVER	
	MOVLW   LOW GAMOVTAB    ;DATA TO TVDC
        MOVWF   TABADDR
        MOVLW   HIGH GAMOVTAB
        MOVWF   PGE
        CALL    TVUPD           ;DISPLAY
	RETURN

;*****************************************************************************

;DISPLAY PLAYERS PROMPT ROUTINE

;*****************************************************************************

PLPROMPT
	BTFSC	FREE
	GOTO	PAYSCR		;DO PAY SCREEN

	CALL	P1PRSC		;PLAYER 1
	CALL	P2PRSC		;PLAYER 2
	RETURN
	
PAYSCR	MOVF	CREDIT,0
	BTFSC	Z
	RETURN			;DON'T DO THIS IF CREDIT IS 0
	CALL	P1PRSC		;DISPLAY PLAYER 1 ONLY SCREEN
	
	BTFSS	COINS		;CHECK PRICING SWITCH
	GOTO	P2PL		;PRICING 2/1
	
	MOVLW	01
	XORWF	CREDIT,0
	BTFSC	Z
	RETURN		 	;DO TWO PLAYER PROMPT

P2PL	CALL	P2PRSC		;2 PLAYERS SCREEN
	RETURN

P1PRSC	MOVLW   LOW PL1PMPT    	;1 PLAYER COMPONENT
        MOVWF   TABADDR
        MOVLW   HIGH PL1PMPT
        MOVWF   PGE
        CALL    TVUPD
	RETURN

P2PRSC	MOVLW   LOW PL2PMPT    	;2 PLAYER COMPONENT
        MOVWF   TABADDR
        MOVLW   HIGH PL2PMPT
        MOVWF   PGE
        CALL    TVUPD
	RETURN

;*****************************************************************************

;INITIALIZE TVDC ROUTINE

;*****************************************************************************

INITDISP
	MOVLW   LOW INITABLE    ;INITIALIZE TVDC
        MOVWF   TABADDR
        MOVLW   HIGH INITABLE
        MOVWF   PGE
        CALL    TVUPD           ;INIT DISPLAY
	RETURN

;*****************************************************************************

;INITIALIZE PADDLE POSITION ROUTINE

;*****************************************************************************

INITSTICKS
	MOVLW	100
	MOVWF	TEMP2

	BCF	E1ENA
	BCF	E2ENA		;BOTH PADDLES ENABLED

	BCF	JOYDIR		;DOWN COUNTER

JIDN	CALL	JOYCLOCK	;PULSE CHIPS
	
	DECFSZ	TEMP2,1
	GOTO	JIDN

	MOVLW	50
	MOVWF	TEMP2		;UP COUNT 

	BSF	JOYDIR		;DOWN COUNTER

JIUP	CALL	JOYCLOCK	;PULSE CHIPS
	
	DECFSZ	TEMP2,1
	GOTO	JIUP

	BSF	E1ENA		;OFFLINE TO BOTH STICKS
	BSF	E2ENA
	
	RETURN

;*****************************************************************************

;DISPLAY CREDIT ROUTINE

;*****************************************************************************

DISPCRED
	BTFSS	FREE		;FREE PLAY?
	GOTO	FPSCR
	MOVLW	LOW CREDTAB
	MOVWF	TABADDR
	MOVLW	HIGH CREDTAB
	MOVWF	PGE
	CALL	TVUPD

	MOVF	CREDIT,0	;GET CREDIT DATA
	CALL	DCONVERT	;CONVERT TO DECIMAL
	MOVWF	DBUF1
	MOVWF	DBUF2	
	SWAPF	DBUF1,1		;POSITION 10'S DIGIT
	MOVLW	B'00001111'
	ANDWF	DBUF1,1		;MASK OFF HIGH BYTES
	ANDWF	DBUF2,1	
	MOVLW	0x30
	ADDWF	DBUF1,1
	ADDWF	DBUF2,1		;CONVERT TO ASCII
	MOVF	DBUF1,0		;GET 10'S DIGIT
	MOVWF	DATAREG
	CALL	ASCONV
	MOVWF	DBUF1
	MOVF	DBUF2,0
	MOVWF	DATAREG
	CALL	ASCONV
	MOVWF	DBUF2		;CONVERT TO NEC
	MOVF	DBUF1,0
	MOVWF	DATAREG
	CALL	SEROUT		;SEND 10'S DIGIT
	MOVF	DBUF2,0
	MOVWF	DATAREG
	CALL	SEROUT		;SEND 1'S DIGIT
	RETURN

FPSCR	MOVLW	LOW FREETAB
	MOVWF	TABADDR
	MOVLW	HIGH FREETAB
	MOVWF	PGE
	CALL	TVUPD		;FREE PLAY
	RETURN

;*****************************************************************************
;*****************************************************************************

;TV DISPLAY CONTROL UPDATE SUBROUTINE 

;*****************************************************************************

TVUPD   CLRF    OFFSET
        CALL    DTA
        MOVWF   LEN             ;SET LEN NUMBER
        INCF    OFFSET,1
NXBITE  CALL    DTA             ;GET VALID DATA
	MOVWF	DATAREG
	CALL	ASCONV		;CONVERT TO NEC FORMAT
	
        MOVWF   DATAREG

        CALL    SEROUT          ;SERIAL OUTPUT
        INCF    OFFSET,1
        DECFSZ  LEN,1           ;NEXT BYTE
        GOTO    NXBITE

        RETURN                  ;END OF ROUTINE

;*****************************************************************************

;DATA TABLE HANDLING ROUTINE 

;*****************************************************************************

DTA     MOVF    PGE,0
	MOVWF	PCHI
        MOVF    OFFSET,0        ;GET OFFSET VALUE
        ADDWF   TABADDR,0       ;ADD OFFSET TO TABLE ADDRESS
        MOVWF   PCLO            ;CALCULATED BRANCH

;*****************************************************************************

;SERIAL OUTPUT SUBROUTINE 

;*****************************************************************************

SEROUT  MOVLW   8               ;BIT LOOP COUNTER
        MOVWF   CREG

BTEST   BTFSS   DATAREG,7
        GOTO    OUTAZERO
        BSF     SDAT
        GOTO    CLOCK
OUTAZERO
        BCF     SDAT

CLOCK   BSF     SCLK
        NOP
	NOP
	NOP
	NOP
	NOP
	NOP
        BCF     SCLK
        NOP
	NOP
	NOP
	NOP
	NOP
	NOP
        RLF     DATAREG,1       ;SHIFT TO NEXT BIT

        DECFSZ  CREG,1          ;LOOP OUT 8 BITS
        GOTO    BTEST    
        
        BSF     SSTROBE         ;STROBE PULSE
        NOP
	NOP
	NOP
	NOP
	NOP
	NOP
        BCF     SSTROBE
        NOP
	NOP
	NOP
	NOP
	NOP
	NOP
        RETURN

;*****************************************************************************

;CLEAR DISPLAY SUBROUTINE 

;*****************************************************************************

CLRDISP MOVLW   HPOS            ;SET H POS HOME
        MOVWF   DATAREG
        CALL    SEROUT

        MOVLW   VPOS            ;SET V POS HOME
        MOVWF   DATAREG
        CALL    SEROUT

        MOVLW   0xE2            ;TURN OFF DISPLAY
        MOVWF   DATAREG
        CALL    SEROUT

        MOVLW   SCRALEN         ;LOOP SCREEN LENGTH
        MOVWF   TQREG
CBYTE   MOVLW   SPCE
        MOVWF   DATAREG
        CALL    SEROUT
        DECFSZ  TQREG,1
        GOTO    CBYTE

        MOVLW   SCRBLEN         ;LOOP 2 LENGTH
        MOVWF   TQREG
DBYTE   MOVLW   SPCE
        MOVWF   DATAREG
        CALL    SEROUT
        DECFSZ  TQREG,1
        GOTO    DBYTE
        
        MOVLW   HPOS            ;RESTORE CURSOR HOME
        MOVWF   DATAREG
        CALL    SEROUT
        MOVLW   VPOS
        MOVWF   DATAREG
        CALL    SEROUT

        MOVLW   0xE3            ;TURN DISPLAY BACK ON
        MOVWF   DATAREG
        CALL    SEROUT          

        RETURN

;*****************************************************************************

;TEST MODE ARROWS ROUTINE

;*****************************************************************************

ARROW1	MOVLW	LOW ARROW1TAB
	MOVWF	TABADDR
	MOVLW	HIGH ARROW1TAB
	MOVWF	PGE
	CALL	TVUPD		
	RETURN	

ARROW2	MOVLW	LOW ARROW2TAB
	MOVWF	TABADDR
	MOVLW	HIGH ARROW2TAB
	MOVWF	PGE
	CALL	TVUPD		
	RETURN	

ARROW3	MOVLW	LOW ARROW3TAB
	MOVWF	TABADDR
	MOVLW	HIGH ARROW3TAB
	MOVWF	PGE
	CALL	TVUPD		
	RETURN	

ARROW4	MOVLW	LOW ARROW4TAB
	MOVWF	TABADDR
	MOVLW	HIGH ARROW4TAB
	MOVWF	PGE
	CALL	TVUPD		
	RETURN	

;*****************************************************************************

;ASCII TO NEC CONVERSION ROUTINE 

;*****************************************************************************

ASCONV  MOVLW	0x80
        SUBWF   DATAREG,0       ;CHECK FOR UPPER CONTROL RANGE CHARACTERS
        BTFSS   STATUS,0        ;CHECK CARRY BIT
        GOTO    CONVAS
        MOVF    DATAREG,0
        RETURN
CONVAS  MOVLW   HIGH ASCTAB
        MOVWF   PCHI            ;CALCULATED BRANCH
        MOVLW   0x20
        SUBWF   DATAREG,0
        MOVWF   PCLO            ;JUMP TO GLORY

;*****************************************************************************

;DEBOUNCE TIMER SUBROUTINE 

;*****************************************************************************

DEBOUNCER
        MOVLW   DEBTIME
        MOVWF   DEBREG
DLOOP   NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DECFSZ  DEBREG,1        ;TIMING LOOP
        GOTO    DLOOP

        RETURN

;****************************************************************************

;CONTINUATION OF PADDLE TEST

;****************************************************************************

DONEGREEN
	CALL	CLRDISP
	MOVLW	LOW PAD2TAB
	MOVWF	TABADDR
	MOVLW	HIGH PAD2TAB
	MOVWF	PGE
	CALL	TVUPD		;GREEN PADDLE DISPLAY

	MOVLW	00
	MOVWF	PADREG		;PADDLE POS REGISTER
	
	BCF	JOYDIR		;UP COUNT
	BSF	E1ENA		;ON P2 STICK CONTROLLER
	BCF	E2ENA		;BE SURE P1 IS OFF!
	
BLUP	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM

	INCF	PADREG,1	;INCREMENT PADDLE REG
	
	MOVLW	100
        SUBWF   PADREG,0        ;CHECK FOR UPPER CONTROL RANGE CHARACTERS
        BTFSC   STATUS,0        ;CHECK CARRY BIT
        GOTO    DOWNBLUE	;OVERFLOWED...
	
	CALL	JOYCLOCK	;PULSE ONCE TO STICK CONTROL	
	BCF	JTZERO		;RESET FLAG BIT
	BSF	JTON		;TURN ON CLOCK
JTBTA	BTFSS	JTZERO
	GOTO	JTBTA		;WAIT FOR TIMEOUT
	GOTO	BLUP		;DO IT AGAIN

DOWNBLUE	
	BSF	JOYDIR		;DOWN JOYSTICK DIR

BLDN	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM

	DECF	PADREG,1	;DECREMENT PADDLE REG
	
	MOVLW	0xFF
        SUBWF   PADREG,0        ;CHECK FOR UPPER CONTROL RANGE CHARACTERS
        BTFSC   STATUS,0        ;CHECK CARRY BIT
        GOTO    DONEBLUE

	CALL	JOYCLOCK	;PULSE ONCE TO STICK CONTROL	
	BCF	JTZERO		;RESET FLAG BIT
	BSF	JTON		;TURN ON CLOCK
JTBTAD	BTFSS	JTZERO
	GOTO	JTBTAD		;WAIT FOR TIMEOUT
	GOTO	BLDN		;DO IT AGAIN

;*****************************************************************************
;*****************************************************************************

;DATA TABLES 

;****************************************************************************
;****************************************************************************

PL1PMPT	RETLW	PL1PMPTEND-PL1PMPT-1
	RETLW	0x93
	RETLW	0xA0
	RETLW	"P"
	RETLW	"R"
	RETLW	"E"
	RETLW	"S"
	RETLW	"S"
	RETLW	" "
	RETLW	"1"
	RETLW	" "
	RETLW	"P"
	RETLW	"L"
	RETLW	"A"
	RETLW	"Y"
	RETLW	"E"
	RETLW	"R"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"A"
	RETLW	"R"
	RETLW	"T"
	RETLW	" "
	RETLW	"F"
	RETLW	"O"
	RETLW	"R"
	RETLW	0x94
	RETLW	0xA6
	RETLW	"P"
	RETLW	"R"
	RETLW	"A"
	RETLW	"C"
	RETLW	"T"
	RETLW	"I"
	RETLW	"C"
	RETLW	"E"
	RETLW	" "
	RETLW	"G"
	RETLW	"A"
	RETLW	"M"
	RETLW	"E"

PL1PMPTEND

PL2PMPT	RETLW	PL2PMPTEND-PL2PMPT-1
	RETLW	0x95
	RETLW	0xAC
	RETLW	"O"
	RETLW	"R"
	RETLW	0x96
	RETLW	0xA2
	RETLW	"P"
	RETLW	"R"
	RETLW	"E"
	RETLW	"S"
	RETLW	"S"
	RETLW	" "
	RETLW	"2"
	RETLW	" "
	RETLW	"P"
	RETLW	"L"
	RETLW	"A"
	RETLW	"Y"
	RETLW	"E"
	RETLW	"R"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"A"
	RETLW	"R"
	RETLW	"T"
	RETLW	0x97
	RETLW	0xA7
	RETLW	"T"
	RETLW	"O"
	RETLW	" "
	RETLW	"C"
	RETLW	"O"
	RETLW	"M"
	RETLW	"P"
	RETLW	"E"
	RETLW	"T"
	RETLW	"E"
PL2PMPTEND

SKILLTAB
	RETLW	SKILLTABEND-SKILLTAB-1	;LEN
	RETLW	0x93			;LINE 3
	RETLW	0xA2			;COL 2
	RETLW	0x84			;RED NO BLINK
	RETLW	"U"
	RETLW	"S"
	RETLW	"E"
	RETLW	" "
	RETLW	"P"
	RETLW	"L"
	RETLW	"A"
	RETLW	"Y"
	RETLW	"E"
	RETLW	"R"
	RETLW	" "
	RETLW	"1"
	RETLW	" "
	RETLW	"J"
	RETLW	"O"
	RETLW	"Y"
	RETLW	"S"
	RETLW	"T"
	RETLW	"I"
	RETLW	"C"
	RETLW	"K"
	RETLW	0x94			;LINE 4
	RETLW	0xA8			;COL 8
	RETLW	0x84			;RED NO BLINK
	RETLW	"T"
	RETLW	"O"
	RETLW	" "
	RETLW	"S"
	RETLW	"E"
	RETLW	"L"
	RETLW	"E"
	RETLW	"C"
	RETLW	"T"
	RETLW	0x96			;LINE 6
	RETLW	0xA8			;COL 8
	RETLW	0x87			;WHITE NO BLINK	
	RETLW	"B"
	RETLW	"E"
	RETLW	"G"
	RETLW	"I"
	RETLW	"N"
	RETLW	"N"
	RETLW	"E"
	RETLW	"R"
	RETLW	0x97			;LINE 7
	RETLW	0xA8			;COL 8
	RETLW	0x87			;WHITE NO BLINK
	RETLW	"E"
	RETLW	"X"
	RETLW	"P"
	RETLW	"E"
	RETLW	"R"
	RETLW	"T"
	RETLW	0x99			;LINE 9
	RETLW	0xA7			;COL 0
	RETLW	0x84			;RED NO BLINK
	RETLW	"P"
	RETLW	"R"
	RETLW	"E"
	RETLW	"S"
	RETLW	"S"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"A"
	RETLW	"R"
	RETLW	"T"
SKILLTABEND

HARDTAB	RETLW	HARDTABEND-HARDTAB-1
	RETLW	0x97			;LINE 7
	RETLW	0xA6			;COL 6
	RETLW	0x85			;MAG NO BLINK	
	RETLW	0x3E			;ARROW SYMBOL
	RETLW	0x96			;LINE 6
	RETLW	0xA6			;COL 6
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
HARDTABEND

DBTAB	RETLW	DBTABEND-DBTAB-1	;LEN
	RETLW	0x92			;LINE 6
	RETLW	0xA8			;COL 8
	RETLW	0x87			;WHITE
	RETLW	0x97		;LINE 7
	RETLW	0xA1		;COL 2
	RETLW	"P"
	RETLW	"U"
	RETLW	"S"
	RETLW	"H"
	RETLW	" "
	RETLW	"P"
	RETLW	"1"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"A"
	RETLW	"R"
	RETLW	"T"
	RETLW	" "
	RETLW	"T"
	RETLW	"O"
	RETLW	" "
	RETLW	"E"
	RETLW	"X"
	RETLW	"I"
	RETLW	"T"
DBTABEND

READYTAB	
	RETLW	READYTABEND-READYTAB-1
	RETLW	0x94			;LINE 4
	RETLW	0xA6
	RETLW	0x83			;CYAN
	RETLW	"G"
	RETLW	"A"
	RETLW	"M"
	RETLW	"E"
	RETLW	" "
	RETLW	"O"
	RETLW	"V"
	RETLW	"E"
	RETLW	"R"
	RETLW	" "
	RETLW	"W"
	RETLW	"H"
	RETLW	"E"
	RETLW	"N"
	RETLW	0x96
	RETLW	0xAA
	RETLW	0x84			;RED NO BLINK
	RETLW	"R"
	RETLW	"E"
	RETLW	"A"
	RETLW	"D"
	RETLW	"Y"
	RETLW	0x98
	RETLW	0xA5
	RETLW	0x83	
	RETLW	"S"
	RETLW	"C"
	RETLW	"O"
	RETLW	"R"
	RETLW	"E"
	RETLW	" "
	RETLW	"R"
	RETLW	"E"
	RETLW	"A"
	RETLW	"C"
	RETLW	"H"
	RETLW	"E"
	RETLW	"S"
	RETLW	" "
	RETLW	"1"
	RETLW	"5"
	RETLW	0x87
READYTABEND

	ORG	0x400

TESTAB	RETLW	TESTABEND-TESTAB-1	;LEN #
	RETLW   0xFF            ;RESET COMMAND / TEST MODE
        RETLW   0x74            ;DISPLAY POSITION VERTICAL ADDRESS
        RETLW   0xC6            ;DISPLAY POSITION HORIZONTAL ADDRESS
	RETLW	0xFC		;FORMAT SELECTION
	RETLW	0x91		;LINE 1
	RETLW	0xA8		;COL 8
	RETLW	0x84		;RED
	RETLW	0xD0		;SOLID BACKGROUND
	RETLW	"T"
	RETLW	"E"
	RETLW	"S"
	RETLW	"T"
	RETLW	" "
	RETLW	"M"
	RETLW	"O"
	RETLW	"D"
	RETLW	"E"
	RETLW	0x87		;WHITE
	RETLW	0x93		;LINE 3
	RETLW	0xA9		;COL 2
	RETLW	"S"
	RETLW	"W"
	RETLW	"I"
	RETLW	"T"
	RETLW	"C"
	RETLW	"H"
	RETLW	" "
	RETLW	"T"
	RETLW	"E"
	RETLW	"S"
	RETLW	"T"
	RETLW	0x94		;LINE 4
	RETLW	0xA9		;COL 2
	RETLW	"P"
	RETLW	"A"
	RETLW	"D"
	RETLW	"D"
	RETLW	"L"
	RETLW	"E"
	RETLW	" "
	RETLW	"T"
	RETLW	"E"
	RETLW	"S"
	RETLW	"T"
	RETLW	0x95		;LINE 5
	RETLW	0xA9		;COL 2
	RETLW	"C"
	RETLW	"O"
	RETLW	"L"
	RETLW	"O"
	RETLW	"R"
	RETLW	" "
	RETLW	"B"
	RETLW	"A"
	RETLW	"R"
	RETLW	"S"
	RETLW	0x96		;LINE 6
	RETLW	0xA9		;COL 2
	RETLW	"C"
	RETLW	"R"
	RETLW	"O"
	RETLW	"S"
	RETLW	"S"
	RETLW	" "
	RETLW	"H"
	RETLW	"A"
	RETLW	"T"
	RETLW	"C"
	RETLW	"H"
	RETLW	0x98		;LINE 8
	RETLW	0xA1		;COL 2
	RETLW	"U"
	RETLW	"S"
	RETLW	"E"
	RETLW	" "
	RETLW	"P"
	RETLW	"1"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"I"
	RETLW	"C"
	RETLW	"K"
	RETLW	" "
	RETLW	"T"
	RETLW	"O"
	RETLW	" "
	RETLW	"S"
	RETLW	"E"
	RETLW	"L"
	RETLW	"E"
	RETLW	"C"
	RETLW	"T"
	RETLW	0x99		;LINE 8
	RETLW	0xA1		;COL 2
	RETLW	"P"
	RETLW	"U"
	RETLW	"S"
	RETLW	"H"
	RETLW	" "
	RETLW	"P"
	RETLW	"1"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"A"
	RETLW	"R"
	RETLW	"T"
	RETLW	" "
	RETLW	"T"
	RETLW	"O"
	RETLW	" "
	RETLW	"B"
	RETLW	"E"
	RETLW	"G"
	RETLW	"I"
	RETLW	"N"
TESTABEND

ARROW1TAB	
	RETLW	ARROW1TABEND-ARROW1TAB-1
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	0x3E			;ARROW SYMBOL
	RETLW	0x94			;LINE 4
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
	RETLW	0x96			;LINE 6
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
ARROW1TABEND
ARROW2TAB	
	RETLW	ARROW2TABEND-ARROW2TAB-1
	RETLW	0x94			;LINE 4
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	0x3E			;ARROW SYMBOL
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
	RETLW	0x95			;LINE 5
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
ARROW2TABEND
ARROW3TAB	
	RETLW	ARROW3TABEND-ARROW3TAB-1
	RETLW	0x95			;LINE 5
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	0x3E			;ARROW SYMBOL
	RETLW	0x94			;LINE 4
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
	RETLW	0x96			;LINE 6
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
ARROW3TABEND
ARROW4TAB	
	RETLW	ARROW4TABEND-ARROW4TAB-1
	RETLW	0x96			;LINE 4
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	0x3E			;ARROW SYMBOL
	RETLW	0x93			;LINE 1
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
	RETLW	0x95			;LINE 5
	RETLW	0xA7			;COL 7
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
ARROW4TABEND

SWTAB	RETLW	SWTABEND-SWTAB-1	;LEN #
	RETLW	0x91		;LINE 1
	RETLW	0xA8		;COL 8
	RETLW	0x84		;RED
	RETLW	0xD0		;SOLID BACKGROUND
	RETLW	"S"
	RETLW	"W"
	RETLW	"I"
	RETLW	"T"
	RETLW	"C"
	RETLW	"H"
	RETLW	" "
	RETLW	"T"
	RETLW	"E"
	RETLW	"S"
	RETLW	"T"
	RETLW	0x95		;LINE 5
	RETLW	0xA3		;COL 3
	RETLW	0x87		;WHITE
	RETLW	"P"
	RETLW	"R"
	RETLW	"E"
	RETLW	"S"
	RETLW	"S"
	RETLW	" "
	RETLW	"P"
	RETLW	"1"
	RETLW	" "
	RETLW	"A"
	RETLW	"N"
	RETLW	"D"
	RETLW	" "
	RETLW	"P"
	RETLW	"2"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"A"
	RETLW	"R"
	RETLW	"T"
	RETLW	0x96		;LINE 6
	RETLW	0xA9		;COL 9
	RETLW	"T"
	RETLW	"O"
	RETLW	" "
	RETLW	"E"
	RETLW	"X"
	RETLW	"I"
	RETLW	"T"
SWTABEND
PAD2TAB	
	RETLW	PAD2TABEND-PAD2TAB-1
	RETLW	0x92			;LINE 3
	RETLW	0xA8			;COL 8
	RETLW	0x87			;WHITE
	RETLW	"P"
	RETLW	"2"
	RETLW	0x93			;LINE 3
	RETLW	0xA6			;COL 6
	RETLW	0x81			;BLUE
	RETLW	"B"
	RETLW	"L"
	RETLW	"U"
	RETLW	"E"	
PAD2TABEND

P1DOWNTAB	
	RETLW	P1DOWNTABEND-P1DOWNTAB-1
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	"P"
	RETLW	"1"
	RETLW	" "
	RETLW	"D"
	RETLW	"O"
	RETLW	"W"
	RETLW	"N"		
P1DOWNTABEND
P2DOWNTAB	
	RETLW	P2DOWNTABEND-P2DOWNTAB-1
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	"P"
	RETLW	"2"
	RETLW	" "
	RETLW	"D"
	RETLW	"O"
	RETLW	"W"
	RETLW	"N"		
P2DOWNTABEND

;******************************************************************

;HEX TO DECIMAL LOOKUP TABLE

;******************************************************************

	ORG	0x500

DCONVERT
	MOVWF	TEMP		;SAVE IN TEMP REG
	MOVLW	0x64		;CHECK FOR OUT OF RANGE
	SUBWF	TEMP,0
	BTFSC	STATUS,0
	RETLW	00		;DATA IS NO GOOD
DCO	MOVLW	HIGH DCONVERT
	MOVWF	PCHI		;SETUP BRANCH
	MOVF	TEMP,0		;GET DATA
	ADDWF	PCLO,1

	RETLW	0x00
	RETLW	0x01
	RETLW	0x02
	RETLW	0x03
	RETLW	0x04
	RETLW	0x05
	RETLW	0x06
	RETLW	0x07
	RETLW	0x08
	RETLW	0x09
	RETLW	0x10
	RETLW	0x11
	RETLW	0x12
	RETLW	0x13
	RETLW	0x14
	RETLW	0x15
	RETLW	0x16
	RETLW	0x17
	RETLW	0x18
	RETLW	0x19
	RETLW	0x20
	RETLW	0x21
	RETLW	0x22
	RETLW	0x23
	RETLW	0x24
	RETLW	0x25
	RETLW	0x26
	RETLW	0x27
	RETLW	0x28
	RETLW	0x29
	RETLW	0x30
	RETLW	0x31
	RETLW	0x32
	RETLW	0x33
	RETLW	0x34
	RETLW	0x35
	RETLW	0x36
	RETLW	0x37
	RETLW	0x38
	RETLW	0x39
	RETLW	0x40
	RETLW	0x41
	RETLW	0x42
	RETLW	0x43
	RETLW	0x44
	RETLW	0x45
	RETLW	0x46
	RETLW	0x47
	RETLW	0x48
	RETLW	0x49
	RETLW	0x50
	RETLW	0x51
	RETLW	0x52
	RETLW	0x53
	RETLW	0x54
	RETLW	0x55
	RETLW	0x56
	RETLW	0x57
	RETLW	0x58
	RETLW	0x59
	RETLW	0x60
	RETLW	0x61
	RETLW	0x62
	RETLW	0x63
	RETLW	0x64
	RETLW	0x65
	RETLW	0x66
	RETLW	0x67
	RETLW	0x68
	RETLW	0x69
	RETLW	0x70
	RETLW	0x71
	RETLW	0x72
	RETLW	0x73
	RETLW	0x74
	RETLW	0x75
	RETLW	0x76
	RETLW	0x77
	RETLW	0x78
	RETLW	0x79
	RETLW	0x80
	RETLW	0x81
	RETLW	0x82
	RETLW	0x83
	RETLW	0x84
	RETLW	0x85
	RETLW	0x86
	RETLW	0x87
	RETLW	0x88
	RETLW	0x89
	RETLW	0x90
	RETLW	0x91
	RETLW	0x92
	RETLW	0x93
	RETLW	0x94
	RETLW	0x95
	RETLW	0x96
	RETLW	0x97
	RETLW	0x98
	RETLW	0x99	;0x63
NGDATA	RETLW	00

P1UPTAB	
	RETLW	P1UPTABEND-P1UPTAB-1
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	"P"
	RETLW	"1"
	RETLW	" "
	RETLW	"U"
	RETLW	"P"		
P1UPTABEND
P2UPTAB	
	RETLW	P2UPTABEND-P2UPTAB-1
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	"P"
	RETLW	"2"
	RETLW	" "
	RETLW	"U"
	RETLW	"P"		
P2UPTABEND

P1STARTTAB	
	RETLW	P1STARTTABEND-P1STARTTAB-1
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	"P"
	RETLW	"1"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"A"
	RETLW	"R"
	RETLW	"T"		
P1STARTTABEND
P2STARTTAB	
	RETLW	P2STARTTABEND-P2STARTTAB-1
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	"P"
	RETLW	"2"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"A"
	RETLW	"R"
	RETLW	"T"		
P2STARTTABEND
COINTAB	
	RETLW	COINTABEND-COINTAB-1
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	"C"
	RETLW	"O"
	RETLW	"I"
	RETLW	"N"
	RETLW	" "
	RETLW	"S"
	RETLW	"W"
	RETLW	"I"
	RETLW	"T"
	RETLW	"C"
	RETLW	"H"		
COINTABEND
CLRLINETAB	
	RETLW	CLRLINETABEND-CLRLINETAB-1
	RETLW	0x93			;LINE 3
	RETLW	0xA7			;COL 7
	RETLW	" "
	RETLW	" "
	RETLW	" "
	RETLW	" "
	RETLW	" "
	RETLW	" "
	RETLW	" "
	RETLW	" "
	RETLW	" "
	RETLW	" "
	RETLW	" "		
CLRLINETABEND

PAD1TAB	
	RETLW	PAD1TABEND-PAD1TAB-1
	RETLW	0x92			;LINE 3
	RETLW	0xAE			;COL E
	RETLW	0x87			;WHITE
	RETLW	"P"
	RETLW	"1"
	RETLW	0x93			;LINE 3
	RETLW	0xAE			;COL E
	RETLW	0x82			;GREEN
	RETLW	"G"
	RETLW	"R"
	RETLW	"E"
	RETLW	"E"
	RETLW	"N"	
PAD1TABEND

DOTEST2	BTFSC	P1START
	GOTO	DOTEST2
	CALL	INITDISP	;RE-INITIALIZE TVDC
	CALL	CLRDISP		;CLEAR DISPLAY
	
	MOVLW	LOW PADTAB
	MOVWF	TABADDR
	MOVLW	HIGH PADTAB
	MOVWF	PGE
	CALL	TVUPD		;DISPLAY PADDLE TEST TEXT

	BCF	GAMESEL		;SELECT 2 PL GAME

PDWT	BTFSS	P1START
	GOTO	PDWT
PDWTA	BTFSC	P1START
	GOTO	PDWTA

	CALL	CLRDISP		;CLEAR DISPLAY

	BCF	E1ENA
	BCF	E2ENA		;BOTH PADDLES ENABLED

	BSF	JOYDIR		;DOWN COUNTER

JIDNA	CALL	JOYCLOCK	;PULSE CHIPS
	
	DECFSZ	TEMP2,1
	GOTO	JIDNA
	
	MOVLW	LOW PAD1TAB
	MOVWF	TABADDR
	MOVLW	HIGH PAD1TAB
	MOVWF	PGE
	CALL	TVUPD		;GREEN PADDLE DISPLAY

	MOVLW	00
	MOVWF	PADREG		;PADDLE POS REGISTER
	
	BCF	JOYDIR		;UP COUNT
	BCF	E1ENA		;ON P1 STICK CONTROLLER
	BSF	E2ENA		;BE SURE P2 IS OFF!
	
GRUP	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM

	INCF	PADREG,1	;INCREMENT PADDLE REG
	
	MOVLW	100
        SUBWF   PADREG,0        ;CHECK FOR UPPER CONTROL RANGE CHARACTERS
        BTFSC   STATUS,0        ;CHECK CARRY BIT
        GOTO    DOWNGREEN	;OVERFLOWED...
	
	CALL	JOYCLOCK	;PULSE ONCE TO STICK CONTROL	
	BCF	JTZERO		;RESET FLAG BIT
	BSF	JTON		;TURN ON CLOCK
JTWTA	BTFSS	JTZERO
	GOTO	JTWTA		;WAIT FOR TIMEOUT
	GOTO	GRUP		;DO IT AGAIN

DOWNGREEN	
	BSF	JOYDIR		;DOWN JOYSTICK DIR

GRDN	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM

	DECF	PADREG,1	;DECREMENT PADDLE REG
	
	MOVLW	0xFF
        SUBWF   PADREG,0        ;CHECK FOR UPPER CONTROL RANGE CHARACTERS
        BTFSC   STATUS,0        ;CHECK CARRY BIT
        GOTO    DONEGREEN
	
	CALL	JOYCLOCK	;PULSE ONCE TO STICK CONTROL	
	BCF	JTZERO		;RESET FLAG BIT
	BSF	JTON		;TURN ON CLOCK
JTWTAD	BTFSS	JTZERO
	GOTO	JTWTAD		;WAIT FOR TIMEOUT
	GOTO	GRDN		;DO IT AGAIN
	
;****************************************************************************

;INITIALIZE TVDC DATA TABLE

;*****************************************************************************

        ORG     0x600
INITABLE
        RETLW   INITEND-INITABLE-1    ;TABLE LEN NUMBER
        RETLW   0xFF            ;RESET COMMAND / TEST MODE
        RETLW   0x72            ;DISPLAY POSITION VERTICAL ADDRESS
        RETLW   0xC6            ;DISPLAY POSITION HORIZONTAL ADDRESS
        RETLW   0x80            ;SIZE 0 LINE 0
        RETLW   0x81            ;SIZE 0 LINE 1
        RETLW   0x82            ;SIZE 0 LINE 2
        RETLW   0x83            ;SIZE 0 LINE 3
        RETLW   0x84            ;SIZE 0 LINE 4
        RETLW   0x85            ;SIZE 0 LINE 5
        RETLW   0x86            ;SIZE 0 LINE 6
        RETLW   0x87            ;SIZE 0 LINE 7
        RETLW   0x88            ;SIZE 0 LINE 8
        RETLW   0x89            ;SIZE 0 LINE 9
        RETLW   0x8A            ;SIZE 0 LINE 10
        RETLW   0x8B            ;SIZE 0 LINE 11
        
	RETLW   0x40            ;CRAM WORD ADDRESS 00 (0x70) CUSTOM CHAR DATA
        RETLW   0x3C            ;CRAM LINE ADDRESS 00 (0x00) CUSTOM CHAR DATA
        
        RETLW   0x3F		;BIT PATTERN FOR CHAR 0x70
        RETLW   0x3F
        RETLW   0x3F
        RETLW   0x3F
        RETLW   0x3F
        RETLW   0x3F
        RETLW   0x3F
        RETLW   0x3F
        RETLW   0x3F
    
	RETLW   0x50		;BIT PATTERN FOR CHAR 0x71
        RETLW   0x50
        RETLW   0x50
        RETLW   0x50
        RETLW   0x3F
        RETLW   0x50
        RETLW   0x50
        RETLW   0x50
        RETLW   0x50
	
        RETLW   0xFC            ;FORMAT SELECTION
        RETLW   0xC8            ;BLACK FRINGE BACKGROUND
        RETLW   0xE3            ;ASYNC LOAD, SMOOTHING ON, DISPLAY ON
        RETLW   0xEF            ;BLINK RATIO 1:1, OSCILLATOR ON
        RETLW   0x87            ;CHAR BLINK OFF, CHAR COLOR WHITE
        RETLW   0xA0            ;COLUMN 0
        RETLW   0x90            ;LINE 0

INITEND

DOTEST1	BTFSC	P1START
	GOTO	DOTEST1		;WAIT HERE..
	CALL	CLRDISP

	MOVLW	LOW SWTAB
	MOVWF	TABADDR
	MOVLW	HIGH SWTAB
	MOVWF	PGE
	CALL	TVUPD

SWRESCAN
	BTFSC	TESTSW
	GOTO	START		;EXIT TEST	
	BTFSC	P1UP
	GOTO	DP1UP
	
	BTFSC	P1DOWN
	GOTO	DP1DOWN

	BTFSC	P2UP
	GOTO	DP2UP
	
	BTFSC	P2DOWN
	GOTO	DP2DOWN
	
	BTFSC	P1START
	GOTO	DP1START
	
	BTFSC	P2START
	GOTO	DP2START
	
	BTFSC	COINSW
	GOTO	DCOINSW
	
	GOTO	SWRESCAN		;SCAN AGAIN

DP1UP	MOVLW	LOW P1UPTAB
	MOVWF	TABADDR
	MOVLW	HIGH P1UPTAB
	MOVWF	PGE
	CALL	TVUPD
XP1UP	BTFSC	P1UP
	GOTO	XP1UP
	CALL	CLRLINE			;CLEAR SW LINE
	GOTO	SWRESCAN
		
DP1DOWN	MOVLW	LOW P1DOWNTAB
	MOVWF	TABADDR
	MOVLW	HIGH P1DOWNTAB
	MOVWF	PGE
	CALL	TVUPD
XP1DOWN	BTFSC	P1DOWN
	GOTO	XP1DOWN
	CALL	CLRLINE			;CLEAR SW LINE
	GOTO	SWRESCAN	

DP2UP	MOVLW	LOW P2UPTAB
	MOVWF	TABADDR
	MOVLW	HIGH P2UPTAB
	MOVWF	PGE
	CALL	TVUPD
XP2UP	BTFSC	P2UP
	GOTO	XP2UP
	CALL	CLRLINE			;CLEAR SW LINE
	GOTO	SWRESCAN

DP2DOWN	MOVLW	LOW P2DOWNTAB
	MOVWF	TABADDR
	MOVLW	HIGH P2DOWNTAB
	MOVWF	PGE
	CALL	TVUPD
XP2DOWN	BTFSC	P2DOWN
	GOTO	XP2DOWN
	CALL	CLRLINE			;CLEAR SW LINE
	GOTO	SWRESCAN

DP1START
	BTFSC	P2START
	GOTO	XST			;EXIT NOW
	MOVLW	LOW P1STARTTAB
	MOVWF	TABADDR
	MOVLW	HIGH P1STARTTAB
	MOVWF	PGE
	CALL	TVUPD
XP1START
	BTFSC	P2START
	GOTO	XST			;EXIT
	BTFSC	P1START
	GOTO	XP1START
	CALL	CLRLINE			;CLEAR SW LINE
	GOTO	SWRESCAN

DP2START
	BTFSC	P1START
	GOTO	XST			;EXIT NOW
	MOVLW	LOW P2STARTTAB
	MOVWF	TABADDR
	MOVLW	HIGH P2STARTTAB
	MOVWF	PGE
	CALL	TVUPD
XP2START
	BTFSC	P1START
	GOTO	XST			;EXIT NOW
	BTFSC	P2START
	GOTO	XP2START
	CALL	CLRLINE			;CLEAR SW LINE
	GOTO	SWRESCAN

DCOINSW	MOVLW	LOW COINTAB
	MOVWF	TABADDR
	MOVLW	HIGH COINTAB
	MOVWF	PGE
	CALL	TVUPD
XCOIN	BTFSC	COINSW
	GOTO	XCOIN
	CALL	CLRLINE			;CLEAR SW LINE
	GOTO	SWRESCAN

CLRLINE	MOVLW	LOW CLRLINETAB
	MOVWF	TABADDR
	MOVLW	HIGH CLRLINETAB
	MOVWF	PGE
	CALL	TVUPD
	RETURN

XST	BTFSS	P1START
	GOTO	P1XXT
	BTFSS	P2START
	GOTO	P2XXT
	GOTO	XST
P1XXT	BTFSC	P2START
	GOTO	P1XXT
	GOTO	SERVMODE
P2XXT	BTFSC	P1START
	GOTO	P2XXT
	GOTO	SERVMODE

PADTAB	
	RETLW	PADTABEND-PADTAB-1
	RETLW	0x92			;LINE 2
	RETLW	0xA7			;COL 7
	RETLW	0x84			;RED
	RETLW	"P"
	RETLW	"A"
	RETLW	"D"
	RETLW	"D"
	RETLW	"L"
	RETLW	"E"
	RETLW	" "
	RETLW	"T"
	RETLW	"E"
	RETLW	"S"
	RETLW	"T"
	RETLW	0x94			;LINE 4
	RETLW	0xA2			;COL 7
	RETLW	0x87			;WHITE
	RETLW	"E"
	RETLW	"A"
	RETLW	"C"
	RETLW	"H"
	RETLW	" "
	RETLW	"P"
	RETLW	"A"
	RETLW	"D"
	RETLW	"D"
	RETLW	"L"
	RETLW	"E"
	RETLW	" "
	RETLW	"W"
	RETLW	"I"
	RETLW	"L"
	RETLW	"L"
	RETLW	" "
	RETLW	"M"
	RETLW	"O"
	RETLW	"V"
	RETLW	"E"
	RETLW	0x95			;LINE 5
	RETLW	0xA7			;COL 7
	RETLW	"U"
	RETLW	"P"
	RETLW	" "
	RETLW	"A"
	RETLW	"N"
	RETLW	"D"
	RETLW	" "
	RETLW	"D"
	RETLW	"O"
	RETLW	"W"
	RETLW	"N"
	RETLW	0x97		;LINE 7
	RETLW	0xA1		;COL 2
	RETLW	"P"
	RETLW	"U"
	RETLW	"S"
	RETLW	"H"
	RETLW	" "
	RETLW	"P"
	RETLW	"1"
	RETLW	" "
	RETLW	"S"
	RETLW	"T"
	RETLW	"A"
	RETLW	"R"
	RETLW	"T"
	RETLW	" "
	RETLW	"T"
	RETLW	"O"
	RETLW	" "
	RETLW	"B"
	RETLW	"E"
	RETLW	"G"
	RETLW	"I"
	RETLW	"N"
PADTABEND		

EASYTAB	RETLW	EASYTABEND-EASYTAB-1
	RETLW	0x96			;LINE 6
	RETLW	0xA6			;COL 6
	RETLW	0x85			;MAG NO BLINK	
	RETLW	0x3E			;ARROW SYMBOL
	RETLW	0x97			;LINE 7
	RETLW	0xA6			;COL 6
	RETLW	0x85			;MAG NO BLINK	
	RETLW	" "			;SPACE
EASYTABEND

GAMOVTAB	
	RETLW	GAMOVTABEND-GAMOVTAB-1
	RETLW	0x96
	RETLW	0xA8
	RETLW	0x8C
	RETLW	"G"
	RETLW	"A"
	RETLW	"M"
	RETLW	"E"
	RETLW	" "
	RETLW	"O"
	RETLW	"V"
	RETLW	"E"
	RETLW	"R"
	RETLW	0x87
GAMOVTABEND

;*****************************************************************************

;ASCII TO NEC CONVERSION TABLE

;*****************************************************************************

        ORG     0x700

ASCTAB  RETLW   16      ;20
        RETLW   16      ;21
        RETLW   16      ;22
        RETLW   16      ;23
        RETLW   0x76    ;24
        RETLW   16      ;25
        RETLW   16      ;26
        RETLW   16      ;27
        RETLW   16      ;28
        RETLW   16      ;29
        RETLW   16      ;2A
        RETLW   16      ;2B
        RETLW   15      ;2C
        RETLW   13      ;2D
        RETLW   14      ;2E
        RETLW   0x6D    ;2F
        RETLW   00      ;30
        RETLW   01      ;31
        RETLW   02      ;32
        RETLW   03      ;33
        RETLW   04      ;34
        RETLW   05      ;35
        RETLW   06      ;36
        RETLW   07      ;37
        RETLW   08      ;38
        RETLW   09      ;39
        RETLW   10      ;3A
        RETLW   0x70    ;3B
        RETLW   0x50    ;3C
        RETLW   16      ;3D
        RETLW   0x3B    ;3E
        RETLW   0x3F    ;3F
        RETLW   0x40    ;40
        RETLW   17      ;41
        RETLW   18      ;42
        RETLW   19      ;43
        RETLW   20      ;44
        RETLW   21      ;45
        RETLW   22      ;46
        RETLW   23      ;47
        RETLW   24      ;48
        RETLW   25      ;49
        RETLW   26      ;4A
        RETLW   27      ;4B
        RETLW   28      ;4C
        RETLW   29      ;4D
        RETLW   30      ;4E
        RETLW   00      ;4F
        RETLW   32      ;50
        RETLW   33      ;51
        RETLW   34      ;52
        RETLW   35      ;53
        RETLW   36      ;54
        RETLW   37      ;55
        RETLW   38      ;56
        RETLW   39      ;57
        RETLW   40      ;58
        RETLW   41      ;59
        RETLW   42      ;5A
        RETLW   0x0B    ;5B
        RETLW   0x6D    ;5C
        RETLW   0x0C    ;5D
        RETLW   0x3D    ;5E
        RETLW   0x38    ;5F
        RETLW   15      ;60
        RETLW   81      ;61
        RETLW   82      ;62
        RETLW   83      ;63
        RETLW   84      ;64
        RETLW   85      ;65
        RETLW   86      ;66
        RETLW   87      ;67
        RETLW   88      ;68
        RETLW   89      ;69
        RETLW   90      ;6A
        RETLW   91      ;6B
        RETLW   92      ;6C
        RETLW   93      ;6D
        RETLW   94      ;6E
        RETLW   95      ;6F
        RETLW   96      ;70
        RETLW   97      ;71
        RETLW   98      ;72
        RETLW   99      ;73
        RETLW   100     ;74
        RETLW   101     ;75
        RETLW   102     ;76
        RETLW   103     ;77
        RETLW   104     ;78
        RETLW   105     ;79
        RETLW   106     ;7A
        RETLW   16      ;7B
        RETLW   16      ;7C
        RETLW   16      ;7D
        RETLW   16      ;7E
        RETLW   16      ;7F

;*****************************************************************************

;SERVICE MODE ROUTINE

;*****************************************************************************

SERVMODE	
	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM
	CLRF	TCELLCTR	;SELECTION COUNTER
	CALL	CLRDISP		;CLEAR DISPLAY
	BSF	SERVE		;OFF SERVES
	BCF	P1JOYENA
	BCF	P2JOYENA	;OFF STICKS
	BSF	E1ENA
	BSF	E2ENA		;NO STICK CHIPS
	MOVLW	LOW TESTAB
	MOVWF	TABADDR
	MOVLW	HIGH TESTAB
	MOVWF	PGE
	CALL	TVUPD		;TEST SCREEN ON TV

TEST1A	BTFSC	P1UP
	GOTO	TEST1A
TEST1	BTFSC	P1DOWN
	GOTO	TEST1		;DEBOUNCE
	MOVLW	01
	MOVWF	TCELLCTR	;SELECTION 1
	CALL	ARROW1		;ARROW ON LINE 1
	
T1	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM
	BTFSC	P1START
	GOTO	DOTEST1
	
	BTFSC	P1DOWN
	GOTO	TEST2

	BTFSC	P1UP
	GOTO	TEST4A		;BACK UP...
	GOTO	T1

TEST2A	BTFSC	P1UP
	GOTO	TEST2A
TEST2	BTFSC	P1DOWN
	GOTO	TEST2		;DEBOUNCE
	MOVLW	02
	MOVWF	TCELLCTR	;SELECTION 1
	CALL	ARROW2		;ARROW ON LINE 1
	
T2	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM
	BTFSC	P1START
	GOTO	DOTEST2
	
	BTFSC	P1DOWN
	GOTO	TEST3
	
	BTFSC	P1UP
	GOTO	TEST1A		;BACK UP...
	GOTO	T2

TEST3A	BTFSC	P1UP
	GOTO	TEST3A
TEST3	BTFSC	P1DOWN
	GOTO	TEST3		;DEBOUNCE
	MOVLW	03
	MOVWF	TCELLCTR	;SELECTION 1
	CALL	ARROW3		;ARROW ON LINE 1
	
T3	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM
	BTFSC	P1START
	GOTO	DOTEST3
	
	BTFSC	P1DOWN
	GOTO	TEST4
	
	BTFSC	P1UP
	GOTO	TEST2A		;BACK UP...
	GOTO	T3

TEST4A	BTFSC	P1UP
	GOTO	TEST4A
TEST4	BTFSC	P1DOWN
	GOTO	TEST4		;DEBOUNCE
	MOVLW	04
	MOVWF	TCELLCTR	;SELECTION 1
	CALL	ARROW4		;ARROW ON LINE 1
	
T4	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM
	BTFSC	P1START
	GOTO	DOTEST3		;SAME AS TEST 3, DIFF CHAR
	
	BTFSC	P1DOWN
	GOTO	TEST1
	
	BTFSC	P1UP
	GOTO	TEST3A		;BACK UP...
	GOTO	T4

DOTEST3	BTFSC	P1START
	GOTO	DOTEST3		;WAIT HERE..
	CALL	CLRDISP
	MOVLW	0x90
	MOVWF	DATAREG
	CALL	SEROUT
	MOVLW	0xA0
	MOVWF	DATAREG
	CALL	SEROUT		;POSITION FOR FIRST OUTPUT

	MOVLW	03
	MOVWF	SERVREG1	;FIRST LOOP
	MOVLW	08
	MOVWF	SERVREG2	;SECOND LOOP
	MOVLW	12
	MOVWF	SERVREG3	;THIRD LOOP

COUT1	MOVLW	0x88
	BTFSC	TCELLCTR,2	;TEST OPTION?
	GOTO	OUTCHAR
	MOVLW	0x80
	IORWF	SERVREG2,0
OUTCHAR	MOVWF	DATAREG
	DECF	DATAREG,1	;PREPARE COLOR

	CALL	SEROUT		;SEND TO TVDC
	
	MOVLW	0x70		;SOLID CHARACTER
	BTFSC	TCELLCTR,2	;TEST 4?
	MOVLW	0x71	
	MOVWF	DATAREG
	CALL	SEROUT		;DO THREE TIMES...

	DECFSZ	SERVREG1,1
	GOTO	COUT1
	
	MOVLW	03
	MOVWF	SERVREG1	;RESTORE 3 COUNTER

	DECFSZ	SERVREG2,1	;CHANGE COLOR, REPEAT 8 TIMES
	GOTO	COUT1
	
	MOVLW	08
	MOVWF	SERVREG2	;RESTORE, END LINE

	DECFSZ	SERVREG3,1	;12 LINES
	GOTO	COUT1

T3W	BTFSC	TESTSW		;TEST SWITCH IS STILL ON
	GOTO	START		;RE-INITIALIZE SYSTEM
	BTFSS	P1START
	GOTO	T3W
T3WA	BTFSC	P1START
	GOTO	T3WA
	GOTO	SERVMODE	;EXIT FOR NOW...

DONEBLUE	
	CALL	CLRDISP
	MOVLW	LOW DBTAB
	MOVWF	TABADDR
	MOVLW	HIGH DBTAB
	MOVWF	PGE
	CALL	TVUPD	
	
DBWT	BTFSS	P1START
	GOTO	DBWT
DBWTA	BTFSC	P1START
	GOTO	DBWTA

	GOTO	SERVMODE	;RETURN TO SERVICE SCREEN

FREETAB	RETLW	FREETABEND-FREETAB-1
	RETLW	0x9B		;LINE 12
	RETLW	0xA0		;COLUMN 1
	RETLW	0x84		;RED NO BLINK
	RETLW	"F"
	RETLW	"R"
	RETLW	"E"
	RETLW	"E"
	RETLW	" "
	RETLW	"P"
	RETLW	"L"
	RETLW	"A"
	RETLW	"Y"
	RETLW	0x87		;WHITE
FREETABEND

CREDTAB	RETLW	CREDTABEND-CREDTAB-1
	RETLW	0x9B		;LINE 12
	RETLW	0xA0		;COLUMN 1
	RETLW	"C"
	RETLW	"R"
	RETLW	"E"
	RETLW	"D"
	RETLW	"I"
	RETLW	"T"
	RETLW	" "
	
CREDTABEND

        END




