;IF YOU WOULD LIKE COMMENTED SOURCE, PLEASE VISIT
;HTTP://TCPA.CALC.ORG/PROGRAMMING
;AND VIEW THE SOURCE FROM THERE

	.nolist
	#include "ion.inc"

#define B1X saferam3                ;X Coordinate for Ball1
#define B1Y B1X+1                   ;Y Coordinate for Ball1
#define Stat B1Y+1                  ;Status Var
#define X Stat+1                    ;X Coordinate for Arrow
#define Y X+1                       ;Y Coordinate for Arrow
#define X1 Y+1                      ;Temp X Coordinate for Arrow
#define X2 X1+1                     ;Temp X Coordinate for Ball
#define Y1 X2+1                     ;Temp Y Coordinate for Arrow
#define Y2 Y1+1                     ;Temp Y Coordinate for Ball
#define B2X Y2+1
#define B2Y B2X+1
#define x B2Y+1
#define y x+1
#define Stat2 y+1
#define retter Stat2+1
#define Arrow	retter+1
#define B3X Arrow+1
#define B3Y B3X+1
#define B4X B3Y+1
#define B4Y B4X+1
#define Stat3 B4Y+1
#define Stat4 Stat3+1
#define	Speed1 Stat4+1
#define Speed2 Speed1+1
#define	Speed3 Speed2+1
#define Speed4 Speed3+1
#define ScoreVar Speed4+1
#define	Wall ScoreVar+1
#define Chng Wall+1
#define Cheat Chng+1
#define HS Cheat+1
;#define Q HS+1

	.list
#ifdef TI83P
	.org	progstart-2
	.db	$BB,$6D
#else
	.org	progstart
#endif
	ret
	jr	nc,start
	.db	"QuadroBall",0
	
start:
	bcall(_clrlcdf)
	bcall(_cleargbuf)
	set	7,(iy+$14)
	
	res	textinverse,(iy+textflags)
	ld	hl,MainMsg
	bcall(_homeup)
	bcall(_puts)
	
Keyz:	bcall(_getcsc)
	cp	0FH
	jp	z,Close
	cp	36h
	jr	nz,Keyz

	ld	a,0
	ld	(Cheat),a
	ld	(Speed1),a
	ld	(Speed2),a
	ld	(Speed3),a
	ld	(Arrow),a

	ld	(X),a

	ld	(Stat),a
	ld	(Stat2),a
	ld	(Stat3),a
	ld	(Stat4),a
	ld	(Wall),a
	ld	(Chng),a
	ld	(ScoreVar),a
	ld	(HS),a
	
	ld	a,76
	ld	(B4X),a
	ld	a,54
	ld	(B3X),a
	ld	a,32
	ld	(B2X),a
	ld	a,50
	ld	(B2Y),a
	ld	(B4Y),a
	ld	a,10
	ld	(B1X),a
	ld	(retter),a
	
	ld	a,25
	ld	(Y),a
	
 	ld	a,0
	ld	(B1Y),a
	ld	(B3Y),a
;	ld	(Q),a
	
	bcall(_clrlcdf)
	call	Putz
	call	Putx
	call	Putw
	call	puta
	call	putb

        ld      bc,0*256+7
        ld      de,95*256+7
	bcall(_darkline)
	
	ld	de,57*256+0
	ld	(pencol),de
	ld	hl,Score
	bcall(_vputs)
	ld	a,(ScoreVar)
	bcall(_setxxop1)
	ld	a,1
	bcall(_dispop1a)

Loop:	ld	a,(Chng)
	cp	1
	jp	nz,Loop2

	ld	de,57*256+0
	ld	(pencol),de
	ld	hl,Score
	bcall(_vputs)
	ld	hl,(ScoreVar)
	bcall(_setxxxxop2)
	bcall(_op2toop1)
	bcall(_dispop1a)
		
	ld	a,0
	ld	(Chng),a

