cruisin-usa/INFIN.ASM

896 lines
14 KiB
NASM
Executable File

.FILE "INFIN.ASM"
*----------------------------------------------------------------------------
*
*
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
*ALL RIGHTS RESERVED
*
.include MACS.EQU
.include OBJ.EQU
.include OBJECTS.EQU
.include GLOBALS.EQU
.include SYS.EQU
.include VUNIT.EQU
.include PALL.EQU
.bss CAMRADY,1 ;NORMALIZED 0-2PI CAMERA RAD
*----------------------------------------------------------------------------
*SEARCH THE ROAD OBJECTS AND FIND THE HIGHEST POSITIONED OBJECT.
*
*Note that the case of the player being inverted can not happen because the
*infinity plane would freak out, and who knows what would happen then, so we
*assume that this case is not present. Therefore we can simply say the the
*highest valued Y position of the objects is the highest Y position, and then
*only that value must be projected in Y.
*
*
HIGH_CLIP_LEVEL .set (5000-1) ;ACTUAL # OF ENTRIES
.bss HIGHEST_ROADY,1 ;FL CLIP LEVEL IN Y
.bss HIGHEST_ROADY_X,1 ;FL CLIP LEVEL IN Y
.bss VAR_ROAD_KFACTOR,1 ;FL CLIPPING OVERSHOOT FACTOR
FIND_HIGHEST_ROADY:
PUSH R0
PUSH R1
PUSH R2
PUSH R3
PUSH R6
PUSH R7
PUSH AR2
FLOAT 512,R6
STPF R6,@HIGHEST_ROADY
CLRF R7 ;CORRESPONDING Z POS
LDI @DYNALIST_BEGIN,AR2
CMPI 0,AR2
BEQ FHRY_X
FHRYLP
LDI *+AR2(OFLAGS),R0
AND O_LIST_M,R0
CMPI O_LIST1,R0 ;OACTIVE ONLY!
BNE NOCHANCE
;use leftover CAMERAMATRIX
;
LDI @VECTORAI,AR1
LDP @_CAMERAPOS+X
LDF *+AR2(OPOSX),R0
SUBF @_CAMERAPOS+X,R0
STF R0,*+AR1(X)
LDF *+AR2(OPOSY),R0
SUBF @_CAMERAPOS+Y,R0
STF R0,*+AR1(Y)
LDF *+AR2(OPOSZ),R0
SUBF @_CAMERAPOS+Z,R0
STF R0,*+AR1(Z)
SETDP
LDI AR1,AR0
LDI @CAMERAMATRIXI,AR1 ;AR1 IS 3X3 MATRIX
;matrix mul really only concerned with Y
;
MPYF *AR0++,*AR1++,R0
MPYF *AR0,*AR1++,R2
MPYF *+AR0(1),*AR1++,R0
|| ADDF R0,R2
MPYF *-AR0(1),*AR1++,R0
|| ADDF R0,R2
PUSHF R2
MPYF *AR0,*AR1++,R2
MPYF *+AR0(1),*AR1++,R0
|| ADDF R0,R2
ADDF R0,R2
;
POPF R3
LDI *+AR2(ODIST),AR1
CMPI 0,AR1
BLE NOCHANCE
RS 4,AR1 ;/16
CMPI HIGH_CLIP_LEVEL,AR1
BGE NOCHANCE
ADDI @INVTABI,AR1
MPYF *AR1,R3
ADDF @SCRNHXI,R3 ;this is the clip level (in Y)
CMPF 0,R3
BLT NOCHANCE
FLOAT 512,R0
CMPF R0,R3
BGT NOCHANCE
MPYF *AR1,R2
ADDF @SCRNHYI,R2 ;this is the clip level (in Y)
CMPF R2,R6
LDFGT R2,R6
LDFGT R3,R7 ;SAVE X VALUE
NOCHANCE
LDI *+AR2(OLINK4),AR2
CMPI 0,AR2
BNE FHRYLP
;no kludge factor nessesary
ADDF @VAR_ROAD_KFACTOR,R6 ;pixels UNDER (overshoot)
CMPF 0,R6
LDFLT 0,R6
STPF R6,@HIGHEST_ROADY
STPF R7,@HIGHEST_ROADY_X ;SAVE X VALUE
FHRY_X
POP AR2
POP R7
POP R6
POP R3
POP R2
POP R1
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*PLOT INFINITY PLANE
*
*VERTICES TRANSFORMED AS
* 1 3 5
*
* 0 2 4 etc.
*
*
.bss AMOUNT_CLIPPED,1
FORMULA .float -244.4619926 ;(6*256)/2PI (convert radians to length of infinity plane)
LOWVAL .float -1536
HIGHVAL .float 1536
LOIVAL .word -768
HIGHIVAL .word 1536
INFPROJ .float 0.0064
INFVAL .float 80000
*
*
*
INFINITY:
LDI @_MODE,R0
TSTB MINTUNNEL,R0
RETSNZ
AND MMODE,R0
CMPI MGAME,R0
CALLEQ FIND_HIGHEST_ROADY
;KEEP CAMERARAD Y IN RANGE +-2 PI
LDP @_CAMERARAD
LDF @_CAMERARAD+Y,R2
SETDP
BLT INFF0
CMPF @TWOPII,R2
BLT INFF1
INFF0
SETDP
CALL NORMIT ;SAVE TRUNCATED VERSION
LDP @_CAMERARAD
STF R2,@_CAMERARAD+Y
SETDP
INFF1
STF R2,@CAMRADY
;
;FIND HORIZON X OFFSET
MPYF @FORMULA,R2
FIX R2
CMPI @HIGHIVAL,R2
BLT OK23
SUBI @HIGHIVAL,R2
OK23
CMPI @LOIVAL,R2
BGT OK554
ADDI @HIGHIVAL,R2
OK554
FLOAT R2,R6 ;R6 = HORIZON X OFFSET
;REMOVE Y AXIS ROTATION FROM CAMERA MATRIX
;
;
LDI @MATRIXAI,AR2 ;find_Ymatrix(&MATRIXA, -CAMERARAD.y);
NEGF @CAMRADY,R2 ;concatmat(&MATRIXA, &CAMERAMATRIX, &MATRIXA);
CALL FIND_YMATRIX
LDI AR2,R3
LDI @CAMERAMATRIXI,R2
CALL CONCATMAT
;GET Y HEIGHT OF CLIP ELEMENT
LDF @HIGHEST_ROADY,R0
ADDF 25,R0
LDF @INFIN_CORRECT,R1
ADDF @SCRNHYI,R1
SUBF R1,R0
LDFLT 0,R0
LDI @_MODE,R1
AND MMODE,R1
CMPI MGAME,R1
LDFNE 0,R0
STF R0,@AMOUNT_CLIPPED
;
;a2c = hsy - hy
;0 - amount to clip
;ROTATE INFINITY PLANE COORDS
LDI @INFINITY_POINTS,AR5
LDI @BLOWLISTI,AR6
LDI 33,AR4
CALL TRANS_PTS
LDI sky1_p,AR2
CALL PAL_FIND
LDI R0,AR2
LDP @FIFO_ADDR,AR5
LS 16,AR5
LDI @INFIN_POLYGONSI,AR0
LDI 0FE00h,R4 ;AIVI[0] = 0xff00
LDI 00000h,R5 ;AIVI[1] = 0x3800
LDI 000FFh,R6 ;AIVI[2] = 0x38FF
LDI 0FEFFh,R7 ;AIVI[3] = 0xffFF
FIX @AMOUNT_CLIPPED,R3
LDI 11,AR4
LDI @BLOWLISTI,AR6
LDI 0,AR1 ;ML FIX
LDP @FIFO_STATUS
LOOP LDI @FIFO_STATUS,R0
AND FIFO_STATUS_MAX_FLAG,R0
BNZ LOOP
SETDP
LDI TM,R0
STI R0,*AR5 ;ACNTL = 0x900;
;optimize this, its the same palette ALWAYS
;
;
LDI *AR0++,AR2
CALL PAL_FIND
STI R0,*AR5 ;ACMAP
;ORDER: 0,1,3,2
LDI @_MODE,R0
TSTB MWATER,R0
BNZ NOCLIPPING
AND MMODE,R0
CMPI MGAME,R0
BNE NOCLIPPING
;
;clip to horizon plane
;
; A B
; e
; D C
;
;
;1. find line equation for DC
;
PUSH AR0
PUSH AR1
PUSH BK
LDI AR6,AR0 ;C
ADDI 9,AR0
LDI AR6,AR1 ;D
ADDI 6,AR1
LDI @VECTORAI,AR2
CALL GETLINE_EQ_2D
;
;2. distance to line
;
LDI AR2,AR0
LDI @VECTORCI,AR1
LDF @HIGHEST_ROADY_X,R0
STF R0,*+AR1(X)
LDF @HIGHEST_ROADY,R0
STF R0,*+AR1(Y)
CALL DIST_PT2LINE
POP BK
POP AR1
POP AR0
;
;3. abort clipping attempt if no collision exists
;
LDF R0,R0
BLT NOCLIPPING
FIX R0,R3 ;amount to clip off each line
;
;compute BA slope
;
LDF *+AR6(3),R0
SUBF *+AR6(0),R0
LDF *+AR6(4),R1
SUBF *+AR6(1),R1
CMPF 0,R0
BEQ II33
CMPF 0,R1
BNE II
II33 CLRF R0
BU III44
II CALL DIV_F
III44 FIX R0,R4
FIX *AR6,R0
SUBI R4,R0
STI R0,*AR5 ;ARPS[0][0]
FIX *+AR6(1),R0
SUBI R3,R0
STI R0,*AR5 ;ARPS[0][1]
FIX *+AR6(3),R0
STI R0,*AR5 ;ARPS[1][0]
FIX *+AR6(4),R0
STI R0,*AR5 ;ARPS[1][1]
FIX *+AR6(9),R0
STI R0,*AR5 ;ARPS[2][0]
FIX *+AR6(10),R0
STI R0,*AR5 ;ARPS[2][1]
FIX *+AR6(6),R0
SUBI R4,R0
STI R0,*AR5 ;ARPS[3][0]
FIX *+AR6(7),R0
SUBI R3,R0
STI R0,*AR5 ;ARPS[3][1]
NOP *AR6++(6)
LDI 0FE00h,R4 ;AIVI[0] = 0xff00
LDI R4,R0
RS 8,R0
SUBI R3,R0
LDI R4,R1
AND 0FFh,R1
LS 8,R0
OR R0,R1
STI R1,*AR5 ;AIV0
STI R5,*AR5 ;AIV1
STI R6,*AR5 ;AIV2
LDI R7,R0
RS 8,R0
SUBI R3,R0
LDI R7,R1
AND 0FFh,R1
LS 8,R0
OR R0,R1
STI R1,*AR5 ;AIV3
LDI *AR0++,R0
STI R0,*AR5 ;ADDR
LDP @FIFO_INC
LDI @FIFO_INC,R0
LDI *AR1,R0 ;ML FIX
RPTS 4
NOP
SETDP
DBU AR4,LOOP
BU PLOT_CONSTANTS
*
*
*
NOCLIPPING
;DUMP X
FIX *AR6,R0
STI R0,*AR5 ;ARPS[0][0]
FIX *+AR6(1),R0
STI R0,*AR5 ;ARPS[0][1]
FIX *+AR6(3),R0
STI R0,*AR5 ;ARPS[1][0]
FIX *+AR6(4),R0
STI R0,*AR5 ;ARPS[1][1]
FIX *+AR6(9),R0
STI R0,*AR5 ;ARPS[2][0]
FIX *+AR6(10),R0
STI R0,*AR5 ;ARPS[2][1]
FIX *+AR6(6),R0
STI R0,*AR5 ;ARPS[3][0]
FIX *+AR6(7),R0
STI R0,*AR5 ;ARPS[3][1]
NOP *AR6++(6)
STI R4,*AR5 ;AIV0
STI R5,*AR5 ;AIV1
STI R6,*AR5 ;AIV2
STI R7,*AR5 ;AIV3
LDI *AR0++,R0
STI R0,*AR5 ;ADDR
LDP @FIFO_INC
LDI @FIFO_INC,R0
LDI *AR1,R0 ;ML FIX
RPTS 4
NOP
SETDP
DBU AR4,LOOP
PLOT_CONSTANTS
;
;CONSTANT COLOR POLYGONS
;
LDI sky1_p,AR2
CALL PAL_FIND
LDI R0,AR2
LDI @INFIN_POLYGONSI,AR0
LDI 2,AR4
LDI @BLOWLISTI,AR6
ADDI 26*3,AR6
LDI 0,AR1 ;ML FIX
LOOP1A LDP @FIFO_STATUS
LOOP1 LDI @FIFO_STATUS,R0
AND FIFO_STATUS_MAX_FLAG,R0
BNZ LOOP1
SETDP
LDI 30,R0 ;CONSTANT COLOR = 1
STI R0,*AR5 ;ACNTL
STI AR2,*AR5 ;ACMAP
;0,1,3,2
;DUMP X
FIX *AR6,R0
STI R0,*AR5 ;ARPS[0][0]
FIX *+AR6(1),R0
STI R0,*AR5 ;ARPS[0][1]
FIX *+AR6(3),R1
STI R1,*AR5 ;ARPS[1][0]
FIX *+AR6(4),R1
STI R1,*AR5 ;ARPS[1][1]
FIX *+AR6(9),R2
STI R2,*AR5 ;ARPS[2][0]
FIX *+AR6(10),R2
STI R2,*AR5 ;ARPS[2][1]
FIX *+AR6(6),R3
STI R3,*AR5 ;ARPS[3][0]
FIX *+AR6(7),R3
STI R3,*AR5 ;ARPS[3][1]
NOP *AR6++(6)
STI R4,*AR5 ;AIV0
STI R5,*AR5 ;AIV1
STI R6,*AR5 ;AIV2
STI R7,*AR5 ;AIV3
LDI *AR0++,R0
STI R0,*AR5 ;ADDR
LDP @FIFO_INC
LDI @FIFO_INC,R0
LDI *AR1,R0 ;ML FIX
SETDP
DBU AR4,LOOP1A
LDI @_MODE,R0
TSTB MWATER,R0
CALLNZ WATER_INFINITY
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
INFINITY_POINTS .word INFINPOINTS
INFINPOINTS
.float -1280,0,0
.float -1280,-255,0
.float -1024,0,0
.float -1024,-255,0
.float -768,0,0
.float -768,-255,0
.float -512,0,0
.float -512,-255,0
.float -256,0,0
.float -256,-255,0
.float 0,0,0
.float 0,-255,0
.float 256,0,0
.float 256,-255,0
.float 512,0,0
.float 512,-255,0
.float 768,0,0
.float 768,-255,0
.float 1024,0,0
.float 1024,-255,0
.float 1280,0,0
.float 1280,-255,0
.float 1536,0,0
.float 1536,-255,0
.float 1792,0,0
.float 1792,-255,0
.float -1280,-253,0
.float -1280,-1250,0
.float -300,-253,0
.float -300,-1250,0
.float 700,-253,0
.float 700,-1250,0
.float 1700,-253,0
.float 1700,-1250,0
INFIN_POLYGONSI .word BLUESKY
BLUESKY .word sky1_p,sky1_I,sky1_p,sky2_I,sky1_p,sky3_I,sky1_p,sky4_I,sky1_p,sky5_I,sky1_p,sky6_I
.word sky1_p,sky1_I,sky1_p,sky2_I,sky1_p,sky3_I,sky1_p,sky4_I,sky1_p,sky5_I,sky1_p,sky6_I
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*
*PARAMETERS
* AR4 NUMBER OF VERTICES
* AR5 POINTERS [X Y Z]
* AR6 RAM BUFFER
*
*
*
.bss INFIN_CORRECT,1
TRANS_PTS:
; LDF @AMOUNT_CLIPPED,R4
LDF @INFIN_CORRECT,R7
; FLOAT 8000,R0
; MPYF 10,R0
; LDP @_CAMERARAD
; LDF @_CAMERARAD+X,R2
; SETDP
;
; CALL DISTANCE_2D
; LDLF 0.006401,R2
; MPYF R2,R0
; ADDF R0,R7
; ;R1 is distance
TRANS_LP
LDI @VECTORAI,AR2
LDF *AR5++,R0 ;load src [X Y Z]
ADDF R6,R0 ;add in X offset
LDP @HIGHVAL
CMPF @HIGHVAL,R0
BLT LKJ2
SUBF @HIGHVAL,R0
LKJ2
STF R0,*AR2++
ADDF R7,*AR5++,R0 ;ADD IN HEIGHT DUDES !!!
STF R0,*AR2++
LDF *AR5++,R0
STF R0,*AR2--(2)
LDI AR6,R3
LDP @MATRIXAI
LDI @MATRIXAI,R2
CALL MATRIX_MUL
LDF *AR6,R0
LDP @SCRNHXI
ADDF @SCRNHXI,R0
STF R0,*AR6++
LDF *AR6,R0
MPYF 1.04,R0
LDP @SCRNHYI
ADDF @SCRNHYI,R0
STF R0,*AR6++(2)
DEC AR4
LDI @VECTORAI,AR2
LDF *AR5++,R0 ;load src [X Y Z]
ADDF R6,R0 ;add in module offset
LDP @HIGHVAL
CMPF @HIGHVAL,R0
BLT LKJ25
SUBF @HIGHVAL,R0
LKJ25
STF R0,*AR2++
ADDF R7,*AR5++,R0 ;ADD IN HEIGHT DUDES !!!
STF R0,*AR2++
LDF *AR5++,R0
STF R0,*AR2--(2)
LDI AR6,R3
LDP @MATRIXAI
LDI @MATRIXAI,R2
CALL MATRIX_MUL
LDF *AR6,R0
LDP @SCRNHXI
ADDF @SCRNHXI,R0
STF R0,*AR6++
LDF *AR6,R0
MPYF 1.04,R0
LDP @SCRNHYI
ADDF @SCRNHYI,R0
STF R0,*AR6++(2)
DBU AR4,TRANS_LP
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*DISPLAY THE WATER TO THE SCREEN
*
*THIS MUST BE CALLED AFTER INFINITY
*
WATER_INFINITY:
LDF @CAMRADY,R2
;FIND HORIZON X OFFSET
MPYF @FORMULA,R2
FIX R2
LDP @HIGHIVAL
CMPI @HIGHIVAL,R2
BLT ok23a
SUBI @HIGHIVAL,R2
ok23a
LDP @LOIVAL
CMPI @LOIVAL,R2
BGT ok24a
ADDI @HIGHIVAL,R2
ok24a
FLOAT R2,R6 ;R6 = HORIZON X OFFSET
;REMOVE Y AXIS ROTATION FROM CAMERAERSE MATRIX
;
;
LDI @MATRIXAI,AR2
NEGF @CAMRADY,R2 ;find_Ymatrix(&MATRIXA, -CAMERARAD.y);
PUSH AR2 ;concatmat(&MATRIXA, &CAMERAMATRIX, &MATRIXA);
CALL FIND_YMATRIX
POP AR2
LDI AR2,R3
LDP @CAMERAMATRIXI
LDI @CAMERAMATRIXI,R2
CALL CONCATMAT
;GET Y HEIGHT OF INFINITY PLANE
LDP @_MATRIXA ;GET HEIGHT OF HORIZON AT INFINITY
LDF @_MATRIXA+5,R7
MPYF 64,R7 ;MULTIPLY X 512
MPYF 8,R7 ;A7 = HEIGHT
LDP @_CAMERAMATRIX
LDF @_CAMERAMATRIX+7,R2 ;GET ZVECT(Y)
LDF @_CAMERAMATRIX+4,R1 ;GET YVECT(Y)
SETDP
LDP @INFVAL
MPYF @INFVAL,R0
CALL DIV_F
LDP @INFPROJ
MPYF @INFPROJ,R0
LDF R0,R7
NEGF R7
;ROTATE INFINITY PLANE COORDS
LDI @WATERPOSI,AR5
LDI @BLOWLISTI,AR6
LDI 26,AR4
CALL TRANS_PTS
LDI wtra_p,AR2
CALL PAL_FIND
LDI R0,AR2
LDP @FIFO_ADDR,AR5
LS 16,AR5
LDI 0AD00h,R4 ;AIVI[0] = 0xff00
LDI 00100h,R5 ;AIVI[1] = 0x3800
LDI 001FFh,R6 ;AIVI[2] = 0x38FF
LDI 0ADFFh,R7 ;AIVI[3] = 0xffFF
LDI 11,AR4
LDI @BLOWLISTI,AR6
LDP @FIFO_STATUS
LDI 0,AR1 ;ML FIX (BOGUS READ)
LOOPA LDI @FIFO_STATUS,R0
AND FIFO_STATUS_MAX_FLAG,R0
BNZ LOOPA
SETDP
LDI TM,R0
STI R0,*AR5 ;ACNTL = 0x900;
STI AR2,*AR5 ;ACMAP
;0,1,3,2
;DUMP X
FIX *AR6,R0
STI R0,*AR5 ;ARPS[0][0]
FIX *+AR6(1),R0
LDI 400,R0
STI R0,*AR5 ;ARPS[0][1]
FIX *+AR6(3),R0
STI R0,*AR5 ;ARPS[1][0]
FIX *+AR6(4),R0
STI R0,*AR5 ;ARPS[1][1]
FIX *+AR6(9),R0
STI R0,*AR5 ;ARPS[2][0]
FIX *+AR6(10),R0
STI R0,*AR5 ;ARPS[2][1]
FIX *+AR6(6),R0
STI R0,*AR5 ;ARPS[3][0]
FIX *+AR6(7),R0
LDI 400,R0
STI R0,*AR5 ;ARPS[3][1]
NOP *AR6++(6)
STI R4,*AR5 ;AIV0
STI R5,*AR5 ;AIV1
STI R6,*AR5 ;AIV2
STI R7,*AR5 ;AIV3
LDIL wtra_I,R0
STI R0,*AR5 ;ADDR
LDP @FIFO_INC
LDI @FIFO_INC,R0
LDI *AR1,R0 ;ML FIX (BOGUS READ)
SETDP
RPTS 4
NOP
DBU AR4,LOOPA
RETS
WATERPOSI .word WATERPOS
WATERPOS
.float -1280,128,0
.float -1280,0,0
.float -1024,128,0
.float -1024,0,0
.float -768,128,0
.float -768,0,0
.float -512,128,0
.float -512,0,0
.float -256,128,0
.float -256,0,0
.float 0,128,0
.float 0,0,0
.float 256,128,0
.float 256,0,0
.float 512,128,0
.float 512,0,0
.float 768,128,0
.float 768,0,0
.float 1024,128,0
.float 1024,0,0
.float 1280,128,0
.float 1280,0,0
.float 1536,128,0
.float 1536,0,0
.float 1792,128,0
.float 1792,0,0
*----------------------------------------------------------------------------
.END