
;QuadroBall - By Sean Reed
;MirageOS version

;5-8-2000 --- It's about time I get the dumb end game routine to work
;the way i want it!  
;Chopped off some bytes from strings!

#include	"ti83plus.inc"			;Standard TI-83 Plus include file
#include    "mirage.inc"			;Mirage include file

;#define saferam3 appbackupscreen

#define B1X appbackupscreen                ;X Coordinate for Ball1
#define B1Y appbackupscreen+2                   ;Y Coordinate for Ball1
#define Stat appbackupscreen+3                  ;Status Var
#define X appbackupscreen+4                    ;X Coordinate for Arrow
#define Y appbackupscreen+5                       ;Y Coordinate for Arrow
#define X1 appbackupscreen+6                      ;Temp X Coordinate for Arrow
#define X2 appbackupscreen+7                     ;Temp X Coordinate for Ball
#define Y1 appbackupscreen+8                     ;Temp Y Coordinate for Arrow
#define Y2 appbackupscreen+9                     ;Temp Y Coordinate for Ball
#define B2X appbackupscreen+10
#define B2Y appbackupscreen+11
#define x appbackupscreen+12
#define y appbackupscreen+13
#define Stat2 appbackupscreen+14
#define retter appbackupscreen+15
#define Arrow	appbackupscreen+16
#define B3X appbackupscreen+17
#define B3Y appbackupscreen+18
#define B4X appbackupscreen+19
#define B4Y appbackupscreen+20
#define Stat3 appbackupscreen+21
#define Stat4 appbackupscreen+22
#define	Speed1 appbackupscreen+23
#define Speed2 appbackupscreen+24
#define	Speed3 appbackupscreen+25
#define Speed4 appbackupscreen+26
#define ScoreVar appbackupscreen+27
#define	Wall appbackupscreen+28
#define Chng appbackupscreen+29
#define Cheat appbackupscreen+30
#define HS appbackupscreen+31
;#define Q HS+1

	.org    $9d93				;Origin
	.db     $BB,$6D				;Compiled AsmPrgm token
	ret					;Header Byte 1 -- So TIOS wont run
	.db	1				;Header Byte 2 -- Identifies as MirageOS prog
button:						;Button - should be a 15x15 graphic
	.db	%00000000,%00000000
	.db	%00000000,%00000000
	.db	%00000100,%00111000
	.db	%01111110,%01000100
	.db	%01111111,%01000100
	.db %01111110,%01010100
	.db	%00000100,%01001000
	.db	%00000000,%00110100
	.db	%01100000,%00000000
	.db	%01010010,%01001000
	.db	%01100101,%01001000
	.db	%01010111,%01001000
	.db	%01100101,%01101100
	.db	%00000000,%00000000
	.db	%00000000,%00000000
desc:						;Description - zero terminated
	.db	"QuadroBall v1.0",0

start:					;Program code starts here
	bcall(_clrlcdfull)
	bcall(_grbufclr)
	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

	xor	a
	ld	(Cheat),a ;error here
	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	(B1Y),a
	ld	(B3Y),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	(Q),a
	
	bcall(_clrlcdfull)
	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	hl,Score
	call	setvputs
	ld	a,(ScoreVar)
	bcall(_setxxop1)
	ld	a,1
	bcall(_dispop1a)

Loop:	halt
	ld	a,(Chng)
	cp	1
	jp	nz,Loop2

	ld	de,57*256+0
	ld	hl,Score
	call	setvputs
	ld	hl,(ScoreVar)
	bcall(_setxxxxop2)
	bcall(_op2toop1)
	bcall(_dispop1a)
		
	xor	a
	ld	(Chng),a

Loop2:	;ld	a,(Q)
;	cp	1
;	jp	z,Start
	
	call	fastcopys

	ld	a,(Cheat)
	or	a
	jp	nz,LL3

	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)
	or	a
	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)
	or	a
	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)
	or	a
	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)
	or	a
	jp	z,EndGme

;directin	- Direct input routine
;		- Input  a = key group
;		- Output z = no key was pressed
;		-        a = key code

