10 ;EFT VERSION 1.8C (COMBAT) 11/30/81 COPYRIGHT CHRIS CRAWFORD 1981
20 ;
30 ;Page zero RAM
40 ;
50 ;These locations are for the mainline routines
60 ;
70 CHUNKX=$BE
80 CHUNKY=$BF
90 CORPS=$B4
0100  *=$C0
0110 MAPPTR *=*+2
0120 ARMY *=*+1
0130 UNITNO *=*+1
0140 DEFNDR *=*+1
0150 TEMPR *=*+1
0160 TEMPZ *=*+1
0170 ACCLO *=*+1
0180 ACCHI *=*+1
0190 TURN *=*+1
0200 LAT *=*+1
0210 LONG *=*+1
0220 RFR *=*+1
0230 TRNTYP *=*+1
0240 SQVAL *=*+1
0250 ;
0260 ;
0270 CONSOL=$D01F
0280 AUDF1=$D200
0290 AUDC1=$D201
0300 RANDOM=$D20A
0310 NMIEN=$D40E
0320 ;
0330 ;THESE VALUES ARE USED BY MAINLINE ROUTINE ONLY
0340 ;
0350 EARTH=$606
0360 TRNCOD=$62B
0370  *=$636
0380 SQX *=*+1 adjacent square
0390 SQY *=*+1
0400  *=$68E
0410 DELAY *=*+1
0420 HANDCP *=*+1
0430 TOTGS *=*+1
0440 TOTRS *=*+1
0450 OFR *=*+1
0460 HOMEDR *=*+1
0470 ZOC *=*+1
0480 TEMPQ *=*+1
0490 LLIM *=*+1
0500 VICTRY *=*+1
0510 ;
0520 ;declarations of routines in other modules
0530 ;
0540 INVERT=$4D26
0550 STALL=$7200
0560 TERR=$7240
0570 TERRB=$7246
0580 Y00=$72DE
0590 TERRTY=$7369
0600 DNUMBR=$7BB2
0610 JSTP=$799C
0620 DWORDS=$79C0
0630 SWITCH=$79EF
0640 DEFNC=$79B4
0650 OFFNC=$7BF6
0660 XINC=$7BF2
0670 YINC=$7BF1
0680 ;
0690  *=$5400
0700 CORPSX *=*+159 x-coords of all units (pixel frame)
0710 CORPSY *=*+159 y-coords of all units (pixel frame)
0720 MSTRNG *=*+159 muster strengths
0730 CSTRNG *=*+159 combat strengths
0740 SWAP *=*+159 terrain code underneath unit
0750 ARRIVE *=*+159 turn of arrival
0760 WORDS *=*+272 various words for messages
0770 CORPT *=*+159 codes for unit types
0780 CORPNO *=*+159 ID numbers of units
0790 HDIGIT *=*+256 tables for displaying numbers (hundreds)
0800 TDIGIT *=*+256 tens tables
0810 ODIGIT *=*+256 ones tables
0820 TXTTBL *=*+96 more text
0830 MONLEN *=*+13 table of month lengths
0840 HMORDS *=*+159 how many orders each unit has in queue
0850 WHORDS *=*+159 what the orders are
0860 WHORDH *=*+159
0870 BEEPTB *=*+4 table of beep tones
0880 ERRMSG *=*+128 table of error messages
0890 XOFF *=*+4 offsets for moving maltakreuze
0900 YOFF *=*+4
0910 MASKO *=*+4 mask values for decoding orders
0920 XADD *=*+4 offsets for moving arrow
0930 YADD *=*+4
0940 TRTAB *=*+13 tree color table
0950 MLTKRZ *=*+8 maltese cross shape
0960 ;
0970 ;RAM from $6000 to $6430 is taken up by
0980 ;character sets and the display list
0990 ;
1000  *=$6431
1010 ARRTAB *=*+32 arrow shapes
1020  *=$6450
1030 TXTWDW *=$6CB1
1040 STKTAB *=*+16 a joystick decoding table
1050 SSNCOD *=*+12 season codes
1060 TRNTAB *=*+60 terrain cost tables
1070 BHX1 *=*+22 intraversible square pair coordinates
1080 BHY1 *=*+22
1090 BHX2 *=*+22
1100 BHY2 *=*+22
1110 EXEC *=*+159 execution times
1120 ;
1130  *=$4ED8
1140 ;
1150 ;combat routine
1160 ;
1170  LDA #$00
1180  STA VICTRY clear victory flag
1190  LDX ARMY
1200  CPX #$2A Finns can't attack
1210  BEQ A10
1220  CPX #$2B
1230  BNE A11
1240 A10 RTS
1250 A11 LDY UNITNO
1260  STY DEFNDR
1270  LDX DEFNDR make combat graphics
1280  LDA SWAP,X
1290  PHA
1300  LDA #$FF solid red square
1310  CPX #$37 Russian unit?
1320  BCS B1
1330  LDA #$7F make it white for Germans
1340 B1 STA SWAP,X
1350  STX CORPS
1360  LDA CORPSX,X
1370  STA CHUNKX
1380  LDA CORPSY,X
1390  STA CHUNKY
1400  JSR SWITCH
1410  LDY #$08
1420  LDX #$8F
1430 LOOP78 STX AUDC1
1440  STY AUDF1
1450  JSR STALL
1460  TYA
1470  CLC
1480  ADC #$08
1490  TAY
1500  DEX
1510  CPX #$7F
1520  BNE LOOP78
1530 ;
1540 ;now replace original unit character
1550 ;
1560  JSR SWITCH
1570  LDX DEFNDR
1580  PLA
1590  STA SWAP,X
1600 ;
1610 ;
1620  JSR TERRTY terrain in defender's square
1630  LDX DEFNC,Y defensive bonus factor
1640  LDA CSTRNG,Y defender's strength
1650  LSR A
1660 Y15 DEX adjust for terrain
1670  BEQ Y16
1680  ROL A
1690  BCC Y15
1700  LDA #$FF
1710 ;
1720 ;now adjust for defender's motion
1730 ;
1740 Y16 LDX HMORDS,Y
1750  BEQ DOBATL
1760  LSR A
1770 ;
1780 ;evaluate defender's strike
1790 ;
1800 DOBATL CMP RANDOM
1810  BCC ATAKR
1820  LDX ARMY
1830  DEC MSTRNG,X
1840  LDA CSTRNG,X
1850  SBC #$05
1860  STA CSTRNG,X
1870  BEQ Z28
1880  BCS Y24
1890 Z28 JMP DEAD attacker dies
1900 Y24 JSR BRKCHK attacker lives; does he break?
1910 ;
1920 ;evaluate attacker's strike
1930 ;
1940 ATAKR LDX ARMY
1950  LDA CORPSX,X
1960  STA LONG
1970  LDA CORPSY,X
1980  STA LAT
1990  JSR TERR
2000  JSR TERRTY
2010  LDA OFFNC,Y
2020  TAY
2030  LDX ARMY
2040  LDA CSTRNG,X
2050  DEY
2060  BEQ Y19
2070  LSR A river attack penalty
2080 Y19 CMP RANDOM
2090  BCC A20
2100  LDX DEFNDR attacker strikes defender
2110  DEC MSTRNG,X
2120  LDA CSTRNG,X
2130  SBC #$05
2140  STA CSTRNG,X
2150  BEQ Z29
2160  BCS Y25
2170 Z29 JSR DEAD defender dies
2180 A20 JMP ENDCOM
2190 Y25 JSR BRKCHK does defender break?
2200  BCC A20
2210  LDY ARMY
2220  LDA WHORDS,Y
2230  AND #$03
2240  TAY first retreat priority : away from attacker
2250  JSR RETRET
2260  BCC VICCOM defender died
2270  BEQ Y27 defender may retreat
2280  LDY #$01 second priority: east/west
2290  CPX #$37
2300  BCS Y28
2310  LDY #$03
2320 Y28 JSR RETRET
2330  BCC VICCOM
2340  BEQ Y27
2350  LDY #$02 third priority: north
2360  JSR RETRET
2370  BCC VICCOM
2380  BEQ Y27
2390  LDY #$00 fourth priority: south
2400  JSR RETRET
2410  BCC VICCOM
2420  BEQ Y27
2430  LDY #$03 last priority: west/east
2440  CPX #$37
2450  BCS Y26
2460  LDY #$01
2470 Y26 JSR RETRET
2480  BCC VICCOM
2490  BNE ENDCOM
2500 Y27 STX CORPS retreat the defender
2510  LDA CORPSX,X
2520  STA CHUNKX
2530  LDA CORPSY,X
2540  STA CHUNKY
2550  JSR SWITCH
2560  LDX CORPS
2570  LDA LAT
2580  STA CORPSY,X
2590  STA CHUNKY
2600  LDA LONG
2610  STA CORPSX,X
2620  STA CHUNKX
2630  JSR SWITCH
2640 VICCOM LDX ARMY
2650  STX CORPS
2660  LDA CORPSX,X
2670  STA CHUNKX
2680  LDA CORPSY,X
2690  STA CHUNKY
2700  LDA ACCLO defender's coordinates
2710  STA LONG
2720  LDA ACCHI
2730  STA LAT
2740  LDA #$FF
2750  STA VICTRY
2760 ENDCOM LDX ARMY
2770  INC EXEC,X
2780  RTS
2790 ;
2800 ;Subroutines for combat
2810 ;input: X = ID # of defender. Y = proposed DIR of retreat
2820 ;output: C bit set if defender lives, clear if dies
2830 ;Z bit set if retreat open, clear if blocked
2840 ;
2850 RETRET LDA CORPSX,X
2860  CLC
2870  ADC XINC,Y
2880  STA LONG
2890  LDA CORPSY,X
2900  CLC
2910  ADC YINC,Y
2920  STA LAT
2930  JSR TERR examine terrain
2940  JSR TERRTY
2950  LDX DEFNDR
2960  LDA UNITNO anybody in this square?
2970  BNE Y22
2980  LDA TRNTYP no
2990 ;
3000 ;check for bad ocean crossings
3010 ;
3020  CMP #$07 coastline?
3030  BCC Y41
3040  CMP #$09
3050  BEQ Y22
3060  LDY #$15
3070 LOOP42 LDA LAT
3080  CMP BHY1,Y
3090  BNE Y43
3100  LDA LONG
3110  CMP BHX1,Y
3120  BNE Y43
3130  LDA CORPSX,X
3140  CMP BHX2,Y
3150  BNE Y43
3160  LDA CORPSY,X
3170  CMP BHY2,Y
3180  BEQ Y22
3190 Y43 DEY
3200  BPL LOOP42
3210 ;
3220 ;any blocking ZOC's?
3230 ;
3240 Y41 JSR CHKZOC
3250  LDX DEFNDR
3260  LDA ZOC
3270  CMP #$02
3280  BCS Y22 no retreat into ZOC
3290  LDA #$00 retreat is possible
3300  SEC
3310  RTS
3320 Y22 LDA CSTRNG,X retreat not possible,extract penalty
3330  SEC
3340  SBC #$05
3350  STA CSTRNG,X
3360  BEQ Z27
3370  BCS Y23
3380 Z27 JSR DEAD
3390  CLC
3400 Y23 LDA #$FF
3410  RTS
3420 ;
3430 ;supply evaluation routine
3440 ;
3450  LDA ARRIVE,X
3460  CMP TURN
3470  BEQ Z86
3480  BCC Z86
3490  RTS
3500 Z86 LDA #$18
3510  CPX #$37
3520  BCS A13
3530  LDA #$18
3540  LDY EARTH
3550  CPY #$02 mud?
3560  BEQ A12
3570  CPY #$0A snow?
3580  BNE A13
3590  LDA CORPSX,X this discourages gung-ho corps
3600  ASL A double distance
3610  ASL A
3620  ADC #$4A
3630  CMP RANDOM
3640  BCC A12
3650  LDA #$10 harder to get supplies in winter
3660 A13 STA ACCLO
3670  LDY #$01 Russians go east
3680  CPX #$37
3690  BCS Z80
3700  LDY #$03 Germans go west
3710 Z80 STY HOMEDR
3720  LDA CORPSX,X
3730  STA LONG
3740  LDA CORPSY,X
3750  STA LAT
3760  LDA #$00
3770  STA RFR
3780 LOOP91 LDA LONG
3790  STA SQX
3800  LDA LAT
3810  STA SQY
3820 LOOP90 LDA SQX
3830  CLC
3840  ADC XINC,Y
3850  STA LONG
3860  LDA SQY
3870  CLC
3880  ADC YINC,Y
3890  STA LAT
3900  JSR CHKZOC
3910  CPX #$37
3920  BCC A80
3930  JSR TERRB
3940  LDA TRNCOD
3950  CMP #$BF
3960  BEQ A77
3970 A80 LDA ZOC
3980  CMP #$02
3990  BCC Z81
4000  INC RFR
4010 A77 INC RFR
4020  LDA RFR
4030  CMP ACCLO
4040  BCC Z84
4050 A12 LSR CSTRNG,X
4060  BNE A50
4070  JMP DEAD
4080 A50 RTS
4090 Z84 LDA RANDOM
4100  AND #$02
4110  TAY
4120  JMP LOOP90
4130 Z81 LDY HOMEDR
4140  LDA LONG
4150  CPY #$01
4160  BNE Z85
4170  CMP #$FF
4180  BNE LOOP91
4190  INC MSTRNG,X Russian replacements
4200  INC MSTRNG,X
4210  RTS
4220 Z85 CMP #$2E
4230  BNE LOOP91
4240  RTS
4250 ;
4260 ;routine to check for zone of control
4270 ;
4280 CHKZOC LDA #$00
4290  STA ZOC
4300  LDA #$40
4310  CPX #$37
4320  BCS A70
4330  LDA #$C0
4340 A70 STA TEMPR
4350  JSR TERRB
4360  BNE A74
4370  LDA TRNCOD
4380  AND #$C0
4390  CMP TEMPR
4400  BEQ A71
4410  LDA CORPSX,X
4420  CMP LONG
4430  BNE A79
4440  LDA CORPSY,X
4450  CMP LAT
4460  BEQ A74
4470 A79 RTS
4480 A71 LDA #$02
4490  STA ZOC
4500  RTS
4510 A74 LDX #$07
4520 LOOPQ LDY JSTP+16,X
4530  LDA LONG
4540  CLC
4550  ADC XINC,Y
4560  STA LONG
4570  LDA LAT
4580  CLC
4590  ADC YINC,Y
4600  STA LAT
4610  JSR TERRB
4620  BNE A75
4630  LDA TRNCOD
4640  AND #$C0
4650  CMP TEMPR
4660  BNE A75
4670  TXA
4680  AND #$01
4690  CLC
4700  ADC #$01
4710  ADC ZOC
4720  STA ZOC
4730 A75 DEX
4740  BPL LOOPQ
4750  DEC LAT
4760  DEC LONG
4770  LDX ARMY
4780  RTS
4790 ;
4800 ;
4810 DEAD LDA #$00
4820  STA MSTRNG,X
4830  STA CSTRNG,X
4840  STA HMORDS,X
4850  LDA #$FF
4860  STA EXEC,X
4870  STA ARRIVE,X
4880  STX CORPS
4890  LDA CORPSX,X
4900  STA CHUNKX
4910  LDA CORPSY,X
4920  STA CHUNKY
4930  JSR SWITCH
4940  RTS
4950 ;
4960 ;Subroutine BRKCHK evaluates whether a unit under attack breaks
4970 ;
4980 BRKCHK CPX #$37
4990  BCS WEAKLG
5000  LDA CORPT,X
5010  AND #$F0
5020  BNE WEAKLG
5030  LDA MSTRNG,X
5040  LSR A
5050  JMP Y40
5060 WEAKLG LDA MSTRNG,X
5070  LSR A
5080  LSR A
5090  LSR A
5100  STA TEMPR
5110  LDA MSTRNG,X
5120  SEC
5130  SBC TEMPR
5140 Y40 CMP CSTRNG,X
5150  BCC A30
5160  LDA #$FF
5170  STA EXEC,X
5180  LDA #$00
5190  STA HMORDS,X
5200 A30 RTS
5210 ;
5220  .END
