2462 lines
44 KiB
NASM
Executable File
2462 lines
44 KiB
NASM
Executable File
.FILE "BACKGRND.ASM"
|
|
*----------------------------------------------------------------------------
|
|
*BACKGROUND ALLOCATION/DEALLOCATION SYSTEM
|
|
*
|
|
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
|
|
*ALL RIGHTS RESERVED
|
|
*
|
|
.include MACS.EQU
|
|
.include MPROC.EQU
|
|
.include OBJ.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 CORNOBJ.EQU
|
|
|
|
|
|
.text
|
|
|
|
.bss STARTSECTION,1 ;Section index to start game at
|
|
.bss START_POS,3 ;Section X Y Z start (if DEBUGSECTION != 0)
|
|
.bss START_RADY,1 ;Section Y Radian (if DEBUG SECTION != 0)
|
|
|
|
|
|
.bss DRIVE_LIST,1 ;OBJECTs which can be driven over (road/shoulder)
|
|
.bss CAR_LIST,1 ;OBJECTs which are vehicles (drones/player car)
|
|
.bss SIGN_LIST,1 ;OBJECTs which are signs (posts, road signs, trees etc)
|
|
.bss GROUND_LIST,1 ;OBJECTs which define the the ground but are not ROAD_C or SHLDR_C
|
|
|
|
*----------------------------------------------------------------------------
|
|
*DYNAMIC fLEX OBJECTS (THE ACTUAL ROAD OBJECTS (LIST))
|
|
*
|
|
* OLINK2 GROUP SUBLINK (standard)
|
|
* OLINK4 DYNATRACK fLEX LINK
|
|
* OBLINK4 DYNATRACK fLEX BACK LINK (== OPLINK)
|
|
* OUSR1 fLEX code
|
|
*
|
|
*
|
|
NEW_GROUPI
|
|
.word NEW_GROUP
|
|
.bss NEW_GROUP,1 ;TEMP PTR TO START OF NEW DGROUP LIST
|
|
|
|
|
|
DGROUPSI
|
|
.word DGROUPS
|
|
.bss DGROUPS,DGRP_SIZE*MAX_DGROUPS
|
|
.bss DGROUP_COUNT,1 ;NUMBER OF ACTIVE BACKGRNDS (on DYNA LIST)
|
|
.bss DGROUP_AW,1 ;activate watch pointer (->TYCO.ASM)
|
|
|
|
|
|
|
|
.bss DYNALIST_TRUEBEGIN,1 ;FIRST ELEMENT OF DYNAFLEX LIST
|
|
.bss DYNALIST_BEGIN,1 ;FIRST ELEMENT OF DYNAFLEX LIST (SECOND SET)
|
|
.bss DYNALIST_END,1 ;LAST ELEMENT OF DYNAFLEX LIST
|
|
.bss SUBLIST_BEGIN,1 ;FIRST ELEMENT OF SUBLIST (OLINK 3)
|
|
.bss SUBLIST_END,1 ;LAST ELEMENT OF SUBLIST (OLINK 4)
|
|
|
|
.bss STARTS,1
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
.bss SECTIONIDX,1 ;section index (of next to activate)
|
|
.bss TYCO_TRACK,1
|
|
.bss TYCO_TRACK_NTL,1
|
|
.bss TYCO_NTL_IDX,1
|
|
|
|
|
|
ATTRACT_ACTIVATE_DIST .float 15000
|
|
ACTIVATE_DIST .float 5000 ;to activate
|
|
|
|
DACT_DIST .float 80000 ;dynamic activate distance
|
|
DDACT_DIST .float 15000 ;dynamic activate distance (+ radius)
|
|
;ATTR_DDACT_DIST .float 35000 ;dynamic deactivate distance (+ radius)
|
|
ATTR_DDACT_DIST .float 45000 ;dynamic deactivate distance (+ radius)
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
FIND_STARTING_VALUES:
|
|
LDI @TYCO_TRKI,AR1
|
|
LDI @STARTSECTION,R0 ;first time dont do the crime
|
|
CMPI 0,R0
|
|
BEQ NOWARP
|
|
|
|
LDI R0,AR0
|
|
DEC AR0
|
|
|
|
LPP LDI *AR1++(6),R1
|
|
TSTB 1,R1
|
|
BZ NOOVER
|
|
ADDI 1,AR1
|
|
NOOVER TSTB SC_REVERSE,R1
|
|
BZ CNT
|
|
NOP *AR1++(4)
|
|
CNT TSTB SC_OVER2,R1
|
|
BZ CNTN
|
|
NOP *AR1++ ;OVERLAY 2
|
|
CNTN DBU AR0,LPP
|
|
|
|
NOWARP
|
|
STI AR1,@TYCO_TRACK
|
|
STI AR1,@DGROUP_AW
|
|
STI R0,@SECTIONIDX
|
|
STI R0,@TYCO_NTL_IDX
|
|
|
|
|
|
LDF *++AR1,R0
|
|
STF R0,@START_POS
|
|
LDF *++AR1,R0
|
|
STF R0,@START_POS+Y
|
|
LDF *++AR1,R0
|
|
STF R0,@START_POS+Z
|
|
LDF *++AR1,R2
|
|
STF R2,@START_RADY
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*INITIALIZE the background system for the game
|
|
*
|
|
*
|
|
BGD_INIT:
|
|
CLRI R0
|
|
STI R0,@DGROUP_COUNT
|
|
STI R0,@DYNALIST_END
|
|
STI R0,@DYNALIST_BEGIN
|
|
STI R0,@SIGN_LIST
|
|
STI R0,@TYCO_NTL_IDX
|
|
|
|
; LDI @_MODE,R1
|
|
; AND MMODE,R1
|
|
; CMPI MATTR,R1
|
|
; BEQ REGULAR_START ;START AT WORLD BEGINING
|
|
|
|
; .if DEBUG
|
|
; .globl DEBUG_STARTSECTION
|
|
; .data
|
|
;DEBUG_STARTSECTION .word 0
|
|
; .text
|
|
; LDI @DEBUG_STARTSECTION,R0
|
|
; BZ L17
|
|
; STI R0,@STARTSECTION
|
|
; .globl SECTION_SETUP
|
|
; CALLNZ SECTION_SETUP
|
|
;L17
|
|
; .endif
|
|
|
|
|
|
CALL FIND_STARTING_VALUES
|
|
BU KKTIL
|
|
|
|
|
|
REGULAR_START ;kept for attract mode only
|
|
CLRI R0
|
|
STI R0,@SECTIONIDX
|
|
STI R0,@TYCO_NTL_IDX
|
|
|
|
LDI @TYCO_TRKI,R0
|
|
STI R0,@TYCO_TRACK
|
|
STI R0,@DGROUP_AW
|
|
|
|
CLRF R0
|
|
STF R0,@START_POS+X
|
|
STF R0,@START_POS+Y
|
|
STF R0,@START_POS+Z
|
|
STF R0,@START_RADY
|
|
|
|
|
|
KKTIL
|
|
LDI @DGROUP_AW,AR2
|
|
LDI AR2,AR0
|
|
CALL BGD_ACTIVATE_TYCOGROUP ;returns top pointer in R0
|
|
LDI @DGROUPSI,AR1
|
|
STI R0,*+AR1(DGRP_HEAD) ;lead object (link by OLINK3)
|
|
STI AR0,*+AR1(DGRP_BIN) ;rom struct ptr
|
|
LDI @STARTS,R0
|
|
STI R0,*+AR1(DGRP_FSTART)
|
|
LDI @SECTIONIDX,R0
|
|
STI R0,*+AR1(DGRP_IDX) ;SAVE THE INDEX #
|
|
STI R0,@TYCO_NTL_IDX
|
|
|
|
LDI @TYCOFLAG,R0
|
|
STI R0,*+AR1(DGRP_FLAG) ;SAVE THE TYCOFLAG
|
|
|
|
|
|
INCM @DGROUP_COUNT
|
|
|
|
LDI @DGROUP_AW,AR0
|
|
STI AR0,@TYCO_TRACK_NTL
|
|
LDI *AR0++(6),R1
|
|
TSTB 1,R1
|
|
BZ NOOVERD
|
|
ADDI 1,AR0
|
|
NOOVERD
|
|
TSTB SC_REVERSE,R1
|
|
BZ CNT55a
|
|
NOP *AR0++(4)
|
|
CNT55a TSTB SC_OVER2,R1
|
|
BZ NOO2a
|
|
ADDI 1,AR0
|
|
NOO2a STI AR0,@DGROUP_AW
|
|
|
|
|
|
.if DEBUG
|
|
LDI @DGROUP_COUNT,R0
|
|
CMPI 1,R0
|
|
SLOCKON NE,"DGROUP\BACKGRND_INIT ERROR"
|
|
.endif
|
|
|
|
PUSH AR6
|
|
LDI @DGROUPSI,AR1
|
|
LDI 3,AR6
|
|
LPP5
|
|
LDI @DGROUP_AW,AR2
|
|
LDI AR2,AR0
|
|
CALL BGD_ACTIVATE_TYCOGROUP ;returns top pointer in R0
|
|
STI R0,*+AR1(DGRP_HEAD+DGRP_SIZE) ;lead object (link by OLINK3)
|
|
STI AR0,*+AR1(DGRP_BIN+DGRP_SIZE) ;rom struct ptr
|
|
LDI @STARTS,R0
|
|
STI R0,*+AR1(DGRP_FSTART+DGRP_SIZE)
|
|
LDI @SECTIONIDX,R0
|
|
STI R0,*+AR1(DGRP_IDX+DGRP_SIZE) ;SAVE THE INDEX #
|
|
LDI @TYCOFLAG,R0
|
|
STI R0,*+AR1(DGRP_FLAG+DGRP_SIZE) ;SAVE THE TYCOFLAG
|
|
|
|
INCM @DGROUP_COUNT
|
|
|
|
LDI @DGROUP_AW,AR0
|
|
LDI *AR0++(6),R1
|
|
TSTB 1,R1
|
|
BZ NOOVERE
|
|
ADDI 1,AR0
|
|
NOOVERE TSTB SC_REVERSE,R1
|
|
BZ CNT55d
|
|
NOP *AR0++(4)
|
|
CNT55d TSTB SC_OVER2,R1
|
|
BZ NOO2d
|
|
ADDI 1,AR0
|
|
NOO2d STI AR0,@DGROUP_AW
|
|
|
|
ADDI DGRP_SIZE,AR1
|
|
DBU AR6,LPP5
|
|
POP AR6
|
|
|
|
CREATE BGD_WATCHER,UTIL_C|BACKGRND_T
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CONTROLLING PROCESS FOR THE DYNAMIC TRACK ALLOCATION SYSTEM
|
|
*
|
|
* CONTROLS:
|
|
* 1) WHEN ROUTINE IS CALLED
|
|
* 2) WHEN NEW SECTION IS LOADED
|
|
* 3) WHEN OLD SECTION IS DELETED
|
|
*
|
|
*
|
|
BGD_SLP
|
|
SLEEP 1
|
|
|
|
BGD_WATCHER:
|
|
|
|
LDI @_MODE,R0
|
|
AND MMODE,R0
|
|
CMPI MGAME,R0
|
|
BEQ LLKK
|
|
CMPI MATTR,R0
|
|
BNE BGD_SLP
|
|
LLKK
|
|
|
|
;--------------------------------------------------------------------
|
|
;CHECK #1: HAVE WE CROSSED A THRESHOLD?
|
|
;
|
|
;if (distance_to(THRESHOLD_POS) < ACTIVATE_DIST)
|
|
; CALL routine
|
|
; increment THRESHOLD CHECK PTR
|
|
;
|
|
;New Method::
|
|
; if Closest Road Piece ROAD_ID (OUSR1) > Checkpoint ROAD_ID
|
|
; CALL routine
|
|
; increment THRESHOLD CHECK PTR
|
|
;
|
|
LDI @_MODE,R0
|
|
AND MMODE,R0
|
|
CMPI MGAME,R0
|
|
BNE NO_ACTIVATION
|
|
|
|
LDI @PLYCBLK,AR0
|
|
LDI *+AR0(CARTRAK),AR0
|
|
LDI *+AR0(OUSR1),R0
|
|
LDI @TYCO_NTL_IDX,R1
|
|
LS 8,R1
|
|
CMPI R1,R0
|
|
BLT NO_ACTIVATION
|
|
;blah.asm
|
|
|
|
LDI @TYCO_TRACK_NTL,AR2
|
|
LDI *AR2,AR0
|
|
RS 16,AR0
|
|
AND 0FFh,AR0
|
|
LDI AR0,R0
|
|
CALLNZ SECTION_ROUTINE
|
|
|
|
|
|
LDI @TYCO_NTL_IDX,R0
|
|
INC R0
|
|
STI R0,@TYCO_NTL_IDX
|
|
|
|
LDI @TYCO_TRACK_NTL,AR1
|
|
LDI *AR1++(6),R1
|
|
TSTB 1,R1
|
|
BZ NOOVERA
|
|
ADDI 1,AR1
|
|
NOOVERA TSTB SC_REVERSE,R1
|
|
BZ CNTFF
|
|
NOP *AR1++(4)
|
|
CNTFF TSTB SC_OVER2,R1
|
|
BZ NOO2FF
|
|
ADDI 1,AR1
|
|
NOO2FF STI AR1,@TYCO_TRACK_NTL
|
|
|
|
|
|
;in the end we probably want this check to insure we dont
|
|
;continue trying to allocated beyond the end of the defined game
|
|
;although this can also be done by a routine...
|
|
;
|
|
; LDI @SECTIONIDX,R1
|
|
; LDI @TYCO_LENGTH,R0
|
|
; CMPI R0,R1
|
|
; BGE SUICIDE
|
|
NO_ACTIVATION
|
|
|
|
|
|
|
|
;--------------------------------------------------------------------
|
|
;CHECK #2: SHOULD THE NEXT SECTION BE ACTIVATED?
|
|
;
|
|
;if (distance_to(DGROUP_AW) < DACT_DIST)
|
|
; CALL BGD_ACTIVATE_TYCOGROUP(AR2 <- GROUP_POINTER)
|
|
; SETUP DGROUP STRUCTURE (APPEND TO END OF LIST)
|
|
; INCM @DGROUP_COUNT
|
|
; increment DGROUP_AW //DGROUP ACTIVATE WATCH
|
|
;
|
|
;
|
|
LDI @DGROUP_AW,AR0
|
|
LDI AR0,AR2
|
|
ADDI 1,AR2
|
|
LDI @CAMERAPOSI,R2
|
|
CALL GET_XZ_DISTANCE
|
|
|
|
CMPF @DACT_DIST,R0
|
|
BGT NOACT
|
|
|
|
LDI AR0,AR2
|
|
CALL BGD_ACTIVATE_TYCOGROUP ;returns top pointer in R0
|
|
|
|
LDI @DGROUP_COUNT,AR1
|
|
MPYI DGRP_SIZE,AR1
|
|
ADDI @DGROUPSI,AR1
|
|
STI R0,*+AR1(DGRP_HEAD) ;lead object (link by OLINK3)
|
|
STI AR0,*+AR1(DGRP_BIN) ;rom struct ptr
|
|
LDI @SECTIONIDX,R0
|
|
STI R0,*+AR1(DGRP_IDX) ;SAVE THE INDEX #
|
|
LDI @TYCOFLAG,R0
|
|
STI R0,*+AR1(DGRP_FLAG) ;SAVE THE TYCOFLAG
|
|
|
|
LDI @STARTS,R0
|
|
STI R0,*+AR1(DGRP_FSTART)
|
|
|
|
INCM @DGROUP_COUNT
|
|
|
|
|
|
LDI *AR0++(6),R1
|
|
TSTB 1,R1
|
|
BZ NOOVERB
|
|
ADDI 1,AR0
|
|
NOOVERB TSTB SC_REVERSE,R1
|
|
BZ CNT55
|
|
NOP *AR0++(4)
|
|
CNT55 TSTB SC_OVER2,R1
|
|
BZ NOO2
|
|
ADDI 1,AR0
|
|
NOO2 STPI AR0,@DGROUP_AW
|
|
|
|
|
|
NOACT ;end of activation routine
|
|
|
|
|
|
|
|
;--------------------------------------------------------------------
|
|
;CHECK #3: SHOULD THE OLDEST SECTION BE DEACTIVATED?
|
|
;
|
|
;if (distance_to(THRESHOLD_POS) < DACT_DIST)
|
|
; CALL GROUP_DELETE
|
|
; PACK DGROUP STRUCTURES
|
|
; DECM @DGROUP_COUNT
|
|
; increment DGROUP_AW //DGROUP ACTIVATE WATCH
|
|
;
|
|
;
|
|
LDI @(DGROUPS+DGRP_BIN),AR2
|
|
INC AR2
|
|
LDI @CAMERAPOSI,R2
|
|
CALL GET_XZ_DISTANCE
|
|
|
|
|
|
LDI @(DGROUPS+DGRP_BIN),AR0
|
|
LDI *+AR0(TB_GROUP),AR0
|
|
SUBF *AR0,R0
|
|
|
|
LDI @_MODE,R1
|
|
AND MMODE,R1
|
|
CMPI MATTR,R1
|
|
BNE GAMECHK
|
|
|
|
CMPF @ATTR_DDACT_DIST,R0
|
|
BLT NODEACT
|
|
BU DO_DEL
|
|
|
|
GAMECHK CMPF @DDACT_DIST,R0
|
|
BLT NODEACT
|
|
|
|
DO_DEL
|
|
LDI @(DGROUPS+DGRP_HEAD),AR2
|
|
CALL GROUP_DELETE
|
|
|
|
LDI @(DGROUPS+DGRP_SIZE+DGRP_FSTART),AR2
|
|
STI AR2,@DYNALIST_BEGIN
|
|
STI AR2,@DYNALIST_TRUEBEGIN
|
|
CLRI R0
|
|
STI R0,*+AR2(OBLINK4) ;NULL TERMINATE BACK LINK ON LIST
|
|
|
|
|
|
|
|
;REPACK DGROUP SECTIONS
|
|
;
|
|
;for i = 1 to dgroup_count
|
|
; memcpy(dgroup[i-1], dgroup[i], sizeof(dgroup))
|
|
;
|
|
LDI @DGROUP_COUNT,RC
|
|
SUBI 2,RC
|
|
.if DEBUG
|
|
CMPI 0,RC
|
|
SLOCKON LT,"BACKGRND\LBACK_WATCH ERROR"
|
|
.endif
|
|
BLT SHIFT1
|
|
LDI @DGROUPSI,AR0
|
|
LDI AR0,AR1
|
|
ADDI DGRP_SIZE,AR1
|
|
|
|
|
|
RPTB LL45
|
|
SHIFT1 LDI *AR1++,R0
|
|
STI R0,*AR0++
|
|
|
|
LDI *AR1++,R0
|
|
STI R0,*AR0++
|
|
|
|
LDI *AR1++,R0
|
|
STI R0,*AR0++
|
|
|
|
LDI *AR1++,R0
|
|
STI R0,*AR0++
|
|
|
|
LDI *AR1++,R0
|
|
LL45 STI R0,*AR0++
|
|
|
|
|
|
DECM @DGROUP_COUNT
|
|
NODEACT
|
|
|
|
.if DEBUG
|
|
;DEBUGGING CHECK TO VERIFY THAT WE NEVER EXCEED
|
|
;THE AMOUNT OF DGROUPs WE CAN HANDLE
|
|
;
|
|
LDI @DGROUP_COUNT,R0
|
|
SLOCKON LE,"BACKGRND\LBACK_WATCH ERRONEOUS DGROUP_COUNT LE"
|
|
CMPI MAX_DGROUPS,R0
|
|
SLOCKON GE,"BACKGRND\LBACK_WATCH ERRONEOUS DGROUP_COUNT GE"
|
|
.endif
|
|
|
|
SLEEP 3
|
|
B BGD_WATCHER
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*ACTIVATE A TYCO GROUP (ROAD PIECES ARE LINKED, ETC.)
|
|
*
|
|
*PARAMETERS
|
|
* AR2 PTR TO TYCO BLOCK
|
|
*
|
|
*
|
|
*
|
|
NEWSUBLIST_TOP .word NEWSUBLIST_TOPB
|
|
.bss NEWSUBLIST_TOPB,1 ;POINTER TO TOP OF SUBLIST (OF GROUP)
|
|
.bss GROUP_RADY,1 ;CURRENT SUBLIST Y RADIAN
|
|
.bss TYCOFLAG,1 ;CURRENT SUBLIST TYCOFLAG (FROM ROM)
|
|
.bss PASS1,1 ;CURRENT PASS INDEX (0,1) (USED WHEN ACTIVATING AN OVERLAY)
|
|
.bss SECRADY,1 ;SECTION RADIAN Y
|
|
|
|
BGD_ACTIVATE_TYCOGROUP:
|
|
PUSH R4
|
|
PUSH R5
|
|
PUSH AR0
|
|
PUSH AR1
|
|
PUSH AR2
|
|
PUSH AR4
|
|
PUSH AR5
|
|
PUSH AR7
|
|
|
|
LDI @SECTIONIDX,R0
|
|
INC R0
|
|
STI R0,@SECTIONIDX
|
|
|
|
*CORNFLAKE CHECK
|
|
CMPI 4,R0
|
|
BNE NOTCORNFLAKE
|
|
|
|
PUSH AR4
|
|
LDL cornpops,AR2
|
|
LDI 6700,R2
|
|
LDI -4250,R3
|
|
LDI 32600,RC
|
|
.data
|
|
LVAL .word 151720
|
|
.text
|
|
ADDI @LVAL,RC
|
|
CALL OBJ_QMAKE
|
|
LDI AR0,AR4
|
|
|
|
LDF -0.2,R2
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
LDI *+AR4(OFLAGS),R0
|
|
OR O_1PAL,R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
LDL CORNPAL,AR2
|
|
CALL PAL_FIND_RAW
|
|
STI R0,*+AR4(OPAL)
|
|
|
|
LDI AR4,AR2
|
|
CALL OBJ_INSERT
|
|
|
|
LDI @SECTIONIDX,R0
|
|
LS 8,R0
|
|
OR 0AAh,R0
|
|
STI R0,*+AR4(OLINK2)
|
|
POP AR4
|
|
|
|
NOTCORNFLAKE
|
|
*CORNFLAKE END CHECK
|
|
|
|
|
|
LDI -1,R0
|
|
STI R0,@SUBLIST_BEGIN
|
|
|
|
CLRI R0
|
|
STI R0,@PASS1
|
|
STI R0,@NEW_GROUP
|
|
|
|
LDI @TYCO_TRACK,AR2
|
|
LDI AR2,AR7 ;DEDICATED POINTER
|
|
LDI *AR7,R0 ;LOAD FLAG
|
|
STI R0,@TYCOFLAG
|
|
|
|
|
|
TSTB SC_OVERLAY,R0
|
|
BZ NOVRDD
|
|
ADDI 1,AR2
|
|
NOVRDD TSTB SC_REVERSE,R0
|
|
BZD REG_LD
|
|
NOP
|
|
ADDI TB_REGSIZE-1,AR2
|
|
STI AR2,@TYCO_TRACK
|
|
;----> BZD REG_LD
|
|
|
|
ADDI TB_RVSSIZE-TB_REGSIZE,AR2 ;REVERSED SECTION HAS LARGER STRUCTURE
|
|
STI AR2,@TYCO_TRACK
|
|
REG_LD TSTB SC_OVER2,R0 ;hopefully...
|
|
BZ NOEXTRA
|
|
LDI @TYCO_TRACK,R0
|
|
INC R0
|
|
STI R0,@TYCO_TRACK
|
|
NOEXTRA
|
|
LDF *+AR7(TB_RADY),R0
|
|
STF R0,@SECRADY
|
|
|
|
|
|
LDI @MATRIXAI,AR2 ;Group rotation matrix
|
|
LDF @SECRADY,R2
|
|
CALL HPFIND_YMATRIX ;require High Precision
|
|
|
|
LDI *+AR7(TB_GROUP),AR5 ;Group pointer
|
|
ADDI 1,AR5 ;skip radius
|
|
|
|
|
|
LDI @SECTIONIDX,R0
|
|
LS 8,R0
|
|
OR 0AAh,R0
|
|
STI R0,@NEWSUBLIST_TOPB
|
|
|
|
PUSH R0
|
|
|
|
LDI *AR5++,R4 ;get number of objects to load
|
|
SLOCKON LE,"BACKGRND 1"
|
|
SUBI 1,R4
|
|
|
|
CMPI @OFREECNT,R4
|
|
SLOCKON GT,"BACKGRND\ACTIVATE TYCOGROUP OUT OF OBJECTS"
|
|
L12
|
|
|
|
LDI *AR5++,AR2 ;GET MODEL PTR
|
|
CALL OBJ_GETE
|
|
SLOCKON C,"BACKGRND\ACTIVATE DANGER ERROR *FATAL*"
|
|
BC ACTIVATE_X
|
|
;INTERNAL LINK (FOR DEALLOCATION)
|
|
LDI AR0,AR4 ;SET OBJECT ROM PTR
|
|
|
|
POP R0 ;GET LAST BACK LINK
|
|
STI R0,*+AR4(OLINK2)
|
|
PUSH R0
|
|
|
|
|
|
FLOAT *AR5++,R1 ;GET X POSITION
|
|
STF R1,*+AR4(OPOSX)
|
|
FLOAT *AR5++,R1 ;GET Y POSITION
|
|
LDI @TYCOFLAG,R0
|
|
TSTB SC_REVERSE,R0
|
|
BZD NOTREVERSED
|
|
STF R1,*+AR4(OPOSY)
|
|
FLOAT *AR5++,R1 ;GET Z POSITION
|
|
STF R1,*+AR4(OPOSZ)
|
|
;---->BZD NOTREVERSED
|
|
|
|
|
|
;
|
|
; SPECIAL REVERSED CASE
|
|
;
|
|
PUSH AR7
|
|
TSTB SC_OVERLAY,R0
|
|
BNZ ISOVER
|
|
DEC AR7
|
|
ISOVER
|
|
|
|
LDF *+AR7(TB_RVS_POSX),R0 ;TRANSLATE BY THE NEGATIVE OFFSET
|
|
ADDF *+AR4(OPOSX),R0 ;POSITION (THIS BLOCKS ENDING POSITION)
|
|
STF R0,*+AR4(OPOSX)
|
|
LDF *+AR7(TB_RVS_POSY),R0
|
|
ADDF *+AR4(OPOSY),R0
|
|
STF R0,*+AR4(OPOSY)
|
|
LDF *+AR7(TB_RVS_POSZ),R0
|
|
ADDF *+AR4(OPOSZ),R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
POP AR7
|
|
|
|
|
|
|
|
LDI @MATRIXAI,R2
|
|
LDI AR4,AR2
|
|
ADDI OPOSX,AR2
|
|
LDI @VECTORAI,R3
|
|
CALL MATRIX_MUL ;rotation by occurance matrix
|
|
|
|
|
|
LDI @VECTORAI,AR0
|
|
LDF *AR0++,R1
|
|
ADDF *+AR7(TB_POSX),R1
|
|
STF R1,*+AR4(OPOSX)
|
|
LDF *AR0++,R1
|
|
ADDF *+AR7(TB_POSY),R1
|
|
STF R1,*+AR4(OPOSY)
|
|
LDF *AR0++,R1
|
|
ADDF *+AR7(TB_POSZ),R1
|
|
STF R1,*+AR4(OPOSZ)
|
|
|
|
|
|
LDF *AR5++,R2 ;GET Y ROT
|
|
ADDF @SECRADY,R2
|
|
STF R2,*+AR4(ORADY)
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL HPFIND_YMATRIX
|
|
BU JOIN_UP
|
|
|
|
|
|
NOTREVERSED
|
|
LDI @MATRIXAI,R2
|
|
LDI AR4,AR2
|
|
ADDI OPOSX,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,*+AR4(OPOSX)
|
|
LDF *AR0++,R1
|
|
ADDF *+AR7(TB_POSY),R1
|
|
STF R1,*+AR4(OPOSY)
|
|
LDF *AR0++,R1
|
|
ADDF *+AR7(TB_POSZ),R1
|
|
STF R1,*+AR4(OPOSZ)
|
|
|
|
|
|
LDF *AR5++,R2 ;SET THE RADIANS FOR THE OBJECT
|
|
ADDF @SECRADY,R2
|
|
STF R2,*+AR4(ORADY)
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL HPFIND_YMATRIX
|
|
|
|
JOIN_UP
|
|
LDI *AR5++,R1 ;LOAD OBJECT ID (GENV STYLE)
|
|
LDI R1,R2
|
|
AND CLASS_M|TYPE_M|SUBTYPE_M,R1
|
|
STI R1,*+AR4(OID)
|
|
|
|
|
|
|
|
;TEST TO SEE IF WE SHOULD CALL A SPECIAL ROUTINE
|
|
;OR PALETTE SHIFT
|
|
;
|
|
TSTB BGD_ROUTINE,R2
|
|
CALLNZ BGD_OROUTINE
|
|
|
|
|
|
|
|
LDI R2,R0
|
|
RS 16,R2
|
|
AND O_GENVSPEC,R2 ;make sure list data is not ORed in
|
|
|
|
TSTB BGD_BIGOBJ,R0 ;BIG OBJECT TEST
|
|
BZ NOTBIGOBJ
|
|
LDI 1,R0
|
|
LS O_BIGOBJECT_B,R0
|
|
OR R0,R2
|
|
NOTBIGOBJ
|
|
|
|
OR *+AR4(OFLAGS),R2 ;or in the flags
|
|
STI R2,*+AR4(OFLAGS)
|
|
|
|
|
|
|
|
LDI AR4,AR2
|
|
CALL OBJ_INSERT ;INSERT THE BABE
|
|
|
|
|
|
|
|
|
|
;NOW FIND IF THE OBJECT BELONGS IN A SUPPLIMENTAL
|
|
;LIST.
|
|
;OID = x3xx -> DRIVE_SUPP
|
|
; x4xx -> BUILD_SUPP
|
|
;
|
|
LDI *+AR4(OID),R0
|
|
AND CLASS_M,R0
|
|
CMPI ROAD_C,R0
|
|
BNE NOTDRIVE
|
|
|
|
LDI @DRIVE_LIST,AR0
|
|
STI AR0,*+AR4(OLINK3)
|
|
STI AR4,@DRIVE_LIST
|
|
|
|
LDI 1,R1
|
|
BUD DONELISTS
|
|
LS 28,R1 ;O_ROAD_SUPP
|
|
OR *+AR4(OFLAGS),R1
|
|
STI R1,*+AR4(OFLAGS)
|
|
NOTDRIVE
|
|
|
|
CMPI GROUND_C,R0
|
|
BNE NOTGROUND
|
|
LDI @GROUND_LIST,AR0
|
|
STI AR0,*+AR4(OLINK3)
|
|
STI AR4,@GROUND_LIST
|
|
LDI 1,R1
|
|
LS O_GROUND_B,R1
|
|
OR *+AR4(OFLAGS),R1
|
|
STI R1,*+AR4(OFLAGS)
|
|
B DONELISTS
|
|
NOTGROUND
|
|
|
|
CMPI TSIGN_C,R0
|
|
BNE NOTSIGN
|
|
LDI @SIGN_LIST,AR0
|
|
STI AR0,*+AR4(OLINK3)
|
|
STI AR4,@SIGN_LIST
|
|
LDI 1,R1
|
|
LS O_SIGN_SUPP_B,R1
|
|
OR *+AR4(OFLAGS),R1
|
|
STI R1,*+AR4(OFLAGS)
|
|
B DONELISTS
|
|
NOTSIGN
|
|
|
|
CMPI 0B00h,R0
|
|
BNE NOTDYNAROAD
|
|
|
|
;
|
|
;add this element to dynamic fLEX list
|
|
;
|
|
|
|
LDI @SECTIONIDX,R1
|
|
LS 8,R1
|
|
|
|
LDI *+AR4(OID),R0
|
|
AND 0FFh,R0
|
|
|
|
LDI @TYCOFLAG,R2 ;in the case of reversed track
|
|
TSTB SC_REVERSE,R2 ;we say the index value is
|
|
BZ NOTRVSTRK ;255 - index
|
|
SUBRI 255,R0 ;
|
|
NOTRVSTRK ;
|
|
|
|
OR R1,R0
|
|
STI R0,*+AR4(OUSR1)
|
|
|
|
LDI 0300h,R0
|
|
STI R0,*+AR4(OID)
|
|
|
|
|
|
LDI @DRIVE_LIST,AR0
|
|
STI AR0,*+AR4(OLINK3)
|
|
STI AR4,@DRIVE_LIST
|
|
|
|
LDI 1,R1
|
|
LS O_DRIVE_SUPP_B,R1
|
|
OR *+AR4(OFLAGS),R1
|
|
STI R1,*+AR4(OFLAGS)
|
|
|
|
CALL ADD_TO_NEWLIST
|
|
BU DONELISTS
|
|
NOTDYNAROAD
|
|
|
|
|
|
DONELISTS
|
|
SUBI 1,R4
|
|
BGE L12
|
|
|
|
ACTIVATE_X
|
|
POP AR0 ;clear stack of last item
|
|
|
|
LDI @PASS1,R0
|
|
BNZ CHECK2
|
|
|
|
LDI 1,R0
|
|
STI R0,@PASS1
|
|
|
|
LDI *AR7,R0 ;load flag
|
|
TSTB SC_OVERLAY,R0
|
|
BZ CHECK2II
|
|
|
|
|
|
LDI *+AR7(TB_GROUPOVERLAY),AR5 ;Group pointer
|
|
ADDI 1,AR5 ;skip radius
|
|
|
|
LDI @NEWSUBLIST_TOPB,R0
|
|
PUSH R0
|
|
|
|
LDI *AR5++,R4 ;get number of objects to load
|
|
SLOCKON LE,"BACKGRND ERRONEOUS GROUP LOADED"
|
|
SUBI 1,R4
|
|
|
|
CMPI @OFREECNT,R4
|
|
SLOCKON GT,"BACKGRND\ACTIVATE TYCOGROUP OUT OF OBJECTS 2"
|
|
BU L12
|
|
CHECK2
|
|
CMPI 2,R0
|
|
BEQ NOOVERLAYGROUP
|
|
|
|
LDI 2,R0
|
|
STI R0,@PASS1
|
|
|
|
LDI *AR7,R0 ;load flag
|
|
TSTB SC_OVER2,R0
|
|
BZ NOOVERLAYGROUP
|
|
|
|
PUSH IR0
|
|
TSTB SC_REVERSE,R0
|
|
LDIZ TB_GROUPOVERLAY+1,IR0
|
|
LDINZ TB_GROUPOVERLAY+5,IR0
|
|
|
|
LDI *+AR7(IR0),AR5 ;Group pointer
|
|
ADDI 1,AR5 ;skip radius
|
|
|
|
TSTB SC_REVERSE,R0
|
|
BZ UHNO2
|
|
|
|
TSTB SC_OVERLAY,R0
|
|
LDIZ TB_RVS_RADY-1,IR0
|
|
LDINZ TB_RVS_RADY,IR0
|
|
LDF *+AR7(IR0),R0
|
|
STPF R0,@SECRADY
|
|
UHNO2
|
|
|
|
POP IR0
|
|
|
|
|
|
LDI @TYCOFLAG,R0 ;overlay 2 is not reversed - EVER!
|
|
ANDN SC_REVERSE,R0
|
|
STI R0,@TYCOFLAG
|
|
|
|
|
|
LDI @NEWSUBLIST_TOPB,R0
|
|
PUSH R0
|
|
|
|
LDI *AR5++,R4 ;get number of objects to load
|
|
SLOCKON LE,"BACKGRND ERRONEOUS GROUP LOADED OVER2"
|
|
SUBI 1,R4
|
|
|
|
CMPI @OFREECNT,R4
|
|
SLOCKON GT,"BACKGRND\ACTIVATE TYCOGROUP OUT OF OBJECTS 2"
|
|
BU L12
|
|
|
|
|
|
CHECK2II
|
|
CMPI 2,R0
|
|
BEQ NOOVERLAYGROUP
|
|
|
|
LDI 2,R0
|
|
STI R0,@PASS1
|
|
|
|
LDI *AR7,R0 ;load flag
|
|
TSTB SC_OVER2,R0
|
|
BZ NOOVERLAYGROUP
|
|
|
|
PUSH IR0
|
|
TSTB SC_REVERSE,R0
|
|
LDIZ TB_GROUPOVERLAY,IR0
|
|
LDINZ TB_GROUPOVERLAY+4,IR0
|
|
|
|
|
|
LDI *+AR7(IR0),AR5 ;Group pointer
|
|
|
|
|
|
TSTB SC_REVERSE,R0
|
|
BZ UHNO
|
|
|
|
TSTB SC_OVERLAY,R0
|
|
LDIZ TB_RVS_RADY-1,IR0
|
|
LDINZ TB_RVS_RADY,IR0
|
|
LDF *+AR7(IR0),R0
|
|
STPF R0,@SECRADY
|
|
UHNO
|
|
|
|
POP IR0
|
|
ADDI 1,AR5 ;skip radius
|
|
|
|
|
|
LDI @TYCOFLAG,R0 ;overlay 2 is not reversed - EVER!
|
|
ANDN SC_REVERSE,R0
|
|
STI R0,@TYCOFLAG
|
|
|
|
LDI @NEWSUBLIST_TOPB,R0
|
|
PUSH R0
|
|
|
|
LDI *AR5++,R4 ;get number of objects to load
|
|
SLOCKON LE,"BACKGRND ERRONEOUS GROUP LOADED OVER2"
|
|
SUBI 1,R4
|
|
|
|
CMPI @OFREECNT,R4
|
|
SLOCKON GT,"BACKGRND\ACTIVATE TYCOGROUP OUT OF OBJECTS 2"
|
|
BU L12
|
|
|
|
|
|
NOOVERLAYGROUP
|
|
|
|
|
|
|
|
|
|
;*NOW DO THE FANCY MESS OF:
|
|
;*
|
|
;* 1) DO WE LOAD A NEW OVERLAY INTO A SECTION?
|
|
;* 2) WHICH SECTION DO WE OVERLAY IT INTO (1 OR 2)?
|
|
;* 3) WHICH LOOK DO WE PLACE INTO THE SECTION (DESERT..)?
|
|
;*
|
|
;*
|
|
LDI @TYCOFLAG,R0
|
|
TSTB SC_LDSECT,R0
|
|
BZ NO_NEWLOAD
|
|
|
|
|
|
NO_NEWLOAD
|
|
CALL FIND_SUBLIST_START_END
|
|
CALL APPEND_NEWLIST
|
|
|
|
|
|
LDI @NEWSUBLIST_TOPB,R0 ;return pointer to 1st object
|
|
|
|
POP AR7
|
|
POP AR5
|
|
POP AR4
|
|
POP AR2
|
|
POP AR1
|
|
POP AR0
|
|
POP R5
|
|
POP R4
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*ADD AN ELEMENT (OBJECT) TO THE NEW LIST BEING CREATED
|
|
*SEARCH ON ITS OID SO THAT IT IS IN ORDER
|
|
*
|
|
*
|
|
*PARAMETERS
|
|
* AR4 POINTER TO OBJECT
|
|
* *AR4(OUSR1) INDEX (lower 2 nybbles of OID)
|
|
*
|
|
*
|
|
*PLACE IN ASCENDING ORDER IN THE LIST
|
|
*
|
|
*
|
|
ADD_TO_NEWLIST:
|
|
LDI @NEW_GROUPI,AR1
|
|
LDI *AR1,R0
|
|
BNZ REGADD
|
|
|
|
STI AR4,*AR1
|
|
CLRI R0
|
|
STI R0,*+AR4(OLINK4)
|
|
STI R0,*+AR4(OBLINK4)
|
|
RETS
|
|
|
|
REGADD
|
|
|
|
SUBI OLINK4,AR1
|
|
LDI AR1,AR2
|
|
LDI *+AR4(OUSR1),R0 ;GET fLEX index number
|
|
ADDNOBJL
|
|
LDI AR1,AR0 ;AR0 IS PREVIOUS LINK
|
|
LDI *+AR1(OLINK4),R1 ;CHECK END OF LIST
|
|
BZ ADDNOBJ_AT_END
|
|
|
|
LDI R1,AR1
|
|
CMPI *+AR1(OUSR1),R0
|
|
BGT ADDNOBJL
|
|
|
|
ADDNOBJ_AT_END
|
|
STI R1,*+AR4(OLINK4) ;LINK TO NEXT (SUBLIST LINK)
|
|
STI AR4,*+AR0(OLINK4) ;LINK FROM PREVIOUS (SUBLIST LINK)
|
|
|
|
CMPI AR2,AR0 ;IS IT THE HEAD OF LIST WE LOAD AT
|
|
LDIEQ 0,AR0
|
|
STI AR0,*+AR4(OBLINK4) ;BACK LINK
|
|
|
|
CMPI 0,R1 ;IS THE NEXT ELEMENT NULL
|
|
BEQ ISZERO
|
|
LDI R1,AR0 ;IF NOT THE NEXT ELEMENTS BACK LINK
|
|
STI AR4,*+AR0(OBLINK4) ; MUST POINT TO NEW ELEMENT
|
|
ISZERO
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
FIND_SUBLIST_START_END:
|
|
PUSH R1
|
|
PUSH AR0
|
|
LDI @NEW_GROUP,AR0
|
|
.if DEBUG
|
|
CMPI 0,AR0
|
|
SLOCKON EQ,"BACKGRND\FIND_SUBLIST_START_END"
|
|
.endif
|
|
STPI AR0,@SUBLIST_BEGIN
|
|
FSLP
|
|
LDI *+AR0(OLINK4),R1 ;CHECK END OF LIST
|
|
BZ FSDN
|
|
LDI R1,AR0
|
|
BU FSLP
|
|
FSDN
|
|
STPI AR0,@SUBLIST_END ;ALWAYS NAME IT AS THE END
|
|
POP AR0
|
|
POP R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*APPEND THE NEW LIST TO THE OLD LIST
|
|
*
|
|
*LINKED VIA OLINK4
|
|
*
|
|
* DONT FORGET THE BACK LINK
|
|
*
|
|
* if (DYNALIST empty) {
|
|
* DYNALIST_END <- SUBLIST_END
|
|
* DYNALIST_TRUE_BEGIN <- SUBLIST_BEGIN
|
|
* DYNALIST_BEGIN <- SUBLIST_BEGIN
|
|
* STARTS <- SUBLIST_BEGIN
|
|
* }
|
|
* else {
|
|
* *(DYNALIST_END+OLINK4) <- SUBLIST_BEGIN
|
|
* DYNALIST_END <- SUBLIST_END new end of list pointer
|
|
* STARTS <- SUBLIST_BEGIN
|
|
* }
|
|
*
|
|
*
|
|
APPEND_NEWLIST:
|
|
LDI @DYNALIST_END,R0
|
|
BZ SHINY_NEWLIST
|
|
LDI R0,AR0
|
|
|
|
LDI @SUBLIST_BEGIN,R0
|
|
STI R0,*+AR0(OLINK4)
|
|
|
|
LDI @SUBLIST_END,AR1
|
|
STPI AR1,@DYNALIST_END
|
|
|
|
LDI R0,AR1
|
|
STI AR0,*+AR1(OBLINK4)
|
|
|
|
STPI R0,@STARTS
|
|
RETS
|
|
|
|
SHINY_NEWLIST:
|
|
LDI @SUBLIST_END,R0
|
|
STPI R0,@DYNALIST_END
|
|
|
|
LDI @SUBLIST_BEGIN,R0 ;new line, check it out...
|
|
STPI R0,@DYNALIST_TRUEBEGIN
|
|
|
|
LDI @SUBLIST_BEGIN,R0
|
|
SLOCKON Z,"BACKGRND\SHINY_NEWLIST"
|
|
|
|
STPI R0,@DYNALIST_BEGIN
|
|
STPI R0,@STARTS
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*DELETE GROUP LIST FROM OBJECT LIST
|
|
*
|
|
* CYCLE OUT THE LRU IN ACTIVE GROUPS
|
|
*
|
|
*PARAMETERS
|
|
* AR2 ID OF ELEMENTS WITHIN THE LIST
|
|
*
|
|
*search for items in active
|
|
*search for items in idle
|
|
*
|
|
*
|
|
GROUP_DELETE:
|
|
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSH AR0
|
|
PUSH AR1
|
|
|
|
LDI @OACTIVEI,R1
|
|
CALL DELLP
|
|
|
|
LDI @IDLE_LISTI,R1
|
|
CALL DELLP
|
|
|
|
POP AR1
|
|
POP AR0
|
|
POP R1
|
|
POP R0
|
|
RETS
|
|
|
|
|
|
DELLP LDI R1,AR1 ;WE MUST FIND DEAD OBJECT TO LINK AROUND
|
|
LDI *AR1,R1
|
|
BZ NXTCHK
|
|
|
|
LDI R1,AR0
|
|
CMPI *+AR0(OLINK2),AR2
|
|
BNE DELLP
|
|
|
|
LDI *AR0,R0 ;find link from delete-e
|
|
STI R0,*AR1 ;LINK AROUND
|
|
|
|
|
|
|
|
PUSH AR2
|
|
LDI AR0,AR2
|
|
|
|
;Mirror these checks in OBJ.ASM
|
|
; 'OBJ_DELETE'
|
|
;
|
|
LDI *+AR2(OFLAGS),R0 ;KILL PROC ASSOCIATED WITH OBJ
|
|
RS (O_DEBRIS_B+1),R0
|
|
CALLC FREE_RDDEBRIS
|
|
|
|
LDI *+AR2(OFLAGS),R0 ;KILL PROC ASSOCIATED WITH OBJ
|
|
RS (O_PROC_B+1),R0
|
|
CALLC OBJ_FREE_PROC
|
|
|
|
LDI *+AR2(OFLAGS),R0 ;DELINK IN CASE OF DRIVE LIST
|
|
RS (O_DRIVE_SUPP_B+1),R0
|
|
CALLC OBJ_FREE_DRIVE
|
|
|
|
LDI *+AR2(OFLAGS),R0 ;DELINK IN CASE OF GROUND LIST
|
|
RS (O_GROUND_B+1),R0
|
|
CALLC OBJ_FREE_GROUND
|
|
|
|
LDI *+AR2(OFLAGS),R0 ;DELINK IN CASE OF SIGN LIST
|
|
RS (O_SIGN_SUPP_B+1),R0
|
|
CALLC OBJ_FREE_SIGN
|
|
|
|
POP AR2
|
|
|
|
CLRI R0
|
|
STI R0,*+AR0(OLINK2) ;CLEAR SEARCH ID
|
|
STI R0,*+AR0(OFLAGS)
|
|
|
|
|
|
LDI @OFREE,R0
|
|
STI R0,*AR0 ;place delete-e on free
|
|
STI AR0,@OFREE
|
|
|
|
LDI @OFREECNT,R0 ;INCREMENT FREE OBJECT COUNT
|
|
ADDI 1,R0
|
|
STI R0,@OFREECNT
|
|
LDI AR1,R1
|
|
BU DELLP
|
|
NXTCHK
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*PARAMETERS
|
|
* AR2 VECTOR V1
|
|
* R2 VECTOR V2
|
|
*RETURNS
|
|
* R0 (FLOAT) DISTANCE FROM V1 TO V2
|
|
* (FROM X/Z ONLY)
|
|
*
|
|
*
|
|
GET_XZ_DISTANCE:
|
|
PUSH AR0
|
|
PUSH R3
|
|
LDI R2,AR0
|
|
LDF *AR0++(2),R3
|
|
SUBF *AR2++(2),R3
|
|
LDF *AR0++,R2
|
|
SUBF *AR2++,R2
|
|
|
|
|
|
MPYF R3,R3
|
|
MPYF R2,R2
|
|
ADDF R3,R2
|
|
CALL SQRT
|
|
|
|
POP R3
|
|
POP AR0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*BGD_OROUTINE
|
|
* The object has (or will have) a routine associated with it, search the
|
|
* ID of the object vs the list and call any routine nessesary.
|
|
*
|
|
*
|
|
*
|
|
*PARAMETERS
|
|
* AR4 OBJECT (NOT INSERTED)
|
|
*
|
|
*
|
|
*NOTE
|
|
* ALL REGISTERS MUST BE SAVED
|
|
*
|
|
BGD_OROUTINE:
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSH AR0
|
|
LDI *+AR4(OID),R0
|
|
LDI @ROUTINE_TABI,AR0
|
|
BGDORLP CMPI *AR0,R0
|
|
BEQ BGD_RFND
|
|
LDI *AR0++(2),R1
|
|
BNZ BGDORLP
|
|
POP AR0
|
|
POP R1
|
|
POP R0
|
|
RETS
|
|
BGD_RFND
|
|
LDI *+AR0,R0
|
|
CALLU R0
|
|
POP AR0
|
|
POP R1
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
OVERCAR:
|
|
PUSH R0
|
|
PUSH R2
|
|
PUSH AR2
|
|
CREATE CARFORWARD,22
|
|
STI AR0,*+AR4(OPLINK)
|
|
LDI SPAWNER_C,R0
|
|
STI R0,*+AR0(PID)
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
OR *+AR4(OFLAGS),R0
|
|
ANDN O_1PAL,R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
RANDN 4
|
|
ADDI @OVERCARLISTI,R0
|
|
LDI R0,AR2
|
|
LDI *AR2,AR2
|
|
STI AR2,*+AR4(OROMDATA)
|
|
POP AR2
|
|
POP R2
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
OVERCARLISTI .word OVERCARLIST
|
|
OVERCARLIST .word dcbus,dgtruck,dsbus,dcbus
|
|
|
|
CARFORWARD:
|
|
RANDN 50
|
|
CMPI 25,R0
|
|
BLT CARSUP
|
|
|
|
|
|
CALL CLR_VECTORA
|
|
FLOAT 16000,R0
|
|
STF R0,*+AR2(Z)
|
|
|
|
LDI AR2,R3
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
CALL MATRIX_MUL
|
|
|
|
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)
|
|
|
|
|
|
LDF *+AR4(ORADY),R2
|
|
ADDF PI,R2
|
|
STF R2,*+AR4(ORADY)
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
CARSUP
|
|
RANDN 500
|
|
FLOAT R0
|
|
|
|
CALL CLR_VECTORA
|
|
STF R0,*+AR2(Z)
|
|
|
|
LDI AR2,R3
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
CALL MATRIX_MUL
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
RANDN 30
|
|
FLOAT R0
|
|
LDF R0,R6
|
|
ADDF 50,R6
|
|
|
|
RANDN 3
|
|
ADDI 1,R0
|
|
FLOAT R0
|
|
MPYF R0,R6
|
|
|
|
CARFORWARDLP
|
|
CALL CLR_VECTORA
|
|
LDF R6,R0
|
|
MPYF @NFRAMES,R0
|
|
STF R0,*+AR2(Z)
|
|
|
|
LDI AR2,R3
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
CALL MATRIX_MUL
|
|
|
|
|
|
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)
|
|
SLEEP 1
|
|
BU CARFORWARDLP
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
ROAD_DEBRIS_CREATE_55GAL:
|
|
PUSH R0
|
|
CALL ADD_RDDEBRIS
|
|
LDI 0731h,R0
|
|
STI R0,*+AR4(OID)
|
|
POP R0
|
|
RETS
|
|
ROAD_DEBRIS_CREATE:
|
|
BU ADD_RDDEBRIS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
SMOKE_STACK:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
BUD MAKEPPP
|
|
PUSH R2
|
|
NOP
|
|
LDI @SMOKE_ANII,AR6
|
|
;----> BUD MAKEPPP
|
|
|
|
CAR_FIRE:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
BUD MAKEPPP
|
|
PUSH R2
|
|
NOP
|
|
LDI @CAR_FIRE_ANII,AR6
|
|
;----> BUD MAKEPPP
|
|
|
|
SMOKE_ANII .word SMOKE_ANI
|
|
SMOKE_ANI .word smoa,smob,smoc,smod,smoe,smof
|
|
.word -1
|
|
|
|
;eug1,eug2,eug3,eug4,eug5,eug6
|
|
CAR_FIRE_ANII .word CAR_FIRE_ANI
|
|
CAR_FIRE_ANI
|
|
.word rdflm1,rdflm2,rdflm3,rdflm4,rdflm5,rdflm6
|
|
.word rdflm7,rdflm8,rdflm9,rdflm10,rdflm11,rdflm12
|
|
.word -1
|
|
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
DC_MINIFOUNTAIN_ANII .word DC_MINIFOUNTAIN_ANI
|
|
DC_MINIFOUNTAIN_ANI
|
|
.word aft1,aft2,aft3,aft4,aft5,aft6,-1
|
|
DC_MINIFOUNTAIN:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH R2
|
|
|
|
LDI @DC_MINIFOUNTAIN_ANII,AR6
|
|
CREATE WATERANI_PROC,SPAWNER_C|ANIMATION_T
|
|
BC FWL1A
|
|
BU J262
|
|
|
|
DC_FOUNTAIN_ANII .word DC_FOUNTAIN_ANI
|
|
DC_FOUNTAIN_ANI
|
|
.word ft2,ft3,ft4,ft5,ft6,-1
|
|
DC_FOUNTAIN:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH R2
|
|
|
|
LDI @DC_FOUNTAIN_ANII,AR6
|
|
CREATE WATERANI_PROC,SPAWNER_C|ANIMATION_T
|
|
BC FWL1A
|
|
BU J262
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
WATERFALL_ANII .word WATERFALL_ANI
|
|
WATERFALL_ANI .word w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,-1
|
|
|
|
WATERFALL:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH R2
|
|
|
|
CREATE WATERFALL_SND,SPAWNER_C|ANIMATION_T
|
|
|
|
LDI @WATERFALL_ANII,AR6
|
|
CREATE WATERANI_PROC,SPAWNER_C|ANIMATION_T
|
|
BC FWL1A
|
|
J262 STI AR0,*+AR4(OPLINK)
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
OR *+AR4(OFLAGS),R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
FWL1A POP R2
|
|
POP AR6
|
|
POP AR5
|
|
POP AR2
|
|
POP AR0
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*AR6 START OF SCRIPT
|
|
*
|
|
*the big difference is that this *MUST* handle the sound animation also...
|
|
*
|
|
*
|
|
WATERANI_PROC:
|
|
LDI AR6,AR5
|
|
WATERANI_LP
|
|
LDI *AR5++,R0
|
|
BLT WATERANI_PROC
|
|
STI R0,*+AR4(OROMDATA)
|
|
|
|
RANDN 4
|
|
LDI R0,R0
|
|
LDIZ 1,AR2
|
|
LDINZ 2,AR2
|
|
CALL PRC_SLEEP
|
|
BU WATERANI_LP
|
|
*----------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*AR4=WATERFALL OBJECT
|
|
*
|
|
WATERFALL_SND:
|
|
SLEEP 1
|
|
LDI *+AR4(ODIST),R0
|
|
LDFN 4.0,R1
|
|
LDFNN 1.0,R1
|
|
|
|
CMPI -20000,R0
|
|
BGT WF1
|
|
|
|
LDI @CAMVIEW,R2
|
|
BNE WF0
|
|
|
|
LDI @PLYCBLK,AR0
|
|
LDI *+AR0(CAR_SPIN),R2
|
|
BNE WF1
|
|
WF0
|
|
LDI WATERFALLSND,AR2 ;KILL OFF SOUND
|
|
CALL KILLSNDFX
|
|
DIE
|
|
WF1
|
|
FLOAT R0,R2
|
|
MPYF R1,R2
|
|
ABSF R2
|
|
MPYF 0.01,R2
|
|
MPYF 0.1,R2 ;0-50
|
|
SUBRF 75,R2
|
|
BN WATERFALL_SND
|
|
|
|
MPYF 7,R2
|
|
FIX R2
|
|
|
|
CMPI 255,R2
|
|
LDIGT 255,R2
|
|
|
|
LDI WATERFALLSND,AR2
|
|
CALL AMBIENCE_SOUND
|
|
|
|
BU WATERFALL_SND
|
|
|
|
*----------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*PARAMETERS
|
|
* AR2 SOUND
|
|
* R2 VOLUME (0-255)
|
|
*
|
|
AMBIENCE_SOUND:
|
|
CMPI @SNDSTR+SND_SIZ+SND_IDX,AR2 ;CHECK TRACK1
|
|
BEQ IS_T1
|
|
CMPI @SNDSTR+(2*SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
|
|
BEQ IS_T2
|
|
CALL ONESNDFX
|
|
|
|
CMPI @SNDSTR+SND_SIZ+SND_IDX,AR2 ;CHECK TRACK1
|
|
BNE NOT_T1
|
|
IS_T1
|
|
LDI R2,R1 ;volume
|
|
LDI 1,R0
|
|
CALL SET_TRACK_VOL
|
|
BU HEND
|
|
|
|
NOT_T1 CMPI @SNDSTR+(2*SND_SIZ)+SND_IDX,AR2 ;CHECK TRACK2
|
|
BNE NOT_T2
|
|
IS_T2
|
|
LDI R2,R1
|
|
LDI 2,R0
|
|
CALL SET_TRACK_VOL
|
|
NOT_T2
|
|
HEND
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
FLAGANII .word FLAGANI
|
|
FLAGANI .word bflag1,bflag2,bflag3,bflag4,bflag5
|
|
.word bflag6,bflag7,bflag9,bflag10,-1
|
|
|
|
FLAGANITALLI .word FLAGANITALL
|
|
FLAGANITALL .word aflag1,aflag2,aflag3,aflag4,aflag5
|
|
.word aflag6,aflag7,aflag9,aflag10,-1
|
|
|
|
.globl RUT_ANISI
|
|
.globl HUNGH_ANISI
|
|
|
|
RUT_ANISI .word RUT_ANIS
|
|
RUT_ANIS .word rut,rut2,rut3,-1
|
|
HUNGH_ANISI .word HUNGH_ANIS
|
|
HUNGH_ANIS .word hungh1,hungh2,hungh3,hungh4,hungh5,hungh6,hungh7,-1
|
|
*----------------------------------------------------------------------------
|
|
.global BABE_PALISTI
|
|
BABE_PALISTI .word BABE_PALIST
|
|
romdata
|
|
BABE_PALIST
|
|
.word ungh1_blue,logo_p,ungh1_green,nintendo_p,ungh1_silver,map1_p
|
|
.word ungh1_yellow,lift_p,ungh1_skin,bvwall_p
|
|
.text
|
|
|
|
.globl HUNGH_ANI
|
|
HUNGH_ANI:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH R2
|
|
|
|
PUSH AR2
|
|
READAUD ADJ_GIRLS
|
|
POP AR2
|
|
CMPI 0,R0
|
|
BEQ DORUT_ANI
|
|
|
|
LDI @HUNGH_ANISI,AR6
|
|
LDI *+AR4(OFLAGS),R0
|
|
; ANDN O_1PAL,R0
|
|
OR O_POSTER,R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
LDI 5,AR2
|
|
CALL RANDU0
|
|
CMPI 4,R0
|
|
BEQ HUNGH_NOPAL
|
|
MPYI 2,R0
|
|
ADDI @BABE_PALISTI,R0
|
|
LDI R0,AR5
|
|
LDI *+AR5,AR2
|
|
CALL PAL_FIND
|
|
BC HUNGH_NOPAL
|
|
LDI R0,R2
|
|
LDI *AR5,AR2
|
|
LDI *AR2++,R3
|
|
CALL PAL_SET
|
|
STI R0,*+AR4(OPAL)
|
|
HUNGH_NOPAL
|
|
CALL PLACE_ON_ROAD
|
|
LDI RDDEBRIS_C|TSC_IGNORE|TSC_BABE_S,R0
|
|
STI R0,*+AR4(OID)
|
|
|
|
|
|
LDI AR6,AR5
|
|
CREATE PLAINANI_LP_SLOW,SPAWNER_C|ANIMATION_T|7
|
|
BC FWL1
|
|
BU J2
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
.global HUNGH_ANI_REENTER
|
|
HUNGH_ANI_REENTER:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH R2
|
|
LDI @HUNGH_ANISI,AR6
|
|
LDI *+AR4(OFLAGS),R0
|
|
; ANDN O_1PAL,R0
|
|
OR O_POSTER,R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
LDI AR6,AR5
|
|
CREATE PLAINANI_LP_SLOW,SPAWNER_C|ANIMATION_T|7
|
|
BC FWL1
|
|
BU J2
|
|
|
|
romdata
|
|
.include babe.pal
|
|
.text
|
|
|
|
PLACE_ON_ROAD:
|
|
CALL ADD_RDDEBRIS
|
|
|
|
PUSH AR4
|
|
ADDI OPOSX,AR4
|
|
CALL CAMSCAN
|
|
POP AR4
|
|
FIX R0,R1 ;Check for dude in the sign
|
|
CMPI 1000,R1
|
|
BGT PORX
|
|
LDF *+AR4(OPOSY),R1
|
|
ADDF R1,R0
|
|
SUBF 45,R0
|
|
STF R0,*+AR4(OPOSY)
|
|
PORX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
.globl RUT_ANI
|
|
RUT_ANI:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH R2
|
|
|
|
DORUT_ANI
|
|
LDI @RUT_ANISI,AR6
|
|
LDI *+AR4(OFLAGS),R0
|
|
ANDN O_1PAL,R0
|
|
OR O_POSTER,R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
CALL PLACE_ON_ROAD
|
|
LDI RDDEBRIS_C|TSC_IGNORE|TSC_DUDE_S,R0
|
|
STI R0,*+AR4(OID)
|
|
|
|
|
|
LDI AR6,AR5
|
|
CREATE PLAINANI_LP_SLOW,SPAWNER_C|ANIMATION_T|7
|
|
BC FWL1
|
|
BU J2
|
|
*----------------------------------------------------------------------------
|
|
PLAINANI_PROC_SLOW:
|
|
LDI AR6,AR5
|
|
PLAINANI_LP_SLOW
|
|
LDI *AR5++,R0
|
|
BLT PLAINANI_PROC_SLOW
|
|
STI R0,*+AR4(OROMDATA)
|
|
|
|
RANDN 4
|
|
LDI R0,R0
|
|
LDIZ 1,AR2
|
|
LDINZ 2,AR2
|
|
ADDI 1,AR2
|
|
CALL PRC_SLEEP
|
|
BU PLAINANI_LP_SLOW
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
FLAGWAVE_TALL:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH R2
|
|
LDI @FLAGANITALLI,AR6
|
|
LDI *+AR4(OFLAGS),R0
|
|
ANDN O_1PAL,R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
RANDN 7
|
|
LDI AR6,AR5
|
|
ADDI R0,AR5
|
|
CREATE PLAINANI_LP,SPAWNER_C|ANIMATION_T
|
|
BC FWL1
|
|
BU J2
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
FLAGWAVE:
|
|
PUSH R0
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH R2
|
|
LDI @FLAGANII,AR6
|
|
LDI *+AR4(OFLAGS),R0
|
|
ANDN O_1PAL,R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
RANDN 7
|
|
LDI AR6,AR5
|
|
ADDI R0,AR5
|
|
CREATE PLAINANI_LP,SPAWNER_C|ANIMATION_T
|
|
BC FWL1
|
|
BU J2
|
|
|
|
MAKEPPP
|
|
CREATE PLAINANI_PROC,SPAWNER_C|ANIMATION_T
|
|
BC FWL1
|
|
J2 STI AR0,*+AR4(OPLINK)
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
OR *+AR4(OFLAGS),R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
FWL1 POP R2
|
|
POP AR6
|
|
POP AR5
|
|
POP AR2
|
|
POP AR0
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*AR6 START OF SCRIPT
|
|
*
|
|
PLAINANI_PROC:
|
|
LDI AR6,AR5
|
|
PLAINANI_LP
|
|
LDI *AR5++,R0
|
|
BLT PLAINANI_PROC
|
|
STI R0,*+AR4(OROMDATA)
|
|
|
|
RANDN 4
|
|
LDI R0,R0
|
|
LDIZ 1,AR2
|
|
LDINZ 2,AR2
|
|
CALL PRC_SLEEP
|
|
BU PLAINANI_LP
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*ABSOLUTE LOAD INTO OBJECT LIST FOR A SINGLE SECTION
|
|
*
|
|
*
|
|
*PARAMETERS
|
|
* AR2 POINTER TO ROM GROUP (OBJECTS.EQU)
|
|
*
|
|
*RETURNS
|
|
* R0 PTR TO THE FIRST OBJECT IN GROUP
|
|
*
|
|
.bss SINGLE_SECTION_TEMPPTR,1
|
|
LOAD_SINGLE_SECTION:
|
|
PUSH R4
|
|
PUSH R5
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR4
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH AR7
|
|
|
|
LDL SINGLE_SECTION_TEMPPTR,AR6
|
|
SUBI OLINK2,AR6
|
|
|
|
LDI AR2,AR5
|
|
INC AR5
|
|
LDI *AR5++,R4 ;get number of objects to load
|
|
SLOCKON LE,"BACKGRND\LOAD_SINGLE_SECTION GROUP ERROR"
|
|
|
|
DEC R4
|
|
|
|
CMPI @OFREECNT,R4
|
|
SLOCKON GT,"BACKGRND\LOAD_SINGLE_SECTION OUT OF OBJECTS"
|
|
LS_L12
|
|
|
|
LDI *AR5++,AR2 ;GET MODEL PTR
|
|
CALL OBJ_GETE
|
|
SLOCKON C,"BACKGRND\LOAD_SINGLE_SECTION OUT OF OBJECTS *FATAL*"
|
|
BC LS_ACTIVATE_X
|
|
LDI AR0,AR4
|
|
|
|
STI AR4,*+AR6(OLINK2)
|
|
LDI AR4,AR6
|
|
|
|
FLOAT *AR5++,R1 ;GET X POSITION
|
|
STF R1,*+AR4(OPOSX)
|
|
FLOAT *AR5++,R1 ;GET Y POSITION
|
|
STF R1,*+AR4(OPOSY)
|
|
FLOAT *AR5++,R1 ;GET Z POSITION
|
|
STF R1,*+AR4(OPOSZ)
|
|
LDF *AR5++,R2 ;SET THE RADIANS FOR THE OBJECT
|
|
STF R2,*+AR4(ORADY)
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL HPFIND_YMATRIX
|
|
LDI *AR5++,R1 ;LOAD OBJECT ID (GENV STYLE)
|
|
LDI R1,R2
|
|
AND CLASS_M|TYPE_M|SUBTYPE_M,R1
|
|
STI R1,*+AR4(OID)
|
|
|
|
LDI AR4,AR2
|
|
CALL OBJ_INSERT ;INSERT THE BABE
|
|
|
|
SUBI 1,R4
|
|
BGE LS_L12
|
|
|
|
LS_ACTIVATE_X
|
|
|
|
CLRI R0
|
|
STI R0,*+AR6(OLINK2)
|
|
LDI @SINGLE_SECTION_TEMPPTR,R0
|
|
|
|
POP AR7
|
|
POP AR6
|
|
POP AR5
|
|
POP AR4
|
|
POP AR2
|
|
POP AR0
|
|
POP R5
|
|
POP R4
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
;*----------------------------------------------------------------------------
|
|
;OIL_PUMP:
|
|
; PUSH AR0
|
|
; PUSH AR2
|
|
; PUSH R2
|
|
; CREATE OILWELL,UTIL_C
|
|
; POP R2
|
|
; POP AR2
|
|
; POP AR0
|
|
; RETS
|
|
;
|
|
;OILWELL_DYNA
|
|
; .word 2 ;#OF DYNAS-1
|
|
;
|
|
;; .float -1197,0,0 ;WHEEL
|
|
; .float 0,-538,0 ;WHEEL
|
|
; .word 41 ;VERTS-1
|
|
; .word 2 ;DYNAFLAG
|
|
;
|
|
; .float -1276,-2325,0 ;HAMMER
|
|
; .word 38 ;VERTS-1
|
|
; .word 3 ;DYNAFLAG
|
|
;
|
|
; .float 0,0,0 ;main body
|
|
; .word 56 ;VERTS-1
|
|
; .word 1 ;DYNAFLAG
|
|
;
|
|
;*
|
|
;*PARAMETERS
|
|
;* AR4 OILWELL OBJECT
|
|
;*
|
|
;*
|
|
;OILWELL:
|
|
; STI AR7,*+AR4(OPLINK)
|
|
;
|
|
; LDI 1,R0
|
|
; LS O_PROC_B,R0
|
|
; OR *+AR4(OFLAGS),R0
|
|
; OR O_DYNAMIC,R0 ;MAKE PARENT OBJECT DYNAMIC
|
|
; STI R0,*+AR4(OFLAGS)
|
|
;
|
|
; LDL OILWELL_DYNA,AR2
|
|
;
|
|
; LDI AR4,AR3
|
|
; ADDI ODYNALIST,AR3
|
|
;
|
|
;*INIT DYNA OBJECTS
|
|
; LDI *AR2++,RC ;GET DYNAMIC OBJECT COUNT (-1)
|
|
; RPTB OWINLP
|
|
;
|
|
; CALL GETDYNA ;LINK HIM INTO LIST
|
|
; STI AR0,*AR3
|
|
;
|
|
;
|
|
; LDF *AR2++,R0
|
|
; STF R0,*+AR0(DYNACENTERX)
|
|
; STF R0,*+AR0(DYNATRANSX)
|
|
; LDF *AR2++,R0
|
|
; STF R0,*+AR0(DYNACENTERY)
|
|
; STF R0,*+AR0(DYNATRANSY)
|
|
; LDF *AR2++,R0
|
|
; STF R0,*+AR0(DYNACENTERZ)
|
|
; STF R0,*+AR0(DYNATRANSZ)
|
|
; LDI *AR2++,R0
|
|
; STI R0,*+AR0(DYNANVERTS)
|
|
; LDI *AR2++,R0
|
|
; STI R0,*+AR0(DYNAFLAG)
|
|
;
|
|
; CMPI 2,R0 ;
|
|
; BNE H75
|
|
; STI AR0,*+AR7(PDATA) ;WHEEL
|
|
;H75
|
|
;
|
|
; CMPI 3,R0 ;
|
|
; BNE H76
|
|
; STI AR0,*+AR7(PDATA+1) ;HAMMER
|
|
;H76
|
|
;
|
|
; STI AR4,*+AR0(DYNAPARENT)
|
|
;OWINLP LDI AR0,AR3
|
|
;
|
|
; LDI 0,R0
|
|
; STI R0,*AR3 ;LAST LINK IS ZERO, DUDES
|
|
;
|
|
; LDI AR3,AR0
|
|
; ADDI DYNAMATRIX,AR0
|
|
; CALL INITMAT
|
|
;
|
|
; CLRF R6
|
|
; CLRF R7
|
|
;
|
|
; LDF 0.1,R0
|
|
; STF R0,*+AR7(PDATA+2)
|
|
;
|
|
;*
|
|
;*
|
|
;* R6 THETA FOR THE WHEELS
|
|
;* R7 THETA FOR THE HAMMER
|
|
;*
|
|
;OILWELLP
|
|
;
|
|
; ADDF 0.1,R6
|
|
; LDF R6,R2
|
|
; CALL NORMITS
|
|
; LDF R2,R6
|
|
; LDI *+AR7(PDATA),AR2
|
|
; ADDI DYNAMATRIX,AR2
|
|
; CALL FIND_ZMATRIX
|
|
;
|
|
;
|
|
; LDF *+AR7(PDATA+2),R0
|
|
; NEGF R0,R1
|
|
;
|
|
; CMPF PI,R7
|
|
; BLT NC1
|
|
; LDF R1,R0
|
|
; BU IRV
|
|
;NC1
|
|
; CMPF -PI,R7
|
|
; BGT IRV
|
|
; LDF R1,R0
|
|
;IRV
|
|
; ADDF R0,R7
|
|
; STF R0,*+AR7(PDATA+2)
|
|
;
|
|
; LDF R0,R2
|
|
; LDI *+AR7(PDATA+1),AR2
|
|
; ADDI DYNAMATRIX,AR2
|
|
; CALL FIND_ZMATRIX
|
|
;
|
|
; SLEEP 1
|
|
; BU OILWELLP
|
|
;*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
OHARE_PLANE:
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH R2
|
|
SONDFX JETFLYBY
|
|
CREATE PLANE_FWRD,UTIL_C
|
|
|
|
STI AR0,*+AR4(OPLINK)
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
OR *+AR4(OFLAGS),R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
POP R2
|
|
POP AR2
|
|
POP AR0
|
|
RETS
|
|
PLANE_FWRD:
|
|
|
|
FLOAT 250,R7
|
|
FLOAT 32000,R6
|
|
MPYF 4,R6
|
|
*
|
|
*
|
|
PLANE_FWL
|
|
|
|
LDF *+AR4(ORADY),R2
|
|
ADDF HALFPI,R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
CALL CLR_VECTORA
|
|
LDF R7,R0
|
|
FLOAT @NFRAMES,R1
|
|
MPYF R1,R0
|
|
STF R0,*+AR2(Z)
|
|
LDI @MATRIXAI,R2
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDI @VECTORAI,AR2
|
|
LDF *+AR4(OPOSX),R0
|
|
ADDF *+AR2(X),R0
|
|
STF R0,*+AR4(OPOSX)
|
|
|
|
LDF *+AR4(OPOSY),R0
|
|
ADDF *+AR2(Y),R0
|
|
ADDF 50,R0
|
|
STF R0,*+AR4(OPOSY)
|
|
|
|
LDF *+AR4(OPOSZ),R0
|
|
ADDF *+AR2(Z),R0
|
|
STF R0,*+AR4(OPOSZ)
|
|
|
|
|
|
ABSF R7,R0
|
|
FLOAT @NFRAMES,R1
|
|
MPYF R1,R0
|
|
SUBF R0,R6
|
|
BLT TRAINX
|
|
|
|
SLEEP 1
|
|
BU PLANE_FWL
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
TRAIN_FWRD_MAKEB:
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH R2
|
|
CREATE TRAIN_FWRDB,UTIL_C
|
|
STI AR0,*+AR4(OPLINK)
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
OR *+AR4(OFLAGS),R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
BU J87
|
|
TRAIN_FWRD_MAKE:
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH R2
|
|
CREATE TRAIN_FWRD,UTIL_C
|
|
STI AR0,*+AR4(OPLINK)
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
OR *+AR4(OFLAGS),R0
|
|
STI R0,*+AR4(OFLAGS)
|
|
|
|
J87 POP R2
|
|
POP AR2
|
|
POP AR0
|
|
RETS
|
|
|
|
TRAIN_FWRDB:
|
|
LDI *+AR4(OUSR1),R0
|
|
ADDI 5,R0 ;kludge to delete later than loaded
|
|
STI R0,*+AR4(OUSR1)
|
|
|
|
FLOAT -150,R7
|
|
FLOAT 32000,R6
|
|
MPYF 8,R6
|
|
BU J765
|
|
|
|
TRAIN_FWRD:
|
|
|
|
FLOAT 150,R7
|
|
FLOAT 32000,R6
|
|
MPYF 3,R6
|
|
J765
|
|
|
|
|
|
*
|
|
*
|
|
TRAIN_FWL
|
|
|
|
CALL CLR_VECTORA
|
|
LDF R7,R0
|
|
FLOAT @NFRAMES,R1
|
|
MPYF R1,R0
|
|
STF R0,*+AR2(Z)
|
|
LDI AR4,R2
|
|
ADDI OMATRIX,R2
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDI @VECTORAI,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)
|
|
|
|
|
|
ABSF R7,R0
|
|
FLOAT @NFRAMES,R1
|
|
MPYF R1,R0
|
|
SUBF R0,R6
|
|
BLT TRAINX
|
|
|
|
SLEEP 1
|
|
BU TRAIN_FWL
|
|
TRAINX
|
|
CLRI R0
|
|
STI R0,*+AR4(OPLINK)
|
|
LDI 1,R0
|
|
LS O_PROC_B,R0
|
|
LDI *+AR4(OFLAGS),R1
|
|
ANDN R0,R1
|
|
STI R1,*+AR4(OFLAGS)
|
|
DIE
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*
|
|
*PARAMETERS
|
|
* AR2 SECTION POINTER
|
|
*
|
|
* OFFSET BY START_POS
|
|
*
|
|
*
|
|
LOAD_SINGLE_SECTION_OFFSET:
|
|
PUSH R4
|
|
PUSH R5
|
|
PUSH AR0
|
|
PUSH AR2
|
|
PUSH AR4
|
|
PUSH AR5
|
|
PUSH AR6
|
|
PUSH AR7
|
|
|
|
|
|
|
|
LDL SINGLE_SECTION_TEMPPTR,AR6
|
|
SUBI OLINK2,AR6
|
|
|
|
LDI AR2,AR5
|
|
INC AR5
|
|
LDI *AR5++,R4 ;get number of objects to load
|
|
SLOCKON LE,"BACKGRND\LOAD_SINGLE_SECTION GROUP ERROR"
|
|
|
|
DEC R4
|
|
|
|
LDF @START_RADY,R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL HPFIND_YMATRIX
|
|
|
|
CMPI @OFREECNT,R4
|
|
SLOCKON GT,"BACKGRND\LOAD_SINGLE_SECTION OUT OF OBJECTS"
|
|
LS_L12O
|
|
|
|
LDI *AR5++,AR2 ;GET MODEL PTR
|
|
CALL OBJ_GETE
|
|
SLOCKON C,"BACKGRND\LOAD_SINGLE_SECTION OUT OF OBJECTS *FATAL*"
|
|
BC LS_ACTIVATE_XO
|
|
LDI AR0,AR4
|
|
|
|
STI AR4,*+AR6(OLINK2)
|
|
LDI AR4,AR6
|
|
|
|
LDI @VECTORAI,AR2
|
|
FLOAT *AR5++,R1 ;GET X POSITION
|
|
STF R1,*+AR2(X)
|
|
FLOAT *AR5++,R1 ;GET Y POSITION
|
|
STF R1,*+AR2(Y)
|
|
FLOAT *AR5++,R1 ;GET Z POSITION
|
|
STF R1,*+AR2(Z)
|
|
|
|
LDI @MATRIXAI,R2
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDF *+AR2(X),R1
|
|
ADDF @START_POS+X,R1
|
|
STF R1,*+AR4(OPOSX)
|
|
|
|
LDF *+AR2(Y),R1
|
|
ADDF @START_POS+Y,R1
|
|
STF R1,*+AR4(OPOSY)
|
|
|
|
LDF *+AR2(Z),R1
|
|
ADDF @START_POS+Z,R1
|
|
STF R1,*+AR4(OPOSZ)
|
|
|
|
LDF *AR5++,R2 ;GET THE RADIANS FOR THE OBJECT
|
|
ADDF @START_RADY,R2
|
|
STF R2,*+AR4(ORADY)
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL HPFIND_YMATRIX
|
|
|
|
LDI *AR5++,R1 ;GET OBJECT ID (GENV STYLE)
|
|
LDI R1,R2
|
|
AND CLASS_M|TYPE_M|SUBTYPE_M,R1
|
|
STI R1,*+AR4(OID)
|
|
|
|
LDI AR4,AR2
|
|
CALL OBJ_INSERT ;INSERT THE BABE
|
|
|
|
SUBI 1,R4
|
|
BGE LS_L12O
|
|
|
|
LS_ACTIVATE_XO
|
|
|
|
CLRI R0
|
|
STI R0,*+AR6(OLINK2)
|
|
LDI @SINGLE_SECTION_TEMPPTR,R0
|
|
|
|
POP AR7
|
|
POP AR6
|
|
POP AR5
|
|
POP AR4
|
|
POP AR2
|
|
POP AR0
|
|
POP R5
|
|
POP R4
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*USE ACTUAL ID (0FFFh)
|
|
*
|
|
.globl RRSTART_ENGINE,RRSTART_FLATBED,RRSTART_BOXCAR
|
|
.globl COPBLOCK,COPBLOCK2
|
|
|
|
ROUTINE_TABI .word ROUTINE_TAB
|
|
ROUTINE_TAB:
|
|
.word 40Ah,FLAGWAVE
|
|
.word 460h,ROAD_DEBRIS_CREATE
|
|
.word 461h,ROAD_DEBRIS_CREATE_55GAL
|
|
.word 462h,ROAD_DEBRIS_CREATE_55GAL ;actually TOXIC
|
|
.word 463h,ROAD_DEBRIS_CREATE_55GAL ;actually CONE
|
|
.word 465h,FLAGWAVE ;short flag
|
|
.word 466h,FLAGWAVE_TALL ;tall flag
|
|
;
|
|
.word 467h,WATERFALL
|
|
.word 469h,OVERCAR ;LA & CHICAGO, FREEWAY OVERPASS CAR
|
|
.word 470h,RRSTART_ENGINE
|
|
.word 471h,RRSTART_BOXCAR
|
|
.word 472h,RRSTART_BOXCAR
|
|
.word 473h,RRSTART_BOXCAR
|
|
.word 474h,RRSTART_BOXCAR
|
|
.word 475h,RRSTART_BOXCAR
|
|
.word 476h,RRSTART_BOXCAR
|
|
;
|
|
.word 481h,SMOKE_STACK
|
|
.word 482h,CAR_FIRE
|
|
;
|
|
; .word 485h,TRAIN_FWRD_MAKEB ;CHICAGO TRAIN FORWARD SPECIFIED DISTANCE BOXCAR (BRIDGE)
|
|
; .word 486h,TRAIN_FWRD_MAKEB ;CHICAGO TRAIN FORWARD SPECIFIED DISTANCE ENGINE (BRIDGE)
|
|
; .word 487h,OIL_PUMP ;RUSHMORE OIL PUMP
|
|
; .word 495h,TRAIN_FWRD_MAKE ;CHICAGO TRAIN FORWARD SPECIFIED DISTANCE BOXCAR
|
|
; .word 496h,TRAIN_FWRD_MAKE ;CHICAGO TRAIN FORWARD SPECIFIED DISTANCE ENGINE
|
|
.word 498h,OHARE_PLANE ;CHICAGO AIRPLANE
|
|
;
|
|
.word 741h,RUT_ANI
|
|
.word 742h,HUNGH_ANI
|
|
|
|
.word 4A1h,DC_FOUNTAIN
|
|
.word 4A2h,DC_MINIFOUNTAIN
|
|
.word 0 ;END OF TABLE ID
|
|
*----------------------------------------------------------------------------
|
|
.END
|