LL3:	ld	a,0FEH
	call	DirectIn
	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
	call	Directin
	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)
	or	a
	jr	nz,GoUp
;Going Down...

	ld	a,(B1Y)
	cp	50
	jp	z,Res2Up
		
	ld	a,(Speed1)
	or	a
	jp	z,Rand1
	
	call	Putz
	
	ld	a,(Speed1)
	ld	b,a
	
	ld	a,(B1Y)
tt1:	inc	a
	djnz	tt1
	ld	(B1Y),a

	call	Putz
	
	jp	B2Check
	
	jp	Loop

GoUp:	ld	a,(B1Y)
	or	a
	jp	z,Res2Down

	ld	a,(Speed1)
	or	a
	jp	z,Rand1

	call	Putz

	ld	a,(Speed1)
	ld	b,a

	ld	a,(B1Y)
tt2:	dec	a
	djnz	tt2
	ld	(B1Y),a

	call	Putz
		
	jp	B2Check
	
Rand1:	ld	b,3
	call	irandom
	ld	(Speed1),a
	jp	B2Check

Res2Up:	ld	a,1
	ld	(Stat),a
	xor	a
	ld	(Speed1),a
	jp	B2Check
Res2Down:
	xor	a
	ld	(Stat),a
	xor	a
	ld	(Speed1),a
	jp	B2Check


B2Check:
	ld	a,(Stat2)
	or	a
	jr	nz,GoUpp
	
	ld	a,(B2Y)
	cp	50
	jp	z,Res3Up

	ld	a,(Speed2)
	or	a
	jp	z,Rand2

	call	Putw
	
	ld	a,(Speed2)
	ld	b,a
	
	ld	a,(B2Y)
tt3:	inc	a
	djnz	tt3
	ld	(B2Y),a
	
	call	Putw

	jp	B3Check

GoUpp:
	ld	a,(B2Y)
	or	a
	jp	z,Res3Down
		
	ld	a,(Speed2)
	or	a
	jp	z,Rand2
	
	call	Putw
	
	ld	a,(Speed2)
	ld	b,a
	
	ld	a,(B2Y)
tt4:	dec	a
	djnz	tt4
	ld	(B2Y),a

	call	Putw
	
	;Check here!
	jp	B3Check
	
Rand2:	ld	b,3
	call	irandom
	ld	(Speed2),a
	jp	B3Check
	
Res3Up:	ld	a,1
	ld	(Stat2),a
	xor	a
	ld	(Speed2),a
	jp	B3Check

Res3Down:
	xor	a
	ld	(Stat2),a
	ld	(Speed2),a
	jp	B3Check

B3Check:
	ld	a,(Stat3)
	or	a
	jr	nz,Uppz

	ld	a,(B3Y)
	cp	50
	jp	z,Res4Up

	ld	a,(Speed3)
	or	a
	jp	z,Rand3
	
	call	Puta
	
	ld	a,(Speed3)
	ld	b,a
	
	ld	a,(B3Y)
tt6:	inc	a
	djnz	tt6
	ld	(B3Y),a
	
	call	Puta
	
	jp	Blah4

Uppz:
	ld	a,(B3Y)
	or	a
	jp	z,Res4Down

	ld	a,(Speed3)
	or	a
	jp	z,Rand3

	call	Puta
	
	ld	a,(Speed3)
	ld	b,a
	
	ld	a,(B3Y)
tt5:	dec	a
	djnz	tt5
	ld	(B3Y),a

	call	Puta
	
	jp	Blah4
	
Rand3:	ld	b,3
	call	irandom
	ld	(Speed3),a
	jp	Blah4

Res4Down:
	xor	a
	ld	(Stat3),a
	ld	(Speed3),a
	jp	Blah4
Res4Up:	ld	a,1
	ld	(Stat3),a
	xor	a
	ld	(Speed3),a
	jp	Blah4
	
Blah4:	ld	a,(Stat4)
	or	a
	jr	nz,Up4
	;down
	ld	a,(B4Y)
	cp	50
	jp	z,Blah4Up
		
	ld	a,(Speed4)
	or	a
	jp	z,Rand4
		
	call	Putb
	
	ld	a,(Speed4)
	ld	b,a
	
	ld	a,(B4Y)
