#include "usgard.h" PlayerCoords = TEXT_MEM ;A word to hold the x and y coords of the player BugCoords = TEXT_MEM+2 ;Another word to hold x+y coords of the bug MoveCounter = TEXT_MEM+4 ;How long until a move CurMove = TEXT_MEM+5 ;What move we are on .org 0 ;Required- Say that this is the beginning of the prog. .db "Bug Catcher",0 ;Title ld hl,$0101 ;Put $0101 as the bug coords. ld (BugCoords),hl ld hl,$0A07 ;Put $0A07 as the players coords. ld (PlayerCoords),hl call CLEARLCD ;Clear the screen. ld hl,&TitleScreen ;point hl to the title screen text ld de,$0000 ld ($800C),de ;Put the cursor at 0,0 call D_ZT_STR ;Display The title screen ld c,5 ;Our starting rate ChangeRate: ld de,$1002 ld ($800C),de ;Put the cursor at 17,2 ld a,c ;get a out of c add a,'0' ;make it a printable character call TR_CHARPUT ;Print the char on the screen call GET_KEY ;Get a key. cp $37 ;See if the key is EXIT ret z ;Exit if it is cp 9 ;See if it is enter jr z,ToGame ;Start the game if it is cp K_UP ;See if the key is up jr z,incit ;increment the rate cp K_DOWN ;Check if the key is down jr z,decit ;dec the rate if it is. jr ChangeRate ;Not one of the keys; loop arond. incit: ld a,c cp 9 ;If c is 9, go back- its our max jr z,ChangeRate inc c jr ChangeRate decit: ld a,c cp 1 ;If c is 1, its our min so go back jr z,ChangeRate dec c jr ChangeRate ToGame: ld a,c ld (MoveCounter),a ;Save the rate call &DrawScreen ;Draw! Game_Loop: ;The game loop. This is the game's main loop. call GET_KEY ;Get a key ld hl,PlayerCoords ;Point hl to the player coords, will be useful later cp K_UP ;\ jr z,Up ; \ cp K_DOWN ; \ jr z,Down ; You should know cp K_LEFT ; what all these do. jr z,Left ; / cp K_RIGHT ; / jr z,Right ;/ cp $37 ;$37 is the scancode for exit. ret z jr Game_Loop P_Moved: ;Game will come here after a move has been made. ld hl,(MoveCounter) ;l is the move counter; h is the curmove ld a,h inc a cp l ;See if it is time to move the bug call z,&MoveBug ;Move now if time ld (CurMove),a ;save a for next time. call &DrawScreen ;Draw! ld hl,(PlayerCoords) ;get the player coords in hl ld de,(BugCoords) ;get the bug coords in de call CP_HL_DE ;only if cp hl,de was a legal command.. jr nz,Game_Loop ;Oh well, this rom call does the same exact thing call CLEARLCD set 3,(IY+05) ;Display white on black ld hl,&Win ;point hl the the win text ld de,0 ld ($800C),de ;cursor=(0,0) call D_ZT_STR ;Display you win res 3,(IY+05) ;Display black on white (normal) wait: call GET_KEY ;\ cp K_EXIT ; Wait for exit jr nz,wait ;/ ret ;Back to Usgard for us. Up: ld a,(hl) ;I told you pointg hl earlier would be useful cp 0 ;Find out if the val hl points to is 0. jr z,Game_Loop ;Go back if it is. dec (hl) ;dec the mem hl points at jr P_Moved Down: ld a,(hl) cp 7 ;7- bottom row jr z,Game_Loop inc (hl) jr P_Moved Left: inc hl ;inc hl so it points to the x coord ld a,(hl) cp 0 jr z,Game_Loop dec (hl) jr P_Moved Right: inc hl ld a,(hl) cp 20 ;20 is the furthest right we can go. jr z,Game_Loop inc (hl) jr P_Moved DrawScreen: call CLEARLCD ;Clear the screen ld hl,(BugCoords) ; ld ($800C),hl ;Copy the bug coords to the cursor location ld a,'*' call TR_CHARPUT ;put a "*" there. ld a,'#' ld hl,(PlayerCoords) ;Copy the bug coords to the cursor loc ld ($800C),hl ; call TR_CHARPUT ;Display a "#" there. ret ;Go back to where we came MoveBug: call RANDOM ;This is an Usgard function and %111 ;You don't know this yet. ld l,a push hl ;push hl away; random destroys it. G_I_B: call RANDOM and %11111 cp 20 jr nc,G_I_B pop hl ;Get hl back. ld h,a ld (BugCoords),hl ld a,0 ret ;I will walk you through this section next lesson ;All the DB's for the game TitleScreen: ;123456789012345678901 .db " BugCatcher! " .db "Use up/down arrows to" .db "Change 'Speed':",0 Win: .db " YOU WIN!! ",0 .end ;Required by TASM