A.N.A.L.O.G. ISSUE 22 / SEPTEMBER 1984 / PAGE 63
This month’s assembly language game, Money Hungry, is a game of skill for one player.
Before typing anything, look at the listings accompanying this article.
Listing 1 is the BASIC data and data checking routine. This listing is used to create both cassette and disk versions of Money Hungry. The data statements are listed in hexadecimal (base 16), so the program will fit in 16K cassette systems. This makes typing more difficult, but it’s a necessary evil.
Listing 2 is the assembly language source code for the game of Money Hungry, created with the OSS MAC/65 assembler. You do not have to type this listing to play the game! It is included for those readers interested in assembly language. Follow the instructions below to make either a cassette or disk version of Money Hungry.
Money Hungry requires one joystick, plugged into port 1. The game is started by pressing START or the joystick button.
In Money Hungry, you play the part of a thief trying to collect as much money as possible, while making every effort to avoid the police. You are placed in a maze, with coins scattered all around. You pick up the coins by moving over them. Once on every board, a money bag appears, containing a 100 coin bonus. Your score, in coins, is shown at the bottom of the screen.
There are three police patrolling the maze, and if they catch you five times, the game is over. The number of tries you have remaining is shown at the lower left of the screen.
You can block the police by placing doors in the maze. To do this, press the joystick button while moving through the maze. A red door will appear, and the police can’t get through it. You have four such doors and can reopen them at any time simply by running over them. Once you pick up a door, you can reuse it by pressing the joystick button again.
When you have picked up all of the coins in the maze, you will move to the next level. In each level, either you or the police will increase in speed. Good
10 REM *** MONEY HUNGRY *** 20 TRAP 20:? "MAKE CASSETTE (0), OR DISK (1)";:INPUT DSK:IF DSK>1 THEN 20 30 TRAP 40000:DATA 0,1,2,3,4,5,6,7,8,9 ,0,0,0,0,0,0,0,10,11,12,13,14,15 40 DIM DAT$(91),HEX(22):FOR X=0 TO 22: READ N:HEX(X)=N:NEXT X:LINE=990:RESTOR E 1000:TRAP 120:? "CHECKING DATA" 50 LINE=LINE+10:? "LINE:";LINE:READ DA T$:IF LEN(DAT$)<>90 THEN 220 60 DATLIN=PEEK(183)+PEEK(184)*256:IF D ATLIN<>LINE THEN ? "LINE ";LINE;" MISS ING!":END 70 FOR X=1 TO 89 STEP 2:D1=ASC(DAT$(X, X))-48:D2=ASC(DAT$(X+1,X+1))-48:BYTE=H EX(D1)*16+HEX(D2) 80 IF PASS=2 THEN PUT #1,BYTE:NEXT X:R EAD CHKSUM:GOTO 50 90 TOTAL=TOTAL+BYTE:IF TOTAL>999 THEN TOTAL=TOTAL-1000 100 NEXT X:READ CHKSUM:IF TOTAL=CHKSUM THEN 50 110 GOTO 220 120 IF PEEK(195)<>6 THEN 220 130 IF PASS=0 THEN 170 140 IF NOT DSK THEN 160 150 PUT #1,224:PUT #1,2:PUT #1,225:PUT #1,2:PUT #1,68:PUT #1,33:CLOSE #1:END 160 FOR X=1 TO 107:PUT #1,0:NEXT X:CLO SE #1:END 170 IF NOT DSK THEN 200 180 ? "INSERT DISK WITH DOS, PRESS RET URN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0 ,"D:AUTORUN.SYS" 190 PUT #1,255:PUT #1,255:PUT #1,158:P UT #1,32:PUT #1,10:PUT #1,44:GOTO 210 200 ? "READY CASSETTE AND PRESS RETURN ";:OPEN #1,8,128,"C:":RESTORE 230:FOR X=1 TO 40:READ N:PUT #1,N:NEXT X 210 ? :? "WRITING FILE":PASS=2:LINE=99 0:RESTORE 1000:TRAP 120:GOTO 50 220 ? "BAD DATA: LINE ";LINE:END 230 DATA 0,24,118,32,157,32,169,0,141, 47,2,169,60,141,2,211,169,0,141,231,2, 133,14,169,56,141,232,2 240 DATA 133,15,169,68,133,10,169,33,1 33,11,24,96 1000 DATA 7070707070707047B42070067007 7070707006419E20000000002D2F2E25390028 352E27323900000000000000,530 1010 DATA 000000000000E2F9000000000000 000000000000646F6E616C6400006D75727068 79000000F0F2E5F3F300F3F4,992 1020 DATA E1F2F400F4EF00E2E5E7E9EE7070 7045003A050505050505050505050741042136 147F362A7F1C3E00FA8A8ABA,191 1030 DATA E6E6FFBAFF771C08143E1C1C3E00 388888EAEA38EAEA38A7A1ADA5AFB6A5B2A200 BDFD279D0038BDFD289D0039,996 1040 DATA BDFE299D003ABDFE2A9D003BCAD0 E5A9208D3102A99E8D3002A9228D2F02AD1FD0 C906F005AD8402D0F4A9048D,276 1050 DATA 3002A9218D3102A9388DF402A988 8DC402A9FC8DC502A9368DC602A9008D6F028D 08D2A9038D320220692220BB,838 1060 DATA 22206B23200E238D1ED020712620 F72220DA26A200AD0CD0F0034C0D278D0AD4AC 0BD4B900188D12D0B900198D,901 1070 DATA 13D0B9001A8D14D0B9001B8D15D0 A5CDC96B90D44C9726C6B6F0034C4426A5B785 B6A91E85B1A98085B0A91985,499 1080 DATA B3A90085B2AABD05D02904F0138D 1ED0B58CD589D0044901958CB5894901958986 C1B5B9186901B4BEC8209525,948 1090 DATA A6C1B58C2902F007A588F0074C51 22A587D00BB58C9589AD0AD22903958CB589D0 034CD525C901D0034CE825C9,323 1100 DATA 02D0034CFB254C1D26A9008DDB3A 8DDC3AA90085B0A93A85B1A006B1B0F00EC91E F00AC91FD00A88A90091B0C8,594 1110 DATA A91191B0C8C8C02490E4A5B01869 2885B0A5B1690085B1A006C93B90D1A5B0C990 D0CBA90085CD85BCA905858F,831 1120 DATA 60A91E85B1A90085B0A891B0C8D0 FBE6B1A6B1E020D0F3A91885B1A90085B0A891 B0C8D0FBE6B1A6B1E01CD0F3,101 1130 DATA A92E8D2F02A9038D1DD0A91C8D07 D460A906A223A091205CE4A9408D0FD4A907A2 21A0F04C5CE4A98085B0A91E,311 1140 DATA 85B1A90085B2A91985B3A017A208 BD182191B0BD212191B2C8CA10F2E6B3A5B018 698085B0A5B1690085B1C920,71 1150 DATA 90DBA94385B98D01D0A98485BA8D 02D0A9B385BB8D03D0A91785BE85BF85C0A903 8589858BA901858A60A208A0,74 1160 DATA 37BD2A2199001EBD3321990018C8 CA10F0A97C85B88D00D0A93785BDA90B85CB85 CC60A9008D01D28D03D2A6B8,363 1170 DATA E8A4BDC8205C2420A624C681F003 4C5924A5808581A5CC2903C903F007A584F007 4CC723A583D004A5CC85CBAD,972 1180 DATA 7802C90FF00285CCA5CBC90FD003 4C5924C90AF008C906F004C90ED020A20AA4BD C018B0034C5924B9001E99FF,994 1190 DATA 1DB9001899FF17C8CAD0F0C6BD4C 5924C909F008C905F004C90DD023A5BDC95790 034C59246909A8A20AB9FF1D,379 1200 DATA 99001EB9FF1799001888CAD0F0E6 BD4C5924C90BD012A6B8E044B0034C5924CA86 B88E00D04C5924A6B8E0B390,36 1210 DATA 034C5924E886B88E00D04C5FE486 C584C69838E91085C3A90885C4A90085C2203E 258583A5C285C62901D004A9,495 1220 DATA 018583A5C538E93085C3A90485C4 A90085C2203E258584A5C285C529034901F004 A9018584A5C285C560A90085,754 1230 DATA B485CAA5CB2901D00AA5CCC90BD0 02C6C6E6C6A5C685C7A92885C8205E25E6C5A5 C51865C985B4A5CA693A85B5,184 1240 DATA A000B1B4C91ED011A9268D01D2A9 148D00D2A900A891B4E68FC91FD017A9268D01 D2A9148D00D2A900A891B4C6,713 1250 DATA B491B4E6B4E68FC911F01CC91DD0 2BA9A68D01D2A9DC8D00D2A26486BCC6B49891 B4E6B491B4609891B4E6CDA2,739 1260 DATA 0186BCA95F8D01D2A9B98D00D260 A00838E5C40826C206C32A289005E5C44C5325 65C488D0EDB00365C41826C2,31 1270 DATA 60A90085C9A20846C790031865C8 6A66C9CAD0F385CA60A005E001B00160B9BF3B C91B9009A91299BF3B8810F1,496 1280 DATA 6018690199BF3BCAD0E060858898 38E91085C3A90885C4A90085C2203E258587A5 C22901D004A9018587A58838,718 1290 DATA E93085C3A90485C4A90085C2203E 258588A5C229034901F004A901858860B4B9C0 B390034C4426C89895B99D01,890 1300 DATA D04C4426B4B9C044B0034C442688 9895B99D01D04C4426B4BEA20AC018B0034C44 26B1B08891B0C8B1B28891B2,379 1310 DATA C8C8CAD0F0A6C1D6BE4C4426A6C1 B5BEC95790034C44266909A8A20A88B1B0C891 B088B1B2C891B288CAD0F0A6,151 1320 DATA C1F6BE4C4426A5B018698085B0A5 B1690085B1E6B3A6C1E8E003B0034C0C22A6BC A90085BC207425AD8402D003,701 1330 DATA 2050274C62E4A903858085B78581 85B6A013A90099B83B88D0FAA9578DBA3BA000 A91299BF3BC8C006D0F860A5,425 1340 DATA B7C580F008C680D00CA9018580C6 B7D004A90185B720C82620D22720692220BB22 200E23206B2320F72220DA26,68 1350 DATA 4CC121A906A2E4A05F205CE4A907 A2E4A0624C5CE4A9268D2702A9ED8D2602A901 A000A2044C5CE4A91C8DDB3A,245 1360 DATA A91D8DDC3AA9278D2702A9048D26 024CE426A9008DDB3A8DDC3A6020C826209127 AEBA3BCAE052B0034C33278E,950 1370 DATA BA3B20BB22206B23200E2320F722 8D1ED04CC121A200BD3C219DBA3BE8E004D0F5 A200BD40219DC63BE8E004D0,986 1380 DATA F54C7021C68FD003E68F60A584F0 17A5C52903D02DA9C08D02D2A9A38D03D2A000 A91E91B460A5C62901D016A9,676 1390 DATA C08D02D2A9A38D03D2C6B4A001A9 1F91B48891B460E68F60A9A88D03D2A9648590 A2FFA014A5908D02D2CAD0F8,151 1400 DATA 88D0F5E690E690A014A590C9A0D0 E9A9888D03D2A9328D02D2A2FFA0FFCAD0FD88 D0FAA9008D02D28D03D260A9,240 1410 DATA A88D01D2A9408591A2FFA014A591 8D00D2CAD0F888D0F5C691C691A014A591D0EB A9008D00D28D01D260000000,363 1420 DATA 0000000000555555AA5555555595 9595AA55555555555555AA9595959595959595 959595951515151515151515,466 1430 DATA 959595AA95959595565656AA5656 5656555555AA56565656565656AA5555555554 545454545454545656565656,90 1440 DATA 5656565555555555555555959595 95555555555656565655555555555555959595 959555555556565656560000,333 1450 DATA 008000000000003C666E76663C00 0018381818187E00003C660C18307E00007E0C 180C663C00000C1C3C6C7E0C,345 1460 DATA 00007E607C06663C00003C607C66 663C00007E060C18303000003C663C66663C00 003C663E060C3800220A2AA0,697 1470 DATA A2A02A0A88A0280A2A0A28A0C0C0 C0C0C0C0C0C0000000FF00000000003C666E6E 603E0000183C66667E660000,516 1480 DATA 7C667C66667C00003C666060663C 0000786C66666C7800007E607C60607E00007E 607C60606000003E60606E66,134 1490 DATA 3E000066667E66666600007E1818 18187E000006060606663C0000666C78786C66 000060606060607E00006377,850 1500 DATA 7F6B6363000066767E7E6E660000 3C666666663C00007C66667C606000003C6666 666C3600007C66667C6C6600,328 1510 DATA 003C603C06063C00007E18181818 18000066666666667E0000666666663C180000 63636B7F7763000066663C3C,964 1520 DATA 6666000066663C18181800007E0C 1830607E00001E181818181E0000406030180C 060000781818181878000008,686 1530 DATA 1C3663000000000000000000FF00 00000000050301010103010101030101010301 010103010101030101010301,167 1540 DATA 0101030101080A00000000000005 04001100110011001100110011001100110011 001100110011001100110011,456 1550 DATA 0B0A000000000000050400110106 00110106001101060011010600110106001101 060011010600110B0A000000,692 1560 DATA 0000000504001100110011001100 11001100110011001100110011001100110011 00110B0A0000000000000504,986 1570 DATA 0011010600110106001101060011 010600110106001101060011010600110B0A00 000000000005040000000000,201 1580 DATA 0000000000000000000000001100 11001100110011001100110B0A000000000000 050400110106001101060011,415 1590 DATA 0106001101060011010600110106 0011010600110B0A0000000000000504001100 110011001100110011001100,684 1600 DATA 1100110011001100110011001100 110B0A00000000000005040011010600110106 001101060011010600110106,970 1610 DATA 001101060011010600110B0A0000 00000000050400110011001100110011001100 110011001100110011001100,269 1620 DATA 11001100110B0A00000000000005 02010101020101010201010102010101020101 010201010102010101020101,385 1630 DATA 090A000000000057000000001212 1212121A000000000000000000000000000000 000000000000000000000000,607 1640 DATA 0000000000000000000000000000 00000000000000000000000000000000000000 000000000000000000000000,607
.OPT NO LIST ; MONEY HUNGRY ; ; BY DONALD MURPHY ; ; ANALOG COMPUTING ; ;VARIABLES ; LEVEL = $80 ;LEVEL # DELAY = $81 ;DELAY INDEX HERE = $82 NOX = $83 ;HORIZ. MOVE FLAG NOY = $84 ;VERT. MOVE FLAG TX = $85 ;X HOLD AREA DM = $86 ;MISC. VARIABLE XM = $87 ;HORIZ. FLAG YM = $88 ;VERT. FLAG DIRC = $89 ;ENMY CUR DIRECTION DIRN = $8C ;NEXT ENMY DIRECTION NDOOR = $8F ;# OF DOORS TF3 = $90 TF4 = $91 POINTL = $B0 ;GENERAL POINTER POINTH = $B1 TABPTL = $B2 ;TABLE POINTER TABPTH = $B3 VBPNTL = $B4 ;VBLANK POINTER VBPNTH = $B5 EDELAY = $B6 ;ENEMY DELAY ELEVEL = $B7 ;ENEMY LEVEL XPOSP0 = $B8 ;HORIZ. POS. PLR 0 XPOSP1 = $B9 ;HORIZ. POS. PLR 1 XPOSP2 = $BA ;HORIZ. POS. PLR 2 XPOSP3 = $BB ;HORIZ. POS. PLR 3 SCOUNT = $BC ;SCORE COUNT TO ADD YPOSP0 = $BD ;VERT. POS. PLR 0 YPOSP1 = $BE ;VERT. POS. PLR 1 YPOSP2 = $BF ;VERT. POS. PLR 2 YPOSP3 = $C0 ;VERT. POS. PLR 3 TEMPX = $C1 ;VERT. POS. PLR 4 DRES = $C2 ;DIVISION RESULT LDIV = $C3 ;LOW DIVIDEND DIVS = $C4 ;DIVISOR XPOSSC = $C5 ;HOR. POS. ON SCRN YPOSSC = $C6 ;VERT POS. ON SCRN MUPL = $C7 ;LO MULTIPLIER MUCN = $C8 ;MULTIPLICAND RESL = $C9 ;RESULT RESH = $CA STICKC = $CB ;STICK VALUE STICKN = $CC ;NEXT STICK VALUE NDOTS = $CD ;#DOTS EATEN ; ;HARDWARE & SHADOW LOCATIONS ; COLOR0 = $02C4 ;PLAYFIELD COLORS COLOR1 = $02C5 COLOR2 = $02C6 SDLSTL = $0230 ;DISP LIST POINTER SDLSTH = $0231 CHBAS = $02F4 ;CHAR BASE ADDR GRACTL = $D01D ;GRAPHICS CONTROL SDMCTL = $022F ;DMA CONTROL COLPM0 = $D012 ;P/M COLORS COLPM1 = $D013 COLPM2 = $D014 COLPM3 = $D015 HPOSP0 = $D000 ;PLAYER HOR. POS. HPOSP1 = $D001 HPOSP2 = $D002 HPOSP3 = $D003 PMBASE = $D407 ;P/M BASE ADDRESS VCOUNT = $D40B ;VERT. LINE COUNTER WSYNC = $D40A ;WAIT FOR SYNC P0PF = $D004 ;COLLISION REGISTERS P0PL = $D00C P1PF = $D005 HITCLR = $D01E ;COLLISION CLEAR RANDOM = $D20A ;RANDOM # NMIST = $D40F ;NMI STATUS AUDCTL = $D208 ;AUDIO CONTROL AUDC1 = $D201 ;AUD. CHANNELS AUDC2 = $D203 AUDF1 = $D200 ;AUD. FREQUENCIES AUDF2 = $D202 CONSOL = $D01F ;CONSOLE KEYS SKCTL = $0232 ;SERIAL PORT CTRL GPRIOR = $026F ;P/M PRIORITY STICK0 = $0278 ;STICK 0 STRIG0 = $0284 ;BUTTON 0 ; ;TABLES AND RAM ASSIGNMENTS ; CTAB0 = $1800 ;PL.0 COLORS CTAB1 = $1900 ;PL.1 COLORS CTAB2 = $1A00 ;PL.2 COLORS CTAB3 = $1B00 ;PL.3 COLORS CHSET = $3800 ;CHARACTER SET SCRAM = $3A00 ;SCREEN ADDRESS PMRAM = $1C00 ;P/M ADDRESS ; ;PROGRAM START ; *= $209E ; ;TITLE SCREEN DISPLAY LIST ; TSCRD .BYTE 112,112,112,112,112 .BYTE 112,112,$47 .WORD TSCRW .BYTE 112,6,112,7,112,112,112 .BYTE 112,6,$41 .WORD TSCRD ; ;TITLE SCREEN DATA ; TSCRW .BYTE 0,0,0,0,45,47,46,37 .BYTE 57,0,40,53,46,39,50,57 .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0 .BYTE 226,249,0,0,0,0,0,0,0,0,0 .BYTE 0,0,0,100,111,110,97 .BYTE 108,100,0,0,109,117,114 .BYTE 112,104,121,0,0,0,240,242 .BYTE 229,243,243,0,243,244,225 .BYTE 242,244,0,244,239,0,226 .BYTE 229,231,233,238 ; ;GAME BOARD DISPLAY LIST ; DLIST .BYTE 112,112,112,$45 .WORD SCRAM .BYTE 5,5,5,5,5,5,5 .BYTE 5,5,5,7,65 .WORD DLIST ; ;PLAYER COLORS & BIT MAPS ; ENBMAP .BYTE 54,20,127,54 .BYTE 42,127,28,62,0 ENCMAP .BYTE $FA,$8A,$8A,$BA .BYTE $E6,$E6,$FF,$BA,$FF PLBMAP .BYTE 119,28,8,20,62 .BYTE 28,28,62,0 PLCMAP .BYTE $38,$88,$88,$EA .BYTE $EA,$38,$EA,$EA,$38 GAME .BYTE $A7,$A1,$AD,$A5 OVER .BYTE $AF,$B6,$A5,$B2 ; ;GAME EXECUTION STARTS HERE! ; INIT LDX #0 INILP LDA CHDAT,X ;SET UP STA CHSET,X ;CHAR SET LDA CHDAT+256,X STA CHSET+256,X LDA SCDAT,X ;AND SCREEN STA SCRAM,X LDA SCDAT+256,X STA SCRAM+256,X DEX BNE INILP LDA # >TSCRD ;SHOW... STA SDLSTH ;TITLE SCREEN LDA # <TSCRD STA SDLSTL LDA #$22 STA SDMCTL PROG LDA CONSOL ;GET CONSOLE CMP #6 ;START PRESSED? BEQ GO ;YES! LDA STRIG0 ;TRIGGER PRESSED? BNE PROG ;NO! GO LDA #DLIST&255 ;SHOW... STA SDLSTL ;GAME SCREEN LDA #DLIST/256 STA SDLSTH LDA #CHSET/256 ;POINT TO STA CHBAS ;CHAR SET LDA #$88 ;SET COLORS STA COLOR0 LDA #$FC STA COLOR1 LDA #$36 STA COLOR2 LDA #0 ;SET... STA GPRIOR ;PRIORITY STA AUDCTL ;AND AUDIO LDA #3 ;RESET SOUNDS STA SKCTL JSR SETSC ;SETUP SCREEN JSR SETPM ;SETUP P/M JSR SETPL ;SET YOU JSR SETEM ;SET ENEMIES STA HITCLR ;CLEAR COLLISIONS JSR INT ;MISC. INIT. JSR SETVB ;START VBLANK JSR PRIZE ;INIT MONEY BAG LDX #0 ;ZERO X REG ; ;MAINLINE COLOR LOOP ; COLOR LDA P0PL ;HIT ANYTHING? BEQ CONT ;NO, CONTINUE JMP DEATH ;YOU'RE DEAD! CONT STA WSYNC ;WAIT FOR SYNC LDY VCOUNT ;GET VERT LINE# LDA CTAB0,Y ;GET COLOR FOR STA COLPM0 ;PLAYER 0 LDA CTAB1,Y ;GET COLOR FOR STA COLPM1 ;PLAYER 1 LDA CTAB2,Y ;GET COLOR FOR STA COLPM2 ;PLAYER 2 LDA CTAB3,Y ;GET COLOR FOR STA COLPM3 ;PLAYER 3 LDA NDOTS ;# OF DOTS... CMP #107 ;=107? BCC COLOR ;NO, GET NEXT COLOR JMP NEXTL ;NEW LEVEL! ; ;DEFERRED VBLANK ; DVBL DEC EDELAY ;TIME FOR EN. MOVE? BEQ EDO ;YES! JMP END ;NO, EXIT EDO LDA ELEVEL ;RESET MOVE TIMER STA EDELAY LDA #PMRAM/256+2 ;POINT TO STA POINTH ;PLAYERS LDA #$80 STA POINTL LDA #CTAB1/256 ;GET COLOR... STA TABPTH ;TABLE OFFSET LDA #0 STA TABPTL TAX ;ZERO X MAIN LDA P1PF,X ;HIT ANYTHING? AND #4 ;GET COLL. BITS BEQ NHDR ;NO COLLISIONS STA HITCLR ;RESET COLLISIONS LDA DIRN,X ;NEXT DIRECTION CMP DIRC,X ;= CURRENT DIR? BNE EOR1 ;NO, CHANGE IT. EOR #1 ;REVERSE IT, STA DIRN,X ;STORE IT. EOR1 LDA DIRC,X ;GET CURRENT EOR #1 ;REVERSE IT, STA DIRC,X ;AND STORE. NHDR STX TEMPX ;SAVE X LDA XPOSP1,X ;GET PLAYER X'S CLC ;HORIZ. POS, ADC #1 ;ADD 1, LDY YPOSP1,X ;GET VERT POS, INY ;ADD 1 JSR PMOVE ;MOVE PLAYER LDX TEMPX ;GET X AGAIN LDA DIRN,X ;GET NEXT DIRECTION AND #2 ;GET 1ST 2 BITS BEQ TXM ;TRY HORIZ. MOVE LDA YM ;OK TO MOVE VERT? BEQ CCHD ;YES, CHANGE DIR JMP KCD ;NO, KEEP CURRENT TXM LDA XM ;HORIZ MOVE OK? BNE KCD ;NO, KEEP CURRENT CCHD LDA DIRN,X ;CHANGE DIRECTION STA DIRC,X ;STORE NEXT DIR LDA RANDOM ;GET RANDOM # AND #3 ;MASK TO 0-3 STA DIRN,X ;SAVE FOR NEXT KCD LDA DIRC,X ;GET CURRENT DIR BNE TA1 ;NOT RIGHT JMP MPXR ;MOVE RIGHT! TA1 CMP #1 ;IS IT LEFT? BNE TA2 ;NO! JMP MPXL ;MOVE LEFT! TA2 CMP #2 ;IS IT UP? BNE TA3 ;NO! JMP MPXU ;MOVE UP! TA3 JMP MPXD ;MOVE DOWN! ; ;SET UP SCREEN ; SETSC LDA #0 ;ERASE MONEY BAG STA SCRAM+219 STA SCRAM+220 LDA #SCRAM&255 ;POINT... STA POINTL ;TO SCREEN LDA #SCRAM/256 STA POINTH LDY #6 ;SCRN BORDER OFFSET L1 LDA (POINTL),Y ;GET SCRN BYTE BEQ NFL ;EMPTY-PLOT DOT! CMP #30 ;IS IT DOT? BEQ NFL ;YES, PLOT AGAIN! CMP #31 ;WALL? BNE PL1 ;YES, DON'T PLOT DEY ;PREVIOUS POS. LDA #0 ;ZERO IT! STA (POINTL),Y INY ;BACK TO THIS POS. NFL LDA #17 ;PLOT A DOT. STA (POINTL),Y PL1 INY ;NEXT POSITION INY CPY #36 ;END OF LINE? BCC L1 ;NO! LDA POINTL ;INCREMENT... CLC ;POINTER... ADC #40 ;TO NEXT LINE STA POINTL LDA POINTH ADC #0 STA POINTH LDY #6 ;LAST LINE? CMP #SCRAM/256+1 BCC L1 ;NO! LDA POINTL ;LAST LINE? CMP #144 BNE L1 ;NO! LDA #0 ;RESET... STA NDOTS ;# OF DOTS STA SCOUNT ;AND SCORE COUNT LDA #5 ;RESET # DOORS STA NDOOR RTS ;ALL DONE! ; ;INIT PLAYER-MISSILE GRAPHICS ; SETPM LDA #PMRAM/256+2 ;POINT... STA POINTH ;TO... LDA #0 ;PLAYER MEMORY STA POINTL TAY ;ZERO Y REG. L3 STA (POINTL),Y ;ZERO P/M AREA INY BNE L3 INC POINTH LDX POINTH ;DONE CLEARING? CPX #PMRAM/256+4 BNE L3 ;NO! LDA #CTAB0/256 ;POINT... STA POINTH ;TO... LDA #0 ;COLOR TABLES STA POINTL TAY ;ZERO Y REG. Q1 STA (POINTL),Y ;ZERO COLOR TABLES INY BNE Q1 INC POINTH LDX POINTH ;DONE CLEARING? CPX #CTAB3/256+1 BNE Q1 ;NO! LDA #46 ;TURN ON P/M STA SDMCTL LDA #3 STA GRACTL LDA #PMRAM/256 ;POINT TO... STA PMBASE ;P/M AREA RTS ;ALL DONE! ; ;RUN VBLANK ROUTINES ; SETVB LDA #6 ;SET IMMEDIATE! LDX #VBLANK/256 LDY #VBLANK&255 JSR $E45C LDA #64 ;TURN ON STA NMIST LDA #7 ;SET DEFERRED! LDX #DVBL/256 LDY #DVBL&255 JMP $E45C ;ALL DONE! ; ;DRAW ENEMIES ON SCREEN ; SETEM LDA #$80 ;POINT TO P/M STA POINTL LDA #PMRAM/256+2 STA POINTH LDA #0 ;POINT TO COLORS STA TABPTL LDA #CTAB1/256 STA TABPTH L4 LDY #23 ;P/M VERT OFFSET LDX #8 ;P/M HEIGHT L5 LDA ENBMAP,X ;DRAW ONE! STA (POINTL),Y LDA ENCMAP,X STA (TABPTL),Y INY DEX BPL L5 INC TABPTH ;NEXT COLOR TABLE LDA POINTL ;NEXT PLAYER CLC ADC #$80 STA POINTL LDA POINTH ADC #0 STA POINTH CMP #PMRAM/256+4 ;LAST PLAYER? BCC L4 ;NO! LDA #$43 ;PL 1 HORIZONTAL STA XPOSP1 STA HPOSP1 LDA #$84 ;PL 2 HORIZONTAL STA XPOSP2 STA HPOSP2 LDA #$B3 ;PL 3 HORIZONTAL STA XPOSP3 STA HPOSP3 LDA #23 ;ALL VERTICAL STA YPOSP1 STA YPOSP2 STA YPOSP3 LDA #3 ;P1&3 GOING DOWN STA DIRC STA DIRC+2 LDA #1 ;P2 GOING LEFT STA DIRC+1 RTS ;ALL DONE! ; ;SET UP YOUR PLAYER ; SETPL LDX #8 ;8 BYTES TALL LDY #55 ;GET VERT OFFSET L6 LDA PLBMAP,X ;DRAW HIM! STA PMRAM+512,Y LDA PLCMAP,X STA CTAB0,Y INY DEX BPL L6 LDA #124 ;SET HORIZ POS STA XPOSP0 STA HPOSP0 LDA #55 ;AND VERT POS STA YPOSP0 LDA #11 ;GOING LEFT! STA STICKC STA STICKN RTS ;BYE! ; ;IMMEDIATE VBLANK ; VBLANK LDA #0 ;TURN OFF... STA AUDC1 ;SOUND 1 STA AUDC2 ;SOUND 2 LDX XPOSP0 ;GET PLAYER X INX ;OFFSET FOR SCRN LDY YPOSP0 ;GET PLAYER Y INY ;OFFSET IT TOO JSR PMTGR ;CONVERT TO SCRN LOC JSR XYTOME ;THEN TO ADDRESS DEC DELAY ;OK TO MOVE? BEQ DO ;YUP! JMP ENDVB ;NO, EXIT. DO LDA LEVEL ;RESET TIMER STA DELAY LDA STICKN ;GET NEXT DIRECTION AND #3 ;MASK IT, CMP #3 ;HORIZ MOVEMENT? BEQ TNM ;YES! LDA NOY ;CHECK IF VERT CLEAR BEQ CHD ;IT'S CLEAR! JMP CD ;KEEP CURRENT DIR TNM LDA NOX ;HORIZ CLEAR? BNE CD ;NO! KEEP CURRENT CHD LDA STICKN ;GET NEXT MOVE STA STICKC ;SAVE IN CURRENT CD LDA STICK0 ;GET STICK CMP #15 ;MOVED? BEQ NC ;NO! STA STICKN ;SAVE NEW MOVE NC LDA STICKC ;GET CURRENT CMP #15 ;MOVED? BNE N15 ;YES! JMP ENDVB ;NO, EXIT. N15 CMP #10 ;UP? BEQ MU ;YES! CMP #6 ;UP? BEQ MU ;YES! CMP #14 ;UP? BNE VBP1 ;NO! MU LDX #$0A ;10 BYTES TO MOVE LDY YPOSP0 ;GET VERT OFFSET CPY #24 ;AT TOP? BCS VBL1 ;NO, MOVE IT! JMP ENDVB ;BYE! VBL1 LDA PMRAM+512,Y ;MOVE PLAYER STA PMRAM+511,Y LDA CTAB0,Y STA CTAB0-1,Y INY DEX BNE VBL1 DEC YPOSP0 ;DEC VERT POS. MUE JMP ENDVB ;BYE! VBP1 CMP #9 ;DOWN? BEQ MD ;YES! CMP #5 ;DOWN? BEQ MD ;YES! CMP #13 ;DOWN? BNE VBP2 ;NO! MD LDA YPOSP0 ;AT BOTTOM? CMP #87 BCC OKMD ;NO, MOVE IT! JMP ENDVB ;;BYE! OKMD ADC #9 ;GET LAST PLAYER BYTE TAY ;PUT IN Y LDX #$0A ;10 BYTES TO MOVE VBL2 LDA PMRAM+511,Y ;MOVE PLAYER STA PMRAM+512,Y LDA CTAB0-1,Y STA CTAB0,Y DEY DEX BNE VBL2 INC YPOSP0 ;INC VERT POS. MDE JMP ENDVB ;BYE! VBP2 CMP #11 ;LEFT? BNE VBP3 ;NO! LDX XPOSP0 ;TOO FAR LEFT? CPX #68 BCS OKML ;NO! JMP ENDVB ;BYE! OKML DEX ;DEC HORIZ POS STX XPOSP0 STX HPOSP0 MLE JMP ENDVB ;BYE! VBP3 LDX XPOSP0 ;TOO FAR RIGHT? CPX #179 BCC OKMR ;NO! JMP ENDVB ;BYE! OKMR INX ;INC HORIZ POS STX XPOSP0 STX HPOSP0 ENDVB JMP $E45F ;LEAVE VBLANK! ; ;P/M TO SCREEN COORDS SUBROUTINE ; PMTGR STX XPOSSC ;SAVE HORIZ STY YPOSSC ;SAVE VERT TYA ;GET VERT IN A SEC ;SUB SCREEN OFFSET SBC #16 STA LDIV ;SAVE IN DIVIDER LDA #8 ;DIV. BY 8 STA DIVS LDA #0 ;ZERO RESULT STA DRES JSR DIVIDE ;DIVIDE IT! STA NOX ;STORE REMAINDER LDA DRES ;GET RESULT STA YPOSSC ;SAVE SCREEN Y AND #1 ;EVEN OR ODD? BNE OD1 ;ODD! LDA #1 ;PROHIBIT ANY STA NOX ;HORIZONTAL MOVE OD1 LDA XPOSSC ;GET HORIZ. SEC ;SUB SCREEN OFFSET SBC #48 STA LDIV ;PUT IN DIVIDER LDA #4 ;DIVIDE BY 4 STA DIVS LDA #0 ;ZERO RESULT STA DRES JSR DIVIDE ;DIVIDE IT! STA NOY ;SAVE REMAINDER LDA DRES ;GET RESULT STA XPOSSC ;SAVE SCREEN X AND #3 ;IS VERT MOVE OK? EOR #1 BEQ OD2 ;YES! LDA #1 ;PROHIBIT ALL STA NOY ;VERTICAL MOVES OD2 LDA DRES ;GET RESULT STA XPOSSC ;SAVE SCREEN X RTS ;ALL DONE! ; ;X&Y COORDS TO MEMORY ADDRESS ; XYTOME LDA #0 ;ZERO... STA VBPNTL ;VBLANK POINTER STA RESH ;AND RESULT LDA STICKC ;GET CURRENT DIR. AND #1 ;LEFT? BNE NI ;NO! LDA STICKN ;GET NEXT DIR CMP #11 ;LEFT? BNE INCY ;NO! DEC YPOSSC ;CANCEL NEXT INC INCY INC YPOSSC ;INC VERT POS NI LDA YPOSSC ;GET VERT STA MUPL ;SAVE MULTIPLIER LDA #40 ;TIMES 40 STA MUCN JSR MULT ;MULTIPLY IT! INC XPOSSC ;INC HORIZ POS LDA XPOSSC ;GET IT, CLC ;ADD RESULT ADC RESL STA VBPNTL ;SAVE IN POINTER LDA RESH ADC #SCRAM/256 ;ADD SCRN BASE STA VBPNTH LDY #0 ;ZERO Y LDA (VBPNTL),Y ;GET BYTE CMP #30 ;IS IT DOOR? BNE DCHD ;NO! LDA #38 ;MAKE DOOR SOUND STA AUDC1 LDA #20 STA AUDF1 LDA #0 TAY STA (VBPNTL),Y ;ERASE DOOR INC NDOOR ;1 MORE DOOR DCHD CMP #31 ;IS IT DOOR? BNE CVDA ;NO! LDA #38 ;MAKE DOOR SOUND STA AUDC1 LDA #20 STA AUDF1 LDA #0 TAY STA (VBPNTL),Y ;ERASE DOOR DEC VBPNTL ;(2 BYTES) STA (VBPNTL),Y INC VBPNTL INC NDOOR ;1 MORE DOOR CVDA CMP #17 ;IS IT A DOT? BEQ CC ;YES! CMP #29 ;MONEY BAG? BNE R ;NO! LDA #166 ;MAKE SOUND STA AUDC1 LDA #220 STA AUDF1 LDX #100 ;ADD 100 TO SCORE STX SCOUNT DEC VBPNTL ;ERASE MONEY BAG TYA STA (VBPNTL),Y INC VBPNTL STA (VBPNTL),Y RTS ;AND EXIT! CC TYA ;ERASE DOT STA (VBPNTL),Y INC NDOTS ;1 MORE DOT TAKEN LDX #1 ;ADD 1 POINT STX SCOUNT LDA #95 ;MAKE SOUND STA AUDC1 LDA #185 STA AUDF1 R RTS ;AND EXIT! ; ;GENERAL-PURPOSE DIVIDE ROUTINE ; DIVIDE LDY #8 ;GET # OF BITS SEC ;SUBTRACT DIVISOR SBC DIVS DILO PHP ;SAVE PROC. STATUS ROL DRES ;ROTATE RESULT ASL LDIV ;SHIFT DIVIDER ROL A ;ROTATE DIVIDER PLP ;GET STATUS BACK BCC ADD ;BRANCH IF CLEAR SBC DIVS ;SUBTRACT DIVISOR JMP NEXT ;CONTINUE ADD ADC DIVS ;ADD DIVISOR NEXT DEY ;LAST BIT? BNE DILO ;NO! BCS LAST ;BRANCH IF LAST ADC DIVS ;ADD DIVISOR CLC ;CLEAR CARRY LAST ROL DRES ;ROTATE RESULT RTS ;AND EXIT. ; ;MULTIPLY SUBROUTINE ; MULT LDA #0 ;ZERO RESULT STA RESL LDX #8 ;8 BITS MLOP LSR MUPL ;SHIFT MULTIPLIER BCC NOADD ;HI BIT EMPTY CLC ;ADD MULTIPLICAND ADC MUCN NOADD ROR A ;ROTATE RESULT ROR RESL ;AND LOW RESULT DEX ;1 MORE BIT BNE MLOP ;MORE TO COME! STA RESH ;SAVE RESULT HI RTS ;AND EXIT ; ;SCOREKEEPING SUBROUTINE ; SCORE LDY #5 ;6TH SCORE DIGIT CPX #1 ;ANY INCREASE? BCS GET ;YES! RTS ;NO, RETURN GET LDA SCRAM+447,Y ;GET SCORE CMP #27 ;>=9? BCC NOB ;NO LDA #18 ;WRAP TO ZERO STA SCRAM+447,Y DEY ;NEXT CHARACTER BPL GET RTS ;ALL DONE! NOB CLC ;INCREMENT THE ADC #1 ;SCORE STA SCRAM+447,Y DEX ;NEXT ADD BNE SCORE ;GO ADD IT! RTS ;ALL DONE! ; ;PLAYER MOVEMENT ; PMOVE STA YM ;SAVE ACCUM TYA ;MOVE VERT TO A SEC ;SCREEN OFFSET SBC #16 STA LDIV ;PUT IN DIVIDER LDA #8 ;DIV BY 8 STA DIVS LDA #0 ;CLEAR RESULT STA DRES JSR DIVIDE ;DIVIDE IT! STA XM ;SAVE REMAINDER LDA DRES ;GET RESULT AND #1 ;ODD? BNE OD1M ;YES! LDA #1 ;DON'T PERMIT STA XM ;HORIZ. MOVE OD1M LDA YM ;GET VERT SEC ;SUB SCREEN OFFSET SBC #48 STA LDIV ;STORE IN DIVIDER LDA #4 ;DIV BY 4 STA DIVS LDA #0 ;CLEAR RESULT STA DRES JSR DIVIDE ;DIVIDE IT! STA YM ;SAVE REMAINDER LDA DRES ;GET RESULT AND #3 ;VERT MOVE OK? EOR #1 BEQ OD2M ;YES! LDA #1 ;DON'T ALLOW STA YM ;VERT MOVEMENT OD2M RTS ;EXIT! MPXR LDY XPOSP1,X ;CAN PLAYER CPY #179 ;MOVE RIGHT? BCC CMR ;YES! JMP END ;NO! CMR INY ;INCREMENT HORIZ TYA ;PUT IN ACCUM STA XPOSP1,X ;SET THE POS STA HPOSP1,X JMP END ;ALL DONE! MPXL LDY XPOSP1,X ;CAN PLAYER CPY #68 ;MOVE LEFT? BCS CML ;YES! JMP END ;NO! CML DEY ;DEC HORIZ TYA ;PUT IN ACCUM STA XPOSP1,X ;CHANGE POS STA HPOSP1,X JMP END ;ALL DONE MPXU LDY YPOSP1,X ;GET VERT LDX #$0A ;10 BYTES TO MOVE CPY #24 ;AT TOP? BCS CMU ;NO, CAN MOVE JMP END ;CAN'T GO UP! CMU LDA (POINTL),Y ;MOVE UP! DEY STA (POINTL),Y INY LDA (TABPTL),Y ;MOVE COLORS DEY STA (TABPTL),Y INY INY DEX BNE CMU LDX TEMPX ;RESTORE X DEC YPOSP1,X ;DEC VERT POS JMP END ;ALL DONE MPXD LDX TEMPX ;GET PLAYER # LDA YPOSP1,X ;CAN HE... CMP #87 ;GO DOWN? BCC CMD ;YES! JMP END ;NO! CMD ADC #9 ;GET OFFSET... TAY ;TO PLAYER END LDX #$0A ;10 BYTES L DEY LDA (POINTL),Y ;MOVE HIM! INY STA (POINTL),Y DEY LDA (TABPTL),Y ;MOVE COLOR INY STA (TABPTL),Y DEY DEX BNE L LDX TEMPX ;RESTORE X INC YPOSP1,X ;INC VERT POS JMP END ;ALL DONE ; ;VBLANK FINISH ; END LDA POINTL ;ADD 128 TO CLC ;P/M POINTER ADC #$80 ;TO INDICATE STA POINTL ;NEXT PLAYER LDA POINTH ADC #0 STA POINTH INC TABPTH LDX TEMPX ;GET PLAYER # INX ;INCREMENT IT CPX #3 ;ALL DONE? BCS ENDDVB ;YES! JMP MAIN ;NO, LOOP BACK! ENDDVB LDX SCOUNT ;GET SCORE ADD LDA #0 ;ZERO IT STA SCOUNT JSR SCORE ;ADD TO SCORE LDA STRIG0 ;BUTTON PRESSED? BNE PQW ;NO! JSR DOOR ;PLACE A DOOR PQW JMP $E462 ;VBLANK DONE! ; ;INITIALIZATION SEQUENCE ; INT LDA #3 ;SET UP... STA LEVEL ;INITIAL SPEEDS STA ELEVEL STA DELAY STA EDELAY LDY #19 ;CLEAR SCORE LINE LDA #0 CG STA SCRAM+440,Y DEY BNE CG LDA #$57 ;RESET # MEN STA SCRAM+442 LDY #0 ;ZERO SCORE LDA #18 L2 STA SCRAM+447,Y INY CPY #6 BNE L2 RTS ;ALL DONE! ; ;CHANGE LEVELS ; NEXTL LDA ELEVEL ;GET ENEMY SPEED CMP LEVEL ;SAME AS PLAYER? BEQ NDS ;YES! DEC LEVEL ;SPEED UP PLAYER BNE NOC ;BUT DON'T ALLOW LDA #1 ;LEVEL < 1 STA LEVEL NDS DEC ELEVEL ;SPEED UP ENEMY BNE NOC ;BUT DON'T ALLOW LDA #1 ;ELEVEL < 1 STA ELEVEL NOC JSR CLRVB ;CLEAR VBLANK JSR SOUND2 ;MAKE A SOUND JSR SETSC ;SET UP SCREEN JSR SETPM ;SET UP P/M JSR SETEM ;SET ENEMIES JSR SETPL ;SET UP PLAYER JSR SETVB ;SET VBLANK JSR PRIZE ;SET UP MONEYBAG JMP COLOR ;DISPLAY COLORS ; ;CLEAR VBLANK VECTORS ; CLRVB LDA #6 ;IMMEDIATE OFF LDX #$E4 LDY #$5F JSR $E45C LDA #7 ;DEFERRED OFF LDX #$E4 LDY #$62 JMP $E45C ;AND EXIT ; ;MONEY BAG HANDLER ; PRIZE LDA #MONEY/256 ;SET UP... STA $0227 ;TIMER 1 VECTOR... LDA #MONEY&255 ;TO POINT TO... STA $0226 ;BAG PRINTER SETT1 LDA #1 ;SET UP TIMER! LDY #0 LDX #4 JMP $E45C ;ALL DONE! ; ;MONEY BAG DISPLAY ROUTINE ; MONEY LDA #28 ;PUT BAG CHAR 1 STA SCRAM+219 ;ON SCREEN LDA #29 ;PUT BAG CHAR 2 STA SCRAM+220 ;ON SCREEN LDA #MGONE/256 ;REPOINT TIMER STA $0227 ;TO BAG ERASE LDA #MGONE&255 ;ROUTINE STA $0226 JMP SETT1 ;GO SET IT MGONE LDA #0 ;ERASE BAG STA SCRAM+219 STA SCRAM+220 RTS ;AND EXIT DEATH JSR CLRVB ;TURN OFF VBLANK JSR SOUND1 ;DO DEATH SOUND LDX SCRAM+442 ;1 LESS LIFE DEX CPX #$52 ;MORE LIVES? BCS STILL ;YES! JMP GOVER ;GAME OVER! STILL STX SCRAM+442 ;ZERO LIVES JSR SETPM ;SET UP P/M JSR SETPL ;AND PLAYER JSR SETEM ;AND ENEMIES JSR SETVB ;AND VBLANK STA HITCLR ;CLEAR COLLISIONS JMP COLOR ;AND RESTART! ; ;GAME OVER ROUTINE ; GOVER LDX #0 ;SHOW MESSAGE: PR1 LDA GAME,X ;'GAME' STA SCRAM+442,X INX CPX #4 BNE PR1 LDX #0 PR2 LDA OVER,X ;'OVER' STA SCRAM+454,X INX CPX #4 BNE PR2 JMP PROG ;AND RESTART! ; ;OPEN DOOR ; DOOR DEC NDOOR ;1 LESS DOOR BNE RED ;DOORS LEFT INC NDOOR ;NO DOORS! RTS ;EXIT RED LDA NOY ;VERTIVAL DOOR? BEQ VD ;YES! LDA XPOSSC ;OK FOR HOR. DOOR? AND #3 BNE ENDD ;NO! LDA #$C0 ;MAKE DOOR SOUND STA AUDF2 LDA #$A3 STA AUDC2 LDY #0 ;DRAW DOOR LDA #30 STA (VBPNTL),Y RTS ;AND EXIT VD LDA YPOSSC ;VERT DOOR OK? AND #1 BNE ENDD ;NO! LDA #$C0 ;MAKE DOOR SOUND STA AUDF2 LDA #$A3 STA AUDC2 DEC VBPNTL ;BACK 1 CHAR LDY #1 ;DRAW DOOR LDA #31 STA (VBPNTL),Y DEY STA (VBPNTL),Y RTS ;AND EXIT ENDD INC NDOOR ;NO DOOR DISPLAYED, RTS ;RESET & RETURN ; ;SOUND SUBROUTINES ; SOUND1 LDA #168 ;INIT SOUND STA AUDC2 LDA #100 ;INIT FREQ STA TF3 LDX #$FF ;LOW DELAY COUNT LDY #20 ;HI DELAY COUNT SL1 LDA TF3 ;GET FREQ STA AUDF2 ;STORE IT DEX ;DELAY 1 BNE SL1 ;LOOP IF NOT READY DEY ;DELAY 2 BNE SL1 ;LOOP AGAIN INC TF3 ;INC FREQUENCY INC TF3 LDY #20 ;RESET HI DELAY LDA TF3 ;GET FREQ CMP #$A0 ;LAST FREQ? BNE SL1 ;NO! LDA #136 ;END OF SOUND STA AUDC2 LDA #50 STA AUDF2 LDX #255 ;LO DELAY COUNT LDY #255 ;HI DELAY COUNT SL2 DEX ;DELAY LOOP BNE SL2 DEY BNE SL2 LDA #0 ;SOUND OFF STA AUDF2 STA AUDC2 RTS ;BYE! SOUND2 LDA #168 ;INITIAL SOUND STA AUDC1 LDA #$40 ;INITIAL FREQ STA TF4 LDX #$FF ;LO DELAY COUNT LDY #20 SL3 LDA TF4 ;GET FREQ STA AUDF1 ;STORE IT DEX ;DELAY 1 BNE SL3 DEY ;DELAY 2 BNE SL3 DEC TF4 ;NEXT FREQ DEC TF4 LDY #20 ;RESET DELAY LDA TF4 ;LAST FREQ? BNE SL3 ;NO! LDA #0 ;TURN OFF SOUND STA AUDF1 STA AUDC1 RTS ;AND EXIT ; ;CHARACTER SET DATA ; CHDAT .BYTE 0,0,0,0,0,0,0,0,85,85 .BYTE 85,170,85,85,85,85,149,149,149,170 .BYTE 85,85,85,85,85,85,85,170,149,149 .BYTE 149,149,149,149,149,149,149,149,149,149 .BYTE 21,21,21,21,21,21,21,21,149,149 .BYTE 149,170,149,149,149,149,86,86,86,170 .BYTE 86,86,86,86,85,85,85,170,86,86 .BYTE 86,86,86,86,86,170,85,85,85,85 .BYTE 84,84,84,84,84,84,84,84,86,86 .BYTE 86,86,86,86,86,86,85,85,85,85 .BYTE 85,85,85,85,149,149,149,149,85,85 .BYTE 85,85,86,86,86,86,85,85,85,85 .BYTE 85,85,85,149,149,149,149,149,85,85 .BYTE 85,86,86,86,86,86,0,0,0,128 .BYTE 0,0,0,0,0,60,102,110,118,102 .BYTE 60,0,0,24,56,24,24,24,126,0 .BYTE 0,60,102,12,24,48,126,0,0,126 .BYTE 12,24,12,102,60,0,0,12,28,60 .BYTE 108,126,12,0,0,126,96,124,6,102 .BYTE 60,0,0,60,96,124,102,102,60,0 .BYTE 0,126,6,12,24,48,48,0,0,60 .BYTE 102,60,102,102,60,0,0,60,102,62 .BYTE 6,12,56,0,34,10,42,160,162,160 .BYTE 42,10,136,160,40,10,42,10,40,160 .BYTE 192,192,192,192,192,192,192,192,0,0 .BYTE 0,255,0,0,0,0,0,60,102,110 .BYTE 110,96,62,0,0,24,60,102,102,126 .BYTE 102,0,0,124,102,124,102,102,124,0 .BYTE 0,60,102,96,96,102,60,0,0,120 .BYTE 108,102,102,108,120,0,0,126,96,124 .BYTE 96,96,126,0,0,126,96,124,96,96 .BYTE 96,0,0,62,96,96,110,102,62,0 .BYTE 0,102,102,126,102,102,102,0,0,126 .BYTE 24,24,24,24,126,0,0,6,6,6 .BYTE 6,102,60,0,0,102,108,120,120,108 .BYTE 102,0,0,96,96,96,96,96,126,0 .BYTE 0,99,119,127,107,99,99,0,0,102 .BYTE 118,126,126,110,102,0,0,60,102,102 .BYTE 102,102,60,0,0,124,102,102,124,96 .BYTE 96,0,0,60,102,102,102,108,54,0 .BYTE 0,124,102,102,124,108,102,0,0,60 .BYTE 96,60,6,6,60,0,0,126,24,24 .BYTE 24,24,24,0,0,102,102,102,102,102 .BYTE 126,0,0,102,102,102,102,60,24,0 .BYTE 0,99,99,107,127,119,99,0,0,102 .BYTE 102,60,60,102,102,0,0,102,102,60 .BYTE 24,24,24,0,0,126,12,24,48,96 .BYTE 126,0,0,30,24,24,24,24,30,0 .BYTE 0,64,96,48,24,12,6,0,0,120 .BYTE 24,24,24,24,120,0,0,8,28,54 .BYTE 99,0,0,0,0,0,0,0,0,0 .BYTE 255,0,0 ; ;SCREEN DATA ; SCDAT .BYTE 0,0,0,5,3,1,1,1,3,1 .BYTE 1,1,3,1,1,1,3,1,1,1 .BYTE 3,1,1,1,3,1,1,1,3,1 .BYTE 1,1,3,1,1,8,10,0,0,0 .BYTE 0,0,0,5,4,0,17,0,17,0 .BYTE 17,0,17,0,17,0,17,0,17,0 .BYTE 17,0,17,0,17,0,17,0,17,0 .BYTE 17,0,17,0,17,11,10,0,0,0 .BYTE 0,0,0,5,4,0,17,1,6,0 .BYTE 17,1,6,0,17,1,6,0,17,1 .BYTE 6,0,17,1,6,0,17,1,6,0 .BYTE 17,1,6,0,17,11,10,0,0,0 .BYTE 0,0,0,5,4,0,17,0,17,0 .BYTE 17,0,17,0,17,0,17,0,17,0 .BYTE 17,0,17,0,17,0,17,0,17,0 .BYTE 17,0,17,0,17,11,10,0,0,0 .BYTE 0,0,0,5,4,0,17,1,6,0 .BYTE 17,1,6,0,17,1,6,0,17,1 .BYTE 6,0,17,1,6,0,17,1,6,0 .BYTE 17,1,6,0,17,11,10,0,0,0 .BYTE 0,0,0,5,4,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0,0,0 .BYTE 0,0,17,0,17,0,17,0,17,0 .BYTE 17,0,17,0,17,11,10,0,0,0 .BYTE 0,0,0,5,4,0,17,1,6,0 .BYTE 17,1,6,0,17,1,6,0,17,1 .BYTE 6,0,17,1,6,0,17,1,6,0 .BYTE 17,1,6,0,17,11,10,0,0,0 .BYTE 0,0,0,5,4,0,17,0,17,0 .BYTE 17,0,17,0,17,0,17,0,17,0 .BYTE 17,0,17,0,17,0,17,0,17,0 .BYTE 17,0,17,0,17,11,10,0,0,0 .BYTE 0,0,0,5,4,0,17,1,6,0 .BYTE 17,1,6,0,17,1,6,0,17,1 .BYTE 6,0,17,1,6,0,17,1,6,0 .BYTE 17,1,6,0,17,11,10,0,0,0 .BYTE 0,0,0,5,4,0,17,0,17,0 .BYTE 17,0,17,0,17,0,17,0,17,0 .BYTE 17,0,17,0,17,0,17,0,17,0 .BYTE 17,0,17,0,17,11,10,0,0,0 .BYTE 0,0,0,5,2,1,1,1,2,1 .BYTE 1,1,2,1,1,1,2,1,1,1 .BYTE 2,1,1,1,2,1,1,1,2,1 .BYTE 1,1,2,1,1,9,10,0,0,0 .BYTE 0,0,87,0,0,0,0,18,18,18 .BYTE 18,18,26,0,0,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0,0,0 .BYTE 0,0,0 ; ;RUN ADDRESS ; *= $02E0 .WORD INIT .END