10 ;  ÐÍÏÖÅÒ ›20 ;›30 ; COPYRIGHT (C) 1982 BY DAVID FOX AND MITCHELL WAITE›40 ;›0100 .TITLE "CLK-PMOVER.ASM;v02.10-810713,820620"›0110 .PAGE "Player Mover Routine"›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 ABASIC=1 ;1=ATARI BASIC, 0=MBASIC›0680 ;›0690 ZERO=$E0›0700 ONE=$E4›0710 ARG=$E3›0720 TEMP=$E2›0730 ;›0740 *=BASE›0750 ;›0760 START›0770 CLV›0780 BVC START1 ;SKIP OVER VBLNK EXIT ROUTINE›0790 ;›0800 EXIT›0810 JMP XITVBV ;RETURN FROM INTERRUPT›0820 ;›0830 VBINT›0840 LDX #$03 ;MOVE PLAYER X COORDINATES›0850 LOOP4›0860 LDA O0X,X ;INTO›0870 STA HPOSP0,X ;HARDWARE REGISTERS›0880 DEX›0890 BPL LOOP4›0900 BMI EXIT ;LEAVE.›0910 ;›0920 START1›0930 .IF 1-ABASIC @NOSAVE›0940 LDX #$06 ;SAVE ZERO PAGE LOCATIONS (NOT NECESSARY FOR MBASIC)›0950 LOOP6›0960 LDA ZERO-1,X›0970 STA PMSAVE-1,X›0980 DEX›0990 BNE LOOP6›1000 PLA ;NUMBER OF PARAMS (MUST BE 1)›1010 PLA ;HI BYTE - DISCARD›1020 PLA ;LO BYTE›1030 STA ARG ;PUT IN 'ARG'›1040 NOSAVE›1050 ;›1060 LDA ARG›1070 STA TEMP›1080 LDY AUTOINIT ;SAVE OLD PARAMETER›1090 LDX #$00›1100 STX AUTOINIT ;DISABLE AUTOMOVE SO PLAYERS AREN'T MOVED OUT OF SYNC›1110 LOOP7 LSR TEMP›1120 BCC NOMOVE›1130 LDA HPLR,X›1140 STA O0X,X›1150 NOMOVE›1160 INX›1170 CPX #$04›1180 BNE LOOP7›1190 STY AUTOINIT ;RE-ENABLE AUTOMOVE›1200 ;›1210 LDX #$00›1220 STX ZERO ;'ZERO' IS A POINTER TO›1230 LDA PMBAS ;PLAYER 0›1240 STA ZERO+1›1250 LDA PMBUF ;'ONE' IS A POINTER›1260 STA ONE ;TO HOST PROGRAM'S›1270 LDA PMBUF+1 ;TEMPORARY BUFFER›1280 STA ONE+1›1290 ;›1300 ; HERE WE DISABLE ANIMATE SO IT DOESN'T DO BIZARRE›1310 ; THINGS TO OUR PLAYERS WHILE WE'RE MOVING THEM›1320 ;›1330 LDA ANIMINIT ;REMEMBER ANIMATE'S STATUS›1340 STA TEMP ;STORE IN TEMP›1350 STX ANIMINIT ;TELL ANIMATE TO HALT (X STILL EQUALS 0)›1360 ;›1370 LOOP›1380 LSR ARG ;GET NEXT PLAYER'S BIT INTO CARRY›1390 BCS DOIT ;IF IT'S A ONE, MOVE PLAYER›1400 NEXT›1410 LDA ZERO ;ADD $80 TO 'ZERO' TO›1420 EOR #$80 ;MOVE TO NEXT PLAYER›1430 STA ZERO›1440 BNE INC›1450 INC ZERO+1›1460 INC›1470 INX ;INCREMENT PLAYER NUMBER›1480 CPX #$04 ;DONE WITH ALL 4 PLAYERS?›1490 BNE LOOP ;NO, LOOP›1500 LDA TEMP ;RESTORE ANIMINIT BYTE TO›1510 STA ANIMINIT ;WHAT IT WAS ORIGINALLY›1520 INX ;SET X TO 5›1530 LOOP5›1540 .IF 1-ABASIC @NOREST›1550 LDA PMSAVE,X ;RESTORE ZERO PAGE TEMPORARIES›1560 STA ZERO,X›1570 DEX›1580 BPL LOOP5›1590 NOREST›1600 RTS ;BACK TO BASIC›1610 ;›1620 DOIT›1630 LDY #$7F ;MOVE PLAYER INTO TEMPORARY BUFFER›1640 LOOP2›1650 LDA (ZERO),Y›1660 STA (ONE),Y›1670 DEY ;NEXT BYTE. ARE WE DONE?›1680 BPL LOOP2 ;NO, LOOP.›1690 STX PM1 ;SAVE X-REG›1700 LDA O0Y,X ;THIS GNARLED MESS OF CODE ENDS UP WITH›1710 PHA ;THE "DESTINATION" COORDINATE IN THE›1720 LDA VPLR,X ;X-REG, THE "SOURCE" Y COORDINATE IN›1730 STA O0Y,X ;THE Y-REG, AND MOVES THE DESTINATION›1740 TAY ;Y COORDINATE INTO THE SOURCE Y›1750 PLA ;COORDINATE LOCATION›1760 TAX›1770 STX PM2›1780 LOOP3›1790 STY PM3 ;SAVE Y-REG›1800 TXA ;TRANSFER X-REG TO Y-REG›1810 TAY›1820 LDA (ONE),Y ;GET DATA BACK FROM BUFFER›1830 LDY PM3 ;RESTORE Y-REG›1840 STA (ZERO),Y ;STORE DATA IN PLAYER IN NEW SPOT›1850 INY ;NEXT BYTE›1860 BPL OK ;DID THE Y-REG HIT $80?›1870 LDY #$00 ;SET IT BACK TO 0.›1880 OK›1890 INX›1900 BPL OK2 ;DID THE X-REG HIT $80?›1910 LDX #$00 ;SET IT BACK TO 0›1920 OK2›1930 CPX PM2 ;HAVE WE COPIED ALL 128 BYTES?›1940 BNE LOOP3 ;NO, COPY MORE›1950 LDX PM1 ;RESTORE X-REG›1960 CLV ;BRANCH BACK TO 'NEXT' TO›1970 BVC NEXT ;MOVE ANOTHER PLAYER›1980 ;›1990 .END›