                1  *EIGHT WAY SCROLLING DAN PINAL
                2  *EQUATES
                3  SDLSTL	EQU	$230
                4  STICK0	EQU	$278
                5  DLISTL	EQU	$D402
                6  HSCROL	EQU	$D404
                7  VSCROL	EQU	$D405
                8  SETVBV	EQU	$E45C
                9  XITVBV	EQU	$E462
               10  *
               11  SCREN	EQU	$0000
               12  WIDTH	EQU	$0400
               13  HEIGHT	EQU	$0040
               14  SCRENH	EQU	40
               15  SCRENV	EQU	20
               16  WINDOW	EQU	$9C40+800		;FOR A 40K OR 48K COMPUTER WITH CARTRIDGE
               17  *
               18  	ORG	$4000
               19  *
               20  START
4000 A900      21  	LDA	#$00
4002 8D5D42    22  	STA	ENABLE			;SET VBI FLAG TO OFF
               23  * INIT SCROLL VARIABLES TO STARTUP VALUES
4005 8D4E42    24  	STA	MAPH			;SET SCREEN COORD. TO 0
4008 8D4F42    25  	STA	MAPH+1
400B 8D5042    26  	STA	MAPV
400E 8D5142    27  	STA	MAPV+1
4011 8D5942    28  	STA	FINEV
4014 8D05D4    29  	STA	VSCROL
4017 A90C      30  	LDA	#$0C
4019 8D5842    31  	STA	FINEH
401C 8D04D4    32  	STA	HSCROL
               33  * INIT BASE ADDRESS TO SCREEN ADDRESS
401F A900      34  	LDA	#>SCREN
4021 8D5642    35  	STA	BASE
4024 A900      36  	LDA	#<SCREN
4026 8D5742    37  	STA	BASE+1
4029 20BB41    38  	JSR	WRITEDL			;WRITE NEW DISPLAY LIST
               39  * TELL ANTIC WHERE NEW DLIST IS
402C A902      40  	LDA	#>NDLIST
402E 8D3002    41  	STA	SDLSTL
4031 A942      42  	LDA	#<NDLIST
4033 8D3102    43  	STA	SDLSTL+1
               44  * SETUP VBLANK
4036 A907      45  	LDA	#$07			;DEFFERED VBI
4038 A045      46  	LDY	#>VBI
403A A240      47  	LDX	#<VBI
403C 205CE4    48  	JSR	SETVBV
403F A901      49  	LDA	#$01
4041 8D5D42    50  	STA	ENABLE			;TURN VBLANK FLAG TO ON
4044 60        51  	RTS				;BACK TO YOUR MONITOR
               52  VBI
4045 D8        53  	CLD				;JUST A PRECAUTION
4046 AD5D42    54  	LDA	ENABLE			;CHECK THE SOFTWARE FLAG
4049 D003      55  	BNE	CKSTK			;OK
404B 4CB841    56  	JMP	XVBI			;LEAVE VBI
               57  CKSTK
               58  * COPY OLD MAP VARIABLES IN CASE NEW VALUES ARE INVALID
404E AD5842    59  	LDA	FINEH
4051 8D5A42    60  	STA	NEWFH
4054 AD5942    61  	LDA	FINEV
4057 8D5B42    62  	STA	NEWFV
405A A900      63  	LDA	#$00
405C 8D5C42    64  	STA	CHANGE			;SET CHANGE FLAG TO 0
               65  * USE JOYSTICK VALUE TO INDEX INTO TABLE OF +1,0, OR -1
405F AE7802    66  	LDX	STICK0
4062 BDE241    67  	LDA	HOFFS,X
4065 8D5242    68  	STA	HOFF
4068 BDF241    69  	LDA	VOFFS,X
406B 8D5442    70  	STA	VOFF
               71  CHECKH
406E AD5242    72  	LDA	HOFF
4071 F06C      73  	BEQ	CHECKV			;IF 0 NO CHANCE LEAVE
               74  * ADD OFFSET TO FINEH