Loop2:	;ld	a,(Q)
;	cp	1
;	jp	z,Start
	
	call	ionfastcopy

	ld	a,(Cheat)
	cp	0
	jp	nz,L3

	ld	a,(X)
	ld	(X1),a
	ld	a,(B1X)
	ld	(X2),a	
	ld	a,(Y)
	ld	(Y1),a
	ld	a,(B1Y)
	ld	(Y2),a

	call	Check

;	ld	a,(Q)
;	cp	1
;	jp	z,Start

	ld	a,(retter)
	cp	0
	jp	z,EndGme

	
;	ld	a,(X)
;	ld	(X1),a
	ld	a,(B2X)
	ld	(X2),a
;	ld	a,(Y)
;	ld	(Y1),a
	ld	a,(B2Y)
	ld	(Y2),a
	
	Call	Check
	
;	ld	a,(Q)
;	cp	1
;	jp	z,Start

	ld	a,(retter)
	cp	0
	jp	z,EndGme

;	ld	a,(X)
;	ld	(X1),a
	ld	a,(B3X)
	ld	(X2),a
;	ld	a,(Y)
;	ld	(Y1),a
	ld	a,(B3Y)
	ld	(Y2),a
	
	Call	Check
	
;	ld	a,(Q)
;	cp	1
;	jp	z,Start

	ld	a,(retter)
	cp	0
	jp	z,EndGme

	ld	a,(B4X)
	ld	(X2),a
	ld	a,(B4Y)
	ld	(Y2),a
	
	call	Check
	
;	ld	a,(Q)
;	cp	1
;	jp	z,Start

	ld	a,(retter)
	cp	0
	jp	z,EndGme

L3:	ld	a,0FFH
	out	(1),a
	ld	a,0FEH
	out	(1),a
	in	a,(1)
	cp	247
	jp	z,GoUp2
	cp	254
	jp	z,GoDown2
	cp	251	;R
	jp	z,MoveRight	
	cp	253
	jp	z,MoveLeft
;	cp %11111100			;Check for Down AND Left.
;	jp z, Down_And_Left
;	cp %11111010			;Check for Down AND Right.
;	jp z, Down_And_Right
;	cp %11110101			;Check for Up AND Left.
;	jp z, Up_And_Left
;	cp %11110011			;Check for Up AND Right.
;	jp z, Up_And_Right
	
	ld	a,0FDH
	out	(1),a
	in	a,(1)
	cp	191	;Cls
	jp	z,EndGme
;	cp	254	;Enter
;	jp	z,EP
	cp	247	;Multiply
	jp	z,Skipoo
	cp	253	;Plus
	jp	z,Skipoff

NoKey:	ld	a,(Stat)
	cp	0
	jr	nz,GoUp
;Going Down...

	ld	a,(B1Y)
	cp	50
	jp	z,Res2Up
		
	ld	a,(Speed1)
	cp	0
	jp	z,Rand1
	
	call	Putz
	
	ld	a,(Speed1)
	ld	b,a
	
	ld	a,(B1Y)
t1:	inc	a
	djnz	t1
	ld	(B1Y),a

	call	Putz
	
	jp	B2Check
	
	jp	Loop

GoUp:	ld	a,(B1Y)
	cp	0
	jp	z,Res2Down

	ld	a,(Speed1)
	cp	0
	jp	z,Rand1

	call	Putz

	ld	a,(Speed1)
	ld	b,a

	ld	a,(B1Y)
t2:	dec	a
	djnz	t2
	ld	(B1Y),a

	call	Putz
		
	jp	B2Check
	
Rand1:	ld	b,3
	call	ionrandom
	ld	(Speed1),a
	jp	B2Check

Res2Up:	ld	a,1
	ld	(Stat),a
	ld	a,0
	ld	(Speed1),a
	jp	B2Check
Res2Down:
	xor	a
	ld	(Stat),a
	ld	a,0
	ld	(Speed1),a
	jp	B2Check


B2Check:
	ld	a,(Stat2)
	cp	0
	jr	nz,GoUpp
	
	ld	a,(B2Y)
	cp	50
	jp	z,Res3Up

	ld	a,(Speed2)
	cp	0
	jp	z,Rand2

	call	Putw
	
	ld	a,(Speed2)
	ld	b,a
	
	ld	a,(B2Y)
