;-------------= Avalanche =-------------
; Author:       Ian Graf (port)
;               (ian_graf@geocities.com)
;               Harper Maddox (original)
;               (jerky@ebicom.net)
; Version:      1.2
; Platform:     ION
; Date:         11/3/99
;---------------------------------------
;-------------= Avalanche =-------------
;Author:	Peter Jedraszczak (Port)
;		pbjiam@hotmail.com
;		Mirage OS Port
;		August 1 2000
#define manx            saferam1        ;
#define score           manx+1          ;
#define icicles         score+2         ;


;---------------= 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     %10100010,%00001100             ;15x15 button
        .db     %10001000,%01010001
        .db     %00100010,%10000000
        .db     %00010000,%00000000
        .db     %00000000,%00100000
        .db     %00110000,%00000000
        .db     %00110000,%00000000
        .db     %11111111,%11111111
        .db     %11111111,%11111111
	.db	%00000000,%00000000
	.db	%00000000,%00000000
	.db	%00000000,%00000000
	.db	%00000000,%00000000
	.db	%00000000,%00000000
	.db	%00000000,%00000000
        .db     "Avoid the icicles!",0  ;description
start_of_program:  
						
        bcall(_clrLCDfull)                 ;
        ld      de,3*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)               ;
        sbc     hl,hl                   ; reset score
        ld      (score),hl              ;
        ld      a,44                    ; center man
        ld      (manx),a                ;
        ld      b,12                    ; randomize icicles
        ld      hl,icicles              ;
randl:  push    bc                      ;
        ld      b,50                    ;
        call    iRandom               ;
        ld      (hl),a                  ;
        inc     hl                      ;
        pop     bc                      ;
        djnz    randl                   ;
keyl:   bcall(_grbufclr)               ;
        ld      hl,(score)              ; inc score
        inc     hl                      ;
        inc     hl                      ;
        ld      (score),hl              ;
        xor     a                       ;
        ld      hl,icicles              ;
        ld      de,grav                 ;
        ld      b,12                    ;
drawl:  push    bc                      ;
        push    af                      ;
        push    de                      ;
        push    hl                      ;
        ld      d,a                     ; d = x coord
        ld      b,8                     ; b = sprite height
        ld      ix,icicle               ; ix = sprite
        ld      a,(hl)                  ;
        ld      e,a                     ; e = y coord
        cp      25                      ;
        jr      nc,drop                 ;
        ld      b,2                     ; drop 1
        ld      ix,drop1                ;
        ld      e,50                    ;
        jr      draw                    ;
drop:   cp      51                      ;
        jp      nc,chkhit               ;
        ld      b,4                     ; drop 2
        ld      ix,drop2                ;
        ld      e,50                    ;
        jr      draw                    ;
chkhit: cp      96                      ;
        jr      c,draw                  ;
        ld      hl,manx                 ; hl = manx
        ld      a,d                     ;
        add     a,4                     ; a = iciclex + 4
        cp      (hl)                    ; manx > iciclex + 4
        jr      c,draw                  ;
        ld      a,(hl)                  ;
        add     a,4                     ; a = manx + 4
        cp      d                       ; manx + 4 < iciclex
        jr      c,draw                  ;
        pop     hl                      ;
        pop     de                      ;
        pop     af                      ;
        pop     bc                      ;
        jp      exit                    ;
draw:   ld      a,e                     ;
        sub     50                      ;
        ld      l,a                     ;
        ld      a,d                     ;
        call    iSprite            ; draw icicle
        pop     hl                      ;
        pop     de                      ;
        ld      a,(de)                  ;
        add     a,(hl)                  ;
        cp      106                     ;
        jr      c,noup                  ;
        xor     a                       ;
noup:   ld      (hl),a                  ;
        inc     hl                      ;
        inc     de                      ;
        pop     af                      ;
        add     a,8                     ;
        pop     bc                      ;
        djnz    drawl                   ;
        ld      b,10                    ;
        ld      a,(manx)                ;
        ld      l,54                    ;
        ld      ix,man                  ;
        call    iSprite            ; draw man
        call    iFastCopy             ;
        ei                              ;
        ld      a,(speed)               ;
        add     a,a                     ;
        add     a,3                     ;
        ld      b,a                     ;
delay:  halt                            ;
        djnz    delay                   ;
        ld      a,$FF                   ;
        out     (1),a                   ;
        ld      a,$FE                   ;
        out     (1),a                   ;
        in      a,(1)                   ;
        ld      b,a                     ;
        ld      hl,manx                 ;
        ld      a,(hl)                  ;
        srl     b                       ;
        srl     b                       ;
        jr      c,nleft                 ; [(left)]
        or      a                       ;
        jr      nz,nmover               ;
        ld      a,90+2                  ;
nmover: dec     a                       ;
        dec     a                       ;
nleft:  srl     b                       ;
        jr      c,nright                ; [(right)]
        cp      90                      ;
        jr      nz,nmovel               ;
        ld      a,0-2                   ;
nmovel: inc     a                       ;
        inc     a                       ;
nright: ld      (hl),a                  ;
        bcall(_getcsc)                    ;
        cp      55                      ; [MODE]
        jr      nz,npause               ;
        ld      a,1                     ; turn off calc
        out     (3),a                   ;
        ei                              ;
        halt                            ;
npause: cp      15                      ; [CLEAR]
        jp      nz,keyl                 ; [CLEAR]
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_of_program      ;
        jr      exitl                   ;


titlestr:       .db     "Avalanche",0
authorstr:      .db     "By HM and 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

grav:   .db     2,3,2,3,2,3,4,3,2,2,3,2

high:   .dw     0
speed:  .db     1

icicle: .db     %01111100
        .db     %01100100
        .db     %01000100
        .db     %00101000
        .db     %00101000
        .db     %00111000
        .db     %00010000
        .db     %00010000
drop1:  .db     %01111100
        .db     %00111000
drop2:  .db     %11111110
        .db     %11000110
        .db     %01000100
        .db     %00111000
man:    .db     %01110000
        .db     %10001000
        .db     %10001000
        .db     %01110000
        .db     %00100000
        .db     %11111000
        .db     %00100000
        .db     %00100000
        .db     %01010000
        .db     %10001000


        .end
