.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