;
;                Ian Graf (port)
;               (ian_graf@geocities.com)
;               Florent Dhordain (original)
;               (flo.dh@usa.net)
;               Ahmed El-Helw (original)
;               (ahmedre@bellsouth.net)
; Version:      1.5
; Platform:     ION
; Date:         11/3/99
;---------------------------------------


#define ballx           saferam1        ; 1 byte  - ball x coord
#define bally           ballx+1         ; 1 byte  - ball y coord
#define blockcnt        bally+1         ; 1 byte  - num blocks
#define score           blockcnt+1      ; 2 bytes - score
#define tmpx            score+2         ; 1 byte  - temp x coord


;---------------= header =--------------
#include	"ti83plus.inc"			;General TI-83 Plus include file
#include	"mirage.inc"			;MirageOS include file
	.org	$9d93				;Origin (set back two to account for AsmPrgm)
	.db	$BB,$6D				;Compiled AsmPrgm token
	ret					;So TIOS wont run the program
	.db	1				;Identifier as MirageOS program
        .db     %11111111,%11100111             ;15x15 button
	.db	%00000000,%00000000
        .db     %11110011,%00111111
	.db	%00000000,%00000000
        .db     %10011101,%10111001
	.db	%00000000,%00000000
        .db     %11111001,%10011111
	.db	%00000000,%00000000
        .db     %11110011,%10111011
	.db	%00000000,%00000000
        .db     %11011101,%10110101
	.db	%00000000,%00000000
        .db     %10010011,%11101111
	.db	%00000000,%00000000
        .db     %10111011,%11111001
        .db     "Fall Down",0              
					;Program code starts here
start:
        bcall(_clrLCDfull)               
        ld      de,4*256+0              ;
        ld      (currow),de             ;
        ld      hl,titlestr             ;
        bcall(_puts)                    ;
        ld      bc,0*256+55             ; draw line
        ld      de,94*256+55            ;
        bcall(_darkline)                ;
        ld      de,10*256+1             ; write "By AE, FD, and IG"
        ld      (pencol),de             ;
        ld      hl,authorstr            ;
        bcall(_vputs)                   ;
        ld      de,22*256+4             ; write "2nd - Start"
        ld      (pencol),de             ;
        bcall(_vputs)                   ;
        ld      de,29*256+4             ; write "ALPHA - Speed:"
        ld      (pencol),de             ;
        bcall(_vputs)                   ;
        ld      de,36*256+4             ; write "CLEAR - Exit:"
        ld      (pencol),de             ;
        bcall(_vputs)                   ;
        ld      de,55*256+1             ; write "High: "
        ld      (pencol),de             ;
        bcall(_vputs)                   ;
        ld      hl,(high)               ;
        bcall(_setxxxxop2)              ; write high score
        bcall(_op2toop1)                ;
        ld      a,5                     ;
        bcall(_dispop1a)                ;
updatm: ld      de,29*256+53            ; write speed
        ld      (pencol),de             ;
        ld      a,(speed)               ;
        bcall(_setxxop1)                ;
        bcall(_dispop1a)                ;
menul:  bcall(_getcsc)                    ;
        cp      15                      ; [CLEAR]
        ret     z                       ; quit
        cp      48                      ; [ALPHA]
        jr      nz,nchngs               ;
        ld      hl,speed                ; change num players
        ld      a,(hl)                  ;
        xor     %00000011               ;
        ld      (hl),a                  ;
        jr      updatm                  ;
nchngs: cp      54                      ; [2nd]
        jr      nz,menul                ;
        bcall(_grbufclr)               ;
        ld      hl,0                    ; reset score
        ld      (score),hl              ;
        ld      hl,ballx                ;
        ld      (hl),44                 ; ballx = 44
        inc     hl                      ;
        ld      (hl),0                  ; bally = 0
init:   call    randomblocks            ;
        ld      hl,(score)              ;
        add     hl,hl                   ; hl = score*2
        ld      a,24                    ;
        sub     h                       ;
        ld      b,a                     ;
sloop:  ld      a,b                     ;
        ld      (blockcnt),a            ;
        call    scroll                  ;
        call    checkcoll               ; check collisions
        call    putball                 ; draw ball
        call    iFastCopy             ;
        call    putball                 ; clear ball
        ei                              ;
        ld      a,(speed)               ;
        ld      b,a                     ;
delay:  halt                            ;
        djnz    delay                   ;
        ld      a,$FF                   ;
        out     (1),a                   ;
        ld      a,$FE                   ;
        out     (1),a                   ;
        in      a,(1)                   ;
        bit     1,a                     ; [(left)]
        jr      z,moveleft              ;
        bit     2,a                     ; [(right)]
        jr      z,moveright             ; 
donemv: bcall(_getcsc)                    ;
        cp      15                      ; [CLEAR]
        jp      z,exit                  ;
        cp      55                      ; [MODE]
        jr      nz,npause               ;
        ld      a,1                     ; turn off calc
        out     (3),a                   ;
        ei                              ;
        halt                            ;
npause: ld      a,(blockcnt)            ;
        ld      b,a                     ;
        djnz    sloop                   ;
        jr      init                    ;

moveleft:
        ld      a,(ballx)               ;
        sub     2                       ;
        jr      c,donemv                ; offscreen
        ld      (tmpx),a                ;
        jr      xcheck                  ;

moveright:
        ld      a,(ballx)               ;
        add     a,2                     ;
        cp      96-4                    ;
        jr      nc,donemv               ; offscreen
        ld      (tmpx),a                ;
        add     a,5                     ; check right side
