;+------------------------------------------------------+ ;| 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