3007 lines
56 KiB
NASM
Executable File
3007 lines
56 KiB
NASM
Executable File
.FILE "HSTDP.ASM"
|
|
*----------------------------------------------------------------------------
|
|
*HSTD PROCESSES
|
|
*
|
|
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
|
|
*ALL RIGHTS RESERVED
|
|
*
|
|
|
|
.include MPROC.EQU
|
|
.include MACS.EQU
|
|
.include OBJ.EQU
|
|
.include OBJECTS.EQU
|
|
.include GLOBALS.EQU
|
|
.include SYS.EQU
|
|
.include TEXT.EQU
|
|
.include VUNIT.EQU
|
|
.include CMOS.EQU
|
|
.include SNDTAB.EQU
|
|
.include PALL.EQU
|
|
.include SYSID.EQU
|
|
|
|
|
|
FLASH_ON .set 1 ;TURN THIS OFF TO LOOSE FLASHING
|
|
.global DISPLAY_HIGH_SCORES
|
|
|
|
.data
|
|
|
|
PLATE_LETTERSI .word PLATE_LETTERS
|
|
THREED_LETTERSI .word THREED_LETTERS
|
|
EIPI .word EIP
|
|
SCROLLBTABI .word SCROLLBTAB
|
|
DELISTI .word DELIST
|
|
NUMTABI .word NUMTAB
|
|
|
|
.SECT "THEDATA"
|
|
|
|
.include scroll.pal
|
|
.include plate.pal
|
|
|
|
;These are for the license plate and pressing of the plate
|
|
|
|
PRESS_DIAM .set 271 ;NOTE: The plate is on the bottom surface
|
|
PRESS_RADX .set 1.5708
|
|
ROLLER_ZOFF .set 620
|
|
PRESS_STARTZ .set -1300
|
|
PRESS_LASTZ .set -2100 ;-1900
|
|
PRESS_TRAVELZ .set PRESS_LASTZ-PRESS_STARTZ
|
|
;PRESS_STARTY .set -30
|
|
PRESS_STARTY .set -45
|
|
PRESS_LASTY .set -100
|
|
PRESS_TRAVELY .set PRESS_LASTY-PRESS_STARTY
|
|
HIGH_SCORE_GROUP .set 200h
|
|
|
|
|
|
NUMTAB .word dzero,done,dtwo,dthree,dfour,dfive,dsix,dseven,deight,dnine
|
|
|
|
THREED_LETTERS .word ma,mb,mc,md,me,mf,mg,mh,mi,mj,mk,ml,mm,mn,mo,mp,mq,mr
|
|
.word ms,mt,mu,mv,mw,mx,my,mz
|
|
THREED_END .set $-THREED_LETTERS
|
|
|
|
RUB .set 'Z'-'A'+1
|
|
PLATE_LETTERS .word pa,pb,pc,pd,pe,pf,pg,ph,pi,pj,pk,pl,pm,pn,po,pp,pq,pr
|
|
.word ps,pt,pu,pv,pw,px,py,pz,arrow,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,pend
|
|
LAST_LETTER
|
|
LASTCHAR .set LAST_LETTER-PLATE_LETTERS-1
|
|
EIP .string "ENTER INITIALS",0
|
|
.text
|
|
*----------------------------------------------------------------------------
|
|
LETTER0 .set PDATA+3
|
|
LETTER1 .set PDATA+4
|
|
LETTER2 .set PDATA+5
|
|
darkp_pal .set PDATA+6
|
|
medp_pal .set PDATA+7
|
|
lightp_pal .set PDATA+8
|
|
lightp1_pal .set PDATA+9
|
|
|
|
INIT0 .set PDATA ;ptr to obj 0 (1st char)
|
|
INIT1 .set PDATA+1 ; 1
|
|
INIT2 .set PDATA+2 ; 2
|
|
STRFREE .set PDATA+3 ;steering wheel amount of free spin
|
|
STRSTRT .set PDATA+4 ;steering wheel minimum
|
|
PEDTRIG .set PDATA+5 ;middle of pedal (pedal trigger)
|
|
OLDPOT0 .set PDATA+6
|
|
FLASH_PROC .set PDATA+6 ;Not used at the same time as OLDPOT0
|
|
INITI0 .set PDATA+7 ;initial index
|
|
INITI1 .set PDATA+8 ;initial index
|
|
INITI2 .set PDATA+9 ;initial index
|
|
|
|
PLATEOBJ .set PDATA+10
|
|
PRESSOBJ .set PDATA+11
|
|
BPRESSOBJ .set PDATA+12
|
|
SCROLLBOBJ .set PDATA+13
|
|
FRAMEOBJ .set PDATA+14 ;No longer used
|
|
MISPLATEOBJ .set PDATA+15
|
|
HSPOINTER .set PDATA+16
|
|
PLACE .set PDATA+17
|
|
WHITE_PAL .set PDATA+18
|
|
ARMSOBJ .set PDATA+19
|
|
TEMP_STR .set PDATA+20 ;10 long
|
|
CAMX .set PDATA+30
|
|
CAMY .set PDATA+31
|
|
CAMZ .set PDATA+32
|
|
RACE_NUMBER .set PDATA+33
|
|
GREY_PAL .set PDATA+34
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
ENTER_INITIALS:
|
|
CALL INTO_TABLE_P
|
|
BC GOODENOUGH
|
|
RETP ;NOPE, didn't make it
|
|
GOODENOUGH
|
|
STI R0,*+AR7(PLACE)
|
|
;Wait for LOADING TO END
|
|
LDI 1,R0
|
|
STI R0,@NOSWAP
|
|
|
|
LDI 0,R4
|
|
MSLP2
|
|
LDI @DECOMP_ACTIVE,R0
|
|
BNZ MSLP3
|
|
ADDI 1,R4
|
|
CMPI 3,R4
|
|
BGT MSLPX ;Done Loading
|
|
MSLP3
|
|
SLEEP 1
|
|
BU MSLP2
|
|
MSLPX
|
|
|
|
|
|
LDI 0,R0
|
|
STI R0,@NOAERASE
|
|
|
|
CALL SILENT
|
|
SOND1 ENTER_INITS_THEME ;Play the Initials entry theme
|
|
|
|
CALL OBJ_INIT ;Zero out object data list pointers
|
|
CALL TEXT_INIT
|
|
|
|
FLOAT -512,R0
|
|
STF R0,@INFIN_CORRECT
|
|
|
|
LDI @_MODE,R0
|
|
ANDN MMODE|MWATER|MBRIDGE|MINTUNNEL,R0
|
|
OR MINIT|MINFIN|MHS,R0
|
|
STI R0,@_MODE
|
|
|
|
LDI UTIL_C|TEXTP_T,R0
|
|
LDI -1,R1
|
|
CALL PRC_KILLALL
|
|
|
|
CLRI R0 ;Black background
|
|
STI R0,@BGNDCOLA
|
|
|
|
LDP @_CAMERAPOS+X ;Initialize the camera
|
|
LDF -24,R0
|
|
STF R0,@_CAMERAPOS+X
|
|
FLOAT PRESS_STARTY,R0
|
|
STF R0,@_CAMERAPOS+Y
|
|
FLOAT PRESS_STARTZ,R0
|
|
STF R0,@_CAMERAPOS+Z
|
|
|
|
CLRF R2
|
|
STF R2,@_CAMERARAD+Y
|
|
SETDP
|
|
LDI @CAMERAMATRIXI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
; CALL CLEANUP_PALS
|
|
CALL LOAD_FIXED_PALETTES
|
|
|
|
LDL press_PALETTES,AR2
|
|
CALL HARDalloc_section
|
|
|
|
|
|
|
|
FIFO_CLRP R0 ;IS THE FIFO CLEAR
|
|
DMA_WT R0
|
|
|
|
|
|
CALL FIFO_RESET ;This will load the wave ram before continuing on
|
|
LDI 1,R0
|
|
STI R0,@HARD_SECTION_LOAD
|
|
|
|
LDL _SECpress,AR2
|
|
CALL LOAD_SECTION_REQ
|
|
|
|
LDL scroll_white,AR2 ;This is the palette for the letters
|
|
CALL PAL_ALLOC_RAW
|
|
STI R0,*+AR7(WHITE_PAL)
|
|
|
|
LDL press_grp,AR2
|
|
CALL LOAD_SINGLE_SECTION
|
|
|
|
CALL INIT_PRESS_OBJECTS ;Go and set up pointers to special Objects
|
|
|
|
CALL RESCAN
|
|
|
|
LDI 0,R0
|
|
STI R0,@NOSWAP
|
|
|
|
LDI LASTCHAR+1,R0 ;Set the steering wheel selection
|
|
STI R0,@POSES
|
|
LDI LASTCHAR/2,R0
|
|
STI R0,@POSE
|
|
|
|
LDI 20,R0 ;Set the number of seconds to enter your initials
|
|
STI R0,@_countdown
|
|
|
|
|
|
;GET THE OBJECTS
|
|
;
|
|
LDL scroll_gr2,AR2 ;Palette used for the Letters on the bottom of the press
|
|
CALL PAL_ALLOC_RAW
|
|
STI R0,*+AR7(GREY_PAL)
|
|
|
|
CALL CHECK_FIRST_TIME
|
|
BC PRESS_CODE_ENTRY
|
|
LDI *+AR7(WHITE_PAL),R4
|
|
FLOAT -LETTER_SIZEX-LETTER_SIZEX/4,R5 ;Position of the first letter
|
|
FLOAT -103+LETTER_YOFF,R6
|
|
FLOAT -PRESS_DIAM-73,R7
|
|
|
|
LDI ' ',R0
|
|
STI R0,*+AR7(INITI0)
|
|
STI R0,*+AR7(INITI1)
|
|
STI R0,*+AR7(INITI2)
|
|
LDL pa,AR2 ;Create the first Letter
|
|
CALL OBJ_GETE
|
|
STI AR0,*+AR7(INIT0)
|
|
STI R4,*+AR0(OPAL)
|
|
STF R5,*+AR0(OPOSX)
|
|
STF R6,*+AR0(OPOSY)
|
|
STF R7,*+AR0(OPOSZ)
|
|
FLOAT LETTER_SIZEX,R0
|
|
ADDF R0,R5
|
|
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERT
|
|
|
|
|
|
LDL po,AR2 ;Create the second letter
|
|
CALL OBJ_GETE
|
|
STI AR0,*+AR7(INIT1)
|
|
STI R4,*+AR0(OPAL)
|
|
STF R5,*+AR0(OPOSX)
|
|
STF R6,*+AR0(OPOSY)
|
|
STF R7,*+AR0(OPOSZ)
|
|
FLOAT LETTER_SIZEX,R0
|
|
ADDF R0,R5
|
|
|
|
LDL po,AR2 ;Create the third letter
|
|
CALL OBJ_GETE
|
|
STI AR0,*+AR7(INIT2)
|
|
STI R4,*+AR0(OPAL)
|
|
STF R5,*+AR0(OPOSX)
|
|
STF R6,*+AR0(OPOSY)
|
|
STF R7,*+AR0(OPOSZ)
|
|
|
|
CREATE ENTERTEXT,SPAWNER_C ;This will slide in the text "ENTER INITIALS"
|
|
|
|
|
|
CLRI AR5 ;character index
|
|
LDF @STEERCT,R0
|
|
STF R0,@WHEELPOS
|
|
|
|
CALL GETCHOICE ;READS the steering wheel, uses POSES = number of choices
|
|
LDI @POSE,R4 ;On return POSE = Choice wheel is pointing at.
|
|
STI R4,*+AR7(OLDPOT0)
|
|
|
|
LDI 0,R0 ;CLEAR OUT LEFT OVER START HIT
|
|
STI R0,@START_HIT
|
|
|
|
LDF @PEDALMN,R0
|
|
LDF @PEDALMX,R1
|
|
SUBF R0,R1
|
|
FIX R1
|
|
RS 1,R1
|
|
FIX @PEDALMN,R0
|
|
ADDI R0,R1
|
|
STI R1,*+AR7(PEDTRIG)
|
|
LDI 0,AR6 ;Set debounce counter to 0
|
|
; BR PEDALWT
|
|
|
|
.bss PEDHIT,1
|
|
LDI 1,R0
|
|
STI R0,@PEDHIT ;not touched
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
EIML
|
|
|
|
|
|
CMPI 0,AR6
|
|
BNE TOSLP2
|
|
LDI @SWITCHBUTS,R0
|
|
LDL SW_RADIO|SW_VIEW0|SW_VIEW1|SW_VIEW2,R1
|
|
AND R1,R0
|
|
BZ TOSLP2
|
|
LDI @_countdown,R0
|
|
DEC R0
|
|
STI R0,@_countdown
|
|
LDI 2,AR6
|
|
TOSLP2
|
|
CMPI 0,AR6
|
|
BEQ TOSLP3
|
|
SUBI 1,AR6
|
|
TOSLP3
|
|
|
|
CALL GETCHOICE ;READS the steering wheel, uses POSES = number of choices
|
|
LDI @POSE,R4 ;On return POSE = Choice wheel is pointing at.
|
|
CMPI LASTCHAR,R4
|
|
LDIGT LASTCHAR,R4
|
|
CMPI 0,R4
|
|
LDILT 0,R4
|
|
|
|
LDI *+AR7(OLDPOT0),R1
|
|
STI R4,*+AR7(OLDPOT0)
|
|
ADDI R1,R4
|
|
RS 1,R4
|
|
|
|
LDI R4,R0
|
|
|
|
CMPI LASTCHAR,R0
|
|
LDIGT LASTCHAR,R0
|
|
|
|
ADDI @PLATE_LETTERSI,R0 ;Add in the start of the Letter table
|
|
LDI R0,AR0
|
|
LDI *AR0,AR1 ;Get the ROM pointer to the image the letter will use
|
|
|
|
LDI AR7,AR0
|
|
ADDI INIT0,AR0 ;GET index to which letter we are on
|
|
ADDI AR5,AR0
|
|
LDI *AR0,AR0
|
|
LDI *+AR7(WHITE_PAL),R0
|
|
STI R0,*+AR0(OPAL)
|
|
STI AR1,*+AR0(OROMDATA) ;Set the ROM point of the object for this leter
|
|
|
|
LDI AR7,AR0
|
|
ADDI INITI0,AR0
|
|
ADDI AR5,AR0 ;AR5 = which letter 0-2
|
|
|
|
LDI R4,R0
|
|
CMPI LASTCHAR,R0
|
|
LDIGE ' ',R0
|
|
BGE EMIL1A
|
|
CMPI RUB+1,R0
|
|
BLT EMIL1
|
|
ADDI '0'-RUB-1,R0
|
|
BR EMIL1A
|
|
EMIL1
|
|
ADDI 'A',R0 ;TRANSLATE BACK TO ASCII
|
|
EMIL1A
|
|
STI R0,*AR0 ;initial index SET THE LETTER
|
|
|
|
|
|
LDI @_countdown,R0
|
|
BLE DOTRIG ;Out of time, then auto trigger the next letter
|
|
|
|
|
|
LDI @START_HIT,R0
|
|
BNZ DOTRIG
|
|
|
|
|
|
*ELP CHANGE
|
|
LDI @_pot1,R0
|
|
CMPI *+AR7(PEDTRIG),R0
|
|
BGE TRIGPOTCHK
|
|
|
|
CLRI R0
|
|
STI R0,@PEDHIT
|
|
BU NOTRIG
|
|
TRIGPOTCHK
|
|
|
|
LDI @PEDHIT,R1
|
|
CMPI 1,R1
|
|
BEQ NOTRIG
|
|
|
|
LDI 1,R0
|
|
STI R0,@PEDHIT
|
|
*ELP END CHANGE
|
|
|
|
|
|
DOTRIG
|
|
LDI @_countdown,R0
|
|
BZ DT1 ;If out of time don't decrement
|
|
LDI 20,R0 ;Set the number of seconds to enter your initials
|
|
STI R0,@_countdown
|
|
DT1
|
|
CLRI R0
|
|
STI R0,@START_HIT
|
|
|
|
LDI AR7,AR0
|
|
ADDI INIT0,AR0
|
|
ADDI AR5,AR0
|
|
|
|
CMPI RUB,R4
|
|
BNE NOTBCKSPC
|
|
|
|
LDI @_countdown,R0
|
|
BGT DORUB ;Out of time?
|
|
LDI LASTCHAR,R4 ;FORCE END
|
|
|
|
LDI AR7,AR0 ;Put a space in the position the RUB was in
|
|
ADDI INITI0,AR0
|
|
ADDI AR5,AR0 ;AR5 = which letter 0-2
|
|
LDI ' ',R0
|
|
STI R0,*AR0
|
|
BR NOTBCKSPC ;THIS WILL BAIL CORRECTLY
|
|
DORUB
|
|
CMPI 0,AR5 ;if char[0] then dont backspace
|
|
BEQ PEDALWT
|
|
;This does a back space
|
|
|
|
LDI *AR0,AR2
|
|
CALL OBJ_PULL ;Get rid of the letter on
|
|
|
|
DEC AR5 ;AR5 = LETTER on
|
|
|
|
BR PEDALWT
|
|
|
|
|
|
NOTBCKSPC
|
|
LDI AR7,AR1
|
|
ADDI INIT0,AR1 ;GET index to the last letter we are on
|
|
ADDI AR5,AR1
|
|
LDI *AR1,AR1
|
|
LDI *+AR7(GREY_PAL),R0
|
|
STI R0,*+AR1(OPAL)
|
|
LDI *+AR1(OROMDATA),R1 ;Set the ROM point of the object for this leter
|
|
CMPI LASTCHAR,R4
|
|
BEQ DONE_ENTRY
|
|
|
|
INC AR5
|
|
CMPI 3,AR5
|
|
BGE DONE_ENTRY
|
|
|
|
INC AR0
|
|
LDI *AR0,AR2
|
|
STI R1,*+AR2(OROMDATA) ;Set the ROM point of the object for this leter
|
|
CALL OBJ_INSERT ;Add the next letters object
|
|
|
|
SONDFX CHOOSE_LETTER
|
|
|
|
PEDALWT: ;Loop waiting for the pedal to be released
|
|
; LDI @_countdown,R0
|
|
; BLE EIML
|
|
;
|
|
; SLEEP 1
|
|
;
|
|
; ;wait for release of pedal
|
|
; LDI @_pot1,R0
|
|
; LDI *+AR7(PEDTRIG),R1
|
|
; CMPI R1,R0
|
|
; BGE PEDALWT
|
|
|
|
NOTRIG
|
|
CALL HSTD_TIMER
|
|
CALL POS_SCROLLB
|
|
SLEEP 1
|
|
BR EIML
|
|
|
|
DONE_ENTRY
|
|
CMPI LASTCHAR,R4
|
|
BNE DE1
|
|
LDI AR1,AR2
|
|
CALL OBJ_PULL
|
|
DE1
|
|
LDI *+AR7(INITI2),R2 ;Create string for initial entry
|
|
LSH 8,R2
|
|
OR *+AR7(INITI1),R2
|
|
LSH 8,R2
|
|
OR *+AR7(INITI0),R2
|
|
SETADJ ADJ_INITIALS
|
|
|
|
BR PRESS_CODE
|
|
*----------------------------------------------------------------------------
|
|
*This proc slides in the WORDS "ENTER INITIALS"
|
|
ENTERTEXT:
|
|
FLOAT 616,R2 ;XPOS
|
|
CALL CREATE_ENTERTEXT
|
|
LDF -6,R0
|
|
STF R0,*+AR4(TEXT_VELX)
|
|
STF R0,*+AR5(TEXT_VELX)
|
|
|
|
SLEEP 60
|
|
|
|
SONDFX WELCOME
|
|
|
|
CLRF R0
|
|
STF R0,*+AR4(TEXT_VELX)
|
|
STF R0,*+AR5(TEXT_VELX)
|
|
|
|
ET0
|
|
SLEEP 1
|
|
BR ET0 ;THIS PROC GETS KILLED BY PRESS_CODE
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*PARAMETERS R2 = XPOS
|
|
CREATE_ENTERTEXT:
|
|
LDI @EIPI,AR2 ;enter initials string
|
|
FLOAT 254,R3 ;YPOS
|
|
LDI 9999,RC ;JIFFYS TO DISPLAY (INDEFINATLY)
|
|
CALL TEXT_ADDDS
|
|
CALL MAKE_CENTER
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
MAKE_CENTER:
|
|
LDI AR0,AR4
|
|
LDI AR1,AR5
|
|
ORM TXT_CENTER,*+AR4(TEXT_COLOR)
|
|
ORM TXT_CENTER,*+AR5(TEXT_COLOR)
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
HSTD_TIMER:
|
|
LDI @_countdown,R2
|
|
LDI @COUNTDOWN_BUFI,AR2
|
|
CALL _itoa
|
|
FLOAT 256,R2
|
|
FLOAT 343,R3 ;YPOS
|
|
LDI 1,RC
|
|
CALL TEXT_ADDDS
|
|
PUSH AR4
|
|
PUSH AR5
|
|
CALL MAKE_CENTER
|
|
POP AR5
|
|
POP AR4
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
INSERT_INITS
|
|
LDI @SCORE,R0
|
|
LDI *+AR7(INITI0),R1
|
|
LDI *+AR7(INITI1),R2
|
|
LDI *+AR7(INITI2),R3
|
|
LDI 0,R4 ;POSITION FINISHED IN
|
|
LDI *+AR7(PLACE),R5
|
|
LDI *+AR7(RACE_NUMBER),R6
|
|
CALL INSERT_TABLE_ENTRY
|
|
|
|
LDI *+AR7(RACE_NUMBER),R1
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
* USES BONUS_WAVE and GAMETRAKI to determine...
|
|
*
|
|
*RETURNS C = 1 PLAYER WILL MAKE IT INTO THE HS TABLE
|
|
* C = 0 PLAYER WILL NOT MAKE IT
|
|
INTO_TABLE_P:
|
|
CALL VALIDATE_HSTD_TABLES
|
|
|
|
;check check score if good enough to enter
|
|
;the hstd table
|
|
LDI @BONUS_WAVE,R1
|
|
SUBI 1,R1
|
|
STI R1,*+AR7(RACE_NUMBER)
|
|
LDI R1,R0
|
|
MPYI GT_SIZE,R0
|
|
ADDI @GAMETRAKI,R0
|
|
LDI R0,AR0
|
|
; LDI *+AR0(GT_ETIME),R0
|
|
.globl ETIME
|
|
LDI @ETIME,R0
|
|
CMPI 14,R1
|
|
CALLEQ CALC_TOTAL_ELAPSED ;A call to ENTER_INITIALS WITH BONUS_WAVE =15 WILL
|
|
CMPI 0,R0 ;CHECK SF TO DC
|
|
BEQ ITP1 ;Did Not Finish this Race (DNF)
|
|
CALL CHECK_RACE_TABLE
|
|
CMPI -1,R0
|
|
BNE ITP2
|
|
ITP1
|
|
CLRC
|
|
RETS
|
|
ITP2
|
|
SETC
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*RETURNS C = 1 PLAYER HAS ALLREADY ENTERED INITS
|
|
* C = 0 PLAYER HAS NOT ENTERED INITS
|
|
*SETS PLAYER LETTERS IF FOUND
|
|
* INITI0-INITI2
|
|
CHECK_FIRST_TIME:
|
|
READADJ ADJ_INITIALS
|
|
CMPI -1,R0
|
|
BNE NOT_FIRST_TIME
|
|
CLRC
|
|
RETS
|
|
|
|
NOT_FIRST_TIME
|
|
LDI ' ',R1 ;Just incase the initials have been corrupted
|
|
STI R1,*+AR7(INITI1)
|
|
STI R1,*+AR7(INITI2)
|
|
|
|
LDI AR7,AR0
|
|
ADDI INITI0,AR0
|
|
NFTLP
|
|
LDI R0,R1
|
|
AND 0FFh,R1
|
|
BEQ NFTX
|
|
STI R1,*AR0++
|
|
LSH -8,R0
|
|
BNE NFTLP
|
|
NFTX
|
|
SETC
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*Below Is code only used for the plate stamping sequence
|
|
*
|
|
*
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*R0 = total elapsed time
|
|
*R0 = 0, did not finish
|
|
CALC_TOTAL_ELAPSED:
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH AR0
|
|
LDI @GAMETRAKI,AR0
|
|
LDI 13,R1
|
|
LDI 0,R2
|
|
CTELP
|
|
LDI *+AR0(GT_ETIME),R0
|
|
BEQ CTEX ;Did Not Finish this Race (DNF)
|
|
ADDI R0,R2
|
|
ADDI GT_SIZE,AR0
|
|
SUBI 1,R1
|
|
BP CTELP
|
|
LDI R2,R0
|
|
CTEX
|
|
POP AR0
|
|
POP R2
|
|
POP R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
* This routine is branched to from within a proccess
|
|
* It will stamp the letters on the plate then put the plate onto the wall
|
|
*
|
|
PRESS_FRAMES .set 60 ;120
|
|
PLACE_FRAMES .set 40
|
|
ROLLER_TRAVEL .set 12.7117 ;2*PI = 1 revolution PI = 3.14
|
|
|
|
ARM_FRAMES .set 10 ;20
|
|
ARM_START .set 0
|
|
ARM_BOTTOM .set ARM_START+240
|
|
ARM_TRAVEL .set ARM_BOTTOM-ARM_START
|
|
|
|
STAMP_FRAMES .set 4
|
|
STAMP_SHAKE .set 7
|
|
|
|
|
|
ARMS2 .set 8Ah
|
|
|
|
PRESS_CODE_ENTRY:
|
|
;Put the letters on the bottom of the press
|
|
LDI *+AR7(WHITE_PAL),R4
|
|
FLOAT -LETTER_SIZEX-LETTER_SIZEX/4,R5 ;Position of the first letter
|
|
FLOAT -103+LETTER_YOFF,R6
|
|
FLOAT -PRESS_DIAM-73,R7
|
|
|
|
LDI *+AR7(INITI0),AR2 ;Create the first Letter
|
|
CALL ASCII_TO_OBJ
|
|
STI AR0,*+AR7(INIT0)
|
|
STI R4,*+AR0(OPAL)
|
|
STF R5,*+AR0(OPOSX)
|
|
STF R6,*+AR0(OPOSY)
|
|
STF R7,*+AR0(OPOSZ)
|
|
FLOAT LETTER_SIZEX,R0
|
|
ADDF R0,R5
|
|
LDI *+AR7(INITI0),AR2
|
|
CMPI ' ',AR2
|
|
BEQ NOINS0
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERT
|
|
NOINS0
|
|
|
|
LDI *+AR7(INITI1),AR2 ;Create the first Letter
|
|
CALL ASCII_TO_OBJ
|
|
STI AR0,*+AR7(INIT1)
|
|
STI R4,*+AR0(OPAL)
|
|
STF R5,*+AR0(OPOSX)
|
|
STF R6,*+AR0(OPOSY)
|
|
STF R7,*+AR0(OPOSZ)
|
|
FLOAT LETTER_SIZEX,R0
|
|
ADDF R0,R5
|
|
LDI *+AR7(INITI1),AR2
|
|
CMPI ' ',AR2
|
|
BEQ NOINS1
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERT
|
|
NOINS1
|
|
LDI *+AR7(INITI2),AR2 ;Create the first Letter
|
|
CALL ASCII_TO_OBJ
|
|
STI AR0,*+AR7(INIT2)
|
|
STI R4,*+AR0(OPAL)
|
|
STF R5,*+AR0(OPOSX)
|
|
STF R6,*+AR0(OPOSY)
|
|
STF R7,*+AR0(OPOSZ)
|
|
LDI *+AR7(INITI2),AR2
|
|
CMPI ' ',AR2
|
|
BEQ NOINS2
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERT
|
|
NOINS2
|
|
SONDFX WELCOME
|
|
|
|
*ELP CHANGE
|
|
PUSHP AR5
|
|
;SLEEP 60
|
|
LDI 30-1,AR5
|
|
PAPA35 LDI @START_HIT,R0
|
|
BNZ PAPA35X
|
|
SUBI @NFRAMES,AR5
|
|
CMPI 0,AR5
|
|
LDILT 0,AR5
|
|
SLEEP 1
|
|
DBU AR5,PAPA35
|
|
PAPA35X
|
|
POPP AR5
|
|
*ELP END CHANGE
|
|
|
|
|
|
;FALL INTO PRESS CODE
|
|
PRESS_CODE:
|
|
LDI SPAWNER_C,R0 ;KILL ENTERTEXT
|
|
LDI CLASS_M,R1
|
|
CALL PRC_KILLALL
|
|
CALL TEXT_INIT
|
|
|
|
CLRI R0
|
|
STI R0,@START_HIT
|
|
|
|
|
|
LDI 0,R0
|
|
STI R0,@FRAMRATE ;RESET FRAME RATE TO ATTRACT MODE
|
|
SONDFX DOPEN
|
|
|
|
LDI *+AR7(RACE_NUMBER),R1
|
|
LDI R1,R0
|
|
MPYI GT_SIZE,R0
|
|
ADDI @GAMETRAKI,R0
|
|
LDI R0,AR0
|
|
LDI *+AR0(GT_ETIME),R0
|
|
CMPI 14,R1
|
|
CALLZ CALC_TOTAL_ELAPSED
|
|
STI R0,@SCORE
|
|
CALL INSERT_INITS
|
|
STI R0,@SCORE
|
|
|
|
CALL FIND_PLATES ;Set up the High score display board
|
|
|
|
LDI 0,R0
|
|
STI R0,@_countdown
|
|
|
|
CALL ADJUST_ROLLERS
|
|
CALL ENTER_HSTEXT
|
|
|
|
FLOAT -1950,R2
|
|
LDI HIGH_SCORE_GROUP,R1 ;High score group
|
|
CALL OBJ_MOVY_GROUP
|
|
|
|
LDI *+AR7(MISPLATEOBJ),AR2
|
|
CALL OBJ_PULL ;Loose the plate in the players place
|
|
|
|
CALL INI_PLAYERS_BOLTS ;Move them into position to fly
|
|
|
|
LDI 5,R1
|
|
CALL OBJ_FIND
|
|
FLOAT -2000,R0
|
|
LDF *+AR0(OPOSY),R1
|
|
ADDF R0,R1
|
|
STF R1,*+AR0(OPOSY)
|
|
|
|
LDI 8,R1
|
|
CALL OBJ_FIND
|
|
FLOAT -2000,R0
|
|
LDF *+AR0(OPOSY),R1
|
|
ADDF R0,R1
|
|
STF R1,*+AR0(OPOSY)
|
|
|
|
|
|
LDI *+AR7(SCROLLBOBJ),AR2 ;LOOSE THE WHEEL AND IT's LETTERS
|
|
CALL OBJ_PULL
|
|
|
|
PRA0 ;LOOSE THE LETTERS ON THE FRAME
|
|
LDI MARQLET,R1
|
|
CALL OBJ_FIND
|
|
BC PRA
|
|
LDI AR0,AR2
|
|
CALL OBJ_DELETE
|
|
BR PRA0
|
|
PRA
|
|
;Pan the camera back,pull back the frame,rotate the press down,
|
|
;and scroll the plate in on the rollers
|
|
|
|
FLOAT PRESS_FRAMES,R1 ;Pan camera to correct y
|
|
FLOAT PRESS_TRAVELY,R0
|
|
CALL DIV_F ;PRESS_TRAVELZ/PRESS_FRAMES
|
|
LDP @_CAMERAPOS+Y
|
|
ADDF @_CAMERAPOS+Y,R0
|
|
STF R0,@_CAMERAPOS+Y
|
|
SETDP
|
|
|
|
FLOAT PRESS_FRAMES,R1 ;Pan camera back
|
|
FLOAT PRESS_TRAVELZ,R0
|
|
CALL DIV_F ;PRESS_TRAVELZ/PRESS_FRAMES
|
|
LDP @_CAMERAPOS+Z
|
|
ADDF @_CAMERAPOS+Z,R0
|
|
STF R0,@_CAMERAPOS+Z
|
|
SETDP
|
|
|
|
FLOAT PRESS_FRAMES-1,R1 ;Rotate press down
|
|
LDF PRESS_RADX,R0
|
|
CALL DIV_F ;PRESS_RADX/PRESS_FRAMES
|
|
|
|
LDI *+AR7(PRESSOBJ),AR0
|
|
LDF *+AR0(ORADX),R2
|
|
SUBF R0,R2
|
|
STF R2,*+AR0(ORADX)
|
|
LDI AR0,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
FLOAT PRESS_FRAMES,R1 ;Pull the frame back
|
|
FLOAT -2000,R0
|
|
CALL DIV_F ;-2000/PRESS_FRAMES
|
|
; LDI *+AR7(FRAMEOBJ),AR0
|
|
LDI FRAME,R1
|
|
CALL OBJ_FIND
|
|
BC PRA2
|
|
PRA1
|
|
LDF *+AR0(OPOSZ),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSZ)
|
|
CALL OBJ_FIND_NEXT
|
|
BNC PRA1
|
|
PRA2
|
|
CALL MOVE_PRESSB ;Move the bottom of the press reletive to the press
|
|
CALL MOVE_BIGLET_PRESS ;Move the letters reletive to the bottom of the press
|
|
|
|
LDI *+AR7(PRESSOBJ),AR0 ;Spin the rollers until press is rotated all the way down
|
|
LDF *+AR0(ORADX),R2
|
|
CMPF -0.01309,R2
|
|
BLE PR0A
|
|
|
|
FLOAT PRESS_FRAMES,R1
|
|
LDF ROLLER_TRAVEL,R0
|
|
CALL DIV_F ;PRESS_TRAVELZ/PRESS_FRAMES
|
|
CALL SPIN_ROLLERS ;Spin rollers also moves the plate
|
|
|
|
SLEEP 1
|
|
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BZ PRA
|
|
; BR PRA
|
|
*ELP END CHANGE
|
|
|
|
|
|
|
|
PR0A
|
|
LDI FRAME,R1
|
|
CALL OBJ_FIND
|
|
BC PR0A2
|
|
LDI AR0,AR2
|
|
CALL OBJ_DELETE
|
|
BR PR0A
|
|
PR0A2
|
|
|
|
SONDFX HYDRO
|
|
*ELP CHANGE
|
|
;SLEEP 10
|
|
SLEEP 5
|
|
*ELP END CHANGE
|
|
PR0
|
|
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PR1
|
|
*ELP END CHANGE
|
|
|
|
|
|
;Move the Press and Arms down to stamp
|
|
FLOAT ARM_FRAMES,R1
|
|
FLOAT ARM_TRAVEL,R0
|
|
CALL DIV_F ;ARM_TRAVEL/ARM_FRAMES
|
|
|
|
LDI *+AR7(PRESSOBJ),AR0
|
|
LDF *+AR0(OPOSY),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSY)
|
|
|
|
PUSHF R0
|
|
CALL MOVE_PRESSB
|
|
CALL MOVE_BIGLET_PRESS
|
|
POPF R0
|
|
|
|
LDI *+AR7(ARMSOBJ),AR0
|
|
LDF *+AR0(OPOSY),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSY)
|
|
|
|
FLOAT ARM_BOTTOM,R0
|
|
CMPF R0,R2
|
|
BGE PR1
|
|
|
|
SLEEP 1
|
|
|
|
BR PR0
|
|
|
|
PR1
|
|
SONDFX STAMP
|
|
SONDFX STAMP1
|
|
;STAMP
|
|
LDI *+AR7(INITI0),R0
|
|
LDI *+AR7(INIT0),AR2
|
|
CMPI ' ',R0
|
|
BEQ PR1A1
|
|
CALL OBJ_PULL
|
|
PR1A1
|
|
LDI *+AR7(INITI1),R0
|
|
LDI *+AR7(INIT1),AR2
|
|
CMPI ' ',R0
|
|
BEQ PR1A2
|
|
CALL OBJ_PULL
|
|
PR1A2
|
|
LDI *+AR7(INITI2),R0
|
|
LDI *+AR7(INIT2),AR2
|
|
CMPI ' ',R0
|
|
BEQ PR1A3
|
|
CALL OBJ_PULL
|
|
PR1A3
|
|
|
|
LDI STAMP_FRAMES,AR5
|
|
PR1A
|
|
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PR1ZZZ
|
|
*ELP END CHANGE
|
|
|
|
|
|
FLOAT STAMP_SHAKE,R0
|
|
LDP @_CAMERAPOS+Y
|
|
ADDF @_CAMERAPOS+Y,R0
|
|
STF R0,@_CAMERAPOS+Y
|
|
SETDP
|
|
|
|
SLEEP 1
|
|
|
|
FLOAT STAMP_SHAKE,R0
|
|
NEGF R0
|
|
LDP @_CAMERAPOS+Y
|
|
ADDF @_CAMERAPOS+Y,R0
|
|
STF R0,@_CAMERAPOS+Y
|
|
SETDP
|
|
|
|
SLEEP 1
|
|
|
|
DBU AR5,PR1A
|
|
|
|
FLOAT PRESS_LASTY,R0
|
|
LDP @_CAMERAPOS+Y
|
|
STF R0,@_CAMERAPOS+Y
|
|
SETDP
|
|
|
|
*ELP CHANGE
|
|
;SLEEP 6
|
|
SLEEP 3
|
|
*ELP END CHANGE
|
|
PR1ZZZ
|
|
CALL MAKE_PLAYERS_PLATE
|
|
PR2
|
|
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PR2A
|
|
*ELP END CHANGE
|
|
|
|
;PULL press up
|
|
CALL MOVE_PRESSB
|
|
|
|
FLOAT ARM_FRAMES,R1
|
|
FLOAT ARM_TRAVEL,R0
|
|
NEGF R0
|
|
CALL DIV_F ;ARM_TRAVEL/ARM_FRAMES
|
|
|
|
LDI *+AR7(PRESSOBJ),AR0
|
|
LDF *+AR0(OPOSY),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSY)
|
|
|
|
LDI *+AR7(ARMSOBJ),AR0
|
|
LDF *+AR0(OPOSY),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSY)
|
|
|
|
FLOAT ARM_START,R0
|
|
CMPF R0,R2
|
|
BLE PR2A
|
|
|
|
SLEEP 1
|
|
BR PR2
|
|
|
|
PR2A
|
|
;Rotate the camera up
|
|
SONDFX DOPEN
|
|
|
|
CAM_RADX .set -0.393
|
|
ROT_FRAMES .set 40
|
|
|
|
LDP @_CAMERAPOS
|
|
LDF @_CAMERAPOS,R0
|
|
LDF @_CAMERAPOS+Y,R1
|
|
LDF @_CAMERAPOS+Z,R2
|
|
SETDP
|
|
STF R0,*+AR7(CAMX)
|
|
STF R1,*+AR7(CAMY)
|
|
STF R2,*+AR7(CAMZ)
|
|
|
|
LDI ROT_FRAMES-1,AR6
|
|
PR2AA
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PR2A1
|
|
*ELP END CHANGE
|
|
|
|
|
|
LDI *+AR7(PRESSOBJ),AR0
|
|
FLOAT -50,R0
|
|
LDF *+AR0(OPOSY),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSY)
|
|
|
|
|
|
LDI *+AR7(ARMSOBJ),AR0
|
|
LDF *+AR0(OPOSY),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSY)
|
|
|
|
LDI *+AR7(BPRESSOBJ),AR0
|
|
LDF *+AR0(OPOSY),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSY)
|
|
|
|
LDI ARMS2,R1
|
|
CALL OBJ_FIND
|
|
LDF *+AR0(OPOSY),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSY)
|
|
CALL OBJ_FIND_NEXT
|
|
LDF *+AR0(OPOSY),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSY)
|
|
|
|
FLOAT ROT_FRAMES,R1 ;Pan camera to correct y
|
|
LDF CAM_RADX,R0
|
|
CALL DIV_F
|
|
LDP @_CAMERARAD
|
|
LDF @_CAMERARAD,R2
|
|
ADDF R0,R2
|
|
STF R2,@_CAMERARAD
|
|
SETDP
|
|
LDI @CAMERAMATRIXI,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
NEGF R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI @MATRIXAI,R2
|
|
LDI AR7,AR2
|
|
ADDI CAMX,AR2
|
|
LDI @CAMERAPOSI,R3
|
|
CALL MATRIX_MUL
|
|
SLEEP 1
|
|
|
|
DBU AR6,PR2AA
|
|
|
|
;Scroll plate left,pan camera left with th plate;ZOOM IN;ZOOM OUT
|
|
|
|
left_stop .set -5000
|
|
cam_left_stop .set -4700
|
|
zoomin_stop .set -1300
|
|
zoomout_stop .set -2100
|
|
|
|
SONDFX GOPEN
|
|
|
|
LDF 0.00,R6 ;AR5 is speed of rotation
|
|
PR2A1
|
|
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PR2A3
|
|
*ELP END CHANGE
|
|
|
|
LDF R6,R0
|
|
*ELP CHANGE
|
|
;ADDF 0.02,R6 ;ACCELERATE
|
|
ADDF 0.04,R6 ;ACCELERATE
|
|
*ELP END CHANGE
|
|
; ADDF 0.01,R6 ;ACCELERATE
|
|
CALL SPIN_ROLLERS
|
|
LDI *+AR7(PLATEOBJ),AR0
|
|
LDF *+AR0(OPOSX),R0
|
|
|
|
SUBF *+AR7(CAMX),R0
|
|
*ELP CHANGE
|
|
;MPYF 0.20,R0
|
|
MPYF 0.40,R0
|
|
*ELP END CHANGE
|
|
ADDF *+AR7(CAMX),R0
|
|
FLOAT cam_left_stop,R1
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
STF R0,*+AR7(CAMX)
|
|
|
|
LDF R0,R3
|
|
FLOAT zoomin_stop,R4
|
|
FLOAT zoomout_stop,R5
|
|
FLOAT -2500,R2 ;Accelerating or decelerating?
|
|
CMPF R2,R3 ;R3 set above to = PLATE OPOSX
|
|
LDFGE R4,R0 ;Accelerating
|
|
LDFLT R5,R0 ;Deccelerating
|
|
SUBF *+AR7(CAMZ),R0
|
|
*ELP CHANGE
|
|
;MPYF 0.1,R0
|
|
MPYF 0.2,R0
|
|
*ELP END CHANGE
|
|
; MPYF 0.05,R0
|
|
ADDF *+AR7(CAMZ),R0
|
|
CMPF R4,R0 ;Range check the zpos
|
|
LDFGT R4,R0 ;to large
|
|
CMPF R5,R0
|
|
LDFLT R5,R0 ;to small
|
|
STF R0,*+AR7(CAMZ)
|
|
|
|
LDP @_CAMERARAD
|
|
LDF @_CAMERARAD,R2
|
|
SETDP
|
|
NEGF R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI @MATRIXAI,R2
|
|
LDI AR7,AR2
|
|
ADDI CAMX,AR2
|
|
LDI @CAMERAPOSI,R3
|
|
CALL MATRIX_MUL
|
|
|
|
CALL ADJUST_ROLLERS
|
|
|
|
|
|
SLEEP 1
|
|
|
|
LDI *+AR7(PLATEOBJ),AR0
|
|
LDF *+AR0(OPOSX),R0
|
|
FLOAT -2500,R1
|
|
CMPF R1,R0
|
|
BGE PR2A2
|
|
*ELP CHANGE
|
|
ADDF -0.08,R6 ;DEACCELERATE (MUST BE TWICE ACCELERATE)
|
|
*ELP END CHANGE
|
|
CMPF 0.02,R6
|
|
LDFN 0.02,R6
|
|
|
|
; ADDF -0.02,R6 ;DEACCELERATE (MUST BE TWICE ACCELERATE)
|
|
; CMPF 0.01,R6
|
|
; LDFN 0.01,R6
|
|
|
|
PR2A2
|
|
LDI *+AR7(PLATEOBJ),AR0
|
|
LDF *+AR0(OPOSX),R0
|
|
FLOAT left_stop,R1
|
|
CMPF R1,R0
|
|
BGE PR2A1
|
|
|
|
;Flip the plate up on end 90deg
|
|
|
|
PR2A3
|
|
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PR3B
|
|
*ELP END CHANGE
|
|
|
|
LDI *+AR7(PLATEOBJ),AR2
|
|
LDF 0.15708,R2
|
|
ADDF *+AR2(ORADX),R2
|
|
CMPF HALFPI,R2
|
|
LDFGT HALFPI,R2
|
|
STF R2,*+AR2(ORADX)
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI *+AR7(PLATEOBJ),AR2 ;Setup the offset for the bottom of the plate
|
|
LDF 0,R0
|
|
STF R0,*+AR2(OVELX)
|
|
STF R0,*+AR2(OVELY)
|
|
FLOAT -156,R0
|
|
STF R0,*+AR2(OVELZ)
|
|
|
|
LDI *+AR7(PLATEOBJ),R2
|
|
ADDI OMATRIX,R2
|
|
ADDI OVELX,AR2
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
|
|
LDI *+AR7(PLATEOBJ),AR0
|
|
FLOAT PLATE_ZOFF,R0
|
|
ADDF *+AR0(OVELZ),R0
|
|
STF R0,*+AR0(OPOSZ)
|
|
|
|
FLOAT 610,R0
|
|
ADDF *+AR0(OVELY),R0
|
|
STF R0,*+AR0(OPOSY)
|
|
|
|
LDF 0,R0 ;No x movement
|
|
CALL MOVE_PLAYERS_LETTERS
|
|
|
|
SLEEP 1
|
|
LDI *+AR7(PLATEOBJ),AR0
|
|
LDF *+AR0(ORADX),R2
|
|
CMPF HALFPI,R2
|
|
BNE PR2A3
|
|
|
|
|
|
PLACE_ENDRADX .set 4.71239
|
|
|
|
;Put the plate onto the wall
|
|
SONDFX WIPE4
|
|
|
|
; FLOAT PRESS_LASTY,R0
|
|
; STF R0,*+AR7(CAMY)
|
|
; FLOAT PRESS_LASTZ,R0
|
|
; STF R0,*+AR7(CAMZ)
|
|
|
|
LDI PLACE_FRAMES-1,AR5
|
|
PR3
|
|
FLOAT PLACE_FRAMES,R1
|
|
LDF PLACE_ENDRADX,R0
|
|
SUBF HALFPI,R0 ;Allready rotated 90deg
|
|
CALL DIV_F
|
|
LDI *+AR7(PLATEOBJ),AR2
|
|
ADDF *+AR2(ORADX),R0
|
|
CMPF PLACE_ENDRADX,R0
|
|
LDFGT PLACE_ENDRADX,R0
|
|
STF R0,*+AR2(ORADX)
|
|
LDF R0,R2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI *+AR7(MISPLATEOBJ),AR2
|
|
LDI *+AR7(PLATEOBJ),AR0
|
|
|
|
LDF *+AR2(OPOSY),R0
|
|
SUBF *+AR0(OPOSY),R0
|
|
FLOAT AR5,R1
|
|
CALL DIV_F
|
|
LDF R0,R2
|
|
ADDF *+AR0(OPOSY),R0
|
|
STF R0,*+AR0(OPOSY)
|
|
CMPF *+AR7(CAMY),R0
|
|
BGT PR3A ;Don't move the camera until the plate is above center
|
|
SUBF *+AR7(CAMY),R0
|
|
MPYF 0.20,R0
|
|
ADDF *+AR7(CAMY),R0
|
|
FLOAT -2150,R1
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
STF R0,*+AR7(CAMY)
|
|
PR3A
|
|
LDF *+AR2(OPOSZ),R0
|
|
SUBF *+AR0(OPOSZ),R0
|
|
FLOAT AR5,R1
|
|
CALL DIV_F
|
|
LDF R0,R2
|
|
ADDF *+AR0(OPOSZ),R0
|
|
STF R0,*+AR0(OPOSZ)
|
|
|
|
LDF *+AR2(OPOSX),R0
|
|
SUBF *+AR0(OPOSX),R0
|
|
FLOAT AR5,R1
|
|
CALL DIV_F
|
|
LDF R0,R2
|
|
ADDF *+AR0(OPOSX),R0
|
|
STF R0,*+AR0(OPOSX)
|
|
|
|
LDI *+AR7(PLATEOBJ),AR0
|
|
LDF R2,R0
|
|
NEGF R0
|
|
CALL MOVE_PLAYERS_LETTERS
|
|
|
|
FLOAT ROT_FRAMES,R1 ;Pan camera to correct y
|
|
LDF -CAM_RADX,R0
|
|
CALL DIV_F
|
|
LDP @_CAMERARAD
|
|
LDF @_CAMERARAD,R2
|
|
ADDF R0,R2
|
|
CMPF -0.01,R2
|
|
LDFGT 0,R2
|
|
STF R2,@_CAMERARAD
|
|
SETDP
|
|
LDI @CAMERAMATRIXI,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
NEGF R2
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI @MATRIXAI,R2
|
|
LDI AR7,AR2
|
|
ADDI CAMX,AR2
|
|
LDI @CAMERAPOSI,R3
|
|
CALL MATRIX_MUL
|
|
|
|
SLEEP 1
|
|
DBU AR5,PR3
|
|
|
|
;Now fly the bolts in
|
|
LDI *+AR7(PLACE),R4 ;Calculate the first bolts object number
|
|
MPYI 4,R4
|
|
ADDI FIRST_BOLT,R4
|
|
LDI 3,AR5
|
|
PR3B
|
|
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PR3BA
|
|
*ELP END CHANGE
|
|
|
|
LDI R4,R1
|
|
CALL OBJ_FIND
|
|
BC PR3BA
|
|
LDI AR0,AR4
|
|
CREATE FLY_BOLT,UTIL_C
|
|
|
|
*ELP CHANGE
|
|
;SLEEP 15
|
|
SLEEP 6
|
|
*ELP END CHANGE
|
|
|
|
ADDI 1,R4
|
|
DBU AR5,PR3B
|
|
PR3BA
|
|
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PR5A
|
|
*ELP END CHANGE
|
|
|
|
;If not in top 5 skip the pan up
|
|
LDI *+AR7(PLACE),R0
|
|
CMPI 4,R0
|
|
BGT PR5A
|
|
|
|
;Continue to pan the camera to the top of the highscore table
|
|
PR4A
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PR5A
|
|
*ELP END CHANGE
|
|
SLEEP 1
|
|
|
|
LDP @_CAMERAPOS+Y
|
|
LDF @_CAMERAPOS+Y,R0
|
|
ADDF -20,R0
|
|
FLOAT -2150,R1
|
|
CMPF R1,R0
|
|
LDFLT R1,R0
|
|
STF R0,@_CAMERAPOS+Y
|
|
SETDP
|
|
CMPF R1,R0
|
|
BNE PR4A
|
|
PR5A
|
|
|
|
|
|
LDL plate_darkp,AR2
|
|
CALL PAL_ALLOC_RAW
|
|
STI R0,*+AR7(darkp_pal)
|
|
|
|
LDL plate_medp,AR2
|
|
CALL PAL_ALLOC_RAW
|
|
STI R0,*+AR7(medp_pal)
|
|
|
|
LDL plate_lightp,AR2
|
|
CALL PAL_ALLOC_RAW
|
|
STI R0,*+AR7(lightp_pal)
|
|
|
|
LDL plate_lightp1,AR2
|
|
CALL PAL_ALLOC_RAW
|
|
STI R0,*+AR7(lightp1_pal)
|
|
|
|
|
|
*ELP CHANGE
|
|
LDI @START_HIT,R0
|
|
BNZ PRESSCODEX2
|
|
*ELP END CHANGE
|
|
|
|
|
|
LDI *+AR7(RACE_NUMBER),R4
|
|
CREATEC FLASH_LETTERS_PROC,UTIL_C
|
|
STI AR0,*+AR7(FLASH_PROC)
|
|
|
|
PRESS_CODEX
|
|
; SLEEP 60
|
|
*ELP CHANGE
|
|
;SLEEP 90
|
|
SLEEP 30
|
|
*ELP END CHANGE
|
|
SOND1 CLOSING
|
|
PRESSCODEX2
|
|
*ELP CHANGE
|
|
;CREATE UNFOLDMAP_NOPAL,UTIL_C
|
|
CREATE UNFOLDMAP,UTIL_C
|
|
;SLEEP 40
|
|
SLEEP 20
|
|
*ELP END CHANGE
|
|
|
|
|
|
LDI *+AR7(FLASH_PROC),AR2
|
|
CALL PRC_KILL
|
|
|
|
LDL press_PALETTES,AR2
|
|
CALL dealloc_section
|
|
|
|
LDI *+AR7(GREY_PAL),AR2
|
|
CALL PAL_DELETE_RAW
|
|
LDI *+AR7(WHITE_PAL),AR2
|
|
CALL PAL_DELETE_RAW
|
|
LDI *+AR7(darkp_pal),AR2
|
|
CALL PAL_DELETE_RAW
|
|
LDI *+AR7(medp_pal),AR2
|
|
CALL PAL_DELETE_RAW
|
|
LDI *+AR7(lightp_pal),AR2
|
|
CALL PAL_DELETE_RAW
|
|
LDI *+AR7(lightp1_pal),AR2
|
|
CALL PAL_DELETE_RAW
|
|
|
|
|
|
LDI @_MODE,R0
|
|
ANDN MMODE|MINFIN|MHS,R0
|
|
OR MBONUS,R0
|
|
STI R0,@_MODE
|
|
|
|
RETP
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
FRAME .set 85h
|
|
SCROLLB .set 86h
|
|
PRESS .set 87h
|
|
PRESSB .set 88h
|
|
ARMS .set 89h
|
|
PLATE .set 8Bh
|
|
MARQLET .set 8Ch
|
|
|
|
PLATE_ZOFF .set ROLLER_ZOFF-140
|
|
|
|
|
|
INIT_PRESS_OBJECTS:
|
|
LDI 9h,R1
|
|
CALL OBJ_FIND
|
|
LDI AR0,AR2
|
|
CALL OBJ_PULL
|
|
LDI 81h,R1
|
|
CALL OBJ_FIND
|
|
LDI AR0,AR2
|
|
CALL OBJ_DELETE
|
|
LDI 82h,R1
|
|
CALL OBJ_FIND
|
|
LDI AR0,AR2
|
|
CALL OBJ_DELETE
|
|
LDI 83h,R1
|
|
CALL OBJ_FIND
|
|
LDI AR0,AR2
|
|
CALL OBJ_DELETE
|
|
|
|
LDI @OACTIVEI,AR0
|
|
LDI *AR0,AR5
|
|
|
|
FPO LDI AR5,R0
|
|
BZ FPOX
|
|
LDI R0,AR0
|
|
LDI *AR0,AR5
|
|
|
|
LDI *+AR0(OID),R0
|
|
AND 0FFh,R0
|
|
CMPI PRESS,R0
|
|
BNE FPO1
|
|
STI AR0,*+AR7(PRESSOBJ)
|
|
LDF PRESS_RADX,R2
|
|
STF R2,*+AR0(ORADX)
|
|
LDI AR0,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
BR FPLE
|
|
FPO1
|
|
LDI *+AR0(OID),R0
|
|
AND 0FFh,R0
|
|
CMPI PRESSB,R0
|
|
BNE FPO1A
|
|
STI AR0,*+AR7(BPRESSOBJ)
|
|
|
|
BR FPLE
|
|
FPO1A
|
|
|
|
CMPI PLATE,R0
|
|
BNE FPO3
|
|
STI AR0,*+AR7(PLATEOBJ)
|
|
LDF *+AR0(OPOSZ),R2
|
|
FLOAT PLATE_ZOFF,R0
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(OPOSZ)
|
|
BR FPLE
|
|
FPO3
|
|
CMPI ARMS,R0
|
|
BNE FPO4
|
|
STI AR0,*+AR7(ARMSOBJ)
|
|
BR FPLE
|
|
FPO4
|
|
CMPI SCROLLB,R0
|
|
BNE FPO6
|
|
LDI *+AR7(WHITE_PAL),R2 ;This is the palette for the letters
|
|
STI R2,*+AR0(OPAL)
|
|
STI AR0,*+AR7(SCROLLBOBJ)
|
|
BR FPLE
|
|
FPO6
|
|
; CMPI FRAME,R0
|
|
; BNE FPO7
|
|
; STI AR0,*+AR7(FRAMEOBJ)
|
|
BR FPLE
|
|
FPO7
|
|
FPLE
|
|
BR FPO
|
|
FPOX
|
|
CALL MOVE_PRESSB
|
|
CALL MAKE_NEW_MARQ
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*This proc prints the name of the location on the marque
|
|
|
|
MAKE_NEW_MARQ:
|
|
; LDI 5,R1
|
|
; CALL OBJ_FIND
|
|
; RETSC
|
|
; LDI AR0,AR4
|
|
; LDI *+AR4(OROMDATA),AR2
|
|
; CALL OBJ_GETE
|
|
; RETSC
|
|
; FLOAT -24,R0
|
|
; STF R0,*+AR0(OPOSX)
|
|
; FLOAT -800+83,R0
|
|
; STF R0,*+AR0(OPOSY)
|
|
; FLOAT -341,R0
|
|
; STF R0,*+AR0(OPOSZ)
|
|
; LDI FRAME,R0 ;ID
|
|
; STI R0,*+AR0(OID)
|
|
; LDI AR0,AR2
|
|
; CALL OBJ_INSERT
|
|
;
|
|
; LDI 8,R1
|
|
; CALL OBJ_FIND
|
|
; RETSC
|
|
; LDI AR0,AR4
|
|
; LDI *+AR4(OROMDATA),AR2
|
|
; CALL OBJ_GETE
|
|
; RETSC
|
|
; FLOAT -24,R0
|
|
; STF R0,*+AR0(OPOSX)
|
|
; FLOAT -865+83,R0
|
|
; STF R0,*+AR0(OPOSY)
|
|
; FLOAT -341,R0
|
|
; STF R0,*+AR0(OPOSZ)
|
|
; LDI FRAME,R0 ;ID
|
|
; STI R0,*+AR0(OID)
|
|
; LDI AR0,AR2
|
|
; CALL OBJ_INSERT
|
|
|
|
FLOAT -710+83,R3
|
|
LDI *+AR7(RACE_NUMBER),AR2
|
|
ADDI @LEG_NAMESI,AR2
|
|
LDI *AR2,AR2
|
|
FLOAT -24,R2
|
|
FLOAT -341,R4
|
|
LDI MARQLET,R6 ;ID
|
|
CALL PRINT3D
|
|
RETS
|
|
|
|
MOVE_PRESSB:
|
|
LDI *+AR7(PRESSOBJ),AR0
|
|
LDI *+AR7(BPRESSOBJ),AR2 ;The PRESS OWNS the plate
|
|
LDF *+AR0(ORADX),R2 ;Get rotation of the PRESS
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDF *+AR0(ORADX),R2 ;Get rotation of the PRESS
|
|
LDI *+AR7(SCROLLBOBJ),AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI *+AR7(BPRESSOBJ),AR2 ;The PRESS OWNS the plate
|
|
LDI *+AR7(SCROLLBOBJ),AR3
|
|
FLOAT PRESS_DIAM,R1
|
|
ADDF 60,R1
|
|
LDF *+AR0(ORADX),R2 ;Get rotation of the PRESS
|
|
STF R2,*+AR2(ORADX)
|
|
STF R2,*+AR3(ORADX)
|
|
CALL _SINE
|
|
NEGF R0
|
|
MPYF3 R0,R1,R3
|
|
ADDF *+AR0(OPOSZ),R3 ;Translated and offset Z
|
|
STF R3,*+AR2(OPOSZ)
|
|
ADDF 1,R3 ;Ensure that the letters are behind pressb
|
|
STF R3,*+AR3(OPOSZ)
|
|
|
|
CALL _COSI
|
|
MPYF3 R0,R1,R3
|
|
FLOAT ARM_BOTTOM+PRESS_DIAM,R2
|
|
ADDF *+AR0(OPOSY),R3
|
|
CMPF R2,R3
|
|
LDFGT R2,R3
|
|
STF R3,*+AR2(OPOSY) ;Translated And OFFSET Y
|
|
STF R3,*+AR3(OPOSY) ;Translated And OFFSET Y
|
|
RETS
|
|
|
|
MOVE_BIGLET_PRESS:
|
|
LDI *+AR7(PRESSOBJ),AR0
|
|
LDI *+AR7(INIT0),AR2
|
|
LDF *+AR0(ORADX),R2 ;Get rotation of the PRESS
|
|
ABSF R2
|
|
ADDF -HALFPI,R2
|
|
STF R2,*+AR2(ORADX)
|
|
|
|
PUSH AR2
|
|
LDF *+AR0(ORADX),R2 ;Get rotation of the PRESS
|
|
LDI @MATRIXAI,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI @VECTORAI,AR1
|
|
LDF 0,R2
|
|
STF R2,*AR1
|
|
FLOAT PRESS_DIAM+60+13,R2
|
|
STF R2,*+AR1(1)
|
|
FLOAT -98,R2
|
|
STF R2,*+AR1(2)
|
|
|
|
LDI @VECTORAI,AR2
|
|
LDI @MATRIXAI,R2
|
|
LDI AR2,R3
|
|
CALL MATRIX_MUL
|
|
POP AR2
|
|
|
|
|
|
LDI @VECTORAI,AR1
|
|
FLOAT ARM_BOTTOM+PRESS_DIAM+13,R2
|
|
LDF *+AR0(OPOSY),R3
|
|
ADDF *+AR1(1),R3
|
|
CMPF R2,R3
|
|
LDFGT R2,R3
|
|
STF R3,*+AR2(OPOSY) ;Translated And OFFSET Y
|
|
|
|
LDF *+AR0(OPOSZ),R3
|
|
ADDF *+AR1(2),R3
|
|
STF R3,*+AR2(OPOSZ) ;Translated And OFFSET Z
|
|
|
|
LDI *+AR7(INIT0),AR0 ;Now use the first letter to set the rest
|
|
|
|
LDI 0,R4
|
|
MPB
|
|
LDI INIT0,IR0
|
|
ADDI R4,IR0
|
|
LDI *+AR7(IR0),AR2
|
|
LDF *+AR0(OPOSY),R3 ;Translated and offset Y
|
|
STF R3,*+AR2(OPOSY)
|
|
LDF *+AR0(OPOSZ),R3 ;Translated and offset Z
|
|
STF R3,*+AR2(OPOSZ)
|
|
|
|
LDF *+AR0(ORADX),R2 ;Get rotation of the PRESS
|
|
STF R2,*+AR2(ORADX)
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
ADDI 1,R4
|
|
CMPI 3,R4
|
|
BNE MPB
|
|
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
* This positions the bar of letters during the Name Entry
|
|
*
|
|
*
|
|
|
|
SCROLLBTAB ; A B C D E F G H I J K L M N O
|
|
.word 1057,1010,960,911,855,803,753,696,648,598,546,494,426,367,307
|
|
; P Q R S T U V W X Y Z RUB 0 1 2
|
|
.word 252,193,138,82,24,-35,-97,-161,-230,-292,-347,-401,-465,-517,-573
|
|
; 3 4 5 6 7 8 9 END
|
|
.word -633,-697,-757,-820,-880,-945,-1007,-1063
|
|
|
|
POS_SCROLLB:
|
|
LDI *+AR7(SCROLLBOBJ),AR2
|
|
LDI @POSE,R2 ;POSITION of the STEERING WHEEL
|
|
CMPI LASTCHAR,R2
|
|
LDIGT LASTCHAR,R2
|
|
|
|
LDI @SCROLLBTABI,AR1
|
|
ADDI R2,AR1
|
|
FLOAT *AR1,R2
|
|
ADDF -24,R2
|
|
SUBF *+AR2(OPOSX),R2
|
|
MPYF 0.50,R2
|
|
ADDF *+AR2(OPOSX),R2
|
|
STF R2,*+AR2(OPOSX)
|
|
LDI @POSE,R2 ;POSITION of the STEERING WHEEL
|
|
CMPI *+AR2(OVELX),R2
|
|
BEQ POSBX
|
|
STI R2,*+AR2(OVELX)
|
|
SONDFX LETTER_RIGHT
|
|
POSBX
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*ADJUST_ROLLERS This routine places the rollers in a arc so that there
|
|
* priorities are correct.
|
|
*IO = NONE
|
|
*
|
|
ROLLER_GROUP .set 400h
|
|
|
|
ADJUST_ROLLERS:
|
|
LDP @_CAMERAPOS
|
|
LDF @_CAMERAPOS,R4
|
|
SETDP
|
|
LDF 0,R3
|
|
ADJRL
|
|
FLOAT 246,R2
|
|
MPYF R3,R2
|
|
ADDF R4,R2
|
|
CALL FIND_ROLLER
|
|
FLOAT ROLLER_ZOFF,R2
|
|
ADDF R3,R2
|
|
ADDF -11,R2
|
|
STF R2,*+AR2(OPOSZ)
|
|
|
|
FLOAT -246,R2
|
|
MPYF R3,R2
|
|
ADDF R4,R2
|
|
CALL FIND_ROLLER
|
|
FLOAT ROLLER_ZOFF,R2
|
|
ADDF R3,R2
|
|
ADDF -11,R2
|
|
STF R2,*+AR2(OPOSZ)
|
|
ADDF 1,R3
|
|
CMPF 7,R3
|
|
BNE ADJRL
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*FIND_ROLLER Finds the roller with XPOS closest to R2
|
|
* PARAMETERS R2 = XPOS to look for
|
|
* RETURNS AR2 points to closest roller
|
|
|
|
FIND_ROLLER:
|
|
PUSH R3 ;R3 is used by the routine that calls this
|
|
PUSHF R3
|
|
LDI ROLLER_GROUP,R1 ;Roller Group
|
|
CALL OBJ_GFIND
|
|
FLOAT 32000,R3 ;ANY large number will do
|
|
LDI AR0,AR2 ;Make sure AR2 points to something
|
|
FRL
|
|
LDF *+AR0(OPOSX),R0
|
|
SUBF R2,R0
|
|
ABSF R0
|
|
CMPF R3,R0
|
|
LDFLT R0,R3
|
|
LDILT AR0,AR2
|
|
CALL OBJ_GFIND_NEXT
|
|
BNC FRL
|
|
|
|
POPF R3
|
|
POP R3
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
*----------------------------------------------------------------------------
|
|
ROLLER_DIAM .set 111
|
|
|
|
SPIN_ROLLERS:
|
|
LDI ROLLER_GROUP,R1 ;Roller group
|
|
CALL OBJ_GFIND
|
|
SR0
|
|
LDF *+AR0(ORADZ),R2
|
|
ADDF R0,R2
|
|
STF R2,*+AR0(ORADZ)
|
|
LDI AR0,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_ZMATRIX
|
|
|
|
CALL OBJ_GFIND_NEXT
|
|
BNC SR0
|
|
|
|
;NOW move the plate
|
|
LDI *+AR7(PLATEOBJ),AR0
|
|
FLOAT ROLLER_DIAM,R1
|
|
|
|
MPYF R1,R0 ;R = 111, R0 = RADS rotated
|
|
;Circumfrence = 2*PI*R NOTE R0=2PI/THETA
|
|
LDF *+AR0(OPOSX),R2
|
|
SUBF R0,R2
|
|
STF R2,*+AR0(OPOSX)
|
|
|
|
CALL MOVE_PLAYERS_LETTERS
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*Moves the LEtters on the plate being stamped
|
|
*PARAMETERS R0 = X distance to move the letters
|
|
*
|
|
|
|
MOVE_PLAYERS_LETTERS:
|
|
PUSH R6
|
|
PUSHF R6
|
|
LDI *+AR7(PLACE),R2
|
|
ADDI 16,R2
|
|
LDI 1,R1
|
|
LSH R2,R1
|
|
CALL OBJ_GFIND
|
|
BC MPLX ;They haven't been made yet
|
|
|
|
LDI *+AR7(PLATEOBJ),AR1
|
|
LDF *+AR1(ORADX),R2
|
|
ADDF HALFPI,R2
|
|
FLOAT LETTER_YOFF,R3
|
|
ADDF *+AR1(OPOSY),R3
|
|
LDF *+AR1(OPOSZ),R4
|
|
SUBF 1,R4 ;Make sure the letters are in front
|
|
|
|
MPL1
|
|
LDF *+AR0(OPOSX),R5
|
|
SUBF R0,R5
|
|
STF R5,*+AR0(OPOSX)
|
|
|
|
STF R3,*+AR0(OPOSY)
|
|
STF R4,*+AR0(OPOSZ)
|
|
|
|
LDF *+AR0(ORADX),R6
|
|
CMPF -PI,R6
|
|
BEQ MPL2
|
|
LDI AR0,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
MPL2
|
|
CALL OBJ_GFIND_NEXT
|
|
BNC MPL1
|
|
MPLX
|
|
POPF R6
|
|
POP R6
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
MAKE_PLAYERS_PLATE:
|
|
LDI *+AR7(RACE_NUMBER),R6 ;Race number
|
|
LDI *+AR7(PLACE),R7 ;Entry number
|
|
CALL GET_TABLE_ADDR
|
|
CALL TABLE_ENTRY_READ
|
|
STI R1,*+AR7(LETTER0)
|
|
STI R2,*+AR7(LETTER1)
|
|
STI R3,*+AR7(LETTER2)
|
|
|
|
LDI *+AR7(PLATEOBJ),AR0
|
|
|
|
LDI *+AR7(PLACE),R1
|
|
CALL CREATE_LETTERS
|
|
|
|
LDF 0,R0
|
|
CALL MOVE_PLAYERS_LETTERS
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
FIRST_BOLT .set 30h
|
|
INI_PLAYERS_BOLTS:
|
|
LDI *+AR7(PLACE),R1 ;Calculate the first bolts object number
|
|
MPYI 4,R1
|
|
ADDI FIRST_BOLT,R1
|
|
LDI 3,AR5
|
|
IPB1
|
|
CALL OBJ_FIND
|
|
BC IPBX
|
|
FLOAT -2500,R0
|
|
STF R0,*+AR0(OPOSZ)
|
|
ADDI 1,R1
|
|
DBU AR5,IPB1
|
|
IPBX
|
|
RETS
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*PROC FLY BOLT
|
|
*
|
|
FLY_BOLT:
|
|
SONDFX DD2
|
|
|
|
LDI 15,AR5
|
|
FBL
|
|
|
|
FLOAT 1000,R1
|
|
LDF *+AR4(OPOSZ),R3
|
|
SUBF R3,R1
|
|
MPYF 0.24,R1
|
|
ADDF *+AR4(OPOSZ),R1
|
|
STF R1,*+AR4(OPOSZ)
|
|
|
|
LDF *+AR4(ORADZ),R2 ;Now spin the little fckers
|
|
ADDF 0.0873,R2
|
|
STF R2,*+AR4(ORADZ)
|
|
LDI AR4,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_ZMATRIX
|
|
|
|
SLEEP 1
|
|
DBU AR5,FBL
|
|
|
|
DIE
|
|
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*Below Is code That is shared by both the High score entry and display
|
|
*
|
|
*
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
|
|
*----------------------------------------------------------------------------
|
|
* OBJ_FIND Finds the object in the Active list
|
|
* PARAMETERS
|
|
* R1 = ID of the object
|
|
* RETURNS
|
|
* AR0 Points to the first object in the list with that ID
|
|
* CARRY = SET if not found
|
|
|
|
OBJ_FIND:
|
|
PUSH R0
|
|
PUSHF R0
|
|
PUSH AR5
|
|
|
|
LDI @OACTIVEI,AR0
|
|
LDI *AR0,AR5
|
|
|
|
OFIND LDI AR5,R0 ;Search for the plate
|
|
BZ OH_NO
|
|
LDI R0,AR0
|
|
LDI *AR0,AR5
|
|
LDI *+AR0(OID),R0
|
|
AND 0FFh,R0
|
|
CMPI R1,R0
|
|
BNE OFIND
|
|
CLRC ;GOT IT
|
|
O_FOUND
|
|
POP AR5
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
OH_NO
|
|
SETC
|
|
BR O_FOUND ;OBJECT NOT found
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* OBJ_FIND_NEXT Find the next instance of the object
|
|
* PARAMETERS
|
|
* AR0 The First instance of the object.
|
|
* RETURNS
|
|
* AR0 Points to the next object in the list with that ID
|
|
* CARRY = SET if not found
|
|
|
|
OBJ_FIND_NEXT:
|
|
PUSH R0
|
|
PUSHF R0
|
|
PUSH AR5
|
|
|
|
LDI *AR0,AR5
|
|
|
|
OFN LDI AR5,R0
|
|
LDI R0,AR0
|
|
BZ OFNX ;NONE FOUND. This routine is passive
|
|
LDI *AR0,AR5
|
|
LDI *+AR0(OID),R0
|
|
AND 0FFh,R0
|
|
CMPI R1,R0
|
|
BNE OFN
|
|
OFNX
|
|
CLRC
|
|
CMPI 0,AR0
|
|
BNE OFNX1
|
|
SETC
|
|
OFNX1
|
|
POP AR5
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
* OBJ_GFIND Finds the FIRST object in the GROUP on the Active list
|
|
* PARAMETERS
|
|
* R1 = BIT in the ID that determines the group
|
|
* RETURNS
|
|
* AR0 Points to the first object in the list with that ID
|
|
* CARRY = SET if not found
|
|
|
|
OBJ_GFIND:
|
|
PUSH R0
|
|
PUSHF R0
|
|
PUSH AR5
|
|
|
|
LDI @OACTIVEI,AR0
|
|
LDI *AR0,AR5
|
|
|
|
OGFIND LDI AR5,R0 ;Search for the plate
|
|
BZ OH_GNO
|
|
LDI R0,AR0
|
|
LDI *AR0,AR5
|
|
LDI *+AR0(OID),R0
|
|
TSTB R1,R0
|
|
BZ OGFIND
|
|
CLRC
|
|
O_GFOUND ;GOT IT
|
|
POP AR5
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
OH_GNO
|
|
SETC
|
|
LDI 0,AR0
|
|
BR O_GFOUND ;OBJECT NOT found
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* OBJ_GFIND_NEXT Find the next instance of the GROUP
|
|
* PARAMETERS
|
|
* AR0 The First instance of the object.
|
|
* R1 = BIT in the ID that determines the group
|
|
*
|
|
* RETURNS
|
|
* AR0 Points to the next object in the list with that ID
|
|
* CARRY = SET if not found
|
|
|
|
OBJ_GFIND_NEXT:
|
|
PUSH R0
|
|
PUSHF R0
|
|
PUSH AR5
|
|
|
|
LDI *AR0,AR5
|
|
|
|
OGFN LDI AR5,R0
|
|
LDI R0,AR0
|
|
BZ OGFNX ;NONE FOUND. This routine is passive
|
|
LDI *AR0,AR5
|
|
LDI *+AR0(OID),R0
|
|
TSTB R1,R0
|
|
BZ OGFN
|
|
OGFNX
|
|
CLRC
|
|
CMPI 0,AR0
|
|
BNE OGFNX1
|
|
SETC
|
|
OGFNX1
|
|
POP AR5
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*This code can be deleted after I can change the ID numbers for the PRESS Group
|
|
* PARAMETERS AR3 = packed list of object ID's to tag
|
|
* R2 = What to tage them with. NOTE R2 will be orred with the ID
|
|
OBJ_TAG:
|
|
|
|
OTAG0
|
|
LDI *AR3++,R1 ;Get ID looking for
|
|
CMPI 0FFh,R1 ;Is it a range of ID's?
|
|
BLE OTAG
|
|
LDI R1,R0 ;YES, Decode the end
|
|
AND 0FFh,R0
|
|
LSH -8,R1 ;Decode the start
|
|
OTAG1
|
|
CALL OBJ_TAGALL ;Remove the range of objects
|
|
ADDI 1,R1
|
|
CMPI R1,R0
|
|
BGE OTAG1
|
|
BR OTAG0
|
|
OTAG
|
|
CMPI 0,R1
|
|
BEQ OTAGX
|
|
CALL OBJ_TAGALL
|
|
BR OTAG0
|
|
OTAGX
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*This code can be deleted after I can change the ID numbers for the PRESS Group
|
|
* R1 = Object looking for
|
|
* R2 = What to tage them with. NOTE R2 will be orred with the ID
|
|
OBJ_TAGALL:
|
|
CALL OBJ_FIND
|
|
BC OTAX
|
|
LDI *+AR0(OID),R3
|
|
OR R2,R3
|
|
STI R3,*+AR0(OID)
|
|
OTA1
|
|
CALL OBJ_FIND_NEXT
|
|
BC OTAX
|
|
LDI *+AR0(OID),R3
|
|
OR R2,R3
|
|
STI R3,*+AR0(OID)
|
|
BR OTA1
|
|
OTAX
|
|
RETS
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*OBJ_MOVY_GROUP
|
|
* PARAMETERS R1 = Bit of OID to search for
|
|
* PARAMETERS R2 = FLOAT amount to move YPOS
|
|
*
|
|
OBJ_MOVY_GROUP:
|
|
PUSH R3
|
|
PUSHF R3
|
|
|
|
CALL OBJ_GFIND
|
|
BC OMYG
|
|
LDF *+AR0(OPOSY),R3
|
|
ADDF R2,R3
|
|
STF R3,*+AR0(OPOSY)
|
|
OMYG1
|
|
CALL OBJ_GFIND_NEXT
|
|
BC OMYG
|
|
LDF *+AR0(OPOSY),R3
|
|
ADDF R2,R3
|
|
STF R3,*+AR0(OPOSY)
|
|
BR OMYG1
|
|
OMYG
|
|
POPF R3
|
|
POP R3
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*OBJ_DEL_GROUP
|
|
* PARAMETERS R1 = Bit of OID to search for
|
|
*
|
|
*
|
|
OBJ_DEL_GROUP:
|
|
CALL OBJ_GFIND
|
|
BC ODG
|
|
LDI AR0,AR2
|
|
CALL OBJ_PULL
|
|
ODG1
|
|
CALL OBJ_GFIND_NEXT
|
|
BC ODG
|
|
LDI AR0,AR2
|
|
CALL OBJ_PULL
|
|
BR ODG1
|
|
ODG
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
FIND_ALL_PLATES:
|
|
LDI 15,R0 ;HE WILL NEVER GET TO THIS PLACE
|
|
STI R0,*+AR7(PLACE)
|
|
CALL FIND_PLATES
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*FIND_PLATES Creates the objects for the name and the score
|
|
*
|
|
*
|
|
*
|
|
|
|
|
|
NUM_PLATES .set 9
|
|
FIRST_PLATE .set 20h
|
|
|
|
FIND_PLATES:
|
|
PUSH AR5
|
|
LDI *+AR7(RACE_NUMBER),R6 ;Race number
|
|
LDI 0,R7 ;Entry number
|
|
CALL GET_TABLE_ADDR
|
|
STI AR2,*+AR7(HSPOINTER)
|
|
|
|
LDI 0,AR5
|
|
MP0
|
|
|
|
CMPI *+AR7(PLACE),AR5
|
|
BEQ MP1 ;Skip creating the letters and score for the player
|
|
|
|
|
|
LDI *+AR7(HSPOINTER),AR2
|
|
CALL TABLE_ENTRY_READ
|
|
STI AR2,*+AR7(HSPOINTER)
|
|
STI R1,*+AR7(LETTER0)
|
|
STI R2,*+AR7(LETTER1)
|
|
STI R3,*+AR7(LETTER2)
|
|
|
|
CALL MAKE_TIME
|
|
|
|
LDI AR5,R1
|
|
ADDI FIRST_PLATE,R1
|
|
CALL OBJ_FIND ;Get the pointer to the plate
|
|
|
|
LDI AR5,R1
|
|
CALL CREATE_LETTERS
|
|
|
|
MP2
|
|
ADDI 1,AR5
|
|
CMPI NUM_PLATES,AR5
|
|
BLE MP0
|
|
|
|
POP AR5
|
|
RETS
|
|
|
|
MP1 ;Skip this plate
|
|
LDI *+AR7(HSPOINTER),AR2
|
|
CALL TABLE_ENTRY_READ
|
|
STI AR2,*+AR7(HSPOINTER)
|
|
|
|
LDI AR5,R1
|
|
ADDI FIRST_PLATE,R1
|
|
CALL OBJ_FIND ;Get the pointer to the plate
|
|
STI AR0,*+AR7(MISPLATEOBJ) ;Save its pointer for latter use
|
|
|
|
LDI @SCORE,R0
|
|
CALL MAKE_TIME
|
|
|
|
BR MP2
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*MAKE_NUMBERS
|
|
* R0 = INTEGER SCORE
|
|
* AR5 = PLACE
|
|
*
|
|
*
|
|
FIRST_NUMBER .set 10h
|
|
|
|
MAKE_NUMBERS:
|
|
LDI R0,R2
|
|
LDI AR7,AR2
|
|
ADDI TEMP_STR,AR2
|
|
CALL _itoa
|
|
CALL FORMAT_NUM
|
|
LDI AR7,AR4
|
|
ADDI TEMP_STR,AR4
|
|
|
|
|
|
LDI FIRST_NUMBER,R1
|
|
ADDI AR5,R1 ;AR5 = the place
|
|
CALL OBJ_FIND
|
|
|
|
LDI *AR4++,IR0
|
|
LDI @NUMTABI,AR1
|
|
LDI *+AR1(IR0),R0
|
|
STI R0,*+AR0(OROMDATA) ;Replace it with the proper number
|
|
LDI HIGH_SCORE_GROUP,R0 ;Make this part of the High Score group
|
|
STI R0,*+AR0(OID)
|
|
|
|
LDI 5,AR6 ;Now make 6 more
|
|
MNLOOP
|
|
LDI AR0,AR1
|
|
LDI *AR4++,IR0
|
|
LDI @NUMTABI,AR0
|
|
LDI *+AR0(IR0),AR2
|
|
CALL OBJ_GETE
|
|
|
|
LDI HIGH_SCORE_GROUP,R0 ;Make this part of the High Score group
|
|
STI R0,*+AR0(OID)
|
|
|
|
LDF *+AR1(OPOSX),R0
|
|
FLOAT -145,R1 ;WIDTH OF ONE NUMBER
|
|
ADDF R1,R0
|
|
STF R0,*+AR0(OPOSX)
|
|
|
|
LDF *+AR1(OPOSY),R0
|
|
STF R0,*+AR0(OPOSY)
|
|
|
|
LDF *+AR1(OPOSZ),R0
|
|
STF R0,*+AR0(OPOSZ)
|
|
|
|
LDF 0,R2
|
|
STF R2,*+AR0(ORADX)
|
|
LDI AR0,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERT
|
|
|
|
DBU AR6,MNLOOP
|
|
RETS
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*MAKE_TIME
|
|
* R0 = INTEGER TIME
|
|
* AR5 = PLACE
|
|
*
|
|
*
|
|
.data
|
|
LONGEST_TIME .word 198000
|
|
.text
|
|
MAKE_TIME:
|
|
CMPI 0,R0 ;Range check time for bogus values
|
|
LDILT 0,R0
|
|
LDI @LONGEST_TIME,R1
|
|
CMPI R1,R0
|
|
LDIGT R1,R0
|
|
|
|
CALL CVTTIME
|
|
MPYI 100,R1
|
|
ADDI R1,R0
|
|
MPYI 10000,R2
|
|
ADDI R0,R2
|
|
; CALL CONVERT_TIME
|
|
LDI AR7,AR2
|
|
ADDI TEMP_STR,AR2
|
|
CALL _itoa
|
|
CALL FORMAT_NUM
|
|
LDI AR7,AR4
|
|
ADDI TEMP_STR,AR4
|
|
|
|
LDI FIRST_NUMBER,R1
|
|
ADDI AR5,R1 ;AR5 = the place
|
|
CALL OBJ_FIND
|
|
|
|
LDI *AR4++,IR0
|
|
LDI @NUMTABI,AR1
|
|
LDI *+AR1(IR0),R0
|
|
STI R0,*+AR0(OROMDATA) ;Replace it with the proper number
|
|
LDI HIGH_SCORE_GROUP,R0 ;Make this part of the High Score group
|
|
STI R0,*+AR0(OID)
|
|
|
|
LDI 6,AR6 ;Now make 6 more
|
|
MTLOOP
|
|
LDI AR0,AR1
|
|
FLOAT -145,R1 ;WIDTH OF ONE NUMBER
|
|
|
|
CMPI 5,AR6
|
|
BEQ MT1
|
|
CMPI 2,AR6
|
|
BNE MT2
|
|
MT1
|
|
LDL dcol,AR2
|
|
CALL OBJ_GETE
|
|
FLOAT -82,R1 ;WIDTH OF ONE COLON
|
|
BR MT3
|
|
MT2
|
|
LDI *AR4++,IR0
|
|
LDI @NUMTABI,AR0
|
|
LDI *+AR0(IR0),AR2
|
|
CALL OBJ_GETE
|
|
MT3
|
|
LDI HIGH_SCORE_GROUP,R0 ;Make this part of the High Score group
|
|
STI R0,*+AR0(OID)
|
|
|
|
LDF *+AR1(OPOSX),R0
|
|
ADDF R1,R0
|
|
STF R0,*+AR0(OPOSX)
|
|
|
|
LDF *+AR1(OPOSY),R0
|
|
STF R0,*+AR0(OPOSY)
|
|
|
|
LDF *+AR1(OPOSZ),R0
|
|
STF R0,*+AR0(OPOSZ)
|
|
|
|
LDF 0,R2
|
|
STF R2,*+AR0(ORADX)
|
|
LDI AR0,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERT
|
|
|
|
DBU AR6,MTLOOP
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*READS ASCI NUMBER and reformats it to 7 digit display
|
|
* AR2 = string
|
|
FORMAT_NUM:
|
|
LDI 0,R1
|
|
LDI 0,R2
|
|
LDI AR2,AR1
|
|
FORMN_LOOP
|
|
CMPI 0,R2
|
|
BNE FORMNA
|
|
LDI *AR2++,R0
|
|
FORMNA LDI R0,R3
|
|
LSH R2,R3
|
|
SUBI 8,R2
|
|
CMPI -24,R2
|
|
LDILT 0,R2
|
|
|
|
AND 0FFh,R3
|
|
CMPI MINUS_CHAR,R3
|
|
BEQ FORMN ;Disregard minus sign
|
|
CMPI 0,R3
|
|
BEQ FN_PAD ;Reached end
|
|
SUBI '0',R3
|
|
PUSH R3
|
|
ADDI 1,R1
|
|
FORMN
|
|
CMPI 6,R1
|
|
BLE FORMN_LOOP
|
|
FN_PAD
|
|
SUBI 1,R1
|
|
LDI R1,RC
|
|
|
|
RPTB FORMN1
|
|
POP R0
|
|
FORMN1 STI R0,*AR1++
|
|
|
|
CMPI 6,R1
|
|
BEQ FORMNX
|
|
LDI 0,R0
|
|
NEGI R1
|
|
ADDI 6,R1
|
|
BN FORMNX
|
|
LDI R1,RC
|
|
RPTB FORMN2
|
|
FORMN2 STI R0,*AR1++
|
|
FORMNX
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
* PARAMETERS AR0 = POINTER TO PLATE that owns this
|
|
* LETTER0-LETTER2 = THE three letters
|
|
* R1 = Place the player is in
|
|
LETTER_SIZEX .set 120
|
|
LETTER_XOFF .set -120
|
|
LETTER_YOFF .set -12
|
|
|
|
CREATE_LETTERS:
|
|
LDI AR7,AR3
|
|
ADDI LETTER0,AR3
|
|
|
|
ADDI 16,R1
|
|
LDI 1,R2
|
|
LSH R1,R2
|
|
OR HIGH_SCORE_GROUP,R2 ;Make this part of the High Score group
|
|
|
|
LDI AR0,AR1
|
|
LDF 0,R4
|
|
CRLLOOP
|
|
LDI *AR3++,AR2
|
|
AND 07Fh,AR2 ;EXTRACT the CHAR
|
|
CMPI 0,AR2
|
|
BEQ CRLX ;String Zero terminated
|
|
|
|
CALL ASCII_TO_OBJ
|
|
BC CRLX ;OUT OF OBJECTS... BAIL
|
|
|
|
FLOAT LETTER_SIZEX,R0
|
|
MPYF R4,R0
|
|
FLOAT LETTER_XOFF,R1
|
|
ADDF R1,R0
|
|
ADDF *+AR1(OPOSX),R0
|
|
STF R0,*+AR0(OPOSX)
|
|
FLOAT LETTER_YOFF,R0
|
|
ADDF *+AR1(OPOSY),R0
|
|
STF R0,*+AR0(OPOSY)
|
|
LDF *+AR1(OPOSZ),R0
|
|
SUBF 1,R0 ;Make sure that it is on top of the plate
|
|
STF R0,*+AR0(OPOSZ)
|
|
LDI *+AR7(WHITE_PAL),R0
|
|
STI R0,*+AR0(OPAL)
|
|
STI R2,*+AR0(OID)
|
|
|
|
PUSH R2
|
|
LDF 0,R2
|
|
LDI *-AR3(1),AR2
|
|
CMPI 20h,AR2 ;is it a space?
|
|
LDFEQ -PI,R2
|
|
STF R2,*+AR0(ORADX)
|
|
LDI AR0,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_XMATRIX
|
|
POP R2
|
|
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERT
|
|
|
|
ADDF 1,R4
|
|
CMPF 2,R4
|
|
BLE CRLLOOP
|
|
CRLX
|
|
RETS
|
|
|
|
ASCII_TO_OBJ:
|
|
CMPI '0',AR2
|
|
LDILT '0',AR2
|
|
CMPI '9',AR2
|
|
BGT CRLL
|
|
ADDI 'Z'+2-'0',AR2
|
|
BR CRL1
|
|
CRLL
|
|
CMPI 'Z',AR2
|
|
LDIGT 'Z',AR2
|
|
CRL1
|
|
SUBI 'A',AR2
|
|
CMPI 0,AR2
|
|
LDILT 0,AR2
|
|
CMPI LASTCHAR,AR2
|
|
LDIGT LASTCHAR,AR2
|
|
ADDI @PLATE_LETTERSI,AR2
|
|
LDI *AR2,AR2
|
|
|
|
CALL OBJ_GETE
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
* PARAMETERS AR2 = POINTER TO STRING
|
|
* R2 = Xpos FL
|
|
* R3 = Ypos FL
|
|
* R4 = Zpos FL
|
|
* R6 = ID
|
|
LETTER3D_SIZEX .set 80
|
|
|
|
PRINT3D:
|
|
LDI AR2,AR1 ;I use AR2 as input for continuity with the 2d print
|
|
LDI 0,R1
|
|
PUSH R1 ;This will terminate the string being pulled off the stack
|
|
FLOAT LETTER3D_SIZEX/2,R5
|
|
PR3DFS
|
|
LDI *AR1,R0 ;Count the number of letters in this group
|
|
LSH R1,R0
|
|
ADDI -8,R1
|
|
CMPI -24,R1
|
|
BGE PR3DA
|
|
LDI 0,R1
|
|
NOP *AR1++
|
|
PR3DA
|
|
AND 7Fh,R0
|
|
PUSH R0
|
|
ADDI 1,IR0
|
|
ADDF R5,R2 ;Center the text's Xpos
|
|
CMPI 0,R0
|
|
BNE PR3DFS
|
|
SUBF R5,R2 ;Correction for zero terminator
|
|
SUBF R5,R2 ;Correction for first letter
|
|
|
|
|
|
POP AR0 ;POP the zero terminator
|
|
PR3DLOOP
|
|
POP AR0
|
|
CMPI 0,AR0 ;Not stripped by loop above
|
|
BEQ PR3DX ;String Zero terminated
|
|
|
|
CMPI 20h,AR0 ;if its a space, skip it
|
|
BEQ PR3DNEXT
|
|
CMPI '0',AR0
|
|
LDIZ 'O',AR0
|
|
|
|
CMPI '1',AR0
|
|
LDIZ 'I',AR0
|
|
|
|
SUBI 'A',AR0
|
|
CMPI 0,AR0
|
|
LDILT 0,AR0
|
|
CMPI THREED_END,AR0
|
|
LDIGT THREED_END,AR0
|
|
ADDI @THREED_LETTERSI,AR0
|
|
LDI *AR0,AR2
|
|
|
|
CALL OBJ_GETE
|
|
.if DEBUG
|
|
BC $
|
|
.endif
|
|
|
|
STF R2,*+AR0(OPOSX)
|
|
STF R3,*+AR0(OPOSY)
|
|
STF R4,*+AR0(OPOSZ)
|
|
STI R6,*+AR0(OID)
|
|
PUSHF R2
|
|
LDF 0,R2
|
|
LDI AR0,AR2
|
|
ADDI OMATRIX,AR2
|
|
CALL FIND_YMATRIX
|
|
POPF R2
|
|
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERT
|
|
PR3DNEXT
|
|
FLOAT LETTER3D_SIZEX,R0
|
|
SUBF R0,R2
|
|
BR PR3DLOOP
|
|
PR3DX
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*Below Is code only used to display the high score and is not used during high
|
|
*score entry
|
|
*
|
|
*
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
*----------------------------------------------------------------------------
|
|
|
|
HS_ZOOM .set 40
|
|
HS_STARTY .set 650
|
|
;HS_ENDY .set -280
|
|
HS_ENDY .set -210
|
|
HS_YDIFF .set (HS_ENDY-HS_STARTY)/HS_ZOOM
|
|
|
|
HS_STARTZ .set -4200
|
|
HS_ENDZ .set -1960 ;-800
|
|
HS_ZDIFF .set (HS_ENDZ-HS_STARTZ)/HS_ZOOM
|
|
|
|
DISPLAY_HIGH_SCORES:
|
|
LDL scroll_white,AR2
|
|
CALL PAL_ALLOC_RAW
|
|
|
|
LDL plate_darkp,AR2
|
|
CALL PAL_ALLOC_RAW
|
|
|
|
LDL plate_medp,AR2
|
|
CALL PAL_ALLOC_RAW
|
|
|
|
LDL plate_lightp,AR2
|
|
CALL PAL_ALLOC_RAW
|
|
|
|
LDL plate_lightp1,AR2
|
|
CALL PAL_ALLOC_RAW
|
|
|
|
LDL press_PALETTES,AR2 ;Load in the palettes
|
|
CALL alloc_section
|
|
|
|
LDI 0,R0 ;IGNORE PRVIOUS BUTTON PRESSES
|
|
STI R0,@RADIO_HS_SWITCH
|
|
STI R0,@RADIO_HS_SHADOW
|
|
|
|
LDI @ATTRWAVE,AR5
|
|
DHSLOOP
|
|
CLRI AR0
|
|
; LDP @SWITCH3
|
|
; NOT @SWITCH3,R0 ;READ HARDWARE 0=CLOSED, 1=OPEN
|
|
; LDI *AR0,R2 ;Loff
|
|
; SETDP
|
|
; AND SW_RADIO_H,R0
|
|
; BNZ DHSLOOP ;Wait for radio button to come up
|
|
|
|
LDI AR5,AR6
|
|
CREATE DISPLAY_HS,UTIL_C|DISPLAYHS_T
|
|
LDI AR0,AR4 ;Save PROC incase we need to kill it latter
|
|
LDI 30*7,AR6 ;Sleep 7 seconds
|
|
DHSWAIT
|
|
SLEEP 1
|
|
; CLRI AR0
|
|
; LDP @SWITCH3
|
|
; NOT @SWITCH3,R0 ;READ HARDWARE 0=CLOSED, 1=OPEN
|
|
; LDI *AR0,R2 ;Loff
|
|
; SETDP
|
|
; AND SW_RADIO_H,R0
|
|
; BNZ DHSNEXT ;if radio button pressed skip to next HS
|
|
LDI @RADIO_HS_SWITCH,R0
|
|
CMPI @RADIO_HS_SHADOW,R0 ;Edge trigger
|
|
BZ DHSNOBUT
|
|
STI R0,@RADIO_HS_SHADOW
|
|
CMPI -1,R0 ;First trigger
|
|
LDIEQ -1,AR5 ;First trigger set level = -1 (DHSNEXT WILL INC)
|
|
|
|
BR DHSNEXT
|
|
DHSNOBUT
|
|
DBU AR6,DHSWAIT
|
|
|
|
CALL OBJ_INIT ;initialize object system (ERASE OLD OBJECTS)
|
|
|
|
ADDI 1,AR5
|
|
CMPI 15,AR5
|
|
BGE DHSLOOPX
|
|
TSTB 1,AR5
|
|
BNE DHSLOOP
|
|
DHSLOOPX
|
|
BR CYCLE_ATTR
|
|
DHSNEXT
|
|
ADDI 1,AR5
|
|
CMPI 15,AR5
|
|
BGE DHSLOOPX
|
|
|
|
LDI UTIL_C|DISPLAYHS_T,R0 ;KILL THE OLD PROCS OFF
|
|
LDI CLASS_M|TYPE_M,R1
|
|
CALL PRC_KILLALL
|
|
CALL OBJ_INIT ;initialize object system (ERASE OLD OBJECTS)
|
|
BR DHSLOOP
|
|
|
|
DISPLAY_HS:
|
|
STI AR6,*+AR7(RACE_NUMBER) ;Passed by parent proc
|
|
|
|
|
|
LDL scroll_white,AR2
|
|
CALL PAL_FIND_RAW
|
|
STI R0,*+AR7(WHITE_PAL)
|
|
|
|
LDI 0,R0
|
|
STI R0,@NOAERASE
|
|
|
|
LDP @_CAMERAPOS+X ;Set the initial camera position
|
|
FLOAT -4700,R0
|
|
STF R0,@_CAMERAPOS+X
|
|
FLOAT HS_STARTY,R0
|
|
STF R0,@_CAMERAPOS+Y
|
|
FLOAT HS_STARTZ,R0
|
|
STF R0,@_CAMERAPOS+Z
|
|
|
|
CLRF R2
|
|
STF R2,@_CAMERARAD+Y
|
|
SETDP
|
|
|
|
LDI @CAMERAMATRIXI,AR2
|
|
CALL FIND_YMATRIX
|
|
|
|
LDL press_grp,AR2 ;Load the objects
|
|
CALL LOAD_SINGLE_SECTION
|
|
|
|
CALL DELETE_PRESS_OBJECTS ;Loose the extra stuff used for the name entry
|
|
CALL FIND_ALL_PLATES
|
|
|
|
CALL FIX_PLATES ;Init the plates zpos for the fly in
|
|
|
|
FLOAT 120,R2 ;Adjust the plates y position for the new Marqee
|
|
LDI HIGH_SCORE_GROUP,R1 ;High score group
|
|
CALL OBJ_MOVY_GROUP
|
|
|
|
LDI 9h,R1
|
|
CALL OBJ_FIND
|
|
LDI AR0,AR2
|
|
CALL OBJ_PULL
|
|
|
|
CALL DISPLAY_HSTEXT
|
|
|
|
CALL RESCAN ;Make sure all these changes are shown the next display
|
|
|
|
LDI *+AR7(RACE_NUMBER),R4
|
|
CREATEC FLASH_LETTERS_PROC,UTIL_C|DISPLAYHS_T|FLASH_ST
|
|
STI AR0,*+AR7(FLASH_PROC)
|
|
DHS0
|
|
SLEEP 1
|
|
FLOAT 250,R0
|
|
CALL FLY_PLATES ;Fly the plates onto the back wall
|
|
FLOAT 998,R1
|
|
CMPF R1,R3
|
|
BLT DHS0
|
|
|
|
SLEEP 30*2
|
|
|
|
LDI HS_ZOOM-1,AR6
|
|
DHS1
|
|
SLEEP 1
|
|
FLOAT HS_ZDIFF,R1 ;Zoom the camera up close
|
|
LDP @_CAMERAPOS
|
|
|
|
FLOAT HS_YDIFF,R1 ;Pan the y so that the marqee is at the top
|
|
LDF @_CAMERAPOS+Y,R0
|
|
ADDF R1,R0
|
|
STF R0,@_CAMERAPOS+Y
|
|
|
|
FLOAT HS_ZDIFF,R1
|
|
LDF @_CAMERAPOS+Z,R0
|
|
ADDF R1,R0
|
|
STF R0,@_CAMERAPOS+Z
|
|
|
|
SETDP
|
|
DBU AR6,DHS1
|
|
|
|
SLEEP 30*2 ;Pause to see last few names
|
|
LDI *+AR7(FLASH_PROC),AR2
|
|
CALL PRC_KILL
|
|
DIE
|
|
|
|
*----------------------------------------------------------------------------
|
|
*PROC
|
|
*R4 = race number
|
|
FLASH_PALSI .word FLASH_PALS
|
|
scroll_whiteI .word scroll_white
|
|
.SECT "THEDATA"
|
|
FLASH_PALS
|
|
.word plate_medp,plate_lightp,plate_lightp1,plate_lightp,-1
|
|
.text
|
|
|
|
|
|
FLASH_LETTERS_PROC:
|
|
.if FLASH_ON = 1
|
|
LDI R4,R1
|
|
CALL CHECK_LASTHS
|
|
CMPI -1,R0
|
|
BEQ FLASH_LOCK
|
|
ADDI 16,R0
|
|
LDI 1,R4
|
|
LSH R0,R4
|
|
OR HIGH_SCORE_GROUP,R4 ;Make this part of the High Score group
|
|
LDI @FLASH_PALSI,AR6
|
|
FLASH_LOOP
|
|
LDI *AR6,R0
|
|
LDIN @FLASH_PALSI,AR6
|
|
LDIN *AR6++,R0 ;THIS will increment allways
|
|
PUSH R0
|
|
LDI 200,AR2
|
|
CALL RANDPER
|
|
POP R0
|
|
LDIC @scroll_whiteI,R0
|
|
CALL FLASH_LETTERS
|
|
SLEEP 6
|
|
BR FLASH_LOOP
|
|
.endif
|
|
FLASH_LOCK
|
|
SLEEP 1
|
|
BR FLASH_LOCK
|
|
|
|
*----------------------------------------------------------------------------
|
|
*R0 OPAL
|
|
*R4 OID
|
|
FLASH_LETTERS:
|
|
LDI R0,AR2
|
|
CALL PAL_FIND_RAW
|
|
LDI R4,AR2
|
|
CALL OBJ_FIND_FIRST
|
|
BNC FLASHX
|
|
FLASH_LP
|
|
STI R0,*+AR0(OPAL)
|
|
LDI AR2,R1
|
|
CALL FIND_NEXT_OBJ
|
|
BNC FLASH_LP
|
|
FLASHX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
*REMOVES the objects in the list of ID's
|
|
*NOTE if the value of the ID is > FF it will eliminate the range (inclusive)
|
|
*
|
|
|
|
DELIST .word 808Bh,0104h,3057h,0
|
|
|
|
|
|
DELETE_PRESS_OBJECTS:
|
|
LDI @DELISTI,AR3 ;TAG them with 100h
|
|
LDI 100h,R2
|
|
CALL OBJ_TAG
|
|
|
|
LDI 100h,R1 ;Now Bag them
|
|
CALL OBJ_DEL_GROUP
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
* FIX_PLATES
|
|
*
|
|
FIX_PLATES:
|
|
PUSH AR5
|
|
FLOAT -5000,R0 ;Initial Z offset
|
|
LDI 0,AR5
|
|
LDI 1h,R2
|
|
LSH 16,R2
|
|
FIXPL
|
|
LDI AR5,R1
|
|
ADDI FIRST_PLATE,R1
|
|
CALL OBJ_FIND
|
|
|
|
LDF *+AR0(OPOSZ),R3 ;Offset the plates Z
|
|
ADDF R0,R3
|
|
STF R3,*+AR0(OPOSZ)
|
|
SUBF 1,R3
|
|
FIXPL1
|
|
LDI R2,R1
|
|
LSH 1,R2
|
|
CALL OBJ_GFIND
|
|
BC FIXPL3 ;No letters on this plate, move on. (useually hosed CMOS)
|
|
FIXPL2
|
|
STF R3,*+AR0(OPOSZ) ;Now do the letters on it
|
|
CALL OBJ_GFIND_NEXT
|
|
BNC FIXPL2 ;do as many as there are
|
|
FIXPL3
|
|
FLOAT -500,R1 ;PLate to plate offset
|
|
ADDF R1,R0
|
|
|
|
ADDI 1,AR5
|
|
CMPI 9,AR5
|
|
BLE FIXPL
|
|
POP AR5
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
* FLY PLATES
|
|
* R0 = how far to move
|
|
* R3 = position of the last plate
|
|
FLY_PLATES:
|
|
PUSH AR5
|
|
LDI 0,AR5
|
|
LDI 1h,R2
|
|
LSH 16,R2
|
|
FLPL
|
|
LDI AR5,R1
|
|
ADDI FIRST_PLATE,R1
|
|
CALL OBJ_FIND
|
|
|
|
LDF *+AR0(OPOSZ),R1
|
|
ADDF R0,R1
|
|
FLOAT 1000,R3
|
|
CMPF R3,R1 ;BLEW by destination?
|
|
LDFGT R3,R1
|
|
STF R1,*+AR0(OPOSZ)
|
|
LDF R1,R3
|
|
SUBF 1,R3
|
|
FLPL1
|
|
LDI R2,R1
|
|
LSH 1,R2
|
|
CALL OBJ_GFIND
|
|
BC FLPL3 ;No letters ,hosed CMOS?
|
|
FLPL2
|
|
STF R3,*+AR0(OPOSZ) ;Now do the letters on it
|
|
CALL OBJ_GFIND_NEXT
|
|
BNC FLPL2 ;do as many as there are
|
|
FLPL3
|
|
ADDI 1,AR5
|
|
CMPI 9,AR5
|
|
BLE FLPL
|
|
|
|
POP AR5
|
|
RETS
|
|
|
|
*----------------------------------------------------------------------------
|
|
*This proc prints the name of the location on the marque
|
|
|
|
DISPLAY_HSTEXT:
|
|
FLOAT -910,R3
|
|
BR RACE_TEXT
|
|
ENTER_HSTEXT:
|
|
FLOAT -910-2000,R3 ;The marquee is moved up 2000
|
|
RACE_TEXT:
|
|
LDI *+AR7(RACE_NUMBER),AR2
|
|
ADDI @LEG_NAMESI,AR2
|
|
LDI *AR2,AR2
|
|
FLOAT -4700,R2
|
|
FLOAT -301,R4
|
|
LDI 0,R6 ;ID
|
|
CALL PRINT3D
|
|
RETS
|
|
|
|
LOGO_X .set -250
|
|
LOGO_Y .set -170
|
|
LOGO_Z .set 368*2
|
|
|
|
INIT_LOGO:
|
|
CALL OBJ_GET
|
|
BC LOGOX
|
|
LDI AR0,AR4
|
|
LDIL logo,R0
|
|
STI R0,*+AR0(OROMDATA)
|
|
LDI O_IROT|O_NOROT|O_NOUROT|O_NOUNIV,R0
|
|
OR *+AR0(OFLAGS),R0
|
|
STI R0,*+AR0(OFLAGS)
|
|
|
|
|
|
FLOAT LOGO_X,R0
|
|
STF R0,*+AR0(OPOSX)
|
|
FLOAT LOGO_Y,R0
|
|
STF R0,*+AR0(OPOSY)
|
|
FLOAT LOGO_Z,R0
|
|
STF R0,*+AR0(OPOSZ)
|
|
LDI AR0,AR2
|
|
CALL OBJ_INSERTP
|
|
LOGOX
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*BRANCHED TO FROM RADIO_BUT IN SND.asm
|
|
*IS A PROC
|
|
|
|
.bss RADIO_HS_SHADOW,1
|
|
.bss RADIO_HS_SWITCH,1
|
|
|
|
RBMATTR_CHECK:
|
|
LDI @_MODE,R0
|
|
TSTB MHS,R0 ;IN HS DISPLAY?
|
|
BEQ RBMCX
|
|
LDI @RADIO_HS_SWITCH,R0
|
|
SUBI 1,R0
|
|
STI R0,@RADIO_HS_SWITCH
|
|
|
|
RBMCX
|
|
DIE
|
|
*----------------------------------------------------------------------------
|
|
.END
|