4073 18        75  	CLC
4074 AD5A42    76  	LDA	NEWFH
4077 6D5242    77  	ADC	HOFF
407A 8D5A42    78  	STA	NEWFH
407D C910      79  	CMP	#$10			;TIME TO CRUDE SCROLL?
407F F00D      80  	BEQ	RSHIFT
4081 C90B      81  	CMP	#$0B			;TIME TO CRUDE SCROLL?
4083 F030      82  	BEQ	LSHIFT
4085 8D5842    83  	STA	FINEH
4088 8D04D4    84  	STA	HSCROL
408B 4CDF40    85  	JMP	CHECKV			;GO CHECK VERTICAL
               86  RSHIFT
408E AD4E42    87  	LDA	MAPH			;CHECK IF HORIZONTAL ALREADY AT 0?
4091 0D4F42    88  	ORA	MAPH+1
4094 F049      89  	BEQ	CHECKV			;CAN'T GO LESS THAN 0
4096 38        90  	SEC
4097 AD4E42    91  	LDA	MAPH
409A E901      92  	SBC	#$01
409C 8D4E42    93  	STA	MAPH
409F AD4F42    94  	LDA	MAPH+1
40A2 E900      95  	SBC	#$00
40A4 8D4F42    96  	STA	MAPH+1
40A7 A90C      97  	LDA	#$0C
40A9 8D5842    98  	STA	FINEH
40AC 8D04D4    99  	STA	HSCROL
40AF EE5C42   100  	INC	CHANGE			;SET FLAG TO WRITE NEW DISPLAY LIST
40B2 4CDF40   101  	JMP	CHECKV
              102  LSHIFT
              103  * FIRST CHECK IF ALREADY AT LIMIT
40B5 AD4E42   104  	LDA	MAPH
40B8 C9D8     105  	CMP	#>WIDTH-SCRENH
40BA D007     106  	BNE	AA1
40BC AD4F42   107  	LDA	MAPH+1
40BF C903     108  	CMP	#<WIDTH-SCRENH
40C1 F01C     109  	BEQ	CHECKV
              110  AA1
              111  * CHANGE MAPH & SET FINE SCROLL
40C3 18       112  	CLC
40C4 AD4E42   113  	LDA	MAPH
40C7 6901     114  	ADC	#$01
40C9 8D4E42   115  	STA	MAPH
40CC AD4F42   116  	LDA	MAPH+1
40CF 6900     117  	ADC	#$00
40D1 8D4F42   118  	STA	MAPH+1
40D4 A90F     119  	LDA	#$0F
40D6 8D5842   120  	STA	FINEH
40D9 8D04D4   121  	STA	HSCROL
40DC EE5C42   122  	INC	CHANGE			;SET FLAG FOR CKLIST
              123  CHECKV
              124  * VERTICAL WORKS SAME AS HORIZONTAL
40DF AD5442   125  	LDA	VOFF
40E2 F06F     126  	BEQ	CKLIST			;LEAVE IF No CHANGES TO MAKE
              127  * ADD OFFSET TO FINE SCROLL VALUE
40E4 18       128  	CLC
40E5 6D5B42   129  	ADC	NEWFV
40E8 8D5B42   130  	STA	NEWFV
              131  * CHECK TO SEE IF IT'S TIME TO CRUDE SCROLL
40EB C908     132  	CMP	#$08
40ED F00D     133  	BEQ	DSHIFT
40EF C9FF     134  	CMP	#$FF
40F1 F039     135  	BEQ	USHIFT
40F3 8D5942   136  	STA	FINEV
40F6 8D05D4   137  	STA	VSCROL
40F9 4C5341   138  	JMP	CKLIST
              139  DSHIFT
              140  * CHECK TO SEE IF MAP IS AT LIMIT
40FC AD5042   141  	LDA	MAPV
40FF C92C     142  	CMP	#>HEIGHT-SCRENV
4101 D007     143  	BNE	AB1
4103 AD5142   144  	LDA	MAPV+1
4106 C900     145  	CMP	#<HEIGHT-SCRENV
4108 F049     146  	BEQ	CKLIST
              147  AB1
              148  * SET MAP VERT. OFFSET & RESET FINE SCROLL VALUE
