00010 *EIGHT WAY SCROLLING DAN PINAL 00015 *EQUATES 0230: 00020 SDLSTL EQ $230 0278: 00030 STICKO EQ $278 D402: 00040 DLISTL EQ $D402 D404: 00050 HSCROL EQ $D404 D405: 00060 VSCROL EQ $D405 E45C: 00070 SETVBV EQ $E45C E462: 00080 XITVBV EQ $E462 00090 * 0000: 00100 SCREEN EQ $0000 0400: 00110 WIDTH EQ $0400 0040: 00120 HEIGHT EQ $0040 0028: 00130 SCREENH EQ 40 0014: 00140 SCREENV EQ 20 9F60: 00150 WINDOW EQ $9C40+800 FOR A 40K OR 48K COMPUTER WITH CARTRIDGE 00160 * 00170 START 4000: A9 00 00180 LDA #$00 4002: 8D 5D 42 00190 STA ENABLE ; SET VBI FLAG TO OFF 00200 * INIT SCROLL VARIABLES TO STARTUP VALUES 4005: 8D 4E 42 00210 STA MAPH SET SCREEN COORD. TO 0 4008: 8D 4F 42 00220 STA MAPH+1 400B: 8D 50 42 00230 STA MAPV 400E: 8D 51 42 00240 STA MAPV+1 4011: 8D 59 42 00250 STA FINEV 4014: 8D 05 D4 00260 STA VSCROL 4017: A9 0C 00270 LDA #$OC 4019: 8D 58 42 00280 STA FINEH 401C: 8D 04 D4 00290 STA HSCROL 00300 INIT BASE ADDRESS TO SCREEN ADDRESS 401F: A9 00 00310 LDA #SCREEN 4021: 8D 56 42 00320 STA BASE 4024: A9 00 00330 LDA /SCREEN 4026: 8D 57 42 00340 STA BASE+1 4029: 20 BB 41 00350 JSR WRITEDL ; WRITE NEW DISPLAY LIST 00360 TELL ANTIC WHERE NEW DLIST IS 402C: A9 02 00370 LDA #NDLIST 402E: 8D 30 02 00380 STA SDLSTL 4031: A9 42 00390 LDA /NDLIST 4033: 8D 31 02 00400 STA SDLSTL+1 00410 SETUP VBLANK 4036: A9 07 00420 LDA #$07 DEFFERED VBI 4038: A0 45 00430 LDY #VBI 403A: A2 40 00440 LDX /VBI 403C: 20 5C E4 00450 JSR SETVBV 403F: A9 01 00460 LDA #$O1 4041: 8D 5D 42 00470 STA ENABLE TURN VBLANK FLAG TO ON 4044: 60 00480 RTS BACK TO YOUR MONITOR 00490 00500 VBI 4045: D8 00510 CLD JUST A PRECAUTION 4046: AD 5D 42 00520 LDA ENABLE CHECK THE SOFTWARE FLAG 4049: D0 03 00530 BNE CKSTK OK 404B: 4C B8 41 00540 JMP XVBI LEAVE VBI 00550 CKSTK 00560 ; COPY OLD MAP VARIABLES IN CASE NEW VALUES ARE INVALID 404E: AD 58 42 00570 LDA FINEH 4051: 8D 5A 42 00580 STA NEWFH 4054: AD 59 42 00590 LDA FINEV 4057: 8D 5B 42 00600 STA NEWFV 405A: A9 00 00610 LDA #$00 405C: 8D 5C 42 00620 STA CHANGE ; SET CHANGE FLAG TO 0 00630 * USE JOYSTICK VALUE TO INDEX INTO TABLE OF +1,0, OR -1 405F: AE 78 02 00640 LDX STICKO 4062: BD E2 41 00650 LDA HOFFS,X 4065: 8D 52 42 00660 STA HOFF 4068: BD F2 41 00670 LDA VOFFS,X 406B: 8D 54 42 00680 STA VOFF 00690 CHECKH 406E: AD 52 42 00700 LDA HOFF 4071: F0 6C 00710 BEQ CHECKV IF 0 NO CHANCE LEAVE 00720 ADD OFFSET TO FINEH 4073: 18 00730 CLC 4074: AD 5A 42 00740 LDA NEWFH 4077: 6D 52 42 00750 ADC HOFF 407A: 8D 5A 42 00760 STA NEWFH 407D: C9 10 00770 CMP 010 TIME TO CRUDE SCROLL? 407F: F0 0D 00780 BEQ RSHIFT 4081: C9 0B 00790 CMP #$OR TIME TO CRUDE SCROLL? 4083: F0 30 00800 BEQ LSHIFT 4085: 8D 58 42 00810 STA FINEH 4088: 8D 04 D4 00820 STA HSCROL 408B: 4C DF 40 00830 JMP CHECKV GO CHECK VERTICAL 00840 RSHIFT 408E: AD 4E 42 00850 LDA MAPH CHECK IF HORIZONTAL ALREADY AT 0? 4091: 0D 4F 42 00860 ORA MAPH+1 4094: F0 49 00870 BEQ CHECKV CAN'T GO LESS THAN 0 4096: 38 00880 SEC 4097: AD 4E 42 00890 LDA MAPH 409A: E9 01 00900 SBC #$O1 409C: 8D 4E 42 00910 STA MAPH 409F: AD 4F 42 00920 LDA MAPH+1 40A2: E9 00 00930 SBC #$00 40A4: 8D 4F 42 00940 STA MAPH+1 40A7: A9 0C 00950 LDA #$OC 40A9: 8D 58 42 00960 STA FINEH 40AC: 8D 04 D4 00970 STA HSCROL 40AF: EE 5C 42 00980 INC CHANGE SET FLAG TO WRITE NEW DISPLAY LIST 40B2: 4C DF 40 00990 JMP CHECKV 01000 LSHIFT 01010 ; FIRST CHECK IF ALREADY AT LIMIT 40B5: AD 4E 42 01020 LDA MAPH 40B8: C9 D8 01030 CMP #WIDTH-SCREENH 40BA: D0 07 01040 BNE .1 40BC: AD 4F 42 01050 LDA MAPH+1 40BF: C9 03 01060 CMP /WIDTH-SCREENH 40C1: F0 1C 01070 BEQ CHECKV 01080 .1 01090 * CHANGE MAPH & SET FINE SCROLL 40C3: 18 01100 CLC 40C4: AD 4E 42 01110 LDA MAPH 40C7: 69 01 01120 ADC #$O1 40C9: 8D 4E 42 01130 STA MAPH 40CC: AD 4F 42 01140 LDA MAPH+1 40CF: 69 00 01150 ADC #$00 40D1: 8D 4F 42 01160 STA MAPH+1 40D4: A9 0F 01170 LDA #$OF 40D6: 8D 58 42 01180 STA FINEH 40D9: 8D 04 D4 01190 STA HSCROL 40DC: EE 5C 42 01200 INC CHANGE SET FLAG FOR CKLIST 01210 CHECKV 01220 * VERTICAL WORKS SAME AS HORIZONTAL 40DF: AD 54 42 01230 LDA VOFF 40E2: F0 6F 01240 BEQ CKLIST ; LEAVE IF No CHANGES TO MAKE 01250 * ADD OFFSET TO FINE SCROLL VALUE 40E4: 18 01260 CLC 40E5: 6D 5B 42 01270 ADC NEWFV 40E8: 8D 5B 42 01280 STA NEWFV 01290 * CHECK TO SEE IF IT'S TIME TO CRUDE SCROLL 40EB: C9 08 01300 CMP #$08 40ED: F0 0D 01310 BEQ DSHIFT 40EF: C9 FF 01320 CMP #$FF 40F1: F0 39 01330 BEQ USHIFT 40F3: 8D 59 42 01340 STA FINEV 40F6: 8D 05 D4 01350 STA VSCROL 40F9: 4C 53 41 01360 JMP CKLIST 01370 DSHIFT 01380 * CHECK TO SEE IF MAP IS AT LIMIT 40FC: AD 50 42 01390 LDA MAPV 40FF: C9 2C 01400 CMP #HEIGHT-SCREENV 4101: D0 07 01410 BNE .1 4103: AD 51 42 01420 LDA MAPV+1 4106: C9 00 01430 CMP /HEIGHT-SCREENV 4108: F0 49 01440 BEQ CKLIST 01450 .1 01460 * SET MAP VERT. OFFSET & RESET FINE SCROLL VALUE 410A: 18 01470 CLC 410B: AD 50 42 01480 LDA MAPV 410E: 69 01 01490 ADC #$O1 4110: 8D 50 42 01500 STA MAPV 4113: AD 51 42 01510 LDA MAPV+1 4116: 69 00 01520 ADC #$00 4118: 8D 51 42 01530 STA MAPV+1 411B: AD 5B 42 01540 LDA NEWFV 411E: 29 07 01550 AND #$07 4120: 8D 59 42 01560 STA FINEV 4123: 8D 05 D4 01570 STA VSCROL 4126: EE 5C 42 01580 INC CHANGE 4129: 4C 53 41 01590 JMP CKLIST 01600 USHIFT 01610 CHECK FOR MAP AT LIMIT 412C: AD 50 42 01620 LDA RAPV 412F: 0D 51 42 01630 ORA MAPV+1 4132: F0 1F 01640 BEQ CKLIST 4134: 38 01650 SEC 4135: AD 50 42 01660 LDA MAPV 4138: E9 01 01670 SBC #$O1 413A: 8D 50 42 01680 STA MAPV 413D: AD 51 42 01690 LDA MAPV+1 4140: E9 00 01700 SBC #$00 4142: 8D 51 42 01710 STA MAPV+1 4145: AD 5B 42 01720 LDA NEWFV 4148: 29 07 01730 AND #$07 414A: 8D 59 42 01740 STA FINEV 414D: 8D 05 D4 01750 STA VSCROL 4150: EE 5C 42 01760 INC CHANGE 01770 CKLIST 4153: AD 5C 42 01780 LDA CHANGE; CHECK IF MAP HORIZONTAL OR VERTICAL HAS BEEN CHANGE 4156: F0 60 01790 BEQ XVBI ; NO NEED TO REWRITE DISPLAY LIST IF NO CHANGE 01800 SET UP TO MULTIPLY WIDTH X MAP VERTICAL OFFSET 4158: A9 00 01810 LDA #WIDTH 415A: 8D 4A 42 01820 STA RESULT 415D: A9 04 01830 LDA /WIDTH 415F: 8D 4B 42 01840 STA RESULT+1 4162: A9 00 01850 LDA #$00 OVERFLOW SHOULD NOT BE NEEDED BUT ITS HERE ANYWAY 4164: 8D 4C 42 01860 STA OVERFL 4167: 8D 4D 42 01870 STA OVERFL+1 416A: A2 11 01880 LDX #$11 416C: 18 01890 CLC 01900 * THIS IS A 16 BIT MULTIPLY TO CALCULATE OFFSET FROM STARTING MA 01910 MULT16 416D: 6E 4D 42 01920 ROR OVERFL+1 4170: 6E 4C 42 01930 ROR OVERFL 4173: 6E 4B 42 01940 ROR RESULT+1 4176: 6E 4A 42 01950 ROR RESULT 4179: 90 13 01960 BCC .1 417B: 18 01970 CLC 417C: AD 50 42 01980 LDA MAPV 417F: 6D 4C 42 01990 ADC OVERFL 4182: 8D 4C 42 02000 STA OVERFL 4185: AD 51 42 02010 LDA MAPV+1 4188: 6D 4D 42 02020 ADC OVERFL+1 418B: 8D 4D 42 02030 STA OVERFL+1 02040 .1 418E: CA 02050 DEX 418F: D0 DC 02060 BNE MULT16 02070 * NOW SCREEN ADDRESS IS ADDED 4191: 18 02080 CLC 4192: A9 00 02090 IDA #SCREEN 4194: 6D 4A 42 02100 ADC RESULT 4197: 8D 56 42 02110 STA BASE 419A: A9 00 02120 LDA /SCREEN 419C: 6D 4B 42 02130 ADC RESULT+1 419F: 8D 57 42 02140 STA BASE+1 02150 NOW THE COLUMN OFFSET IS ADDED TO FORM THE NEW BASE ADDRESS 41A2: 18 02160 CLC FOR THE TOP 41A3: AD 56 42 02170 LDA BASE 41A6: 6D 4E 42 02180 ADC MAPH 41A9: 8D 56 42 02190 STA BASE 41AC: AD 57 42 02200 LDA BASE+1 41AF: 6D 4F 42 02210 ADC MAPH+1 41B2: 8D 57 42 02220 STA BASE+1 02230 41B5: 20 BB 41 02240 JSR WRITEDL WRITE NEW DISPLAY LIST 02250 XVBI 41B8: 4C 62 E4 02260 JMP XITVBV 02270 * 02280 WRITEDL 02290 * SPOT POINTS TO THE FIRST ADDRESS IN THE DISPLAY LIST. 41BB: A2 00 02300 LDX #$00 02310 .1 02320 * STORE NEW ADDRESS IN DISPLAY LIST 41BD: AD 56 42 02330 LDA BASE 41C0: 9D 06 42 02340 STA SPOT,X 41C3: AD 57 42 02350 LDA BASE+1 41C6: 9D 07 42 02360 STA SPOT+1,X 02370 ADD MAP WIDTH TO GET ADDRESS OF NEXT LINE 41C9: 18 02380 CLC 41CA: A9 00 02390 LDA #WIDTH 41CC: 6D 56 42 02400 ADC BASE 41CF: 8D 56 42 02410 STA BASE 41D2: A9 04 02420 LDA /WIDTH 41D4: 6D 57 42 02430 ADC BASE+1 41D7: 8D 57 42 02440 STA BASF,+1 02450 SET TO POINT TO NEXT SET OFF ADDRESSES IN DLIST 41DA: E8 02460 INX 41DB: E8 02470 INX 41DC: E8 02480 INX 41DD: E0 3C 02490 CPX #60 41DF: D0 DC 02500 BNE .1 41E1: 60 02510 RTS 02520 * 02530 HOFFS 41E2: 00 00 00 41E5: 00 00 01 41E8: 01 01 02540 HS 0000000000010101 41EA: 00 FF FF 41ED: FF 00 00 41F0: 00 00 02550 HS OOFFFFFFOOOOOOOO 02560 VOFFS 41F2: 00 00 00 41F5: 00 00 01 41F8: FF 00 02570 HS 000000000OO1FFOO 41FA: 00 01 FF 41FD: 00 00 01 4200: FF 00 02580 HS OOO1FFOOOOO1FFO0 02590 NDLIST 4202: 70 70 70 02600 HS 707070 4205: 72 02610 HS 72 02620 SPOT 4206: 00 00 02630 HS 0000 4208: 72 00 00 02640 HS 720000 420B: 72 00 00 02650 HS 720000 420E: 72 00 00 02660 HS 720000 4211: 72 00 00 02670 HS 720000 4214: 72 00 00 02680 HS 720000 4217: 72 00 00 02690 HS 720000 421A: 72 00 00 02700 HS 720000 421D: 72 00 00 02710 HS 720000 4220: 72 00 00 02720 HS 720000 4223: 72 00 00 02730 HS 720000 4226: 72 00 00 02740 HS 720000 4229: 72 00 00 02750 HS 720000 422C: 72 00 00 02760 HS 720000 422F: 72 00 00 02770 HS 720000 4232: 72 00 00 02780 HS 72MOO 4235: 72 00 00 02790 HS 720000 4238: 72 00 00 02800 HS 720000 423B: 72 00 00 02810 HS 720000 423E: 52 00 00 02820 HS 520000 4241: 42 02830 HS 42 4242: 60 9F 02840 DA WINDOW 4244: 02 02 02 02850 HS 020202 4247: 41 02860 HS 41 4248: 02 42 02870 DA NDLIST 02880 424A: 00 00 02890 RESULT BS 2 424C: 00 00 02900 OVERFL BS 2 424E: 00 00 02910 MAPH BS 2 4250: 00 00 02920 MAPV BS 2 4252: 00 00 02930 HOFF BS 2 4254: 00 00 02940 VOFF BS 2 4256: 00 00 02950 BASE BS 2 4258: 00 02960 FINEH BS 1 4259: 00 02970 FINEV BS I 425A: 00 02980 NEWFR BS I 425B: 00 02990 NEWFV BS I 425C: 00 03000 CHANGE BS 1 425D: 00 03010 ENABLE BS 1