home *** CD-ROM | disk | FTP | other *** search
- ;-------------------------------------------------------------------------------
- ;PLAINJUMP (C) 1997 BY ANDREAS ESS
- ; TUFERS 11
- ; A-6811 GOEFIS
- ; AUSTRIA/EUROPE
- ; ess.andreas@computerhaus.at
- ; http://andi.ganymed.org
- ;
- ;This is the Usgard version of Plainjump, nearly the same, but 300 bytes smaller
- ;through the use of Usgard functions + another ? bytes by clearing out stuff.
- ;Have fun with it,
- ; Andreas
- ;-------------------------------------------------------------------------------
-
- #INCLUDE "USGARD.H" ;use the Usgard header file!
-
- ;-------------------------------------------------------------------------------
- ;Variables in text-memory:
- ;-------------------------------------------------------------------------------
- LEVELY = TEXT_MEM ;position in level
- JUMPFLAG = TEXT_MEM+1 ;0 = no jump; 1 = up; 2 = down
- SPEED = TEXT_MEM+2 ;speed of ball
- LIFE = TEXT_MEM+3 ;lifes of player
- SCORE = TEXT_MEM+4 ;contains player's score
- BALLY = TEXT_MEM+6 ;only needed for savegame
- BALLX = TEXT_MEM+7
- LEVELNAME = TEXT_MEM+8
- ;--> saved from TEXT_MEM to TEXT_MEM+20
- SAVELEN = 17
-
-
- SCROLLY = TEXT_MEM+21 ;position in level-y
- SCROLLY1 = TEXT_MEM+22 ;
- SCROLLY2 = TEXT_MEM+23 ;
- WHATPLAIN = TEXT_MEM+24
-
- LEVELPT = TEXT_MEM+42 ;pointer to level data
- ORIGLVL = TEXT_MEM+44 ;pointer to start of level
- PLAYERPT1 = TEXT_MEM+46 ;pointer to black-player image
- ANICOUNT = TEXT_MEM+48 ;animation counter
-
-
- HiScoreTemp = TEXT_MEM+28
- TempByte = TEXT_MEM+30
- ANISCROLLC = TEXT_MEM+31
-
- LvlNo = TEXT_MEM+35
- Top = TEXT_MEM+36
- LvlMinusTop = TEXT_MEM+37
-
- Levels = GRAPH_MEM
-
- BackgroundTemp = TEXT_MEM2
-
- ;-------------------------------------------------------------------------------
- BITMAPMEM = GRAPH_MEM
-
- .org 0
- .db "PlaneJump v1.1",0
-
-
- ;-------------------------------------------------------------------------------
- ;Program start!
- ;-------------------------------------------------------------------------------
- Title:
- call CLEARLCD ;In Usgard, you may use either
- ;a normal call or a ROM_CALL!
- ld HL, &TitlePicture ;Automatic addition of PROGRAM_ADDR
- ;using a & in front of a label!
- ld DE, VIDEO_MEM+(16*7)
- ;Function calls make your life easier!
- #fncall ZCP
- ld HL, &ByStr
- ld DE, $3028
- ld (CURSOR_X), DE
- call D_ZM_STR
- ld DE, $3706
- ld (CURSOR_X), DE
- call D_ZM_STR
-
- Wait:
- call GET_KEY ;A = key
- and A ;no key pressed?
- jr z, Wait
-
- ld HL, &LevelSaved
- ld A, (HL)
- and A
- jr nz, LoadGame
-
- call &LoadLevel
- ret c
- jr RegularGame
-
- ;Wait until F1 released
- LoadGame:
- ;Copy saved game to TEXT_MEM
- ld (HL), 0
- inc HL
- ld BC, SAVELEN
- ld DE, LEVELY
- ldir
-
- ld HL, LEVELNAME
- call VAR_GET
- ret c
- inc HL
- inc HL
- ld A, (LEVELY)
- ld E, A
- ld D, 0
- add HL, DE
-
- ld BC, (BALLY)
- jr SetParams
-
- RegularGame:
- ;Do some initialisation
- ld A, 6
- ld (LIFE), A
- ld BC, $342E
- SetParams:
- ld (ORIGLVL), HL
- ld (LEVELPT), HL
- ld HL, &BlackBall1
- ld (PLAYERPT1), HL
- jr StartGameLoop
-
- ;Draw screen first time:
- StartAfterLife:
- ld BC, $342E
- StartGameLoop:
- call &DisplayInfo
- ld HL, $0203
- ld ($800C), HL
- ld HL, &LifeStatus
- call D_ZT_STR
- ld A, (LIFE)
- ld H, 0
- ld L, A
- call D_HL_DECI
- WaitInfo:
- halt
- call GET_KEY
- and A
- jr z, WaitInfo
- call &ClearDBuf
- call &DrawScreen
- call &ScanBk
-
- ;-------------------------------------------------------------------------------
- ;The game loop:
- ;-------------------------------------------------------------------------------
- GameLoop:
- call &DrawBk
- 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:
- call OTH_ARROW ;OTH_ARROW returns most used multikeys:
- ;bit 0: down
- cp $FF ;bit 1: left
- ;bit 2: right
- jp z, &Redraw ;bit 3: up
- TestLeftKey: ;bit 4: F1
- ld D, A ;bit 5: 2nd
- ld A, (SPEED) ;bit 6: exit
- ld E, A ;bit 7: more
- bit 1, d ;It's best to load the result into an
- jr nz, TestRightKey ;unused register an perform bit ?, reg
- 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 127-16
- 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
- and A
- jr z, Test2ndKey
- dec E
- Test2ndKey: ;JUMP?
- ld A, E
- ld (SPEED), A
- bit 5, d
- jr nz, TestExitKey
- ld a, (JUMPFLAG)
- and 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)
- and 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)
- and 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
- ld DE, VIDEO_MEM
- ld HL, BITMAPMEM
- push BC
- ld BC, 1024
- ldir
- pop BC
- J2GameLoop:
- jp &GameLoop
-
- Pause:
- call GET_KEY
- and A
- jr z, Pause
- jr J2GameLoop
-
- LostLife:
- xor A
- ld (SPEED), A
- NoFade:
- ld A, (LIFE)
- dec A
- jr z, GameOver
- call CLEARLCD
- ld (LIFE), A
- xor A
- ld HL, SCROLLY
- ld (HL), A
- inc HL
- ld (HL), A
- inc HL
- ld (HL), A
- inc HL
- 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, 16
- ld B, A
- jr FindStone1
- FoundDone:
- ld C, 46
- jp &StartGameLoop
-
- GameOver:
- call &HiScoreHand
- jr ExitGame
-
- LSaveGame:
- ld (BALLY), BC
- ld HL, &LevelSaved
- ld (HL), 1
- inc HL
- ld DE, LEVELY
- ex DE, HL
- ld BC, SAVELEN
- ldir
- ld HL, USG_BITS
- set 1, (HL) ;Tell Usgard to warp out...
- ExitGame:
- call &ClearDBuf
- call GET_KEY
- ret
-
- ;-------------------------------------------------------------------------------
- ;ClearDBuf: clears graphmem which is used as double buffer
- ;-------------------------------------------------------------------------------
- ClearDBuf:
- push BC
- ld HL, BITMAPMEM
- ld BC, 1023
- call OTH_CLEAR ;OTH_CLEAR clears BC+1 bytes at HL
- 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: ;ready-go!
- ld A, B ;erase point
- cpl
- and (HL)
- ld (HL), A ;and save it back to vid-ram
-
- dec C ;decrement X2 if X2 = X1 -> end
- jr z, EndWhite
-
- rrc B ;shift mask
- jr nc, WLoop
- inc HL
- jr WLoop
- EndWhite:
- 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: ;ready-go!
- ld A, (HL) ;load byte from vid-ram
- or B ;set it to black
- ld (HL), A ;and save it back to vid-ram
-
- dec C ;decrement X2 if X2 = X1 -> end
- jr z, EndBlack
-
- rrc B ;shift mask
- jr nc, BLoop
- inc HL
- jr BLoop
- EndBlack:
- pop DE
- pop HL
- 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, 63
- sub (IX)
- ld B, A
- ld A, 63
- sub (IX+1)
- ld C, A
- bit 4, L
- jr z, NotMiddle
- ld C, 63
- 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, 63
- jr SkipMiddle
- DrawLine_Loop2:
- ld A, (IX+1)
- add A, 63
- ld B, A
- SkipMiddle:
- ld A, (IX)
- add A, 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
-
- ;-------------------------------------------------------------------------------
- ;Drawscreen
- ;-------------------------------------------------------------------------------
- DrawScreen:
- #ifdef OLD
- ld hl, (LEVELPT)
- ld e, (hl)
- ld b, 32
- DrawScrLoop:
- ld a, b
- add a, 32
- ld d, a
- call &DrawLine
- djnz DrawScrLoop
- ld hl, (LEVELPT)
- inc hl
- ld e, (hl)
- ld b, 32
- DrawScrLoop1:
- ld d, b
- call &DrawLine
- djnz DrawScrLoop1
- ret
- #else
- 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
- #endif
-
- ;-------------------------------------------------------------------------------
- ;DoScroll: handles scrolling
- ;-------------------------------------------------------------------------------
- DoScroll:
- #ifdef OLD
- ld A, (SCROLLY) ;increment SCROLLY
- inc A
- ld D, A
- ld (SCROLLY), A ;save it
- cp 32 ;SCROLLY = 32 ?
- jr nz, LoadHLScr
- xor A
- ld D, A
- ld (SCROLLY), a
- ld H, A
- ld L, A
- ld ($8333), hl
- ld HL, (SCORE)
- call DM_HL_DECI ;display HL menu style
- push bc
- ld b, 6
- ld de, BITMAPMEM
- ld hl, VIDEO_MEM
- CopyVid2Grf:
- push bc
- ldi
- ldi
- ldi
- ld bc, 13
- add hl, bc
- ex de, hl
- add hl, bc
- ex de, hl
- pop bc
- djnz CopyVid2Grf
- pop bc
- ld a, (LEVELY) ;increment LEVELY
- inc a
- ld (LEVELY), a
- cp 254
- jr nz, GoOnScroll
- xor a
- ld (LEVELY), a
- ld hl, (ORIGLVL)
- ld (LEVELPT), hl
- GoOnScroll:
- ld hl, (SCORE)
- ld de, $0002
- add hl, de
- ld (SCORE), hl
- ld hl, (LEVELPT) ;and increment LEVELPT
- inc hl
- ld (LEVELPT), hl
- LoadHLScr:
- ld hl, (LEVELPT) ;get Levelinformation from LEVELPT
- inc hl
- ld e, (hl)
- call &DrawLine
- ld a, (SCROLLY)
- add a, 32
- ld d, a
- ld hl, (LEVELPT)
- ld e, (hl)
- call &DrawLine
- ret
- #else
- ld HL, SCROLLY
- inc (HL)
- ld A, (HL)
- cp 32 ;SCROLLY = 32 ?
- jr nz, LoadHLScr
- xor A
- ld (HL), a
- ld D, A
- ld H, A
- ld L, A
- ld (SCROLLY1), hl
- ld (CURSOR_X), hl
- ld HL, (SCORE)
- call DM_HL_DECI
- push BC
- ld B, 6
- ld DE, BITMAPMEM
- ld HL, VIDEO_MEM
- CopyVid2Grf:
- push BC
- ldi
- ldi
- ldi
- ld BC, 13
- add HL, BC
- ex DE, HL
- add HL, BC
- ex DE, HL
- pop BC
- djnz CopyVid2Grf
- pop BC
- ld A, (LEVELY) ;increment LEVELY
- inc A
- cp 251
- jr nz, NoBonus
- Bonus:
- ld HL, LIFE
- inc (HL)
- NoBonus:
- cp 253
- jr nz, GoOnScroll
- xor A
- ld HL, (ORIGLVL)
- inc HL
- 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) ;and increment LEVELPT
- inc HL
- ld (LEVELPT), hl
- LoadHLScr:
- ld A, (WHATPLAIN)
- inc A
- cp 4
- jr nz, WhatPlain_Set
- ld A, 1
- WhatPlain_Set:
- ld (WHATPLAIN), a
- cp 2
- jr z, Plain_2
- cp 3
- jr z, Plain_3
- Plain_1:
- ld A, (SCROLLY1)
- inc A
- ld (SCROLLY1), A
- ld D, A
- ld HL, (LEVELPT) ;get Levelinformation from LEVELPT
- inc HL
- inc HL
- ld E, (HL)
- call &DrawLine
- Plain_2:
- ld A, (SCROLLY2)
- inc A
- ld (SCROLLY2), A
- add A, 10
- ld D, A
- ld HL, (LEVELPT)
- inc HL
- ld E, (HL)
- call &DrawLine
- Plain_3:
- ld A, (SCROLLY)
- add A, 32
- ld D, A
- ld HL, (LEVELPT)
- ld E, (HL)
- call &DrawLine
- ret
- #endif
-
-
- ;-------------------------------------------------------------------------------
- ;ScanBk: stores background from(B,C)-(B+16,C+16) 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
- ;HL contains Video-Offset
- ;DE contains BkPt
- ;Now we are ready...
- ld B, 16 ;16 lines to scan
- ScanLoop:
- push bc
- ld bc, 3
- ldir ;move 4 bytes from hl to de
- ld bc, 13
- add hl, bc
- pop bc
- djnz ScanLoop
- pop bc
- ret
-
- ;-------------------------------------------------------------------------------
- ;DrawBk: draws background from(B,C)-(B+16,C+16) 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
- ;DE contains Video-Offset
- ;HL contains BkPt
- ;Now we are ready...
- ld b, 16 ;23 lines to draw
- PutLoop:
- push bc
- ld bc, 3
- ldir ;move 4 bytes from hl to de
- ld bc, 13
- ex de, hl
- add hl, bc
- ex de, hl
- pop bc
- djnz PutLoop
- pop bc
- ret
-
- ;-----------------------------------------------------------------------------
- ;WhiteSprite: draws each white element of a 16*16 sprite
- ;-----------------------------------------------------------------------------
- WhiteSprite:
- push BC
- push DE
- ld A, 32
- ld (TempByte), A ;Line
- ld A, 63
- sub C
- ld C, A
- call FIND_PIXEL
- ld DE, BITMAPMEM
- 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, 14
- add HL, DE
- pop DE
- jr WSLoop
- WSEndBMP:
- pop bc
- ret
-
- ;-----------------------------------------------------------------------------
- ;BlackSprite: draws each black element of a 16*16 sprite
- ;-----------------------------------------------------------------------------
- BlackSprite:
- push BC
- push DE
- ld A, 32
- ld (TempByte), A ;Line
- ld A, 63
- sub C
- ld C, A
- call FIND_PIXEL
- ld DE, BITMAPMEM
- 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, 14
- add hl, de
- pop de
- jr BSLoop
- BSEndBMP:
- pop bc
- ret
-
- ;-----------------------------------------------------------------------------
- ;Handle Hi-score
- ;-----------------------------------------------------------------------------
- HiScoreHand:
- call CLEARLCD
- ld HL, &HiScore
- call LD_HL_MHL
- ld DE, (SCORE)
- ld (HiScoreTemp), DE
- ;DE contains hiscore, HL actual score
- call CP_HL_DE
- ret nc
- ld HL, &HiScore
- ex DE, HL
- ld HL, HiScoreTemp
- ld C, 2
- ldi
- ldi
- ld HL, $0300
- ld ($800C), HL
- ld HL, &HiScr
- call D_ZT_STR
- ld DE, $0A1F
- ld ($8333), DE
- call D_ZM_STR
- ld HL, $0803
- ld ($800C), HL
- ld HL, &HiScrName
- ld C, 3
- #fncall INP_INIT
- ret
-
- DisplayInfo:
- push BC
- call CLEARLCD
- ld HL, VIDEO_MEM
- call &Invert
- ld HL, VIDEO_MEM+1024-112
- call &Invert
- ld HL, $0001
- ld (CURSOR_X), HL
- set 3, (IY+5)
- ld HL, &Instr
- call D_ZM_STR
- ld A, 82
- ld (CURSOR_X), A
- call D_ZM_STR
- call LD_HL_MHL
- call DM_HL_DECI
- ld HL, $390D
- ld (CURSOR_X), HL
- ld HL, &EMail
- call D_ZM_STR
- res 3, (IY+5)
- pop BC
- ret
-
- LoadLevel:
- call &DisplayInfo
- ;Search for level files:
- ld IX, Levels
- xor A
- ld (LvlNo), A
- ld HL, VAT_START-10
- SearchLoop:
- ld A, $0C
- call SEARCH_VAT
- jr c, SearchDone
- ld A, (DE)
- cp 3
- jr nz, SearchLoop
- inc DE
- ld A, (DE)
- and A
- jr nz, SearchLoop
- push HL
- ld HL, VATName
- push IX
- pop DE
- ld BC, 9
- push BC
- ldir
- pop BC
- add IX, BC
- pop HL
- ld A, (LvlNo)
- inc A
- ld (LvlNo), A
- jr SearchLoop
- SearchDone:
- xor A
- ld (&SetD+1), A
-
- ld A, (LvlNo)
- and A
- jp z, &NoLevels
- ShowLevels:
- ld HL, $0801
- ld (CURSOR_X), HL
-
- ld HL, VIDEO_MEM+112
- ld BC, 799
- call OTH_CLEAR
- ld HL, (Top)
- ld H, 9
- call MUL_HL
- ld DE, Levels
- add HL, DE
- ld B, 8
- ld A, (LvlNo)
- cp 8
- jr nc, ShowLevel
- ld B, A
- ShowLevel:
- push HL
- call D_ZM_STR
- pop HL
- ld DE, 9
- add HL, DE
- ld A, (CURSOR_Y)
- add A, 6
- ld (CURSOR_Y), A
- ld A, 1
- ld (CURSOR_X), A
- djnz ShowLevel
- ld HL, Top
- ld A, (LvlNo)
- sub (HL)
- cp 8
- jr c, SetMax
- ld A, 8
- SetMax:
- ld E, A
- dec E
- SetD:
- ld D, 0
- call &ShowBar
- CL_KeyLoop:
- call GET_KEY
- cp K_DOWN
- jr z, ScrollDown
- cp K_UP
- jr z, ScrollUp
- cp K_ENTER
- jr z, AcceptLevel
- cp K_EXIT
- jr nz, CL_KeyLoop
- scf
- ret
- ScrollDown:
- call &ShowBar
- ld A, D
- cp E
- jr z, ScrollL_Down
- inc D
- jr ShowIt
- ScrollL_Down:
- ld (&SetD+1), A
- ld A, (LvlNo)
- sub 8
- jr c, ShowIt
- ld HL, Top
- cp (HL)
- jr z, ShowIt
- inc (HL)
- jp &ShowLevels
- ScrollUp:
- call &ShowBar
- ld A, D
- and A
- jr z, ScrollL_Up
- dec D
- jr ShowIt
- ScrollL_Up:
- ld (&SetD+1), A
- ld A, (Top)
- and A
- jr z, ShowIt
- dec A
- ld (Top), A
- jp &ShowLevels
- ShowIt:
- call &ShowBar
- jr CL_KeyLoop
- AcceptLevel:
- ld A, (Top)
- add A, D
- ld L, A
- ld H, 9
- call MUL_HL
- ld DE, Levels
- add HL, DE
- push HL
- ld BC, 8
- ld DE, LEVELNAME
- ldir
- pop HL
- call VAR_GET
- ret c
- inc HL
- inc HL
- or A
- ret
- NoLevels:
- ld HL, $0801
- ld (CURSOR_X), HL
- ld HL, &NoLevel
- call D_ZM_STR
- call OTH_PAUSE
- scf
- ret
-
- ShowBar:
- push DE
- ld L, D
- ld H, 96
- call MUL_HL
- ld DE, VIDEO_MEM+128
- add HL, DE
- call &Invert
- pop DE
- ret
-
- Invert:
- ld BC, 112
- InvLoop:
- ld A, (HL)
- cpl
- ld (HL), A
- inc HL
- dec BC
- ld A, B
- or C
- jr nz, InvLoop
- ret
-
- ;-------------------------------------------------------------------------------
- ;Some important variables:
- ;-------------------------------------------------------------------------------
- ;012345678901234567890
- NoLevel: .db "No level found!",0
- Instr: .db "PJ 1.1 by AE",0
- HiScrTxt: .db "Hi: "
- HiScrName: .db "AND",0
- HiScore: .dw 10 ;This is standard hi-score
- HiScr: .db "NEW HIGH SCORE!",0
- EnterInit: .db "ENTER YOUR INITIALS:",0
- ;123456789012345678901
- EMail: .db "ess.andreas@computerhaus.at",0
- ByStr: .db "by Andreas Ess",0
- TitTxt: .db "Title picture by"
- .db " Johannes Rajala",0
- LifeStatus: .db "Lifes left:",0
-
- ;-------------------------------------------------------------------------------
- ;This contains savegame
- ;-------------------------------------------------------------------------------
- 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
-
- ;-------------------------------------------------------------------------------
- ;This array contains start&end-line indexes(?)
- ;-------------------------------------------------------------------------------
- StartLine:
- .db 16, 12, 8, 4 ;#0
- .db 17, 13, 8, 4
- .db 17, 13, 9, 4
- .db 18, 13, 9, 4
- .db 19, 14, 10, 5 ;#4
- .db 19, 15, 10, 5
- .db 20, 15, 10, 5
- .db 21, 16, 11, 5
- .db 22, 17, 11, 6 ;#8
- .db 23, 17, 11, 6
- .db 23, 18, 12, 6
- .db 24, 18, 12, 6
- .db 25, 19, 13, 6 ;#12
- .db 26, 19, 13, 6
- .db 26, 20, 13, 7
- .db 27, 21, 14, 7
- .db 28, 21, 14, 7 ;#16
- .db 29, 22, 14, 7
- .db 29, 22, 15, 7
- .db 30, 23, 15, 8
- .db 31, 23, 16, 8 ;#20
- .db 32, 24, 16, 8
- .db 33, 25, 16, 8
- .db 33, 25, 17, 8
- .db 34, 26, 17, 9 ;#24
- .db 35, 26, 18, 9
- .db 35, 27, 18, 9
- .db 36, 27, 18, 9
- .db 37, 28, 19, 9 ;#28
- .db 38, 29, 19, 9
- .db 38, 29, 19, 9
- .db 39, 30, 20, 10
- .db 40, 30, 20, 10 ;#32
- .db 41, 31, 21, 10
- .db 41, 31, 21, 10
- .db 42, 32, 21, 11
- .db 43, 33, 22, 11 ;#36
- .db 44, 33, 22, 11
- .db 44, 34, 22, 11
- .db 45, 34, 23, 11
- .db 46, 35, 23, 12 ;#40
- .db 47, 35, 24, 12
- .db 47, 36, 24, 12
- .db 48, 37, 24, 12
- .db 49, 37, 25, 12 ;#44
- .db 50, 38, 25, 13
- .db 50, 38, 26, 13
- .db 51, 39, 26, 13
- .db 52, 39, 26, 13 ;#48
- .db 53, 40, 27, 13
- .db 54, 41, 27, 14
- .db 55, 41, 27, 14
- .db 55, 42, 28, 14 ;#52
- .db 56, 42, 28, 14
- .db 56, 43, 29, 14
- .db 57, 43, 29, 14
- .db 58, 44, 29, 15 ;#56
- .db 59, 45, 30, 15
- .db 59, 45, 30, 15
- .db 60, 46, 30, 15
- .db 61, 46, 31, 15 ;#60
- .db 62, 47, 31, 16
- .db 62, 47, 32, 16
- .db 63, 48, 32, 16
-
-
- ;-------------------------------------------------------------------------------
- ;Bitmapdata:
- ;-------------------------------------------------------------------------------
- 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
-
-
- TitlePicture:
- .db $00,$3F,$2C,$C0,$3F,$3F,$22,$C0,$0A,$C0,$3F,$A0,$3F,$2C,$C0,$80
- .db $E0,$22,$C0,$90,$84,$37,$E0,$FF,$39,$C0,$34,$4D,$19,$C0,$82,$81
- .db $0A,$E0,$1B,$E3,$80,$C0,$83,$F0,$98,$88,$10,$C0,$98,$98,$84,$BE
- .db $12,$C0,$BE,$FC,$10,$E2,$87,$B0,$12,$E0,$BC,$F0,$83,$E6,$18,$F6
- .db $EF,$82,$09,$E9,$E3,$C0,$13,$FB,$48,$0B,$E1,$E0,$09,$C0,$B9,$F0
- .db $F0,$A4,$8D,$9F,$98,$18,$FE,$8F,$0B,$E9,$FC,$C0,$09,$F0,$F0,$98
- .db $BC,$ED,$9F,$CC,$19,$F0,$8E,$84,$8D,$DC,$0B,$C0,$F0,$B0,$DC,$8F
- .db $BE,$9F,$E7,$1A,$E0,$87,$91,$EE,$B0,$0A,$E0,$F0,$88,$EC,$87,$FF
- .db $8F,$F3,$C0,$14,$E3,$E3,$E3,$4A,$83,$C1,$C1,$E8,$C5,$DC,$86,$F7
- .db $8F,$F3,$F0,$13,$E3,$F9,$F1,$DF,$F0,$FF,$9C,$87,$B1,$E1,$CC,$F7
- .db $B8,$BE,$B9,$C0,$10,$E3,$F9,$E3,$8F,$F9,$C3,$F8,$83,$CF,$D9,$DE
- .db $E3,$B9,$80,$F0,$90,$10,$E3,$F9,$C3,$8F,$CF,$80,$F8,$81,$FD,$CF
- .db $FB,$E2,$98,$E3,$E0,$17,$E1,$F3,$C3,$8F,$8F,$09,$F0,$87,$E6,$BF
- .db $CF,$08,$C7,$FC,$1B,$E0,$87,$C7,$8F,$8F,$C0,$8E,$83,$F9,$CF,$E1
- .db $C0,$88,$BE,$1F,$E8,$BF,$DC,$8E,$9F,$90,$8C,$87,$F3,$9F,$E1,$09
- .db $CB,$23,$E7,$4C,$83,$C7,$EE,$83,$C3,$9C,$E7,$F8,$A0,$84,$8C,$20
- .db $E3,$4C,$93,$C7,$E7,$C1,$C6,$8C,$E3,$F8,$A0,$82,$AC,$1F,$F0,$FF
- .db $BC,$F3,$8F,$CF,$E3,$D8,$98,$E3,$F2,$D0,$C4,$D8,$1D,$FC,$BF,$8E
- .db $B9,$C7,$E7,$F1,$F8,$8D,$B0,$B0,$A6,$C0,$B7,$1D,$E6,$8F,$CF,$9C
- .db $EB,$F3,$F8,$FE,$9E,$CC,$80,$D1,$E8,$8B,$F0,$16,$C3,$A3,$E7,$08
- .db $E3,$E3,$F8,$4C,$8B,$08,$C8,$FA,$A6,$EC,$15,$C0,$B4,$B1,$E1,$C5
- .db $BD,$BF,$9F,$FF,$8D,$C8,$B6,$9E,$F1,$D8,$A0,$18,$EC,$A3,$C0,$CA
- .db $F0,$FC,$B8,$F8,$B7,$CF,$C8,$BD,$D3,$B8,$1E,$F6,$97,$87,$8C,$F2
- .db $FC,$BA,$0A,$FE,$B9,$C7,$B3,$B9,$C0,$1A,$FA,$93,$F3,$E2,$B3,$BC
- .db $9B,$80,$FE,$BC,$9E,$B1,$F8,$BC,$1E,$FC,$E4,$8B,$E3,$F4,$F9,$89
- .db $C7,$F8,$9F,$F7,$F0,$EF,$F8,$1D,$E6,$F9,$E9,$F1,$FD,$FD,$09,$49
- .db $83,$FE,$9F,$80,$FC,$20,$E3,$FF,$88,$FC,$BF,$EE,$E0,$49,$B0,$B1
- .db $E0,$E0,$86,$22,$C1,$F3,$4A,$B1,$EC,$99,$D7,$F8,$98,$C0,$E0,$E0
- .db $84,$29,$E0,$49,$9F,$E0,$8E,$87,$E0,$84,$09,$C0,$C0,$98,$31,$FF
- .db $8F,$C0,$9F,$FF,$18,$C1,$08,$C0,$32,$F0,$0D,$4A,$0E,$C0,$14,$C0
- .db $33,$E0,$0B,$E1,$E0,$19,$C4,$3F,$98,$0A,$C0,$90,$27,$C0,$36,$C0
- .db $10,$C0,$3F,$88,$00
-
-
- .end
-