410A 18       149  	CLC
410B AD5042   150  	LDA	MAPV
410E 6901     151  	ADC	#$01
4110 8D5042   152  	STA	MAPV
4113 AD5142   153  	LDA	MAPV+1
4116 6900     154  	ADC	#$00
4118 8D5142   155  	STA	MAPV+1
411B AD5B42   156  	LDA	NEWFV
411E 2907     157  	AND	#$07
4120 8D5942   158  	STA	FINEV
4123 8D05D4   159  	STA	VSCROL
4126 EE5C42   160  	INC	CHANGE
4129 4C5341   161  	JMP	CKLIST
              162  USHIFT
              163  * CHECK FOR MAP AT LIMIT
412C AD5042   164  	LDA	MAPV
412F 0D5142   165  	ORA	MAPV+1
4132 F01F     166  	BEQ	CKLIST
4134 38       167  	SEC
4135 AD5042   168  	LDA	MAPV
4138 E901     169  	SBC	#$01
413A 8D5042   170  	STA	MAPV
413D AD5142   171  	LDA	MAPV+1
4140 E900     172  	SBC	#$00
4142 8D5142   173  	STA	MAPV+1
4145 AD5B42   174  	LDA	NEWFV
4148 2907     175  	AND	#$07
414A 8D5942   176  	STA	FINEV
414D 8D05D4   177  	STA	VSCROL
4150 EE5C42   178  	INC	CHANGE
              179  CKLIST
4153 AD5C42   180  	LDA	CHANGE			;CHECK IF MAP HORIZONTAL OR VERTICAL HAS BEEN CHANGE
4156 F060     181  	BEQ	XVBI			;NO NEED TO REWRITE DISPLAY LIST IF NO CHANGE
              182  					;SET UP TO MULTIPLY WIDTH X MAP VERTICAL OFFSET
4158 A900     183  	LDA	#>WIDTH
415A 8D4A42   184  	STA	RESULT
415D A904     185  	LDA	#<WIDTH
415F 8D4B42   186  	STA	RESULT+1
4162 A900     187  	LDA	#$00			;OVERFLOW SHOULD NOT BE NEEDED BUT ITS HERE ANYWAY
4164 8D4C42   188  	STA	OVERFL
4167 8D4D42   189  	STA	OVERFL+1
416A A211     190  	LDX	#$11
416C 18       191  	CLC
              192  * THIS IS A 16 BIT MULTIPLY TO CALCULATE OFFSET FROM STARTING MA
416D 6E4D42   193  MULT16	ROR	OVERFL+1
4170 6E4C42   194  	ROR	OVERFL
4173 6E4B42   195  	ROR	RESULT+1
4176 6E4A42   196  	ROR	RESULT
4179 9013     197  	BCC	AC1
417B 18       198  	CLC
417C AD5042   199  	LDA	MAPV
417F 6D4C42   200  	ADC	OVERFL
4182 8D4C42   201  	STA	OVERFL
4185 AD5142   202  	LDA	MAPV+1
4188 6D4D42   203  	ADC	OVERFL+1
418B 8D4D42   204  	STA	OVERFL+1
              205  AC1
418E CA       206  	DEX
418F D0DC     207  	BNE	MULT16
              208  * NOW SCREEN ADDRESS IS ADDED
4191 18       209  	CLC
4192 A900     210  	LDA	#>SCREN
4194 6D4A42   211  	ADC	RESULT
4197 8D5642   212  	STA	BASE
419A A900     213  	LDA	#<SCREN
419C 6D4B42   214  	ADC	RESULT+1
419F 8D5742   215  	STA	BASE+1
              216  * NOW THE COLUMN OFFSET IS ADDED TO FORM THE NEW BASE ADDRESS
