nba-hangtime/SRC/BB.ASM

3577 lines
67 KiB
NASM

**************************************************************
*
* Owner: THOMPSON
*
* Software: Shawn Liptak, Mark Turmell
* Initiated: 7/17/90
*
* Modified: Shawn Liptak, 1/27/92 -Started basketball
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 3/24/93 14:35
**************************************************************
.file "bb.asm"
.title "NBA JAM Basketball game program"
.width 132
.option b,d,l,t
.mnolist
.include "mproc.equ" ;Mproc equates
.include "disp.equ" ;Display proc equates
.include "gsp.equ" ;Gsp asm equates
.include "sys.equ"
.include "world.equ" ;Court-world defs
.include "game.equ"
.include "audit.equ"
.include "macros.hdr" ;Macros
.include "credturb.tbl"
.include "credturb.glo"
.include "hoop.tbl"
.include "hoop.glo"
.include "outdoor.glo"
.include "imgtbl.glo"
.include "imgtbl2.glo"
.include "imgtblp.glo"
.asg 0,SEQT
.include "plyr.equ"
.ref initcrowd_ani
.ref game_initobjs
;sounds external
.ref snd_update
.ref SOUNDSUP
;DJT Start
; .ref QSNDRST
;DJT End
.ref heres_tip_sp,eat_snd
.ref start_crowd_noise
;symbols externally defined
.ref pup_court,pup_aba
.ref DBV
.ref VOLBTN_PRESS
.ref pup_tournament
; .ref RA_H
; .ref EB_H,JTO_H ;RA_H
;DJT Start
;.ref removed
;DJT End
; .ref fire_flags
; .ref pal_find
.ref RNDPER
.ref TWOPLAYERS
.ref player1_data
.ref player2_data
.ref player3_data
.ref player4_data
.if DRONES_2MORE
.ref player5_data
.ref player6_data
.endif
.ref team1_control
.ref team2_control
.ref BTIME
.ref plyr_onfire
.ref last_name_time
.ref player_names
.ref CYCLE_TABLE
.ref pleasewt
.ref prt_credits
.ref clock_speed
.ref _4plyrsingame
.ref snd_play1ovr
.ref winningteam
.ref idiot_bits
.ref cntl_team,cntl_team_last,idiot_box
.ref bracket_drw
.ref sc_proc
.ref ballpnumlast
.ref ballprcv_p
.ref inbound
.ref ballsclastp
.ref ballshotinair ;Shooter # if shot in air, else -1
; .ref LED_00,LED_MAX
.ref QUARTR01
.ref process_dispatch,cntrs_delay
.ref gmqrtr,refill_turbo
.ref plyr_lost
.ref tm1set,tm2set
.ref CCOIN,RCOIN,SERVICE,SLAM_SW,XCOIN,LCOIN,DIAG
.ref CR_STRTP,CR_CONTP,P_START,P_CONT,GET_ADJ
.ref dpageflip
.ref conttimers
.ref WIPEOUT,cr_cntrs_update
.ref ENTERON
.ref LOWZ,BAKBITS
.ref FONT7A,PALFRAM
.ref UNIT_CLR
.ref initials_entry
.ref ISHSTD
.ref hisclong
.ref gndstat
.ref STRCNRM
.ref WDOGRAM
.ref BAKMODS
.ref STRLNRMO,HEXTOASC,WRLD,STRCNRMO,RD15FONT
;DJT Start
.ref RD7FONT
;DJT End
.ref RNDRNG0
.ref INIT_TAB
.ref IRQSKYE
.ref init_all,GET_AUD
.ref READ_DIP
.ref POWERTST
;DJT Start
;DJT .refs removed
;DJT End
.ref OBJOFF,OBJON,pal_getf
;DJT Start
.ref BGND_UD1
;DJT End
.ref AUD,AUD1,aud_addnumplyrs
; .ref _3d_test
.ref PSTATUS
.ref P1DATA,P2DATA,P3DATA,P4DATA
.if DRONES_2MORE
.ref P5DATA,P6DATA
.endif
.ref plyrobj_t,plyrproc_t
.ref scores,game_time,prt_top_scores
.ref clock_strt
.ref update_scorebrd
.ref clear_player_stats,inc_player_stat
; .ref winner_stays_box
.ref plyr_start
.ref joy_read
.ref ball_main
; .ref gndx
.ref team1,team2
; .ref oteam1
.ref game_purchased
;DJT Start
;DJT .ref moved down
;DJT End
.ref assist_delay,assist_plyr
.ref CKDIAG,POWERCMOS,amode_start
.ref dirqtimer
; .ref clipsrunning
; .ref plyr_eoq_lockcont,cliplockretp
.ref system_restoregame,io_init
.ref slide_info_box_on_off
.ref p1_slide_box_flag,p2_slide_box_flag
.ref p3_slide_box_flag,p4_slide_box_flag
.ref creditscreen
.ref dronesmrt
.if CRTALGN
.ref P1CTRL
.ref P2CTRL
.ref P3CTRL
.ref P4CTRL
.endif
;symbols defined in this file
; .def qrtr1,qrtr2,qrtr3,qrtr4
; .def wbmcolor_t
.def init_t1a,init_t2a,init_t3a,init_t4a
.def timertcnt,PSTATUS2,COLRPRC
.def OWINDOW,CWINDOW
.def swstacktop, swstack_p
;uninitialized ram definitions
.if DEBUG
BSSX SLDEBUG ,16 ;Shawn's debug
BSSX slowmotion ,16 ;!0=Frames of delay for slow motion
.endif
;I changed PCNT to a 32-bit value instead of 16 'cuz I'm tired of
; coding checks for the wraparound case, which happens every ten
; minutes or so. Since it's always treated as an unsigned value
; anyway, it's perfectly safe to continue using it as a word. - JS
.even
BSSX PCNT ,32 ;Main loop cnt
;;;; BSSX PCNT ,16 ;Main loop cnt
BSSX swstack_p ,32 ;*Stack position
BSSX swstackbot ,16*64 ;Bottom of stack
.bss swstacktop ,0 ;Top of stack
BSSX COLRTEMP ,16*16 ;RAM COPY OF CYCLING COLORS
BSSX GAMSTATE ,16 ;Game state: See game.equ
BSSX HALT ,16 ;FREEZE ALL OBJECTS (NO VEL UPDATE)
BSSX NO_START ,16 ;FLAG 0=OKAY, 1=NOT RIGHT NOW.
BSSX PSTATUS2 ,16 ;Player has started game bits (0-3)
;used to decide if this player must
;pay 2 credits or just 1 credit to
;start!
BSSX WSPEED ,16
BSSX WFLG ,16 ;0=NOT ON, 1=YES IT IS ON
.bss WNDWFLG ,16 ;0=WINDOW SHOULD CLOSE, 1=NO WINDOW
BSSX OBJPTR ,32 ;PNTR FOR WINDOW OBJECT
.bss PALTMP ,13*16*2 ;ALLOCATE 2 X COLOR AREA IN RAM
BSSX crplate_ptr ,32 ;credit plate ptr
BSSX tm1_turbo ,32 ;team turbo *objs
BSSX tm2_turbo ,32
BSSX msg_ram ,32*NUMPLYRS ;temp ram for flopping message/meters
BSSX name_cnt ,16 ;Cntr for flopping to player names
BSSX name_flop ,16 ;Flop name/buyin message 0 or 1
;DJT Start
BSSX names ,32*NUMPLYRS ;plyr name *imgs -MUST PRECEED
BSSX original_names ,32*NUMPLYRS ;plyr name *imgs -MUST FOLLOW
;DJT End
BSSX crt_colors ,32 ;Random pal for court - NDSP1.ASM
BSSX bkcrt_colors ,32
;; BSSX refcrt_colors ,32
BSSX steals_off ,16 ;!0=ticks until steals can happen
BSSX pushing_delay ,16 ;!0=keep ball if pushed
BSSX pass_off ,16 ;!0=Don't allow passing
BSSX rebound_delay ,16 ;!0=Give rebound stat
;; BSSX crowd_aniflag ,16 ;!0=Allow crowd animations
;; BSSX bench_aniflag ,16 ;!0=Allow bench animations
; Timer variables. Must stay in order!!
BSSX timertcnt ,16 ;Tick count
BSSX qtr_purchased ,16*4 ;# game qtrs credit each player has
BSSX newptr ,32
BSSX newplyrs ,(32+16)*5
; .bss played3d ,16
.ref _serial_number
.ref _man_date
.ref InitPIC
.ref RemapIO
.ref SecFuncCheck
BSSX _coin_addr,32
BSSX _switch_addr,32
BSSX _switch2_addr,32
BSSX _watchdog_addr,32
BSSX _dipswitch_addr,32
BSSX _sound_addr,32
BSSX _soundirq_addr,32
BSSX _coin_counter_addr,32
;; BSSX tm1_meter_cnt, 16
;; BSSX tm1_meter_obj, 32
;; BSSX tm2_meter_cnt, 16
;; BSSX tm2_meter_obj, 32
;equates for this file
.text
****************************************************************
* Reset entry point
SUBR init_prog
.if 0
==========================
=;;; Old startup code ;;;=
dint
setf 16,1,0 ;Field0 = Word sign extend
setf 32,0,1 ;Field1 = Long word
movi STCKST,sp ;Top of stack
calla InitPIC
; .if DEBUG
; move a0,@>1e00000 ;Clr FPGA rom protect
; .endif
; Moved to PU DIAGS
; movi 0fe00h,a0 ;Hit reset bit
; move a0,@SOUND
; movi 100,a0 ;Wait for it to catch
; dsj a0,$
; movi 0ff00h,a0 ;Let it go
; move a0,@SOUND
move @WDOGRAM,a0,L
cmpi WDOGNUM,a0
jrne initp50 ;Powerup?
move @dirqtimer,a0
cmpi 400,a0
jrhs #lockup ;Main loop died?
.if TUNIT
move @TALKPORT,a0 ;Check if watchdog was real
btst B_WDOG,a0 ;Bit should be low if dog fired
jrnz #cont ;No watchdog?
.endif
movk AUDLOCK,a0 ;Watchdog
jruc #aud
#lockup
movi AUD_LOCKUP,a0 ;Main loop lockup
#aud calla AUD1
#cont
; move @clipsrunning,a0,L ;>Restore game if clips crashed
; cmpi >12345678,a0
; jrne #notclip ;Not a clip reset?
;
; calla io_init ;Initialize the I/O regs
; movi DIE+X2E,a0
; move a0,@INTENB ;Display int on, DMA int off
;
; movi AUD_CLIPLOCK,a0
; calla AUD1
; movi ACTIVE,a13
; clr a1
; move a1,@clipsrunning,L
; calla KILALL
;
; CREATE0 #proc
;
; eint
; jruc mainlp
;
;#proc calla display_blank
; calla system_restoregame ;Restore the saved game
; movi cliplockretp,a0 ;Return addr for eoq
; PUSHP a0
; jauc plyr_eoq_lockcont
;
;#notclip
movk AUDSTAT,a0
calla GET_AUD ;0=AMode, 1=Game
move a1,a1
jrz WARMSET ;Attract mode glitch?
initp50
calla READ_DIP ;skip if UJ2 bit 6 set
btst 6,a0
jrnz #nopt
jauc POWERTST ;board test etc...
#nopt
=;;; End of old startup code ;;;=
=================================
.else
dint ;Interrupts OFF
setf 16,1,0 ;Word sign extend
setf 32,1,1 ;Long word sign extend
movi STCKST,sp ;Setup the stack pointer
clr a0 ;Initial mode for VMUX chip
move a0,@VMUX_CONTROL,W
movi 00030h,a0 ;Hit sound reset bit
move a0,@COIN_COUNTERS ;This is where reset bit is
movi 100,a0 ;Wait for it to catch
dsjs a0,$
movi 00020h,a0 ;Let it go
move a0,@COIN_COUNTERS
move @SOUNDIRQ,a0 ;Read watchdog status
btst 8,a0 ;Is this reset from a watchdog?
;DJT Start
jrnz #cont ; br=no
movk AUDLOCK,a0 ;Audit a Dog
jruc #aud
#cont
move @WDOGRAM,a0,L ;Has machine been initialized?
cmpi WDOGNUM,a0
jrne initp50 ; br=no, must be powerup
move @dirqtimer,a0 ;Did we have a process KO?
cmpi 400,a0
jrlo initp50 ; br=no, continue regular startup
movi AUD_LOCKUP,a0 ;Audit a proc KO
#aud
;DJT End
calla AUD1
;04/01/95 - NOTE: It may look a little dumb to have two calls to InitPIC
;here instead of one above before the read for the watchdog status and it may
;be tempting to move the InitPIC call to before the watchdog status read BUT
;don't do it!!! The watchdog status MUST be read BEFORE the PIC is initialized
;or the status of the watchdog will be reset.
initp50
calla InitPIC ;Init PIC and I/O system
move a0,@WATCHDOG ;Kill the dog fer yucks
calla READ_DIP ;Read the dipswitches
btst 6,a0 ;Is power-up test bypass switch on?
jaz POWERTST ; br=do power-up tests; go to WARMSET
calla InitPIC ;Reinit PIC and I/O system
.endif
#********************************
*
SUBR WARMSET
dint
setf 16,1,0 ;Field0 = Word sign extend
setf 32,0,1 ;Field1 = Long zero extend
movi STCKST,sp ;Top of stack
calla InitPIC ;Reinit PIC and I/O system
;
; Enabled 3/19/96 ;MJL
;FIX!!!! Keep in for ship....
jauc POWERCMOS ;Do CMOS power-up chk; go to PCMOSRET
SUBR PCMOSRET
calla init_all ;Init hardware
move b5,@_serial_number,L
move b6,@_man_date,L
calla SecFuncCheck ;Make sure security functions haven't
; been mucked with
calla INIT_TAB ;Reset todays high score table
; movk 1,a0
; move a0,@>fff80000,L
.if DEBUG
callr testcode
.endif
;;;; CREATE SNDMON_PID,dcs_watchdog
calla CKDIAG
jrz #main_go ;No diag switches closed?
CREATE DIAG_PID,DIAG ;Fire off the diag process
jruc mainlp
#main_go
.if HEADCK
.ref debug_plyr_num
clr a0
move a0,@debug_plyr_num
.endif
CREATE0 amode_start ;Fire up the attract mode
#*******************************
* Main loop
SUBR mainlp
calla process_dispatch
move a13,a13
jrz mainpok
.if DEBUG
LOCKUP
eint
.else
CALLERR 10,0
.endif
mainpok
move @RAND,a1,L ;>Randomize
rl a1,a1
move @HCOUNT,a14
rl a14,a1
add sp,a1
move a1,@RAND,L
calla cr_cntrs_update ;And blink the top messages
callr switch_unstack
calla snd_update ;Update the sound calls
calla joy_read
;DJT Start
.ref passfudge
.ref ballpnum
move @passfudge,a0
jrle #fok
subk 1,a0
move a0,@passfudge
jrnz #fok
move @ballpnum,a14
jrnn #fok
move a0,@ballprcv_p,L
.if DEBUG
LOCKUP
.endif ;DEBUG
#fok
;DJT End
move @steals_off,a0
jrle #ok
subk 1,a0
move a0,@steals_off
#ok
move @pushing_delay,a0
jrle #ok2
subk 1,a0
move a0,@pushing_delay
#ok2
move @pass_off,a0
jrle #ok3
subk 1,a0
move a0,@pass_off
#ok3
move @assist_delay,a0
jrle #ok4
subk 1,a0
move a0,@assist_delay
jrnz #ok4
clr a1
move a1,@assist_plyr
#ok4
move @rebound_delay,a0
jrle #ok5
subk 1,a0
move a0,@rebound_delay
;Why...
; jrnz #ok5
; clr a1
; move a1,@rebound_delay
#ok5
;Used for disallowing swats off of rim...
.ref in_cylinder
move @in_cylinder,a0
jrle #ok6
subk 1,a0
move a0,@in_cylinder
#ok6
;Used for converting rejection art into rebound art if ball just hit rim
.ref must_rebound
move @must_rebound,a0
jrle #ok7
subk 1,a0
move a0,@must_rebound
#ok7
.if DEBUG
; .bss last_snd_st,16
; move @_soundirq_addr,a0
; move *a0,a0
; andi >400,a0
; move @last_snd_st,a14
; cmp a0,a14
; jrz wsr_1
; LOCKUP
;wsr_1
; move a0,@last_snd_st
callr cputime_calcfree
.endif
move @HALT,a0
jrnz #skipit
move @last_name_time,a0
inc a0
move a0,@last_name_time ;# ticks since player name called
#skipit
;update all 32 bits of PCNT
move @PCNT,a0,L
addk 1,a0
move a0,@PCNT,L
; move @PCNT,a0
; addk 1,a0
; move a0,@PCNT
movb @DIPSWITCH-7,a0
jrn mainlp
movi ACTIVE,a13 ;*Proc list
CREATE DIAG_PID,DIAG
jruc mainlp
#***************************************************************
* Unstack switch queue
SUBRP switch_unstack
; clr a4
;
;#lp move @swstack_p,a3,L
; cmpi swstacktop,a3 ;Stack at start?
; jreq #x ;Empty?
; move @FREE,a0,L
; jrz #x ;No processes left?
;
; move *a3+,a0 ;Get entry
; move a3,@swstack_p,L ;Update stack
; sll 32-5,a0 ;Max switch # 31
; srl 32-5-4,a0 ;*16
; move a0,a2
; add a0,a2
; add a0,a2 ;*3
; addi switch_t,a2
; move *a2+,a1
; jrz #lp ;No PID?
; move *a2+,a7,L ;*Code
; movi ACTIVE,a13 ;*Proc list
; calla GETPRC
; addk 1,a4
; jruc #lp
;#x subk 1,a4
; jrle #xx
; LOCKUP
;#xx rets
#lp move @swstack_p,a3,L
cmpi swstacktop,a3 ;Stack at start? Yes if =
jreq #x
move @FREE,a0,L ;Any procs left? No if 0
jrz #x
move *a3+,a0 ;Get entry
move a3,@swstack_p,L ;Update stack ptr
sll 32-4,a0 ;Clr bits above max (15) value
srl 32-4-4,a0 ;*16 for look-up calc
move a0,a2
add a0,a2
add a0,a2 ;*3 for tbl offset from
addi switch_t,a2 ; table start
move *a2+,a1 ;Get switch PID; none if 0
jrz #lp
move *a2+,a7,L ;*Switch code
movi ACTIVE,a13 ;*Proc list
calla GETPRC
jruc #lp
#x rets
switch_t ;(Process ID or 0, *Routine) ;Put in audit??
WL LC_PID, LCOIN ;S0 - LEFT COIN (1)
WL RC_PID, RCOIN ;S1 - RIGHT COIN (2)
WL PSWPID, plyr_strtb1 ;S2 - START 1
WL SLAM_PID, SLAM_SW ;S3 - SLAM TILT
WL DIAG_PID, DIAG ;S4 - TEST
WL PSWPID, plyr_strtb2 ;S5 - START 2
WL DIAG_PID, SERVICE ;S6 - SERVICE CREDIT
WL CC_PID, CCOIN ;S7 - CENTER COIN (3)
WL CC_PID, XCOIN ;S8 - COIN 4
WL PSWPID, plyr_strtb3 ;S9 - START 3
WL PSWPID, plyr_strtb4 ;S10 - START 4
WL VOLBTN_PID,VOLBTN_PRESS ;S11 - VOLUME DOWN
WL VOLBTN_PID,VOLBTN_PRESS ;S12 - VOLUME UP
WL 0,0 ;S13
WL 0,0 ;S14
WL CC_PID, DBV ;S15 - DOLLAR BILL VALIDATOR
;old 32bit switch stack procs
; WL PSWPID,plyr_strtb4 ;S7 IO20 - START 4
; WL 0,0 ;S1
; WL 0,0 ;S2
; WL 0,0 ;S3
; WL 0,0 ;S4
; WL 0,0 ;S5
; WL 0,0 ;S6
; WL PSWPID,plyr_strtb3 ;S7 - START 3
; WL 0,0 ;S8
; WL 0,0 ;S9
; WL 0,0 ;S10
; WL 0,0 ;S11
; WL 0,0 ;S12
; WL 0,0 ;S13
; WL 0,0 ;S14
; WL CC_PID,XCOIN ;S15 - COIN 4
; WL LC_PID,LCOIN ;S16 - LEFT COIN (1)
; WL RC_PID,RCOIN ;S17 - RIGHT COIN (2)
; WL PSWPID,plyr_strtb1 ;S18 - START 1
; WL SLAM_PID,SLAM_SW ;S19 - SLAM TILT
; WL DIAG_PID,DIAG ;S20 - TEST
; WL PSWPID,plyr_strtb2 ;S21 - START 2
; WL DIAG_PID,SERVICE ;S22 - SERVICE CREDIT
; WL CC_PID,CCOIN ;S23 - CENTER COIN (3)
; WL 0,0 ;S24
; WL 0,0 ;S25
; WL 0,0 ;S26
; WL 0,0 ;S27
; WL 0,0 ;S28
; WL 0,0 ;S29
; WL 0,0 ;S30 - Snd IRQ
; WL 0,0 ;S31
****************************************************************
* plyr_strtbx - Process player start button (Process)
SUBR plyr_strtb1
move @TWOPLAYERS,a0 ;0 = NO, 1 = YES 2 players
jrnz #strtb2
clr a8 ;A8=Player #
movi P1DATA,a11 ;A11=*plyr data
move @GAMSTATE,a0
cmpi IN_PRE_PLYR_DESIGN,a0
jreq #psb_x ;br=dont take credits (entering CREATE PLAYER)
cmpi INPLYRDESIGN,a0 ;player designing character ?
jrne plyr_strtbut ;br=no
move @p1_slide_box_flag,a0
jrnz #psb_x ;br=process EXISTS...dont allow
CREATE P1_BOX_SLIDE_PID,slide_info_box_on_off ;br=tell player -CREDIT NOT TAKEN
jruc #psb_x ;dont process further
;-------------------
;-------------------
SUBR plyr_strtb2
move @TWOPLAYERS,a0 ;0 = NO, 1 = YES 2 players
jrnz #strtb3
#strtb2
movk 1,a8
movi P2DATA,a11
move @GAMSTATE,a0
cmpi IN_PRE_PLYR_DESIGN,a0
jreq #psb_x ;br=dont take credits (entering CREATE PLAYER)
cmpi INPLYRDESIGN,a0 ;player designing character ?
jrne plyr_strtbut ;br=no
move @p2_slide_box_flag,a0
jrnz #psb_x ;br=process EXISTS...dont allow
CREATE P2_BOX_SLIDE_PID,slide_info_box_on_off ;br=tell player -CREDIT NOT TAKEN
jruc #psb_x ;dont process further
;-------------------
;-------------------
SUBR plyr_strtb3
move @TWOPLAYERS,a0 ;0 = NO, 1 = YES 2 players
jrnz #psb_x
#strtb3
movk 2,a8
movi P3DATA,a11
move @GAMSTATE,a0
cmpi IN_PRE_PLYR_DESIGN,a0
jreq #psb_x ;br=dont take credits (entering CREATE PLAYER)
cmpi INPLYRDESIGN,a0 ;player designing character ?
jrne plyr_strtbut ;br=no
move @p3_slide_box_flag,a0
jrnz #psb_x ;br=process EXISTS...dont allow
CREATE P3_BOX_SLIDE_PID,slide_info_box_on_off ;br=tell player -CREDIT NOT TAKEN
jruc #psb_x ;dont process further
;-------------------
;-------------------
SUBR plyr_strtb4
move @TWOPLAYERS,a0 ;0 = NO, 1 = YES 2 players
jrnz #psb_x
movk 3,a8
movi P4DATA,a11
move @GAMSTATE,a0
cmpi IN_PRE_PLYR_DESIGN,a0
jreq #psb_x ;br=dont take credits (entering CREATE PLAYER)
cmpi INPLYRDESIGN,a0 ;player designing character ?
jrne plyr_strtbut ;br=no
move @p4_slide_box_flag,a0
jrnz #psb_x ;br=process EXISTS...dont allow
CREATE P4_BOX_SLIDE_PID,slide_info_box_on_off ;br=tell player -CREDIT NOT TAKEN
jruc #psb_x ;dont process further
;--------------------
; Common start button process
plyr_strtbut
movk 1,a0
move a0,@BTIME
move @GAMSTATE,a1
cmpi INAMODE,a1 ;In attract? No if !=
jrne #chkstrt
calla CR_STRTP ;Yes. Have credits to start? Yes if >=
jrhs #chkstrt
MOVI CP_PID1,A0
MOVI 0FFFFH,A1 ;CHECK TO SEE IF CREDIT PAGE IS UP
CALLA EXISTP
jrnz SUCIDE ;br=yes, go die
;DJT Start
move @SOUNDSUP,a0
PUSH a0
clr a0
move a0,@SOUNDSUP
.ref tuneend_snd
SOUND1 tuneend_snd
PULL a0
move a0,@SOUNDSUP
;DJT End
JSRP creditscreen ;No. Show credits screen & restart
; calla display_blank ; attract
; calla WIPEOUT ;CLEAN SYSTEM OUT
; SLEEPK 1
jauc amode_start
#chkstrt
cmpi INPLYRINFO,a1 ;No start if on plyr info scrn
jreq #psb_x
move @WFLG,a0 ;No start if window is growing
jrnz #psb_x
move @ENTERON,a0 ;No start if initials being entered
jrnz #psb_x
move @pleasewt,a0 ;No start if plyr should be waiting
btst a8,a0 ;(bit #=plyr #)
jrnz #psb_x
move @PSTATUS,a0 ;Chk plyr status. Already in game?
btst a8,a0 ;(bit #=plyr #)
jrz #startplyr ;No if 0
move @game_purchased,a0 ;Yes. Already bought whole game?
btst a8,a0 ;(bit #=plyr #)
jrz #chkaddmore
;Yes. Show max'd message here & die
DIE
#chkaddmore
cmpi INGAME,a1 ;Don't add more during game play
jrz #psb_x
calla CR_CONTP ;Have credits to continue?
jrlo conttimers_cnt ;No if < (do continue timers & die)
calla P_CONT ;Yes. Take credits to continue
SOUND1 eat_snd
movk AUD1CONT,a0 ;Audit a continue
calla AUD1
callr add_plyr_time ;Add more to this players play time
movk ADJCCONT,a0 ;Get # credits req'd to continue
calla GET_ADJ
callr paidcreds_add ;Update everything & die
calla update_scorebrd
jruc #psb_x
;--------------------
; Start new player
#startplyr
move @GAMSTATE,a1
jrn #psb_x ;In diagnostics? Yes if - (go die)
cmpi INGAMEOV,a1 ;In game over? Yes if = (go die)
jreq #psb_x
cmpi INAMODE,a1 ;New start from attract? Yes if =
jreq game_start
cmpi INFREEPRICE,a1 ;New start on winners scrn?
jreq game_start2
cmpi ININTRO,a1 ;New start on stats scrn? Yes if =
jreq #psbstart
move @game_time,a14,L ;Chk game clk. Do start if 0
jrnz #notz
cmpi INGAME,a1
jrnz #psbstart
.if DEBUG
LOCKUP
.endif
DIE
#notz
cmpi 2020000h,a14 ;!!!Do start if >= 2:20.0 remain
jrge #psbstart
movk ADJFREPL,a0 ;Well into qrtr but do start if in
calla GET_ADJ ; free play (is !0)
jrnz #psbstart
move @PSTATUS2,a0 ;Not free. Chk for previous start
btst a8,a0 ;(bit #=plyr #)
jrz #isnew ;Player never started? Never if 0
calla CR_CONTP ;Has. Have credits to continue?
jalo SUCIDE ;No if < (go die)
jruc #dowaitmes
#isnew
calla CR_STRTP ;Hasn't. Have credits to start?
jalo SUCIDE ;No if < (go die)
#dowaitmes
movk 1,a0
sll a8,a0
move @pleasewt,a14 ;Wants to start but can't. Set
or a0,a14 ; is-waiting bit.
move a14,@pleasewt
callr plyr_ingame_wait ;Show "please wait" & die
DIE
;--------------------
#psbstart
move a8,a14 ;Make team # (0 or 1) from plyr #
srl 1,a14
move @winningteam,a0
cmp a14,a0 ;Was plyr on winning team?
jreq #psbfree ;Yes if = (start is free)
move @PSTATUS2,a0 ;No. Chk for previous start
btst a8,a0 ;(bit #=plyr #)
jrz #psbcred ;Player never started? Never if 0
calla CR_CONTP ;Has. Have credits to continue?
jrlo conttimers_cnt ;No if < (do continue timers & die)
calla P_CONT ;Yes. Take credits to continue
SOUND1 eat_snd
#psbfree
callr add_plyr_time ;Add more to this players play time
movk AUD1CONT,a0 ;Audit a continue
calla AUD1
jruc #dostart
#psbcred
calla CR_STRTP ;Hasn't. Have credits to start?
jrlo conttimers_cnt ;No if < (do continue timers & die)
calla P_START ;Yes. Take credits to start
SOUND1 eat_snd
callr add_plyr_time ;Add more to this players play time
move @GAMSTATE,a1
subk ININTRO,a1 ;Don't audit a start if in intro?!!!
jreq #dostart
movk AUD1STRT,a0 ;Audit a start
calla AUD1
;--------------------
#dostart
move @GAMSTATE,a1 ;Set common Ks
movk 1,a7
sll a8,a7
cmpi ININTRO,a1 ;If in intro, do regular start
jreq #do_psb_intro
movk ADJFREPL,a0 ;If in free play, do free play start
calla GET_ADJ
jrnz #do_psb_free
move @game_time,a14,L ;In-game start. Chk game clk
cmpi 2020000h,a14 ;!!!Do start if >= 2:20.0 remain
jrgt #do_psb_free
movk ADJCSTRT,a0 ;Get # credits req'd to start
move @PSTATUS2,a14 ;Want start or continue credits?
btst a8,a14 ;(bit #=plyr #)
jrz #psb1 ;New start if 0
movk ADJCCONT,a0 ;Get # credits req'd to continue
#psb1
calla GET_ADJ
callr paidcreds_add
move @pleasewt,a14 ;Wants to start but can't. Set
or a7,a14 ; is-waiting bit.
move a14,@pleasewt
callr plyr_ingame_wait ;Show "please wait" & die
DIE
#do_psb_intro
movk ADJCSTRT,a0 ;Get # credits req'd to start
move @PSTATUS2,a14 ;Want start or continue credits?
btst a8,a14 ;(bit #=plyr #)
jrz #psb2 ;New start if 0
movk ADJCCONT,a0 ;Get # credits req'd to continue
#psb2
calla GET_ADJ
callr paidcreds_add
move @PSTATUS,a14 ;Set plyr in-game bit
or a7,a14
move a14,@PSTATUS
move @PSTATUS2,a14 ;Set plyr has-started bit
or a7,a14
move a14,@PSTATUS2
move @gmqrtr,a0
jrz #inintro_x
move @newptr,a0,L
move a11,*a0+,L ;Save PnDATA ptr
move a8,*a0+ ;Save plyr # (0,1,2,3)
clr a1 ;Clr next long
move a1,*a0,L
move a0,@newptr,L
jruc #inintro_x
#do_psb_free
movk ADJCSTRT,a0 ;Get # credits req'd to start
move @PSTATUS2,a14 ;Want start or continue credits?
btst a8,a14 ;(bit #=plyr #)
jrz #psb3 ;New start if 0
movk ADJCCONT,a0 ;Get # credits req'd to continue
#psb3
calla GET_ADJ
callr paidcreds_add
move @PSTATUS,a14 ;Set plyr in-game bit
or a7,a14
move a14,@PSTATUS
move @PSTATUS2,a14 ;Set plyr has-started bit
or a7,a14
move a14,@PSTATUS2
;--------------------
; Plyr name & turbo init; also created in <start_msgs> below
; A8=plyr # (0,1,2,3)
; A11=PnDATA ptr
#frepl
movk 1,a0 ;Init flop cntr & state flag
move a0,@name_cnt
clr a0
move a0,@name_flop
move @GAMSTATE,a14
subk ININTRO,a14 ;In intro? No credit imgs to update
jrz #frp_1 ; if so (if 0)
movi CLSDEAD|creditid,a0
calla obj_del1c ;Kill credit imgs
calla prt_credits ;Do updated credit imgs
#frp_1
move *a11(ply_messages),a0,L ;Any insert|press|please msg?
jrz #imgson_x ;Done with setup if not (if 0)
calla DELOBJ ;Kill the msg obj
clr a0
move a0,*a11(ply_messages),L
PUSH a8,a11
move a11,a9
addi ply_meter_imgs,a9
move a8,a0
sll 5,a0
move @TWOPLAYERS,a14 ;0 = NO, 1 = YES 2 players
jrz #4_plyrs
addi 4*32,a0
#4_plyrs
addi #cr_box,a0
move *a0,a11,L
move *a11(16),a14
move *a9+,a0,L
move a14,*a0(OYPOS)
addi 16+16+16+32,a11
move *a9,a0,L
jrz #cv
calla DELOBJ
#cv
callr prt_status
PULL a8,a11
calla refill_turbo
; movi scorep,a0
; calla pal_getf
; move a0,a5
;
; move a8,a0
; sll 5,a0
;; move a0,a9 ;Put away for next segment
; addi names,a0
; move *a0,a0,L
; move *a11(ply_meter_imgs),a8,L ;change box to name
; move a5,*a8(OPAL)
; movi MSGOCTRL,a1
; calla obj_aniq_cnoff
;
; addi plyr_data_tbl,a9 ;>Setup for created plyr name
; move *a9,a0,L
; move *a0(PR_CREATED_PLYR),a14
; jrz #inintro ;!!!Wanna go here?
; addi PR_NAME1,a0
; movi [END_CHAR,END_CHAR],a14
; move *a0,a1,L
; cmpxy a14,a1
; jrxz #inintro
; jrxgt #inintro
; jrygt #inintro
; move *a0(PR_NAME3),a1,L
; cmpxy a14,a1
; jrxgt #inintro
; jrygt #inintro
; move *a0(PR_NAME5),a1,L
; cmpxy a14,a1
; jrxgt #inintro
; jrygt #inintro
; move a0,*a8(ODATA_p),L
; clr a14
; move a14,*a8(OMISC)
; move *a8(OFLAGS),a14
; addi M_CHARGEN,a14,W
; move a14,*a8(OFLAGS)
; PUSH a6,a8,a11
;;;;;;; calla prt_cr_timers <- Did nothing!
; PULL a6,a8,a11
#imgson_x
; callr plyr_ingame_wait
#inintro_x
;Use player name as a sound call
#psb_x
DIE
#cr_box .long init_t1,init_t2,init_t3,init_t4
.long init_t1,init_t2kit,init_t3kit,init_t4
sticklst
.word p1stickid,p2stickid,p3stickid,p4stickid
;----------
;
SUBR start_msgs
movi newplyrs,a10
move a10,@newptr,L
move a10,a2
movk 4,a9
start1
move *a10+,a11,L
jrz #done
move *a10+,a8
CREATE0 #frepl
dsj a9,start1
#done
clr a0
movk 5,a14
#clp
move a0,*a2+,L
move a0,*a2+,W
dsjs a14,#clp
DIE
********************************
* A0=Units to add
* A8=Pnum (0-3)
* Trashes A0
paidcreds_add
PUSH a1,a2
move a8,a1
sll 5,a1
addi paid_t,a1
move *a1,a1,L
move a8,a14
srl 1,a14
move @winningteam,a2
cmp a14,a2
jrnz #nothalf
sll 3,a0 ;Double paid credits
#nothalf
move *a1,a2
add a0,a2
move a2,*a1
move a8,a1
sll 4,a1 ;x 16 bits
addi qtr_purchased,a1
move *a1,a14
inc a14
move a14,*a1
move @gmqrtr,a1
cmpi 3,a1
jrge #full
movk 4,a2
sub a1,a2
cmp a2,a14
jrlt #no
move @GAMSTATE,a0
cmpi INAMODE,a0
jreq #no
move @gmqrtr,a14
jrnz #full
;If matchup scrn is on, still do this!
.ref inmatchup
move @inmatchup,a0
jrz #no
#full
move @game_purchased,a0 ;set purchased bit
move a8,a14
sll 4,a14
addi or_t,a14
move *a14,a14
or a14,a0 ;for player
move a0,@game_purchased
#no
PULL a1,a2
rets
;needed .word 6,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
********************************
* Set "please wait" message
* A11=*PxDATA
SUBRP plyr_ingame_wait
PUSH a8
move *a11(ply_messages),a8,L
movi please,a0
movi MSGOCTRL,a1
calla obj_aniq_cnoff
calla update_scorebrd
move *a11(ply_meter_imgs),a0,L
calla OBJOFF
move *a11(ply_meter_imgs+32),a0,L
calla OBJOFF
PULL a8
rets
#********************************
* A0=units to add
add_plyr_time
movi 3500,a1
move a1,*a11(ply_time)
movi 110,a0 ;Shorter time for player names message
move a0,@name_cnt
move @GAMSTATE,a0
subk ININTRO,a0
jreq #x
move *a11(ply_meter_imgs),a0,L
jrz #nxt
move *a11(ply_meter_imgs+32),a0,L
move *a0(OIMG),a1,L
cmpi start,a1
jrnz #nxt
movk 9,a1
move a1,*a0(OYPOS)
#nxt
;;;;;;; jauc prt_cr_timers <- Did nothing!
#x
rets
or_t .word 1,2,4,8
********************************
* Add count to continue timers (Process)
SUBRP conttimers_cnt
DIE
#***************************************************************
* Start game from INFREEPRICE mode (Process)
* A8=Plyr # (0-3)
* A11=*PxDATA
game_start2
move a8,a14
srl 1,a14
move @winningteam,a0
cmp a14,a0
jrz gs2
#***************************************************************
* Start game from amode (Process)
* A8=Plyr # (0-3)
* A11=*PxDATA
SUBR game_start
calla CR_STRTP
jalo SUCIDE ;Not enough credits?
calla P_START ;Take credits
.ref set_game_snd
calla set_game_snd
;;;;;;; JSRP QSNDRST ;Kill sleeps which made credit-eater bug!
gs2
;Zero PxDATA areas
clr a0
movi P1DATA,a1
movi PDSIZE*4/16,A2
#zlp move a0,*a1+
dsj a2,#zlp
clr a0
move a0,@gmqrtr
move a0,@qtr_purchased,L ;clr 4x16
move a0,@qtr_purchased+20h,L
move a0,@inmatchup
move a0,@pup_tournament
move a0,@pup_court ;default=INDOOR court
move a0,@pup_aba ;default=regular ball
move a0,@dronesmrt
.ref clear_secret_powerup_ram
calla clear_secret_powerup_ram
; .ref gme_strt_snd
; SOUND1 gme_strt_snd
callr add_plyr_time ;add time to this players play time
movi AUDBONE,a0 ;+1 games started from amode
calla AUD1
movi AUD_TOTPLYS,a0
calla AUD1
movk 1,a0
sll a8,a0
move a0,@PSTATUS
move a0,@PSTATUS2 ;Player has started bit flags
movk ADJCSTRT,a0 ;credits required to start
calla GET_ADJ ;returns 1,2
callr paidcreds_add
;DJT Start
movi INTRO_PID,a0 ;>Intro state
move a0,*a13(PROCID)
move @GAMSTATE,a1
movi INPLYRINFO,a0 ;>START button lock-out
move a0,@GAMSTATE
subk INAMODE,a1
jrne #notnew
calla display_blank
calla WIPEOUT
clr a0
move a0,@dtype ;2D
move a0,@WORLDTLX,L
move a0,@WORLDTLY,L
move a0,@IRQSKYE
movk 1,a0 ;page flipping on
move a0,@dpageflip
movi SCRNEND,a0 ;[256,405]
move a0,@SCRNLR,L
.ref setup_message,print_string_C2,mess_objid
movi #maxstr_setup,a2,L
calla setup_message
movi CLSNEUT|TYPTEXT|SUBMES1,a0
move a0,@mess_objid ;OBJ ID's for text
movi #maxstr,a4,L
calla print_string_C2
movk 1,a0
move a0,@DISPLAYON
calla display_unblank
SLEEPK 5
.ref rim_fire_snd ;combo_lock1
SOUND1 rim_fire_snd
.ref max_hngtm_sp
SOUND1 max_hngtm_sp
.ref tm_fire_tune
SOUND1 tm_fire_tune
.ref flash_bigtxt3
CREATE CYCPID,flash_bigtxt3
SLEEP 20
movi ((31*32)+31)*32+31,a0
move a0,@IRQSKYE
SLEEPK 4
clr a0
move a0,@IRQSKYE
#notnew
movk ININTRO,a0
move a0,@GAMSTATE
;DJT End
calla display_blank
calla WIPEOUT
;-------------------------------
movi 10*60,a0
move a0,@cntrs_delay
SLEEPK 1
clr a0
move a0,@team1
move a0,@team2
move a0,@SOUNDSUP
.ref special_heads
movi -1,a0
move a0,@special_heads,L
move a0,@special_heads+20h,L
.ref dtype
clr a0
move a0,@dtype
.ref monitor_fullgame
CREATE0 monitor_fullgame
move @winningteam,a1
jrnn #skip
movk 1,a0
move a0,@HALT
; JSRP winner_stays_box
clr a0
move a0,@HALT
move a0,@gmqrtr
;For debugging certain teams, change these:
; 0 ATLANTA
; 1 BOSTON
; 2 CHARLOTTE
; 3 CHICAGO
; 4 CLEVELAND
; 5 DALLAS
; 6 DENVER
; 7 DETROIT
; 8 GOLDEN STATE
; 9 HOUSTON
; 10 INDIANA
; 11 LOS ANGELES (CLIPPERS)
; 12 LOS ANGELES (LAKERS)
; 13 MIAMI
; 14 MILWAUKEE
; 15 MINNESOTA
; 16 NEW JERSEY
; 17 NEW YORK
; 18 ORLANDO
; 19 PHILADELPHIA
; 20 PHOENIX
; 21 PORTLAND
; 22 SACRAMENTO
; 23 SAN ANTONIO
; 24 SEATTLE
; 25 TORONTO
; 26 UTAH
; 27 VANCOUVER
; 28 WASHINGTON
clr a0 ;team #
move a0,@team1
movk 3,a0 ;Team #
move a0,@team2
#skip
;;FIXX!!! begin
; .ref TRIVIA_TEST
; clr a1
; move a1,@TRIVIA_TEST
; move a8,a0
; .ref get_stick_val_cur
; calla get_stick_val_cur
; subk 1,a0
; jrnz #noqktriv
; move a8,a0
; .ref get_but_val_cur
; calla get_but_val_cur
; subk 7,a0
; jrnz #noqktriv
; movk 1,a0
; move a0,@TRIVIA_TEST
; jruc #redo
;#noqktriv
;;FIXX!!! end
.if DEBUG
.ref RIM_STEP
.ref CLOCK_OFF
.ref QUICK_TIP
.ref pup_showshotper
.ref get_all_sticks_cur2
.ref get_all_buttons_cur2
calla get_all_sticks_cur2
move a0,a2
calla get_all_buttons_cur2
;If stick held up at start, show outdoor court
btst 0,a2
jrz #nooutdoor
move a2,@pup_court
#nooutdoor
;If pass button is pressed at start, allow rim-detect single-stepping
clr a1
move a1,@RIM_STEP
btst 1,a0
jrz #norimstep
move a0,@RIM_STEP
#norimstep
;If turbo button is pressed at start, turn off clock
clr a1
move a1,@CLOCK_OFF
btst 2,a0
jrz #noclkoff
move a0,@CLOCK_OFF
#noclkoff
;If shoot button is pressed at start, skip initials & go to game
clr a1
move a1,@QUICK_TIP
btst 0,a0
jrz #normal
move a0,@QUICK_TIP
move a0,@pup_showshotper
move a8,a8
jrz #p1bp
CREATE0 plyr_strtb1
#p1bp
cmpi 1,a8
jrz #p2bp
CREATE0 plyr_strtb2
#p2bp
cmpi 2,a8
jrz #p3bp
CREATE0 plyr_strtb3
#p3bp
cmpi 3,a8
jrz #p4bp
CREATE0 plyr_strtb4
#p4bp
SLEEPK 1
movk >f,a0
move a0,@PSTATUS
move a0,@PSTATUS2 ;Player has started bit flags
jruc #skip_entry ;Button pressed?
#normal
.endif
#redo
JSRP initials_entry
move a0,a0 ;is plyr coming from CREATE PLAYER ?
jrz #ok ;br=no
jauc amode_start ;Start attract mode
;;;; jrne #redo
.if DEBUG
#skip_entry
.endif
#ok
move @team1,a0
move @team2,a1
and a0,a1
move a1,a1
jrnn #bomb_out ;restart attract mode etc...
jauc amode_start ;Start attract mode
paid_t .long P1DATA+crds_paid,P2DATA+crds_paid,P3DATA+crds_paid
.long P4DATA+crds_paid
#bomb_out
;-------------------------------
; clr a0
; move a0,@played3d
; SUBR from_3d
clr a0
move a0,@cntrs_delay
;DJT Start
.ref ballnumscored,balltmshotcnt,hotspot_count
move a0,@ballnumscored
move a0,@balltmshotcnt
move a0,@hotspot_count+00,L
move a0,@hotspot_count+32,L
;DJT End
.ref start_qrtr_tune
calla start_qrtr_tune
;;;; JSRP scrn_scaleout
; movi zoom_snd,a0
; calla snd_play1
;;;; JSRP scrn_scaleininit
calla WIPEOUT ;CLEAN SYSTEM OUT
SUBR demogame_start ;Demo mode entry
; movi zoom_snd,a0
; calla snd_play1
JSRP scrn_scaleininit ;Hide display
; ** JBJ commented out on 4-13-95
;DJT Start
;;;; .ref security_chk
;DJT End
;;;; movi security_chk->1df60,a8
movk 1,a0
move a0,@dpageflip ;ON
move a0,@dtype ;3D
calla COLRPRC ;Init fixed pal 0
movi [WRLDMID-200,0],a0
move a0,@WORLDTLX,L
clr a0
move a0,@WORLDTLY,L
SLEEPK 2
movk 1,a0 ;delay start of a second plyr flag
move a0,@NO_START
movi QRTRTIME,a0 ;3 minutes, 0 secs, 0 tenths
;
; movi 10,a0
;
move a0,@game_time,L
clr a0
move a0,@clock_speed
; .ref drone_alley_cnt
; move a0,@drone_alley_cnt ;3 successful drone alley oops/period
; ** JBJ commented out on 4-13-95
;-----------
;This is checksummed!
;seccall1
; move a8,a1 ;>Check security
; addi >1df60,a1
; getpc a7
; addi >40,a7
; move a7,-*sp,L
; jump a1 ;Rets: A0=0 if OK!
;seccall1end
;
;-----------
; ** JBJ commented out on 4-13-95
clr a0
move a0,@BTIME
move a0,@idiot_bits
move a0,@HALT
move a0,@_4plyrsingame
.ref _2plyr_competitive
move a0,@_2plyr_competitive
movi scores,a1
move a0,*a1+,L ;Team 1
move a0,*a1+,L ;Team 2
move a0,@timertcnt
move a0,@sc_proc,L
; move a0,@already_on,L ;arw on hd 0=no or proc pntr
; move a0,@already_on+32,L
; move a0,@already_on+64,L
; move a0,@already_on+96,L
; move a0,@intercept_delay
; move a0,@fire_flags
move a0,@steals_off
move a0,@pass_off
move a0,@ballprcv_p,L
;; move a0,@crowd_aniflag
;; move a0,@bench_aniflag
move a0,@name_flop
move a0,@gmqrtr
move a0,@plyr_onfire
.ref SHK_ON
move a0,@SHK_ON
move a0,@ballnumscored
move a0,@balltmshotcnt
;; move a0,@tm1_meter_cnt
;; move a0,@tm2_meter_cnt
movi 1 ,a0
move a0,@name_cnt
; move a0,@gmqrtr
movi -1,a0
move a0,@winningteam
move a0,@ballpnumlast ;last player who had ball
move a0,@inbound
move a0,@cntl_team
move a0,@cntl_team_last
move a0,@ballsclastp
move a0,@ballshotinair ;Shooter # if shot in air, else -1
; movk 6,a0
; move a0,@next_call
; .ref sounds_list ;16 * 16 bits
; movi 0ffffh,a0
;
; movi 32,a2
; movi sounds_list,a1
;#slp
; move a0,*a1+
; dsj a2,#slp
move @pup_court,a14 ;Outdoor court?
jrz #nootd ; br=no
movk OTD_CNT-1,a0
calla RNDRNG0
sll 5,a0
addi otd_pal_objs,a0
move *a0,a2,L
move *a2(ICMAP),a0,L
move a0,@crt_colors,L
clr a0
clr a1
clr a3
movi >8000,a4
clr a5
clr a6
clr a7
calla BEGINOBJ2
jruc #crtpset
#nootd
move @team1,a0
sll 6,a0
;; sll 5,a0
;; move a0,a14
;; add a0,a0
;; add a14,a0
addi crt_pals,a0
move *a0+,a14,L
move a14,@crt_colors,L
;; move *a0+,a14,L
move *a0,a14,L
move a14,@bkcrt_colors,L
;; move *a0,a14,L
;; move a14,@refcrt_colors,L
#crtpset
;Team 1
; .ref player_toggle1 ;0 = no toggle
; .ref player_toggle2 ;0 = no toggle
.ref special_heads
.ref our_names
callr set_names
;DJT Start
;DJT ops removed to set_names
;DJT End
.ref setup_speech
calla setup_speech
movk 1,a0
move a0,@gndstat ;On
; jruc #skip3d
; CREATE0 _3d_test
;#skip3d
move @GAMSTATE,a0
subk INAMODE,a0
jreq #demo
movk INGAME,a0
move a0,@GAMSTATE
#demo
clr a0
move a0,@NO_START
move a0,@inmatchup
; CREATE0 team_meters
CREATE STAT_PID,status_display
SLEEPK 1
.if IMGVIEW
.ref anipts_debug
clr a8
CREATE0 anipts_debug
movk 3,a8
CREATE0 anipts_debug
.endif
calla game_initobjs
.if CRTALGN
.ref gnd_aligndots
CREATE0 gnd_aligndots
.endif
CREATE0 ball_main
;DJT Start
.ref plyr_showhotspots
CREATE0 plyr_showhotspots
;DJT End
CREATE gclockid,clock_strt ;start clock
CREATE0 bracket_drw
; .ref plyr_camflash
; CREATE0 plyr_camflash1
CREATE0 close
calla clear_player_stats
;TEMP!!!
.if DEBUG
.ref sound_watchdog
CREATE0 sound_watchdog
.endif
.ref name_call
CREATE0 name_call
calla start_crowd_noise
; CREATE0 scream_snd
CREATE0 check_idiot
.ref doflshs
CREATE0 doflshs
MOVI [62,1],A8 ;START AT COLOR 60, CYCLE 1 COLOR
MOVI scorep,A9 ;PAL NAME
MOVI COLTAB_RNBW,A10 ;TABLE TO CYCLE WITH
MOVK 3,A11 ;RATE OF CYCLE IN TICKS
CREATE CYCPID,CYCLE_TABLE ;START PROCESS TO DO CYCLE
callr start_arws
; move @SWITCH,a0
; andi >7072,a0
; jrnz #no3d
;
; move @GAMSTATE,a0
; subk INAMODE,a0
; jreq #no3d
;
; move @played3d,a0
; jrnz #no3d
;
; movk 1,a0
; move a0,@played3d
; jauc _3d_test
;#no3d
; movk 1,a0
; move a0,@gmqrtr
; move a0,@game_time,L
jauc plyr_start
SUBR join_cyc
.ref COLTAB
movi [1,1],A8 ;START AT COLOR 1, CYCLE 1 COLOR
movi JOININ_P,A9
movi COLTAB,A10 ;TABLE TO CYCLE WITH
movk 3,A11 ;RATE OF CYCLE IN TICKS
CREATE JOIN_CYCLE_PID,CYCLE_TABLE ;START PROCESS TO DO CYCLE
rets
;DJT Start
#maxstr_setup
.ref brush50_ascii,BRSH50R_P
PRINT_STR brush50_ascii,24,0,200,100,BRSH50R_P,0
#maxstr
.string "MAXIMUM!",0
.even
;DJT End
;--------------------
COLTAB_RNBW
.WORD 0380H,1380H,2380H,3380H,4380H,5380H,6380H,7380H,7300H
.WORD 7280H,7200H,7180H,7080H,7008H,7008H,7010H,7010H,701CH
.WORD 701CH,601CH,501CH,409CH,309CH,209CH,219CH,029CH,039CH
.WORD 139CH,239CH,339CH,539CH,739CH,7390H,7380H,6380H,4380H
;NEED A DUPLICATE SET
.WORD 0380H,1380H,2380H,3380H,4380H,5380H,6380H,7380H,7300H
.WORD 7280H,7200H,7180H,7080H,7008H,7008H,7010H,7010H,701CH
.WORD 701CH,601CH,501CH,409CH,309CH,209CH,219CH,029CH,039CH
.WORD 139CH,239CH,339CH,539CH,739CH,7390H,7380H,6380H,4380H
.word -1
;--------------------
; Team court palettes
otd_pal_objs
.long outdr1,outdr2,outdr3,outdr4,outdr5,outdr6
.long outdr7,outdr8,outdr9,outdr10,outdr11,outdr12
OTD_CNT .equ ($-otd_pal_objs)/32
crt_pals
.long CRT_ATL_p,BK_ATL_P,CRT_BOS_p,BK_BOS_P
.long CRT_CHA_p,BK_CHA_P,CRT_CHI_p,BK_CHI_P
.long CRT_CLE_p,BK_CLE_P,CRT_DAL_p,BK_DAL_P
.long CRT_DEN_p,BK_DEN_P,CRT_DET_p,BK_DET_P
.long CRT_GLD_p,BK_GLD_P,CRT_HOU_p,BK_HOU_P
.long CRT_IND_p,BK_IND_P,CRT_LAC_p,BK_LAC_P
.long CRT_LAL_p,BK_LAL_P,CRT_MIA_p,BK_MIA_P
.long CRT_MIL_p,BK_MIL_P,CRT_MIN_p,BK_MIN_P
.long CRT_NEJ_p,BK_NEJ_P,CRT_NEY_p,BK_NEY_P
.long CRT_ORL_p,BK_ORL_P,CRT_PHI_p,BK_PHI_P
.long CRT_PHO_p,BK_PHO_P,CRT_POR_p,BK_POR_P
.long CRT_SAC_p,BK_SAC_P,CRT_SAN_p,BK_SAN_P
.long CRT_SEA_p,BK_SEA_P,CRT_TOR_p,BK_TOR_P
.long CRT_UTA_p,BK_UTA_P,CRT_VAN_p,BK_VAN_P
.long CRT_WAS_p,BK_WAS_P
;crt_pals
; .long CRT_ATL_P,BK_ATL_P,REF_DET_P,CRT_BOS_P,BK_BOS_P,REF_DET_P
; .long CRT_CHA_P,BK_CHA_P,REF_DET_P,CRT_CHI_P,BK_CHI_P,REF_DET_P
; .long CRT_CLE_P,BK_CLE_P,REF_DET_P,CRT_DAL_P,BK_DAL_P,REF_DET_P
; .long CRT_DEN_P,BK_DEN_P,REF_DET_P,CRT_DET_P,BK_DET_P,REF_DET_P
; .long CRT_GLD_P,BK_GLD_P,REF_DET_P,CRT_HOU_P,BK_HOU_P,REF_DET_P
; .long CRT_IND_P,BK_IND_P,REF_DET_P,CRT_LAC_P,BK_LAC_P,REF_DET_P
; .long CRT_LAL_P,BK_LAL_P,REF_LAL_P,CRT_MIA_P,BK_MIA_P,REF_DET_P
; .long CRT_MIL_P,BK_MIL_P,REF_DET_P,CRT_MIN_P,BK_MIN_P,REF_DET_P
; .long CRT_NEJ_P,BK_NEJ_P,REF_DET_P,CRT_NEY_P,BK_NEY_P,REF_DET_P
; .long CRT_ORL_P,BK_ORL_P,REF_DET_P,CRT_PHI_P,BK_PHI_P,REF_DET_P
; .long CRT_PHO_P,BK_PHO_P,REF_DET_P,CRT_POR_P,BK_POR_P,REF_DET_P
; .long CRT_SAC_P,BK_SAC_P,REF_DET_P,CRT_SAN_P,BK_SAN_P,REF_DET_P
; .long CRT_SEA_P,BK_SEA_P,REF_DET_P,CRT_TOR_P,BK_TOR_P,REF_DET_P
; .long CRT_UTA_P,BK_UTA_P,REF_DET_P,CRT_VAN_P,BK_VAN_P,REF_DET_P
; .long CRT_WAS_P,BK_WAS_P,REF_DET_P
.def crt_pals_z
crt_pals_z
.long CRT_ATL_p+32,CRT_BOS_p+32,CRT_CHA_p+32,CRT_CHI_p+32
.long CRT_CLE_p+32,CRT_DAL_p+32,CRT_DEN_p+32,CRT_DET_p+32
.long CRT_GLD_p+32,CRT_HOU_p+32,CRT_IND_p+32,CRT_LAC_p+32
.long CRT_LAL_p+32,CRT_MIA_p+32,CRT_MIL_p+32,CRT_MIN_p+32
.long CRT_NEJ_p+32,CRT_NEY_p+32,CRT_ORL_p+32,CRT_PHI_p+32
.long CRT_PHO_p+32,CRT_POR_p+32,CRT_SAC_p+32,CRT_SAN_p+32
.long CRT_SEA_p+32,CRT_TOR_p+32,CRT_UTA_p+32,CRT_VAN_p+32
.long CRT_WAS_p+32
;--------------------
;
SUBR start_arws
; movi ARWPID,a0
; calla KIL1C
; movi arwid,a0
; calla obj_del1c
; movi ARWPID,a0
; calla obj_del1c
movi ARWPID,a1 ;>Do init stuff for humans
movi plyr_lost,a7,L
movk 3,a10 ;Pass plyr #
calla GETPRC
movk 2,a10
calla GETPRC
movk 1,a10
calla GETPRC
clr a10
calla GETPRC
.ref stick_numbers
movi stick_numbers,a7,L
clr a11
movi P1DATA,a10 ;Pass *PnDATA
calla GETPRC
movk 1,a11
movi P2DATA,a10
calla GETPRC
movk 2,a11
movi P3DATA,a10
calla GETPRC
movk 3,a11
movi P4DATA,a10
calla GETPRC
.ref stick_cpu
movi stick_cpu,a7,L
clr a11
movi P1DATA,a10
calla GETPRC
movk 1,a11
movi P2DATA,a10
calla GETPRC
movk 2,a11
movi P3DATA,a10
calla GETPRC
movk 3,a11
movi P4DATA,a10
calla GETPRC
.if DRONES_2MORE
movk 4,a11
movi P5DATA,a10
calla GETPRC
movk 5,a11
movi P6DATA,a10
calla GETPRC
.endif
; CREATE0 delay_sparks
rets
;delay_sparks
; .ref stick_spark
; .ref stick_spark2
; SLEEPK 10
; move @plyrproc_t,a0,L
; move *a0(plyr_attrib_p),a0,L
; move *a0(PAT_HEADT_p),a0,L
; cmpi RA_H,a0
; jrnz #ck2
;; cmpi EB_H,a0
;; jrz #doit1
;; cmpi JTO_H,a0
;; jrnz #ck2
;
;; move @special_heads,a0
;; cmpi 32,a0
;; jrnz #ck2
;
;#doit1 clr a11
; movi P1DATA,a10
; CREATE ARWPID,stick_spark
; clr a11
; movi P1DATA,a10
; CREATE ARWPID,stick_spark2
;#ck2
; move @plyrproc_t+32,a0,L
; move *a0(plyr_attrib_p),a0,L
; move *a0(PAT_HEADT_p),a0,L
; cmpi RA_H,a0
; jrnz #ck3
;; cmpi EB_H,a0
;; jrz #doit2
;; cmpi JTO_H,a0
;; jrnz #ck3
;
;; move @special_heads+10h,a0
;; cmpi 32,a0
;; jrnz #ck3
;
;#doit2 movk 1,a11
; movi P2DATA,a10
; CREATE ARWPID,stick_spark
; movk 1,a11
; movi P2DATA,a10
; CREATE ARWPID,stick_spark2
;#ck3
; move @plyrproc_t+64,a0,L
; move *a0(plyr_attrib_p),a0,L
; move *a0(PAT_HEADT_p),a0,L
; cmpi RA_H,a0
; jrnz #ck4
;; cmpi EB_H,a0
;; jrz #doit3
;; cmpi JTO_H,a0
;; jrnz #ck4
;
;; move @special_heads+20h,a0
;; cmpi 32,a0
;; jrnz #ck4
;
;#doit3 movk 2,a11
; movi P3DATA,a10
; CREATE ARWPID,stick_spark
; movk 2,a11
; movi P3DATA,a10
; CREATE ARWPID,stick_spark2
;#ck4
; move @plyrproc_t+96,a0,L
; move *a0(plyr_attrib_p),a0,L
; move *a0(PAT_HEADT_p),a0,L
; cmpi RA_H,a0
; jrnz #ck5
;; cmpi EB_H,a0
;; jrz #doit4
;; cmpi JTO_H,a0
;; jrnz #ck5
;
;; move @special_heads+30h,a0
;; cmpi 32,a0
;; jrnz #ck5
;
;#doit4 movk 3,a11
; movi P4DATA,a10
; CREATE ARWPID,stick_spark
; movk 3,a11
; movi P4DATA,a10
; CREATE ARWPID,stick_spark2
;#ck5
; DIE
#*******************************
* Tell idiots to use turbo for running if they aren't (Process)
check_idiot
movi 60,a10
#c1 SLEEP TSEC
move @HALT,a0
jrnz #c1
dsj a10,#c1
movi 30,a2
move @P1DATA+ply_idiot_use,a0
cmp a2,a0
jrgt #ck2
clr a1
callr try_ib
#ck2
move @P2DATA+ply_idiot_use,a0
cmp a2,a0
jrgt #ck3
movk 1,a1
callr try_ib
#ck3
move @P3DATA+ply_idiot_use,a0
cmp a2,a0
jrgt #ck4
movk 2,a1
callr try_ib
#ck4
move @P4DATA+ply_idiot_use,a0
cmp a2,a0
jrgt #ckx
movk 3,a1
callr try_ib
#ckx SLEEP 6*60
; movi organ1_snd,a0
; move @HCOUNT,a1
; btst 1,a1
; jrnz #ckk
; movi organ2_snd,a0
;#ckk
; calla snd_play1
DIE
try_ib
movk 7,a0 ;Use turbo to run
jauc idiot_box
********************************
close
SLEEPK 8
; .ref tune2_snd
; SOUND1 tune2_snd
; movi zoom_snd,a0
; calla snd_play1
;;;; JSRP scrn_scalein
movk 1,a0
move a0,@DISPLAYON
calla display_unblank
; movi 2<<10+4<<5+9,a0
clr a0
move a0,@IRQSKYE
movk 1,a0
move a0,@HALT ;stop movement until instructions are done
.if DEBUG
move @CLOCK_OFF,a0
jrnz #skip_inst
move @QUICK_TIP,a14
jrnz #skip_inst
.endif
.ref instructions
JSRP instructions ;TAKE OUT to skip instructions!
#skip_inst
clr a0
move a0,@HALT ;start movement
move a0,@cntrs_delay
;DJT Start
.ref t1ispro,t2ispro
move @t1ispro,a14
jrnn #smkn
move @t2ispro,a14
jrn #notsmkn
#smkn
.ref do_smkn
CREATE0 do_smkn
;; .ref thr_smkn_sp
;; SOUND1 thr_smkn_sp
jruc #smksmk
#notsmkn
SLEEP 35
SOUND1 heres_tip_sp
#smksmk
;DJT End
; SLEEP 120
; .ref winning_msg
; CREATE0 winning_msg
DIE
;#**********************************
;* Create and init team meters objs.
;
; SUBRP team_meters
;
; movi #tm_mtr_init_tbl,a9,L
;
;;team 1 team meter
; move *a9+,a0 ;X
; move *a9+,a1 ;Y
; sll 16,a0
; sll 16,a1
; move *a9+,a3 ;Z
; move *a9+,a2,L ;image ;Y
; movi DMAWNZ|M_NOCOLL|M_SCRNREL,a4
; movi CLSDEAD,a5
; clr a6
; clr a7
; calla BEGINOBJ2
; move a8,@tm1_meter_obj,L ;keep *obj
;
;;team 2 team meter
; move *a9+,a0 ;X
; move *a9+,a1 ;Y
; sll 16,a0
; sll 16,a1
; move *a9+,a3 ;Z
; move *a9,a2,L ;image ;Y
; calla BEGINOBJ2
; move a8,@tm2_meter_obj,L ;keep *obj
; DIE
;
;
; .asg 25,TM_METR_Y
;; .asg 27,TM_METR_Y
; .asg 300,TM_METR_Z
;
;#tm_mtr_init_tbl
; .word 54,TM_METR_Y,TM_METR_Z ;x,y
; .long TEAMZN_01b
; .word 280,TM_METR_Y,TM_METR_Z ;x,y
; .long TEAMZN_01r
;
;
;#***************************************
;* Update count and image for team
;*
;* INPUT: a1 - player number
;* a14 - amount to add to meter
;*
; SUBR update_team_meter
;
; PUSH a1
;
; srl 1,a1
; jrnz #tm2
;
; move @tm1_meter_cnt,a1
; add a14,a1
; cmpi NUM_MTR_IMGS,a1 ;value in range ?
; jrlo #ok1 ;br=yes
; movi NUM_MTR_IMGS-1,a1 ;set to max
;#ok1 move a1,@tm1_meter_cnt
; sll 5,a1
; addi tm_meter_img_tbl,a1
; move *a1,a14,L ;get NEW img ptr
; move @tm1_meter_obj,a1,L ;get CURRENT img ptr
; jruc #chng
;#tm2
; move @tm2_meter_cnt,a1
; add a14,a1
; cmpi NUM_MTR_IMGS,a1 ;value in range ?
; jrlo #ok2 ;br=yes
; movi NUM_MTR_IMGS-1,a1 ;set to max
;#ok2 move a1,@tm2_meter_cnt
; sll 5,a1
; addi tm_meter_img_tbl,a1
; move *a1,a14,L ;get NEW img ptr.
; move @tm2_meter_obj,a1,L ;get CURRENT img ptr.
;#chng
;; move a14,*a1(OIMG),L ;update image
;; move *a14(0),*a1(OSIZE),L
; move *a14(0),*a1(OSAG),L
;
; PULL a1
; rets
;
;
;tm_meter_img_tbl
; .long TEAMZN01
; .long TEAMZN02
; .long TEAMZN03
; .long TEAMZN04
; .long TEAMZN05
; .long TEAMZN06
; .long TEAMZN07
; .long TEAMZN08
; .long TEAMZN09
; .long TEAMZN10
; .long TEAMZN11
; .long TEAMZN12
; .long TEAMZN13
; .long TEAMZN14
; .long TEAMZN15
; .long TEAMZN16
; .long TEAMZN17
; .long TEAMZN18
; .long TEAMZN19
; .long TEAMZN20
; .long TEAMZN21
; .long TEAMZN22
; .long TEAMZN23
; .long TEAMZN24
; .long TEAMZN25
; .long TEAMZN26
; .long TEAMZN27
; .long TEAMZN28
; .long TEAMZN29
; .long TEAMZN30
;tm_meter_img_tbl_end
;
;NUM_MTR_IMGS equ (tm_meter_img_tbl_end-tm_meter_img_tbl)/32
#*******************************
* Display player and game status info (Process)
;DJT Start
.ref col_name_ptrs
;DJT End
SUBRP status_display
clr a0
move a0,@P1DATA+ply_messages,L ;Zero plyr message img ptr
move a0,@P2DATA+ply_messages,L
move a0,@P3DATA+ply_messages,L
move a0,@P4DATA+ply_messages,L
move a0,@P1DATA+ply_idiot_use
move a0,@P2DATA+ply_idiot_use
move a0,@P3DATA+ply_idiot_use
move a0,@P4DATA+ply_idiot_use
movi #init_t,a11 ;>Setup status images
movi crplate_ptr,a9,L
callr prt_status
; movi msg_ram,a9
; move @msg_ram,a0,L
; callr prt_status
; move a0,@crplate_ptr,L
;--------------------
; Setup plyr 1 name/turbo/coin objs
movi init_t1,a11
movi P1DATA+ply_meter_imgs,a9
callr prt_status
move @PSTATUS,a0
btst 0,a0 ;Is plyr 1 in? Yes if !0
jrnz #tag1
movi init_t1a,a11 ;No. Setup "insert coin"
movi P1DATA+ply_messages,a9
callr prt_status
move @P1DATA+ply_meter_imgs,a0,L ;Turn off time/turbo objs
calla OBJOFF
move @P1DATA+ply_meter_imgs+32,a0,L
calla OBJOFF
#tag1
movi P1DATA,a11
calla refill_turbo
;DJT Start
clr a0
callr plyrname_fix
;DJT End
;--------------------
; Setup plyr 2 name/turbo/coin objs
movi init_t2,a11
move @TWOPLAYERS,a14 ;Two plyr kit? No if 0
jrz #2kit2
movi init_t2kit,a11
#2kit2 movi P2DATA+ply_meter_imgs,a9
callr prt_status
move @PSTATUS,a0
btst 1,a0 ;Is plyr 2 in? Yes if !0
jrnz #tag2
movi init_t2a,a11 ;No. Setup "insert coin"
movi P2DATA+ply_messages,a9
callr prt_status
move @P2DATA+ply_meter_imgs,a0,L ;Turn off time/turbo objs
calla OBJOFF
move @P2DATA+ply_meter_imgs+32,a0,L
calla OBJOFF
#tag2
movi P2DATA,a11
calla refill_turbo
;DJT Start
movk 1,a0
callr plyrname_fix
;DJT End
;--------------------
; Setup plyr 3 name/turbo/coin objs
movi init_t3,a11
move @TWOPLAYERS,a14 ;Two plyr kit? No if 0
jrz #2kit3
movi init_t3kit,a11
#2kit3 movi P3DATA+ply_meter_imgs,a9
callr prt_status
move @PSTATUS,a0
btst 2,a0 ;Is plyr 3 in? Yes if !0
jrnz #tag3
movi init_t3a,a11 ;No. Setup "insert coin"
movi P3DATA+ply_messages,a9
callr prt_status
move @P3DATA+ply_meter_imgs,a0,L ;Turn off time/turbo objs
calla OBJOFF
move @P3DATA+ply_meter_imgs+32,a0,L
calla OBJOFF
#tag3
movi P3DATA,a11
calla refill_turbo
;DJT Start
movk 2,a0
callr plyrname_fix
;DJT End
;--------------------
; Setup plyr 4 name/turbo/coin objs
movi init_t4,a11
movi P4DATA+ply_meter_imgs,a9
callr prt_status
move @PSTATUS,a0
btst 3,a0 ;Is plyr 4 in? Yes if !0
jrnz #tag4
movi init_t4a,a11 ;No. Setup "insert coin"
movi P4DATA+ply_messages,a9
callr prt_status
move @P4DATA+ply_meter_imgs,a0,L ;Turn off time/turbo objs
calla OBJOFF
move @P4DATA+ply_meter_imgs+32,a0,L
calla OBJOFF
#tag4
movi P4DATA,a11
calla refill_turbo
;DJT Start
movk 3,a0
callr plyrname_fix
;DJT End
;--------------------
;
calla prt_top_scores ;Update scores at scrn top
;;;;;;; calla prt_cr_timers <- Did nothing!
; ** JBJ commented out on 4-13-95
; movi seccall1+>3df2,a0 ;>Chksum security call code
; movk (seccall1end-seccall1)/16,b0
; movi ->259e0d-2,a8 ;1st value
;#csumlp move *a0(->3df2),a1
; add a1,a8
; addk 16,a0
; dsj b0,#csumlp
; ;>Chksum security_chk code
; movi security_chk+>4bbb,a0
; movi 68+128*2,b0 ;#Words
;#csmlp move *a0(->4bbb),a1
; add a1,a8
; addk 16,a0
; dsj b0,#csmlp
;; ** JBJ commented out on 4-13-95
SLEEPK 5
calla update_scorebrd
; ** DJT - no need to do these net_ani's
; clr a0
; movk 4,a1
; callr net_ani ;Ani both nets to fix alignment
; movk 1,a0
; movk 4,a1
; callr net_ani
; ** JBJ commented out on 4-13-95
;;;; CREATE0 security_trashstuff ;Pass A8
calla initcrowd_ani
DIE
;DJT Start
;--------------------
; A0=player # (0-3)
;Destroys A1-A4,A14
SUBR plyrname_fix
sll 5,a0
movi #pnfix_t,a1,L
add a0,a1
move *a1,a1,L ;Get *(name *obj)
move *a1,a1,L ;Get name *obj
move *a1(OFLAGS),a2
andni M_CHARGEN+M_PIXSCAN,a2 ;Clear chargen flags
.ref plyr_data_tbl
movi plyr_data_tbl,a3,L
add a0,a3
move *a3,a3,L ;Get *playerN_data
move *a3(PR_CREATED_PLYR),a14 ;Is this a created plyr?
subk 1,a14
jrz #tag1cp
movi names,a3,L
add a0,a3
move *a3,a14,L ;College player?
jrn #tag1a ; br=no
move *a3(32*NUMPLYRS),a3,L ;Get college *name
addi M_CHARGEN+M_PIXSCAN,a2,W ;Set char_gen flags
jruc #tag1b
#tag1cp
addi PR_NAME1,a3,W ;Yes. Chk validity of name
move *a3,a14
jrle #tag1a ;Assume no name if first=0
movk NAME_LETTERS,a4
#tag1lp
move *a3+,a14
cmpi END_CHAR,a14,W ;In range? No if >
jrhi #tag1a
dsj a4,#tag1lp
subi NAME_LETTERS*16,a3,W ;Reset ptr
addi M_CHARGEN,a2,W ;Set char_gen flags
#tag1b
move a3,*a1(ODATA_p),L ;Save char_gen *name
clr a14
move a14,*a1(OMISC) ;Clr so char_gen calcs new X
#tag1a
move a2,*a1(OFLAGS)
srl 5,a0
rets
#pnfix_t
.long P1DATA+ply_meter_imgs
.long P2DATA+ply_meter_imgs
.long P3DATA+ply_meter_imgs
.long P4DATA+ply_meter_imgs
;DJT End
********************************
* Create game status objs
* A11=obj init table ptr
* A9=ptr to sequentially store created *obj to
* Destroys A0-A8, *A9(-32)=last created *obj
#lp
move *a11+,a1 ;Y
sll 16,a0
sll 16,a1
move *a11+,a3 ;Z
movi DMAWNZ|M_NOCOLL|M_SCRNREL,a4
move *a11+,a2,L ;OIMG
movi CLSDEAD,a5
clr a6
clr a7
calla BEGINOBJ2
move a8,*a9+,L ;keep *obj
SUBR prt_status
move *a11+,a0 ;X
cmpi 4000,a0
jrne #lp ;!End?
rets
;----------
;
#x1 .equ 14
#x2 .equ 240
#y .equ 18
#z .equ 300
#init_t
.word SCOREBRD_X,SCOREBRD_Y,SCOREBRD_Z
.long QUARTR01
; .word #x1+40,#y+9,#z
; .long TURBO_01b
; .word #x2+40,#y+9,#z
; .long TURBO_01r
.word 4000
init_t1
.word #x1+32,#y-10,#z
.long insert ;LED_00 ;timebox
.word #x1,#y,#z
.long TURBO_01b
.word 4000
init_t1a ;not in game, insert coin
.word #x1+32,#y-10,#z
.long insert
.word 4000
init_t2
.word #x1+80+32,#y-10,#z
.long insert ;LED_00 ;timebox
.word #x1+80,#y,#z
.long TURBO_01g
.word 4000
init_t2kit
.word #x1+80+32,#y-10,#z
.long insert ;LED_00 ;timebox
.word #x1+80,#y,#z
.long TURBO_01b
.word 4000
init_t2a ;not in game, insert coin
.word #x1+80+32,#y-10,#z
.long insert
.word 4000
init_t3
.word #x2+32,#y-10,#z
.long insert ;LED_00 ;timebox
.word #x2,#y,#z
.long TURBO_01y
.word 4000
init_t3kit
.word #x2+32,#y-10,#z
.long insert ;LED_00 ;timebox
.word #x2,#y,#z
.long TURBO_01r
.word 4000
init_t3a ;not in game, insert coin
.word #x2+32,#y-10,#z
.long insert
.word 4000
init_t4
.word #x2+80+32,#y-10,#z
.long insert ;LED_00 ;timebox
.word #x2+80,#y,#z
.long TURBO_01r
.word 4000
init_t4a ;not in game, insert coin
.word #x2+80+32,#y-10,#z
.long insert
.word 4000
********************************
COLRPRC
movi COLRPID,a0
calla KIL1C ;KILL ALL COLOR UPDATE PROCESSES
clr a0
move a0,@PALFRAM,L
movi scorep,a0 ;Score area palette
jauc pal_getf
#*******************************
* Trash free object list because security failed (Process)
* A8=Security status (-2=OK!)
SUBRP security_trashstuff
; addk 2,a8
; jrz #x ;OK?
; movi TSEC*60*5+1,a0
; calla RNDRNG0
; addi TSEC*60*4-3,a0
; calla PRCSLP ;Sleep 5-9 minutes
; movi OFREE,a1
; movk 10,a2
;#lp move *a1,a1,L
; dsj a2,#lp
; move a0,*a1,L ;Trash 10th free objs *next (-1)
;
#x DIE
*******************************
;wbmcolor_t
; .word 0380h,1380h,2380h,3380h,4380h,5380h,6380h,7380h,7300h
; .word 7280h,7200h,7180h,7080h,7008h,7008h,7010h,7010h,701ch
; .word 701ch,601ch,501ch,409ch,309ch,209ch,219ch,029ch,039ch
; .word 139ch,239ch,339ch,539ch,739ch,7390h,7380h,6380h,4380h
;;need a duplicate set
; .word 0380h,1380h,2380h,3380h,4380h,5380h,6380h,7380h,7300h
; .word 7280h,7200h,7180h,7080h,7008h,7008h,7010h,7010h,701ch
; .word 701ch,601ch,501ch,409ch,309ch,209ch,219ch,029ch,039ch
; .word 139ch,239ch,339ch,539ch,739ch,7390h,7380h,6380h,4380h
; .word -1
********************************
;aud_plyrbeg
;
; movk AUDBEGIN,a0
; calla AUD1
; move @PSTATUS,a0
; subk 3,a0
;; jrne apbx
;
; MOVE @GAMSTATE,A0
; subk ININTRO,A0 ;IF IN INTRO, THE REGULAR START UP
;; JRZ apbx
;
; movk AUD1STRT,a0 ;Mid game start
; movi -1,a1
; jauc AUD
********************************
SUBR WNDWON
PUSHP a8
movk 1,a8
MOVE A8,@WFLG
MOVI [254,400],A8
MOVI SCRNMID,A10
JSRP OWINDOW
MOVE A8,@OBJPTR,L
PULLP a8
RETP
SUBR WNDWOFF
PUSHP a8
MOVE @OBJPTR,A8,L
JSRP CWINDOW
CLR A0
MOVE A0,@WFLG
PULLP a8
RETP
********************************
* Open a text window on the object list (JSRP)
* A8 =Window size
* A10=Center point of window (screen relative)
*
* >A8 = *Window object or 0 (Z)
* Trashes A9-A11
OWINDOW
move a8,a11
move a10,a0
sll 16,a0
clr a1
movy a10,a1
movi FONT7A,a2
movi 20001,a3 ;Z
movi DMACAL,a4
movi CLSNEUT|TYPTEXT|SUBWNDW,a5
clr a6
clr a7
calla BEGINOBJ
move *a8(OXPOS),a10
move *a8(OYVAL),a0,L
movy a0,a10 ;Get new world coords
move a10,a0
srl 1,a11 ;XY/2
andi >7fff7fff,a11
subxy a11,a10
addxy a0,a11
move @WSPEED,a0 ;Window speed
JSRP OBJEXP32
movi OWSPD,a0
move a0,@WSPEED
RETP
********************************
* CWINDOW - CLOSE A TEXT WINDOW, ON THE OBJECT LIST.
* A8 = PTR TO WINDOW OBJECT
* RETURNS:
* WITH WINDOW OBJECT DELETED
* NOTE: CALL WITH JSRP
* TRASHES A9,A10 & A11
CWINDOW
MOVE *A8(OXPOS),A10
MOVE *A8(OYVAL),A11,L
MOVY A11,A10
MOVE *A8(OSIZE),A11,L
MOVY A11,A1
SRL 17,A1
SLL 16,A1
SLL 16,A11
SRL 17,A11
MOVY A1,A11
ADDXY A11,A10
MOVE A10,A11 ;CALCULATED CENTER OF OBJECT
MOVI CWSPD,A0 ;WINDOW SPEED
JSRP OBJEXP32
CALLA DELOBJA8
RETP
DELWNDW
MOVE @OBJPTR,A0,L
MOVE A0,A8
jauc DELOBJ
********************************
* SHRINK OR EXPAND AN OBJECT FROM THE CURRENT SIZE
* TO THE GIVEN SIZE IN A GIVEN AMOUNT OF TICKS.
* A0 =# OF TICKS
* A8 =*Obj
* A10=NEW OBJTL
* A11=NEW OBJLR
* Trashes A9
OBJEXP32
sll 32-8,a0 ;0-255
srl 32-8,a0
ori 1,a0
MOVE *A8(OXPOS),A1
MOVE *A8(OYVAL),A14,L
MOVX A1,A14 ;A14 = OBJECT UL
SLL 16,A1
CLR A2
MOVY A14,A2
SUBXY A10,A14
MOVX A14,A5
SLL 16,A5
DIVS A0,A5
NEG A5
MOVE A5,A6
CLR A5
MOVY A14,A5
DIVS A0,A5
NEG A5
MOVE A5,A7
MOVE *A8(OXPOS),A3
MOVE *A8(OYVAL),A14,L
MOVX A3,A14
MOVE *A8(OSIZE),A3,L
ADDXY A3,A14 ;A14 = OBJECT LR
PUSH A8
MOVX A14,A3
SLL 16,A3
CLR A4
MOVY A14,A4
SUBXY A11,A14
MOVX A14,A5
SLL 16,A5
DIVS A0,A5
NEG A5
MOVE A5,A8
CLR A5
MOVY A14,A5
DIVS A0,A5
NEG A5
MOVE A5,A9
MOVE A0,A5
PULL A14
OBJTIMLP
ADD A6,A1 ;ADD THE TLX INCREMENT
ADD A7,A2 ;ADD THE TLY INCREMENT
ADD A8,A3 ;ADD THE LRX INCREMENT
ADD A9,A4 ;ADD THE LRY INCREMENT
MMTM A12,A1,A2,A3,A4,A5,A6,A7,A14
MOVE A1,*A14(OXVAL),L
MOVE A2,*A14(OYVAL),L
SUB A1,A3
SUB A2,A4 ;GET A SIZE FOR THE WINDOW
SRL 16,A3
MOVY A4,A3
callr fixa3xy
MOVE A3,*A14(OSIZE),L
SLEEPK 1
MMFM A12,A1,A2,A3,A4,A5,A6,A7,A14
DSJS A5,OBJTIMLP
MOVE A10,*A14(OXPOS)
MOVY A10,A1
SRL 16,A1
MOVE A1,*A14(OYPOS)
MOVE A11,A9
SUBXY A10,A11
MOVE A11,A3
callr fixa3xy
MOVE A3,*A14(OSIZE),L ;MATCH WHAT THE CALLER WANTED
MOVE A9,A11 ;PRESERVE FOR YUKS
MOVE A14,A8
RETP
********************************
* Keep window XY size valid
* A3=Y:X
fixa3xy
move a3,a3
jrgt #yok
movk 1,a0
sll 16,a0
movy a0,a3
#yok
movx a3,a0
sext a0
jrgt #xok
movk 1,a0
movx a0,a3
#xok
rets
********************************
* Get random # with mask
* A0=Mask
* >A0=Rnd # (Pass CC)
* Trashes scratch
SUBRP rnd
move @RAND,a1,L
rl a1,a1
move @HCOUNT,a14
rl a14,a1
add sp,a1
move a1,@RAND,L
and a1,a0
rets
********************************
* Set player name text
SUBR set_names
;DJT Start
movi player_names,a10
move @team1,a2
jrz #out
#lp
addi NEXT_TEAM_NAMES,a10 ;compute offset into table
dec a2
jrnz #lp
#out
move @team1,a0
sll 4,a0
addi tm1set,a0
move *a0,a14
sll 6,a14
add a14,a10
move *a10,a1,L ;Name *img
move *a10(32),a2,L ;Name *img
move @special_heads,a14 ;Do plyr 1
jrn #not_spec1
sll 5,a14
addi our_names,a14
move *a14,a1,L
#not_spec1
move a1,@names,L
move a1,a1 ;College player?
jrn #notcol1 ; br=no
sll 5,a1 ;Get college name *string
addi col_name_ptrs,a1,L
move *a1,a1,L
#notcol1
move a1,@original_names,L
move @special_heads+16,a14 ;Do plyr 2
jrn #not_spec2
sll 5,a14
addi our_names,a14
move *a14,a2,L
#not_spec2
move a2,@names+32,L
move a2,a2 ;College player?
jrn #notcol2 ; br=no
sll 5,a2 ;Get college name *string
addi col_name_ptrs,a2,L
move *a2,a2,L
#notcol2
move a2,@original_names+32,L
;
;Team 2
;
movi player_names,a10
move @team2,a2
jrz #out2
#lp2
addi NEXT_TEAM_NAMES,a10 ;compute offset into table
dec a2
jrnz #lp2
#out2
move @team2,a0
sll 4,a0
addi tm2set,a0
move *a0,a14
sll 6,a14
add a14,a10
move *a10,a1,L ;Name *img
move *a10(32),a2,L ;Name *img
move @special_heads+32,a14 ;Do plyr 3
jrn #not_spec3
sll 5,a14
addi our_names,a14
move *a14,a1,L
#not_spec3
move a1,@names+64,L
move a1,a1 ;College player?
jrn #notcol3 ; br=no
sll 5,a1 ;Get college name *string
addi col_name_ptrs,a1,L
move *a1,a1,L
#notcol3
move a1,@original_names+64,L
move @special_heads+48,a14 ;Do plyr 4
jrn #not_spec4
sll 5,a14
addi our_names,a14
move *a14,a2,L
#not_spec4
move a2,@names+96,L
move a2,a2 ;College player?
jrn #notcol4 ; br=no
sll 5,a2 ;Get college name *string
addi col_name_ptrs,a2,L
move *a2,a2,L
#notcol4
move a2,@original_names+96,L
rets
;DJT End
****************************************************************
* Temp routines
.if DEBUG
SUBR show_plyr_pal
;;Show player #0 pal to verify pal build
;
; SLEEPK 10
;
; movi [200,0],a0
; movi [50,0],a1
; movi 20000,a3
; movi DMAWNZ|M_NOCOLL|M_SCRNREL,a4
; .ref pal_block
; movi pal_block,a2
; movi CLSDEAD,a5
; clr a6
; clr a7
; calla BEGINOBJ2
; move @plyrobj_t,a0,L
; move *a0(OPAL),a0
; move a0,*a8(OPAL)
;
DIE
.ref dirqtimer
BSSX CPUAVG ,16
BSSX CPULEFT ,16
SUBRP cputime_calcfree
move @dirqtimer,a0
subk 1,a0
jrle nobog
clr a0
jruc gottime
nobog
move @vcount,a0
subi EOSINT,a0
jrnn skinccnt
addi 256,a0
skinccnt
sll 2,a0
neg a0
addi 1024,a0
gottime
move a0,@CPULEFT
srl 4,a0
move @CPUAVG,a1
move a1,a2
srl 4,a2 ;/16
sub a2,a1
add a0,a1
move a1,@CPUAVG
rets
.endif
*****************************************************************************
.if DEBUG
SUBRP testcode
#*******************************
* DMA window test (DEBUG)
.if 0 ;Totally commented out!
dint
clr a0
move a0,@DMACTRL
move a0,@DMACTRL
clr a1 ;>Clr screen mem
movi >200000/32,b0
#clrscr move a0,*a1+,L
dsj b0,#clrscr
clr a0
move a0,@DMATEST
movi 0,a0
move a0,@DMAOFFST
movk >10,a1
move a1,@DMACONF
movi [350+56,50+56],a1 ;L/R
move a1,@DMAWINDOW,L
movi >30,a1
move a1,@DMACONF ;Top/Bottom
movi [200,50],a1
move a1,@DMAWINDOW,L
movi [>100,>100],a3 ;Y:X scale
clr a4
movi [100,100+56],a8 ;Y:X
movi [100,200],a7 ;V:H size
movi >2000000,a10 ;SAG
movi >900c0000,a11 ;CTRL:OFSET
movi 20000,b2
#lp rl 16,a4
movi DMAREGS,a14
#dwt move @DMACTRL,a0
jrn #dwt
mmtm a14,a3,a4,a7,a8,a10,a11
rl 16,a4
#xok addk 1,a4 ;Color+1
andi >ff,a4
move a4,a0
sll 8,a0
or a0,a4
dsj b2,#lp
eint
.endif ;End of totally commented out!
#*******************************
* DMA 1x1 test (DEBUG)
.if 0 ;Totally commented out!
dint
clr a0
move a0,@DMACTRL
move a0,@DMACTRL
clr a1 ;>Clr screen mem
movi >200000/32,b0
#clrscr move a0,*a1+,L
dsj b0,#clrscr
clr a0
move a0,@DMATEST
movi 0,a0
move a0,@DMAOFFST
movk >10,a1
move a1,@DMACONF
movi [350,50],a1 ;L/R
movi [399,0],a1 ;L/R
move a1,@DMAWINDOW,L
movi >30,a1
move a1,@DMACONF ;Top/Bottom
movi [200,50],a1
movi [253,0],a1
move a1,@DMAWINDOW,L
movi [>100,>100],a3 ;Y:X scale
clr a4
clr a8 ;Y:X
movi >10001,a7 ;V:H size
movi >2000000,a10 ;SAG
movi >900c0000,a11 ;CTRL:OFSET
#lp rl 16,a4
movi DMAREGS,a14
#dwt move @DMACTRL,a0
jrn #dwt
mmtm a14,a3,a4,a7,a8,a10,a11
rl 16,a4
addk 1,a8
btst 9,a8
jrz #xok
addi >10000,a8 ;+1 Y
btst 8+16,a8
jrz #yok
addk 4,a4
#yok andi >ff01ff,a8
#xok addk 1,a4
andi >ff,a4
move a4,a0
sll 8,a0
or a0,a4
addk 1,a10 ;SAG+1
jruc #lp
eint
.endif ;End of totally commented out!
#*******************************
* Instruction speed test (DEBUG)
.if 0 ;Totally commented out!
dint
movi >2c,a0 ;Enable cache
movi >802c,a0 ;Disable cache
move a0,@CONTROL
movi >f010,a0
move a0,@DPYCTL
move @HSTCTLH,a0
andi >bfff,a0
move a0,@HSTCTLH
; setf 32,1,1 ;Field1 = Long word sign (slow!)
movi CPULEFT,a1
; movi 50000000/(37+6),a0
;#lpsf move *a1,a14,L ;5,8
; move *a1,a14,L ;5,8
; move *a1,a14,L ;5,8
; move *a1,a14,L ;5,8
; move @CPUAVG,a14,L ;7,16
; move @CPUAVG,a14,L ;7,16
; dsj a0,#lpsf ;3,9
#nxt
movi VCOUNT,a7
clr a6
movi SCRATCH,a2
#lp move *a7,a0
jrnz #lp
#lp2 move *a7,a0
jrz #lp2
#lp3
; calla #1
; nop
; nop
; nop
; nop
;#1 PULL a0
; movi #2,a0
; jauc #2
; nop
; nop
; nop
; nop
;#2
; movi 100,a0
; nop
; movi >11111111,a0
; move @SCRATCH,a0
; move *a2(0),*a2(0)
; move *a2,a0
; move a0,*a2(0)
; movi SCRATCH,a1
; move *a1,a0,L
; move *a1,a0,L
; move a0,*a1,L
; move a0,*a1,L
; move a0,@SCRATCH,L
; move a0,@SCRATCH,L
; move @SCRATCH,a0,L
; move @SCRATCH,a0,L
movi SCRATCH+>1000,a0
movi SCRATCH+>1000,a1
; move -*a0,-*a1,L
; move -*a0,-*a1,L
; move -*a0,-*a1,L
; move -*a0,-*a1,L
; move -*a0,-*a1,L
; move -*a0,-*a1,L
mmfm a0,a1,a2,a3,a4,a5,a14
mmtm a0,a1,a2,a3,a4,a5,a14
addk 1,a6 ;1,4
move *a7,a0 ;3,6
jrnz #lp3 ;2,5
movi 16*50000000/8/62,a1
divu a6,a1
addk 18,a1 ;+Fudge
subi 15*16,a1 ;-Overhead cycles
move a1,a0 ;Round off
addk 8,a0
srl 4,a0
trap 29
jruc #nxt
movi COLRAM,a8
#lp5 move *a7,a0
#lp6 move *a7,a1
cmp a1,a0
jreq #lp6
movi 90,a2
movk 5,a0
#lp8 move a0,*a8 ;1+(1),5
addk 2,a0 ;1,4
dsj a2,#lp8 ;2,5
jruc #lp5
eint
.endif ;End of totally commented out!
rets
.endif ;DEBUG
*****************************************************************************
.end