#include "usgard.h" score = $80DF level = $80E1 time = $80E2 x = $80E3 y = $80E4 vwalls = $80E5 ; 28 bytes hwalls = $8101 ; 30 bytes noBombs = $811F bombLoc = $8120 ; 20 bytes posDir = $8134 ; 4 bytes vaddr = $8138 haddr = $813A timesec = $813C lives = $813D nextmaze = $813E mazelvl = $813F scroll = $8140 randseed = $8141 timeupd = $8142 lastlvl = $8143 timespd = $8144 .org 0 .db "Bomb Sweeper 1.1",0 call &WIN_INIT ret c ld hl,$FC00 ld (DEST_ADDR),hl call CLEARLCD ld bc,$020C ld hl,$0C27 ld de,(PROGRAM_ADDR) ld ix,&IntroWinC ld a,3 call &WIN_CALLER \ .db WIN_PSHOW call OTH_PAUSE StartGame: ld hl,0 ld (score),hl ld a,1 ld (lastlvl),a ld (level),a ld (&Stage),a ld a,3 ld (lives),a ld a,11 ld (nextmaze),a NewLevel: call CLEARLCD xor a ld (scroll),a ld a,(level) ld hl,nextmaze cp (hl) ld hl,mazelvl ld (hl),0 jr nz,StdLvl ld (hl),1 StdLvl: call &ShowScore call &ShowLives call &ShowTime call &WIN_CALLER \ .db WIN_SHOW ld a,(&Stage) ld (&Stage2),a ld (&Stage3),a dec a ld b,a add a,a add a,a add a,b ld hl,level sub (hl) neg ld (&Level2),a ld bc,$0318 ld hl,$0615 ld de,&ReadyWinT ld ix,&ReadyWinC ld a,(mazelvl) or a ld a,3 jr z,ShowReadyWin ld ix,&ReadyWinCF ShowReadyWin: call &WIN_CALLER \ .db WIN_PSHOW call OTH_PAUSE call &ExtractLevel ld a,40 ld (time),a ld a,(timespd) ld (timesec),a call &ShowTime ld hl,&IntHandler call INT_INSTALL NewPos: call &ShowLevel ld hl,0 ld (posDir),hl ld (posDir+2),hl ld ix,posDir ld a,(y) ld h,6 ld l,a call MUL_HL ld bc,hwalls add hl,bc ld a,(x) ld b,0 ld c,a add hl,bc ld (haddr),hl push hl ld a,(hl) or a jr z,UpPossible ld a,(y) or a jr z,CheckDownP ld bc,-6 add hl,bc ld a,(hl) or a jr nz,CheckDownP UpPossible: ld (ix),1 CheckDownP: pop hl ld bc,6 add hl,bc ld a,(hl) or a jr z,DownPossible ld a,(y) cp 3 jr z,CheckLeftP add hl,bc ld a,(hl) or a jr nz,CheckLeftP DownPossible: ld (ix+1),1 CheckLeftP: ld a,(x) add a,a add a,a ld b,0 ld c,a ld hl,vwalls add hl,bc ld a,(y) ld b,0 ld c,a add hl,bc ld (vaddr),hl push hl ld a,(hl) or a jr z,LeftPossible ld a,(x) or a jr z,CheckRightP dec hl dec hl dec hl dec hl ld a,(hl) or a jr nz,CheckRightP LeftPossible: ld (ix+2),1 CheckRightP: pop hl inc hl inc hl inc hl inc hl ld a,(hl) or a jr z,RightPossible ld a,(x) cp 5 jr z,Main inc hl inc hl inc hl inc hl ld a,(hl) or a jr nz,Main RightPossible: ld (ix+3),1 Main: ld a,(scroll) or a jp nz,&ScrollMap push ix ld a,(timeupd) or a call nz,&ShowTime pop ix ld a,(time) ld hl,mazelvl or (hl) jp z,&Dead call GET_KEY cp K_EXIT jp z,&QuitGame cp K_SECOND jp z,&TryAgain dec a jr z,CheckDown dec a jr z,CheckLeft dec a jr z,CheckRight dec a jr nz,Main ld a,(ix) or a jr z,Main ld hl,y ld a,(hl) or a jp z,&LevelDone dec (hl) ld ix,(haddr) ld a,(ix) or a jp z,&NewPos ld (ix),0 ld (ix-6),1 jp &NewPos CheckDown: ld a,(ix+1) or a jr z,Main ld hl,y ld a,(hl) cp 3 jr z,LevelDone inc (hl) ld ix,(haddr) ld a,(ix+6) or a jp z,&NewPos ld (ix+6),0 ld (ix+12),1 jp &NewPos CheckLeft: ld a,(ix+2) or a jp z,&Main ld hl,x ld a,(hl) or a jr z,LevelDone dec (hl) ld ix,(vaddr) ld a,(ix) or a jp z,&NewPos ld (ix),0 ld (ix-4),1 jp &NewPos CheckRight: ld a,(ix+3) or a jp z,&Main ld hl,x ld a,(hl) cp 5 jr z,LevelDone inc (hl) ld ix,(vaddr) ld a,(ix+4) or a jp z,&NewPos ld (ix+4),0 ld (ix+8),1 jp &NewPos LevelDone: ld a,(mazelvl) or a jr nz,MazeFinished call INT_REMOVE xor a ld (noBombs),a call &ShowLevel ld hl,level inc (hl) ld a,(time) or a jp z,&NewLevel ld b,a IncScore: ld hl,(score) inc hl ld (score),hl push bc call &ShowScore ld b,6 Pause: halt djnz Pause pop bc djnz IncScore jp &NewLevel MazeFinished: ld a,(time) or a jp nz,&Main ld a,(x) dec a jp nz,&Main call INT_REMOVE ld hl,nextmaze ld a,(hl) add a,5 ld (hl),a ld hl,level ld a,(hl) sub 5 ld (hl),a ld bc,$0213 ld hl,$0815 ld ix,&DoneWinC ld de,&DoneWinT ld a,3 call &WIN_CALLER \ .db WIN_PSHOW ld b,100 IncBonusScore: ld hl,(score) inc hl ld (score),hl push bc call &ShowScore pop bc halt halt halt halt halt halt djnz IncBonusScore call OTH_PAUSE ld hl,&Stage inc (hl) ld a,(lastlvl) or a jp nz,&NewLevel GameFinished: ld bc,$0213 ld hl,$0821 ld ix,&GameWinC ld de,&GameWinT ld a,3 call &WIN_CALLER \ .db WIN_PSHOW call OTH_PAUSE jp OTH_EXIT Dead: call INT_REMOVE ld hl,lives dec (hl) jr z,GameOver ld bc,$031A ld hl,$0610 ld de,&OuchWinT ld ix,&OuchWinC ld a,3 call &WIN_CALLER \ .db WIN_PSHOW call OTH_PAUSE jp &NewLevel TryAgain: call INT_REMOVE ld hl,lives dec (hl) jr z,GameOver jp &NewLevel GameOver: ld bc,$021A ld hl,$0810 ld de,&GameOverWinT ld ix,&GameOverWinC ld a,3 call &WIN_CALLER \ .db WIN_PSHOW call OTH_PAUSE Quit: call &WIN_EXIT ret QuitGame: call INT_REMOVE jr Quit ScrollMap: xor a ld (scroll),a ld hl,x ld a,(hl) cp 5 jr nz,MoveMan ld de,(vaddr) ld a,(de) or a jr nz,Dead dec (hl) MoveMan: inc (hl) ld hl,vwalls+23 ld de,vwalls+27 ld bc,24 lddr ld hl,hwalls+28 ld de,hwalls+29 ld bc,29 lddr inc hl ld de,6 ld b,5 ClearHWalls: ld (hl),0 add hl,de djnz ClearHWalls ld hl,vwalls ld a,1 ld (hl),a inc hl ld (hl),a inc hl ld (hl),a inc hl ld (hl),a ld hl,vwalls ld a,(time) cp 7 jr c,EndOfMaze ld a,4 call &RandomNo ld d,0 ld e,a push hl add hl,de ld (hl),0 pop hl ld hl,hwalls ld a,3 call &RandomNo inc a add a,a ld c,a add a,a add a,c ld d,0 ld e,a push hl add hl,de ld (hl),1 pop hl jp &NewPos EndOfMaze: or a jr z,EOM xor a ld (hl),a inc hl ld (hl),a inc hl ld (hl),a inc hl ld (hl),a jr NotEnd EOM: ld hl,$0101 ld (noBombs),hl NotEnd: ld hl,hwalls+24 ld (hl),1 ld hl,hwalls ld a,(time) dec a jp z,&NewPos ld (hl),1 jp &NewPos RandomNo: push hl ld d,a ld a,r ld hl,randseed add a,(hl) and 127 ld (hl),a add a,a ld h,d ld l,a call MUL_HL ld a,h pop hl ret ShowLevel: ld hl,GRAPH_MEM ld (DEST_ADDR),hl ld bc,1023 call OTH_CLEAR ld a,(x) add a,a add a,a add a,a add a,18 ld b,a ld a,(y) add a,a add a,a add a,a add a,8 ld c,a ld hl,&ManSprite #fncall PSPR_NR ld ix,vwalls ld hl,GRAPH_MEM+$72 ld c,7 VWallCol: push hl ld b,4 ShowVWall: push hl ld a,(ix) inc ix or a jr z,NoVWall push bc ld b,7 ld de,$10 VPutPixel: set 7,(hl) add hl,de djnz VPutPixel pop bc NoVWall: pop hl ld de,$80 add hl,de djnz ShowVWall pop hl inc hl dec c jr nz,VWallCol ld hl,GRAPH_MEM+$62 ld de,$7A ld c,5 HWallRow: ld b,6 ShowHWall: ld a,(ix) inc ix or a jr z,NoHWall ld (hl),$7F NoHWall: inc hl djnz ShowHWall add hl,de dec c jr nz,HWallRow ld a,(ix) or a jr z,FlipScreen ld b,a inc ix PutBombs: push bc ld a,(ix) inc ix bit 4,a jr z,HBomb ld b,12 bit 5,a jr z,LBomb ld b,65 LBomb: and $0F add a,a add a,a add a,a add a,9 ld c,a jr PutBomb HBomb: ld c,2 bit 5,a jr z,UBomb ld c,39 UBomb: and $0F add a,a add a,a add a,a add a,18 ld b,a PutBomb: ld hl,&BombSprite push ix #fncall PSPR_NR pop ix pop bc djnz PutBombs FlipScreen: ld hl,$FC00 ld (DEST_ADDR),hl ld bc,(WIN_SCRLY) ld h,0 ld l,c ld d,h ld e,b add hl,hl add hl,hl add hl,hl add hl,hl add hl,de ld de,GRAPH_MEM add hl,de ld a,16 ld bc,(WIN_RSIZE) sub b ld e,a ld d,0 ld ix,(WIN_REGION) Win_YCopy: push bc Win_XCopy: ld a,(hl) ld (ix),a inc hl inc ix djnz Win_XCopy pop bc add ix,de add hl,de dec c jr nz,Win_YCopy ret MazeLevel: ld a,(&Stage) dec a ld l,a ld h,25 call MUL_HL ld a,200 sub l ld (timespd),a ld bc,$0005 ld (x),bc ld hl,vwalls ld bc,57 call OTH_CLEAR ld hl,vwalls+24 ld b,10 Fill1: ld (hl),1 inc hl djnz Fill1 ld hl,hwalls+24 ld b,6 Fill2: ld (hl),1 inc hl djnz Fill2 xor a ld (noBombs),a ret ExtractLevel: ld a,(mazelvl) or a jr nz,MazeLevel ld a,200 ld (timespd),a ld hl,&LevelData ld a,(level) dec a jr z,ReadLevel ld b,a ld d,0 SearchLevel: ld a,(hl) or a jp z,&GameFinished ld e,a add hl,de djnz SearchLevel ReadLevel: ld a,(hl) ld (lastlvl),a inc hl ld de,x xor a rld ld (de),a inc de rld ld (de),a inc de rld inc hl ld b,58 ld c,8 ex de,hl ld a,(de) ReadWalls: ld (hl),0 rlca jr nc,NoWall ld (hl),1 NoWall: inc hl dec b jr z,ReadBombs dec c jr nz,ReadWalls inc de ld a,(de) ld c,8 jr ReadWalls ReadBombs: ld a,(de) and $3F ld (hl),a inc de inc hl ld b,0 ld c,a ex de,hl ldir ld a,r push af bit 0,a jr z,CheckVFlip ld hl,x ld a,(hl) sub 5 neg ld (hl),a inc hl inc hl ld de,vwalls+24 ld b,3 HSwapVWalls: push bc ld b,4 Swap1: call &Swap inc de inc hl djnz Swap1 ex de,hl ld bc,-8 add hl,bc ex de,hl pop bc djnz HSwapVWalls ld hl,hwalls ld de,hwalls+5 ld b,5 HSwapHWalls: push bc ld b,3 Swap2: call &Swap inc hl dec de djnz Swap2 inc hl inc hl inc hl ex de,hl ld bc,9 add hl,bc ex de,hl pop bc djnz HSwapHWalls ld b,(hl) inc hl HSwapBombs: ld a,(hl) bit 4,a jr z,HChgCoord xor $20 ld (hl),a jr HNextBomb HChgCoord: ld c,a and $0F sub 5 neg ld (hl),a bit 5,c jr z,HNextBomb set 5,(hl) HNextBomb: inc hl djnz HSwapBombs CheckVFlip: pop af bit 1,a ret z ld hl,y ld a,(hl) sub 3 neg ld (hl),a inc hl ld de,vwalls+3 ld b,7 VSwapVWalls: call &Swap inc hl dec de call &Swap inc hl inc hl inc hl inc de inc de inc de inc de inc de djnz VSwapVWalls ld de,hwalls+24 ld b,2 VSwapHWalls: push bc ld b,6 Swap3: call &Swap inc de inc hl djnz Swap3 ex de,hl ld bc,-12 add hl,bc ex de,hl pop bc djnz VSwapHWalls ld de,18 add hl,de ld b,(hl) inc hl VSwapBombs: ld a,(hl) bit 4,a jr nz,VChgCoord xor $20 ld (hl),a jr VNextBomb VChgCoord: ld c,a and $0F sub 3 neg set 4,a ld (hl),a bit 5,c jr z,VNextBomb set 5,(hl) VNextBomb: inc hl djnz VSwapBombs ret Swap: ld c,(hl) ld a,(de) ld (hl),a ld a,c ld (de),a ret ShowScore: ld bc,$0C06 ld de,&ScoreWinT ld hl,(score) ShowWindow: ld (&DispWord),hl ld hl,$0310 ld ix,&WinContents ld a,3 call &WIN_CALLER \ .db WIN_PSHOW ld bc,$0106 ld hl,$0A34 ld de,(PROGRAM_ADDR) ld a,1 call &WIN_CALLER \ .db WIN_PREPARE ret ShowLives: ld bc,$0C18 ld de,&LivesWinT ld a,(lives) ld h,0 ld l,a jr ShowWindow ShowTime: xor a ld (timeupd),a ld bc,$0C2A ld de,&TimeWinT ld a,(time) ld h,0 ld l,a jr ShowWindow IntHandler: ld hl,timesec dec (hl) ret nz ld a,(timespd) ld (hl),a ld hl,time ld a,(hl) or a ret z dec (hl) ld a,(mazelvl) ld (scroll),a ld a,1 ld (timeupd),a ret ScoreWinT: .db "Score",0 LivesWinT: .db "Lives",0 TimeWinT: .db "Time",0 WinContents: .db NUM DispWord: .dw 0 .db 0 IntroWinC: .db LF,XTAB,7 .db "An USGARD game made by",LF .db XTAB,24,"Jimmy Mardell",LF .db XTAB,18,"",0 DoneWinT: .db "WELL DONE!",0 DoneWinC: .db XTAB,6,"You've finished" .db LF,XTAB,14,"stage ",BNUM Stage: .db 0,"!",0 GameWinT: .db "CONGRATULATIONS!",0 GameWinC: .db XTAB,14,"You did it!!!",LF .db " You have saved the",LF .db XTAB,3,"citizens from the",LF .db XTAB,7,"evil terrorist!!",0 OuchWinT: .db "OUCH!",0 OuchWinC: .db XTAB,6,"Try again!",0 GameOverWinT: .db XTAB,13,"GAME OVER",0 GameOverWinC: .db XTAB,5,"You died sucker!" .db 0 ReadyWinT: .db XTAB,12,"READY?",0 ReadyWinC: .db XTAB,8,"Stage",BNUM Stage2: .db 0,YTAB,6 .db XTAB,-31,"Level",BNUM Level2: .db 0,0 ReadyWinCF: .db XTAB,8,"Stage",BNUM Stage3: .db 0,YTAB,6 .db XTAB,-35,"FINAL MAZE",0 ManSprite: .db 5,5 .db %00100000 .db %00100000 .db %11111000 .db %00100000 .db %00100000 BombSprite: .db 4,4 .db %01100000 .db %11110000 .db %11110000 .db %01100000 LevelData: .db $0B,$00,$E0,$00,$00,$FF,$FE,$7F,$EF,$C1,$13 .db $0B,$00,$F0,$F0,$F0,$EF,$C0,$FC,$0F,$C1,$33 .db $0B,$00,$F2,$1E,$48,$FF,$B0,$6C,$6F,$C1,$05 .db $0B,$23,$F7,$32,$06,$FF,$DE,$20,$6B,$C1,$21 .db $0C,$30,$FA,$80,$CE,$FB,$50,$71,$EF,$C2,$01,$04 .db $0C,$00,$FE,$C8,$42,$7F,$85,$39,$FF,$C2,$05,$30 .db $0B,$50,$BE,$BE,$BE,$FF,$C0,$00,$8F,$C1,$11 .db $0B,$00,$F0,$8E,$6A,$BF,$DB,$C1,$BF,$C1,$31 .db $0B,$00,$E2,$40,$40,$FF,$FE,$9D,$BF,$C1,$13 .db $0B,$53,$FE,$14,$27,$F7,$CE,$70,$8F,$C1,$00 .db $0C,$33,$FE,$C8,$0C,$FA,$C6,$79,$FF,$C2,$01,$03 .db $0B,$00,$F0,$F2,$C0,$FE,$CE,$D4,$EF,$C1,$03 .db $0B,$00,$F0,$F0,$F0,$EF,$E9,$5A,$9F,$C1,$33 .db $0B,$50,$7E,$3E,$7E,$FF,$C8,$00,$8F,$C1,$10 .db $0B,$53,$7E,$78,$E7,$FF,$C0,$30,$AF,$C1,$10 .db $0B,$03,$F7,$48,$0E,$FB,$CC,$F8,$EF,$C1,$01 .db $0B,$03,$F3,$39,$63,$EF,$F3,$30,$AF,$C1,$33 .db $0B,$50,$F2,$6C,$08,$EF,$D3,$F4,$DF,$C1,$33 .db $0F,$33,$EF,$0F,$75,$57,$C8,$7F,$2F,$45,$00,$13,$24,$30,$32 .db $0D,$12,$63,$61,$63,$EF,$EC,$7B,$3F,$C3,$10,$13,$33 .db $10,$12,$E6,$C3,$37,$E7,$8E,$73,$8E,$46,$00,$05,$13,$23,$24,$33 .db $0E,$32,$B7,$0B,$D4,$F7,$F8,$EC,$BB,$84,$00,$11,$21,$25 .db $0E,$22,$E2,$D5,$07,$77,$DC,$D9,$6F,$44,$00,$13,$24,$30 .db $0C,$40,$72,$5A,$B5,$FF,$EB,$E9,$47,$C2,$10,$20 .db $0B,$00,$FA,$4F,$4A,$EF,$ED,$4A,$DF,$C1,$33 .db $0B,$00,$F6,$E5,$E2,$EF,$ED,$21,$2F,$C1,$33 .db $0B,$00,$FD,$44,$63,$EF,$C3,$71,$AF,$C1,$33 .db $0B,$50,$D2,$47,$1A,$FF,$FC,$5A,$8F,$C1,$12 .db $0D,$03,$FD,$26,$47,$EF,$9A,$13,$CF,$43,$05,$24,$33 .db $11,$53,$69,$63,$A7,$DB,$5E,$57,$BA,$C7,$01,$04,$10,$13,$21,$23,$32 .db $11,$02,$F6,$F6,$9F,$27,$63,$7A,$37,$47,$00,$05,$20,$24,$30,$31,$33 .db $0E,$53,$D6,$F9,$E5,$F7,$92,$37,$17,$C4,$00,$05,$12,$20 .db $0F,$50,$DA,$7E,$78,$FA,$D2,$42,$FB,$85,$01,$03,$12,$21,$25 .db $10,$00,$BE,$76,$D6,$BE,$FE,$85,$E7,$06,$03,$11,$20,$24,$25,$31 .db $00,$00,$CE,$29,$76,$7D,$FF,$33,$EE,$86,$02,$12,$13,$23,$25,$30 #include lib/winlib.h .end