home *** CD-ROM | disk | FTP | other *** search
- .INCLUDE "CRASH82.INC"
- .DB "LandMine 1.0",0
-
-
- ;---------- Varibles - in apd ram ----------
- ufield = APD_BUF ; holds mines for field generation and holds
- ; the status of each block for game [96 bytes]
- field = APD_BUF+97 ; holds mines and numbers for game and generation [128 bytes]
- lft = TEXT_MEM ; holds the number of spaces left to be cleared
- lev = TEXT_MEM+1
- xc = TEXT_MEM+2 ; x coordinate
- yc = TEXT_MEM+4 ; y coordinate
- tmp = TEXT_MEM+6 ; holds a 9 if game over and other stuff for generation
- time = TEXT_MEM+10 ; holds the time left
- tv = TEXT_MEM+11 ; holds the count for time and other stuff for
- ; generation - 2 bytes
- blank = TEXT_MEM+13 ; 15 spaces 0 terminated - 16 bytes
- string = TEXT_MEM+30
-
-
- ;---------- set up the game - high score etc ----------
- ROM_CALL(CLEARLCD)
- ld hl,514
- ld (CURSOR_POS),hl
- ld hl,lmine
- ROM_CALL(D_LT_STR)
- ld hl,1283
- ld (CURSOR_POS),hl
- ld hl,abt1
- ROM_CALL(D_LT_STR)
- ld hl,516
- ld (CURSOR_POS),hl
- ld hl,abt2
- ROM_CALL(D_LT_STR)
- ld hl,40*256+0
- ld (CURSOR_X),hl
- ld hl,port
- ROM_CALL(D_ZM_STR)
- ld b,15
- ld a,' '
- ld hl,blank
-
- lspl: ld (hl),a
- inc hl
- djnz lspl
- ld a,0
- ld (hl),a
-
- ld a,92
- ld (lev),a
- call wkey
- call BUFCLR
- ROM_CALL(CLEARLCD)
-
- ;---------- set up the level -----------
- start:
- set 7,(iy+$14) ;was +20
- ld a,181
- ld (time),a
- ld b,192
- ld a,0
- ld hl,ufield
- intlp: ld (hl),a
- inc hl
- djnz intlp
-
- ;---------- Calculate and display the number of mines ----------
- ld hl,0
- ld (tmp),hl
- ld a,(lev)
- ld (lft),a
- ld b,a
- ld a,96
- sub b
- ld (tmp),a
- ld hl,7*256+0
- ld (CURSOR_X),hl
- ld hl,msg1
- ROM_CALL(D_ZM_STR)
- ld hl,(tmp)
- call DispHL
- call CR_GRBCopy
- call wkey
- ld a,(tmp)
- ld b,a
-
- ;---------- Randomly put mines on the field ----------
- ; This takes awhile (the pause for displaying the score and mines).
- ld de,field
- ranlp: push bc
- ranlp2:
- call random
- ; ld a,96
- ; call setxxop2
- ; call fpmult
- ; call convop1
-
- ld hl,field
- add hl,de
- ld a,(hl)
- cp 9
- jr z,ranlp2
- ld a,9
- ld (hl),a
- pop bc
- djnz ranlp
-
- ;---------- Save the locations of the mines ----------
- ; This prevents the next routine from destroying where
- ; the mines are by saving them in ufield.
- ld hl,field
- ld de,ufield
- ld bc,96
- ldir ; copy (hl) to (de), inc de, inc hl, dec bc until bc=0
-
- ;---------- Fill in the numbers on the field ----------
- ; Fill field with numbers indicating how many mines
- ; surround it.
- ld c,0
- ld hl,field
- ld de,ufield
- lp3: ld b,9
- ld a,11
- sl1: cp c
- jr z,sk1
- add a,12
- djnz sl1
- ld a,(de)
- cp 9
- jr nz,sk1
- inc hl
- call inchl
- dec hl
- sk1: ld b,9
- ld a,0
- sl2: cp c
- jr z,sk2
- add a,12
- djnz sl2
- ld a,(de)
- cp 9
- jr nz,sk2
- dec hl
- call inchl
- inc hl
- sk2: ld b,12
- ld a,0
- sl3: cp c
- jr z,sk3
- inc a
- djnz sl3
- ld a,(de)
- cp 9
- jr nz,sk3
- push hl
- ld b,12
- ssl3: dec hl
- djnz ssl3
- call inchl
- pop hl
- sk3: ld b,12
- ld a,96
- sl4: cp c
- jr z,sk4
- dec a
- djnz sl4
- ld a,(de)
- cp 9
- jr nz,sk4
- push hl
- ld b,12
- ssl4: inc hl
- djnz ssl4
- call inchl
- pop hl
- sk4: ld b,12
- ld a,0
- sl5a: cp c
- jr z,sk5
- inc a
- djnz sl5a
- ld b,12
- ld a,0
- sl5b: cp c
- jr z,sk5
- add a,12
- djnz sl5b
- ld a,(de)
- cp 9
- jr nz,sk5
- push hl
- ld b,13
- ssl5: dec hl
- djnz ssl5
- call inchl
- pop hl
- sk5: ld b,12
- ld a,0
- sl6a: cp c
- jr z,sk6
- inc a
- djnz sl6a
- ld b,12
- ld a,11
- sl6b: cp c
- jr z,sk6
- add a,12
- djnz sl6b
- ld a,(de)
- cp 9
- jr nz,sk6
- push hl
- ld b,11
- ssl6: dec hl
- djnz ssl6
- call inchl
- pop hl
- sk6: ld b,12
- ld a,96
- sl7a: cp c
- jr z,sk7
- dec a
- djnz sl7a
- ld b,12
- ld a,0
- sl7b: cp c
- jr z,sk7
- add a,12
- djnz sl7b
- ld a,(de)
- cp 9
- jr nz,sk7
- push hl
- ld b,11
- ssl7: inc hl
- djnz ssl7
- call inchl
- pop hl
- sk7: ld b,12
- ld a,96
- sl8a: cp c
- jr z,sk8
- dec a
- djnz sl8a
- ld b,12
- ld a,11
- sl8b: cp c
- jr z,sk8
- add a,12
- djnz sl8b
- ld a,(de)
- cp 9
- jr nz,sk8
- push hl
- ld b,13
- ssl8: inc hl
- djnz ssl8
- call inchl
- pop hl
- sk8: inc hl
- inc de
- inc c
- ld a,c
- cp 96
- jp nz,lp3
-
- ;---------- Reset the mines on the field ----------
- ld b,96
- ld hl,ufield
- ld de,field
- lp2: ld a,(hl)
- cp 9
- jr nz,sk9
- ld (de),a
- sk9: ld a,0
- ld (hl),a
- inc hl
- inc de
- djnz lp2
-
- ;---------- Set up the screen ----------
- ld a,0
- ld (yc),a
- ld (xc),a
- ld b,12
- tdrw: push bc
- ld de,top
- call sprite
- ld a,(xc)
- inc a
- ld (xc),a
- pop bc
- djnz tdrw
- ld a,1
- ld (yc),a
- dec a
- ld (xc),a
- ld b,96
- dlp: ld de,block
- call sprite
- ld a,(xc)
- inc a
- cp 12
- jr nz,dcn
- ld a,(yc)
- inc a
- ld (yc),a
- ld a,0
- dcn: ld (xc),a
- djnz dlp
- ld a,0
- ld (xc),a
- inc a
- ld (yc),a
- call dispp
- ROM_CALL(CLEARLCD)
-
- ;---------- Main program loop ----------
- main: call CR_GRBCopy
- keylp:call delay
- ld a,(tv)
- dec a
- jp z,sbtime
- ld (tv),a
- call GET_KEY
- cp G_RIGHT
- jp z,mright
- cp G_LEFT
- jp z,mleft
- cp G_UP
- jp z,mup
- cp G_DOWN
- jp z,mdown
- cp G_2ND
- jp z,munc
- cp G_ALPHA
- jp z,markit
- cp G_DEL
- jp z,pause
- cp G_CLEAR
- jr z,gmovr
- jr keylp
- gmovr: ; Game Over - Show all mines
- ld a,(xc)
- ld b,a
- ld a,(yc)
- ld c,a
- push bc
- ld a,0
- ld (xc),a
- inc a
- ld (yc),a
- ld hl,field
- ld b,96
- golp: ld a,(hl)
- cp 9
- jr nz,gonx
- ld de,mine
- push hl
- call sprite
- pop hl
- gonx: ld a,(xc)
- inc a
- cp 12
- jr nz,gosk
- ld a,(yc)
- inc a
- ld (yc),a
- ld a,0
- gosk: ld (xc),a
- inc hl
- djnz golp
- pop bc
- ld a,b
- ld (xc),a
- ld a,c
- ld (yc),a
- call dispp
- call CR_GRBCopy
- call wkey
- ROM_CALL(CLEARLCD)
- ld hl,10*256+26
- ld (CURSOR_POS),hl
- ld hl,lost
- call CR_GRBCopy
- exit: ROM_CALL(D_ZM_STR)
-
- ;---------- Check High Score ----------
- call wkey
- call BUFCLR
- ROM_CALL(CLEARLCD)
- res 7,(iy+14) ;was 20
- ret ; Exit Land Mine
-
- winner: ROM_CALL(CLEARLCD)
- ld a,(time)
- ld a,(lev)
- sub 4
- ld (lev),a
- cp 24
- jp nz,start
- ld hl,1026
- ld (CURSOR_POS),hl
- ld hl,won
- ROM_CALL(D_LT_STR)
- jr exit
-
- ;---------- Pause ----------
- pause: ROM_CALL(CLEARLCD)
- ld hl,771
- ld (CURSOR_POS),hl
- ld hl,ps
- ROM_CALL(D_LT_STR)
- call wkey
- cp G_DEL
- jp z,gmovr
- ROM_CALL(CLEARLCD)
- jp main
-
- ;---------- Subtract from time left ----------
- sbtime:
- ld a,255
- ld (tv),a
- ld a,(time)
- dec a
- jp z,gmovr
- ld (time),a
- ld hl,0*256+40
- ld (CURSOR_X),hl
- ld hl,blank
- ROM_CALL(D_ZM_STR)
- ld hl,0*256+42
- ld (CURSOR_X),hl
- ld a,(time)
- call DispA
- jp main
-
-
- ;---------- Mark/Unmark a mine ----------
- markit: call align
- ld bc,ufield
- add hl,bc
- ld a,(hl)
- cp 1
- jr z,skmark
- cp 2
- jr z,rmark
- ld a,2
- ld (hl),a
- ld de,mark
- jr markd
- rmark: ld a,0
- ld (hl),a
- ld de,block
- markd: call sprite
- call dispp
- skmark: jp main
-
- ;---------- Move right ----------
- mright: ld a,(xc)
- cp 11
- jr z,xmr
- call setblk
- ld a,(xc)
- inc a
- ld (xc),a
- call dispp
- xmr: jp main
-
- ;---------- Move left ----------
- mleft: ld a,(xc)
- cp 0
- jr z,xml
- call setblk
- ld a,(xc)
- dec a
- ld (xc),a
- call dispp
- xml: jp main
-
- ;---------- Move up -----------
- mup: ld a,(yc)
- cp 1
- jr z,xmu
- call setblk
- ld a,(yc)
- dec a
- ld (yc),a
- call dispp
- xmu: jp main
-
- ;---------- Move down ----------
- mdown: ld a,(yc)
- cp 8
- jr z,xmd
- call setblk
- ld a,(yc)
- inc a
- ld (yc),a
- call dispp
- xmd: jp main
-
- ;---------- Uncover a space ----------
- munc: call align
- ld bc,ufield
- add hl,bc
- ld a,(hl)
- cp 2
- jr z,smuc
- cp 0
- jr nz,mcn
- ld a,(lft)
- dec a
- ld (lft),a
- mcn: ld a,1
- ld (hl),a
- call setblk
- call dispp
- ld a,(tmp)
- cp 9
- jp z,gmovr
- ld a,(lft)
- cp 0
- jp z,winner
- smuc: jp main
-
- ;--------- Set/Reset block ----------
- setblk: call align
- push hl
- ld bc,ufield
- add hl,bc
- ld a,(hl)
- pop hl
- cp 0
- jr z,sbsk2
- cp 1
- jr z,skmrk
- ld de,mark
- jr ok
- skmrk: ld bc,field
- add hl,bc
- ld a,(hl)
- cp 9
- jr nz,not9
- ld (tmp),a
- not9: ld hl,nada
- cp 0
- jr z,sbdn
- ld b,a
- ld de,6
- sblp: add hl,de
- djnz sblp
- sbdn: ex de,hl
- ok: call sprite
- jr sbx
- sbsk2: ld de,block
- call sprite
- sbx: ret
-
- ;---------- inc the value at (hl) ----------
- inchl: ld a,(hl)
- inc a
- ld (hl),a
- ret
-
- ;----------- Point de to xc,yc ----------
- ; This allows a list to be read as a matrix
- align: ld hl,(xc)
- ld a,(yc)
- dec a
- jr z,askp
- ld b,a
- alp: ld de,12 ; width of matrix
- add hl,de
- djnz alp
- askp: ret
-
- ;---------- Wait for a key press ----------
- ;GetKey can not be used because it would really mess up the
- ;calc if it powered down!
- wkey:
- call GET_KEY
- or a
- jr z,wkey
- ret
-
-
- ;---------- Write a sprite (8*7) -----------
- sprite: push bc
- ld hl,(xc)
- ld a,(yc)
- cp 0
- jr z,sxys
- ld b,a
- sxyl: push bc
- ld bc,84
- add hl,bc
- pop bc
- djnz sxyl
- sxys: ld bc,GRAPH_MEM
- add hl,bc
- ld b,7
- slpb: ld a,(de)
- ld (hl),a
- inc de
- push bc
- ld bc,12
- add hl,bc
- pop bc
- djnz slpb
- pop bc
- ret
-
- ;---------- Show current location (box) ----------
- dispp: push bc
- ld de,player
- ld hl,(xc)
- ld a,(yc)
- cp 0
- jr z,sxys2
- ld b,a
- sxyl2: push bc
- ld bc,84
- add hl,bc
- pop bc
- djnz sxyl2
- sxys2: ld bc,GRAPH_MEM
- add hl,bc
- ld b,7
- slpb2: ld a,(de)
- or (hl)
- ld (hl),a
- inc de
- push bc
- ld bc,12
- add hl,bc
- pop bc
- djnz slpb2
- pop bc
- 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
-
- BUFCLR:
- ld hl,$88B8
- ld de,$88B9
- ld bc,$2FF
- ld (hl),0
- ldir
- ret
-
- random: ;by: Jimmy Mardell
- ld a,96
- ld b,a
- ld a,r
- add a,a
- ld hl,0
- ld d,0
- ld e,a
- RMul:
- add hl,de
- djnz RMul
- ld a,h
- ld e,a
- ret
-
- delay:
- ld b,255
-
- delayloop:
- nop
- nop
- nop
- djnz delayloop
- ret
- ;---------- Messages -----------
- lmine:.db 13,"LandMine v1.0"
- abt1: .db 6,"by Joe"
- abt2: .db 13,"Wingbermuehle"
- port: .db " Port- Ahmed El-Helw",0
- lost: .db "You Lost"
- won: .db "You Won!"
- msg1: .db "Mines:",0
- ps: .db 10,"- Paused -"
-
- ;---------- Sprite data ----------
- top: .db 01100110b ; top border
- .db 10011001b
- .db 01100110b
- .db 10011001b
- .db 01100110b
- .db 10011001b
- ; .db 11111111b
- player: .db 11111111b ; box
- .db 10000001b
- .db 10000001b
- .db 10000001b
- .db 10000001b
- .db 10000001b
- .db 11111111b
- block: .db 00000000b ; block
- .db 01010100b
- .db 00101010b
- .db 01010100b
- .db 00101010b
- .db 01010100b
- ; .db 00000000b
- nada: .db 0,0,0,0,0,0 ; 0 - blank
- num1: .db 00000000b ; 1
- .db 00011000b
- .db 00001000b
- .db 00001000b
- .db 00001000b
- .db 00011100b
- ; .db 00000000b
- num2: .db 00000000b ; 2
- .db 00111100b
- .db 00000100b
- .db 00111100b
- .db 00100000b
- .db 00111100b
- ; .db 00000000b
- num3: .db 00000000b ; 3
- .db 00111100b
- .db 00000100b
- .db 00111100b
- .db 00000100b
- .db 00111100b
- ; .db 00000000b
- num4: .db 00000000b ; 4
- .db 00100100b
- .db 00100100b
- .db 00111100b
- .db 00000100b
- .db 00000100b
- ; .db 00000000b
- num5: .db 00000000b ; 5
- .db 00111100b
- .db 00100000b
- .db 00111100b
- .db 00000100b
- .db 00111100b
- ; .db 00000000b
- num6: .db 00000000b ; 6
- .db 00111100b
- .db 00100000b
- .db 00111100b
- .db 00100100b
- .db 00111100b
- ; .db 00000000b
- num7: .db 00000000b ; 7
- .db 00111100b
- .db 00000100b
- .db 00000100b
- .db 00000100b
- .db 00000100b
- ; .db 00000000b
- num8: .db 00000000b ; 8
- .db 00111100b
- .db 00100100b
- .db 00111100b
- .db 00100100b
- .db 00111100b
- ; .db 00000000b
- mine: .db 00000000b ; mine
- .db 01010100b
- .db 00111000b
- .db 01111100b
- .db 00111000b
- .db 01010100b
- ; .db 00000000b
- mark: .db 00000000b ; flag
- .db 00000000b
- .db 00111100b
- .db 00111100b
- .db 00100000b
- .db 00100000b
- .db 00000000b
-
- .end
- END