home *** CD-ROM | disk | FTP | other *** search
- ;+------------------------------------------------------+
- ;| DStar v2.5 |
- ;| by Joe Wingbermuehle |
- ;| 05-15-1998 |
- ;+------------------------------------------------------+
-
- ; Visit my home page at: http://www.usmo.com/~joewing/
- ; Send bugs/comments to: joewing@usmo.com
-
- ; Please do not modify this source in anyway!
-
- #include "crash82.inc"
-
- ; the following are variables stored in apd safe ram (768 bytes)
- #define xc APD_BUF
- #define yc APD_BUF+2
- #define loc APD_BUF+4
- #define loc2 APD_BUF+6
- #define xloc APD_BUF+8
- #define yloc APD_BUF+10
- #define tmp APD_BUF+12
- #define mvs APD_BUF+14
- #define mv APD_BUF+16
- #define lev APD_BUF+18
- #define mvt APD_BUF+19
- #define level APD_BUF+20
-
- #define string TEXT_MEM+2
-
- #define number_of_levels 10
-
-
- ;------------ Beginning of ASM code ------------
- .db "DStar 2.5 by Joe W.",0
-
- prog_start:
-
- ;---------- Start of program ----------
- ld hl,$0000
- ld (mv),hl
- ld a,1
- ld (lev),a
-
- ;---------= Decompress/Load level =---------
- start: ld a,$09
- ld (mvt),a
- ld hl,levels-26
- ld a,(lev)
- ld b,a
- ld de,26
- lslp1: add hl,de
- djnz lslp1
- ld de,level
- ld b,12
- ld a,$01
- lllp0: ld (de),a
- inc de
- djnz lllp0
- ld bc,21*256+3
- call vector0 ; decompress
-
- ld b,12
- ld a,$01
- lllp2: ld (de),a
- inc de
- djnz lllp2
- ld a,(hl)
- ld (yloc),a
- ld (yc),a
- inc hl
- ld a,(hl)
- ld (xloc),a
- ld (xc),a
- push hl
- call align
- ld (loc2),hl
- pop bc
- inc bc
- ld a,(bc)
- ld (yc),a
- inc bc
- ld a,(bc)
- ld (xc),a
- call align
- ld (loc),hl
- inc bc
- ld a,(bc)
- ld (mvs),a
- begin: ld a,$09
- ld (mvt),a
- ld b,108
- ld de,level
- ld ix,GRAPH_MEM
- dlp1: push bc
- ld a,(de)
- inc a
- ld hl,pieces-7
- ld bc,$0007
- dlp2: add hl,bc
- dec a
- jr nz,dlp2
- ld b,$07
- dlp3: ld a,(hl)
- ld (ix),a
- inc hl
- push bc
- ld bc,$000C
- add ix,bc
- pop bc
- djnz dlp3
- ld bc,-1*(7*12-1)
- add ix,bc
- pop bc
- ld c,$0C
- dec b
- call mod
- jr nz,dsk
- push bc
- ld bc,6*12
- add ix,bc
- pop bc
- dsk: inc b
- inc de
- djnz dlp1
-
- ld bc,(12*6)*256+0
- ld hl,GRAPH_MEM+((12*64)-(12*6))
- filllp: ld (hl),c
- inc hl
- djnz filllp
-
- set 7,(iy+20) ; write to graphbuffer
-
- call swap
- call swap
-
- ;---------= Main program loop =---------
- main: xor a
- ld (mvt),a
- ld a,(mvs)
- or a
- jp z,won
- ld hl,$3A00
- ld (CURSOR_X),hl
- ld hl,nxlv
- ROM_CALL(D_ZM_STR)
- ld a,(lev)
- call DispA
- ld hl,blank
- ROM_CALL(D_ZM_STR)
- ld hl,numm
- ROM_CALL(D_ZM_STR)
- ld hl,(mv)
- ld a,h
- and l
- cp $FF
- jr z,lost
- call DispHL
- ld a,67
- ld (CURSOR_X),a
- ld hl,help1
- ROM_CALL(D_ZM_STR)
- call CR_GRBCopy
-
- keylp: call GET_KEY
- cp G_DOWN
- jp z,mdown
- cp G_LEFT
- jp z,mleft
- cp G_RIGHT
- jp z,mright
- cp G_UP
- jp z,mup
- cp G_2ND
- jp z,mswap
- cp G_TRACE
- jp z,savegame
- cp G_GRAPH
- jp z,loadgame
- cp G_ALPHA
- jp z,start
- cp G_CLEAR
- jr nz,keylp
-
- ;---------- We have a losser! ----------
- lost: ld hl,losser
- exit: set 3,(iy+5)
- ld bc,$0403
- ld (CURSOR_POS),bc
- ROM_CALL(D_LT_STR)
- res 3,(iy+5)
- jp wkey
-
- ;---------- We have a winner! ----------
- won: ld a,(lev)
- inc a
- ld (lev),a
- cp number_of_levels+1
- jp nz,start
- ld hl,winner
- jr exit
-
- ;---------- Swap pieces ----------
- mswap: call swap
- jp main
-
- swap: ld a,(loc)
- ld bc,(loc2)
- ld (loc),bc
- ld (loc2),a
- ld de,p2
- call sprite
- ld a,(xloc)
- ld bc,(xc)
- ld (xc),a
- ld (xloc),bc
- ld a,(yloc)
- ld bc,(yc)
- ld (yloc),bc
- ld (yc),a
- ld de,p1
- jp sprite
-
- ;---------- Move Left ----------
- mleft: ld bc,(loc)
- dec bc
- ld a,(loc2)
- cp c
- jp z,main
- ld hl,level
- add hl,bc
- ld a,(hl)
- or a
- jr nz,mlc
- mlcn: ld (loc),bc
- ld de,p3
- call sprite
- ld a,(xc)
- dec a
- ld (xc),a
- ld de,p1
- call sprite
- jr mleft
- mlc: cp $02
- jp nz,main
- ld a,(mvs)
- dec a
- ld (mvs),a
- xor a
- ld (hl),a
- jr mlcn
-
- ;---------- Move Right ----------
- mright: ld bc,(loc)
- inc bc
- ld a,(loc2)
- cp c
- jp z,main
- ld hl,level
- add hl,bc
- ld a,(hl)
- or a
- jr nz,mrc
- mrcn: ld (loc),bc
- ld de,p3
- call sprite
- ld a,(xc)
- inc a
- ld (xc),a
- ld de,p1
- call sprite
- jr mright
- mrc: cp $02
- jp nz,main
- ld a,(mvs)
- dec a
- ld (mvs),a
- xor a
- ld (hl),a
- jr mrcn
-
- ;---------- Move Up ----------
- mup:
- Ld hl,(loc)
- ld bc,12
- or a ;reset carry
- sbc hl,bc
- ld b,h
- ld c,l
-
- ld a,(loc2)
- cp c
- jp z,main
- ld hl,level
- add hl,bc
- ld a,(hl)
- or a
- jr nz,muc
- mucn: ld (loc),bc
- ld de,p3
- call sprite
- ld a,(yc)
- dec a
- ld (yc),a
- ld de,p1
- call sprite
- jr mup
- muc: cp $02
- jp nz,main
- ld a,(mvs)
- dec a
- ld (mvs),a
- xor a
- ld (hl),a
- jr mucn
-
- ;---------- Move Down ----------
- mdown:
- Ld hl,(loc)
- ld bc,12
- add hl,bc
- ld b,h
- ld c,l
-
- ld a,(loc2)
- cp c
- jp z,main
- ld hl,level
- add hl,bc
- ld a,(hl)
- or a
- jr nz,mdc
- mdcn: ld (loc),bc
- ld de,p3
- call sprite
- ld a,(yc)
- inc a
- ld (yc),a
- ld de,p1
- call sprite
- jr mdown
- mdc: cp $02
- jp nz,main
- ld a,(mvs)
- dec a
- ld (mvs),a
- xor a
- ld (hl),a
- jr mdcn
-
- ;---------- Display a 8*7 sprite ----------
- sprite: ld hl,GRAPH_MEM-(12*7)
- ld a,(yc)
- inc a
- ld bc,12*7
- slp1: add hl,bc
- dec a
- jr nz,slp1
- ld a,(xc)
- ld c,a
- add hl,bc
- ld b,$07
- slpb: ld a,(de)
- ld (hl),a
- inc de
- push bc
- ld bc,$000C
- add hl,bc
- pop bc
- djnz slpb
- ld a,(mvt)
- or a
- ret nz
- ld a,$09
- ld (mvt),a
- ld hl,(mv)
- inc hl
- ld (mv),hl
- ret
-
- ;---------- Wait for a keypress ----------
- wkey: ei
- call GET_KEY
- or a
- jr z,wkey
- ret
-
- ;---------= Align hl to (xc,yc) =---------
- align: ld a,(yc)
- ld l,a
- ld e,a
- ld h,$00
- ld d,h
- add hl,de
- add hl,de
- add hl,hl
- add hl,hl
- ld a,(xc)
- ld e,a
- add hl,de
- ret
-
- DispA:
- ld h,0
- ld l,a
-
- DispHL:
- push de
- push hl
- ld de,string+5
- xor a
- ld (de),a
- Repeat:
- call UNPACK_HL
- add a,'0'
- dec de
- ld (de),a
- ld a,h
- or l
- jr nz,Repeat
- ex de,hl
- ROM_CALL(D_ZM_STR)
- pop hl
- pop de
- ret
- ;---------= Find the Modulus of b/c =---------
- mod: ld a,b
- modlp: sub c
- ret c
- jr nz,modlp
- ret
-
- ;---------= Save a Game =---------
- savegame:
- ld de,savearea
- ld hl,xc
- ld bc,$0084
- ldir
- set 3,(iy+5)
- ld hl,1*256+3
- ld (CURSOR_POS),hl
- ld hl,svtxt
- ROM_CALL(D_LT_STR)
- res 3,(iy+5)
- call wkey
- saved: jp main
-
- ;---------= Load a Game =---------
- loadgame:
- ld hl,savearea
- ld a,(hl)
- or a ; make sure there is a saved game
- jr z,saved
- ld de,xc
- ld bc,$0084
- ldir
- set 3,(iy+5)
- ld hl,1*256+3
- ld (CURSOR_POS),hl
- ld hl,ldtxt
- ROM_CALL(D_LT_STR)
- res 3,(iy+5)
- call wkey
- jp begin
-
- ;---------= Messages =----------
- nxlv: .db "Lev: ",0
- numm: .db "Moves:"
- blank: .db " ",0
- losser: .db 8,"You Lost"
- winner: .db 8,"You Won!"
- dstar: .db "DStar v2.5 by Joe "
- .db "Wingbermuehle",$00
- svtxt: .db 14,"- Game Saved -"
- ldtxt: .db 14,"- Game Loaded -"
- help1: .db "Sav Ld",0
-
-
- #define data TEXT_MEM ; 2 bytes of data
-
- ;---------= Decompress =---------
- ; input:
- ; hl->compressed data
- ; de->place to load data
- ; b=length of compressed data
- ; c=compression factor (1, 3, or 15)
- ; output:
- ; level is decompressed
- ; hl->next byte of compressed data
- vector0:
- decomp: push bc
- ld a,(hl)
- ld (data),a
- ld a,c
- ld b,$08
- cp $0F
- jr nz,dmpc
- ld b,$02
- dmpc: cp $03
- jr nz,dcmp1
- ld b,$04
- dcmp1: push bc
- ld a,c
- ld b,$01
- cp $0F
- jr nz,dcmpa
- ld b,$04
- dcmpa: cp $03
- jr nz,dcmpb
- ld b,$02
- dcmpb: ld a,(data)
- dcmp2: rlca
- djnz dcmp2
- ld (data),a
- and c
- ld (de),a
- inc de
- pop bc
- djnz dcmp1
- inc hl
- pop bc
- djnz decomp
- ret
- ;---------= Sprite Data =---------
- p3:
- pieces:
- .db $00,$00,$00,$00,$00,$00,$00
- .db 11110111b
- .db 11110111b
- .db 11110111b
- .db 00000000b
- .db 10111111b
- .db 10111111b
- icon: .db 00000000b
- .db 00000000b
- .db 00000000b
- .db 00011000b
- .db 00100100b
- .db 00100100b
- .db 00011000b
- .db 00000000b
- .db %11111110
- .db %10000010
- .db %10000010
- .db %10000010
- .db %10000010
- .db %11111110
- p1: .db 00000000b
- .db 00000000b
- .db 00011000b
- .db 00101100b
- .db 00111100b
- .db 00011000b
- p2: .db 00000000b
- .db 01000100b
- .db 00111000b
- .db 00101000b
- .db 00111000b
- .db 01000100b
- .db 00000000b
-
- ;---------- Level Data ----------
- ; each level is 26 bytes
- ; %00 = nothing
- ; %01 = wall
- ; %10 = dot
- ; %11 = stopper
-
- savearea:
- .db $00
- .ds $0083
-
- levels: .db %01000100,%00000000,%00000101
- .db %01000100,%00000000,%10000101
- .db %01000101,%00001000,%00000001
- .db %01000001,%10000000,%00000001
- .db %01000001,%00000001,%01010001
- .db %01001000,%00000000,%00000001
- .db %01000000,%00000000,%00100001
- .db $07,$06,$07,$04,$05
- .db %01000000,%00000000,%00011001
- .db %01000000,%00100000,%00000001
- .db %01000000,%00000000,%00000001
- .db %01011001,%00010000,%01000101
- .db %01000110,%01000001,%10010001
- .db %01000000,%00000000,%00000001
- .db %01000001,%00000000,%01000001
- .db $07,$06,$07,$04,$05
- .db %01000000,%00000000,%00010001
- .db %01000001,%01000000,%01010001
- .db %01001001,%10000000,%00000001
- .db %01000000,%00000101,%00000001
- .db %01000000,%00001001,%00100001
- .db %01000110,%00000000,%00000001
- .db %01000101,%00010000,%00000001
- .db $07,$06,$07,$04,$05
- .db %01000000,%00000000,%00000001
- .db %01010000,%00011000,%00000001
- .db %01000000,%01010100,%00000001
- .db %01000100,%10010000,%01100001
- .db %01010101,%00000001,%01010001
- .db %01000110,%00000000,%01100001
- .db %01000000,%00000000,%00010001
- .db $07,$06,$07,$04,$05
- .db %01010101,%00000000,%00000001
- .db %01010100,%00011001,%00000001
- .db %01010000,%00100110,%00000001
- .db %01000000,%00011001,%10000001
- .db %01000000,%01000000,%01000001
- .db %01000000,%00000000,%00000101
- .db %01000000,%00000000,%00010101
- .db $07,$06,$07,$04,$05
- .db %01000000,%00000101,%00000001
- .db %01000000,%00000001,%10010001
- .db %01000100,%01000010,%01000001
- .db %01001001,%10000001,%10010001
- .db %01000100,%01000000,%00000001
- .db %01000000,%00000000,%00000001
- .db %01000000,%00000000,%00010001
- .db $07,$06,$07,$04,$05
- .db %01010101,%01000000,%00000001
- .db %01010101,%00000000,%00000101
- .db %01010110,%00011000,%00000001
- .db %01011000,%01010100,%00100101
- .db %01000000,%00010000,%10010101
- .db %01010000,%00000000,%01010101
- .db %01000000,%00000001,%01010101
- .db $07,$06,$07,$04,$05
- .db %01000000,%00000000,%00000001
- .db %01000001,%10000001,%01000001
- .db %01000001,%01010010,%01100001
- .db %01000000,%00010000,%00000001
- .db %01010101,%00100000,%00000001
- .db %01010110,%00000101,%01000001
- .db %01000000,%00000000,%00000001
- .db $07,$06,$07,$04,$05
- .db %01000000,%00000000,%00000001
- .db %01000101,%10000001,%01000001
- .db %01000100,%01000110,%00000001
- .db %01000100,%01001001,%10000001
- .db %01000100,%01000010,%01000001
- .db %01000101,%00000101,%00000001
- .db %01000000,%00000000,%00000001
- .db $07,$06,$07,$04,$05
- .db %01000000,%00000000,%00000001
- .db %01000001,%00000101,%00000001
- .db %01000100,%01000010,%01000001
- .db %01001001,%10000001,%10000001
- .db %01000100,%01000010,%01000001
- .db %01000001,%00000101,%00000001
- .db %01000000,%00000000,%00000001
- .db $07,$06,$07,$04,$05
-
- .end
- END