10 ;  ÁÎÉÍÁÔÅ ›20 ;›30 ; COPYRIGHT (C) 1982 BY DAVID FOX AND MITCHELL WAITE›40 ;›0100 .TITLE "CLK-ANIMATE.ASM;v01.05-810714,820619"›0110 .PAGE "Interrupt-driven Player Animater"›0120 ;›0130 ; BY COREY L. KOSAK›0140 ;›0150 ; B=$4000,FREL›0160 ;›0170 BASE=$4000›0180 ;›0190 *=$400›0200 ;›0210 ;CASBUF DATABASE EQUATES›0220 ;›0230 PMBAS *=*+1 ;HIBYTE OF PLAYER MISSILE AREA (LOBYTE EQUALS 0)›0240 PMBUF *=*+2 ;ADDRESS OF 128 BYTE BUFFER (FOR PMOVER)›0250 ANIMINIT *=*+1 ;INIT LOCATION FOR ANIMATE›0260 AUTOINIT *=*+1 ;INIT LOCATION FOR AUTOMOVE›0270 SCRLINIT *=*+1 ;INIT LOCATION FOR SCROLLER›0280 HPLR *=*+4 ;PLAYERS 0-3 X COORDINATE (FOR PMOVER)›0290 VPLR *=*+4 ;PLRS 0-3 Y COORD (FOR PMOVER)›0300 RATE *=*+4 ;PLRS 0-3 RATE (FOR ANIMATE)›0310 FLSTPTR *=*+8 ;PLRS 0-3 FRAME LIST POINTERS (FOR ANIMATE)›0320 SCRLADR *=*+2 ;SCREEN ADDRESS (FOR SCROLL)›0330 SCRLLEN *=*+2 ;LINE LENGTH OF SCROLLED AREA (FOR SCROLL)›0340 SCRLCLK *=*+1 ;COLOR CLOCKS IN SCREEN BYTE (FOR SCROLL)›0350 SCRLSTEP *=*+1 ;SCROLL STEP (FOR SCROLL)›0360 MOVERATE *=*+4 ;PLRS 0-3 HORIZONTAL STEP (FOR AUTOMOVE)›0370 DLIADR *=*+2 ;ADDRESS OF COLOR TABLE›0380 ;›0390 ;*LOCAL* DATABASE EQUATES›0400 ; THESE LOCATIONS ARE *LOCAL* TO THE ROUTINES›0410 ; AND SHOULD *NOT* BE MODIFIED BY THE HOST PROGRAM›0420 ;›0430 O0X *=*+4 ;PLRS 0-3 X COORDINATE›0440 O0Y *=*+4 ;PLRS 0-3 Y COORD›0450 ORATE0 *=*+4 ;PLRS 0-3 FRAME CHANGE RATE›0460 OADR0 *=*+8 ;PLRS 0-3 FRAME LIST ADDRESS›0470 TIMR0 *=*+4 ;PLRS 0-3 COUNTDOWN TIMERS (HOW MANY JIFFIES UNTIL FRAME CHANGE)›0480 POS0 *=*+4 ;PLRS 0-3 FRAME LIST POSITION›0490 OSADR *=*+2 ;SCREEN ADDRESS FOR SCROLLER›0500 CPOS *=*+2 ;COARSE SCROLL POSITION FOR SCROLLER (0-LINELEN)›0510 FPOS *=*+1 ;FINE SCROLL POSITION (0-7)›0520 OXSTEP0 *=*+4 ;PLRS 0-3 HORIZONTAL STEP›0530 DLIPOS *=*+1 ;CURRENT POSITION IN COLOR TABLE›0540 PM1 *=*+1 ;4 LOCATIONS RESERVED FOR PMOVER›0550 PM2 *=*+1›0560 PM3 *=*+1›0570 PM4 *=*+1›0580 EX1 *=*+1 ;4 LOCATIONS RESERVED FOR ANIMATE, AUTOMOVE, SCROLL, AND MFILL›0590 EX2 *=*+1›0600 EX3 *=*+1›0610 EX4 *=*+1›0620 PMSAVE *=*+5 ;ZERO PAGE SAVE AREA FOR PMOVER›0630 ZSAVE *=*+4 ;ZERO PAGE SAVE AREA FOR ALL OTHER ROUTINES›0640 ;›0650 HPOSP0=$D000›0660 XITVBV=$E462›0670 ;›0680 ZERO=$E0›0690 ONE=$E2›0700 ;›0710 *=BASE›0720 ;›0730 START›0740 CLV›0750 BVC START1 ;SKIP OVER VBLANK EXIT ROUTINE.›0760 ;›0770 EXIT›0780 JMP XITVBV›0790 ;›0800 START1›0810 CLD ;CLEAR DEC MODE FOR ATARI BASIC!›0820 LDX #$03 ;SAVE ZERO PAGE TEMPS›0830 LOOP4›0840 LDA ZERO,X›0850 STA ZSAVE,X›0860 DEX›0870 BPL LOOP4›0880 ;›0890 LDA ANIMINIT ;READ INIT BYTE›0900 BEQ EXIT ;IF IT'S ZERO, LEAVE.›0910 BMI DOIT ;IF > 127, OPERATE NORMALLY›0920 ;›0930 ASL A ;GET '+16' BIT INTO '+128' BIT›0940 ASL A›0950 ASL A›0960 STA EX1›0970 ;›0980 LDX #$00 ;X=CURRENT PLAYER #›0990 ;›1000 LOOP›1010 LSR ANIMINIT ;PLAYER BIT SET?›1020 BCS MOVE ;YES, INITIALIZE PLAYER›1030 BCC NEXT ;SKIP OVER BUCKET-BRIGADE›1040 ;›1050 BBEXIT›1060 BEQ EXIT›1070 ;›1080 NEXT›1090 INX ;NEXT PLAYER›1100 CPX #$04 ;DONE?›1110 BNE LOOP ;NO, LOOP›1120 LDA #$80 ;SET INIT BYTE TO›1130 STA ANIMINIT ;"ON"›1140 ;›1150 BNE DOIT ;UNCONDITIONAL BRANCH TO DOIT›1160 ;›1170 MOVE›1180 LDA RATE,X ;DOES RATE=0?›1190 BNE STORE ;NO, STORE IT›1200 LDA #$FF ;YES, CHANGE IT TO $FF›1210 STORE›1220 STA ORATE0,X ;MOVE PARAMS INTO LOCAL AREA›1230 ;›1240 TXA ;MULTIPLY X BY 2›1250 ASL A›1260 TAY ;AND PUT INTO Y›1270 LDA FLSTPTR,Y ;MOVE ADR INTO LOCAL AREA›1280 STA OADR0,Y›1290 LDA FLSTPTR+1,Y›1300 STA OADR0+1,Y›1310 LDA EX1 ;WAS '+16' BIT SET?›1320 BMI NEXT ;YES, DON'T INITIALIZE FRAME #›1330 LDA RATE,X›1340 STA TIMR0,X›1350 LDA #$01›1360 STA POS0,X›1370 BNE NEXT ;UNCOND. BRANCH›1380 ;›1390 DOIT›1400 LDA #$00 ;'ZERO' POINTS TO CURRENT›1410 STA ZERO ;PLAYER›1420 LDA PMBAS›1430 STA ZERO+1›1440 ;›1450 LDX #$00 ;START WITH PLAYER #0›1460 LOOP2›1470 LDA ORATE0,X ;IS THIS A SPECIAL›1480 BEQ NEXT2›1490 CMP #$FF ;"RATE=0" PLAYER?›1500 BEQ CHANGE2 ;YES. FILL PLAYER.›1510 ;›1520 NOTZERO›1530 DEC TIMR0,X ;HAS TIME RUN OUT FOR THIS PLAYER?›1540 BEQ CHANGEIT ;YES, CHANGE FRAME›1550 ;›1560 NEXT2›1570 LDA ZERO ;POINT TO NEXT PLAYER›1580 EOR #$80›1590 STA ZERO›1600 BNE INC›1610 INC ZERO+1›1620 ;›1630 INC›1640 INX ;MOVE TO NEXT PLAYER›1650 CPX #$04 ;LAST PLAYER?›1660 BNE LOOP2 ;NO, LOOP›1670 ;›1680 LOOP5›1690 LDA ZSAVE-1,X ;RESTORE ZERO PAGE LOCS›1700 STA ZERO-1,X›1710 DEX›1720 BNE LOOP5›1730 BEQ BBEXIT ;UNCOND. BRANCH TO EXIT›1740 ;›1750 CHANGEIT›1760 LDA ORATE0,X ;RESET TIMER›1770 CMP #$FF›1780 BNE NOTSPECIAL›1790 CHANGE2›1800 LDA #$01›1810 NOTSPECIAL›1820 STA TIMR0,X›1830 TXA ;SET Y=X*2›1840 ASL A›1850 TAY›1860 LDA OADR0,Y ;MOVE PLR ADDRESS›1870 STA ONE ;INTO 'ONE'›1880 LDA OADR0+1,Y›1890 STA ONE+1›1900 ;›1910 INC POS0,X ;INCREMENT POSITION IN TABLE›1920 LDA POS0,X›1930 ZAPPO›1940 TAY›1950 LDA (ONE),Y ;GET FRAME #›1960 BNE OK ;IF IT'S NON-ZERO, JUMP T 'OK'›1970 LDA #$02 ;RESET FRAME POSITION›1980 STA POS0,X›1990 BNE ZAPPO ;UNCOND. BRANCH TO ZAPPO›2000 BBNEXT2›2010 BVC NEXT2 ;BUCKET-BRIGADE›2020 ;›2030 OK›2040 STA EX1 ;STORE FRAME # MINUS ONE.›2050 DEC EX1›2060 LDY #$00›2070 LDA (ONE),Y ;PUT ADDRESS OF›2080 PHA ;FRAME DATA›2090 INY ;INTO 'ONE'›2100 LDA (ONE),Y›2110 STA ONE+1 ;STORE IT›2120 PLA›2130 STA ONE›2140 DEY ;SET Y TO ZERO›2150 LDA (ONE),Y ;STORE FRAME HEIGHT›2160 STA EX2 ;FRAME HEIGHT›2170 ;›2180 ;PERFORM:›2190 ;FRAMENUMBER TIMES HEIGHT + FRAME ADDRESS + 1›2200 ;›2210 LDA #$00 ;THIS MULTIPLIES (FRAMENUMBER-1)*HEIGHT›2220 LDY #$08›2230 NEXTBIT›2240 LSR EX1 ;FRAMENUMBER›2250 BCC ALIGN›2260 CLC›2270 ADC EX2›2280 ;›2290 ALIGN›2300 LSR A›2310 ROR EX3›2320 DEY›2330 BNE NEXTBIT›2340 TAY ;HIBYTE OF RESULT INTO Y›2350 ;›2360 LDA EX3 ;LOBYTE OF RESULT IN A-REG›2370 SEC ;+ 1›2380 ADC ONE ;+ FRAME ADDRESS›2390 STA ONE›2400 TYA ;NOW ADD THE HIBYTES›2410 ADC ONE+1›2420 STA ONE+1›2430 STX EX1 ;SAVE X›2440 LDA O0Y,X ;GET PLAYER Y COORD›2450 TAY ;PUT IN Y-REG›2460 LDX #$00›2470 ;›2480 LOOP3›2490 STY EX3 ;SAVE Y›2500 TXA ;MOVE X INTO Y›2510 TAY›2520 LDA (ONE),Y ;MOVE FRAME INTO PLAYER›2530 LDY EX3 ;RESTORE Y›2540 STA (ZERO),Y›2550 INY›2560 INX›2570 CPX EX2 ;HAVE WE COPIED ALL BYTES?›2580 BNE LOOP3 ;NO, LOOP›2590 ;›2600 LDX EX1 ;RESTORE X›2610 LDA ORATE0,X›2620 CMP #$FF ;IS RATE=$FF?›2630 BNE NOTFF›2640 INC ORATE0,X ;YES, SET RATE=0›2650 NOTFF›2660 CLV›2670 BVC BBNEXT2›2680 ;›2690 .END›