;Cotton Picker v1.0 ported by Brice DUBOST (aka Cebri)
;icq : 46331192
;e-mail : cebri2@netcourrier.com
;date March 12,2k
;-------------------------------------------------------
;Cotton Picker v1.1 
;TI 83+ Mirage OS port by Peter Jedraszczak
;e-mail: pbjiam@hotmail.com
;date August 1 2000
;-------------------------------------------------------

.NOLIST
#define equ .EQU
#define EQU .EQU
#define end .END
#define END .END
.LIST

#DEFINE updown     saferam1
#DEFINE leftright  saferam1+1
#DEFINE score      saferam1+2
#DEFINE time       saferam1+3
#DEFINE youleft    saferam1+4
#DEFINE youup      saferam1+5
#DEFINE anything   saferam1+6
#DEFINE levelscore saferam1+7
#DEFINE level      saferam1+8
#DEFINE timer      saferam1+9

#include	"ti83plus.inc"			;General TI-83 Plus include file
#include	"mirage.inc"			;MirageOS include file
	.org	$9d93				
	.db	$BB,$6D				;Compiled AsmPrgm token
	ret					;So TIOS wont run the program
	.db	1	
button:	
	.db	%00100100,%10011001		;15x15 button
	.db	%10011001,%10100101
	.db	%01111110,%01000010
	.db	%00011000,%01000010
	.db	%00011000,%10100101
	.db	%00100100,%10011001
	.db	%01100110,%01100110
	.db	%00000000,%00000000
	.db	%11111111,%11111111
	.db	%11111111,%11111111
	.db	%00000000,%00000000
	.db	%00000000,%00000000
	.db	%00000000,%00000000
	.db	%00000000,%00000000
	.db	%00000000,%00000000
description:
	.db	"Cotton 1.1",0			;Zero terminated description
					
start:
  set      7,(iy+$14) 
  bcall(_grbufclr)
  ld       ix,titlescreen
  ld       c,12            ;largeur (en byte)
  ld       b,64            ;hauteur
  ld       a,0             ;position en y
  ld       l,0             ;position en x
  call     isprite
  call     ifastcopy
  ld       ix,cotton
  ld       a,28
  ld       b,8
  ld       l,22
  call     isprite
  ld       ix,person
  ld       a,44
  ld       b,8
  ld       l,22
  call     isprite
  ld       ix,cotton
  ld       a,60
  ld       b,8
  ld       l,22
  call     isprite
  call     ifastcopy
  ld	   hl,0
  ld       (currow),hl
  ld       hl,port
  bcall(_puts)
  ld	     hl,5
  ld       (currow),hl
  ld       hl,highscoretext
  bcall(_puts)
  ld	     hl,$B05
  ld       (currow),hl
  ld       hl,(high_score)
  bcall(_dispHL)
  

wait: 
  bcall(_getkey)
  ld       a,0ffh               
  out      (1),a        
  ld       a,0fdh               
  out      (1),a                
  in       a,(1)  
  cp       254
  jp       z,next
  cp       191
  jp       z,quit
  jp       wait
next:
  bcall(_clrLCDFull)
  bcall(_grbufclr)
  xor      a
  ld       hl,$0000
  ld       (score),hl
  ld       (level),a
  ld       (levelscore),hl
  ld       a,8
  ld       (youleft),a
  ld       (youup),a
  jp       new_level 
 
border:
  call     putperson
  xor      a
  ld       (anything),a
horizontal_lines:  
  ld       ix,black
  ld       a,(anything)
  ld       b,8
  ld       l,0
  call     isprite
  ld       ix,black
  ld       a,(anything)
  ld       b,8
  ld       l,56
  call     isprite
  call     ifastcopy
  ld       a,(anything)
  add      a,8
  ld       (anything),a
  cp       96
  jp       z,border_two
  jp       horizontal_lines

border_two:
  ld       a,8
  ld       (anything),a
vertical_lines:
  ld       ix,black
  ld       a,(anything)
  ld       l,a
  ld       b,8
  xor      a
  call     isprite
  ld       ix,black
  ld       a,(anything)
  ld       l,a
  ld       b,8
  ld       a,88
  call     isprite
  call     ifastcopy
  ld       a,(anything)
  add      a,8
  ld       (anything),a
  cp       56
  jp       z,new_cotton
  jp       vertical_lines
  
random:
  ld       b,10
  call     irandom
  inc      a
  ld       b,a
  xor      a
  call     multiply
  ld       (leftright),a
  ld       b,6
  call     irandom
  inc      a
  ld       b,a
  xor      a
  call     multiply
  ld       (updown),a
  call     put_cotton
  ret

