;************************************************************************ ;*BBB L 00 CC K K EEE DD III N N Version 1.3 * ;*B B L 0 0 C C K K E D D I NN N 9/4/99 * ;*BBB L 0 0 C KK EE D D I N N N * ;*B B L 0 0 C K K E D D I N NN * ;*BBB LLL 00 CCC K K EEE DDD III N N By Levi Lansing * ;************************************************************************ ; ;--Best if viewed and compiled in Asm Studio 86 (http//www.stupidzone.com) ;--Use two space tab stops to line everything up (no variable width fonts!) ;--If it still looks bad, it's because I used Ti86pc as my font! (if you don't ; have it, you can get it from Ti-Graph Link 86 (aka winlink). I like the font a lot. ; ;email me - puzzlesome@hotmail.com ; I'll gladly help you if you have any questions ;visit my website - http://www.crosswinds.net/~levisti86/ -dedicated to ASM! ; ;by the way, the star of the game is Bob (the little guy you navigate) #include "asm86.h" #include "ti86asm.inc" _getcode .equ 4068h ;1000's of clocks faster than _getky (AKA GET_KEY). _cphlde .equ 403Ch ;compares hl to de _ldhlz .equ 437Bh ;loads b amount of zeros into data pointed to by hl ;The _plotSScreen is where the stuff on the graph is stored. ;It is located at C9FAh to CDF9h (1024 bytes). ;The following variables use this area to store temporary data- Temp_Level = _plotSScreen ;C9FAh Blank = _plotSScreen+20 ;CA0Eh Temp_Block_L = _plotSScreen+28 ;CA16h Temp_Block = _plotSScreen+52 ;CA2Eh BobX = _plotSScreen+60 ;CA36h BobY = _plotSScreen+61 ;CA37h Time_Delay = _plotSScreen+62 ;CA38h Level = _plotSScreen+63 ;CA39h Timer = _plotSScreen+65 ;CA3Bh Score = _plotSScreen+67 ;CA3Dh Bonus = _plotSScreen+69 ;CA3Fh CurSkill = _plotSScreen+71 ;CA41h VPTEMP = _plotSScreen+72 ;CA42h .org _asm_exec_ram ;Loads the Pragram into RAM and runs it nop ;\ jp Start1 ; \ .dw $0000 ; \Ashell .dw Title ; /stuff Title: ; / .db "Blocked In ver 1.3",0 ;/ Start1: im 1 ;This is where we fix the down-left freeze (and 5 other combos) ld hl,$D400 ;I didn't make this code and don;t know how it works ld de,$D401 ld bc,$0100 ld (hl),$D3 ldir ld hl,int_handler ld de,$D3D3 ld bc,int_end-int_handler ldir ld a,$D4 ld i,a im 2 jr donepatch int_handler: ex af,af' ld a,($C1B4) ;_CXCURAPP cp $1D jr c,int_ok cp $20 jr nc,int_ok im 1 jp $0039 int_ok: in a,($03) bit 3,a jp z,$0039 res 0,a out ($03),a jp $0039 int_end: donepatch: ;We have just fixed it! call _flushallmenus ;Exits all menus in the OS call _runindicoff ;turns the stupid run indicator off ld a,($C008) ;load contrast value cp 31 ;check if the contrast is at max jr z,Start ;if it is, jump to start (don't increase it) inc a ;increase the contrast ld ($C008),a ;write it back to memory out (2),a ;and to the port Start: call _clrScrn ;clears the screen and the text shaddow res plotloc,(iy+plotflags) ; res appTextSave,(iy+appflags) ;keeps the program from writing to the text shaddow res appAutoScroll,(iy+appflags) ;doesn't allow the screen to scroll automatically ld hl,_plotSScreen ;points hl to the graph shaddow memory ld b,76 ;b = 76 bytes call _ldhlz ;clears (inserts 0's) into the first 26 bytes of the graph shaddow memory set textInverse,(iy+textflags) ld de,$0000 ;0 -> d , 0 -> e ld (_curRow),de ;_curRow = d , _curCol = e ld hl,TitleText ;hl points to TitleText call _puts ;put TitleText (intro screen) res textInverse,(iy+textflags) ld de,$FD80 ;points de to the middle of the display memory ld ix,Written ;points hl to the Written by.. Sprite ld de,$0303 ld b,10 ;bc = 128 bytes by_Loop: ;loads bc amount of bytes from hl to de (puts to 128 x 8 sprite) call PutSprite inc d djnz by_Loop call Load_New_Level ld hl,Intro_Data ld de,Temp_Level ld bc,20 ldir Menu_Loop: ;checks for keys pressed in the intro screen and does stuff when they're pressed call Refresh_Background call _getcode ;check if a key has been pressed without pausing cp K_EXIT ;check if it's Exit jp z,Exit ;jump if it is to Exit cp K_F1 ;check if it's F1 jp z,Start_Game ;jp if it is to Start_Game cp K_F2 ;check if it's F2 jr z,ViewScores ;jp if it is to ViewScores cp K_F3 ;get the idea.... jp z,Help cp K_F5 jp z,Exit cp K_PLUS jr z,Contrast_Up cp K_MINUS jr z,Contrast_Down jr Menu_Loop ;jump to Menu_Loop Contrast_Up: ld a,($C008) ;load contrast value inc a ;increase the contrast ld ($C008),a ;write it back to memory out (2),a ;and to the port cp 32 jr z,Contrast_Down jr Menu_Loop Contrast_Down: ld a,($C008) ;load contrast value dec a ;increase the contrast ld ($C008),a ;write it back to memory out (2),a ;and to the port cp 255 jr z,Contrast_Up jr Menu_Loop ViewScores: ;displays the high scores call _clrScrn ;clear the screen and text shaddow call _homeup ;load _curRow & _curCol with 0 ld hl,HighScoreText ;hl points to HighScoreText set textInverse,(iy+textflags) ;turn inverse text on call _puts ;put the text ld a,(_curRow) ;_curRow -> a inc a ;a+1 -> a ld (_curRow),a ;a ->_curRow call _puts ;print the next line ld a,(_curRow) ;\ inc a ; = (_curRow+1 -> _curRow) ld (_curRow),a ;/ call _puts ;print the next line ld a,(_curRow) ;\ inc a ; = (_curRow+1 -> _curRow) ld (_curRow),a ;/ call _puts ;print the last line res textInverse,(iy+textflags) ;text to normal ld de,$0002 ;0 ->d , 2 -> e ld (_curRow),de ;d -> _curRow , e -> _curCol ld hl,HighScore ;hl points to HighScore call _puts ;put it ld hl,(HighScoreE) ;hl points to HighScoreE (highscore for the easy levels) call _putHL ;jumps to _putHL until a ret is encountered (_putHL puts the Number in hl) ld de,$0004 ;-- /\ ld (_curRow),de ;---|| ld hl,HighScoreE+2 ;---|| call _puts ;---|| ld hl,(HighScoreM) ;---|| call _putHL ;---|| ld de,$0006 ;---|| ld (_curRow),de ;---|| ld hl,HighScoreM+2 ;---|| call _puts ;---|| ld hl,(HighScoreH) ;---|| call _putHL ;---|| Score_Loop: call _getcode ;check if a key has been pressed cp 0 ;check if no key was pressed jr z,Score_Loop ;if no key was pressed, loop cp K_CLEAR jr z,Clear_Scores jp Start ;jump to Start Clear_Scores: call _clrScrn ld hl,Clear? ld de,$0002 ld (_curRow),de call _puts ld de,$0007 ld (_curRow),de set textInverse,(iy+textflags) call _puts res textInverse,(iy+textflags) Clear_Loop: call _getcode cp K_F1 jr z,Clear_em cp K_F2 jp z, ViewScores jr Clear_Loop Clear_em: ld hl,Defaults ld de,HighScore ld bc,61 ldir call SaveScore jp ViewScores Help: ;displays the help text call _clrScrn ;clears the screen and the text shaddow ld de,0 ;0 -> d , 0 -> e ld (_penCol),de ;d -> _penCol , e -> _penRow ld hl,HelpText ;hl points to HelpText call _vputs ;put the Text in the small font ld b,9 ;9 -> b Help_Loop: ld a,(_penRow) ;\ add a,6 ; - add 6 to _penRow ld (_penRow),a ;/ ld a,0 ;\_ load 0 into _penCol ld (_penCol),a ;/ call _vputs ;put the next line in the small font djnz Help_Loop ;decrements b and if it's not 0, jump to Help_Loop Help_Loop2: call _getcode ;check if a key has been pressed cp 0 ;if no key was pressed, jp nz,Start ;jp to Start jr Help_Loop2 ;if a key was pressed, loop Start_Game: ;this is where the game beginins call _clrScrn ;clear the screen and the text shaddow call _homeup ;put the cursor position at 0,0 ld de,$0002 ;\_ cursor position to 0,2 ld (_curRow),de ;/ ld hl,Skill_Level ;hl points to text call _puts ;put the text (big) ld a,(Skill) ;Skill -> a inc a ;increment a ld b,a ;a -> b ld de,22 ;22 ->de Skill_Loop: add hl,de ;point hl 22 (de) bytes ahead of whrer is is currently djnz Skill_Loop ;decrement b and jp if it isn't 0, to Skill_Loop sbc hl,de ;hl points to far ahead because Skill was incremented to be between 1 & 3, ;so, this points hl 22 bytes in the other direction ld de,$0007 ;\_ 0 -> _curRow , 7 -> _curCol ld (_curRow),de ;/ call _puts ;put text in hl on the screen Start_Game_Loop: call _getcode ;check if a key was pressed cp K_EXIT ;if it was Exit jp z,Start ;jump to Start cp K_F1 ;if it was F1 jr z,Easy ;jump to Easy cp K_F3 ;etc... jr z,Medium ;etc... cp K_F5 ;etc... jr z,Hard ;etc... jr Start_Game_Loop ;jump to Start_Game_Loop Easy: ld hl,1 ;0 -> h , 1 -> l ld (Level),hl ;hl -> Level (Level is two bytes) ld a,1 ;1 -> a ld (CurSkill),a ;1 -> CurSkill jr Start_New ;jump to Start_New Medium: ld a,(Skill) ;skill -> a cp 0 ;if skill level is 0 jr z,Start_Game_Loop ;go back, you can't play the medium levels ld hl,11 ;0 -> h , 11 -> l ld (Level),hl ;hl -> Level (Level is 2 bytes long) ld a,2 ;2 -> a ld (CurSkill),a ;2 -> CurSkill (so I know which set of levels you're playing) jr Start_New ;jump to Start_New Hard: ld a,(Skill) ;Skill -> a cp 2 ;check if a = 2 jr nz,Start_Game_Loop ;if it doesn't, you're not qualified for the hard levels ld hl,21 ld (Level),hl ;21 ->Level ld a,3 ld (CurSkill),a ;3 -> CurSkill (So I know which set of levels you're playing) Start_New: call _clrScrn ;clear the screen and the text shaddow ld hl,0 ld (Score),hl ;0 -> Score LoadNewLevel: call Load_New_Level jr continue ;This is the first complicated part... Load_New_Level: ;a random routine by Jimmy Mardell ld b,4 ;4 -> b (integer between 0 and 3) ld a,r ;r -> a - donno what r is ?? (some thing fairly random I guess add a,a ;doubles a ld hl,0 ;0 -> h , 0 -> l ld d,0 ;0 -> d ld e,a ;a -> e RMul: add hl,de ;adds de to hl and stores it in hl ;e will be added to l until it's greater than 255, then a 1 is put in h and 0 into l djnz RMul ;decrement b and if it isn't 0 jump to RMul ld a,h ;h -> a ;end of the random routine inc a ;increment a so it's between 1 and 4 cp 1 ;check if a = 1 jr nz,Two ;if it isn't, goto Two and check if it's 2 ld hl,Block1 ;hl points to Block1 jr Load_Block ;jump to Load_Block Two: ;the same as above, but checks if a = 2 cp 2 jr nz,Three ld hl,Block2 jr Load_Block Three: ;the same, but checks if a = 3 cp 3 jr nz,Four ld hl,Block3 jr Load_Block Four; ;if a <> 1, 2, or 3, then it = 4... ld hl,Block4 ;hl points to Block4 Load_Block: ld de,Temp_Block_L ;points de to Temp_Block_L ld bc,24 ;24 -> bc (24 bytes to copy) ldir ;copies 24 bytes of hl into de (temporary storage to be manipulated and not destroyed ret continue: ld a,20 ;20 -> a ld (Time_Delay),a ;a -> Time_Delay ld hl,(Level) ;\_ loads the level into l ld b,l ;/ ld ix,Times-1 ;points ix to 1 bytes before Times inc_ix: inc ix ; points ix forward 1 bytes djnz inc_ix ;loop b amount of times ld h,0 ;0 -> h ld a,(ix) ;level time -> a ld l,a ;a -> l ld (Timer),hl ;level time -> Timer ld hl,(Level) ;level -> hl ld b,l ;l -> b (the level number) ld ix,Bonuses-1 ;ix points 1 byte behind of ix inc_ix2: inc ix ;point ix 1 byte forward djnz inc_ix2 ;decrement b and if it isn't 0, jump to inc_ix2 ld h,0 ;0 -> h ld a,(ix) ;level bonus -> a ld l,a ;a -> l ld (Bonus),hl ;level bonus -> Bonus ;************************************************************************** ;**If you're just learning the asm language, that's the end of the highly** ;**detailed, step-by-step instructions. From here on out, I'm just going** ;**explain what I'm doing and why because it's a little more complicated.** ;************************************************************************** Refresh_Old_Level: call Level_To_Temp ;loads the current level into a temporary variable call Refresh_Background ;puts the blocks, and the goal on the screen ld hl,Temp_Level+16 ;this is where the Bob's coords are ld a,(hl) ld (BobX),a ld d,a inc hl ld a,(hl) ld (BobY),a ld e,a ld ix,Bob call PutSprite ;puts Bob where he belongs PutSideBar: ;this puts the stuff on the side; I'll explain one- ld de,$0000 ;0 -> d, 0-> e ld (_penCol),de ;d -> (_penCol), e -> (_penRow) ld hl,SideBar ;SideBar text -> hl call _vputs ;put small font ld de,$0D00 ld (_penCol),de call _vputs ld de,$1A00 ld (_penCol),de call _vputs ld de,$2700 ld (_penCol),de call _vputs ld de,$0600 ld (_penCol),de ld hl,(Level) call _vputHL ;_vputHL is a routine (Later in the program) that turns ;a number in hl (0-65535) into text and puts in the small font ld de,$1300 ld (_penCol),de ld hl,(Score) call _vputHL ld de,$2000 ld (_penCol),de ld hl,(Bonus) call _vputHL ld de,$2D00 ld (_penCol),de ld hl,(Timer) call _vputHL Main_Loop: call Refresh_Background ;puts the blocks, and the goal on the screen ld a,(Time_Delay) ;the time delay makes the time run slower dec a ld (Time_Delay),a cp 0 jr nz, no_Time_Dec ;if the time delay = 0, then it's reset and the timer is decremented ld a,20 ld (Time_Delay),a ld hl,(Timer) dec hl ld (Timer),hl ld de,0 call _cphlde ;compares hl and de jp z,TimeUp no_Time_Dec: ld de,$2D00 ld (_penCol),de ld hl,(Timer) call _vputHL ;this puts the time left ld de,$2000 ld (_penCol),de ld hl,(Bonus) call _vputHL ;this puts the bonus left call _getcode ;works just like _getky or GET_KEY, but supposed to be faster cp K_EXIT jp z,CheckScore ;check if you have a high score cp K_LEFT jr z,Left ;move left if Bob can cp K_RIGHT jp z,Right ;move right if Bob can cp K_UP jp z,Up ;Move up if Bob can cp K_DOWN jp z,Down ;move down if Bob can cp K_SECOND jr z,Second ;reset the level cp K_MORE jr z,Pause ;pause jp Main_Loop ;*************************************************** ;*----Stuff that happens after a key is pressed----* ;*************************************************** Exit: set plotloc,(iy+plotflags) ;lets the graph write to the graph buffer set appTextSave,(iy+appflags) ;saves the text to the text shaddow set appAutoScroll,(iy+appflags) ;lets the screen scroll set graphdraw,(IY+graphflags) ;tells the calc that the graph is "dirty" ;so it will redraw it call _clrScrn ;clear the screen and text shaddow call _homeup ;cur = 0,0 ld a,($C008) ;load contrast value dec a ;increase the contrast ld ($C008),a ;write it back to memory out (2),a ;and to the port ret ;return to the OS Pause: call _clrScrn ;clear the screen call _homeup ;cur to 0,0 ld hl,Paused call _puts ;display paused text Paused_Loop: call _getcode cp 0 jr z,Paused_Loop ;loop until a key is pressed call _clrScrn ld a,(BobX) ld d,a ld a,(BobY) ld e,a ld ix,Bob call PutSprite ;put Bob where he belongs jp PutSideBar ;put the side bar and then continue on with the game Second: call _clrScrn jp Refresh_Old_Level ;this will reset the level Left: ;This is where it gets a little confusing! ld a,(BobX) ld d,a ;x-coord into d dec d ;to see where Bob is if he moves left ld a,(BobY) ld e,a ;y-coord into e ld a,(Temp_Level+18) ld h,a ;x-coord of goal into h ld a,(Temp_Level+19) ld l,a ;y-coord of goal into l call _cphlde ;compare hl and de jp z,Finish ;if they're equal, you passed the level ld a,(BobY) ld b,a ;y-coord into b inc b ;increment b incase it's 0 (I know it can't bo 0, but ;in a later version it might be possible ld hl,Temp_Level-2 Inc_HL_L: inc hl inc hl djnz Inc_HL_L ;if the y-coord was 0, then hl points to the first byte ;of the temp level. It moves hl forward 2 bytes for each line ld a,(BobX) inc a ;To make x-coord between 1 & 16 rather than 0 & 15 cp 3 jp z,Main_Loop ;If Bob is as far left as he can go, return to the main loop cp 8 ;if the x-coord is 8, then when 8 is subtracted, the answer is jr z,sub8L ;considered positive and the program thinks that it wants to ;move to the next byte. So, we have to skip the test. cp 9 ;Same goes for 9 except the program's right to move ahead 1 byte. jr z,sub8L ;It's also wrong because it can't look ahead to see that it needs ;to check for a block or a space to the left (in the first byte). inc hl ;move ahead one byte so we don't have to do it later ld b,a ;a -> b incase a is smaller than 8 sub 8 ;a-8 -> a jp p,sub8L ;if it's positive, there's no need to restore a ld a,b ;if it's negative, you need to restore a dec hl ;and move hl back to where it was sub8L: ld b,a ;stores a in b for the loop ld d,a ;1 -> d for storage so we know how many times to rotate a back to normal ld a,(hl) ;the piece of the tmp level map is moved to a for easier access rrca ;rotate a one bit to the right so if a = 1, it will still be normal ;in case you don't know, rrca takes the binary equivalent and rotates ;one bit to the right circular, meaning bit 0 (the begining) is moved ;to bit 7 (the end), and the carry flag is = to bit 7. Rotate_aL: rlca ;does the same as rrca, but to the right and the carry flag = bit 0 djnz Rotate_aL jr c,BlockL ;if the carry flag was set, it means there is a block to the left jr Move_Left ;if there isn't a block on the left, just move Bob left Nine_L: dec hl ;move to the previous byte of the temp level map bit 0,(hl) ;check if there is a block on the right edge of the byte jp nz,Main_Loop ;if there is a block in the way, jump to the main loop set 0,(hl) ;since there isn't a block, we have to make a block here inc hl ;move to the next block res 7,(hl) ;and remove the old block jr Move_Left ;then move Bob left BlockL: ld b,a ;save the rotated piece of the temp level map for later ld a,(BobX) cp 3 ;if the x-coord is 3, then the block is against the edge jp z,Main_Loop cp 9 ;if the x-coord is 9, we need to move to the previous byte jr z,Nine_L ld a,b ;a = the rotated piece of the templevel map again rrca ;rotate right circular twice rrca jp c,Main_Loop ;if there is a block to the left of the block that's on the ;of Bob, he can't push it. Go back to the main loop. set 7,a ;if there isn't a block there, make one there rlca res 7,a ;and remove the block to the left of Bob ld b,d ;b = the # of times to rotate a back to normal rlca ;rotate left circular twice to make up for rotating it right twice rlca Rotate_Back_L: rrca djnz Rotate_Back_L ld (hl),a ;save a in the temporary level map Move_Left: ld hl,(Bonus) ld a,l ;since the bonus is going to be less than $FF (255) h will be 0 cp 0 jr z,NOBonus_L dec hl ;if there is some bounus left, decrement it ld (Bonus),hl NOBonus_L: ld a,(BobX) ld d,a ld a,(BobY) ld e,a ld ix,Blank call PutSprite ;erase where Bob was, ld a,(BobX) dec a ;move him left ld (BobX),a ld d,a ld ix,Bob call PutSprite ;and draw him jp Main_Loop ;jump to the main loop to continue Right: ;almost the same as going left, but diferent variables, and ;oppisite directions. So refer to the left routine for more details ld a,(BobX) ld d,a inc d ld a,(BobY) ld e,a ld a,(Temp_Level+18) ld h,a ld a,(Temp_Level+19) ld l,a call _cphlde ;if Bob just moved into the goal, you passed the level jp z,Finish ld a,(BobY) ld b,a inc b ld hl,Temp_Level-1 Inc_HL_R: inc hl inc hl djnz Inc_HL_R ld a,(BobX) inc a ;To make x-coord between 1 & 16 rather than 0 & 15 cp 16 jp z,Main_Loop cp 8 jr z,Eight_R ld b,a sub 8 jp p,Positive_R ld a,b dec hl Positive_R: ld b,a ld d,a ld a,(hl) Rotate_aR: rlca djnz Rotate_aR rlca jr c,BlockR jr Move_Right Eight_R: ld d,0 ld a,(hl) rlca jr c,BlockR jr Move_Right Six_R: inc hl bit 7,(hl) jp nz,Main_Loop set 7,(hl) dec hl res 0,(hl) call Refresh_Background jr Move_Right BlockR: ld b,a ld a,(BobX) cp 14 jp z,Main_Loop cp 6 jr z,Six_R ld a,b rlca jp c,Main_Loop set 0,a res 1,a rrca ld b,a ld a,d cp 0 jr z,No_Rotate_Back_R ld a,b ld b,d Rotate_Back_R: rrca djnz Rotate_Back_R ld b,a No_Rotate_Back_R: ld a,b rrca ld (hl),a call Refresh_Background Move_Right ld hl,(Bonus) ld a,l cp 0 jr z,NOBonus_R dec hl ld (Bonus),hl NOBonus_R: ld a,(BobX) ld d,a ld a,(BobY) ld e,a ld ix,Blank call PutSprite ld a,(BobX) inc a ld (BobX),a ld d,a ld ix,Bob call PutSprite jp Main_Loop Up: ld a,(BobX) ld d,a ld a,(BobY) ld e,a dec e ld a,(Temp_Level+18) ld h,a ld a,(Temp_Level+19) ld l,a call _cphlde jp z,Finish ld a,(BobY) cp 0 jp z,Main_Loop ld b,a inc b ld hl,Temp_Level-3 INC_Y_U: inc hl inc hl djnz INC_Y_U ld a,(BobX) inc a ;make x-coord between 1 and 16 ld b,a cp 8 jr z,No_Sub_U sub 8 jp p,Positive_U No_Sub_U: ld a,b dec hl Positive_U: dec hl dec hl ld c,(hl) inc hl inc hl ld b,a ld d,a ld a,(hl) Rotate_U: rlc c rlca djnz Rotate_U jr c,Block_U jr Move_Up Block_U: ld b,a ld a,(BobY) cp 1 jp z,Main_Loop bit 0,c jp nz,Main_Loop set 0,c ld a,b res 0,a ld b,d Rotate_Back_U: rrc c rrca djnz Rotate_Back_U ld (hl),a dec hl dec hl ld (hl),c call Refresh_Background Move_Up: ld hl,(Bonus) ld a,l cp 0 jr z,NOBonus_U dec hl ld (Bonus),hl NOBonus_U: ld a,(BobY) ld e,a dec a ld (BobY),a ld a,(BobX) ld d,a ld ix,Blank call PutSprite dec e ld ix,Bob call PutSprite jp Main_Loop Down: ld a,(BobX) ld d,a ld a,(BobY) ld e,a inc e ld a,(Temp_Level+18) ld h,a ld a,(Temp_Level+19) ld l,a call _cphlde jp z,Finish ld a,(BobY) cp 7 jp z,Main_Loop ld b,a inc b ld hl,Temp_Level+1 INC_Y_D: inc hl inc hl djnz INC_Y_D ld a,(BobX) inc a ;make x-coord between 1 and 16 ld b,a cp 8 jr z,No_Sub_D sub 8 jp p,Positive_D No_Sub_D: ld a,b dec hl Positive_D: inc hl inc hl ld c,(hl) dec hl dec hl ld b,a ld d,a ld a,(hl) Rotate_D: rlc c rlca djnz Rotate_D jr c,Block_D jr Move_Down Block_D: ld b,a ld a,(BobY) cp 6 jp z,Main_Loop bit 0,c jp nz,Main_Loop set 0,c ld a,b res 0,a ld b,d Rotate_Back_D: rrc c rrca djnz Rotate_Back_D ld (hl),a inc hl inc hl ld (hl),c call Refresh_Background Move_Down: ld hl,(Bonus) ld a,l cp 0 jr z,NOBonus_D dec hl ld (Bonus),hl NOBonus_D: ld a,(BobY) ld e,a inc a ld (BobY),a ld a,(BobX) ld d,a ld ix,Blank call PutSprite inc e ld ix,Bob call PutSprite jp Main_Loop ;***************************** ;*-------Some Routines-------* ;***************************** Level_To_Temp: ld de,(Level) ld b,e ld de,20 ld hl,Level_Data-20 Level_Loop: add hl,de djnz Level_Loop ld de,Temp_Level ld bc,20 ldir ret Refresh_Background: ld hl,Temp_Block_L ld de,Temp_Block ld bc,8 ldir ld hl,Temp_Block_L+8 ld de,Temp_Block_L ld bc,8 ldir ld hl,Temp_Block_L+16 ld de,Temp_Block_L+8 ld bc,8 ldir ld hl,Temp_Block ld de,Temp_Block_L+16 ld bc,8 ldir ld hl,Temp_Level-1 ld c,0 ld b,8 ld de,0 Next_Loop: push bc Next_Loop2: ld b,8 inc hl ld a,(hl) Again_B: rla jr nc,Next_B ld ix,Temp_Block call PutSprite Next_B: inc d djnz Again_B ld a,d cp 8 jr z,Next_Loop2 ld d,0 inc e push de ld ix,Temp_Level+18 ld a,(ix) ld d,a inc ix ld a,(ix) ld e,a ld ix,Goal call PutSprite pop de pop bc djnz Next_Loop ret TimeUp: ld de,$0703 ld (_curRow),de ld hl,TimeUP set textInverse,(iy+textflags) call _puts res textInverse,(iy+textflags) ld b,30 T_Loop: push bc call Refresh_Background ld de,$0703 ld (_curRow),de ld hl,TimeUP set textInverse,(iy+textflags) call _puts res textInverse,(iy+textflags) halt halt halt halt halt halt halt pop bc djnz T_Loop jp CheckScore Finish: ld de,(Timer) ld hl,(Score) add hl,de add hl,de ld de,(Bonus) add hl,de add hl,de ld (Score),hl ld hl,(Level) inc hl ld (Level),hl ld a,l cp 11 jr nz,SKILL1 ld a,(Skill) cp 0 jr nz,Passed inc a ld (Skill),a call SaveScore jr Passed SKILL1: cp 21 jr nz,SKILL2 ld a,(Skill) cp 1 jr nz,Passed inc a ld (Skill),a call SaveScore jr Passed SKILL2: cp 31 jr z,Passed call _clrScrn jp LoadNewLevel Passed: call _clrScrn call _homeup ld hl,Congrats call _puts ld de,(Level) ld a,e cp 11 jr z,PutLevel cp 21 jr nz,HardL ld de,22 add hl,de jr PutLevel HardL: ld de,44 add hl,de PutLevel: call _puts ld de,$2E10 ld (_penCol),de ld hl,C_Score call _vputs set textEraseBelow,(iy+textflags) set textInverse,(iy+textflags) ld a,$56 ld (_penCol),a ld a,' ' call _vputmap ld hl,(Score) call _vputHL res textEraseBelow,(iy+textflags) res textInverse,(iy+textflags) Pass_Loop: call _getcode cp 0 jr z,Pass_Loop CheckScore: ld de,(Score) ld a,(CurSkill) cp 1 jr nz,MediumScore ld hl,(HighScoreE) call _cphlde jp nc,ViewScores ld (HighScoreE),de jr New_HighScore MediumScore: cp 2 jr nz,HardScore ld hl,(HighScoreM) call _cphlde jp nc,ViewScores ld (HighScoreM),de jr New_HighScore HardScore: cp 3 jr nz,HardScore ld hl,(HighScoreH) call _cphlde jp nc,ViewScores ld (HighScoreH),de jr New_HighScore New_HighScore: call _clrScrn call _homeup ld hl,NewHS call _puts ld de,$0003 ld (_curRow),de ld ix,HighScore ld a,(CurSkill) cp 1 jr z,EnterName cp 2 jr nz,HardHS ld de,20 add ix,de jr EnterName HardHS: ld de,40 add ix,de EnterName set curAble,(iy+curflags) ld b,14 res 5,(iy+shiftflags) ALPHA: bit 5,(iy+shiftflags) jr z,lower res 5,(iy+shiftflags) jr EnterName_Loop lower: set 5,(iy+shiftflags) EnterName_Loop: push bc call _getky pop bc cp K_ENTER jr z,Saveit cp K_LEFT jr z,Delete cp K_DEL jr z,Delete cp K_ALPHA jr z,ALPHA ld c,a ld a,b cp 0 jr z,EnterName_Loop ld a,c cp $09 jr c,EnterName_Loop cp $2F jr nc,EnterName_Loop push bc sub 9 ld b,a ld hl,CharTable-1 CharLoop: inc hl djnz CharLoop pop bc ld a,(hl) cp 0 jr z,EnterName_Loop cp ' ' jr z,CAPS bit 5,(iy+shiftflags) jr nz,CAPS add a,32 CAPS: ld (ix),a inc ix call _putc dec b jr EnterName_Loop Delete: ld a,b cp 14 jr z,EnterName_Loop res curAble,(iy+curflags) ld a,' ' call _putc ld hl,_curCol dec (hl) dec (hl) call _putc dec (hl) inc b dec ix ld (ix),'.' set curAble,(iy+curflags) jr EnterName_Loop Saveit: res curAble,(iy+curflags) ld a,b add a,3 ld b,a Dots: ld (ix),'.' inc ix djnz Dots res shiftALock,(iy+shiftflags) res shiftAlpha,(iy+shiftflags) call SaveScore jp ViewScores _vputHL: ;Writes hl on screen (Small font) ld de,VPTEMP+3 ;location to start unpacking ld b,4 ;4 digits _vputHL_2: ;Begin loop call UNPACK_HL ;divide hl by 10 - a contains remainder add a,'0' ;asciiize it ld (de),a ;store digit dec de ;de points to next digit place djnz _vputHL_2 ;decrease b - repeat if not zero ld hl,VPTEMP ;hl points to number call _vputs ;write number on screen ret ;return _putHL: ;Writes hl on screen (Large Font) ld de,VPTEMP+3 ;location to start unpacking ld b,4 ;4 digits _putHL_2: ;Begin loop call UNPACK_HL ;divide hl by 10 - a contains remainder add a,'0' ;asciiize it ld (de),a ;store digit dec de ;de points to next digit place djnz _putHL_2 ;decrease b - repeat if not zero ld hl,VPTEMP ;hl points to number call _puts ;write number on screen ret ;return delay: push bc ld b,100 D_Loop: halt halt djnz D_Loop pop bc ret ;****Taken From ZTetris, But the bytes to copy and some labels were modified SaveScore: ;Saves The New High Score ld hl,ProgName ; All this stuff is to make sure the hiscore table rst 20h ; and resume stuff are stored in the variable rst 10h ex de,hl ; HL -> start of variable ld a,b ld de,HighScore-$D748+4 ; DE = relative offset to stuff to store (-4) add hl,de adc a,0 ; Next block if necessary ld de,HighScore ; DE = start of bytes to copy ld b,61 ; 61 bytes to copy RepCopy: push af push hl call $46C3 ld a,(de) ; Read ld (hl),a ; And save it in the real variable pop hl pop af call $4637 inc de djnz RepCopy ret ;************************************************ ;* PutSprite -- By Levi Lansing * ;* Input: * ;* (d,e) = pos -- (0,0) to (16,8) * ;* ix = Sprite (8 by 8) * ;* Output: * ;* Your sprite right over the top of * ;* everything! (0 clears the pixel and * ;* 1 turns on the pixel) * ;* Changed: * ;* ix (points to the next Sprite or Data) * ;************************************************ PutSprite: push hl ;hide these so they don't get changed push af ;" push bc ;" ld c,d ld b,e ;bc now = the coords of the image push de ;hide de so it won't get changed ld hl,$FB80 ;Point 8 lines infront of the video memory (128 bytes) ;(the video mem starts at FC00) inc b ;add 1 to b incase it's 0 ld de,128 ;# Of Bytes Per 8 Lines YCoord: add hl,de ;point hl forward 8 lines djnz YCoord add hl,bc ;Now HL Points To the video memory + the offset ld de,16 ;# of bytes per 1 line ld b,8 ;# of lines in the sprite Putit: ld a,(ix) ;data of the first line of the sprite into a ld (hl),a ;then onto the screen add hl,de ;increase hl to point to the next line inc ix ;increase ix to point to the next line of the sprite djnz Putit ;loop 8 times pop de ;then restore the variables that were hidden pop bc ;in the oppisite order they were pushed pop af ;to make sure they get the right values pop hl ret ;End Of The Routine ;****************************** ;*-----Graphics / Sprites-----* ;****************************** Written: .db %11111111 .db %11011101 .db %11011101 .db %11010101 .db %11101011 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11101101 .db %00111000 .db %01101101 .db %01101101 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11011111 .db %10001001 .db %11011011 .db %11011101 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11111101 .db %00111101 .db %01011100 .db %01011100 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11111110 .db %11111110 .db %10101110 .db %11011110 .db %10111111 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11100101 .db %11101101 .db %00110110 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11011101 .db %01111101 .db %01011101 .db %11011100 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11000100 .db %11010101 .db %01100101 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11111101 .db %11100111 .db %01101101 .db %01001101 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %00110011 .db %01010011 .db %01011011 .db %11100111 .db %11111111 .db %11111111 Bob: .db %00011000 .db %00100100 .db %00011000 .db %01111110 .db %00011000 .db %00111100 .db %00100100 .db %00100100 Block1: ;The following are the blocks which have 4 shades to them .db %00000000 ; .db %01111110 ;pixels that show up once in the .db %01000010 ;three different sprites are light gray .db %01011010 ; .db %01011010 ;pixels that show up twice in the .db %01000010 ;three different sprites are dark gray .db %01111110 ; .db %00000000 ;pixels that show up thrice in the ;three sprites are black .db %11111111 ; .db %10111101 ;and of course, pixels that arn't used in the .db %11111111 ;three sprites are white (if the contrast is low enough) .db %11100111 ; .db %11100111 ; .db %11111111 ; .db %10111101 ; .db %11111111 ; ; .db %00011000 ; .db %01111110 ; .db %01000010 ; .db %11011011 ; .db %11011011 ; .db %01000010 ; .db %01111110 ; .db %00011000 ;the first block ends here Block2: ;I like this one the best because it really .db %00010001 ;makes all four shades stand out .db %00010010 .db %00010000 .db %11110000 .db %00001111 .db %00001000 .db %01001000 .db %10001000 .db %01010101 .db %11010110 .db %00010111 .db %11110000 .db %00001111 .db %11101000 .db %01101011 .db %10101010 .db %11011111 .db %11011111 .db %00011111 .db %11111111 .db %11111111 .db %11111000 .db %11111011 .db %11111011 Block3: .db %10000000 .db %11000000 .db %10000000 .db %11000000 .db %10000000 .db %11000000 .db %10101010 .db %11111111 .db %11110000 .db %11100000 .db %11110000 .db %11100000 .db %11110101 .db %11111111 .db %11111111 .db %11111111 .db %11111100 .db %11111000 .db %11111101 .db %11111111 .db %11111111 .db %11111111 .db %11111111 .db %11111111 Block4: .db %00000000 .db %01100110 .db %01100110 .db %00000000 .db %00000000 .db %01000010 .db %00100100 .db %00000000 .db %00000000 .db %01100110 .db %01100110 .db %00000000 .db %00011000 .db %01000010 .db %00111100 .db %00011000 Goal: ;this is the third sprite of the smile block .db %00111100 ;and the sprite for the goal because they are .db %01111110 ;same (Saves 8 whole bytes!). (The label won't .db %11111111 ;get in the way) .db %11111111 .db %11111111 .db %11111111 .db %01111110 .db %00111100 Intro_Data: ;.db 16, 8 .db %00011111, %11111000 .db %00100000, %00000100 .db %00100000, %00000100 .db %00100000, %00000100 .db %00011111, %11111000 .db %00000000, %00000000 .db %00000000, %00000000 .db %00000000, %00000000 .db 0,0 .db 0,8 Level_Data: ; /This allows the sprite editor in Assembly ;.db 16, 8 ;<-/Studio 86 ti read each level individually .db %00001101, %10011000 ;\ .db %00001110, %11011000 ;| .db %00001111, %00111000 ;\ .db %00001101, %01011000 ; \The 1's represent a block and the 0's .db %00001110, %11011000 ; / represent a space .db %00001111, %00111000 ;/ .db %00001101, %11011000 ;| .db %00001110, %00111000 ;/ .db 8,7 ;Bob's coords .db 8,0 ;Goal's coords ;.db 16, 8 ;same for the rest of the thirty levels .db %00011110, %10111100 .db %00011010, %00101100 .db %00011011, %11011100 .db %00011101, %01101100 .db %00011010, %10011100 .db %00011011, %01101100 .db %00011100, %11011100 .db %00011011, %01011100 .db 8,7 .db 8,0 ;.db 16, 8 .db %00011001, %10010110 .db %00011010, %11001110 .db %00011011, %10110110 .db %00011000, %10100110 .db %00011011, %11110110 .db %00011011, %00110110 .db %00011100, %11000110 .db %00011010, %10111110 .db 5,7 .db 11,4 ;.db 16, 8 .db %00110100, %00011110 .db %00111101, %11001110 .db %00110000, %11111110 .db %00111011, %01111110 .db %00110110, %10000110 .db %00110101, %01101110 .db %00111111, %11010110 .db %00110000, %00001110 .db 12,4 .db 11,2 ;.db 16, 8 .db %00111000, %00000111 .db %00111001, %11111111 .db %00110101, %01010011 .db %00111011, %01011111 .db %00110101, %01000011 .db %00111011, %01111111 .db %00110100, %00000011 .db %00111001, %11111111 .db 12,2 .db 13,0 ;.db 16, 8 .db %00111001, %00101011 .db %00111110, %10111111 .db %00111011, %01000011 .db %00100101, %00101011 .db %00101001, %11011011 .db %00101110, %01101111 .db %00101001, %01001011 .db %00111110, %10110111 .db 13,0 .db 3,7 ;.db 16, 8 .db %00110010, %00010011 .db %00101010, %10010011 .db %00110111, %11101011 .db %00101001, %10010101 .db %00100111, %01101101 .db %00100110, %10101011 .db %00101110, %01110101 .db %00101011, %01011011 .db 5,7 .db 7,7 ;.db 16, 8 .db %00110001, %00101101 .db %00010010, %01010001 .db %00010101, %01001111 .db %00010101, %11111001 .db %00010111, %10110001 .db %00011111, %00101011 .db %00000100, %10100101 .db %00001000, %11110101 .db 14,0 .db 2,0 ;.db 16, 8 .db %00000000, %00000000 .db %00111111, %11111111 .db %00000011, %00000010 .db %00111100, %11110101 .db %00000011, %00001010 .db %00011111, %11111110 .db %00100000, %10010000 .db %00100110, %00100100 .db 2,0 .db 2,7 ;.db 16, 8 .db %00010011, %11000000 .db %00011100, %11011010 .db %00010100, %11011101 .db %00011110, %10001010 .db %00010101, %01110101 .db %00011110, %10110011 .db %00010101, %01100101 .db %00000110, %01011000 .db 2,7 .db 15,6 :-----------Medium Levels------- ;.db 16, 8 .db %00101010, %10100100 .db %00101110, %01000100 .db %00101011, %10111110 .db %00111010, %01000010 .db %00100100, %01111010 .db %00011011, %10100111 .db %00010100, %10001110 .db %00101010, %10111010 .db 15,7 .db 2,1 ;.db 16, 8 .db %00010100, %01000000 .db %00101011, %10011011 .db %00001010, %00100111 .db %00110001, %11011010 .db %00001101, %01001010 .db %00011111, %11010110 .db %00010011, %01111100 .db %00010000, %00001000 .db 8,4 .db 15,2 ;.db 16, 8 .db %00101000, %10001000 .db %00001110, %00111011 .db %00010010, %10110100 .db %00010100, %01101000 .db %00011011, %11110110 .db %00010101, %10001001 .db %00011100, %01110100 .db %00001011, %00001010 .db 15,2 .db 4,7 ;.db 16, 8 .db %00010011, %11001001 .db %00010101, %00101100 .db %00010101, %01001010 .db %00010101, %01011001 .db %00010101, %01001011 .db %00010101, %01101010 .db %00010101, %01001110 .db %00010100, %11010000 .db 2,7 .db 15,0 ;.db 16, 8 .db %00010101, %00010000 .db %00101111, %10110111 .db %00010001, %11010000 .db %00001110, %10111111 .db %00011010, %11001110 .db %00010010, %10110100 .db %00010011, %10011010 .db %00100100, %10000101 .db 15,0 .db 2,7 ;.db 16, 8 .db %00001000, %00000100 .db %00001111, %11100010 .db %00110110, %00011101 .db %00001101, %11011010 .db %00010101, %10010101 .db %00001111, %11110011 .db %00110101, %00001100 .db %00000100, %10011110 .db 2,0 .db 8,4 ;.db 16, 8 .db %00001100, %00001001 .db %00010110, %11110101 .db %00010011, %10011010 .db %00001010, %10100111 .db %00010111, %01101000 .db %00101101, %01110111 .db %00010010, %00100101 .db %00111010, %11111111 .db 14,6 .db 3,6 ;.db 16, 8 .db %00001010, %00100101 .db %00101101, %10101000 .db %00010110, %01011101 .db %00101010, %10001010 .db %00011111, %11011011 .db %00010110, %00101100 .db %00010110, %11010100 .db %00001110, %00100100 .db 2,0 .db 6,7 ;.db 16, 8 .db %00010101, %01001100 .db %00010010, %10010010 .db %00010101, %01101101 .db %00010010, %11010110 .db %00011101, %01101000 .db %00010010, %10101010 .db %00011111, %11111110 .db %00000000, %00000000 .db 4,5 .db 2,0 ;.db 16, 8 .db %00001001, %00100000 .db %00101110, %01110110 .db %00011001, %10001010 .db %00100101, %11110110 .db %00001110, %10011010 .db %00010110, %10010110 .db %00000101, %01001010 .db %00010100, %10100010 .db 2,0 .db 15,7 ;-----------Hard Levels-------------- ;.db 16, 8 .db %00010010, %10101101 .db %00101001, %01010001 .db %00010110, %10101111 .db %00101011, %00010110 .db %00010101, %10111101 .db %00101010, %11101011 .db %00010101, %01101101 .db %00001010, %10100000 .db 2,7 .db 15,0 ;.db 16, 8 .db %00010001, %01010101 .db %00100110, %01000101 .db %00010001, %01010101 .db %00100110, %01000101 .db %00010001, %01010101 .db %00100110, %01000101 .db %00010001, %01010101 .db %00001110, %01000101 .db 2,7 .db 15,6 ;.db 16, 8 .db %00100001, %11010000 .db %00010110, %00101101 .db %00111101, %11010110 .db %00100101, %01010001 .db %00011101, %11010110 .db %00110110, %00111111 .db %00000111, %11100010 .db %00100000, %00001001 .db 8,3 .db 15,7 ;.db 16, 8 .db %00001110, %00000111 .db %00011011, %01010100 .db %00001110, %01010110 .db %00000000, %01010100 .db %00010100, %01010111 .db %00101010, %01010000 .db %00101010, %01010000 .db %00101010, %00100000 .db 5,1 .db 15,0 ;.db 16, 8 .db %00110101, %01101000 .db %00101010, %10111010 .db %00100010, %01010100 .db %00110101, %11100010 .db %00011001, %01010110 .db %00001010, %01011011 .db %00011001, %11010101 .db %00110110, %10111100 .db 2,5 .db 15,5 ;.db 16, 8 .db %00001000, %10001000 .db %00101010, %10101010 .db %00011010, %10101010 .db %00101010, %10101010 .db %00001010, %10101010 .db %00011010, %10101010 .db %00100010, %10101010 .db %00000010, %00100011 .db 2,0 .db 15,7 ;.db 16, 8 .db %00001010, %00101011 .db %00010111, %00101000 .db %00101010, %10101110 .db %00011100, %01101101 .db %00100111, %10101001 .db %00001010, %10101010 .db %00101011, %00101010 .db %00010100, %10101110 .db 2,0 .db 15,0 ;.db 16, 8 .db %00000110, %01010000 .db %00011001, %00010110 .db %00100101, %10101100 .db %00011010, %01001101 .db %00110011, %01101010 .db %00010101, %01010101 .db %00001010, %11101010 .db %00010110, %10110101 .db 2,0 .db 15,7 ;.db 16, 8 .db %00000101, %00001010 .db %00001010, %10100001 .db %00010101, %01111111 .db %00010100, %11100001 .db %00010011, %10101110 .db %00011110, %10101000 .db %00001010, %10101011 .db %00111000, %01010010 .db 15,7 .db 2,7 ;.db 16, 8 .db %00111011, %10101011 .db %00111001, %00111010 .db %00000001, %00101011 .db %00110000, %00000010 .db %00100100, %10110011 .db %00110110, %10101000 .db %00100101, %10101011 .db %00110100, %10110011 .db 2,2 .db 14,6 ;********************** ;*--Variables / Data--* ;********************** CharTable: .db 'X','T','O','J','E', 0 , 0 ,' ','W','S','N','I','D' .db 0 , 0, 'Z','V','R','M','H','C', 0 , 0 ,'Y','U','Q' .db 'L','G','B', 0 , 0 , 0 ,'-','P','K','F','A' Times: .db 95,85,80,75,70,70,70,65,60,70 ;these are the time limits .db 45,45,50,25,50,30,40,30,30,60 ;they go in order (1st 1 for .db 30,20,40,15,35,30,30,25,25,60 ;level 1 & last for level 30 Bonuses: .db 30,30,30,45,40,40,45,45,55,100 ;same for the bonuses .db 40,53,50,50,40,35,45,50,50,100 .db 35,30,35,25,35,65,30,35,40,100 HighScore: .db "Goofy............",0 HighScoreE: .dw 400 .db "Donald Duck......",0 HighScoreM: .dw 200 .db "Mickey Mouse.....",0 HighScoreH: .dw 100 Skill: .db 0 ;this is the skill level, when you pass a level or get ;a highscore it will be saved with the scores Defaults: .db "Goofy............",0 .dw 400 .db "Donald Duck......",0 .dw 200 .db "Mickey Mouse.....",0 .dw 100 .db 0 ProgName: .db $12,$07,"Blocked" ;this is for the saving routine from tetris ;this way it can find the program in the memory ;********************* ;*------Strings------* ;********************* Clear?: .db " Clear High Scores " .db " and Skill Level?!?! ",0 .db "Yes No ",0 SideBar: .db "Levl",0 .db "Scor",0 .db "Bnus",0 .db "Time",0 TitleText: .db " " .db " BLOCKED IN " .db " ver 1.3 " .db " " .db " " .db " View High " .db " Scores " .db "Start | Help Exit",0 Skill_Level: .db "Choose a skill Level-",0 .db "Easy-----------------",0 .db "Easy---Medium--------",0 .db "Easy---Medium----Hard",0 Paused: .db " Paused - Press any " .db " key to resume.",0 Congrats: .db " Congratulations! " .db " You Passed The ",0 .db " Easy Levels! ",0 .db " Medium Levels! ",0 .db " Hard Levels! " .db "Nearly IMPOSSIBLE!!!!",0 C_Score: .db "Your Score Was--",0 NewHS: .db "You Hold The New High" .db "Score!! " .db "Enter Your Name--",0 HelpText; .db "How To Play:",0 .db " Use the arrow keys to move the",0 .db "man and push the blocks out of the",0 .db "way so you can reach the goal",0 .db "(Black circle). You may only push",0 .db " one block at a time. Second resets",0 .db "the blocks, more pauses.",0 .db " ",0 .db " Send Q's and Comments to:",0 .db " puzzlesome@hotmail.com",0 HighScoreText: .db " High Scores " .db " Easy Levels-- ",0 .db " Medium Levels-- ",0 .db " Hard Levels-- ",0 .db " ",0 TimeUP: .db "!Time UP!",0 .end