* ORG 100H Compatibility with CP/M XEQ $ *-------------------------------------------* * STAR WARS video game * * Version: 1.4 September, 1980 * * * * Written by Stephen Maguire * * Copyright (C) 1980 * *-------------------------------------------* * * * For a non disk system, change the very next equate * to PTDOS EQU 0C004H the program will make the * other necessary changes. * PTDOS EQU 0BCBCH Helios monitor address SOLIN EQU 0C01FH Solos input routine * ESCPE EQU 1BH Escape character DELET EQU 7FH Delete character * SCREN EQU 0CC00H Top of video screen CENTR EQU 0CDE0H Center of video screen X2LOC EQU 0CDDCH Program print equates X3LOC EQU 0CE1CH All are just screen locations X1LOC EQU 0CD9CH EXTR1 EQU 0CFD1H EXTR2 EQU 0CFE9H LTIME EQU 0CFCBH HTIME EQU 0CFCAH LAMMO EQU 0CFFBH HAMMO EQU 0CFFAH LSCOR EQU 0CFE4H HSCOR EQU 0CFE3H SCRHR EQU 0CC92H LHAIR EQU 0CD52H RHAIR EQU 0CD6EH THAIR EQU 0CC99H BHAIR EQU 0CF19H HORZ1 EQU 0CDD2H HORZ2 EQU 0CDE4H INFLO EQU 0CFC0H KILLD EQU 0CC17H OVMS1 EQU 0CD90H * CHUP EQU 'W'-40H CHDWN EQU 'Z'-40H CHLFT EQU 'A'-40H CHRGT EQU 'S'-40H * START LXI SP,STACK Set the stack CALL CLEAR Go blank the screen STRT0 MVI A,01H Set flag to one STA DEMO Store for demo mode STRT1 LXI B,INSTR Point to message LXI H,SCREN Point to screen CALL PRINT Now print the message CALL INIT Go set all parameters CALL CLEAR Blank the screen LXI H,HORZ1 Now print starting message LXI B,FORCE Point to the message CALL PRINT Now print it CALL WAIST Wait 2 seconds CALL WAIST Now, wait 2 more * * Main program starts here * STRT2 CALL CLEAR Go clear the screen CALL PUTHRS Go print the hairs LXI B,INFO Performance information LXI H,INFLO Point to Screen CALL INVRS Print message inversed CALL STARS Put a few stars on screen * LXI B,CHBUF Point to character buffer LHLD TGLOC Get target location POKE MOV A,M Move character where target is CPI '*' Is there a star there? JNZ POK1 Nope, leave it alone MVI M,20H Otherwise put in a blank POK1 STAX B to be placed in the character buffer INX B Point to next buffer location INX H Point to next character LDAX B Are we done yet? ORA A JNZ POKE No, keep feeling * BEGIN CALL MOVTG We must move the target CALL WAIT Wait for a bit, then go CALL CLOCK Go check on time CALL MVSTR Go move the star background CALL INWAT Is he moving? * *---------------------------------------------------* * If we get here, he might be moving. If so, then * * process. If not, then do the whole thing again. * * Keys recognized are: * * * * S and CTRL S right A and CTRL A left * * W and CTRL W up Z and CTRL Z left * * * * NOTE: If any of the above are changed, then the * * routine DODEM must be changed accordingly * * AND the DB LAST at the end must be changed * * or the program will hang up!!! * * * * DELete = reset game ESCAPE = PTDOS (CI) * * Space = fire lasers D = start demo mode * * R = reset high score Any # = change speed * *---------------------------------------------------* * ANI 7FH Strip MSB CPI 'A' Is the character already a JC CHEK control character? SUI 40H If not subtract make it one CHEK CPI CHUP Is he moving up? JZ MVUP Yes, then move him CPI CHRGT Right? JZ MVRIG Yes, then left CPI CHLFT Left? JZ MVLEF Yes CPI CHDWN Down? JZ MVDON Yes CPI 20H Did he fire? JZ FIRE Yes, then shoot CPI ESCPE Escape? JZ EXIT Yes, then go to monitor CPI DELET-40H Delete? JZ STRT0 Yes, then restart game CPI 'R'-40H Are we reseting high score? JNZ CKNUM No, is it a number XRA A Yes, set high score to zero STA HIGH CKNUM CPI 30H Are we changing speed? JC ERROR No, then illegal character CPI 36H JNC ERROR Ignore if illegal ANI 0FH We are changing speed ADI 04H Now make speed just right STA INWAT+2 Now change the speed SUI 10H Adjust timer to speed CMA . Make number positive STA KOUNT And store it * * If we got here it's an unknown character * ERROR LDA DEMO Check if demo mode is set ORA A Make the check CZ DODEM Go do the demo is check is positive LDA LAST Get last move JMP CHEK and go execute it * *---------------------------------------* * These are all the subroutines * * used by the program. * *---------------------------------------* * CLEAR XRA A Set A to zero OUT 0FEH Set screen parameters for VDM OUT 0C8H Set parameters for VDM-1 LXI H,SCREN Point to top of screen CLR MVI M,20H Put a blank INX H Bump H to next location MOV A,H Are we done? CPI 0D0H JNZ CLR No, keep blanking RET . Yes, then return * PRINT LDAX B Move character into A ORA A If it is a zero, we are done RZ . Return if done MOV M,A Put character to screen INX B Point to next character INX H Point to next screen position JMP PRINT Go and print it * INVRS LDAX B Move character into A ORA A If it is a zero, we are done RZ . Return if done ADI 80H Now inverse the character MOV M,A Point to next character INX B Point to next character INX H Point to next screen position JMP INVRS Go and print it * INPUT CALL IN Go get a keyboard character JZ INPUT No character? Keep looking RET * INWAT LXI D,01000H Set call count INWT1 CALL IN Get a character ANI 7FH Strip MSB JNZ INWT2 Good, we got one DCX D Subtract one from call count MOV A,D Are we out of calls? ORA A RZ . Yes, then return JMP INWT1 No, keep calling INWT2 XCHG . Put left over call count in HL SHLD SPEED Store it in SPEED XCHG . Get old HL back now RET *----------------------------------------------------* * This routine processes the demo mode. It does * * this by bringing the target to the center column * * and then drawing it towards the center row. If * * the demo is activated (sometimes it isn't to make * * it play worse) and the target is in the center, * * it blasts it. Occasionally it mistakes a star for * * for the target. * *----------------------------------------------------* * DODEM LDA CENTR Is there anything to shoot? CPI 20H Let's check JNZ DO3 Yep, so blast it CALL RND We don't want demo to work ANI 03H all the time RNZ . So don't sometimes LHLD TGLOC Get the low byte of target loc. MOV A,L ANI 3FH Strip insignificant part of byte CPI 1CH See if we are on center line JC DO1 If we are the how about horizontal? CPI 21H So far so good JC DO2 Yes, we are on the center lihe MVI A,CHLFT Nope, move target toward DOB STA LAST the center and store move RET . Go back to calling program DO1 MVI A,CHRGT Nope, move the target JMP DOB toward the center and store move DO2 MOV A,H We are on center, but how about CPI 0CEH horizontal center? JNC DO4 Nope, below center - move up CPI 0CDH Maybe, keep checking JNC DO3 Yes, but continue the check DO15 MVI A,CHDWN Nope, too high - move down JMP DOB And store the move DO3 LDA CENTR Check and see if target is in CPI 20H the center. A blank is not the JNZ DO35 target, so don't fire CALL RND Let's fire occasionally ANI 03H JNZ DO15 DO35 MVI A,20H Target is in center!!! POP H Get return address and send JMP CHEK the fire character to be processed DO4 MVI A,CHUP If we got here we are JMP DOB below the center - move up * *----------------------------------------------------* * To implement this on systems not capable of using * * SOLOS/CUTER just change the following input call * * with a call address of a non-waiting input routine * * from your system. All routines in this program * * go through this routine for input. The character * * must come back in A. All other registers are * * considered to be destroyed by this program. * * There is no output routine as all output is put * * directly to the screen. You can place your input * * routine (if needed) at the end of this program. * *----------------------------------------------------* * IN CALL SOLIN Get a keyboard character RET . * CLOCK LDA COUNT Put count in A DCR A Subtract 1 STA COUNT Store the value in COUNT RNZ . Return if answer is not zero LDA KOUNT Reset COUNT according to speed STA COUNT LDA TIME Get the time DCR A Subtract one from time MOV B,A Save the time a moment ANI 0FH Is the number a legal decimal? CPI 0AH Let's see JC CONT9 Yep, so ignore fix MOV A,B Nope, subtract 6 to make legal SUI 06H MOV B,A Resave number CONT9 MOV A,B Get back number, fixed or not PUSH PSW Save it again LXI H,HTIME Point to the screen CALL PRNUM Print the time POP PSW Get back the time ORA A JZ FNISH If time equals zero then go STA TIME Store the time RET * MOVTG LHLD TGLOC Get target location PUSH H Save it temporairly CALL BLTGT Blank old target POP H Get value back CALL RND Get a RND number ENTR ANI 03H Make it a four-no. possibility CPI 03H Right? JNZ LEFT No, keep checking INX H Move target right MOV A,L Check for legal position ANI 3CH CPI 3CH JNZ PRTGT Okay, so print target DCX H Fix location JMP PRTGT Now print LEFT CPI 02H Left? JNZ UP No, keep checking DCX H Move target left MOV A,L Check for legal position ANI 3FH CPI 3FH JNZ PRTGT Okay, so print target INX H Fix location JMP PRTGT Now print UP CPI 01H Up? JNZ DOWN No, keep checking LXI D,0FFC0H move target up DAD D MOV A,H Check for legal position CPI 0CBH JNZ PRTGT Okay, so print target LXI D,0040H Fix location DAD D JMP PRTGT Now print DOWN LXI D,0040H Must be down DAD D Move target down MOV A,M Check for legal position ANI 80H JZ PRTGT Okay, so print target LXI D,0FFC0H Fix location DAD D Now print * PRTGT SHLD TGLOC Save new location LXI B,CHBUF Point to target buffer PRT1 MOV A,M Get character and put in buffer ANI 7FH CPI '*' Is it a star? JNZ PRT If so, don't put it in buffer MVI A,20H Put in a blank instead PRT STAX B No, it's not a star so put in as is INX B Move to next buffer location LDAX B Are we done? ORA A If it contains a zero yes JZ PRT2 Yes, print target now INX H No, keep filling JMP PRT1 PRT2 LHLD TGLOC Get target location LXI B,TARGT Point to target characters CALL PRINT Print it! RET * BLTGT LXI B,CHBUF Point to character buffer BLTG1 LDAX B Put character into A ORA A Are we done? RZ . Yes, so return MOV M,A No, so print it INX B Point to new character INX H Point to new screen location JMP BLTG1 Keep printing * STARS MVI H,0CCH This simply randomly CALL RND places four stars on the screen MOV L,A This could be changed to a table SHLD STAR1 lookup routine but it takes about INR H the same amount of space and this is CALL RND easier to understand. If more than MOV L,A four stars are wanted, a lookup would SHLD STAR2 be better INR H CALL RND MOV L,A SHLD STAR3 INR H CALL RND MOV L,A SHLD STAR4 RET * MVSTR LHLD STAR1 Get star 1 CALL MVNOW And move it SHLD STAR1 Don't forget 1's location LHLD STAR2 Do the same for 2,3,4 CALL MVNOW SHLD STAR2 LHLD STAR3 CALL MVNOW SHLD STAR3 LHLD STAR4 CALL MVNOW SHLD STAR4 RET * MVNOW LDA LAST Determine which direction the CPI CHUP target is moving and move the stars JNZ RIG1 the same way LXI D,0FFC0H If up, move stars up JMP ALSAM RIG1 CPI CHRGT JNZ DOWN1 LXI D,1H If right, move stars right JMP ALSAM DOWN1 CPI CHDWN JNZ LEFT1 LXI D,40H If down, move stars down JMP ALSAM LEFT1 LXI D,0FFFFH If left, move stars left * ALSAM MOV A,M If star has not been run over ANI 7FH then blank it CPI '*' JNZ AL1 MVI M,20H AL1 DAD D Actually move star now MOV A,H Are we off the bottom of the screen? CPI 0D0H JNZ AL2 Nope, we're okay MVI H,0CCH Yes, put star at top AL2 CPI 0CBH Are we off the top? JNZ AL3 Nope, still okay MVI H,0CFH Yes, so put it at the bottom LXI D,0FFC0H But not on top of information DAD D So adjust now AL3 MOV A,M So far so good CPI 7FH Are we on top of the info? JNC AL1 Yes so go back and readjust CPI 20H Is the space clear? RNZ . Nope, so don't print the star MVI M,'*' Yes, so put down a star RET * RND PUSH H A random number generator LXI H,SHLD+3 from PCC MVI B,08H MOV A,M RTOP RLC RLC RLC XRA M RAL RAL RAL DCR L DCR L DCR L MOV A,M RAL MOV M,A INR L MOV A,M RAL MOV M,A INR L MOV A,M RAL MOV M,A INR L MOV A,M RAL MOV M,A DCR B JNZ RTOP POP H RET * PUTHRS LXI H,SCRHR Get screen location for hairs SHLD LOCHR Save it LXI B,HAIRS Get hairs from memory MVI D,0BH There are 11 lines total PUT1 PUSH D Save this too LDAX B Get the space-out byte PUT2 ORA A Are we through putting blanks? JZ PUT3 If zero, then yes MVI M,20H Else, put another blank DCR A Decrement blank count INX H Move over on screen JMP PUT2 Go see if more blanks are needed PUT3 INX B Done printing blanks, CALL PRINT now print 1 line of hairs INX B Move over to next space-out byte LHLD LOCHR Get the screen location LXI D,40H Move down to the next line DAD D SHLD LOCHR Save this now POP D Are we through printing DCR D If there are no more lines, then yes JNZ PUT1 Nope, still more lines RET . Yep, we're done * WAIST LXI H,0FFFFH Let HL=65,535 WASTE DCX H Subtract 1 from HL MOV A,H Is HL=0? ORA A RZ . Yes, then leave JMP WASTE No, keep subtracting * WAIT MVI B,07H WAIT1 LHLD SPEED Get old call count CALL WASTE Wait for a second DCR B JNZ WAIT1 LXI H,100H Reset the speed wait SHLD SPEED RET * PRNUM MVI C,0B0H Set for inversed MOV B,A Save the number RRC . Move high nibble to the low RRC RRC RRC CALL PRNU1 Print the ASCII character of INX H high nibble MOV A,B Now do the same for the low PRNU1 ANI 0FH Strip high nibble ADD C Inverse the Character MOV M,A Put it to the screen RET * MVUP STA LAST MVI A,01H Up=1 JMP SAME MVDON STA LAST MVI A,00H Down=0 JMP SAME MVRIG STA LAST MVI A,03H Right=3 JMP SAME MVLEF STA LAST MVI A,02H Left=2 * SAME PUSH PSW save direction to move LHLD TGLOC Get target location PUSH H Save it CALL BLTGT Blank target POP H Retrieve it POP PSW Pop value CALL ENTR Go proccess it JMP BEGIN Go back to start * RNDTG CALL RND Get a random number? ANI 0CFH Fix it to fit on screen ORI 0CCH " MOV H,A Move number into high nibble CALL RND Now get low nibble ANI 0F3H MOV L,A Move number into low nibble MOV A,H CPI 0CFH JZ RNDTG MOV A,H Are we on the top line? CPI 0CCH Let's see JNZ RNTG Nope, then we're okay MOV A,L CPI 40H JNC RNTG Still no, good ORI 40H We are on the top line MOV L,A Fix location and save RNTG SHLD TGLOC RET * FIRE LXI H,THAIR Point to top hair on screen LXI D,0001H Set increment value for print CALL FLASH Inverse the hair LXI H,BHAIR Point to bottom hair CALL FLASH Use same increment. Inverse the hair LXI H,LHAIR Point to left hair LXI D,0040H Set increment value CALL FLASH Inverse the hair LXI H,RHAIR Point to right hair CALL FLASH Use same increment and inverse LDA THAIR Has the flash occured twice? CPI 80H PUSH PSW CC SHOOT Yes, so go see if game over POP PSW JP AROUND * EXPLD LDA CENTR Did he hit the target? CPI 20H JZ AROUND No. Game over? CPI '*' CZ STRBL Go blast the star JZ AROUND Now jump around explosion * BOOM LXI H,KILLD Point to top of screen LXI B,DSTRY Point to message CALL INVRS * MVI B,02H Yes, so flash 2 times EXPLO PUSH B Save the count * LXI H,1000H Make sure player can see the flash CALL WASTE * LXI B,XPLD1 Now put explosion on screen LXI H,X1LOC CALL PRINT LXI B,XPLD2 LXI H,X2LOC CALL PRINT LXI B,XPLD1 LXI H,X3LOC CALL PRINT * LXI H,0400H We must wait a second so that CALL WASTE the flash is visible * LXI B,REST1 Now, take explosion off screen LXI H,X1LOC CALL PRINT LXI B,REST2 LXI H,X2LOC CALL PRINT LXI B,REST1 LXI H,X3LOC CALL PRINT * POP B Are we through exploding? DCR B Let's check JNZ EXPLO No! * EXP0 MVI B,30H Now, let's put on some debris EXP1 PUSH B CALL RND Randomly place debris on the screen ANI 03H Make sure it's on the screen LXI H,0CC00H ADD H Set block of screen MOV H,A EXP2 CALL RND Now randomly get addresses MOV L,A in that block MOV A,M CPI 20H If there is a blank put some debris JNZ EXP2 MVI M,'#' This is the debris LXI H,100H Wait a moment to give sparkle effect CALL WASTE POP B Are we through putting on debris? DCR B JNZ EXP1 Nope, keep putting LXI H,2000H Yes, let player see it CALL WASTE * LXI H,SCREN Now clear all the debris CLR1 MVI M,20H Everyplace there is debris CLR2 INX H put a blank MOV A,H CPI 0D0H Are we at the bottom of the screen? JZ CHSCR Yes, now go back MOV A,M Is there debris here? CPI '#' JNZ CLR2 Nope, so don't blank JMP CLR1 Yes, so blank it * CHSCR LDA SCORE INR A DAA . Make sure it's a decimal LXI H,HSCOR PUSH PSW CALL PRNUM Print it! POP PSW STA SCORE Save new score * CALL RNDTG Place target randomly on screen LHLD TGLOC Get target location LXI B,CHBUF Point to blank target buffer EXPL1 MOV A,M Get character off screen ANI 7FH Make sure it's not inversed CPI '*' JNZ EXPL2 MVI A,20H EXPL2 STAX B Good, now put it in the buffer INX H Point to next character INX B Point to next buffer location LDAX B Are we done? ORA A JZ AROUND Yes, then stop filling JMP EXPL1 No, keep filling * AROUND LXI H,0600H Wait a bit CALL WASTE LDA THAIR Is flash still on screen? ANI 80H JNZ FIRE Yes, so unflash now * LDA KILLD Is message on screen? CPI 0A0H JNZ AROWND No, so don't erase CALL WAIST Wait a second LXI H,KILLD Yes, now erase it LXI B,ERASE CALL PRINT * AROWND LDA AMMO Subtract one from ammo supply DCR A PUSH PSW Save the amount temporarily LXI H,HAMMO Point to the screen ANI 0FH If the number is an illegal decimal CPI 0AH then fix it JC AMM0 It's not, so ignore the fix POP PSW Get amount and fix it SUI 06H Subtract 6 to fix PUSH PSW Resave number AMM0 POP PSW Get either fixed or not fixed # PUSH PSW Save the amount again CALL PRNUM Print the number POP PSW Retrieve number JZ FINSH If we are out of ammo, then end STA AMMO Otherwise store new amount CALL CLOCK JMP BEGIN Go back to start * SHOOT LXI H,0CF84H Find out how to shoot LXI D,0CFBCH SHUTE MOV A,M Collect old characters MOV B,A And save them LDAX D MOV C,A MVI M,'/' Put on new characters MVI A,'\' STAX D PUSH H LXI H,500H Make sure it can be seen CALL WASTE POP H MOV A,B Put old characters on screen MOV M,A MOV A,C STAX D LXI B,0FFC4H Get next location of shot DAD B Do it now LXI B,0FFBCH Get next location of shot XCHG We must put numbers in right place DAD B Now do it XCHG Replace numbers in right place MOV A,H Are we done? CPI 0CDH JNZ SHUTE No, continue RET Yep, so return * STRBL PUSH PSW Save the flags MVI A,'*'+80H Inverse the star in STA CENTR the center LXI B,INDST Print indestructable message LXI H,KILLD Point to the location to do so CALL INVRS Now, print it CALL WAIST Wait a few seconds CALL WAIST LXI B,ERASE Now erase the previos message LXI H,KILLD CALL PRINT MVI A,'*' Put a normal star back in the center STA CENTR POP PSW RET . Continue with the fire sequence * FLASH MOV A,M Get character from screen FLSH1 ADI 80H Inverse it MOV M,A Now put it on screen DAD D Point to next character MOV A,M Get the character from screen CPI 20H Are we done? JNZ FLSH1 No, keep inversing RET . Yes, so long * INIT MVI A,25H Set ammo amount, STA AMMO Store the amount XRA A Set score, and store STA SCORE ADI 99H Set time, and store STA TIME * CALL RNDTG Randomly place target CALL DEMCH Check to see if demo is set * ININ CALL INPUT Wait for speed CPI ESCPE Monitor? JZ EXIT Yes, so exit program CPI 'R' Reset high score? JNZ IN1 No, how about demo? LXI H,3030H Yes, set high score to zero SHLD HSCR+6 Now, set priated score to zero SHLD 0CEE6H XRA A Now set the high score to zero STA HIGH And save it JMP ININ Restart the program IN1 CPI 'D' How about demo? JNZ IN2 Nope, maybe a number XRA A Set flag for demo STA DEMO Store the flag MVI A,30H Set speed to zero IN2 CPI 30H Is it a number? JC ININ No, keep waiting CPI 36H Maybe, let's check JNC ININ No, keep waiting * ANI 0FH Yes, reduce the number ADI 04H Now we adjust further STA INWAT+2 Store the number SUI 10H Modify number slightly CMA . but make sure it's positive STA KOUNT to set the timer right STA COUNT * CALL CLEAR Clear then return RET * DEMCH LDA DEMO Load in the flag ORA A Set flag for checking RNZ . If flag is off (1) then return CALL WAIST Wait a total of 8 seconds CALL WAIST CALL WAIST CALL WAIST MVI A,30H Set to speed zero POP H Get return address JMP IN1 Go process speed * FNISH POP H Destroy old return address FINSH LDA SCORE Does he get extra? CPI 0FH If score is less than 9, no JC NWHI Go see if we have a new high score LDA EXTR1 Have we already given extra? CPI 0C5H JZ NWHI Go see if a new high score LDA TIME No, give extra ADI 34H Give extra time DAA STA TIME LXI H,HTIME CALL PRNUM Now print extra LDA AMMO ADI 14H Give extra ammo DAA STA AMMO LXI H,HAMMO CALL PRNUM Now print extra LXI B,EXTRA Print extra messages LXI H,EXTR1 CALL INVRS LXI B,EXTRA LXI H,EXTR2 CALL INVRS JMP BEGIN Now continue with game * NWHI LDA SCORE Get the new score MOV B,A Save it a moment LDA HIGH Get the high score CMP B Is new score a high score? JNC GAMOV Nope, so go print game over MOV A,B STA HIGH Save it permanently also MVI C,30H LXI H,HSCR+6 Store the ASCII number CALL PRNUM+2 LXI H,OVMS1+0C0H Tell player there's a new high LXI B,NEWHI Point to the message CALL PRINT And print it LDA HIGH Now, get the score and print it MVI C,30H We don't want it inversed CALL PRNUM+2 And we want a blank between digits MOV A,B CALL PRNUM+2 Print the second digit DCX H MVI M,20H Push in the blank LXI H,OVMS1+100H Okay now print a blank line LXI B,BLOVR Get the line CALL PRINT And print it * GAMOV LXI H,OVMS1 Point to the screen LXI B,BLOVR Get a blank line CALL PRINT And print it LXI H,OVMS1+40H Point to the screen LXI B,OVER Get the game over message CALL PRINT Now, print it LXI H,OVMS1+80H Point again to the screen LXI B,BLOVR Get the blank line CALL PRINT And print it CALL WAIST Wait now for a bit CALL WAIST CALL WAIST LXI SP,STACK Reset stack and game JMP STRT1 * EXIT CALL CLEAR CALL PTDOS DB 0DH * * The remainder is just variable definitions * and print * SPEED DW 0001H TGLOC DW 0 Target location AGAIN DB 0 LAST DB CHRGT CTRL S TIME DB 0 Time count COUNT DB 0 KOUNT DB 0 AMMO DB 0 SCORE DB 0 HIGH DB 0 DEMO DB 0 SHLD ASC 'SEAD' For RND LOCHR DW 0 STAR1 DW 0 STAR2 DW 0 STAR3 DW 0 STAR4 DW 0 TARGT DB '>','-',0EH,'-','<',0 ASCF 0 REST1 ASCZ ' ! ' REST2 ASCZ '-- --' XPLD1 DB 0A0H,0A0H,20H,20H,0A0H,20H,20H,0A0H,0A0H,0 XPLD2 DB 20H,20H,0A0H,0A0H,20H,0A0H,0A0H,20H,20H,0 * * Most of the following ASCII lines * are 32 columns wide * * The hairs are stored in memory with a preceding * # telling how far out to space, and an end mark. * HAIRS DB 7 ASC '-------!-------' DB 0,0DH ASC '-!-' DB 0,0AH ASC '----!----' DB 0,0 ASC '! -!- !' DB 0,0 ASC '! ! ! ! !' DB 0,0 ASC '!--!--!--!-- --!--!--!--!' DB 0,0 ASC '! ! ! ! !' DB 0,0 ASC '! -!- !' DB 0,0AH ASC '----!----' DB 0,0DH ASC '-!-' DB 0,7 ASC '-------!-------' DB 0 INFO ASC ' TIME: 99 SCOR' ASCZ 'E: 00 AMMO: 25 ' EXTRA ASCZ 'EXTRA!' DSTRY ASCZ ' OBJECT DESTROYED! ' INDST ASCZ ' INDESTRUCTABLE! ' ERASE ASCZ ' ' OVER ASCZ ' * * * G A M E O V E R * * * ' BLOVR ASCZ ' ' NEWHI ASCZ ' N E W H I G H S C O R E: ' FORCE ASCZ 'And...May the FORCE be with you!' INSTR ASC '|-=-=-=-=-=-=-=-=- PROTEUS Soft' ASC 'ware Library -=-=-=-=-=-=-=-=-|' ASC '| Copyright' ASC ' (C) 1980 |' ASC '| * * * S T A R ' ASC ' W A R S * * * |' ASC '| writt' ASC 'en by |' ASC '| Stephen ' ASC ' Maguire |' ASC '| ' ASC ' |' ASC '| SPACE = fire! ' ASC 'W ESCAPE = monitor |' ASC '| " W " = up A -' ASC '+- S " Z " = down |' ASC '| " A " = left ' ASC 'Z " S " = right |' ASC '| DEL = reset ' ASC ' Hits >= 15 = extra |' ASC '| ' ASC ' |' ASC '| High sco' HSCR EQU $ ASC 're is 00 |' ASC '| Hit a no. (fast=0 t' ASC 'o 5) or "D" to start. |' ASC '| " R " = rese' ASC 't high score. |' ASC '|-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==' ASCZ '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-|' ASCF 1 CHBUF ASCZ ' ' ASC 'COPYRIGHT (C) 1980 BY STEPHEN MAGUIRE' DS 15H STACK EQU $ * END