41A2 18       217  	CLC				;FOR THE TOP
41A3 AD5642   218  	LDA	BASE
41A6 6D4E42   219  	ADC	MAPH
41A9 8D5642   220  	STA	BASE
41AC AD5742   221  	LDA	BASE+1
41AF 6D4F42   222  	ADC	MAPH+1
41B2 8D5742   223  	STA	BASE+1
41B5 20BB41   224  	JSR	WRITEDL			;WRITE NEW DISPLAY LIST
              225  XVBI
41B8 4C62E4   226  	JMP	XITVBV
              227  *
              228  WRITEDL
              229  * SPOT POINTS TO THE FIRST ADDRESS IN THE DISPLAY LIST.
41BB A200     230  	LDX	#$00
              231  AD1
              232  * STORE NEW ADDRESS IN DISPLAY LIST
41BD AD5642   233  	LDA	BASE
41C0 9D0642   234  	STA	SPOT,X
41C3 AD5742   235  	LDA	BASE+1
41C6 9D0742   236  	STA	SPOT+1,X
              237  * ADD MAP WIDTH TO GET ADDRESS OF NEXT LINE
41C9 18       238  	CLC
41CA A900     239  	LDA	#>WIDTH
41CC 6D5642   240  	ADC	BASE
41CF 8D5642   241  	STA	BASE
41D2 A904     242  	LDA	#<WIDTH
41D4 6D5742   243  	ADC	BASE+1
41D7 8D5742   244  	STA	BASE+1
              245  * SET TO POINT TO NEXT SET OFF ADDRESSES IN DLIST
41DA E8       246  	INX
41DB E8       247  	INX
41DC E8       248  	INX
41DD E03C     249  	CPX	#60
41DF D0DC     250  	BNE	AD1
41E1 60       251  	RTS
              252  *
              253  HOFFS
41E2 000000   254  	DB	$00,$00,$00,$00,$00,$01,$01,$01
41EA 00FFFF   255  	DB	$00,$FF,$FF,$FF,$00,$00,$00,$00
              256  VOFFS
41F2 000000   257  	DB	$00,$00,$00,$00,$00,$01,$FF,$00
41FA 0001FF   258  	DB	$00,$01,$FF,$00,$00,$01,$FF,$00
              259  NDLIST
4202 707070   260  	DB	$70,$70,$70
4205 72       261  	DB	$72
              262  SPOT
4206 0000     263  	DB	$00,$00
4208 720000   264  	DB	$72,$00,$00
420B 720000   265  	DB	$72,$00,$00
420E 720000   266  	DB	$72,$00,$00
4211 720000   267  	DB	$72,$00,$00
4214 720000   268  	DB	$72,$00,$00
4217 720000   269  	DB	$72,$00,$00
421A 720000   270  	DB	$72,$00,$00
421D 720000   271  	DB	$72,$00,$00
4220 720000   272  	DB	$72,$00,$00
4223 720000   273  	DB	$72,$00,$00
4226 720000   274  	DB	$72,$00,$00
4229 720000   275  	DB	$72,$00,$00
422C 720000   276  	DB	$72,$00,$00
422F 720000   277  	DB	$72,$00,$00
4232 720000   278  	DB	$72,$00,$00
4235 720000   279  	DB	$72,$00,$00
4238 720000   280  	DB	$72,$00,$00
423B 720000   281  	DB	$72,$00,$00
423E 520000   282  	DB	$52,$00,$00
4241 42       283  	DB	$42
4242 609F     284  	DW	WINDOW
4244 020202   285  	DB	$02,$02,$02
4247 41       286  	DB	$41
4248 0242     287  	DW	NDLIST
424A 0000     288  RESULT	DS	2
424C 0000     289  OVERFL	DS	2
424E 0000     290  MAPH	DS	2
4250 0000     291  MAPV	DS	2
4252 0000     292  HOFF	DS	2
4254 0000     293  VOFF	DS	2
4256 0000     294  BASE	DS	2
4258 00       295  FINEH	DS	1
4259 00       296  FINEV	DS	1
425A 00       297  NEWFH	DS	1
425B 00       298  NEWFV	DS	1
425C 00       299  CHANGE	DS	1
425D 00       300  ENABLE	DS	1
