2951 lines
52 KiB
NASM
2951 lines
52 KiB
NASM
|
**************************************************************
|
|||
|
*
|
|||
|
* 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
|
|||
|
|