xcheck: ld      hl,bally                ;
        ld      e,(hl)                  ;
        call    iGetPix             ;
        ld      a,(hl)                  ;
        or      a                       ;
        jr      nz,donemv               ; something in way
        ld      de,5*12                 ;
        add     hl,de                   ; something in way
        ld      a,(hl)                  ;
        or      a                       ;
        jr      nz,donemv               ;
        ld      a,(tmpx)                ;
        ld      (ballx),a               ; move ball
        jr      donemv                  ;


randomblocks:
        ld      b,12                    ; 12 blocks
        ld      hl,gbuf+(60*12)        ;
rloop1: push    bc                      ;
        push    hl                      ;
        ld      b,4                     ;
        call    iRandom               ; one luck on 5 to have a hole
        pop     hl                      ;
        or      a                       ;
        jr      z,rloop3                ; skip space
        ld      ix,block                ;
        ld      de,12                   ;
        ld      b,4                     ; 4 lines
        push    hl                      ;
rloop2: ld      a,(ix)                  ;
        ld      (hl),a                  ;
        inc     ix                      ;
        add     hl,de                   ;
        djnz    rloop2                  ;
        pop     hl                      ;
rloop3: inc     hl                      ;
        pop     bc                      ;
        djnz    rloop1                  ;
        ld      hl,gbuf+(60*12)        ;
        ld      b,12                    ;
        xor     a                       ;
rloop4: ld      c,(hl)                  ;
        rrc     c                       ;
        adc     a,0                     ;
        djnz    rloop4                  ;
        cp      12                      ; less than 12 bricks
        ret     c                       ;
        ld      b,12                    ;
        call    iRandom               ; put random space
        ld      hl,gbuf+(60*12)        ;
        ld      d,0                     ;
        ld      e,a                     ;
        add     hl,de                   ;
        ld      b,4                     ;
        ld      de,12                   ;
rloop5: ld      (hl),0                  ;
        add     hl,de                   ;
        djnz    rloop5                  ;
        ret                             ;


scroll: ld      hl,gbuf+12             ;
        ld      de,gbuf                ;
        ld      bc,756                  ;
        ldir                            ;
        ld      h,d                     ;
        ld      l,e                     ;
        inc     e                       ;
        ld      (hl),b                  ;
        ld      c,11                    ;
        ldir                            ;
        ret                             ;


checkcoll:
        ld      a,(bally)               ;
        add     a,6                     ;
        ld      e,a                     ;
        ld      a,(ballx)               ;
        call    iGetPix             ; check left
        ld      a,(hl)                  ;
        or      a                       ;
        jr      nz,ndown                ;
        ld      a,(bally)               ;
        add     a,6                     ;
        ld      e,a                     ;
        ld      a,(ballx)               ;
        add     a,5                     ;
        call    iGetPix             ; check right
        ld      a,(hl)                  ;
        or      a                       ;
        jr      nz,ndown                ;
        ld      hl,(score)              ; inc score
        inc     hl                      ;
        ld      (score),hl              ;
        ld      hl,bally                ; move the ball down 
        inc     (hl)                    ;
        ld      a,(hl)                  ;
        cp      60-5                    ;
        ret     c                       ;
        dec     (hl)                    ;
        ret                             ;

ndown:  ld      a,(bally)               ;
        add     a,5                     ;
        ld      e,a                     ;
        ld      a,(ballx)               ;
        call    iGetPix             ; check left
        ld      a,(hl)                  ;
        or      a                       ;
        jr      nz,moveup               ; move up
        ld      a,(bally)               ;
        add     a,5                     ;
        ld      e,a                     ;
        ld      a,(ballx)               ;
        add     a,5                     ;
        call    iGetPix             ; check right
        ld      a,(hl)                  ;
        or      a                       ;
        ret     z                       ;

moveup: ld      hl,bally                ;
        dec     (hl)                    ;
        ld      a,(hl)                  ;
        and     %10000000               ; y<0
        ret     z                       ;
        pop     hl                      ;
exit:   bcall(_clrLCDfull)                  ;
        bcall(_homeup)                  ;
        ld      hl,scorestr             ;
        bcall(_puts)                    ; write "Score: "
        ld      hl,(score)              ;
        bcall(_disphl)                  ;
        ld      hl,(score)              ;
        ld      de,(high)               ;
        bcall(_cphlde)                  ;
        jr      c,exitl                 ;
        ld      (high),hl               ;
        bcall(_newline)                 ;
        ld      hl,highstr              ;
        bcall(_puts)                    ; write "New High!"
exitl:  bcall(_getcsc)                    ;
        cp      54                      ;
        jp      z,start      ;
        jr      exitl                   ;


putball:
        ld      b,6                     ;
        ld      hl,ballx                ;
        ld      a,(hl)                  ;
        inc     hl                      ;
        ld      l,(hl)                  ;
        ld      ix,ball                 ;
        jp      iSprite            ;


titlestr:       .db     "Falldown",0
authorstr:      .db     "By AE, FD, IG",0
startstr:       .db     "2nd - Start",0
playerstr:      .db     "ALPHA - Speed:",0
exitstr:        .db     "CLEAR - Exit",0
hscorestr:      .db     "High: ",0
scorestr:       .db     "Score:",0
highstr:        .db     "New High!",0

high:           .dw     0
speed:          .db     1

block:  .db     %11111111
        .db     %10000001
        .db     %10111111
        .db     %11111111
ball:   .db     %01111000
        .db     %10110100
        .db     %11001100
        .db     %11001100
        .db     %10110100
        .db     %01111000


        .end