t3:	inc	a
	djnz	t3
	ld	(B2Y),a
	
	call	Putw

	jp	B3Check

GoUpp:
	ld	a,(B2Y)
	cp	0
	jp	z,Res3Down
		
	ld	a,(Speed2)
	cp	0
	jp	z,Rand2
	
	call	Putw
	
	ld	a,(Speed2)
	ld	b,a
	
	ld	a,(B2Y)
t4:	dec	a
	djnz	t4
	ld	(B2Y),a

	call	Putw
	
	;Check here!
	jp	B3Check
	
Rand2:	ld	b,3
	call	ionrandom
	ld	(Speed2),a
	jp	B3Check
	
Res3Up:	ld	a,1
	ld	(Stat2),a
	ld	a,0
	ld	(Speed2),a
	jp	B3Check

Res3Down:
	ld	a,0
	ld	(Stat2),a
	ld	a,0
	ld	(Speed2),a
	jp	B3Check

B3Check:
	ld	a,(Stat3)
	cp	0
	jr	nz,Uppz

	ld	a,(B3Y)
	cp	50
	jp	z,Res4Up

	ld	a,(Speed3)
	cp	0
	jp	z,Rand3
	
	call	Puta
	
	ld	a,(Speed3)
	ld	b,a
	
	ld	a,(B3Y)
t6:	inc	a
	djnz	t6
	ld	(B3Y),a
	
	call	Puta
	
	jp	Blah4

Uppz:
	ld	a,(B3Y)
	cp	0
	jp	z,Res4Down

	ld	a,(Speed3)
	cp	0
	jp	z,Rand3

	call	Puta
	
	ld	a,(Speed3)
	ld	b,a
	
	ld	a,(B3Y)
t5:	dec	a
	djnz	t5
	ld	(B3Y),a

	call	Puta
	
	jp	Blah4
	
Rand3:	ld	b,3
	call	ionrandom
	ld	(Speed3),a
	jp	Blah4

Res4Down:
	ld	a,0
	ld	(Stat3),a
	ld	(Speed3),a
	jp	Blah4
Res4Up:	ld	a,1
	ld	(Stat3),a
	ld	a,0
	ld	(Speed3),a
	jp	Blah4
	
Blah4:	ld	a,(Stat4)
	cp	0
	jr	nz,Up4
	;down
	ld	a,(B4Y)
	cp	50
	jp	z,Blah4Up
		
	ld	a,(Speed4)
	cp	0
	jp	z,Rand4
		
	call	Putb
	
	ld	a,(Speed4)
	ld	b,a
	
	ld	a,(B4Y)
t7:	inc	a
	djnz	t7
	ld	(B4Y),a
	
	call	Putb
	
	jp	Loop

Up4:	ld	a,(B4Y)
	cp	0
	jp	z,Blah4Down
		
	ld	a,(Speed4)
	cp	0
	jp	z,Rand4
		
	call	Putb
	
	ld	a,(Speed4)
	ld	b,a
	
	ld	a,(B4Y)
t8:	dec	a
	djnz	t8
	ld	(B4Y),a
	
	call	Putb
	
	jp	Loop
	
Rand4:	ld	b,3
	call	ionrandom
	ld	(Speed4),a
	jp	Loop
	
Blah4Up:
	ld	a,1
	ld	(Stat4),a
	ld	a,0
	ld	(Speed4),a
	jp	Loop
Blah4Down:
	ld	a,0
	ld	(Stat4),a
	ld	(Speed4),a
	jp	Loop
		
