nba-jam-tournament-edition/D3.ASM

2951 lines
52 KiB
NASM
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

**************************************************************
*
* Software: Shawn Liptak
* Initiated: Jan 31,1992
*
* Modified: !
*
* COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 3/22/93 20:50
**************************************************************
.file "3d.asm"
.title "Mega 3d polygon code"
.width 132
.option b,d,l,t
.mnolist
.include gsp.equ
.include sys.equ
.include mproc.equ
.include disp.equ
.include shawn.hdr
.include game.equ
.include imgtbl.glo
;sound headers used
tankexpsnd .word >fcc0,15,>8153,0 ;Tank explosion
plfiresnd .word >f450,20,>8129,0 ;Player cannon
enfiresnd .word >f460,20,>811d,0 ;Enemy cannon
plhit_snd .word >fcf5,05,>8138,0 ;Hit backboard
;symbols externally defined
.ref _3dstat,gndstat
.ref IRQSKYE
.ref pal_getf,osgfont_t,STRCNRMO_1
.ref game_over
;symbols defined in this file
; .def rocketptx_t ;For TV
;uninitialized ram definitions
D3NUMO .equ 200
*struct APTR
OBJPTR .equ 0 ;UHL
*endstruct
*struct WORD
OBJPTR .equ 0 ;UHW
*endstruct
*struct XYZ
PTX .equ 0 ;SDW
PTY .equ >10 ;SDW
PTZ .equ >20 ;SDW
*endstruct
*struct D3OBJ
D3LINK .equ 0 ;UHL *Next object or 0
D3X .equ >20 ;SHL X pos 24:8
D3Y .equ >40 ;SHL Y ^
D3Z .equ >60 ;SHL Z ^
D3XV .equ >80 ;SHL X vel 24:8
D3YV .equ >a0 ;SHL Y ^
D3ZV .equ >c0 ;SHL Z ^
D3XA .equ >e0 ;UHW X angle 0-255
D3YA .equ >f0 ;UHW Y ^
D3ZA .equ >100 ;UHW Z ^
D3ID .equ >110 ;UHW Type ID
D3PTS .equ >120 ;UHL *Points array (Cnt, XYZ,XYZ..)
D3XPTS .equ >140 ;UHL *Xformed points array (Cnt, XYZ,XYZ..)
D3FACE .equ >160 ;UHL *Face data
D3ZTEMP .equ >180 ;SHW View relative Z for sorting
D3PLINK .equ >190 ;UHL *Process that owns
D3HDSZ .equ >1b0
*endstruct
XPTMSZ .equ (16*3*11*D3NUMO/4)&>fffff0
BSSX d3vis_p ,32 ;*1st in chain of visable objs
BSSX d3free_p ,32 ;*1st in chain of free objs
STRUCT >1100000
STRUC d3objmem ,D3HDSZ*D3NUMO ;Object header mem
STRUC d3xptmem ,XPTMSZ ;Xformed pts mem
BSSX d3world_t ,32*(D3NUMO+1) ;World_t of * to polygon objs
BSSX d3gnd_t ,32*100 ;Ground_t of * to polygon objs
BSSX viewx ,32 ;X view position (24:8)
BSSX viewy ,32 ;Y ^
BSSX viewz ,32 ;Z ^
BSSX viewxa ,16 ;X view angle 0-255
BSSX viewya ,16 ;Y ^
BSSX viewza ,16 ;Z ^
.bss d3collstop ,16 ;!0=Stop scan on current obj
.bss pcoll_t ,32*(D3NUMO+1) ;List of objs of class player
.bss ncoll_t ,32*(D3NUMO+1) ;List of objs of class neutral
.bss ecoll_t ,32*(D3NUMO+1) ;List of objs of class enemy
.bss shield ,16 ;Shield strength
TYPPSHOT .equ 0200h ;Players shots
TYPGND .equ 0300h ;Ground obstacle
TYPTANK .equ 0400h ;Tank
TYPSHELL .equ 0500h ;Type shell
BOGRATE .equ 4
.text
********************************
* 3D point format. Label is shown on + end of axis.
* +---------+
* | Y / | Z goes negative into screen
* | |/ |
* | ---+--X |
* | /| |
* | Z | |
* +---------+
********************************
* Test 3D code (Process)
SUBR _3d_test
clr a1 ;All procs
calla KILALL
movi -1,a1 ;All objs
calla obj_delc
movk 6,a0
move a0,@IRQSKYE
movi d3objmem,a1 ;>Init free list
move a1,@d3free_p,L
movi D3NUMO,b0 ;# of object blocks
#olp move a1,a14
addi D3HDSZ,a1
move a1,*a14,L ;link em up
dsj b0,#olp
clr a0
move a0,*a14,L ;Null end
move a0,@d3world_t,L
move a0,@d3gnd_t,L
movi #init_t,a10 ;>Get objects and init
jruc dt40
dtlp callr _3d_getobj
movi CLSNEUT|TYPGND,a0
move a0,*a8(D3ID)
move a6,*a8(D3PTS),L
move *a10+,a1,L
move a1,*a8(D3FACE),L
move a8,a1
addk D3X,a1
movk 3,a7
#cxyz move *a10+,a3 ;Copy starting XYZ
sll 8,a3
move a3,*a1+,L
dsj a7,#cxyz
clr a2
movk 3*2+3,a7
#clrva move a2,*a1+ ;Clr XYZ vel & angle
dsj a7,#clrva
dt40 move *a10+,a6,L
jrnz dtlp
movi #gndinit_t,a10 ;>Get ground objects and init
jruc #gndi
#gndlp callr _3d_getgndobj
move a6,*a8(D3PTS),L
move *a10+,a1,L
move a1,*a8(D3FACE),L
move a8,a1
addk D3X,a1
movk 3,a7
#cxyz2 move *a10+,a0,L ;Copy starting XYZ
sll 8,a0
move a0,*a1+,L
dsj a7,#cxyz2
clr a2
movk 3*2+3,a7
#cva move a2,*a1+ ;Clr XYZ vel & angle
dsj a7,#cva
#gndi move *a10+,a6,L
jrnz #gndlp
clr a0
; movi d3xptmem,a11
; move a0,*a11
move a0,@d3vis_p ;Null visable list
move a0,@gndstat ;Off
movk 1,a0
move a0,@_3dstat ;On
CREATE0 plyr_readbut
movi -8000<<8,a10 ;X
movi -8000<<8,a11 ;Z
CREATE0 en_tank
CREATE0 en_tank
movi 8000<<8,a10
movi -8000<<8,a11
CREATE0 en_tank
CREATE0 en_tank
movi -8000<<8,a10
movi 8000<<8,a11
CREATE0 en_tank
CREATE0 en_tank
movi 8000<<8,a10
movi 8000<<8,a11
CREATE0 en_tank
CREATE0 en_tank
CREATE0 en_spawner
movi 100<<8,a0
move a0,@viewy,L
clr a0
move a0,@viewx,L
move a0,@viewz,L
move a0,@viewxa
move a0,@viewya
move a0,@viewza
movk 7,a0
move a0,@shield
SLEEPK 2
clr a0
move a0,@_3dstat ;Off
JSRP scrn_scalein
movk 1,a0
move a0,@_3dstat ;On
SLEEP TSEC*7/BOGRATE
move @SWITCH,a0
andi >5808,a0 ;P1/2 sticks rgt and P2 but 1&3 down
jrnz #slp
CREATE0 copyright_prtmsg
#slp
SLEEP TSEC*70/BOGRATE
movi GOLD,a0
calla pal_getf
move a0,a6
movi #surv_s,a8
clr a0
movi [80,200],a9
movk 1,a10
movi osgfont_t,a11
JSRP STRCNRMO_1
SLEEP TSEC*3/BOGRATE
movk 1,a0
move a0,@show_shot
movi >eaea,a0
move a0,@plyrbighead
movk 8,a0
move a0,@p1taps
move a0,@p1taps+16
move a0,@p1taps+32
move a0,@p1taps+48
.ref show_shot
.ref from_3d
.ref p1taps
.ref plyrbighead
pldead
clr a1 ;All procs
move a1,@_3dstat ;Off
calla KILALL
movi -1,a1 ;All objs
calla obj_delc
jauc from_3d
#surv_s .byte "ALL PLAYERS POWERUP!",0
.even
#init_t ;World init
.long rocket_pts,rocketline_t
.word 0,200,0
.long cube_pts,cubeline_t
.word -5000,400,-5000
.long cube_pts,cubeline_t
.word 5000,400,-5000
.long cube_pts,cubeline_t
.word -5000,400,5000
.long cube_pts,cubeline_t
.word 5000,400,5000
.long cube_pts,cubeline_t
.word -10000,400,-10000
.long cube_pts,cubeline_t
.word 10000,400,-10000
.long cube_pts,cubeline_t
.word -10000,400,10000
.long cube_pts,cubeline_t
.word 10000,400,10000
.long cube_pts,cubeline_t
.word -3000,400,-3000
.long cube_pts,cubeline_t
.word 3000,400,-3000
.long cube_pts,cubeline_t
.word -3000,400,3000
.long cube_pts,cubeline_t
.word 3000,400,3000
.long cube_pts,cubeline_t
.word -5000,400,-5000
.long cube_pts,cubeline_t
.word 2000,400,-2000
.long cube_pts,cubeline_t
.word -2000,400,2000
.long cube_pts,cubeline_t
.word 2000,400,2000
.long pyr_pts,pyrline_t
.word -8000,300,-8000
.long pyr_pts,pyrline_t
.word 8000,300,-8000
.long pyr_pts,pyrline_t
.word -8000,300,8000
.long pyr_pts,pyrline_t
.word 8000,300,8000
.long pyr_pts,pyrline_t
.word 0,300,-5000
.long pyr_pts,pyrline_t
.word 0,300,5000
.long pyr_pts,pyrline_t
.word -5000,300,0
.long pyr_pts,pyrline_t
.word 5000,300,0
.long 0
rocket_pts
.word 17
.word -200,200,800
.word 200,200,800
.word 300,100,800
.word 300,-100,800
.word 200,-200,800
.word -200,-200,800
.word -300,-100,800
.word -300,100,800
.word -200,200,-600
.word 200,200,-600
.word 300,100,-600
.word 300,-100,-600
.word 200,-200,-600
.word -200,-200,-600
.word -300,-100,-600
.word -300,100,-600
.word 0,0,-1100
rocketline_t
.word >101,0,1*48,2*48,3*48,4*48,5*48,6*48,7*48,-1
.word >202,0,8*48,9*48,1*48,-1
.word >303,1*48,9*48,10*48,2*48,-1
.word >202,2*48,10*48,11*48,3*48,-1
.word >303,3*48,11*48,12*48,4*48,-1
.word >202,4*48,12*48,13*48,5*48,-1
.word >303,5*48,13*48,14*48,6*48,-1
.word >202,6*48,14*48,15*48,7*48,-1
.word >303,7*48,15*48,8*48,0*48,-1
.word >404,9*48,8*48,16*48,-1
.word >504,10*48,9*48,16*48,-1
.word >404,11*48,10*48,16*48,-1
.word >504,12*48,11*48,16*48,-1
.word >404,13*48,12*48,16*48,-1
.word >504,14*48,13*48,16*48,-1
.word >404,15*48,14*48,16*48,-1
.word >504,8*48,15*48,16*48,-1
.word -1 ;End
cube_pts
.word 8
.word 400,400,200
.word 400,-400,200
.word -400,-400,200
.word -400,400,200
.word 400,400,-200
.word 400,-400,-200
.word -400,-400,-200
.word -400,400,-200
cubeline_t
.word >101,0,1*48,2*48,3*48,-1
.word >202,7*48,6*48,5*48,4*48,-1
.word >303,3*48,2*48,6*48,7*48,-1
.word >303,4*48,5*48,1*48,0,-1
.word >404,5*48,6*48,2*48,1*48,-1
.word >404,7*48,4*48,0,3*48,-1
.word -1 ;End
pyr_pts ;Pyramid
.word 5
.word -200,-300,200 ;Base
.word -200,-300,-200
.word 200,-300,-200
.word 200,-300,200
.word 0,300,0 ;Tip
pyrline_t
.word >2626,0,4*48,3*48,-1
.word >2a2a,1*48,4*48,0,-1
.word >2626,2*48,4*48,1*48,-1
.word >2a2a,3*48,4*48,2*48,-1
.word -1 ;End
pmsl_pts
.word 5
.word -40,40,200 ;Back
.word 40,40,200
.word 40,-40,200
.word -40,-40,200
.word 0,0,-200 ;Tip
pmslline_t
.word >f0f,0,1*48,2*48,3*48,-1
.word >1111,0,4*48,1*48,-1
.word >1313,1*48,4*48,2*48,-1
.word >1111,2*48,4*48,3*48,-1
.word >1313,3*48,4*48,0*48,-1
.word -1 ;End
enmsl_pts
.word 9
.word 0,50,200 ;Back
.word 35,35,200
.word 50,0,200
.word 35,-35,200
.word 0,-50,200
.word -35,-35,200
.word -50,0,200
.word -35,35,200
.word 0,0,-200 ;Tip
enmslline_t
.word >0f0f,0,1*48,2*48,3*48,4*48,5*48,6*48,7*48,-1
.word >1111,0*48,8*48,1*48,-1
.word >1313,1*48,8*48,2*48,-1
.word >1111,2*48,8*48,3*48,-1
.word >1313,3*48,8*48,4*48,-1
.word >1111,4*48,8*48,5*48,-1
.word >1313,5*48,8*48,6*48,-1
.word >1111,6*48,8*48,7*48,-1
.word >1313,7*48,8*48,0*48,-1
.word -1 ;End
tanklow_pts
.word 8
.word -100,40,200
.word 100,40,200
.word 100,-40,200
.word -100,-40,200
.word -100,5,-200
.word 100,5,-200
.word 100,-40,-200
.word -100,-40,-200
tanklowline_t
.word >505,0,1*48,2*48,3*48,-1 ;Back
.word >202,1*48,5*48,6*48,2*48,-1 ;R
.word >303,5*48,4*48,7*48,6*48,-1 ;F
.word >202,4*48,0,3*48,7*48,-1 ;L
.word >404,4*48,5*48,1*48,0,-1 ;Top
.word >101,3*48,2*48,6*48,7*48,-1 ;Bot
.word -1 ;End
tanktur_pts
.word 8
.word -80,40,100
.word 80,40,100
.word 80,-40,100
.word -80,-40,100
.word -80,5,-100
.word 80,5,-100
.word 80,-40,-100
.word -80,-40,-100
tankturline_t
.word >2626,0,1*48,2*48,3*48,-1 ;Back
.word >2a2a,1*48,5*48,6*48,2*48,-1 ;R
.word >2626,5*48,4*48,7*48,6*48,-1 ;F
.word >2a2a,4*48,0,3*48,7*48,-1 ;L
.word >404,4*48,5*48,1*48,0,-1 ;Top
.word >101,3*48,2*48,6*48,7*48,-1 ;Bot
.word -1 ;End
#gndinit_t ;Ground init
.long gnd_pts,gndline_t,0,0,0
.long gnd_pts,gndline_t,0,0,-21000
.long gnd_pts,gndline_t,-21000,0,0
.long gnd_pts,gndline_t,21000,0,0
.long gnd_pts,gndline_t,0,0,21000
.long 0
gnd_pts
.word 8
.word -9000,0,-9000
.word 9000,0,-9000
.word 9000,0,9000
.word -9000,0,9000
.word -1000,0,-1000
.word 1000,0,-1000
.word 1000,0,1000
.word -1000,0,1000
gndline_t
.word >2020,0,1*48,2*48,3*48,-1
.word >2323,4*48,5*48,6*48,7*48,-1
.word -1 ;End
#*******************************
* DEBUG
check_vislist
movi d3vis_p,a1
move *a1,a0,L
jrz #x
#debug move a1,a0
move *a0,a1,L
jrnz #debug
move *a0(D3PTS),a1,L
jrz #err ;ERROR!!!
#x rets
#err
LOCKUP
jruc #x
#*******************************
* Get a object from 3D free list
* >A8=*Object or 0
* Trashes scratch
SUBRP _3d_getobj
movi d3free_p,a0
move *a0,a8,L
jrz #err
move *a8,*a0,L ;Unlink
movi d3world_t,a0 ;>Add to end
#lp move *a0+,a1,L
jrnz #lp
move a1,*a0,L
move a8,-*a0,L
#x rets
#err
LOCKUP
jruc #x
#*******************************
* Get a object from 3D free list
* >A8=*Object or 0
* Trashes scratch
SUBRP _3d_getgndobj
movi d3free_p,a0
move *a0,a8,L
jrz #err
move *a8,*a0,L ;Unlink
movi d3gnd_t,a0 ;>Add to end
#lp move *a0+,a1,L
jrnz #lp
move a1,*a0,L
move a8,-*a0,L
#x rets
#err
LOCKUP
jruc #x
#*******************************
* Put an object on 3D free list
* A8=*Object
* Trashes scratch
SUBRP _3d_freeobj
movi d3world_t,a0 ;>Find
#lp move *a0+,a1,L
jrz #free
cmp a1,a8
jrne #lp ;No match?
#lp3 move *a0+,a1,L ;>Move end up
move a1,*a0(-64),L
jrnz #lp3
#free move @d3free_p,*a8+,L
subk 32,a8
move a8,@d3free_p,L
rets
#*******************************
* Get object from 3D free list and init
* A0=X (24:8)
* A1=Y
* A2=Z
* A3=XA
* A4=YA
* A5=ZA
* A6=*Points
* A7=*Face data
* >A8=*Object or 0
* Trashes scratch
SUBRP _3d_beginobj
movi d3free_p,a14
move *a14,a8,L
jrz #error
move *a8,*a14,L ;Unlink
move a8,a14
addk D3X,a14
move a0,*a14+,L ;X
move a1,*a14+,L ;Y
move a2,*a14+,L ;Z
clr a0
move a0,*a14+,L ;XV
move a0,*a14+,L ;YV
move a0,*a14+,L ;ZV
move a3,*a14+ ;XA
move a4,*a14+ ;YA
move a5,*a14+ ;ZA
move a6,*a8(D3PTS),L
move a7,*a8(D3FACE),L
move a13,*a8(D3PLINK),L
movi d3world_t,a14 ;>Add to end
#lp move *a14+,a1,L
jrnz #lp
move a1,*a14,L
move a8,-*a14,L
#x rets
#error LOCKUP
jruc #x
********************************
* Build 3D view, called by display interrupt
SUBR _3d_build
PUSH a4,a13,a14
PUSH b2,b3,b4,b5,b6,b7,b8,b9,b10
movi d3world_t,a7 ;>Add velocity to position
jruc #move
#lpmv addk D3X,a0
mmfm a0,a1,a2,a3,a4,a5,a6 ;A6-A4=XYZ, A3-A1=XYZV
subi 32*3,a0 ;Flip POS & VEL ???
add a1,a4 ;Add ZVEL to Z
move a4,-*a0,L
add a2,a5 ;Add YVEL to Y (Uses hidden cycle!)
move a5,-*a0,L
add a3,a6 ;Add XVEL to X ^
move a6,-*a0,L
#move move *a7+,a0,L
jrnz #lpmv ;More?
PUSH a11
callr _3d_buildvislist
callr _3d_addgndvislist
PULL a11
move @viewx,b2,L ;24:8
move @viewy,b3,L
move @viewz,b4,L
movi d3vis_p,b8 ;>Xform objs about center
jruc dt500
dtlp5 move b8,a8
move *a8(D3PTS),a0,L
move *a8(D3XPTS),a1,L
move a8,a2
addk D3X,a2
move *a2+,a12,L ;XPos (24:8)
move *a2+,a13,L ;YPos
move *a2+,a14,L ;ZPos
addi 32*3,a2
move *a2+,a9 ;XAngle
move *a2+,a10 ;YA
move *a2+,a8 ;ZA
move b2,a3
sub a3,a12
move b3,a3
sub a3,a13
move b4,a3
sub a3,a14
sra 8,a12 ;Remove fraction
sra 8,a13
sra 8,a14
callr _3d_xformoffset
dt500 move *b8,b8,L
jrnz dtlp5
callr _3d_xformrelview ;Could do with step above???
;>Scale for display
movi d3vis_p,b8
jruc #2000
#lp9 move b8,a4
move *a4(D3XPTS),a0,L
callr _3d_scalexy
#2000 move *b8+,b8,L
jrnz #lp9
callr _3d_collide
.if TUNIT
.if DEBUG
move @SWITCH,a7
move @SWITCH2,a0
sll 24,a0
movy a0,a7
.else
move @SWITCH,a7
sll 24,a7
.endif
.else
move @SWITCH,a7,L
.endif
move @viewza,a0 ;>Turn z view angle
btst 10,a7
jrnz dt6000 ;!L joy2?
addk 1,a0
dt6000 btst 11,a7
jrnz dt6100 ;!R joy2?
subk 1,a0
dt6100 move a0,@viewza
move @viewya,a0 ;>Turn y view angle
btst 26,a7
jrnz dt6300 ;!L joy3?
subk 1,a0
btst 30,a7
jrnz dt6300 ;!But3?
subk 1,a0
dt6300 btst 27,a7
jrnz dt6400 ;!R joy3?
addk 1,a0
btst 30,a7
jrnz dt6400 ;!But3?
addk 1,a0
dt6400 move a0,@viewya
move @viewxa,a0 ;>Turn x view angle
btst 8,a7
jrnz dt6600 ;!U joy2?
addk 1,a0
dt6600 btst 9,a7
jrnz dt6700 ;!D joy2?
subk 1,a0
dt6700 move a0,@viewxa
btst 24,a7
jrnz dt7000 ;!Up joy3?
move @viewya,a0 ;>Move forward
callr sinecos_get
btst 30,a7
jrnz #noturb ;!P3 but3
sll 1,a0 ;*2
sll 1,a1
#noturb move @viewx,a2,L
add a0,a2
move a2,@viewx,L
move @viewz,a2,L
sub a1,a2
move a2,@viewz,L
dt7000 btst 25,a7
jrnz dt7500 ;!Dn joy3?
move @viewya,a0 ;>Move back
callr sinecos_get
move @viewx,a2,L
sub a0,a2
move a2,@viewx,L
move @viewz,a2,L
add a1,a2
move a2,@viewz,L
dt7500
PULL b2,b3,b4,b5,b6,b7,b8,b9,b10
PULL a4,a13,a14
rets
#*******************************
* Check distance and visability of objs center point
* Adds to d3vis_p if visable
* >A11=*Next free xform mem
* Trashes A0-A7,B0-B1
;x=x*cos(az)-y*sin(az)
;y=x*sin(az)+y*cos(az)
;y=y*cos(ax)-z*sin(ax)
;z=y*sin(ax)+z*cos(ax)
;z=z*cos(ay)-x*sin(ay)
;x=z*sin(ay)+x*cos(ay)
COSAZ .equ b0
SINAZ .equ b1
COSAX .equ b2
SINAX .equ b3
COSAY .equ b4
SINAY .equ b5
SUBR _3d_buildvislist
PUSH a8,a9,a10
PUSH b2,b3,b4,b5,b6
move @viewza,a0
callr sinecos_get
move a1,COSAZ ;B0=Cos AZ
move a0,SINAZ ;B1=Sine AZ
move @viewxa,a0
callr sinecos_get
move a1,COSAX ;B2=Cos AX
move a0,SINAX ;B3=Sine AX
move @viewya,a0
callr sinecos_get
move a1,COSAY ;B4=Cos AY
move a0,SINAY ;B5=Sine AY
move @viewx,a12,L ;24:8
move @viewy,a13,L
move @viewz,a14,L
movi d3world_t,a4 ;>Build table of visable objs
clr a0
move a0,@d3vis_p,L ;Null end
movi >600000,a10 ;A10=Range limit
movi d3xptmem,a11
jruc #next
#lp
move a6,a0
addk D3X,a0
move *a0+,a1,L ;XPos (24:8)
sub a12,a1
move a1,a3
abs a3
cmp a10,a3
jrhs #next ;Out of range?
move *a0+,a5,L ;YPos
sub a13,a5
move a5,a3
abs a3
cmp a10,a3
jrhs #next ;Out of range?
move *a0+,a9,L ;ZPos
sub a14,a9
move a9,a3
abs a3
cmp a10,a3
jrhs #next ;Out of range?
sra 8,a1 ;Remove fraction
sra 8,a5
sra 8,a9
move a1,a3
move COSAZ,a0
mpys a0,a1 ;Cos*X
move a5,a7
move SINAZ,a2
mpys a2,a5 ;Sine*Y
sub a5,a1
sra 16,a1 ;X about Z
mpys a2,a3 ;Sine*X
mpys a0,a7 ;Cos*Y
add a7,a3
sra 16,a3 ;Y about Z
move a3,a7
move COSAX,a0
move SINAX,a2
mpys a0,a3 ;Cos*Y
mpys a2,a7 ;Sin*Y
move a9,a5
mpys a2,a9 ;Sin*Z
mpys a0,a5 ;Cos*Z
sub a9,a3
sra 16,a3 ;Y about X
add a5,a7
sra 16,a7 ;Z about X
move COSAY,a0
move SINAY,a2
move a7,a9
move a1,a5
mpys a0,a7 ;Cos*Z
mpys a2,a5 ;Sin*X
sub a5,a7
jrgt #next ;Z behind me?
sra 16,a7 ;Z about Y
mpys a2,a9 ;Sin*Z
mpys a0,a1 ;Cos*X
add a9,a1
sra 16,a1 ;X about Y
move a7,*a6(D3ZTEMP)
move a11,*a6(D3XPTS),L
addk 16,a11
move *a6(D3PTS),a2,L
move *a2,a2 ;#Pts
sll 4,a2 ;*16
add a2,a11 ;*48
add a2,a11
add a2,a11
movi d3vis_p,a8 ;>Find spot in list based on Z
#lp2 move a8,a2
move *a8,a8,L
jrz #atend ;End?
move *a8(D3ZTEMP),a1
cmp a1,a7
jrgt #lp2 ;Higher?
#atend move a6,*a2,L ;Point last to me
move a8,*a6,L ;Point me to next
#next move *a4+,a6,L
jrnz #lp
PULL b2,b3,b4,b5,b6
PULL a8,a9,a10
rets
#*******************************
* Check distance and visability of gnd objs
* Adds to d3vis_p if visable
* A11=*Next free xform mem
* Trashes A0-A7,B0-B1
SUBR _3d_addgndvislist
PUSH a8,a9,a10
PUSH b2,b3,b4,b5,b6
move @viewza,a0
callr sinecos_get
move a1,COSAZ ;B0=Cos AZ
move a0,SINAZ ;B1=Sine AZ
move @viewxa,a0
callr sinecos_get
move a1,COSAX ;B2=Cos AX
move a0,SINAX ;B3=Sine AX
move @viewya,a0
callr sinecos_get
move a1,COSAY ;B4=Cos AY
move a0,SINAY ;B5=Sine AY
move @viewx,a12,L ;24:8
move @viewy,a13,L
move @viewz,a14,L
movi d3gnd_t,a4 ;>Build table of visable objs
movi >600000,a10 ;A10=Range limit
jruc #next
#lp
move a6,a0
addk D3X,a0
move *a0+,a1,L ;XPos (24:8)
sub a12,a1
move a1,a3
abs a3
cmp a10,a3
jrhs #next ;Out of range?
move *a0+,a5,L ;YPos
sub a13,a5
move a5,a3
abs a3
cmp a10,a3
jrhs #next ;Out of range?
move *a0+,a9,L ;ZPos
sub a14,a9
move a9,a3
abs a3
cmp a10,a3
jrhs #next ;Out of range?
; sra 8,a1 ;Remove fraction
; sra 8,a5
; sra 8,a9
;
;
; move a1,a3
; move COSAZ,a0
; mpys a0,a1 ;Cos*X
;
; move a5,a7
; move SINAZ,a2
; mpys a2,a5 ;Sine*Y
; sub a5,a1
; sra 16,a1 ;X about Z
;
; mpys a2,a3 ;Sine*X
; mpys a0,a7 ;Cos*Y
; add a7,a3
; sra 16,a3 ;Y about Z
;
;
; move a3,a7
; move COSAX,a0
; move SINAX,a2
; mpys a0,a3 ;Cos*Y
; mpys a2,a7 ;Sin*Y
;
; move a9,a5
; mpys a2,a9 ;Sin*Z
; mpys a0,a5 ;Cos*Z
;
; sub a9,a3
; sra 16,a3 ;Y about X
; add a5,a7
; sra 16,a7 ;Z about X
;
;
; move COSAY,a0
; move SINAY,a2
; move a7,a9
; move a1,a5
; mpys a0,a7 ;Cos*Z
; mpys a2,a5 ;Sin*X
; sub a5,a7
; jrgt #next ;Z behind me?
; sra 16,a7 ;Z about Y
;
; mpys a2,a9 ;Sin*Z
; mpys a0,a1 ;Cos*X
; add a9,a1
; sra 16,a1 ;X about Y
; move a7,*a6(D3ZTEMP)
move a11,*a6(D3XPTS),L
addk 16,a11
move *a6(D3PTS),a2,L
move *a2,a2 ;#Pts
sll 4,a2 ;*16
add a2,a11 ;*48
add a2,a11
add a2,a11
movi d3vis_p,a8
move *a8,*a6,L ;Point me to next
move a6,*a8,L ;Point head to me
#next move *a4+,a6,L
jrnz #lp
PULL b2,b3,b4,b5,b6
PULL a8,a9,a10
rets
#*******************************
* Xform objects on visable list relative to view point
SUBRP _3d_xformrelview
PUSH a8,a9,a10
PUSH b2,b3,b4,b5,b6,b7,b8
move @viewx,a12,L
move @viewy,a13,L
move @viewz,a14,L
sra 8,a12
sra 8,a13
sra 8,a14
move @viewza,a0
callr sinecos_get
move a1,COSAZ ;B0=Cos AZ
move a0,SINAZ ;B1=Sine AZ
move @viewxa,a0
callr sinecos_get
move a1,COSAX ;B2=Cos AX
move a0,SINAX ;B3=Sine AX
move @viewya,a0
callr sinecos_get
move a1,COSAY ;B4=Cos AY
move a0,SINAY ;B5=Sine AY
movi d3vis_p,b8
jruc #next
#lp move b8,a4
move *a4(D3XPTS),a4,L ;A4=*Orig pts
move *a4+,a0 ;Get # points
move a4,a6 ;A6=*Dest pts
move a0,b6
#objlp
move *a4+,a1 ;X
move a1,a3
move COSAZ,a0
mpys a0,a1 ;Cos*X
move *a4+,a5 ;Y
move a5,a7
move SINAZ,a2
mpys a2,a5 ;Sine*Y
sub a5,a1
sra 16,a1 ;X about Z
mpys a2,a3 ;Sine*X
mpys a0,a7 ;Cos*Y
add a7,a3
sra 16,a3 ;Y about Z
move a3,a7
move COSAX,a0
move SINAX,a2
mpys a0,a3 ;Cos*Y
mpys a2,a7 ;Sin*Y
move *a4+,a9 ;Z
move a9,a5
mpys a2,a9 ;Sin*Z
mpys a0,a5 ;Cos*Z
sub a9,a3
sra 16,a3 ;Y about X
add a5,a7
sra 16,a7 ;Z about X
move COSAY,a0
move SINAY,a2
move a7,a9
move a1,a5
mpys a0,a7 ;Cos*Z
mpys a2,a5 ;Sin*X
sub a5,a7
sra 16,a7 ;Z about Y
mpys a2,a9 ;Sin*Z
mpys a0,a1 ;Cos*X
add a9,a1
sra 16,a1 ;X about Y
move a1,*a6+ ;New X
move a3,*a6+ ;New Y
move a7,*a6+ ;New Z
dsj b6,#objlp
#next move *b8+,b8,L
jrnz #lp
PULL b2,b3,b4,b5,b6,b7,b8
PULL a8,a9,a10
rets
#*******************************
* Transform a set of XYZ points then add offset
* A0=*Obj 3D Points
* A1=*Mem for xformed pts
* A8=Angle 0-255 about Z
* A9=Angle 0-255 about X
* A10=Angle 0-255 about Y
* A12-A14=XYZ offsets after xform
* Trashes A0-A7,B0-B1
;x=x*cos(az)-y*sin(az)
;y=x*sin(az)+y*cos(az)
;y=y*cos(ax)-z*sin(ax)
;z=y*sin(ax)+z*cos(ax)
;z=z*cos(ay)-x*sin(ay)
;x=z*sin(ay)+x*cos(ay)
;COSAZ .equ b0
;SINAZ .equ b1
;COSAX .equ b2
;SINAX .equ b3
;COSAY .equ b4
;SINAY .equ b5
SUBR _3d_xformoffset
PUSH a8,a9
PUSH b2,b3,b4,b5,b6
move a0,a4 ;A4=*Orig pts
move a1,a6 ;A6=*Dest pts
move *a4+,a0 ;Get # points
move a0,*a6+ ;Copy #
move a0,b6
;Quicker!!
move a8,a0
callr cos_get
move a0,COSAZ ;B0=Cos AZ
move a8,a0
callr sine_get
move a0,SINAZ ;B1=Sine AZ
move a9,a0
callr cos_get
move a0,COSAX ;B2=Cos AX
move a9,a0
callr sine_get
move a0,SINAX ;B3=Sine AX
move a10,a0
callr cos_get
move a0,COSAY ;B4=Cos AY
move a10,a0
callr sine_get
move a0,SINAY ;B5=Sine AY
#lp
move *a4+,a1 ;X
move a1,a3
move COSAZ,a0
mpys a0,a1 ;Cos*X
move *a4+,a5 ;Y
move a5,a7
move SINAZ,a2
mpys a2,a5 ;Sine*Y
sub a5,a1
sra 16,a1 ;X about Z
mpys a2,a3 ;Sine*X
mpys a0,a7 ;Cos*Y
add a7,a3
sra 16,a3 ;Y about Z
move a3,a7
move COSAX,a0
move SINAX,a2
mpys a0,a3 ;Cos*Y
mpys a2,a7 ;Sin*Y
move *a4+,a9 ;Z
move a9,a5
mpys a2,a9 ;Sin*Z
mpys a0,a5 ;Cos*Z
sub a9,a3
sra 16,a3 ;Y about X
add a5,a7
sra 16,a7 ;Z about X
move COSAY,a0
move SINAY,a2
move a7,a9
move a1,a5
mpys a0,a7 ;Cos*Z
mpys a2,a5 ;Sin*X
sub a5,a7
sra 16,a7 ;Z about Y
mpys a2,a9 ;Sin*Z
mpys a0,a1 ;Cos*X
add a9,a1
sra 16,a1 ;X about Y
add a12,a1 ;>Add position offset
add a13,a3
add a14,a7
move a1,*a6+ ;New X
move a3,*a6+ ;New Y
move a7,*a6+ ;New Z
dsj b6,#lp
PULL b2,b3,b4,b5,b6
PULL a8,a9
rets
#*******************************
* Transform a set of XYZ points relative to 0,0,0
* A0=*Obj 3D Points
* A1=*Mem for xformed pts
* A8=Angle 0-255 about Z
* A9=Angle 0-255 about X
* A10=Angle 0-255 about Y
* Trashes A0-A7,B0-B1
SUBR _3d_xformrel0
PUSH a8,a9
PUSH b2,b3,b4,b5,b6
move a0,a4 ;A4=*Orig pts
move a1,a6 ;A6=*Dest pts
move *a4+,a0 ;Get # points
move a0,*a6+ ;Copy #
move a0,b6
;Quicker!!
move a8,a0
callr cos_get
move a0,COSAZ ;B0=Cos AZ
move a8,a0
callr sine_get
move a0,SINAZ ;B1=Sine AZ
move a9,a0
callr cos_get
move a0,COSAX ;B2=Cos AX
move a9,a0
callr sine_get
move a0,SINAX ;B3=Sine AX
move a10,a0
callr cos_get
move a0,COSAY ;B4=Cos AY
move a10,a0
callr sine_get
move a0,SINAY ;B5=Sine AY
#lp
move *a4+,a1 ;X
move a1,a3
move COSAZ,a0
mpys a0,a1 ;Cos*X
move *a4+,a5 ;Y
move a5,a7
move SINAZ,a2
mpys a2,a5 ;Sine*Y
sub a5,a1
sra 16,a1 ;X about Z
mpys a2,a3 ;Sine*X
mpys a0,a7 ;Cos*Y
add a7,a3
sra 16,a3 ;Y about Z
move a3,a7
move COSAX,a0
move SINAX,a2
mpys a0,a3 ;Cos*Y
mpys a2,a7 ;Sin*Y
move *a4+,a9 ;Z
move a9,a5
mpys a2,a9 ;Sin*Z
mpys a0,a5 ;Cos*Z
sub a9,a3
sra 16,a3 ;Y about X
add a5,a7
sra 16,a7 ;Z about X
move COSAY,a0
move SINAY,a2
move a7,a9
move a1,a5
mpys a0,a7 ;Cos*Z
mpys a2,a5 ;Sin*X
sub a5,a7
sra 16,a7 ;Z about Y
mpys a2,a9 ;Sin*Z
mpys a0,a1 ;Cos*X
add a9,a1
sra 16,a1 ;X about Y
move a1,*a6+ ;New X
move a3,*a6+ ;New Y
move a7,*a6+ ;New Z
dsj b6,#lp
PULL b2,b3,b4,b5,b6
PULL a8,a9
rets
********************************
* Transform a set of XYZ points relative to an XYZ pt
* A0=*Obj 3D Points
* A1=*Mem for xformed pts
* A8=Angle 0-255 about Z
* A9=Angle 0-255 about X
* A10=Angle 0-255 about Y
* A12-A14=XYZ relative pt
* Trashes A0-A7,B0-B1
SUBR _3d_xformrel
PUSH a8,a9
PUSH b2,b3,b4,b5,b6
move a0,a4 ;A4=*Orig pts
move a1,a6 ;A6=*Dest pts
move *a4+,a0 ;Get # points
move a0,*a6+ ;Copy #
move a0,b6
;Quicker!!
move a8,a0
callr cos_get
move a0,COSAZ ;B0=Cos AZ
move a8,a0
callr sine_get
move a0,SINAZ ;B1=Sine AZ
move a9,a0
callr cos_get
move a0,COSAX ;B2=Cos AX
move a9,a0
callr sine_get
move a0,SINAX ;B3=Sine AX
move a10,a0
callr cos_get
move a0,COSAY ;B4=Cos AY
move a10,a0
callr sine_get
move a0,SINAY ;B5=Sine AY
dxrlp
move *a4+,a1 ;X
sub a12,a1 ;-Base X
move a1,a3
move COSAZ,a0
mpys a0,a1 ;Cos*X
move *a4+,a5 ;Y
sub a13,a5 ;-Base Y
move a5,a7
move SINAZ,a2
mpys a2,a5 ;Sine*Y
sub a5,a1
sra 16,a1 ;X about Z
mpys a2,a3 ;Sine*X
mpys a0,a7 ;Cos*Y
add a7,a3
sra 16,a3 ;Y about Z
move a3,a7
move COSAX,a0
move SINAX,a2
mpys a0,a3 ;Cos*Y
mpys a2,a7 ;Sin*Y
move *a4+,a9 ;Z
sub a14,a9 ;-Base Z
move a9,a5
mpys a2,a9 ;Sin*Z
mpys a0,a5 ;Cos*Z
sub a9,a3
sra 16,a3 ;Y about X
add a5,a7
sra 16,a7 ;Z about X
move COSAY,a0
move SINAY,a2
move a7,a9
move a1,a5
mpys a0,a7 ;Cos*Z
mpys a2,a5 ;Sin*X
sub a5,a7
sra 16,a7 ;Z about Y
mpys a2,a9 ;Sin*Z
mpys a0,a1 ;Cos*X
add a9,a1
sra 16,a1 ;X about Y
move a1,*a6+ ;New X
move a3,*a6+ ;New Y
move a7,*a6+ ;New Z
dsj b6,dxrlp
PULL b2,b3,b4,b5,b6
PULL a8,a9
rets
#*******************************
* Scale XY by Z and adjust for display
* A0=*Xformed XYZ Points
* Trashes A0-A7
SUBRP _3d_scalexy
PUSH a8,a9
move *a0+,a7 ;Get # points
jrle #x ;Necessary???
move a0,a2
move a7,a3
#lp addk 16*2,a2
move *a2+,a1 ;Z
jrlt #avis ;Any visable?
dsj a3,#lp
move a3,-*a0 ;Set # pts 0 so it won't be shown
jruc #x ;No pts visable
#avis
movi >7fff,a8
movi ->7fff,a9
#lp2
move a0,a6
move *a0+,a1 ;X
move *a0+,a3 ;Y
neg a3 ;Flip Y
move *a0+,a2 ;Z
jrn #vis ;Visable?
addi 512,a2
mpys a2,a1
mpys a2,a3
sra 9,a1 ;/512, make big
sra 9,a3
cmp a8,a1
jrle #xhok ;Not maxed?
move a8,a1
#xhok
cmp a9,a1
jrge #xlok ;Not mined?
move a9,a1
#xlok
jruc #set
#vis abs a2
addi 512,a2
sll 9,a1 ;*512
sll 9,a3
divs a2,a1 ;Scale down for Z distance
divs a2,a3
#set addi 127,a3 ;Center Y
move a1,*a6+ ;New X
move a3,*a6+ ;New Y
dsj a7,#lp2
#x PULL a8,a9
rets
; movi 4000,a4 ;Vanishing pt
; add a2,a4
; jrgt dsxy50
; clr a1
; clr a3
; jruc dsxy100
;dsxy50
; mpys a4,a1 ;Scale down for Z distance
; mpys a4,a3
; sra 10,a1 ;/4096
; sra 10,a3
#*******************************
* Read players button (Process)
SUBRP plyr_readbut
#lp SLEEPK 1
move @shield,a0
jrn #dead
.if TUNIT
move @SWITCH,a0
btst 4,a0
.else
move @SWITCH+16,a0
btst 12,a0
.endif
jrnz #lp ;No joy1 but1?
CREATE0 plyr_msl
SLEEPK 5
jruc #lp
#dead
movi REDPAL,a0
calla pal_getf
move a0,a6
movi #dead_s,a8
clr a0
movi [100,200],a9
movk 1,a10
movi osgfont_t,a11
JSRP STRCNRMO_1
SLEEP TSEC*3/BOGRATE
jruc pldead
#dead_s .byte "YOU ARE DEAD!",0
.even
#*******************************
* Fire a missile from player (Process)
SUBRP plyr_msl
movi plfiresnd,a0
calla snd_play1
move @viewx,a0,L ;24:8
move @viewy,a1,L
move @viewz,a2,L
move @viewxa,a3
move @viewya,a4
not a4
move @viewza,a5
movi pmsl_pts,a6
movi pmslline_t,a7
callr _3d_beginobj ;Get shell
movi CLSPLYR|TYPPSHOT,a0
move a0,*a8(D3ID)
move @viewya,a0 ;>Move forward
callr sinecos_get
move a0,*a8(D3XV),L
neg a1
move a1,*a8(D3ZV),L
SLEEP 60*2
callr _3d_freeobj
DIE
#*******************************
* Player shot hit an obj
* A8=*3D object
SUBRP pl_shot_hit
move *a8(D3PLINK),a14,L
movk 1,a0
move a0,*a14(PTIME) ;Wake it up so it can die
rets
#*******************************
* Create random enemies (Process)
SUBRP en_spawner
#lp
movi -1000<<8,a10
movi 12000<<8,a11
CREATE0 en_tank
SLEEP TSEC*8/BOGRATE
jruc #lp
#*******************************
* Enemy fire randomly (Process)
SUBRP en_fire
;#lp SLEEPK 5
; movk 2,a0
; callr rndrng0
; move a0,a0
; jrnz #lp ;Wait?
;
;
; CREATE0 en_msl
;
; SLEEPK 5
; jruc #lp
#*******************************
* Fire a shell from an enemy (Process)
* A8=*3D object
* A10=Dir (0-255)
STRUCTPD
WORD ens_hit ;!0=Shell collided with obj
HITRNG .equ 450<<8
SUBRP en_shell
movi enfiresnd,a0
calla snd_play1
clr a0
move a0,*a13(ens_hit)
move *a8(D3X),a0,L
move *a8(D3Y),a1,L
move *a8(D3Z),a2,L
clr a3
move a10,a4
not a4
clr a5
movi enmsl_pts,a6
movi enmslline_t,a7
callr _3d_beginobj ;Get shell
movi CLSENMY|TYPSHELL,a0
move a0,*a8(D3ID)
move a10,a0
callr sinecos_get
sll 1,a0 ;*2
move a0,*a8(D3XV),L
neg a1
sll 1,a1 ;*2
move a1,*a8(D3ZV),L
movi TSEC*2/2,a11
#slp SLEEPK 2
move *a13(ens_hit),a0
jrnz #xpld ;Hit something?
move *a8(D3X),a0,L
move @viewx,a1,L
sub a0,a1
abs a1
cmpi HITRNG,a1
jrgt #nxt
move *a8(D3Z),a0,L
move @viewz,a1,L
sub a0,a1
abs a1
cmpi HITRNG,a1
jrle #hitpl ;Nail player
#nxt
dsj a11,#slp
#xpld
callr _3d_freeobj
DIE
#hitpl
callr _3d_freeobj
move @shield,a0
subk 1,a0
move a0,@shield
movi plhit_snd,a0
calla snd_play1
movi -1,a0
move a0,@IRQSKYE
SLEEPK 3
movk 6,a0
move a0,@IRQSKYE
DIE
#*******************************
* Enemy shell hit an obj
* A8=*3D object
SUBRP en_shell_hit
move *a8(D3PLINK),a14,L
movk 1,a0
; move a0,*a14(PTIME) ;Wake it up so it can die
move a0,*a14(ens_hit)
rets
#*******************************
* Enemy tank (Process)
* A10=X (24:8)
* A11=Z
STRUCTPD
WORD tnk_dir ;Dir 0-255
WORD tnk_sdir ;Seek dir 0-255
SUBRP en_tank
move a10,a0
movi 80<<8,a1
move a11,a2
clr a3
clr a4
clr a5
movi tanktur_pts,a6
movi tankturline_t,a7
callr _3d_beginobj ;Get turret
move a8,a9
movi CLSENMY|TYPTANK,a0
move a0,*a8(D3ID)
move a10,a0
movi 40<<8,a1
movi tanklow_pts,a6
movi tanklowline_t,a7
callr _3d_beginobj ;Get chassie
movi CLSENMY|TYPTANK,a0
move a0,*a8(D3ID)
movk 3,a0
callr rndrng0
addk 1,a0
move a0,a11 ;A11=Turn speed
#lp
movi >1f,a0
callr rnd
jrnz #noseek
move @viewx,a6,L ;24:8
move @viewz,a7,L
callr seekob_dir256
move a0,*a13(tnk_sdir)
#noseek
move *a13(tnk_sdir),a0
move *a13(tnk_dir),a7
sub a7,a0 ;A0=Difference
jrz #noturn
move a0,a1
abs a0
move a0,a14
subi 128,a0
jrle #350
neg a1
#350
cmp a11,a14
jrge #big
add a1,a7
jruc #mskt
#big
move a1,a1
jrnn #360
sub a11,a7
jruc #mskt
#360 add a11,a7
#mskt
sll 32-8,a7 ;Make 0-255
srl 32-8,a7
move a7,*a13(tnk_dir)
move a7,a0
callr sinecos_get
sra 1,a0 ;/2
move a0,*a8(D3XV),L
move a0,*a9(D3XV),L
sra 1,a1 ;/2
neg a1
move a1,*a8(D3ZV),L
move a1,*a9(D3ZV),L
not a7
move a7,*a8(D3YA)
move a7,*a9(D3YA)
#noturn
movk >7,a0
callr rnd
jrnz #nofire
move @viewx,a6,L ;24:8
move @viewz,a7,L
callr seekob_dir256
move *a13(tnk_dir),a10
cmp a0,a10
jrne #nofire ;!Facing player?
CREATE0 en_shell
#nofire SLEEPK 1
jruc #lp
#*******************************
* Kill enemy tank (Process)
* A8=*Tank chassie obj
* A9=*Tank turret obj
SUBRP en_tank_die
movi tankexpsnd,a0
calla snd_play1
movi 130<<8,a0
move a0,*a8(D3YV),L
movi 150<<8,a0
move a0,*a9(D3YV),L
movk 30,a11
#lp move *a8(D3XA),a0
addk 30,a0
move a0,*a8(D3XA)
move *a8(D3YA),a0
addk 20,a0
move a0,*a8(D3YA)
move *a8(D3ZA),a0
addk 15,a0
move a0,*a8(D3ZA)
move *a8(D3YV),a0,L
subi 10<<8,a0
move a0,*a8(D3YV),L
move *a9(D3YV),a0,L
subi 10<<8,a0
move a0,*a9(D3YV),L
SLEEPK 1
dsj a11,#lp
callr _3d_freeobj
move a9,a8
callr _3d_freeobj
DIE
#*******************************
* Enemy tank hit an obj
* A8=*Tank object
SUBRP en_tank_hit
move *a8(D3PLINK),a14,L
movi en_tank_die,a0
move a0,*a14(PWAKE),L ;Death routine
clr a0
move a0,*a14(PROCID)
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
********************************
* Quickly produce a random # in range 0-X
* A0=X
* >A0=Random # (0 to A0) (No CC)
* Trashes scratch
SUBRP rndrng0
move @RAND,a1,L
rl a1,a1
move @HCOUNT,a14
rl a14,a1
add sp,a1
move a1,@RAND,L
addk 1,a0
mpyu a1,a0 ;Condition codes not valid!
rets
********************************
* Get velocity to move towards an object
SUBRP seekob_vel ;A0=*Dest obj, A3=Vel, A8=*Src obj
PUSH a0
move *a0(OXPOS),a6 ;Get X
move *a0(OSIZEX),a2
srl 1,a2
add a2,a6 ;Center X
move *a0(OYPOS),a7 ;Get Y
move *a0(OSIZEY),a2
srl 1,a2
add a2,a7 ;Center Y
sll 16,a6
sll 16,a7
move *a8(OXPOS),a0 ;Get X
move *a8(OSIZEX),a2
srl 1,a2
add a2,a0 ;Center X
move *a8(OYPOS),a1 ;Get Y
move *a8(OSIZEY),a2
srl 1,a2
add a2,a1 ;Center Y
sll 16,a0
sll 16,a1
sub a0,a6 ;DestX-SrcX
sub a1,a7 ;DestY-SrcY
sov60 sra 1,a6 ;>Scale down to A3
sra 1,a7
move a6,a2
abs a2
cmp a3,a2 ;A6&A7 < A3
jrgt sov60
move a7,a2
abs a2
cmp a3,a2
jrgt sov60
move a6,a4 ;>Fine scale up to A3
move a7,a5
sra 4,a4 ;/16
sra 4,a5
jrnz sov150
move a4,a4
jrz sov200 ;Both 0 then skip
sov150 add a4,a6
add a5,a7
move a6,a2
abs a2
cmp a3,a2
jrgt sov200
move a7,a2
abs a2
cmp a3,a2
jrle sov150
sov200
PULL a0
rets ;>A6=XV, A7=YV
#*******************************
* Get dir to face an object
* A6=Dest X
* A7=Dest Z
* A8=*Source 3D obj
* >A0=0-255
* Trashes A0-A2,A14
SUBRP seekob_dir256
move *a8(D3X),a0,L ;Get SX
move *a8(D3Z),a1,L ;Get SZ
clr a2 ;Octant 0-1
sub a6,a0 ;A0=SrcX-DestX
jrgt #100
abs a0
sub a7,a1 ;A1=SrcY-DestY
jrnn #oct01
movk 8,a2 ;Oct 2-3
abs a1
jruc #160
#100 movk 16,a2 ;Oct 4-5
sub a7,a1 ;A1=SrcY-DestX
abs a1
jrnn #200
movk 16+8,a2 ;Oct 6-7
#160 SWAP a0,a1
#200 sll 3,a2 ;Oct*8
#oct01 clr a14
cmp a1,a0 ;>Cmp slope
jrhs #300
srl 2+3,a1 ;Bigger/32
jruc #250
#lp1 addk 1,a2 ;Next 1/32 oct
add a1,a14 ;+1/32
#250 cmp a0,a14
jrlo #lp1
jruc #x
#300 addi 63,a2 ;End of next octant
srl 2+3,a0 ;Bigger/32
jruc #350
#lp2 subk 1,a2 ;Next 1/32 oct
add a0,a14 ;+1/32
#350 cmp a1,a14
jrlo #lp2
#x movi >ff,a0
and a2,a0
rets
********************************
* Get sine or cosine
* A0=Angle (0-255)
* >A0=0-16384*4
SUBRP cos_get
sll 32-8,a0
srl 32-8-4,a0 ;*16
addi cos_t,a0
move *a0,a0
sll 2,a0 ;*4
rets
SUBRP sine_get
sll 32-8,a0
srl 32-8-4,a0 ;*16
addi sine_t,a0
move *a0,a0
sll 2,a0 ;*4
rets
********************************
* Get sine and cosine
* A0=Angle (0-255)
* >A0=Sine (0-16384*4)
* >A1=Cos (0-16384*4)
SUBRP sinecos_get
sll 32-8,a0
srl 32-8-4,a0 ;*16
addi sine_t,a0
move *a0(cos_t-sine_t),a1
move *a0,a0
sll 2,a0 ;*4
sll 2,a1 ;*4
rets
sine_t
.word 0,402,803,1205,1605,2005,2404,2801
.word 3196,3589,3981,4369,4756,5139,5519,5896
.word 6270,6639,7005,7366,7723,8075,8423,8765
.word 9102,9434,9760,10080,10394,10701,11003,11297
.word 11585,11866,12140,12406,12665,12916,13160,13395
.word 13623,13842,14053,14255,14449,14635,14811,14978
.word 15137,15286,15426,15557,15678,15790,15893,15986
.word 16069,16143,16207,16261,16305,16340,16364,16379
cos_t
.word 16384,16379,16364,16340,16305,16261,16207,16143
.word 16069,15986,15893,15791,15679,15557,15426,15286
.word 15137,14978,14811,14635,14449,14256,14053,13842
.word 13623,13395,13160,12916,12665,12406,12140,11866
.word 11585,11297,11003,10702,10394,10080,9760,9434
.word 9102,8765,8423,8076,7723,7366,7005,6639
.word 6270,5896,5519,5139,4756,4370,3981,3590
.word 3196,2801,2404,2005,1606,1205,804,402
.word 0,-401,-803,-1205,-1605,-2005,-2403,-2800
.word -3196,-3589,-3980,-4369,-4755,-5139,-5519,-5896
.word -6269,-6639,-7005,-7366,-7723,-8075,-8423,-8765
.word -9102,-9434,-9760,-10080,-10394,-10701,-11002,-11297
.word -11585,-11866,-12139,-12406,-12665,-12916,-13160,-13395
.word -13623,-13842,-14053,-14255,-14449,-14634,-14811,-14978
.word -15137,-15286,-15426,-15557,-15678,-15790,-15893,-15986
.word -16069,-16143,-16207,-16261,-16305,-16340,-16364,-16379
.word -16384,-16379,-16364,-16340,-16305,-16261,-16207,-16143
.word -16069,-15986,-15893,-15791,-15679,-15557,-15426,-15286
.word -15137,-14979,-14811,-14635,-14449,-14256,-14053,-13842
.word -13623,-13395,-13160,-12916,-12665,-12406,-12140,-11866
.word -11585,-11298,-11003,-10702,-10394,-10080,-9760,-9434
.word -9103,-8765,-8423,-8076,-7723,-7366,-7005,-6640
.word -6270,-5897,-5520,-5139,-4756,-4370,-3981,-3590
.word -3196,-2801,-2404,-2006,-1606,-1205,-804,-402
.word 0,402,803,1205,1605,2005,2404,2801
.word 3196,3589,3981,4369,4756,5139,5519,5896
.word 6270,6639,7005,7366,7723,8075,8423,8765
.word 9102,9434,9760,10080,10394,10701,11003,11297
.word 11585,11866,12140,12406,12665,12916,13160,13395
.word 13623,13842,14053,14255,14449,14635,14811,14978
.word 15137,15286,15426,15557,15678,15790,15893,15986
.word 16069,16143,16207,16261,16305,16340,16364,16379
#*******************************
* Build lists and collide based on X
* A6=XMin
* A7=XMax (+1)
SUBRP _3d_collide
movi d3world_t,a3 ;World table to check
movi pcoll_t,a9 ;Build collision lists
movi ecoll_t,a10
movi ncoll_t,a11
move a9,b4 ;Set A5/B4 for 1st collision call
move a10,a5
jruc #next
#enmy move a0,*a10+,L ;Insert on enemy list
#next move *a3+,a0,L ;Get next obj
jrz #end
move *a0(D3ID),a14
jrz #next ;Not collideable?
; move *a0(OXPOS),a1 ;Obj can lie on max/min boundary
; cmp a7,a1
; jrge #next ;Out of range?
;
; move *a0(OSIZEX),a2
; add a2,a1
; cmp a6,a1
; jrle #next ;Out of range?
move a14,a14 ;Check Class
jrn #enmy ;Enemy?
btst 14,a14
jrnz #plyr ;Player?
move a0,*a11+,L ;Insert on neutral list
jruc #next
#plyr move a0,*a9+,L ;Insert on player list
jruc #next
#end move a0,*a9,L ;Null terminate each list
move a0,*a10,L
move a0,*a11,L
callr collidelists ;Collide enemy to player
movi ncoll_t,a5
movi ecoll_t,b4
callr collidelists ;Collide neutral to enemy
movi ncoll_t,a5
movi pcoll_t,b4
; jruc collidelists ;Collide neutral to player
;Fall through
#*******************************
* Collide objects on list A5 with those on LIST B4
* A5,B4=ptrs to null terminated tables of object ptrs
collidelists
#lp move *a5+,a1,L
jrz #x
;Load up coors of obj from first list
move *a1(D3X),a9,L ;A9=OBJ1 Xmin
; jrz #lp ;Deleted?
subi 100<<8,a9
; move *a1(D3XS),a10 ;A10=OBJ1 Xmax (+1)
movi 200<<8,a10
add a9,a10
move *a1(D3Z),a7,L ;A7=OBJ1 Ymin
subi 100<<8,a7
; move *a1(OSIZEY),a11 ;A11=OBJ1 Ymax (+1)
movi 200<<8,a11
add a7,a11
move b4,a6 ;Load head of second list
#lp2 move *a6+,a2,L
jrz #lp
move *a2(D3Z),a0,L ;Check objs A1,A2 for intersection
subi 100<<8,a0
cmp a11,a0
jrge #lp2 ;Y2Min >= Y1Max?
movi 200<<8,a14
; move *a2(OSIZEY),a14
add a14,a0
cmp a7,a0
jrle #lp2 ;Y2Max <= Y1Min?
move *a2(D3X),a0,L ;Signed compares because objs may lie on 0
; jrz #lp2 ;Deleted?
subi 100<<8,a0
cmp a10,a0
jrge #lp2 ;X2Min >= X1Max?
movi 200<<8,a14
; move *a2(OSIZEX),a14
add a14,a0
cmp a9,a0
jrle #lp2 ;X2Max <= X1Min?
callr ColFunc ;>Call colfunc for obj A1 and A2
move b0,b1 ;B1=*Collision routine for obj A1
SWAP a1,a2
callr ColFunc
SWAP a1,a2
move b0,b2 ;B2=*Collision routine for obj A2
or b1,b0 ;Set z flag if both are zero
jrz #lp2
clr a0
move a0,@d3collstop ;Clr flag
move b1,b1
jrz pobj2col
move a1,a8
move a2,a0
call b1 ;Call collision for A1
pobj2col
move b2,b2
jrz pckfree
move a2,a8
move a1,a0
call b2 ;Call collision for A2
pckfree move @d3collstop,a0
jrz #lp2 ;Continue scan?
jruc #lp
#x rets
****************************************************************************
* Return in B0 routine for obj A1 struck by obj A2
* Trashes A3-A4
ColFunc
movb *a1(D3ID+8),a3
movb *a2(D3ID+8),a4
sll 32-5,a3
srl 17,a3 ;32 Long Word Align
sll 32-5,a4
srl 22,a4 ;Long Align
add a4,a3
addi typetbl,a3
move *a3,a3,L
jump a3 ;Routine can trash A0/A3/A4/A8/A14
****************************************************************************
* These are the COLLISION FUNCTIONS
* A collision function is selected by the routine ColFunc
* which uses the TYPE field of the victims OID to select a subtable
* and indexes the subtable with the TYPE field of the killer.
* This gives a ptr to a COLLISION FUNCTION which returns
* the COLLISION ROUTINE to be called for the victim in B0.
* The COLLISION FUNCS can destroy registers A0,A3,A4,A8
****************************************************************************
typetbl
;0000
;NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;100
;Player
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;200
;Player shot
.LONG NULL, NULL, NULL, PSGO, PSTK, PSSH, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;300
;Ground obstacle
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;400
;Tank
.LONG NULL, NULL, TKPS, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;500
;Shell
.LONG NULL, NULL, SHPS, SHGO, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;600
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;700
;Text
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;800
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;900
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;a00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;b00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;c00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;d00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;e00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;f00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1000
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1100
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1200
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1300
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1400
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1500
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1600
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1700
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1800
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1900
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1a00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1b00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1c00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1d00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1e00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
;1f00
;Free
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
.LONG NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
********************************
* Shawn's enemy type collisons
;SLPL movb *a1(OID),a0
; cmpi SUBSHRAP,a0
; jreq NULL ;Shrapnel?
; subk SUBMSL,a0
; jreq slpl5 ;Missile?
; movb *a2(OID),a0 ;Player ring
; subk 3,a0
; jrne NULL
;slpl5
;; movi slt_ringhit,b0
; rets
;
;SLBL movb *a1(OID),a0
; subk SUBSHRAP,a0
; jreq NULL ;Shrapnel?
;; movi slt_hit,b0 ;Bullet
; rets
;
;SLBB movb *a1(OID),a0
; subk SUBSHRAP,a0
; jreq NULL ;Shrapnel?
;; movi slt_bbhit,b0 ;Blade, bomb
; rets
;
;BLSL movb *a2(OID),a0
; subk SUBMSL,a0
;; jrne BLHU ;!Missile?
;; movi KILL_BULL2,b0
; rets
NULL clr b0
rets
PSGO
PSTK
PSSH
movi pl_shot_hit,b0
rets
TKPS
movi en_tank_hit,b0
rets
SHPS
SHGO
movi en_shell_hit,b0
rets
; move *a1(OZPOS),a0
; move *a2(OZPOS),a14
; sub a14,a0
; move a0,a3
; abs a3
; cmpi 30,a3
; jrhi NULL ;Not in range?
;
; movi ball_hit,b0
; rets
#***************************************************************
* Display secret embedded copyright notice (Process)
STRUCTPD
STRUC cpm_s ,8*80
SUBRP copyright_prtmsg
movi #cr1_s,a1
movi [50,200],a9
JSRP copyright_prt
movi #cr2_s,a1
movi [80,200],a9
JSRP copyright_prt
movi #cr3_s,a1
movi [110,200],a9
JSRP copyright_prt
movi #cr4_s,a1
movi [140,200],a9
JSRP copyright_prt
SLEEP TSEC*20/BOGRATE
jruc pldead
copyright_prt
movk 2,a3 ;>Decode string
move a13,a2
addi cpm_s,a2
setf 8,0,0
#lp
move *a1+,a0
sub a3,a0 ;-encode value
move a0,*a2+
addi 37,a3
sll 32-8,a0
jrnz #lp
setf 16,1,0
movi GOLD,a0 ;>Print string
calla pal_getf
move a0,a6
move a13,a8
addi cpm_s,a8
clr a0
movk 1,a10
movi osgfont_t,a11
JSRP STRCNRMO_1
RETP
ASCIIE .macro str
.var i,c,e
.eval 1,i
.eval 2,e
.loop $symlen(str)
.asg :str(i):,c
.byte 0ffh & (':c:'+e)
.eval i+1,i
.eval e+37,e
.endloop
.byte 0ffh & :e:
.endm
#cr1_s ASCIIE "NBA-JAM"
#cr2_s ASCIIE "COPYRIGHT-1993"
#cr3_s ASCIIE "MIDWAY-MANUFACTURING-COMPANY"
#cr4_s ASCIIE "ALL-RIGHTS-RESERVED"
.end