3563 lines
67 KiB
NASM
Executable File
3563 lines
67 KiB
NASM
Executable File
.FILE "PLYR.ASM"
|
|
*----------------------------------------------------------------------------
|
|
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
|
|
*ALL RIGHTS RESERVED
|
|
*
|
|
|
|
.include C30.EQU
|
|
.include OBJ.EQU
|
|
.include MACS.EQU
|
|
.include MPROC.EQU
|
|
.include VUNIT.EQU
|
|
.include CMOS.EQU
|
|
.include SYSID.EQU
|
|
.include SYS.EQU
|
|
.include GLOBALS.EQU
|
|
.include SNDTAB.EQU
|
|
.include PALL.EQU
|
|
.include OBJECTS.EQU
|
|
.include TEXT.EQU
|
|
.include DIRQ.EQU
|
|
.include DELTA.EQU
|
|
.include COMM.EQU
|
|
|
|
JARVK .set 0
|
|
|
|
.globl RANDSND,RANDVSND
|
|
.globl ROADIR,GETNXTRDIR
|
|
.globl DRONINBZ,INBOUNDZ
|
|
.globl GETRPM,GETAUTO,ENGFRI,GEARACTABI,ENGACTABI,STEERI
|
|
.globl PLYRFIRST,DRONESTOP,PLYRDRAFT
|
|
|
|
*THESE ARE EDGE VARIABLES AND SHOULD NOT BE MESSED WITH
|
|
|
|
.bss OFFROAD_TMR,1
|
|
|
|
.bss ZOOMRAM,0
|
|
.bss ZOOMD,1 ;CURRENT ZOOM DISTANCE
|
|
.bss ZOOMDD,1
|
|
.bss ZOOMDG,1 ;ZOOM DIST GOAL
|
|
.bss ZOOMH,1 ;CURRENT ZOOM HEIGHT
|
|
.bss ZOOMHD,1
|
|
.bss ZOOMHG,1 ;ZOOM HEIGHT GOAL
|
|
.bss CAMVIEW,1 ;CAMERA VIEW 1=THIRD PERSON
|
|
|
|
.bss BRAKEON,1 ;1=BRAKE PEDAL ON
|
|
.bss WRECKFLG,1 ;1=PLAYER CAR WRECKED, 0=NORMAL
|
|
.bss REVFLG,1
|
|
|
|
.bss _plyr1,0 ;PLYR STRUCT
|
|
.bss PLYSTAT,1
|
|
.bss PLYCAR,1
|
|
.bss PLYPROC,1
|
|
.bss PLYCBLK,1 ;End Plyr Struct
|
|
.bss OLDPLYSPD,1 ;OLD PLAYER SPEED
|
|
.bss OLDPLYAIR,1 ;OLD PLAYER AIRBORNE
|
|
.bss PLYRFIRST,1 ;TICKS PLAYER IN 1ST PLACE
|
|
.bss PLAIRTIM,1 ;TIMER FOR AIR SOUND DISABLE
|
|
|
|
.bss CHEATACC,1
|
|
|
|
.bss CHEAT,1
|
|
.globl HEAD2HEAD_ON,PLY2CAR,CHEAT
|
|
|
|
|
|
*PLAYER 1ST, 2ND, 3RD POSTION COORDS:
|
|
|
|
PLYPOS1Z .set 0
|
|
PLYPOS1Y .set -150
|
|
|
|
.if JARVK
|
|
PLYPOS2Z .set 3840
|
|
PLYPOS2Y .set -700
|
|
|
|
PLYPOS3Z .set 6000
|
|
PLYPOS3Y .set -1000
|
|
.else
|
|
PLYPOS2Z .set 2200
|
|
PLYPOS2Y .set -400
|
|
|
|
PLYPOS3Z .set 3840
|
|
PLYPOS3Y .set -700
|
|
.endif
|
|
|
|
;PLYPOS3Y .set -2700 ;good heli height
|
|
|
|
ZOOMRATIO .set 0.05 ;1/ZOOMTIME FOR VIEW CHANGE
|
|
|
|
*SWITCH BIT VALUES
|
|
|
|
SHIFT .set 4 ;LO-HI SHIFT LEVER
|
|
BRAKE .set 1 ;BRAKE PEDAL
|
|
|
|
*RAM VARIABLES
|
|
|
|
.bss PLMSAV,15 ;AREAS TO SAVE PLAYER MATRICES
|
|
.bss PMSAV,9
|
|
|
|
ZOOMI .word ZOOMRAM
|
|
|
|
|
|
GRAVITY .set 1.20
|
|
ROADFRICI .float 0.0028
|
|
OFRDFRICI .float 0.010
|
|
BRAKFRICI .float 0.020
|
|
SKIDFRICI .float 0.003
|
|
SPINFRICI .float 0.015 ;SPINOUT FRICTION
|
|
|
|
|
|
*RPM MAX
|
|
|
|
NUM_RPMS .set 47
|
|
NUM_RPM .set 47.0
|
|
OVERREV .set 51.0
|
|
*----------------------------------------------------------------------------
|
|
*PLAYER CAR SPECIALIZED PARAMETER TABLE
|
|
*
|
|
*ACCELERATION, TRACTION (0=total traction), ONROAD DAMPING, OFFROAD DAMPING
|
|
*
|
|
CARPARAMTABI .word CARPARAMTAB
|
|
|
|
*STDARD .float 0.82,1.00,0.0028,0.010
|
|
*NEWSTD .float 0.82,0.90,0.0028,0.0060
|
|
|
|
CARPARAMTAB:
|
|
|
|
*#0 MUSCLE CAR
|
|
.float 0.91,0.60,0.0028,0.010 ;ALL AROUND
|
|
CARPARAMTAB1
|
|
*#1 XXX
|
|
.float 0.98,0.50,0.0032,0.0042 ;ACCEL
|
|
*#2 MISSILE
|
|
.float 0.88,0.70,0.0026,0.010 ;TOP SPEED
|
|
*#3 FERRARI
|
|
.float 0.89,0.50,0.0028,0.010 ;HANDLING
|
|
*HIDDEN VEHICLES
|
|
*#4 jeep
|
|
.float 0.95,0.60,0.0030,0.0039
|
|
*#5 sbusp
|
|
.float 0.89,0.50,0.0028,0.010
|
|
*#6 copcar
|
|
.float 0.91,0.65,0.0028,0.0050
|
|
*#7 gtruck
|
|
.float 0.89,0.50,0.0028,0.010
|
|
|
|
CARPARAMTABL .set CARPARAMTAB1-CARPARAMTAB ;LENGTH OF ENTRY
|
|
*----------------------------------------------------------------------------
|
|
*GET CAR PARAMETERS FOR PLAYER
|
|
*PARAMETERS
|
|
* R0 CAR # 0-3
|
|
* AR0 CAR BLOCK INDEX
|
|
*LOADS PARAMETERS INTO CAR BLOCK
|
|
*TRASHES R0,AR2
|
|
GETCARPARAM:
|
|
LDI @CARPARAMTABI,AR2
|
|
MPYI CARPARAMTABL,R0
|
|
ADDI R0,AR2
|
|
LDF *AR2++,R0
|
|
STF R0,*+AR0(CARMAXACCEL)
|
|
LDF *AR2++,R0
|
|
STF R0,*+AR0(CARTRACTION)
|
|
LDF *AR2++,R0
|
|
STF R0,*+AR0(CARRDFR)
|
|
LDF *AR2++,R0
|
|
STF R0,*+AR0(CAROFRDFR)
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*INIT CAR 3 POINT SUSPENSION DATA STRUCTURE
|
|
*PARAMETERS
|
|
* AR4 OBJECT BLOCK
|
|
* R0 VEHICLE #
|
|
*RETURNS AR0 POINTS TO CARBLOCK
|
|
*
|
|
* NO CARRY ON FAILURE TO ALLOCATE CAR BLOCK
|
|
*
|
|
*TRASHED R1-R7
|
|
_CARV0:
|
|
PUSH R0
|
|
PUSH AR1
|
|
CALL GETCAR
|
|
BNC CARV_ERR
|
|
STI AR0,*+AR4(OCARBLK)
|
|
|
|
LDF 0,R0
|
|
RPTS CARSIZ-1
|
|
STF R0,*AR0++ ;CLEAR OUT THE BLOCK
|
|
|
|
SUBI CARSIZ,AR0 ;RESTORE AR2
|
|
CALL _makbox ;GET YOUR CAR BOX
|
|
|
|
LDI *+AR4(OROMDATA),AR1 ;TWEAK RADIUS SLIGHTLY
|
|
FLOAT *AR1,R0
|
|
MPYF 1.1,R0
|
|
FIX R0
|
|
STI R0,*+AR4(ORAD) ;GET OBJECT RADIUS
|
|
|
|
LDI 0,R0 ;INIT FLAGS
|
|
STI R0,*+AR0(CAR_SPIN)
|
|
STI R0,*+AR0(CAR_ONROAD)
|
|
STI R0,*+AR0(CAR_AIRF)
|
|
STI R0,*+AR0(CAR_AIRB)
|
|
STI R0,*+AR0(CARPTSTR) ;POSITION TRACKING SYSTEM
|
|
STI R0,*+AR0(CARPTSRANK)
|
|
STI R0,*+AR0(CAR_BUMP)
|
|
STI R0,*+AR0(CARGEAR)
|
|
STI R0,*+AR0(CARTRANS) ;AUTO IS DEFAULT
|
|
|
|
|
|
STI R0,*+AR0(CARNUM) ;CLEAR DISPATCH NUMBER
|
|
STI R0,*+AR0(CARTRACK_ID) ;CLEAR TRACK ID
|
|
STI R0,*+AR0(CAR_OM) ;CLEAR OTHER MACHINE FLAG
|
|
|
|
|
|
LDF 0,R0
|
|
STF R0,*+AR0(CARRPM)
|
|
|
|
LDI 1,R0
|
|
STI R0,*+AR0(CARSHAD) ;SHADOW ON
|
|
|
|
LDF @ROADFRICI,R0 ;FRICTION COEFFICIENTS
|
|
STF R0,*+AR0(CARRDFR)
|
|
LDF @OFRDFRICI,R0
|
|
STF R0,*+AR0(CAROFRDFR)
|
|
|
|
LDF 0.82,R0
|
|
STF R0,*+AR0(CARMAXACCEL) ;SET ACCEL POWER
|
|
LDF 1.0,R0
|
|
STF R0,*+AR0(CARMASS) ;DEFAULT CAR MASS
|
|
STF R0,*+AR0(CARTRACTION) ;DEFAULT TRACTION COEFFICIENT
|
|
|
|
LDI 1,R0
|
|
LS O_3DROT_B,R0
|
|
OR *+AR4(OFLAGS),R0 ;FLAG SYSTEM AS NON-2D OPTIMIZABLE
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
SETC
|
|
CARV_ERR
|
|
POP AR1
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
.globl BONUS_WAIT_LOOP
|
|
BONUS_WAIT_LOOP:
|
|
LDI @DID_TIMED_OUT,R0
|
|
BNZ BWLX
|
|
|
|
LDI @PLYCAR,AR2
|
|
LDI *+AR2(OFLAGS),R0 ;CHECK IF ALREADY ON LIST
|
|
TSTB O_LIST_M,R0
|
|
BNZ BWLX ;YES, DONT INSERT
|
|
CALL OBJ_INSERT ;INSERT PLAYER OBJECT
|
|
BWLX
|
|
|
|
BONUS_WAIT_LP
|
|
LDI @PLYCAR,AR4
|
|
LDI @PLYCBLK,AR5
|
|
CALL ZOOMUP ;UPDATE YOUR ZOOM
|
|
SLEEP 1
|
|
LDI @_MODE,R0
|
|
AND MMODE,R0
|
|
CMPI MGAME,R0
|
|
BNE BONUS_WAIT_LP
|
|
BU PLYR_ENTER
|
|
|
|
*----------------------------------------------------------------------------
|
|
*PLYR_CAR_INIT
|
|
*PARAMETERS
|
|
* AR4 CAR (NOT INSERTED)
|
|
*RETURNS
|
|
* AR4 CAR (INSERTED)
|
|
* AR5 CAR BLOCK
|
|
.globl PLYR_CAR_INIT
|
|
PLYR_CAR_INIT:
|
|
STI AR4,@PLYCAR ;INIT CAR PLAYER STRUCT
|
|
STI AR7,@PLYPROC
|
|
|
|
LDI @CHOOSENCAR,AR1
|
|
CMPI 4,AR1
|
|
BLT DOGENRLB
|
|
|
|
|
|
LDI AR1,R0
|
|
CMPI 4,AR1
|
|
LDIEQ JEEP_MOD,R0
|
|
CMPI 5,AR1
|
|
LDIEQ PLYR_SBUS_MOD,R0
|
|
CMPI 6,AR1
|
|
LDIEQ PLYR_COPCAR_MOD,R0
|
|
|
|
CMPI 7,AR1
|
|
LDIEQ 3,R0
|
|
LDI R0,AR1
|
|
DOGENRLB
|
|
|
|
LDI AR1,AR2
|
|
MPYI VEHTAB_SIZE,AR1
|
|
ADDI @VEHICLE_TABLEI,AR1
|
|
LDI *+AR1(VEHTAB_MODEL),R1
|
|
STI R1,*+AR4(OROMDATA)
|
|
|
|
CALL VEHICLE_ANI_INIT ;SETUP WHEEL ANIMATION
|
|
|
|
LDF -1,R0
|
|
STF R0,*+AR4(OUSR1) ;skid system flag
|
|
|
|
LDI 0,R0
|
|
STI R0,@_MPH
|
|
STI R0,@OLDPLYAIR ;OLD AIRBORNE FLAG
|
|
STI R0,@PLAIRTIM ;CLEAR AIR TIMER
|
|
STI R0,@ENGVOL ;ENGINE SOUND VOLUME
|
|
|
|
STI AR7,*+AR4(OPLINK) ;SETUP OPLINK
|
|
|
|
LDI AR4,AR2
|
|
CALL OBJ_INSERT ;INSERT SUCKER ON THE LIST
|
|
|
|
LDF 0,R0
|
|
STF R0,@OLDPLYSPD
|
|
|
|
LDI @CHOOSENCAR,R0
|
|
CALL _CARV0 ;INIT CAR DATA STRUCT IN PROCESS
|
|
CALL GETCARPARAM ;GET SPECIAL PLAYER CAR PARAMETERS
|
|
STI AR0,@PLYCBLK
|
|
|
|
LDI PLYR_C,R0
|
|
STI R0,*+AR0(CAR_ID)
|
|
STI R0,*+AR4(OID)
|
|
|
|
|
|
LDI @CHOSEN_TRANSMISSION,R0
|
|
STI R0,*+AR0(CARTRANS) ;AUTO/MANUAL SWITCH
|
|
|
|
LDF 2.0,R0
|
|
STF R0,*+AR0(CARMASS) ;SET CAR MASS
|
|
|
|
LDI 11,R0
|
|
STPI R0,@OFFROAD_TMR
|
|
|
|
LDF @STEERCT,R0 ;STEERING CENTER
|
|
STF R0,@WHEELPOS
|
|
RETS ;DONE INITIALIZING PLYR CAR
|
|
*----------------------------------------------------------------------------
|
|
*PARAMETERS
|
|
* AR4 CAR OBJECT
|
|
PLYR_INTRO_ENTER:
|
|
LDI *+AR4(OCARBLK),AR5
|
|
LDI 0,R0 ;NEUTRAL, PLEASE
|
|
STI R0,*+AR5(CARGEAR)
|
|
|
|
CALL GETTRAK
|
|
LDI *+AR5(CARTRAK),AR2
|
|
|
|
;Set Appropriate Palette
|
|
;
|
|
LDI @CHOOSENCAR,R0
|
|
LDI R0,AR0
|
|
|
|
CMPI 4,R0
|
|
LDIEQ JEEP_MOD,AR0
|
|
CMPI 5,R0
|
|
LDIEQ PTRUCKG_MOD,AR0
|
|
CMPI 6,AR0
|
|
LDIEQ COPCAR_MOD,AR0
|
|
CMPI 7,AR0
|
|
LDIGE GTRUCK_MOD,AR0
|
|
|
|
MPYI VEHTAB_SIZE,AR0
|
|
ADDI @VEHICLE_TABLEI,AR0
|
|
LDI *+AR0(VEHTAB_PAL),AR2
|
|
CALL PAL_FIND
|
|
STI R0,*+AR4(OPAL)
|
|
|
|
;
|
|
;INIT CAMERA
|
|
;
|
|
|
|
LDF @START_RADY,R2 ;SETUP MATRIX
|
|
STF R2,*+AR5(CARYROT)
|
|
STF R2,*+AR5(CARVROT)
|
|
|
|
CLRF R0
|
|
STF R0,*+AR5(CARTHROTTLE)
|
|
STF R0,*+AR5(CARSPEED)
|
|
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
;SET CAMERA POSITION
|
|
;
|
|
;
|
|
LDF @START_RADY,R2 ;SETUP MATRIX
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
LDI AR2,R2
|
|
|
|
CALL CLR_VECTORA
|
|
FLOAT -20*FEET,R0
|
|
STF R0,*+AR2(Y)
|
|
FLOAT (-20*FEET),R0
|
|
STF R0,*+AR2(Z)
|
|
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDI @CAMERAPOSI,AR3 ;INIT CAMERA POSITION
|
|
LDF *+AR4(OPOSX),R0
|
|
ADDF *+AR2(X),R0
|
|
STF R0,*+AR3(X) ;CAMERA X
|
|
|
|
LDF *+AR4(OPOSY),R0
|
|
ADDF *+AR2(Y),R0
|
|
STF R0,*+AR3(Y) ;CAMERA Y
|
|
|
|
LDF *+AR4(OPOSZ),R0
|
|
ADDF *+AR2(Z),R0
|
|
STF R0,*+AR3(Z) ;CAMERA Z
|
|
|
|
CALL RESCAN ;RESET ACTIVE OBJECT LIST
|
|
|
|
LDI 1,R0
|
|
STI R0,@CAMVIEW ;INIT CAMERA VIEW TO 3RD PERSON
|
|
|
|
|
|
BU PLYR_INTRO_JOIN
|
|
*----------------------------------------------------------------------------
|
|
_PLYR:
|
|
PLYR_ENTER
|
|
CALL OBJ_GET ;INIT PLAYER OBJECT
|
|
LDI AR0,AR4
|
|
CALL PLYR_CAR_INIT
|
|
|
|
LDF @START_POS+X,R0
|
|
STF R0,*+AR4(OPOSX)
|
|
LDF @START_POS+Y,R0
|
|
STF R0,*+AR4(OPOSY)
|
|
LDF @START_POS+Z,R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
LDI PLYR_C|PLYR1_T,R0
|
|
STI R0,*+AR7(PID)
|
|
|
|
*INITIALIZE PLAYER COORD, FACING ANGLE
|
|
|
|
LDI *+AR4(OCARBLK),AR5
|
|
CALL GETTRAK
|
|
LDI *+AR5(CARTRAK),AR2
|
|
|
|
|
|
LDI @DYNALIST_TRUEBEGIN,AR2
|
|
LDI *+AR2(OUSR1),R0
|
|
|
|
LDI *+AR2(OLINK4),AR2 ;SKIP FIRST GROUP
|
|
|
|
; ANDN 0FFh,R0
|
|
; ADDI 0100h,R0
|
|
;L10 LDI *+AR2(OLINK4),AR2 ;SKIP FIRST GROUP
|
|
; CMPI *+AR2(OUSR1),R0
|
|
; BGT L10
|
|
|
|
LDF *+AR2(OPOSX),R0
|
|
STF R0,*+AR4(OPOSX)
|
|
|
|
LDF *+AR2(OPOSY),R0
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
LDF *+AR2(OPOSZ),R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
|
|
CALL GETRDIR ;GET ANGLE OF ROAD
|
|
|
|
|
|
*INIT CAMERA
|
|
|
|
LDF R0,R2
|
|
|
|
STF R2,*+AR5(CARYROT)
|
|
STF R2,*+AR5(CARVROT)
|
|
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
NEGF R2
|
|
CALL NORMITS
|
|
|
|
LDP @_CAMERARAD+Y
|
|
STF R2,@_CAMERARAD+Y ;UPDATE CAMERA RAD
|
|
SETDP
|
|
|
|
LDI @CAMERAMATRIXI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
*OFFSET THE CAR INTO LANE 1
|
|
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
|
|
CALL CLR_VECTORA
|
|
FLOAT 10*FEET,R0
|
|
|
|
|
|
;
|
|
;if vehicle is a slave, then offset into lane #2
|
|
;
|
|
LANESIZE .set 1152
|
|
;if a slave then ALWAYS appear on right side
|
|
;
|
|
;
|
|
LDI @DIPRAM,R1
|
|
TSTB DIP_COMMP,R1
|
|
BNZ BABA
|
|
|
|
TSTB CMDP_MASTER,R1
|
|
BZ BABA
|
|
|
|
FLOAT LANESIZE,R1
|
|
ADDF R1,R0
|
|
BABA
|
|
|
|
|
|
STF R0,*+AR2(X)
|
|
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
LDI R3,AR2
|
|
|
|
LDF *+AR4(OPOSX),R0
|
|
ADDF *+AR2(X),R0
|
|
STF R0,*+AR4(OPOSX)
|
|
|
|
LDF *+AR4(OPOSY),R0
|
|
ADDF *+AR2(Y),R0
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
LDF *+AR4(OPOSZ),R0
|
|
ADDF *+AR2(Z),R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
|
|
*SET CAMERA POSITION
|
|
|
|
LDI @CAMERAMATRIXI,AR2
|
|
LDI AR2,R2
|
|
|
|
CALL CLR_VECTORA
|
|
FLOAT -20*FEET,R0
|
|
STF R0,*+AR2(Y)
|
|
FLOAT (-20*FEET),R0
|
|
STF R0,*+AR2(Z)
|
|
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDI @CAMERAPOSI,AR3 ;INIT CAMERA POSITION
|
|
LDF *+AR4(OPOSX),R0
|
|
ADDF *+AR2(X),R0
|
|
STF R0,*+AR3(X) ;CAMERA X
|
|
|
|
LDF *+AR4(OPOSY),R0
|
|
ADDF *+AR2(Y),R0
|
|
STF R0,*+AR3(Y) ;CAMERA Y
|
|
|
|
LDF *+AR4(OPOSZ),R0
|
|
ADDF *+AR2(Z),R0
|
|
STF R0,*+AR3(Z) ;CAMERA Z
|
|
|
|
CALL RESCAN ;RESET ACTIVE OBJECT LIST
|
|
|
|
*CAMERA INIT
|
|
PLYR_INTRO_JOIN
|
|
|
|
; LDF 1.0,R0 ;INIT DRAFT VALUE
|
|
; STF R0,@PLDRAFTVAL
|
|
|
|
LDF 0,R0 ;INITIALIZE PLAYER ZOOM POSITION
|
|
STF R0,@ZOOMDD
|
|
STF R0,@ZOOMHD
|
|
FLOAT PLYPOS2Y,R0
|
|
STF R0,@ZOOMH
|
|
STF R0,@ZOOMHG
|
|
FLOAT PLYPOS2Z,R0
|
|
STF R0,@ZOOMD
|
|
STF R0,@ZOOMDG
|
|
|
|
LDI @VIEW1I,AR2
|
|
|
|
LDI @CAMVIEW,R0
|
|
LDIEQ @VIEW0I,AR2
|
|
|
|
LDI 1,R1
|
|
STI R1,@CAMVIEW ;INIT CAMERA VIEW TO 3RD PERSON
|
|
|
|
CMPI 2,R0
|
|
LDIEQ @VIEW2I,AR2
|
|
|
|
LDI UTIL_C,R2 ;RESTORE OLD VIEW
|
|
CALL PRC_CREATE
|
|
|
|
.data
|
|
VIEW0I .word _VIEW0
|
|
VIEW1I .word _VIEW1
|
|
VIEW2I .word _VIEW2
|
|
.text
|
|
L883 LDI 0,R0 ;BRAKE INITIALLY OFF
|
|
STPI R0,@BRAKEON
|
|
STI R0,@WRECKFLG ;WRECK OFF
|
|
STI R0,@PLYRFIRST ;TIMER FOR PLAYER IN 1ST PLACE
|
|
CALL _off_brake
|
|
|
|
LDF 1.0,R0 ;INITIALIZE THE CHEAT
|
|
STF R0,@CHEATACC
|
|
STF R0,@CHEAT
|
|
|
|
LDI @_MODE,R0
|
|
OR MHUD,R0
|
|
STI R0,@_MODE
|
|
*
|
|
*PLAYER CAR LOOP
|
|
*
|
|
PLYRLP: LDI @END_OF_GAMEP,R0
|
|
BNZ ENDPLAYER
|
|
|
|
LDI @NFRAMES,R2
|
|
NEGI R2,R1
|
|
LDI @POSITION,R0 ;TIMER FOR HOW LONG PLAYER IN 1ST
|
|
CMPI 1,R0
|
|
LDIZ @PLYRFIRST,R1
|
|
ADDI R2,R1
|
|
STI R1,@PLYRFIRST ;TIMER FOR PLAYER IN 1ST PLACE
|
|
|
|
LDI @_countdown,R1 ;TIMEOUT?
|
|
CALLLE TIMED_OUT ;SETBACK?
|
|
DONT_TIMEOUT
|
|
|
|
|
|
*CHECK FOR BONUS SCREEN
|
|
* !!!! DO NOT REMOVE THIS CODE
|
|
* !!!! EVEN IF YOU DON'T KNOW WHAT
|
|
* !!!! IT DOES
|
|
LDI @_MODE,R0
|
|
AND MMODE,R0
|
|
CMPI MBONUS,R0
|
|
BEQ BONUS_WAIT_LOOP
|
|
|
|
LDI @PLYCAR,AR4 ;GET PLAYER CAR OBJECT
|
|
LDI *+AR4(OCARBLK),AR5
|
|
|
|
|
|
.globl WRECK,WRECKST,WRECKFLG,VIEW1I,VIEW0I,VIEW2I
|
|
|
|
|
|
PLYRSPD00
|
|
LDI @WRECKFLG,R0 ;WRECK?
|
|
BZ PLYRSPD
|
|
CALL WRECK ;DO YOUR WRECK THING
|
|
CALL INBOUNDZ ;KEEP IN BOUNDS
|
|
B PLYRCAM ;DONT CHANGE MATRIX OR CAMERA POS
|
|
|
|
|
|
|
|
PLYRSPD
|
|
CALL CKOFRD ;CHECK YOUR OFFROAD COUNTER
|
|
CMPI 0,R0
|
|
CALLZ PLYONRD ;RESET PLAYER ON ROAD
|
|
|
|
LDF *+AR4(OMAT11),R0 ;IF PLAYER FLIPPED RESET 'EM
|
|
CMPF 0.01,R0
|
|
CALLLT PLYONRD
|
|
|
|
*GET CAR SPEED
|
|
|
|
CALL GETGEAR ;GET CAR GEAR
|
|
LDI *+AR5(CARGEAR),R1
|
|
STI R0,*+AR5(CARGEAR)
|
|
CMPI R0,R1 ;CHECK FOR UPSHIFT
|
|
BGE PLYRSPD0 ;DOWNSHIFT OR NO SHIFT
|
|
|
|
; CMPI 4,R0 ;4TH GEAR?
|
|
; BZ PLYRSPD0 ;YES, NO RUBBER
|
|
|
|
CALL GETPEDAL ;GET GAS PEDAL VALUE
|
|
MPYF 2,R0 ;GIVE A LITTLE JOLT
|
|
CMPF 1.4,R0 ;CHECK THROTTLE
|
|
BLE PLYRSPD01 ;NOT ENOUGH
|
|
|
|
PUSHF R0
|
|
SONDFX UPSHIFTSND ;MAKE YOUR UPSHIFT DUDES
|
|
|
|
CREATEC FLAME_PRC,UTIL_C ;make child flames
|
|
CREATEC SMOKE_PROC,UTIL_C ;make child smoke
|
|
|
|
; LDI *+AR5(CARGEAR),AR2 ;MAKE RIGHT REV ON SHIFT
|
|
; ADDI @SHIFTSNDTABI,AR2
|
|
; LDI *-AR2(1),AR2
|
|
; CALL ONESND
|
|
|
|
POPF R0
|
|
B PLYRSPD01
|
|
PLYRSPD0
|
|
CALL GETPEDAL ;GET GAS PEDAL VALUE
|
|
PLYRSPD01
|
|
|
|
; NEGF *+AR5(CARTHROTTLE),R1
|
|
; ADDF R0,R1
|
|
; CMPF 0.3,R1
|
|
; BLT NO_PEDAL_FLAME
|
|
; PUSHF R0
|
|
; CREATEC FLAME_PRC,UTIL_C ;make child flames
|
|
; POPF R0
|
|
;NO_PEDAL_FLAME
|
|
|
|
LDI @_MODE,R1
|
|
TSTB MGO,R1
|
|
LDFZ 0,R0 ;YIP, NO THROTTLE
|
|
|
|
STF R0,*+AR5(CARTHROTTLE)
|
|
|
|
CALL GETBRAKE ;GET YOUR BRAKE, DUDES...
|
|
STF R0,*+AR5(CARBRAKE) ;STORE IT
|
|
|
|
; LDF @PLDRAFTVAL,R0 ;SET DRAFTING VALUE
|
|
; STF R0,@DRAFTVAL
|
|
|
|
CALL GETSPD
|
|
|
|
LDF *+AR5(CARSPEED),R0 ;OUTPUT IN MPH
|
|
LDI @_countdown,R1
|
|
BGT NOTGO
|
|
LDI SM_GO,R1 ;we have to take care of the case when the plyr
|
|
STI R1,@SUSPEND_MODE ;just 'rolls' into the checkpoint
|
|
NOTGO
|
|
MPYF MPH_CONVERSION,R0
|
|
FIX R0
|
|
STI R0,@_MPH
|
|
|
|
*GET YOUR SKID FACTOR
|
|
CALL GETSKID
|
|
|
|
LDF *+AR5(CARSKID),R0
|
|
|
|
|
|
*DO YOUR TRACTION CHEAT...
|
|
|
|
LDI @HEAD2HEAD_ON,R1 ;LINK?
|
|
BZ GSKD1 ;FORGET IT, NOT HEAD2HEAD
|
|
LDI *+AR5(CAR_SPIN),R1 ;FULL SKID ON SPIN-OUT
|
|
BNZ GSKD1
|
|
LDF 2.00,R1
|
|
SUBF @CHEAT,R1
|
|
MPYF R1,R0
|
|
STF R0,*+AR5(CARSKID) ;CHEAT SKID VALUE
|
|
GSKD1
|
|
|
|
|
|
|
|
MPYF R0,R0
|
|
CMPF 1.0,R0
|
|
LDFGT 1.0,R0
|
|
SUBRF 1,R0
|
|
CMPF 0.333,R0
|
|
LDFLT 0.333,R0
|
|
MPYF 2.5,R0 ;STEERING WHEEL POWER
|
|
STF R0,@WHEELPWR
|
|
|
|
*GET CAR DIRECTION DELTA RADIANS
|
|
|
|
CALL GETTRAK ;GET CLOSEST TRAKC SECTION
|
|
CALL GETSTEER ;RET R0=STEERING DELTA RADIANS
|
|
CALL GETDIR ;ADJUST DIRECTION BASED ON SKID
|
|
|
|
PUSHF R0
|
|
CALL INBOUNDZ ;KEEP IN BOUNDS
|
|
CALL BACKCK ;KEEP IN RIGHT DIRECTION
|
|
POPF R0
|
|
|
|
*GET INCREMENTAL ROTATION MATRIX
|
|
LDF R0,R2
|
|
ADDF *+AR5(CARROT),R2 ;GET RID OF OLD OVERROTATION
|
|
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
*FORM NEW ROTATION MATRIX
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
LDI R2,R3
|
|
CALL CONCATMAT
|
|
|
|
*FORM NEW VELOCITY MATRIX
|
|
LDF *+AR5(CARVROT),R2 ;GET VELOCITY MATRIX
|
|
SUBF *+AR5(CARYROT),R2
|
|
|
|
LDI @MATRIXBI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
|
|
LDI AR2,R3
|
|
CALL CONCATMAT
|
|
|
|
|
|
LDF *+AR5(CARDIST),R2 ;GET DISTANCE
|
|
MPYF @CHEAT,R2 ;DO THE CHEAT THING !!!
|
|
|
|
|
|
LDI @MATRIXBI,AR2
|
|
|
|
LDI *+AR5(CAR_AIRB),R0
|
|
BNZ PAIRB ;WERE FLYING
|
|
|
|
*MOVE CAR FORWARD
|
|
LDI AR4,R3
|
|
ADDI OVELX,R3
|
|
CALL FORWARD
|
|
PAIRB
|
|
CALL OVELADD
|
|
*GET ROAD MATRIX
|
|
LDI *+AR4(OCARBLK),R3 ;GET CAR DATA AREA
|
|
CALL CAR_ROAD_COLL
|
|
|
|
*GET NEW CAR MATRIX
|
|
LDF *+AR5(CARYROT),R2
|
|
STF R2,*+AR4(ORADY) ;STORE CAR OBJECT RADY
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
LDI R2,R3
|
|
CALL CONCATMAT
|
|
|
|
*GET CAMERA ORIENTATION MATRIX
|
|
PLYRCAM:
|
|
*DO YOUR ZOOM JIVE
|
|
CALL ZOOMUP ;UPDATE YOUR ZOOM
|
|
|
|
LDI @CAMVIEW,R0
|
|
BNZ CAM3RD
|
|
*FIRST PERSON CAMERA
|
|
|
|
CAM1ST
|
|
****************************
|
|
CALL CAMMATSAV
|
|
****************************
|
|
LDI @CAMERAMATRIXI,AR2
|
|
NEGF *+AR5(CARYROT),R2 ;FOLLOW CAR ROTATION
|
|
LDP @_CAMERARAD+Y
|
|
STF R2,@_CAMERARAD+Y ;UPDATE CAMERA RAD
|
|
SETDP ;RESTORE DP TO ZERO PAGE
|
|
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
CALL CPYIMAT
|
|
LDF 0,R0
|
|
STF R0,*+AR5(CARROT) ;NO OVERROTATION IN CORNER
|
|
|
|
LDF *+AR5(CARXLEAN),R2 ;GET X LEAN FACTOR
|
|
MPYF -0.7,R2 ;NEGATE AND SCALE
|
|
|
|
|
|
LDP @_CAMERARAD+X
|
|
STF R2,@_CAMERARAD+X
|
|
SETDP
|
|
|
|
|
|
LDI @MATRIXBI,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI AR2,AR0
|
|
LDI @MATRIXCI,AR1
|
|
PUSH AR1
|
|
|
|
LDF *+AR5(CARZLEAN),R2 ;GET Z LEAN FACTOR
|
|
|
|
MPYF -0.5,R2 ;NEGATE AND SCALE
|
|
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_ZMATRIX
|
|
CALL CONCAT201 ;CONCAT YOUR MATRICES
|
|
|
|
POP R2 ;GET MATRIXC POINTER
|
|
LDI @CAMERAMATRIXI,AR2 ;GET SOURCE MATRIX
|
|
LDI AR2,R3
|
|
CALL CONCATMAT
|
|
****************************
|
|
CALL CAMMATAVG
|
|
*************************
|
|
BR CAM3RDX
|
|
;
|
|
;THIRD PERSON CAMERA
|
|
;
|
|
CAM3RD
|
|
|
|
CLRF R2
|
|
LDP @_CAMERARAD+X
|
|
STF R2,@_CAMERARAD+X
|
|
SETDP
|
|
|
|
ABSF *+AR4(OVELX),R0 ;DONT CHANGE CAMERA DIR FOR SMALL VEL
|
|
ABSF *+AR4(OVELZ),R1
|
|
ADDF R0,R1
|
|
CMPF 2,R1
|
|
BLT CAM3RD0
|
|
|
|
LDI *+AR5(CAR_SPIN),R0 ;SPINNING?
|
|
BNZ CAM3RD0 ;YES, DONT mess WITH CAMERA ANGLE
|
|
|
|
LDF *+AR4(OVELX),R3
|
|
LDF *+AR4(OVELZ),R2
|
|
CALL ARCTANF
|
|
|
|
*MAX CAMERA ANGLE CHANGE
|
|
|
|
LDP @_CAMERARAD+Y
|
|
SUBF @_CAMERARAD+Y,R0 ;GET OLD CAMERA
|
|
|
|
LDF 0,R1 ;NORMALIZE DIFFERENCE
|
|
CMPF 3.14,R0
|
|
LDFGT -6.28,R1
|
|
|
|
CMPF -3.14,R0
|
|
LDFLT 6.28,R1
|
|
ADDF R1,R0
|
|
|
|
MPYF 0.20,R0 ;ANGLE SMOOTHING
|
|
ADDF @_CAMERARAD+Y,R0
|
|
SETDP
|
|
|
|
CALL CAMCHK ;CHECK OUT NEW VALUE
|
|
BZ CAMOK ;ITS O.K...
|
|
|
|
*WE'RE OFF
|
|
LDF R0,R4 ;SAVE NEW VALUE
|
|
CALL CAMROT ;GET ADJUSTED ANGLE VALUE
|
|
LDF R0,R5 ;SAVE NEW ADJUSTED VALUE
|
|
LDP @_CAMERARAD+Y,R6 ;GET OLD VALUE
|
|
LDF @_CAMERARAD+Y,R6 ;GET OLD VALUE
|
|
SETDP
|
|
|
|
SUBF R6,R5,R2
|
|
CALL NORMITS
|
|
ABSF R2,R3
|
|
|
|
SUBF R4,R5,R2
|
|
CALL NORMITS
|
|
ABSF R2
|
|
|
|
CMPF R2,R3
|
|
BLT CAMBAD1
|
|
|
|
LDF R5,R0 ;NEW ONE IS CLOSER, GO WITH CORRECTION
|
|
B CAMOK
|
|
|
|
CAMBAD1
|
|
CAM3RD0
|
|
LDP @_CAMERARAD+Y
|
|
LDF @_CAMERARAD+Y,R0 ;UPDATE CAMERA RAD
|
|
SETDP
|
|
|
|
CALL CAMCHK ;CHECK IF OLDIE IS ON...
|
|
BZ CAMOK ;YES... KEEP IT
|
|
|
|
CALL CAMROT ;NO...GET CORRECTION
|
|
CAMOK
|
|
LDP @_CAMERARAD+Y
|
|
STF R0,@_CAMERARAD+Y ;UPDATE CAMERA RAD
|
|
SETDP
|
|
|
|
LDI @CAMERAMATRIXI,AR2 ;GET SOURCE MATRIX
|
|
|
|
LDF R0,R2
|
|
|
|
CALL FIND_YMATRIX ;LOAD CAMERA MATRIX
|
|
|
|
CALL GETCARROT ;GET CAR OVERROTATE
|
|
|
|
NEGF R1,R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX ;GET CARROT MATRIX
|
|
|
|
LDI AR4,R2 ;MULT INTO OBJ MATRIX
|
|
ADDI OMATRIX,R2
|
|
LDI R2,R3
|
|
CALL CONCATMAT
|
|
|
|
CAM3RDX
|
|
;
|
|
;GET NEW CAMERA POSITION
|
|
;GET NEW CAMERA OFFSET FROM CAR
|
|
;
|
|
|
|
LDI @CAMERAMATRIXI,AR2 ;GET SOURCE MATRIX
|
|
NEGF @ZOOMD,R2 ;GET ZOOM DISTANCE
|
|
|
|
LDI @VECTORAI,R3
|
|
LDI R3,AR3
|
|
CALL FORWARD
|
|
|
|
;
|
|
;ADD IT IN TO CAMERAPOS
|
|
;
|
|
|
|
LDF *+AR4(OPOSX),R0
|
|
SUBF *AR3,R0 ;INVERT X FOR SOME REASON
|
|
|
|
LDI @CAMERAPOSI,AR0
|
|
STF R0,*AR0 ;X COORD
|
|
|
|
LDF 0,R0 ;ADJUST WRECK HEIGHT
|
|
LDI @WRECKFLG,R1
|
|
LDFNZ *+AR5(CT_PRDYD),R0
|
|
MPYF 0.6,R0
|
|
|
|
ADDF @ZOOMH,R0
|
|
; LDF @ZOOMH,R0
|
|
ADDF *+AR4(OPOSY),R0
|
|
ADDF *+AR3(1),R0
|
|
STF R0,*+AR0(1) ;Y COORD
|
|
|
|
LDF *+AR4(OPOSZ),R0
|
|
ADDF *+AR3(2),R0
|
|
STF R0,*+AR0(2) ;Z COORD
|
|
|
|
LDI @CAMVIEW,R0
|
|
BZ PLYS1
|
|
CALL CAMYADJ ;YES, ADJUST CAMERA Y ABOVE ROAD
|
|
PLYS1
|
|
CALL GETREV ;GET YOUR RPM'S, MAKE SOUND
|
|
CALL PLYR_SNDS ;HANDLE SOME PLYR SOUNDS
|
|
CALL PLMOTION
|
|
CALL PLYRWHL
|
|
|
|
CALL PLYR_RIDE_RIGHT ;FIND DISTANCE TO CENTER OF ROAD
|
|
STF R0,*+AR5(CARDIST2CNTR)
|
|
PLYSLP
|
|
|
|
LDI @HEAD2HEAD_ON,R0
|
|
BZ NOPLINK
|
|
|
|
LDI *+AR5(CARTRAK),AR0
|
|
LDI *+AR0(OUSR1),R0 ;read road ID
|
|
STI R0,*+AR5(CARTRACK_ID) ;SAVE TRACK ID
|
|
CALL SEND_PLAYERS_POS
|
|
CALL CHEATCK
|
|
NOPLINK
|
|
|
|
SLEEP 1
|
|
B PLYRLP
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*MIDWAY CHEAT IS HERE!!!!!!!!!!!!
|
|
*MAY NEED MAX CHEAT WITH DISTANCE IN FUTURE
|
|
CHEATCK
|
|
.GLOBL COMPTRAK
|
|
FLOAT @NFRAMES,R2
|
|
CALL COMPTRAK
|
|
LDFZ 1.0,R2 ;NO CHEAT WERE THE SAME
|
|
BZ CCKX ;WERE THE SAME, NO CHANGE
|
|
|
|
LDIGT 0,R3 ;WERE AHEAD
|
|
LDFGT @AHEAD,R1 ;WERE AHEAD
|
|
LDILE 1,R3 ;WERE BEHIND
|
|
LDFLE @CATCHUP,R1 ;WERE BEHIND
|
|
MPYF R2,R1
|
|
ADDF @CHEAT,R1
|
|
|
|
*LIMIT ADVANTAGE AT CLOSE DISTANCE
|
|
|
|
LDI @PLY2CAR,AR0
|
|
LDF *+AR0(OPOSZ),R2
|
|
SUBF *+AR4(OPOSZ),R2
|
|
SUBF *+AR0(OPOSX),*+AR4(OPOSX),R3
|
|
MPYF R2,R2
|
|
MPYF R3,R3
|
|
ADDF R3,R2
|
|
CALL SQRT
|
|
MPYF @DISTCON,R0
|
|
CMPF 0.10,R0
|
|
LDFGT 0.10,R0
|
|
|
|
ADDF 1.0,R0
|
|
|
|
CMPI 1,R3 ;BEHIND?
|
|
BNE CCK1 ;NO MINIMUM CATCHUP
|
|
|
|
CMPF R0,R1
|
|
LDFLT R0,R1 ;MINIMUM VALUE
|
|
CCK1
|
|
*JARV CHANGE February 7,1995
|
|
; ADDF 0.10,R0 ;MAXIMUM VALUE
|
|
ADDF 0.09,R0 ;MAXIMUM VALUE
|
|
*JARV END CHANGE
|
|
|
|
CMPF R0,R1
|
|
LDFGT R0,R1
|
|
CMPF 1.0,R1
|
|
LDFLT 1.0,R1
|
|
STF R1,@CHEAT
|
|
|
|
|
|
FLOAT 300,R2
|
|
SUBF *+AR5(CARSPEED),R2
|
|
LDFLT 0,R2
|
|
MPYF @SPDCON,R2
|
|
|
|
SUBF 1.10,R0
|
|
MPYF 10,R0
|
|
MPYF R0,R2
|
|
ADDF 1.0,R2
|
|
CMPF 2.0,R2
|
|
LDFGT 2.0,R2
|
|
CALL COMPTRAK
|
|
LDFGE 1.0,R2
|
|
CCKX
|
|
STF R2,@CHEATACC
|
|
RETS
|
|
|
|
CATCHUP .FLOAT 0.0001
|
|
AHEAD .FLOAT -0.0008
|
|
DISTCON .FLOAT 0.000001
|
|
SPDCON .FLOAT 0.00333
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CAMERA CHECK
|
|
*
|
|
*PARAMETERS
|
|
* R0 CAMERA ANGLE
|
|
* AR0 CAMERA POSITION XYZ POINTER
|
|
* AR4 PLAYER CAR
|
|
*RETURNS
|
|
* CARRY SET COLLIDE WITH ROAD
|
|
CAMCHKL:
|
|
FLOAT -170,R1 ;GET LEFT CORNER DIST
|
|
B CAMCHK0
|
|
CAMCHKR:
|
|
FLOAT 170,R1 ;GET RIGHT CORNER DIST
|
|
CAMCHK0:
|
|
PUSHF R0
|
|
PUSH R3
|
|
PUSH AR0
|
|
PUSH AR4
|
|
LDI AR0,AR4
|
|
|
|
*CHECK RIGHT CORNER
|
|
*ADJUST CAMERA X,Z
|
|
|
|
LDI @VECTORAI,AR0 ;GET TEMP VECTOR, CORNER COORD STORE
|
|
|
|
LDF R0,R2 ;GET CAMERA ANGLE
|
|
|
|
CALL _SINE
|
|
NEGF R0,R3
|
|
CALL _COSI
|
|
|
|
|
|
MPYF R1,R0
|
|
MPYF R1,R3
|
|
|
|
ADDF *+AR4(0),R0 ;GET X,Y,Z COORDS
|
|
STF R0,*AR0
|
|
|
|
LDF *+AR4(1),R0
|
|
STF R0,*+AR0(1)
|
|
|
|
ADDF *+AR4(2),R3
|
|
STF R3,*+AR0(2)
|
|
|
|
LDI AR0,AR4 ;POINT TO XYZ OF CAMERA
|
|
CALL CAMSCAN
|
|
CAMCHKRX
|
|
POP AR4
|
|
POP AR0
|
|
POP R3
|
|
POPF R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*CAMCHKLR
|
|
*PARAMETERS
|
|
* AR0 CAMERA POSITION XYZ POINTER
|
|
* AR4 PLAYER CAR
|
|
*RETURNS
|
|
* R3=0 CAMERA O.K.,
|
|
* R0=1 LEFT OFF,
|
|
* R0=2 RIGHT OFF,
|
|
* R0=3 BOTH OFF
|
|
*RETURNS
|
|
* Z=1 CAMERA O.K.
|
|
CAMCHKLR:
|
|
CALL CAMCHKL
|
|
LDINC 1,R3
|
|
LDIC 0,R3
|
|
|
|
CALL CAMCHKR
|
|
LDINC 2,R1
|
|
LDIC 0,R1
|
|
|
|
ADDI R1,R3
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*CAMERA CHECKER
|
|
*PARAMETERS
|
|
* R0 ANGLE
|
|
* AR4 PLAYER CAR
|
|
* AR5 CAR BLOCK
|
|
*RETURNS
|
|
* R3=0 CAMERA O.K.
|
|
* R0=1 LEFT OFF,
|
|
* R0=2 RIGHT OFF,
|
|
* R0=3 BOTH OFF
|
|
*RETURNS
|
|
* Z=1 CAMERA O.K.
|
|
CAMCHK:
|
|
PUSH AR0
|
|
CALL GETCAMPOS
|
|
LDI AR3,AR0
|
|
CALL CAMCHKLR
|
|
POP AR0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*CAMERA ROTATER
|
|
*PARAMETERS
|
|
* R0 CURRENT ANGLE
|
|
* AR4 PLAYER CAR
|
|
* AR5 CAR BLOCK
|
|
*RETURNS
|
|
* R0 ADJUSTED ANGLE
|
|
CAMROT: PUSH AR0
|
|
PUSH AR2
|
|
LDF R0,R3
|
|
CALL ROADIR ;R0=ROADIR
|
|
ADDF R0,R3,R2
|
|
CALL NORMITS ;FIND DIRECTION
|
|
|
|
ABSF R2,R1 ;STOP OSCILLATION AROUND
|
|
CMPF 0.1,R1
|
|
BGT CAMROT1
|
|
NEGF R2,R1
|
|
B CAMROT2
|
|
CAMROT1
|
|
LDF R2,R2
|
|
LDFN 0.1,R1
|
|
LDFNN -0.1,R1
|
|
CAMROT2
|
|
ADDF R1,R3,R0 ;RETURN R0=ADJUSTED ANGLE
|
|
POP AR2
|
|
POP AR0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*GET NEW CAMERA POSITION
|
|
*PARAMETERS
|
|
* R0 CAMERARAD
|
|
* AR4 PLAYER CAR
|
|
*RETURNS
|
|
* AR3=VECTORA=CAMERAPOS X,Y,Z
|
|
GETCAMPOS:
|
|
PUSHF R0
|
|
PUSH AR2
|
|
LDI @MATRIXAI,AR2 ;GET SOURCE MATRIX
|
|
LDF R0,R2
|
|
CALL FIND_YMATRIX ;LOAD CAMERA MATRIX
|
|
|
|
NEGF @ZOOMD,R2 ;GET ZOOM DISTANCE
|
|
|
|
LDI @VECTORAI,R3
|
|
LDI R3,AR3
|
|
CALL FORWARD
|
|
|
|
LDF *+AR4(OPOSX),R0 ;ADD IN PLAYER CAR POSITION
|
|
SUBF *AR3,R0 ;INVERT X FOR SOME REASON
|
|
STF R0,*AR3 ;X COORD
|
|
|
|
LDF @ZOOMH,R0
|
|
ADDF *+AR4(OPOSY),R0
|
|
ADDF *+AR3(1),R0
|
|
STF R0,*+AR3(1) ;Y COORD
|
|
|
|
LDF *+AR4(OPOSZ),R0
|
|
ADDF *+AR3(2),R0
|
|
STF R0,*+AR3(2) ;Z COORD
|
|
|
|
POP AR2
|
|
POPF R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*CAMERA ADJUST - KEEP IT OUT OF THE GROUND AND BUILDINGS
|
|
*PARAMETERS
|
|
* AR0 CAMERA POSITION XYZ POINTER
|
|
* AR4 PLAYER CAR
|
|
CAMYADJ:
|
|
*ADJUST CAMERA Y
|
|
PUSH AR4
|
|
LDI AR0,AR4 ;POINT TO XYZ OF CAMERA
|
|
CALL CAMSCAN
|
|
LDI AR4,AR0
|
|
POP AR4
|
|
BNC CAM1XX ;NO COLLISION, SKIP IT...
|
|
|
|
FLOAT 133,R1
|
|
SUBF R0,R1
|
|
BLE CAM1XX
|
|
|
|
FLOAT 500,R0 ;OVERPASS BYPASS
|
|
CMPF R0,R1
|
|
BGT CAM1XX
|
|
|
|
NEGF R1
|
|
ADDF *+AR0(1),R1
|
|
STF R1,*+AR0(1) ;CAMERA Y COORD
|
|
CAM1XX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*PUT PLAYER ON ROAD
|
|
*PARAMETERS
|
|
* AR4 PLAYER OBJECT
|
|
* AR5 PLAYER CAR
|
|
PLYONRD:
|
|
LDF 0,R0
|
|
STF R0,*+AR5(CARSPRAD)
|
|
STF R0,*+AR5(CARDROT)
|
|
|
|
LDI 0,R0
|
|
STI R0,*+AR5(CAR_SPIN) ;RESET SPIN FLAG
|
|
STPI R0,@WRECKFLG ;WRECK OFF
|
|
|
|
LDI AR4,AR0 ;GET MATRIX BACK TO NORMAL
|
|
ADDI OMATRIX,AR0
|
|
CALL INITMAT
|
|
|
|
CALL GETTRAK ;GET CLOSEST TRACK SEGMENT
|
|
|
|
LDF *+AR0(OPOSX),R0 ;NEW POSITION
|
|
STF R0,*+AR4(OPOSX)
|
|
|
|
LDF *+AR0(OPOSZ),R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
LDF *+AR0(OPOSY),R0
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
CALL ROADIR ;GET DIRECTION IN R0
|
|
|
|
STF R0,*+AR5(CARYROT)
|
|
STF R0,*+AR5(CARVROT)
|
|
LDF R0,R2
|
|
|
|
NEGF R0
|
|
LDP @_CAMERARAD+Y
|
|
STF R0,@_CAMERARAD+Y ;UPDATE CAMERA YRAD
|
|
SETDP
|
|
|
|
CALL _SINE
|
|
LDF R0,R3
|
|
CALL _COSI
|
|
|
|
FLOAT 722,R1 ;GET LANE DIST
|
|
|
|
MPYF R1,R0
|
|
MPYF R1,R3
|
|
|
|
ADDF *+AR4(OPOSX),R0
|
|
STF R0,*+AR4(OPOSX)
|
|
|
|
ADDF *+AR4(OPOSZ),R3
|
|
STF R3,*+AR4(OPOSZ)
|
|
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*DRONE LOOP
|
|
*PARAMETERS
|
|
* R2 CURRENT STEERING DELTA ANGLE
|
|
* AR4 CAR OBJECT
|
|
* AR5 CAR DATA BLOCK
|
|
* CARBLK STUFF TO LOAD
|
|
* CARTURN ;ANGLE OF FRONT WHEELS (FLOAT)
|
|
* CARTRACTION ;TRACTION COEFFICIENT OF TIRES (FLOAT)
|
|
* CARMAXACCEL ;MAXIMUM ACCEL (PIX/16 MSEC) (FLOAT)
|
|
* CARTHROTTLE ;THROTTLE VALUE 0-1.0 (FLOAT)
|
|
* CARBRAKE ;BRAKING FRICTION (0-1.0) (FLOAT)
|
|
*
|
|
DRONEGO:
|
|
PUSHF R2
|
|
CALL GETAUTO ;GET AUTO TRANS VALUE
|
|
STI R0,*+AR5(CARGEAR) ;DO THE GEAR
|
|
|
|
; LDF 1.0,R0
|
|
; STF R0,@DRAFTVAL ;NO DRAFTING FOR DRONES...
|
|
|
|
CALL GETSPD
|
|
CALL GETSKID
|
|
CALL GETRPM ;GET YOUR REVS
|
|
|
|
*GET CAR DIRECTION DELTA RADIANS
|
|
|
|
POPF R0 ;GET STEERIN ANGLE
|
|
CALL GETDIR
|
|
|
|
PUSHF R0
|
|
CALL DRONINBZ
|
|
POPF R2
|
|
|
|
*GET INCREMENTAL ROTATION MATRIX
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
*FORM NEW ROTATION MATRIX
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
LDI R2,R3
|
|
CALL CONCATMAT
|
|
|
|
*FORM NEW VELOCITY MATRIX
|
|
LDF *+AR5(CARVROT),R2 ;GET VELOCITY MATRIX
|
|
SUBF *+AR5(CARYROT),R2
|
|
|
|
LDI @MATRIXBI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
|
|
LDI AR2,R3
|
|
CALL CONCATMAT
|
|
|
|
LDF *+AR5(CARDIST),R2 ;GET DISTANCE
|
|
LDI @MATRIXBI,AR2
|
|
LDI *+AR5(CAR_AIRB),R0
|
|
BNZ DAIRB ;WERE FLYING
|
|
|
|
*MOVE CAR FORWARD
|
|
LDI AR4,R3
|
|
ADDI OVELX,R3
|
|
CALL FORWARD
|
|
DAIRB
|
|
CALL OVELADD
|
|
|
|
*GET ROAD MATRIX
|
|
DRONESTOP:
|
|
LDI *+AR4(OCARBLK),R3 ;GET CAR DATA AREA
|
|
CALL CAR_ROAD_COLL
|
|
|
|
*GET CAR MATRIX
|
|
LDF *+AR5(CARYROT),R2
|
|
STF R2,*+AR4(ORADY) ;STORE CAR OBJECT RADY
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
*FORM NEW ROTATION MATRIX FOR CAR
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
LDI R2,R3
|
|
CALL CONCATMAT
|
|
|
|
CALL DRONE_RIDE_RIGHT ;GET DISTANCE TO CENTER OF LANE
|
|
STF R0,*+AR5(CARDIST2CNTR)
|
|
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*GEAR RATIO TABLE
|
|
GEARTABI .word GEARTAB
|
|
GEARTAB .float 0.0,0.60,0.35,0.21,0.15
|
|
.BSS ENGVOL,1
|
|
*----------------------------------------------------------------------------
|
|
*GET REV FOR PLAYER CAR
|
|
*PARAMETERS
|
|
* AR4 PLAYER CAR OBJECT
|
|
* AR5 PLAYER CAR STRUCTURE
|
|
GETREV:
|
|
LDI @_MODE,R1 ;ON STARTING LINE?
|
|
TSTB MGO,R1
|
|
BZ REV0 ;YES, NEUTRAL GEAR
|
|
|
|
LDI *+AR5(CARGEAR),R0
|
|
BZ REV0 ;NEUTRAL GEAR
|
|
|
|
LDI *+AR5(CAR_AIRB),R0 ;IN AIR?
|
|
BZ REV1 ;NO... REGULAR REV STUFF
|
|
|
|
*FREE REV NEUTRAL CASE
|
|
REV0
|
|
CALL GETPEDAL ;GET PEDAL 0-1
|
|
MPYF NUM_RPM,R0
|
|
LDF *+AR5(CARRPM),R1
|
|
|
|
FLOATP @NFRAMES,R3
|
|
MPYF 2,R3
|
|
ADDF R3,R1
|
|
LDF R1,R2 ;MAX SLEW RATE LIMIT
|
|
MPYF 2,R3
|
|
SUBF R3,R1 ;MIN SLEW RATE LIMIT
|
|
CMPF R2,R0
|
|
LDFGT R2,R0
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
B REV3
|
|
|
|
*REGULAR IN GEAR CASE
|
|
|
|
REV1
|
|
LDI @GEARTABI,AR0
|
|
ADDI *+AR5(CARGEAR),AR0
|
|
LDF *+AR5(CARSPEED),R0 ;GET SPEED
|
|
MPYF *AR0,R0 ;MULTIPLY BY GEAR RATIO
|
|
REV3
|
|
FIX *+AR5(CARRPM),R1
|
|
STF R0,*+AR5(CARRPM)
|
|
FIX R0,AR0
|
|
|
|
*R1=OLD REV
|
|
*AR0=NEW REV
|
|
|
|
*GET ENGINE VOLUME
|
|
*THROTTLE FACTOR
|
|
|
|
LDF *+AR5(CARTHROTTLE),R0
|
|
MPYF 0.8,R0
|
|
ADDF 0.2,R0
|
|
|
|
*SPEED FACTOR
|
|
|
|
LDF *+AR5(CARSPEED),R2
|
|
MPYF 0.01,R2
|
|
MPYF 0.333,R2
|
|
SUBRF 1.0,R2
|
|
MPYF 0.75,R2
|
|
ADDF 0.25,R2
|
|
CMPF 1.0,R2
|
|
LDFGT 1.0,R2
|
|
CMPF 0,R2
|
|
LDFLT 0,R2
|
|
|
|
MPYF R2,R0
|
|
FLOAT 225,R2
|
|
MPYF R2,R0
|
|
|
|
*REV FACTOR
|
|
LDF *+AR5(CARRPM),R2
|
|
MPYF 0.02,R2
|
|
MPYF 0.5,R2
|
|
ADDF 0.5,R2
|
|
MPYF R2,R0
|
|
FIX R0 ;NEW ENGINE VOLUME
|
|
|
|
*CHECK FOR CHANGE IN REV OR VOLUME
|
|
|
|
CMPI R1,AR0 ;NEW REV?
|
|
BNE REV4 ;NO...
|
|
|
|
LDI @ENGVOL,R1 ;NEW ENGINE VOLUME ?
|
|
SUBI R0,R1
|
|
ABSI R1
|
|
CMPI 4,R1
|
|
RETSLT ;NO... QUIT
|
|
REV4
|
|
LDI R0,R1
|
|
STI R0,@ENGVOL ;STORE NEW VOLUME
|
|
CMPI 0,AR0
|
|
LDILT 0,AR0
|
|
|
|
MPYI 5,AR0
|
|
|
|
LDI AR0,R0 ;SPEED (OF OSCILLATION)
|
|
CMPI 253,R0
|
|
LDIGT 253,R0
|
|
|
|
LDI @_MODE,R2
|
|
AND MSLINE,R2
|
|
BZ REV5
|
|
LSH -4,R1 ;CUT VOLUME ON START LINE
|
|
REV5
|
|
B PLYR_ENGINE ;GO DO IT...
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*GETRPM FOR DRONE CAR
|
|
*PARAMETERS
|
|
* AR4 CAR OBJECT
|
|
* AR5 CAR STRUCTURE
|
|
GETRPM:
|
|
LDI @GEARTABI,AR0
|
|
ADDI *+AR5(CARGEAR),AR0
|
|
LDF *+AR5(CARSPEED),R0 ;GET SPEED
|
|
MPYF *AR0,R0 ;MULTIPLY BY GEAR RATIO
|
|
|
|
CMPF NUM_RPM,R0 ;LIMIT TO RANGE
|
|
LDFGT NUM_RPM,R0
|
|
CMPI 0,R0
|
|
LDILT 0,R0
|
|
STF R0,*+AR5(CARRPM)
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*GET SKID FACTOR
|
|
*PARAMETERS
|
|
* AR4 CAR
|
|
* AR5 CAR BLOCK
|
|
*RETURNS
|
|
* R0 SKID FACTOR
|
|
* 0=NOSKID, 1.0=FULL SKID
|
|
GETSKID:
|
|
*CHECK SPIN OUT
|
|
LDI *+AR5(CAR_SPIN),R0 ;FULL SKID ON SPIN-OUT
|
|
BEQ GETSK00
|
|
LDF 1.00,R0
|
|
B GETSKXX
|
|
*CHECK OVERREV
|
|
GETSK00
|
|
LDI *+AR5(CARGEAR),R0 ;HI GEAR?
|
|
CMPI 4,R0
|
|
BZ GETSK0 ;YES, NO OVERREV...
|
|
|
|
LDF *+AR5(CARRPM),R0
|
|
CMPF OVERREV,R0 ;OVERREV:
|
|
|
|
BLT GETSK0
|
|
LDF 0.80,R0 ;YES DO A SKID
|
|
B GETSKXX
|
|
|
|
*GET STEERING-SPEED SKID
|
|
GETSK0
|
|
LDF *+AR5(CARYROT),R2
|
|
SUBF *+AR5(CARVROT),R2
|
|
CALL NORMITS
|
|
|
|
CMPF 1.2,R2 ;KEEP IN RANGE
|
|
LDFGT 1.2,R2
|
|
|
|
CMPF -1.2,R2
|
|
LDFLT -1.2,R2
|
|
|
|
LDF R2,R0
|
|
MPYF 0.2,R0 ;ADJUST IT DUDE
|
|
|
|
ADDF *+AR5(CARTURN),R0
|
|
ABSF R0
|
|
CMPF 0.3,R0
|
|
LDFGT 0.3,R0 ;MAX IT OUT
|
|
|
|
MPYF *+AR5(CARSPEED),R0
|
|
|
|
*GET LOW SPEED RIPOUT
|
|
|
|
LDF *+AR5(CARTHROTTLE),R1 ;FULL THROTTLE?
|
|
CMPF 0.90,R1
|
|
BLT GETSK1 ;NO
|
|
|
|
|
|
|
|
LDI *+AR5(CARGEAR),R1 ;FULL THROTTLE?
|
|
BZ GETSK1
|
|
CMPI 2,R1
|
|
BGT GETSK1 ;ONLY FIRST GEAR...
|
|
|
|
LDF *+AR5(CARSPEED),R1
|
|
; SUBF 65,R1
|
|
SUBF 100,R1
|
|
|
|
LDFGT 0,R1
|
|
ABSF R1
|
|
MPYF 1.1,R1
|
|
ADDF R1,R0
|
|
GETSK1
|
|
|
|
*GET BRAKE FACTOR
|
|
|
|
LDF *+AR5(CARBRAKE),R1
|
|
MPYF 1.0,R1
|
|
ADDF 1.0,R1
|
|
MPYF R1,R0 ;DOUBLE IT FOR BRAKE DUDE!!!
|
|
|
|
*GET THROTTLE FACTOR
|
|
|
|
LDF *+AR5(CARTHROTTLE),R1
|
|
MPYF 0.25,R1
|
|
ADDF 1.0,R1
|
|
MPYF R1,R0 ;25% BOOST FOR THROTTLE ON
|
|
|
|
SUBF 22,R0
|
|
; SUBF 15,R0
|
|
LDFLT 0,R0 ;NO SKID
|
|
; MPYF 0.05,R0 ;DIVIDE BY 25
|
|
MPYF 0.045,R0 ;DIVIDE BY 25
|
|
GETSKX
|
|
CMPF 1.0,R0
|
|
LDFGT 1.0,R0
|
|
MPYF *+AR5(CARTRACTION),R0 ;GET TRACTION COEFF.
|
|
GETSKXX
|
|
STF R0,*+AR5(CARSKID) ;NEW SKID FACTOR
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*CHECK FOR OFFROAD TIMEOUT
|
|
*PARAMETERS
|
|
* AR5 PLAYER CAR STRUCTURE
|
|
*RETURNS
|
|
* R0 RETURNED WITH OFFROAD TIMER
|
|
CKOFRD:
|
|
LDI AR5,AR3 ;CHECK FOR ALL WHEELS OFF
|
|
ADDI CARPCOL,AR3
|
|
LDI 0,R3
|
|
LDI @OFFROAD_TMR,R0
|
|
LDI 4,RC
|
|
|
|
RPTB OFFRLP
|
|
LDI *AR3++(CARVSIZ),AR0 ;GET ROAD OBJECT INTERSECTING
|
|
LDI *+AR0(OID),R1 ;CHECK OID
|
|
AND CLASS_M+TYPE_M,R1
|
|
CMPI ROAD_C,R1
|
|
BZ NOTOFF
|
|
AND CLASS_M,R1
|
|
CMPI ROAD_C,R1
|
|
LDIZ 1,R3
|
|
CMPI GROUND_C,R1
|
|
OFFRLP LDIZ 1,R3
|
|
|
|
LDI R3,R3 ;ANY GROUND?
|
|
BNE NOTOFFX ;YES
|
|
CMPI 8,R0
|
|
LDILE 0,R0 ;RESET HIM ON 8 IF NO GROUND
|
|
B NOTOFFX
|
|
NOTOFF
|
|
LDI 20,R0
|
|
STI R0,@OFFROAD_TMR ;ALL WHEELS OFFROAD FLAG
|
|
NOTOFFX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*GETDIR-->GET CAR DIRECTION
|
|
*PARAMETERS
|
|
* R0 NEW STEERING DELTA
|
|
* AR4 CAR OBJECT
|
|
* AR5 CAR BLOCK POINTER
|
|
*RETURNS
|
|
* R0 NET STEERING CHANGE
|
|
* CARYROT,CARVROT,CARDROT SET
|
|
*CLOBBERED
|
|
* R1,R2,R3,R4,R5
|
|
GETDIR:
|
|
LDI *+AR5(CAR_AIRF),R1
|
|
BZ GETDIR1
|
|
LDF 0,R0 ;NO STEERING IN AIR
|
|
LDF *+AR5(CARDROT),R1
|
|
ADDF *+AR5(CARYROT),R1
|
|
B GETDIR2
|
|
|
|
GETDIR1
|
|
LDI *+AR5(CAR_SPIN),R1 ;CHECK SPINOUT...
|
|
BNZ CARSPIN
|
|
|
|
*GET SKID FACTOR
|
|
LDF *+AR5(CARSKID),R4 ;R4=SKID FACTOR
|
|
LDF 1.0,R5
|
|
SUBF R4,R5 ;R5=1-SKID FACTOR
|
|
|
|
MPYF 0.75,R5
|
|
ADDF 0.25,R5 ;ADJUST STEER BY .5-1.0 (.5=MAX SKID)
|
|
MPYF R5,R0 ;SKID ADJUSTED STEERING
|
|
|
|
*GET SLIDE DELTA ANGLE
|
|
LDF *+AR5(CARVROT),R3 ;VELOCITY ROTATION
|
|
LDF *+AR5(CARYROT),R1 ;BODY ROTATION
|
|
SUBF R3,R1,R2 ;ROTATIONAL DIFFERENCE
|
|
CALL NORMITS ;NORMALIZE DIFFERENCE
|
|
|
|
*GET RECOVERY FACTOR
|
|
MPYF 0.095,R2
|
|
NEGF R2,R5
|
|
MPYF 0.5,R5
|
|
ADDF R5,R1
|
|
|
|
*GET NEW CARVROT
|
|
ADDF R2,R3 ;ADD IN RECOVERY FACTOR
|
|
ADDF R0,R3 ;ADD IN STEERING FACTOR
|
|
STF R3,*+AR5(CARVROT) ;VELOCITY DIRECTION
|
|
|
|
*GET DELTA BODY MOMENTUM
|
|
MPYF *+AR5(CARDROT),R4 ;BODY DELTA MOMENTUM ON SKID
|
|
MPYF 0.7,R4
|
|
|
|
LDF *+AR5(CARTHROTTLE),R5
|
|
MPYF 0.5,R5
|
|
ADDF 0.5,R5
|
|
MPYF 1.2,R5
|
|
MPYF R5,R4 ;PUMP UP BODY SLIDE...
|
|
|
|
ADDF R4,R0
|
|
|
|
STF R0,*+AR5(CARDROT) ;BODY DELTA
|
|
ADDF R0,R1 ;ADD CARDROT TO CARYROT
|
|
GETDIR2
|
|
STF R1,*+AR5(CARYROT) ;BODY DIRECTION
|
|
RETS
|
|
*
|
|
*CAR SPINOUT
|
|
*
|
|
CARSPIN:
|
|
LDI @NFRAMES,AR3
|
|
SUBI 1,AR3 ;CUT DOWN COUNT
|
|
|
|
CMPI 2,R1 ;TIMED SPIN?
|
|
BLT SPINL0 ;NO...
|
|
|
|
*TIMED SPIN
|
|
SUBI 1,R1 ;DECREMENT TIME
|
|
SUBI AR3,R1
|
|
CMPI 2,R1
|
|
BLE SPINREC ;TIMES UP RECOVER
|
|
STI R1,*+AR5(CAR_SPIN)
|
|
|
|
LDF *+AR5(CARDROT),R1 ;ROTATE THE DUDE
|
|
ADDF *+AR5(CARYROT),R1
|
|
STF R1,*+AR5(CARYROT) ;BODY DIRECTION
|
|
B SPINLX
|
|
*ANGULAR SPIN
|
|
SPINL0
|
|
LDF *+AR5(CARDROT),R1 ;ROTATE THE DUDE
|
|
LDF *+AR5(CARYROT),R2 ;VELOCITY ROTATION
|
|
ADDF R1,R2,R3
|
|
STF R3,*+AR5(CARYROT) ;BODY DIRECTION
|
|
|
|
ABSF R1,R3
|
|
|
|
SUBRF *+AR5(CARSPRAD),R3 ;READY FOR RECOVERY?
|
|
STF R3,*+AR5(CARSPRAD)
|
|
BNN SPINL ;SPIN NOT OVER YET...
|
|
|
|
CALL ROADIR ;GET NEAREST TRACK PIECE ANGLE IN R0
|
|
|
|
*CHECK FOR DRONE
|
|
LDI *+AR4(OID),R1
|
|
AND CLASS_M+SUBTYPE_M,R1
|
|
CMPI DRONE_C+DRNE_RHO,R1
|
|
BNE REGSPIN
|
|
|
|
LDI *+AR4(OID),R1
|
|
AND TYPE_M,R1
|
|
CMPI DEAD_VEH_T,R1 ;CHECK FOR DEAD DRONE
|
|
BNE DRONESPIN ;NOT DEAD
|
|
|
|
LDF *+AR5(CARDROT),R0 ;DECAY SPIN FOR DEAD GUY...
|
|
MPYF 0.98,R0
|
|
ABSF R0,R1
|
|
CMPF 0.04,R1
|
|
LDFLT 0,R0
|
|
STF R0,*+AR5(CARDROT)
|
|
B SPINL
|
|
|
|
DRONESPIN
|
|
ADDF 3.14,R0 ;ADJUST FOR TRAFFIC GOING AGAINST ROAD
|
|
|
|
REGSPIN
|
|
LDF R0,R2
|
|
SUBF *+AR5(CARYROT),R2 ;VELOCITY ROTATION
|
|
CALL NORMITS ;NORMALIZE DIFFERENCE
|
|
|
|
ABSF R2
|
|
CMPF 0.2,R2 ;ROTATIONS CLOSE?
|
|
BLT SPINREC0 ;DO THE RECOVERY...
|
|
SPINL
|
|
DB AR3,SPINL0
|
|
SPINLX
|
|
LDF 0,R0 ;NO STEERING SPIN
|
|
RETS
|
|
|
|
*RECOVER FROM SPIN DUDE
|
|
|
|
SPINREC0
|
|
STF R0,*+AR5(CARYROT) ;LOAD ROAD DIRECTION
|
|
SPINREC
|
|
LDF *+AR5(CARYROT),R2
|
|
CALL NORMIT
|
|
STF R2,*+AR5(CARYROT) ;BODY DIRECTION
|
|
STF R2,*+AR5(CARVROT)
|
|
|
|
LDI 0,R2
|
|
STI R2,*+AR5(CAR_SPIN) ;CLEAR SPIN FLAG
|
|
LDF 0,R0
|
|
STF R0,*+AR5(CARSPRAD) ;CLEAR SPIN RADIANS
|
|
STF R0,*+AR5(CARDROT) ;BODY DELTA
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*GETCARROT- GET OVERROTATION
|
|
GETCARROT:
|
|
PUSH R3
|
|
LDF *+AR5(CARROT),R0 ;GET PREVIOUS VALUE
|
|
|
|
LDF *+AR5(CARTURN),R1
|
|
MPYF -0.5,R1 ;ADJUST VALUE
|
|
|
|
LDI *+AR5(CAR_AIRF),R2 ;NO CHANGE IF IN THE AIR
|
|
LDFNZ R0,R1
|
|
|
|
LDF *+AR5(CARDIST),R2 ;LIMIT ROTATION SLEW RATE BY SPEED
|
|
CMPF 10,R2
|
|
LDFGT 10,R2
|
|
MPYF 0.05,R2
|
|
MPYF 0.1,R2 ;SLEW RATE
|
|
|
|
SUBF R1,R0,R3
|
|
ABSF R3,R3
|
|
CMPF R2,R3 ;DONT CHANGE FOR SMALL VALUE
|
|
BLE GETC1
|
|
|
|
SUBF R1,R0,R3 ;LIMIT TO +-0.05
|
|
BN GETC0
|
|
NEGF R2
|
|
GETC0
|
|
ADDF R2,R0,R1
|
|
GETC1
|
|
|
|
LDI @WRECKFLG,R0
|
|
LDFNZ 0,R1 ;CLEAR CARROT ON WRECK
|
|
|
|
*EXPERIMENTAL CODE
|
|
; LDF 0,R1
|
|
******************
|
|
STF R1,*+AR5(CARROT)
|
|
POP R3
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*ENGINE ACCEL MULTIPLIER TABLE
|
|
*
|
|
GEARACTABI .word GEARACTAB
|
|
GEARACTAB
|
|
.float 0.0,1.7,1.5,1.4,1.2 ;POWER FACTOR GEAR(0-4)
|
|
ENGACTABI .word ENGACTAB
|
|
ENGACTAB
|
|
.float 1.20,1.20,0.50,0.60,0.70 ;0000,0300,0600,0900,1200
|
|
.float 0.80,0.90,1.00,1.00,1.00 ;1500,1800,2100,2400,2700
|
|
.float 1.00,1.00,1.00,1.00,0.90 ;3000,3300,3600,3900,4200
|
|
.float 0.80,0.40,0.20,0.00,0.00 ;4500,4800,5100,5400,5700
|
|
|
|
*ENGINE FRICTION
|
|
ENGFRI .word ENGFR
|
|
ENGFR .float 0.000,0.005,0.003,0.001,0.000 ;GEAR(0-4) ENGINE FRICTION
|
|
|
|
*----------------------------------------------------------------------------
|
|
*GET NEW CAR SPEED
|
|
*
|
|
*PARAMETERS
|
|
* AR4 CAR OBJECT
|
|
* AR5 CAR BLOCK
|
|
*
|
|
GETSPD:
|
|
LDI *+AR5(CAR_AIRB),R0
|
|
BZ GETSPD1 ;NO AIR DUDE...
|
|
*AIRBORNE CASE
|
|
FLOATP @NFRAMES,R0
|
|
MPYF 4,R0 ;GET GRAVITATIONAL ACCEL
|
|
ADDF *+AR4(OVELY),R0
|
|
STF R0,*+AR4(OVELY)
|
|
|
|
LDF 0,R0 ;SET ACCEL, FRICT TO ZERO
|
|
LDF 0,R3
|
|
BR GETSPD2
|
|
|
|
*CHECK SPIN OUT
|
|
GETSPD1
|
|
LDI *+AR5(CAR_SPIN),R0
|
|
BZ GETSPD10 ;NO SPINOUT...
|
|
LDF 0,R0 ;SET ACCEL TO ZERO
|
|
|
|
LDF @SPINFRICI,R3
|
|
BR GETSPD2
|
|
|
|
*GET ENGINE ACCEL
|
|
GETSPD10
|
|
LDF *+AR5(CARTHROTTLE),R0
|
|
MPYF *+AR5(CARMAXACCEL),R0
|
|
|
|
|
|
CMPI @PLYCAR,AR4 ;CHEAT ACCEL
|
|
LDFNZ 1.0,R1
|
|
LDFZ @CHEATACC,R1
|
|
MPYF R1,R0
|
|
|
|
|
|
LDF *+AR5(CARRPM),R1
|
|
MPYF 0.333,R1
|
|
FIX R1,IR0 ;GET TABLE INDEX
|
|
CMPI 18,IR0
|
|
LDIGT 18,IR0 ;KEEP INDEX IN RANGE
|
|
|
|
LDI @ENGACTABI,AR0
|
|
LDF *+AR0(IR0),R2 ;GET LO POWER FACTOR FOR GEAR
|
|
ADDI 1,IR0
|
|
LDF *+AR0(IR0),R3 ;GET HI POWER FACTOR FOR GEAR
|
|
FLOAT IR0,R4
|
|
SUBF R1,R4,R1
|
|
LDFLT 0,R1 ;KEEP FACTOR IN BOUNDS
|
|
CMPF 1.0,R1
|
|
LDFGT 1.0,R1
|
|
|
|
MPYF R1,R2 ;INTERPOLATE !!!
|
|
SUBRF 1.0,R1
|
|
MPYF R1,R3
|
|
ADDF R2,R3,R1
|
|
|
|
LDI *+AR5(CARGEAR),IR0 ;GEAR MULTIPLIER
|
|
LDI @GEARACTABI,AR0
|
|
MPYF *+AR0(IR0),R1
|
|
|
|
LDF 1.0,R2
|
|
LDI *+AR5(CARTRANS),R3
|
|
LDFZ 0.96,R2 ;4% POWER LOSS AUTOMATIC
|
|
MPYF R2,R1
|
|
|
|
*CUT ACCEL ON SKID
|
|
MPYF R1,R0
|
|
|
|
LDF *+AR5(CARSKID),R1 ;CUT DOWN ACCEL ON SKID
|
|
MPYF 0.25,R1 ;ONLY 25% CUT
|
|
SUBRF 1.0,R1
|
|
MPYF R1,R0 ;R0=ENGINE ACCEL
|
|
|
|
*GET GRAVITY ACCEL
|
|
LDF *+AR4(OMAT21),R1 ;ADD IN YOUR GRAVITY ACTION
|
|
LDF 2,R3 ;DEFAULT CONSTANT
|
|
|
|
LDI @_countdown,R2 ;TIMEOUT?
|
|
LDFZ 0,R3 ;YES, NO GRAVITY
|
|
|
|
LDI @_MODE,R2 ;ON START LINE?
|
|
TSTB MGO,R2
|
|
LDFZ 0,R3 ;YIP, NO GRAVITY
|
|
|
|
LDF *+AR5(CARBRAKE),R2 ;BRAKE ON?
|
|
CMPF 0.5,R2
|
|
LDFGT 0,R3 ;YES, NO GRAV
|
|
MPYF R3,R1 ;MULTIPLY BY CONSTANT
|
|
ADDF R1,R0
|
|
|
|
*GET TOTAL FRICTION
|
|
*GET ROAD FRICTION
|
|
LDI AR5,AR3
|
|
ADDI CARPCOL,AR3
|
|
LDF 0,R3
|
|
LDI 4,RC
|
|
|
|
RPTB FRICLP
|
|
LDI *AR3++(CARVSIZ),AR0 ;GET ROAD OBJECT INTERSECTING
|
|
LDI *+AR0(OID),R1 ;CHECK OID
|
|
AND CLASS_M+TYPE_M,R1
|
|
CMPI ROAD_C,R1
|
|
|
|
LDFZ *+AR5(CARRDFR),R2 ;GET ROAD FRICTION
|
|
LDFNZ *+AR5(CAROFRDFR),R2 ;GET OFF ROAD FRICTION
|
|
|
|
; MPYF @DRAFTVAL,R2 ;ADJUST FOR DRAFT
|
|
|
|
FRICLP ADDF R2,R3
|
|
MPYF 0.20,R3 ;TAKE AVERAGE BASED ON WHEELS OFF
|
|
|
|
*JARV CHANGE
|
|
CMPI @PLYCAR,AR4
|
|
BNE FRL1
|
|
LDF @CHEAT,R1
|
|
CMPF 1.09,R1
|
|
BLE FRL1
|
|
ADDF *+AR5(CARRDFR),R3 ;CUT DOWN OFF ROAD FRIC IF BEHIND
|
|
MPYF 0.5,R3
|
|
FRL1
|
|
*JARV ENDCHANGE
|
|
|
|
*GET SKID FRICTION
|
|
LDF *+AR5(CARSKID),R4 ;ADD IN SKID FACTOR
|
|
LDF @SKIDFRICI,R1
|
|
MPYF R1,R4,R5
|
|
|
|
LDF *+AR5(CARSPEED),R2 ;CUT SKID FRICTION FOR LOW SPEED BURNOUT
|
|
CMPF 100,R2
|
|
BGT FRIC0
|
|
|
|
LDF *+AR5(CARTHROTTLE),R2 ;FULL THROTTLE?
|
|
CMPF 0.90,R2
|
|
BLT FRIC0
|
|
|
|
LDI *+AR5(CARGEAR),R2
|
|
CMPI 2,R2
|
|
BLE FRIC1 ;LOW SPEED BURNOUT, NO FRICTION111
|
|
; BZ FRIC1 ;LOW SPEED BURNOUT, NO FRICTION111
|
|
|
|
FRIC0
|
|
ADDF R5,R3
|
|
|
|
*GET BRAKE FRICTION
|
|
FRIC1
|
|
LDF *+AR5(CARBRAKE),R5 ;ADD IN BRAKE FRICTION
|
|
MPYF @BRAKFRICI,R5
|
|
|
|
NEGF R4
|
|
ADDF 1.0,R4 ;BRAKE LOSES EFFECT IN SKID
|
|
MPYF R4,R5
|
|
|
|
LDF 1.0,R4 ;INCREASE BRAKE EFFECTIVENESS AT LO SPD
|
|
LDF *+AR5(CARSPEED),R1
|
|
CMPF 40,R1
|
|
LDFLT 1.5,R4
|
|
CMPF 20,R1
|
|
LDFLT 2.0,R4
|
|
MPYF R4,R5
|
|
|
|
ADDF R5,R3 ;TOTAL FRICTION
|
|
|
|
*GET ENGINE FRICTION
|
|
LDI *+AR5(CARGEAR),IR0
|
|
LDI @ENGFRI,AR0
|
|
LDF *+AR0(IR0),R4
|
|
LDF *+AR5(CARRPM),R5 ;MORE REVS MORE FRICTION
|
|
SUBF 42,R5 ;HEAVY FRICTION ABOVE 3900
|
|
LDFLT 0,R5
|
|
MPYF 0.04,R5
|
|
ADDF 1.0,R5 ;APPROX RANGE 1-2
|
|
MPYF R4,R5
|
|
GETSP22
|
|
ADDF R5,R3
|
|
|
|
*CALC NEW SPEED
|
|
GETSPD2
|
|
LDF 0,R5
|
|
LDF *+AR5(CARSPEED),R1
|
|
LDI @NFRAMES,RC
|
|
CMPI 6,RC ;MAX IT OUT TO BE SAFE
|
|
LDIGT 6,RC
|
|
|
|
SUBI 1,RC
|
|
*R0=ACCEL
|
|
*R1=SPEED
|
|
*R3=TOTAL FRICTION
|
|
*R5=DISTANCE
|
|
*R7=ENGINE FRICTION
|
|
RPTB GSL0
|
|
MPYF R1,R3,R4 ;BRAKE/ROAD/ENGINE FRICTION
|
|
SUBF R4,R1 ;SUBTRACT FRICTION
|
|
ADDF R0,R1 ;ADD ACCEL
|
|
GSL0 ADDF R1,R5 ;ADD TO DISTANCE
|
|
|
|
CMPF 0.5,R5 ;MINIMUM SPEED
|
|
LDFLT 0,R5
|
|
|
|
CMPF 0,R1 ;NO NEGATIVE SPEED
|
|
LDFLT 0,R1
|
|
|
|
MPYF 1.5,R5 ;SPEEDFUDGE
|
|
STF R5,*+AR5(CARDIST) ;SAVE YOUR DISTANCE
|
|
STF R1,*+AR5(CARSPEED) ;NEW SPEED
|
|
RETS
|
|
*
|
|
*GET BRAKE PEDAL
|
|
*RETURNS R0=BRAKE VALUE 0-1 (FLOAT)
|
|
*
|
|
GETBRAKE:
|
|
FLOATP @_pot2,R0
|
|
NEGF @BRAKEMN,R1
|
|
ADDF R1,R0
|
|
CMPF 20,R0
|
|
LDFLT 0,R0
|
|
BLT BRAKEOFF
|
|
|
|
ADDF @BRAKEMX,R1 ;ALL DP RAM IN SAME PAGE
|
|
CALL DIV_F
|
|
CMPF 1.0,R0 ;KEEP IT IN RANGE
|
|
LDFGT 1.0,R0
|
|
CMPF 0,R0 ;KEEP IT IN RANGE
|
|
LDFLT 0,R0
|
|
|
|
MPYF R0,R0 ;SQUARE IT FOR NON-LINEAR FEEL
|
|
|
|
PUSHF R0 ;SAVE THE VALUE
|
|
LDI @BRAKEON,R0
|
|
BNZ GETBX ;BRAKE ALREADY ON
|
|
|
|
CALL _on_brake ;TURN ON FIRST TIME ONLY
|
|
LDI 1,R0
|
|
B GETBXX
|
|
|
|
BRAKEOFF
|
|
PUSHF R0 ;SAVE THE VALUE
|
|
LDI @BRAKEON,R0
|
|
BZ GETBX ;ALREADY OFF DUDES
|
|
|
|
CALL _off_brake
|
|
LDI 0,R0
|
|
GETBXX STI R0,@BRAKEON
|
|
GETBX
|
|
POPF R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
HIREDI .word HIRED
|
|
HIRED RGB 255,0,0
|
|
RGB 230,0,0
|
|
RGB 215,0,0
|
|
RGB 200,0,0
|
|
OFFREDI .word OFFRED
|
|
OFFRED RGB 127,0,0
|
|
RGB 110,0,0
|
|
RGB 105,0,0
|
|
RGB 100,0,0
|
|
*
|
|
*TURN ON/OFF BRAKE LIGHTS
|
|
*
|
|
*PALSET- SETUP PALETTE TRANSFER
|
|
*AR2=SOURCE DATA ADDRESSS
|
|
*R2 =DEST PALETTE(B8-15), DEST COLOR(B0-7)
|
|
*R3 =COUNT
|
|
_off_brake:
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH R2
|
|
PUSH R3
|
|
LDI @BUTTON_STATUS,R2
|
|
ANDN BUT_TAILS,R2
|
|
STI R2,@BUTTON_STATUS
|
|
LDI @OFFREDI,AR2
|
|
PUSH AR2
|
|
BU L888
|
|
_on_brake:
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH R2
|
|
PUSH R3
|
|
LDI BUT_TAILS,R2
|
|
OR @BUTTON_STATUS,R2
|
|
STI R2,@BUTTON_STATUS
|
|
LDI @HIREDI,AR2
|
|
PUSH AR2
|
|
|
|
L888 LDI @CHOOSENCAR,AR0
|
|
MPYI VEHTAB_SIZE,AR0
|
|
ADDI @VEHICLE_TABLEI,AR0
|
|
LDI *+AR0(VEHTAB_TAILCNT),R3
|
|
BZ NO_COLORS
|
|
|
|
LDI *+AR0(VEHTAB_PAL),AR2
|
|
|
|
.if DEBUG
|
|
CMPI 0,AR2
|
|
BEQ $ ;table entry not filled
|
|
.endif
|
|
|
|
CALL PAL_FIND
|
|
ADDI 256,R0
|
|
SUBI R3,R0
|
|
LDI R0,R2
|
|
|
|
POP AR2
|
|
CALL PAL_SET
|
|
|
|
BRAK_X POP R3
|
|
POP R2
|
|
POP AR2
|
|
POP AR0
|
|
RETS
|
|
NO_COLORS
|
|
POP AR2
|
|
BU BRAK_X
|
|
*----------------------------------------------------------------------------
|
|
*GET GAS PEDAL
|
|
*RET R0=GAS PEDAL 0-1 FRACTION
|
|
GETPEDAL:
|
|
FLOATP @_pot1,R0
|
|
NEGF @PEDALMN,R1
|
|
ADDF R1,R0
|
|
CMPF 5,R0
|
|
LDFLT 0,R0 ;GET RID OF CREEP AND NEGATIVES
|
|
ADDF @PEDALMX,R1
|
|
CALL DIV_F
|
|
CMPF 1.0,R0 ;KEEP IT IN RANGE
|
|
LDFGT 1.0,R0
|
|
RETS
|
|
*GET GEAR SHIFT
|
|
*AR4=CAR OBJECT
|
|
*AR5=CAR STRUCTURE
|
|
*RETURNS:
|
|
*R0=GEAR SHIFT VALUE 0=neutral,1,2,3,4 (INT)
|
|
GETGEAR:
|
|
LDI *+AR5(CARTRANS),R0
|
|
BNZ GETMAN
|
|
|
|
LDI @SUSPEND_MODE,R0 ;SUSPEND MODE?
|
|
CMPI SM_HALT,R0
|
|
BNZ GETAUTO ;NO
|
|
LDI *+AR5(CARGEAR),R0 ;YES, DONT SWITCH AUTO TRANS
|
|
RETS
|
|
*MANUAL
|
|
GETMAN:
|
|
LDI 0,R0
|
|
LDI @SWITCHBUTS,R1
|
|
TSTB SW_4TH,R1
|
|
LDINZ 4,R0
|
|
TSTB SW_3RD,R1
|
|
LDINZ 3,R0
|
|
TSTB SW_2ND,R1
|
|
LDINZ 2,R0
|
|
TSTB SW_1ST,R1
|
|
LDINZ 1,R0
|
|
RETS
|
|
*AUTOMATIC
|
|
*AR4=CAR OBJECT
|
|
*AR5=CAR STRUCTURE
|
|
*RETURNS:
|
|
*R0=GEAR SHIFT VALUE 0=neutral,1,2,3,4 (INT)
|
|
GETAUTO:
|
|
LDI 0,R2
|
|
LDF *+AR5(CARTHROTTLE),R3 ;TORQUE SENSOR FOR DOWNSHIFT
|
|
CMPF 1.0,R3
|
|
LDFGT 1.0,R3
|
|
MPYF 11,R3
|
|
FIX R3
|
|
ADDI 12,R3
|
|
|
|
LDI *+AR5(CARGEAR),R0
|
|
FIX *+AR5(CARRPM),R1
|
|
CMPI R3,R1
|
|
LDILT -1,R2 ;DOWNSHIFT
|
|
ADDI 18,R3
|
|
CMPI R3,R1
|
|
LDIGT 1,R2 ;UPSHIFT
|
|
ADDI R2,R0
|
|
|
|
CMPI 1,R0
|
|
LDILT 1,R0
|
|
CMPI 4,R0
|
|
LDIGT 4,R0 ;MAX OUT AT 4TH
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
STEERI .float -0.0013
|
|
*GET STEERING ANGLE
|
|
*AR5=CAR STRUCTURE
|
|
*RET R0= STEERING ANGLE
|
|
* SETS CARTURN VALUE
|
|
GETSTEER:
|
|
LDI ADJ_STEERING_SENSITIVITY,AR2 ;GET DIFFICULTY ADJUST
|
|
CALL ADJUSTMENT_READ ;R0 = 0-5 (int)
|
|
|
|
FLOAT R0,R4
|
|
FLOAT R0,R6
|
|
SUBRF 5,R4
|
|
MPYF 0.06,R4
|
|
ADDF 0.5,R4
|
|
LDF R4,R5
|
|
SUBRF 1.0,R5
|
|
|
|
FLOAT @_pot0,R0 ;GET POT VALUE
|
|
SUBF @STEERCT,R0 ;SUBTRACT CENTER VALUE
|
|
|
|
LDF @STEERFR,R1
|
|
MPYF 0.5,R1
|
|
CALL DIV_F
|
|
|
|
CMPF -1,R0 ;LIMIT CHECK
|
|
LDFLT -1,R0
|
|
|
|
CMPF 1,R0 ;LIMIT CHECK
|
|
LDFGT 1,R0
|
|
|
|
MPYF 0.02,R6 ;DESENSITIZE
|
|
ADDF 0.90,R6
|
|
MPYF R6,R0
|
|
|
|
ABSF R0,R1 ;SQUARE IT KEEPING SIGN
|
|
MPYF R0,R1
|
|
|
|
MPYF R4,R1 ;RATIO OF STEERING VALUE SQUARED
|
|
MPYF R5,R0 ;RATIO OF REGULAR
|
|
|
|
; MPYF 0.5,R1 ;AVERAGE WITH REGULAR
|
|
; MPYF 0.5,R0
|
|
ADDF R1,R0
|
|
|
|
LDF R0,R1
|
|
MPYF -0.3,R1 ;FUDGE FACTOR FOR WHEEL TURN ANGLE
|
|
STF R1,*+AR5(CARTURN) ;STORE WHEEL TURN VALUE
|
|
|
|
LDF *+AR5(CARSPEED),R1
|
|
LDF R1,R2
|
|
|
|
MPYF R1,R1
|
|
MPYF 0.0125,R1
|
|
CMPF 5,R1 ;LIMIT LO SPEED KICK
|
|
LDFGT 5,R1
|
|
|
|
MPYF 0.0625,R2 ;HIGH SPEED KICK
|
|
CMPF 15,R2
|
|
LDFGT 15,R2
|
|
ADDF R2,R1
|
|
MPYF R1,R0
|
|
|
|
FLOATP @NFRAMES,R1
|
|
MPYF R1,R0
|
|
MPYF @STEERI,R0
|
|
RETS
|
|
*
|
|
*VIEW SWITCHES
|
|
*ZOOM TO FIRST PERSON
|
|
*
|
|
_VIEW0:
|
|
FLOAT PLYPOS1Z,R4 ;Z DIST
|
|
FLOAT PLYPOS1Y,R5 ;Y DIST
|
|
LDI 0,R2 ;CAMVIEW STATUS
|
|
LDI BUT_VIEW1,R3
|
|
B ZOOM
|
|
_VIEW1:
|
|
FLOAT PLYPOS2Z,R4 ;Z DIST
|
|
FLOAT PLYPOS2Y,R5 ;Y DIST
|
|
LDI 1,R2 ;CAMVIEW STATUS
|
|
LDI BUT_VIEW2,R3
|
|
B ZOOM
|
|
_VIEW2:
|
|
FLOAT PLYPOS3Z,R4 ;Z DIST
|
|
FLOAT PLYPOS3Y,R5 ;Y DIST
|
|
LDI 2,R2 ;CAMVIEW STATUS
|
|
LDI BUT_VIEW3,R3
|
|
|
|
*R2=VIEW (0-2)INT
|
|
*R3=BUTTON LITE MASK
|
|
*R4=PLYPOSZ FL
|
|
*R5=PLYPOSY FL
|
|
ZOOM:
|
|
LDI @_MODE,R0
|
|
AND MMODE,R0
|
|
CMPI MGAME,R0
|
|
BNE SUICIDE ;DIE IF NOT IN GAME MODE
|
|
|
|
CMPI @CAMVIEW,R2
|
|
BEQ SUICIDE ;DIE IF SAME MODE
|
|
|
|
LDILT VIEW2IN,AR2
|
|
LDIGE VIEW2OUT,AR2
|
|
CALL ONESNDFX
|
|
|
|
LDI @BUTTON_STATUS,R0 ;LITE YOUR LITE
|
|
ANDN BUT_VIEWS,R0
|
|
OR R3,R0
|
|
STI R0,@BUTTON_STATUS
|
|
|
|
STF R4,@ZOOMDG ;STORE GOAL X
|
|
STF R5,@ZOOMHG ;STORE GOAL Y
|
|
|
|
SUBF @ZOOMD,R4
|
|
MPYF ZOOMRATIO,R4
|
|
|
|
SUBF @ZOOMH,R5
|
|
MPYF ZOOMRATIO,R5
|
|
|
|
LDF 1,R0
|
|
ABSF R4,R6
|
|
CMPF 25,R6 ;PUMP UP FOR LOW ZOOM RATE
|
|
LDFLT 4,R0
|
|
MPYF R0,R4
|
|
MPYF R0,R5
|
|
|
|
STF R4,@ZOOMDD
|
|
STF R5,@ZOOMHD
|
|
|
|
LDI @CAMVIEW,R3 ;CHANGE FROM FIRST PERSON ?
|
|
STI R2,@CAMVIEW ;SAVE NEW CAMERA VIEW
|
|
BNZ ZOOMX ;NO...
|
|
|
|
LDI @PLYCAR,AR2
|
|
LDI *+AR2(OFLAGS),R0 ;CHECK IF ALREADY ON LIST
|
|
TSTB O_LIST_M,R0
|
|
CALLZ OBJ_INSERT ;INSERT PLAYER OBJECT
|
|
ZOOMX
|
|
CALL ZOOMUP
|
|
BR SUICIDE ;CAN IT DUDES
|
|
*----------------------------------------------------------------------------
|
|
*UPDATE YOUR ZOOM JIVE
|
|
ZOOMUP:
|
|
LDF @ZOOMDD,R2
|
|
BZ ZOOMUPX ;NO ACTIVE ZOOM, SKIP IT
|
|
|
|
BND ZOOMUP1
|
|
LDF @ZOOMH,R1
|
|
ADDF @ZOOMHD,R1
|
|
ADDF @ZOOMD,R2
|
|
;------->BND ZOOMUP1
|
|
|
|
CMPF @ZOOMDG,R2
|
|
BGE ZOOMDN ;DONE WITH ZOOM
|
|
B ZOOMUP3
|
|
ZOOMUP1
|
|
CMPF @ZOOMDG,R2
|
|
BGT ZOOMUP3 ;NOT DONE WITH ZOOM
|
|
|
|
ZOOMDN LDI @CAMVIEW,R0 ;FIRST PERSON DONE?
|
|
BNZ ZOOMDN1 ;NO..
|
|
|
|
LDI @PLYCAR,AR2
|
|
CALL OBJ_PULL ;CAN THE CAR
|
|
|
|
ZOOMDN1 LDF 0,R0
|
|
STF R0,@ZOOMDD ;CLEAR OUT VELOCITIES
|
|
STF R0,@ZOOMHD
|
|
LDF @ZOOMDG,R2
|
|
LDF @ZOOMHG,R1
|
|
ZOOMUP3 STF R1,@ZOOMH ;UPDATE POSITION
|
|
STF R2,@ZOOMD
|
|
ZOOMUPX RETS
|
|
*----------------------------------------------------------------------------
|
|
*GETTRAK GET NEAREST TRACK SECTION
|
|
*PARAMETERS
|
|
* AR4 OBJECT
|
|
* AR5 STRUCTURE
|
|
*RETURNS
|
|
* AR0 TRACK SEGMENT STORED IN AR5(CARTRAK)
|
|
*CLOBBERS
|
|
* AR2,R0,R3,R4
|
|
GETTRAK:
|
|
LDI 0,AR0 ;CLOSEST ROAD SEGMENT INDEX
|
|
LDI @DYNALIST_BEGIN,R0
|
|
BZ GETRKX ;NULL LIST DUDES
|
|
|
|
PUSH IR0
|
|
LDI OPOSZ,IR0
|
|
FLOAT 7FFFH,R2 ;INITIAL CLOSEST DISTANCE
|
|
MPYF R2,R2
|
|
|
|
LDF *+AR4(OPOSX),R3
|
|
LDF *+AR4(OPOSZ),R4
|
|
LDI R0,AR2
|
|
GETRK
|
|
SUBF *+AR2(OPOSX),R3,R0
|
|
MPYF R0,R0
|
|
|
|
SUBF *+AR2(IR0),R4,R1
|
|
MPYF R1,R1
|
|
ADDF R0,R1
|
|
|
|
CMPF R1,R2
|
|
LDIGT AR2,AR0
|
|
LDFGT R1,R2
|
|
GETRKL
|
|
LDI *+AR2(OLINK4),R0
|
|
BNZD GETRK
|
|
|
|
LDI R0,AR2
|
|
NOP
|
|
NOP
|
|
;----> BNZ GETRK
|
|
STI AR0,*+AR5(CARTRAK) ;SAVE TRACK SECTION
|
|
POP IR0
|
|
GETRKX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*CHECK IF DRIVING BACKWARDS
|
|
*PARAMETERS
|
|
* AR4 CAR
|
|
* AR5 CAR STRUCTURE
|
|
BACKCK
|
|
LDI *+AR5(CAR_SPIN),R0
|
|
BNE BACKCKX
|
|
|
|
LDF *+AR5(CARSPEED),R4 ;MUST BE MOVING SOMEWHAT
|
|
CMPF 2,R4
|
|
BLT BACKCKX
|
|
|
|
CALL ROADIR ;GET DIRECTIONAL DIFFERENCE
|
|
LDF *+AR5(CARVROT),R1
|
|
SUBF R1,R0,R2
|
|
CALL NORMITS
|
|
|
|
ABSF R2,R3 ;VELOCITY BACKWARDS?
|
|
CMPF 1.75,R3
|
|
BLT BACKCKX ;NO...
|
|
BACKCK1
|
|
LDF 1.0,R0 ;SET RADIAN SPIN COUNT
|
|
STF R0,*+AR5(CARSPRAD)
|
|
|
|
LDF 0.12,R0 ;ROTATE AROUND
|
|
LDF R2,R2
|
|
LDFN -0.12,R0
|
|
|
|
LDI 1,R1
|
|
BACKCK2
|
|
STF R0,*+AR5(CARDROT) ;SPIN HIM BACK
|
|
STI R1,*+AR5(CAR_SPIN)
|
|
BACKCKX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*CHECK OUT OF BOUNDS
|
|
*PARAMETERS
|
|
* AR4 CAR
|
|
* AR5 CAR DATA BLOCK
|
|
*RETURNS
|
|
* CS IF ANY WHEEL OUT OF BOUNDS
|
|
* NC IN BOUNDS
|
|
*R0 0 = ONROAD
|
|
* NE= OFFROAD
|
|
*TRASHES R0,R1,RC
|
|
CKBND:
|
|
PUSH AR3
|
|
PUSH AR0
|
|
LDI CARVNUM-2,RC ;CHECK ALL WHEELS
|
|
LDI AR5,AR3
|
|
ADDI CARPCOL+CARVSIZ,AR3
|
|
LDI 0,R1
|
|
|
|
RPTB CURBCKL
|
|
LDI *AR3++(CARVSIZ),R0 ;GET ROAD OBJECT INTERSECTING
|
|
BZ CURBCKX ;WE GOT NOTHING, COLLIDE 'EM
|
|
|
|
LDI R0,AR0
|
|
LDI *+AR0(OID),R0 ;CHECK OID
|
|
AND CLASS_M,R0
|
|
CMPI ROAD_C,R0 ;ROAD/SHOULDER TYPE?
|
|
CURBCKL LDINZ 1,R1
|
|
|
|
CLRC
|
|
POP AR0
|
|
POP AR3
|
|
LDI R1,R1
|
|
RETS
|
|
|
|
CURBCKX
|
|
SETC
|
|
POP AR0
|
|
POP AR3
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*CHECK CRAWL UP TUNNEL WALLS
|
|
*PARAMETERS
|
|
* AR4 CAR OBJECT
|
|
* AR5 CAR BLOCK
|
|
TUNCHK:
|
|
LDI @_MODE,R0 ;IN TUNNEL?
|
|
TSTB MINTUNNEL,R0
|
|
RETSZ ;NO, EXIT
|
|
|
|
LDI @WRECKFLG,R0 ;WRECK ON?
|
|
RETSNZ ;NO, EXIT
|
|
|
|
LDF *+AR4(OMAT11),R0 ;PLAYER TOO STEEP?
|
|
CMPF 0.50,R0
|
|
RETSGT ;NO...
|
|
|
|
CALL GETNXTRDIR ;YES, SPIN HIM TO CENTER
|
|
LDF R0,R2
|
|
CALL ROADIR
|
|
ADDF R0,R2
|
|
MPYF 0.5,R2
|
|
CALL NORMITS
|
|
STF R2,*+AR5(CARVROT)
|
|
|
|
CALL ROADIR
|
|
SUBF *+AR5(CARYROT),R0
|
|
LDF R0,R2
|
|
CALL NORMITS
|
|
LDF R2,R0
|
|
LDF 15,R1
|
|
CALL DIV_F
|
|
|
|
STF R0,*+AR5(CARDROT) ;ROTATE TOWARD ROAD SLOWLY
|
|
LDI 15,R0
|
|
STI R0,*+AR5(CAR_SPIN)
|
|
LDF 0,R0
|
|
STF R0,*+AR5(CARSPRAD)
|
|
LDF *+AR5(CARSPEED),R0
|
|
CMPF 40,R0
|
|
LDFLT 40,R0
|
|
STF R0,*+AR5(CARSPEED)
|
|
TUNCHKX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*CHECK CURB COLLISION
|
|
*KEEP ON ROAD
|
|
*PARAMETERS
|
|
* AR4 CAR
|
|
* AR5 CAR DATA BLOCK
|
|
INBOUNDZ:
|
|
LDI @_MODE,R1 ;WAITING FOR START?
|
|
TSTB MGO,R1
|
|
BZ CURBCLX ;YES, EXIT
|
|
|
|
CALL TUNCHK ;KEEP DUDE OFF TUNNEL WALLS
|
|
|
|
CALL CKBND
|
|
BC CURBCOL0 ;OUT OF BOUNDS
|
|
BNE SOFTCURB ;SOFT REPELL OFFROAD
|
|
CURBCKLX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*KEEP DRONE INBOUNDS
|
|
*PARAMETERS
|
|
* AR4 CAR
|
|
* AR5 CAR DATA BLOCK
|
|
DRONINBZ:
|
|
LDI *+AR4(ODIST),R0
|
|
ASH -1,R0
|
|
CMPI 32000,R0 ;IS DUDE CLOSE?
|
|
BGT DRONINBX ;NO, FORGET IT
|
|
|
|
LDI @_MODE,R1 ;WAITING FOR START?
|
|
TSTB MGO,R1
|
|
BZ DRONINBX ;YES, EXIT
|
|
|
|
CALL CKBND
|
|
BC CURBCOL0 ;OUT OF BOUNDS
|
|
DRONINBX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*WE HIT A CURB DUDES
|
|
*HARD WALL REFLECT SPIN-OUT
|
|
CURBCOL0:
|
|
LDI *+AR4(OID),R0 ;PLAYER?
|
|
AND CLASS_M,R0
|
|
CMPI PLYR_C,R0
|
|
BZ CURBCOLP ;YES
|
|
|
|
*DRONE HIT SOUND
|
|
LDI @WALLHITABI,AR2 ;MAKE A DRONE SOUND
|
|
LDI 3,R0
|
|
CALL DRONESND
|
|
|
|
LDF *+AR5(CARSPEED),R0 ;SLOW DOWN DRONE
|
|
MPYF 0.80,R0
|
|
STF R0,*+AR5(CARSPEED)
|
|
|
|
B CURBCOL
|
|
*PLAYER HIT SOUND
|
|
CURBCOLP
|
|
LDI @WALLHITABI,AR2 ;MAKE A SOUND
|
|
LDI 3,R0
|
|
CALL RANDSND
|
|
CURBCOL
|
|
CALL GETNXTRDIR ;DIRECTION CAR TO NEXT ROAD SEG.
|
|
LDF R0,R4
|
|
CALL ROADIR ;REFLECT VELOCITY
|
|
SUBF R4,R0,R2
|
|
CALL NORMITS
|
|
LDF R2,R3
|
|
|
|
LDF *+AR5(CARVROT),R1
|
|
SUBF R1,R0,R2
|
|
CALL NORMITS
|
|
|
|
*KICK DUDE BACK INSTANTLY
|
|
*R0=ROADIR
|
|
*R2=ROADIR-CARVROT
|
|
|
|
PUSHF R2
|
|
PUSHF R0
|
|
|
|
LDF *+AR5(CARSPEED),R2
|
|
CMPF 15,R2
|
|
LDFLT 15,R2
|
|
STF R2,*+AR5(CARSPEED) ;MIN SPEED
|
|
|
|
FLOATP @NFRAMES,R5
|
|
MPYF R2,R5 ;TOTAL DISTANCE TRAVELED
|
|
|
|
LDF -1.57,R4
|
|
|
|
LDF R3,R3
|
|
|
|
LDFN 1.57,R4
|
|
ADDF R4,R0,R2 ;REPELL DIRECTION
|
|
PUSHF R2
|
|
|
|
SUBF R1,R2 ;FIND DIFFERENCE
|
|
CALL _SINE
|
|
ABSF R0
|
|
MPYF R0,R5 ;ADJUST VELOCITY FOR PENETRATION ANGLE
|
|
|
|
POPF R2
|
|
CALL _COSI
|
|
MPYF R0,R5,R4
|
|
CALL _SINE
|
|
NEGF R0 ;-SIN
|
|
MPYF R0,R5,R5
|
|
|
|
ADDF *+AR4(OPOSX),R5 ;ADJUST X
|
|
STF R5,*+AR4(OPOSX)
|
|
|
|
ADDF *+AR4(OPOSZ),R4 ;ADJUST Z
|
|
STF R4,*+AR4(OPOSZ)
|
|
|
|
CALL WALL_SPARK
|
|
|
|
POPF R0
|
|
POPF R2
|
|
|
|
*REFLECT VELOCITY
|
|
XOR R2,R3 ;CHECK IF ALREADY GOING THE RIGHT WAY
|
|
|
|
BN CURBCOL1 ;MOVING IN RIGHT DIRECTION
|
|
NEGF R2 ;NEED TO REFLECT VELOCITY
|
|
CURBCOL1
|
|
|
|
LDI *+AR5(CAR_SPIN),R1 ;ALREADY SPINNING?
|
|
BNZ CURBSPIN ;YES, SPIN SOME MORE...
|
|
|
|
ABSF R2,R3
|
|
|
|
CURBCOL1A
|
|
CMPF 1.2,R3
|
|
BGT CURBSPIN ;YES, SPIN THE DUDE
|
|
|
|
CMPF 0.4,R3 ;HARD BOUNCE?
|
|
BGT CURBSPN ;YES, SPIN THE DUDE
|
|
|
|
MPYF 0.3,R2 ;CUT DOWN BOUNCE
|
|
MPYF 0.3,R3 ;CUT DOWN BOUNCE
|
|
|
|
CMPF 0.03,R3 ;MINIMUM KICKOUT
|
|
BGE CURBCOL2A
|
|
LDF R2,R2
|
|
LDFLT -0.03,R2
|
|
LDFGT 0.03,R2
|
|
CURBCOL2A
|
|
CMPF 0.06,R3 ;MAXIMUM KICKOUT
|
|
BLE CURBCOL2
|
|
LDF R2,R2
|
|
LDFLT -0.06,R2
|
|
LDFGT 0.06,R2
|
|
CURBCOL2
|
|
ADDF R0,R2
|
|
STF R2,*+AR5(CARVROT)
|
|
STF R2,*+AR5(CARYROT) ;ADJUST YROT <--- CARVROT
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
CURBSPIN:
|
|
ADDF R0,R2
|
|
STF R2,*+AR5(CARVROT)
|
|
|
|
LDF R0,R2
|
|
SUBF *+AR5(CARYROT),R2 ;CHECK YROT-ROAD DIRECTION
|
|
CALL NORMITS
|
|
LDF 0.025,R0 ;RANDOM ROTATION VALUE
|
|
CALL FRAND
|
|
ADDF 0.075,R0
|
|
LDF R2,R2 ;CHECK SIGN
|
|
BN CURBSPIN1
|
|
NEGF R0
|
|
CURBSPIN1
|
|
STF R0,*+AR5(CARDROT) ;BODY DELTA
|
|
|
|
ABSF R2 ;CORRECTION FACTOR
|
|
ADDF 0.1,R2
|
|
LDF R2,R1
|
|
|
|
CMPF 1.0,R2 ;HARD HIT?
|
|
LDFGT 3.14,R1 ;YES...
|
|
|
|
LDF *+AR5(CARSPEED),R0
|
|
CMPF 30,R0
|
|
LDFLT R2,R1
|
|
|
|
STF R1,*+AR5(CARSPRAD) ;GO AROUND AT LEAST HALFWAY
|
|
|
|
LDI 1,R1
|
|
STI R1,*+AR5(CAR_SPIN)
|
|
CURBCLX RETS
|
|
*----------------------------------------------------------------------------
|
|
*SHORT CORRECTION SPIN
|
|
CURBSPN:
|
|
ADDF R0,R2
|
|
STF R2,*+AR5(CARVROT)
|
|
|
|
LDF R0,R2
|
|
SUBF *+AR5(CARYROT),R2 ;CHECK YROT-ROAD DIRECTION
|
|
CALL NORMITS
|
|
|
|
ABSF R2,R3
|
|
STF R3,*+AR5(CARSPRAD) ;SPIN THIS MUCH DUDES
|
|
|
|
MPYF 0.10,R2
|
|
STF R2,*+AR5(CARDROT) ;BODY DELTA
|
|
|
|
LDI 1,R1
|
|
STI R1,*+AR5(CAR_SPIN)
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*SOFT CURB HIT
|
|
*
|
|
SOFTCURB:
|
|
CALL ROADIR
|
|
LDF R0,R1
|
|
|
|
CALL GETNXTRDIR ;DIRECTION CAR TO NEXT ROAD SEG.
|
|
SUBF R1,R0,R2
|
|
CALL NORMITS
|
|
|
|
LDF R2,R4 ;CHECK DIRECTION
|
|
LDFN -0.1,R5 ;GET RELATIVE ANGLE
|
|
LDFNN 0.1,R5
|
|
|
|
LDI *+AR5(CAR_SPIN),R0 ;ALREADY SPINNING?
|
|
BZ SOFTCURB0 ;NO
|
|
|
|
CMPI 2,R0 ;TIMED SPIN?
|
|
BGE SOFTCRB00 ;YES
|
|
|
|
LDF *+AR5(CARVROT),R0 ;REFLECT THE MOTHER OUT
|
|
SUBF R1,R0,R2
|
|
CALL NORMITS
|
|
|
|
ABSF R2
|
|
CMPF 0.1,R2 ;MINIMUM REFLECT
|
|
LDFLT 0.1,R2
|
|
|
|
LDF R4,R4
|
|
LDFN -1,R5 ;GET RELATIVE ANGLE
|
|
LDFNN 1,R5
|
|
MPYF R5,R2
|
|
ADDF R1,R2
|
|
STF R2,*+AR5(CARVROT)
|
|
RETS
|
|
|
|
SOFTCRB00
|
|
LDF *+AR5(CARSPEED),R0 ;TIMED SPIN
|
|
CMPF 80,R0
|
|
BLT SOFTVELX ;SLOW TREECOL FIX
|
|
B SOFTVEL ;FAST, NEEDS CORRECTION
|
|
|
|
*CHECK BODY ROTATION
|
|
SOFTCURB0
|
|
LDF *+AR5(CARYROT),R0
|
|
SUBF R1,R0,R2
|
|
CALL NORMITS
|
|
|
|
LDF R4,R4
|
|
BN SOFT10 ;DELTA IS NEGATIVE
|
|
|
|
SUBF R2,R5,R6
|
|
BLT SOFTVEL ;ROTATION IS O.K.
|
|
|
|
CMPF 0.1,R6 ;MAX DELTA
|
|
LDFGT 0.1,R6
|
|
B SOFT11
|
|
SOFT10
|
|
SUBF R2,R5,R6
|
|
BGT SOFTVEL ;ROTATION IS O.K.
|
|
|
|
CMPF -0.1,R6 ;MAX DELTA
|
|
LDFLT -0.1,R6
|
|
SOFT11
|
|
ADDF *+AR5(CARYROT),R6 ;ADD IN ROTATION
|
|
STF R6,*+AR5(CARYROT)
|
|
|
|
*CHECK VELOCITY ROTATION
|
|
SOFTVEL LDF *+AR5(CARSPEED),R0 ;MINIMUM SPEED
|
|
CMPF 20,R0
|
|
LDFLT 20,R0
|
|
STF R0,*+AR5(CARSPEED)
|
|
|
|
LDF *+AR5(CARVROT),R0
|
|
SUBF R1,R0,R2
|
|
CALL NORMITS
|
|
|
|
ABSF R2,R3
|
|
CMPF 0.6,R3
|
|
BLT SOFTV1
|
|
|
|
LDF R1,R0 ;ROADIR->R0
|
|
LDF *+AR5(CARVROT),R1
|
|
SUBF R1,R0,R2
|
|
B CURBCOL1A
|
|
SOFTV1 LDF R4,R4
|
|
BN SOFT20 ;DELTA IS NEGATIVE
|
|
|
|
SUBF R2,R5
|
|
BLT SOFTVELX ;ROTATION IS O.K.
|
|
|
|
CMPF 0.1,R5 ;MAX DELTA
|
|
LDFGT 0.1,R5
|
|
B SOFT21
|
|
SOFT20 SUBF R2,R5
|
|
BGT SOFTVELX ;ROTATION IS O.K.
|
|
|
|
CMPF -0.1,R5 ;MAX DELTA
|
|
LDFLT -0.1,R5
|
|
SOFT21 ADDF *+AR5(CARVROT),R5 ;ADD IN ROTATION
|
|
STF R5,*+AR5(CARVROT)
|
|
SOFTVELX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*GET DIRECTION TO NEXT ROAD SEGMENT FROM CAR
|
|
*
|
|
GETNXTRDIR:
|
|
LDI *+AR5(CARTRAK),AR2 ;GET CLOSEST TRACK PIECE
|
|
LDI *+AR2(OLINK4),AR0 ;GET NEXT ONE
|
|
LDI AR4,AR2
|
|
B GETRD1
|
|
*GET ROAD-CAR ANGLE
|
|
*AR2=ROAD SEGMENT OBJECT
|
|
*AR4=CAR OBJECT
|
|
*RET R0 = RADIANS (FLOAT)
|
|
*CLOBBERS AR0
|
|
GETRDCAR:
|
|
LDI AR4,AR0
|
|
B GETRD1
|
|
*GET ROAD DIRECTION
|
|
*AR5=CARBLOCK
|
|
*RET R0 = RADIANS (FLOAT)
|
|
*CLOBBERS AR0,AR2
|
|
ROADIR:
|
|
LDI *+AR5(CARTRAK),R0 ;GET CLOSEST TRACK PIECE
|
|
BZ ROADIRX ;NO TRACK PIECE, EXIT
|
|
LDI R0,AR2
|
|
*GET ROAD DIRECTION
|
|
*AR2=ROAD SEGMENT OBJECT
|
|
*RET R0 = RADIANS (FLOAT)
|
|
*CLOBBERS AR0
|
|
GETRDIR:
|
|
LDI *+AR2(OLINK4),AR0
|
|
GETRD1 PUSH R2
|
|
PUSH R3
|
|
PUSHF R2
|
|
PUSHF R3
|
|
LDF *+AR0(OPOSX),R2
|
|
SUBF *+AR2(OPOSX),R2
|
|
LDF *+AR0(OPOSZ),R3
|
|
SUBF *+AR2(OPOSZ),R3
|
|
CALL ARCTANF
|
|
|
|
POPF R3
|
|
POPF R2
|
|
POP R3
|
|
POP R2
|
|
SUBF HALFPI,R0
|
|
ROADIRX RETS
|
|
*----------------------------------------------------------------------------
|
|
.bss WHLTIM,1
|
|
.bss WHLOLD,1
|
|
*PLAYER WHEEL ROUTINE
|
|
*PARAMETERS
|
|
* AR4 OBJECT
|
|
* AR5 CAR STRUCTURE
|
|
PLYRWHL:
|
|
LDF @STEERCT,R4 ;STEERING CENTER
|
|
LDI @WHLTIM,R3
|
|
LDI @WHLOLD,R5
|
|
LDI 0,R2
|
|
LDI 0,R1
|
|
LDI *+AR5(RF_PCOL),R0 ;Right front collide with curb?
|
|
BZ PWHL0
|
|
LDI R0,AR0
|
|
LDI *+AR0(OID),R0
|
|
AND CLASS_M+TYPE_M,R0
|
|
CMPI ROAD_C+SHLDR_T,R0
|
|
LDIZ 1,R1
|
|
PWHL0 LDI *+AR5(LF_PCOL),R0 ;Left front collide with curb?
|
|
BZ PWHL1
|
|
LDI R0,AR0
|
|
LDI *+AR0(OID),R0
|
|
AND CLASS_M+TYPE_M,R0
|
|
CMPI ROAD_C+SHLDR_T,R0
|
|
LDIZ 2,R2
|
|
PWHL1 ADDI R1,R2
|
|
STI R2,@WHLOLD
|
|
BZ PWHLX ;NO SHOULDER ACTIVE
|
|
|
|
ANDN R5,R2 ;NEW SHOULDER HIT?
|
|
BZ PWHLX ;NOT NEW...
|
|
*COLLIDED WITH A CURB FIRST TIME
|
|
CALL ROADIR ;FIND WHICH SIDE OF ROAD HIT
|
|
LDF R0,R2
|
|
CALL GETNXTRDIR
|
|
SUBF R0,R2
|
|
CALL NORMITS
|
|
LDF R2,R2
|
|
LDFNN 15,R0
|
|
LDFN -15,R0
|
|
ADDF R0,R4 ;NEW STERRING CENTER FOR FEEDBACK
|
|
LDI 4,R3 ;NEW TIMER VALUE
|
|
B PWHLX0
|
|
PWHLX SUBI 1,R3
|
|
LDILT 0,R3
|
|
BGT PWHLXX ;When timer reaches -1, Set WHEELPOS = STEERCT
|
|
*THIS POINT IS ONLY REACHED WHEN NOT COLLIDING WITH A CURB
|
|
*PLACE SKID CORRECT HERE
|
|
PWHLX0 STF R4,@WHEELPOS
|
|
PWHLXX STI R3,@WHLTIM
|
|
*CHECK OFF ROAD STUFF
|
|
LDI @WHLOLD,R1 ;OFFROAD?
|
|
BZ WHLOFFX ;NO
|
|
|
|
LDI @WHLTIM,R3 ;TIMER ON?
|
|
BNZ WHLOFFX ;NO
|
|
|
|
LDF @STEERCT,R4 ;STEERING CENTER
|
|
LDF R4,R5
|
|
ADDF 15,R4
|
|
SUBF 15,R5
|
|
|
|
LDF 2,R0
|
|
CMPI 3,R1
|
|
LDFZ 4,R0
|
|
|
|
CALL SFRAND ;If off road offset center by random number
|
|
ADDF @WHEELPOS,R0
|
|
|
|
CMPF R4,R0 ;CHECK YOUR LIMITS
|
|
LDFGT R4,R0
|
|
CMPF R5,R0
|
|
LDFLT R5,R0
|
|
STF R0,@WHEELPOS
|
|
WHLOFFX RETS
|
|
*----------------------------------------------------------------------------
|
|
*SOUND TABLES
|
|
*PLAYER COLLISION SOUND TABLE
|
|
SCOLLTABI .word SCOLLTAB
|
|
SCOLLTAB .word SCOLLA,SCOLLB,SCOLLC
|
|
*WALL HIT SOUND TABLE
|
|
WALLHITABI .word WALLHITAB
|
|
WALLHITAB .word WALLHITA,WALLHITB,WALLHITC
|
|
*SKID SOUND TABLE
|
|
SKIDTABI .word SKIDTAB
|
|
SKIDTAB .word SKIDB,SKIDC
|
|
|
|
PLAIRSNDI .word PLAIRSND
|
|
PLAIRSND .word RH_BABEWHOA,GL_WOOLAUGH,CHICKSCREAM
|
|
|
|
REVSNDTABI .word REVSNDTAB
|
|
REVSNDTAB .word SINGLEREV5,SINGLEREV6
|
|
|
|
;SHIFTSNDTABI .WORD SHIFTSNDTAB
|
|
;SHIFTSNDTAB .WORD FIRSTSND,SECONDSND,THIRDSND,FOURTHSND
|
|
*----------------------------------------------------------------------------
|
|
*PLAYER SOUND EFFECTS TRACKS
|
|
*TRACK 0 = MUSIC
|
|
*TRACK 1 = DRONE+PLAYER EFFECTS
|
|
*TRACK 2 = DRONE+PLAYER EFFECTS
|
|
*TRACK 3 = ENGINE
|
|
*PARAMETERS
|
|
* AR4 PLYR CAR OBJECT
|
|
* AR5 CAR BLOCK
|
|
PLYR_SNDS:
|
|
LDI @_MODE,R0
|
|
AND MMODE,R0
|
|
CMPI MGAME,R0
|
|
RETSNE
|
|
CALL GETPEDAL
|
|
|
|
CMPF 0.75,R0
|
|
BLT PSND1
|
|
|
|
LDI @_MODE,R2
|
|
AND MSLINE,R2
|
|
BZ PSND0
|
|
|
|
CREATEC FLAME_PRC,UTIL_C ;make child flames
|
|
PSND0
|
|
LDI @REVFLG,R0
|
|
BNE BACKREV
|
|
|
|
CREATEC FLAME_PRC,UTIL_C ;make child flames
|
|
|
|
*MAKE YOUR REV SOUND
|
|
*KILL OLDIES
|
|
|
|
LDI 2,R0
|
|
LDI @REVSNDTABI,AR2 ;REVSND ON TRACK 12
|
|
CALL RANDSND
|
|
|
|
LDI 1,R0
|
|
B PSND2
|
|
PSND1
|
|
CMPF 0.50,R0
|
|
LDIGE @REVFLG,R0
|
|
LDILT 0,R0
|
|
PSND2
|
|
STI R0,@REVFLG
|
|
|
|
*CHECK BACKGROUND STARTING LINE REV SOUNDS
|
|
BACKREV
|
|
LDI @_MODE,R2 ;STARTING LINE MODE?
|
|
AND MSLINE,R2
|
|
BZ PLAIR ;NOPE
|
|
|
|
LDI @SNDSTR+SND_SIZ+SND_PRI,R2 ;CHECK TRACK1
|
|
BZ BACKREV1
|
|
LDI @SNDSTR+(2*SND_SIZ)+SND_PRI,R2 ;CHECK TRACK2
|
|
BNZ PLAIR
|
|
BACKREV1
|
|
SONDFX STARTLINEREVS2 ;START REV WHEN NOTHING
|
|
|
|
*CHECK IN AIR SPEECH CALL
|
|
PLAIR
|
|
|
|
*CHECK IN AIR SPEECH CALL
|
|
|
|
LDI @WRECKFLG,R0 ;IGNORE AIR SOUND ON WRECK
|
|
BNZ PLYRSND1B
|
|
|
|
LDI @PLAIRTIM,R0
|
|
BNZ PLYRSND1A
|
|
|
|
LDF *+AR5(CT_PRDYD),R0
|
|
CMPF 200,R0
|
|
BLT PLYRSND1B
|
|
|
|
LDI @PLAIRSNDI,AR2
|
|
LDI 3,R0
|
|
CALL RANDSND
|
|
LDI 100,R0
|
|
PLYRSND1A
|
|
SUBI 1,R0
|
|
STI R0,@PLAIRTIM
|
|
PLYRSND1B
|
|
|
|
*CHECK BOTTOM OUT SOUND
|
|
LDI *+AR5(CAR_AIRB),R0
|
|
BNZ NOBOTTOM
|
|
|
|
LDI @OLDPLYAIR,R0
|
|
BZ BOTX
|
|
|
|
CALL INIT_SPARK
|
|
|
|
SONDFX BOTTOMOUT
|
|
LDI 0,R0
|
|
NOBOTTOM
|
|
STI R0,@OLDPLYAIR
|
|
BOTX
|
|
*CHECK SKID SOUND
|
|
LDF *+AR5(CARSKID),R0
|
|
CMPF 0.5,R0
|
|
BLT NO_SMOKE
|
|
CREATEC SMOKE_PROC,UTIL_C ;make child smoke
|
|
NO_SMOKE
|
|
|
|
LDF *+AR5(CARSKID),R0
|
|
CMPF 0.25,R0
|
|
BLT NOSKID ;NO SKID ACTIVE
|
|
|
|
FLOAT 115,R1
|
|
MPYF R0,R1 ;GET SKID SOUND AMPLITUDE
|
|
FIX R1 ;CONVERT TO INT
|
|
ADDI 140,R1
|
|
*CHECK ALREADY ACTIVE
|
|
LDI @SNDSTR+SND_SIZ+SND_IDX,R2 ;CHECK TRACK1
|
|
CMPI SKIDB,R2
|
|
BEQ SKIDAMP ;ALREADY SKIDDING
|
|
CMPI SKIDC,R2
|
|
BEQ SKIDAMP ;ALREADY SKIDDING
|
|
LDI @SNDSTR+(2*SND_SIZ)+SND_IDX,R2 ;CHECK TRACK2
|
|
CMPI SKIDB,R2
|
|
BEQ SKIDAMP1 ;ALREADY SKIDDING
|
|
CMPI SKIDC,R2
|
|
BEQ SKIDAMP1 ;ALREADY SKIDDING
|
|
|
|
*MAKE NEW SKID SOUND
|
|
LDF *+AR5(CARSPEED),R0
|
|
CMPF 20,R0
|
|
BGT NO_FLAME
|
|
CREATEC FLAME_PRC,UTIL_C ;make child flames
|
|
NO_FLAME
|
|
|
|
LDI @SKIDTABI,AR2
|
|
LDI 2,R0
|
|
CALL RANDVSND ;START A SKID AND EXIT
|
|
B SKIDX
|
|
SKIDAMP
|
|
LDI @SNDSTR+(SND_SIZ)+SND_VOL,R2 ;VOLUME CHANGE?
|
|
LDI 1,R0
|
|
B SKIDAMP10
|
|
SKIDAMP1
|
|
LDI @SNDSTR+(2*SND_SIZ)+SND_VOL,R2 ;VOLUME CHANGE?
|
|
LDI 2,R0
|
|
SKIDAMP10
|
|
SUBI R1,R2
|
|
ABSI R2
|
|
CMPI 10,R2 ;NOT ENOUGH CHANGE FOR CALL
|
|
BLT SKIDX
|
|
|
|
CALL SET_TRACK_VOL ;ADJUST YOUR VOLUME, DUDES
|
|
B SKIDX
|
|
NOSKID
|
|
LDI SKIDB,AR2
|
|
CALL KILLSNDFX
|
|
|
|
LDI SKIDC,AR2
|
|
CALL KILLSNDFX
|
|
SKIDX
|
|
*CHECK HARD BRAKE SOUND
|
|
LDF *+AR5(CARBRAKE),R0
|
|
CMPF 0.8,R0
|
|
BLE NOBRAKSND
|
|
|
|
LDF *+AR5(CARSPEED),R0 ;SPEED LOW ?
|
|
CMPF 1.5,R0
|
|
BLT NOBRAKSND ;YES KILL SOUND
|
|
|
|
CREATEC SMOKE_PROC,UTIL_C ;make child smoke
|
|
|
|
|
|
LDI BRAKSND,AR2
|
|
CALL MKFXSND
|
|
B BRAKSNDX
|
|
NOBRAKSND
|
|
LDI BRAKSND,AR2
|
|
CALL KILLSNDFX
|
|
BRAKSNDX
|
|
*ENGINE SPUTTER SOUND
|
|
LDF *+AR5(CARTHROTTLE),R0
|
|
CMPF 0.15,R0
|
|
BGE NOSPUTSND
|
|
|
|
LDF *+AR5(CARRPM),R0
|
|
CMPF 30,R0
|
|
BLE NOSPUTSND
|
|
|
|
|
|
LDI @_MODE,R2
|
|
AND MSLINE,R2
|
|
BNZ NOSPUTSND
|
|
|
|
|
|
LDI SPUTSND,AR2
|
|
CMPI @SNDSTR+2*(SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
|
|
BZ SPUTSNDX
|
|
CALL ONESND
|
|
B SPUTSNDX
|
|
|
|
NOSPUTSND
|
|
LDI SPUTSND,AR2
|
|
CALL KILLSNDFX
|
|
SPUTSNDX
|
|
*ROAD EFFECTS: TUNNEL SOUND
|
|
LDI @_MODE,R4
|
|
TSTB MINTUNNEL,R4
|
|
BZ TUNOFF
|
|
|
|
FIX *+AR5(CARSPEED),R0
|
|
CMPI 100,R0 ;CLAMP TO LIMITS
|
|
LDILT 100,R0
|
|
|
|
CMPI 255,R0
|
|
LDIGT 255,R0
|
|
|
|
LDI TUNSND,AR2
|
|
CALL MKVFXSND
|
|
B TUNSNDX
|
|
TUNOFF LDI TUNSND,AR2
|
|
CALL KILLSNDFX
|
|
TUNSNDX
|
|
*ROAD EFFECTS: GRAVEL SOUND
|
|
|
|
|
|
LDI *+AR5(LR_PCOL),AR2
|
|
LDI 0,R1
|
|
LDI 0,R2
|
|
LDI *+AR2(OID),R0
|
|
CMPI 300h,R0
|
|
LDINZ 127,R1
|
|
|
|
LDI *+AR5(RR_PCOL),AR2
|
|
LDI *+AR2(OID),R0
|
|
CMPI 300h,R0
|
|
LDINZ 127,R2
|
|
ADDI R1,R2,R0
|
|
BZ NOGRAV
|
|
GRAVEL
|
|
|
|
LDF *+AR5(CARSPEED),R1
|
|
CMPF 1.0,R1
|
|
BLT NOGRAV
|
|
|
|
LDI GRAVELA,AR2
|
|
B MKVFXSND
|
|
NOGRAV
|
|
LDI GRAVELA,AR2
|
|
CALL KILLSNDFX
|
|
BNC GRAVX
|
|
SONDFX BOTTOMOUT
|
|
GRAVX
|
|
PLSNDX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*MAKE PLAYER EFFECTS SOUND
|
|
*PARAMETERS
|
|
* AR2 SOUND
|
|
MKFXSND:
|
|
CMPI @SNDSTR+SND_SIZ+SND_IDX,AR2 ;CHECK TRACK1
|
|
RETSZ
|
|
CMPI @SNDSTR+(2*SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
|
|
BNZ ONESNDFX
|
|
MKFXSNDX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*MAKE PLAYER VOLUME EFFECTS BACKGROUND SOUND
|
|
*PARAMETERS
|
|
* AR2 SOUND
|
|
* R0 VOLUME
|
|
MKVFXSND:
|
|
LDI R0,R1 ;SAVE VOLUME
|
|
CMPI @SNDSTR+SND_SIZ+SND_IDX,AR2 ;CHECK TRACK1
|
|
BNZ MKVFX1
|
|
|
|
SUBPI @SNDSTR+SND_SIZ+SND_VOL,R0 ;CHECK TRACK1 VOLUME
|
|
ABSI R0
|
|
CMPI 8,R0
|
|
RETSLE
|
|
|
|
LDI 1,R0 ;TRACK #
|
|
B SET_TRACK_VOL ;R0=TRACK#,R1=VOL
|
|
MKVFX1:
|
|
CMPI @SNDSTR+(2*SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
|
|
BNZ VOLSNDFX ;DO NEW SOUND DUDES
|
|
|
|
SUBI @SNDSTR+(2*SND_SIZ)+SND_VOL,R0 ;CHECK TRACK2 VOLUME
|
|
ABSI R0
|
|
CMPI 8,R0
|
|
RETSLE
|
|
|
|
LDI 2,R0 ;TRACK #
|
|
B SET_TRACK_VOL ;R0=TRACK#,R1=VOL
|
|
*----------------------------------------------------------------------------
|
|
*RANDOM SOUND ROUTINE
|
|
*PARAMETERS
|
|
* R0 RANDOM RANGE (0->R0-1)
|
|
* AR2 TABLE ADDR OF SOUNDS
|
|
*TRASHED R0
|
|
RANDSND:
|
|
PUSH AR2
|
|
LDI R0,AR2
|
|
CALL RANDU0
|
|
POP AR2
|
|
ADDI R0,AR2
|
|
LDI *AR2,AR2
|
|
B ONESNDFX
|
|
*RANDOM VOLUME SOUND ROUTINE
|
|
*PARAMETERS
|
|
* R0 RANDOM RANGE (0->R0-1)
|
|
* R1 VOLUME
|
|
* AR2 TABLE ADDR OF SOUNDS
|
|
*TRASHED R0,AR2
|
|
RANDVSND:
|
|
PUSH AR2
|
|
LDI R0,AR2
|
|
CALL RANDU0
|
|
POP AR2
|
|
ADDI R0,AR2
|
|
LDI *AR2,AR2
|
|
LDI R1,R0
|
|
B VOLSNDFX ;R0=VOLUME, AR2=SOUND
|
|
*DRONE SOUND ROUTINE
|
|
*PARAMETERS
|
|
* R0 RANDOM RANGE (0->R0-1)
|
|
* AR2 TABLE ADDR OF SOUNDS
|
|
* AR4 DRONE CAR OBJECT
|
|
*COMPUTES VOLUME BASED ON DISTANCE
|
|
*TRASHED R0
|
|
.globl DRONESND,DRONESND1
|
|
DRONESND:
|
|
PUSH AR2
|
|
LDI R0,AR2
|
|
CALL RANDU0
|
|
POP AR2
|
|
ADDI R0,AR2
|
|
LDI *AR2,AR2
|
|
DRONESND1 ;MAKE ONE DRONE SOUND ONLY...
|
|
FLOAT *+AR4(ODIST),R0
|
|
RETSN ;BEHIND PLAYER NO SOUND
|
|
FLOAT 10000,R1
|
|
MPYF 5,R1
|
|
CALL DIV_F
|
|
SUBRF 1,R0
|
|
RETSN
|
|
FLOAT 220,R1
|
|
MPYF R1,R0
|
|
|
|
FIX R0
|
|
CMPI 220,R0
|
|
LDIGT 220,R0
|
|
B VOLSNDFX ;R0=VOLUME, AR2=SOUND
|
|
*----------------------------------------------------------------------------
|
|
*STEERING WHEEL AND GAS PEDAL PARAMETERS
|
|
*(VALUES ARE READ FROM CMOS AND COPIED INTO RAM FOR EASY ACCESS)
|
|
*(COPIED AT THE START OF EACH GAME)
|
|
*ALL FLOATS
|
|
PEDALMNI .word PEDALMN
|
|
.bss PEDALMN,1 ;GAS PEDAL MIN CMOS 0
|
|
.bss PEDALMX,1 ;GAS PEDAL MAX 1
|
|
.bss STEERMN,1 ;STEERING MIN 2
|
|
.bss STEERMX,1 ;STEERING MAX 3
|
|
.bss STEERCT,1 ;STEERING CENTER 4
|
|
.bss BRAKEMN,1 ;BRAKE PEDAL MIN 5
|
|
.bss BRAKEMX,1 ;BRAKE PEDAL MAX 6
|
|
.bss STEERFR,1 ;STEERING FREE
|
|
|
|
ADJ_COINMODE .set 0
|
|
ADJ_GASMIN .set 1
|
|
ADJ_GASMAX .set 2
|
|
ADJ_STEERMIN .set 3
|
|
ADJ_STEERMAX .set 4
|
|
ADJ_STEERCENTER .set 5
|
|
ADJ_BRAKEMIN .set 6
|
|
ADJ_BRAKEMAX .set 7
|
|
|
|
GETCMOS_VALUES:
|
|
PUSH AR3
|
|
LDI @PEDALMNI,AR3
|
|
LDI ADJ_GASMIN,AR2
|
|
LDI 6,RC
|
|
RPTB CMOSALP
|
|
PUSH AR2
|
|
CALL ADJUSTMENT_READ
|
|
POP AR2
|
|
FLOAT R0
|
|
STF R0,*AR3++
|
|
CMOSALP ADDI 1,AR2
|
|
|
|
LDF @STEERMX,R0
|
|
SUBF @STEERMN,R0
|
|
STF R0,@STEERFR
|
|
POP AR3
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*PUSH CAMERA MATRIX
|
|
CAMMATSAV:
|
|
POP BK
|
|
LDI SP,AR0
|
|
ADDI 9,SP
|
|
LDI @CAMERAMATRIXI,AR1
|
|
|
|
LDF *AR1++,R0
|
|
RPTS 7
|
|
LDF *AR1++,R0
|
|
|| STF R0,*++AR0
|
|
|
|
STF R0,*++AR0
|
|
B BK
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CAMERA MATRIX AVERAGE
|
|
CAMMATAVG:
|
|
POP BK
|
|
LDI *+AR5(CAR_SPIN),R0 ;DONT AVG IN SPIN DUDES
|
|
CMPI 1,R0
|
|
BEQ CAMMATX
|
|
|
|
LDI SP,AR1
|
|
SUBI 8,AR1
|
|
LDI @CAMERAMATRIXI,AR0
|
|
|
|
LDI 8,RC
|
|
RPTB CAMAVG
|
|
|
|
LDF *AR1++,R0
|
|
MPYF 0.80,R0
|
|
|
|
LDF *AR0,R1
|
|
MPYF 0.20,R1
|
|
|
|
ADDF R0,R1
|
|
CAMAVG STF R1,*AR0++
|
|
CAMMATX SUBI 9,SP
|
|
B BK
|
|
*----------------------------------------------------------------------------
|
|
.END
|