;Up_And_Left:
;
;	ld	a,(Y)
;	cp	0
;	jp	z,StillLeft
;	
;	ld	a,(X)
;	cp	0
;	jp	z,StillUp
;		
;StillLeft:
;	ld	a,(X)
;	cp	0
;	jp	nz,Dobe
;	
;	call	ChekWall
;	jp	Nokey
;	
;Dobe:	call	Putx
;	ld	a,1
;	ld	(Arrow),a
;	ld	a,(X)
;	dec	a
;	ld	(X),a
;	call	Putx
;	
;StillUp:
;	ld	a,(Y)
;	cp	0
;	jp	z,Nokey
;	
;	call	Putx
;	ld	a,(Y)
;	dec	a
;	ld	(Y),a
;	call	Putx
;	jp	NoKey
;
MoveRight:
	ld	a,(X)
	cp	88
	jp	z,HitRight

	call	Putx
	ld	a,0
	ld	(Arrow),a
	ld	a,(X)
	inc	a
	ld	(X),a
	call	Putx
	jp	NoKey

HitRight:	
	ld	a,(Wall)
	cp	1
	jp	z,NoKey
	
	ld	a,1
	ld	(Wall),a

	ld	hl,Getbak
	ld	de,57*256+64
	ld	(pencol),de
	bcall(_vputs)
	
	jp	Nokey

MoveLeft:
	ld	a,(X)
	cp	0
	jp	z,ChekWall
	
	call	Putx
	ld	a,1
	ld	(Arrow),a
	ld	a,(X)
	dec	a
	ld	(X),a
	call	Putx
	jp	NoKey

ChekWall:
	ld	a,(Wall)
	cp	0
	jp	z,NoKey
	
	ld	a,(ScoreVar)
	inc	a
	inc	a
	inc	a
	ld	(ScoreVar),a

	ld	hl,Blank
	ld	de,57*256+64
	ld	(pencol),de
	bcall(_vputs)
	ld	de,57*256+64
	ld	(pencol),de
	ld	hl,Good
	bcall(_vputs)

	ld	a,0
	ld	(Wall),a
	
	ld	a,1
	ld	(Chng),a

	jp	NoKey
	
GoUp2:	ld	a,(Y)
	cp	0
	jp	z,Nokey
	
	call	Putx
	ld	a,(Y)
	dec	a
	ld	(Y),a
	call	Putx
	jp	NoKey

GoDown2:
	ld	a,(Y)
	cp	48
	jp	z,NoKey
	
	call	Putx
	ld	a,(Y)
	inc	a
	ld	(Y),a
	call	Putx
	jp	NoKey
;--------------------------------------------

Putw:	ld	a,(B2Y)
	ld	l,a
	ld	a,(B2X)
	ld	b,6
	ld	ix,Ball88
	call	ionputsprite
	ret
	
Putx:	ld	a,(Arrow)
	cp	0
	jp	nz,SetLeft

	ld	ix,Right
	jp	z,blah
SetLeft:
	ld	ix,Left
blah:	ld	a,(Y)
	ld	l,a
	ld	a,(X)
	ld	b,8
	call	ionputsprite
	ret
	
Putz:	ld	a,(B1Y)
	ld	l,a
	ld	a,(B1X)
	ld	b,6
	ld	ix,Ball88
	call	ionputsprite
	ret

Puta:	ld	a,(B3Y)
	ld	l,a
	ld	a,(B3X)
	ld	b,6
	ld	ix,Ball88
	call	ionputsprite
	ret

Putb:	ld	a,(B4Y)
	ld	l,a
	ld	a,(B4X)
	ld	b,6
	ld	ix,Ball88
	call	ionputsprite
	ret

Check:          
	ld a,(X1)	;Front Of Arrow
	add a,8		;/
	ld b,a	
	ld a,(X2)	;Back Of Ball
        cp b      
	ret	nc

	ld a,(X2)	;Front Of Ball
	add a,6		;/
	ld b,a	
	ld a,(X1)	;Back Of Arrow
        cp b    
	ret	nc

	ld a,(Y1)	;Bottom Of Arrow
	add a,7		;/
	ld b,a
	ld a,(Y2)	;Top Of Ball
        cp b      
	ret	nc

	ld a,(Y2)	;Bottom Of Ball
	add a,6		;/
	ld b,a	
	ld a,(Y1)	;Top Of Arrow
        cp b    
	ret	nc

	ld	a,0
	ld	(retter),a
	ret
	