tt7:	inc	a
	djnz	tt7
	ld	(B4Y),a
	
	call	Putb
	
	jp	Loop

Up4:	ld	a,(B4Y)
	or	a
	jp	z,Blah4Down
		
	ld	a,(Speed4)
	or	a
	jp	z,Rand4
		
	call	Putb
	
	ld	a,(Speed4)
	ld	b,a
	
	ld	a,(B4Y)
tt8:	dec	a
	djnz	tt8
	ld	(B4Y),a
	
	call	Putb
	
	jp	Loop
	
Rand4:	ld	b,3
	call	irandom
	ld	(Speed4),a
	jp	Loop
	
Blah4Up:
	ld	a,1
	ld	(Stat4),a
	xor	a
	ld	(Speed4),a
	jp	Loop
Blah4Down:
	xor	a
	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
	xor	a
	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
	call	setvputs
	
	jp	Nokey

MoveLeft:
	ld	a,(X)
	or	a
	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)
	or	a
	jp	z,NoKey
	
	ld	a,(ScoreVar)
	inc	a
	inc	a
	inc	a
	ld	(ScoreVar),a

	ld	hl,Blank
	ld	de,57*256+64
	call	setvputs
	ld	de,57*256+64
	ld	hl,Good
	call	setvputs
	
	xor	a
	ld	(Wall),a
	
	ld	a,1
	ld	(Chng),a

	jp	NoKey
	
GoUp2:	ld	a,(Y)
	or	a
	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	isprite
	ret
	
Putx:	ld	a,(Arrow)
	or	a
	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	isprite
	ret
	
Putz:	ld	a,(B1Y)
	ld	l,a
	ld	a,(B1X)
	ld	b,6
	ld	ix,Ball88
	call	isprite
	ret

Puta:	ld	a,(B3Y)
	ld	l,a
	ld	a,(B3X)
	ld	b,6
	ld	ix,Ball88
	call	isprite
	ret

Putb:	ld	a,(B4Y)
	ld	l,a
	ld	a,(B4X)
	ld	b,6
	ld	ix,Ball88
	call	isprite
	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

	xor	a
	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)
	or	a
	jp	z,NoHigh

	ld	a,(ScoreVar)
	ld	(High),a		
	
	call	Blankit

	ld	a,1
	ld	(HS),a
		
	ld	de,57*256+0
	ld	hl,New
	call	setvputs
	
NoHigh:	
	res	textinverse,(iy+textflags)

	call	putw
	call	putx
	call	puta
	call	putb
	call	putz
	
	ld	de,0*256+12
	ld	hl,Danny
	call	setvputs

	ld	a,(HS)
	or	a
	jp	z,Blank2
	jp	NoBlank

Blank2:
	call	BlankIt

NoBlank:
	
	set	textinverse,(iy+textflags)
	
	ld	de,57*256+43
	ld	hl,HiStr
	call	setvputs
	
	ld	hl,(High)
        bcall(_setxxxxop2)              ; write high score
        bcall(_op2toop1)                ;
        ld      a,5
        bcall(_dispop1a)                ;
        
        call	fastcopys
        
        res	textinverse,(iy+textflags)
        
        ld	hl,0303h
        ld	(currow),hl
        ld	hl,Over
        bcall(_puts)
	
	ld	a,(HS)
	or	a
	jp	nz,SecL
	
	
        ld	hl,0104h
        ld	(currow),hl
        ld	hl,Not
        bcall(_puts)

	
        
SecL:	bcall(_getcsc)
	cp	54
	jr	nz,SecL
	
        xor	a
        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	hl,skip
	call	setvputs

	jp	NoKey

Skipoff:
	
	xor	a
	ld	(Cheat),a
	
	ld	de,57*256+33
	ld	hl,blank
	call	setvputs

	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	hl,Blank
	call	setvputs
	ld	de,57*256+30
	ld	hl,Blank
	call	setvputs
	ld	de,57*256+60
	ld	hl,Blank
	call	setvputs
	ld	de,57*256+85
	ld	hl,Blank
	call	setvputs
	ret
	
.end
end