cruisin-usa/LEG.ASM

601 lines
9.5 KiB
NASM
Executable File

.FILE "LEG.ASM"
*----------------------------------------------------------------------------
*
*
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
*ALL RIGHTS RESERVED
*
USEFIXED .set 1
USEEXTENDED .set 0
.include MACS.EQU
.include VUNIT.EQU
.include SYS.EQU
.include GLOBALS.EQU
.include OBJECTS.EQU
.bss FINISH_ID,1
*----------------------------------------------------------------------------
* USEAGE:
*
*
*FOR EACH LEG IN THE SYSTEM THE LEG_GENERATE_MAP ROUTINE IS
*CALLED TO GENERATE THE LEG MAP.
*THIS MAP IS IDENTICAL TO HOW THE OBJECTS WILL BE ALLOCATED ON
*THE DYNAMIC LIST.
*
*THE LIST STARTS AT LEGMAP (located in hibss space)
*AND HAS THE FOLLOWING STRUCTURE:
*
*
**STRUCT LEG
*LEG_POSX .set 0 ;FL
*LEG_POSY .set 1 ;FL
*LEG_POSZ .set 2 ;FL
*LEG_ID .set 3 ;UH
**ENDSTRUCT
*LEG_SIZE .set 4 ;SI
* .globl LEG_MAP ;RAM SPACE
*MAX_LEG_ELEMENTS .set 1200
*
*THE LAST ENTRY IN THE MAP HAS ALL FIELDS AS
*0FFFF FFFFh
*
*DRONES ON STARTING GRID MUST USE:
* .bss RACER_GRID_START
*AS THE STARTING INDEX TO ASSUME THE PLAYER
*WILL BE LOCATED AT.
*
*
*
LEG_MAPI .word LEG_MAP
.globl LEG_MAP
.bss LEG_ELEMENTS,1
hibss LEG_MAP,MAX_LEG_ELEMENTS*LEG_SIZE
.bss LAST_END_CACHE,1
.bss LAST_END_INDEX,1
.bss LAST_ORIENTATION,1
*----------------------------------------------------------------------------
*
*
*THIS INITIALIZATION IS FOR EACH GAME, NOT
*EACH LEG
*
*
LEG_INIT:
PUSH R0
CLRI R0
STI R0,@LEG_ELEMENTS
LDI 1,R0
STI R0,@LAST_END_INDEX
LDI @TYCO_TRKI,R0
STI R0,@LAST_END_CACHE
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
MINILL_SIZE .set 60
hibss LEG_SSLL,MINILL_SIZE*(LEG_SIZE+1)
.bss LEGFREE,1
.bss LEGLL,1
*
*NOT A TRUE LINKED LIST, BECAUSE THERE IS NO DYNAMIC
*DEALLOCATION (TO ALLOW REALLOCATION) THE SYSTEM IS
*RESET WHEN PIECES ARE REALLOCATED.
*
*THIS IS FOR THE SAKE OF SPEED
*
ELEMENT_INIT:
PUSH R0
LDL LEG_SSLL,R0
STI R0,@LEGFREE
CLRI R0
STI R0,@LEGLL
.if DEBUG
.bss DBG_LEGCNT,1
STI R0,@DBG_LEGCNT
.endif
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*RETURNS
* AR3 PTR TO ELEMENT
*
ELEMENT_GET:
PUSH AR0
.if DEBUG
LDI @DBG_LEGCNT,AR0 ;CHECK TO SEE IF WE ARE ALLOCATING TO MANY
INC AR0 ;PIECES
CMPI MINILL_SIZE,AR0
BGE $
STI AR0,@DBG_LEGCNT
.endif
LDI @LEGFREE,AR3
LDI AR3,AR0
ADDI LEG_SIZE+1,AR0
STI AR0,@LEGFREE
POP AR0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*PARAMETERS
* AR3 LIST ELEMENT
*
*INSERT LOWEST TO HIGHEST ONTO LEGLL
*
LEGLLI .word LEGLL
ELEMENT_ADD:
LDI *+AR3(1+LEG_ID),R0
LDI @LEGLLI,AR0
R65 LDI *AR0,AR1
CMPI 0,AR1
BEQ QT
CMPI *+AR1(1+LEG_ID),R0
BLT QT
LDI AR1,AR0
BU R65
QT
STI AR1,*AR3
STI AR3,*AR0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*PARAMETERS
* AR3 PTR TO LEG MAP ENTRY
*
ELEMENT_DUMP_INTO_LEGMAP:
PUSH R0
PUSH AR0
PUSH AR1
LDI @LEGLL,AR0
EDILL CMPI 0,AR0
BEQ ENDIT
LDI AR0,AR1
LDI *AR0,AR0
INC AR1
LDI LEG_SIZE-1,RC
RPTB K99
LDI *AR1++,R0
K99 STI R0,*AR3++
BU EDILL
ENDIT
POP AR1
POP AR0
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*PARAMETERS
* AR0 START INDEX
* AR1 END INDEX
*
*
LEG_GENERATE_MAP:
LDI AR1,R1
ADDI 2,R1
STI R1,@FINISH_ID
LDI @LAST_END_CACHE,AR2
LDI @LAST_END_INDEX,AR4
;GROUP LOOP
GENMAPLP
*
*FIND THE TYCOMAP ENTRY APPROPRIATE TO THIS LEG
*
*
*
LPP CMPI AR0,AR4
BEQ DNFND
LDI *AR2++(6),R1
TSTB 1,R1
BZ NOOVERA
ADDI 1,AR2
NOOVERA TSTB SC_REVERSE,R1
BZ CNTA
NOP *AR2++(4)
CNTA TSTB SC_OVER2,R1
BZ CNTNA
NOP *AR2++ ;OVERLAY 2
CNTNA
INC AR4 ;INCREMENT INDEX
BU LPP
DNFND
LDI @LEG_MAPI,AR3
*
*LOAD TYCO ENTRIES UNTIL LAST LEG IS FOUND
*
*
LOAD_LP
;AR2 TYCO ENTRY
;AR3 MAP ENTRY
CALL LEG_ADD_GROUP
LDI *AR2++(6),R1
TSTB 1,R1
BZ NOOVERB
ADDI 1,AR2
NOOVERB TSTB SC_REVERSE,R1
BZ CNTB
NOP *AR2++(4)
CNTB TSTB SC_OVER2,R1
BZ CNTNB
NOP *AR2++ ;OVERLAY 2
CNTNB
INC AR4 ;INCREMENT INDEX
CMPI AR1,AR4
BLE LOAD_LP
STI AR2,@LAST_END_CACHE
STI AR4,@LAST_END_INDEX
*
*LOAD THREE EXTRA LEGS ONTO THE END
*
ADDI 3,AR1
LOAD_LP2
;AR2 TYCO ENTRY
;AR3 MAP ENTRY
CALL LEG_ADD_GROUP
LDI *AR2++(6),R1
TSTB 1,R1
BZ NOOVERB2
ADDI 1,AR2
NOOVERB2
TSTB SC_REVERSE,R1
BZ CNTB2
NOP *AR2++(4)
CNTB2 TSTB SC_OVER2,R1
BZ CNTNB2
NOP *AR2++ ;OVERLAY 2
CNTNB2
INC AR4 ;INCREMENT INDEX
CMPI AR1,AR4
BLE LOAD_LP2
*
*FLAG THE END OF THE LIST
*
LDI -1,R0
RPTS LEG_SIZE-1
STI R0,*AR3++
*
*AND RETURN TO GAME...
*
RETS
*----------------------------------------------------------------------------
.bss LEG_FLAG,1 ;UH
.bss LEG_RADY,1 ;FL
.bss LEG_SECTIONIDX,1 ;UH
*----------------------------------------------------------------------------
*
*
*
*PARAMETERS
* AR2 PTR TO TYCO ROM ENTRY
* AR3 PTR TO LEG MAP ENTRY
* AR4 INDEX
*
*
LEG_ADD_GROUP:
PUSH R4
PUSH R5
PUSH R6
PUSH AR0
PUSH AR1
PUSH AR2
PUSH AR3
PUSH AR4
PUSH AR5
PUSH AR7
STI AR4,@LEG_SECTIONIDX
CALL ELEMENT_INIT
CALL ELEMENT_GET
INC AR3
LDI AR2,AR7 ;DEDICATED POINTER
LDI *AR7,R5 ;LOAD FLAG
LDI R5,R6 ;LANE COUNT
RS 7,R6
AND 1,R6 ;THIS IS THE LANES
LDF *+AR7(TB_RADY),R2
STF R2,@LEG_RADY
LDI @MATRIXAI,AR2 ;Group rotation matrix
CALL HPFIND_YMATRIX ;require High Precision
LDI *+AR7(TB_GROUP),AR5 ;Group pointer
ADDI 1,AR5 ;skip radius
LDI *AR5++,R4 ;get number of objects to load
SUBI 1,R4
L12 LDI *AR5++,AR2 ;GET MODEL PTR
FLOAT *AR5++,R1 ;GET X POSITION
STF R1,*+AR3(LEG_POSX)
FLOAT *AR5++,R1 ;GET Y POSITION
TSTB SC_REVERSE,R5
BZD NOTREVERSED
STF R1,*+AR3(LEG_POSY)
FLOAT *AR5++,R1 ;GET Z POSITION
STF R1,*+AR3(LEG_POSZ)
;---->BZD NOTREVERSED
;SPECIAL REVERSED CASE
;
PUSH AR7
TSTB SC_OVERLAY,R5
BNZ ISOVER
DEC AR7
ISOVER
LDF *+AR7(TB_RVS_POSX),R0 ;TRANSLATE BY THE NEGATIVE OFFSET
ADDF *+AR3(LEG_POSX),R0 ;POSITION (THIS BLOCKS ENDING POSITION)
STF R0,*+AR3(LEG_POSX)
LDF *+AR7(TB_RVS_POSY),R0
ADDF *+AR3(LEG_POSY),R0
STF R0,*+AR3(LEG_POSY)
LDF *+AR7(TB_RVS_POSZ),R0
ADDF *+AR3(LEG_POSZ),R0
STF R0,*+AR3(LEG_POSZ)
POP AR7
ISOVERA
LDI @MATRIXAI,R2
LDI AR3,AR2
ADDI LEG_POSX,AR2
LDI @VECTORAI,R3
CALL MATRIX_MUL ;rotation by occurance matrix
LDI @VECTORAI,AR0
LDF *AR0++,R1
ADDF *+AR7(TB_POSX),R1
STF R1,*+AR3(LEG_POSX)
LDF *AR0++,R1
ADDF *+AR7(TB_POSY),R1
STF R1,*+AR3(LEG_POSY)
LDF *AR0++,R1
ADDF *+AR7(TB_POSZ),R1
STF R1,*+AR3(LEG_POSZ)
BU JOIN_UP
NOTREVERSED
LDI @MATRIXAI,R2
LDI AR3,AR2
ADDI LEG_POSX,AR2
LDI R2,R3
LDI @VECTORAI,R3
CALL MATRIX_MUL ;ROTATION BY OCCURANCE MATRIX
LDI @VECTORAI,AR0
LDF *AR0++,R1
ADDF *+AR7(TB_POSX),R1
STF R1,*+AR3(LEG_POSX)
LDF *AR0++,R1
ADDF *+AR7(TB_POSY),R1
STF R1,*+AR3(LEG_POSY)
LDF *AR0++,R1
ADDF *+AR7(TB_POSZ),R1
STF R1,*+AR3(LEG_POSZ)
JOIN_UP LDF *AR5++,R2 ;LOAD OBJECTS RADIANS
LDI *AR5++,R1 ;LOAD OBJECT ID (GENV STYLE)
LDI R1,R0
AND 00F00h,R0
CMPI 0B00h,R0
BNE NOTDYNAROAD
;*******************
;*******************
;
;THIS IS THE CASE WE ARE LOOKING FOR
;
;*******************
;*******************
;
;add this element to dynamic fLEX list
;
LDI R1,R3
LDI @LEG_SECTIONIDX,R1
LS 8,R1
LDI R3,R0
AND 0FFh,R0
TSTB SC_REVERSE,R5 ;in the case of reversed track
BZ NOTRVSTRK ;we say the index value is
SUBRI 255,R0 ;255 - index
NOTRVSTRK
OR R1,R0
STI R0,*+AR3(LEG_ID)
.if USEFIXED
FIX *+AR3(LEG_POSX),R0
STI R0,*+AR3(LEG_POSX)
FIX *+AR3(LEG_POSY),R0
ANDN 1,R0
OR R6,R0 ;# of LANES
STI R0,*+AR3(LEG_POSY)
FIX *+AR3(LEG_POSZ),R0
STI R0,*+AR3(LEG_POSZ)
.endif
DEC AR3
CALL ELEMENT_ADD
CALL ELEMENT_GET
INC AR3
; NOP *AR3++(LEG_SIZE)
NOTDYNAROAD
SUBI 1,R4
BGE L12
ACTIVATE_X
POP AR7
POP AR5
POP AR4
POP AR3
POP AR2
POP AR1
POP AR0
POP R6
POP R5
POP R4
CALL ELEMENT_DUMP_INTO_LEGMAP
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*POST PROCESS LEG MAP
*
*
*
*
GENERATE_LINEAR_DISTANCE:
.if USEEXTENDED
LDL LEG_MAP,AR2
FLOAT *+AR2(LEG_POSX),R6 ;STARTING POSITION
FLOAT *+AR2(LEG_POSZ),R7
CLRF R4 ;ACCUMULATED DISTANCE
GLDLP LDI *AR2,R0
CMPI -1,R0
BEQ GLDX
FLOAT *+AR2(LEG_POSX),R2 ;STARTING POSITION
FLOAT *+AR2(LEG_POSZ),R1
SUBF R5,R2
SUBF R6,R1
MPYF R2,R2
MPYF R1,R1
ADDF R1,R2
CALL SQRT
ADDF R0,R4
FIX R4,R0
LS 16,R0
LDI *+AR2(LEG_POSY),R6
LS 16,R6
RS 16,R6
OR R0,R6
STI R6,*+AR2(LEG_POSY)
FLOAT *+AR2(LEG_POSX),R6 ;STARTING POSITION
FLOAT *+AR2(LEG_POSZ),R7
NOP *AR3++(LEG_SIZE)
BU GLDLP
GLDX
.endif
RETS
*----------------------------------------------------------------------------