;BreakDance! for ASH 3.0 ;By Mike Hallock ;http://user.mc.net/~spot/ ;FEEL FREE TO CHANGE ANY DB, but I ask you leave the code alone. ;Send me your modified versions, I'd love to see them. #include "ti82.h" #include "keys.inc" Timer = TEXT_MEM Timer200 = TEXT_MEM+1 TimerOn = TEXT_MEM+2 Score = TEXT_MEM+3 MoveList_I = TEXT_MEM+5 ML_Len = TEXT_MEM+6 T_Speed = TEXT_MEM2+10 StackLoc = TEXT_MEM2+15 MoveList = TEXT_MEM+8 .org START_ADDR .db "Break Dance! for ASH",0 ld (StackLoc),sp call SetupInt ld a,(SpeedFactor) ld (T_Speed),a Top: ld hl,TEXT_MEM ld b,10 Clean: ld (hl),0 inc hl djnz Clean ROM_CALL(CLEARLCD) ld de,$0000 ld ($800C),de ld hl,PressF1 ROM_CALL(D_ZT_STR) ld hl,(HighScore) ld de,$0007 ld ($800C),de ROM_CALL(D_HL_DECI) ld hl,HighI ROM_CALL(D_ZT_STR) Wait4GS: ld de,$0A07 ld ($800C),de ld a,(T_Speed) ld l,a ld h,0 ROM_CALL(D_HL_DECI) call RAND call GetSpriteAddr ld hl,$0B04 call DrawSprite ld b,35 Wait4: push bc ld b,255 Inner4: call GET_KEY cp 55 call z,QUITSTR cp 53 jr z,Drop4 cp 4 jr z,SlowIt cp 1 jr z,SpeedIt djnz Inner4 FromReSpeed: pop bc djnz Wait4 jr Wait4GS Drop4: pop bc jr The_Game SlowIt: ld a,(T_Speed) cp 100 jr z,FromReSpeed add a,5 ld (T_Speed),a jr FromReSpeed SpeedIt: ld a,(T_Speed) cp 0 jr z,FromReSpeed sub 5 ld (T_Speed),a jr FromReSpeed The_Game: ROM_CALL(CLEARLCD) ld de,Idle ld hl,$0B08 call DrawSprite ld de,$0007 ld ($800C),de ld hl,SText ROM_CALL(D_ZT_STR) ld de,$0707 ld ($800C),de ld hl,(Score) ROM_CALL(D_HL_DECI) ActiveGameLoop: ld a,' ' ld de,$0A04 ld ($800C),de ROM_CALL(TR_CHARPUT) call AddMove call DoMoveList ld a,0 ld (MoveList_I),a ReturnTo: ld de,$0707 ld ($800C),de ld hl,(Score) ROM_CALL(D_HL_DECI) ld a,(ML_Len) ld b,a ld a,(MoveList_I) cp b jr z,GoBackAround ld a,5 ld (Timer),a ld a,1 ld (TimerOn),a ld a,0 ld (Timer200),a KeyLoop: call GET_KEY cp 55 call z,QUITSTR cp 5 jr nc,KeyLoop cp 0 jr nz,DoMove ld a,(Timer) cp 0 jr z,Expire add a,'0' ld de,$0804 ld ($800C),de ROM_CALL(TR_CHARPUT) jr KeyLoop DoMove: push af push af ld a,0 ld (TimerOn),a pop af call BustAFunk ld hl,MoveList ld a,(MoveList_I) ld c,a ld b,0 add hl,bc ld b,(hl) pop af cp b jr nz,BADMOVE inc c ld a,c ld (MoveList_I),a ld hl,(Score) ld a,(Timer) ld e,a ld d,0 add hl,de ld (Score),hl jr ReturnTo GoBackAround: ld de,$0000 ld ($800C),de ld hl,Good ROM_CALL(D_ZT_STR) ld b,200 call Delay ld de,$0000 ld ($800C),de ld hl,Blank ROM_CALL(D_ZT_STR) jp ActiveGameLoop BADMOVE: ld de,$0000 ld ($800C),de ld hl,Bad ROM_CALL(D_ZT_STR) jr downThere Expire: ld de,$0000 ld ($800C),de ld hl,NoTime ROM_CALL(D_ZT_STR) downThere: ld b,200 call Delay call HighScoreHandle jp Top BustAFunk: call GetSpriteAddr ld hl,$0B08 call DrawSprite ld a,(T_Speed) add a,30 ld b,a call Delay ld de,Idle ld hl,$0B08 call DrawSprite ret DoMoveList: ld a,(ML_Len) ld hl,MoveList ld b,a SkankIt: push bc ld a,(hl) push hl call GetSpriteAddr ld hl,$0B01 call DrawSprite ld a,(T_Speed) add a,40 ld b,a call Delay ld de,Idle ld hl,$0B01 call DrawSprite ld b,24 call Delay pop hl inc hl pop bc djnz SkankIt ret GetSpriteAddr: cp 1 jr nz,CNext ld de,Pic1 CNext: cp 2 jr nz,CNext2 ld de,Pic2 CNext2: cp 3 jr nz,CNext3 ld de,Pic3 CNext3: cp 4 jr nz,CNext4 ld de,Pic4 CNext4: ret AddMove: ld hl,MoveList ld a,(ML_Len) ld e,a ld d,0 add hl,de push hl call RAND pop hl ld (hl),a ld hl,ML_Len inc (hl) ret Delay: push bc ld b,255 Inner: call GET_KEY cp 55 call z,QUITSTR cp 53 jr z,Drop djnz Inner pop bc djnz Delay ret Drop: pop bc ld a,53 call STORE_KEY ret QUITSTR: call HighScoreHandle ld a,(T_Speed) ld (SpeedFactor),a call RemoveInt ld sp,(StackLoc) ret HighScoreHandle: ld a,(T_Speed) cp 55 ret nc ld hl,(HighScore) ld de,(Score) call CP_HL_DE ret nc ld (HighScore),de ROM_CALL(CLEARLCD) ld hl,HSTEXT ld de,$0000 ld ($800C),de ROM_CALL(D_ZT_STR) ld de,$0604 ld ($800C),de ld hl,HighI+1 ld b, 3 InitLoop: call GetLetter ld (hl), a inc hl djnz InitLoop ret RAND: ld a,r sra a and 3 inc a ret GetLetter: push hl push bc ld hl,ASCII_Table-1 ;Point to one before, since we always inc once ConvertLoop: push hl call GET_KEY ;ACC holds key pop hl and a jr z,ConvertLoop push hl ;save away... ld b,a ld c,0 ConversionLoop: inc hl djnz ConversionLoop ;After this, we have the correct offset... ld a,(HL) pop hl and a jr z,ConvertLoop ;Invalid key ROM_CALL(TX_CHARPUT) ;Show the char pop bc pop hl ret ;Value is in acc ASCII_Table: .db 0,0,0,0,0,0,0,0,0 .db 0,'W','R','M','H' .db 0,0 .db 0,0,'V','O','L' .db 'G' .db 0,0 .db 0,'Z','U','P','K','F' .db 'C',0 .db ' ','Y','T','O','J','E' .db 'B',0,0,'X' .db 'S','N','I','D' .db 'A',0,0,0,0,0,0,0,0,0,0 RemoveInt: IM 1 ; Normal interrupt mode SET 0,(IY+3) ; Graph is dirty RET SetupInt: LD HL,$8400 ; Setup interrupt vector table in backup LD DE,$8401 ; buffer (only used for APD). The Int LD (HL),$83 ; rutine is placed in graph mem to have LD BC,256 ; as much space as possible. LDIR LD HL,TimerCode ; Get pointer to interrupt rutine LD DE,$8383 ; Start of int rutine, and length of it LD BC,TimerEnd-TimerCode+1 LDIR LD A,$84 ; Point to the new table LD I,A IM 2 RET HighI: .db " SPT",0 HighScore: .db 1,0 SpeedFactor: .db 50 HSTEXT: .db " Enter Your ", .db " Initals!",0 PressF1: .db "Press Y=",0 Good: .db "Good Move",0 Bad: .db "Bad Move",0 Blank: .db " ",0 NoTime: .db "Time Expired",0 SText: .db "Score:",0 DrawSprite: ;H os row, L is col, DE is DATA ld a,7 call 7F3h out (10h),a ld b,42 DrawIt: push bc ld a,h add a,$80 call 7F3h out (10h),a ld a,l add a,$20 call 7F3h out (10h),a ld b,3 DrawRow: push bc push hl push de pop hl ld a,(hl) call 7F3h out (11h),a pop hl inc de pop bc djnz DrawRow inc h pop bc djnz DrawIt ret TimerCode: EX AF,AF' EXX ld a,(TimerOn) or a jr z,Here ld a,(Timer200) inc a ld (Timer200),a cp 120 ;Orig. 200; but it was just too slow. jr nz,Here ld a,(Timer) dec a ld (Timer),a Here: EXX EX AF,AF' JP $0038 ; Call Std inetrrupt handler TimerEnd: Idle: .db $00,$3F,$00 .db $00,$FF,$C0 .db $00,$FF,$C0 .db $03,$C0,$F0 .db $03,$00,$30 .db $03,$33,$30 .db $03,$33,$30 .db $03,$00,$30 .db $00,$00,$00 .db $00,$0C,$00 .db $00,$00,$00 .db $00,$3F,$00 .db $00,$3F,$00 .db $0F,$FF,$F0 .db $0F,$FF,$FC .db $3F,$FF,$FC .db $3C,$FF,$FF .db $F0,$FF,$FF .db $F0,$FF,$CF .db $F0,$FF,$0F .db $FC,$FF,$0C .db $30,$FF,$3C .db $00,$FF,$00 .db $00,$FF,$00 .db $00,$FF,$00 .db $00,$FF,$00 .db $00,$FF,$00 .db $00,$FF,$00 .db $00,$FF,$C0 .db $00,$FF,$C0 .db $00,$F3,$C0 .db $03,$F3,$C0 .db $03,$F3,$C0 .db $03,$F3,$C0 .db $03,$C3,$C0 .db $03,$C3,$C0 .db $03,$C3,$F0 .db $0F,$C0,$F0 .db $0F,$C0,$F0 .db $0F,$00,$F0 .db $0F,$00,$F0 .db $0F,$00,$F0 Pic1: .db $00,$00,$00 .db $00,$00,$00 .db $00,$00,$00 .db $00,$00,$00 .db $00,$00,$00 .db $00,$00,$00 .db $00,$3C,$00 .db $03,$FF,$00 .db $0F,$FF,$00 .db $0F,$C0,$00 .db $3F,$0C,$00 .db $3F,$0C,$00 .db $3C,$00,$00 .db $3C,$00,$00 .db $0F,$00,$00 .db $0F,$00,$00 .db $0F,$00,$00 .db $00,$F0,$00 .db $03,$F3,$C0 .db $03,$F0,$00 .db $03,$FF,$F0 .db $03,$FF,$F0 .db $0F,$FF,$F0 .db $0F,$F3,$C0 .db $0F,$CF,$00 .db $3F,$03,$C0 .db $3F,$FF,$C0 .db $3F,$FF,$C0 .db $3F,$FF,$C0 .db $3F,$F3,$C0 .db $3F,$0F,$C0 .db $0C,$0F,$00 .db $00,$3F,$30 .db $00,$FC,$30 .db $00,$FC,$FF .db $03,$F0,$FC .db $03,$C0,$3C .db $03,$F0,$30 .db $00,$00,$00 .db $00,$00,$00 .db $00,$00,$00 .db $00,$00,$00 Pic2: .db $00,$00,$00 .db $07,$F8,$00 .db $07,$FE,$00 .db $1F,$FE,$00 .db $1F,$FF,$80 .db $1E,$1F,$80 .db $18,$07,$80 .db $1E,$67,$80 .db $06,$67,$80 .db $00,$00,$00 .db $00,$07,$E0 .db $61,$87,$E0 .db $78,$1F,$F8 .db $78,$1F,$F8 .db $7F,$FF,$F8 .db $1F,$FF,$E0 .db $07,$FF,$80 .db $01,$FE,$00 .db $00,$7F,$80 .db $00,$7F,$E0 .db $00,$7F,$E0 .db $00,$7F,$E0 .db $00,$7F,$E0 .db $00,$7F,$E0 .db $00,$7F,$80 .db $00,$7E,$00 .db $00,$7F,$80 .db $00,$7F,$80 .db $00,$7F,$80 .db $00,$79,$E0 .db $00,$79,$F8 .db $00,$78,$78 .db $00,$78,$78 .db $00,$79,$E0 .db $00,$79,$E0 .db $00,$78,$00 .db $00,$78,$00 .db $00,$78,$00 .db $00,$78,$00 .db $00,$78,$00 .db $00,$78,$00 .db $00,$78,$00 Pic3: .db $00,$00,$00 .db $00,$3F,$00 .db $00,$FF,$C0 .db $03,$FF,$C0 .db $03,$C3,$C0 .db $03,$00,$C0 .db $03,$33,$C0 .db $03,$33,$C0 .db $03,$00,$C0 .db $00,$00,$00 .db $00,$0C,$00 .db $3C,$00,$00 .db $3F,$FF,$C0 .db $3F,$FF,$F0 .db $3F,$FF,$F0 .db $0F,$FF,$FE .db $0F,$FF,$3E .db $03,$FF,$0E .db $03,$FF,$00 .db $00,$FF,$00 .db $00,$FF,$00 .db $00,$3F,$00 .db $00,$3F,$00 .db $00,$3F,$00 .db $00,$3F,$C0 .db $00,$3F,$F0 .db $00,$3F,$FC .db $00,$3F,$FC .db $00,$FF,$FC .db $00,$FF,$3C .db $00,$FC,$3C .db $00,$FC,$3C .db $03,$F0,$3C .db $03,$F0,$3C .db $03,$F0,$FC .db $03,$C0,$FC .db $03,$C0,$F0 .db $03,$C0,$00 .db $03,$C0,$00 .db $03,$F0,$00 .db $00,$FC,$00 .db $00,$FC,$00 Pic4: .db $00,$00,$00 .db $00,$00,$00 .db $00,$3F,$00 .db $00,$FF,$C0 .db $0F,$FF,$F0 .db $0F,$C0,$F0 .db $0F,$00,$30 .db $0F,$00,$30 .db $0F,$33,$30 .db $0F,$33,$30 .db $0F,$00,$00 .db $0F,$00,$00 .db $0F,$0C,$00 .db $0F,$00,$00 .db $0F,$3F,$00 .db $0F,$FF,$C0 .db $0F,$FF,$C0 .db $0F,$FF,$F0 .db $0F,$FF,$FC .db $0F,$FF,$FF .db $03,$FF,$FF .db $00,$FF,$FF .db $00,$FF,$3F .db $00,$FF,$0F .db $00,$FF,$03 .db $00,$FF,$0F .db $00,$FF,$0F .db $00,$FF,$0F .db $00,$FF,$0F .db $00,$FF,$00 .db $3F,$FF,$FC .db $3F,$FF,$FC .db $3F,$FF,$FC .db $3F,$FF,$FC .db $3C,$00,$3C .db $3C,$00,$3C .db $3C,$00,$3C .db $3C,$00,$3C .db $3C,$00,$3C .db $3C,$00,$3C .db $FC,$00,$3F .db $FC,$00,$3F .end