#include	"ti83plus.inc"
#include	"mirage.inc"

#define	maxX	saferam1
#define maxY	saferam1+1
#define	curY	saferam1+2
#define	curX	saferam1+3
#define oldX	saferam1+4
#define oldY	saferam1+5

  .org    $9d93
  .db     $BB,$6D
  ret
  .db	1
button:
	.db %10110001,%00010000
	.db %01010001,%00010000
	.db %10110001,%00010000
	.db %11111111,%11111110
	.db %00011111,%00011010
	.db %00011111,%00010100
	.db %00011111,%00011010
	.db %11111111,%11111110
	.db %00011011,%00010000
	.db %00010101,%00010000
	.db %00011011,%00010000
	.db %11111111,%11111110
	.db %00010001,%10110000
	.db %00010001,%01010000
	.db %00010001,%10110000

name:	.db "Knight Moves DX",0

start:
	ld a,6
	ld (maxY),a
	ld (maxX),a
	ld a,1
	ld (curY),a
	ld (curX),a
	call showgrid
	call ionfastcopy
gridloop:
	bcall(_getcsc)
	cp $36
	jp z,resetpieceset
	cp $04
	jr z,gridup
	cp $03
	jr z,gridright
	cp $02
	jr z,gridleft
	cp $01
	jr z,griddown
	cp $37
	jr nz,gridloop
	ret
griddown:
	ld a,(maxY)
	cp 10
	jr z,gridloop
	inc a
	jr gridyld
gridup:
	ld a,(maxY)
	cp 4
	jr z,gridloop
	dec a
gridyld:
	ld (maxY),a
	jr gridloop-6
gridright:
	ld a,(maxX)
	cp 15
	jr z,gridloop
	inc a
	jr gridxld
gridleft:
	ld a,(maxX)
	cp 4
	jr z,gridloop
	dec a
gridxld:
	ld (maxX),a
	jr gridloop-6
showgrid:
	bcall(_grbufclr)
	ld a,(maxY)
	call multgrida
	ld c,a
	ld b,0
	push bc
sgxloop:
	pop bc
	ld h,b
	ld d,b
	ld e,c
	ld a,b
	add a,6
	ld b,a
	push bc
	ld c,b
	ld a,(maxX)
	inc a
	inc a
	call multgrida
	cp c
	jr z,sgsetupy
	ld l,0
	call fastlineb
	jr sgxloop
sgsetupy:
	pop bc
	ld a,(maxX)
	call multgrida
	ld c,a
	xor a
	ld b,a
	push bc
sgyloop:
	pop bc
	ld l,b
	ld d,c
	ld e,b
	ld a,b
	add a,6
	ld b,a
	push bc
	ld c,b
	ld a,(maxY)
	inc a
	call multgrida
	cp c
	jr nz,sgylp
	pop bc
	ld h,0
	call fastlineb
	jp ionfastcopy
sgylp:
	ld h,0
	call fastlineb
	jr sgyloop
multgrida:
	ld b,a
	add a,a
	add a,b
	add a,a
	ret

checkmove:
	ld a,(curY)
	ld d,a
	ld a,(curX)
	ld e,a
	ld a,(oldY)
	ld h,a
	ld a,(oldX)
	ld l,a
	inc h
	inc h
	inc l
	call cphlde
	jr z,cmok
	inc l
	dec h
	call cphlde
	jr z,cmok
	dec h
	dec h
	call cphlde
	jr z,cmok
	dec h
	dec l
	call cphlde
	jr z,cmok
	dec l
	dec l
	call cphlde
	jr z,cmok
	dec l
	inc h
	call cphlde
	jr z,cmok
	inc h
	inc h
	call cphlde
	jr z,cmok
	inc h
	inc l
	call cphlde
	jr z,cmok
cmnotok:
	call putmouse
	ld a,(oldX)
	ld (curX),a
	ld a,(oldY)
	ld (curY),a
	jr pieceset-6
cmok:
	ld a,(curY)
	dec a
	call multgrida
	inc a
	ld e,a
	ld a,(curX)
	dec a
	call multgrida
	inc a
	call pixeltest
	jr nz,cmnotok
	ld a,(curY)
	ld (oldY),a
	ld a,(curX)
	ld (oldX),a
	call putland
	jr pieceset-3
resetpieceset:
	ld hl,premainloop
	ld (lblchange+1),hl
	call showgrid
	jr pieceset-6
premainloop:
	ld hl,checkmove
	ld (lblchange+1),hl
	ld a,(curY)
	ld (oldY),a
	ld a,(curX)
	ld (oldX),a
	call putland
	jr pieceset
	call putmouse
	call ionfastcopy
pieceset:
	bcall(_getcsc)
	cp $36
lblchange:
	jp z,premainloop
	cp $04
	call z,mouseup
	cp $03
	call z,mouseright
	cp $02
	call z,mouseleft
	cp $01
	call z,mousedown
	cp $0F
	jr z,resetpieceset
	cp $37
	jr nz,pieceset
	ret
mouseright:
	ld a,(maxX)
	ld b,a
	ld a,(curX)
	cp b
	jr z,mouseret
	call putmouse
	ld a,(curX)
	inc a
	ld (curX),a
	jr mouseend
mouseleft:
	ld a,(curX)
	cp 1
	jr z,mouseret
	call putmouse
	ld a,(curX)
	dec a
	ld (curX),a
	jr mouseend
mouseup:
	ld a,(curY)
	cp 1
	jr z,mouseret
	call putmouse
	ld a,(curY)
	dec a
	ld (curY),a
	jr mouseend
mousedown:
	ld a,(maxY)
	ld b,a
	ld a,(curY)
	cp b
	jr z,mouseret
	call putmouse
	ld a,(curY)
	inc a
	ld (curY),a
mouseend:
	call putmouse
	call fastcopy
mouseret:
	xor a
	ret
putland:
	ld ix,landsprite
	jr putthesprite
putmouse:
	ld ix,mousesprite
putthesprite:
	ld a,(curY)
	dec a
	call multgrida
	inc a
	ld l,a
	ld a,(curX)
	dec a
	call multgrida
	ld b,5
	jp ionputsprite
landsprite:
	.db %01010100
mousesprite:
	.db %00101000
	.db %01010100
	.db %00101000
	.db %01010100
	.db %00101000
highscore:	.db 0

.end
end