new_cotton:
  call     random

get_moves:
  ld       a,(timer)
  dec      a
  ld       (timer),a
  cp       0
  jp       z,time_down_one
  ld       b,5
  call     delay
  ld       a,0ffh               
  out      (1),a        
  ld       a,0feh               
  out      (1),a                
  in       a,(1)
  cp       254
  jp       z,down
  cp       253
  jp       z,left
  cp       251
  jp       z,right
  cp       247
  jp       z,up
  ld       a,0ffh               
  out      (1),a        
  ld       a,0fdh                
  out      (1),a                
  in       a,(1)
  cp       191
  jp       z,abandon
  jp       get_moves

down:  
  ld       a,(youup)
  cp       48
  jp       z,get_moves
  call     putperson
  ld       a,(youup)
  add      a,8
  ld       (youup),a
  call     putperson
  jp       pick_up_check

up:  
  ld       a,(youup)
  cp       8
  jp       z,get_moves
  call     putperson
  ld       a,(youup)
  call     sub_eight
  ld       (youup),a
  call     putperson
  jp       pick_up_check

left:  
  ld       a,(youleft)
  cp       8
  jp       z,get_moves
  call     putperson
  ld       a,(youleft)
  call     sub_eight
  ld       (youleft),a
  call     putperson
  jp       pick_up_check

right:  
  ld       a,(youleft)
  cp       80
  jp       z,get_moves
  call     putperson
  ld       a,(youleft)
  add      a,8
  ld       (youleft),a
  call     putperson  
  jp       pick_up_check

pick_up_check:
  ld       a,(youleft)
  ld       b,a
  ld       a,(leftright)
  cp       b
  jp       nz,get_moves
  ld       a,(youup)
  ld       b,a  
  ld       a,(updown)
  cp       b
  jp       nz,get_moves
  call     put_cotton
  ld       HL,(levelscore)
  inc      HL
  ld       (levelscore),HL
  ld       a,(level)
  ld       b,a
  xor      a
  call     multiply_five
  ld       b,a
  ld       A,(levelscore)
  cp       b
  jp       z,new_level
  jp       new_cotton  

new_level:
  ld       a,(level)
  inc      a
  ld       (level),a
  ld       HL,(score) 
  ld       b,h
  ld       c,l
  ld       hl,(levelscore)
  add      hl, bc
  ld       (score),hl
  ld       hl, $0000
  ld       (levelscore),hl
  bcall(_clrLCDFull)
  bcall(_grbufclr)
  bcall(_homeup)
  ld       hl,new_level_text  
  bcall(_puts)
  ld       hl,$b03
  ld       (currow),hl  
  ld       h,0
  ld       a,(level)
  ld       l,a
  bcall(_dispHL)
  ld       hl,$b04
  ld       (currow),hl  
  ld       HL,(score)
  bcall(_dispHL)
  ld       hl,$b05
  ld       (currow),hl  
  ld       h,0
  ld       a,(level)
  ld       b,a
  xor      a
  call     multiply_five
  ld       l,a
  bcall(_dispHL)
  call     waitforenter
  bcall(_clrLCDFull)
  bcall(_grbufclr)
  ld       a,30
  ld       (time),a
  call     reload_timer
  jp       border

reload_timer:
  ld       a,20
  ld       (timer),a
  ret

time_down_one:
  ld       a,(time)
  dec      a
  ld       (time),a
  cp       0
  jp       z,lose
  call     reload_timer
  jp       get_moves

put_cotton:
  ld       ix,cotton
  ld       a,(updown)
  ld       l,a
  ld       a,(leftright)
  ld       b,8
  call     isprite
  call     ifastcopy
  ret
  
putperson:
  ld       ix,person
  ld       a,(youup)
  ld       l,a
  ld       a,(youleft)
  ld       b,8
  call     isprite
  call     ifastcopy
  ret

blank:
  ld       ix,blank_sprite
  ld       a,(updown)
  ld       l,a
  ld       a,(leftright)
  ld       b,8
  call     isprite
  call     ifastcopy
  ret
  
waitforenter:
  ei
  halt
  halt
  ld       a,0ffh               
  out      (1),a        
  ld       a,0fdh               
  out      (1),a                
  in       a,(1)
  cp       254
  ret      z
  jp       waitforenter

delay:
  ei
  halt
  djnz     delay
  ret  

multiply:
  add      a,8
  djnz     multiply
  ret

multiply_five:
  add      a,5
  djnz     multiply_five
  ret

sub_eight:
  dec      a
  dec      a
  dec      a
  dec      a
  dec      a
  dec      a
  dec      a
  dec      a
  ret