EndGme:	;ld	a,1
;	ld	(Q),a
	
	ld	a,(High)
	ld	b,a
	ld	a,(ScoreVar)
	cp	b
	jp	c,NoHigh

	ld	a,(ScoreVar)
	cp	0
	jp	z,NoHigh

	ld	a,(ScoreVar)
	ld	(High),a		
	
	call	Blankit

	ld	a,1
	ld	(HS),a
		
	ld	de,57*256+0
	ld	(pencol),de
	ld	hl,New
	bcall(_vputs)
	
NoHigh:	
	res	textinverse,(iy+textflags)

	call	putw
	call	putx
	call	puta
	call	putb
	call	putz
	
	ld	de,0*256+12
	ld	(pencol),de
	ld	hl,Danny
	bcall(_vputs)

	ld	a,(HS)
	cp	0
	jp	z,Blank2
	jp	NoBlank

Blank2:
	call	BlankIt

NoBlank:
	
	set	textinverse,(iy+textflags)
	
	ld	de,57*256+43
	ld	(pencol),de
	ld	hl,HiStr
	bcall(_vputs)
	
	ld	hl,(High)
        bcall(_setxxxxop2)              ; write high score
        bcall(_op2toop1)                ;
        ld      a,5
        bcall(_dispop1a)                ;
        
        call	ionfastcopy
        
        res	textinverse,(iy+textflags)
        
        ld	hl,0303h
        ld	(currow),hl
        ld	hl,Over
        bcall(_puts)
	
	ld	a,(HS)
	cp	0
	jp	nz,SecL
	
	
        ld	hl,0104h
        ld	(currow),hl
        ld	hl,Not
        bcall(_puts)

	
        
SecL:	bcall(_getcsc)
	cp	54
	jr	nz,SecL
	
        ld	a,0
        ld	(retter),a
	ld	(Cheat),a

	res	textinverse,(iy+textflags)

;	ld	a,1
;	ld	(Q),a

	jp	Start

        
Skipoo:	ld	a,1
	ld	(Cheat),a

	ld	de,57*256+35
	ld	(pencol),de
	ld	hl,skip
	bcall(_vputs)

	jp	NoKey

Skipoff:
	
	ld	a,0
	ld	(Cheat),a
	
	ld	de,57*256+33
	ld	(pencol),de
	ld	hl,blank
	bcall(_vputs)

	jp	NoKey

        		
Ball88:	.db %01111000
	.db %11111100
	.db %11111100
	.db %11111100
	.db %11111100
	.db %01111000

Right:	.db %00001000
	.db %00001100
	.db %11111110
	.db %11111111
	.db %11111111
	.db %11111110
	.db %00001100
	.db %00001000

Left:	.db %00010000
	.db %00110000
	.db %01111111
	.db %11111111
	.db %11111111
	.db %01111111
	.db %00110000
	.db %00010000

Over:	.db "Game Over!",0

MainMsg:
	.db "   QuadroBall   "
	.db "----------------"
	.db "  By Sean Reed  "
	.db " tcpa.calc.org  "
	.db " smart@calc.org "
	.db "----------------"
	.db " 2ND-Start Game "
	.db "   Clear-Exit",0

Score:	.db "Score: ",0
GetBak:	.db "Get Back!",0
Blank:	.db "                ","              ",0
Good:	.db "Good Job!",0
Skip:	.db "CHEAT",0
HiStr:	.db "   High Score: ",0
New:	.db "      New High!      ",0
Danny:	.db "Thanks:  Danny Wynne",0
Not:	.db "No High Score!",0

High:	.dw	0

Close:	res	textinverse,(iy+textflags)	
	ret

BlankIt:

	set	textinverse,(iy+textflags)
	ld	de,57*256+0
	ld	(pencol),de
	ld	hl,Blank
	bcall(_vputs)
	ld	de,57*256+30
	ld	(pencol),de
	ld	hl,Blank
	bcall(_vputs)
	ld	de,57*256+60
	ld	(pencol),de
	ld	hl,Blank
	bcall(_vputs)
	ld	de,57*256+85
	ld	(pencol),de
	ld	hl,Blank
	bcall(_vputs)
	ret
		
.end
end