!!!Player Missile in Turbo Basic !!General Information Author: Peter J. Meyer \\ Language: TURBO-BASIC \\ Compiler/Interpreter: Turbo Basic 1.5 \\ Published: Oct 2007 in AtariAge \\ Peter writes: I had this routine for years that can drive the player missile graphics in Turbo Basic XL. It works in single line mode and works with 5 players. 5th being the combination of 4 missiles. It loads the routine to $B000 (45056), but it can be moved, transfered to a string, or whatever for your purposes. The ML routine uses the Memtop (106, $6A) to match the PMBASE so you can put the player/missile into an area that does not interfere with your program or the background graphics. The ML routine saves the vertical position and size of the last player transfer just under the Missile memory area so it can be quickly erased when the next move is made. The ML routine is based upon something that was posted in Compute! magazine in the early 80s'. I added support for adding a 5th player and changed the way it erases the old sprite before drawing a new one. Also only supports one line resolution that I commonly use for programs. The subroutine call usage is: Z= USR (PMMOVE, Player Number , Source Memory Address, Memory Size, Horizontal Position, Vertical Position ) Player Number can be 1 to 5 ! MAC65 Assembler Code of PMMOVE.OBJ {{{ 1000 RAMHIGH = $6A 1010 PMYPOS = $D0 1020 PMBASE = $D1 1030 PMSAVELO = $02 1040 PMSAVEHI = $03 1050 PMNUMBER = $CD 1060 FROMLO = $CE 1070 FROMHI = $CF 1080 *= $B000 1090 ; 1100 PLA 1110 CMP #$05 1120 BEQ RIGHT_AMOUNT 1130 TAY 1140 CLEANSTACK 1150 PLA 1160 PLA 1170 DEY 1180 BPL CLEANSTACK 1190 RTS 1200 RIGHT_AMOUNT 1210 PLA 1220 PLA 1230 CLC 1240 ADC #$03 1250 CMP #$08 1260 BCC NOCOMBO 1270 LDA #$03 1280 NOCOMBO 1290 TAY 1300 STA PMNUMBER 1310 CLC 1320 ADC $6A 1330 STA PMBASE 1340 PLA 1350 STA FROMHI 1360 PLA 1370 STA FROMLO 1380 TYA 1400 ASL A 1410 CLC 1420 ADC #$EC 1430 STA PMSAVELO 1440 LDA $6A 1450 CLC 1460 ADC #$02 1470 STA PMSAVEHI 1480 LDY #$00 1490 LDA (PMSAVELO),Y 1500 STA PMYPOS 1510 INY 1520 LDA (PMSAVELO),Y 1530 TAY 1540 LDA #$00 1550 CLEARLOOP 1560 STA (PMYPOS),Y 1570 DEY 1580 BPL CLEARLOOP 1590 PLA 1600 PLA 1610 LDY #$01 1620 STA (PMSAVELO),Y 1630 PLA 1640 PLA 1650 LDX PMNUMBER 1660 CPX #$04 1670 BCS COMBOSKIP 1680 LDX #$08 1690 CLC 1700 ADC #$08 1710 STA $CFFC,X 1720 SEC 1730 SBC #$02 1740 INX 1750 STA $CFFC,X 1760 SBC #$02 1770 INX 1780 STA $CFFC,X 1790 SBC #$02 1800 INX 1810 COMBOSKIP 1820 STA $CFFC,X 1830 PLA 1840 PLA 1850 STA PMYPOS 1860 LDY #$00 1870 STA (PMSAVELO),Y 1880 INY 1890 LDA (PMSAVELO),Y 1900 TAY 1910 DEY 1920 DRAWLOOP 1930 LDA (FROMLO),Y 1940 STA (PMYPOS),Y 1950 DEY 1960 BPL DRAWLOOP 1970 RTS 1980 ; 1990 ; 2000 ; 2010 PLA 2020 CMP #$02 2030 BEQ DOCLEAR 2040 TAY 2050 PGCLRSTK 2060 PLA 2070 PLA 2080 DEY 2090 BPL PGCLRSTK 2100 RTS 2110 DOCLEAR 2120 PAGEBASE = $D0 2130 PAGEBSHI = $D1 2140 PAGES = $CF 2150 PLA 2160 STA PAGEBSHI 2170 PLA 2180 STA PAGEBASE 2190 PLA 2200 PLA 2210 TAX 2220 NEXTPAGE 2230 LDY #$00 2240 TYA 2250 PGCLRLOOP 2260 STA (PAGEBASE),Y 2270 DEY 2280 BNE PGCLRLOOP 2290 INC PAGEBSHI 2300 DEX 2310 BNE PGCLRLOOP 2320 RTS }}} ! Turbo Basic Demo {{{ 5 DIM X(5),Y(5),DX(5),DY(5) 10 EXEC INIT 20 FOR N=1 TO 5 30 X(N)=60+INT(RND*120):Y(N)=60+INT(RND*120):DX(N)=-1+INT(RND*2)*2:DY(N)=-1+INT(RND*2)*2 40 NEXT N 50 DO 60 FOR N=1 TO 5 70 Z=USR(PMMOVE,N,PMBASE,8,X(N),Y(N)) 80 X(N)=X(N)+DX(N):IF X(N)<49 OR X(N)>199 THEN DX(N)=-DX(N) 90 Y(N)=Y(N)+DY(N):IF Y(N)<33 OR Y(N)>215 THEN DY(N)=-DY(N) 100 NEXT N 110 LOOP 8000 ------------------------------ 8010 PROC INIT 8020 PMPAGE=184:POKE 106,PMPAGE:GRAPHICS 0:POKE 54279,PMPAGE:POKE 710,0:POKE 712,52 8030 BLOAD "D:PMMOVE.OBJ" 8040 PMBASE=PMPAGE*256 8050 POKE 559,62:POKE 623,17:POKE 704,68:POKE 705,24:POKE 706,136:POKE 707,212:POKE 711,170:POKE 53277,3 8060 PMMOVE=45056 8070 POKE PMBASE,0 8080 MOVE PMBASE,PMBASE+1,2047 8090 FOR N=PMBASE TO PMBASE+7 8100 READ A:POKE N,A 8110 NEXT N 8120 ENDPROC 8130 DATA 60,126,231,195,195,231,126,60 }}}