abandon:
  ld       hl,0
  ld       (levelscore),hl
  ld       hl,0
  ld       (score),hl
  jp	     lose

lose:  
  ld       hl,(levelscore)
  ld       d,h
  ld       e,l                          
  ld       hl,(score)
  add      hl,de
  ld       (score),hl

  ld       b,h
  ld       c,l
  ld       hl,(High_Score)
  xor      a
  and      a
  sbc      hl,bc                
  sla      h
  rla

  cp       $01
  jr       nz,Old_Score

  ld       hl,(score)
  ld       (High_Score),hl
  bcall(_homeup)
  ld       hl,high_score_text
  bcall(_puts)
  ld       hl,$b04
  ld       (currow),hl
  ld       hl,(score)
  bcall(_disphl)
  call     waitforenter
  jp       quit

Old_Score:  
  bcall(_homeup)
  ld       hl,game_over_text
  bcall(_puts)
  ld       hl,$b04
  ld       (currow),hl
  ld       hl,(score)
  bcall(_disphl)
  call     waitforenter
  jp       quit

quit:           
  bcall(_clrLCDFUll)
  ret

new_level_text:
.db        "     Cotton     "
.db        "   Picker 1.1   "
.db        "                "
.db        "Level--->       "
.db        "Score--->       "
.db        "Goal --->       "
.db        "Time ---> 30 sec",0

high_score_text:
.db        "   Game Over!   "
.db        "Congratulations!"
.db        "New High Score! "
.db        "                "
.db        "Score--->       ",0

game_over_text:
.db        "   Game Over!   "
.db        "                "
.db        "                "
.db        "                "
.db        "Score--->       ",0

port:
.db		"Mirage OS Port  by:"
.db		"Peter        Jedraszczak",0


highscoretext:
.db        "Highscore:",0

title:
.db        "Cotton Picker v1.1",$00

cotton:
.db        %01100110
.db        %10011001
.db        %10100101
.db        %01000010
.db        %01000010
.db        %10100101
.db        %10011001
.db        %01100110

person
.db        %00111100 
.db        %00100100
.db        %10011001 
.db        %01111110 
.db        %00011000 
.db        %00011000
.db        %00100100 
.db        %01100110

black:

.db        %11111111
.db        %11111111
.db        %11111111
.db        %11111111
.db        %11111111
.db        %11111111
.db        %11111111
.db        %11111111

blank_sprite:
.db        %00000000
.db        %00000000
.db        %00000000
.db        %00000000
.db        %00000000
.db        %00000000
.db        %00000000
.db        %00000000

titlescreen:
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,1,249,129
.db        192,0,0,56,28,51,0,68,0,0,205,128,192,0,0,24,54,97,0,68,0,0,204,0,192,0,0,24,54,96,57
.db        254,231,192,207,156,221,207,157,152,54,96,108,205,179,96,249,180,211,102,141,24,54,96,108,205,179,96,193,176,243,230
.db        13,24,54,96,108,205,179,96,193,176,219,6,13,24,54,49,108,205,179,96,193,180,219,38,6,25,182,30,56,238,231
.db        113,227,217,253,207,6,61,156
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,3,7,128
.db        108,0,0,6,0,0,0,3,0,3,12,192,96,0,24,0,0,0,0,3,60,115,12,14,108,243,220,230,240,0,0
.db        3,102,219,7,155,109,182,25,182,216,0,0,27,102,251,0,223,109,179,153,246,216,0,0,27,102,195,12,216,109,176
.db        217,134,216,0,0,14,60,115,7,142,108,247,140,230,216,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0
.db        0,0,0,1,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,48,0,96,0,0,0,28,60,227,128,0,49,176,0,96,0
.db        0,0,28,102,227,128,0,49,179,158,121,153,206,112,54,96,247,128,0,63,48,219,113,248,108,216,54,60,247,128,0
.db        49,179,219,113,249,236,248,62,6,221,128,0,49,182,219,120,243,108,192,99,102,221,128,0,63,51,219,108,241,236,112
.db        99,60,193,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.db        0,0,0,0,193,128,0,0,0,0,0,0,0,0,12,0,216,0,0,0,0,0,3,143,63,142,14,120,221,156,123
.db        248,0,0,6,217,182,219,12,205,217,134,195,108,0,0,6,25,182,223,12,205,153,158,115,108,0,0,6,217,182,216
.db        12,205,153,182,27,108,0,0,3,143,54,206,102,121,141,158,243,108,0,0,0,0,0,0,0,0,0,0,0,0,0

High_Score:    
.dw        $0000

.end
END




