├── .gitattributes ├── A35826.ROM ├── A35820.1B ├── MISSIL.MAP ├── MISSIL.DOC ├── COND65.XX ├── W3COMN.XX ├── A35820.1C ├── A35820.1E ├── COIN65.XX ├── A35820.1A └── A35820.1D /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /A35826.ROM: -------------------------------------------------------------------------------- 1 | ;ROM/PROM FILE CREATED BY ROMRDR 6-MAR-80 00:02:30 2 | 3 | ; DK1:LIN.ROM 4 | 5 | CLR 6 | 0000=00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 7 | 0010=EE,DD,BB,77,EE,DD,BB,77,FE,FD,FB,F7,EF,DF,BF,7F 8 | END 9 | 10 | -------------------------------------------------------------------------------- /A35820.1B: -------------------------------------------------------------------------------- 1 | .TITLE W3COIN 2 | .BSECT BCOIN 3 | 4 | .RADIX 16 5 | 6 | CNTINT =0 7 | COIN =0 8 | COIN67 =1 9 | EMCTRS =3 10 | SLAM =0 11 | MECHS =3 12 | INCLUDE =1 13 | ;BASE PAGE 14 | $CNSTT: .BLKB MECHS 15 | $LMTIM: .BLKB 1 16 | $PSTSL: .BLKB MECHS 17 | $CCTIM: .BLKB EMCTRS 18 | $$CRDT: .BLKB 1 19 | $CNCT: .BLKB 1 20 | .CSECT 21 | .INCLUDE COIN65 22 | .END 23 | -------------------------------------------------------------------------------- /MISSIL.MAP: -------------------------------------------------------------------------------- 1 | MISSILE COMMAND MEMORY MAP 2 | 3 | 0000-01FF 312 BYTES OF WORKING RAM 4 | 0200-05FF 3RD BIT COLOR REGION SCREEN RAM 5 | 0600-062F MORE WORKING RAM 6 | 06F0-3FFF 2 BIT COLOR SCREEN RAM 7 | 4000-400F POKEY PORTS 8 | 4800 COIN R SW 9 | COIN C SW 10 | COIN L SW 11 | 1-PLYR START SW 12 | 2-PLYR START SW 13 | PLYR2 FIREL (COCKTAIL ONLY) 14 | PLYR2 FIREC (COKCTAIL ONLY) 15 | PLYR2 FIRER (COCKTAIL ONLY) 16 | HORIZ TB DISPLACEMENT IF CTRLD=1 17 | VERT TB DISPLACEMENT IF CTRLD=1 18 | SCREEN FLIP 19 | COIN L CTR 20 | COIN C CTR 21 | COIN R CTR 22 | 2-PLYR START LED 23 | 1-PLYR START LED 24 | CTRLD-READ SWITCHES TO TB 25 | 4900 VBLANK 26 | SELF-TEST SW 27 | SLAM SW 28 | HORIZ TB DIR 29 | VERT TB DIR 30 | PLYR 1 FIREL SW 31 | PLYR 1 FIREC SW 32 | PLYR 1 FIRER SW 33 | 4A00 OPTION SWITCHES 34 | 4800-4807 COLOR RAM 35 | 4C00 WATCHDOG 36 | 4D00 INTERRUPT ACKNOWLEDGE 37 | 5000-7FFF PROGRAM 38 | -------------------------------------------------------------------------------- /MISSIL.DOC: -------------------------------------------------------------------------------- 1 | MISSILE COMMAND (WW3) FILE DIRECTORY 2 | 3 | PCB MEMORY 4 | PART # DESCRIPTION LOC DEVICE TYPE FILENAME 5 | ------------------------------------------------------------------------------------ 6 | 7 | ** DISK #27 ** 8 | 9 | 035820-01 PROGRAM PROM ROM0 5000 H/J1 2716 A35820.1A 10 | 035821-01 " " ROM1 5000 K1 " A35820.1B 11 | 035822-01 " " ROM2 6000 R1 " A35820.1C 12 | 035823-01 " " ROM3 6800 N/P1 " A35820.1D 13 | 035824-01 " " ROM4 7000 M/N1 " A35820.1E 14 | 035825-01 " " ROM5 7800 L1 " 15 | 035808-01 " " ROM0 5000 H/J1 2708 16 | 035809-01 " " ROM1 5400 N/P3 " 17 | 035816-01 " " ROM2 5800 K1 " 18 | 035811-01 " " ROM3 5C00 R3 " 19 | 035812-01 " " ROM4 6000 R1 " 20 | 035817-01 " " ROM5 6400 F/H1 " 21 | 035813-01 " " ROM6 6800 N/P1 " 22 | 035818-01 " " ROM7 6C00 E1 " 23 | 035814-01 " " ROM8 7000 M/N1 " 24 | 035819-01 " " ROM9 7400 D1 " 25 | 035815-01 " " ROM10 7800 L1 " 26 | 035810-01 " " ROM11 7C00 B/C1 " 27 | 28 | **LINK:REV-01 STARTING ADDRESS=5000 29 | ***A35820.1A,.1B,.1C,.1D,.1E 30 | 31 | 035826-01 BIT/BYTE PROM L6 82S123 A35826.ROM 32 | 33 | THIS FILE IS AN ".INCLUDE W3COMN.MAC" FOR A35820.1A,.1D,.1E W3COMN.XX 34 | 35 | THIS FILE IS AN ".INCLUDE COIN65.MAC" FOR A35820.1B COIN65.XX 36 | 37 | THIS FILE IS AN ".INCLUDE COND65.MAC" FOR A35820.1A,.1C,.1D,.1E COND65.XX 38 | 39 | MISSILE COMMAND MEMORY MAP MISSIL.MAP 40 | -------------------------------------------------------------------------------- /COND65.XX: -------------------------------------------------------------------------------- 1 | .X.=0 2 | .MACRO DEFIF .1.,.2. 3 | .MACRO .1. 4 | IFXX .2. 5 | .ENDM 6 | .ENDM 7 | .MACRO IFXX .1. 8 | LOC 9 | .1. .+2 10 | .ENDM 11 | .MACRO THEN 12 | FND 13 | .ENDM 14 | .MACRO ELSE 15 | CLV 16 | IFVS 17 | SWAP 18 | THEN 19 | .ENDM 20 | .MACRO BEGIN 21 | LOC 22 | .ENDM 23 | .MACRO LOC 24 | .RAD.=10 25 | .RADIX 10. 26 | .X.=.X.+1 27 | .LOC. \.X. 28 | .RADIX .RAD. 29 | .ENDM 30 | .MACRO .LOC. .1. 31 | S'.1.=. 32 | .ENDM 33 | .MACRO FND 34 | .RAD.=10 35 | .RADIX 10. 36 | .FND. \.X. 37 | .X.=.X.-1 38 | .RADIX .RAD. 39 | .ENDM 40 | .MACRO .FND. .1. 41 | .T.=. 42 | .=S'.1.+1 43 | .BYTE .T.-S'.1.-2 44 | .=.T. 45 | .ENDM 46 | .MACRO SWAP 47 | .RAD.=10 48 | .RADIX 10. 49 | .Z.=.X.-1 50 | .SWAP. \.X.,\.Z. 51 | .RADIX .RAD. 52 | .ENDM 53 | .MACRO .SWAP. .1.,.2. 54 | .T.=S'.2. 55 | S'.2.=S'.1. 56 | S'.1.=.T. 57 | .ENDM 58 | .MACRO DEFEND .1.,.2.,.3. 59 | .MACRO .1. 60 | ..END .2.,.3. 61 | .ENDM 62 | .ENDM 63 | .MACRO ..END .1.,.2. 64 | .RAD.=10 65 | .RADIX 10. 66 | .END. .1.,.2.,\.X. 67 | .X.=.X.-1 68 | .RADIX .RAD. 69 | .ENDM 70 | .MACRO .END. .1.,.2.,.3. 71 | .IF GE,.-S'.3.-127. 72 | .2. .+5 73 | JMP S'.3. 74 | .IFF 75 | .1. S'.3. 76 | .ENDC 77 | .ENDM 78 | DEFIF IFCC,BCS 79 | DEFIF IFCS,BCC 80 | DEFIF IFEQ,BNE 81 | DEFIF IFNE,BEQ 82 | DEFIF IFMI,BPL 83 | DEFIF IFPL,BMI 84 | DEFIF IFVC,BVS 85 | DEFIF IFVS,BVC 86 | DEFEND CCEND,BCS,BCC 87 | DEFEND CSEND,BCC,BCS 88 | DEFEND EQEND,BNE,BEQ 89 | DEFEND NEEND,BEQ,BNE 90 | DEFEND MIEND,BPL,BMI 91 | DEFEND PLEND,BMI,BPL 92 | DEFEND VCEND,BVS,BVC 93 | DEFEND VSEND,BVC,BVS 94 | .MACRO LDAL .1. 95 | .BYTE 0A9 96 | .WORD .1. 97 | .=.-1 98 | .ENDM 99 | .MACRO LDAH .1. 100 | .BYTE 0A9 101 | .ENABL M68 102 | .WORD .1. 103 | .DSABL M68 104 | .=.-1 105 | .ENDM 106 | .LIST MEB 107 | .NLIST BYT 108 | .PAGE 109 | -------------------------------------------------------------------------------- /W3COMN.XX: -------------------------------------------------------------------------------- 1 | .RADIX 16 2 | .SBTTL ********************************** 3 | .SBTTL * * 4 | .SBTTL * W3COMN - UNIVERSAL CONSTANTS * 5 | .SBTTL * THIS MODULE MUST BE .INCLUDED * 6 | .SBTTL * IN W3MAIN, W3DSUP AND W3INT * 7 | .SBTTL * * 8 | .SBTTL ********************************** 9 | 10 | .INCLUDE COND65 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 11 | 12 | ; 13 | ;COUNTS 14 | ; 15 | MAXMIS =10. ;# ABMS/BASE 16 | NLIVES =6 ;# OF LIVES GAME TO START WITH 17 | NABMS =8 ;MAX # OF ABMS 18 | NICBMS =8 ;MAX # OF ICBMS 19 | NEXPLO =20. ;MAX # OF EXPLOSIONS 20 | NCITY =6 ;MAX # OF CITIES 21 | NMISBA =3 ;MAX # OF MISSILE BASES 22 | IBLOOP = ;ICBM LOOP 23 | EXLOOP = ;EXPLOSION LOOP 24 | ABLOOP = ;ABM LOOP 25 | CILOOP = 26 | ; 27 | ;STATE CODES 28 | ; 29 | S.SETU =40 ;SETUP STATS (STATE) 30 | S.PAUS =80 ;PAUSE STATE (STATE) 31 | S.PLAY =0 ;PLAY STATE (STATE) 32 | ; 33 | ;SETUP CODES 34 | ; 35 | CNEWGA =0 ;NEW GAME SETUP (SETUPC) 36 | CNEWAV =2 ;NEW WAVE SETUP (SETUPC) 37 | CENDG1 =6 ;END GAME SETUP (SETUPC) 38 | CENDG2 =12 39 | CNEWA2 =4 ;2ND NEW WAVE SETUP (SETUPC) 40 | CENDW1 =08 ;END OF WAVE PHASE 1 (SETUPC) 41 | CENDW2 =0A ; PHASE 2 42 | CENDW3 =0C ; PHASE 3 43 | CENDW4 =0E 44 | CENDW5 =10 45 | CPRGM1 =14 ;PRE GAME PHASE 1 46 | CPRGM2 =16 ;PRE GAME PHASE 2 47 | C5HI =18 ;CHECK FOR 5 HI SCORES 48 | CGETIN =1A ;GET INITIALS 49 | CDLADR =1C ;DISPLAY 5 HI LADDER 50 | ; 51 | ;SCREEN COORDINATES 52 | ; 53 | TOPSCV =18 54 | TOPSCR =222. ;TOP OF SCREEN VERTICAL COORD. 55 | HCENTR =80 56 | VCENTR =8A 57 | IHMIN =8 58 | IHMAX =247. 59 | IVMIN =45. 60 | IVMAX =TOPSCR-16. 61 | LOWEST =IVMIN-12. ;NO SCORE FOR DETONATING ICBM'S LOWER THAN THIS 62 | CITY1H =5F ;CITY, MISSLE BASE 63 | CITY1V =10 ;HORIZ AND VERT COORDINATES 64 | CITY2H =0B4 65 | CITY2V =15 66 | CITY3H =94 67 | CITY3V =12 68 | CITY4H =2C 69 | CITY4V =12 70 | CITY5H =47 71 | CITY5V =11 72 | CITY6H =0D0 73 | CITY6V =11 74 | MISB1H =14 75 | MISB1V =16 76 | MISB2H =7B 77 | MISB2V =16 78 | MISB3H =0F0 79 | MISB3V =16 80 | MIRVLO =080 ;VERTICAL LOWER LIMIT IN WHICH TO MIRV 81 | MIRVHI =0A0 ;VERTICAL UPPER LIMIT IN WHICH TO MIRV 82 | SCLDRV =0B0 ;VERTICAL COORDINATE OF SCORE LADDER 83 | SCLDRH =080 ;HORIZONTAL COORDINATE OF SCORE LADDER 84 | INTLH =50 ;HORIZ COORDINATE OF INITIALS 85 | INTLV =0C0 ;VERTICAL COORDINATE OF INITIALS LADDER 86 | LAUHGT =0CA ;HEIGHT OF HIGHEST ICBM < THIS LAUNCHES MORE 87 | LAULOW =0B4 ;MIN VALUE FOR LAUNCH CHECK 88 | VCITBO =60 ;VERT POS OF CITY BONUS LINE 89 | VABMBO =80 ;VERT POS OF ABM BONUS LINE 90 | HBONPT =40 ;HORIZ LOC OF BONUS PTS 91 | VBONIN =60 ;VERT POS OF BONUS INTERVAL MSG 92 | VCMODE =40 ;HEIGHT OF SELF TEST COIN MODE MSGS 93 | STOPLI =TOPSCR+4 ;TOP V STAMP COORD 94 | ; 95 | ;MASKS, MAXS, WAVE #'S 96 | ; 97 | MXICON =7 ;MAX # OF ICBMS ON SCREEN 98 | SCITYM =03 ;5 CITIES AT START (OPTIO2 MASK) 99 | BONMSK =70 ;BONUS INTERVAL OPTION (OPTIO2) MASK 100 | MAXDEX =16. ;MAX # OF ACTUAL + POTENTIAL DEFENSIVE EXPLOSIONS 101 | MAXMUL =6 ;MAX SCORE MULTIPLIER 102 | SPUTWV =2 ;# OF WAVE WITH 1ST SPUTNIK 103 | MIRVWV =1 ;# OF WAVE WITH 1ST MIRV 104 | CURLEN =7 ;# DOTS IN CURSOR SLASH 105 | FLIPHS =40 ;(COCKTA MASK) 1=FLIP STAMP HORIZ 106 | COCMSK =80 ;(COCKTA MASK) 1=COCKTAIL VERSION 107 | CFLMSK =3F ;(COCKTA MASK) 3F=COCKTAIL PLAYER 2 108 | MAXCOI =40. ;MAX # OF COINS ALLOWED 109 | MESAGN =0 ;SCROLL TABLE MSG TYPES: IMMEDIATE MSG# 110 | NUM2DI =1 ;2 CHGIT # 111 | SPECIAL =2 ;MSG # IN BASE PAGE SPMESA 112 | ENTABL =3 ;END OF TABLE 113 | EXDONE =27. ;EXPLOSION DIAMETER 114 | PSECNS =15. ;# PAUST UNITS/SEC 115 | ALLBAD =0FF 116 | STUPID =9 ;WAVE AT WHICH CM'S CAN GO UP 117 | AUTSPD =2 118 | .PAGE 119 | .SBTTL MESSAGE CODES 120 | 121 | MPLAYR =0 122 | MHISCR =1 123 | MGAMOV =2 124 | MPRESS =3 125 | MINSER =4 126 | MBONUS =5 127 | MICBPTS =6 128 | MABMPTS =7 129 | MTHEEND =8 130 | MYOUR =9 131 | M2GP1C =10. 132 | M1GP1C =11. 133 | M1GP2C =12. 134 | MCREDI =13. 135 | MGAMOV =14. 136 | MB1EMP =15. 137 | MB2EMP =16. 138 | MB3EMP =17. 139 | MPLEAS =18. 140 | MTOCHG =19. 141 | MPRDLT =20. 142 | MDEFEN =21. 143 | MB1LOW =22. 144 | MB2LOW =23. 145 | MB3LOW =24. 146 | MEVERY =25. 147 | MPOINTS =26. 148 | MBONIN =27. 149 | ENGLISH =28. 150 | MGROUND =ENGLISH+0 151 | MZERO =ENGLISH+1 152 | MCOPYR =ENGLISH+2 153 | MRAMOK =ENGLISH+3 154 | MROMOK =ENGLISH+4 155 | MBDRAM =ENGLISH+5 156 | MBDROM =ENGLISH+6 157 | MBADMA =ENGLISH+7 158 | MMAPOK =ENGLISH+8 159 | MFREEP =ENGLISH+9 160 | MCITIES =ENGLISH+10. 161 | MBDPOK =ENGLISH+11. 162 | .PAGE 163 | .SBTTL INPUT PORTS 164 | ; 165 | IN0 =4800 ;INPUT BYTE CONTAINING FOLLOWING 166 | ;SWITCHES IF MCTRLD=0 (IN OUT0) 167 | ;OR T BALL READNG IF MCTRLD=1. 168 | MCOINR =80 169 | MCOINC =40 170 | MCOINL =20 171 | MSTRT1 =10 ;1 PLAYER START 172 | MSTRT2 =8 ;2 PLAYER START 173 | MCFIRL =4 ;COCKTAIL PLAYER 2 FIRE 174 | MCFIRC =2 175 | MCFIRR =1 176 | ;IF MCTRLD=1 177 | MTBHO =0F ;HORIZ T BALL DISPLACMENT 178 | MTBVE =0F0 ;VERT T BALL DISPLACEMENT 179 | ; 180 | ;OPTION SWITCHES 181 | ; 182 | ; D4 :MIDDLE COIN MECH=1 OR 2 COINS 183 | ; D2-D3 :RIGHT COIN MECH=1,4,5, OR 6 COINS 184 | ; D5-D6 :LANGUAGE=ENGLISH(00),GERMAN(01),FRENCH(10) 185 | ; AND SPANISH(11) 186 | ; D0-D1 :COIN MODE 10=FREE FLAG 187 | ; 11=2 CREDITS/COIN 188 | ; 00=1 CREDIT/COIN 189 | ; 01=2 COINS/CREDIT 190 | ; 191 | ; 192 | DIPSW =4A00 193 | ; 194 | ;MORE SWITCHES 195 | ; 196 | IN1 =4900 ;THIS INPUT BYTE CONTAINS: 197 | INTEST =IN1 ;SELF TEST BYTE 198 | MVBLNK =80 ;V BLANK (ENDSCREEN) 199 | VENDSC =IN1 ;ENDSCREEN SYMBOL 200 | $LMBIT =20 201 | MTEST =40 ;SELF TEST SWITCH 202 | MTBHDI =10 ;H TBALL DIRECTION 203 | MTBVDI =8 ;V BALL DIRECTION 204 | MFIREL =4 ;PLAYER 1 FIRE SWITCHES 205 | MFIREC =2 206 | MFIRER =1 207 | ALLFIR =MFIRER!MFIREC!MFIREL 208 | .SBTTL OUTPUT PORTS 209 | WTCHDG =4C00 ;WATCHDOG TIMER RESET 210 | INTACK =4D00 ;INTERRUPT ACKNOWLEDGE 211 | OUT0 =4800 ;OUTPUT BYTE CONTAINS: 212 | MFLIP0 =40 ;FLIP SCREEN CONTROL BIT FOR PLAYER 0(0) 213 | MFLIP1 =0 ; FOR PLAYER 1 (1) 214 | MLCCNT =20 ;LEFT COIN COUNTER 215 | MMCCNT =10 ;MID 216 | MRCCNT =8 ;RIGHT 217 | MLED1 =2 ;1 PLAYER LIGHT 218 | MLED2 =4 ;2 PLAYER LIGHT 219 | MCTRLD =1 ;CONTROL BIT FOR IN0:0=READ SWITCHES 220 | ;& RESET TBALL; 1=READ TBALL 221 | COLORS =4B00 ;COLORS FOR X CODE (540X) 222 | .SBTTL MISC 223 | PROG =5000 224 | POKEY =4000 225 | RANDOM =POKEY+0A 226 | POTGO =POKEY+0B 227 | AUDF1 =POKEY 228 | AUDC1 =POKEY+1 229 | .PAGE 230 | ;COLORS AND PATTERNS 231 | ;COLOR PATTERNS (STORE VIA NX ONTO SCREEN) 232 | YELLOW =20 233 | REDMIS =40 234 | REDPAT =40 235 | PLACOL =40 ;PLANE BIT PATTERN 236 | FLASH =80 237 | BLUE =0E0 238 | CITCLT =60 ;TOP OF CITY PATTERN 239 | CITCLB =0E0 ;BOTTOM OF CITY PATTERN 240 | BCKGND =0 241 | CURCOL =BLUE 242 | ABMCOL =BLUE 243 | LNDCOL =YELLOW 244 | MSCOL =BLUE 245 | GAMEFL =30 ;(FLSHCO) FLASH COLORS 4 & 5 MASK 246 | CWHITE =0 ;COLOR CODES (STORE IN COLORS) 247 | CYELLO =2 248 | CPURPL =4 249 | CRED =6 250 | CBLUGR =8 251 | CGREEN =0A 252 | CBLUE =0C 253 | CBLACK =0E 254 | -------------------------------------------------------------------------------- /A35820.1C: -------------------------------------------------------------------------------- 1 | .TITLE W3SOUN-(WAS T2SOUN) 2 | .RADIX 16 3 | .INCLUDE COND65 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 4 | .ENABLE AMA 5 | .REPT 0 6 | ***************************************** 7 | * 8 | *POKEY SOUND SYSTEM CONTROL 9 | * 10 | *PROJECT #: 16703 (TUBE CHASE) 11 | *HARDWARE: A CORECTLY INSTALLED POKEY 12 | * 13 | *DESCRIPTION: THIS CONTAINS 2 ROUTINES: 14 | * 1) THE FIRST ROUTINE STARTS A SOUND. 15 | * IT MAY BE CALLED ANYTIME, BUT CERTAIN 16 | * PRIORITY RULES ON SOUNDS APPLY (SEE ROUTINE) 17 | * 2) THE SECOND MUST BE CALLED ONCE EVERY 16 MSEC 18 | * (OR 1 FRAME). THIS ROUTINE CONTINUES A SOUND. 19 | * IT ALSO SHUTS THINGS UP WHEN DONE. 20 | * 21 | ****************************************** 22 | * 23 | *PROGRAMMER: RICH ADAM 24 | * 25 | ****************************************** 26 | .ENDR 27 | .PAGE 28 | .SBTTL GLOBLS 29 | ;ENTRY POINTS (AS SUBROUTINES) 30 | .GLOBL SNDON,MODSND,EXSNON,CMSNOF,STSNOF,INISOU 31 | .GLOBL STSNON,CMSNON,EXSNON 32 | ;RAM CELLS (DOES NOT HAVE TO BE 0 PAGE) 33 | .GLOBL J,K,ATRACT,RA,SLAMSN 34 | ;EXTERNAL REFERENCES (SUCH AS POKEY) 35 | .GLOBL SUNABM,SLOABM 36 | .GLOBL SABLAU,SEXPLO,SNEWAV,SENDGA,SBONUS,SOHNO 37 | .GLOBL CRMONS,SNSHOT 38 | .PAGE 39 | .SBTTL SOUND DESCRIPTION 40 | ;THE FOLLOWING MUST BE DEFINED SOME WHERE IN YOUR RAM ALLOCATION 41 | ;SOUND ROUTINE VARIABLES 42 | .BSECT BSOUN 43 | 44 | SOUNDN: .BLKB 1 ;SOUND # IN PROGRESS 45 | POINT: .BLKB 8 ;POINTER OFFSET INTO DATA TABLES(IF 0, CHANNEL NOT ACTIVE) 46 | CURRENT:.BLKB 8 ;OUTPUT VALUE 47 | FRAMES: .BLKB 8 ;FRAMES UNTIL NEXT CHANGE 48 | COUNT: .BLKB 8 ;COUNT OF TOTAL CHANGES 49 | MRBILL: .BLKB 1 50 | MBTIME: .BLKB 1 51 | .REPT 0 52 | ;*** NOTE: 'IDLEV' CAN BE REPLACED BY A 6 BYTE TABLE WITH 53 | ; NO CHANGE TO THE CODE. USING RAM ALLOWS YOU TO 54 | ; CHANGE THE OUTPUT SOUND WITHOUT USING 'STSOUND' 55 | ; BY SIMPLY PUTTING THE DESIRED SOUND INFORMATION 56 | ; INTO THE ABOVE 6 BYTE. THE SOUND ROUTINES WILL 57 | ; CONTINUE TO OUTPUT THIS 'FORCED' SOUND UNTIL 58 | ; YOU CALL 'STSOUND' OR PUT SOME OTHER VALUE INTO 59 | ; 'IDLEV'. IF YOU USE A TABLE, THE FOLLOWING DATA 60 | ; IS RECOMENDED: 61 | ; IDLEV: .BYTE 0C0,0,1F,80,0FE,80 62 | ;************************************************************* 63 | ; 64 | .ENDR 65 | ;EACH TABLE ENTRY IS 4 BYTES DESCRIBING A SEQUENCE, CONSISTING OF: 66 | STVAL =0 ;VALUE TO START SEQUENCE 67 | FRCNT =1 ;# OF FRAMES BEFORE ANY CHANGE 68 | CHANGE =2 ;AMOUNT OF CHANGE 69 | NUMBER =3 ;TOTAL NUMBER OF CHANGES IN THIS SEQUENCE 70 | AUDF1 =4000 71 | AUDCTL =4008 72 | SOHNO =2 ;SAME AS EXPLOSION 73 | SLOABM =1 74 | SEXPLO =2 75 | SABLAU =4 76 | SUNABM =8 77 | SNEWAV =10 78 | SENDGA =20 79 | SBONUS =40 80 | SNSHOT =80 81 | ;EX1: 0FF,1,-1,6 DESCRIBES THE FOLLOWING SEQUENCE 82 | ; 0FF,0FE,0FD,0FC,0FB,0FA,0F9 83 | ;EX2: 0,45,0,1 WILL OUTPUT 0 FOR 46 FRAMES 84 | ; 85 | .PAGE 86 | .SBTTL OFFSET MACROS FOR SOUND ROUTINES 87 | .MACRO OFFSET,LABEL 88 | .IRPC X,<12345678> 89 | .IF DF,LABEL''X 90 | .BYTE LABEL''X-SOUND 91 | .IFF 92 | .BYTE 0 93 | .ENDC 94 | .ENDR 95 | .ENDM 96 | ; 97 | ;THE ABOVE MACRO GENERATES THE OFFSETS FROM THE 'SOUND' BASE ADDRESS 98 | ;FOR A CHANNEL OF DATA. 99 | ;IF LESS THAN 6 CHANNELS ARE USED, THE REMAINING POINTERS ARE SET TO 0 100 | ;A 0 VALUE POINTER INDICATES AN IDLE CHANNEL. 101 | ; 102 | ;EX: SOUND: .BYTE 0 103 | ; 104 | ; CH1: .BYTE 0,45,0,1 105 | ; CH2: .BYTE 0,45,0,2,3,7,9,1 106 | ; 107 | ;BY CALLING 'OFFSET CH' , THE FOLLOWING WILL BE PLACED IN LINE 108 | ; .BYTE CH1-SOUND 109 | ; .BYTE CH2-SOUND 110 | ; .BYTE 0,0,0,0 111 | ; 112 | .PAGE 113 | .SBTTL SOUND TABLES 114 | ; 115 | ;TABLES OF OFFSET POINTER FOR SOUNDS. (6 BYTES PER SOUND NUMBER) 116 | .CSECT T2SOUN 117 | PNTRS: 118 | OFFSET LO 119 | OFFSET EX 120 | OFFSET LA 121 | OFFSET TK 122 | OFFSET WP 123 | OFFSET XX 124 | OFFSET BN 125 | OFFSET NS 126 | PTLEN =.-PNTRS 127 | ;AUDIO CONTROL CHANNEL VALUE (1 BYTE PRE SOUND NUMBER) 128 | AUDCV =20 129 | IDLEV =0 130 | 131 | ;SOUND TABLES 132 | ;ALL OF THESE LABELS GO 133 | ;HRE SO THEY HAVE AN 134 | ;OFFSET OF 0, WHICH 135 | ;PREVENTS THE SOUND FROM 136 | ;AFFECTING THOSE CHANNELS 137 | ;WHICH HAVE AN OFFSET 138 | ;OF 0 139 | SOUND: .BYTE 0 140 | .PAGE 141 | ;A GOOD PLACE FOR THE CHECKSUM 142 | ;DATA STRUCTUREJ: 143 | ;A CHANNEL CONSISTS OF A SERIES OF 4 BYTE SEQUENCES: 144 | ; BYTE FUNCTION 145 | ; 1 STARTING VALUE OF SEQUENCE 146 | ; 2 # OF FRAMES BEFORE NEXT CHANGE 147 | ; 3 AMOUNT OF CHANGE 148 | ; 4 TOTAL NUMBER OF CHANGES (# OF DIFFERENT VALUES) 149 | ;TO STOP A CHANNEL & RETURN TO ITS IDLE STATE, PUT IN AS A 150 | ;2 BYTE SEQUENCE X,0 WHERE X WILL BE USED AS THE NEW IDLE VALUE. 151 | ;NOTE: ALL SOUNDS END WHEN CHANNEL 1 GOES IDLE, SO IT SHOULD BE THE 152 | ;LONGEST 153 | ;TURN ALL SOUNDS OFF 154 | ; 155 | ;EXPLOSION SOUND 156 | ; 157 | EX1: .BYTE 0A0,10,4,10 158 | .BYTE 0,0 159 | EX2: .BYTE 86,40,0FE,4 160 | .BYTE 0,0 161 | EX3: .BYTE 0C0,10,4,10 162 | .BYTE 0,0 163 | EX4: .BYTE 86,40,0FE,4 164 | .BYTE 0,0 165 | ;LAUNCH SOUND 166 | LA5: .BYTE 60,10,0,1 167 | .BYTE 50,10,0F8,1 168 | .BYTE 48,10,18,1 169 | .BYTE 60,18,0F0,1 170 | .BYTE 60,10,0F8,1 171 | .BYTE 60,10,8,10 172 | .BYTE 0,0 173 | LA6: .BYTE 82,20,2,1 174 | .BYTE 84,10,0,4 175 | .BYTE 84,38,0FF,4 176 | .BYTE 0,0 177 | ;BONUS TICK 178 | TK1: .BYTE 10,4,0,1 179 | .BYTE 0,0 180 | TK2: .BYTE 2F,4,0F,1 181 | .BYTE 0,0 182 | ;BONUS CITY (DUMMIES) 183 | BN1: .BYTE 18,18,0,18 184 | .BYTE 0,0 185 | BN2: .BYTE 0A4,18,0,18 186 | .BYTE 0A0,10,0,2 187 | .BYTE 0,0 188 | ;WHOOP SOUND 189 | WP1: .BYTE 10,2,1,20 190 | .BYTE 10,2,1,20 191 | .BYTE 10,2,1,20 192 | .BYTE 10,2,1,20 193 | .BYTE 10,2,1,20 194 | .BYTE 10,2,1,20 195 | .BYTE 0,0 196 | WP2: .BYTE 0A4,2,0,0C0 197 | .BYTE 0,0 198 | ;LOW ON ABMS 199 | LO7: .BYTE 20,80,0,3 200 | .BYTE 0,0 201 | LO8: .BYTE 0A3,40,0FD,2 202 | .BYTE 0A3,40,0FD,2 203 | .BYTE 0A3,40,0FD,2 204 | .BYTE 0,0 205 | ;"THE END" EXPLOSION 206 | XX1: .BYTE 40,0FF,2,8 207 | .BYTE 0,0 208 | XX2: .BYTE 88,0FF,0FF,8 209 | .BYTE 0,0 210 | XX3: .BYTE 0C0,0FF,2,8 211 | .BYTE 0,0 212 | XX4: .BYTE 88,0FF,0FF,8 213 | .BYTE 0,0 214 | ;CAN'T FIRE SOUND 215 | NS7: .BYTE 18,2,0FF,10 216 | .BYTE 8,20,0,1 217 | .BYTE 0,0 218 | NS8: .BYTE 0A4,10,0FF,4 219 | .BYTE 0,0 220 | .PAGE 221 | EXSNON: LDA I,SEXPLO 222 | SNDON: BIT ATRACT ;ATTRACT MODE? 223 | IFMI ;NO, OK TO START A SOUND 224 | STA RA ;SAVE A 225 | STA SOUNDN 226 | STX J 227 | STY K 228 | TAX 229 | IFNE 230 | LDX I,8 ;START SOUND # SEARCH AT TOP 231 | BEGIN 232 | ASL RA ;WHICH BIT IS IT? 233 | DEX 234 | CSEND ;FOUND HIM 235 | THEN 236 | TXA 237 | ASL ;X8 238 | ASL ;X8 239 | ASL 240 | ADC I,7 ;CAUSE IT COUNTS DOWN NOT UP 241 | TAY ;USE AS INDEX 242 | CPY I,PTLEN+7 ;PAST TABLE? 243 | IFCC 244 | LDX I,7 245 | BEGIN 246 | LDA Y,PNTRS 247 | IFNE ;IF POINTER 0 DONT TOUCH THIS CHANNEL 248 | STA X,POINT ;IF NOT SET UP POINTER 249 | LDA I,1 250 | STA X,FRAMES ;DUMMY START, NO SOUND 251 | STA X,COUNT ;TILL MODSND STORES TO POKEY 252 | THEN 253 | DEY 254 | DEX 255 | MIEND 256 | THEN 257 | LDX J ;RESTORE X & Y UPON RETURN 258 | LDY K 259 | THEN 260 | RTS 261 | ;MAKE SLAM SOUND-ANOTHER SPECIAL CASE- 262 | SLMSND: LDA I,18 263 | LDY I,0AF 264 | STA A,AUDF1 265 | STY A,AUDF1+1 266 | RTS 267 | .PAGE 268 | .SBTTL SOUND ROUTINE 269 | ; 270 | ;CONTINUES A PREVIOUSLY STARTED SOUND 271 | ;WHEN CHANNEL 1 GOES IDLE, ALL SOUND ENDS 272 | ; 273 | MODSND: LDA SLAMSN 274 | BNE SLMSND 275 | LDX I,7 ;4 CHANNELS 276 | 10$: 277 | DEC X,FRAMES ;CHANGE THIS FRAME 278 | BNE 30$ 279 | LDY X,POINT ;GET DATA POINTER 280 | BEQ 30$ ;NOT ACTIVE CHANNEL 281 | DEC X,COUNT ;DATA CHANGES LEFT? 282 | BNE 20$ ;NO -- NONE 283 | LDA Y,SOUND+STVAL ;GET CURRENT VALUE 284 | STA X,CURRENT ;SAVE 285 | LDA Y,SOUND+FRCNT ;GET FRAMES OF THIS LEVEL 286 | STA X,FRAMES ;UPDATE FRAME NUMBER 287 | BNE 17$ ;IF 0, THIS CHANNEL JUST ENDED 288 | STA X,POINT ;SET POINTER TO 0 TO IDLE CHANNEL 289 | TXA ;A CHEAP WAY TO TEST IF THIS IS CH 1 290 | BNE 30$ ;IF NOT CH 1, JUST IDLE CHANNEL 291 | LDA I,IDLEV ;GET IDLE VALUE 292 | STA X,CURRENT ;SAVE 293 | STA X,AUDF1 ;STORE TO POKEY 294 | LDA I,0 ;0 POINTER 295 | STA X,POINT 296 | DEX 297 | BPL 10$ 298 | BMI PMRBIL 299 | 17$: LDA Y,SOUND+NUMBER 300 | STA X,COUNT ;# OF CHANGES 301 | LDA X,POINT 302 | CLC 303 | ADC I,4 ;POINT TO NEXT SEQUENCE 304 | STA X,POINT 305 | JMP 30$ 306 | 20$: LDA Y,SOUND+FRCNT-4 ;FRAME RATE 307 | ;THE -4 TO CORRECT FOR THE POINTER BEING ALREADY 308 | ;INCREMENTED TO POINT TO THE NEXT BLOCK. 309 | STA X,FRAMES 310 | LDA X,CURRENT 311 | CLC 312 | ADC Y,SOUND+CHANGE-4 ;STEP THRU SEQUENCE 313 | BIT SOUNDN 314 | IFVS 315 | CPX I,1 316 | IFNE 317 | LDA AUDF1+0A ;GET A RANDOM NUMBER FROM POKEY 318 | AND I,1E 319 | IFEQ 320 | LDA I,1E 321 | THEN 322 | THEN 323 | THEN 324 | STA X,CURRENT 325 | 30$: LDA X,CURRENT ;MORE THAN 1 PATH HERE SO LOAD CURRENT 326 | STA X,AUDF1 ;OUTPUT 327 | DEX 328 | BPL 10$ 329 | PMRBIL: LDA POINT+6 330 | IFEQ ;ANY OTHER SOUNDS IN LAST CHANNEL? 331 | LDA MRBILL ;NO. SPUT A CRUISE SOUND REQUESTED? 332 | IFNE 333 | ROL ;YES 334 | ROL 335 | ROL 336 | AND I,3 337 | TAX ;CONVERT FLAGS TO INDEX 1=SPUT, 2=CM, 3=BOTH 338 | LDA MBTIME ;GET OLD FREQ 339 | CMP AX,BOTTOM-1 340 | IFEQ ;AT BOTTOM? 341 | LDA AX,TOP-1 ;YES. RESET TO TOP 342 | ELSE 343 | SEC ;NO. DECREMENT 344 | SBC I,2 345 | THEN 346 | STA AUDF1+6 ;UPDATE POKEY FREQ 347 | STA MBTIME ;AND FREQ BUCKET 348 | LDA I,0A4 349 | STA AUDF1+7 350 | STA CURRENT+7 351 | THEN 352 | THEN 353 | RTS 354 | BOTTOM: .BYTE 30,0,0 ;SPUTNIK, CRUISE, BOTH 355 | TOP: .BYTE 70,30,30 356 | .PAGE 357 | CMSNON: LDA I,30 358 | STA MBTIME 359 | LDA MRBILL 360 | ORA I,80 361 | STA MRBILL 362 | RTS 363 | STSNON: LDA MRBILL ;CRUISE MISSILES ON 364 | ORA I,40 365 | STA MRBILL 366 | IFPL ;SCREEN? 367 | LDA I,70 368 | STA MBTIME 369 | THEN 370 | RTS 371 | CMSNOF: LDA CRMONS 372 | IFEQ 373 | LDA MRBILL 374 | AND I,7F 375 | STA MRBILL 376 | BIT MRBILL 377 | BVS STSNON 378 | STSNOF: LDA MRBILL 379 | AND I,0BF 380 | STA MRBILL 381 | LDA CRMONS 382 | IFEQ 383 | STA MRBILL 384 | STA AUDF1+6 385 | STA AUDF1+7 386 | THEN 387 | THEN 388 | RTS 389 | INISOU: LDA I,0 390 | STA A,AUDF1+0F 391 | LDA I,3 392 | STA A,AUDF1+0F 393 | LDX I,7 394 | LDA I,0 395 | BEGIN 396 | STA AX,AUDF1 397 | STA X,POINT 398 | STA X,CURRENT 399 | DEX 400 | MIEND 401 | LDA I,AUDCV 402 | STA AUDCTL 403 | RTS 404 | .END 405 | -------------------------------------------------------------------------------- /A35820.1E: -------------------------------------------------------------------------------- 1 | .TITLE W3INT 2 | .SBTTL ****************************** 3 | .SBTTL * * 4 | .SBTTL * MODULE: W3INT * 5 | .SBTTL * PROGRAMMER: DFT * 6 | .SBTTL * FUNCTION: WW3 I/O * 7 | .SBTTL * * 8 | .SBTTL ****************************** 9 | .INCLUDE W3COMN ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 10 | .PAGE 11 | .SBTTL SYMBOL DEFINITIONS 12 | ; 13 | ;GLOBAL ENTRY POINTS DEFINED ELSEWHERE 14 | ; 15 | .GLOBL START,MODSND,MOOLAH,UPCURS,ACTCUR,INILIT,BONCIT,BLEWIT 16 | .GLOBL DTABML,NUMOUT,DTABEL 17 | ; 18 | ;GLOBAL ENTRY POINTS DEFINED HERE 19 | ; 20 | .GLOBL IRQ,RESET,QCHKSB 21 | ; 22 | ;GLOBL SYMBOLS 23 | ; 24 | .GLOBL SYNC,INTCNT,TBHD,TBVD,SWSTAT,NUMPLA 25 | .GLOBL COL000,COL001,COL010,COL011,COL100,COL101,COL110,COL111 26 | .GLOBL FIRESW,$$CRDT,TBVD,TBHD,J 27 | .GLOBL $INTCT,$CMODE,OPTION,K,INPUT,OLDPOS,OPTIO2 28 | .GLOBL FLSHCO,$CCTIM,ATRACT,NWSTMP,PATRN1 29 | .GLOBL CILEFT,ICBTOL,$COINA,BLINKT,$LAM,COCKTA 30 | .GLOBL SMAHOL 31 | .GLOBL CHKSM1,CHKSM3,CHKSM5 32 | .GLOBL CHKSM7,CHKSM9,CHKSMB,$LMBIT,CIBITS,PLAYUP,CMOTAB,STCITY 33 | .PAGE 34 | .SBTTL CHECKSUMS 35 | ; 36 | ;CHECKSUMS (1/2K) 37 | ; 38 | CHKSM1 =0D2 ;5000-57FF 39 | CHKSM3 =01D ;5800-5FFF 40 | CHKSM5 =06F ;6000-6FFF 41 | CHKSM7 =0B1 ;6800-6FFF 42 | CHKSM9 =0E8 ;7000-77FF 43 | CHKSMB =0E7 ;7800-7FFF 44 | .PAGE 45 | .BSECT BIO 46 | .SBTTL BASE PAGE STORAGE 47 | COL000: .BLKB 1 ;8 COLORS 48 | COL001: .BLKB 1 49 | COL010: .BLKB 1 50 | COL011: .BLKB 1 51 | COL100: .BLKB 1 52 | COL101: .BLKB 1 53 | COL110: .BLKB 1 54 | COL111: .BLKB 1 55 | FLSHCO: .BLKB 1 ;DX=1 IF COLOR TO BE FLASHED 56 | $COINA: ; 57 | INPUT: .BLKB 1 ;1ST STORAGE FOR INPUT BYTE READING (IN0-IN2) 58 | $TEST: 59 | $LAM: 60 | .BLKB 1 61 | DBSW: .BLKB 2 ;USED FOR DEBOUNCING INPUTS 62 | SWSTAT: .BLKB 2 ;DEBOUNCED INPUTS 63 | $CMODE: 64 | OPTION: .BLKB 1 65 | OPTIO2: .BLKB 1 66 | TOUT0: .BLKB 1 ;SETUP OUTPUT FOR OUT0 67 | TBCTR: .BLKB 1 ;T BALL END REDING 68 | OTB: .BLKB 1 ;OLD T BALL STARTUP READING 69 | NEWTB: .BLKB 1 ;NEW T BALL STARTUP READING 70 | INFIRE =SWSTAT+1 ;DEBOUNCED FIRE SWITCHES BYTE (LEVEL DEB) 71 | COFIRE =SWSTAT ;FIRE SWITCHES FOR COCKTAIL PLAYER 2 72 | OLDFIR: .BLKB 1 ;USED TO SAVE OLD FIRE SWITCH READINGS 73 | FIRESW: .BLKB 1 ;EDGE DEBOUNCED FIRE SWITCH READINGS 74 | INTCNT: .BLKB 1 75 | $INTCT =INTCNT 76 | COCKTA: .BLKB 1 ;COCTAIL TABLE FLIP BYTE 77 | COCMSK =80 ;=1 IF COCKTAIL VERSION 78 | FLIPHS =40 ;=1 IF STAMP IS TO BE H FLIPPED(USUALLY=CFLMSK) 79 | CFLMSK =3E ;=1 IF COCKTAIL PLAYER 2 80 | 81 | OLDOP1: .BYTE 1 ;USED IN SELF TEST 82 | OLDOP2: .BYTE 1 83 | NOPDIS: .BYTE 1 84 | .PAGE 85 | .SBTTL PROCESS INTERRUPT 86 | .CSECT W3INT 87 | 88 | IRQ: PHA ;SAVE ACC X,Y 89 | TXA 90 | PHA 91 | TYA 92 | PHA 93 | CLD ;SET HEX 94 | TSX 95 | CPX I,0E0 ;STACK TOO DEEP? 96 | IFCS 97 | LDA AX,104 ;NO. GET OLD PSW 98 | AND I,10 ;BREAK? 99 | IFEQ 100 | LDA AX,106 ;IS PROGRAM COUNTER TOO LOW? 101 | CMP I,PROG/100 102 | IFCS 103 | CMP I,/100 ;NO. TOO HIGH? 104 | IFCC 105 | LDA SYNC ;OVERRUN TIME LIMIT? 106 | BPL SOFTOK ;NO ALL OK 107 | THEN 108 | THEN 109 | THEN 110 | THEN 111 | .PAGE 112 | .SBTTL POWER ON AND ERR RESET 113 | RESET: 114 | LDX I,0FF 115 | TXS ;SET UP STACK 116 | CLD 117 | LDX I,0 118 | TXA 119 | SEI 120 | BEGIN 121 | STA ZX,0 ;ZERO BASE PAGE 122 | STA AX,100 ;ZERO PAGE 1 123 | DEX 124 | EQEND 125 | LDA I,MFLIP0 126 | STA A,OUT0 127 | LDA A,INTEST 128 | AND I,MTEST 129 | IFNE ;SELF TEST SWITCH ON? 130 | CLI 131 | JMP START ;NO GAME 132 | THEN 133 | JMP STEST ;YES. SELF TEST 134 | .PAGE 135 | .SBTTL HANDLE VBLANK 136 | SOFTOK: ;SP & PC OKAY IF YOU GET HERE 137 | STA A,WTCHDG ;MUZZLE DOG 138 | INC INTCNT ;COUNT INTERRUPTS 139 | LDA A,VENDSC 140 | IFMI ;IS THIS BLANK TIME? 141 | INC SYNC 142 | LDA BLINKT 143 | IFNE 144 | DEC BLINKT ;UPDATE BLINK TIMER 145 | THEN 146 | LDA FLSHCO 147 | STA OPTION 148 | LDX I,7 149 | BEGIN 150 | ASL OPTION 151 | IFCS ;FLASH COLOR? 152 | INC ZX,COL000 ;YES 153 | THEN 154 | LDA ZX,COL000 155 | STA AX,COLORS ;UPDATE HARDWARE COLOR 156 | DEX 157 | MIEND 158 | LDA A,DIPSW ;READ OPTION SWITCHES 159 | EOR I,2 ;FLIP D1 SO BEST SETTING=ALL 0 160 | STA OPTION 161 | LDA TOUT0 162 | AND I,^CMFLIP0 163 | TAY ;SET FLIP BIT 164 | LDA COCKTA 165 | AND I,CFLMSK 166 | IFEQ ;FLIP? 167 | TYA ;NO. CLEAR FLIP BIT 168 | ORA I,MFLIP0 169 | TAY 170 | THEN 171 | STY TOUT0 172 | THEN 173 | .PAGE 174 | .SBTTL READ TBALL AND SWITCHES 175 | LDX A,IN1 ;READ FIRE SWITCHES 176 | STX INPUT+1 177 | .SBTTL TBALL DISTANCE CALCULATION 178 | LDA TOUT0 ;SET CONTROL BIT TO READ SWITCHES 179 | AND I,<^CMCTRLD> 180 | TAY 181 | LDX A,IN0 ;READ TBALL 182 | STX TBCTR 183 | STY A,OUT0 ;STORE CONTROL BIT TO READ SWITCHES 184 | LDX A,IN0 ;READ SWITCHES (COINS,SLAM,ETC) 185 | STX INPUT 186 | ORA I,MCTRLD ;RESTART TBALLS 187 | STA A,OUT0 188 | LDX A,IN0 ;GET INITIAL T BALL READING 189 | STX NEWTB 190 | LDA TBCTR ;NO. HORIZ 191 | SEC 192 | SBC OTB 193 | AND I,0F 194 | CMP I,8 195 | IFCS 196 | ORA I,0F0 197 | THEN 198 | CLC 199 | ADC TBHD 200 | STA TBHD 201 | LDA TBCTR ;VERT 202 | SEC 203 | ORA I,0F 204 | SBC OTB 205 | LSR 206 | LSR 207 | LSR 208 | LSR 209 | CMP I,8 210 | IFCS 211 | ORA I,0F0 212 | THEN 213 | CLC 214 | ADC TBVD 215 | STA TBVD 216 | LDA NEWTB 217 | STA OTB 218 | LDA I,7 219 | STA A,POKEY+0F 220 | STA A,POTGO 221 | LDA A,POKEY+8 222 | EOR I,07F 223 | STA OPTIO2 ;SECOND OPTION SWITCH 224 | BIT SWSTAT+1 225 | IFVS ;SELF TEST? 226 | JSR MODSND ;NO. PROCESS SOUNDS 227 | JSR MOOLAH ;CHECK COINS 228 | THEN 229 | .PAGE 230 | .SBTTL DEBOUNCE SWITCHES 231 | ;LEVEL SENSITVE 232 | LDX I,1 ;2 INPUT BYTES TO DEBOUNCE 233 | BEGIN 234 | LDY ZX,INPUT ;READ SWITCHES 235 | LDA ZX,DBSW ;SAVE OLF SWITCHES 236 | STY ZX,DBSW ;REPLACE WITH NEW 237 | TAY ;COPY OLD 238 | AND ZX,DBSW ;MAKE ONES WHERE BOTH OFF 239 | ORA ZX,SWSTAT 240 | STA ZX,SWSTAT ;TURN OFF IN STATUS 241 | TYA ;GET BACK OLD 242 | ORA ZX,DBSW ;MAKE ZEROS WHERE BOTH ON 243 | AND ZX,SWSTAT ;TURN ON IN STATUS 244 | STA ZX,SWSTAT ;SAVE NEW STATUS 245 | DEX 246 | MIEND 247 | .PAGE 248 | .SBTTL FIRE SWITCHES 249 | LDY INFIRE ;DEFAULT TO 1ST PLAYER 250 | 251 | LDA COCKTA ;RECOGNIZE FIRE SWITCHES ONLY ON 252 | AND I,CFLMSK 253 | IFNE ;2ND COCKTAIL PLAYER? 254 | LDY COFIRE ;YES. LOOK AT OTHER FIRE SWITCHES 255 | THEN 256 | TYA 257 | EOR I,0FF ;0 TO 1 TRANSITION 258 | AND OLDFIR 259 | EOR FIRESW 260 | STA FIRESW 261 | STY OLDFIR 262 | .PAGE 263 | .SBTTL LEDS & COUNTERS 264 | LDA TOUT0 265 | AND I,MFLIP0 ;PRESERVER FLIP BIT ONLY 266 | ORA I, ;LIGHTS OFF 267 | LDX NUMPLA ;INDEX FOR LIGHTS ON BIT IF IN GAME 268 | INX 269 | LDY ATRACT 270 | IFEQ ;ATTRACT MODE? 271 | LDX I,0 ;YES. OFF 272 | LDY INTCNT ;YES 273 | CPY I,40 274 | IFCS ;BLINK ON TIME? 275 | LDX $$CRDT ;YES. INDEX FOR START LIGHTS 276 | CPX I,2 277 | IFCS 278 | LDX I,3 ;MAX INDEX=3 279 | THEN 280 | THEN 281 | THEN 282 | AND AX,LITSON ;TURN ON REQUESTED START LIGHTS 283 | LDY $CCTIM 284 | IFMI ;HIT COIN COUNTER IF NEC. 285 | ORA I,MLCCNT ;LEFT 286 | THEN 287 | LDY $CCTIM+1 288 | IFMI 289 | ORA I,MMCCNT ;MIDDLE 290 | THEN 291 | LDY $CCTIM+2 292 | IFMI 293 | ORA I,MRCCNT ;RIGHT 294 | THEN 295 | STA TOUT0 296 | .PAGE 297 | .SBTTL EXIT I/O 298 | 299 | BEGIN 300 | BIT A,VENDSC ;WAIT UNTIL ENDSCREEN IS OVER 301 | PLEND 302 | STA A,INTACK ;ACKNOWLEDGE INTERUPT 303 | PLA ;RESTORE Y,X,AND ACCUM. 304 | TAY 305 | PLA 306 | TAX 307 | PLA 308 | RTI 309 | LITSON: .BYTE 0FF,^CMLED1,^CMLED2,^C ;NO LIGHTS, START 1, START 2 310 | .PAGE 311 | .SBTTL SELF TEST PREP 312 | STEST: 313 | LDA I,0 314 | STA A,AUDF1+0F ;SOUNDS OFF (CH 3,4) 315 | STA A,AUDC1+4 316 | STA A,AUDC1+6 317 | STA A,AUDF1+8 318 | LDA I,3 319 | STA A,AUDF1+0F ;INITIALIZE POKEY 320 | LDA I,08 321 | STA A,AUDC1+2 ;SET LOW DRONE FOR RAM TEST 322 | LDA I,0C0 323 | STA A,AUDF1+2 324 | LDA I,MLED2!MFLIP0 325 | STA A,OUT0 ;START 1 LIGHT ON 326 | 327 | .SBTTL VBLANK TEST 328 | LDY I,60 329 | BEGIN 330 | BEGIN ;LOOP UNTIL VBLANK IS OFF 331 | BIT A,VENDSC 332 | PLEND 333 | BEGIN ;LOOP UNTIL VBLANK IS ON 334 | BIT A,VENDSC 335 | MIEND 336 | STA A,WTCHDG 337 | DEY 338 | MIEND 339 | LDA I,0A2 340 | STA A,AUDC1+2 ;CHANGE SOUND TO INDICATE SUCCESS 341 | .PAGE 342 | .SBTTL PAGES 0 & 1 RAM TEST 343 | 344 | RAMTEST: 345 | LDY I,0 ;EACH LOC WILL BE TESTED WITH VALUES 0->FF 346 | BEGIN ;LOOP FOR 4=0->FF 347 | LDX I,0 348 | BEGIN ;LOOP FOR X=0->FF STORING 349 | TYA ;Y THRU Y+FF INTO 0 THRU FF 350 | STA ZX,0 351 | INY 352 | TYA ;Y+1 THRU Y+100 INTO THRU 1FF 353 | STA AX,100 354 | INX 355 | EQEND 356 | STA A,WTCHDG 357 | BEGIN ;LOOP FOR X=0->FF 358 | TYA 359 | EOR ZX,0 ;VERIFY THAT EACH LOC IS UNCHANGED 360 | STA ZX,0 361 | BNE RAMERR 362 | INY 363 | TYA 364 | EOR AX,100 365 | STA AX,100 366 | BNE RAMERR 367 | INX 368 | EQEND 369 | INY 370 | EQEND 371 | LDA I,040 ;RAM OK. SET HI DRONE FOR ROM TEST 372 | STA A,AUDF1+2 373 | LDA I,MLED1!MFLIP0 ;START 2 LIGHT ON 374 | STA A,OUT0 375 | JMP ROMTST 376 | .PAGE 377 | .SBTTL REPORT RAM ERROR 378 | ;INPUT: ACC=BAD BITS 379 | ;OUTPUT: X+1 BEEPS FOR EACH DX NOT=0 380 | 381 | RAMERR: LDX I,7 382 | LDY I,0 383 | STY A,AUDC1+2 ;TURN OFF DRONE 384 | TXS 385 | BEGIN ;LOOP FOR EACH BIT, FROM D7 -> D0 386 | TSX 387 | ROL 388 | LDY I,0A0 ;CLEAN SOUND 389 | IFCS ;BIT SET? 390 | LDY I,10 ;YES. DIRTY SOUND 391 | THEN 392 | STY A,AUDF1 393 | LDY I,0A8 394 | STY A,AUDC1 395 | LDY I,20 396 | BEGIN 397 | BEGIN ;DELAY: WAIT FOR 398 | BIT A,VENDSC ;VBLANK OFF, THEN ON 399 | PLEND 400 | BEGIN 401 | BIT A,VENDSC 402 | MIEND 403 | STA A,WTCHDG 404 | DEY 405 | MIEND 406 | LDY I,0 407 | STY A,AUDC1 ;SOUND OFF 408 | LDY I,14 409 | BEGIN 410 | BEGIN ;DELAY 411 | BIT A,VENDSC 412 | PLEND 413 | BEGIN 414 | BIT A,VENDSC 415 | MIEND 416 | STA A,WTCHDG 417 | DEY 418 | MIEND 419 | TSX 420 | DEX 421 | TXS 422 | MIEND 423 | JMP RESET 424 | .PAGE 425 | .SBTTL ROM TEST 426 | ROMTST: 427 | LDX I,0 ;LO BYTE OF ADDRESS 428 | STX OLDPOS 429 | STX ICBTOL ;ERROR TRACKER 430 | TXS ;SET STACK TO 0 431 | LDA I,PROG/100 ;HI BYTE ADDRESS 432 | STA OLDPOS+1 433 | LDX I,<4*12.>-1 ;PAGE COUNTER-12K 434 | LDA I,12 ;THIS SEED CAN BE CHANGE 435 | STA K 436 | BEGIN ;TEST LOOP 437 | LDY I,0 438 | STX A,WTCHDG 439 | BEGIN ;1 PAGE LOOP 440 | EOR NY,OLDPOS ;LONGITUDINAL PARITY 441 | INY 442 | EQEND 443 | TAY ;SAVE EOR FIGURE 444 | TXA 445 | AND I,7 ;WHICH PAGE? 446 | CMP I,1 ;CLEAR CARRY 1 FIRST PAGE 447 | TYA ;IN 2K HUNK 448 | IFCC ;DONE WITH 2K? 449 | IFNE ;YES. BAD? 450 | PHA ;YES. PUT IT ON STACK 451 | TXA 452 | PHA 453 | LSR 454 | LSR 455 | LSR 456 | TAX 457 | LDA AX,CIBITS+2 ;SET BAD BIT 458 | ORA ICBTOL 459 | STA ICBTOL 460 | PLA 461 | TAX 462 | THEN 463 | LDA K ;UPDATE SEED 464 | ADC I,22 465 | STA K 466 | THEN 467 | INC OLDPOS+1 ;NEXT PAGE 468 | DEX 469 | MIEND ;DONE? 470 | CLI 471 | JSR BLEWIT 472 | JSR INILIT ;INITIALIZE LANGUAGE 473 | LDA I,CWHITE 474 | STA COL110 475 | LDA I,CBLACK ;BACKGROUND 476 | STA COL000 477 | STA ATRACT ;FAKE PLAY MODE FOR CURSOR 478 | LDA I,MBDROM ;CODE FOR BAD ROM 479 | TSX 480 | IFEQ ;BAD ROM? 481 | LDA I,MROMOK ;CODE FOR GOOD ROM 482 | THEN 483 | LDX I,0FF ;RESET STACK 484 | TXS 485 | ;ALWAYS GO REPORT 486 | JSR REPERR 487 | .PAGE 488 | .SBTTL MAP TEST 489 | LDA I,80 ;BIT TO BYTE MODE COMPATABILITY IN CHECK 490 | STA NWSTMP ;TEST CELL IS 8080 491 | STA NWSTMP+1 ;BIT MODE 492 | LDX I,0 493 | LDA I,0C0 494 | STA NX,NWSTMP 495 | LDY I,MMAPOK ;MAP OK DEFAULT 496 | LDA A,2020 ;GET COLOR BACK IN BYTE MODE 497 | AND I,11 498 | CMP I,11 ;SAME? 499 | IFNE 500 | LDY I,MBADMA 501 | THEN 502 | TYA 503 | JSR DTABML 504 | ; 505 | .SBTTL POKEY RANDOM # TEST 506 | LDA A,RANDOM 507 | STA OLDOP1 508 | LDY I,10 509 | BEGIN ;LOOP 16 TIMES 510 | LDA A,RANDOM 511 | CMP OLDOP1 512 | BNE POKOK ;EXIT IF 2 CONSECUTIVE #'S ARE DIFFERENT 513 | STA OLDOP1 514 | DEY 515 | MIEND 516 | LDA I,MBDPOK ;"BAD CHIP" 517 | JSR DTABML 518 | POKOK: 519 | LDA I,MRAMOK ;"RAM OK" 520 | JSR DTABML 521 | .PAGE 522 | .SBTTL SELF TEST CONTROL LOOP 523 | LDA I,2 524 | STA NUMPLA ;FOR BOTH LEDS ON 525 | LDA I,0 526 | STA PLAYUP ;FOR CURSO CONTROL 527 | JSR ACTCUR ;ACTIVATE CURSOR 528 | LDA OPTION ;FAKE OPTION CHANGE FOR DISPLAY 529 | EOR I,0FF 530 | STA OLDOP1 531 | LDA I,01 532 | STA NOPDIS ;DISPLAY OPTIONS FLAG 533 | STA A,POKEY+8 ;LOW FREQ 534 | BEGIN 535 | BEGIN 536 | LSR SYNC 537 | CSEND 538 | LDA Z,SWSTAT+1 539 | AND I,MFIREL!$LMBIT 540 | IFEQ ;SLAM & LEFT FIRE FOR CONVERGENCE 541 | STA NOPDIS ;DON'T DISPLAY OPTIONS 542 | JSR CNVRGE ;DISPLAY PATTERN TO CONVERGE 543 | THEN 544 | LDA Z,SWSTAT+1 545 | AND I,MFIRER!$LMBIT 546 | IFEQ ;SLAM + RIGHT FIRE FOR RAINBOW 547 | STA NOPDIS ;DON'T DISPLAY OPTIONS 548 | JSR TESCOL ;DISPLAY A RAINBOW 549 | THEN 550 | LDA I,0 ;MAKE SOUNDS FOR SWITCHES 551 | STA A,AUDC1 ;TURN SOUNDS OFF 552 | STA A,AUDC1+2 553 | LDA Z,SWSTAT+1 554 | AND I,MFIREC!$LMBIT 555 | IFEQ ;SLAM + CENTER FIRE FOR SCREEN RAM TEST 556 | STA NOPDIS ;DON'T DISPLAY OPTIONS 557 | JSR SCRAM ;TEST SCREEN RAM 558 | THEN 559 | JSR UPCURS 560 | LDA SWSTAT 561 | EOR I,0FF 562 | STA A,AUDF1 563 | IFNE 564 | LDA I,0A8 565 | STA A,AUDC1 566 | INC COL000 567 | THEN 568 | LDA SWSTAT+1 569 | EOR I,0FF 570 | AND I,$LMBIT!MFIREL!MFIREC!MFIRER 571 | STA A,AUDF1+2 572 | IFNE 573 | LDA I,0A8 574 | STA A,AUDC1+2 575 | INC COL000 576 | THEN 577 | LDA FIRESW 578 | AND I,ALLFIR 579 | IFNE ;ANY FIRE SWITCHES PRESSED? 580 | LDA PLAYUP ;YES. CHANGE PLAYER # 581 | EOR I,01 ;(FOR TESTING COCKTAIL BALLS) 582 | STA PLAYUP 583 | LDA I,0 584 | STA FIRESW 585 | JSR BLEWIT ;CLEAR SCREEN 586 | LDA OLDOP1 ;FORCE OPTION DISPLAY TO FLIP SCREEN 587 | EOR I,0FF 588 | STA OLDOP1 589 | LDA I,1 590 | STA NOPDIS 591 | THEN 592 | JSR DSPLOP ;DISPLAY OPTIONS 593 | LDA Z,SWSTAT+1 ;WAIT FOR TEST SWITCH 594 | AND I,MTEST ;TO GO TO GAME MODE 595 | NEEND 596 | JMP RESET 597 | .PAGE 598 | .SBTTL DISPLAY OPTIONS 599 | 600 | RTMULT: .BYTE 1,4,5,6 601 | CNMULT: .BYTE 1,2 602 | 603 | DSPLOP: 604 | LDA NOPDIS 605 | IFNE ;DISPLAY OPTIONS? 606 | LDA OPTION ;POSSIBLY 607 | CMP OLDOP1 608 | STA OLDOP1 609 | IFEQ ;OPTION 1 CHANGED? 610 | LDA OPTIO2 ;NO. OPTION 2 CHANGED? 611 | CMP OLDOP2 612 | STA OLDOP2 613 | THEN 614 | IFNE ;OPTION 1 OR 2 CHANGED? 615 | LDA I,MFREEP 616 | JSR DTABEL ;ERASE COIN MODE TIME 617 | LDA I,MBONIN 618 | JSR DTABEL ;ERASE BONUS LINE 619 | JSR INILIT ;INITIALIZE LANGUAGE 620 | LDA OPTION ;DISPLAY OPTIONS 621 | AND I,03 622 | TAX 623 | LDA AX,CMOTAB 624 | JSR DTABML ;COIN MODE 625 | LDA OPTION 626 | AND I,0C 627 | LSR 628 | LSR 629 | TAX 630 | LDA AX,RTMULT 631 | LDX I,88 632 | LDY I,20 633 | JSR NUMOUT ;RIGHT MULTIPLIER (1,4,5,6) 634 | LDA OPTION 635 | AND I,10 636 | LSR 637 | LSR 638 | LSR 639 | LSR 640 | TAX 641 | LDA AX,CNMULT 642 | LDX I,78 643 | LDY I,20 644 | JSR NUMOUT ;CENTER MULTIPLIER (1,2) 645 | LDA OPTIO2 646 | AND I,SCITYM 647 | TAX 648 | LDA AX,STCITY 649 | LDX I,78 650 | LDY I,30 651 | JSR NUMOUT ;# CITIES TO START WITH 652 | LDA I,MCITIES 653 | JSR DTABML 654 | JSR BONCIT ;BONUS CITY INTERVAL 655 | THEN 656 | THEN 657 | RTS 658 | .PAGE 659 | .SBTTL SCREEN RAM TEST 660 | 661 | TSTMSK =0AA 662 | SCRAM: JSR TESCOL ;SETUP COLORS FOR TEST 663 | JSR BLEWIT ;CLEAR SCREEN 664 | SEI 665 | LDA I,0 666 | STA ICBTOL ;INITIALIZE ERROR BUCKET 667 | LDA I,MRAMOK ;DEFAULT "RAM OK" 668 | STA K 669 | LDA I,2 670 | STA OLDPOS+1 ;POINT BACK TO TOP OF RAM 671 | BEGIN 672 | BEGIN 673 | LDA I,TSTMSK ;BIT PATTERN 674 | STA NY,OLDPOS ;STORE PATTERN INTO TEST CELL 675 | INY 676 | BEGIN 677 | LDA NY,OLDPOS ;IS EVERYTHING ELSE 0 678 | IFNE 679 | JSR ERROR1 ;NO, REPORT ERROR 680 | THEN 681 | INY 682 | EQEND 683 | LDA NY,OLDPOS 684 | CMP I,TSTMSK ;PATTERN STILL THERE? 685 | IFNE 686 | JSR ERROR0 ;NO, REPORT ERROR 687 | THEN 688 | LDA I,0 689 | STA NY,OLDPOS ;0 OLD TEST CELL 690 | STA SYNC 691 | STA A,WTCHDG 692 | INC OLDPOS ;POINT TO NEXT TEST CELL 693 | EQEND 694 | INC OLDPOS+1 ;POINT TO NEXT PAGE 695 | LDA OLDPOS+1 696 | CMP I,3F 697 | EQEND 698 | LDA K 699 | JMP REPERR ;TELL'EM WHICH BITS ARE BAD (IF ANY) 700 | .PAGE 701 | 702 | ERROR0: EOR I,TSTMSK ;ISOLATE BIT IN ERROR 703 | ERROR1: ORA ICBTOL ;SAVE BAD BIT 704 | STA ICBTOL 705 | LDA I,MBDRAM 706 | STA K 707 | RTS 708 | REPERR: CLI ;ACC=MSG # 709 | JSR DTABML 710 | LDA ICBTOL ;HOLDS BITS WITH KNOWN ERRORS 711 | LDX I,8 ;BIT COUNTER 712 | BEGIN 713 | ASL ;THIS BIT BAD? 714 | IFCS ;YEP, REPORT HIM 715 | PHA ;SAVE NECESSARY REGS 716 | STX CILEFT 717 | LDA I,BLUE ;SET UP COLOR FOR NUMOUT 718 | STA PATRN1 719 | TXA ;BIT WERE WORKING ON 720 | ASL ;X 8 TO SEPARATE 721 | ASL ;NUMBERS DISPLAYED ON SCREEN 722 | ASL 723 | CLC 724 | ADC I,88 ;ADD IN BASE SCREEN ADDRESS 725 | TAY ;VERTICAL ADDRESS IN Y FOR NUMOUT 726 | TXA ;# IN A FOR NUMOUT 727 | LDX I,0A0 ;HORIZ ADDRESS IN X FOR NUMOUT 728 | JSR NUMOUT 729 | LDX CILEFT ;RESTORE REGS 730 | PLA 731 | THEN 732 | DEX ;NEXT BIT 733 | EQEND 734 | RTS 735 | .PAGE 736 | .SBTTL DISPLAY COLORS 737 | ;FUNCTION: TO DISPLAY COLOR BARS TO TEST THE MONITOR 738 | 739 | TESCOL: LDX I,7 740 | BEGIN 741 | TXA 742 | ASL 743 | STA ZX,COL000 744 | DEX 745 | MIEND 746 | INX ;START AT HORIZ=40 747 | STX OLDPOS ;0 X IN BIT MODE 748 | BEGIN 749 | LDY I,18 ;TOP OF SCREEN 750 | STY OLDPOS+1 751 | BEGIN 752 | STA NX,OLDPOS ;A DOT AT A TIME 753 | INC OLDPOS+1 ;ONE LINE LOWER 754 | EQEND ;BOTTOM OF SCREEN? 755 | TAY ;SAVE COLOR CODE 756 | LDA I,1F 757 | AND OLDPOS ;EACH COLOR 32 DOTS WIDE 758 | IFEQ 759 | TYA ;GET COLOR 760 | CLC ;NEW COLOR 761 | ADC I,20 762 | TAY 763 | THEN 764 | TYA 765 | INC OLDPOS ;POINT TO NEXT VERT LINE 766 | EQEND ;DONE? 767 | RTS ;YES 768 | .PAGE 769 | .SBTTL CONVERGENCE PATTERN 770 | WHITE =40 771 | CNVRGE: LDA I,CBLACK 772 | LDX I,7 773 | BEGIN 774 | STA ZX,COL000 775 | DEX 776 | MIEND 777 | LDA I,CWHITE 778 | STA COL010 779 | JSR BLEWIT 780 | LDX I,0 781 | LDY I,ENDVER-VERTCL-1 ;INDEX POINTER INTO TABLE 782 | BEGIN 783 | LDA I,19 ;VERTICAL COORDINATE 784 | STA OLDPOS+1 785 | LDA AY,VERTCL ;HORIZ COORDINATE 786 | STA OLDPOS 787 | LDA I,WHITE ;GET COLOR 788 | BEGIN 789 | STA NX,OLDPOS ;WRITE VERT LINE 790 | INC OLDPOS+1 791 | EQEND 792 | DEY ;NEXT STARTING POINT 793 | MIEND ;DONE 794 | LDY I,ENDHOR-HRZNTL-1 795 | BEGIN 796 | LDA AY,HRZNTL ;VERTICAL COORDINATE 797 | STA OLDPOS+1 798 | STX OLDPOS 799 | LDA I,WHITE 800 | BEGIN 801 | STA NX,OLDPOS ;WRITE HORIZ LINE 802 | INC OLDPOS 803 | EQEND 804 | DEY ;POINT TO NEXT LINE TO WRITE 805 | MIEND 806 | LDY I,ENDVER-VERTCL-2 807 | BEGIN ;LOOP FOR PTS 1/2 WAY BETWEEN VERT LINE 808 | LDA AY,VERTCL 809 | CLC 810 | ADC AY,VERTCL+1 811 | ROR 812 | STA OLDPOS 813 | STY J 814 | LDY I,ENDHOR-HRZNTL-2 815 | BEGIN ;LOOP FOR PTS 1/2 WAY BETWEEN HORIZ LINES 816 | LDA AY,HRZNTL 817 | CLC 818 | ADC AY,HRZNTL+1 819 | ROR 820 | STA OLDPOS+1 821 | LDA I,WHITE 822 | STA NX,OLDPOS ;WRITE DOT 823 | DEY 824 | MIEND 825 | LDY J 826 | DEY 827 | MIEND 828 | RTS 829 | 830 | VERTCL: .BYTE 00,33,66,99,0CC,0FF 831 | ENDVER: 832 | HRZNTL: .BYTE 19,46,74,0A2,0D0,0FF 833 | ENDHOR: 834 | QCHKSB: .BYTE CHKSMB 835 | .VCTRS 7FFA,RESET,RESET,IRQ 836 | .END 837 | -------------------------------------------------------------------------------- /COIN65.XX: -------------------------------------------------------------------------------- 1 | ; .TITLE COIN65 - 650X "UNIVERSAL" COIN ROUTINE 2 | .SBTTL ********************************* 3 | .SBTTL * PROGRAMERS: DOWNEND & ALBAUGH * 4 | .SBTTL * * 5 | .SBTTL * CHECKER: * 6 | .SBTTL * * 7 | .SBTTL ********************************* 8 | .SBTTL EXPLANATION 9 | .RAD=10 10 | .RADIX 16 11 | .ENABL LC 12 | .LIST MEB 13 | ;THIS IS A MAJOR REVISION OF THE COIN ROUTINE DERIVED FROM PENNY. 14 | ;ALL NEW PROGRAMS SHOULD USE THIS ROUTINE. OLD PROGRAMS CAN CONTINUE 15 | ;TO USE PENNY, BUT NO FURTHER OPTIONS WILL BE SUPPORTED IN PENNY. 16 | .SBTTL DEFAULT ASSIGNMENTS 17 | .LIST CND 18 | .IIF NDF,FTEST,FTEST=0 ;NOT FIELD TEST 19 | .IIF NDF,MODES,MODES=4 ;FOUR COIN MODES STANDARD 20 | ;ALTERNATE IS MODES=0 21 | .IIF NDF,MECHS,MECHS=3 ;# OF MECHS (2 OR 3) 22 | .IIF NDF,INCLUDE,INCLUDE=0 ;NOT ".INCLUDE"'D 23 | ;IF "INCLUDE=1",THE ".END" IS SUPPRESSED 24 | .IIF NDF,RTS,RTS=1 ;EXIT VIA RTS 25 | ;IF RTS=0,EXITS BY FALLING OUT 26 | .IF EQ,MECHS-3 ;DEFAULTS FOR MECHS=3 27 | .IIF NDF,MULTS,MULTS=1 ;IMPLEMENT H.DELMAN STANDARD MULTIPLIERS 28 | ;(SEE GHM,GDM BELOW) 29 | .IIF NDF,EMCTRS,EMCTRS=3 ;3 ELECTRO-MECH COUNTERS 30 | .IIF NDF,OFFSET,OFFSET=1 ;OFFSET BY 1 31 | 32 | .IFF ;DEFAULTS FOR MECHS=2 33 | .IIF NDF,MULTS,MULTS=0 ;MULTIPLIERS DO NOT APPLY 34 | .IIF NDF,EMCTRS,EMCTRS=0 ;NO E.M. COUNTERS 35 | .IIF NDF,OFFSET,OFFSET=2 ;SWITCHES AND STATUS BYTES TWO-APART 36 | .ENDC ;EQ, MECHS-3 37 | .IIF NDF,SEPCCT,SEPCCT=0 ;DO NOT IMPLEMENT SEPARATE $CNCT'S 38 | ;USE SEPCCT=1 ONLY FOR WIERD,NON-STANDARD MECH-MULTIPLIERS 39 | .IIF NDF,COIN,COIN=0 ;COIN IS LOW-TRUE 40 | .IIF NDF,CNTINT,CNTINT=1 ;COUNT INTERRUPTS (IN $INTCT) 41 | .IIF NDF,SLAM,SLAM=1 ;SLAM IS HIGH-TRUE 42 | .IIF NDF,CMZP,CMZP=1 ;COIN MODE IS IN ZERO-PAGE 43 | ;D0,D1=0,1,2,3 FOR FREE, 2 PLAY/COIN, 1 PLAY/COIN,2 COIN/PLAY 44 | ;D2,D3=0,1,2,3 FOR 1,4,5,6 "UNITS"/RIGHT COIN 45 | ;D4=0,1 FOR 1,2 "UNITS"/MIDDLE COIN 46 | ;ONLY D2,3,4 USED IF MODES=0 47 | .IIF NDF,COIN67,COIN67=0 ;COINS NOT IN D7,D6 OF SAME BYTE 48 | .IIF NDF,COIN01,COIN01=0 ;COINS NOT IN D0,D1 EITHER 49 | .IIF NDF,PRST,PRST=30. ;PRE-COIN SLAM KILLS COINS FOR 30 FRAMES 50 | .IIF NDF,POST,POST=30. ;POST-COIN SLAM KILLS COINS WITHIN 30 FRAMES 51 | .IF NE,*** 52 | .ERROR ;NONE,ONE,THREE, OR FOUR E.M.CTRS ONLY 53 | .ENDC 54 | .IF NE,FTEST 55 | CCTRS =1 ;FIELD TEST, 1 COIN COUNTER 56 | .IFF 57 | CCTRS =EMCTRS ;NORMALLY 58 | .ENDC 59 | .IF NE,CMZP 60 | ;IF YOU USE CMZP=0, DEFINE EQUIVALENT MACROS 61 | ;(GCM NOT NEEDED IF MODES=0) 62 | .MACRO GCM 63 | ;ACC0,ACC1:=COIN OPTION ACC 2-7=0,Z-FLAG SET PER ACC CARRY IS DON'T CARE. 64 | LDA Z,$CMODE ;GET COIN MODE FROM ZERO-PAGE 65 | .IF NE,MULTS 66 | AND I,3 ;ISOLATE COINS-CREDITS OPTION 67 | .ENDC ;NE,MULTS 68 | .ENDM 69 | 70 | .MACRO GHM 71 | ;ACC=0 FOR 1 "UNIT" ,<>0 FOR 2 "UNITS" PER MIDDLE-MECH COIN. 72 | ; Z FLAG SET PER ACC. CARRY IS DON'T CARE 73 | LDA Z,$CMODE ;GET COIN MODE FROM ZERO-PAGE 74 | AND I,10 ;ISOLATE HALF-MULTIPLIER 75 | .ENDM 76 | 77 | .MACRO GDM 78 | ;ACC=0,1,2,3 FOR 1,4,5,6 "UNITS" PER RIGHT-MECH COIN. CARRY CLEAR. Z-FLAG SET PER ACC 79 | LDA Z,$CMODE 80 | AND I,0C 81 | LSR 82 | LSR 83 | .ENDM 84 | .ENDC ;NE,CMZP 85 | .NLIST CND 86 | .NLIST CND 87 | ;ENTRY POINT 88 | .GLOBL MOOLAH 89 | ; 90 | ;EXTERNAL REFERENCES 91 | .IF NE,MODES!MULTS 92 | .IF NE,CMZP 93 | .GLOBL $CMODE ;INPUT COIN MODE 94 | .ENDC ;NE, CMZP 95 | .ENDC ;NE,MODES!MULTS 96 | .GLOBL $COINA,$LAM ;SWITCH LOCATIONS (COIN & SLAM) 97 | .GLOBL $LMBIT ;MASK WITH 1 IN BIT WHERE SLAM SW. IS 98 | .GLOBL $CNSTT,$PSTSL ;INTERNAL LOCATIONS 99 | .GLOBL $INTCT ;INTERRUPT COUNTER 100 | .GLOBL $LMTIM,$CNCT ;SLAM-TIMER, COINCOUNT 101 | .IF NE,MODES 102 | .GLOBL $$CRDT ;RESULT OF ALL THIS 103 | .ENDC ;NE,MODES 104 | .IF NE,EMCTRS 105 | .GLOBL $CCTIM ;COIN-COUNTER TIMER BYTE(S) 106 | .ENDC ;NE,EMCTRS 107 | .IF NE,MODES* 108 | .ERROR ;2 FLAVORS-0 OR 4 MODES 109 | .ENDC ;NE,MODES* 110 | .IF NE,* ;CHECK # OF MECHS SPEC'D 111 | .ERROR ;2 OR 3 MECHS ONLY, PLEASE 112 | .ENDC ;NE,*CMECHS-3> 113 | .IF EQ,RTS!INCLUDE 114 | .ERROR ;NO RTS, NO INCLUDE??? 115 | .ENDC ;RTS!INCLUDE 116 | .IF NE,MULTS*SEPCCT 117 | .ERROR ;BOTH MULTS AND SEPCCT?!? 118 | .ENDC ;NE,MULTS*SEPCCT 119 | .IF NE,MODES*SEPCCT 120 | .ERROR ;SEPCCT AND MODES TOO?!? 121 | .ENDC ;NE,MODES*SEPCCT 122 | .IIF GT,PRST-31.,PRST=31. 123 | .IIF GT,POST-63.,POST=63. 124 | ; The coin routine assumes the presence of the following .GLOBL variables: 125 | .IF NE,MODES 126 | .REPT 0 127 | $$CRDT: Base page byte initialized to 0 on restart. This is where accrued credit 128 | is kept. Should be decremented for each player-start. Note that a DECREMENT 129 | instruction must be used to insure mutual exclusion between the main program 130 | accessing $$CRDT and the interrupt-driven coin routine accessing $$CRDT". Not 131 | used if MODES=0 132 | .ENDR 133 | .ENDC ;NE,MODES 134 | .IF NE,CMZP 135 | .REPT 0 136 | .IIF NDF,SEPCCT,SEPCCT=0 ;DO NOT IMPLEMENT SEPARATE $CNCT'S 137 | $CMODE: Base page byte that contains the coin option switches in its low-order 138 | bits (high true). You must put them there. This is not used if flag CMZP=0. 139 | See bit definitions in DEFAULT ASSIGNMENTS, and Macro definitions GCM,GHM,GDM. 140 | .ENDR 141 | .ENDC ;NE,CMZP 142 | .REPT 0 143 | $CNSTT: Three base page bytes ($CNSTT, $CNSTT+OFFSET,$CNSTT+2*OFFSET) which should be 144 | initialized to 00 (the timers for coin detection). 145 | $COINA: Three locations containing coin switches in D7. Left mech is at $COINA, Right 146 | mech is at $COINA+(2*OFFSET). If COIN67=1, Switches are all in $COINA, D7-Right, 147 | D6-Mid, D5-Left. If Coin01=1, D0-Right, D1-MId, D2-Left. 148 | .ENDR 149 | .IF NE,SEPCCT 150 | .REPT 0 151 | $CNCT: Three base page bytes ($CNCT, $CNCT+OFFSET, $CNCT+(2*OFFSET)) which must be zeroed 152 | on pwron - coin counters for program (As distinct from $CCTIM,Below). Only one is used SEPCCT=0. 153 | .ENDR 154 | .IFF 155 | .REPT 0 156 | $CNCT: Base page byte which must be initialized to zero on pwron. This is used to count 157 | coins for program (As distinct from $CCTIM, below). 158 | .ENDR 159 | .ENDC ;NE,SEPCCT 160 | .REPT 0 161 | $PSTSL: Three (or 2,if Mechs=2) base page bytes ($PSTSL, $PSTSL+OFFSET,$PSTSL+(2*OFFSET)used to 162 | time post-coin slam. 163 | $LAM: Address of the SLAM switch. The bit position inside $LAM is specified by 164 | $LMBIT (see below) 165 | $LMBIT: Mask used to select which bit in the slam switch byte should be tested 166 | (used as I,$LMBIT). NOT A LOCATION, JUST A VALUE!! 167 | $LMTIM: Base page byte used as a timer for pre-slam protection. May be 168 | initialized to 0FF at pwron to disallow coin input for 4 seconds. Coins are 169 | disallowed for two frames anyway. 170 | $INTCT: Interrupt counter for long string-timer. If CNTINT=1, this will be 171 | incremented (default case). If CNTINT=0, this should be equated to an existing 172 | counter. 173 | $CCTIM: Timers(s) for pulses output to electro-mechanical counters, if EMCTRS > 0. 174 | Sign of $CCTIM(X) set if assoc. coin counter should be turned on, cleared 175 | for off. If 3 used, they are Left @ $CCTIM, Mid @ $CCTIM+OFFSET, Right @ $CCTIM+(2*OFFSET) 176 | Space requirements: 177 | RAM: 3+CMZP+2*MECHS+EMCTRS (13. TYPICAL) 178 | ROM: About 200. bytes 179 | The coin routine also assumes it will be called 4 times a frame, where one frame=1/60 180 | second. In most cases this may be accomplished by making the coin routine part of the 181 | interrupt routine. 182 | .ENDR 183 | .IF EQ,OFFSET-2 184 | .REPT 0 185 | SAMPLE BASE PAGE ALLOCATION: (WHERE OFFSET=2,MECHS=3) 186 | $CCTIM: .BLKB 1 ;COIN COUNTER TIMER (IF 1 USED) 187 | $$CRDT: .BLKB 1 ;CREDIT TOTAL 188 | $CNCT: .BLKB 5 ;COIN COUNTS 189 | $LMTIM =$CNCT+1 ;PRE-COIN SLAM-TIMER 190 | $CMODE =$CNCT+3 ;COIN MODE 191 | $PSTSL: .BLKB 6 ;POST-COIN SLAM TIMERS (@ 1,3,5) 192 | $CNSTT =$PSTSL+1 ;COIN STATUS/TIMERS 193 | .ENDR 194 | .ENDC ;EQ,OFFSET-2 195 | .IF EQ,OFFSET-1 196 | .REPT 0 197 | SAMPLE BASE PAGE ALLOCATION: (WHERE OFFSET=1,MODES=4) 198 | $CCTIM: .BLKB EMCTRS ;E.M. COUNTER TIMERS (-FOR ON) 199 | $$CRDT: .BLKB 1 ;CREDIT TOTAL 200 | $CNCT: .BLKB 1 ;"UNIT-COIN" COUNT 201 | $PSTSL: .BLKB MECHS ;POST-COIN SLAM TIMERS 202 | $CNSTT: .BLKB MECHS ;COIN-STATUS/TIMER 203 | $LMTIM: .BLKB 1 ;PRE-COIN SLAM TIMER 204 | $CMODE: .BLKB 1 ;COIN MODE 205 | .ENDR 206 | .ENDC ;EQ,OFFSET-1 207 | .IF EQ,MODES-4 208 | .REPT 0 209 | THE COIN MODES ARE: 210 | 0: FREE PLAY- $CNCT is zeroed, $$CRDT is not changed 211 | 1: 2 PLAYS PER COIN 212 | 2: 1 PLAY PER COIN 213 | 3: 2 COINS PER PLAY 214 | .ENDR 215 | .ENDC ;EQ,MODES-4 216 | .REPT 0 217 | *** COIN DETECTION *** 218 | Coin detection, courtesy of Mike Albaugh, uses two counters in one byte ($CNSTT). This 219 | byte is used to remember the condition of the coin switch. The upper counter (D7,D6,D5) 220 | runs when the coin is absent and is reset when the coin is present. The lower counter 221 | (D4-D0) runs when the coin is present and is reset when the coin is absent, unless the 222 | coin was present for 5 successive samples. This "unless" enables $CNSTT to "remember" 223 | that a coin has been VALID-HIGH while waiting for VALID-LOW. 224 | Basically, a valid coin is defined as between 16 and 800 ms of coin present, preceded and 225 | followed by 33 ms of coin absent. The 33 ms lows need not immediately precede or follow 226 | the high. The lower five bits count down from 31 when the coin is present. This 227 | countdown is fast (once per interupt) for the first five samples (31-26, about 16-20 228 | milliseconds) then slow (once per EIGHT interrupts) for the remaining counts (26-0, about 229 | 800 ms). The count then stops at zero. This counter is reset if the coin goes away 230 | during the first five counts, I.E., the coin must be present for at least 16 ms. After 231 | that the coin must go away for eight counts to reset it. This is because after the first 232 | five counts a coin is VALID HIGH and must not be reset until VALID LOW occurs to prevent 233 | mid-coin glitches from making a valid coin into 0 or 2 (or more) coins. 234 | 235 | The upper three bits count up from zero when the coin is absent. The count is reset if 236 | coin is ever found present. When the count finally wraps (8 samples, 33 ms). The 237 | coin-present counter is checked. A count from 27-31 (less than 16-20 ms) is too short. A 238 | count of 0 (more than 800 ms) is too long. Both of these cases are simply reset to 31. A 239 | count of 1-26 is a (tentatively) valid coin. The counter is again set to 31, but another 240 | counter ($PSTSL) is started. 241 | 242 | $PSTSL is the POST-COIN-SLAM timer. Initially set to 120, it counts down once per 243 | interrupt (4 times per frame) to give a nominal 1/2 second delay. If the slam switch is 244 | seen during this time, $PSTSL is cleared, invalidating the coin. The length of the delay 245 | (in frames) is defined by POST which defaults to 30. It may be set as high as 63 (1.05 246 | seconds) by definition E.G. 247 | 248 | POST=50 ;POST-SLAM=50 FRAMES 249 | 250 | SIMILARY A SLAM IS "REMEMBERED" FOR PRST frames (default=30, max=31) and no coin can be 251 | "seen" during this time. 252 | 253 | Note that the proper initial state of all these counters etc is 0, therefore the 254 | traditional power-on clear does the trick. Since coins "transit" from $CNSTT to $PSTSL to 255 | $CNCT to $$CRDT, locations should be cleared in that order, I.E. $$CRDT should be the 256 | last location cleared. ($$CRDT, of course, exists only if MODES=4) 257 | .ENDR 258 | .SBTTL DETECT COIN 259 | ;INSTRUCTIONS IN BRACKETS( "[" AND "]" ) ARE FOR ILLUSTRATION ONLY, AND ARE NOT 260 | ;ACTUALLY ASSEMBLED. 261 | MOOLAH: 262 | LDX I,OFFSET* ;X IS USED TO INDEX FROM RIGHT TO LEFT COIN MECH 263 | .IF EQ,COIN67!COIN01 264 | DETECT: LDA AX,$COINA 265 | ASL 266 | .IFF 267 | DETECT: LDA A,$COINA ;GET COIN SWITCHES 268 | CPX I,OFFSET ;WHICH MECH ARE WE DOING 269 | BEQ 11$ ;MIDDLE (X=OFFSET) SHIFT TWICE 270 | BCS 12$ ;RIGHT (X=2*OFFSET) SHIFT ONCE 271 | .IF NE,COIN01 272 | LSR ;ELSE LEFT, SHIFT THRICE 273 | 11$: LSR 274 | 12$: LSR 275 | .IFF 276 | ASL ;ELSE LEFT, SHIFT THRICE 277 | 11$: ASL 278 | 12$: ASL 279 | .ENDC ;NE,COIN01 280 | .ENDC ;EQ,COIN67!COIN01 281 | LDA ZX,$CNSTT 282 | AND I,31. ;SHARED INST. SEE BELOW IN BRACKETS [] 283 | .IF EQ,COIN 284 | BCS 5$ ;BRANCH IF INPUT HIGH (COIN ABSENT) 285 | .IFF 286 | BCC 5$ ;BRANCH IF INPUT LOW (COIN ABSENT) 287 | .ENDC ;EQ,COIN 288 | ; [AND I,31.] ISOLATE COIN-ON DOWN-COUNTER, RESET COIN-OFF UP-CTR. 289 | BEQ 1$ ;STICK AT 0 (TERMINAL COUNT) 290 | CMP I,27. ;IN FIRST FIVE SAMPLES 291 | BCS 10$ ;YES, RUN FAST 292 | TAY ;ELSE SAVE STATUS 293 | LDA Z,$INTCT ;CHECK INTERUPT CTR 294 | AND I,7 ;ARE D0-D2 ALL ONES? 295 | CMP I,7 296 | TYA ;STATUS BACK INTO ACC 297 | BCC 1$ ;SKIP IF NOT BOTH ONES 298 | 10$: SBC I,1 ;CARRY SET 299 | 1$: STA ZX,$CNSTT ;SAVE UPDATED STATUS 300 | LDA A,$LAM ;CHECK SLAM SWITCH 301 | AND I,$LMBIT 302 | .IF NE,SLAM 303 | BEQ 2$ ;BRANCH IF BIT LO (SWITCH OFF) 304 | .IFF 305 | BNE 2$ ;BRANCH IF BIT HI (SWITCH OFF) 306 | .ENDC 307 | LDA I,PRST*8 ;ELSE SET PRE-COIN SLAM TIMER 308 | STA Z,$LMTIM ;DECR. 8 TIMES/FRAME=PRST FRAMES 309 | 2$: LDA Z,$LMTIM ;CHECK PRE-COIN SLAM TIMER 310 | BEQ 3$ ;O.K. 311 | DEC Z,$LMTIM ;ELSE RUN TIMER 312 | LDA I,0 313 | STA ZX,$CNSTT ;CLEAR COIN STATUS 314 | STA ZX,$PSTSL ;CLEAR POST-COIN SLAM-TIMER 315 | 3$: CLC ;DEFAULT "NO COIN DETECTED" 316 | LDA ZX,$PSTSL ;CHECK POST-COIN SLAM-TIMER 317 | BEQ 8$ ;EMPTY, PROCEED 318 | DEC ZX,$PSTSL ;RUN TIMER 319 | BNE 8$ ;NOT DONE, PROCEED 320 | SEC ;WHEN IT BECOMES ZERO, INDICATE A COIN 321 | BCS 8$ ;(ALWAYS) 322 | 323 | 5$:; [AND I,31.] GET COIN-ON DOWN-CTR (ACTUALLY DONE BEFORE) 324 | CMP I,27. ;IS COIN VALID YET (ON FOR >4 SAMPLES) 325 | BCS 6$ ;NO, RESET IT 326 | LDA ZX,$CNSTT ;GET STATUS AGAIN 327 | ADC I,32. ;BUMP COIN-OFF UP-CTR. 328 | BCC 1$ ;IF IT DIDN'T WRAP, JUST STORE STATUS 329 | BEQ 6$ ;IT WRAPPED BUT COIN WAS ON TOO LONG, JUST RESET 330 | CLC ;SET "VALIDITY" AGAIN 331 | 6$: LDA I,31. ;RESET DOWN-COUNTER 332 | BCS 1$ ;BRANCH IF COIN TOO LONG OR TOO SHORT 333 | STA ZX,$CNSTT ;SAVE RESET STATUS 334 | ; [CLC] DEFAULT TO "NO COIN" (CARRY IS ALREADY CLEAR) 335 | LDA ZX,$PSTSL ;CHECK HOWIES ASSUMPTION 336 | BEQ 7$ ;BRANCH IF $PSTSL VACANT 337 | SEC ;ELSE GIVE CREDIT A LITTLE EARLY 338 | 7$: LDA I,POST*4 ;/(4 COUNTS/FRAME)="POST" FRAMES 339 | STA ZX,$PSTSL ;DELAY ACCEPTANCE FOR POST 60 SEC. 340 | 341 | 8$: ;CARRY=1 IF COIN FALLS OUT 342 | BCC 9$ 343 | .IF NE,MULTS 344 | ;FALL THROUGH TO "MECH-MULTIPLIERS" 345 | .PAGE 346 | .SBTTL MECH-MULTIPLIERS 347 | .IF EQ,MECHS-2 348 | TXA ;WHICH MECH 349 | BEQ 85$ ;LEFT,ADD1 350 | .IFF ;I.E., MECHS=3 351 | LDA I,0 ;START WITH 0 (TO ADD 1) 352 | CPX I,OFFSET ;CHECK WHICH MECH 353 | BCC 85$ ;IF LEFT, ALWAYS ADD 1 354 | BEQ 83$ ;IF CENTER, CHECK HALF-MUL 355 | .IFTF ;MECHS=2 OR 3 356 | GDM ;ELSE GET DOLLAR MUL 357 | BEQ 85$ ;00-ADD 1 358 | ADC I,2 ;ELSE MAP 1,2,3 TO 3,4,5 359 | .IFF ;EQ,MECHS-2 360 | BNE 85$ ;(ALWAYS) 361 | 362 | 83$: GHM 363 | BEQ 85$ 364 | LDA I,1 365 | .ENDC ;EQ,MECHS-2 366 | 85$: SEC 367 | .IF NE,SEPCCT 368 | .PRINT ;I'M NOT SURE YOU WANT TO DO THIS, ARE YOU? 369 | ADC X,$CNCT 370 | STA X,$CNCT ;UPDATE COIN COUNT FOR PROGRAM 371 | .IFF ;NE,SEPCCT 372 | .IF EQ,! ;IF MULTS REQUIRED, BUT ONLY ONE COUNTER 373 | 374 | ;THE NORMAN AVELLAR MEMORIAL KLUGE 375 | 376 | ; 377 | ;###NOTE: THIS CODE PROVIDED ONLY FOR OLD AMERICAN GAMES. USE WITH 5 DM 378 | ;MECHS IS STRONGLY DISCOURAGED 379 | TAY ;SAVE INCREMENT 380 | .IFTF ;EQ,! 381 | ADC $CNCT 382 | STA $CNCT 383 | .IFT ;EQ,! 384 | INY 385 | TYA 386 | .IF EQ,MECHS-3 387 | CMP I,3 ;IS IT DOLLAR MULT 388 | BCC 87$ ;NO, SKIP 389 | LDA I,3 ;ELSE FORCE 4 (3+CARRY) 390 | .IFF ;EQ,MECHS-3 391 | AND I,4 392 | BNE 87$ 393 | SEC 394 | .ENDC ;EQ,MECHS-3 395 | 87$: ADC $CCTIM 396 | STA $CCTIM 397 | .ENDC ;EQ,! 398 | .ENDC ;SEPCCT 399 | .IFF ;NE, MULTS 400 | ;FALL THROUGH TO BUMP $CNCT 401 | .IF NE,SEPCCT ;IF ASKED FOR SEPARATE COUNT, 402 | INC X,$CNCT ;USE INDEXED INC 403 | .IFF ;ELSE USE COMMON COUNTER 404 | INC $CNCT 405 | .ENDC ;NE,SEPCCT 406 | .ENDC ;NE,MULTS 407 | .IF EQ,CCTRS-1 ;IF 1 COIN COUNTER USED, NO MULTS 408 | .IF EQ,MULTS ;AND NO MULTS 409 | INC $CCTIM ;INIT COIN PULSE TO E.M. COUNTER 410 | .ENDC ;EQ,MULTS 411 | .ENDC ;EQ,CCTRS-1 412 | .IF GE,CCTRS-3 ;IF 3 OR 4 COUNTERS USED 413 | INC X,$CCTIM ;"QUEUE" PULSE FOR E.M. COUNTER 414 | .ENDC ;EQ,CCTRS-3 415 | 9$: 416 | 100$: 417 | .REPT OFFSET 418 | DEX 419 | .ENDR 420 | .IF GT,.-DETECT-126. 421 | BMI 120$ 422 | JMP DETECT 423 | 120$: 424 | .IFF 425 | BPL DETECT 426 | .ENDC ;GT,.-DETECT-126. 427 | .IF EQ,MODES-4 ;ONLY IF MODES=4 428 | ;FALL THROUGH TO CONVERT COINS TO CREDITS 429 | .PAGE 430 | .SBTTL COINS TO CREDITS 431 | CONVRT: GCM ;GET COIN MODE IN ACC 0,1 432 | TAY ;SAVE IT & TEST IT 433 | BEQ 2$ ;IF FREE PLAY, KEEP COIN COUNT CLEAR, LEAVE CREDIT 434 | LSR 435 | ADC I,0 ;FORM PRICE (0,1,1,2) 436 | EOR I,0FF 437 | SEC ;NEGATE 438 | ADC $CNCT ;ACC <- COINCT - PRICE 439 | BCC EXIT ;BRANCH ON BORROW 440 | CPY I,2 ;COIN MODE 2 OR 3? 441 | BCS 1$ ;YES, JUST ONE CREDIT 442 | INC $$CRDT ;ELSE GIVE TWO FOR MODES 0,1 443 | 1$: INC $$CRDT 444 | 2$: STA $CNCT ;STORE REDUCED (OR CLEARED) COINCT 445 | .ENDC 446 | EXIT: 447 | .IIF NE,CNTINT, INC Z,$INTCT ;COUNT INTERUPTS WHEN REQUESTED 448 | .IF NE,EMCTRS ;INCLUDE PULSER FOR E.M. CTRS 449 | ;FALL THROUGH TO HANDLE E.M. COUNTERS 450 | .SBTTL ELECTRO-MECH. CTRS 451 | LDA Z,$INTCT ;GET $INTCT 452 | LSR ;USE LSB FOR PULSE=4 FRAMES 453 | BCS 99$ 454 | .ENDC ;EQ,EMCTRS-1* 455 | .IF EQ,EMCTRS-1 456 | LDA Z,$CCTIM ;GET COIN-COUNTER TIMER 457 | BEQ 99$ ;BRANCH IF IDLE 458 | CMP I,10 ;MSB'S CLEAR? 459 | BCS 1$ ;NO,SKIP 460 | ADC I,-1 ;ELSE INIT PULSE, SET CARRY 461 | 1$: ADC I,0EF ;(ONE LESS CUZ CARRY SET) DEC MSB'S OF TIMER 462 | STA Z,$CCTIM ;STORE UPDATED TIMER 463 | .ENDC ;EQ,EMCTRS-1 464 | .IF GE,EMCTRS-3 ;IF 3 OR 4 CTRS 465 | LDY I,0 ;START WITH FLAG OF 0 466 | LDX I,OFFSET* 467 | 1$: LDA X,$CCTIM ;CHECK TIMER(X) 468 | BEQ 3$ ;NEITHER RUNNING NOR PENDING 469 | CMP I,10 ;IS IT RUNNING 470 | BCC 3$ ;NO, SKIP 471 | ADC I,0EF ;ELSE DEC 4 MSB 472 | INY ;SET ON FLAG 473 | 2$: STA X,$CCTIM 474 | 3$: 475 | .REPT OFFSET 476 | DEX 477 | .ENDR 478 | BPL 1$ 479 | TYA ;CHECK "ON" FLAG 480 | BNE 99$ ;SKIP IF ANY ON 481 | ;IF NONE OF THE COUNTERS ARE CURRENTLY ON, WE CHECK TO SEE IF ANY CAN BE 482 | ;STARTED. 483 | LDX I,OFFSET* 484 | 4$: LDA X,$CCTIM ;NEED WE START THIS ONE 485 | BEQ 5$ ;NO, NO COUNTS PENDING 486 | CLC 487 | ADC I,0EF ;SET 4 MSB, DEC 4 LSB 488 | STA X,$CCTIM ;START TIMER 489 | BMI 99$ ;EXIT, SO WE DON'T START MORE 490 | 5$: 491 | .REPT OFFSET 492 | DEX 493 | .ENDR 494 | BPL 4$ 495 | .ENDC ;EQ, EMCTRS-3 496 | 99$: 497 | .IF NE,RTS ;IF THIS IS A SUBROUTINE 498 | RTS 499 | .ENDC ;NE,RTS 500 | .RADIX .RAD ;RESTORE RADIX 501 | 502 | .IIF EQ,INCLUDE, .END ;NO .END TO ".INCLUDE"'D FILES 503 | -------------------------------------------------------------------------------- /A35820.1A: -------------------------------------------------------------------------------- 1 | .TITLE W3DSUP-WWIII 2 | .INCLUDE W3COMN ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 3 | .PAGE 4 | .SBTTL GLOBAL SYMBOLS 5 | ;ENTRY POINTS DEFINED HERE & REFERENCED EXTERNALLY 6 | 7 | .GLOBL DTABEL,INIINI,ARROW,DTABML,ERAMIS 8 | .GLOBL MAKMAP,DSPMRK,MOVCUR,MOVMIS,ERAMRK 9 | .GLOBL DTABMS,NUMOUT,DSPNUM,MISUPD,ERACIT 10 | .GLOBL MISTIP,MISTRA,BLEWIT,ERAABM,ONEMIS 11 | .GLOBL DACITY,ATRMSG,PRSCRO,NUHICK,DPLANO 12 | .GLOBL BLNKAR,WSTAMP,CMDRAW,CMERAS,BONCIT 13 | .GLOBL GETINI,DSPHSC,DSPHI,DTABER,ACTCUR 14 | .GLOBL DEACUR,INILIT,DSPSCO 15 | 16 | .SBTTL VARIABLES DEFINED EXTERNALLY 17 | 18 | .GLOBL CHKSM7,CHKSM9,CHKSM5 19 | .GLOBL TBHD,FRAME,ATRACT,NUMPLA,FIRESW 20 | .GLOBL COL000,ABOPV,ABOPH,NMMISB,OPTIO2 21 | .GLOBL ABCPVH,ABCPHH,MISIND,CRCPHL,CRCPHH,CRCPVH 22 | .GLOBL ABTAH,ABTAV,J,CICPV,CICPH,MBCPV,MBCPH 23 | .GLOBL TRIPLE,PLAYUP,K,COCKTA,WAVENO,ABVEHL 24 | .GLOBL ABVEVL,ABVEHH,ABVEVH,CILEFT,CIBITS,$$CRDT 25 | .GLOBL OPTION,SETUPC,LSCORL,LSCORM,LSCORH,TBVD,STATE 26 | .GLOBL PAUST,BONINL,BONINH,NXTSTA,ICBTOL,COL001,BLINKS,SWSTAT 27 | 28 | .SBTTL VARIABLES DEFINED HERE AND REFERENCED EXTERNALLY 29 | 30 | .GLOBL CMOTAB,PATRN1,SAVEX,BASEMP,BASLOW,OLDPOS 31 | .GLOBL RA,NWSTMP,QCHKS7,QCHKS9,QCHKS5 32 | .PAGE 33 | .SBTTL BASE PAGE 34 | .BSECT W3DSUP 35 | 36 | NWSTMP: .BLKB 2 ;STAMP DESTINATION 37 | RA: .BLKB 1 38 | SCRCH1: .BLKB 1 39 | SCRCH2: .BLKB 1 40 | FLAG: .BLKB 1 41 | OLDPOS: .BLKB 2 ;SCREEN POINTER 42 | NOBKGD: .BLKB 1 ;DON'T ERASE BACKGROUND FLAG 43 | OLDCPH: .BLKB 1 ;OLD CURSOR POSITION 44 | OLDCPV: .BLKB 1 45 | PATRN1: .BLKB 1 ;COLOR REGISTERS 46 | PATRN0: .BLKB 1 47 | STMPLO: .BLKB 2 ;STAMP LOOKUP DATA POINTER 48 | UCVTAB: .BLKB CURLEN ;UNDER CURSOR DATA ARRAYS 49 | UCHTAB: .BLKB CURLEN 50 | MESAGE: .BLKB 2 51 | MSPOS: .BLKB 2 ;SCREEN MESSAGE POINTER 52 | MGNFYV: .BLKB 1 ;MAGNIFICATION MULTIPLIERS 53 | MGNFYH: .BLKB 1 54 | SAVEX: .BLKB 1 ;TEMP STORAGE 55 | SAVEY: .BLKB 1 56 | SCRTAB: .BLKB 1 ;INDEX INTO SCROLL TABLES MESDAT&MESTYPE 57 | SCRCHA: .BLKB 1 ;# OF CHARACTER IN MESSAGE TO DISPLAY 58 | BETMES: .BLKB 1 ;# OF FRAMES LEFT TO DELAY BETWEEN MSGS. 59 | SPMESA: .BLKB 1 ;BUCKET FOR SPECIAL MSG # 60 | NUMCRE: .BLKB 1 ;# OF CREDIT LAST TIME THRU SCROLL 61 | LITRAL: .BLKB 2 ;POINTER TO LANG TABLE 62 | INITAL: .BLKB 3*5 ;INITIALS ARRAY 63 | HSCORL: .BLKB 3*5 ;HIGH SCORE LSB 64 | HSCORM =HSCORL+1 65 | HSCORH =HSCORM+1 ;HIGH SCORE MSB 66 | .PAGE 67 | .CSECT W3DSUP 68 | .SBTTL CURSOR ROUTINES 69 | ;PARAMETERS INPUT: 70 | ; 71 | ;CRCPHH & CRCPVH = ADDRESS OF NEW CURSOR POSITION 72 | ;OLDPHH & OLDPVH = ADDRESS OF OLD CURSOR POSITION 73 | ;OUTPUT PARAMETERS A,X,Y ARE DESTROYED 74 | ;SCREEN UPDATED 75 | 76 | .REPT 0 77 | ;FUNCTION: RESTORE DOTS ON SCREEN COVERED BY CURSOR 78 | ;INPUTS: OLPPHH & OLDPVH=POSITION ON SCREEN TO BE RESTORED 79 | ; UCHTAB=LABEL FOR 5 BYTE LOOKUP TABLES THAT CONTAINS DATA 80 | ; COVERED BY HORIZONTAL LINE OF CURSOR. 81 | ; UCVTAB=LABEL FOR 5 BYTE LOOKUP TABLES THAT CONTAINS DATA 82 | ; COVERED BY VERTICAL LINE OF CURSOR. 83 | ;OUTPUTS: X,Y & A DESTROYED 84 | ;SCREEN UPDATED 85 | .ENDR 86 | MOVCUR: 87 | LDA I,CURCOL 88 | JMP GENCUR 89 | ERACUR: LDA I,BCKGND ;ERASE CURSOR 90 | GENCUR: STA J 91 | LDA OLDCPV 92 | CMP I,18 93 | IFCS 94 | CLC 95 | ADC I,CURLEN/2 96 | EOR I,0FF ;POINT TO TOP OF VERTICAL LINE 97 | STA OLDPOS+1 98 | LDA OLDCPH 99 | STA OLDPOS 100 | SEC 101 | SBC I,CURLEN/2 102 | STA SCRCH1 103 | LDA OLDCPV 104 | EOR I,0FF 105 | STA SCRCH1+1 106 | LDA CRCPVH 107 | CMP I,18 108 | IFCS 109 | STA OLDCPV 110 | CLC 111 | ADC I,CURLEN/2 112 | EOR I,0FF 113 | STA NWSTMP+1 114 | LDA CRCPHH 115 | STA OLDCPH 116 | STA NWSTMP 117 | SEC 118 | SBC I,CURLEN/2 119 | STA STMPLO 120 | LDA CRCPVH 121 | EOR I,0FF 122 | STA STMPLO+1 123 | LDY I,CURLEN-1 124 | LDX I,0 125 | BEGIN 126 | LDA NX,SCRCH1 127 | AND I,0E0 128 | CMP I,CURCOL 129 | IFEQ 130 | LDA AY,UCHTAB 131 | STA NX,SCRCH1 132 | THEN 133 | 134 | LDA NX,OLDPOS ;DON'T RESTORE OVER NON-CURSOR STUFF. 135 | AND I,0E0 136 | CMP I,CURCOL 137 | IFEQ 138 | LDA AY,UCVTAB ;GET LOOK-UP DATA 139 | STA NX,OLDPOS ;STORE IN SCREEN RAM 140 | THEN 141 | INC SCRCH1 ;POINT TO RIGHTER SCREEN ADDRESS 142 | INC OLDPOS+1 ;POINT TO LOWER SCREEN ADDRESS 143 | DEY 144 | MIEND ;DONE 145 | .REPT 0 146 | ;SAVE UNDER CURSOR 147 | ;FUNCTION: SAVE DOTS THAT CURSOR WILL COVER SO THEY CAN BE RESTORED LATER 148 | ;INPUTS: CRCPHH & CRCPVH=ADDRESS OF BYTES TO BE SAVED 149 | ;OUTPUTS: A,X,Y ARE DESTROYED 150 | ; UCVTAB=TABLE OF BYTES UNDER VERTICAL CURSOR LINE 151 | ; UCHTAB=TABLE OF BYTES UNDER HORIZ CURSOR LINE 152 | .ENDR 153 | LDY I,CURLEN-1 154 | LDX I,0 155 | BEGIN 156 | LDA NX,NWSTMP 157 | STA AY,UCVTAB 158 | LDA J 159 | STA NX,NWSTMP 160 | INC NWSTMP+1 161 | LDA NX,STMPLO 162 | STA AY,UCHTAB 163 | LDA J 164 | STA NX,STMPLO 165 | INC STMPLO 166 | DEY 167 | MIEND 168 | THEN 169 | THEN 170 | RTS 171 | QCHKS5: .BYTE CHKSM5 172 | .PAGE 173 | .SBTTL ACTIVATE CURSOR 174 | 175 | ACTCUR: 176 | LDA I,80 177 | STA OLDCPH 178 | STA CRCPHH 179 | LDA I,50 180 | STA OLDCPV 181 | STA CRCPVH ;NEW POSITION 182 | LDA I,BCKGND ;LOAD IN COLOR 183 | LDX I,CURLEN*2-1 184 | BEGIN 185 | STA ZX,UCVTAB ;STORE INTO UNDER CURSOR ARRAY 186 | DEX 187 | MIEND 188 | RTS 189 | 190 | .SBTTL DEACTIVATE CURSOR 191 | 192 | DEACUR: 193 | JSR ERACUR ;ERASE CURSOR 194 | LDA I,0 195 | STA CRCPVH ;DEACTIVATE IT 196 | STA OLDCPV 197 | RTS 198 | .PAGE 199 | .SBTTL MARKER ROUTINES 200 | ;X & Y PRESERVED 201 | 202 | DSPMRK: STX SAVEX ;SAVE REGISTERS 203 | LDA I,FLASH ;MARKER COLOR 204 | STA PATRN1 205 | LDA CRCPVH ;GET CURSOR POSITION 206 | EOR I,0FF 207 | SEC 208 | SBC I,2 ;POINT TO TOP OF 209 | STA OLDPOS+1 ;MARKER 210 | STA NWSTMP+1 211 | LDA CRCPHH 212 | JMP GENMRK 213 | 214 | 215 | 216 | .REPT 0 217 | INPUTS 218 | MISIND = INDEX INTO TARGET ARRAYS 219 | ABTAV = ABM TARGET ARRAY, VERTICAL 220 | ABTAH = ABM TARGET ARRAY, HORIZONTAL 221 | 222 | OUTPUTS: SCREEN UPDATE 223 | X,Y SAVED 224 | .ENDR 225 | 226 | ERAMRK: STX SAVEX 227 | LDA I,BCKGND ;COLOR TO ERASE MARKER 228 | STA PATRN1 229 | LDX Z,MISIND ;INDEX INTO TARGET ARRAY 230 | LDA AX,ABTAV ;GET VERT COORD 231 | EOR I,0FF 232 | SEC 233 | SBC I,2 ;POINT TO TOP OF MARKER 234 | STA OLDPOS+1 235 | STA NWSTMP+1 236 | LDA AX,ABTAH ;GET HORIZ COORD 237 | GENMRK: CLC 238 | ADC I,2 ;POINT TO RIGHT EDGE 239 | STA OLDPOS ;OF MARKER 240 | SEC 241 | SBC I,4 ;POINT TO LEFT EDGE 242 | STA NWSTMP ;OF MARKER 243 | LDX I,0 244 | LDA I,4 ;MARKER HEIGHT 245 | STA J ;USE AS COUNTER 246 | LDA PATRN1 ;GET COLOR 247 | BEGIN 248 | STA NX,OLDPOS 249 | STA NX,NWSTMP 250 | INC OLDPOS+1 ;POINT DOWN AND 251 | DEC OLDPOS ;TO THE LEFT 252 | INC NWSTMP+1 ;POINT DOWN AND TO THE RIGHT 253 | INC NWSTMP 254 | DEC J ;DONE? 255 | MIEND 256 | LDX SAVEX ;RESTORE X AND Y 257 | RTS 258 | .PAGE 259 | .SBTTL PLAYER ARROWS 260 | ;FUNCTION ARROW DISPLAY ARROW POINTING TO PLAYER UP 261 | ;INPUT3: MUMPLA: POINTS TO WHICH PLAYER 262 | ;IS UP 0=PLAYER1, 1=PLAYER2 263 | ;OUTPUT: SCREEN UPDATED 264 | SLAROW =33. ;ARROW STAMP #'S 265 | SRAROW =34. 266 | ARROW: LDY I,BLUE 267 | BARROW: LDA PLAYUP 268 | JSR OUTARO ;PLAYER UP GETS A BLUE ARROW 269 | LDY I,BCKGND 270 | LDA PLAYUP 271 | EOR I,1 ;OTHER PLAYER'S ARROW GETS ERASED 272 | OUTARO: 273 | STY PATRN1 ;ARROW OR BACKGOUND COLOR 274 | TAX ;PLAYER ARROW INDEX 275 | LDA AX,SARONO 276 | PHA 277 | LDA AX,AROHOR 278 | TAX ;X COORD 279 | LDY I,STOPLI ;Y COORD 280 | PLA ;STAMP # 281 | JMP WSTAMP ;WRITE ARROW 282 | SARONO: .BYTE SLAROW,SRAROW ;LEFT & RIGHT ARROWS 283 | AROHOR: .BYTE 4D,0A8 284 | BLNKAR: ;BLINK ARROW 285 | LDA BLINKS 286 | IFEQ 287 | JSR ARROW ;ARROW ON 288 | ELSE 289 | LDY I,BCKGND 290 | JSR BARROW ;ARROW OFF 291 | THEN 292 | RTS 293 | .PAGE 294 | .SBTTL WRITE A STAMP 295 | ;INPUT: ACC=STAMP # 296 | ; X=HORIZ LOC FOR STAMP 297 | ; Y=VERT LOC FOR STAMP 298 | ; PATRN1=FOREGROUND PATTERN 299 | ; PATRN0=BACKGROUND PATTERN 300 | ; 301 | ;OUTPUT:STMPLO(2)=LOC OF STAMP 302 | ; NWSTMP(2)=LOC ON SCREEN (X,^CY) 303 | ISTMPL: .WORD LETTER-8 304 | ISTMPH =ISTMPL+1 305 | WSTAMP: 306 | STA STMPLO 307 | STX NWSTMP ;X SCREEN COORD 308 | TYA 309 | STA NWSTMP+1 ;Y SCREEN COORD 310 | LDA I,0 ;(STAMP # X 8) + LOC OF 1ST STAMP 311 | STA STMPLO+1 312 | LDA I,-1 313 | STA NOBKGD ;LEAVE BACKGROUND 314 | ASL STMPLO 315 | ROL STMPLO+1 316 | ASL STMPLO 317 | ROL STMPLO+1 318 | ASL STMPLO 319 | ROL STMPLO+1 320 | LDA A,ISTMPL 321 | CLC 322 | ADC STMPLO 323 | STA STMPLO 324 | LDA A,ISTMPH 325 | ADC STMPLO+1 326 | STA STMPLO+1 ;=LOC OF STAMP TO WRITE 327 | ;FALL INTO STMPX1 328 | .SBTTL OUTPUT A STAMP 329 | ;PARAMETERS NWSTMP & NWSTMP+1 = ADDRESS OF NEW STAMP ON SCREEN 330 | ;MGNFH&V=HORIZ & VERT MAGNIFICATION FACTORES FOR STAMP 331 | ;PATRN0 & PATRN1 = BIT PATTERNS OF THE COLORS TO BE OUTPUT 332 | ;STMPLO = ADDRESS OF UPPER LEFT CORNER OF STAMP IN LOOK UP TABLE 333 | ;NOBKGD=0 IF WRITE OVER BACKGROUND, -1 IF LEAVE IT ALONE 334 | ;COCKTA: D6=1 FOR FLIP, 0 FOR REGULAR 335 | ;OUTPUT A,X & Y ARE DESTROYED 336 | ;OLDPOS & J ARE DESTROYED 337 | ;SCREEN UPDATED 338 | 339 | STMPX1: LDA I,1 340 | STA MGNFYH 341 | STA MGNFYV 342 | STMPOT: LDY I,7 ;BYTE COUNTER FOR LOOKUP TABLE 343 | LDA NWSTMP+1 344 | CLC 345 | ADC I,4 ;POINT TO TOP OF STAMP 346 | EOR I,0FF 347 | STA OLDPOS+1 348 | BEGIN 349 | LDA MGNFYV 350 | STA SCRCH2 351 | BEGIN 352 | LDA NWSTMP 353 | SEC 354 | SBC I,4 355 | BIT COCKTA 356 | IFVS ;COCKTAIL FLIP? 357 | EOR I,0FF ;YES 358 | THEN 359 | STA OLDPOS 360 | LDX I,0 361 | LDA I,7 ;BIT COUNTER 362 | STA J 363 | LDA NY,STMPLO ;GET LOOKUP DATA 364 | BEGIN 365 | ASL ;SHIFT! 366 | PHA 367 | LDA MGNFYH 368 | STA SCRCH1 ;RESET HORIZ MAGNIFICATION FACTOR 369 | LDA PATRN1 370 | IFCC 371 | LDA NOBKGD 372 | IFMI 373 | LDA NX,OLDPOS ;DON'T ERASE BACKGROUND 374 | ELSE 375 | LDA PATRN0 ;DO ERASE 376 | THEN 377 | THEN 378 | BEGIN 379 | STA NX,OLDPOS 380 | BIT COCKTA ;COCKTAIL FLIP? 381 | IFVS 382 | DEC OLDPOS ;YES 383 | ELSE 384 | INC OLDPOS ;NO 385 | THEN 386 | DEC SCRCH1 387 | EQEND 388 | PLA 389 | DEC J ;DONE? 390 | MIEND 391 | INC OLDPOS+1 392 | DEC SCRCH2 393 | EQEND 394 | DEY ;POINT TO NEXT BYTE IN LOOKUP TABLE 395 | MIEND 396 | RTS 397 | .PAGE 398 | .SBTTL ERASE A MISSILE TRAIL 399 | ;INPUT: MISIND=INDEX OF MISSILE TRAIL TO ERASE 400 | ; ABOPH(Y) AND ABOPV(Y)=MISSILE TRAIL START POINT 401 | ; ABCPHH(Y) AND ABCPVH(Y)=MISSILE TRAIL CURRENT LOC 402 | ; ABVEHL,HH,VL,VH(Y)=DELTA X AND Y OF MISSILE TRAIL 403 | ;OUTPUT: X,Y PRESERVED 404 | ; ACC,J,K,OLDPVH,OLDPHH,SCRCH1,SCRCH2,RA,NWSTMP(2), 405 | ; SAVEX,SAVEY ARE DESTROYED 406 | ; TRAIL ERASED 407 | ; 408 | ERAMIS: 409 | STX SAVEX 410 | STY SAVEY 411 | LDY MISIND 412 | LDA I,0 413 | STA J ;LSB ORIGIN=0 414 | LDA I,0FF 415 | STA K 416 | LDA AY,ABOPV 417 | EOR I,0FF 418 | STA OLDPOS+1 ;VERT START 419 | LDA AY,ABOPH 420 | STA OLDPOS ;HORIZ START 421 | LDA AY,ABVEHL 422 | STA SCRCH1 ;LSB HORIZ DELTA 423 | LDA AY,ABVEVL 424 | STA SCRCH2 ;LSB VERT DELTA 425 | LDA AY,ABVEHH 426 | STA NWSTMP ;MSB HORIZ DELTA 427 | LDA AY,ABVEVH 428 | STA NWSTMP+1 ;MSB VERT DELTA 429 | LDA AY,ABCPVH ;VERT ENDPOINT 430 | EOR I,0FF 431 | STA RA 432 | CMP OLDPOS+1 433 | IFNE ;SOMETHING TO ERASE? 434 | LDX I,0 ;YES. CLEAR FOR STA NX 435 | BEGIN ;ERASE EACH DOT FROM ORIGIN TO CURRENT POS 436 | LDA I,BCKGND 437 | STA NX,OLDPOS ;ERASE NEXT DOT 438 | LDA J 439 | CLC 440 | ADC SCRCH1 441 | STA J ;NEXT LSB HORIZ 442 | LDA OLDPOS 443 | ADC NWSTMP 444 | STA OLDPOS ;NEXT MSB HORIZ 445 | LDA K 446 | SEC 447 | SBC SCRCH2 448 | STA K ;NEXT LSB VERT 449 | LDA OLDPOS+1 450 | SBC NWSTMP+1 451 | STA OLDPOS+1 ;NEXT MSB VERT 452 | CMP I,TOPSCV 453 | BCC ERABY ;DON'T LET IT RUN RAMPANT THRU STACK 454 | CMP RA 455 | EQEND ;ENDLOOP IF AT CURRENT POSITION 456 | LDA I,BCKGND ;ERASE DOT AT CURRENT POSITION 457 | STA NX,OLDPOS 458 | THEN 459 | ERABY: LDX SAVEX 460 | LDY SAVEY 461 | RTS 462 | .PAGE 463 | .SBTTL MISSILE TIPS & TRAIL 464 | MISTIP: 465 | LDY MISIND 466 | LDA I,FLASH ;TIP OF MISSILE TRAIL IS FLASH 467 | JMP MOVMIS 468 | 469 | MISTRA: 470 | LDA I,BLUE ;MAY BE ABM 471 | LDY MISIND 472 | CPY I,NABMS 473 | IFCS 474 | LDA I,REDMIS ;ITS AN ICBM 475 | THEN 476 | MOVMIS: STA PATRN1 477 | STX J 478 | LDA Y,ABCPHH ;POINT TO LEADING EDGE OF MISSILE TO BE UPDATED 479 | STA OLDPOS 480 | LDA Y,ABCPVH 481 | EOR I,0FF 482 | STA OLDPOS+1 483 | LDA PATRN1 484 | LDX I,0 485 | STA NX,OLDPOS ;OUTPUT DOT 486 | LDX J 487 | RTS 488 | .PAGE 489 | .SBTTL COASTLINE OUTPUT 490 | MAKMAP: 491 | LDX I,7 ;BLACKEN ENTIRE SCREEN FOR SETUP 492 | LDA I,CBLACK 493 | BEGIN 494 | STA X,COL000 495 | DEX 496 | MIEND 497 | JSR BLEWIT ;STORE BACKGROUND COLOR TO ENTIRE SCREEN 498 | JSR COAST ;GO DRAW COASTLINE 499 | JSR ALLCIT ;GO DRAW CITIES 500 | JSR SETCOL ;SET UP COLOR ARRAY 501 | INILIT: LDA OPTION ;SET UP LANGUAGE TABLE POINTER 502 | LSR 503 | LSR 504 | LSR 505 | LSR 506 | AND I,06 507 | TAY 508 | LDA AY,LNGPTL 509 | STA LITRAL 510 | LDA AY,LNGPTL+1 511 | STA LITRAL+1 512 | LDA I,0 513 | LDY OPTIO2 514 | IFMI ;COCKTAIL TABLE? 515 | ORA I,COCMSK ;YES 516 | LDY PLAYUP 517 | IFNE ;2ND PLAYER? 518 | ORA I,CFLMSK!FLIPHS ;YES 519 | THEN 520 | THEN 521 | STA COCKTA 522 | RTS 523 | .PAGE 524 | .SBTTL ERASE CITY 525 | 526 | ;INPUT: X=INDEX OF CITY TO ERASE 527 | 528 | ERACIT: LDX AY,CICPH 529 | LDA AY,CICPV 530 | TAY 531 | LDA I,0 ;PATTERNS 532 | BEQ FLPCIT ;DRAW CITY 533 | ; 534 | .SBTTL DRAW ALL LIVING CITIES 535 | 536 | ;INPUT: CILEFT(2)=BIT SET FOR EACH LIVE CITY 537 | ; CICPV&H=CITY LOCS 538 | ; PLAYUP=PLAYER UP 539 | 540 | ALLCIT: LDY I,NCITY-1 541 | STY K 542 | BEGIN ;LOOP FOR EACH CITY 543 | LDY PLAYUP 544 | LDA AY,CILEFT 545 | LDY K 546 | AND AY,CIBITS 547 | IFNE ;ALIVE? 548 | LDX AY,CICPH ;YES. HORIZ 549 | LDA AY,CICPV ;VERT 550 | TAY 551 | LDA I,CITCLB+;TOP & BOTTOM PAT 552 | JSR FLPCIT ;DRAW 553 | THEN 554 | DEC K 555 | MIEND 556 | RTS 557 | FLPCIT: PHA 558 | LDA COCKTA ;INDEX FLIP REQUEST 559 | AND I,^CFLIPHS 560 | STA COCKTA 561 | PLA 562 | JSR DACITY ;DRAW CITY 563 | LDA COCKTA 564 | AND I,CFLMSK 565 | IFNE 566 | ORA I,FLIPHS!COCMSK ;RESTORE FLIP REQUEST 567 | STA COCKTA 568 | THEN 569 | RTS 570 | .PAGE 571 | .SBTTL DRAW ONE CITY AT REQUESTED LOC 572 | 573 | ;INPUT: X=H LOC OF CITY CENTER 574 | ; Y=V LOC OF CITY CENTER 575 | ; ACC(D7-D4)=COLOR OF CITY BOTTOM 576 | ; ACC(D3-D0)=COLOR OF CITY TOP 577 | ;OUTPUT:X,Y,ACC,MESAGE(2),MSPOS(2),FLAG DESTROYED 578 | 579 | DACITY: STX MESAGE 580 | STY MESAGE+1 581 | STA MSPOS ;CITY BOTTOM COLOR 582 | ASL 583 | ASL 584 | ASL 585 | ASL 586 | STA MSPOS+1 ;CITY TOP COLOR 587 | LDX I,3 588 | STX FLAG 589 | BEGIN ;LOOP FOR EACH CITY STAMP 590 | LDX FLAG 591 | LDY AX,CSTCOL 592 | LDA AY,MSPOS 593 | STA PATRN1 ;FOREGROUND PATTERN 594 | LDY MESAGE+1 ;VERT 595 | LDA AX,CSTNUM ;STAMP # 596 | PHA 597 | LDA MESAGE 598 | CLC 599 | ADC AX,CSTHOF ;HORIZ LOC 600 | TAX 601 | PLA 602 | JSR WSTAMP ;DRAW CITY STAMP 603 | DEC FLAG 604 | MIEND 605 | RTS 606 | ;CITY STAMPS= LEFT TOP,LEFT BOTTOM,RIGHT TOP,RIGHT BOTTOM 607 | CSTCOL: .BYTE 1,0,1,0 608 | CSTNUM: .BYTE 1E,1D,20,1F 609 | CSTHOF: .BYTE -4,-4,4,4 610 | .PAGE 611 | .SBTTL DRAW MISSILE 612 | ;INPUT: X=# OF MISSILE TO DRAW 613 | ; ACC=COLOR PATTERN FOR MISSLE 614 | ; MISTBH(X)=OFFSET FROM MISSILE POSITION (MBCPH&V) 615 | ; MISTBV(X)=OF TOP MISSILE 616 | ; Y=# OF MISSILE BASE AT WHICH TO DRAW MISSILE 617 | ; MBCPH(Y)=COORDINATES OF TOP CENTER OF MISSLE BASE 618 | ; MBCPV(Y) 619 | ;OUTPUT: X,Y IS PRESERVED 620 | ; MISSILE IS DRAWN (OR ERASED) ON SCREEN 621 | ; SET DISPLAY COORDINATES FOR MISSILE 622 | ; HORIZ=MBCPH(Y)+MISTBH(X) 623 | ; VERT=MBCPV(Y)+MISTBV(X) (INVERT) 624 | ; SET COUNTER FOR 3 DOT HIGH MISSILE 625 | ; LOAD COLOR 626 | ; BEGIN 627 | ; OUTPUT COLOR 628 | ; DECREMENT VERTICAL COORDINATE 629 | ; DECREMENT COUNTER 630 | ; ENDLOOP IF DONE WITH MISSILE 631 | 632 | ERAABM: LDX AY,NMMISB ;ERASE AN ABM FROM THE BASE 633 | INX 634 | LDA I,YELLOW 635 | DRAMIS: 636 | CLC 637 | PHA 638 | LDA AY,MBCPH 639 | ADC AX,MISTBH-1 640 | STA OLDPOS 641 | CLC 642 | LDA AY,MBCPV 643 | ADC AX,MISTBV-1 644 | EOR I,0FF 645 | STA OLDPOS+1 646 | PLA 647 | ONEMIS: LDX I,0 648 | STA NX,OLDPOS 649 | INC OLDPOS+1 650 | STA NX,OLDPOS 651 | INC OLDPOS+1 652 | STA NX,OLDPOS 653 | INC OLDPOS+1 654 | STA NX,OLDPOS 655 | DEC OLDPOS 656 | STA NX,OLDPOS 657 | INC OLDPOS+1 658 | STA NX,OLDPOS 659 | INC OLDPOS 660 | INC OLDPOS 661 | STA NX,OLDPOS 662 | DEC OLDPOS+1 663 | STA NX,OLDPOS 664 | RTS 665 | MISTBV: .BYTE 2,-1,-1,-4,-4,-4,-7,-7,-7,-7 666 | MISTBH: .BYTE 0,-3,3,-6,0,6,-3,3,-9,9 667 | .PAGE 668 | .SBTTL BASE STATUS MESSAGES 669 | ;INPUT: ACC=BASE INDEX 670 | ;OUTPUT:X,Y PRESERVED 671 | 672 | BASLOW: 673 | STX SAVEX 674 | STY SAVEY 675 | TAX 676 | LDA AX,MBALOW 677 | BIT COCKTA 678 | IFVS ;FLIP? 679 | LDA AX,CMBALOW ;YES. USE OPPOSIT BASE'S PTRS 680 | THEN 681 | JMP GENBAS 682 | 683 | BASEMP: 684 | STA RA 685 | STX SAVEX 686 | STY SAVEY 687 | TAX 688 | LDA AX,MBALOW 689 | BIT COCKTA 690 | IFVS ;FLIP? 691 | LDA AX,CMBALOW ;YES. USE OPPOSITE BASE'S PTRS 692 | THEN 693 | JSR DTABER 694 | LDX RA 695 | LDA AX,MBAEMP 696 | BIT COCKTA 697 | IFVS 698 | LDA AX,CMBAEMP 699 | THEN 700 | GENBAS: JSR DTABMS 701 | LDX SAVEX 702 | LDY SAVEY 703 | RTS 704 | 705 | MBAEMP: .BYTE MB1EMP,MB2EMP,MB3EMP 706 | MBALOW: .BYTE MB1LOW,MB2LOW,MB3LOW 707 | CMBAEMP:.BYTE MB3EMP,MB2EMP,MB1EMP 708 | CMBALOW:.BYTE MB3LOW,MB2LOW,MB1LOW 709 | .PAGE 710 | .SBTTL UPDATE MISSILE BASE DISPLAY 711 | ;INPUT: MAXMIS=(CONSTANT) MAXIMUM # OF MISSILES/BASE 712 | ; Y=# OF MISSILE BASE 713 | ; NMMISB(Y)=# OF MISSILES IN BASE 714 | ; NBCPH(Y)=COORDINATES OF MISSILE BASE 715 | ; MBCPV(Y)= (TOP CENTER) 716 | ;OUTPUT: ACC,X DESTROYED Y,PRESERVED 717 | ; SCREEN UPDATED TO SHOW MISSILES AT THE BASE 718 | ; IF # OF MISSILES IN BASE=MAXIMUM 719 | ; SET MISSILE COUNTER TO MAXIMUM # 720 | ; SET COLOR=MISSILE COLOR 721 | ; BEGIN 722 | ; DRAW MISSILE INICATED BY COUNTER 723 | ; DECREMENT MISSILE COUNT 724 | ; END OF NO MORE MISSILE 725 | ; ELSE 726 | ; SET CLOR=BACKGROUND COLOR 727 | ; DRAW MISSILE INDICATED BY # OF MISSILE IN BASE 728 | ; (ERASES LAST MISSILE) 729 | ; ENDIF 730 | MISUPD: LDX AY,NMMISB 731 | IFNE 732 | BEGIN 733 | STX RA 734 | LDA I,ABMCOL 735 | JSR DRAMIS 736 | LDX RA 737 | DEX 738 | EQEND 739 | THEN 740 | RTS 741 | .PAGE 742 | .SBTTL DRAW COAST 743 | ;MAKMAP - MAKE A MAP OF COASTLINE 744 | ;INPUTS - MAPTAB=TABLE FOR DRAWING THE GREEN COASTLINE 745 | ;OUTPUTS - A,X,Y DESTROYED 746 | ; SCREEN UPDATED 747 | COAST: LDX I,0 748 | LDY I,0 749 | LDA I,0E6 750 | STA OLDPOS+1 751 | BEGIN 752 | LDA AY,MAPTAB 753 | STA OLDPOS 754 | INY 755 | BEGIN 756 | LDA I,YELLOW 757 | STA NX,OLDPOS 758 | LDA OLDPOS 759 | CMP AY,MAPTAB 760 | INC OLDPOS 761 | CSEND 762 | INY 763 | LDA AY,MAPTAB 764 | CMP I,0FF 765 | IFEQ 766 | INY 767 | CPY I,EOMAP-MAPTAB+1 768 | IFCS ;END OF TABLE? 769 | LDY I,EOMAP-MAPTAB ;YES. REPEAT LAST ENTRY 770 | THEN 771 | INC OLDPOS+1 772 | THEN 773 | EQEND 774 | RTS 775 | .PAGE 776 | .SBTTL COAST MAP 777 | MAPTAB: .BYTE 0C,0D,1D,1E,75,76,81,82,0E9,0EA,0FA,0FB,0FF 778 | .BYTE 0B,0E,1C,1F,75,77,80,83,0E7,0EA,0F9,0FC,0FF 779 | .BYTE 0A,20,74,84,0E6,0FD,0FF 780 | .BYTE 09,21,73,84,0E6,0FE,0FF 781 | .BYTE 08,22,73,85,0E5,0FE,0FF 782 | .BYTE 06,23,72,85,0E4,0FE,0FF 783 | .BYTE 05,23,71,86,0AC,0BB,0E3,0FE,0FF 784 | .BYTE 04,24,38,39,70,87,0AB,0BC,0E2,0FE,0FF 785 | .BYTE 03,25,37,3A,6F,87,0AA,0BD,0E1,0FF,0FF 786 | .BYTE 01,26,32,3B,6B,98,0A8,0BD,0DF,0FF,0FF 787 | .BYTE 0,3C,49,58,67,0C0,0DE,0FE,0FF 788 | .BYTE 0,5A,65,0FF,0FF 789 | .BYTE 0,5C,64,0FF,0FF 790 | EOMAP: .BYTE 0,0FF,0FF 791 | .PAGE 792 | .SBTTL SET UP COLORS FOR NEXT WAVE 793 | ;INPUT: WAVENO=CURRENT WAVE # 794 | ;OUTPUT: COL000 THRU COL111 UPDATED 795 | ; ACC,X,Y DESTROYED 796 | ; 797 | SETCOL: LDA WAVENO 798 | SEC 799 | SBC I,1 800 | LSR 801 | BEGIN 802 | CMP I,WAVEND-WAVCOL 803 | IFCS 804 | SEC 805 | SBC I,WAVEND-WAVCOL 806 | THEN 807 | CMP I,WAVEND-WAVCOL 808 | CCEND 809 | TAX 810 | LDY AX,WAVCOL 811 | LDX I,6 812 | BEGIN 813 | LDA AY,WAVCOL 814 | AND I,0F 815 | STA ZX,COL001 816 | LDA AY,WAVCOL 817 | LSR 818 | LSR 819 | LSR 820 | LSR 821 | STA ZX,COL000 822 | DEY 823 | DEX 824 | DEX 825 | MIEND 826 | RTS 827 | 828 | WAVCOL: .BYTE WV1COL-WAVCOL+3 829 | .BYTE WV5COL-WAVCOL+3 830 | .BYTE WV6COL-WAVCOL+3 831 | .BYTE WVDCOL-WAVCOL+3 832 | .BYTE WV7COL-WAVCOL+3 833 | .BYTE WV9COL-WAVCOL+3 834 | .BYTE WVACOL-WAVCOL+3 835 | .BYTE WVBCOL-WAVCOL+3 836 | .BYTE WVCCOL-WAVCOL+3 837 | .BYTE WV8COL-WAVCOL+3 838 | WAVEND: 839 | .MACRO DBLCOL A,B,C,D,E,F,G,H 840 | .BYTE A*10+B,C*10+D,E*10+F,G*10+H 841 | .ENDR 842 | WVBCOL: DBLCOL CYELLO,CGREEN,CBLACK,CWHITE,CBLACK,CYELLO,CRED,CRED 843 | WVCCOL: DBLCOL CWHITE,CRED,CPURPL,CYELLO,CPURPL,CWHITE,CGREEN,CGREEN 844 | WVDCOL: DBLCOL CBLACK,CRED,CYELLO,CYELLO,0,CGREEN,CBLUE,CBLUE 845 | WV1COL: DBLCOL CBLACK,CYELLO,CRED,CBLUGR,CRED,CBLACK,CBLUE,CBLUE 846 | WV5COL: DBLCOL CBLACK,CYELLO,CGREEN,CBLUGR,CGREEN,CBLACK,CBLUE,CBLUE 847 | WV6COL: DBLCOL CBLACK,CBLUE,CRED,CYELLO,CRED,CPURPL,CGREEN,CGREEN 848 | WV7COL: DBLCOL CBLUE,CYELLO,CRED,CPURPL,CRED,CBLUE,CBLACK,CBLACK 849 | WV8COL: DBLCOL CRED,CYELLO,CBLACK,CGREEN,CBLACK,CRED,CBLUE,CBLUE 850 | WV9COL: DBLCOL CBLUGR,CYELLO,CRED,CBLACK,CRED,CBLUGR,CBLUE,CBLUE 851 | WVACOL: DBLCOL CPURPL,CGREEN,CBLACK,CBLACK,CPURPL,CBLUGR,CYELLO,CYELLO 852 | ; 853 | ;SKY,GROUND,ICBMS,CITY(BOTTOM),UNUSED,(FLASH),UNUSED(FLASH),ABMS,CITY(TOP)&ABMS 854 | ; 855 | .PAGE 856 | .SBTTL CLEAR SCREEN 857 | CLRTOP: LDA I,06 858 | LDX I,28 859 | BNE COMCLR 860 | BLEWIT: LDX I,3D 861 | LDA I,2 862 | COMCLR: 863 | STA OLDPOS+1 864 | LDY I,0 865 | STY OLDPOS 866 | LDA I,BCKGND 867 | BEGIN 868 | BEGIN 869 | STA NY,OLDPOS 870 | INY 871 | EQEND 872 | INC OLDPOS+1 873 | DEX 874 | MIEND 875 | RTS 876 | .PAGE 877 | .SBTTL CONVERT AN ASCII VALUE TO ITS STAMP ADDRESS 878 | ;INPUT: ACC=ASCII VALUE 879 | ;OUTPUT: STMPLO(2)=ADDRESS OF STAMP ;Y PRESERVED, X DESTROYED 880 | ASCSTP: 881 | AND I,7F 882 | CMP I,41 ;CHECK FOR A NUMBER OR A LETTER 883 | IFCS 884 | AND I,3F ;ITS A LETTER 885 | LDX I,2 886 | ELSE 887 | CMP I,3A 888 | IFCS 889 | JSR SPECAR ;SPECIAL CHAR 3A-40 890 | ELSE 891 | CMP I,30 892 | IFCC 893 | JSR SPECAR ;SPECIAL CHAR BELOW 30 894 | ELSE 895 | AND I,0F ;NUMBER 896 | LDX I,0 897 | THEN 898 | THEN 899 | THEN 900 | ASL ;X8 901 | ASL 902 | ASL 903 | CLC 904 | ADC AX,ITYPE ;ADD IN TABLE OFFSET 905 | STA STMPLO 906 | LDA AX,ITYPE+1 907 | ADC I,0 908 | STA STMPLO+1 909 | RTS 910 | SPECAR: LDX I,TABCHA-SPECHA-1 911 | BEGIN 912 | CMP AX,SPECHA 913 | IFEQ 914 | LDA AX,TABCHA ;CHAR FOUND 915 | LDX I,ISPECI-ITYPE 916 | RTS 917 | THEN 918 | DEX 919 | MIEND 920 | LDA I,0 ;CHAR NOT FOUND 921 | LDX I,IBLANK-ITYPE ;DISPLAY BLANK 922 | RTS 923 | SPECHA: .BYTE 20,40,3A,3F,23,24,25 ;ASCII VALUE 924 | TABCHA: .BYTE 0,8,9,0A,0B,0C,0D ;TABLE EQUIV 925 | .SBTTL MESSAGES 926 | ;FUNCTION: DISPLAY A LITERAL ON THE SCREEN 927 | ;INPUT: MESAGE=ADDRESS OF 1ST CHAR OF LITERAL INBA=EPAGE 928 | ; (LITERAL IS ASCII STRING, END WITH D7=1 ON LAST CHAR) 929 | ; MSPOS =SCREEN COORDINATE AT WHICH TO DISPLAY 1ST CHAR 930 | ; (CENTER OF 1ST CHAR) 931 | ; MSCOL =COLOR OF MESSAGE 932 | ;OUTPUT: SCREEN UPDATED 933 | ; ACC,X,Y DESTROYED 934 | ; MSPOS POINTS TO NEXT AVAILABLE STAMP LOCATION 935 | MESOUT: LDY I,0 936 | BEGIN 937 | LDA NY,MESAGE ;LOAD IN CHARACTER TO OUTPUT 938 | STA FLAG ;SAVE IT 939 | JSR ASCSTP ;CONVERT ASCII TO STAMP LOC 940 | LDA MSPOS ;LOAD SCREEN ADDRESS OF MESSAGE 941 | STA NWSTMP 942 | LDA MSPOS+1 943 | STA NWSTMP+1 944 | TYA 945 | PHA ;SAVE INDEX 946 | JSR STMPOT ;OUTPUT CHARACTER 947 | LDA MGNFYH 948 | ASL 949 | ASL 950 | ASL 951 | CLC ;POINT TO SCREEN ADDRESS OF NEXT CHARACTER 952 | ADC MSPOS 953 | STA MSPOS 954 | PLA 955 | TAY 956 | INY ;BUMP TABLE POINTER 957 | LDA FLAG ;CHECK FOR DONE 958 | MIEND 959 | RTS 960 | ITYPE: .WORD NUMBER,LETTER-8 961 | IBLANK: .WORD BLKSTP 962 | ISPECI: .WORD SPECIC 963 | .PAGE 964 | .SBTTL SETUP MESSAGE POINTER 965 | ;INPUT: Y=MESSAGE # 966 | ; LITRAL=ADDRESS OF LANGUAGE TABLE 967 | ;OUTPUT: MESAGE(2)=ADDRESS OF 1ST CHAR OF MESSAGE 968 | ; MSPOS=HORIZ SCREEN LOC 969 | LANGAG: 970 | LDA NY,LITRAL 971 | CPY I,ENGLISH*3 972 | IFCS ;MESSAGE ALWAYS ENGLISH? 973 | LDA AY,EMTBL ;YES 974 | STA MSPOS ;HORIZ SCREEN LOC 975 | LDA AY,EMTBL+1 976 | STA MESAGE ;MESSAGE ADDRESS 977 | LDA AY,EMTBL+2 978 | ELSE 979 | STA MSPOS ;NO. HORIZ SCREEN LOC 980 | INY 981 | LDA NY,LITRAL 982 | STA MESAGE ;MESSAGE ADDRESS 983 | INY 984 | LDA NY,LITRAL 985 | THEN 986 | STA MESAGE+1 987 | RTS 988 | .PAGE 989 | .SBTTL DISPLAY TABLE MESSAGE 990 | ;FUNCTION: DISPLAYED TABLE MESSAGE 991 | ;INPUT: ACC=MESSAGE CODE # (IF MINUS, ERASE MSG) 992 | ; EMTBL:MESSAGE TABLE 993 | ;OUTPUT: MESSAGE DISPLAYED ON SCREEN 994 | ; 995 | DTABEL: LDY I,0A0 ;ERASE LINE 996 | BMI DTGEN 997 | DTABER: LDY I,80 ;ENTRY TO ERASE MSG 998 | BMI DTGEN 999 | DTABML: LDY I,0 ;WRITES OVER BKGD. 1000 | BPL DTGEN 1001 | DTABMS: 1002 | LDY I,-1 ;LEAVES BKGD INTACT 1003 | DTGEN: 1004 | STY NOBKGD 1005 | TAY 1006 | LDA AY,MAGNIF ;HORIZ MAGNIFY 1007 | AND I,0F 1008 | STA MGNFYV ;VERT MAG 1009 | LDA AY,MAGNIF 1010 | LSR 1011 | LSR 1012 | LSR 1013 | LSR 1014 | STA MGNFYH 1015 | LDA AY,VERCOR ;VERT SCREEN LOC 1016 | STA MSPOS+1 1017 | TYA 1018 | STA MSPOS 1019 | ASL 1020 | CLC 1021 | ADC MSPOS 1022 | TAY ;MESSAGE # X 3 1023 | JSR LANGAG ;SET PTR TO MSG. 1024 | LDA I,MSCOL 1025 | STA PATRN1 1026 | LDA I,BCKGND 1027 | STA PATRN0 1028 | LDA NOBKGD 1029 | CMP I,80 1030 | IFEQ ;ERASE MSG? 1031 | JMP ERAMSG 1032 | THEN 1033 | CMP I,0A0 1034 | IFEQ ;ERASE LINE? 1035 | JMP ERALIN ;YES 1036 | THEN 1037 | JMP MESOUT 1038 | LNGPTL: 1039 | .WORD EMTBL 1040 | .WORD FMTBL 1041 | .WORD GMTBL 1042 | .WORD SMTBL 1043 | .PAGE 1044 | .SBTTL DISPLAY 2 DIGIT # 1045 | ;NUMOUT: DISPLAY # ON SCREEN 1046 | ;INPUTS: A=# TO OUTPUT IN HEX 1047 | ; PATRN1=PATTERN FOR # 1048 | ; X,Y=SCREEN ADDRESS TO OUTPUT # AT 1049 | ;OUTPUTS: X,Y SAVED 1050 | ; SCREEN UPDATED 1051 | NUMOUT: STX MSPOS 1052 | STY MSPOS+1 1053 | NUMBRE: STX SAVEX 1054 | STY SAVEY 1055 | STA RA 1056 | CMP I,13 1057 | IFCC 1058 | CMP I,0A 1059 | IFCS 1060 | SEC 1061 | SBC I,0A 1062 | STA RA 1063 | LDA I,1 1064 | JSR NUMOT1 1065 | THEN 1066 | LDA RA 1067 | ELSE 1068 | LDA I,0FF 1069 | THEN 1070 | JSR NUMOT1 1071 | LDX SAVEX 1072 | LDY SAVEY 1073 | RTS 1074 | 1075 | NUMOT1: CLC 1076 | ADC I,1 1077 | ASL 1078 | ASL 1079 | ASL 1080 | CLC 1081 | ADC A,IBLANK 1082 | STA STMPLO 1083 | LDA A,IBLANK+1 1084 | ADC I,0 1085 | STA STMPLO+1 1086 | LDA MSPOS 1087 | STA NWSTMP 1088 | LDA MSPOS+1 1089 | STA NWSTMP+1 1090 | LDA I,BCKGND 1091 | STA PATRN0 1092 | LDA I,0 1093 | STA NOBKGD 1094 | JSR STMPX1 1095 | LDA MSPOS 1096 | CLC 1097 | ADC I,8 1098 | STA MSPOS 1099 | RTS 1100 | .PAGE 1101 | .SBTTL DISPLAY 6 DIGITS 1102 | ;DSPNUM 1103 | ;FUNCTION: DISPLAY 6 DECIMAL DIGITS WITH LEADING ZERO SUPPRESSION 1104 | ;INPUTS: TRIPLE - 3 BYTES OF BCD 1105 | ; X,Y=SCREEN ADDRESS TO OUTPUT AT 1106 | ; ACC=PATTERN FOR # 1107 | DSPNUM: STX MSPOS 1108 | STY MSPOS+1 1109 | STA PATRN1 1110 | LDX I,2 1111 | LDY I,0 1112 | STY FLAG 1113 | BEGIN 1114 | LDA ZX,TRIPLE 1115 | LSR 1116 | LSR 1117 | LSR 1118 | LSR 1119 | JSR BLNKCK 1120 | LDA ZX,TRIPLE 1121 | CPX I,0 1122 | IFEQ 1123 | LDY I,0FF ;FORCE PRINTING OF LSB 0 IF # IS 0 1124 | STY FLAG 1125 | THEN 1126 | AND I,0F 1127 | JSR BLNKCK 1128 | DEX 1129 | MIEND 1130 | RTS 1131 | 1132 | BLNKCK: IFNE ;NON ZERO 1133 | STA FLAG ;SET FLAG TO OUTPUT 0'S 1134 | ELSE ;ITS A ZERO 1135 | LDA I,0 1136 | LDY FLAG ;SHOULD I SUPPRESS? 1137 | IFEQ 1138 | LDA I,0FF ;YES 1139 | THEN 1140 | THEN 1141 | JMP NUMBRE 1142 | .PAGE 1143 | .SBTTL ERASE A MESSAGE 1144 | ;FUNCTION: READ THE TITLE, YOU DIP SHIT!!!! 1145 | ;INPUTS: MESSAGE=ADDRESS OF ASCIN CODES FOR THE MESSAGE 1146 | ; MSPOS=CARTESIAN COORDS OF MESSAGE 1147 | ; BCKGND=BLANK COLOR 1148 | ;OUTPUTS: MESSAGE ERASED 1149 | ; A,X,Y,K,J ARE NUKED 1150 | ; 1151 | ERALIN: LDA I,4 ;ERASE WHOLE LINE 1152 | STA MSPOS 1153 | LDY I,20 1154 | BNE ERAGEN 1155 | ERAMSG: LDY I,0FF 1156 | BEGIN 1157 | INY ;COUNT # OF CHARS TO BLANK 1158 | LDA NY,MESAGE ;AT THE END OF MESSAGE? 1159 | MIEND 1160 | INY 1161 | ERAGEN: STY K 1162 | ASL K 1163 | DEC K 1164 | LDA MSPOS 1165 | SEC 1166 | SBC I,4 1167 | BIT COCKTA 1168 | IFVS 1169 | EOR I,0FF 1170 | THEN 1171 | STA MSPOS 1172 | LDA MSPOS+1 ;GET VERT COORDINATE 1173 | EOR I,0FF ;CHANGE COORDINATE SYSTEMS 1174 | SEC 1175 | SBC I,4 ;POINT TO TOP OF LETTER 1176 | STA MSPOS+1 1177 | LDA I,7 ;HEIGHT OF LETTERS 1178 | STA J ;SAVE IT 1179 | LSR MSPOS+1 1180 | ROR MSPOS 1181 | LSR MSPOS+1 1182 | ROR MSPOS 1183 | BIT COCKTA 1184 | IFVS ;FLIP? 1185 | LDA MSPOS ;YES. START AT END 1186 | SEC 1187 | SBC K 1188 | STA MSPOS 1189 | THEN 1190 | BEGIN 1191 | LDY K ;RELOAD WIDTH 1192 | BEGIN 1193 | LDA I,BCKGND ;BLANK COLOR CODE 1194 | STA NY,MSPOS ;WRITE 4 BLANK DOTS 1195 | DEY 1196 | MIEND 1197 | LDA MSPOS 1198 | CLC 1199 | ADC I,40 1200 | STA MSPOS 1201 | IFCS 1202 | INC MSPOS+1 1203 | THEN 1204 | DEC J ;DONE? 1205 | MIEND 1206 | RTS 1207 | .PAGE 1208 | .SBTTL PROCESS NEW CHARS ON SCROLL LINE 1209 | PRSCRO: ;1 ST MAKE SURE MSGS ARE UP TO DATE 1210 | LDA I,0 ;UNFLIP SCREEN 1211 | STA PLAYUP 1212 | LDA COCKTA 1213 | AND I,COCMSK ;UNFLIP SCREEN 1214 | STA COCKTA 1215 | LDA $$CRDT 1216 | CMP I,MAXCOI 1217 | IFCS ;TOO MANY $? 1218 | LDA I,MAXCOI ;YES. MAX OUT 1219 | STA $$CRDT 1220 | THEN 1221 | SED ;HEX TO BCD 1222 | STA K 1223 | LDA I,0 1224 | STA J 1225 | LDY I,7 1226 | BEGIN 1227 | ASL K 1228 | LDA J 1229 | ADC J 1230 | STA J 1231 | DEY 1232 | MIEND 1233 | CLD 1234 | LDA J 1235 | CMP NUMCRE 1236 | IFNE ;# OF CREDITS CHANGED? 1237 | STA NUMCRE ;YES, REDO SCROLL AREA 1238 | LDA $$CRDT 1239 | IFNE ;ANY CREDITS? 1240 | LDX I,YESCRE-MESDAT ;YES. SET UP LIST POINTER 1241 | ELSE 1242 | LDA OPTION ;NO. SET UP COIN MODE DESC 1243 | AND I,03 1244 | TAX 1245 | LDA AX,CMOTAB 1246 | STA SPMESA 1247 | LDX I,NOCRED-MESDAT ;SET UP LIST POINTER 1248 | THEN 1249 | STX SCRTAB 1250 | JSR SCRERA ;CLEAR OFF SCROLL AREA 1251 | LDA I,0 ;SET UP FOR 1ST CHAR IN 1ST MSG 1252 | STA BETMES 1253 | STA SCRCHA 1254 | THEN 1255 | LDA BETMES 1256 | IFNE ;BETWEEN MESSAGES? 1257 | DEC BETMES ;YES. DECREMENT BETWEEN MSG DOT COUNTER 1258 | ELSE 1259 | LDX SCRTAB ;NO.GET CURRENT MESSAGE INDEX 1260 | LDA AX,MESTYP ;AND EXECUTE APPROPRIATE CHARACTER 1261 | CMP I,MESAGN ;OUTPUT ROUTINE 1,2, OR 3 1262 | IFEQ 1263 | LDA AX,MESDAT ;1.GET MESSAGE # FROM TABEL & OUTPUT CHAR 1264 | JSR DSCROM 1265 | ELSE 1266 | LDA AX,MESDAT ;TABLE CONTAINS A POINTER TO A BASE 1267 | STA OLDPOS ;PAGE LOCATION HOLDING DESIRED DATA 1268 | LDY I,0 1269 | STY OLDPOS+1 1270 | LDA NY,OLDPOS 1271 | LDY AX,MESTYP 1272 | CPY I,SPECIAL 1273 | IFEQ 1274 | JSR DSCROM ;2. OUTPUT CHAR. IN A MESSAGE 1275 | ELSE 1276 | JSR DSCRON ;3. OUTPUT CHAR IN A # 1277 | THEN 1278 | THEN 1279 | LDA BETMES 1280 | CMP I,-1 ;DONE WITH MESSAGE OR # ? 1281 | IFEQ 1282 | LDX SCRTAB ;YES. BUMP POINTER TO NEXT MSG 1283 | LDA AX,MESPAC ;SET UP # SPACES BETWEEN MSGS. 1284 | STA BETMES 1285 | INX 1286 | LDA AX,MESTYP 1287 | CMP I,ENTABL 1288 | IFEQ ;END OF LIST? 1289 | LDA AX,MESDAT ;YES. RESET POINTER TO 1290 | TAX ;BEGINNING OF LIST 1291 | THEN 1292 | STX SCRTAB 1293 | THEN 1294 | THEN 1295 | RTS 1296 | CMOTAB: .BYTE MFREEP,M2GP1C,M1GP1C,M1GP2C 1297 | ATRMSG: LDA I,-1 ;INITIALIZE # CREDITS TO IMPOSSIBLE 1298 | STA NUMCRE ;VALUE TO INSTIGATE A CHANGE 1299 | RTS 1300 | .PAGE 1301 | .SBTTL SCROLL MESSAGE TABLE 1302 | ;MESSAGE 1303 | MESDAT: 1304 | YESCRE: .BYTE MPRESS ;"PRESS START" 1305 | .BYTE MCREDI ; "CREDITS" 1306 | .BYTE NUMCRE ;# OF CREDITS 1307 | .BYTE MCOPYR 1308 | .BYTE YESCRE-MESDAT ;INDEX TO TOP OF LIST 1309 | NOCRED: 1310 | .BYTE MGAMOV ;"GAME OVER" 1311 | .BYTE MINSER ;"INSERT COINS" 1312 | .BYTE SPMESA ;COIN MODE 1313 | .BYTE MCOPYR 1314 | .BYTE NOCRED-MESDAT ;INDEX TO TOP OF LIST 1315 | MESTYP: ;MESSAGE TYPE 1316 | .BYTE MESAGN ;MESSAGE # 1317 | .BYTE MESAGN ;MESSAGE # 1318 | .BYTE NUM2DI ;2 DIGIT # LOC. 1319 | .BYTE MESAGN 1320 | .BYTE ENTABL ;END OF 1321 | 1322 | .BYTE MESAGN ;MESSAGE # 1323 | .BYTE MESAGN ;MESSAGE # 1324 | .BYTE SPECIAL ;SPECIAL MESSAGE # LOC 1325 | .BYTE MESAGN 1326 | .BYTE ENTABL 1327 | MESPAC: .BYTE 20,8,20,20,20 ;SPACE AFTER MSG. 1328 | .BYTE 20,20,20,20,20 1329 | .PAGE 1330 | .SBTTL DISPLAY 1 OF 2 DIGITS IN LOWER RIGHT CORNER OF SCREEN 1331 | ;INPUT: ACC=# TO DISPLAY 1332 | ; SCRCHA=0 OR 1 INDICATING 1ST OR 2ND DIGIT BE DISPLAY 1333 | ;OUTPUT:SCRCHA UNPDATED 1334 | ; BETMES=-1 IF LAST DIGIT WAS OUTPUT 1335 | ; DIGIT OUTPUT 1336 | ; 1337 | DSCRON: 1338 | LDY SCRCHA 1339 | IFNE ;1ST OR 2ND DIGIT? 1340 | LDY I,-1 ;2ND DIGIT. SINGLE LAST DIGIT 1341 | STY BETMES 1342 | INY 1343 | STY SCRCHA ;RESET CHAR IN MSG POINTER 1344 | ELSE 1345 | LDY I,7 ;SPACES BETWEEN CHARS 1346 | STY BETMES 1347 | INC SCRCHA 1348 | LSR ;1ST DIGIT. MOVE IT DOWN 1349 | LSR 1350 | LSR 1351 | LSR 1352 | IFEQ 1353 | LDA I,-1 ;SUPPRESS LEADING ZERO 1354 | THEN 1355 | THEN 1356 | AND I,0F 1357 | CMP I,10. ;DONT DISPLAY IF NOT 0-9 1358 | IFCC 1359 | CLC ;# OK 1360 | ADC I,30 ;CONVERT TO ASCII 1361 | JSR SCROST ;DISPLAY IT 1362 | THEN 1363 | RTS 1364 | .PAGE 1365 | .SBTTL DISPLAY NTH CHARACTER IN A MSG ON LOWER SCRREN CORNER 1366 | ;DSCROM: OUTPUT A CHARACTER IN A MESSAGE AT THE LOWER RIGHT 1367 | ; CORNER OF THE SCREEN 1368 | ;INPUT: SCRCHA=CHARACTER# 1369 | ; ACC=MESSAGE # 1370 | ;OUTPUT:CHARACTER DISPLAY IN LOWER RIGHT CORNER OF SCREEN 1371 | ; BETMES=-1 IF IT WAS LAST CHAR IN MESSAGE 1372 | ; 1373 | DSCROM: 1374 | STA MESAGE 1375 | ASL 1376 | CLC 1377 | ADC MESAGE 1378 | TAY ;CODE X3 1379 | JSR LANGAG ;SETUP PTR TO MSG 1380 | LDY SCRCHA ;CHAR # IN MSG 1381 | INC SCRCHA ;POINT TO NEXT CHAR 1382 | LDA I,7 1383 | STA BETMES 1384 | LDA NY,MESAGE ;GET NTH CHAR 1385 | IFMI ;LAST CHAR? 1386 | LDY I,-1 ;YES. SET LAST CHAR FLAG 1387 | STY BETMES 1388 | INY 1389 | STY SCRCHA ;RESET CHAR IN MSG POINTER 1390 | THEN 1391 | .PAGE 1392 | .SBTTL OUTPUT AN ASCII STAMP TO LOWER RIGHT CORNER 1393 | ;INPUT:ACC=ASCII VALUE TO BE OUTPUT 1394 | ; 1395 | SCROST: ;OUTPUT A STAMP IN LOWER RIGHT CORNER 1396 | JSR ASCSTP ;CONVERT ASCII TO A STAMP ADDRESS 1397 | LDA I,252. ;COORINDATS OF CENTER OF STAMP IN 1398 | STA NWSTMP ;LOWER RIGHT CORNER 1399 | LDA I,3 1400 | STA NWSTMP+1 1401 | LDA I,0 ;WIPE OUT OLD BACKGROUND 1402 | STA NOBKGD 1403 | LDA I,BCKGND ;MESSAGE PATTERN 1404 | STA PATRN1 1405 | LDA I,LNDCOL ;LAND IS BACKGROUND 1406 | STA PATRN0 1407 | JMP STMPX1 1408 | .SBTTL CLEAR OFF SCROLL AREA 1409 | SCRERA: 1410 | LDY I,0 1411 | LDA I,0FF 1412 | BEGIN ;CLEAR OFF SCROLL AREA 1413 | STA AY,401 1414 | STA AY,501 1415 | INY 1416 | INY 1417 | EQEND 1418 | RTS 1419 | .PAGE 1420 | .SBTTL MAGNIFICATION TABLE 1421 | ; 1422 | ; 1423 | ;D7-D4=HORIZ SIZE ;D3-D0=VERT SIZE 1424 | ; 1425 | MAGNIF: .BYTE 11 1426 | .BYTE 11 1427 | .BYTE 11 1428 | .BYTE 11 1429 | .BYTE 11 1430 | .BYTE 11 1431 | .BYTE 11 1432 | .BYTE 11 1433 | .BYTE 3A 1434 | .BYTE 21 1435 | .BYTE 11 1436 | .BYTE 11 1437 | .BYTE 11 1438 | .BYTE 11 1439 | .BYTE 11 1440 | .BYTE 11 1441 | .BYTE 11 1442 | .BYTE 11 1443 | .BYTE 11 1444 | .BYTE 11 1445 | .BYTE 11 1446 | .BYTE 11 1447 | .BYTE 11 1448 | .BYTE 11 1449 | .BYTE 11 1450 | .BYTE 11 1451 | .BYTE 11 1452 | .BYTE 11 1453 | .BYTE 44 1454 | .BYTE 44 1455 | .BYTE 11 1456 | .BYTE 11 1457 | .BYTE 11 1458 | .BYTE 11 1459 | .BYTE 11 1460 | .BYTE 11 1461 | .BYTE 11 1462 | .BYTE 11 1463 | .BYTE 11 1464 | .BYTE 11 1465 | .PAGE 1466 | .SBTTL VERTICAL COORDINATES 1467 | ; 1468 | ; 1469 | ; 1470 | ; 1471 | VERCOR: .BYTE 90 1472 | .BYTE 0C0 1473 | .BYTE 3 1474 | .BYTE 3 1475 | .BYTE 3 1476 | .BYTE 40 1477 | .BYTE 70 1478 | .BYTE 0A0 1479 | .BYTE 0A0 1480 | .BYTE 80 1481 | .BYTE VCMODE 1482 | .BYTE VCMODE 1483 | .BYTE VCMODE 1484 | .BYTE 3 1485 | .BYTE 0A0 1486 | .BYTE 3 1487 | .BYTE 3 1488 | .BYTE 3 1489 | .BYTE 70 1490 | .BYTE 60 1491 | .BYTE 50 1492 | .BYTE 38 1493 | .BYTE 3 1494 | .BYTE 3 1495 | .BYTE 3 1496 | .BYTE VBONIN 1497 | .BYTE VBONIN 1498 | .BYTE VBONIN 1499 | .BYTE 0A0 1500 | .BYTE 70 1501 | .BYTE 3 1502 | .BYTE 70 1503 | .BYTE 90 1504 | .BYTE 70 1505 | .BYTE 90 1506 | .BYTE 80 1507 | .BYTE 80 1508 | .BYTE VCMODE 1509 | .BYTE 30 1510 | .BYTE 80 1511 | QCHKS7: .BYTE CHKSM7 1512 | .PAGE 1513 | .SBTTL FRENCH LITERALS 1514 | .MACRO FMAC HORIZ, LOC 1515 | .BYTE HORIZ ;CARTESIAN 1516 | .WORD LOC 1517 | .ENDM 1518 | FMTBL: FMAC 60,FPLAYR 1519 | FMAC 48,FHISCR 1520 | FMAC 6,FGAMOV 1521 | FMAC 90,FPRESS 1522 | FMAC 78,FINSER 1523 | FMAC 5C,FBONUS 1524 | FMAC 68,FICBPTS 1525 | FMAC 50,FABMPTS 1526 | FMAC 60,FTHEEND 1527 | FMAC 10,FYOUR 1528 | FMAC 78,F2GP1C 1529 | FMAC 78,F1GP1C 1530 | FMAC 78,F1GP2C 1531 | FMAC 0B0,FCREDI 1532 | FMAC 54,FGAMOV 1533 | FMAC 4,FEMPTY 1534 | FMAC 70,FEMPTY 1535 | FMAC 0E4,FEMPTY 1536 | FMAC 24,FPLEAS 1537 | FMAC 4,FTOCHG 1538 | FMAC 4,FPRDLT 1539 | FMAC 34,FDEFEN 1540 | FMAC MISB1H-8,FLOW 1541 | FMAC MISB2H-7,FLOW 1542 | FMAC MISB3H-8,FLOW 1543 | FMAC 78,FEVERY 1544 | FMAC 0C8,FPOINTS 1545 | FMAC 18,FBONUS 1546 | .PAGE 1547 | .SBTTL GERMAN LITERALS 1548 | .MACRO GMAC HORIZ, LOC 1549 | .BYTE HORIZ ;CARTESIAN 1550 | .WORD LOC 1551 | .ENDM 1552 | GMTBL: GMAC 54,GPLAYR 1553 | GMAC 44,GHISCR 1554 | GMAC 6,GGAMOV 1555 | GMAC 90,GPRESS 1556 | GMAC 78,GINSER 1557 | GMAC 5C,GBONUS 1558 | GMAC 68,GICBPTS 1559 | GMAC 58,GABMPTS 1560 | GMAC 54,GTHEEND 1561 | GMAC 3C,GYOUR 1562 | GMAC 78,G2GP1C 1563 | GMAC 78,G1GP1C 1564 | GMAC 78,G1GP2C 1565 | GMAC 0B0,GCREDI 1566 | GMAC 58,GGAMOV 1567 | GMAC 4,GEMPTY 1568 | GMAC 70,GEMPTY 1569 | GMAC 0E4,GEMPTY 1570 | GMAC 14,GPLEAS 1571 | GMAC 4,GTOCHG 1572 | GMAC 4,GPRDLT 1573 | GMAC 30,GDEFEN 1574 | GMAC 4,GLOW 1575 | GMAC 6C,GLOW 1576 | GMAC 0DC,GLOW 1577 | GMAC 70,GEVERY 1578 | GMAC 0C8,GPOINTS 1579 | GMAC 18,GBONUS 1580 | .PAGE 1581 | .SBTTL SPANISH LITERALS 1582 | .MACRO SMAC HORIZ, LOC 1583 | .BYTE HORIZ ;CARTESIAN 1584 | .WORD LOC 1585 | .ENDM 1586 | SMTBL: SMAC 5C,SPLAYR 1587 | SMAC 64,SHISCR 1588 | SMAC 6,SGAMOV 1589 | SMAC 90,SPRESS 1590 | SMAC 78,SINSER 1591 | SMAC 5C,SBONUS 1592 | SMAC 68,SICBPTS 1593 | SMAC 30,SABMPTS 1594 | SMAC 60,STHEEND 1595 | SMAC 24,SYOUR 1596 | SMAC 78,S2GP1C 1597 | SMAC 78,S1GP1C 1598 | SMAC 78,S1GP2C 1599 | SMAC 0B0,SCREDI 1600 | SMAC 48,SGAMOV 1601 | SMAC MISB1H-08,SEMPTY 1602 | SMAC MISB2H-07,SEMPTY 1603 | SMAC MISB3H-8,SEMPTY 1604 | SMAC 38,SPLEAS 1605 | SMAC 4,STOCHG 1606 | SMAC 4,SPRDLT 1607 | SMAC 30,SDEFEN 1608 | SMAC 4,SLOW 1609 | SMAC 70,SLOW 1610 | SMAC 0E4,SLOW 1611 | SMAC 70,SEVERY 1612 | SMAC 0C8,SPOINTS 1613 | SMAC 08,SBONUS 1614 | .PAGE 1615 | .SBTTL ENGLISH LITERALS 1616 | .MACRO EMAC HORIZ, LOC 1617 | .BYTE HORIZ ;CARTESIAN 1618 | .WORD LOC 1619 | .ENDM 1620 | EMTBL: EMAC 60,EPLAYR 1621 | EMAC 54,EHISCR 1622 | EMAC 6,EGAMOV 1623 | EMAC 90,EPRESS 1624 | EMAC 78,EINSER 1625 | EMAC 5C,EBONUS 1626 | EMAC 68,EICBPTS 1627 | EMAC 50,EABMPTS 1628 | EMAC 36,ETHEEND 1629 | EMAC 2C,EYOUR 1630 | EMAC 78,E2GP1C 1631 | EMAC 78,E1GP1C 1632 | EMAC 78,E1GP2C 1633 | EMAC 0B0,ECREDI 1634 | EMAC 5C,EGAMOV 1635 | EMAC MISB1H-08,EEMPTY 1636 | EMAC MISB2H-07,EEMPTY 1637 | EMAC MISB3H-8,EEMPTY 1638 | EMAC 38,EPLEAS 1639 | EMAC 4,ETOCHG 1640 | EMAC 4,EPRDLT 1641 | EMAC 38,EDEFEN 1642 | EMAC MISB1H-8,ELOW 1643 | EMAC MISB2H-7,ELOW 1644 | EMAC MISB3H-8,ELOW 1645 | EMAC 68,EEVERY 1646 | EMAC 0C8,EPOINTS 1647 | EMAC 10,EBONUS 1648 | EMAC 20,EMISIL 1649 | EMAC 20,ECOMAN 1650 | EMAC 50,ECOPYR 1651 | EMAC 5C,ERAMOK 1652 | EMAC 5C,EROMOK 1653 | EMAC 5C,EBDRAM 1654 | EMAC 5C,EBDROM 1655 | EMAC 5C,EBADMA 1656 | EMAC 5C,EMAPOK 1657 | EMAC 78,EFREEP 1658 | EMAC 88,ECITIES 1659 | EMAC 10,EBDPOK 1660 | .PAGE 1661 | .SBTTL ENGLISH LITERALS 1662 | EPLAYR: .ASCIN /PLAYER/ 1663 | EGAMOV: .ASCIN /GAME OVER/ 1664 | EPRESS: .ASCIN /PRESS START/ 1665 | EINSERT:.ASCIN /INSERT COINS/ 1666 | EBONUS: .ASCIN /BONUS CITY/ 1667 | 1668 | EABMPTS:.ASCIN /BONUS POINTS/ 1669 | ETHEEND:.ASCIN /THE END/ 1670 | E2GP1C: .ASCIN /1 COIN 2 PLAYS/ 1671 | E1GP1C: .ASCIN /1 COIN 1 PLAY/ 1672 | E1GP2C: .ASCIN /2 COINS 1 PLAY/ 1673 | FCREDI: 1674 | ECREDI: .ASCIN /CREDITS:/ 1675 | ERAMOK: .ASCIN /RAM OK/ 1676 | EROMOK: .ASCIN /ROM OK/ 1677 | EBDRAM: .ASCIN /BAD RAM/ 1678 | EBDROM: .ASCIN /BAD ROM/ 1679 | EBDPOK: .ASCIN /BAD CHIP/ 1680 | EYOUR: .ASCIN /GREAT SCORE/ 1681 | EPLEAS: .ASCIN /ENTER YOUR INITIALS/ 1682 | ETOCHG: .ASCIN /SPIN BALL TO CHANGE LETTERS/ 1683 | EPRDLT: .ASCIN /PRESS ANY FIRE SWITCH TO SELECT/ 1684 | EHISCR: .ASCIN /HIGH SCORES/ 1685 | EDEFEN: .ASCII /DEFEND / 1686 | ECITIES:.ASCIN /CITIES/ 1687 | ELOW: .ASCIN /LOW/ 1688 | EMAPOK: .ASCIN /MAP OK/ 1689 | EBADMA: .ASCIN /BAD MAP/ 1690 | EEMPTY: .ASCIN /OUT/ 1691 | ECOPYR: .ASCIN /ATARI @? 1980/ 1692 | EMISIL: .ASCIN /MISSILE/ 1693 | ECOMAN: .ASCIN /COMMAND/ 1694 | EEVERY: .ASCIN /EVERY/ 1695 | EFREEP: .ASCIN /FREE PLAY/ 1696 | .PAGE 1697 | .SBTTL FRENCH LITERALS 1698 | 1699 | FPLAYR: .ASCIN /JOUEUR/ 1700 | FGAMOV: .ASCIN /FIN DE PARTIE/ 1701 | FPRESS: .ASCIN /APPUYER SUR START/ 1702 | FINSERT:.ASCIN /INTRODUIRE LES PIECES/ 1703 | FBONUS: .ASCIN /BONUS VILLE/ 1704 | FABMPTS:.ASCIN /BONUS POINTS/ 1705 | EICBPTS: 1706 | FICBPTS:.ASCII /X / 1707 | EPOINTS: 1708 | FPOINTS:.ASCIN /POINTS/ 1709 | STHEEND: 1710 | FTHEEND:.ASCIN /FIN/ 1711 | F2GP1C: .ASCIN /1 PIECE 2 JOUEURS/ 1712 | F1GP1C: .ASCIN /1 PIECE 1 JOUEUR/ 1713 | F1GP2C: .ASCIN /2 PIECES 1 JOUEUR/ 1714 | FYOUR: .ASCIN /SPLENDIDE SCORE/ 1715 | FPLEAS: .ASCIN /SVP ENTREZ VOS INITIALES/ 1716 | FTOCHG: .ASCIN /ROTATIONS POUR CHANGEMENT/ 1717 | FPRDLT: .ASCIN /POUSSEZ FEU QUAND CORRECTE/ 1718 | FHISCR: .ASCIN /MEILLEUR SCORE/ 1719 | FDEFEN: .ASCIN /DEFENSES VILLE/ 1720 | FLOW: .ASCIN /BAS/ 1721 | FEMPTY: .ASCIN /VIDE/ 1722 | FEVERY: .ASCIN /PAR/ 1723 | .PAGE 1724 | .SBTTL GERMAN LITERALS 1725 | 1726 | GPLAYR: .ASCIN /SPIELER/ 1727 | GGAMOV: .ASCIN /SPIELENDE/ 1728 | GPRESS: .ASCIN /STARTKN$PFE DR%CKEN/ 1729 | GINSERT:.ASCIN /GELD EINWERFEN/ 1730 | GBONUS: .ASCIN /BONUSSTADT/ 1731 | GABMPTS:.ASCIN /BONUSPUNKTE/ 1732 | GICBPTS:.ASCII /X / 1733 | GPOINTS:.ASCIN /PUNKTE/ 1734 | GTHEEND:.ASCIN /ENDE/ 1735 | G2GP1C: .ASCIN /1 M%NZ 2 SPIELE/ 1736 | G1GP1C: .ASCIN /1 M%NZE 1 SPIEL/ 1737 | G1GP2C: .ASCIN /2 M%NZEN 1 SPIEL/ 1738 | GCREDI: .ASCIN /KREDITE:/ 1739 | GYOUR: .ASCIN /GROSSARTIGES ERGEBNIS/ 1740 | GPLEAS: .ASCIN /GEBEN SIE IHRE INITIALEN EIN/ 1741 | GTOCHG: .ASCIN /BALL DREHEN F%R ALLE BUCHSTABEN/ 1742 | GPRDLT: .ASCIN /FIRE DR%CKEN WENN RICHTIG/ 1743 | GHISCR: .ASCIN /H$CHSTERGEBNIS/ 1744 | GDEFEN: .ASCIN /ST#DTE VERTEIDIGEN/ 1745 | GLOW: .ASCIN /WENIG/ 1746 | GEMPTY: .ASCIN /LEER/ 1747 | GEVERY: .ASCIN /JEDE/ 1748 | .PAGE 1749 | .SBTTL SPANISH LITERALS 1750 | 1751 | SPLAYR: .ASCIN /JUGADOR/ 1752 | SGAMOV: .ASCIN /JUEGO TERMINADO/ 1753 | SPRESS: .ASCIN /PULSAR START/ 1754 | SINSERT:.ASCIN /INSERTE FICHAS/ 1755 | SBONUS: .ASCIN /CIUDAD EXTRA/ 1756 | SABMPTS:.ASCIN /BONIFICACION DE PUNTOS/ 1757 | SICBPTS:.ASCII /X / 1758 | SPOINTS:.ASCIN /PUNTOS/ 1759 | S2GP1C: .ASCIN /1 MONEDA 2 JUEGOS/ 1760 | S1GP1C: .ASCIN /1 MONEDA 1 JUEGO/ 1761 | S1GP2C: .ASCIN /2 MONEDAS 1 JUEGO/ 1762 | SCREDI: .ASCIN /CREDITOS:/ 1763 | SYOUR: .ASCIN /GRAN PUNTAJE/ 1764 | SPLEAS: .ASCIN /ENTRE SUS INICIALES/ 1765 | STOCHG: .ASCIN /GIRE LA BOLA PARA CAMBIAR LETRAS/ 1766 | SPRDLT: .ASCIN /OPRIMA FIRE POR LA LETRA/ 1767 | SHISCR: .ASCIN /RECORDS/ 1768 | SDEFEN: .ASCIN /DEFIENDA CIUDADES/ 1769 | SLOW: .ASCIN /POCO/ 1770 | SEMPTY: .ASCIN /SIN/ 1771 | SEVERY:.ASCIN /CADA/ 1772 | .MACRO BUMP A,B,C,D,E,F,G,H 1773 | .BYTE H,G,F,E,D,C,B,A 1774 | .ENDM 1775 | BLKSTP: BUMP 0,0,0,0,0,0,0,0 ;BLANK 1776 | NUMBER: 1777 | BUMP 000,038,044,0C6,0C6,0C6,044,038 ;"0" (ZERO) 1778 | BUMP 000,030,070,030,030,030,030,0FC ; 1 1779 | BUMP 000,07C,0C6,00E,03C,078,0E0,0FE ; 2 1780 | BUMP 000,07E,00C,018,03C,006,0C6,07C ; 3 1781 | BUMP 000,01C,03C,06C,0CC,0FE,00C,00C ; 4 1782 | BUMP 000,0FC,0C0,0FC,006,006,0C6,07C ; 5 1783 | BUMP 000,03C,060,0C0,0FC,0C6,0C6,07C ; 6 1784 | BUMP 000,0FE,0C6,00C,018,030,030,030 ; 7 1785 | BUMP 000,078,0C4,0E4,078,09E,086,07C ; 8 1786 | BUMP 000,07C,0C6,0C6,07E,006,00C,078 ; 9 (NINE) 1787 | LETTER: BUMP 000,038,06C,0C6,0C6,0FE,0C6,0C6 ; "A" 1788 | BUMP 000,0FC,0C6,0C6,0FC,0C6,0C6,0FC ; B 1789 | BUMP 000,03C,066,0C0,0C0,0C0,066,03C ; C 1790 | BUMP 000,0F8,0CC,0C6,0C6,0C6,0CC,0F8 ; D 1791 | BUMP 000,0FC,0C0,0C0,0F8,0C0,0C0,0FC ; E 1792 | BUMP 000,0FE,0C0,0C0,0FC,0C0,0C0,0C0 ; F 1793 | BUMP 000,03E,060,0C0,0CE,0C6,066,03E ; G 1794 | BUMP 000,0C6,0C6,0C6,0FE,0C6,0C6,0C6 ; H 1795 | BUMP 000,0FC,030,030,030,030,030,0FC ; I 1796 | BUMP 000,006,006,006,006,006,0C6,07C ; J 1797 | BUMP 000,0C6,0CC,0D8,0F0,0F8,0DC,0CE ; K 1798 | BUMP 000,0C0,0C0,0C0,0C0,0C0,0C0,0FC ; L 1799 | BUMP 000,0C6,0EE,0FE,0FE,0D6,0C6,0C6 ; M 1800 | BUMP 000,0C6,0E6,0F6,0FE,0DE,0CE,0C6 ; N 1801 | BUMP 000,07C,0C6,0C6,0C6,0C6,0C6,07C ; O 1802 | BUMP 000,0FC,0C6,0C6,0C6,0FC,0C0,0C0 ; P 1803 | BUMP 000,07C,0C6,0C6,0C6,0DE,0CC,07A ; Q 1804 | BUMP 000,0FC,0C6,0C6,0CE,0F8,0DC,0CE ; R 1805 | BUMP 000,07C,0C6,0C0,07C,006,0C6,07C ; S 1806 | BUMP 000,0FC,030,030,030,030,030,030 ; T 1807 | BUMP 000,0C6,0C6,0C6,0C6,0C6,0C6,07C ; U 1808 | BUMP 000,0C6,0C6,0C6,0EE,06C,038,010 ; V 1809 | BUMP 000,0C6,0C6,0D6,0FE,0FE,0EE,0C6 ; W 1810 | BUMP 00,0C6,0EE,7C,38,7C,0EE,0C6 ; X 1811 | BUMP 000,0CC,0CC,0CC,078,030,030,030 ; Y 1812 | BUMP 000,0FE,00E,01C,038,070,0E0,0FE ; Z 1813 | SPECIC: 1814 | BUMP 0,0,0,0,0,0,0,0 ;ANOTHER BLANK 1815 | BUMP 3C,3C,0BD,0FF,0FF,7E,3C,18 ;DOWN ARROW 1816 | .BYTE 7F,0FF,7F,7E,34,30,20,0 ;CITY 1817 | .BYTE 7C,37,25,0,0,0,0,0 1818 | .BYTE 0FE,0FF,0FE,0FE,0FA,50,10,10 1819 | .BYTE 3E,6C,0C8,0C0,80,0,0,0 1820 | .BYTE 1C,38,7F,0FF,0FF,7F,38,1C ;LEFT ARROW 1821 | .BYTE 38,1C,0FE,0FF,0FF,0FE,1C,38 ;RIGHT ARROW 1822 | BUMP 0,3C,42,99,91,99,42,3C ;COPYRIGHT SYMBOL=C 1823 | BUMP 0,0,0,30,30,0,30,30 ;COLON 1824 | BUMP 0,3C,42,9D,95,9D,52,3C ;CIRCLE P=? 1825 | BUMP 0,44,10,38,6C,0C6,0FE,0C6 ;UMLAUT A=# 1826 | BUMP 0,28,0,7C,0C6,0C6,0C6,7C ;UMLAUT O=$ 1827 | BUMP 0,28,0,0C6,0C6,0C6,0C6,7C ;UMLAUT U=% 1828 | .PAGE 1829 | .SBTTL BONUS CITY INTERVAL MESSAGE 1830 | 1831 | BONCIT: 1832 | LDA OPTIO2 1833 | AND I,BONMSK 1834 | CMP I,BONMSK 1835 | IFNE ;BONUS CITIES? 1836 | LDA I,MBONIN ;YES. "BONUS CITY" 1837 | JSR DTABML 1838 | LDA I,MEVERY ;"EVERY" 1839 | JSR DTABML 1840 | LDA I,MPOINTS ;"POINTS" 1841 | JSR DTABML 1842 | LDA I,0 1843 | STA TRIPLE 1844 | LDA OPTIO2 1845 | AND I,BONMSK 1846 | LSR 1847 | LSR 1848 | LSR 1849 | TAX 1850 | LDA AX,BONINL 1851 | STA TRIPLE+1 1852 | LDA AX,BONINH 1853 | STA TRIPLE+2 ;SET UP INTERVAL 1854 | LDX I,90 ;HORIZ 1855 | LDY I,VBONIN ;VERT 1856 | LDA I,REDMIS ;COLOR 1857 | JSR DSPNUM ;DISPLAY # 1858 | THEN 1859 | RTS 1860 | .PAGE 1861 | .PAGE 1862 | .SBTTL INITIALIZE HIGH SCORE TABLE 1863 | INIINI: 1864 | LDX I,14. 1865 | BEGIN 1866 | LDA AX,STRINI 1867 | STA ZX,INITAL 1868 | LDA AX,SCOINI 1869 | STA ZX,HSCORL 1870 | DEX 1871 | MIEND 1872 | RTS 1873 | STRINI: .ASCIN /MJPRDASRCDLSDFT / 1874 | SCOINI: .BYTE 50,69,0,05,70,0,30,73,0,95,74,0,0,75,0 1875 | .SBTTL DISPLAY TOP SCORE AT TOP OF SCREEN 1876 | 1877 | DSPHI: LDA HSCORL+<3*4> ;MOVE BEST TO DISPLAY BUCKET 1878 | STA TRIPLE 1879 | LDA HSCORM+<3*4> 1880 | STA TRIPLE+1 1881 | LDA HSCORH+<3*4> 1882 | STA TRIPLE+2 1883 | LDX I,064 ;COORDINATES 1884 | LDY I,STOPLI 1885 | LDA I,REDMIS ;COLOR 1886 | JSR DSPNUM 1887 | JMP DSPSCO ;DISPLAY SCORES (L&R) 1888 | QCHKS9: .BYTE CHKSM9 1889 | .PAGE 1890 | .SBTTL UPDATE HIGH SCORE LADDER 1891 | NUHICK: 1892 | JSR CLEARI ;CLEAR OUT OLD FLAGS 1893 | LDA ATRACT 1894 | IFEQ ;ATTRACT? 1895 | LDY I,CDLADR ;YES. DISP LADDER 1896 | STY SETUPC 1897 | ELSE 1898 | LDX I,1 ;NO START WITH PLAYER 2 1899 | STX ICBTOL ;INTIALIZE HI SCORE FLAG TO "NOT HI" 1900 | BEGIN ;LOOP FOR EACH PLAYER 1901 | LDY I,3*4 ;START AT BOTTOM OF LADDER-LO SCORES 1902 | BEGIN 1903 | LDA AY,HSCORH 1904 | CMP AX,LSCORH ;COMPARE HI 2 DIGITS 1905 | IFEQ ;THEY'RE EQUAL CHECK NEXT BYTES 1906 | LDA AY,HSCORM 1907 | CMP AX,LSCORM 1908 | IFEQ ;THIS GUY IS RELENTLESS 1909 | LDA AY,HSCORL 1910 | CMP AX,LSCORL 1911 | THEN 1912 | THEN 1913 | IFCC 1914 | JSR NEWHI ;HE DIDN'T MAKE IT BY MUCH 1915 | THEN 1916 | DEY 1917 | DEY 1918 | DEY ;POINT TO NEXT HI SCORE 1919 | MIEND ;DONE WITH THIS GUY 1920 | DEX 1921 | MIEND ;DONE WITH BOTH 1922 | JSR ATRMSG ;PREPARE SCROLLER 1923 | LDA ICBTOL ;NEW HI SCORE FOUND? 1924 | IFMI 1925 | JSR SETCOL ;DISPLAY COLORS 1926 | JSR INTLDR ;YES TELL SETUP STATE TO 1927 | ELSE ;SEARCH FOR NEW INITALS SLOT 1928 | LDY I,CENDG1 ;NO END BANG. 1929 | STY SETUPC 1930 | THEN 1931 | THEN 1932 | RTS 1933 | .PAGE 1934 | .SBTTL INSERT SCORES + INITIALS ON LADDER 1935 | ;INPUT: Y=INDEX INTO HSCORE OF BEATEN SCORE 1936 | ; X=PLAYER ID (0 OR 1) 1937 | NEWHI: ;SAVE HEIGHT OF NEW HI SCORE 1938 | STY J ;ON LADDER 1939 | LDY I,0 ;START SEARCHING AT BOTTOM OF LADDER 1940 | BEGIN 1941 | CPY J ;THERE YET? 1942 | IFEQ ;YES 1943 | LDA AX,LSCORH ;MOVE HIM ONTO IT THEN 1944 | STA AY,HSCORH 1945 | LDA AX,LSCORM 1946 | STA AY,HSCORM 1947 | LDA AX,LSCORL 1948 | STA AY,HSCORL 1949 | INX ;MAKE INDEX=TO PLAYER # 1950 | TXA 1951 | DEX 1952 | STA AY,INITAL ;MARK INITIAL SLOT TO NEW ENTRY 1953 | LDA I,26.+41 ;STORE BLANKS IN OTHER 2 SLOTS 1954 | STA AY,INITAL+1 1955 | STA AY,INITAL+2 1956 | LDY I,0 ;TELL NUHICK DONE WITH THIS PLAYER 1957 | LDA I,0FF 1958 | STA ICBTOL ;FLAG FOR FOUND NEW HIGH 1959 | RTS 1960 | THEN 1961 | LDA AY,HSCORH+3 ;MOVE THIS SCORE DOWN ONE 1962 | STA AY,HSCORH ;RUNG ON LADDER 1963 | LDA AY,HSCORM+3 1964 | STA AY,HSCORM 1965 | LDA AY,HSCORL+3 1966 | STA AY,HSCORL 1967 | LDA AY,INITAL+5 ;MOVE INITIALS DOWN 1 RUNG 1968 | STA AY,INITAL+2 1969 | LDA AY,INITAL+4 1970 | STA AY,INITAL+1 1971 | LDA AY,INITAL+3 1972 | STA AY,INITAL 1973 | INY 1974 | INY 1975 | INY 1976 | MIEND ;ALWAYS BRANCH 1977 | RTS 1978 | .PAGE 1979 | .SBTTL SEARCH FOR NEW ENTRY ON LADDER 1980 | 1981 | INTLDR: LDY I,3*4 1982 | BEGIN 1983 | LDA AY,INITAL ;GET INITIAL 1984 | IFNE ;IS IT A NEW ENTRY? 1985 | CMP I,3 1986 | IFCC ;YES 1987 | STA PLAYUP ;MAKE A PLAYER # OUT OF IT 1988 | DEC PLAYUP 1989 | STY UCHTAB ;SAVE POINTER 1990 | JSR CLRTOP ;CLEAR TOP OF SCREEN 1991 | LDA I,CGETIN ;DISPLAY INSTRUCTIONS 1992 | STA SETUPC 1993 | JSR INILIT ;FLIP SCREEN FOR PLAYER 1994 | JSR DPLANO ;"PLAYER X" 1995 | JSR ARROW ;PLAYER ARROW 1996 | JSR DSPHI ;DISPLAY SCORES (L,R & HI) 1997 | LDA I,MYOUR 1998 | JSR DTABML 1999 | LDA I,MPLEAS 2000 | JSR DTABML 2001 | LDA I,MTOCHG 2002 | JSR DTABML 2003 | LDA I,MPRDLT 2004 | JSR DTABML 2005 | LDA I,0FF ;GIVE EM 60 SECONDS 2006 | STA UCVTAB 2007 | LDX I,0 ;INITIAL CODE STARTSAT "A" 2008 | STX CRCPHH 2009 | STX FIRESW ;CLEAR INITIAL SWITCHES 2010 | LDA I,2 ;INITIAL COUNTER 2011 | STA OLDCPV 2012 | LDA I,CGETIN ;TELL SETUP TO GET INITIALS 2013 | STA SETUPC 2014 | RTS 2015 | THEN 2016 | THEN 2017 | DEY 2018 | DEY 2019 | DEY 2020 | MIEND 2021 | ABORT: JSR CLRTOP ;CLEAR TOP OF SCREEN 2022 | LDA I,0 2023 | STA PLAYUP 2024 | LDA COCKTA 2025 | AND I,COCMSK ;UNFLIP SCREEN 2026 | STA COCKTA 2027 | LDA I,CDLADR 2028 | STA SETUPC 2029 | RTS 2030 | INTLHS: .BYTE 82,78,6E ;HORIZ COORD OF 3 INITIALS BEING ENTERED 2031 | .PAGE 2032 | .SBTTL TAKE INITIALS FOR NEW HIGH SCORE 2033 | ;INPUT:ATRACB=INDEX INTO INITIAL ARRAY 2034 | GETINI: 2035 | LDA SWSTAT 2036 | EOR I,0FF 2037 | AND I,MSTRT1!MSTRT2 2038 | BNE ABORT ;ABORT IF EITHER START SWITCH PRESS 2039 | LDA FRAME 2040 | AND I,0F 2041 | IFEQ 2042 | DEC UCVTAB 2043 | IFEQ ;TOO MUCH TIME? 2044 | JMP ABORT ;YES. ABORT INITIALS 2045 | THEN 2046 | THEN 2047 | LDX I,0 ;NO X=0 FORCES ADCURS TO WORK ON HORIZ 2048 | LDA TBHD ;GET HORIZ DISPLACEMENT 2049 | STX TBHD ;0 " " 2050 | CLC 2051 | ADC TBVD 2052 | STX TBVD 2053 | ASL 2054 | ASL 2055 | IFMI 2056 | DEC CRCPHH 2057 | THEN 2058 | CLC 2059 | ADC CRCPHL 2060 | STA CRCPHL 2061 | LDA I,0 2062 | ADC CRCPHH 2063 | IFMI 2064 | LDA I,26. 2065 | ELSE 2066 | CMP I,27. 2067 | IFCS 2068 | LDA I,0 2069 | THEN 2070 | THEN 2071 | STA CRCPHH ;SAVE INITIAL CODE 2072 | LDY OLDCPV ;LOAD INITIAL # (0 -> 2) 2073 | LDA AY,INTLHS ;HORIZ DISPLAY LOC 2074 | STA MESAGE 2075 | LDA I,INTLV ;VERT. LOC 2076 | STA MESAGE+1 2077 | LDA CRCPHH 2078 | CLC 2079 | ADC I,41 2080 | JSR LETOUT 2081 | LDA FIRESW 2082 | AND I,ALLFIR ;LOOK AT ANY FIRE SWITCH 2083 | IFNE 2084 | LDA CRCPHH 2085 | CLC 2086 | ADC I,41 ;ADD IN ASCII OFFSET 2087 | LDY UCHTAB 2088 | STA AY,INITAL 2089 | INC UCHTAB ;POINT TO NEXT INITAL SLOT ON LADDER 2090 | LDA I,84 ;RESET TIMEOUT TO 30 SEC 2091 | STA UCVTAB 2092 | LDX I,0 2093 | STX FIRESW ;SET SWITCH TO READ AGAIN 2094 | STX CRCPHH 2095 | DEC OLDCPV ;ONE LESS LETTER TO GO 2096 | IFMI 2097 | JSR INTLDR 2098 | THEN 2099 | THEN 2100 | RTS 2101 | .PAGE 2102 | .SBTTL DISPLAY A LETTER 2103 | ;INPUT:ACC=ASCII VALUE OF LETTER TO DISPLAY 2104 | ; MESAGE(2) POS OF CHAR TO DISPLAY 2105 | LETOUT: STY SAVEY ;SAVE REGISTERS 2106 | STX SAVEX 2107 | JSR ASCSTP ;GET ADDRESS OF LOOK UP DATA 2108 | LDA MESAGE ;SET UP SCREEN COORDINATES 2109 | STA NWSTMP 2110 | LDA MESAGE+1 2111 | STA NWSTMP+1 2112 | LDA I,0 ;ERASE BACKGROUND 2113 | STA NOBKGD 2114 | LDA I,REDMIS ;SET UP COLORS 2115 | STA PATRN1 2116 | LDA I,BCKGND 2117 | STA PATRN0 2118 | JSR STMPX1 ;OUTPUT LETTER 2119 | LDA MESAGE ;POINT TO COORDINATE OF 2120 | CLC ;NEXT INITIAL 2121 | ADC I,0A 2122 | STA MESAGE 2123 | LDX SAVEX ;RESTORE REGS+RETURN 2124 | LDY SAVEY 2125 | RTS 2126 | .SBTTL CLEAR OUT FLAGS 2127 | CLEARI: LDY I,3*4 2128 | BEGIN ;LOOP FOR 5 SETS OF TRI-INITIALS 2129 | LDA AY,INITAL 2130 | IFNE 2131 | CMP I,3 ;IS IT INITIALS OR PLAYER #? 2132 | IFCC 2133 | LDA I,26.+41 ;PLAYER # STORE 3 BLANKS THERE 2134 | STA AY,INITAL 2135 | STA AY,INITAL+1 2136 | STA AY,INITAL+2 2137 | THEN 2138 | THEN 2139 | DEY 2140 | DEY 2141 | DEY 2142 | MIEND 2143 | RTS 2144 | .PAGE 2145 | .SBTTL DISPLAY HIGH SCORES TABLE 2146 | DSPHSC: 2147 | JSR CLRTOP ;CLEAR TOP OF SCREEN 2148 | LDA I,0 ;MAKE SURE SCREEN IS UNFLIPPED 2149 | STA PLAYUP ;AND DISPLAY IS FOR 1ST PLAYER 2150 | STA ATRACT 2151 | STA NUMPLA 2152 | LDA COCKTA 2153 | AND I,COCMSK 2154 | STA COCKTA 2155 | JSR DSPHI ;DISPLAY HIGH SCORE 2156 | LDA I,MHISCR 2157 | JSR DTABML ;DISPLAY "HIGH SCORES" 2158 | LDA I,SCLDRV ;SCREEN ADDRESS OF TOP OF LIST 2159 | STA MSPOS+1 2160 | JSR SETCOL ;SET UP COLORS 2161 | JSR CLEARI ;CLEAR OUT FLAGS 2162 | LDY I,3*4 2163 | BEGIN 2164 | LDA AY,HSCORL+2 ;LOOK AT HIGH SCORE 2165 | ORA AY,HSCORL+1 2166 | ORA AY,HSCORL 2167 | IFEQ ;ALL 0'S ? 2168 | TAY 2169 | ELSE 2170 | LDA AY,HSCORH 2171 | STA TRIPLE+2 2172 | LDA AY,HSCORM 2173 | STA TRIPLE+1 2174 | LDA AY,HSCORL ;PUT SCORE INTO TRIPLE 2175 | STA TRIPLE 2176 | TYA 2177 | PHA 2178 | LDA I,REDMIS ;SET UP CLOR & SCREEN COORDINATES 2179 | LDX I,SCLDRH ;FOR DSPNUM 2180 | LDY MSPOS+1 2181 | JSR DSPNUM ;DISPLAY THE SCORE 2182 | PLA 2183 | TAY 2184 | LDA I,INTLH ;SCREEN COORDINATES FOR INITIALS 2185 | STA MESAGE 2186 | LDA MSPOS+1 2187 | STA MESAGE+1 2188 | LDA AY,INITAL ;GET FIRST INITIAL 2189 | JSR LETOUT ;OUTPUT HIM 2190 | LDA AY,INITAL+1 ;2ND 2191 | JSR LETOUT 2192 | LDA AY,INITAL+2 ;3RD 2193 | JSR LETOUT 2194 | LDA MSPOS+1 ;NEXT LINE TO PUT INITIALSON 2195 | SEC 2196 | SBC I,0A 2197 | STA MSPOS+1 2198 | THEN 2199 | DEY 2200 | DEY 2201 | DEY ;POINT TO NEXT RUNG ON LADDER 2202 | MIEND 2203 | JSR BONCIT ;DISPLAY BONUS CITY INTERVAL MSG 2204 | LDA I,CPRGM1 ;PRE GAME 2205 | STA SETUPC ;FOR SETUP STATE 2206 | LDA I,S.PAUS ;HOLD IT UP THERE 2207 | STA STATE 2208 | LDA I,255. 2209 | STA PAUST 2210 | LDA I,S.SETU 2211 | STA NXTSTA 2212 | RTS 2213 | .PAGE 2214 | .SBTTL DRAW/ERASE CRUISE MISSILE 2215 | ;INPUT: MISIND=MISSILE ARRAY INDEX FOR CM (AB=0) 2216 | CMDRAW: LDA I,0FF ;DRAW CM 2217 | BNE GENDRA 2218 | CMERAS: LDA I,0 ;ERASE CM 2219 | GENDRA: STA J 2220 | LDY I,PEND-PDOT-1 2221 | BEGIN ;LOOP FOR EACH DOT 2222 | LDX MISIND 2223 | LDA AX,ABCPVH ;VERT POS. 2224 | CLC 2225 | ADC AY,VDOT 2226 | EOR I,0FF 2227 | STA OLDPOS+1 2228 | LDA AX,ABCPHH ;HORZ POS 2229 | CLC 2230 | ADC AY,HDOT 2231 | STA OLDPOS 2232 | LDA AY,PDOT ;PATTERN 2233 | LDX I,0 2234 | AND J ;DRAW/ERASE? 2235 | STA NX,OLDPOS 2236 | DEY 2237 | MIEND ;NEXT DOT 2238 | RTS 2239 | HDOT: .BYTE 0,-1,0,1,-2,-1,0,1,2,-1,0,1,0 2240 | VDOT: .BYTE 2,1,1,1,0,0,0,0,0,-1,-1,-1,-2 2241 | PDOT: .BYTE REDMIS,REDMIS,FLASH,REDMIS,REDMIS,FLASH,BCKGND 2242 | .BYTE FLASH,REDMIS,REDMIS,FLASH,REDMIS,REDMIS 2243 | PEND: 2244 | .END 2245 | 2246 | -------------------------------------------------------------------------------- /A35820.1D: -------------------------------------------------------------------------------- 1 | .TITLE W3MAIN 2 | .SBTTL ****************************** 3 | .SBTTL * * 4 | .SBTTL * MODULE: W3MAIN * 5 | .SBTTL * PROGRAMMER: DFT * 6 | .SBTTL * FUNCTION: WW3 MAIN PROGRAM * 7 | .SBTTL * * 8 | .SBTTL ****************************** 9 | .REPT 0 10 | 11 | DATE: 20-JULY-79 12 | 13 | PROJ #: 23603 14 | 15 | DISK #: 83 & B15 16 | 17 | .ENDR 18 | .INCLUDE W3COMN ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 19 | .PAGE 20 | .SBTTL GLOBAL SYMBOLS 21 | ; 22 | ;ENTRY POINTS DEFINED HERE 23 | ; 24 | .GLOBL START,DPLANO,UPCURS,DSPSCO,DIVIDE,BONINL,BONINH 25 | .GLOBL QCHKS1,QCHKS3,SMAHOL,STCITY 26 | ; 27 | ;EXTERNALLY DEFINED ENTRY POINTS 28 | ; 29 | .GLOBL IRQ,RESET,INIINI 30 | .GLOBL MAKMAP,ERAMIS,MISTIP,MISTRA,MOVCUR,ARROW,DTABML,ERAABM 31 | .GLOBL DSPMRK,ERAMRK,DTABMS,DSPNUM,NUMOUT,MISUPD,BASLOW,BASEMP 32 | .GLOBL INISOU,BLEWIT,PRSCRO,ATRMSG,BLNKAR,WSTAMP,ERACIT 33 | .GLOBL NUHICK,GETINI,DSPHSC,DSPHI,DTABEL,ACTCUR,DEACUR 34 | .GLOBL EXSNON,CMSNON,CMSNOF,STSNON,STSNOF 35 | .GLOBL CMDRAW,CMERAS,INILIT,ONEMIS,DACITY,SNDON 36 | ; 37 | ;EXTERNALLY DEFINED VARIABLES 38 | ; 39 | .GLOBL FIRESW 40 | .GLOBL INTCNT,OPTION,OPTIO2,$$CRDT 41 | .GLOBL COL000,COL001,COL010,COL011,COL100 42 | .GLOBL COL101,COL110,COL111 43 | .GLOBL FLSHCO,PATRN1,COCKTA,OLDPOS 44 | .GLOBL SABLAU,SEXPLO,SNEWAV,SENDGA,SBONUS,SOHNO 45 | .GLOBL SUNABM,SLOABM,SNSHOT,$LMTIM 46 | .GLOBL CHKSM1,CHKSM3 47 | ; 48 | ;VARIABLES USED EXTERNALLY AND DEFINED HERE 49 | ; 50 | .GLOBL ABOPH,ABOPV,TRIPLE,PLAYUP,WAVENO,CRMONS,PLCPV,SLAMSN 51 | .GLOBL ABCPVH,ABCPVL,ABCPHH,ABCPHL,MISIND,MBCPH,MBCPV,CICPH,CICPV 52 | .GLOBL CRCPVH,CRCPHH,CRCPHL,QUOTH,QUOTL,CRMONS 53 | .GLOBL SWSTAT,ABTAV,ABTAH,TBVD,TBHD,SYNC,J,INTCNT,NMMISB,K 54 | .GLOBL ABVEHL,ABVEHH,ABVEVL,ABVEVH,CILEFT,CIBITS,LOICBV,ICBTOL,NUMPLA 55 | .GLOBL SETUPC,LSCORH,LSCORL,LSCORM,STATE,PAUST,NXTSTA,ATRACT,HADR,FRAME,BLINKS,BLINKT 56 | .PAGE 57 | .SBTTL VARIABLES DEFINITIONS 58 | .BSECT BMAIN 59 | 60 | ICBONS: .BLKB 1 ;# OF ACTIVE ICBMS ON SCREEN 61 | ICBTOL: .BLKB 1 ;# OF ICBMS TO LAUNCH 62 | EXPLCT: .BLKB 1 ;NUMBER OF ACTIVE EXPLOSIONS 63 | DEFEXP: .BLKB 1 ;DEFENSE BANG COUNT 64 | OFFEXP: .BLKB 1 ;OFFENSE BANG COUNT 65 | SETUPC: .BLKB 1 ;SETUP STATE TASK 66 | STATE: .BLKB 1 ;GAME STATE (PLAY,PAUSE,OR SETUP) 67 | NXTSTA: .BLKB 1 ;NEXT STATE 68 | ATRACT: .BLKB 1 ;ATTRACT (0)/GAME (-1) FLAG 69 | TBHD: .BLKB 1 ;TRACKBALL HORIZONTAL DISPLACMENT 70 | TBVD: .BLKB 1 ;TRACKBALL VERTICAL DISPLACEMENT 71 | EXPLOP: .BLKB 1 ;CURRENT LOC IN ICBM ARRAY 72 | MISIND: .BLKB 1 ;MISSILE ARRAY INDEX 73 | J: .BLKB 1 ;TEMP CELL 74 | K: .BLKB 1 ;TEMP CELL 75 | RANGE: .BLKB 1 ;EXPLOSION RANGE 76 | H2: .BLKB 1 ;H & V COORD. OF 2 OBJECTS FOR 77 | V2: .BLKB 1 ;WHICH DELTA IS TO BE CALCULATED 78 | H1: .BLKB 1 79 | V1: .BLKB 1 80 | SYNC: .BLKB 1 ;I/O AND MAINLINE SYNC 81 | NMMISB: .BLKB 3 ;# MISSILES LEFT IN MISSILE BASE 82 | CRCPHL: .BLKB 1 ;CURSOR POSITION (FRACTION) 83 | CRCPVL: .BLKB 1 84 | CRCPHH: .BLKB 1 ;CURSOR POSITION (INTEGER) 85 | CRCPVH: .BLKB 1 86 | WAVENO: .BLKB 1 ;WAVE # 87 | MQ: .BLKB 1 ;DIVIDE ROUTINE: TEMP CELL 88 | QUOTH: .BLKB 1 ; QUOTIENT MSB 89 | QUOTL: .BLKB 1 ; QUOTIENT LSB 90 | SAVEX: .BLKB 1 ; PRESERVES X 91 | SAVEXX: .BLKB 1 92 | DIVSOR: .BLKB 1 ; DIVSOR STORAGE 93 | NUMPLA: .BLKB 1 ;# OF PLAYERS 94 | PAUST: .BLKB 1 ;PAUSE TIMER (IN FRAMES) 95 | HADR: .BLKB 1 96 | VADR: .BLKB 1 97 | ICBFRL: .BLKB 1 ;ICBMS NEED 2 SPEED COUNTERS 98 | ICBFRH: .BLKB 1 99 | EXPFRA: .BLKB 1 ;FRAMES LEFT BEFORE UPDATING EXPLOSIONS 100 | RADIUS: .BLKB 1 ;EXPLOSION RADIUS 101 | PATERN: .BLKB 1 ;PATTERN STORAGE 102 | HDISP =H1 ;H AND V COORDINATES OF POINT ON CIRCLE 103 | VDISP =V1 104 | ICSPDL: .BLKB 1 ;ICBM SPEED (FRAMES BEFORE UPDATE)(FRACTION) 105 | ICSPDH: .BLKB 1 ;(INTEGER PORTION) 106 | PLAYUP: .BLKB 1 ;# OF PLAYER WHO'S PLAYING (0 OR 1) 107 | ICBPTL: .BLKB 1 108 | ICBPTM: .BLKB 1 109 | ABMONS: .BLKB 1 ;ABM ON SCREEN COUNT 110 | LOICBV: .BLKB 1 ;LOWEST ICBM'S HEIGHT 111 | HIICBV: .BLKB 1 ;HIGHEST ICBM'S HEIGHT 112 | ALIVE: .BLKB 1 ;ALIVE (NOT 0) A DEAD (0) FLAG FOR PLAYER 113 | PLIVES: .BLKB 2 ;# OF LIVES LEFT FOR EACH PLAYER 114 | MIRVIX: .BLKB 1 ;ICBM TO MIRV (INDEX) 115 | BONLVL: .BLKB 2 ;BONUS LEVELS (FOR EACH PLAYER) 116 | CILEFT: .BLKB 2 ;CITIES LEFT/PLAYER 117 | PLATIM: .BLKB 1 ;PLANE UPDATE TIMER 118 | PLAVEL: .BLKB 1 ;PLANE HORIZ INCREMENT (+ OR -1) 119 | HORFIR: .BLKB 1 ;HORIZ LOC AT WHICH PLANE WILL FIRE 120 | FRAME: .BLKB 1 ;FRAME COUNTER (1-60) 121 | CITARG: .BLKB 1 ;TARGET CITIES F7-D2 (MUST PRECEDE MBTARG BY 1) 122 | MBTARG: .BLKB 1 ;TARGET MISSILE BASES D7,D6,D5=LEFT,MID,RIGHT 1=TARGET 123 | MBLEFT: .BLKB 1 ;BASES LEFT D7-D5 1=ALIVE 124 | SCOCOL: .BLKB 1 ;SCORE COLOR 125 | CIDOWN: .BLKB 1 ;CITIES WIPED OUT THIS WAVE 126 | CMANGL: ;USED INSIDE UPICBM 127 | TARGET: .BLKB 1 ;ATTRCT MODE - CURSOR'S ICBM TARGET 128 | TRIPLE: .BLKB 3 ;TRIPLE PRECISION STORAGE LOC FOR OUTPUT ROUTINE 129 | RQSCOR: .BLKB 1 ;REQUEST FOR SCORE DISPLAY (NOT 0) 130 | DANGER: ;USED INSIDE UPICBM 131 | FASABM: .BLKB 1 ;USED INSIDE UPABMS 132 | SOBJID: .BLKB 1 ;SPECIAL OBJECT ID (SPITNIK,BOMBER...) 133 | BLINKS: .BLKB 1 ;BLINK STATUS (0=WRITE, 1=ERASE) 134 | BLINKT: .BLKB 1 ;BLINK TIMER (0=TIME TO BLINK) 135 | ICBTYP: .BLKB 1 ;ICBM TYPE:0=ICBM,1=CM,D7=INDEX 0 136 | CRMONS: .BLKB 1 ;# OF CMS ON SCREEN 137 | CRMTOL: .BLKB 1 ;# CRUISE MISSILES TO LAUNCH 138 | XLOOP: .BLKB 1 ;LOOP COUNTER & INDEX 139 | SMULTI: .BLKB 1 ;SCORE MULTIPLIER 140 | POTENT: .BLKB 1 ;USED BY ICBLAU INTERNALLY 141 | NEWPLA: .BLKB 1 ;# OF NEXT PLAYER (FROM END WAVE TO NEW WAVE) 142 | SLAMSN: .BLKB 1 ;SLAM SOUND FLAG (NOT 0) 143 | SPUTDS: .BLKB 1 ;DISTANCE SPUTNIK MUST GO BETWEEN FIRES 144 | SPUTAC: .BLKB 1 ;SPUTNIK ACTIVATION DELAY 145 | SPUTIM: .BLKB 1 ;SPUTNIK DELAY TIMER 146 | .PAGE 147 | .SBTTL ARRAY DEFINITION 148 | .ASECT 149 | .=100 150 | ;AB=ABM;IC=ICBM;CR=CURSOR;EX=EXPLOSION;CI=CITY 151 | ;CURRENT POSITION 152 | ; LOW BYTE HORIZ 153 | ABCPHL: .BLKB NABMS 154 | ICCPHL: .BLKB NICBMS 155 | ; HIGH BYTE HORIZ 156 | ABCPHH: .BLKB NABMS 157 | ICCPHH: .BLKB NICBMS 158 | PLCPH: .BLKB 1 159 | EXCPH: .BLKB NEXPLO 160 | ; LOW BYTE VERTICAL 161 | ABCPVL: .BLKB NABMS 162 | ICCPVL: .BLKB NICBMS 163 | ; HIGH BYTE VERTICAL 164 | ABCPVH: .BLKB NABMS 165 | ICCPVH: .BLKB NICBMS 166 | PLCPV: .BLKB 1 167 | EXCPV: .BLKB NEXPLO 168 | ;ORIGINAL POSITION (ORIGIN) 169 | ; HIGH BYTE HORZ 170 | ABOPH: .BLKB NABMS 171 | ICOPH: .BLKB NICBMS 172 | ; HIGH BYTE VERTICAL 173 | ABOPV: .BLKB NABMS 174 | ICOPV: .BLKB NICBMS 175 | ;TARGET 176 | ABTAH: .BLKB NABMS ; HORIZONTAL 177 | ICTAH: .BLKB NICBMS 178 | ; VERTICAL 179 | ABTAV: .BLKB NABMS 180 | ICTAV: .BLKB NICBMS 181 | ;MISCELLANEOUS 182 | EXTIME: .BLKB NEXPLO ;EXPLOSION ELAPSED TIME 183 | NEWEND =EXTIME ;FINAL EXPLOSION NEW RADIUS 184 | OLDEND =EXTIME+1 ; OLD RADIUS 185 | LSCORL: .BLKB 2 ;SCORE ARRAY (0=LEFT, 1=RIGHT) TRIPLE PRECISION BCD 186 | LSCORM: .BLKB 2 187 | LSCORH: .BLKB 2 188 | .ASECT 189 | .=600 190 | ;VELOCITY (# DOTS/CYCLE)(SIGNED) 191 | ABVEHL: .BLKB NABMS ; FRACTIONAL HORIZ 192 | ICVEHL: .BLKB NICBMS 193 | ; INTEGER HORIZ 194 | ABVEHH: .BLKB NABMS 195 | ICVEHH: .BLKB NICBMS 196 | ; FRACTIONAL VERTICAL 197 | ABVEVL: .BLKB NABMS 198 | ICVEVL: .BLKB NICBMS 199 | ; INTEGER VERTICAL 200 | ABVEVH: .BLKB NABMS 201 | ICVEVH: .BLKB NICBMS 202 | .PAGE 203 | .SBTTL NEGATE DOUBLE PRECISION NUMBER 204 | .MACRO DPNEGA LO,HI 205 | LDA LO 206 | EOR I,0FF 207 | CLC 208 | ADC I,1 209 | STA LO 210 | LDA HI 211 | EOR I,0FF 212 | ADC I,0 213 | STA HI 214 | .ENDM 215 | .MACRO NEGACC ;NEGATE ACCUMULATOR 216 | EOR I,0FF 217 | CLC 218 | ADC I,1 219 | .ENDM 220 | .MACRO ABSACC,?B ;ABSOLUTE VALUE OF ACC 221 | BPL B 222 | NEGACC 223 | B: 224 | .ENDM 225 | .PAGE 226 | .SBTTL AIM ENTRY 227 | .ASECT 228 | .=PROG 229 | SEI 230 | LDA A,IIRQ 231 | STA A,0F7C8 232 | LDA A,IIRQ+1 233 | STA A,0F7C9 234 | JMP RESET 235 | IIRQ: .WORD IRQ 236 | QCHKS1: .BYTE CHKSM1 237 | .PAGE 238 | .SBTTL MAINLINE 239 | START: 240 | CLI 241 | JSR INIINI 242 | JSR INILIT ;INITIALIZE LANGUAGE 243 | JSR INISOU ;INITIALIZE SOUNDS 244 | LDA I,CPRGM1 ;COLD START 245 | STA SETUPC 246 | LDA I,S.SETU 247 | STA STATE 248 | BEGIN ;MAIN LOOP 249 | BEGIN ;SYNC UP WITH I/O 250 | LSR SYNC 251 | CSEND 252 | LDA I,0 253 | STA SYNC 254 | LDA STATE 255 | IFEQ ;BRANCH TO APPROPRIATE STATE HANDLER 256 | JSR PLAY 257 | ELSE 258 | IFMI 259 | JSR PAUSE 260 | ELSE 261 | JSR SETUP 262 | THEN 263 | THEN 264 | JSR ALWAYS ;NON-STATE DEPENDENT PROCESSING 265 | LDA SWSTAT+1 266 | AND I,MTEST 267 | EQEND ;LOOP UNLESS SELF TEST 268 | JMP RESET ;SELF TEST 269 | .PAGE 270 | .SBTTL PLAY 271 | PLAY: 272 | JSR ICBLAU ;LAUNCH ICBMS 273 | JSR ABMLAU ;LAUNCH ABMS 274 | JSR PROPLA ;PROCESS SUBMARINE (IF ANY) 275 | JSR UPABMS ;UPDATE ABMS 276 | JSR UPICBM ;UPDATE ICBMS 277 | JSR PREXPL ;PROCESS EXPLOSIONS 278 | JSR UPCURS ;UPDATE CURSOR 279 | JMP TALIVE ;IS PLAYER STILL ALIVE? 280 | .PAGE 281 | .SBTTL SETUP STATE 282 | SETUP: 283 | LDX SETUPC 284 | LDA AX,SETUP1+1 285 | PHA 286 | LDA AX,SETUP1 287 | PHA 288 | RTS 289 | ; 290 | ;SETUP ROUTINES 291 | ; 292 | SETUP1: .WORD NEWGAM-1 ;NEW GAME 293 | .WORD NEWWV1-1 ;NEW WAVE 294 | .WORD 0 ;NOT USED 295 | .WORD ENDGM1-1 ;END OF GAME(PAHSE 1) 296 | .WORD ENDWV1-1 ;END OF WAVE (PHASE 1) 297 | .WORD ENDWV2-1 ;END OF WAVE (PHASE 2) 298 | .WORD ENDWV3-1 ;END OF WAVE (PHASE 3) 299 | .WORD ENDWV4-1 ;END OF WAVE (PHASE 4) 300 | .WORD ENDWV5-1 ;END OF WAVE (PHASE 5) 301 | .WORD ENDGM2-1 ;END OF GAME (PHASE 2) 302 | .WORD PREGM1-1 ;PRE GAME PART 1 303 | .WORD PREGM2-1 ;PRE GAME PART 2 304 | .WORD NUHICK-1 ;CHECK FOR 5 HI SCORES 305 | .WORD GETINI-1 ;GET HI SCORE INITIALS 306 | .WORD DSPHSC-1 ;DISPLAY HIGH SCORE TABLE 307 | .PAGE 308 | .SBTTL PAUSE STATE 309 | PAUSE: 310 | LDA FRAME 311 | AND I,03 312 | IFEQ ;UPDATE EVERY 4/60 SEC 313 | LDY PAUST 314 | IFNE ;RUN TIMER 315 | DEC PAUST 316 | THEN 317 | IFEQ ;TIME UP? 318 | LDA NXTSTA ;YES. GO TO NEXT STATE 319 | STA STATE 320 | CMP I,S.PLAY 321 | IFEQ ;NEXT STATE THE PLAY STATE? 322 | LDA ATRACT ;YES 323 | IFNE ;ATTRACT MODE? 324 | LDA I,MPLAYR ;NO ERASE MESSAGES 325 | JSR DTABEL 326 | LDA I,MICBPTS 327 | JSR DTABEL 328 | LDA I,MCOPYR 329 | JSR DTABEL 330 | LDA I,MDEFEN 331 | JSR DTABEL 332 | LDA I,0 333 | STA FIRESW ;CLEAR FIRE SWITCHES 334 | STA TBVD ;STOP TBALL 335 | STA TBHD 336 | THEN 337 | THEN 338 | THEN 339 | THEN 340 | JMP UPCURS ;UPDATE CURSOR 341 | .PAGE 342 | .SBTTL ALWAYS DO IT 343 | ;WARNING: DON'T DO ANYTHING HERE THAT COULD WIPEOUT BACKGROUND!! 344 | ALWAYS: 345 | LDA ATRACT 346 | IFEQ ;ATTRACT MODE? 347 | JSR REFRESH ;REFRESH ATTRACT MODE MESSAGE 348 | LDA $$CRDT ;NO. CREDITS? 349 | IFNE 350 | LDY I,0 ;YES. SAY NO BUTTONS PRESSED. 351 | CMP I,2 ;CS=2+ CREDITS,;CC=1 CREDIT 352 | LDA SWSTAT ;ANY START BUTTONS PRESSED? 353 | EOR I,0FF 354 | AND I,MSTRT2!MSTRT1 355 | IFNE 356 | IFCC ;YES. & ONLY 1 CREDIT 357 | AND I,MSTRT1 ;1 PLAYER BUTTON PRESSED? 358 | IFNE 359 | DEC $$CRDT ;YES. TAKE A CREDIT 360 | INY ;AND SET # PLAYERS TO 1 361 | THEN 362 | ELSE 363 | INY 364 | DEC $$CRDT ;TAKE AT LEAST 1 CREDIT 365 | AND I,MSTRT2 366 | IFNE ;2 PLAYER BUTTON PRESSED? 367 | DEC $$CRDT ;YES. TAKE ANOTHER CREDIT 368 | INY ;& SET # PLAYERS =2 369 | THEN 370 | THEN 371 | TYA 372 | STA NUMPLA ;SAVE # OF PLAYERS (0,1,2) 373 | IFNE 374 | LDA I,-1 ;START GAME. SET GAME MODE 375 | STA ATRACT 376 | LDA I,CNEWGA ;REQUEST NEW GAME SETUP 377 | STA SETUPC 378 | LDA I,S.SETU 379 | STA STATE 380 | DEC NUMPLA ;0=1 PLAYER; 1=2 PLAYERS 381 | THEN 382 | THEN 383 | THEN 384 | LDA OPTION 385 | AND I,03 386 | IFEQ ;FREE PLAY? 387 | LDA I,2 388 | STA $$CRDT ;YES. GIVE 2 CREDITS 389 | THEN 390 | THEN 391 | INC FRAME 392 | .PAGE 393 | .SBTTL SPARE TIME JOBS 394 | LDA SYNC 395 | IFEQ ;SPARE TIME & NOT BACKGROUND? 396 | LDA RQSCOR ;YES 397 | IFNE ;DISPLAY SCORE REQUEST? 398 | LDY PLAYUP ;YES 399 | JSR DSPNUP 400 | THEN 401 | LDA BLINKT 402 | IFEQ ;TIME TO UPDATE BLINKING GRAPHICS? 403 | JSR ADVICE ;YES 404 | LDA BLINKS ;REVERSE BLINK JOB(WRITE <-> ERASE) 405 | EOR I,1 406 | STA BLINKS 407 | TAX 408 | LDA AX,BLKTIM ;SET UP BLINK TIMER 409 | STA BLINKT 410 | THEN 411 | THEN 412 | LDA $LMTIM 413 | IFNE ;SLAM SWITCH TRIPPED? 414 | LDA I,4*60. 415 | STA SLAMSN ;YES 416 | THEN 417 | LDA SLAMSN 418 | IFNE 419 | DEC SLAMSN 420 | THEN 421 | RTS 422 | BLKTIM: .BYTE 10.,50. ;ERASE WRITE, TIME IN 1/60 SEC. 423 | .PAGE 424 | .SBTTL PROCESS CURSOR MOTION 425 | UPCURS: 426 | LDA CRCPVH 427 | IFNE 428 | LDA ATRACT ;ATTRACT MODE? 429 | IFEQ 430 | JSR AUTCUR ;YES. AUTOMATIC CURSOR 431 | ELSE 432 | LDY I,0 ;TBALL CONTROLLED 433 | LDA TBVD ;CURSOR 434 | STY TBVD 435 | STA VADR 436 | LDA TBHD 437 | STY TBHD 438 | STA HADR 439 | THEN 440 | JSR UPDCUR ;UPDATE CURSOR COORD. 441 | JSR MOVCUR ;MOVE CURSOR ON SCREEN 442 | THEN 443 | RTS 444 | .PAGE 445 | .PAGE 446 | .SBTTL SMART CURSOR MOVER (ATTRACT) 447 | 448 | AUTCUR: 449 | LDA I,0 450 | STA VADR 451 | STA HADR 452 | LDX TARGET 453 | LDA AX,ICCPVH 454 | IFEQ ;IS POTENTIAL TARGET ACTIVE? 455 | JSR NEWTAR ;NO. GET A NEW ONE. 456 | THEN 457 | LDX TARGET 458 | LDA AX,ICCPVH ;YES. GO AFTER THEM 459 | CMP CRCPVH 460 | IFCC ;IS ICBM HIGHER THAN CURSOR? 461 | LDA I,-AUTSPD ;NO. MOVE CURSOR DOWN TOWARD IT 462 | ELSE 463 | SEC ;YES 464 | SBC CRCPVH 465 | CMP I,0E ;IS CURSOR X DOTS BELOW ICBM? 466 | IFEQ 467 | LDA I,0 ;YES. DON'T MOVE V THEN 468 | ELSE 469 | LDA I,AUTSPD ;NO. MOVE IT DOWN UNLESS: 470 | IFCC ;IS IT < X DOTS BELOW ICBM? 471 | LDA I,-AUTSPD ;YES. MOVE IT UP 472 | THEN 473 | THEN 474 | THEN 475 | STA VADR 476 | LDA AX,ICVEHH ;CALCULATE FUTURE H POSITION 477 | STA J 478 | LDA AX,ICVEHL 479 | LSR J 480 | ROR 481 | LSR J 482 | ROR 483 | LSR J 484 | ROR 485 | LSR J 486 | ROR 487 | CLC 488 | ADC AX,ICCPHH 489 | CMP CRCPHH 490 | IFCC ;IS ICBM TO LEFT OF CURSOR? 491 | LDA I,-AUTSPD ;YES. MOVE CURSOR TO THE LEFT 492 | ELSE 493 | IFEQ ;NO. TO THE RIGHT OF CURSOR? 494 | LDA I,0 ;NO. AT SAME H POSITION 495 | ELSE 496 | LDA I,AUTSPD ;YES. MOVE CURSOR TO THE RIGHT 497 | THEN 498 | THEN 499 | STA HADR 500 | ORA VADR 501 | IFEQ ;CURSOR AT TARGET? 502 | LDA ABMONS ;YES 503 | CMP I,2 504 | IFCC ;< 2 ABMS ON SCREEN? 505 | LDX I,2 ;YES 506 | LDA CRCPHH 507 | CMP I,60 508 | IFCC ;FIND BEST BASE TO SHOOT FROM 509 | LDX I,0 510 | ELSE 511 | CMP I,0A0 512 | IFCC 513 | LDX I,1 514 | THEN 515 | THEN 516 | LDA ABMONS 517 | CLC 518 | ADC EXPLCT 519 | CMP ICBONS 520 | IFCC 521 | JSR LAUABM ;FIRE AN ABM 522 | LDY I,0 ;SEND CURSOR DOWN 523 | STY HADR 524 | DEY 525 | STY VADR 526 | JSR NEWTAR ;GET A NEW TARGET 527 | THEN 528 | THEN 529 | THEN 530 | RTS 531 | NEWTAR: LDX TARGET 532 | BEGIN ;LOOP FOR EACH ICBM 533 | DEX 534 | IFMI 535 | LDX I,NICBMS-1 536 | THEN 537 | CPX TARGET ;BACK TO ORIGINAL ARRAY SPOT? 538 | IFEQ 539 | RTS ;YES 540 | THEN 541 | LDA AX,ICCPVH 542 | NEEND ;EXIT LOOP IF ICBM IS ACTIVE 543 | STX TARGET 544 | RTS 545 | .PAGE 546 | .SBTTL ADD TBALL TO CURSOR POSITION 547 | ADCURS: 548 | LDY I,0 ;HADR VADR HAS 1 BYTE H&V TBALL INCREMENTS 549 | LDA ZX,HADR ;EXTEND SIGN INTO UPPER BYTES (H1 V1) 550 | IFMI 551 | DEY 552 | THEN 553 | TYA 554 | STA ZX,H1 555 | LDY I,6 ;SHIFT INCREMENT (MULT IT) 556 | LDA COCKTA 557 | AND ATRACT 558 | IFMI ;COCKTAIL & NOT ATTRACT MODE? 559 | LDY I,7 ;YES. 560 | THEN 561 | BEGIN 562 | ASL ZX,HADR 563 | ROL ZX,H1 564 | DEY 565 | MIEND 566 | LDA ZX,CRCPHL ;CALCULATE NEW CURSOR POSITION 567 | CLC 568 | ADC ZX,HADR 569 | STA ZX,CRCPHL 570 | LDA ZX,CRCPHH 571 | ADC ZX,H1 572 | CMP ZX,CRCPHH 573 | IFNE 574 | LDY ZX,H1 575 | IFMI ;PROTECT AGAINST WRAP-AROUND 576 | IFCS 577 | LDA I,0 578 | THEN 579 | ELSE 580 | IFCC 581 | LDA I,0FF 582 | THEN 583 | THEN 584 | THEN 585 | RTS 586 | .PAGE 587 | .SBTTL UPDATE CURSOR POSITION 588 | UPDCUR: LDX I,0 ;HORIZ 589 | JSR DOCURS 590 | LDX I,1 ;THEN VERTICAL (VERT LOC=H+1) 591 | DOCURS: 592 | JSR ADCURS ;ADD TBALL INC TO POSITION 593 | CMP AX,HMIN ;KEEP CURSOR ON SCREEN 594 | IFCC 595 | LDA AX,HMIN 596 | THEN 597 | CMP AX,HMAX 598 | IFCS 599 | LDA AX,HMAX 600 | THEN 601 | STA ZX,CRCPHH 602 | RTS 603 | HMIN: .BYTE IHMIN,IVMIN,IHMAX,IVMAX ;H & V MIN & MAX VALUES 604 | HMAX =HMIN+2 605 | .PAGE 606 | .SBTTL LAUNCH ABMS 607 | ABMLAU: 608 | LDA ATRACT 609 | IFNE ;ATTRACT MODE? 610 | LDA ICBTOL ;NO 611 | ORA ICBONS 612 | ORA CRMTOL 613 | ORA CRMONS 614 | ORA A,PLCPV 615 | IFNE ;ANYTHING TO SHOOT AT? 616 | LDA DEFEXP ;YES 617 | CLC 618 | ADC ABMONS 619 | CMP I,MAXDEX 620 | IFCC ;ROOM ON SCREEN FOR DEFENSE? 621 | ADC ICBONS 622 | CLC 623 | ADC CRMONS 624 | CLC 625 | LDX A,PLCPV 626 | IFNE ;PLANE ACTIVE? 627 | SEC ;YES. COUNTS AS POTENT BANG 628 | THEN 629 | ADC OFFEXP 630 | CMP I,NEXPLO. 631 | THEN 632 | IFCC ;BUT TOO MANY POTENTIAL BANGS? 633 | LDX I,2 ;NO. CHECK 3 FIRE SWITCHES 634 | BEGIN 635 | LDA FIRESW 636 | AND AX,FIREMA 637 | IFNE ;SWITCH PRESSED? 638 | LDA ZX,NMMISB ;YES 639 | IFNE ;ANY MISSILES LEFT AT BASE? 640 | JSR LAUABM ;LAUNCH MISSILE 641 | ELSE 642 | LDA I,SNSHOT ;NO. "NO FIRE" NOISE 643 | JSR SNDON 644 | THEN 645 | THEN 646 | DEX 647 | MIEND 648 | ELSE 649 | LDA FIRESW 650 | AND I,ALLFIR 651 | IFNE 652 | LDA I,SNSHOT ;NO FIRE SOUND 653 | JSR SNDON 654 | THEN 655 | THEN 656 | ELSE 657 | JSR DEACUR ;NO. DEACTIVATE CURSOR 658 | THEN 659 | THEN 660 | LDA I,0 ;CLEAR SWITCHES 661 | STA FIRESW 662 | RTS 663 | FIREMA: .BYTE MFIREL,MFIREC,MFIRER ;FIRE SWITCH MASKS 664 | .PAGE 665 | .SBTTL LAUNCH 1 ABM 666 | ;OUTPUT: EQ: CAN'T FIRE IT 667 | ; NE: MISSILE FIRED 668 | ; X PRESERVED 669 | ; ACC,Y DESTROYED 670 | LAUABM: ;INPUT:X=MISSILE BASE # 671 | LDY I,ABLOOP 672 | BEGIN ;FIND AN OPEN SLOT IN ABM ARRAY 673 | LDA AY,ABCPVH 674 | IFEQ ;OPEN SLOT? 675 | STY MISIND 676 | LDA I,0 677 | STA AY,ABCPVL 678 | STA AY,ABCPHL ;YES. CLEAR IT OUT 679 | LDA AX,MBCPH ;SAVE ORIGN POSITION 680 | STA AY,ABOPH ;(MISSILE BASE LOC.) 681 | STA AY,ABCPHH ;CURRENT POSITION IS SAME 682 | LDA AX,MBCPVA ;AS ORIGIN POSITION 683 | STA AY,ABOPV 684 | STA AY,ABCPVH 685 | LDA CRCPHH ;SET TARGET AS CURSOR 686 | STA AY,ABTAH ;POSITION 687 | LDA CRCPVH 688 | STA AY,ABTAV ;DISPLAY MARKER AT TARGET 689 | JSR DSPMRK 690 | JSR ABMVEL ;CALCULATE H & V MISSILE VELO 691 | LDA ATRACT 692 | IFNE ;ATTRACT? 693 | LDA ZX,NMMISB ;NO. 694 | CMP I,4 695 | IFEQ 696 | TXA 697 | JSR BASLOW ;"LOW" 698 | LDA I,SLOABM ;LOW SOUND 699 | ELSE 700 | LDA I,SABLAU ;LAUNCH SOUND 701 | THEN 702 | JSR SNDON 703 | THEN 704 | DEC ZX,NMMISB ;YES. DECREMENT # MISSILES 705 | IFEQ 706 | LDA ATRACT 707 | IFNE 708 | TXA 709 | JSR BASEMP ;"EMPTY" 710 | THEN 711 | THEN 712 | TXA 713 | TAY 714 | JSR ERAABM ;ERASE MISSILE 715 | TYA 716 | TAX 717 | LDY I,0 ;FORCE EXIT 718 | THEN 719 | DEY ;NOT AN OPEN SLOT DECREMENT ABM 720 | MIEND 721 | RTS 722 | .SBTTL UPDATE ICBM POSITIONS 723 | UPICBM: LDA Z,ICBFRH ;TIME TO UPDATE ICBMS 724 | IFNE ;AT THIS SPEED? 725 | DEC Z,ICBFRH ;NO 726 | ELSE 727 | LDA Z,ICBFRL ;YES. RESTART TIMER 728 | CLC 729 | ADC Z,ICSPDL 730 | STA Z,ICBFRL 731 | LDA Z,ICBFRH 732 | ADC Z,ICSPDH 733 | STA Z,ICBFRH 734 | LDX I,IBLOOP 735 | STX XLOOP 736 | LDA I,-1 ;MAX FOR LOWEST ICBM 737 | STA LOICBV 738 | STA MIRVIX ;ICBM TO MIRV (NONE) 739 | LDA I,0 740 | STA ICBONS 741 | STA CRMONS 742 | STA HIICBV 743 | BEGIN ;LOOP FOR ICBMS 744 | LDX XLOOP 745 | LDA AX,ICCPVH ;ACTIVE ICBM? 746 | IFNE 747 | TXA ;YES. UPDATE ITS POSITION 748 | CLC 749 | ADC I,NABMS ;CALCULATE MISSILE INDEX 750 | STA MISIND 751 | LDA AX,ICCPVH 752 | CMP LOICBV 753 | IFCC ;THIS ICBM LOWEST? 754 | STA LOICBV ;YES. SAVE ITS HEIGHT 755 | THEN 756 | CMP HIICBV ;HIGHEST? 757 | IFCS 758 | STA HIICBV ;YES 759 | THEN 760 | AND ATRACT ;NO MIRVS IF ATTRACT 761 | JSR ICPOSI ;UPDATE POSITION OF CM OR ICBM 762 | THEN 763 | DEC XLOOP 764 | MIEND 765 | LDY EXPLCT 766 | CPY I,12. 767 | IFCS ;NO MIRVS IF TOO MANY EXPLOSIONS 768 | LDA I,-1 769 | STA MIRVIX 770 | THEN 771 | THEN 772 | RTS 773 | .PAGE 774 | .SBTTL UPDATE ICBM OR CM POSITION 775 | ;INPUT: ACC=HEIGHT OF CURRENT ICBM 776 | ; X,XLOOP=INDEX INTO IC ARRAYS 777 | ;OUTPUT:XLOOP PRESERVED 778 | ; 779 | ICPOSI: 780 | TAY 781 | LDA ICBTYP 782 | AND AX,CIBITS 783 | IFEQ ;ICBM OR CM? 784 | CPY I,MIRVLO ;ICBM. IN MIRV RANGE? 785 | IFCS 786 | CPY I,MIRVHI 787 | IFCC 788 | STX MIRVIX ;YES. SAVE # FOR LATER 789 | THEN 790 | THEN 791 | JSR MISTRA ;WRITE TRAIL OVER TIP 792 | JSR UPDPOS ;UPDATE POSITION 793 | ELSE 794 | JSR CMERAS ;CM. ERASE OLD PIC 795 | JSR CMNEWP ;DERIVE NEW POSITION 796 | THEN 797 | LDX XLOOP 798 | IFCS ;AT TARGET? 799 | LDA ICBTYP ;YES 800 | AND AX,CIBITS 801 | IFNE ;CM? 802 | JSR CMSNOF ;YES.SHUT UP. 803 | ELSE 804 | LDX MISIND ;NO. ICBM 805 | JSR ERAMIS ;ERASE TRAIL 806 | LDX XLOOP 807 | THEN 808 | JSR DETONA ;YES. DETONATE IT 809 | JSR DESTROY ;YES. DESTROY CITY OR BASE 810 | ELSE 811 | LDA ICBTYP ;NO 812 | AND AX,CIBITS 813 | IFEQ ;CM OR ICBM? 814 | JSR MISTIP ;ICBM. DRAW TIPS 815 | INC ICBONS 816 | ELSE 817 | JSR CMDRAW ;CM. DRAW CM 818 | INC CRMONS 819 | THEN 820 | THEN 821 | RTS 822 | .PAGE 823 | .SBTTL UPDATE ABM POSITIONS 824 | UPABMS: LDA I,0 825 | STA ABMONS 826 | LDX I,ABLOOP ;LOOP FOR ALL ABMS 827 | BEGIN 828 | LDA AX,ABCPVH ;ACTIVE ABM? 829 | IFNE 830 | STX MISIND ;YES 831 | LDY I,2 ;DEFAULT IS SLOW (MOVE 2 DOTS) 832 | LDA AX,ABOPH 833 | CMP I,MISB2H 834 | IFEQ ;CENTER BASE? 835 | LDY I,6 ;YES. MOVE FAST 836 | THEN 837 | STY FASABM 838 | BEGIN 839 | JSR MISTRA ;CHANGE TIPS TO TRAIL 840 | JSR UPDPOS ;UPDATE ITS POSITION 841 | IFCS ;AT TARGET 842 | JSR ERAMRK ;ERASE MARKER 843 | JSR ERAMIS ;ERASE TRAIL 844 | JSR DETONA ;YES. DETONATE 845 | LDA I,0 846 | STA FASABM 847 | THEN 848 | DEC FASABM 849 | MIEND ;EXIT LOOP 850 | LDA AX,ABCPVH ;DID IT BLOW UP? 851 | IFNE 852 | JSR MISTIP ;NO. DRAW TIP 853 | INC ABMONS ;UPDATE ABM ON SCREEN COUNTER 854 | THEN 855 | THEN 856 | DEX 857 | MIEND 858 | RTS 859 | .PAGE 860 | .SBTTL UPDATE MISSILE POSITION 861 | ;INPUT:MISIND=MISSILE INDEX 862 | ; ABTAV&ABTAH=TARGET ARRAY 863 | ; ABVELH&L AND AVEHH&L =POSITION INCREMENT ARRAY 864 | ; ABCPVH&L AND ABCPHH&L=OLD POSTION ARRAY 865 | ;OUTPUT: 866 | ;CS:AT TARGET;CC NOT THERE YET 867 | ; ABCPVH&L AND ABCPHH&L ARE UPDATED TO=NEW POSTION 868 | UPDPOS: 869 | LDY MISIND 870 | LDA AY,ABCPHL ;SAVE OLD MISSILE POSITION 871 | CLC ;AND CALCULATE AND SAVE 872 | ADC AY,ABVEHL ;NEW POSITION FOR BOTH 873 | STA AY,ABCPHL ;V & H COORDINATES 874 | LDA AY,ABCPHH 875 | ADC AY,ABVEHH 876 | STA AY,ABCPHH 877 | LDA AY,ABCPVL 878 | CLC 879 | ADC AY,ABVEVL 880 | STA AY,ABCPVL 881 | LDA AY,ABCPVH 882 | ADC AY,ABVEVH 883 | STA AY,ABCPVH 884 | CMP AY,ABTAV 885 | IFNE 886 | ROR 887 | EOR AY,ABVEVH 888 | IFMI 889 | SEC 890 | RTS 891 | THEN 892 | THEN 893 | LDA AY,ABCPHH 894 | CMP AY,ABTAH 895 | IFNE 896 | ROR 897 | EOR AY,ABVEHH 898 | IFMI 899 | SEC 900 | RTS 901 | THEN 902 | THEN 903 | CLC 904 | RTS ;RETURN WITH CC A CS INFO 905 | .PAGE 906 | .SBTTL PROCESS EXPLOSIONS 907 | PREXPL: 908 | LDY EXPFRA ;TIME TO UPDATE EXPLOSIONS? 909 | DEY ;NO. DECREMENT EXPLOSION UPDATE TIMER 910 | IFMI 911 | LDY I,EXPEND-EXPFIX-2 ;YES RESET TIMER 912 | THEN 913 | STY EXPFRA 914 | LDA EXPLCT 915 | IFNE ;ANY EXPLOSIONS? 916 | ;YES. LOOP FOR NEXT BATCH OF BANGS 917 | LDX AY,EXPSIX 918 | BEGIN 919 | LDA AX,EXCPV ;EXPLOSIONS DONE YET? 920 | IFNE ;NO. UPDATE ITS TIMER. 921 | STA V2 922 | INC AX,EXTIME 923 | LDA AX,EXTIME 924 | AND I,7F ;REMOVE TYPE FLAG 925 | TAY 926 | CMP I,EXDONE 927 | IFCS ;EXPLOSION JUST FINISHED? 928 | LDA AX,EXTIME 929 | IFPL 930 | DEC DEFEXP 931 | ELSE 932 | DEC OFFEXP 933 | THEN 934 | DEC EXPLCT ;YES. DECREMENT COUNTER 935 | LDA I,0 ;DEACTIVATE IT 936 | STA AX,EXCPV 937 | ELSE 938 | LDA AX,EXCPH ;NO. SET UP EXPLOSION 939 | STA H2 ;COORDINATES 940 | ;SET UP OLD & NEW RADII AS A FUNCTION 941 | LDA AY,OLDRAD ;OF TIME. 942 | STA RADIUS 943 | LDA AY,NEWRAD 944 | STA RANGE 945 | JSR DSPEXP ;DISPLAY EXPLOSION 946 | JSR DAMAGE ;DETECT & PROCESS EXPLOSION DAMAGE. 947 | THEN 948 | THEN 949 | DEX ;NEXT EXPLOSION 950 | LDY EXPFRA 951 | TXA 952 | CMP AY,EXPFIX 953 | EQEND ;END LOOP IF DONE WITH LAST BANG IN BATCH 954 | THEN 955 | RTS 956 | EXPFIX: .BYTE -1,3,7,11.,15.,19. 957 | EXPEND: 958 | EXPSIX =EXPFIX+1 959 | OLDRAD: .BYTE 0,0,2,3,4,5,6,7,8,9,10.,11.,12.,13. 960 | .BYTE 13.,12.,11.,10.,9,8,7,6,5,4,3,2,1,0,0 961 | NEWRAD =OLDRAD+1 ;OLD & NEW EXPLOSION RADIUS VALUES. 962 | .PAGE 963 | .SBTTL MISSILE DAMAGE DETECTION & PROCESS 964 | ;INPUT: X=EXPLOSION ID 965 | ; V2 AND H2: EXPLOSION COORDINATES 966 | ; RANGE: EXPLOSION RANGE 967 | ;OUTPUT:X PRESERVED 968 | ; 969 | DAMAGE: TXA 970 | PHA 971 | LDA RANGE ;ADJUST RANGE FOR SPUTNIK (1ST MISSILE CHECKED) 972 | STA DANGER 973 | LDY I,IBLOOP+1 ;+1 FOR SPUTNIK 974 | LDA V2 975 | CMP I,LOWEST 976 | IFCS ;EXPLOSION LOWER THAN THIS DO NO DAMAGE 977 | BEGIN ;LOOP FOR ALL ICBMS & SPUTNIK 978 | LDA AY,ICCPVH 979 | IFNE ;ACTIVE ICBM? 980 | STA V1 981 | LDA AY,ICCPHH 982 | STA H1 ;YES 983 | CPY I,NICBMS ;ADD OBJECT SIZE TO EXPLOSION RANGE 984 | IFEQ 985 | LDA I,6 ;SPUTNIK/BOMBER. 986 | ELSE 987 | LDA ICBTYP 988 | AND AY,CIBITS 989 | IFEQ 990 | LDA I,1 ;ICBM 991 | ELSE 992 | LDA I,3 ;CM 993 | THEN 994 | THEN 995 | CLC 996 | ADC DANGER 997 | STA RANGE 998 | JSR DELTA ;CALCULATE EXPLOSION-ICBM 999 | ;DELTA WITHIN RANGE? 1000 | IFCC 1001 | TYA 1002 | PHA 1003 | CLC 1004 | ADC I,NABMS ;YES 1005 | STA MISIND 1006 | CPY MIRVIX 1007 | IFEQ ;WAS ICBM TO BE MIRVED? 1008 | LDA I,-1 ;YES. CLEAR IT 1009 | STA MIRVIX 1010 | THEN 1011 | CPY I,NICBMS 1012 | IFCS ;SPUTNIK OR ICBM? 1013 | JSR SPUTKI ;SPUTNIK 1014 | ELSE 1015 | LDA ICBTYP 1016 | AND AY,CIBITS 1017 | IFEQ ;CM OR ICBM? 1018 | JSR ICKILL ;ICBM KILL 1019 | ELSE 1020 | JSR CMKILL ;CM KILL 1021 | THEN 1022 | THEN 1023 | JSR DETONA ;DETONATE ICBM 1024 | PLA 1025 | TAY 1026 | THEN 1027 | THEN 1028 | DEY 1029 | MIEND 1030 | THEN 1031 | PLA 1032 | TAX 1033 | RTS 1034 | .PAGE 1035 | .SBTTL SPUTNIK KILL 1036 | SPUTKI: 1037 | JSR STSNOF ;SOUND OFF 1038 | LDA I,0 ;DEACTIVATE SPUTNIK 1039 | STA HORFIR 1040 | STA SPUTIM 1041 | LDX I,3 ;SUB. GIVE MULTIPLE SCORE (4X ICBM) 1042 | BNE GEKILL ;ALWAYS 1043 | ICKILL: DEC ICBONS ;ICBM 1044 | JSR DETARG ;CLEAR TARGET BIT 1045 | LDX MISIND 1046 | JSR ERAMIS ;ERASE TRAIL 1047 | LDX I,0 ;GIVE MULTIPLE SCORE (IX ICBM) 1048 | LDY MISIND 1049 | LDA AY,ABCPVH ;GET ICBM HEIGHT 1050 | CMP I,LOWEST ;DON'T GIVE POINTS FOR REAL LOW ICBM 1051 | BCS GEKILL ;BRANCH IF KILL OK 1052 | RTS 1053 | CMKILL: 1054 | DEC CRMONS ;DECREASE CM ON SCREEN COUNT 1055 | JSR DETARG ;DETARGET CITY OR BASE 1056 | JSR CMSNOF ;CM SOUND OFF 1057 | LDX I,4 ;5X ICBM 1058 | GEKILL: JSR ICMULT 1059 | LDY PLAYUP 1060 | JSR UPSCOR ;UPDATE SCORE (2 ICBMS) 1061 | JMP EXSNON ;BANG ON 1062 | DETARG: LDY MISIND ;DETARGET CITY OR BASE 1063 | LDA AY,ABTAH 1064 | PHA 1065 | LDA I,0 1066 | STA AY,ABTAH ;CLEAR H TARGET 1067 | PLA 1068 | LDY I,IBLOOP 1069 | BEGIN ;ANY OTHERS AIMED AT THIS TARGET? 1070 | CMP AY,ICTAH 1071 | IFEQ 1072 | RTS ;YES. DON'T DETARGET IT 1073 | THEN 1074 | DEY 1075 | MIEND 1076 | LDY I,NCITY+NMISBA 1077 | BEGIN ;FIND CITY OR BASE TARGETED 1078 | DEY 1079 | CMP AY,HTARGS 1080 | EQEND 1081 | LDA I,0 1082 | JMP SETARG ;DETARGET IT 1083 | .PAGE 1084 | .SBTTL DESTROY A CITY OR BASE 1085 | ;INPUT: MISIND=ICBM THAT GOT THRU 1086 | ;OUTPUT: X PRESERVED, ACC, Y DESTROYED 1087 | ; 1088 | DESTROY: 1089 | LDY MISIND 1090 | LDA AY,ABTAH 1091 | LDY I,9 1092 | BEGIN ;FIND INDEX OF CITY OR BASE TARGETED 1093 | DEY 1094 | CMP AY,HTARGS 1095 | EQEND 1096 | LDA I,0 1097 | JSR SETARG ;DETARGET 1098 | CPY I,NCITY 1099 | IFCS ;CITY OR BASE? 1100 | LDA I,0 ;BASE 1101 | STA AY,NMMISB-NCITY ;DESTROY ALL REMAINING ABMS 1102 | LDA AY,CIBITS-NCITY ;AT BASE 1103 | EOR I,0E0 1104 | AND MBLEFT 1105 | CMP MBLEFT 1106 | IFNE ;BASE ALREADY DESTROYED? 1107 | STA MBLEFT ;NO. DESTROY IT & MAKE SOUND 1108 | LDA I,SOHNO 1109 | JSR SNDON 1110 | TYA 1111 | SEC 1112 | SBC I,NCITY 1113 | JSR BASEMP ;"EMPTY" 1114 | THEN 1115 | ELSE 1116 | LDA AY,CIBITS ;CITY. REMOVE CITY FROM ALIVE 1117 | EOR I,0FC ;STATUS 1118 | LDY PLAYUP 1119 | AND AY,CILEFT 1120 | CMP AY,CILEFT 1121 | IFNE 1122 | STA AY,CILEFT 1123 | LDA AY,PLIVES 1124 | IFNE ;DECREMENT # OF CITIES 1125 | SEC 1126 | SBC I,1 1127 | STA AY,PLIVES 1128 | THEN 1129 | INC CIDOWN ;INCREMENT # CITIES DESTROYED 1130 | LDA I,SOHNO 1131 | JSR SNDON ;MAKE DESTROY SOUND 1132 | THEN 1133 | THEN 1134 | RTS 1135 | .PAGE 1136 | .PAGE 1137 | .SBTTL LAUNCH ICBMS 1138 | ICBLAU: 1139 | LDA ICBTOL 1140 | ORA CRMTOL 1141 | IFNE ;IS OFFENSE STILL ALIVE? 1142 | LDA WAVENO ;YES. 1143 | ASL 1144 | EOR I,0FF ;LAUNCH IF LAUGHT - (WAVENO*2)>=HEIGHT OF HIGHEST ICBM 1145 | SEC 1146 | ADC I,LAUHGT 1147 | CMP I,LAULOW 1148 | IFCC ; X-1 (WHICH 1 TO USE) 1509 | PLA 1510 | DEY 1511 | BEGIN ;LOOP UP TO THE XTH 1 IN ACC 1512 | BEGIN ;LOOP UP TO NEXT 1 1513 | ASL 1514 | INY 1515 | CSEND 1516 | DEX 1517 | MIEND 1518 | RTS 1519 | ANDBIT: .BYTE 0,1,3,3,7,7,7,7 1520 | 1521 | .PAGE 1522 | .SBTTL CLEAR/SET TARGET BIT 1523 | ;INPUT: 0 OR FF IF BIT IS TO BE CLEARED OR SET 1524 | ; Y=INDEX INTO TARGET ARRAY (0-8) 1525 | ;OUTPUT:BIT SET OR CLEARED IN CITARG (D7-D2=INDEX 0-5) 1526 | ; OR MBTARG (D7-D5=INDEX 6-8) 1527 | ; Y PRESERVED; ACC,J,K DESTROYED 1528 | ; 1529 | SETARG: STA J ;SAVE CLEAR/SET FLAG 1530 | STY K 1531 | LDX I,0 1532 | TYA 1533 | CMP I,6 1534 | IFCS ;BASE INDEX? 1535 | SEC ;YES. ADJUST BIT INDEX 1536 | SBC I,6 1537 | TAY 1538 | LDX I,1 1539 | THEN 1540 | LDA AY,CIBITS ;CLEAR BITS 1541 | EOR I,0FF 1542 | AND ZX,CITARG 1543 | BIT J 1544 | IFMI ;SET BIT? 1545 | ORA AY,CIBITS ;YES 1546 | THEN 1547 | STA ZX,CITARG 1548 | LDY K 1549 | RTS 1550 | .PAGE 1551 | .SBTTL PROCESS MISSILE DETONATION 1552 | ;INPUT: 1553 | ; MISIND: MISSILE INDEX (ABM=0) 1554 | ;OUTPUT: PATERN=FF IF AN EXPLOSION HAPPENED, 0 IF NO ROOM 1555 | ; X PRESERVED; ACC,Y DESTROYED 1556 | ; 1557 | DETONA: STX SAVEX ;SAVE X 1558 | LDX MISIND 1559 | LDA AX,ABCPVH 1560 | CMP I,TOPSCR-+1 ;WAS EXPLOSION TOO CLOSE TO TOP OF SCREEN? 1561 | IFCC 1562 | LDY EXPLOP ;GET NEXT BANG SLOT 1563 | DEC EXPLOP ;PT TO NEXT SLOT 1564 | IFMI 1565 | LDA I,EXLOOP 1566 | STA EXPLOP 1567 | THEN 1568 | INC EXPLCT ;YES. BUMP UP EXPLOSION COUNTER 1569 | LDA AX,ABCPHH 1570 | STA AY,EXCPH ;SET UP EXPLOSION COORDINATES 1571 | LDA AX,ABCPVH 1572 | STA AY,EXCPV 1573 | CPX I,8 ;SET EXPLOSION TYPE AND 1574 | IFCS ;INCREMENT OFFENSE OR DEFENSE BANG COUNT 1575 | INC OFFEXP ;OFFENSE (ICBM) 1576 | LDA I,80 ;OFFENSE CODE FOR EXTIME 1577 | ELSE 1578 | INC DEFEXP ;DEFENSE CABM 1579 | LDA I,0 ;DEFENSE CODE 1580 | THEN 1581 | STA AY,EXTIME 1582 | THEN 1583 | LDA I,0 ;OPEN THE MISSILE SLOT 1584 | STA AX,ABCPVH 1585 | STA AX,ABCPHH ;(FOR TARGETING) 1586 | LDX SAVEX 1587 | RTS 1588 | .PAGE 1589 | .SBTTL CALCULATE DELTA FROM OBJECT 1 TO 2 1590 | ;INPUT: V1 & H1: OBJECT 1 COORDINATES 1591 | ; V2 & H2: OBJECT 2 COORDINATES 1592 | ;OUTPUT:CC (IN RANGE) OR CS (OUT OF RANGE) 1593 | ; 1594 | DELTA: LDA V1 1595 | CMP V2 1596 | IFCS 1597 | SBC V2 1598 | ELSE 1599 | LDA V2 1600 | SEC 1601 | SBC V1 1602 | THEN 1603 | CMP RANGE ;VERTICAL IN RANGE? 1604 | IFCC 1605 | STA VADR ;YES 1606 | LDA H1 1607 | CMP H2 1608 | IFCS 1609 | SBC H2 1610 | ELSE 1611 | LDA H2 1612 | SEC 1613 | SBC H1 1614 | THEN 1615 | CMP RANGE ;HORIZ DELTA IN RANGE? 1616 | IFCC 1617 | CMP VADR ;YES. SET J=SMALLEST DELTA, 1618 | IFCC ;K=LARGEST DELTA 1619 | STA J 1620 | LDA VADR 1621 | STA K 1622 | ELSE 1623 | STA K 1624 | LDA VADR 1625 | STA J 1626 | THEN 1627 | LDA J ;MAX DELTA + 3/8 MINIMUM DELTA 1628 | LSR ;WHICH APPROXIMATES THE ACTUAL 1629 | CLC ;VALUE VERY CLOSELY 1630 | ADC J 1631 | LSR 1632 | LSR 1633 | CLC 1634 | ADC K 1635 | CMP RANGE 1636 | THEN 1637 | THEN 1638 | RTS 1639 | .PAGE 1640 | .SBTTL CALCULATE MISSILE VELOCITY & DISPLAY INCREMENT 1641 | ;X AND Y PRESERVED 1642 | 1643 | ABMVEL: STY MISIND 1644 | BPL GENVEL 1645 | ICBVEL: TXA 1646 | CLC 1647 | ADC I,NABMS 1648 | STA MISIND 1649 | GENVEL: 1650 | TXA ;SAVE X AND Y 1651 | PHA 1652 | TYA 1653 | PHA 1654 | LDX MISIND 1655 | LDA AX,ABTAV 1656 | CMP AX,ABCPVH ;CALCULATE ABSOLUTE VALUES FOR 1657 | IFCS ;H & V DELTAS FROM ORIGIN TO TARGET 1658 | SBC AX,ABCPVH 1659 | ELSE 1660 | LDA AX,ABCPVH 1661 | SEC 1662 | SBC AX,ABTAV 1663 | THEN 1664 | STA VADR 1665 | LDA AX,ABTAH 1666 | CMP AX,ABCPHH 1667 | IFCS 1668 | SBC AX,ABCPHH 1669 | ELSE 1670 | LDA AX,ABCPHH 1671 | SEC 1672 | SBC AX,ABTAH 1673 | THEN 1674 | STA HADR 1675 | ;CALCULATE # FRAMES TO TAKE TO 1676 | ;REACH TARGET 1677 | ;CALCULATE # DOTS FROM ORIGIN TO GOAL. 1678 | LDA HADR ;SET J=MINIMUM DELTA AND 1679 | CMP VADR ;K=MAXIMUM DELTA 1680 | IFCC 1681 | STA J 1682 | LDA VADR 1683 | STA K 1684 | ELSE 1685 | STA K 1686 | LDA VADR 1687 | STA J 1688 | THEN 1689 | ;DELTA = MAX DELTA + 3/8 MIN. DELTA 1690 | LDA J 1691 | LSR 1692 | CLC 1693 | ADC J 1694 | LSR 1695 | LSR 1696 | CLC 1697 | ADC K 1698 | IFCS ;IF DELTA >255 1699 | LDA I,0FF ;THEN SET TO MAX 1700 | THEN 1701 | STA J 1702 | ;CALCULATE H & V VELOCITIES 1703 | ; 1704 | ;VERTICAL VELOCITY CALCULATION= 1705 | LDY J ;VERTICAL DELTA/TOTAL DELTA 1706 | LDA VADR 1707 | JSR DIVIDE 1708 | LDA QUOTH 1709 | STA AX,ABVEVH 1710 | LDA QUOTL 1711 | STA AX,ABVEVL 1712 | ;HORIZ VELOCITY CALCULATION 1713 | LDY J ;HORIZ DELTA/TOTAL DELTA 1714 | LDA HADR 1715 | JSR DIVIDE 1716 | LDA QUOTH 1717 | STA AX,ABVEHH 1718 | LDA QUOTL 1719 | STA AX,ABVEHL 1720 | LDA AX,ABTAV ;SET SIGN ON VELOCITIES 1721 | CMP AX,ABCPVH 1722 | IFCC 1723 | DPNEGA , 1724 | THEN 1725 | LDA AX,ABTAH 1726 | CMP AX,ABCPHH 1727 | IFCC 1728 | DPNEGA , 1729 | THEN 1730 | PLA ;RESTORE X AND Y 1731 | TAY 1732 | PLA 1733 | TAX 1734 | RTS 1735 | .PAGE 1736 | .SBTTL DIVIDE 1737 | ;INPUT: ACC=DIVIDEND 1738 | ; Y=DIVISOR 1739 | ;OUTPUT:QUOTH=MSB OF QUOTIENT(INTEGER) 1740 | ; QUOTL=LSB OF QUOTIENT(FRACTION) 1741 | ; J PRESERVED 1742 | ; 1743 | DIVIDE: 1744 | STY DIVSOR 1745 | STX SAVEX 1746 | JSR DIVIT 1747 | STX QUOTH 1748 | LDX I,0 1749 | STX MQ 1750 | JSR DIVIT1 1751 | STX QUOTL 1752 | LDX SAVEX 1753 | RTS 1754 | ; 1755 | DIVIT: STA MQ 1756 | LDA I,0 1757 | DIVIT1: LDY I,7 1758 | BEGIN 1759 | ROL MQ 1760 | ROL 1761 | IFCS 1762 | SBC DIVSOR 1763 | SEC 1764 | BCS 20$ 1765 | THEN 1766 | CMP DIVSOR 1767 | IFCS 1768 | SBC DIVSOR 1769 | THEN 1770 | 20$: DEY 1771 | MIEND 1772 | ROL MQ 1773 | LDX MQ 1774 | RTS 1775 | .PAGE 1776 | .SBTTL PLAYER HEALTH ANALYSIS 1777 | TALIVE: 1778 | LDY PLAYUP 1779 | LDA NMMISB 1780 | ORA NMMISB+1 1781 | ORA NMMISB+2 1782 | STA K 1783 | IFEQ ;ANY BASES LEFT? 1784 | LDA AY,CILEFT ;NO 1785 | IFNE 1786 | LDA CIDOWN 1787 | CMP I,3 1788 | IFCS 1789 | LDA I,0 1790 | THEN 1791 | THEN ;ALL ABM BASES EMPTY AND MAX 1792 | IFEQ ;# CITIES DESTROYED? 1793 | LDA I,0 ;YES. STOP OFFENSE 1794 | STA HORFIR 1795 | STA ICBTOL 1796 | STA CRMTOL 1797 | LDA A,PLCPV ;NO 1798 | ORA ABMONS 1799 | ORA EXPLCT 1800 | IFEQ ;SPUTNIK TO CLEAR OFF? 1801 | LDA I,S.SETU ;NO. END WAVE 1802 | STA STATE 1803 | LDA I,CENDW1 1804 | STA SETUPC 1805 | THEN 1806 | THEN 1807 | THEN 1808 | LDA ABMONS 1809 | ORA EXPLCT 1810 | ORA K 1811 | IFEQ ;ANY ABMS OR BANGS ON SCREEN? 1812 | LDA I,-1 ;NO. REQUEST CLEAN SCREEN 1813 | STA ALIVE 1814 | THEN 1815 | LDA ALIVE 1816 | IFNE ;CLEAN SCREEN? 1817 | LDA I,0 ;YES. SPEED OFF SPUTNIK 1818 | STA PLATIM 1819 | STA ICBFRH 1820 | STA ICSPDH 1821 | STA ICSPDL 1822 | JSR DEACUR ;ERASE CURSOR 1823 | THEN 1824 | LDA ICBTOL 1825 | ORA ABMONS 1826 | ORA CRMTOL 1827 | ORA ICBONS 1828 | ORA CRMONS 1829 | ORA A,PLCPV 1830 | ORA EXPLCT 1831 | IFEQ ;OFFENSE DEAD & NO BANGS? 1832 | LDA I,S.SETU ;YES. END WAVE 1833 | STA STATE 1834 | LDA I,CENDW1 1835 | STA SETUPC 1836 | THEN 1837 | RTS 1838 | QCHKS3: .BYTE CHKSM3 1839 | .PAGE 1840 | .SBTTL PLAY STATE MESSAGE 1841 | ADVICE: 1842 | LDA ATRACT 1843 | IFNE ;ATTRACT? 1844 | JMP BLNKAR ;NO. BLINK PLAYER ARROW 1845 | THEN 1846 | LDA STATE ;ATTRACT 1847 | CMP I,S.PLAY 1848 | IFEQ 1849 | LDY I,BCKGND ;ATTRACT: OUTPUT CITY ARROWS 1850 | LDA BLINKS 1851 | IFEQ 1852 | LDY I,PLACOL 1853 | THEN 1854 | STY PATERN ;OUTPUT A BLANK OR AN ARROW? 1855 | LDX I,NCITY-1 ;YES 1856 | BEGIN ;LOOP FOR EACH CITY 1857 | STX SAVEX 1858 | LDA PATERN ;COLOR OF ARROWS 1859 | STA PATRN1 1860 | LDY I,AROHIT 1861 | LDA AX,CICPH 1862 | TAX 1863 | LDA I,SARROW ;GET STAMP # OF COORDINATES 1864 | JSR WSTAMP ;WRITE STAMP 1865 | LDX SAVEX 1866 | DEX 1867 | MIEND 1868 | THEN 1869 | RTS 1870 | AROHIT =24 1871 | SARROW =28. ;ARROW STAMP # 1872 | .PAGE 1873 | .SBTTL PRE-GAME SHOW PART 1 1874 | 1875 | PREGM1: 1876 | LDA I,10 ;TIMER FOR "GROUND ZERO" 1877 | STA ICBFRH 1878 | LDA I,40 ;TIMER FOR "ATARI..." 1879 | STA ICBFRL 1880 | LDA I,0 1881 | STA ATRACT ;ATTRACT MODE 1882 | STA FLSHCO 1883 | LDX I,7 1884 | LDA I,CBLACK 1885 | BEGIN 1886 | STA X,COL000 1887 | DEX 1888 | MIEND 1889 | JSR BLEWIT 1890 | LDA I,MGROUND 1891 | JSR DTABML 1892 | LDA I,MZERO 1893 | JSR DTABML 1894 | LDA I,CRED 1895 | STA COL110 1896 | LDA I,CPRGM2 1897 | STA SETUPC 1898 | RTS 1899 | .PAGE 1900 | .SBTTL PRE-GAME SHOW PART 2 1901 | PREGM2: 1902 | LDA ICBFRL 1903 | IFNE ;MISSILE COMMAND ALIVE? 1904 | DEC ICBFRL ;YES 1905 | ELSE 1906 | DEC ICBFRH ;NO POPS DONE? 1907 | IFEQ 1908 | LDA I,CNEWGA ;YES, NEW GAME 1909 | STA SETUPC 1910 | ELSE 1911 | JSR POPS 1912 | THEN 1913 | THEN 1914 | RTS 1915 | .PAGE 1916 | .SBTTL NEW GAME SETUP 1917 | 1918 | NEWGAM: 1919 | JSR INILIT ;CHECK LANGUAGE & COCKTAIL 1920 | LDA I,REDPAT 1921 | STA SCOCOL ;SCORE IS RED 1922 | LDA ATRACT 1923 | IFNE ;ATTRACT MODE? 1924 | JSR CLRSCO ;NO. CLEAR SCORE 1925 | THEN 1926 | LDA I,0 ;SET EACH PLAYER'S SKILL LEVEL TO NOVICE 1927 | STA NEWPLA ;START WITH 1ST PLAYER 1928 | STA PLIVES+1 ;MAKE SURE NO PHANTOM PLAYER #2 1929 | STA CILEFT+1 1930 | STA BONLVL ;BONUS LEVELS START AT 10000 1931 | STA BONLVL+1 1932 | LDA I,1 ;START WITH WAVE 1 1933 | STA WAVENO 1934 | LDX NUMPLA 1935 | LDA OPTIO2 1936 | AND I,SCITYM 1937 | TAY 1938 | BEGIN ;GIVE EACH ACTIVE PLAYER LIFE 1939 | LDA AY,STCITY ;# OF CITIES 1940 | STA X,PLIVES 1941 | LDA AY,STCIMA 1942 | STA ZX,CILEFT ;MASK FOR REMAINING CITIES 1943 | DEX 1944 | MIEND 1945 | LDA I,CNEWAV ;REQUEST NEW WAVE 1ST PHASE 1946 | STA SETUPC 1947 | RTS 1948 | STCITY: .BYTE 6,4,5,7 1949 | STCIMA: .BYTE 0FC,0E8,0F8,0FC 1950 | .PAGE 1951 | .SBTTL 1ST PHASE OF NEW WAVE SETUP 1952 | NEWWV1: 1953 | LDA NEWPLA 1954 | STA PLAYUP 1955 | JSR INISOU ;SOUNDS OFF 1956 | LDA I,SNEWAV ;NEW WAVE SOUND 1957 | JSR SNDON 1958 | LDA ATRACT 1959 | IFEQ 1960 | LDA I,1 1961 | STA WAVENO 1962 | LDA I,18. 1963 | ELSE 1964 | LDY WAVENO 1965 | CPY I,ICBWEN-ICBWAV ;DON'T GO PAST END OF TABLE 1966 | IFCS 1967 | LDY I,ICBWEN-ICBWAV 1968 | THEN 1969 | LDA AY,ICBWAV-1 1970 | THEN 1971 | STA ICBTOL 1972 | LDX AY,CRMWAV-1 1973 | STX CRMTOL 1974 | LDA I,GAMEFL ;SET UP FLASH COLOR FOR GAME 1975 | STA FLSHCO 1976 | JSR MAKMAP 1977 | JSR SETICS ;SET UP ICBM SPEED & SCORING 1978 | LDA I,-1 1979 | STA MIRVIX ;NO MIRVS 1980 | LDA I,0 ;CLEAR OUT ALL ABMS, EXPLOSIONS 1981 | STA ALIVE 1982 | STA EXPLOP 1983 | STA EXPLCT 1984 | STA OFFEXP 1985 | STA DEFEXP 1986 | STA CRMONS 1987 | STA HORFIR 1988 | STA ICBTYP 1989 | STA ICBONS 1990 | STA TARGET ;START ATTRACT CURSOR AT THIS ICBM. 1991 | STA FIRESW 1992 | STA EXPFRA ;CLEAR OUT EXPLOSION & ABM UPDATE COUNTERS. 1993 | STA MBTARG ;NO BASSES OR CITIES TARGETED YET 1994 | STA CITARG 1995 | STA ICBFRH 1996 | STA CIDOWN ;CITIES WIPED OUT 1997 | LDX I,EXTIME-ABCPHL 1998 | BEGIN ;CLEAR OUT MOVING OBJECT ARRAYS 1999 | STA AX,ABCPHL-1 2000 | DEX 2001 | EQEND 2002 | LDA I,0E0 2003 | STA MBLEFT ;ALL 3 BASES ALIVE 2004 | LDA ATRACT 2005 | IFNE 2006 | JSR ARROW ;POINT TO ACTIVE PLAYER'S SCORE 2007 | THEN 2008 | JSR WARMSG ;ISSUE WARNING MESSAGE 2009 | LDY I,NMISBA-1 2010 | BEGIN ;FOR EACH BASE: 2011 | LDA I,MAXMIS ;GIVE BASE MISSILES 2012 | STA AY,NMMISB 2013 | JSR MISUPD ;DRAW BASE 2014 | DEY 2015 | MIEND 2016 | JSR ACTCUR ;ACTIVATE CURSOR 2017 | LDA I,S.PLAY 2018 | STA NXTSTA 2019 | LDA I,S.PAUS ;NOW WAIT X SECONDS BEFORE PLAY STATE 2020 | STA STATE 2021 | LDA I,2*PSECNS 2022 | STA PAUST 2023 | RTS 2024 | .PAGE 2025 | .SBTTL SET UP ICBM SPEED & SCORING 2026 | ;INPUT: PLAYUP: PLAYER UP 2027 | 2028 | SETICS: 2029 | LDA I,0 2030 | STA ICBPTL 2031 | STA ICBPTM 2032 | LDA WAVENO 2033 | CLC 2034 | ADC I,1 2035 | LSR 2036 | CMP I,MAXMUL 2037 | IFCS 2038 | LDA I,MAXMUL 2039 | THEN 2040 | STA SMULTI 2041 | TAX 2042 | BEGIN ;ICBM PTS X WAVE NUMBER 2043 | SED 2044 | LDA ICBPTL ;INCREASE POINTS FOR DOWNING ICBMS 2045 | CLC 2046 | ADC I,25 2047 | STA ICBPTL 2048 | LDA ICBPTM 2049 | ADC I,0 2050 | STA ICBPTM 2051 | CLD 2052 | DEX 2053 | EQEND 2054 | LDY WAVENO ;SET UP ICBM FRAME UPDATE RATE 2055 | CPY I,WICEND-WICSPH ;AS A FUNC OF WAVE #. 2056 | IFCS 2057 | LDY I,WICEND-WICSPH 2058 | THEN 2059 | LDA AY,WICSPL-1 2060 | STA ICSPDL 2061 | LDA AY,WICSPH-1 2062 | STA ICSPDH 2063 | CPY I,WSPEND-WSPFIR+SPUTWV-1 2064 | IFCS 2065 | LDY I,WSPEND-WSPFIR+SPUTWV-1 2066 | THEN 2067 | LDA AY,WSPFIR-SPUTWV ;DISTANCE BETWEEN SPUTNIK FIRES 2068 | STA SPUTDS 2069 | LDA AY,WSPLAU-SPUTWV ;SPUTNIK ACTIVATION SEPARATION 2070 | STA SPUTAC 2071 | STA SPUTIM 2072 | RTS 2073 | .PAGE 2074 | .SBTTL END OF WAVE, PHASE 1 2075 | ENDWV1: JSR CLEANU ;CLEAN UP ANY ICBMS 2076 | JSR DEACUR ;DEACTIVATE CURSOR 2077 | JSR CLRTRI ;CLEAR BONUS ACCUMULATOR 2078 | LDA I,0 2079 | STA MISIND ;CLEAR ABM COUNTER 2080 | LDX I,CENDW5 2081 | LDA ATRACT 2082 | IFNE 2083 | LDA NMMISB 2084 | ORA NMMISB+1 2085 | ORA NMMISB+2 2086 | IFNE ;ANY UNUSED ABM'S? 2087 | LDA I,MABMPTS ;YES. "BONUS PTS" 2088 | JSR DTABMS 2089 | LDX I,CENDW2 ;GO TALLY ABMS 2090 | ELSE 2091 | LDY PLAYUP 2092 | LDA AY,CILEFT ;NO. ANY CITIES LEFT? 2093 | IFNE 2094 | LDA I,MABMPTS 2095 | JSR DTABMS ;YES. "BONUS PTS" 2096 | LDX I,CENDW3 ;ANALYZE CITY STATUS 2097 | THEN 2098 | THEN 2099 | THEN 2100 | STX SETUPC 2101 | 2102 | RTS 2103 | .PAGE 2104 | .SBTTL END OF WAVE, PHASE 2 2105 | ENDWV2: 2106 | DEC EXPFRA ;TALLY UP BONUS PTS FOR UNUSED ABMS HERE. 2107 | IFMI ;TIME FOR NEXT ABM? 2108 | LDY I,NMISBA-1 ;YES. 2109 | BEGIN ;LOOP THRU EACH BASE STARTING AT END UNTIL ABM FOUND. 2110 | LDA AY,NMMISB 2111 | IFNE ;ANY ABMS AT THIS BASE? 2112 | SEC ;YES. TAKE 1 AWAY. 2113 | SBC I,1 2114 | STA AY,NMMISB 2115 | JSR ERAABM ;ERASE 1 ABM PIC. 2116 | JSR ABMADD ;ADD PTS FOR 1 UNUSED ABM TO SCORE 2117 | LDX I,HBONPT 2118 | LDY I,VABMBO 2119 | LDA I,REDPAT 2120 | JSR DSPNUM 2121 | LDA I,VABMBO+2 ;DRAW ONE ABM ON BONUS LINE 2122 | EOR I,0FF 2123 | STA OLDPOS+1 ;(VERTICAL) 2124 | LDA MISIND ;(# OF ABMS COUNTED) 2125 | ASL 2126 | ASL 2127 | CLC 2128 | ADC I,7A 2129 | BIT COCKTA 2130 | IFVS 2131 | EOR I,0FF ;(HORIZ COCKTAIL FLIP) 2132 | THEN 2133 | STA OLDPOS ;(HORIZ) 2134 | LDA I,BLUE ;(COLOR) 2135 | JSR ONEMIS ;(DRAW) 2136 | INC MISIND 2137 | LDA I,5 ;RESET TIMER FOR NEXT 1. 2138 | STA EXPFRA 2139 | LDA I,SUNABM 2140 | JSR SNDON ;MAKE BONUS NOISE. 2141 | RTS ;EXIT 2142 | THEN 2143 | DEY ;NEXT BASE. 2144 | MIEND ;ENDLOOP AFTER LAST BASE. 2145 | LDA I,CENDW3 ;REQUEST END OF WAVE PHASE 3. 2146 | STA SETUPC 2147 | LDX I,1*PSECNS ;PAUSE 2148 | LDY PLAYUP 2149 | LDA AY,CILEFT 2150 | IFNE ;ANY CITIES LEFT? 2151 | LDX I,0 ;YES. NO PAUSE 2152 | THEN 2153 | STX PAUST 2154 | JSR UPSCOR 2155 | LDA I,S.SETU 2156 | STA NXTSTA 2157 | LDA I,S.PAUS 2158 | STA STATE 2159 | THEN 2160 | RTS 2161 | .PAGE 2162 | .SBTTL CITY BONUS 2163 | ENDWV3: 2164 | LDA I,CENDW5 2165 | STA SETUPC 2166 | LDY PLAYUP 2167 | LDA AY,CILEFT 2168 | AND ATRACT 2169 | IFNE ;ANY CITIES LEFT? 2170 | LDX I,0 ;YES. COUNT THEM 2171 | BEGIN 2172 | ASL 2173 | IFCS 2174 | INX 2175 | THEN 2176 | CMP I,0 2177 | EQEND 2178 | TXA 2179 | THEN 2180 | IFNE ;ANY CITIES LEFT? 2181 | STX MISIND ;YES. # OF CITIES LEFT 2182 | LDA I,0 2183 | STA ICBTOL 2184 | LDA I,CENDW4 2185 | STA SETUPC ;CITY TALLY WAVE 2186 | JSR CLRTRI ;CLEAR TRIPLE 2187 | THEN 2188 | RTS 2189 | .PAGE 2190 | .SBTTL END OF WAVE PART 4-TALLY CITIES 2191 | ;INPUT: MISIND:#OF CITIES LEFT TO TALLY 2192 | ; EXPFRA:UPDATE TIMER 2193 | ; 2194 | ENDWV4: 2195 | DEC EXPFRA 2196 | IFMI ;TIME TO UPDATE 2197 | LDY PLAYUP ;YES 2198 | LDA AY,CILEFT 2199 | STA J 2200 | LDX MISIND 2201 | LDY I,CILOOP+1 2202 | BEGIN 2203 | DEY ;FIND INDEX FOR XTH LIVING CITY 2204 | LDA J 2205 | AND AY,CIBITS 2206 | IFNE 2207 | DEX 2208 | THEN 2209 | CPX I,0 2210 | EQEND 2211 | JSR ERACIT ;ERASE CITY 2212 | LDX I,3 ;4 ICBM POINTS/CITY 2213 | JSR ICMUL2 ;ADDED TO TRIPLE 2214 | LDX I,HBONPT 2215 | LDY I,VCITBO ;X,Y COORDINATES 2216 | LDA I,REDPAT ;RED NUMBERS 2217 | JSR DSPNUM ;DISPLAY # POINTS SO FAR/CITIES 2218 | LDA ICBTOL 2219 | INC ICBTOL 2220 | ASL 2221 | ASL 2222 | ASL 2223 | ASL 2224 | CLC 2225 | ADC ICBTOL 2226 | CLC 2227 | ADC I,80 2228 | TAX ;HORIZ POS 2229 | LDY I,VCITBO ;VERT POS 2230 | LDA I,BLUE+ ;COLORS 2231 | JSR DACITY ;DRAW CITY ON BONUS LINE 2232 | LDA I,SUNABM 2233 | JSR SNDON ;MAKE BONUS NOISE 2234 | LDA I,10. 2235 | STA EXPFRA ;# FRAMES TO WAIT 2236 | DEC MISIND 2237 | IFEQ ;ANY MORE ? 2238 | LDA I,CENDW5 ;NO.GO TO NEXT SETUP 2239 | STA SETUPC ;STATE 2240 | LDA I,S.PAUS ;AFTER PAUSING 2241 | STA STATE 2242 | LDA I,1*PSECNS 2243 | STA PAUST 2244 | LDA I,S.SETU 2245 | STA NXTSTA 2246 | LDY PLAYUP 2247 | JSR UPSCOR ;ADD TOTAL BONUS INTO PLAYER'S SCORE 2248 | THEN 2249 | THEN 2250 | RTS 2251 | .PAGE 2252 | .SBTTL END OF WAVE PHASE 5 2253 | ENDWV5: 2254 | LDA I,CNEWAV ;REQUEST NEW WAVE SETUP. 2255 | STA SETUPC 2256 | LDA I,S.SETU 2257 | STA NXTSTA 2258 | LDA I,0 2259 | STA PAUST ;NO PAUSE (DEFAULT) 2260 | LDA I,S.PAUS ;MUST PAUSE A LITTLE IF BONUS ABM PTS. 2261 | STA STATE 2262 | JSR REGEN ;REGENERATE CITIES 2263 | LDA PLIVES 2264 | ORA PLIVES+1 2265 | AND ATRACT 2266 | IFEQ ;ANY LIVES LEFT FOR EITHER PLAYER? 2267 | LDA I,C5HI ;NO 2268 | STA SETUPC ;END GAME 2269 | ELSE 2270 | LDY NUMPLA ;YES. AT LEAST 1 PLAYER STILL ALIVE 2271 | IFNE ;2 PLAYERS? 2272 | ;YES 2273 | LDY PLAYUP 2274 | LDA AY,PLIVES 2275 | IFEQ ;IS THIS PLAYER DEAD? 2276 | LDA I,MABMPTS ;YES 2277 | JSR DTABEL ;ERASE BONUS PTS 2278 | LDA I,MYOUR 2279 | JSR DTABEL 2280 | LDA I,MGAMOV ;DISPLAY "GAME 2281 | JSR DTABMS ;OVER" 2282 | JSR DPLANO ;"PLAYER X" 2283 | LDA I,1*PSECNS ;PAUSE SECOND 2284 | STA PAUST 2285 | THEN 2286 | THEN 2287 | LDA PLAYUP 2288 | STA NEWPLA 2289 | BEGIN 2290 | LDY NUMPLA 2291 | IFNE ;ONE PLAYER GAME? 2292 | CPY NEWPLA ;NO. 2 PLAYER 2293 | IFEQ ;WAS LAST PLAYER PLAYER 2? 2294 | DEC NEWPLA ;YES. GO BACK TO PLAYER 1 2295 | INC WAVENO ;AND GO TO NEXT WAVE 2296 | ELSE 2297 | INC NEWPLA ;NO. GO UP TO PLAYER 2 2298 | THEN 2299 | ELSE 2300 | INC WAVENO ;1 PLAYER GAME. NEXT WAVE 2301 | THEN 2302 | LDY NEWPLA 2303 | LDA AY,PLIVES ;DOES THIS PLAYER HAVE ANY MORE LIVES? 2304 | NEEND ;LOOP BACK IF NOT 2305 | THEN 2306 | RTS 2307 | .PAGE 2308 | .SBTTL END GAME PART 1 2309 | ENDGM1: 2310 | LDX I,CDLADR ;DISPLAY 5 HI 2311 | LDA ATRACT ;ATTRACT? 2312 | IFNE 2313 | LDA I,CRED ;TURN EVERYTHING RED EXCEPT FLASH 2314 | STA COL000 2315 | STA COL001 2316 | STA COL010 2317 | STA COL011 2318 | STA COL101 2319 | STA COL110 2320 | STA COL111 2321 | LDA I,FLASH 2322 | STA SCOCOL 2323 | JSR DSPSCO ;WRITE SCORE IN FLASH 2324 | LDA I,SENDGA ;END GAME SOUND 2325 | JSR SNDON 2326 | LDX I,CENDG2 ;MAKE BANG 2327 | THEN 2328 | STX SETUPC 2329 | LDY I,0 ;NO GAME IS OVER 2330 | STY A,OLDEND 2331 | STY NUMPLA 2332 | STY ATRACT 2333 | LDY I,ENDUPD 2334 | STY A,NEWEND ;PREP FOR FINAL BANG 2335 | RTS 2336 | .PAGE 2337 | .SBTTL END OF GAME 2338 | ENDMAX =6D ;MAXIMUM EXPLOSION RADIUS 2339 | ENDUPD =1 ;X DOTS CHANGE IN RADIUS EACH UPDATE 2340 | HENDEX =80 ;CENTER OF EXPLOSION 2341 | VENDEX =73 2342 | ENDGM2: 2343 | LDA A,NEWEND 2344 | STA RADIUS 2345 | IFNE ;DONE WITH FINAL BANG? 2346 | CMP I,ENDMAX ;NO 2347 | IFCS ;REACHED MAX THIS TIME? 2348 | LDA I,ENDMAX-ENDUPD ;YES. SHRINK IT DOWN 2349 | ELSE 2350 | CMP A,OLDEND ;NO. SHRINKING? 2351 | IFCC 2352 | SEC 2353 | SBC I,ENDUPD ;YES 2354 | ELSE 2355 | CLC ;NO. GROWING 2356 | ADC I,ENDUPD 2357 | PHA 2358 | CMP I,62 2359 | IFEQ 2360 | LDA I,MTHEEND ;DISPLAY "THE END" IN EXPLOSION 2361 | JSR DTABMS 2362 | THEN 2363 | DEC RADIUS 2364 | PLA 2365 | THEN 2366 | THEN 2367 | STA A,NEWEND ;NEW RADIUS 2368 | STA RANGE 2369 | LDY RADIUS 2370 | STY A,OLDEND ;OLD RADIUS 2371 | LDA I,HENDEX ;CENTER OF BANG 2372 | STA H2 2373 | LDA I,VENDEX 2374 | STA V2 2375 | JSR DSPEXP ;DISPLAY BANG 2376 | ELSE 2377 | LDA I,CDLADR ;ALL DONE WITH BANG 2378 | STA SETUPC 2379 | JSR INISOU ;ALL SOUNDS OFF 2380 | THEN 2381 | RTS 2382 | .PAGE 2383 | .SBTTL REGENERATE CITIES 2384 | ;INPUT: PLAYUP 2385 | ; CILEFT 2386 | ; PLIVES 2387 | ;OUTPUT:CILEFT ADJUSTED TO MATCH PLIVES 2388 | ; 2389 | REGEN: 2390 | LDA ATRACT 2391 | IFNE ;EXIT IF ATTRACT 2392 | JSR CHEKBO ;CHECK FOR BONUS CITIES 2393 | LDY PLAYUP 2394 | LDX ZY,PLIVES 2395 | CPX I,NCITY 2396 | IFCS ;SET X=# OF DISPLAYABLE CITIES 2397 | LDX I,NCITY 2398 | THEN 2399 | LDA AY,CILEFT 2400 | STA J 2401 | BEGIN ;LOOP FOR EACH POSSIBLE CITY 2402 | ASL 2403 | IFCS 2404 | DEX ;DECREMENT # OF DISPLAYABLE CITIES 2405 | THEN 2406 | TAY ;TEST ACC 2407 | EQEND 2408 | TXA 2409 | IFNE ;ANY CITIES TO REGENERATE? 2410 | STX XLOOP ;YES. X=# TO REGENERATE 2411 | BEGIN ;LOOP UNTIL X CITIES REGENERATED 2412 | LDY PLAYUP 2413 | LDA AY,CILEFT 2414 | EOR I,0FC 2415 | LDY I,0 2416 | JSR RANBIT ;GET A RANDOM DEAD CITY 2417 | LDX PLAYUP 2418 | LDA ZX,CILEFT 2419 | ORA AY,CIBITS ;REGENERATE IT 2420 | STA ZX,CILEFT 2421 | DEC XLOOP 2422 | EQEND 2423 | LDA I,SBONUS 2424 | JSR SNDON ;MAKE BONUS SOUND 2425 | LDA I,MBONUS 2426 | JSR DTABMS ;DISPLAY BONUS MESSAGE 2427 | LDA I,3*PSECNS ;HOLD MESSAGE UP THERE 2428 | STA PAUST 2429 | THEN 2430 | THEN 2431 | RTS 2432 | .PAGE 2433 | .SBTTL CLEAN UP 2434 | CLEANU: 2435 | LDA ICBONS 2436 | ORA CRMONS 2437 | IFNE ;ANY ICBMS ON SCREEN? 2438 | LDX I,IBLOOP ;YES 2439 | STX XLOOP 2440 | BEGIN ;LOOP FOR ALL ICBMS 2441 | LDX XLOOP 2442 | LDA AX,ICCPVH 2443 | IFNE ;ACTIVE 2444 | TXA ;ICBM 2445 | CLC 2446 | ADC I,NABMS 2447 | STA MISIND 2448 | LDA ICBTYP 2449 | AND AX,CIBITS 2450 | IFEQ ;YES 2451 | JSR ERAMIS ;ERASE MISSILE TRAIL 2452 | ELSE 2453 | JSR CMERAS 2454 | LDA I,0 2455 | STA CRMONS 2456 | JSR CMSNOF 2457 | THEN 2458 | THEN 2459 | DEC XLOOP 2460 | MIEND ;EXIT WHEN LAST ICBM CHECKED 2461 | THEN 2462 | JSR INISOU ;TURN OFF SOUNDS 2463 | LDA I,MB1EMP ;ERASE BASE MSGS 2464 | JMP DTABEL 2465 | .PAGE 2466 | .SBTTL DISPLAY EXPLOSION PICTURE 2467 | ;INPUT: 2468 | ;RANGE:NEW EXPLOSION RODIUS 2469 | ;RADIUS:OLD EXPLOSION RADIUS 2470 | ;H2&V2=CENTER OF EXPLOSION 2471 | ;OUTPUT:H2,V2 RANGE PRESERVED 2472 | ; SCREEN UPDATED 2473 | ; ACC,Y,RADIUS,SAVEXX,PATERN DESTROYED 2474 | ; X PRESERVED 2475 | ; 2476 | DSPEXP: STX SAVEXX ;SAVE X 2477 | LDA RANGE ;RADIUS OF NEW EXPLOSION 2478 | CMP RADIUS ;RADIUS OF OLD EXPLOSION 2479 | IFNE 2480 | IFCC ;IS NEW EXPLOSION INSIDE OLD? 2481 | LDA I,BCKGND 2482 | STA PATERN 2483 | BEGIN ;YES. CLEAR OUT CIRCLES OUTSIDE 2484 | JSR CIRCLE 2485 | LDA RADIUS 2486 | DEC RADIUS 2487 | CMP RANGE ;DOWN TO NEW ONE YET? 2488 | EQEND ;LOOP IF NOT (NEW ONE WILL BE CLEARED TOO) 2489 | ELSE 2490 | LDA I,FLASH 2491 | STA PATERN 2492 | BEGIN ;NO. ADD CIRCLES OUTSIDE OF OLD 2493 | JSR CIRCLE 2494 | LDA RADIUS 2495 | CMP RANGE ;DONE YET? 2496 | INC RADIUS 2497 | CSEND ;LOOP IF NOT 2498 | THEN 2499 | THEN 2500 | LDX SAVEXX ;RESTORE X 2501 | RTS 2502 | .PAGE 2503 | .SBTTL DRAW A CIRCLE 2504 | ;INPUT: RADIUS: CIRCLE'S RADIUS 2505 | ; H2=HORIZ COORDINATE OF CENTER OF CIRCLE 2506 | ; V2=VERT " " " " 2507 | ; PATERN=PATTERN TO OUTPUT TO SCREEN WHEN DRAWING CIRCLE 2508 | ;OUTPUT:VDISP,HDISP,X,ACC,J DESTROYED 2509 | ; CIRCLE OUTPUT TO SCREEN 2510 | ; Y,RADIUS PRESERVED 2511 | ; 2512 | CIRCLE: LDX RADIUS ;START AT POINT (RADIUS,0) 2513 | STX HDISP ;IN QUADRANT 1 2514 | LDX I,0 2515 | STX VDISP 2516 | BEGIN 2517 | JSR QUAD ;OUTPUT THIS POINT IN EACH QUADRANT 2518 | LDX HDISP ;SWAP H & V TO GET POINT IN 2519 | LDA VDISP ;UPPER HALF OF QUADRANT 2520 | STX VDISP 2521 | STA HDISP 2522 | JSR QUAD ;OUTPUT POINTS IN EACH QUADRANT 2523 | INC HDISP 2524 | LDA HDISP ;RESTORE H & V 2525 | STA VDISP 2526 | .SBTTL CALCULATE NEXT POINT ON CIRCLE 2527 | ;FUNCTION: CALCULATE NEXT HIGHER POINT ON CIRCLE, USING RADIUS=MAX(H)+ 2528 | ; 3/8 MIN(V) APPROXIMATION 2529 | ;INPUT: VDISP & HDISP: H AND V COORDINATES OF LAST POINT 2530 | ; RADIUS=RADIUS OF CIRCLE 2531 | ;OUTPUT: X,Y PRESERVED 2532 | ; ACC,J DESTROYED 2533 | ; HDISP,VDISP=H & V COORDINATES OF NEW POINT 2534 | ; 2535 | LSR 2536 | CLC 2537 | ADC VDISP 2538 | LSR 2539 | LSR 2540 | EOR I,0FF 2541 | SEC 2542 | ADC RADIUS ;SUBTRACT IT FROM RADIUS 2543 | STA HDISP ;TO GET H 2544 | CMP VDISP ;DONE WHEN H < V 2545 | CCEND 2546 | RTS 2547 | .PAGE 2548 | .SBTTL OUTPUT A POINT ON CIRCLE TO EACH QUADRANT 2549 | ;FUNCTION: GENERATE 1 POINT IN EACH QUADRANT OF A CIRCLE 2550 | ;INPUT: HDISP=HORIZONTAL DISP FROM CENTER OF POINT IN 1ST QUADRANT 2551 | ; VDISP=VERTICAL " " " " " " 2552 | ; PATTERN=BIT PATTERN TO OUTPUT/DOT 2553 | ; H2=HORIZ COORDINATE OF CIRCLE CENTER 2554 | ; V2=VERT " " " " 2555 | ;OUTPUT: DISPLAY UPDATED AT 4 POINTS: (X,Y),(X,-Y),(-X,Y),(-X,-Y) 2556 | ; HDISP,VDISP,H2,V2,PATERN ARE PRESERVED 2557 | ; ACC,X,HADR,J DESTROYED 2558 | QUAD: LDX I,0 2559 | LDA H2 ;QUADRANT 1 (X,Y) 2560 | CLC 2561 | ADC HDISP 2562 | STA HADR 2563 | STA J 2564 | LDA V2 2565 | CLC 2566 | ADC VDISP 2567 | EOR I,0FF 2568 | STA VADR 2569 | LDA NX,HADR 2570 | AND I,020 ;SAVE WATER/LAND 2571 | ORA PATERN ;ADD/REMOVE FLASH FLAG 2572 | STA NX,HADR 2573 | LDA H2 ;QUADRANT 2 (-X,Y) 2574 | SEC 2575 | SBC HDISP 2576 | STA HADR 2577 | LDA NX,HADR 2578 | AND I,020 ;SAVE WATER/LAND 2579 | ORA PATERN ;ADD/REMOVE FLASH FLAG 2580 | STA NX,HADR 2581 | LDA V2 ;QUADRANT 3 (-X,-Y) 2582 | SEC 2583 | SBC VDISP 2584 | EOR I,0FF 2585 | STA VADR 2586 | LDA NX,HADR 2587 | AND I,020 ;SAVE WATER/LAND 2588 | ORA PATERN ;ADD/REMOVE FLASH FLAG 2589 | STA NX,HADR 2590 | LDA J ;QUADRANT 4 (X,-Y) 2591 | STA HADR 2592 | LDA NX,HADR 2593 | AND I,020 ;SAVE WATER/LAND 2594 | ORA PATERN ;ADD/REMOVE FLASH FLAG 2595 | STA NX,HADR 2596 | RTS 2597 | .PAGE 2598 | .SBTTL WARNING MESSAGES FOR NEW WAVE 2599 | XPMULT =58 2600 | YPMULT =70 2601 | XPLANO =9C 2602 | YPLANO =90 2603 | WARMSG: 2604 | LDA ATRACT 2605 | IFNE ;ATTRACT MODE? 2606 | JSR DPLANO ;NO. DISPLAY "PLAYER X" 2607 | LDA I,MICBPTS ;OUTPUT "SCORE X Y" 2608 | JSR DTABMS 2609 | LDA SMULTI 2610 | LDX I,REDPAT 2611 | STX PATRN1 ;COLOR 2612 | LDX I,XPMULT ;LOCATION 2613 | LDY I,YPMULT 2614 | JSR NUMOUT 2615 | LDA I,MCOPYR ;ATARI 2616 | JSR DTABMS 2617 | ELSE 2618 | JSR ATRMSG 2619 | THEN 2620 | LDA WAVENO 2621 | CMP I,4 2622 | IFCC 2623 | LDA I,MDEFEN ;DEFEND CITIES 2624 | JSR DTABML 2625 | THEN 2626 | JMP DSPHI ;AND THEN THE HIGH SCORE 2627 | DPLANO: 2628 | LDA I,MPLAYR ;"PLAYER X" 2629 | JSR DTABMS 2630 | LDA PLAYUP ;DISPLAY PLAYER # 2631 | CLC 2632 | ADC I,1 2633 | LDX I,REDPAT ;RED # 2634 | STX PATRN1 ;COLOR 2635 | LDX I,XPLANO ;LOC 2636 | LDY I,YPLANO 2637 | JMP NUMOUT 2638 | .PAGE 2639 | .SBTTL REFRESH ATTRACT MODE MESSAGES 2640 | REFRESH: 2641 | LDA ATRACT 2642 | IFEQ ;ATTRACT MODE? 2643 | LDA STATE 2644 | CMP I,S.PLAY 2645 | IFNE 2646 | CMP I,S.PAUS 2647 | IFEQ 2648 | LDA SETUPC 2649 | CMP I,CPRGM1 2650 | IFNE 2651 | LDA NXTSTA 2652 | CMP I,S.PLAY 2653 | THEN 2654 | THEN 2655 | THEN 2656 | IFEQ 2657 | LDA FRAME 2658 | LSR 2659 | IFCC 2660 | JSR SCROLL 2661 | THEN 2662 | THEN 2663 | THEN 2664 | RTS 2665 | .PAGE 2666 | .SBTTL SCROLL ATTRACT MESSAGES ACROSS SCREEN 2667 | SCROLL: JSR PRSCRO ;BRING ON NEW CHARACTER 2668 | LDX I,0 2669 | BEGIN ;LOOP FOR EACH COLUMN ACROSS BOTTOM 2670 | BEGIN ;LOOP FOR EACH DOT IN A COLUMN(8) 2671 | TXA 2672 | AND I,3F 2673 | CMP I,3E 2674 | IFEQ ;FAR RIGHT COLUMN? 2675 | SEC ;YES. SHIFT IN LAND COLOR 2676 | ROR AX,401 2677 | SEC 2678 | ROR AX,501 2679 | ELSE 2680 | LDA AX,403 ;NO. SHIFT IN BIT FROM RIGHT 2681 | LSR 2682 | ROR AX,401 2683 | LDA AX,503 2684 | LSR 2685 | ROR AX,501 2686 | THEN 2687 | TXA 2688 | CLC 2689 | ADC I,40 2690 | TAX ;POINT TO NEXT LOWER DOT IN COLUMN 2691 | CSEND ;EXIT LOOP AFTER LOWEST DOT 2692 | INX 2693 | INX 2694 | CPX I,40 2695 | CSEND ;EXIT LOOP AFTER FAR RIGHT COLUMN 2696 | RTS 2697 | .PAGE 2698 | CLRTRI: LDA I,0 2699 | STA TRIPLE 2700 | STA TRIPLE+1 2701 | STA TRIPLE+2 2702 | RTS 2703 | 2704 | .SBTTL MULTIPLY ICBM SCORE BY X 2705 | ICMULT: JSR CLRTRI ;CLEAR BUCKETS 2706 | ICMUL2: SED 2707 | BEGIN 2708 | LDA ICBPTL 2709 | CLC 2710 | ADC TRIPLE 2711 | STA TRIPLE 2712 | LDA TRIPLE+1 2713 | ADC ICBPTM 2714 | STA TRIPLE+1 2715 | LDA TRIPLE+2 2716 | ADC I,0 2717 | STA TRIPLE+2 2718 | DEX 2719 | MIEND 2720 | CLD 2721 | RTS 2722 | ABMADD: ;ADD IN POINTS FOR AN UNUSED ABM 2723 | LDX SMULTI 2724 | SED 2725 | BEGIN ;ADD IN X POINTS FOR EACH SKILL LEVEL 2726 | LDA I,5 2727 | CLC 2728 | ADC TRIPLE 2729 | STA TRIPLE 2730 | LDA I,0 2731 | ADC TRIPLE+1 2732 | STA TRIPLE+1 2733 | LDA TRIPLE+2 2734 | ADC I,0 2735 | STA TRIPLE+2 2736 | DEX 2737 | EQEND 2738 | CLD 2739 | RTS 2740 | .PAGE 2741 | .SBTTL SCORE ROUTINES 2742 | CLRSCO: ;CLEAR SCORE 2743 | LDA I,0 2744 | LDX I,5 2745 | BEGIN 2746 | STA AX,LSCORL 2747 | DEX 2748 | MIEND 2749 | RTS 2750 | .SBTTL DISPLAY SCORES 2751 | DSPSCO: LDA ATRACT 2752 | IFEQ ;ATTRACT? 2753 | LDA A,LSCORL+1 ;YES. DISPLAY PLAYER 2 SCORE IF NON 0 2754 | ORA A,LSCORM+1 2755 | ORA A,LSCORH+1 2756 | ELSE 2757 | LDA NUMPLA ;NO. GAME MODE 2758 | THEN 2759 | IFNE ;2 PLAYERS? 2760 | LDY I,1 ;YES. DISPLAY RIGHT SCORE 2761 | JSR DSPNUP 2762 | THEN 2763 | LDY I,0 ;(LEFT SCORE) 2764 | DSPNUP: JSR CLRTRI 2765 | JSR UPSCOR ;UPDATE TRIPLE 2766 | LDA AY,HSCOR ;GET COORD FOR SCORE 2767 | TAX 2768 | LDA I,0 ;CLEAR DISPLAY SCORE REQUEST 2769 | STA RQSCOR 2770 | LDY I,STOPLI 2771 | LDA SCOCOL ;SCORE COLOR 2772 | JMP DSPNUM ;DISPLAY IT 2773 | HSCOR: .BYTE 1D,0B0 ;HORIZ COORD FOR LEFT, RIGHT SCORE 2774 | .PAGE 2775 | .SBTTL ADD TO PLAYER'S SCORE 2776 | ;INPUT: Y=ID OF SCORING PLAYER 2777 | ; TRIPLE=AMOUNT TO ADD TO SCORE (TRIPLE PRECISION BCD) 2778 | ; LSCORL,M,H(2) SCORE ARRAY (BCD TRIPLE PRECISION) 2779 | ; ATRACT=ATTRACT OR GAME MODE FLAG 2780 | ;OUTPUT: LSCORL,M,H UPDATED IF NOT IN ATTRACT 2781 | ; TRIPLE,Y ARE DESTROYED 2782 | ; X IS PRESERVED 2783 | ; 2784 | UPSCOR: 2785 | LDA ATRACT 2786 | IFEQ ;ATRACT MODE? 2787 | JSR CLRTRI ;YES. CLEAR AMOUNT TO ADD 2788 | THEN 2789 | SED ;DO IT IN DECIMAL 2790 | LDA TRIPLE 2791 | CLC 2792 | ADC AY,LSCORL 2793 | STA AY,LSCORL 2794 | STA TRIPLE 2795 | LDA AY,LSCORM 2796 | ADC TRIPLE+1 2797 | STA AY,LSCORM 2798 | STA TRIPLE+1 2799 | LDA AY,LSCORH 2800 | ADC TRIPLE+2 2801 | STA AY,LSCORH 2802 | STA TRIPLE+2 2803 | CLD 2804 | LDA I,0FF ;REQUEST SCORE UPDATE 2805 | STA RQSCOR 2806 | RTS 2807 | 2808 | .PAGE 2809 | .SBTTL CHECK BONUS LEVEL 2810 | 2811 | CHEKBO: 2812 | LDA OPTIO2 2813 | AND I,BONMSK 2814 | CMP I,BONMSK 2815 | IFNE ;BONUS CITIES? 2816 | LSR ;YES. USE AS INDEX INTO BONINL 2817 | LSR 2818 | LSR 2819 | TAY 2820 | LDA I,0 ;CLEAR BUCKET FOR NEW BONUS LEVEL 2821 | STA ICBTOL 2822 | LDX PLAYUP 2823 | LDA AX,LSCORM 2824 | STA J 2825 | LDA AX,LSCORH 2826 | STA K 2827 | SED 2828 | BEGIN ;DIVIDE SCORE BY BONUS INTERVAL 2829 | LDA J 2830 | SEC 2831 | SBC AY,BONINL 2832 | STA J 2833 | LDA K 2834 | SBC AY,BONINH 2835 | STA K 2836 | IFPL 2837 | INC ICBTOL 2838 | THEN 2839 | MIEND 2840 | CLD 2841 | LDA ICBTOL ;NEW BONUS LEVEL-OLD 2842 | SEC 2843 | SBC ZX,BONLVL 2844 | CLC 2845 | ADC ZX,PLIVES 2846 | STA ZX,PLIVES ;ADD DIFF TO # CITIES 2847 | LDA ICBTOL ;UPDATE BONUS LEVEL 2848 | STA ZX,BONLVL 2849 | THEN 2850 | RTS 2851 | 2852 | BONINL: .WORD 0100,0120,0140,0150,0180,0200,0080 2853 | BONINH =BONINL+1 2854 | .PAGE 2855 | .SBTTL WAVE PARAMETERS 2856 | 2857 | ICBWAV: .BYTE 12.,15.,18.,12.,16.,14.,17.,10.,13.,16.,19.,12.,14.,16.,18.,14.,16.,18.,20. 2858 | ICBWEN: 2859 | WICSPL: .BYTE 0D0,0E0,0C0,8,0A0,60,40,20,10,0A,6,4,2,1,0 2860 | WICSPH: .BYTE 4,2,1,1,0,0,0,0,0,0,0,0,0,0,0 2861 | WICEND: 2862 | CRMWAV: .BYTE 0,0,0,0,0,1,1,2,3,4,4,5,5,6,6,7,7,7,7 2863 | WSPFIR: .BYTE 80,60,40,30,20,20,10 2864 | WSPEND: 2865 | WSPLAU: .BYTE 0F0,0A0,080,80,60,40,20 2866 | HTARGS: 2867 | CICPH: .BYTE CITY1H,CITY2H,CITY3H,CITY4H,CITY5H,CITY6H 2868 | MBCPH: .BYTE MISB1H,MISB2H,MISB3H 2869 | VTARGS: 2870 | CICPV: .BYTE CITY1V,CITY2V,CITY3V,CITY4V,CITY5V,CITY6V 2871 | MBCPV: .BYTE MISB1V,MISB2V,MISB3V 2872 | MBCPVA: .BYTE MISB1V+2,MISB2V+2,MISB3V+2 2873 | CIBITS: .BYTE 80,40,20,10,8,4,2,1 ;CITY EXISTENCE BITS 2874 | .PAGE 2875 | .SBTTL ACTIVATE A PLANE 2876 | ;OUTPUT: ACC,X DESTROYED 2877 | ; Y PRESERVED 2878 | ; PLATIM=1 2879 | ; PLCPV&H=SET UP WITH INITIAL PLANE LOC 2880 | ; HORFIR=H LOC AT WHICH ICBMS WILL BE FIRED 2881 | VPLMIN =64 2882 | VPLMAX =0B0 2883 | ACTPLA: 2884 | LDA ICBTOL 2885 | IFNE 2886 | LDA A,PLCPV 2887 | IFEQ ;PLANE ACTIVE? 2888 | LDY WAVENO ;NO WAVE OK? 2889 | CPY I,SPUTWV 2890 | IFCS 2891 | LDA SPUTIM ;YES. TIME OK? 2892 | CMP SPUTAC 2893 | IFCS 2894 | LDX I,0 ;SET PLANE TIMER 2895 | STX PLATIM ;FOR IMMEDIATE POSITION UPDATE 2896 | STX HORFIR 2897 | LDA A,RANDOM 2898 | IFMI 2899 | DEX 2900 | THEN 2901 | STX PLAVEL ;DIRECTION (+RIGHT, -LEFT) 2902 | STX A,PLCPH ;HORIZ START POINT (LEFT OR RIGHT EDGE) 2903 | AND I,01 2904 | STA SOBJID ;BOMBER A SPUTNIK CODE 2905 | LDA A,RANDOM ;YES 2906 | LSR 2907 | LSR 2908 | LSR 2909 | ADC I,VPLMIN 2910 | CPY I,SPUTWV+4 2911 | IFCC 2912 | ADC I,20 2913 | THEN 2914 | CPY I,SPUTWV+2 2915 | IFCC 2916 | ADC I,10 2917 | THEN 2918 | STA A,PLCPV ;VERTICAL COORD 2919 | JSR STSNON ;SOUND ON 2920 | DEC POTENT ;DECREASE # OF POTENTIAL LAUNCHES 2921 | THEN 2922 | THEN 2923 | THEN 2924 | THEN 2925 | RTS 2926 | .PAGE 2927 | .SBTTL PROCESS THE PLANE 2928 | ;FUNCTION:MOVE PLANE ACROSS SCREEN AND FIRE ICBMS WHEN REQUESTED 2929 | ;INPUT PLCPH&V=PLANE'S X & Y COORDINATES 2930 | ; PLATIM:PLANE POSITION UPDATE TIMER 2931 | ; PLAVEL:HORZ MOVEMENT IN DOTS/UPDATE:=-1=LEFT,1=RIGHT 2932 | ; 2933 | PROPLA: INC SPUTIM 2934 | IFEQ 2935 | DEC SPUTIM ;MAX AT FF 2936 | THEN 2937 | LDA A,PLCPV 2938 | IFNE ;PLANE ACTIVE? 2939 | STA VADR ;YES 2940 | DEC PLATIM 2941 | IFMI 2942 | INC HORFIR ;INC DIST MOVED 2943 | LDY SOBJID 2944 | LDA AY,PLARAT ;YES 2945 | STA PLATIM ;RESET PLANE UPDATE TIMER 2946 | LDA A,PLCPH 2947 | ;WRITE OUT NEW LEADING EDGE OF PLANE 2948 | JSR OUTLST ;AND ERASE TRAILING EDGE 2949 | IFEQ ;PLANE AT GOAL? 2950 | LDA I,0 ;YES. DEACTIVATE IT 2951 | STA A,PLCPV 2952 | STA HORFIR 2953 | STA SPUTIM 2954 | JSR STSNOF ;SOUND OFF 2955 | ELSE 2956 | STA A,PLCPH 2957 | THEN 2958 | THEN 2959 | THEN 2960 | RTS 2961 | PLARAT: .BYTE 1,2 2962 | .PAGE 2963 | .SBTTL MOVE AN OBJECT 1 DOT HORIZONTAL 2964 | ;INPUT: Y=OBJECT ID (INDEX INTO LISTRT,HBAMIN,HBAMAX) 2965 | ; ACC=CURRENT HORIZ COOR OF OBJECT (TO BE UPDATED) 2966 | ; V=CURRENT VERT COORD OF OBJECT 2967 | ; PLAVEL=+OR -1: HORIZ INCREMENT 2968 | ; 2969 | ;OUTPUT:PSW Z=1 INDICATES OBJECT HAS FINISHED JOURNEY 2970 | ; ACC,HADR=NEW H COORDINATE OF OBJECT 2971 | ; J,K,PATERN,SAVEX,HADR,VADR 2972 | ; VADR Y INTACT 2973 | ; 2974 | OUTLST: STY SAVEX 2975 | STY K 2976 | STA HADR 2977 | LDA PLAVEL ;UPDATE HORIZ. BASE ADDRESS OF OBJECT 2978 | IFPL 2979 | INC HADR 2980 | ELSE 2981 | DEC HADR 2982 | THEN 2983 | LDA AY,LISTRT 2984 | STA K ;SET UP INDEX INTO LISTS FOR OBJECT 2985 | BEGIN ;LOOP FOR EACH LIST OF POINTS FOR OBJECT 2986 | LDX K 2987 | LDA AX,NUMDOT 2988 | STA J ;# OF DOTS IN THE LIST 2989 | LDA AX,DOTCOL 2990 | STA PATERN ;COLOR OF DOTS IN LIST 2991 | LDY AX,OFFSTA 2992 | BEGIN ;LOOP FOR EACH DOT IN LIST 2993 | LDX K 2994 | LDA AY,VOFF 2995 | CLC 2996 | ADC VADR 2997 | EOR I,0FF 2998 | STA OLDPOS+1 ;CALC V LOC OF DOT 2999 | LDA AY,HOFF ;HORIZONTAL OFFSET 3000 | EOR PLAVEL ;FLIP IF GOING LEFT 3001 | IFMI ;DO HORIZ COORDINATE CALC. CHECKING OVERFLOW 3002 | CLC ;GOING LEFT. 3003 | ADC HADR 3004 | CMP HADR 3005 | BCS BADH ;OVERFLOW IF RESULT > ORIGINAL 3006 | ELSE 3007 | CLC ;GOING RIGHT 3008 | ADC HADR 3009 | CMP HADR 3010 | BCC BADH ;OVERFLOW IF RESULT < ORIGINAL 3011 | THEN 3012 | CMP AX,HORMIN ;NO OVERFLOW 3013 | IFCS ;PART LEFT BOUNDARY? 3014 | CMP AX,HORMAX ;NO PAST RIGHT BOUNDARY? 3015 | IFCC 3016 | STA OLDPOS ;NO 3017 | LDX I,0 3018 | LDA PATERN 3019 | STA NX,OLDPOS ;ALL OK. WRITE DOT 3020 | THEN 3021 | THEN 3022 | BADH: INY ;UPDATE LIST POINTER TO NEXT DOT 3023 | DEC J ;AND DOT COUNTER 3024 | MIEND ;ENDLOOP AFTER ALL DOTS IN LIST ARE PROCESS 3025 | LDY K 3026 | DEC K ;POINT TO NEXT LIST 3027 | LDA AY,ENDFLG 3028 | MIEND ;ENDLOOP IF THIS WAS THE LAST LIST 3029 | LDY SAVEX ;RESTORE OBJECT ID 3030 | LDA HADR 3031 | CMP AY,HBAMIN 3032 | IFNE ;NEW HORIZ BASE AT AN EDGE? 3033 | CMP AY,HBAMAX 3034 | THEN 3035 | RTS 3036 | .PAGE 3037 | .SBTTL DOT LIST OUTPUT TABLES 3038 | ;BASE ADDRESS LIMITS AND STARTNG INDEX 3039 | HBAMIN: .BYTE 0,0 3040 | HBAMAX: .BYTE 0FF,0FF 3041 | LISTRT: .BYTE 3,5 3042 | ;H & V OFFSETS 3043 | OFFSTA: .BYTE HPLEAD-HOFF,HPLTRA-HOFF,HTIPS-HOFF,HWINDO-HOFF,HBMLEA-HOFF,HBMTRA-HOFF 3044 | ;# OF DOTS 3045 | NUMDOT: .BYTE HPLTRA-HPLEAD-1,HTIPS-HPLTRA-1,HWINDO-HTIPS-1 3046 | .BYTE HBMLEA-HWINDO-1,HBMTRA-HBMLEA-1,HOFEND-HBMTRA-1 3047 | ;COLOR OF DOTS 3048 | DOTCOL: .BYTE PLACOL,BCKGND,FLASH,BLUE,PLACOL,BCKGND 3049 | ;BOUNDARIES (HORIZONTAL) 3050 | HORMIN: .BYTE 8,8,8,8,9,9 3051 | HORMAX: .BYTE 248.,248.,248.,248.,247.,247. 3052 | ;END FLAG (-1=END OF LIST) 3053 | ENDFLG: .BYTE -1,0,0,0,-1,0 3054 | HOFF: ;HORIZONTAL OFFSETS 3055 | HPLEAD: .BYTE 3,3,4,4,4 ;LEADING EDGE 3056 | .BYTE 3,3,1,1 3057 | .BYTE 5,4,4,5,-5,-4,-4,-5 3058 | .BYTE 0,0,0,-4,-4,-4 3059 | 3060 | HPLTRA: .BYTE 5,4,3,3,4,5,-2,-2;TRAILING EDGE 3061 | .BYTE -7,-6,-5,-4,-4,-5,-5 3062 | .BYTE -5,-4,-4,-5,-6,-7 3063 | HTIPS: .BYTE 6,6 ;TIPS 3064 | .BYTE -6,-6 3065 | HWINDO: .BYTE 2,2,2,-2,-2,-2 3066 | HBMLEA: .BYTE 7,5,3,-1,-2,-3 3067 | .BYTE 0,-1,-2,-3,-4,-7,-6 3068 | HBMTRA: .BYTE -5,-4,-4,-8,-8,-8,-9 3069 | .BYTE -6,-5,-5,-6,-6,-7 3070 | HOFEND: 3071 | VOFF: ;VERTICAL OFFSETS 3072 | VPLEAD: .BYTE 3,2,1,0,-1 ;LEADING EDGE 3073 | .BYTE -2,-3,4 3074 | .BYTE -4 3075 | .BYTE 5,4,-4,-5,5,4,-4,-5 3076 | .BYTE 1,0,-1,1,0,-1 3077 | 3078 | VPLTRA: .BYTE 6,5,4,-4,-5,-6,4,-4;TRAILING EDGE 3079 | .BYTE 6,5,4,3,2,1,0 3080 | .BYTE -1,-2,-3,-4,-5,-6 3081 | VTIPS: .BYTE 6,-6 3082 | .BYTE 6,-6 3083 | VWINDO: .BYTE 1,0,-1,1,0,-1 3084 | VBMLEA: .BYTE 0,1,2,3,4,5 3085 | .BYTE -1,-2,-3,-4,-5,4,3 3086 | VBMTRA: .BYTE 5,4,3,4,3,2,1 3087 | .BYTE 0,-1,-2,-3,-4,-5 3088 | .PAGE 3089 | .SBTTL DISPLAY FLASH POPS 3090 | POPS: 3091 | LDA I,0 3092 | STA RANGE 3093 | LDX I,EXLOOP 3094 | BEGIN ;CLEAR OUT EXISTING POPS 3095 | LDA AX,EXCPV 3096 | IFNE 3097 | STA V2 3098 | LDA AX,EXCPH 3099 | STA H2 3100 | LDA AX,EXTIME 3101 | STA RADIUS 3102 | JSR DSPEXP 3103 | LDA I,0 3104 | STA AX,EXCPV 3105 | THEN 3106 | DEX 3107 | MIEND 3108 | LDA I,0FC 3109 | STA FLSHCO 3110 | LDX I,EXLOOP 3111 | BEGIN ;WRITE OUT NEW POPS 3112 | LDA A,RANDOM 3113 | AND I,07 3114 | ORA I,03 3115 | STA AX,EXTIME 3116 | STA RANGE 3117 | LDA A,RANDOM 3118 | STA AX,EXCPH 3119 | STA H2 3120 | BEGIN 3121 | LDA A,RANDOM 3122 | CMP I,0D0 3123 | IFCC 3124 | CMP I,38 3125 | BCS GOODV 3126 | SEC 3127 | THEN 3128 | CCEND 3129 | GOODV: STA AX,EXCPV 3130 | STA V2 3131 | LDA I,0 3132 | STA RADIUS 3133 | JSR DSPEXP 3134 | DEX 3135 | MIEND 3136 | RTS 3137 | .PAGE 3138 | .SBTTL UPDATE CM POSITION 3139 | ;INPUT: MISIND=ICBM ARRAY INDEX FOR CM 3140 | ;OUTPUT: 3141 | ; 3142 | CMNEWP: 3143 | JSR ANDANG ;ANALYZE DANGER 3144 | LDA DANGER 3145 | IFEQ ;DANGER? 3146 | JSR UPDPOS ;NO. CONTINUE TO TARGET 3147 | ELSE 3148 | CMP I,ALLBAD ;YES. SURROUNDED? 3149 | IFEQ 3150 | JSR UPDPOS ;YES. DRIVE IN 3151 | ELSE 3152 | JSR ANGLE ;NO. CALCULATE DIRECTION 3153 | LDA DANGER 3154 | LDY WAVENO 3155 | CPY I,STUPID 3156 | IFCC ;EARLY WAVE? 3157 | ORA I,01 ;YES. MAKE IT STUPID (NO UP) 3158 | THEN 3159 | STA DANGER ;CERTAIN AREAS OFF LIMITS 3160 | JSR FINDBL ;NO. FIND BEST BIG OPENING 3161 | IFEQ 3162 | JSR CMDEVI ;FOUND IT. DEVIATE 3163 | ELSE 3164 | JSR FINSIN ;NONE FIND BEST SMALL OPENING 3165 | IFEQ 3166 | JSR CMDEVI ;FOUND IT. DEVIATE 3167 | ELSE 3168 | JSR UPDPOS ;NONE, DRIVE IN 3169 | THEN 3170 | THEN 3171 | THEN 3172 | THEN 3173 | RTS 3174 | .PAGE 3175 | .SBTTL ANALYZER DANGER TO CM 3176 | ;INPUT: MISIND=MISSILE ARRAY INDEX (AB=0) 3177 | ;OUTPUT:X PRESERVED; SAVEXX, ACC DESTROYED 3178 | ; DANGER:BITS SET/CLEARED 3179 | ANDANG: LDA I,0 3180 | STA DANGER ;DEFAULT: NO DANGER 3181 | STX SAVEXX 3182 | LDY I,HDEND-HDELT-1 3183 | BEGIN ;LOOP FOR EACH TEST POINT 3184 | LDX MISIND 3185 | LDA AX,ABCPVH ;SET UP COORDINATES OF TEST POINT 3186 | CLC 3187 | ADC AY,VDELT 3188 | EOR I,0FF 3189 | STA VADR 3190 | LDA AX,ABCPHH 3191 | CLC 3192 | ADC AY,HDELT 3193 | STA HADR 3194 | LDX I,0 3195 | LDA NX,HADR ;GET TEST POINT PATTERN 3196 | AND I,0C0 3197 | CMP I,FLASH 3198 | IFEQ ;EXPLOSION? 3199 | LDA DANGER ;YES. SET DANGER BIT FOR TEST POINT 3200 | ORA AY,SMAHOL 3201 | STA DANGER 3202 | THEN 3203 | DEY 3204 | MIEND ;NEXT TEST POINT 3205 | LDX SAVEXX 3206 | RTS 3207 | VDELT: .BYTE 8,6 3208 | HDELT: .BYTE 0,-6,-8,-6,0,6,8,6 3209 | HDEND: 3210 | .PAGE 3211 | .SBTTL DETERMINES CRUISE MISSILE ANGLE 3212 | ;INPUT: MISIND=MISSILE ARRAY INDEX (AB=0) 3213 | ;OUTPUT:CMANGL=0->13=CRUISE MISSILE ANGLE 3214 | ANGLE: LDY MISIND 3215 | JSR ABMVEL ;SET UP VADR & HADR TO INCREMENT 3216 | LDY HADR ;ABSOLUTE VALUES OF DELTA H & V 3217 | LDA VADR 3218 | IFEQ ;CALCULATE SLOPE (0->-1) 3219 | LDA I,4 ;MAX IF H=0 3220 | ELSE 3221 | JSR DIVIDE ;CALCULATE SLOPE 3222 | LDY I,SLOEND-SLOPEH-1 3223 | BEGIN ;FIND RANGE 0->4 3224 | LDA QUOTH 3225 | CMP AY,SLOPEH 3226 | IFEQ 3227 | LDA QUOTL 3228 | CMP AY,SLOPEL 3229 | THEN 3230 | DEY 3231 | CSEND 3232 | INY 3233 | TYA 3234 | THEN 3235 | STA J 3236 | LDX MISIND 3237 | LDA AX,ABVEHH 3238 | EOR AX,ABVEVH 3239 | IFMI ;H & V DIFF SIGNS? 3240 | LDA I,4 ;YES. CONVERT 0->4 TO 4->0 3241 | SEC 3242 | SBC J 3243 | STA J 3244 | THEN 3245 | LDA AX,ABVEHH 3246 | ROL 3247 | LDA AX,ABVEVH 3248 | ROL 3249 | ROL 3250 | AND I,3 ;DETERMINE GUADRANT 3251 | TAY 3252 | LDA AY,ANGADD ;ADD IN QUADRANT CORRECTION 3253 | CLC 3254 | ADC J 3255 | STA CMANGL 3256 | RTS 3257 | ANGADD: .BYTE 12.,8,0,4 3258 | SLOPEH: .BYTE 0,0,0,1,5 ;TAN FOR ANGLES 0,11,33,56,78 3259 | SLOEND: 3260 | SLOPEL: .BYTE 0,32,0AB,7F,6 3261 | BIGHOL: .BYTE 83 ;0:701 3262 | .BYTE 87 ;1:7012 3263 | .BYTE 07 ;2:012 3264 | .BYTE 0F ;3:0123 3265 | .BYTE 0E ;4:123 3266 | .BYTE 1E ;5:1234 3267 | .BYTE 1C ;6:234 3268 | .BYTE 3C ;7:2345 3269 | .BYTE 38 ;8:345 3270 | .BYTE 78 ;9:3456 3271 | .BYTE 70 ;10:456 3272 | .BYTE 0F0 ;11:4567 3273 | .BYTE 0E0 ;12:567 3274 | .BYTE 0E1 ;13:5670 3275 | .BYTE 0C1 ;14:670 3276 | .BYTE 0C3 ;15:6701 3277 | ENDBIG: 3278 | SMAHOL: .BYTE 1,2,4,8,10,20,40,80 3279 | .PAGE 3280 | .SBTTL FIND NON BANG OPENING FOR CM 3281 | FINDBL: LDY CMANGL ;FIND A BIG OPENING 3282 | LDX CMANGL 3283 | LDA I,/2 3284 | STA J 3285 | BEGIN 3286 | LDA DANGER 3287 | AND AY,BIGHOL 3288 | IFEQ 3289 | RTS 3290 | THEN 3291 | LDA DANGER 3292 | AND AX,BIGHOL 3293 | IFEQ 3294 | TXA 3295 | TAY 3296 | LDA I,0 3297 | RTS 3298 | THEN 3299 | DEY 3300 | IFMI 3301 | LDY I,-1 3302 | THEN 3303 | INX 3304 | CPX I,ENDBIG-BIGHOL 3305 | IFCS 3306 | LDX I,0 3307 | THEN 3308 | DEC J 3309 | MIEND 3310 | RTS 3311 | .PAGE 3312 | .SBTTL FIND SMALL HOLE FOR CM 3313 | FINSIN: ;FIND SMALL OPENING 3314 | LDA CMANGL 3315 | LSR 3316 | TAY 3317 | TAX 3318 | LDA I,4 3319 | STA J 3320 | BEGIN 3321 | LDA DANGER 3322 | AND AY,SMAHOL 3323 | BEQ GOTHOL 3324 | LDA DANGER 3325 | AND AX,SMAHOL 3326 | IFEQ 3327 | TXA 3328 | TAY 3329 | GOTHOL: TYA 3330 | ASL 3331 | TAY 3332 | LDA I,0 3333 | RTS 3334 | THEN 3335 | DEY 3336 | IFMI 3337 | LDY I,7 3338 | THEN 3339 | INX 3340 | CPX I,8 3341 | IFCS 3342 | LDX I,0 3343 | THEN 3344 | DEC J 3345 | MIEND 3346 | RTS 3347 | .PAGE 3348 | .SBTTL DEVIATE CM 3349 | ;INPUT: MISIND 3350 | ; Y=DEVIATION ANGLE 3351 | ; 3352 | ;OUTPUT:C BIT:AT TARGET? C=NO 5=YES 3353 | CMDEVI: LDX MISIND 3354 | LDA AX,ABCPHH 3355 | CMP I,IHMAX 3356 | IFCC ;IN BOUNDS? 3357 | CMP I,IHMIN 3358 | IFCS 3359 | LDA AX,ABCPVH 3360 | CMP I,IVMAX 3361 | IFCC 3362 | CMP I,IVMIN 3363 | IFCS 3364 | JSR UPDEVI ;YES, AVOID BANG 3365 | LDY MISIND 3366 | JSR ABMVEL ;RECALC INCS 3367 | CLC ;NOT AT TARGET SIGNAL 3368 | RTS 3369 | THEN 3370 | THEN 3371 | THEN 3372 | THEN 3373 | JMP UPDPOS ;NO. GO TOWARD TARGET 3374 | .PAGE 3375 | .SBTTL CM DEVIATION 3376 | ;INPUT: Y=NEW DIRECTION (0->15) 3377 | ; MISIND 3378 | UPDEVI: 3379 | LDX MISIND 3380 | LDA AY,DEVIHL 3381 | CLC 3382 | ADC AX,ABCPHL 3383 | STA AX,ABCPHL 3384 | LDA AY,DEVIHH 3385 | ADC AX,ABCPHH 3386 | STA AX,ABCPHH 3387 | LDA AY,DEVIVL 3388 | CLC 3389 | ADC AX,ABCPVL 3390 | STA AX,ABCPVL 3391 | LDA AY,DEVIVH 3392 | ADC AX,ABCPVH 3393 | STA AX,ABCPVH 3394 | RTS 3395 | DEVIVL: .BYTE 0,0EC,0B4,62 3396 | DEVIHL: .BYTE 0,9E,4C,14,0,14,4C,9E ;0->7 3397 | .BYTE 0,062,0B4,0EC,0,0EC,0B4,062 ;8->15 3398 | DEVIVH: .BYTE 1,0,0,0 3399 | DEVIHH: .BYTE 0,0FF,0FF,0FF,-1,0FF,0FF,0FF ;0->7 3400 | .BYTE 0,0,0,0,1,0,0,0 ;8->15 3401 | .END 3402 | --------------------------------------------------------------------------------