
PROGRAM LISTING: 83-12/AUTOPM.ASM
00010 ;******************************
00020 ; VBI PLAYER MOVER 1.0
00030 ; BY F.PINHO 7/83
00040 ; ASSEMBLE WITH ASM/ED
00050 ; HALF-SPEED ROUTINE
00060 ; NOP'S IN CODE CHANGED BY
00070 ; BASIC FOR NORMAL SPEED
00080 ;******************************
00090 *= $600 ;RELOCATABLE
00100 STICK0 = $0278
00110 STICK1 = $0279
00120 XITVBV = $E462
00130 HPOSP0 = $D000
00140 HPOSP1 = $D001
00150 PB1 = 203
00160 PB2 = 204
00170 STPLL = 205
00180 STPLH = 206
00190 VPSP0 = 1000
00200 VPSP1 = 1001
00210 STPL0L = 1002
00220 STPL1L = 1003
00230 STPL0H = 1004
00240 STPL1H = 1005
00250 UPL0 = 1006
00260 UPL1 = 1007
00270 LL0 = 1008
00280 LL1 = 1009
00290 LFL0 = 1010
00300 LFL1 = 1011
00310 HPOST0 = 1012
00320 HPOST1 = 1013
00330 RTL0 = 1014
00340 RTL1 = 1015
00350 LDX #0 ;PLAYER NUMBER
00360 B0 LDA STICK0,X;READ JOYSTICK
00370 AND #1 ;CHECK FIRST BIT
00380 BNE B1 ;IF BIT SET,KEEP CHECKING
00390 BEQ UP ;BIT CLEAR,GOTO UP
00400 B1 LDA STICK0,X;READ STICK
00410 AND #2 ;SECOND BIT
00420 BNE B2 ;BIT SET?
00430 BEQ DOWN ;CLEAR.GO DOWN
00440 B2 LDA STICK0,X
00450 AND #4 ;THIRD BIT
00460 BNE B3 ;BIT SET?
00470 BEQ LFTI ;CLEAR. GO LEFT
00480 B3 LDA STICK0,X
00490 AND #8 ;FOURTH BIT
00500 BNE STICK ;IF BIT SET,GO ON
00510 BEQ RIGHTI ;CLEAR.GO RIGHT
00520 STICK INX ;NEXT PLAYER
00530 CPX #2 ;ALL DONE?
00540 BEQ EXIT ;YES.EXIT VBI
00550 BNE B0 ;NO.REPEAT
00560 EXIT JMP XITVBV ;BACK TO ATARI VBI
00570 UP LDA VPSP0,X ;VERTICAL POSITION
00580 TAY ;HOLD IN Y
00590 DEY ;DOWN ONE
00600 NOP ;CHANGED BY BASIC
00610 TYA
00620 CMP UPL0,X ;TOO FAR?
00630 BCC B1 ;YES. GO BACK
00640 STA VPSP0,X ;NO.STORE NEW VERTICAL
00650 INY ;BACK TO OLD LOCATION
00660 NOP
00670 LDA STPL0L,X;PLAYER DATA ADDRESS LOW
00680 STA STPLL ;STORE IN WORKING LOCATION
00690 LDA STPL0H,X;ADDRESS HIGH
00700 STA STPLH
00710 UPLP LDA (STPLL),Y;GET BYTE
00720 DEY ;DOWN ONE
00730 NOP
00740 STA (STPLL),Y;STORE AT NEW LOCATION
00750 INY ;GO BACK FOR NEXT BYTE
00760 INY
00770 NOP
00780 DEC PB1 ;DECREASE COUNTER
00790 BPL UPLP ;IF NOT DONE,DO IT AGAIN
00800 LDA PB2 ;RELOAD INITIAL COUNTER VALUE
00810 STA PB1 ;RESET COUNTER
00820 CLC ;FORCED BRANCH
00830 RETURN1 BCC B1
00840 RIGHTI BEQ RIGHT ;INTERMEDIATE BRANCH POINT.USED TO EXTEND RANGE
00850 RTN2I BCC B2 ;SAME
00860 B3I BCC B3 ;SAME
00870 LFTI BEQ LEFT ;SAME
00880 STKI BCC STICK ;SAME
00890 STICKI BCS STICK ;SAME
00900 DOWN LDA VPSP0,X ;OLD VERTICAL
00910 TAY ;HOLD IN Y
00920 INY ;UP ONE
00930 NOP
00940 TYA
00950 CMP LL0,X ;TOO FAR?
00960 BCS B2 ;YES. GO BACK
00970 STA VPSP0,X ;NO. STORE NEW VERTICAL
00980 DEC PB1 ;GO TO TOP OF IMAGE
00990 DEC PB1
01000 DEC PB1
01010 NOP
01020 NOP
01030 DLP INY
01040 DEC PB1
01050 BNE DLP ;DONE?
01060 LDA PB2 ;YES. RESET COUNTER
01070 STA PB1
01080 LDA STPL0L,X;PLAYER ADDRESS
01090 STA STPLL ;STORE IN WORKING LOCATION
01100 LDA STPL0H,X
01110 STA STPLH
01120 DWNLP LDA (STPLL),Y;GET TOP IMAGE BYTE
01130 INY ;UP ONE
01140 NOP
01150 STA (STPLL),Y;STORE AT NEW LOCATION
01160 DEY ;BACK FOR NEW BYTE
01170 DEY
01180 NOP
01190 DEC PB1 ;DECREMENT COUNTER
01200 BPL DWNLP ;IF NOT DONE,GO BACK
01210 LDA PB2 ;RESET COUNTER
01220 STA PB1
01230 CLC
01240 RETURN2 BCC RTN2I ;FORCED BRANCH
01250 LEFT LDY HPOST0,X;OLD HORIZONTAL POSITION
01260 DEY ;MOVE LEFT ONE
01270 NOP
01280 TYA
01290 CMP LFL0,X ;TOO FAR?
01300 BCC B3I ;YES. GO BACK
01310 STA HPOST0,X;STORE NEW HORIZONTAL
01320 STA HPOSP0,X;STORE IN HARDWARE REGISTER
01330 CLC
01340 RETURN3 BCC B3I ;FORCED BRANCH
01350 RIGHT LDY HPOST0,X;SAME FOR RIGHT MOVEMENT
01360 INY
01370 NOP
01380 TYA
01390 CMP RTL0,X
01400 BEQ GOON
01410 BCS STICKI
01420 GOON STA HPOST0,X
01430 STA HPOSP0,X
01440 CLC
01450 RETURN BCC STKI ;FORCED BRANCH
Back to previous page