#include "ti82.h" #include "keys.inc" ;------------------------------------------------------------------------------- ;Variables in text-memory: ;------------------------------------------------------------------------------- LEVELY = TEXT_MEM ;position in level SCROLLY = TEXT_MEM+1 ;position in level-y LEVELPT = TEXT_MEM+2 ;pointer to level data BKPT = TEXT_MEM+4 ;pointer to background PLAYERPT = TEXT_MEM+6 ;pointer to player JUMPFLAG = TEXT_MEM+8 ;0 = no jump; 1 = up; 2 = down PLAYERPT1 = TEXT_MEM+9 ;pointer to black-player image ANICOUNT = TEXT_MEM+11 ;animation counter SPEED = TEXT_MEM+12 ;speed of ball LIFE = TEXT_MEM+14 ;lifes of player SCORE = TEXT_MEM+15 ;contains player's score ORIGLVL = TEXT_MEM+17 ;pointer to start of level BALLX = TEXT_MEM+19 ;only needed for savegame BALLY = TEXT_MEM+20 Data = TEXT_MEM+21 ;needed for ZCP StringPlace = TEXT_MEM+22 ZeroByte = TEXT_MEM+27 HiScoreTemp = TEXT_MEM+28 Count = TEXT_MEM+30 TempByte = TEXT_MEM+31 MASK = TEXT_MEM+32 ANISCROLLC = TEXT_MEM+33 KEYPRESS = TEXT_MEM+34 ;------------------------------------------------------------------------------- BITMAPMEM = APD_BUF ;this points to the graph mem .org START_ADDR .DB "PlainJump v1.0",0 ;------------------------------------------------------------------------------- ;Program start! ;------------------------------------------------------------------------------- SaveCheck: LD A,$8C ;Needed for OUT (2),A ;FIND_PIXEL res 1,(iy+13) ;Same with TextShadow ;res 6,(iy+9) ;VERY IMPORTANT since I am using the STATVARS. Thanks SCaBBY! call ClearGraphMem call ClearAPDBUF ld HL, LevelSaved ld A, (HL) and A jp nz, LoadGame Title: call ClearGraphMem call ClearAPDBUF ld de,$88b8 ld bc,400 ld hl,TitlePicture ldir call fastCopy ld hl,Instr ld de, 50*256+12 call DMX ld de, 36*256+4 call DMX ld de,57*256+1 call DMX ld de,43*256+10 call DMX ld de,43*256+43 call DMX ld hl,43*256+65 ld (CURSOR_X),HL ld hl,HiScore call LD_HL_MHL call HL_DECIMAL_MENU WaitForKey: call GET_KEY or a jr z, WaitForKey cp G_MODE jp z,ExitGame cp G_ALPHA jp z,LevelEditor cp G_2nd jr z,userlevel jr RegularGame ;------------------------------------>>>>>>Replace w/SavedGame Stuff! LoadGame: ROM_CALL(CLEARLCD) ld hl, LevelSaved ld a, (hl) cp 0 jr z, RegularGame ;Copy saved game(20 bytes) to TEXT_MEM ld bc, 21 inc hl ld de, LEVELY ldir CALL DrawScreen ld a, (BALLX) ld b, a ld a, (BALLY) ld c, a ld a, 0 ld (SCROLLY), a CALL ScanBk JP GameLoop userlevel: ld hl, Level ld (LEVELPT), hl ld (ORIGLVL), hl call BuiltInLevels jp lost2 RegularGame: ;Do some initialisation ld hl, Level1 ld (LEVELPT), hl ld (ORIGLVL), hl call BuiltInLevels jr StartAfterLife BuiltInLevels: ld hl, BackgroundTemp ld (BKPT), hl ld hl, WhiteBall ld (PLAYERPT), hl ld hl, BlackBall1 ld (PLAYERPT1), hl ROM_CALL(CLEARLCD) xor a ld (SCROLLY), a ld (LEVELY), a ld (JUMPFLAG), a ld (ANICOUNT), a ld (SPEED), a ld hl, 0 ld (SCORE), hl ld a, 6 ld (LIFE), a ret ;Draw screen first time: StartAfterLife: ld b, 40 ld c, 46 StartGameLoop: ld HL, $0003 ld ($800C), HL ld HL, LifeStatus ROM_CALL(D_ZT_STR) ld A, (LIFE) ld H, 0 ld L, A ROM_CALL(D_HL_DECI) WaitInfo: ei halt call GET_KEY cp G_ENTER jr nz, WaitInfo push bc call ClearGraphMem call ClearAPDBUF call DrawScreen pop bc ;ld hl, (LEVELPT) ;inc hl ;ld (LEVELPT), hl call ScanBk ;------------------------------------------------------------------------------- ;The game loop: ;------------------------------------------------------------------------------- GameLoop: call DrawBk ;erase ball ld a,c cp 46 jr nz,TestKeys push BC ld A, B add A, 8 ld B, A ld C, 63-60 call FIND_PIXEL ld DE, BITMAPMEM add HL, DE and (HL) pop BC jp z, LostLife TestKeys: push bc ld a,$FE out (1),a in a,(1) ld b,a ld a,$BF out (1),a in a,(1) or $0F and b pop bc cp $FF jp z,Redraw TestLeftKey: ld d,a ld a,(SPEED) ld e,a bit 1,d jr nz,TestRightKey ld a,b cp 2 jr c,TestRightKey dec b ld a,e cp 3 jr nz,TestRightKey dec b TestRightKey: bit 2,d jr nz,TestUpKey ld a,b cp 80 jr nc,TestUpKey inc b ld a,e cp 3 jr nz,TestUpKey inc b TestUpKey: bit 3,d jr nz,TestDownKey ld a,e cp 3 jr nc,TestDownKey inc e TestDownKey: bit 0,d jr nz,Test2ndKey ld a,e or a jr z,Test2ndKey dec e Test2ndKey: ld a,e ld (SPEED),a bit 5,d jr nz,TestExitKey ld a,(JUMPFLAG) or a jr nz,TestExitKey inc a ld (JUMPFLAG),a TestExitKey: bit 6,d jp z,ExitGame TestPauseKey: bit 7,d jp z,Pause TestF1Key: bit 4,d jp z,LSaveGame Redraw: ld a,(JUMPFLAG) or a jr z,ReallyRedraw dec a jr nz,FlyDown ld a,c cp 20 jr z,SetFlyDown dec c jr ReallyRedraw SetFlyDown: ld a,2 ld (JUMPFLAG),a FlyDown: ld a,c cp 46 jr nz,FlyDown1 xor a ld (JUMPFLAG),a jr ReallyRedraw FlyDown1: inc c ReallyRedraw: ld a,(SPEED) or a jr z,RedrawBall push bc ld b,a DoScrolling: call DoScroll djnz DoScrolling pop bc RedrawBall: call ScanBk ld de,WhiteBall call WhiteSprite ld de,(PLAYERPT1) call BlackSprite ld a,(ANISCROLLC) ld hl,SPEED add a,(hl) ld (ANISCROLLC),a cp 6 jr c,GoOnMainLoop xor a ld (ANISCROLLC),a ld hl,ANICOUNT inc (hl) ld a,(hl) cp 3 jr nz,NextFrame ld (hl),0 ld hl,BlackBall1 ld (PLAYERPT1),hl jr GoOnMainLoop NextFrame: ld hl,(PLAYERPT1) ld de,32 add hl,de ld (PLAYERPT1),hl GoOnMainLoop: ;copy GRAPH-MEM to LCD-MEM push bc ld de,GRAPH_MEM ld hl,APD_BUF ld bc,768 ldir ei halt halt call fastCopy pop bc jp GameLoop ;--------------------------------------------------------- ; WhiteSprite: draws each white element of a 24*24 sprite ;--------------------------------------------------------- WhiteSprite: push bc push de ld a,32 ld (TempByte),a ld A, 63 sub C ld C, A call FIND_PIXEL ld de,APD_BUF add hl,de pop de ld c,a ld b,128 WSLoop: ld a,(de) and b jr nz,WSLoop1 ld a,c cpl and (hl) ld (hl),a WSLoop1: rrc c jr nc,WSLoop2 inc hl WSLoop2: rrc b jr nc,WSLoop WSNextLine: inc de ld a,(TempByte) dec a ld (TempByte),a jr z,WSEndBMP bit 0,a jr nz,WSLoop push de ld de,10 add hl,de pop de jr WSLoop WSEndBMP: pop bc ret ;--------------------------------------------------------- ; BlackSprite: draws each black element of a 24*24 sprite ;--------------------------------------------------------- BlackSprite: push bc push de ld a,32 ld (TempByte),a ld A, 63 sub C ld C, A call FIND_PIXEL ld de,APD_BUF add hl,de pop de ld c,a ld b,128 BSLoop: ld a,(de) and b jr z,BSLoop1 ld a,(hl) or c ld (hl),a BSLoop1: rrc c jr nc,BSLoop2 inc hl BSLoop2: rrc b jr nc,BSLoop BSNextLine: inc de ld a,(TempByte) dec a ld (TempByte),a jr z,BSEndBMP bit 0,a jr nz,BSLoop push de ld de,10 add hl,de pop de jr BSLoop BSEndBMP: pop bc ret ;------------ ; Drawscreen ;------------ DrawScreen: push bc ld ix,(LEVELPT) ld e,(ix) ld b,31 DrawScrLoop: ld a,b add a,32 ld d,a call DrawLine djnz DrawScrLoop ld e,(IX+1) ld b,21 DrawScrLoop1: ld a,b add a,11 ld d,A call DrawLine djnz DrawScrLoop1 ld e,(ix+2) ld b,11 DrawScrLoop2: ld d,b call DrawLine djnz DrawScrLoop2 pop bc ret ;------------------------------------------------------------------------------- ;DrawLine: this draws a line at y-pos D, accoriding to bits in E ;------------------------------------------------------------------------------- DrawLine: push BC push IX ld IX, StartLine ld B, 0 ld C, D sla C add IX, BC add IX, BC ;IX now contains pointer to StartLine1 ld L, $80 DrawLine_Loop1: ld A, 47 sub (IX) ld B, A ld A, 47 sub (IX+1) ld C, A bit 4, L jr z, NotMiddle ld C, 47 NotMiddle: inc IX ld A, E and L jr z, WhiteLine_1 call BlackLine jr DrawLine_Loop1_2 WhiteLine_1: call WhiteLine DrawLine_Loop1_2: rrc L ld A, L cp $08 jr nz, DrawLine_Loop1 dec IX ld B, 47 ;63 jr SkipMiddle DrawLine_Loop2: ld A, (IX+1) add A, 47 ; 63 ld B, A SkipMiddle: ld A, (IX) add A, 47 ;63 ld C, A dec IX ld A, E and L jr z, WhiteLine_2 call BlackLine jr DrawLine_Loop2_2 WhiteLine_2: call WhiteLine DrawLine_Loop2_2: rrc L jr nc, DrawLine_Loop2 pop IX pop BC ret ;--------------------------------------------------------------- ; WhiteLine: draws a horizontal, white line from (B,D) to (C,D) ;--------------------------------------------------------------- WhiteLine: push hl push de ld a,c sub b push af ld A, 63 sub D ld C, A call FIND_PIXEL ld de,BITMAPMEM add hl,de ld b,a pop af ld c,a WLoop: ld a,b cpl and (hl) ld (hl),a dec c jr z,EndWhite rrc b jr nc,WLoop inc hl jr WLoop EndWhite: ;fastCopy pop de pop hl ret ;------------------------------------------------------------------------------- ;BlackLine: draws a horizontal, black line from (B,D) to (C,D) ;------------------------------------------------------------------------------- BlackLine: push hl push de ld a,c sub b push af ld A, 63 sub D ld C, A call FIND_PIXEL ld de,BITMAPMEM add hl,de ld b,a pop af ld c,a BLoop: ld a,(hl) or b ld (hl),a dec c jr z,EndBlack rrc B jr nc,BLoop inc hl jr BLoop EndBlack: ;fastCopy pop de pop hl ret ExitGame: ld hl, LevelSaved ld a,0 ld (hl),a call ClearGraphMem ;set 6,(iy+9) ;Restore the StatVars, to avoid screen garbage set 1,(iy+13) ;Same with TextShadow ret ;------------------------------------------------------------------------------- ;ScanBk: stores background from(B,C)-(B+24,C+24) in BKPT ;------------------------------------------------------------------------------- ScanBk: push bc ld a, 63 sub c ld c, a call FIND_PIXEL ld de,BITMAPMEM add hl,de ld de,BackgroundTemp ld b,23 ScanLoop: push bc ld bc, 4 ldir ;move 4 bytes from hl to de pop bc push de ;next line in vid-ram ld de, 8 add hl, de pop de djnz ScanLoop pop bc ret ;------------------------------------------------------------------------------- ;DrawBk: draws background from(B,C)-(B+24,C+24) in BKPT ;------------------------------------------------------------------------------- DrawBk: push bc ld a, 63 sub c ld c, a call FIND_PIXEL ld de,BITMAPMEM add hl,de ld de,BackgroundTemp ex de,hl ld b, 23 ;23 lines to draw PutLoop: push bc ld bc, 4 ldir ;move 4 bytes from hl to de pop bc push hl ;next line in vid-ram ld hl, 8 add hl, de ex de, hl pop hl djnz PutLoop pop bc ret ;------------------------------------------------------------------------------- ;Built-in Level editor: ;------------------------------------------------------------------------------- LevelEditor: ROM_CALL(CLEARLCD) call ClearGraphMem ld hl, Level ld (LEVELPT), hl xor a ld (LEVELY), a set 7,(iy+$14) ld e, 10 ld d, 1 ld hl, Arrow call DMX ld d, 8 call DMX ld d, 15 call DMX ld d,22 call DMX ld d,29 call DMX res 7,(iy+$14) call EDrwScreen ld a, $C0 ld (MASK), a ld b, 0 ld c, 60 KeyLoop: call PointChg WaitKey: call GET_KEY or a jr z, WaitKey push af call PointChg pop af cp $01 jr z, MoveUp ;Flip the keys... cp $02 jr z, MoveLeft cp $03 jr z, MoveRight cp $04 jr z, MoveDown ;Had to flip the keys... cp $36 jp z,ChangeStone cp $37 jp z,ExitEditor cp $0F jp z,ClearLevel jr KeyLoop MoveDown: ld a, (LEVELY) or a jr z, KeyLoop dec a ld (LEVELY), a inc c inc c ld a, c cp 62 jr nz, KeyLoop ld hl, (LEVELPT) dec hl ld (LEVELPT), hl ld c, 60 call EDrwScreen jr KeyLoop MoveLeft: ld a, b or a jr z, KeyLoop dec b dec b ld a, (MASK) add a, a add a, a ld (MASK), a jr KeyLoop MoveRight: ld a, b cp 6 jr z, KeyLoop inc b inc b ld a, (MASK) srl a srl a ld (MASK), a jr KeyLoop MoveUp: ld a, (LEVELY) cp 253 jp z,KeyLoop inc a ld (LEVELY), a dec c dec c ld a, c or a jp nz,KeyLoop ld hl, (LEVELPT) inc hl ld (LEVELPT), hl ld c, 2 call EDrwScreen jp KeyLoop ChangeStone: ld hl, (LEVELPT) ld a, 60 sub c ld e, a srl e ld d, 0 add hl, de ld a, (MASK) xor (hl) ld (hl), a call EDrwScreen jp KeyLoop ClearLevel: ld hl, (LEVELPT) ld b, 255 ld a,-1 ClearLL: ld (hl), a inc hl djnz ClearLL call EDrwScreen jp KeyLoop ExitEditor: ld hl, (LEVELPT) ld de, (LEVELPT) ld bc, 254 add hl, bc ex de, hl ldi ldi call ClearGraphMem jp Title ;----------------------------------------------------------------------------- ;EDrwScreen: draws screen ;----------------------------------------------------------------------------- EDrwScreen: push bc call ClearGraph ld hl, (LEVELPT) ld b, 30 DrawLoop: ld a, b add a, a ld c, a push bc bit 6, (hl) ld b, 0 call nz,DrawBox bit 4, (hl) ld b, 2 call nz,DrawBox bit 2, (hl) ld b, 4 call nz,DrawBox bit 0, (hl) ld b, 6 call nz,DrawBox pop bc inc hl djnz DrawLoop call fastCopy pop bc ret ;----------------------------------------------------------------------------- ;DrawBox ;----------------------------------------------------------------------------- DrawBox: push bc call PointOn inc b call PointOn inc c call PointOn dec b call PointOn pop bc ret ;----------------------------------------------------------------------------- ;PointOn: draws point at b=x, c=y ;----------------------------------------------------------------------------- PointOn: push hl push bc call FIND_PIXEL ;HL=byte offset in video buffer, A=2^(bit to change) ld de, GRAPH_MEM add hl, de or (hl) ld (hl),a pop bc pop hl ret ;----------------------------------------------------------------------------- ;PointChg: changes point at b=x, c=y ;----------------------------------------------------------------------------- PointChg: push bc push hl call FIND_PIXEL ld de,GRAPH_MEM add hl,de xor (hl) ld (hl),a call fastCopy pop hl pop bc ret ClearGraphMem: ld hl,GRAPH_MEM ld (hl),0 ld de,GRAPH_MEM+1 ld bc,767 ldir ret ;------------------------------------------------------------------------------- ;Some important variables: ;------------------------------------------------------------------------------- Arrow: .db "USE ARROWS TO MOVE,",0 Second: .db "2ND TO Change Block",0 Clear: .db "CLEAR TO Erase Level",0 Down: .db "DOWN TO Scroll Down",0 Exit: .db "MODE TO Save & Exit",0 Instr: .db "Press Any Key to Play!",0 ByStr2: .db "By: Andreas Ess/Sam Heald",0 PortStr: .db "2ND-User Lvl ALPHA-Editor",0 HiScrTxt: .db "HiScore: ",0 HiScrName: .db "AND",0 HiScore: .dw 10 ;This is standard hi-score HiScr: .db "NEW HIGH SCORE!",0 EnterInit: .db "ENTER YOUR INITIALS:",0 StartLine: .db 16,12,8,4 ;#0 .db 16,12,8,4 .db 17,12,8,4 .db 17,13,8,4 .db 18,13,9,4 ;#4 .db 18,13,9,4 .db 19,14,9,4 .db 19,14,9,5 .db 20,14,10,5 ;#8 .db 20,15,10,5 .db 21,15,10,5 .db 21,15,10,5 .db 22,16,11,5 ;#12 .db 22,16,11,5 .db 23,16,11,6 .db 23,17,11,6 .db 24,17,12,6 ;#16 .db 24,17,12,6 .db 25,18,12,6 .db 25,18,12,6 .db 26,18,13,6 ;#20 .db 26,19,13,7 .db 27,19,13,7 .db 27,19,13,7 .db 28,20,14,7 ;#24 .db 28,20,14,7 .db 29,20,14,7 .db 29,21,14,7 .db 30,21,15,8 ;#28 .db 30,21,15,8 .db 31,22,15,8 .db 31,22,15,8 .db 32,22,16,8 ;#32 .db 32,23,16,6 .db 33,23,16,7 .db 33,23,16,9 .db 34,24,17,9 ;#36 .db 34,24,17,9 .db 35,24,17,9 .db 35,25,17,9 .db 36,25,18,9 ;#40 .db 36,25,18,9 .db 37,26,18,10 .db 37,26,18,10 .db 38,26,19,10 ;#44 .db 38,27,19,10 .db 39,27,19,10 .db 39,27,19,10 .db 40,28,20,10 ;#48 .db 40,28,20,11 .db 41,28,20,11 .db 41,29,20,11 .db 42,29,21,11 ;#52 .db 42,29,21,11 .db 43,30,21,11 .db 43,30,21,11 .db 44,30,22,12 ;#56 .db 44,31,22,12 .db 45,31,22,12 .db 45,31,22,12 .db 46,32,23,12 ;#60 .db 46,32,23,12 .db 47,32,23,12 .db 47,32,23,12 ;------------------------------------------------------------------------------- ;Bitmapdata: ;------------------------------------------------------------------------------- BackgroundTemp = TEXT_MEM2 WhiteBall: .db $FF,$FF,$FF,$FF,$F8,$3F,$E0,$0F,$C0,$07,$C0,$07,$80,$03,$80,$03 .db $80,$03,$80,$03,$80,$03,$C0,$07,$C0,$07,$E0,$0F,$F8,$3F,$FF,$FF, BlackBall1: .db $00,$00,$07,$C0,$18,$30,$20,$08,$40,$04,$40,$04,$80,$02,$80,$02 .db $80,$02,$C0,$06,$A0,$0A,$54,$54,$6A,$AC,$35,$58,$1A,$B0,$07,$C0 .db $00,$00,$07,$C0,$18,$30,$20,$08,$40,$04,$40,$04,$8A,$A2,$D5,$56 .db $AA,$AA,$D5,$56,$8A,$A2,$40,$04,$40,$04,$20,$08,$18,$30,$07,$C0 .db $00,$00,$07,$C0,$1A,$B0,$35,$58,$6A,$AC,$54,$54,$A0,$0A,$C0,$06 .db $80,$02,$80,$02,$80,$02,$40,$04,$40,$04,$20,$08,$18,$30,$07,$C0 Level1: .db $FF,$3C,$FF,$3C,$0C,$0C,$0F,$03,$03,$03,$C0,$C0,$C0,$FF,$FF,$00 ;16 .db $FF,$FF,$00,$3C,$3C,$00,$03,$0C,$30,$C0,$FF,$3C,$C3,$C3,$03,$FF ;32 .db $33,$33,$03,$30,$03,$30,$03,$C0,$FF,$03,$03,$C0,$0C,$C3,$CF,$CF ;48 .db $C0,$C0,$FF,$00,$0C,$00,$30,$00,$03,$00,$C0,$F3,$F3,$F3,$F0,$C0 ;72 .db $C0,$F0,$30,$3C,$0C,$0F,$03,$03,$03,$F0,$F0,$00,$FF,$3C,$FF,$C0 ;80 .db $00,$30,$FF,$FC,$F0,$C0,$03,$C0,$03,$FF,$FF,$F3,$FF,$CF,$FF,$C3 ;96 .db $3C,$00,$C3,$00,$03,$00,$00,$FF,$FF,$03,$0C,$30,$C0,$30,$C0,$03 ;112 .db $FF,$00,$00,$3C,$00,$03,$00,$00,$FF,$00,$00,$FF,$FF,$F3,$CF,$F3 ;128 .db $00,$00,$C0,$00,$00,$00,$FF,$0C,$0C,$0F,$03,$03,$0F,$0C,$0F,$30 ;144 .db $F0,$C0,$C0,$00,$FF,$00,$00,$03,$03,$03,$03,$03,$C0,$C0,$00,$00 ;160 .db $FF,$F3,$FC,$F3,$CF,$3F,$3F,$00,$00,$FF,$00,$00,$FF,$00,$00,$FF ;176 .db $C3,$3C,$C3,$F3,$FC,$FF,$00,$00,$00,$03,$FF,$C0,$F0,$03,$3C,$0C ;192 .db $0F,$03,$03,$00,$00,$C0,$FF,$FF,$F3,$CF,$CF,$F3,$FF,$03,$0C,$03 ;208 .db $00,$FF,$3C,$FF,$00,$FF,$33,$CC,$CC,$33,$3C,$00,$FF,$00,$00,$00 ;224 .db $FF,$FF,$03,$C0,$30,$0C,$30,$0C,$FF,$00,$FF,$F3,$CF,$3F,$00,$FF ;240 .db $FF,$00,$FF,$00,$3C,$00,$3C,$00,$3C,$00,$30,$00,$30,$00,$00,$00,$FF ;256 ;------------------------------------------------------------------------------- ;This is the edit-able level: ;------------------------------------------------------------------------------- Level: .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$FF,$00 ;--------------------------------------------------------------------------------- ;Title Picture ;--------------------------------------------------------------------------------- TitlePicture: .db 16,0,8,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,8,0,48,16,8,4,0,0,0,0 .db 0,0,1,131,248,0,0,2,0,0,0,0,0,0,0,127,252,16,16,3,0,0,0,0,198,2,0,62,6,48,96 .db 35,224,0,2,3,239,128,0,24,131,60,224,15,48,0,0,7,109,224,128,26,113,255,192,6,28,0,8,14,120,112 .db 72,52,249,195,192,6,159,144,0,28,56,24,121,180,252,1,193,6,220,0,16,56,48,184,61,241,252,0,228,119,48 .db 0,48,112,17,176,63,241,252,60,120,255,240,112,96,232,139,112,55,113,252,126,120,223,225,252,224,118,56,102,119,112 .db 249,126,113,143,243,15,192,57,246,111,99,114,3,126,97,143,158,3,192,31,179,253,226,49,143,60,225,143,30,0,224 .db 31,51,249,224,17,254,1,227,143,31,0,112,63,51,240,192,16,248,135,247,7,31,32,48,63,51,248,64,18,192,127 .db 255,7,31,112,56,103,51,248,64,16,96,63,255,39,31,60,24,195,49,248,64,9,96,31,222,115,31,63,29,131,24 .db 249,80,137,96,31,142,115,31,63,31,3,88,48,77,1,184,15,158,115,95,63,31,143,76,1,71,64,190,71,156,3 .db 30,63,31,254,44,2,71,164,219,163,28,49,94,191,63,252,108,134,199,184,216,177,28,9,92,62,56,240,222,124,135 .db 180,220,216,184,113,156,190,58,0,63,57,142,205,204,209,62,120,153,188,54,3,243,195,204,124,60,230,65,120,250,121 .db 19,31,193,254,252,55,248,111,58,120,253,250,0,255,131,252,124,7,192,127,196,124,127,187,7,253,131,28,24,3,0 .db 121,255,236,118,25,175,224,196,12,24,2,0,48,127,207,224,28,31,0,64,4,8,6,0,0,31,199,192,63,252,0 .db 0,2,8,4,0,0,3,128,0,63,240,0,32,0,0,4,0,0,1,128,0,97,192,0,0,0,136,0,0,0,0 .db 192,1,0,128,0,0,0,0,8,0,0,0,64,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 LSaveGame: ld a, b ld (BALLX), a ld a, c ld (BALLY), a ld hl, LevelSaved ld a, 1 ld (hl), a inc hl ld de, LEVELY ex de, hl ld bc, 21 ldir ret Pause: call GET_KEY cp G_ENTER jr nz, Pause JP GameLoop LostLife: xor A ld (SPEED), A NoFade: ld A, (LIFE) dec A jr z, GameOver lost2: ROM_CALL(CLEARLCD) ld (LIFE), A xor A ld HL, SCROLLY ld (HL), A ld HL, (LEVELPT) FindStone: dec HL ld (LEVELPT), HL ld A, (LEVELY) dec A ld (LEVELY), A jp z, StartAfterLife ld C, $80 ld B, 1 FindStone1: ld A, (HL) and C jr nz, FoundDone srl C jr z, FindStone ld A, B add A, 12 ld B, A jr FindStone1 FoundDone: ld C, 46 jp StartGameLoop GameOver: ROM_CALL(CLEARLCD) ld hl, LevelSaved ld a,0 ld (hl),a CALL HiScoreHand JP Title LevelSaved: .db 0 ;standard: no level saved SavedLevel: .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 HiScoreHand: ROM_CALL(CLEARLCD) ld hl, HiScore call LD_HL_MHL ld de,(SCORE) ld (HiScoreTemp),de call CP_HL_DE ret nc ld hl,HiScore ex de,hl ld hl,HiScoreTemp ld c,2 ldi ldi ld hl,$0100 ld (CURSOR_ROW),hl ld hl,HiScr ROM_CALL(D_ZT_STR) ld de,$0A0F call DMX ld hl, $0603 ld (CURSOR_ROW),hl ld hl,HiScrName ld c,3 push hl ld d,$41 ld a,(CURSOR_COL) ld e,a ld b,0 jr InvLet WaitKey2: push bc push de push hl call GET_KEY pop hl pop de pop bc cp G_UP jr z,LetUp cp G_DOWN jr z,LetDown cp G_2nd jr nz,WaitKey2 ld (hl),d inc hl ld a,d ROM_CALL(TX_CHARPUT) inc e inc b ld a,c cp b jr nz,InvLet ld (hl),0 pop hl ret LetUp: inc d ld a,d cp $5B jr nz,InvLet ld d,$41 jr InvLet LetDown: dec d ld a,d cp $40 jr nz,InvLet ld d,$5A InvLet: set 3,(iy+$05) ld a,d ROM_CALL(TX_CHARPUT) ld a,e ld (CURSOR_COL),a res 3,(iy+$05) jr WaitKey2 ;----------------------------------------------------------------------------- ;HL_DECIMAL_MENU(Magnus Hagander):Writes the in HL stored word in menu font ;----------------------------------------------------------------------------- HL_DECIMAL_MENU: push bc push de ld de, StringPlace+4 ld b, 5 ConvLoop: call UNPACK_HL add a,'0' ld (de), a dec de djnz ConvLoop ld hl, StringPlace ROM_CALL(D_ZM_STR) pop de pop bc ret ;------------------------------------------------------------------------------- ;DoScroll: handles scrolling ;------------------------------------------------------------------------------- DoScroll: ld a, (SCROLLY) ;increment SCROLLY inc a ld d, a ld (SCROLLY), a ;save it cp 32 ;SCROLLY = 32 ? jr nz, LoadHLScr ld a, 0 ;yes, set it to 0, ld d, 0 ld (SCROLLY), a set 7,(iy+$14) ;Write text to GRAPH_MEM ld hl,$0000 ld (CURSOR_X), hl ld HL, (SCORE) call HL_DECIMAL_MENU ;display HL menu style res 7,(iy+$14) ;Stop Writing text to GRAPH_MEM push bc ;Save bc ld de, BITMAPMEM ;Copy to APD_BUF ld hl, GRAPH_MEM ;Copy from GRAPH_MEM ld bc,72 ;Copy first 6 lines of GM ldir ;Do it pop bc ;Restore BC ld a,(LEVELY) inc a cp 251 jr nz,NoBonus Bonus: ld hl,LIFE inc (hl) NoBonus: cp 253 jr nz,GoOnScroll xor a ld (LEVELY), a ld hl, (ORIGLVL) ld (LEVELPT), hl GoOnScroll: ld (LEVELY),a ld hl,(SCORE) ld d,0 ld a,(SPEED) ld e,a add hl,de ld (SCORE),hl ld hl,(LEVELPT) inc hl ld (LEVELPT),hl LoadHLScr: ld hl, (LEVELPT) ;get Levelinformation from LEVELPT inc hl inc hl ld e, (hl) CALL DrawLine ld a, (SCROLLY) add a, 32 ld d, a ld hl, (LEVELPT) inc hl ld e, (hl) CALL DrawLine ret ClearAPDBUF: push bc ld hl,APD_BUF ld (hl),0 ld de,APD_BUF+1 ld bc,767 ldir pop bc ret LifeStatus: .db "Lives Left:",0 DMX: ld (CURSOR_X),de DMX2: ROM_CALL(D_ZM_STR) ret fastCopy: di ; 4 ld a,$80 ; 7 out ($10),a ; 11 ld hl,GRAPH_MEM-12-(-(12*64)+1) ; 10 ld a,$20 ; 7 ld c,a ; 4 ; 43 fastCopyAgain: ld b,64 ; 7 inc c ; 4 ld de,-(12*64)+1 ; 10 out ($10),a ; 11 add hl,de ; 11 ld de,11 ; 10 fastCopyLoop: add hl,de ; 11 inc hl ; 6 ret c ; 5 ; do nothing instruction (was nop (4 clocks)) ld a,(hl) ; 7 out ($11),a ; 11 djnz fastCopyLoop ; 13/8 ; 3392 ld a,c ; 4 cp $2B+1 ; 7 jr nz,fastCopyAgain; 12/7 ; 52 ; 41773 (used to be 41136) ret ; 11 ; 18 ClearGraph: push bc ld b, 64 ld hl, GRAPH_MEM ld de, 12 Loop: ld (hl), 0 add hl, de djnz Loop pop bc ret .end