;-------------------------------------------------------------------------
;The Ball by Emir Sakic
;saka@hotmail.com
;Examples on sprites and self modifying code
;(c) 2001.
;-------------------------------------------------------------------------

        .nolist
        #include "ion.inc"
        .list

#ifdef TI83P
COORD   .equ    8A3Ah
        .org    progstart-2
        .db     $BB,$6D
#else
COORD   =       STATVARS
        .org    progstart
#endif
        ret
        jr      nc,START 			;jumps to the label START
        .db     "The Ball By Emir Sakic",0	;The title displayed by ION

START:         LD   HL,$0000
               LD   (COORD),HL

               bcall(_GRBUFCLR)

SET_SCREEN1:   LD   HL,PLOTSSCREEN		;sets half LCD black
               LD   DE,PLOTSSCREEN+1
               LD   (HL),$FF
               LD   BC,383
               LDIR

               LD   H,08h
               LD   L,0Ch
	       LD   IX,TEXT
SET_TEXT:
               LD   A,H
               ADD  A,8
               LD   H,A
               PUSH HL
               CALL XORSPR
               POP  HL
               LD   A,1
               CP   (IX)
               JR   NZ,SET_TEXT

               XOR  A
               LD   L,38h
	       LD   IX,CPYRGHT
               CALL XORSPR
               LD   A,08h
               LD   L,38h
	       LD   IX,CPYRGHT+8
               CALL XORSPR
               LD   A,10h
               LD   L,38h
	       LD   IX,CPYRGHT+16
               CALL XORSPR
               LD   A,18h
               LD   L,38h
	       LD   IX,CPYRGHT+24
               CALL XORSPR

               LD   HL,PLOTSSCREEN		;save whole screen as background
               LD   DE,SAVESSCREEN
               LD   BC,768
               LDIR

MAIN_LOOP:     CALL SP_PUT			;put the sprite on (X,Y)
               CALL ionFastCopy			;put the picture on the LCD
               CALL DELAY                       ;delay to slow down the ball
               CALL RESET_SCREEN		;recall the background in PLOTSSCREEN

Go_x:          LD   HL,COORD
               LD   A,(HL)
Bounder_x:
               CP   88
Jump_x:        CALL Z,Ch_to_left

Direction_x:
               INC  (HL)


Go_y:          LD   HL,COORD+1
               LD   A,(HL)
Bounder_y:
               CP   56
Jump_y:        CALL Z,Ch_to_up

Direction_y:
               INC  (HL)

               LD   A,$FF			;reset the keypad
               OUT  ($01),A

               DEC  A				;enable Group 2 (with clear key)
	       DEC  A
               OUT  ($01),A

               IN   A,($01)

               BIT  6,A				;if Clear key pressed (bit #6=0) return
               RET  Z

               JR   MAIN_LOOP

Ch_to_left:					;self modifying code
               XOR  A
	       LD   (Bounder_x+1),A		;now Bounder line gets: CP 0
               LD   DE,Ch_to_right
	       LD   (Jump_x+1),DE		;now gets JP Z,Ch_to_right

	       LD   A,35h			;INC (HL) gets DEC (HL)
	       LD   (Direction_x),A

               RET				;go back to modified code

Ch_to_right:
               LD   A,88
	       LD   (Bounder_x+1),A
               LD   DE,Ch_to_left
	       LD   (Jump_x+1),DE

	       LD   A,34h
	       LD   (Direction_x),A

               RET

Ch_to_up:
               XOR  A
	       LD   (Bounder_y+1),A
               LD   DE,Ch_to_down
	       LD   (Jump_y+1),DE

	       LD   A,35h
	       LD   (Direction_y),A

               RET

Ch_to_down:
               LD   A,56
	       LD   (Bounder_y+1),A
               LD   DE,Ch_to_up
	       LD   (Jump_y+1),DE

	       LD   A,34h
	       LD   (Direction_y),A

               RET

SP_PUT:
               LD   HL,COORD
               LD   A,(HL)
               INC  HL
               LD   L,(HL)
               LD   IX,Pic

;-----> Draw a sprite
; b=size of sprite
; l=yc
; a=xc
; ix holds pointer
XORSPR:
               LD   B,8                         ;size of the sprite
               CALL ionPutSprite
               RET
;------

Reset_Screen:  LD   HL,SAVESSCREEN
               LD   DE,PLOTSSCREEN
               LD   BC,768
               LDIR
               RET

DELAY:         LD   B,20
LOOP1:         PUSH BC
               LD   B,255
LOOP2:         DJNZ LOOP2
               POP  BC
               DJNZ LOOP1
               RET

TEXT:
                .db     %00001000
                .db     %00010000
                .db     %01111110
                .db     %00100000
                .db     %01000000
                .db     %10000000
                .db     %10000000
                .db     %01100000

                .db     %00001000
                .db     %00010000
                .db     %00100000
                .db     %01110000
                .db     %01001000
                .db     %10001000
                .db     %10001000
                .db     %10010000

                .db     %00000000
                .db     %01111000
                .db     %11000100
                .db     %11000100
                .db     %10111000
                .db     %10000000
                .db     %01000100
                .db     %00111000

                .db     %00000000
                .db     %00000000
                .db     %00000000
                .db     %00000000
                .db     %00000000
                .db     %00000000
                .db     %00000000
                .db     %00000000

                .db     %11111100
                .db     %11000110
                .db     %11000010
                .db     %11111100
                .db     %11000010
                .db     %11000010
                .db     %11111110
                .db     %11111110

                .db     %01111100
                .db     %11111110
                .db     %11000110
                .db     %11000110
                .db     %11111110
                .db     %11111110
                .db     %11000110
                .db     %11000110

                .db     %11000000
                .db     %11000000
                .db     %11000000
                .db     %11000000
                .db     %11000000
                .db     %11000010
                .db     %11111110
                .db     %11111110

                .db     %11000000
                .db     %11000000
                .db     %11000000
                .db     %11000000
                .db     %11000000
                .db     %11000010
                .db     %11111110
                .db     %11111110

                .db     %00000001

CPYRGHT:
                .db     %00000000
                .db     %00000000
                .db     %00100000
                .db     %01010000
                .db     %01010101
                .db     %00100110
                .db     %01011000
                .db     %10000000

                .db     %00000000
                .db     %00000000
                .db     %01001000
                .db     %11000100
                .db     %01000100
                .db     %00101000
                .db     %00010000
                .db     %01100000

                .db     %00000000
                .db     %01110011
                .db     %10000101
                .db     %01000101
                .db     %00100111
                .db     %00010101
                .db     %00010101
                .db     %11100101

                .db     %00000000
                .db     %01010011
                .db     %01010101
                .db     %01010101
                .db     %01100111
                .db     %01010101
                .db     %01010101
                .db     %01010101

PIC:           
                .db     %00111100
                .db     %01111110
                .db     %11111111
                .db     %11111111
                .db     %11111111
                .db     %11111111
                .db     %01111110
                .db     %00111100

.end
END