01 ;SET2:INITIALIZES PLAYERS AND 02 ;VARIABLES. CALLED BEFORE CASTLE 03 ;STORIMG SUBROUTINES 10 SET2 JSR ZEROPLRS ;JMPSUB TO CLEAR PLAYER/MISSILE MEMORY 20 JSR JS15G ;JMPSUB TO DISPLAY GUN 30 LDA #0 40 STA TIMER1 ;CLEAR TIMER 50 STA TIMER1+1 60 STA $D00B ;SET PLAYER WIDTH 70 STA $D00A 80 STA $D009 90 STA $D008 0100 STA $D00C 0110 LDA #17 ;SET PLAYER PRIORITY 0120 STA $026F 0130 RTS 0131 ; 0132 ;SETPOINT:LOAD TABLE OFFSET AND 0133 ;MOVES POINTER TO NEXT TABLE VALUE 0134 ; 0140 SETPOINT LDX T2 ;LOAD TABLE OFFSET 0150 INC T1,X ;ADD 1 TO TABLE VALUE 0160 LDA T1,X 0170 CMP #2 ;IF < 2 0180 BCC ST0 ;THEN SET POINTER TO NEXT TABLE POS 0190 LDA #0 ;ELSE RESET TABLE VALUE 0200 STA T1,X 0210 ST0 INC T2 ;NEXT TABLE POS 0220 LDA T2 0230 CMP #16 ;TABLE LENGHT IS POS 0 THRU 15 0240 BCC ST2 0250 LDA #0 ;RESET TO START OF TABLE 0260 STA T2 0270 ST2 RTS 0311 ; 0312 ;TWAR:SUBROUTINE USED TO HAVE 0313 ;TROLLS STORM WIZARDS CASTLE 0314 ; 0320 TWAR JSR SET2 0330 JSR ORIGINA ;JMP TO INITIALIZE TEMP11 TO PLAYFIELD START 0340 LDA #CASTR/256 ;LOAD SCREEN 0350 STA DLIST+6 ;OF WIZARDS CASTLE 0360 LDA #CASTR&$FF ;BEING ATACKED 0370 STA DLIST+5 0380 JSR STT 0390 LDA #0 0400 STA WIZRDS ;REMOVE TROLL CHARS THAT 0410 STA WIZRDS+1 ;ARE IN FRONT OF WIZ CASTLE 0420 STA T2 ; 0430 DEC TEMP1+18 ;DECREASE # OF TROLLS 0440 TW1 LDA WKING ;LOAD # OF DEFENDING WIZARDS THAT ARE LEFT 0450 BEQ ENDWART ;IF= THEN CASTLE OVER RUN 0460 LDA #7 ;CHAR 7&8 FORM TROLL 0470 STA T5 ;THAT APPEARS AND 0480 LDA #8 ;ATTACKS WIZARDS CASTLE 0490 STA T5+1 0500 LDY #3 ;ROW NYTE WHERE TROLLS APPEAR 0510 JSR DISPTM ;JMPSUB TO DISPLAY TROLL 0520 JSR WARS ;JMPSUB TO MOVE TROLLS AND BOMBS 0530 JSR SETPOINT 0540 JSR LINECNT2 ;SET POINTER TO NEXT PLAYFIELD LINE 0550 JSR ADD1 ;ADD 1 TO TIMER FOR HOW LONG CASTLE STORMING LASTS 0560 LDA TIMER1+1 0570 CMP #200 ;IF TIMER = 200 THAT STORMING IS OVER 0580 BCC TW1 ;ELSE REPEAT ATTACKING 0590 JSR JOYST0 ;RESET FOR JOYSTICK 0 0600 JSR TEN12 ;SET POSITION FOR POINTER 0610 EWAR JSR PLACE ;SAVE POINTER CHAR 0620 LDA #BOARD/256 ;DISPLAY MAIN 0630 STA DLIST+6 ;PLAYFIELD SCREEN 0640 LDA #BOARD&$FF 0650 STA DLIST+5 0660 JSR COLORPL ;SET PLAYER COLOR 0670 JSR ZEROPLRS ;CLEAR PLAYER/MISSILE MEMORY 0680 JSR PLAYERS ;JMPSUB TO BUILD "CHECKER" BOARD 0690 JSR DELAY 0700 RTS 0710 ENDWART LDA #$EF ;LEFT HALF OF WIZARD KING 0720 STA WIZRDS ;2ND BYTE IN FRONT OF CASTLE 0730 LDA #$F0 ;RIGHT HALF OF WIZARD KING 0740 STA WIZRDS+1 ;BYTE IN FRONT OF CASTLE 0750 JSR TEN12 ; 0760 JMP EWAR ;JMPSUB TO END FIGHT 0801 ; 0802 ;WWAR:USE TO HAVE WIZARDS STORM 0803 ;TROLLS CASTLE 0804 ; 0810 WWAR JSR SET2 0820 JSR ORIGIN1 ;JMPSUB TO INITIALIZE TEMP11 TO PLAYFIELD START 0830 LDA #CASTL/256 ;LOAD ADDRESS OF 0840 STA DLIST+6 ;START OF PLAYFIELD 0850 LDA #CASTL&$FF ;INTO DISPLAY LIST 0860 STA DLIST+5 0870 JSR STT ;JMPSUB TO INITIALIZE DELAY TABLES 0880 LDA #0 0890 STA TROL0 ;CLEAR BYTES IN FRONT 0900 STA TROL0+1 ;OF TROLL CASTLE 0910 STA T2 ;CLEAR TABLE POINTER 0920 DEC TEMP1+19 ;DECREASE # OF WIZARDS ON MAIN PLAYFIELD 0930 WW1 LDA TKING ;TEST FLAG THAT IS = IF 12 TROLLS 0940 BEQ ENDWARW ;HAVE BEEN CAPTURED 0950 LDA #27 ;RIGHT HALF OF WIZARD DRAWING 0960 STA T5 0970 LDA #28 ;LEFT HALF OF WIZARD DRAWING 0980 STA T5+1 0990 LDY #35 ;SET Y TO POS WHERE WIZARDS WILL APPEAR IN A ROW 1000 JSR DISPTM ;JMPSUB TO DISPLAY WIZARD 1010 JSR WARS2 ;JMP TO MOVE WIZARDS/BOMBS 1020 JSR SETPOINT ;JMPSUB TO TEST TABLE VALUE 1030 JSR LINECNT ;JMP TO SET TEMP11 TO NEXT PLAYFIELD ROW 1040 JSR ADD1 ;ADD 1 TO TIMER'S COUNT 1050 LDA TIMER1+1 ;LOAD TIMER 1060 CMP #200 ;IF TIMER =200 1070 BCC WW1 ;THEN CASTLE STORMING IS OVER 1080 JSR JOYST1 ;ENABLE JOYSTICK 1 1090 JSR TEN122 ;SET CHAR POINTER ON MAIN PLAYFIELD 1100 JMP EWAR ;JMP TO END WAR 1110 ENDWARW LDA #$6D ;CHAR OF TROLL KING 1120 STA TROL0 ;SAVE IN FRONT OF CASTLE 1130 LDA #$6E ;OTHER HALF OF TROLL KING 1140 STA TROL0+1 ;SAVE IN FRONT OF CASTLE 1150 JSR TEN122 ;SET CHAR POINTER ON MAIN PLAYFIELD 1160 JMP EWAR ;JMP TO END WAR 1161 ; 1162 ;ADD1: ADDS 1 TO TIMER 1163 ; 1170 ADD1 LDA TIMER1 ;LOW BYTE OF TIMER 1180 CLC 1190 ADC #1 1200 STA TIMER1 1210 LDA TIMER1+1 ;HIGH BYTE OF TIMER 1220 ADC #0 1230 STA TIMER1+1 1240 RTS 1241 ; 1242 ;SUBWAR2:USE TO DETERMINE 1243 ;THE CHARACTER THAT THE 1244 ;TROLL IS MOVING INTO 1245 ; 1250 SUBWAR2 LDA (REM2),Y ;LOAD CHAR THAT TROLL IS COLLIDING WITH 1260 CMP #$39 ;CHAR $39 IS ENTRANCE TO WIZ CASTLE 1270 BNE SB2A 1280 JSR TWAR ;JMPSUB TO STORM CASTLE 1290 JSR JOYST0 ;ENABLE JOYSTICK 0 1300 LDA #1 ;SET FLAG FOR WAR OVER 1310 STA WARFL 1320 RTS 1330 SB2A CMP #23 ;CHAR 23 IS 1ST WIZARD CHAR 1340 BCC SB3A 1350 CMP #45 ;CHAR 45 IS LAST WIZARD CHAR 1360 BCS SB3A 1370 JSR FIGHT ;JMPSUB TO HAVE TROLL/WIZARD FIGHT 1380 JSR JOYST0 ;ENABLE JOYSTICK0 1390 JSR TEN12 ;LOAD CHAR POINTER INTO TEMP STORAGE 1400 JSR PLACE ;DISPLAY POINTER ON MAIN SCREEN 1410 LDA #24 ;CHAR 24 IS LEFT HALF OF WIZARD DRAWING 1420 STA T6 ;TEMPORARY SAVE. 1430 ;TEMP13 IS THE FLAG THAT HOLDS 1440 ;THE VALUE 1 IF WIZARD WAS HIT 1450 ;BY A MISSILE AND VALUE 0 IF 1460 ;TROLL WAS HIT.VALUE IN TEMP13 1470 ;IS CHANGED IN ORDER TO USE THE 1480 ;GENERALIZED CODE SUBWAR3. 1490 LDA TEMP13 ;LOAD FLAG FOR TROLL OR WIZARD KILLED 1500 BNE STORE0 ;SWITCH VALUE 1510 LDA #1 1520 STA TEMP13 1530 JMP SUBWAR3 ;JMP TO REMOVE LOOSER 1540 STORE0 LDA #0 1550 STA TEMP13 1560 JMP SUBWAR3 ;JMP TO REMOVE LOOSER 1570 ENDSUB RTS 1580 SB3A CMP #$EF ;CHAR $EF IS WIZARD KING 1590 BNE ENDSUB ;IF <> THEN EXIT 1600 LDX #2 ;ELSE LOAD X WITH CHAR THAT IS RIGHT HALF OF TROLL 1610 JMP ENDTWAR ;JMP TO END GAME 1611 ; 1612 ;SUBWAR1:USE TO DETERMINE THE 1613 ;CHARACTER THAT THE WIZARD 1614 ;IS MOVING INTO 1615 ; 1620 SUBWAR1 LDA (REM2),Y ;LOAD PLAYFIELD BYTE 1630 CMP #$43 ;CHAR $43 IS ENTRANCE TO TROLL CASTLE 1640 BNE SB1A 1650 JSR WWAR ;JMPSUB TO STORM CASTLE 1660 JSR JOYST1 ;ENABLE JOYSTICK 1 1670 LDA #1 ;SET FLAG FOR WAR OVER 1680 STA WARFL 1690 RTS 1700 SB1A CMP #23 ;CHAR >23 IS TROLL CHARS 1710 BCS SB4A 1720 JSR FIGHT ;JMPSUB TO HAVE TROLL/WIZARD FIGHT 1730 JSR JOYST1 ;ENABLE JOYSTICK 1 1740 JSR TEN122 ;LOAD CHAR POINTER 1750 JSR PLACE ;DISPLAY CHAR POINTER 1760 LDA #2 ;CHAR 2 IS RIGHT HALF OF TROLL 1770 STA T6 ;TEMPORARY SAVE 1780 SUBWAR3 LDY #0 ;CLEAR Y 1790 LDA TEMP13 ;LOAD FLAG TO DETERMINE WHO HAS BEEN KILLED 1800 BNE KILLWZR2 1810 LDA (REM2),Y ;LOAD PLAYFIELD BYTE OF MAIN SCREEN 1820 CMP T6 ;CMP TO RIGHT HALF OF MAN 1830 BNE KT1 ;IF <> THE REMOVE CHAR 1840 SEC ;ELSE SUBTRACT 1 FROM 1850 LDA REM2 ;ADDRESS OF PLAYFIELD BYTE 1860 SBC #1 1870 STA REM2 1880 LDA REM2+1 1890 SBC #0 1900 STA REM2+1 1910 LDA (REM2),Y ;TEST TO SEE IF 1920 BNE KT1 ;HAS A CHAR IN IT.IF IT DOES NOT 1930 INY ;THEN ADD 1 TO ADDRESS OF PLAYFIELD BYTE 1940 KT1 LDA #0 ;USE CHAR 0 TO CLEAR PLAYFIELD BYTE 1950 STA (REM2),Y 1960 INY 1970 STA (REM2),Y 1980 RTS 1990 KILLWZR2 LDA #0 ;USE CHAR 0 TO CLEAR 2000 STA (REM1),Y ;PLAYFIELD BYTE 2010 INY ;NEXT PLAYFIELD BYTE 2020 STA (REM1),Y ;CLEAR BYTE 2030 ENDSUB2 RTS 2040 SB4A CMP #$6E ;CHAR $6E IS TROLL KING 2050 BNE ENDSUB2 ;IF <> THEN EXIT ELSE END GAME 2060 LDX #24 ;CHAR 24 IS RIGHT HALF OF WIZARD 2070 ENDTWAR STX T5+1 ;TEMP SAVE 2080 DEX ;SET X TO BE CHAR THAT IS LEFT HALF OF MAN 2090 STX T5 ;TEMP SAVE 2100 TXA 2110 LDX #0 ;SET X TO START OF PLAYFIELD AREA 2120 ENDLOOP2 STA BOARD,X ;SAVE CHAR IN PLAYFIELD 2130 STA BOARD+240,X 2140 STA BOARD+480,X 2150 STA BOARD+720,X 2160 CMP T5 ;TEST ACCUMULATOR 2170 BEQ LD24 ;CHANGE AS NECESSARY 2180 LDA T5 ;IN ORDER TO DISPLAY 2190 JMP NEXTS2 ;FRONT VIEW OF MAN 2200 LD24 LDA T5+1 2210 NEXTS2 INX 2220 CPX #240 ;IF X = 240 THEN 2230 BNE ENDLOOP2 ;SCREEN IS FILLED WITH MAN CHAR 2240 JSR ZEROPLRS ;CLEAR PLAYER/MISSILE MEMORY 2250 ENDLESS2 JMP ENDLESS2 ;GAME OVER 2251 ; 2252 ;FIGHT:SUBROUTINE TO HAVE TROLL 2253 ;COMBAT WITH WIZARD 2254 ; 2260 FIGHT LDA #1 ; 2270 STA $D01E ;SET HIT CLEAR 2280 STA FSQ1 ;SET FLAG TO ENABLE MISSILE TO BE FIRED 2290 STA FSQ2 2300 JSR ZEROPLRS ;CLEAR PLAYER/MISSILE MEMORY 2310 JSR WIZPOS ;INITIALIZE WIZARD VARIABLES 2320 JSR MANPOS ;INITIALIZE TROLL VARIABLES 2330 STA TROLWIZ ;SET FLAG TO ALLOW TROLL SUBROUTINES TO BE CALLED 2340 JSR JS15M ;DISPLAY TROLL 2350 JSR JS15W ;DISPLAY WIZARD 2360 LDA #DLIST2/256 ;LOAD DISPLAY LIST 2370 STA 561 ;THAT IS USED 2380 LDA #DLIST2&$FF ;WHEN TROLL FIGHTS WIZARD 2390 STA 560 2400 LDA #5 2410 STA TEMP1+15 2420 LDA #1 2430 STA DIRFLAG ;FLAG FOR DIRECTION OF TROLL'S MISSILE 2440 STA DIRFLAG+1 ;FLAG FOR DIRECTION OF WIZARDS MISSILE 2450 STA SQFLAG ;FLAG FOR TROLLS MISSILE FIRED 2460 STA SQFLAG+1 ;FLAG FOR WIZARDS MISSILE FIRED 2470 STA DIRECT 2480 STA WARFL ;SET FLAG FOR FIGHT HAS STARTED 2490 LDA #0 2500 STA TEMP1+10 ;CLEAR END OF FIGHT FLAG 2510 STA TEMP13 ;CLEAR FLAG FOR TROLL OR WIZARD KILLED 2520 LDA #2 2530 STA DA1+3 ;SET DELAY VALUE 2540 LDA REM1 2550 STA TEMP10 ;SAVE POS OF 2560 LDA REM1+1 ;MAN THAT IS ATTACKING 2570 STA TEMP10+1 2580 JSR STICK15 ;DISPLAY FRONT VIEW OF MAN THAT IS ATTACKING 2590 LDA #$02 2600 STA JSTCKV+1 ;SET HIGH BYTE FOR JOYSTICK 2610 F1 LDX #2 ;OFFSET FOR TROLL VARIABLE 2620 STX TROLWIZ ;SET FLAG FOR TROLL TURN 2630 LDA #$78 2640 STA JSTCKV ;ENABLE JOYSTICK 0 2650 JSR MOVMAN ;MOVE TROLL 2660 LDX #4 ;OFFSET FOR WIZARD VARIABLE 2670 LDA #0 2680 STA TROLWIZ ;SET FLAG FOR WIZARD TURN 2690 INC JSTCKV ;ENABLE JOYSTICK 1 2700 JSR MOVMAN ;MOVE WIZARD 2710 JSR DELAY 2720 LDA TEMP1+10 ;IF TEMP1+10 IS = THEN 2730 BEQ F1 ;FIGHT NOT OVER.BRANCH TO CONTINUE FIGHT 2740 LDA #255 2750 STA DA1+3 ;SET DELAY VALUE 2760 JSR DELAY ;JMPSUB TO DELAY 2770 JSR DELAY ;THE CHANGE FROM 2780 JSR DELAY ;THE FIGHT SCREEN 2790 JSR DELAY ;TO THE MAIN SCREEN 2800 JSR INIT1 ;JMPSUB TO INITIALIZE VARIABLES 2810 JSR ZEROPLRS ;JMPSUB TO CLEAR PLAYER/MISSILE MEMORY 2820 JSR PLAYERS ;JMPSUB TO BUILD "CHECKER" BOARD 2830 RTS 2831 ; 2832 ;DISPTM:USE TO DISPLAY ATTACKING 2833 ;MEN.DISPLAYS MEN RANDOMLY ON 2834 ;EACH PLAYFIELD ROW 2835 ; 2840 DISPTM LDX T2 ;LOAD TABLE OFFSET 2850 OO5 LDA TABLE3,X ;HIGH BYTE OF DELAY 2860 BNE OO6 2870 LDA TABLE2,X ;LOW BYTE OF DELAY 2880 BEQ OO7 2890 OO6 SEC 2900 LDA TABLE2,X ;SUBTRACT 1 FROM 2910 SBC #1 ;DELAY TABLE 2920 STA TABLE2,X 2930 LDA TABLE3,X 2940 SBC #0 2950 STA TABLE3,X 2960 RTS ;EXIT 2970 OO7 LDA (TEMP11),Y ;LOAD PLAYFIELD BYTE 2980 BNE OO4 ;IF <> THEN EXIT 2990 LDA TABLE7,X ;DELAY VALUE 3000 STA TABLE2,X ;SAVE IN LOW BYTE 3010 LDA TABLE5,X ;DELAY VALUE 3020 STA TABLE3,X ;SAVE IN HIGH BYTE 3030 LDA (TEMP11),Y ;LOAD PLAYFIELD BYTE 3040 BNE OO4 ;IF <> THEN EXIT 3050 LDA T5+1 ;LOAD CHAR DRAWING OF ATTACKER 3060 STA (TEMP11),Y ;SAVE IN PLAYFIELD 3070 DEY ;NEXT PLAYFIELD BYTE 3080 LDA T5 ;LOAD CHAR DRAWING OF ATTACKER 3090 STA (TEMP11),Y ;SAVE IN PLAYFIELD BYTE 3100 OO4 RTS 3101 ; 3102 ;STT:SUBROUTINE TO LOAD DELAY 3103 ;VALUES INTO DELAY TABLE. 3104 ;THE TABLE IS USE TO DETERMINE 3105 ;HOW LONG BEFORE ATTACKER 3106 ;APPEARS ON A ROW 3107 ; 3110 STT LDX #15 ;(LENGTH-1) OF TABLE 3120 STT2 LDA TABLE7,X ;LOAD DELAY VALUE 3130 STA TABLE2,X ;SAVE IN LOW BYTE OF DELAY 3140 LDA TABLE5,X ;LOAD DELAY VALUE 3150 STA TABLE3,X ;SAVE IN HIGH BYTE 3160 LDA #0 ;SET DELAY VALUE 3170 STA T1,X ;SAVE IN TABLE THAT MUST = 1 BEFORE ATTACKER MOVES 3180 DEX ;NEXT TABLE POS 3190 BPL STT2 3200 RTS 3201 ; 3202 ; 3210 PREWAR1 JSR SAVETEMP ;JMPSUB TO SAVE CURRENT POS BEING ATTACKED 3220 JSR SUB401 ;RESET POINTER 3230 RTS 3240 PREWAR2 JSR SAVETEMP ;JMPSUB TO SAVE CURRENT POS BEING ATTACKED 3250 JSR ADD401 ;RESET POINTER 3260 RTS 3270 SAVETEMP LDA TEMP10 ;LOW BYTE 3280 STA REM2 ;TEMPORARY SAVE 3290 LDA TEMP10+1 ;HIGH BYTE 3300 STA REM2+1 3310 RTS