mirror of https://github.com/earok/GloomAmiga.git
10349 lines
148 KiB
Plaintext
10349 lines
148 KiB
Plaintext
|
|
;*********
|
|
;* GLOOM *
|
|
;*********
|
|
;
|
|
;error codes
|
|
;
|
|
;red - allocmem failed
|
|
;yel - freemem failed
|
|
;orange - unknown script command
|
|
;purp - unknown event command
|
|
;cyn - can't open file in loadfile
|
|
;blu - ran out of remap colours!
|
|
;
|
|
debugser equ 0
|
|
debugmem equ 0
|
|
onedemo equ 0
|
|
aga equ -1
|
|
;
|
|
maxobjects equ 256 ;max objects in game
|
|
maxdoors equ 16 ;max doors opening at once
|
|
maxblood equ 128 ;max droplets of bluuurd
|
|
maxgore equ 128 ;body parts on ground!
|
|
maxrotpolys equ 16 ;max rotating thingys.
|
|
;
|
|
focshft equ 6
|
|
grdshft equ 8
|
|
darkshft equ 7 ;smaller=smaller range=faster!
|
|
maxz equ 16<<darkshft ;16*128=2048*8=16384
|
|
;
|
|
exshft equ 3 ;4
|
|
exone equ 1<<exshft
|
|
exhalf equ exone>>1
|
|
;
|
|
linemod equ 40*7
|
|
|
|
jmp entrypoint
|
|
|
|
rsreset
|
|
;
|
|
;rotpoly details...
|
|
;
|
|
rp_next rs.l 1
|
|
rp_prev rs.l 1
|
|
;
|
|
rp_speed rs.w 1
|
|
rp_rot rs.w 1
|
|
rp_flags rs.w 1 ;what to do?
|
|
;
|
|
rp_cx rs.w 1 ;only for rot
|
|
rp_cz rs.w 1
|
|
rp_first rs.l 1 ;pointer to first!
|
|
rp_num rs.w 1
|
|
;
|
|
rp_vx rs.w 0
|
|
rp_lx rs.w 1
|
|
rp_vz rs.w 0
|
|
rp_lz rs.w 1
|
|
rp_ox rs.w 0
|
|
rp_na rs.w 1
|
|
rp_oz rs.w 0
|
|
rp_nb rs.w 1
|
|
;
|
|
rp_more rs.b 8*15 ;=16 max verts!
|
|
;
|
|
rp_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;sfx channel info
|
|
;
|
|
fx_status rs.w 1
|
|
fx_priority rs.w 1
|
|
fx_sfx rs.l 1
|
|
fx_vol rs.w 1
|
|
fx_offset rs.w 1
|
|
fx_dma rs.w 1
|
|
fx_int rs.w 1
|
|
;
|
|
fx_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;blood!
|
|
;
|
|
bl_next rs.l 1
|
|
bl_prev rs.l 1
|
|
bl_x rs.l 1
|
|
bl_y rs.l 1
|
|
bl_z rs.l 1
|
|
bl_xvec rs.l 1
|
|
bl_yvec rs.l 1
|
|
bl_zvec rs.l 1
|
|
bl_color rs.l 1 ;colour and!
|
|
;
|
|
bl_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;a texture
|
|
;
|
|
te_pal rs.l 1
|
|
;
|
|
te_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;an opening/closing door!
|
|
;
|
|
do_next rs.l 1
|
|
do_prev rs.l 1
|
|
do_poly rs.l 1 ;door polygon
|
|
do_lx rs.w 1
|
|
do_lz rs.w 1
|
|
do_rx rs.w 1
|
|
do_rz rs.w 1
|
|
do_frac rs.w 1
|
|
do_fracadd rs.w 1
|
|
;
|
|
do_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;wall list...
|
|
;
|
|
wl_next rs.l 1
|
|
wl_lsx rs.w 1 ;leftmost screen X
|
|
wl_rsx rs.w 1 ;rightmost screen X
|
|
wl_nz rs.w 1 ;near Z!
|
|
wl_fz rs.w 1 ;far Z!
|
|
wl_lx rs.w 1
|
|
wl_lz rs.w 1
|
|
wl_rx rs.w 1
|
|
wl_rz rs.w 1
|
|
wl_a rs.w 1
|
|
wl_b rs.w 1
|
|
wl_c rs.l 1
|
|
wl_sc rs.w 1
|
|
wl_open rs.w 1 ;0=door shut, $4000=open!
|
|
wl_t rs.b 8 ;textures
|
|
;
|
|
wl_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;a zone...
|
|
;
|
|
zo_done rs.w 1
|
|
zo_lx rs.w 1
|
|
zo_lz rs.w 1
|
|
zo_rx rs.w 1
|
|
zo_rz rs.w 1
|
|
;
|
|
zo_a rs.w 1
|
|
zo_b rs.w 1
|
|
zo_na rs.w 1
|
|
zo_nb rs.w 1
|
|
zo_ln rs.w 1
|
|
;
|
|
zo_t rs.b 8 ;8 textures
|
|
;
|
|
zo_sc rs.w 1 ;scale (how many txts on wall)
|
|
zo_open rs.w 0 ;for wall polys...
|
|
zo_ev rs.w 1 ;for events...
|
|
;
|
|
zo_size rs.b 0 ;32!
|
|
|
|
rsreset
|
|
;
|
|
;a shape to draw!
|
|
;
|
|
sh_next rs.l 1
|
|
sh_prev rs.l 1
|
|
sh_x rs.w 1
|
|
sh_y rs.w 1
|
|
sh_z rs.w 1
|
|
sh_shape rs.l 1
|
|
sh_scale rs.w 0
|
|
sh_strip rs.l 1
|
|
;
|
|
sh_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;gore...body parts lying around!
|
|
;
|
|
go_next rs.l 1
|
|
go_prev rs.l 1
|
|
go_x rs.w 1
|
|
go_z rs.w 1
|
|
go_shape rs.l 1
|
|
;
|
|
go_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;an object in the game (player/alien etc...)
|
|
;
|
|
ob_next rs.l 1
|
|
ob_prev rs.l 1
|
|
ob_x rs.l 1
|
|
ob_y rs.l 1
|
|
ob_z rs.l 1
|
|
ob_rot rs.l 1
|
|
;
|
|
;start of info load by prog.
|
|
ob_info rs.b 0
|
|
;
|
|
ob_rotspeed rs.l 1
|
|
ob_movspeed rs.l 1
|
|
ob_shape rs.l 1
|
|
ob_logic rs.l 1
|
|
ob_render rs.l 1
|
|
ob_hit rs.l 1 ;routine to do when damaged
|
|
ob_die rs.l 1 ;routine to do when killed
|
|
ob_eyey rs.w 1 ;eye height
|
|
ob_firey rs.w 1 ;where bullets come from
|
|
ob_gutsy rs.w 1
|
|
ob_othery rs.w 1
|
|
ob_colltype rs.w 1
|
|
ob_collwith rs.w 1
|
|
ob_cntrl rs.w 1
|
|
ob_damage rs.w 1
|
|
ob_hitpoints rs.w 1
|
|
ob_think rs.w 1
|
|
ob_frame rs.l 1 ;anim frame
|
|
ob_framespeed rs.l 1 ;anim frame
|
|
ob_base rs.w 1
|
|
ob_range rs.w 1
|
|
ob_weapon rs.w 1 ;weapon meter...
|
|
ob_wlevel rs.w 1 ;weapon type (0...4)
|
|
ob_hurtpause rs.w 1
|
|
ob_firerate rs.w 0
|
|
ob_punchrate rs.w 1
|
|
ob_bouncecnt rs.w 1 ;how many times my bullets bounce!
|
|
ob_firecnt rs.w 0
|
|
ob_something rs.w 1
|
|
ob_scale rs.w 1 ;scale factor for drawing
|
|
ob_lastbut rs.w 1
|
|
ob_blood rs.w 1 ;color AND for blood
|
|
ob_ypad rs.w 1
|
|
;
|
|
ob_oldlogic rs.l 1
|
|
ob_oldlogic2 rs.l 1
|
|
ob_oldhit rs.l 1
|
|
ob_olddie rs.l 1
|
|
ob_oldrot rs.w 1
|
|
ob_newrot rs.w 1
|
|
ob_yvec rs.l 1
|
|
ob_xvec rs.l 1
|
|
ob_zvec rs.l 1
|
|
ob_radsq rs.l 1 ;radius squared
|
|
ob_rad rs.w 1
|
|
ob_delay rs.w 1
|
|
ob_delay2 rs.w 0
|
|
ob_bounce rs.w 1
|
|
ob_hurtwait rs.w 1
|
|
;
|
|
ob_washit rs.l 1 ;flag for un-hit coll detect!
|
|
ob_window rs.l 1 ;pointer back to window!
|
|
ob_nxvec rs.w 0 ;normalized X vec
|
|
ob_lives rs.w 1
|
|
ob_nzvec rs.w 0 ;nomralized z vec
|
|
ob_infra rs.w 1
|
|
ob_thermo rs.w 1
|
|
ob_invisible rs.w 1
|
|
ob_hyper rs.w 1
|
|
ob_update rs.w 1 ;update stats!
|
|
ob_mess rs.l 1 ;message
|
|
ob_messlen rs.w 1
|
|
ob_messtimer rs.w 1 ;timer for messages
|
|
ob_palette rs.l 1 ;palette for window
|
|
ob_paltimer rs.w 1 ;timer before back to normal
|
|
ob_pixsize rs.w 1
|
|
ob_pixsizeadd rs.w 1
|
|
ob_telex rs.w 1
|
|
ob_telez rs.w 1
|
|
ob_telerot rs.w 1
|
|
ob_chunks rs.l 1
|
|
;
|
|
ob_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;solid wall draw data
|
|
;
|
|
vd_z rs.w 1 ;current Z
|
|
vd_pal rs.w 1 ;palette# (0...15)
|
|
vd_y rs.w 1
|
|
vd_h rs.w 1
|
|
vd_data rs.l 1
|
|
vd_ystep rs.l 1
|
|
;
|
|
vd_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;palette file...
|
|
;
|
|
pa_numcols rs.w 1 ;how many colours
|
|
pa_cols rs.w 256 ;the colours!
|
|
|
|
rsreset
|
|
;
|
|
;anim file...
|
|
;
|
|
an_rotshft rs.w 1
|
|
an_frames rs.w 1
|
|
an_maxw rs.w 1
|
|
an_maxh rs.w 1
|
|
an_pal rs.l 1
|
|
;
|
|
an_size rs.b 0
|
|
|
|
rsreset
|
|
;
|
|
;window
|
|
;
|
|
wi_slice rs.l 1 ;slice window appears in!
|
|
wi_nslice rs.l 1 ;next slice to disp.
|
|
wi_x rs 1
|
|
wi_y rs 1
|
|
wi_w rs 1 ;how many chixels across
|
|
wi_h rs 1 ;how many down
|
|
wi_pw rs 1 ;width of 1 chixel
|
|
wi_ph rs 1 ;hite of 1 chixel
|
|
;
|
|
wi_bw rs 1 ;bitmap width
|
|
wi_bh rs 1 ;bitmap height
|
|
;
|
|
wi_bmapmem rs.l 1
|
|
wi_copmem rs.l 1
|
|
wi_bmap rs.l 1
|
|
wi_cop rs.l 1
|
|
wi_cop1 rs.l 1
|
|
wi_cop2 rs.l 1
|
|
wi_copmod rs.w 1
|
|
;
|
|
wi_strip rs.l 1
|
|
wi_iff rs.l 1 ;show iff instead!
|
|
wi_pal rs.l 1 ;palette for IFF!
|
|
;
|
|
wi_size rs.b 0
|
|
|
|
key macro
|
|
btst #\1&7,\1>>3(a0)
|
|
endm
|
|
|
|
qkey macro
|
|
move.l rawtable(pc),a0
|
|
key \1
|
|
endm
|
|
|
|
freemem macro
|
|
;
|
|
ifne debugmem
|
|
lea .fmem\@,a0
|
|
jsr freemem_
|
|
bra .fmemskip\@
|
|
.fmem\@ dc.b '\1',0
|
|
even
|
|
.fmemskip\@ ;
|
|
elseif
|
|
jsr freemem_
|
|
endc
|
|
;
|
|
endm
|
|
|
|
allocmem macro
|
|
;
|
|
ifne debugmem
|
|
;
|
|
lea .amem\@,a0
|
|
jsr allocmem_
|
|
bra .amemskip\@
|
|
.amem\@ dc.b '\1',10,0
|
|
even
|
|
.amemskip\@ ;
|
|
elseif
|
|
;
|
|
jsr allocmem_
|
|
;
|
|
endc
|
|
;
|
|
endm
|
|
|
|
allocmem2 macro
|
|
;
|
|
ifne debugmem
|
|
;
|
|
lea .amem\@,a0
|
|
jsr allocmem2_
|
|
bra .amemskip\@
|
|
.amem\@ dc.b '\1',10,0
|
|
even
|
|
.amemskip\@ ;
|
|
elseif
|
|
;
|
|
jsr allocmem2_
|
|
;
|
|
endc
|
|
;
|
|
endm
|
|
|
|
alloclist macro ;alloclist listname,maxitems,itemsize
|
|
;
|
|
move.l \2,d0
|
|
move.l \3,d1
|
|
lea \1(pc),a2
|
|
jsr k_alloclist
|
|
bra.s alskip\@
|
|
;
|
|
\1 dc.l 0 ;0
|
|
\1_last dc.l 0 ;4
|
|
dc.l 0 ;8
|
|
\1_free dc.l 0 ;12
|
|
alskip\@ ;
|
|
endm
|
|
|
|
k_alloclist ;a2=address of 'first' pointer
|
|
;d0=max items, d1=item size
|
|
;
|
|
move.l a2,8(a2) ;clear out used list
|
|
lea 4(a2),a0
|
|
clr.l (a0)
|
|
move.l a0,(a2)
|
|
movem.l d0-d1,-(a7)
|
|
mulu d1,d0
|
|
move.l #$10001,d1
|
|
allocmem alloclist
|
|
move.l d0,a0
|
|
lea 12(a2),a2
|
|
movem.l (a7)+,d0-d1
|
|
subq #1,d0
|
|
.loop move.l a0,(a2)
|
|
move.l a0,a2
|
|
add d1,a0
|
|
dbf d0,.loop
|
|
rts
|
|
|
|
addnext macro
|
|
;
|
|
;addnext 'listname'
|
|
;add after a5
|
|
;return eq if none available else a0
|
|
;
|
|
move.l \1_free,d0
|
|
beq.s .anskip\@
|
|
move.l d0,a0
|
|
move.l (a0),\1_free
|
|
move.l (a5),a1
|
|
move.l a1,(a0)
|
|
move.l a0,4(a1)
|
|
move.l a0,(a5)
|
|
move.l a5,4(a0)
|
|
.anskip\@ ;
|
|
endm
|
|
|
|
addfirst macro
|
|
;
|
|
;addfirst 'listname'
|
|
;return eq if none available else a0
|
|
;
|
|
move.l \1_free,d0
|
|
beq.s .afskip\@
|
|
move.l d0,a0
|
|
move.l (a0),\1_free
|
|
move.l \1,a1 ;current first
|
|
move.l a1,(a0)
|
|
move.l a0,4(a1)
|
|
move.l a0,\1
|
|
move.l #\1,4(a0)
|
|
.afskip\@ ;
|
|
endm
|
|
|
|
addlast macro
|
|
;
|
|
;addlast 'listname'
|
|
;return eq in none available else a0
|
|
;
|
|
move.l \1_free,d0
|
|
beq.s .alskip\@
|
|
move.l d0,a0
|
|
move.l (a0),\1_free
|
|
;
|
|
move.l \1_last+4,a1 ;current last
|
|
move.l a0,(a1)
|
|
move.l a1,4(a0)
|
|
move.l a0,\1_last+4
|
|
move.l #\1_last,(a0)
|
|
.alskip\@ ;
|
|
endm
|
|
|
|
killitem macro
|
|
;
|
|
;killitem listname
|
|
;a0=item to kill, return a0=previous item.
|
|
;
|
|
move.l (a0),a1 ;next of me!
|
|
move.l 4(a0),4(a1)
|
|
move.l 4(a0),a1 ;prev of me
|
|
move.l (a0),(a1)
|
|
move.l \1_free,(a0)
|
|
move.l a0,\1_free
|
|
move.l a1,a0
|
|
endm
|
|
|
|
clearlist macro
|
|
;
|
|
;clearlist listname
|
|
;
|
|
.clloop\@ move.l \1,a0
|
|
tst.l (a0)
|
|
beq .cldone\@
|
|
killitem \1
|
|
bra .clloop\@
|
|
.cldone\@ ;
|
|
endm
|
|
|
|
zerolist macro listname,size of item
|
|
;
|
|
;fill all list items with 0!
|
|
;
|
|
clearlist \1
|
|
.zlloop\@ addlast \1
|
|
beq .zlskip\@
|
|
lea 8(a0),a1
|
|
moveq #0,d0
|
|
move #(\2-8)/2-1,d1
|
|
.zlloop2\@ move d0,(a1)+
|
|
dbf d1,.zlloop2\@
|
|
bra .zlloop\@
|
|
.zlskip\@ clearlist \1
|
|
;
|
|
endm
|
|
|
|
bwait macro
|
|
;
|
|
.bwait\@ btst #6,$dff002
|
|
beq.s .bwait2\@
|
|
bra.s .bwait\@
|
|
.bwait2\@ ;
|
|
endm
|
|
|
|
printlong macro
|
|
move.l \1,-(a7)
|
|
jsr printlong_
|
|
endm
|
|
|
|
check macro
|
|
list
|
|
check set *-\1
|
|
nolist
|
|
endm
|
|
|
|
push macro
|
|
movem.l d2-d7/a2-a6,-(a7)
|
|
endm
|
|
|
|
pull macro
|
|
movem.l (a7)+,d2-d7/a2-a6
|
|
endm
|
|
|
|
col macro
|
|
move #0,$dff106
|
|
move \1,$dff180
|
|
endm
|
|
|
|
warn macro
|
|
move d0,-(a7)
|
|
move #-1,d0
|
|
.wloop\@ col \1
|
|
dbf d0,.wloop\@
|
|
move (a7)+,d0
|
|
endm
|
|
|
|
tempfile ds.b 64
|
|
|
|
entrypoint
|
|
cli ;
|
|
move.l a0,a2
|
|
;
|
|
lea dosname,a1
|
|
move.l 4.w,a6
|
|
jsr -408(a6)
|
|
move.l d0,dosbase
|
|
;
|
|
move.l d0,a6
|
|
jsr -60(a6)
|
|
move.l d0,outhand
|
|
;
|
|
clr.l map_test
|
|
cmp.b #'@',(a2)+
|
|
bne.s main
|
|
lea tempfile,a0
|
|
move.l a0,map_test
|
|
.loop move.b (a2)+,(a0)
|
|
beq.s main
|
|
cmp.b #10,(a0)+
|
|
bne.s .loop
|
|
clr.b -(a0)
|
|
main ;
|
|
bsr bigfont
|
|
jsr initmain
|
|
;
|
|
.intro move.l medat(pc),a1
|
|
move.l titlemed(pc),a0
|
|
jsr 8(a1) ;start title music!
|
|
;
|
|
.intro2 jsr dointro ;returns gametype
|
|
cmp #3,gametype
|
|
bcs.s .play
|
|
move.l medat(pc),a1
|
|
jsr 12(a1)
|
|
bra.s exittoos
|
|
.play ;
|
|
bsr initnewgame
|
|
tst gametype
|
|
bmi .intro2
|
|
;
|
|
bsr smallfont
|
|
bsr execscript_med
|
|
bsr bigfont
|
|
;
|
|
bra .intro
|
|
;
|
|
exittoos bsr freeobjlist2
|
|
bsr permit
|
|
move.l rawstuff,a0
|
|
bclr #0,$3d(a0)
|
|
bsr finitser
|
|
bsr finitsfx
|
|
bsr finitvbint
|
|
bsr finitdisplay
|
|
bsr freememlist
|
|
bsr undir
|
|
rts
|
|
|
|
; ************* FAST SUBS ********************
|
|
|
|
fastsubs
|
|
|
|
smallfont move #6,fontw
|
|
move #8,fonth
|
|
clr fontoff
|
|
rts
|
|
|
|
bigfont move #8,fontw
|
|
move #10,fonth
|
|
move #51,fontoff
|
|
rts
|
|
|
|
encodejoy ;a0=cntrl block to encode...
|
|
;return d0 encoded
|
|
;
|
|
;bit:
|
|
;0 = joyx -1
|
|
;1 = joyx 1
|
|
;2 = joyy -1
|
|
;3 = joyy 1
|
|
;4 = joyb true
|
|
;5 = joyf true
|
|
;
|
|
moveq #0,d0
|
|
;
|
|
tst (a0)
|
|
beq.s .skipx
|
|
bpl.s .x1
|
|
bset #0,d0
|
|
bra.s .skipx
|
|
.x1 bset #1,d0
|
|
.skipx tst 2(a0)
|
|
beq.s .skipy
|
|
bpl.s .y1
|
|
bset #2,d0
|
|
bra.s .skipy
|
|
.y1 bset #3,d0
|
|
.skipy tst 4(a0)
|
|
beq.s .skipb
|
|
bset #4,d0
|
|
.skipb tst 6(a0)
|
|
beq.s .skipf
|
|
bset #5,d0
|
|
.skipf ;
|
|
rts
|
|
|
|
decodejoy ;
|
|
;d0.b = encoded byte...
|
|
;a0 = block to fill
|
|
;
|
|
;0 = joyx -1
|
|
;1 = joyx 1
|
|
;2 = joyy -1
|
|
;3 = joyy 1
|
|
;4 = joyb true
|
|
;5 = joyf true
|
|
;
|
|
clr (a0)
|
|
move d0,d1
|
|
and #3,d1
|
|
beq.s .skipx
|
|
cmp #1,d1
|
|
bne.s .x1
|
|
move #-1,(a0)
|
|
bra.s .skipx
|
|
.x1 move #1,(a0)
|
|
.skipx clr 2(a0)
|
|
move d0,d1
|
|
and #12,d1
|
|
beq.s .skipy
|
|
cmp #4,d1
|
|
bne.s .y1
|
|
move #-1,2(a0)
|
|
bra.s .skipy
|
|
.y1 move #1,2(a0)
|
|
.skipy btst #4,d0
|
|
sne d1
|
|
ext d1
|
|
move d1,4(a0)
|
|
btst #5,d0
|
|
sne d1
|
|
ext d1
|
|
move d1,6(a0)
|
|
;
|
|
rts
|
|
|
|
sfxs ;
|
|
sfx0 ds.b fx_size
|
|
sfx1 ds.b fx_size
|
|
sfx2 ds.b fx_size
|
|
sfx3 ds.b fx_size
|
|
|
|
sfxintserver0 dc.l 0,0
|
|
dc.b 2,0
|
|
dc.l 0
|
|
dc.l sfx0
|
|
dc.l sfxint
|
|
|
|
sfxintserver1 dc.l 0,0
|
|
dc.b 2,0
|
|
dc.l 0
|
|
dc.l sfx1
|
|
dc.l sfxint
|
|
|
|
sfxintserver2 dc.l 0,0
|
|
dc.b 2,0
|
|
dc.l 0
|
|
dc.l sfx2
|
|
dc.l sfxint
|
|
|
|
sfxintserver3 dc.l 0,0
|
|
dc.b 2,0
|
|
dc.l 0
|
|
dc.l sfx3
|
|
dc.l sfxint
|
|
|
|
initsfx push
|
|
move.l 4.w,a6
|
|
;
|
|
moveq #7,d0
|
|
lea sfxintserver0,a1
|
|
jsr -162(a6) ;setintvector
|
|
;
|
|
moveq #8,d0
|
|
lea sfxintserver1,a1
|
|
jsr -162(a6)
|
|
;
|
|
moveq #9,d0
|
|
lea sfxintserver2,a1
|
|
jsr -162(a6)
|
|
;
|
|
moveq #10,d0
|
|
lea sfxintserver3,a1
|
|
jsr -162(a6)
|
|
;
|
|
lea sfxs(pc),a1
|
|
move #$80,d0
|
|
moveq #1,d1
|
|
moveq #0,d2
|
|
moveq #3,d3
|
|
.loop bsr .init
|
|
lea fx_size(a1),a1
|
|
dbf d3,.loop
|
|
;
|
|
pull
|
|
rts
|
|
;
|
|
.init clr fx_status(a1)
|
|
move d0,fx_int(a1)
|
|
move d1,fx_dma(a1)
|
|
move d2,fx_offset(a1)
|
|
add d0,d0
|
|
add d1,d1
|
|
add #16,d2
|
|
rts
|
|
|
|
finitsfx push
|
|
move.l 4.w,a6
|
|
;
|
|
moveq #7,d0
|
|
sub.l a1,a1
|
|
jsr -162(a6)
|
|
;
|
|
move.l 4.w,a6
|
|
moveq #8,d0
|
|
sub.l a1,a1
|
|
jsr -162(a6)
|
|
;
|
|
move.l 4.w,a6
|
|
moveq #9,d0
|
|
sub.l a1,a1
|
|
jsr -162(a6)
|
|
;
|
|
move.l 4.w,a6
|
|
moveq #10,d0
|
|
sub.l a1,a1
|
|
jsr -162(a6)
|
|
;
|
|
pull
|
|
rts
|
|
|
|
playsfx ;sfx file in a0, vol in d0, priority in d1
|
|
;
|
|
move #$4000,$dff09a
|
|
lea sfxs(pc),a1
|
|
moveq #3,d2
|
|
.loop tst fx_status(a1)
|
|
beq.s makesfx
|
|
lea fx_size(a1),a1
|
|
dbf d2,.loop
|
|
;
|
|
;OK, none free...check priorities
|
|
;
|
|
lea sfxs(pc),a1
|
|
moveq #3,d2
|
|
.loop2 cmp fx_priority(a1),d1
|
|
bgt.s queuesfx
|
|
lea fx_size(a1),a1
|
|
dbf d2,.loop2
|
|
;
|
|
;no-can-do!
|
|
;
|
|
move #$c000,$dff09a
|
|
rts
|
|
;
|
|
queuesfx ;OK, turn off other and play US!
|
|
;
|
|
move #1,fx_status(a1)
|
|
move d0,fx_vol(a1)
|
|
move d1,fx_priority(a1)
|
|
move.l a0,fx_sfx(a1) ;play me next!
|
|
;
|
|
bsr sfxoff
|
|
;
|
|
move #$c000,$dff09a
|
|
rts
|
|
|
|
sfxoff lea $dff0a0,a2
|
|
add fx_offset(a1),a2
|
|
move.l chipzero(pc),(a2)
|
|
move #1,4(a2) ;len
|
|
move #0,8(a2) ;vol
|
|
move fx_int(a1),$dff09a
|
|
move fx_dma(a1),$dff096
|
|
rts
|
|
|
|
makesfx ;OK, play this SFX NOW!
|
|
;
|
|
move d1,fx_priority(a1)
|
|
move d0,fx_vol(a1)
|
|
bsr playsfxnow
|
|
move #$c000,$dff09a
|
|
rts
|
|
|
|
playsfxnow move #-2,fx_status(a1)
|
|
;
|
|
lea $dff0a0,a2
|
|
add fx_offset(a1),a2
|
|
move (a0)+,6(a2) ;period
|
|
move (a0)+,4(a2) ;len
|
|
move fx_vol(a1),8(a2) ;vol
|
|
move.l a0,(a2) ;data
|
|
;
|
|
move fx_dma(a1),d0 ;dma bits
|
|
or #$8000,d0
|
|
move fx_int(a1),d1 ;int bits
|
|
move d1,d2
|
|
or #$8000,d1
|
|
;
|
|
move d0,$dff096 ;dma on!
|
|
move d1,$dff09a ;int en
|
|
move d2,$dff09c ;intreq clr
|
|
;
|
|
rts
|
|
|
|
sfxint ;interupt for sfx!
|
|
;
|
|
tst fx_status(a1)
|
|
bge.s .skip
|
|
addq #1,fx_status(a1)
|
|
blt.s .skip
|
|
;
|
|
move.l a2,-(a7)
|
|
bsr sfxoff
|
|
move.l (a7)+,a2
|
|
;
|
|
.skip move fx_int(a1),$dff09c
|
|
moveq #0,d0
|
|
rts
|
|
|
|
sfxvbint movem.l d2-d3/a1-a2,-(a7)
|
|
lea sfxs(pc),a1
|
|
moveq #3,d3
|
|
.loop tst fx_status(a1)
|
|
ble.s .skip
|
|
;
|
|
;this one queued! gotta play it...
|
|
;
|
|
subq #1,fx_status(a1)
|
|
bgt.s .skip
|
|
move.l fx_sfx(a1),a0
|
|
bsr playsfxnow
|
|
;
|
|
.skip lea fx_size(a1),a1
|
|
dbf d3,.loop
|
|
;
|
|
movem.l (a7)+,d2-d3/a1-a2
|
|
rts
|
|
|
|
dogamemenu ;
|
|
move #$0020,$dff09a
|
|
st paused
|
|
move framecnt(pc),-(a7)
|
|
move #$8020,$dff09a
|
|
;
|
|
move.l player1,a5
|
|
move.l ob_palette(a5),-(a7)
|
|
move.l #palettesw,ob_palette(a5)
|
|
move.l ob_window(a5),a2
|
|
bsr plotwbmap
|
|
;
|
|
tst twowins
|
|
beq .p1
|
|
;
|
|
move.l player2,a5
|
|
move.l ob_palette(a5),-(a7)
|
|
move.l #palettesw,ob_palette(a5)
|
|
move.l ob_window(a5),a2
|
|
bsr plotwbmap
|
|
.p1 ;
|
|
bsr drawall2
|
|
;
|
|
move.l player1,a5
|
|
lea gamemenu,a4
|
|
move.l ob_window(a5),a6
|
|
jsr initmenu
|
|
;
|
|
.loop bsr selmenu
|
|
beq .done
|
|
;
|
|
subq #1,d0
|
|
bne .notpsize
|
|
bsr newpsize
|
|
bra .loop
|
|
;
|
|
.notpsize subq #1,d0
|
|
bne .notwsize
|
|
bsr newwsize
|
|
bra .loop
|
|
;
|
|
.notwsize subq #1,d0
|
|
bne .notlwin
|
|
bsr largewin
|
|
bra .loop
|
|
;
|
|
.notlwin subq #1,d0
|
|
bne .notfloor
|
|
;
|
|
addq #1,floorflag
|
|
cmp #2,floorflag
|
|
bne.s .fskip
|
|
move #-1,floorflag
|
|
.fskip bsr refresh
|
|
bra .loop
|
|
;
|
|
.notfloor subq #1,d0
|
|
bne .notroof
|
|
;
|
|
addq #1,roofflag
|
|
cmp #2,roofflag
|
|
bne.s .rskip
|
|
move #-1,roofflag
|
|
.rskip bsr refresh
|
|
bra .loop
|
|
.notroof ;
|
|
;MUST BE QUIT GAME!
|
|
;
|
|
;tst linked
|
|
;beq.s .unlk
|
|
;move.b #$80,d0
|
|
;bsr serput
|
|
;
|
|
.unlk move #1,finished
|
|
;
|
|
.done bsr finitmenu
|
|
;
|
|
tst twowins
|
|
beq.s .p12
|
|
;
|
|
move.l player2,a5
|
|
move.l (a7)+,ob_palette(a5)
|
|
move.l ob_window(a5),a2
|
|
bsr plotwbmap
|
|
bsr initstats
|
|
bsr showstats
|
|
.p12 ;
|
|
move.l player1,a5
|
|
move.l (a7)+,ob_palette(a5)
|
|
move.l ob_window(a5),a2
|
|
bsr plotwbmap
|
|
bsr initstats
|
|
bsr showstats
|
|
;
|
|
move #$0020,$dff09a
|
|
move (a7)+,framecnt
|
|
clr paused
|
|
move #$8020,$dff09a
|
|
;
|
|
rts
|
|
|
|
freewindows lea window1,a0
|
|
bsr freewindow
|
|
tst twowins
|
|
beq.s .p1
|
|
lea window2,a0
|
|
bsr freewindow
|
|
.p1 rts
|
|
|
|
largewin move.l player1,a5
|
|
bsr large
|
|
tst twowins
|
|
beq refresh
|
|
move.l player2,a5
|
|
bsr large
|
|
bra refresh
|
|
|
|
large move.l ob_window(a5),a6
|
|
move wi_pw(a6),d2
|
|
;
|
|
cmp #2,d2
|
|
beq .lhr
|
|
;
|
|
;large lo-res window!
|
|
;
|
|
move #324,d0
|
|
move #240,d1
|
|
bra thinkwin
|
|
;
|
|
.lhr move #180,d0
|
|
move #240,d1
|
|
bra thinkwin
|
|
|
|
newwsize ;window size stuff!
|
|
;
|
|
move.l player1,a5
|
|
bsr swapwsize
|
|
tst twowins
|
|
beq refresh
|
|
move.l player2,a5
|
|
bsr swapwsize
|
|
bra refresh
|
|
|
|
swapwsize ;increment window size!
|
|
;
|
|
move.l ob_window(a5),a6
|
|
movem wi_w(a6),d0-d1 ;w,h
|
|
move wi_pw(a6),d2
|
|
mulu d2,d0
|
|
mulu d2,d1
|
|
cmp #2,d2
|
|
beq .hr
|
|
;
|
|
;lo-res!
|
|
;
|
|
cmp #318,d0
|
|
bcs.s .inc
|
|
move #132,d0
|
|
move d0,d1
|
|
bra thinkwin
|
|
.inc add #24,d0
|
|
move d0,d1
|
|
cmp #240,d1
|
|
bls thinkwin
|
|
move #240,d1
|
|
bra thinkwin
|
|
;
|
|
.hr cmp #180,d0
|
|
bcs.s .inc2
|
|
tst twowins
|
|
bne .min
|
|
add #18,d1
|
|
cmp #240,d1
|
|
bls thinkwin
|
|
.min move #132,d0
|
|
move d0,d1
|
|
bra thinkwin
|
|
.inc2 add #24,d0
|
|
move d0,d1
|
|
;
|
|
thinkwin move #180,d3 ;max width!
|
|
cmp #2,d2
|
|
beq .gmax
|
|
move #318,d3
|
|
.gmax cmp d3,d0
|
|
bls .nm
|
|
move d3,d0
|
|
.nm ;
|
|
cmp #240,d1
|
|
bls .n240
|
|
move #240,d1
|
|
.n240 tst twowins
|
|
beq.s .ggt
|
|
move #120,d1
|
|
.ggt ;
|
|
move #160,d3
|
|
move d0,d4
|
|
lsr #1,d4
|
|
sub d4,d3 ;wi_x
|
|
move d3,wi_x(a6)
|
|
;
|
|
ext.l d0
|
|
divu d2,d0
|
|
move d0,wi_w(a6)
|
|
;
|
|
tst twowins
|
|
bne.s .skip3
|
|
;
|
|
move #166,d3
|
|
move d1,d4
|
|
lsr #1,d4
|
|
sub d4,d3
|
|
move d3,wi_y(a6)
|
|
;
|
|
.skip3 ext.l d1
|
|
divu d2,d1
|
|
move d1,wi_h(a6)
|
|
;
|
|
rts
|
|
|
|
newpsize ;toggle pixel size between 2 and 3
|
|
;
|
|
;copy windows to temp so we can free 'em up later
|
|
;
|
|
move.l player1,a5
|
|
bsr swappsize
|
|
tst twowins
|
|
beq refresh
|
|
move.l player2,a5
|
|
bsr swappsize
|
|
;
|
|
refresh bsr dispoff
|
|
bsr finitmenu
|
|
;
|
|
bsr freewindows
|
|
bsr putwindow
|
|
bsr calcbpos
|
|
;
|
|
lea window1,a0
|
|
bsr makewindow
|
|
lea window1,a0
|
|
bsr showwindow
|
|
;
|
|
tst twowins
|
|
beq.s .p1
|
|
;
|
|
lea window2,a0
|
|
bsr makewindow
|
|
lea window2,a0
|
|
bsr showwindow
|
|
;
|
|
.p1 lea gamemenu,a4
|
|
lea window1,a6
|
|
jsr initmenu2
|
|
;
|
|
bsr drawall2
|
|
bsr dispon
|
|
rts
|
|
|
|
swappsize move.l ob_window(a5),a6
|
|
movem wi_w(a6),d0-d1 ;w,h
|
|
move wi_pw(a6),d2
|
|
mulu d2,d0
|
|
mulu d2,d1
|
|
eor #1,d2 ;2,3...
|
|
move d2,wi_pw(a6)
|
|
move d2,wi_ph(a6)
|
|
;
|
|
bra thinkwin
|
|
|
|
drawall2 bsr drawall
|
|
bsr drawall
|
|
.wait tst showflag
|
|
bne.s .wait
|
|
rts
|
|
|
|
drawall tst doneflag
|
|
beq.s drawall ;wait for updated!
|
|
clr doneflag
|
|
;
|
|
move.l memory(pc),memat
|
|
move.l player1(pc),a5
|
|
bsr calcscene
|
|
move.l player1(pc),a5
|
|
bsr blitscene
|
|
move.l player1(pc),a5
|
|
bsr drawscene
|
|
;
|
|
move twowins(pc),d0
|
|
beq.s .p1
|
|
;
|
|
move.l memory(pc),memat
|
|
move.l player2(pc),a5
|
|
bsr calcscene
|
|
move.l player2(pc),a5
|
|
bsr blitscene
|
|
move.l player2(pc),a5
|
|
bsr drawscene
|
|
;
|
|
.p1 st showflag
|
|
;
|
|
rts
|
|
|
|
resetplayer st ob_update(a5)
|
|
clr ob_thermo(a5)
|
|
clr ob_infra(a5)
|
|
clr ob_invisible(a5)
|
|
clr ob_messtimer(a5)
|
|
clr ob_pixsize(a5)
|
|
clr ob_pixsizeadd(a5)
|
|
move.l #palettes,ob_palette(a5)
|
|
rts
|
|
|
|
calcwlevel moveq #0,d0
|
|
move.b ob_weapon(a5),d0
|
|
beq.s .wlg
|
|
subq #1,d0
|
|
divu #5,d0
|
|
mulu #20,d0
|
|
;lsl #4,d0
|
|
.wlg move d0,ob_wlevel(a5)
|
|
rts
|
|
|
|
message ;print up a message...player in a5
|
|
;
|
|
move.l (a7),a0 ;return address=message!
|
|
move.l a0,ob_mess(a5)
|
|
;
|
|
moveq #-1,d0
|
|
.loop addq #1,d0
|
|
tst.b (a0)+
|
|
bne.s .loop
|
|
;
|
|
move d0,ob_messlen(a5)
|
|
move #-127,ob_messtimer(a5)
|
|
;
|
|
move.l a0,d0
|
|
addq.l #1,d0
|
|
and #$fffe,d0
|
|
move.l d0,(a7)
|
|
rts
|
|
|
|
pdelay dc 0 ;non zero=wait between prints
|
|
|
|
printmess ;a5=object
|
|
;
|
|
move.l ob_window(a5),a6
|
|
move.l ob_mess(a5),a4
|
|
move ob_messlen(a5),d0
|
|
move wi_bh(a6),d6
|
|
lsr #2,d6 ;Y
|
|
;
|
|
printmess2 ;a6=window, a4=message, d0=length of message, d6=Y
|
|
;
|
|
move fontw(pc),d2
|
|
lsr #1,d2
|
|
mulu d2,d0
|
|
move #160,d7
|
|
sub d0,d7 ;X
|
|
;
|
|
.loop2 move.b (a4)+,d2
|
|
beq.s .done
|
|
cmp.b #' ',d2
|
|
beq.s .spc
|
|
cmp.b #'0',d2
|
|
bcs.s .nnum
|
|
cmp.b #'9',d2
|
|
bhi.s .nnum
|
|
sub.b #'0',d2
|
|
ext d2
|
|
bra.s .here
|
|
.nnum cmp.b #'!',d2
|
|
bne.s .notex
|
|
moveq #65+26,d2
|
|
bra.s .notfs
|
|
.notex cmp.b #'.',d2
|
|
bne.s .notfs
|
|
moveq #65+27,d2
|
|
.notfs and #31,d2
|
|
add #17,d2
|
|
.here add fontoff(pc),d2
|
|
move.l font(pc),a0
|
|
move.l wi_bmap(a6),a1
|
|
move d7,d0
|
|
move d6,d1
|
|
bsr blit
|
|
;
|
|
move pdelay(pc),d2
|
|
subq #1,d2
|
|
bmi.s .spc
|
|
;
|
|
.pdloop bsr vwait
|
|
bsr checkany
|
|
beq.s .none
|
|
move #-1,pdelay
|
|
moveq #0,d2
|
|
.none dbf d2,.pdloop
|
|
;
|
|
.spc add fontw(pc),d7
|
|
bra.s .loop2
|
|
.done ;
|
|
rts
|
|
|
|
initstats ;
|
|
;health...
|
|
move.l ob_window(a5),a0
|
|
moveq #2,d0
|
|
add wi_x(a0),d0
|
|
move.l wi_bmap(a0),a1
|
|
move.l font(pc),a0
|
|
moveq #2,d1
|
|
moveq #10,d2
|
|
bsr blit
|
|
;
|
|
;weapon...
|
|
move.l ob_window(a5),a0
|
|
moveq #2,d0
|
|
add wi_x(a0),d0
|
|
move.l wi_bmap(a0),a1
|
|
move.l font(pc),a0
|
|
moveq #10,d1
|
|
moveq #11,d2
|
|
bsr blit
|
|
;
|
|
rts
|
|
|
|
putstrip ;a0=window
|
|
;
|
|
move.l wi_bmap(a0),a1
|
|
move wi_bh(a0),d0
|
|
lsr #2,d0
|
|
mulu #7*40,d0
|
|
add.l d0,a1 ;dest
|
|
move.l wi_strip(a0),a0 ;src
|
|
;
|
|
btst #6,$dff002
|
|
.bwait btst #6,$dff002
|
|
bne.s .bwait
|
|
;
|
|
move.l #$9f00000,$dff040
|
|
move.l #-1,$dff044
|
|
move #0,$dff064
|
|
move #0,$dff066
|
|
move.l a0,$dff050
|
|
move.l a1,$dff054
|
|
move #(7*7)<<6+20,$dff058
|
|
rts
|
|
|
|
loff dc 0
|
|
|
|
showstats ;a5=player
|
|
;
|
|
moveq #2,d5
|
|
move ob_hitpoints(a5),d6
|
|
clr loff
|
|
bsr showlevel
|
|
;
|
|
moveq #10,d5
|
|
move ob_weapon(a5),d6
|
|
lsr #8,d6
|
|
move #51,loff
|
|
bsr showlevel
|
|
;
|
|
cmp #2,gametype
|
|
bne.s .lives
|
|
;
|
|
movem wins1(pc),d6-d7
|
|
cmp.l player1,a5
|
|
beq.s .skip
|
|
exg d6,d7
|
|
.skip sub d7,d6
|
|
ble.s .rts
|
|
;
|
|
subq #1,d6
|
|
move.l ob_window(a5),a0
|
|
move wi_bw(a0),d7
|
|
subq #2,d7
|
|
;
|
|
.loop subq #6,d7
|
|
move d7,d0
|
|
move.l ob_window(a5),a0
|
|
add wi_x(a0),d0
|
|
moveq #2,d1
|
|
moveq #50,d2
|
|
move.l wi_bmap(a0),a1
|
|
move.l font(pc),a0
|
|
bsr blit
|
|
dbf d6,.loop
|
|
;
|
|
.rts rts
|
|
;
|
|
.lives ;show how many lives
|
|
move ob_lives(a5),d6 ;how many lives!
|
|
beq.s .nolives
|
|
;
|
|
move.l ob_window(a5),a0
|
|
move wi_bw(a0),d7
|
|
subq #2,d7
|
|
subq #1,d6
|
|
;
|
|
.lloop subq #6,d7
|
|
move d7,d0
|
|
move.l ob_window(a5),a0
|
|
add wi_x(a0),d0
|
|
moveq #2,d1
|
|
moveq #50,d2
|
|
move.l wi_bmap(a0),a1
|
|
move.l font(pc),a0
|
|
bsr blit
|
|
dbf d6,.lloop
|
|
;
|
|
.nolives rts
|
|
|
|
showlevel moveq #47,d7
|
|
ext.l d6
|
|
divu #5,d6
|
|
subq #1,d6
|
|
bmi.s .skip
|
|
;
|
|
.loop moveq #12,d2
|
|
bsr drawh2
|
|
dbf d6,.loop
|
|
.skip ;
|
|
swap d6
|
|
tst d6
|
|
beq.s .rest
|
|
moveq #17,d2
|
|
sub d6,d2
|
|
bsr drawh2
|
|
;
|
|
.rest cmp #47+6*5,d7
|
|
bcc.s .hdone
|
|
moveq #17,d2
|
|
bsr drawh2
|
|
bra.s .rest
|
|
.hdone ;
|
|
rts
|
|
|
|
drawh2 add loff(pc),d2
|
|
;
|
|
drawh move.l ob_window(a5),a0
|
|
move d7,d0
|
|
move d5,d1
|
|
add wi_x(a0),d0
|
|
move.l wi_bmap(a0),a1
|
|
move.l font(pc),a0
|
|
addq #6,d7
|
|
;
|
|
blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char
|
|
;
|
|
add.l 4(a0,d2*4),a0
|
|
;
|
|
mulu #280,d1
|
|
add.l d1,a1
|
|
move d0,d2
|
|
asr #3,d2
|
|
add d2,a1 ;dest!
|
|
move.l a0,a2
|
|
add.l (a0),a2
|
|
lea 8(a0),a3
|
|
addq #4,a0
|
|
and #15,d0
|
|
ror #4,d0
|
|
;
|
|
btst #6,$dff002
|
|
.bwait btst #6,$dff002
|
|
bne.s .bwait
|
|
;
|
|
move.l a2,$dff050
|
|
move.l a3,$dff04c
|
|
move.l a1,$dff048
|
|
move.l a1,$dff054
|
|
;
|
|
move d0,$dff042
|
|
or #$fca,d0
|
|
move d0,$dff040
|
|
move.l #$ffff0000,$dff044
|
|
moveq #-2,d0
|
|
move d0,$dff064
|
|
move d0,$dff062
|
|
moveq #38,d0
|
|
sub (a0)+,d0
|
|
move d0,$dff060
|
|
move d0,$dff066
|
|
move (a0)+,$dff058
|
|
;
|
|
rts
|
|
|
|
pixsize dc 0 ;pixel size...at least 2!
|
|
|
|
pixelate ;pixel out the coplist!
|
|
;
|
|
move pixsize(pc),d1 ;x/y add
|
|
;
|
|
;pixel out vertically, then horizontally
|
|
;
|
|
move.l cop(pc),a0
|
|
lea coloffs(pc),a1
|
|
moveq #0,d2 ;x
|
|
move d1,d6
|
|
lsr #1,d6
|
|
.forx ;
|
|
move.l a0,a3
|
|
lea 0(a1,d2*4),a2
|
|
add.l (a2),a3
|
|
;
|
|
move d2,d5
|
|
add d6,d5
|
|
cmp width(pc),d5
|
|
ble.s .xok
|
|
move width(pc),d5
|
|
.xok sub d2,d5
|
|
ble .done
|
|
subq #1,d5
|
|
;
|
|
.loop2 moveq #0,d3
|
|
move.l a3,a4
|
|
move.l a0,a5
|
|
add.l (a2)+,a5
|
|
move d1,d7
|
|
lsr #1,d7 ;first Y add
|
|
.fory ;
|
|
move (a4),d0 ;start column!
|
|
move d3,d4
|
|
add d7,d4
|
|
cmp hite(pc),d4
|
|
ble.s .yok
|
|
move hite(pc),d4
|
|
.yok sub d3,d4
|
|
ble .nextx
|
|
subq #1,d4
|
|
;
|
|
.loop move d0,(a5)
|
|
add copmod(pc),a4
|
|
add copmod(pc),a5
|
|
;
|
|
dbf d4,.loop
|
|
;
|
|
.nexty add d7,d3
|
|
move d1,d7
|
|
bra.s .fory
|
|
;
|
|
.nextx dbf d5,.loop2
|
|
;
|
|
add d6,d2
|
|
move d1,d6
|
|
bra.s .forx
|
|
;
|
|
.done rts
|
|
|
|
makeqstrip ;
|
|
;do a simple roof/floor strip for blitter to wack in...
|
|
;
|
|
cmp #$100,con0poke
|
|
bne.s .doit
|
|
rts
|
|
;
|
|
.doit move.l qstrip(pc),a0
|
|
move.l darktable(pc),a1
|
|
move.l palette(pc),a2
|
|
move.l qstripbot(pc),a4
|
|
moveq #0,d2
|
|
;
|
|
move floorflag(pc),d0
|
|
bne.s .fdone
|
|
;
|
|
move camy(pc),d0
|
|
neg d0
|
|
ext.l d0
|
|
lsl.l #focshft,d0
|
|
;
|
|
move.b qcols+1(pc),d2
|
|
move.l qstripbot(pc),a4
|
|
move maxy(pc),d1
|
|
;
|
|
.floop subq #1,d1
|
|
beq.s .fdone
|
|
;
|
|
move.l d0,d3
|
|
divs d1,d3
|
|
cmp #maxz,d3
|
|
bcc .fdone
|
|
;
|
|
move 0(a1,d3*2),d3 ;darkness (0...15)
|
|
move.l 0(a2,d3*4),a3 ;pal to use
|
|
move 0(a3,d2*2),-(a4) ;colour!
|
|
;
|
|
bra.s .floop
|
|
;
|
|
.fdone move roofflag(pc),d0
|
|
bne.s .rdone
|
|
;
|
|
move #-256,d0
|
|
sub camy(pc),d0
|
|
ext.l d0
|
|
lsl.l #focshft,d0 ;cam Y
|
|
;
|
|
move.b qcols(pc),d2
|
|
;
|
|
move miny(pc),d1 ;SY
|
|
;
|
|
.rloop beq.s .rdone
|
|
;
|
|
move.l d0,d3
|
|
divs d1,d3
|
|
cmp #maxz,d3
|
|
bcc .rdone
|
|
;
|
|
move 0(a1,d3*2),d3 ;darkness (0...15)
|
|
move.l 0(a2,d3*4),a3 ;pal to use
|
|
move 0(a3,d2*2),(a0)+ ;colour!
|
|
;
|
|
addq #1,d1
|
|
bra.s .rloop
|
|
.rdone ;
|
|
moveq #0,d0
|
|
.loop cmp.l a4,a0
|
|
bcc.s .done
|
|
move.l d0,(a0)+
|
|
bra.s .loop
|
|
;
|
|
.done rts
|
|
|
|
flatcam dc.l 0
|
|
flatyadd dc 0
|
|
flatyadd2 dc 0
|
|
|
|
flat ;
|
|
;do flat above/below panel!
|
|
;
|
|
;d0=Y pos of flat
|
|
;d1=Screen Y add
|
|
;d7=first screen Y (miny or maxy-1)
|
|
;
|
|
;a0=panel to draw on!
|
|
;
|
|
ext.l d0
|
|
lsl.l #focshft,d0
|
|
move.l d0,flatcam
|
|
;
|
|
move d1,flatyadd
|
|
muls copmod(pc),d1
|
|
move d1,flatyadd2
|
|
;
|
|
move d7,d0
|
|
add midy(pc),d0
|
|
mulu copmod(pc),d0
|
|
add.l cop(pc),d0
|
|
add.l coloffs(pc),d0
|
|
move.l d0,a2
|
|
.vloop ;
|
|
;find Z on this scanline...
|
|
;
|
|
tst d7
|
|
beq .rts
|
|
move.l flatcam(pc),d6
|
|
divs d7,d6 ;d6.w = Z
|
|
cmp #maxz,d6
|
|
bcc .rts
|
|
;
|
|
move.l darktable(pc),a5
|
|
move 0(a5,d6*2),d5
|
|
move.l palette(pc),a5
|
|
move.l 0(a5,d5*4),a5
|
|
;
|
|
;Find leftmost X...
|
|
;
|
|
move minx(pc),d5
|
|
muls d6,d5
|
|
asr.l #focshft,d5
|
|
;
|
|
move maxx(pc),d4
|
|
muls d6,d4
|
|
asr.l #focshft,d4
|
|
;
|
|
;rotate X1,Z around camera...
|
|
;
|
|
move d5,d0
|
|
move d6,d1
|
|
;
|
|
move d0,d2
|
|
move d1,d3
|
|
;
|
|
muls icm1(pc),d0
|
|
add.l d0,d0
|
|
muls icm2(pc),d3
|
|
add.l d3,d3
|
|
add.l d3,d0
|
|
;
|
|
muls icm3(pc),d2
|
|
add.l d2,d2
|
|
muls icm4(pc),d1
|
|
add.l d1,d1
|
|
add.l d2,d1
|
|
;
|
|
;d0,d1.q = rotated x1,z
|
|
;
|
|
;rotate X2,Z around camera...
|
|
;
|
|
move d4,d2
|
|
move d6,d3
|
|
;
|
|
muls icm1(pc),d4
|
|
add.l d4,d4
|
|
muls icm2(pc),d3
|
|
add.l d3,d3
|
|
add.l d3,d4
|
|
;
|
|
muls icm3(pc),d2
|
|
add.l d2,d2
|
|
muls icm4(pc),d6
|
|
add.l d6,d6
|
|
add.l d2,d6
|
|
;
|
|
;d4,d6.q = rotated x2,z
|
|
;
|
|
move width(pc),d5
|
|
ext.l d5
|
|
sub.l d0,d4 ;Xadd
|
|
divs.l d5,d4
|
|
sub.l d1,d6 ;Zadd
|
|
divs.l d5,d6
|
|
;
|
|
;d0,d1.q=x,z
|
|
;d4,d6.q=xadd,zadd
|
|
;
|
|
swap d0
|
|
add camx(pc),d0
|
|
swap d1
|
|
add camz(pc),d1
|
|
swap d4
|
|
swap d6
|
|
;
|
|
move d7,-(a7)
|
|
moveq #127,d7
|
|
moveq #0,d2
|
|
moveq #0,d3
|
|
;
|
|
move.l a2,a3
|
|
;
|
|
move wdiv32(pc),-(a7)
|
|
;
|
|
.hloop2 moveq #31,d5
|
|
;
|
|
.hloop tst (a3) ;check destination!
|
|
bne.s .skip
|
|
;
|
|
and d7,d0
|
|
and d7,d1 ;X/Z for fetch!
|
|
move d0,d2
|
|
lsl #7,d2
|
|
lea 0(a0,d2),a6
|
|
move.b 0(a6,d1),d3
|
|
move 0(a5,d3*2),(a3)
|
|
;
|
|
.skip add.l d4,d0
|
|
addx d2,d0
|
|
add.l d6,d1
|
|
addx d2,d1
|
|
addq #4,a3
|
|
dbf d5,.hloop
|
|
;
|
|
addq #4,a3
|
|
subq #1,(a7)
|
|
bgt.s .hloop2
|
|
bne.s .kl
|
|
;
|
|
move wrem32(pc),d5
|
|
bpl.s .hloop
|
|
;
|
|
.kl move.l (a7)+,d7
|
|
add flatyadd(pc),d7
|
|
add flatyadd2(pc),a2
|
|
bra .vloop
|
|
;
|
|
.rts rts
|
|
|
|
doanims move.l map_anim(pc),a0
|
|
lea textures,a1
|
|
;
|
|
.loop move (a0)+,d0 ;how many frames
|
|
beq.s .done
|
|
movem (a0)+,d1-d2 ;first, delay
|
|
subq #1,(a0)+
|
|
bgt.s .loop
|
|
move d2,-2(a0)
|
|
lea 0(a1,d1*4),a2
|
|
;
|
|
;do the anim!
|
|
;
|
|
subq #2,d0
|
|
move.l (a2),d2
|
|
.loop2 move.l 4(a2),(a2)+
|
|
dbf d0,.loop2
|
|
move.l d2,(a2)
|
|
bra.s .loop
|
|
;
|
|
.done rts
|
|
|
|
dorots ;
|
|
move.l camrots2(pc),a6
|
|
lea rotpolys(pc),a5 ;header!
|
|
;
|
|
rotloop move.l (a5),a5
|
|
tst.l (a5)
|
|
beq .done
|
|
move rp_speed(a5),d0
|
|
beq.s rotloop
|
|
add d0,rp_rot(a5)
|
|
move rp_rot(a5),d0
|
|
;
|
|
move.l rp_first(a5),a2 ;first
|
|
move rp_num(a5),d5
|
|
subq #1,d5
|
|
move d5,d4
|
|
lsl #5,d4
|
|
lea 0(a2,d4),a1 ;previous
|
|
lea rp_lx(a5),a3
|
|
;
|
|
btst #0,rp_flags+1(a5)
|
|
bne.s morph
|
|
;
|
|
.rot movem rp_cx(a5),d6-d7 ;centre x,z
|
|
and #1023,d0
|
|
lea 0(a6,d0*8),a4 ;rotation matrix.
|
|
;
|
|
.loop bsr rotter
|
|
add d6,d0
|
|
add d7,d1
|
|
movem d0-d1,zo_lx(a2)
|
|
movem d0-d1,zo_rx(a1)
|
|
bsr rotter
|
|
movem d0-d1,zo_na(a2)
|
|
exg d0,d1
|
|
neg d0
|
|
movem d0-d1,zo_a(a2)
|
|
move.l a2,a1
|
|
lea 32(a2),a2
|
|
dbf d5,.loop
|
|
;
|
|
bra rotloop
|
|
;
|
|
.done rts
|
|
;
|
|
morph tst d0
|
|
bgt.s .dp
|
|
moveq #0,d0
|
|
.neg neg rp_speed(a5)
|
|
bra.s .skip2
|
|
.dp cmp #$4000,d0
|
|
blt.s .skip
|
|
move #$4000,d0
|
|
btst #1,rp_flags+1(a5)
|
|
bne.s .neg
|
|
clr rp_speed(a5)
|
|
.skip2 move d0,rp_rot(a5)
|
|
.skip ;
|
|
move d0,d4
|
|
movem.l a2/d5,-(a7) ;for calculating norms!
|
|
;
|
|
.loop movem (a3)+,d0-d3
|
|
muls d4,d0
|
|
lsl.l #2,d0
|
|
swap d0
|
|
add d2,d0
|
|
muls d4,d1
|
|
lsl.l #2,d1
|
|
swap d1
|
|
add d3,d1
|
|
movem d0-d1,zo_lx(a2)
|
|
movem d0-d1,zo_rx(a1)
|
|
move.l a2,a1
|
|
lea 32(a2),a2
|
|
dbf d5,.loop
|
|
;
|
|
movem.l (a7)+,a2/d5
|
|
;
|
|
.loop2 move zo_rx(a2),d0
|
|
sub zo_lx(a2),d0
|
|
move zo_rz(a2),d1
|
|
sub zo_lz(a2),d1
|
|
bsr calcnormvec
|
|
movem d0-d1,zo_na(a2)
|
|
exg d0,d1
|
|
neg d0
|
|
movem d0-d1,zo_a(a2)
|
|
lea 32(a2),a2
|
|
dbf d5,.loop2
|
|
;
|
|
bra rotloop
|
|
|
|
calcnormvec ;d0,d1 = vector...normalize!
|
|
;
|
|
;OK, find vector length!
|
|
;
|
|
move d0,d2
|
|
muls d2,d2
|
|
move d1,d3
|
|
muls d3,d3
|
|
add.l d3,d2
|
|
;
|
|
;OK, sqr of d2.l!
|
|
;
|
|
move.l #$10000,d3
|
|
;
|
|
.fitit cmp.l #16384,d2 ;fits?
|
|
bcs.s .ok
|
|
asr.l #1,d2
|
|
mulu.l #92681,d4:d3 ;mult by sqr(2)
|
|
move d4,d3
|
|
swap d3
|
|
bra.s .fitit
|
|
;
|
|
.ok ;OK to look up, but multiply the result.w by d3.q
|
|
;
|
|
move.l sqr(pc),a0
|
|
and #$fffe,d2
|
|
movem 0(a0,d2),d2 ;sqr.l!
|
|
mulu.l d3,d2
|
|
swap d2 ;length.w
|
|
;
|
|
;length should be >= both abs(xvec) AND abs(zvec)
|
|
;
|
|
move d0,d3
|
|
bpl.s .xp
|
|
neg d3
|
|
.xp move d1,d4
|
|
bpl.s .zp
|
|
neg d4
|
|
.zp ;
|
|
cmp d4,d3
|
|
bcc.s .bg
|
|
exg d3,d4
|
|
.bg ;
|
|
cmp d3,d2
|
|
bcc.s .lo
|
|
move d3,d2
|
|
.lo ;
|
|
ext.l d2
|
|
;
|
|
swap d0
|
|
clr d0
|
|
divs.l d2,d0
|
|
muls.l #32766,d0
|
|
swap d0
|
|
;
|
|
swap d1
|
|
clr d1
|
|
divs.l d2,d1
|
|
muls.l #32766,d1
|
|
swap d1
|
|
rts
|
|
|
|
rotter movem (a3)+,d0-d1 ;this x,z
|
|
move d0,d2
|
|
move d1,d3
|
|
;
|
|
muls (a4),d0
|
|
muls 2(a4),d3
|
|
add.l d3,d0
|
|
add.l d0,d0
|
|
swap d0 ;new x!
|
|
;
|
|
muls 4(a4),d2
|
|
muls 6(a4),d1
|
|
add.l d2,d1
|
|
add.l d1,d1
|
|
swap d1
|
|
;
|
|
rts
|
|
|
|
dodoors lea doors(pc),a5
|
|
;
|
|
.loop move.l (a5),a5
|
|
tst.l (a5)
|
|
beq .done
|
|
;
|
|
move.l do_poly(a5),a0
|
|
move do_fracadd(a5),d0
|
|
add d0,do_frac(a5)
|
|
move do_frac(a5),d0
|
|
move d0,d1
|
|
add d1,d1
|
|
move d1,zo_open(a0) ;copy frac
|
|
;
|
|
move do_rx(a5),d1
|
|
sub do_lx(a5),d1 ;width
|
|
move d1,d2
|
|
muls d0,d2
|
|
lsl.l #2,d2
|
|
swap d2
|
|
move do_lx(a5),d3
|
|
sub d2,d3
|
|
move d3,zo_lx(a0)
|
|
add d1,d3
|
|
move d3,zo_rx(a0)
|
|
;
|
|
move do_rz(a5),d1
|
|
sub do_lz(a5),d1
|
|
move d1,d2
|
|
muls d0,d2
|
|
lsl.l #2,d2
|
|
swap d2
|
|
move do_lz(a5),d3
|
|
sub d2,d3
|
|
move d3,zo_lz(a0)
|
|
add d1,d3
|
|
move d3,zo_rz(a0)
|
|
;
|
|
tst d0
|
|
beq.s .kill
|
|
cmp #$4000,d0
|
|
bne.s .loop
|
|
;
|
|
.kill move.l a5,a0
|
|
killitem doors
|
|
move.l a0,a5
|
|
bra .loop
|
|
;
|
|
.done rts
|
|
|
|
doorsfxflag dc 0
|
|
|
|
execevent ;d0=event number to execute...1,2...
|
|
;
|
|
sf doorsfxflag
|
|
move.l map_map(pc),a6
|
|
move.l map_events(pc),a0
|
|
;
|
|
ifne aga
|
|
add.l 0(a0,d0*4),a6
|
|
elseif
|
|
lsl #2,d0
|
|
add.l 0(a0,d0),a6
|
|
endc
|
|
;
|
|
exec_loop move (a6)+,d0
|
|
beq.s .rts
|
|
subq #1,d0
|
|
beq exec_addobj ;1 - add an object (alien etc)
|
|
subq #1,d0
|
|
beq exec_opendoor ;2 - open a door
|
|
subq #1,d0
|
|
beq exec_teleport ;3 - teleport
|
|
subq #1,d0
|
|
beq exec_loadobjs ;4 - load objects
|
|
subq #1,d0
|
|
beq exec_changetxt ;5 - change texture
|
|
subq #1,d0
|
|
beq exec_rotpolys ;6 - start polygons rotating!
|
|
;
|
|
warn #$f0f
|
|
;
|
|
.rts tst doorsfxflag
|
|
beq.s .nodoor
|
|
clr doorsfxflag
|
|
move.l doorsfx(pc),a0
|
|
moveq #64,d0
|
|
moveq #2,d1
|
|
bsr playsfx
|
|
.nodoor rts
|
|
|
|
exec_changetxt ;
|
|
move (a6)+,d0 ;zone#
|
|
move.l map_poly(pc),a1
|
|
lsl #5,d0
|
|
lea 0(a1,d0),a1 ;polygon to change
|
|
;
|
|
move (a6)+,d0 ;new texture
|
|
move.b d0,zo_t(a1)
|
|
bra exec_loop
|
|
|
|
exec_opendoor st doorsfxflag
|
|
addlast doors ;a0=new door
|
|
;
|
|
move (a6)+,d0 ;door #
|
|
move.l map_poly(pc),a1
|
|
lsl #5,d0
|
|
lea 0(a1,d0),a1 ;polygon to open!
|
|
;
|
|
;calc lx add, lz add, rx add, rz add
|
|
;
|
|
move.l a1,do_poly(a0)
|
|
move.l zo_lx(a1),do_lx(a0)
|
|
move.l zo_rx(a1),do_rx(a0)
|
|
clr do_frac(a0)
|
|
move #$100,do_fracadd(a0)
|
|
bra exec_loop
|
|
|
|
exec_teleport move.l eventobj(pc),a0
|
|
;
|
|
move (a6)+,ob_telex(a0)
|
|
addq #2,a6
|
|
move (a6)+,ob_telez(a0)
|
|
move (a6)+,ob_telerot(a0)
|
|
;
|
|
move #4,ob_pixsizeadd(a0)
|
|
;
|
|
bsr dotelesfx
|
|
;
|
|
bra exec_loop
|
|
|
|
dotelesfx move.l telesfx(pc),a0
|
|
moveq #64,d0
|
|
moveq #10,d1
|
|
bra playsfx
|
|
|
|
exec_loadobjs ;
|
|
.loop move (a6)+,d0
|
|
bmi .done
|
|
bsr loadanobj
|
|
bra.s .loop
|
|
.done ;
|
|
bra exec_loop
|
|
|
|
loadanobj ;d0=object#...sys must be permitted
|
|
;
|
|
lea objinfo,a2
|
|
mulu #objinfof-objinfo,d0
|
|
move.l _ob_shape-objinfo(a2,d0),a2
|
|
lea 8(a2),a3 ;filename
|
|
;
|
|
tst.l (a2)
|
|
bne.s .skip
|
|
move.l a3,a0
|
|
moveq #1,d1
|
|
bsr loadfile
|
|
move.l d0,(a2)
|
|
beq.s .skip
|
|
move.l d0,a0
|
|
bsr remapanim
|
|
.skip ;
|
|
tst.l 4(a2)
|
|
bne.s .rts
|
|
move.l a3,a0
|
|
.loop tst.b (a3)+
|
|
bne.s .loop
|
|
move.b #'2',-(a3)
|
|
moveq #1,d1
|
|
bsr loadfile
|
|
clr.b (a3)
|
|
move.l d0,4(a2)
|
|
beq.s .rts
|
|
move.l d0,a0
|
|
bsr remapanim
|
|
;
|
|
.rts rts
|
|
|
|
exec_rotpolys ;
|
|
;could also be morphpolys depending on bit 0 of flags!
|
|
;
|
|
addlast rotpolys
|
|
bne.s .ok
|
|
addq #8,a6
|
|
bra exec_loop
|
|
;
|
|
.ok movem (a6)+,d0-d3 ;polynum,count,speed,flags
|
|
;
|
|
clr rp_rot(a0)
|
|
move d1,rp_num(a0)
|
|
move d2,rp_speed(a0)
|
|
move d3,rp_flags(a0)
|
|
move d1,d5
|
|
subq #1,d5
|
|
move.l map_poly(pc),a2 ;polygons!
|
|
lsl #5,d0
|
|
add d0,a2
|
|
move.l a2,rp_first(a0)
|
|
;
|
|
btst #0,d3
|
|
beq .rot
|
|
;
|
|
;OK, prepare for morph
|
|
;
|
|
lsl #5,d1
|
|
lea 0(a2,d1),a3
|
|
lea rp_vx(a0),a1
|
|
;
|
|
.loop movem zo_lx(a3),d0-d1
|
|
movem zo_lx(a2),d2-d3
|
|
sub d2,d0
|
|
sub d3,d1
|
|
movem d0-d3,(a1)
|
|
addq #8,a1
|
|
;
|
|
lea 32(a2),a2
|
|
lea 32(a3),a3
|
|
dbf d5,.loop
|
|
;
|
|
bra exec_loop
|
|
;
|
|
.rot ;First, calc centre X,Z into d6,d7
|
|
;
|
|
moveq #0,d6
|
|
moveq #0,d7
|
|
move.l a2,a1
|
|
;
|
|
.loop0 movem zo_lx(a1),d0/d2
|
|
add.l d0,d6
|
|
add.l d2,d7
|
|
lea 32(a1),a1
|
|
dbf d5,.loop0
|
|
;
|
|
divu d1,d6
|
|
divu d1,d7
|
|
movem d6-d7,rp_cx(a0)
|
|
;
|
|
lea rp_lx(a0),a1
|
|
subq #1,d1
|
|
;
|
|
.loop2 movem zo_lx(a2),d0/d2
|
|
sub d6,d0
|
|
move d0,(a1)+
|
|
sub d7,d2
|
|
move d2,(a1)+
|
|
move.l zo_na(a2),(a1)+
|
|
;
|
|
lea 32(a2),a2
|
|
dbf d1,.loop2
|
|
;
|
|
rts
|
|
|
|
exec_addobj clr.l dummy
|
|
move (a6)+,d0 ;monster type
|
|
lea objinfo,a2
|
|
mulu #objinfof-objinfo,d0
|
|
add.l d0,a2
|
|
move.l (a2)+,a3
|
|
tst.l (a3)
|
|
beq.s .ok
|
|
.no addq #8,a6
|
|
bra exec_loop
|
|
.ok cmp #2,-2(a6) ;player?
|
|
bcc.s .notp
|
|
addfirst objects
|
|
bra.s .bum
|
|
.notp addlast objects
|
|
.bum beq.s .no
|
|
move.l a0,a5
|
|
;
|
|
move.l a5,(a3)
|
|
;
|
|
move (a6)+,ob_x(a5)
|
|
move (a6)+,ob_y(a5)
|
|
move (a6)+,ob_z(a5)
|
|
move (a6)+,ob_rot(a5)
|
|
;
|
|
lea ob_info(a5),a3
|
|
move #(objinfof-objinfo-4)>>1-1,d0
|
|
.loop move (a2)+,(a3)+
|
|
dbf d0,.loop
|
|
;
|
|
bsr calcvecs
|
|
movem.l d4-d5,ob_xvec(a5)
|
|
;
|
|
move.l ob_shape(a5),a0
|
|
move.l 4(a0),ob_chunks(a5)
|
|
move.l (a0),a0
|
|
move.l a0,ob_shape(a5)
|
|
;
|
|
move an_maxw(a0),d0
|
|
move d0,ob_rad(a5)
|
|
mulu d0,d0
|
|
move.l d0,ob_radsq(a5)
|
|
;
|
|
clr.l ob_washit(a5)
|
|
;
|
|
bsr rnddelay
|
|
;
|
|
bra exec_loop
|
|
|
|
rnddelay move ob_range(a5),d0
|
|
bsr rndn
|
|
add ob_base(a5),d0
|
|
move d0,ob_delay(a5)
|
|
;
|
|
rts
|
|
|
|
seedrnd ;seed number in d0.w
|
|
;
|
|
moveq #54,d1
|
|
lea rndtable(pc),a0
|
|
;
|
|
.loop move d0,(a0)+
|
|
mulu #$1efd,d0
|
|
add #$dff,d0
|
|
dbf d1,.loop
|
|
;
|
|
move.l a0,k_index
|
|
move.l #rndtable+48,j_index
|
|
rts
|
|
|
|
rndw ;return rnd number 0...65535 if d0.w
|
|
;
|
|
movem.l a0/a1,-(a7)
|
|
lea rndtable(pc),a1
|
|
move.l j_index(pc),a0
|
|
move -(a0),d0
|
|
cmp.l a0,a1
|
|
bne.s .skip
|
|
lea rndtable+110(pc),a0
|
|
.skip move.l a0,j_index
|
|
move.l k_index(pc),a0
|
|
add -(a0),d0
|
|
move d0,(a0)
|
|
cmp.l a0,a1
|
|
bne.s .skip2
|
|
lea rndtable+110(pc),a0
|
|
.skip2 move.l a0,k_index
|
|
movem.l (a7)+,a0/a1
|
|
rts
|
|
|
|
savernd lea rndtable(pc),a0
|
|
lea rndback(pc),a1
|
|
moveq #(rndtablef-rndtable)/2-1,d0
|
|
.loop move (a0)+,(a1)+
|
|
dbf d0,.loop
|
|
rts
|
|
|
|
loadrnd lea rndback(pc),a0
|
|
lea rndtable(pc),a1
|
|
moveq #(rndtablef-rndtable)/2-1,d0
|
|
.loop move (a0)+,(a1)+
|
|
dbf d0,.loop
|
|
rts
|
|
|
|
rndtable ds.w 55
|
|
k_index dc.l 0
|
|
j_index dc.l 0
|
|
rndtablef
|
|
|
|
rndback ds.b rndtablef-rndtable
|
|
|
|
rndl bsr rndw
|
|
move d0,d1
|
|
bsr rndw
|
|
swap d0
|
|
move d1,d0
|
|
rts
|
|
|
|
rndn move d0,d1
|
|
bsr rndw
|
|
mulu d1,d0
|
|
swap d0
|
|
rts
|
|
|
|
calcangle2 ;angle of camera to object in a5
|
|
;
|
|
move camx(pc),d0
|
|
sub ob_x(a5),d0
|
|
move camz(pc),d1
|
|
sub ob_z(a5),d1
|
|
bra.s calcangle_
|
|
|
|
calcangle ;angle of object a5 to object a0...
|
|
;
|
|
move ob_x(a0),d0
|
|
sub ob_x(a5),d0
|
|
move ob_z(a0),d1
|
|
sub ob_z(a5),d1
|
|
;
|
|
calcangle_ ;d0.w=x d1.w=y (dest-src)!
|
|
;
|
|
moveq #0,d2
|
|
tst d1
|
|
bpl.s .hpos
|
|
moveq #16,d2
|
|
neg d1
|
|
.hpos tst d0
|
|
bpl.s .wpos
|
|
eor #8,d2
|
|
neg d0
|
|
.wpos cmp d1,d0
|
|
bmi.s .notsteep
|
|
bne.s .neq
|
|
move #$2000,d1
|
|
bra.s .flow
|
|
.neq eor #4,d2
|
|
exg d1,d0
|
|
.notsteep tst d1
|
|
bne.s .noflow
|
|
moveq #0,d1
|
|
bra.s .flow
|
|
.noflow ext.l d0
|
|
swap d0
|
|
divu d1,d0
|
|
lsr #6,d0
|
|
and #1022,d0
|
|
move .arc(pc,d0),d1
|
|
.flow move.l .oct(pc,d2),d0
|
|
eor d0,d1
|
|
swap d0
|
|
add d1,d0
|
|
lsr #8,d0
|
|
rts
|
|
;
|
|
.oct dc 0,0,$4000,-1,0,-1,$c000,0
|
|
dc $8000,-1,$4000,0,$8000,0,$c000,-1
|
|
.arc incbin arc.bin
|
|
|
|
currplayer dc.l 0
|
|
|
|
calcscene ;a5=player object
|
|
;
|
|
move #$20,$dff09a
|
|
;
|
|
move.l a5,currplayer
|
|
move.l ob_palette(a5),palette
|
|
move ob_thermo(a5),thermo
|
|
move ob_infra(a5),infra
|
|
move ob_pixsize(a5),pixsize
|
|
;
|
|
clr.l shapelist
|
|
move.l a5,a0
|
|
bsr calccamera
|
|
bsr makewalls
|
|
;
|
|
lea objects(pc),a5
|
|
;
|
|
.loop move.l (a5),a5
|
|
tst.l (a5)
|
|
beq.s .done
|
|
cmp.l currplayer(pc),a5
|
|
beq.s .loop
|
|
move.l ob_render(a5),a0
|
|
jsr (a0)
|
|
bra.s .loop
|
|
.done ;
|
|
lea gore(pc),a5
|
|
;
|
|
.loop2 move.l (a5),a5
|
|
tst.l (a5)
|
|
beq.s .done2
|
|
;
|
|
movem go_x(a5),d0/d2
|
|
moveq #0,d1
|
|
move.l go_shape(a5),a0
|
|
move #$200,d7
|
|
bsr drawshape_q
|
|
;
|
|
bra.s .loop2
|
|
;
|
|
.done2 move #$8020,$dff09a
|
|
;
|
|
rts
|
|
|
|
blitscene bclr #7,ob_update(a5)
|
|
beq.s .noupdate
|
|
;
|
|
bclr #7,ob_update+1(a5)
|
|
beq.s .stats
|
|
;
|
|
move.l ob_window(a5),a2
|
|
moveq #9,d0
|
|
bsr wcopy
|
|
bsr initstats
|
|
;
|
|
.stats bsr showstats
|
|
;
|
|
.noupdate move ob_messtimer(a5),d0
|
|
bpl.s .mskip
|
|
addq #1,d0
|
|
beq.s .mdone
|
|
neg ob_messtimer(a5)
|
|
move.l ob_window(a5),a0
|
|
bsr putstrip
|
|
bsr printmess
|
|
bra.s .mskip
|
|
;
|
|
.mdone clr ob_messtimer(a5)
|
|
move.l ob_window(a5),a0
|
|
bsr putstrip
|
|
.mskip ;
|
|
rts
|
|
|
|
drawscene ;a5=player
|
|
;
|
|
.wait tst showflag
|
|
bne.s .wait
|
|
;
|
|
move.l ob_window(a5),a0
|
|
bsr dbwindow
|
|
;
|
|
bsr castwalls
|
|
bsr makeqstrip
|
|
bsr renderwalls
|
|
;
|
|
move floorflag(pc),d0
|
|
ble.s .nofloor
|
|
;
|
|
move camy(pc),d0
|
|
neg d0
|
|
moveq #-1,d1
|
|
move maxy(pc),d7
|
|
subq #1,d7
|
|
lea groundtile,a0
|
|
bsr flat
|
|
;
|
|
.nofloor move roofflag(pc),d0
|
|
ble.s .noflat
|
|
;
|
|
move #-255,d0
|
|
sub camy(pc),d0
|
|
moveq #1,d1
|
|
move miny(pc),d7
|
|
lea ceilingtile,a0
|
|
bsr flat
|
|
;
|
|
.noflat bsr drawshapes
|
|
bsr drawblood
|
|
;
|
|
move.l currplayer(pc),a0
|
|
move ob_pixsizeadd(a0),d0
|
|
beq .done
|
|
add d0,ob_pixsize(a0)
|
|
move ob_pixsize(a0),d0
|
|
beq .fin
|
|
cmp #24,d0
|
|
bne .pix
|
|
;
|
|
;ok, big pixels
|
|
;
|
|
move finished2(pc),finished
|
|
bne .pix
|
|
;
|
|
move #$20,$dff09a
|
|
move ob_telex(a0),ob_x(a0)
|
|
move ob_telez(a0),ob_z(a0)
|
|
move ob_telerot(a0),ob_rot(a0)
|
|
neg ob_pixsizeadd(a0)
|
|
move #$8020,$dff09a
|
|
bra.s .pix
|
|
;
|
|
.fin clr ob_pixsizeadd(a0)
|
|
;
|
|
.pix move d0,pixsize
|
|
bsr pixelate
|
|
;
|
|
.done rts
|
|
|
|
vbhandler ;
|
|
subq #1,(a1)+
|
|
addq #1,(a1)
|
|
;
|
|
tst showflag
|
|
beq.s .noshow
|
|
;
|
|
;don't show if beam in the way!
|
|
;
|
|
move.l $dff004,d0
|
|
lsr.l #8,d0 ;beampos
|
|
and #$1ff,d0
|
|
cmp minbpos(pc),d0
|
|
bcs.s .ok
|
|
cmp maxbpos(pc),d0
|
|
bcs.s .noshow
|
|
;
|
|
.ok clr showflag
|
|
lea window1,a0
|
|
bsr showwindowq
|
|
lea window2,a0
|
|
bsr showwindowq
|
|
;
|
|
.noshow bsr sfxvbint
|
|
;
|
|
move fadevol(pc),d0
|
|
beq.s .nofade
|
|
move.l medat(pc),a1
|
|
sub #$80,fadevol
|
|
bgt.s .setvol
|
|
clr fadevol
|
|
jsr 12(a1) ;stop song
|
|
bra.s .nofade
|
|
.setvol move fadevol(pc),d0
|
|
lsr #8,d0
|
|
jsr 16(a1) ;set volume
|
|
;
|
|
.nofade btst #0,framecnt+1
|
|
beq rts
|
|
tst paused
|
|
bne exit_vb2
|
|
;
|
|
;OK, movement/animation stuff!
|
|
;
|
|
movem.l d0-d7/a0-a6,-(a7)
|
|
;
|
|
bsr readjoys
|
|
bsr doanims
|
|
bsr dorots
|
|
bsr dodoors
|
|
bsr moveblood
|
|
;
|
|
ifne debugser
|
|
;
|
|
;OK, kludge in a random number!
|
|
move framecnt(pc),d0
|
|
and #126,d0
|
|
bne.s .nornd
|
|
;
|
|
bsr rndw
|
|
lea .rndasc(pc),a0
|
|
moveq #3,d1
|
|
.loop rol #4,d0
|
|
move d0,d2
|
|
and #15,d2
|
|
add #48,d2
|
|
cmp #58,d2
|
|
bcs.s .rok
|
|
addq #7,d2
|
|
.rok move.b d2,(a0)+
|
|
dbf d1,.loop
|
|
;
|
|
move.l player1(pc),a5
|
|
bsr message
|
|
.rndasc dc.b 'aaaa',0
|
|
even
|
|
;
|
|
endc
|
|
.nornd ;
|
|
move.l a7,obj_stack
|
|
lea objects(pc),a5
|
|
;
|
|
obj_loop move.l (a5),a5
|
|
tst.l (a5)
|
|
beq exit_vb
|
|
;
|
|
move.l ob_logic(a5),a0
|
|
jsr (a0)
|
|
;
|
|
;check collision!
|
|
;
|
|
move ob_collwith(a5),d0
|
|
beq.s obj_loop
|
|
;
|
|
move ob_rad(a5),d1
|
|
move ob_x(a5),d6
|
|
move ob_z(a5),d7
|
|
;
|
|
lea objects(pc),a0
|
|
;
|
|
.loop2 move.l (a0),a0
|
|
cmp.l a5,a0
|
|
bne.s .this
|
|
;
|
|
clr.l ob_washit(a5) ;not hit! can get hit next time...
|
|
bra obj_loop
|
|
.this ;
|
|
move ob_colltype(a0),d2
|
|
and d0,d2
|
|
beq.s .loop2
|
|
;
|
|
move ob_rad(a0),d2
|
|
add d1,d2 ;r sum
|
|
;
|
|
move ob_x(a0),d3
|
|
sub d6,d3
|
|
bpl.s .xpl
|
|
neg d3
|
|
.xpl cmp d2,d3
|
|
bcc.s .loop2
|
|
;
|
|
move ob_z(a0),d4
|
|
sub d7,d4
|
|
bpl.s .ypl
|
|
neg d4
|
|
.ypl cmp d2,d4
|
|
bcc.s .loop2
|
|
;
|
|
mulu d2,d2
|
|
mulu d3,d3
|
|
mulu d4,d4
|
|
add.l d4,d3
|
|
cmp.l d2,d3
|
|
bcc.s .loop2
|
|
;
|
|
cmp.l ob_washit(a5),a0
|
|
beq obj_loop
|
|
move.l a0,ob_washit(a5)
|
|
;
|
|
move finished2(pc),d0
|
|
bne obj_loop
|
|
;
|
|
move.l #killobject3,killjsr
|
|
movem.l a0/a5,obj_a0
|
|
exg.l a0,a5
|
|
;
|
|
move ob_damage(a0),d0
|
|
move.l ob_hit(a5),a1
|
|
sub d0,ob_hitpoints(a5)
|
|
bgt.s hit_skip
|
|
move.l ob_die(a5),a1
|
|
;
|
|
hit_skip jsr (a1)
|
|
;
|
|
hit_ret move.l #killobject2,killjsr
|
|
movem.l obj_a0(pc),a0/a5
|
|
;
|
|
move ob_damage(a0),d0
|
|
move.l ob_hit(a5),a1
|
|
sub d0,ob_hitpoints(a5)
|
|
bgt.s hit_skip2
|
|
move.l ob_die(a5),a1
|
|
;
|
|
hit_skip2 jsr (a1)
|
|
;
|
|
bra obj_loop
|
|
;
|
|
exit_vb movem.l (a7)+,d0-d7/a0-a6
|
|
exit_vb2 st doneflag
|
|
moveq #0,d0
|
|
;
|
|
rts rts
|
|
|
|
obj_a0 dc.l 0
|
|
obj_a5 dc.l 0
|
|
obj_stack dc.l 0
|
|
killjsr dc.l killobject2
|
|
|
|
killobject ;
|
|
move.l killjsr(pc),a0
|
|
jmp (a0)
|
|
|
|
killobject2 move.l a5,a0
|
|
killitem objects
|
|
move.l a0,a5
|
|
move.l obj_stack(pc),a7
|
|
bra obj_loop
|
|
|
|
killobject3 move.l a5,a0
|
|
killitem objects
|
|
move.l obj_stack(pc),a7
|
|
bra hit_ret
|
|
|
|
bloodspeed bsr rndw
|
|
ext.l d0
|
|
lsl.l #2,d0
|
|
rts
|
|
|
|
bloodspeed2 bsr rndw
|
|
ext.l d0
|
|
lsl.l #5,d0
|
|
rts
|
|
|
|
bloodspeed3 bsr rndw
|
|
ext.l d0
|
|
lsl.l #4,d0
|
|
rts
|
|
|
|
makesparksq move.l ob_chunks(a5),a2
|
|
;
|
|
makesparks ;a2=sparks
|
|
;
|
|
movem.l ob_x(a5),d2-d4
|
|
move 2(a2),d5
|
|
subq #1,d5
|
|
;
|
|
.loop addlast objects
|
|
beq .rts
|
|
movem.l d2-d4,ob_x(a0)
|
|
bsr bloodspeed2
|
|
move.l d0,ob_xvec(a0)
|
|
bsr bloodspeed2
|
|
move.l d0,ob_yvec(a0)
|
|
bsr bloodspeed2
|
|
move.l d0,ob_zvec(a0)
|
|
move.l a2,ob_shape(a0)
|
|
move d5,ob_frame(a0)
|
|
move.l #sparkslogic,ob_logic(a0)
|
|
move.l #drawshape_1,ob_render(a0)
|
|
clr ob_colltype(a0)
|
|
clr ob_collwith(a0)
|
|
bsr rndw
|
|
and #15,d0
|
|
add #15,d0
|
|
move d0,ob_delay(a0)
|
|
dbf d5,.loop
|
|
.rts rts
|
|
|
|
sparkslogic subq #1,ob_delay(a5)
|
|
ble killobject
|
|
movem.l ob_x(a5),d0-d2
|
|
add.l ob_xvec(a5),d0
|
|
add.l ob_yvec(a5),d1
|
|
add.l ob_zvec(a5),d2
|
|
movem.l d0-d2,ob_x(a5)
|
|
rts
|
|
|
|
bloodymess ;throw random blood splots everywhere!
|
|
;
|
|
bsr bloodspeed2
|
|
add.l ob_x(a5),d0
|
|
move.l d0,d2
|
|
bsr bloodspeed2
|
|
add.l ob_gutsy(a5),d0
|
|
move.l d0,d3
|
|
bsr bloodspeed2
|
|
add.l ob_z(a5),d0
|
|
move.l d0,d4
|
|
;
|
|
.loop addlast blood
|
|
beq.s .done
|
|
;
|
|
movem.l d2-d4,bl_x(a0)
|
|
bsr bloodspeed
|
|
move.l d0,bl_xvec(a0)
|
|
bsr bloodspeed
|
|
move.l d0,bl_yvec(a0)
|
|
bsr bloodspeed
|
|
move.l d0,bl_zvec(a0)
|
|
move ob_blood(a5),bl_color(a0)
|
|
;
|
|
dbf d7,.loop
|
|
;
|
|
.done rts
|
|
|
|
bloodymess2 ;throw random blood splots everywhere!
|
|
;
|
|
bsr bloodspeed2
|
|
add.l ob_x(a5),d0
|
|
move.l d0,d2
|
|
bsr bloodspeed2
|
|
add.l ob_gutsy(a5),d0
|
|
move.l d0,d3
|
|
bsr bloodspeed2
|
|
add.l ob_z(a5),d0
|
|
move.l d0,d4
|
|
;
|
|
.loop addlast blood
|
|
beq.s .done
|
|
;
|
|
movem.l d2-d4,bl_x(a0)
|
|
bsr bloodspeed3
|
|
move.l d0,bl_xvec(a0)
|
|
bsr bloodspeed3
|
|
move.l d0,bl_yvec(a0)
|
|
bsr bloodspeed3
|
|
move.l d0,bl_zvec(a0)
|
|
move ob_blood(a5),bl_color(a0)
|
|
;
|
|
dbf d7,.loop
|
|
;
|
|
.done rts
|
|
|
|
chunklogic move mode(pc),d0
|
|
beq chunklogic2
|
|
;
|
|
add.l #$8000,ob_yvec(a5)
|
|
move.l ob_yvec(a5),d0
|
|
add.l ob_y(a5),d0
|
|
blt .skip
|
|
;
|
|
;OK...hit ground!
|
|
;
|
|
bsr splat
|
|
addlast gore
|
|
bne.s .gok
|
|
;
|
|
move.l gore(pc),a0
|
|
killitem gore
|
|
addlast gore
|
|
beq killobject
|
|
;
|
|
.gok move ob_x(a5),go_x(a0)
|
|
move ob_z(a5),go_z(a0)
|
|
move.l ob_shape(a5),a1
|
|
move ob_frame(a5),d0
|
|
add.l 12(a1,d0*4),a1
|
|
move.l a1,go_shape(a0)
|
|
;
|
|
bra killobject
|
|
;
|
|
.skip move.l d0,ob_y(a5)
|
|
movem.l ob_xvec(a5),d6-d7
|
|
add.l ob_x(a5),d6
|
|
add.l ob_z(a5),d7
|
|
bsr checknew
|
|
beq.s .newok
|
|
clr.l ob_xvec(a5)
|
|
clr.l ob_zvec(a5)
|
|
rts
|
|
;
|
|
.newok move.l d6,ob_x(a5)
|
|
move.l d7,ob_z(a5)
|
|
rts
|
|
|
|
chunklogic2 add.l #$8000,ob_yvec(a5)
|
|
move.l ob_yvec(a5),d0
|
|
add.l d0,ob_y(a5)
|
|
blt.s .ok
|
|
;bsr splat
|
|
bra killobject
|
|
.ok movem.l ob_xvec(a5),d0-d1
|
|
add.l d0,ob_x(a5)
|
|
add.l d1,ob_z(a5)
|
|
rts
|
|
|
|
splat move.l splatsfx(pc),a0
|
|
moveq #32,d0
|
|
moveq #-1,d1
|
|
bra playsfx
|
|
|
|
blowobject move.l diesfx(pc),a0
|
|
moveq #64,d0
|
|
moveq #2,d1
|
|
bsr playsfx
|
|
;
|
|
moveq #31,d7
|
|
bsr bloodymess2
|
|
;
|
|
move.l ob_chunks(a5),d0
|
|
bne.s .chok
|
|
;
|
|
moveq #15,d7
|
|
bsr bloodymess2
|
|
bra killobject
|
|
;
|
|
.chok move.l d0,a4
|
|
move 2(a4),d7
|
|
subq #1,d7
|
|
;
|
|
.loop addlast objects
|
|
beq killobject
|
|
movem.l ob_x(a5),d0-d2
|
|
move.l #-64<<16,d1
|
|
movem.l d0-d2,ob_x(a0)
|
|
;
|
|
bsr bloodspeed3
|
|
move.l d0,ob_xvec(a0)
|
|
bsr bloodspeed3
|
|
sub.l #$40000,d0
|
|
move.l d0,ob_yvec(a0)
|
|
bsr bloodspeed3
|
|
move.l d0,ob_zvec(a0)
|
|
;
|
|
clr ob_colltype(a0)
|
|
clr ob_collwith(a0)
|
|
move.l #chunklogic,ob_logic(a0)
|
|
move.l a4,ob_shape(a0)
|
|
move.l #drawshape_1sc,ob_render(a0)
|
|
move d7,ob_frame(a0)
|
|
move ob_scale(a5),ob_scale(a0)
|
|
;
|
|
move an_maxw(a4),d0
|
|
move d0,ob_rad(a0)
|
|
mulu d0,d0
|
|
move.l d0,ob_radsq(a0)
|
|
;
|
|
dbf d7,.loop
|
|
bra killobject
|
|
|
|
hurtghoul moveq #31,d7
|
|
bsr bloodymess
|
|
rts
|
|
|
|
hurtngrunt move.l a0,-(a7)
|
|
bsr rndw
|
|
and #3,d0
|
|
cmp lastgrunt(pc),d0
|
|
bne.s .new
|
|
addq #1,d0
|
|
and #3,d0
|
|
.new move d0,lastgrunt
|
|
lea grunttable(pc),a0
|
|
move.l 0(a0,d0*4),a0
|
|
move.l (a0),a0
|
|
moveq #64,d0
|
|
moveq #1,d1
|
|
bsr playsfx
|
|
move.l (a7)+,a0
|
|
;
|
|
hurtobject move ob_colltype(a0),d0
|
|
and #24,d0
|
|
bne.s .rts
|
|
;
|
|
moveq #23,d7
|
|
bsr bloodymess
|
|
move ob_hurtpause(a5),ob_hurtwait(a5)
|
|
beq .rts
|
|
;
|
|
move #4,ob_frame(a5)
|
|
move.l ob_logic(a5),ob_oldlogic2(a5)
|
|
move.l ob_hit(a5),ob_oldhit(a5)
|
|
move.l #pauselogic2,ob_logic(a5)
|
|
move.l #rts,ob_hit(a5)
|
|
;
|
|
.rts rts
|
|
|
|
pauselogic2 subq #1,ob_hurtwait(a5)
|
|
bgt.s .rts
|
|
clr ob_frame(a5)
|
|
move.l ob_oldlogic2(a5),ob_logic(a5)
|
|
move.l ob_oldhit(a5),ob_hit(a5)
|
|
.rts rts
|
|
|
|
pauselogic subq #1,ob_delay(a5)
|
|
bgt.s .skip
|
|
;
|
|
bsr rnddelay
|
|
move.l ob_oldlogic(a5),ob_logic(a5)
|
|
;
|
|
;if in front of player, continue on old course...
|
|
;
|
|
bsr pickplayer
|
|
tst ob_invisible(a0)
|
|
bne.s .useold ;can't see player! no intelligence...
|
|
;
|
|
bsr calcangle
|
|
move ob_rot(a0),d1
|
|
and #255,d1
|
|
sub d0,d1
|
|
bpl.s .pl
|
|
neg d1
|
|
.pl cmp #64,d1
|
|
bcs.s .skip
|
|
cmp #192,d1
|
|
bcc.s .skip
|
|
;
|
|
.useold move ob_oldrot(a5),ob_rot(a5)
|
|
bsr calcvecs
|
|
;
|
|
.skip rts
|
|
|
|
shoot ;
|
|
;fire off a bullet...
|
|
;
|
|
;d2 : colltype
|
|
;d3 : collwith
|
|
;d4 : hitpoints
|
|
;d5 : damage
|
|
;d6 : speed
|
|
;a2=bullet shape
|
|
;a3=sparks shape
|
|
;
|
|
addfirst objects
|
|
beq .rts
|
|
;
|
|
move ob_bouncecnt(a5),ob_bouncecnt(a0)
|
|
move ob_x(a5),ob_x(a0)
|
|
move ob_y(a5),d0
|
|
add ob_firey(a5),d0
|
|
move d0,ob_y(a0)
|
|
move ob_z(a5),ob_z(a0)
|
|
move.l #firelogic,ob_logic(a0)
|
|
move.l #drawshape_1,ob_render(a0)
|
|
move.l #rts,ob_hit(a0)
|
|
move.l #killobject,ob_die(a0)
|
|
move d2,ob_colltype(a0)
|
|
move d3,ob_collwith(a0)
|
|
move d4,ob_hitpoints(a0)
|
|
move d5,ob_damage(a0)
|
|
move d6,ob_movspeed(a0)
|
|
move.l a2,ob_shape(a0)
|
|
clr ob_frame(a0)
|
|
move.l a3,ob_chunks(a0)
|
|
;
|
|
move ob_rot(a5),d0
|
|
and #255,d0
|
|
move.l camrots(pc),a1
|
|
;
|
|
ifne aga
|
|
lea 0(a1,d0*8),a1
|
|
elseif
|
|
lsl #3,d0
|
|
lea 0(a1,d0),a1
|
|
endc
|
|
;
|
|
move 2(a1),d0
|
|
move d0,ob_nxvec(a0)
|
|
neg d0
|
|
muls d6,d0
|
|
add.l d0,d0
|
|
move 6(a1),d1
|
|
move d1,ob_nzvec(a0)
|
|
muls d6,d1
|
|
add.l d1,d1
|
|
;
|
|
movem.l d0-d1,ob_xvec(a0)
|
|
add.l d0,ob_x(a0)
|
|
add.l d1,ob_z(a0)
|
|
;
|
|
move #32,ob_rad(a0)
|
|
move.l #32*32,ob_radsq(a0)
|
|
;
|
|
.rts rts
|
|
|
|
fire1 bsr pickplayer
|
|
bsr calcangle
|
|
move d0,-(a7)
|
|
bsr rndw
|
|
tst ob_invisible(a0)
|
|
bne.s .inv
|
|
and #16,d0
|
|
subq #8,d0
|
|
.inv add (a7)+,d0
|
|
and #255,d0
|
|
move d0,ob_rot(a5)
|
|
bsr calcvecs
|
|
move #7,ob_delay(a5)
|
|
move.l ob_logic(a5),ob_oldlogic(a5)
|
|
move.l #pauselogic,ob_logic(a5)
|
|
clr.l ob_frame(a5)
|
|
;
|
|
moveq #4,d2 ;colltype
|
|
moveq #0,d3 ;collwith
|
|
moveq #1,d4 ;hitpoints
|
|
moveq #1,d5 ;damage
|
|
moveq #20,d6 ;speed
|
|
moveq #0,d7 ;acceleration!
|
|
lea bullet1,a2
|
|
lea sparks1,a3
|
|
;
|
|
bsr shoot
|
|
;
|
|
rts
|
|
|
|
pickplayer ;pick nearest player
|
|
;
|
|
move.l player1(pc),a0
|
|
move gametype(pc),d0
|
|
beq.s .rts
|
|
move.l player2(pc),a1
|
|
move linked(pc),d0
|
|
bpl.s .nosw
|
|
;
|
|
exg a0,a1
|
|
.nosw ;
|
|
tst ob_hitpoints(a0)
|
|
beq .sw
|
|
tst ob_hitpoints(a1)
|
|
beq.s .rts
|
|
;
|
|
move ob_x(a5),d0
|
|
sub ob_x(a0),d0
|
|
muls d0,d0
|
|
move ob_z(a5),d1
|
|
sub ob_z(a0),d1
|
|
muls d1,d1
|
|
add.l d1,d0 ;dist to player a0
|
|
;
|
|
move ob_x(a5),d1
|
|
sub ob_x(a1),d1
|
|
muls d1,d1
|
|
move ob_z(a5),d2
|
|
sub ob_z(a1),d2
|
|
muls d2,d2
|
|
add.l d2,d1 ;dist to player a1
|
|
;
|
|
cmp.l d1,d0
|
|
bcs.s .rts
|
|
;
|
|
.sw move.l a1,a0
|
|
;
|
|
.rts rts
|
|
|
|
checkcoll ;check for collision between a5, and a0
|
|
;
|
|
move ob_rad(a5),d1
|
|
move ob_rad(a0),d2
|
|
add d1,d2 ;r sum
|
|
;
|
|
move ob_x(a0),d3
|
|
sub ob_x(a5),d3
|
|
bpl.s .xpl
|
|
neg d3
|
|
.xpl cmp d2,d3
|
|
bcc.s .no
|
|
;
|
|
move ob_z(a0),d4
|
|
sub ob_z(a5),d4
|
|
bpl.s .ypl
|
|
neg d4
|
|
.ypl cmp d2,d4
|
|
bcc.s .no
|
|
;
|
|
mulu d2,d2
|
|
mulu d3,d3
|
|
mulu d4,d4
|
|
add.l d4,d3
|
|
cmp.l d2,d3
|
|
bcc.s .no
|
|
;
|
|
moveq #-1,d0
|
|
rts
|
|
;
|
|
.no moveq #0,d0
|
|
rts
|
|
|
|
baldycharge ;
|
|
;baldy charging at player!
|
|
;
|
|
bsr checkvecs
|
|
beq baldy_skip
|
|
;
|
|
baldy_tonorm move.l ob_movspeed(a5),d0
|
|
lsr.l #2,d0
|
|
move.l d0,ob_movspeed(a5)
|
|
;
|
|
move.l ob_framespeed(a5),d0
|
|
lsr.l #2,d0
|
|
move.l d0,ob_framespeed(a5)
|
|
;
|
|
move.l #baldylogic,ob_logic(a5)
|
|
bsr rnddelay
|
|
;
|
|
bra monsterfix
|
|
;
|
|
baldy_skip ;close to player? start throwing punches around!
|
|
;
|
|
bsr pickplayer
|
|
bsr calcangle
|
|
sub ob_rot(a5),d0
|
|
cmp #32,d0
|
|
bgt baldy_tonorm
|
|
cmp #-32,d0
|
|
blt baldy_tonorm
|
|
;
|
|
move.l a0,ob_washit(a5)
|
|
bsr checkcoll
|
|
beq monsternew ;no collisions!
|
|
;
|
|
;go into punch mode!
|
|
;
|
|
move.l #baldypunch,ob_logic(a5)
|
|
move ob_punchrate(a5),ob_delay(a5)
|
|
clr.l ob_frame(a5)
|
|
rts
|
|
|
|
baldypunch ;
|
|
bsr pickplayer
|
|
bsr checkcoll
|
|
bne.s .doit
|
|
;
|
|
clr.l ob_frame(a5)
|
|
bra baldy_tonorm
|
|
;
|
|
.doit subq #1,ob_delay(a5)
|
|
ble.s .punch
|
|
rts
|
|
.punch move ob_punchrate(a5),ob_delay(a5)
|
|
moveq #0,d0 ;stand frame
|
|
cmp ob_frame(a5),d0
|
|
bne .skip
|
|
;
|
|
clr.l ob_washit(a5) ;punch!
|
|
bsr calcangle
|
|
move d0,ob_rot(a5)
|
|
moveq #5,d0
|
|
.skip move d0,ob_frame(a5)
|
|
rts
|
|
|
|
calcbangle bsr calcangle
|
|
tst ob_invisible(a0)
|
|
beq.s .notinv
|
|
;
|
|
;invisible, add some randomeness!
|
|
;
|
|
move d0,-(a7)
|
|
bsr rndw
|
|
and #127,d0
|
|
sub #64,d0
|
|
add (a7)+,d0
|
|
and #255,d0
|
|
;
|
|
.notinv move d0,ob_rot(a5)
|
|
rts
|
|
|
|
baldylogic ;
|
|
;OK, what can baldy do...
|
|
;
|
|
;how about, walk around similar to the marine, but randomly
|
|
;charge at you?
|
|
;
|
|
;then, if he's close enough, he throws a punch!
|
|
;
|
|
subq #1,ob_delay(a5)
|
|
bgt monstermove ;charge?
|
|
;
|
|
bsr pickplayer
|
|
bsr calcbangle
|
|
;
|
|
move.l ob_movspeed(a5),d0
|
|
lsl.l #2,d0
|
|
move.l d0,ob_movspeed(a5)
|
|
move.l ob_framespeed(a5),d0
|
|
lsl.l #2,d0
|
|
move.l d0,ob_framespeed(a5)
|
|
;
|
|
bsr calcvecs
|
|
move.l #baldycharge,ob_logic(a5)
|
|
;
|
|
rts
|
|
|
|
terralogic ;
|
|
move ob_rot(a5),ob_oldrot(a5)
|
|
subq #1,ob_delay(a5)
|
|
bgt monstermove
|
|
;
|
|
;OK, terra goes apeshit! stand there firing off at player!
|
|
;use punchrate as firedelay!
|
|
;
|
|
clr ob_frame(a5)
|
|
move #1,ob_delay(a5)
|
|
move ob_firecnt(a5),ob_delay2(a5)
|
|
move.l #terralogic2,ob_logic(a5)
|
|
rts
|
|
|
|
terralogic2 ;
|
|
subq #1,ob_delay(a5)
|
|
bgt.s .rts
|
|
;
|
|
move ob_firerate(a5),ob_delay(a5)
|
|
;
|
|
;OK, to to face player and fire away!
|
|
;
|
|
bsr pickplayer
|
|
bsr calcangle
|
|
move d0,ob_rot(a5)
|
|
bsr calcvecs
|
|
;
|
|
moveq #4,d2 ;colltype
|
|
moveq #0,d3 ;collwith
|
|
moveq #1,d4 ;hitpoints
|
|
moveq #3,d5 ;damage
|
|
moveq #16,d6 ;speed
|
|
moveq #0,d7 ;acceleration!
|
|
lea bullet4,a2
|
|
lea sparks4,a3
|
|
;
|
|
bsr shoot
|
|
;
|
|
subq #1,ob_delay2(a5)
|
|
bgt.s .rts
|
|
;
|
|
bsr rnddelay
|
|
move.l #terralogic,ob_logic(a5)
|
|
;
|
|
.rts rts
|
|
|
|
ghoullogic ;
|
|
addq #8,ob_bounce(a5)
|
|
move ob_bounce(a5),d0
|
|
move.l camrots(pc),a0
|
|
and #255,d0
|
|
move 0(a0,d0*8),d0
|
|
ext.l d0
|
|
lsl.l #5,d0 ;+/- 32
|
|
swap d0
|
|
add #-32,d0
|
|
move d0,ob_y(a5)
|
|
;
|
|
bsr pickplayer
|
|
bsr calcangle
|
|
move d0,ob_rot(a5)
|
|
;
|
|
subq #1,ob_delay(a5)
|
|
bgt.s .skip
|
|
;
|
|
move #1,ob_frame(a5)
|
|
move.l #$2000,ob_framespeed(a5)
|
|
moveq #4,d2 ;colltype
|
|
moveq #0,d3 ;collwith
|
|
moveq #1,d4 ;hitpoints
|
|
moveq #3,d5 ;damage
|
|
moveq #20,d6 ;speed
|
|
moveq #0,d7 ;acceleration!
|
|
lea bullet2,a2
|
|
lea sparks2,a3
|
|
;
|
|
bsr shoot
|
|
bsr rnddelay
|
|
;
|
|
.skip ;OK, ghoul moves around ignoring walls!
|
|
;
|
|
;he's pointed at player...how about randomly selected to make
|
|
;this his new movement vector?
|
|
;
|
|
bsr rndw
|
|
move ob_movspeed(a5),d1
|
|
lsl #8,d1
|
|
cmp d1,d0
|
|
bcc.s .no
|
|
;
|
|
bsr calcvecs
|
|
;
|
|
.no movem.l ob_xvec(a5),d0-d1
|
|
add.l d0,ob_x(a5)
|
|
add.l d1,ob_z(a5)
|
|
;
|
|
move.l ob_framespeed(a5),d0
|
|
beq.s .rts
|
|
add.l d0,ob_frame(a5)
|
|
cmp #3,ob_frame(a5)
|
|
bcs.s .rts
|
|
;
|
|
clr ob_frame(a5)
|
|
clr.l ob_framespeed(a5)
|
|
;
|
|
.rts rts
|
|
|
|
demonpause move ob_delay(a5),d0
|
|
move d0,d1
|
|
and #4,d0
|
|
sne d0
|
|
ext d0
|
|
and #5,d0 ;0 or 5
|
|
move d0,ob_frame(a5)
|
|
;
|
|
and #7,d1 ;do a fire?
|
|
cmp #7,d1
|
|
bne.s .nofire
|
|
;
|
|
move ob_delay(a5),d0
|
|
lsr #3,d0
|
|
mulu #20,d0
|
|
lea wtable(pc),a0
|
|
moveq #4,d2 ;colltype
|
|
moveq #0,d3 ;collwith
|
|
movem 2(a0,d0),d4-d6 ;hits,dam,speed
|
|
moveq #0,d7 ;acc
|
|
move.l 8(a0,d0),a2 ;bullets
|
|
move.l 12(a0,d0),a3 ;sparks
|
|
move.l 16(a0,d0),-(a7)
|
|
;
|
|
bsr shoot
|
|
;
|
|
move.l (a7)+,a0
|
|
move.l (a0),a0
|
|
moveq #32,d0
|
|
moveq #0,d1
|
|
bsr playsfx
|
|
;
|
|
.nofire subq #1,ob_delay(a5)
|
|
bgt.s .rts
|
|
;
|
|
bsr rnddelay
|
|
move.l ob_oldlogic(a5),ob_logic(a5)
|
|
;
|
|
.rts rts
|
|
|
|
demonlogic ;
|
|
move ob_rot(a5),ob_oldrot(a5)
|
|
subq #1,ob_delay(a5)
|
|
bgt monstermove
|
|
;
|
|
bsr pickplayer
|
|
bsr calcangle
|
|
move d0,-(a7)
|
|
bsr rndw
|
|
tst ob_invisible(a0)
|
|
bne.s .inv
|
|
and #16,d0
|
|
subq #8,d0
|
|
.inv add (a7)+,d0
|
|
and #255,d0
|
|
move d0,ob_rot(a5)
|
|
bsr calcvecs
|
|
move #5<<3-1,ob_delay(a5)
|
|
move.l ob_logic(a5),ob_oldlogic(a5)
|
|
move.l #demonpause,ob_logic(a5)
|
|
;
|
|
rts
|
|
|
|
phantomlogic ;
|
|
move ob_rot(a5),ob_oldrot(a5)
|
|
subq #1,ob_delay(a5)
|
|
bgt monstermove
|
|
;
|
|
bsr pickplayer
|
|
bsr calcangle
|
|
move d0,ob_rot(a5)
|
|
bsr calcvecs
|
|
move #7,ob_delay(a5)
|
|
move.l ob_logic(a5),ob_oldlogic(a5)
|
|
move.l #pauselogic,ob_logic(a5)
|
|
move #5,ob_frame(a5)
|
|
;
|
|
moveq #4,d2 ;colltype
|
|
moveq #0,d3 ;collwith
|
|
moveq #1,d4 ;hitpoints
|
|
moveq #3,d5 ;damage
|
|
moveq #20,d6 ;speed
|
|
moveq #0,d7 ;acceleration!
|
|
lea bullet3,a2
|
|
lea sparks3,a3
|
|
;
|
|
bra shoot
|
|
|
|
monsterlogic ;
|
|
move ob_rot(a5),ob_oldrot(a5)
|
|
;monster cruising around minding his own business...
|
|
;
|
|
subq #1,ob_delay(a5)
|
|
ble fire1
|
|
;
|
|
monstermove bsr checkvecs
|
|
beq.s monsternew
|
|
;
|
|
;OK, try 90/-90 degrees...
|
|
;
|
|
monsterfix bsr rndw
|
|
moveq #64,d1
|
|
tst d0
|
|
bpl.s .umk
|
|
moveq #-64,d1
|
|
.umk add d1,ob_rot(a5)
|
|
bsr calcvecs
|
|
bsr checkvecs
|
|
beq.s monsternew
|
|
;
|
|
add #128,ob_rot(a5)
|
|
bsr calcvecs
|
|
bsr checkvecs
|
|
beq.s monsternew
|
|
;
|
|
move ob_oldrot(a5),d0
|
|
add #128,d0
|
|
move d0,ob_rot(a5)
|
|
;
|
|
bsr calcvecs
|
|
bsr checkvecs
|
|
;
|
|
monsternew move.l d6,ob_x(a5)
|
|
move.l d7,ob_z(a5)
|
|
move.l ob_framespeed(a5),d0
|
|
add.l d0,ob_frame(a5)
|
|
and #3,ob_frame(a5)
|
|
rts
|
|
|
|
calcvecs move ob_rot(a5),d0
|
|
and #255,d0
|
|
move.l camrots(pc),a0
|
|
;
|
|
ifne aga
|
|
lea 0(a0,d0*8),a0
|
|
elseif
|
|
lsl #3,d0
|
|
lea 0(a0,d0),a0
|
|
endc
|
|
;
|
|
move ob_movspeed(a5),d4
|
|
move d4,d5
|
|
muls 2(a0),d4
|
|
add.l d4,d4
|
|
neg.l d4
|
|
move.l d4,ob_xvec(a5)
|
|
muls 6(a0),d5
|
|
add.l d5,d5
|
|
move.l d5,ob_zvec(a5)
|
|
rts
|
|
|
|
checkvecs move.l ob_x(a5),d6
|
|
add.l ob_xvec(a5),d6
|
|
move.l ob_z(a5),d7
|
|
add.l ob_zvec(a5),d7
|
|
bra checknew ;ok to stand here?
|
|
|
|
playerdead bsr getcntrl
|
|
;
|
|
subq #1,ob_delay(a5)
|
|
bgt.s .rts
|
|
;
|
|
cmp #2,gametype
|
|
bne.s .notcom
|
|
;
|
|
;combat game!
|
|
;
|
|
move #3,finished2
|
|
move #2,ob_pixsizeadd(a5)
|
|
move.l #rts,ob_logic(a5)
|
|
move.l player1,a0
|
|
cmp.l a5,a0
|
|
bne.s .got
|
|
move.l player2,a0
|
|
.got move #2,ob_pixsizeadd(a0)
|
|
.rts rts
|
|
.notcom ;
|
|
tst ob_lives(a5)
|
|
beq.s .dead
|
|
move.l #waitrestart,ob_logic(a5)
|
|
rts
|
|
;
|
|
.dead move.l #rts,ob_logic(a5)
|
|
;
|
|
tst gametype
|
|
bne.s .not1p
|
|
;
|
|
;OK, one player game done!
|
|
;
|
|
.allover move #1,finished
|
|
rts
|
|
;
|
|
.not1p move.l player1,a0
|
|
cmp.l a5,a0
|
|
bne.s .goth
|
|
move.l player2,a0
|
|
.goth tst ob_hitpoints(a0)
|
|
ble.s .allover
|
|
rts
|
|
|
|
waitrestart bsr getcntrl
|
|
;
|
|
bsr checkfireb
|
|
beq.s .rts
|
|
;
|
|
lea p1x(pc),a0
|
|
lea player1_+4,a1
|
|
cmp.l player1,a5
|
|
beq.s .got
|
|
lea p2x(pc),a0
|
|
lea player2_+4,a1
|
|
.got lea ob_info(a5),a2
|
|
move #(objinfof-objinfo-4)>>1-1,d0
|
|
.loop move (a1)+,(a2)+
|
|
dbf d0,.loop
|
|
move (a0)+,ob_x(a5)
|
|
move (a0)+,ob_z(a5)
|
|
move (a0)+,ob_rot(a5)
|
|
;
|
|
move.l ob_shape(a5),a0
|
|
move.l 4(a0),ob_chunks(a5)
|
|
move.l (a0),a0
|
|
move.l a0,ob_shape(a5)
|
|
;
|
|
bsr resetplayer
|
|
st ob_lastbut(a5)
|
|
;
|
|
.rts rts
|
|
|
|
playerdeath bsr getcntrl
|
|
;
|
|
addq #4,ob_rot(a5)
|
|
addq #4,ob_eyey(a5)
|
|
cmp #-32,ob_eyey(a5)
|
|
blt .rts
|
|
;
|
|
move #-32,ob_eyey(a5)
|
|
move.l #playerdead,ob_logic(a5)
|
|
move #63,ob_delay(a5)
|
|
;
|
|
cmp #2,gametype
|
|
bne.s .notcom
|
|
;
|
|
move.l player1,a0
|
|
cmp.l a5,a0
|
|
bne.s .got
|
|
move.l player2,a0
|
|
.got tst ob_hitpoints(a0)
|
|
ble.s .draw
|
|
;
|
|
.win move.l a5,-(a7)
|
|
move.l a0,a5
|
|
addq #1,wins1
|
|
cmp.l player1,a5
|
|
beq.s .wd
|
|
subq #1,wins1
|
|
addq #1,wins2
|
|
.wd st ob_update(a5)
|
|
clr ob_collwith(a5)
|
|
clr ob_colltype(a5)
|
|
bsr message
|
|
dc.b 'winner!',0
|
|
even
|
|
move.l (a7)+,a5
|
|
st ob_update(a5)
|
|
bsr message
|
|
dc.b 'loser!',0
|
|
even
|
|
rts
|
|
.draw ;
|
|
rts
|
|
.notcom ;
|
|
subq #1,ob_lives(a5)
|
|
bne.s .ngo
|
|
bsr message
|
|
dc.b 'game over',0
|
|
even
|
|
.ngo move #-1,ob_update(a5)
|
|
;
|
|
.rts rts
|
|
|
|
redpal move.l #palettesr,ob_palette(a5)
|
|
move #2,ob_paltimer(a5)
|
|
rts
|
|
|
|
playerhit tst ob_damage(a0)
|
|
beq.s .rts
|
|
st ob_update(a5)
|
|
bsr redpal
|
|
.rts rts
|
|
|
|
playerdie bsr redpal
|
|
clr ob_hitpoints(a5)
|
|
st ob_update(a5)
|
|
move.l #playerdeath,ob_logic(a5)
|
|
clr ob_colltype(a5)
|
|
clr ob_collwith(a5)
|
|
rts
|
|
|
|
healthgot bsr playtsfx
|
|
addq #5,ob_hitpoints(a0)
|
|
cmp #25,ob_hitpoints(a0)
|
|
ble.s .skip
|
|
move #25,ob_hitpoints(a0)
|
|
.skip st ob_update(a0)
|
|
move.l a5,-(a7)
|
|
move.l a0,a5
|
|
bsr message
|
|
dc.b 'health bonus!',0
|
|
even
|
|
move.l (a7)+,a5
|
|
bra killobject
|
|
|
|
playtsfx move.l a0,-(a7)
|
|
move.l tokensfx(pc),a0
|
|
moveq #64,d0
|
|
moveq #0,d1
|
|
bsr playsfx
|
|
move.l (a7)+,a0
|
|
rts
|
|
|
|
weapongot bsr playtsfx
|
|
add #$c0,ob_weapon(a0)
|
|
cmp #$1900,ob_weapon(a0)
|
|
ble.s .skip
|
|
move #$1900,ob_weapon(a0)
|
|
.skip st ob_update(a0)
|
|
move.l a5,-(a7)
|
|
move.l a0,a5
|
|
move ob_wlevel(a5),d2
|
|
bsr calcwlevel
|
|
cmp ob_wlevel(a5),d2
|
|
beq.s .nob
|
|
bsr message
|
|
dc.b 'weapon boost!',0
|
|
even
|
|
bra.s .nob2
|
|
.nob bsr message
|
|
dc.b 'weapon bonus...',0
|
|
even
|
|
.nob2 move.l (a7)+,a5
|
|
bra killobject
|
|
|
|
invisigot add #1500,ob_invisible(a0)
|
|
move.l #rts,ob_render(a0)
|
|
move.l a5,-(a7)
|
|
move.l a0,a5
|
|
bsr calcwlevel
|
|
bsr message
|
|
dc.b 'invisibility!',0
|
|
even
|
|
move.l (a7)+,a5
|
|
bra killobject
|
|
|
|
thermogot add #1500,ob_thermo(a0)
|
|
move.l a5,-(a7)
|
|
move.l a0,a5
|
|
bsr message
|
|
dc.b 'got the thermo glasses!',0
|
|
even
|
|
move.l (a7)+,a5
|
|
bra killobject
|
|
|
|
playertimers tst ob_thermo(a5)
|
|
beq.s .noth
|
|
subq #1,ob_thermo(a5)
|
|
bne.s .noth
|
|
bsr message
|
|
dc.b 'thermo glasses out...',0
|
|
even
|
|
;
|
|
.noth tst ob_messtimer(a5)
|
|
ble.s .notm
|
|
subq #2,ob_messtimer(a5)
|
|
.notm ;
|
|
tst ob_invisible(a5)
|
|
beq.s .noti
|
|
subq #1,ob_invisible(a5)
|
|
bne.s .noti
|
|
move.l #drawshape_8,ob_render(a5)
|
|
bsr message
|
|
dc.b 'invisibility out...',0
|
|
even
|
|
.noti ;
|
|
tst ob_paltimer(a5)
|
|
beq.s .notp
|
|
subq #1,ob_paltimer(a5)
|
|
bne.s .notp
|
|
move.l #palettes,ob_palette(a5)
|
|
.notp ;
|
|
rts
|
|
|
|
footstep move.l d0,-(a7)
|
|
move.l footstepsfx(pc),a0
|
|
moveq #16,d0
|
|
moveq #0,d1
|
|
bsr playsfx
|
|
move.l (a7)+,d0
|
|
rts
|
|
|
|
prevjoy dc 0 ;previous joy reading!
|
|
|
|
cntrls dc.l joyx0,joyx1,joyx2,joyx3
|
|
|
|
getcntrl move ob_cntrl(a5),d0
|
|
cmp #3,d0 ;null modem?
|
|
bne.s .notnull
|
|
;
|
|
;OK, control from null modem!
|
|
;
|
|
move linkcnt(pc),d0
|
|
beq.s .waitser
|
|
;
|
|
subq #1,linkcnt
|
|
moveq #0,d0
|
|
lea joyx3(pc),a0
|
|
bra decodejoy
|
|
;
|
|
.waitser bsr serget
|
|
bpl.s .sergot
|
|
;
|
|
;OK, do a vwait to allow other machine to catch up!
|
|
;
|
|
move #$20,$dff09c
|
|
.vw ;
|
|
ifne debugser
|
|
col #$f0f
|
|
endc
|
|
;
|
|
btst #5,$dff01f
|
|
beq.s .vw
|
|
move #$20,$dff09c
|
|
bra.s .waitser
|
|
;
|
|
.sergot lea joyx3(pc),a0
|
|
tst.b d0
|
|
bpl decodejoy
|
|
and #$ff,d0
|
|
move d0,finished
|
|
move.l #rts,ob_logic(a5)
|
|
moveq #0,d0
|
|
bra decodejoy
|
|
;
|
|
.notnull lea cntrls(pc),a0
|
|
move.l 0(a0,d0*4),a0 ;address of cntrl table...
|
|
move linked(pc),d0
|
|
beq.s .rts
|
|
;
|
|
bsr encodejoy
|
|
move.l a0,a2
|
|
bsr serput ;output it!
|
|
move.l a2,a0
|
|
move prevjoy(pc),d1 ;use previous!
|
|
move d0,prevjoy ;new previous
|
|
move d1,d0
|
|
bra decodejoy
|
|
;
|
|
.rts rts
|
|
|
|
playerlogic bsr playertimers
|
|
;
|
|
move.l ob_x(a5),d6
|
|
move.l ob_z(a5),d7
|
|
;
|
|
bsr checknewslow
|
|
beq.s .newok
|
|
bsr adjustpos
|
|
beq.s .newok2
|
|
;
|
|
subq #1,ob_hitpoints(a5)
|
|
st ob_update(a5)
|
|
bra redpal
|
|
;
|
|
;bsr adjustpos
|
|
;beq.s .newok2
|
|
;
|
|
warn #$f00
|
|
;
|
|
.newok2 move.l d6,ob_x(a5)
|
|
move.l d7,ob_z(a5)
|
|
.newok ;
|
|
bsr getcntrl ;update controller block,
|
|
;and put in a0
|
|
;
|
|
move (a0),d0 ;joyx - rotate
|
|
muls ob_rotspeed(a5),d0
|
|
add ob_rot(a5),d0
|
|
and #255,d0
|
|
move d0,ob_rot(a5)
|
|
;
|
|
move 2(a0),d4 ;joyy
|
|
bne.s .speed
|
|
;
|
|
;OK, standing still!
|
|
;
|
|
and #255,ob_bounce(a5)
|
|
beq.s .nob
|
|
add #32,ob_bounce(a5)
|
|
cmp #128,ob_bounce(a5)
|
|
ble.s .nob
|
|
clr ob_bounce(a5)
|
|
bsr footstep
|
|
.nob clr.l ob_frame(a5)
|
|
bra checkfire
|
|
;
|
|
.speed add #16,ob_bounce(a5)
|
|
move ob_bounce(a5),d1
|
|
sub #64,d1
|
|
and #255,d1
|
|
bne.s .fskip
|
|
bsr footstep
|
|
.fskip ;
|
|
move.l ob_framespeed(a5),d1
|
|
add.l d1,ob_frame(a5)
|
|
and #3,ob_frame(a5)
|
|
;
|
|
neg d4
|
|
muls ob_movspeed(a5),d4 ;speed
|
|
move.l camrots(pc),a1
|
|
lea 0(a1,d0*8),a1
|
|
;
|
|
move d4,d5 ;real speed
|
|
muls 2(a1),d4
|
|
add.l d4,d4
|
|
muls 6(a1),d5
|
|
add.l d5,d5
|
|
;
|
|
move.l ob_x(a5),d6
|
|
move.l ob_z(a5),d7
|
|
;
|
|
neg.l d4
|
|
add.l d4,d6
|
|
add.l d5,d7
|
|
;
|
|
bsr checknewslow
|
|
beq.s .newpos
|
|
bsr adjustpos
|
|
beq.s .newpos
|
|
bsr adjustposq
|
|
;
|
|
.newpos move.l d6,ob_x(a5)
|
|
move.l d7,ob_z(a5)
|
|
.useold ;
|
|
tst ob_pixsizeadd(a5)
|
|
bne checkfire
|
|
;
|
|
bsr checknew2 ;in a trigger zone?
|
|
beq.s checkfire
|
|
;
|
|
move zo_ev(a4),d0 ;poly->event
|
|
bmi.s checkfire
|
|
;
|
|
cmp #24,d0
|
|
bne.s .notexit
|
|
;
|
|
move #3,finished2 ;pattern done!
|
|
move #2,ob_pixsizeadd(a5)
|
|
;
|
|
move d0,-(a7)
|
|
bsr dotelesfx
|
|
move (a7)+,d0
|
|
;
|
|
.notexit cmp #19,d0
|
|
bcc.s .noclr
|
|
;
|
|
;OK, gotta clear all 'event' zones with same type!
|
|
;
|
|
move.l map_poly(pc),a0
|
|
move.l map_ppnt(pc),a1
|
|
moveq #32,d1
|
|
.loop2 cmp zo_ev(a0),d0
|
|
bne.s .skip2
|
|
neg zo_ev(a0)
|
|
.skip2 add.l d1,a0
|
|
cmp.l a1,a0
|
|
bcs.s .loop2
|
|
;
|
|
.noclr move.l a5,eventobj
|
|
bsr execevent
|
|
move.l eventobj(pc),a5
|
|
checkfire ;
|
|
bsr checkfireb
|
|
beq .rts
|
|
;
|
|
move ob_collwith(a5),d2
|
|
and #3,d2
|
|
eor #3,d2 ;colltype
|
|
;
|
|
lea wtable(pc),a0
|
|
move ob_wlevel(a5),d0
|
|
movem 0(a0,d0),d3-d6
|
|
movem.l 8(a0,d0),a2-a3
|
|
move.l 16(a0,d0),-(a7)
|
|
;
|
|
move.b ob_weapon(a5),d0
|
|
sub d3,ob_weapon(a5)
|
|
cmp.b ob_weapon(a5),d0
|
|
beq.s .noup
|
|
;
|
|
bsr calcwlevel
|
|
st ob_update(a5)
|
|
;
|
|
.noup moveq #0,d3
|
|
bsr shoot
|
|
;
|
|
move.l (a7)+,a0
|
|
move.l (a0),a0
|
|
moveq #32,d0
|
|
moveq #0,d1
|
|
bsr playsfx
|
|
;
|
|
.rts rts
|
|
|
|
;
|
|
;weaponuse.w
|
|
;hitpoints
|
|
;damage
|
|
;speed
|
|
;
|
|
wtable dc 0,1,1,32
|
|
dc.l bullet1,sparks1,shootsfx3
|
|
dc $8,5,2,36
|
|
dc.l bullet2,sparks2,shootsfx2
|
|
dc $c,10,3,40
|
|
dc.l bullet3,sparks3,shootsfx
|
|
dc $10,15,4,40
|
|
dc.l bullet4,sparks4,shootsfx4
|
|
dc $20,20,7,24
|
|
dc.l bullet5,sparks5,shootsfx5
|
|
|
|
adjustposq ;
|
|
neg d0
|
|
move d0,d1
|
|
;
|
|
muls zo_a(a4),d0
|
|
add.l d0,d0
|
|
;
|
|
muls zo_b(a4),d1
|
|
add.l d1,d1
|
|
;
|
|
sub.l d0,d6
|
|
sub.l d1,d7
|
|
;
|
|
rts
|
|
|
|
adjustpos bsr adjustposq
|
|
;
|
|
;addq #1,(a4)
|
|
;move.l a4,-(a7)
|
|
bsr checknewslow
|
|
;move.l (a7)+,a3
|
|
;addq #1,(a3)
|
|
tst d1
|
|
rts
|
|
|
|
checkfireb lea cntrls(pc),a0
|
|
move ob_cntrl(a5),d0
|
|
move.l 0(a0,d0*4),a0
|
|
move 4(a0),d0
|
|
beq.s .nofire
|
|
tst ob_lastbut(a5)
|
|
bne.s .skip
|
|
move d0,ob_lastbut(a5)
|
|
rts
|
|
.skip moveq #0,d0
|
|
rts
|
|
.nofire clr ob_lastbut(a5)
|
|
rts
|
|
|
|
eventobj dc.l 0
|
|
|
|
calcbounce ;calculate bounce vector...poly in a4, obj in a5
|
|
;
|
|
;R=2 N (N dot V) - V
|
|
;
|
|
;where R=reflect vector, N=normal to poly, V=original vector
|
|
;
|
|
subq #1,ob_bouncecnt(a5)
|
|
bge.s .nok
|
|
bsr makesparksq
|
|
bra killobject
|
|
.nok ;
|
|
movem ob_nxvec(a5),d0-d1 ;normalized dir
|
|
movem zo_na(a4),d2-d3 ;normal to poly
|
|
neg d2
|
|
;
|
|
;calc dot product:
|
|
;
|
|
move d0,d4
|
|
muls d2,d4
|
|
move d1,d5
|
|
muls d3,d5
|
|
add.l d5,d4
|
|
add.l d4,d4
|
|
swap d4 ;dot product?
|
|
;
|
|
muls d4,d2
|
|
lsl.l #2,d2
|
|
swap d0
|
|
clr d0
|
|
sub.l d0,d2
|
|
swap d2
|
|
;
|
|
muls d4,d3
|
|
lsl.l #2,d3
|
|
swap d1
|
|
clr d1
|
|
sub.l d1,d3
|
|
swap d3
|
|
;
|
|
movem d2-d3,ob_nxvec(a5)
|
|
;
|
|
neg d2
|
|
muls ob_movspeed(a5),d2
|
|
add.l d2,d2
|
|
muls ob_movspeed(a5),d3
|
|
add.l d3,d3
|
|
;
|
|
movem.l d2-d3,ob_xvec(a5)
|
|
;
|
|
move.l d2,d6
|
|
add.l ob_x(a5),d6
|
|
move.l d3,d7
|
|
add.l ob_z(a5),d7
|
|
;
|
|
bsr checknew
|
|
beq putfire
|
|
;
|
|
bra calcbounce
|
|
|
|
firelogic ;
|
|
move.l ob_xvec(a5),d6
|
|
add.l ob_x(a5),d6
|
|
move.l ob_zvec(a5),d7
|
|
add.l ob_z(a5),d7
|
|
;
|
|
bsr checknew
|
|
bne calcbounce
|
|
.nokill ;
|
|
putfire move.l d6,ob_x(a5)
|
|
move.l d7,ob_z(a5)
|
|
;
|
|
addq #1,ob_frame(a5)
|
|
move ob_frame(a5),d0
|
|
move.l ob_shape(a5),a0
|
|
cmp 2(a0),d0
|
|
bcs.s .skip
|
|
clr ob_frame(a5)
|
|
.skip ;
|
|
rts
|
|
|
|
moveblood lea blood(pc),a5
|
|
;
|
|
.loop move.l (a5),a5
|
|
tst.l (a5)
|
|
beq .done
|
|
;
|
|
add.l #$8000,bl_yvec(a5)
|
|
;
|
|
movem.l bl_xvec(a5),d0-d2
|
|
add.l d1,bl_y(a5)
|
|
blt.s .ok
|
|
;
|
|
move.l a5,a0
|
|
killitem blood
|
|
move.l a0,a5
|
|
bra.s .loop
|
|
;
|
|
.ok add.l d0,bl_x(a5)
|
|
add.l d2,bl_z(a5)
|
|
bra.s .loop
|
|
;
|
|
.done rts
|
|
|
|
drawblood lea blood(pc),a5
|
|
;
|
|
.loop move.l (a5),a5
|
|
tst.l (a5)
|
|
beq .done
|
|
;
|
|
move bl_x(a5),d0
|
|
sub camx(pc),d0
|
|
move bl_y(a5),d1
|
|
sub camy(pc),d1
|
|
move bl_z(a5),d2
|
|
sub camz(pc),d2
|
|
;
|
|
;rotate x/z around cam...
|
|
;
|
|
move d0,d3
|
|
move d2,d5
|
|
muls cm1(pc),d0
|
|
muls cm2(pc),d5
|
|
add.l d5,d0
|
|
add.l d0,d0
|
|
swap d0 ;X
|
|
;
|
|
muls cm3(pc),d3
|
|
muls cm4(pc),d2
|
|
add.l d3,d2
|
|
add.l d2,d2
|
|
swap d2 ;Z
|
|
;
|
|
tst d2
|
|
beq .loop
|
|
cmp #maxz,d2
|
|
bcc .loop
|
|
;
|
|
ext.l d0
|
|
lsl.l #focshft,d0
|
|
divs d2,d0
|
|
cmp minx(pc),d0
|
|
blt .loop
|
|
cmp maxx(pc),d0
|
|
bge .loop
|
|
;
|
|
ext.l d1
|
|
lsl.l #focshft,d1
|
|
divs d2,d1
|
|
cmp miny(pc),d1
|
|
blt .loop
|
|
cmp maxy(pc),d1
|
|
bge .loop
|
|
;
|
|
cmp #32,d2
|
|
bcc.s .pix
|
|
;
|
|
;blit to screen!
|
|
;
|
|
move #$4000,$dff09a
|
|
;
|
|
bsr savernd
|
|
move.l window(pc),a0
|
|
move wi_bh(a0),d0
|
|
subq #8,d0
|
|
bsr rndn
|
|
move d0,d2 ;Y
|
|
;
|
|
move wi_bw(a0),d0
|
|
subq #8,d0
|
|
bsr rndn ;X
|
|
add wi_x(a0),d0
|
|
move d2,d1
|
|
;
|
|
move.l wi_bmap(a0),a1
|
|
move.l font(pc),a0
|
|
moveq #46,d2
|
|
bsr blit
|
|
;
|
|
bsr loadrnd
|
|
;
|
|
move.l a5,a0
|
|
killitem blood
|
|
move.l a0,a5
|
|
;
|
|
move #$c000,$dff09a
|
|
bra .loop
|
|
.pix ;
|
|
add midx(pc),d0
|
|
add midy(pc),d1
|
|
;
|
|
move.l darktable(pc),a0
|
|
move 0(a0,d2*2),d3
|
|
;
|
|
move.l cop(pc),a1
|
|
;
|
|
lea coloffs,a2
|
|
add.l 0(a2,d0*4),a1
|
|
mulu copmod(pc),d1
|
|
;
|
|
move blcols(pc,d3*2),d3
|
|
and bl_color(a5),d3
|
|
move d3,0(a1,d1.l)
|
|
bra .loop
|
|
;
|
|
.done rts
|
|
|
|
blcols dc $ccc,$bbb,$aaa,$999,$888,$777,$666,$555
|
|
dc $444,$333,$222,$111,$000,$000,$000,$000
|
|
|
|
;blcols dc $fff,$eee,$ddd,$ccc,$bbb,$aaa,$999,$888
|
|
dc $777,$666,$555,$444,$333,$222,$111,$000
|
|
|
|
drawshape_1sc ;draw shape with one frame, scaled!
|
|
;
|
|
move.l ob_shape(a5),a0
|
|
move ob_frame(a5),d0
|
|
add.l 12(a0,d0*4),a0
|
|
move ob_scale(a5),d7
|
|
bra drawshape
|
|
|
|
drawshape_1 ;
|
|
move.l ob_shape(a5),a0
|
|
move ob_frame(a5),d0
|
|
add.l 12(a0,d0*4),a0
|
|
move #$200,d7 ;scale
|
|
bra drawshape
|
|
|
|
drawshape_8 ;
|
|
;shape has 8 rotations, and a scale!
|
|
;
|
|
bsr calcangle2
|
|
add #16,d0
|
|
sub ob_rot(a5),d0
|
|
lsr #5,d0
|
|
and #7,d0
|
|
move ob_frame(a5),d1
|
|
lsl #3,d1
|
|
or d1,d0
|
|
move.l ob_shape(a5),a0
|
|
move ob_scale(a5),d7
|
|
;
|
|
ifne aga
|
|
add.l 12(a0,d0*4),a0
|
|
elseif
|
|
lsl #2,d0
|
|
add.l 12(a0,d0),a0
|
|
endc
|
|
;
|
|
drawshape move ob_x(a5),d0
|
|
move ob_y(a5),d1
|
|
move ob_z(a5),d2
|
|
drawshape_q ;
|
|
;A0=shape
|
|
;D0=X
|
|
;D1=Y
|
|
;D2=Z
|
|
;D7=sclae factor
|
|
;
|
|
;rotate Z around camera!
|
|
;
|
|
sub camx(pc),d0
|
|
sub camy(pc),d1
|
|
sub camz(pc),d2
|
|
;
|
|
move d0,d3
|
|
move d2,d5
|
|
muls cm3(pc),d3
|
|
muls cm4(pc),d2
|
|
add.l d3,d2
|
|
add.l d2,d2
|
|
swap d2
|
|
;
|
|
tst d2
|
|
ble .rts
|
|
cmp #maxz,d2
|
|
bcc .rts
|
|
;
|
|
muls cm1(pc),d0
|
|
muls cm2(pc),d5
|
|
add.l d5,d0
|
|
add.l d0,d0
|
|
swap d0
|
|
;
|
|
move.l memat(pc),a1
|
|
add.l #sh_size,memat
|
|
movem d0-d2,sh_x(a1)
|
|
move.l a0,sh_shape(a1)
|
|
move d7,sh_scale(a1)
|
|
;
|
|
lea shapelist(pc),a2
|
|
.loop move.l (a2),d0
|
|
beq.s .end
|
|
move.l a2,a3
|
|
move.l d0,a2
|
|
cmp sh_z(a2),d2 ;nearer...further in list
|
|
ble.s .loop
|
|
move.l a2,(a1)
|
|
move.l a1,(a3)
|
|
rts
|
|
.end move.l d0,(a1)
|
|
move.l a1,(a2)
|
|
.rts rts
|
|
|
|
mover ;
|
|
;d4=x speed
|
|
;d5=z speed
|
|
;d6=x
|
|
;d7=z
|
|
;
|
|
;return d0, ne if a wall was hit!
|
|
;check only walls zone (player)
|
|
;
|
|
neg.l d4
|
|
moveq #0,d3
|
|
add.l d4,d6
|
|
bsr checknew
|
|
beq.s .xok
|
|
moveq #-1,d3
|
|
sub.l d4,d6
|
|
.xok ;
|
|
add.l d5,d7
|
|
bsr checknew
|
|
beq.s .zok
|
|
moveq #-1,d3
|
|
sub.l d5,d7
|
|
.zok tst d3
|
|
rts
|
|
|
|
checknew2 ;check trigger zone
|
|
move.l map_grid(pc),a0
|
|
addq #4,a0
|
|
bra.s checknew_
|
|
|
|
gs equ 1<<grdshft
|
|
|
|
checkoffs dc 0,0,-gs,0,gs,0,0,-gs,0,gs
|
|
dc -gs,-gs,gs,-gs,-gs,gs,gs,gs
|
|
|
|
checknew ;check wall zone
|
|
;
|
|
;d6.q=x, d7.q=z
|
|
;
|
|
;check for ob_radsq(a5)
|
|
;
|
|
move.l map_grid(pc),a0
|
|
;
|
|
checknew_ movem.l d3-d7,-(a7)
|
|
swap d6
|
|
swap d7
|
|
;
|
|
lea checkoffs(pc),a1 ;where to check from
|
|
move.l map_poly(pc),a2
|
|
addq #1,frame
|
|
move frame(pc),d3
|
|
moveq #8,d5 ;nine squares
|
|
;
|
|
.loop movem (a1)+,d0-d1
|
|
add d6,d0
|
|
cmp #32<<grdshft,d0
|
|
bcc .next
|
|
add d7,d1
|
|
cmp #32<<grdshft,d1
|
|
bcc .next
|
|
;
|
|
;d0,d1=sq to check!
|
|
;
|
|
lsr #grdshft,d0
|
|
lsr #grdshft,d1
|
|
;
|
|
lsl #5,d1
|
|
add d1,d0
|
|
lea 0(a0,d0*8),a3 ;square to check!
|
|
;
|
|
move (a3)+,d4 ;how many in square
|
|
bmi .next
|
|
move (a3),d1
|
|
;
|
|
move.l map_ppnt(pc),a3
|
|
ifne aga
|
|
lea 0(a3,d1*2),a3
|
|
elseif
|
|
add d1,d1
|
|
lea 0(a3,d1),a3
|
|
endc
|
|
;
|
|
.loop2 move (a3)+,d0
|
|
lsl #5,d0
|
|
lea 0(a2,d0),a4 ;poly to check
|
|
;
|
|
cmp (a4),d3
|
|
beq.s .next2
|
|
move d3,(a4)
|
|
;
|
|
bsr findsegdist
|
|
;
|
|
sub ob_rad(a5),d0
|
|
bpl.s .next2
|
|
;
|
|
movem.l (a7)+,d3-d7
|
|
moveq #-1,d1 ;coll!
|
|
rts
|
|
;
|
|
.next2 dbf d4,.loop2
|
|
;
|
|
.next dbf d5,.loop
|
|
;
|
|
movem.l (a7)+,d3-d7
|
|
moveq #0,d1 ;no coll!
|
|
rts
|
|
|
|
closest dc 0 ;nearest so far!
|
|
closewall dc.l 0
|
|
|
|
checknewslow ;check wall zone
|
|
;
|
|
;d6.q=x, d7.q=z
|
|
;
|
|
;check for ob_radsq(a5)
|
|
;
|
|
move.l map_grid(pc),a0
|
|
;
|
|
movem.l d3-d7,-(a7)
|
|
swap d6
|
|
swap d7
|
|
;
|
|
lea checkoffs(pc),a1 ;where to check from
|
|
move.l map_poly(pc),a2
|
|
addq #1,frame
|
|
move frame(pc),d3
|
|
moveq #8,d5 ;nine squares
|
|
move #$3fff,closest
|
|
;
|
|
.loop movem (a1)+,d0-d1
|
|
add d6,d0
|
|
cmp #32<<grdshft,d0
|
|
bcc.s .next
|
|
add d7,d1
|
|
cmp #32<<grdshft,d1
|
|
bcc.s .next
|
|
;
|
|
;d0,d1=sq to check!
|
|
;
|
|
lsr #grdshft,d0
|
|
lsr #grdshft,d1
|
|
;
|
|
lsl #5,d1
|
|
add d1,d0
|
|
lea 0(a0,d0*8),a3 ;square to check!
|
|
;
|
|
move (a3)+,d4 ;how many in square
|
|
bmi.s .next
|
|
move (a3),d1
|
|
;
|
|
move.l map_ppnt(pc),a3
|
|
lea 0(a3,d1*2),a3
|
|
;
|
|
.loop2 move (a3)+,d0 ;grab poly#
|
|
lsl #5,d0
|
|
lea 0(a2,d0),a4 ;poly to check
|
|
bsr checkpolydist
|
|
dbf d4,.loop2
|
|
.next dbf d5,.loop
|
|
;
|
|
lea rotpolys(pc),a3
|
|
;
|
|
.loop3 move.l (a3),a3
|
|
tst.l (a3)
|
|
beq.s .rpdone
|
|
;
|
|
move.l rp_first(a3),a4
|
|
move rp_num(a3),d4
|
|
subq #1,d4
|
|
;
|
|
.loop4 bsr checkpolydist
|
|
lea 32(a4),a4
|
|
dbf d4,.loop4
|
|
;
|
|
bra.s .loop3
|
|
.rpdone ;
|
|
movem.l (a7)+,d3-d7
|
|
move closest(pc),d0
|
|
sub ob_rad(a5),d0
|
|
bpl.s .wallok
|
|
move.l closewall(pc),a4
|
|
moveq #-1,d1
|
|
rts
|
|
.wallok moveq #0,d1
|
|
rts
|
|
|
|
checkpolydist ;
|
|
cmp (a4),d3
|
|
beq .rts
|
|
move d3,(a4)
|
|
;
|
|
move zo_rx(a4),d0
|
|
sub d6,d0
|
|
muls zo_na(a4),d0
|
|
move zo_rz(a4),d1
|
|
sub d7,d1
|
|
muls zo_nb(a4),d1
|
|
add.l d1,d0
|
|
add.l d0,d0
|
|
swap d0 ;distance from end
|
|
;
|
|
cmp zo_ln(a4),d0
|
|
bcc.s .rts
|
|
;
|
|
;find perpendicular dist.
|
|
;
|
|
move zo_rx(a4),d0
|
|
sub d6,d0
|
|
muls zo_a(a4),d0
|
|
move zo_rz(a4),d1
|
|
sub d7,d1
|
|
muls zo_b(a4),d1
|
|
add.l d1,d0
|
|
add.l d0,d0
|
|
bpl.s .pl
|
|
neg.l d0
|
|
.pl swap d0 ;perpendicular dist.w
|
|
;
|
|
cmp closest(pc),d0
|
|
bcc.s .rts
|
|
move d0,closest
|
|
move.l a4,closewall
|
|
;
|
|
.rts rts
|
|
|
|
findsegdist ;find distance from d6,d7 to zone in a4...
|
|
;
|
|
;find end dist
|
|
move zo_rx(a4),d0
|
|
sub d6,d0
|
|
muls zo_na(a4),d0
|
|
move zo_rz(a4),d1
|
|
sub d7,d1
|
|
muls zo_nb(a4),d1
|
|
add.l d1,d0
|
|
add.l d0,d0
|
|
swap d0 ;distance from end
|
|
;
|
|
cmp zo_ln(a4),d0
|
|
bcs.s .perp ;use perpendicular distance!
|
|
;
|
|
move #$3fff,d0
|
|
rts
|
|
;
|
|
.perp ;find perpendicular dist.
|
|
;
|
|
move zo_rx(a4),d0
|
|
sub d6,d0
|
|
muls zo_a(a4),d0
|
|
move zo_rz(a4),d1
|
|
sub d7,d1
|
|
muls zo_b(a4),d1
|
|
add.l d1,d0
|
|
add.l d0,d0
|
|
bpl.s .pl
|
|
neg.l d0
|
|
.pl swap d0 ;perpendicular dist.w
|
|
rts
|
|
|
|
findsegdist2 ;find distance from d6,d7 to zone in a4...
|
|
;
|
|
;find perpendicular dist.
|
|
;
|
|
move zo_rx(a4),d0
|
|
sub d6,d0
|
|
muls zo_a(a4),d0
|
|
move zo_rz(a4),d1
|
|
sub d7,d1
|
|
muls zo_b(a4),d1
|
|
add.l d1,d0
|
|
add.l d0,d0
|
|
swap d0 ;perpendicular dist.w
|
|
muls d0,d0
|
|
;
|
|
;find distance from end
|
|
;
|
|
move zo_rx(a4),d1
|
|
sub d6,d1
|
|
muls zo_na(a4),d1
|
|
move zo_rz(a4),d2
|
|
sub d7,d2
|
|
muls zo_nb(a4),d2
|
|
add.l d2,d1
|
|
add.l d1,d1
|
|
swap d1 ;distance from end
|
|
;
|
|
cmp zo_ln(a4),d1
|
|
bcs.s .perp ;use perpendicular distance!
|
|
;
|
|
;gotta find radial distance
|
|
;
|
|
blt.s .min ;minus?
|
|
sub zo_ln(a4),d1
|
|
.min muls d1,d1
|
|
add.l d1,d0
|
|
;
|
|
.perp rts
|
|
|
|
calccamera ;a0=player object
|
|
;
|
|
move.l camrots(pc),a2
|
|
;
|
|
move ob_x(a0),camx
|
|
move ob_y(a0),d0
|
|
add ob_eyey(a0),d0
|
|
;
|
|
;add bounce!
|
|
;
|
|
move ob_bounce(a0),d1
|
|
and #255,d1
|
|
move 2(a2,d1*8),d1
|
|
muls #20,d1
|
|
swap d1
|
|
add d1,d0
|
|
;
|
|
move d0,camy
|
|
move ob_z(a0),camz
|
|
move ob_rot(a0),d0
|
|
and #255,d0
|
|
move d0,camr
|
|
move.l camrots(pc),a1
|
|
;
|
|
ifne aga
|
|
lea 0(a1,d0*8),a1
|
|
elseif
|
|
lsl #3,d0
|
|
lea 0(a1,d0),a1
|
|
lsr #3,d0
|
|
endc
|
|
;
|
|
move.l (a1)+,cm1
|
|
move.l (a1),cm3
|
|
;
|
|
;calc inverse camera matrix!
|
|
;
|
|
move.l camrots(pc),a1
|
|
neg d0
|
|
and #255,d0
|
|
;
|
|
ifne aga
|
|
lea 0(a1,d0*8),a1
|
|
elseif
|
|
lsl #3,d0
|
|
lea 0(a1,d0),a1
|
|
lsr #3,d0
|
|
endc
|
|
;
|
|
move.l (a1)+,icm1
|
|
move.l (a1),icm3
|
|
;
|
|
rts
|
|
|
|
readjoys ;set up joyx0,joyy0,joyx1,joyy1
|
|
;
|
|
move.l rawtable(pc),a0
|
|
moveq #0,d0
|
|
key $4f
|
|
beq.s .nleft
|
|
moveq #-1,d0
|
|
.nleft key $4e
|
|
beq.s .nrite
|
|
moveq #1,d0
|
|
.nrite move d0,joyx2
|
|
moveq #0,d0
|
|
key $4c
|
|
beq.s .nup
|
|
moveq #-1,d0
|
|
.nup key $4d
|
|
beq.s .ndown
|
|
moveq #1,d0
|
|
.ndown move d0,joyy2
|
|
key $64
|
|
sne d0
|
|
ext d0
|
|
move d0,d1
|
|
beq.s .nofire
|
|
tst joyb2
|
|
beq.s .nofire
|
|
moveq #0,d1
|
|
.nofire move d1,joyf2
|
|
move d0,joyb2
|
|
;
|
|
move.b $bfe001,d3
|
|
move $dff00a,d2 ;joy0
|
|
bsr readjoy
|
|
move d0,joyx0
|
|
move d1,joyy0
|
|
;bsr makerot
|
|
;move d0,joyr0
|
|
btst #6,$bfe001
|
|
seq d0
|
|
ext d0
|
|
move d0,d1
|
|
beq.s .nofire2
|
|
tst joyb0
|
|
beq.s .nofire2
|
|
moveq #0,d1
|
|
.nofire2 move d1,joyf0
|
|
move d0,joyb0
|
|
;
|
|
move $dff00c,d2
|
|
bsr readjoy
|
|
move d0,joyx1
|
|
move d1,joyy1
|
|
;bsr makerot
|
|
;move d0,joyr1
|
|
btst #7,$bfe001
|
|
seq d0
|
|
ext d0
|
|
move d0,d1
|
|
beq.s .nofire3
|
|
tst joyb1
|
|
beq.s .nofire3
|
|
moveq #0,d1
|
|
.nofire3 move d1,joyf1
|
|
move d0,joyb1
|
|
;
|
|
rts
|
|
|
|
makerot ;convert d0,d1 into a rotation type setting...
|
|
;
|
|
;0=up, 1=up/rite, 2=rite etc...
|
|
;
|
|
;<0=no dir
|
|
;
|
|
addq #1,d0
|
|
lsl #2,d0
|
|
addq #1,d1
|
|
or d1,d0
|
|
add d0,d0
|
|
move rots(pc,d0),d0
|
|
rts
|
|
|
|
rots ;x=-1
|
|
dc 7,6,5,-1
|
|
;x=0
|
|
dc 0,-1,4,-1
|
|
;x=1
|
|
dc 1,2,3,-1
|
|
|
|
readjoy bsr joydir
|
|
move d1,d0
|
|
move d2,d1
|
|
add d1,d1
|
|
eor d1,d2
|
|
;
|
|
joydir btst #9,d2
|
|
bne.s .neg
|
|
btst #1,d2
|
|
bne.s .pos
|
|
moveq #0,d1
|
|
rts
|
|
.neg moveq #-1,d1
|
|
rts
|
|
.pos moveq #1,d1
|
|
rts
|
|
|
|
gridoffs incbin gridoffs4.bin
|
|
gridoffsf
|
|
|
|
makewalls ;
|
|
;New approach!
|
|
;
|
|
;use poly's line eq to test perpendicular distance to wall
|
|
;produce nearest -> furthest wall list.
|
|
;
|
|
;optimizations...
|
|
;check if both z's are negative after rotation
|
|
;check if projected left/rite ends are on screen
|
|
;
|
|
addq #1,frame
|
|
;
|
|
clr.l inlist
|
|
move.l #inlist,inlistf
|
|
;
|
|
move.l map_poly(pc),a4
|
|
move.l map_ppnt(pc),a3
|
|
move.l map_grid(pc),a2
|
|
movem camx(pc),d6-d7 ;x,z
|
|
lsr #grdshft,d6
|
|
lsr #grdshft,d7
|
|
lea gridoffs(pc),a6
|
|
moveq #(gridoffsf-gridoffs)>>2-1,d5
|
|
;
|
|
.loop movem (a6)+,d0-d1
|
|
add d6,d0
|
|
cmp #32,d0
|
|
bcc .skip
|
|
add d7,d1
|
|
cmp #32,d1
|
|
bcc .skip
|
|
;
|
|
;d0,d1=x/z of map to check!
|
|
;
|
|
lsl #5,d1 ;Y*32...
|
|
add d1,d0 ;+X
|
|
lea 0(a2,d0*8),a0 ;mapgrid
|
|
move (a0)+,d4 ;how many polys here
|
|
bmi .skip
|
|
move (a0),d0 ;poly data offset
|
|
;
|
|
ifne aga
|
|
lea 0(a3,d0*2),a0
|
|
elseif
|
|
add d0,d0
|
|
lea 0(a3,d0),a0
|
|
endc
|
|
;
|
|
.loop2 move (a0)+,d0 ;poly#
|
|
lsl #5,d0
|
|
lea 0(a4,d0),a1 ;actual poly
|
|
move frame(pc),d0
|
|
cmp zo_done(a1),d0
|
|
beq .skip3
|
|
move d0,zo_done(a1)
|
|
tst zo_open(a1)
|
|
bmi .skip3
|
|
;
|
|
;OK, setup:
|
|
;
|
|
;d0=lx,d1=lz,d2=rx,d3=rz
|
|
;d4=t,d5=sc,d6=dist
|
|
;
|
|
;back face/dist check...
|
|
;
|
|
movem d4-d7,-(a7)
|
|
;
|
|
movem zo_lx(a1),d0-d3 ;x1,z1,x2,z2
|
|
movem camx(pc),d6-d7
|
|
;
|
|
sub d6,d0
|
|
sub d7,d1
|
|
sub d6,d2
|
|
sub d7,d3
|
|
;
|
|
move d0,d4
|
|
move d1,d5
|
|
muls cm1(pc),d0
|
|
muls cm2(pc),d5
|
|
add.l d5,d0
|
|
add.l d0,d0
|
|
swap d0
|
|
;
|
|
muls cm3(pc),d4
|
|
muls cm4(pc),d1
|
|
add.l d4,d1
|
|
add.l d1,d1
|
|
swap d1 ;LZ
|
|
;
|
|
move d2,d4
|
|
move d3,d5
|
|
muls cm1(pc),d2
|
|
muls cm2(pc),d5
|
|
add.l d5,d2
|
|
add.l d2,d2
|
|
swap d2 ;RX
|
|
;
|
|
muls cm3(pc),d4
|
|
muls cm4(pc),d3
|
|
add.l d4,d3
|
|
add.l d3,d3
|
|
swap d3 ;RZ
|
|
;
|
|
;check Z's...
|
|
tst d1
|
|
bgt.s .zok
|
|
tst d3
|
|
ble .skip2
|
|
.zok ;
|
|
cmp #maxz,d1
|
|
blt.s .zok2
|
|
cmp #maxz,d3
|
|
bge .skip2
|
|
.zok2 ;
|
|
;do backface check...generate a,b,c...
|
|
;
|
|
rol.l #exshft,d0
|
|
rol.l #exshft,d1
|
|
rol.l #exshft,d2
|
|
rol.l #exshft,d3
|
|
;
|
|
move d1,d4
|
|
sub d3,d4 ;a
|
|
move d2,d5
|
|
sub d0,d5 ;b
|
|
;
|
|
move d0,d6
|
|
muls d4,d6
|
|
move d1,d7
|
|
muls d5,d7
|
|
add.l d7,d6
|
|
bpl.s .front
|
|
;
|
|
;backface showing!...
|
|
bra .skip2
|
|
.front ;
|
|
move.l memat(pc),a5
|
|
;
|
|
movem d0-d5,wl_lx(a5)
|
|
move.l d6,wl_c(a5)
|
|
;
|
|
;work out some screen positions!
|
|
tst d1
|
|
bgt.s .z1ok
|
|
;
|
|
;lz bad, rz must be OK...
|
|
;
|
|
.ov1 move minx(pc),wl_lsx(a5)
|
|
bra.s .z1sk
|
|
;
|
|
.z1ok ext.l d0
|
|
lsl.l #focshft,d0
|
|
divs d1,d0
|
|
bvs.s .ov1
|
|
subq #1,d0
|
|
cmp maxx(pc),d0
|
|
bge .skip2
|
|
move d0,wl_lsx(a5)
|
|
.z1sk ;
|
|
tst d3
|
|
bgt.s .z2ok
|
|
;
|
|
;rz bad, lz must be OK...
|
|
;
|
|
.ov2 move maxx(pc),wl_rsx(a5)
|
|
bra.s .z2sk
|
|
;
|
|
.z2ok ext.l d2
|
|
lsl.l #focshft,d2
|
|
divs d3,d2
|
|
bvs.s .ov2
|
|
addq #1,d2
|
|
cmp minx(pc),d2
|
|
blt .skip2
|
|
move d2,wl_rsx(a5)
|
|
.z2sk ;
|
|
cmp d1,d3
|
|
bge.s .zskp
|
|
exg d1,d3
|
|
.zskp movem d1/d3,wl_nz(a5) ;near/far Z
|
|
;
|
|
move.l zo_t(a1),wl_t(a5)
|
|
move.l zo_t+4(a1),wl_t+4(a5)
|
|
move zo_sc(a1),wl_sc(a5)
|
|
move zo_open(a1),wl_open(a5)
|
|
;
|
|
;add to end of inlist...
|
|
;
|
|
clr.l (a5)
|
|
move.l inlistf(pc),a1
|
|
move.l a5,(a1)
|
|
move.l a5,inlistf
|
|
add.l #wl_size,memat
|
|
;
|
|
.skip2 movem (a7)+,d4-d7
|
|
;
|
|
.skip3 dbf d4,.loop2 ;finish sq
|
|
;
|
|
.skip dbf d5,.loop ;gridoffs
|
|
;
|
|
makeoutlist ;create outlist from inlist
|
|
;
|
|
clr.l outlist
|
|
move.l #outlist,outlistf
|
|
;
|
|
.loop lea inlist(pc),a0
|
|
move.l (a0),d0
|
|
beq .done
|
|
move.l a0,a2 ;save previous!
|
|
move.l d0,a0
|
|
;
|
|
;OK, see if any are in front of a0...
|
|
;
|
|
lea inlist(pc),a1
|
|
;
|
|
.loop2 move.l (a1),d0
|
|
beq .none
|
|
move.l a1,a3
|
|
move.l d0,a1
|
|
cmp.l a0,a1
|
|
beq.s .loop2 ;don't compare with self!
|
|
;
|
|
;check screen pos overlap...
|
|
;
|
|
move wl_rsx(a0),d0
|
|
cmp wl_lsx(a1),d0
|
|
blt .loop2
|
|
;
|
|
move wl_lsx(a0),d1
|
|
cmp wl_rsx(a1),d1
|
|
bgt .loop2
|
|
;
|
|
;check near/far Z overlap
|
|
;
|
|
move wl_nz(a1),d2
|
|
cmp wl_fz(a0),d2
|
|
bge .loop2 ;behind!
|
|
;
|
|
move wl_fz(a1),d2
|
|
cmp wl_nz(a0),d2
|
|
ble .swap
|
|
;
|
|
tst wl_open(a1)
|
|
bne .swap
|
|
;
|
|
;look at a0 points against a1 line...
|
|
;
|
|
movem wl_a(a1),d5-d6
|
|
move.l wl_c(a1),d7
|
|
;
|
|
move wl_lx(a1),d0
|
|
sub wl_lx(a0),d0
|
|
muls d5,d0
|
|
move wl_lz(a1),d1
|
|
sub wl_lz(a0),d1
|
|
muls d6,d1
|
|
add.l d1,d0
|
|
eor.l d7,d0
|
|
;
|
|
move wl_lx(a1),d1
|
|
sub wl_rx(a0),d1
|
|
muls d5,d1
|
|
move wl_lz(a1),d2
|
|
sub wl_rz(a0),d2
|
|
muls d6,d2
|
|
add.l d2,d1
|
|
eor.l d7,d1
|
|
;
|
|
;if both a0 in front, no swap
|
|
;
|
|
move.l d0,d4
|
|
or.l d1,d4
|
|
bpl .loop2 ;both a0's in front of a1!
|
|
;
|
|
;if both a0 behind, swap
|
|
;
|
|
and.l d1,d0
|
|
bmi .swap ;both a0's behind a1!
|
|
;
|
|
;look at a1 points against a0 line!
|
|
;
|
|
movem wl_a(a0),d5-d6
|
|
move.l wl_c(a0),d7
|
|
;
|
|
move wl_lx(a0),d2
|
|
sub wl_lx(a1),d2
|
|
muls d5,d2
|
|
move wl_lz(a0),d3
|
|
sub wl_lz(a1),d3
|
|
muls d6,d3
|
|
add.l d3,d2
|
|
eor.l d7,d2
|
|
;
|
|
move wl_lx(a0),d3
|
|
sub wl_rx(a1),d3
|
|
muls d5,d3
|
|
move wl_lz(a0),d4
|
|
sub wl_rz(a1),d4
|
|
muls d6,d4
|
|
add.l d4,d3
|
|
eor.l d7,d3
|
|
;
|
|
move.l d2,d4
|
|
and.l d3,d4
|
|
bmi .loop2 ;both a1's behind a0!
|
|
;
|
|
or.l d3,d2
|
|
bmi .loop2
|
|
;
|
|
.swap move.l a1,a0
|
|
move.l a3,a2
|
|
bra .loop2
|
|
;
|
|
.none ;OK, none in front of this (a0)
|
|
;
|
|
move.l (a0),(a2) ;unlink from inlist
|
|
clr.l (a0)
|
|
;
|
|
move.l outlistf(pc),a2
|
|
move.l a0,(a2)
|
|
move.l a0,outlistf
|
|
bra .loop
|
|
;
|
|
.done rts
|
|
|
|
elseif
|
|
|
|
makeoutlist2 ;create outlist from inlist
|
|
;
|
|
.loop0 lea inlist(pc),a0
|
|
;
|
|
.loop move.l (a0),d0
|
|
beq .done
|
|
move.l a0,a2 ;save previous!
|
|
move.l d0,a0
|
|
;
|
|
;OK, see if any are in front of a0...
|
|
;
|
|
lea inlist(pc),a1
|
|
;
|
|
.loop2 move.l (a1),d0
|
|
beq .none
|
|
move.l a1,a3
|
|
move.l d0,a1
|
|
;
|
|
cmp.l a0,a1
|
|
beq.s .loop2 ;don't compare with self!
|
|
;
|
|
;see if a1 is in front of a0
|
|
;
|
|
move wl_nz(a1),d0
|
|
cmp wl_fz(a0),d0
|
|
bge .loop2 ;behind!
|
|
;
|
|
move wl_fz(a1),d0
|
|
cmp wl_nz(a0),d0
|
|
ble .swap
|
|
;
|
|
;now, compare screen x coords.....
|
|
;
|
|
move wl_rsx(a0),d0
|
|
cmp wl_lsx(a1),d0
|
|
blt .loop2
|
|
;
|
|
move wl_lsx(a0),d0
|
|
cmp wl_rsx(a1),d0
|
|
bgt .loop2
|
|
;
|
|
;look at a0 points against a1 line
|
|
;
|
|
;If Sgn((x3-x1)*a2+(y3-y1)*b2)<>Sgn(c2)
|
|
; If Sgn((x3-x2)*a2+(y3-y2)*b2)<>Sgn(c2)
|
|
; tr=-1:Return
|
|
; EndIf
|
|
;EndIf
|
|
;
|
|
movem wl_a(a1),d5-d6
|
|
move.l wl_c(a1),d7
|
|
;
|
|
move wl_lx(a1),d0
|
|
sub wl_lx(a0),d0
|
|
muls d5,d0
|
|
move wl_lz(a1),d1
|
|
sub wl_lz(a0),d1
|
|
muls d6,d1
|
|
add.l d1,d0
|
|
eor.l d7,d0
|
|
;
|
|
move wl_lx(a1),d1
|
|
sub wl_rx(a0),d1
|
|
muls d5,d1
|
|
move wl_lz(a1),d2
|
|
sub wl_rz(a0),d2
|
|
muls d6,d2
|
|
add.l d2,d1
|
|
eor.l d7,d1
|
|
;
|
|
;OK, screen X's overlap...
|
|
;if both a0 in front, no swap
|
|
;
|
|
move.l d0,d4
|
|
or.l d1,d4
|
|
bpl .loop2
|
|
;
|
|
;if both a0 behind, swap
|
|
;
|
|
move.l d0,d4
|
|
and.l d1,d4
|
|
bmi .swap
|
|
;
|
|
;bra .loop2
|
|
;
|
|
;elseif
|
|
;look at a1 points against a0 line
|
|
;
|
|
;If Sgn((x1-x3)*a1+(y1-y3)*b1)=Sgn(c1)
|
|
; If Sgn((x1-x4)*a1+(y1-y4)*b1)=Sgn(c1)
|
|
; tr=-1:Return
|
|
; EndIf
|
|
;EndIf
|
|
;
|
|
movem wl_a(a0),d5-d6
|
|
move.l wl_c(a0),d7
|
|
;
|
|
move wl_lx(a0),d2
|
|
sub wl_lx(a1),d2
|
|
muls d5,d2
|
|
move wl_lz(a0),d3
|
|
sub wl_lz(a1),d3
|
|
muls d6,d3
|
|
add.l d3,d2
|
|
eor.l d7,d2
|
|
;
|
|
move wl_lx(a0),d3
|
|
sub wl_rx(a1),d3
|
|
muls d5,d3
|
|
move wl_lz(a0),d4
|
|
sub wl_rz(a1),d4
|
|
muls d6,d4
|
|
add.l d4,d3
|
|
eor.l d7,d3
|
|
;
|
|
;if both a1's behind, no swap
|
|
;
|
|
move.l d2,d4
|
|
and.l d3,d4
|
|
bmi .loop2 ;both a1's behind...
|
|
;
|
|
;if both a1's in front, swap
|
|
move.l d2,d4
|
|
or.l d3,d4
|
|
bpl .swap
|
|
;
|
|
bra .loop2
|
|
;
|
|
;elseif
|
|
;
|
|
.swap ;a1 is infront of a0! make a1 new frontmost
|
|
bra .loop
|
|
move.l a1,a0
|
|
move.l a3,a2
|
|
bra .loop2
|
|
;
|
|
.none ;OK, none in front of this (a0)
|
|
;
|
|
move.l (a0),(a2) ;unlink from inlist
|
|
clr.l (a0)
|
|
move.l outlistf(pc),a2
|
|
move.l a0,(a2)
|
|
move.l a0,outlistf
|
|
bra .loop0
|
|
;
|
|
.done ;move.l inlist(pc),d0
|
|
;bne .loop0
|
|
rts
|
|
|
|
elseif
|
|
|
|
castwalls ;process 'walls' list
|
|
;
|
|
move.l castrots(pc),a6
|
|
move minx(pc),d7
|
|
;
|
|
ifne aga
|
|
lea 0(a6,d7*8),a6
|
|
elseif
|
|
move d7,d0
|
|
lsl #3,d0
|
|
lea 0(a6,d0),a6
|
|
endc
|
|
;
|
|
move.l vertdraws(pc),a4
|
|
;
|
|
.loop ;do this vert line!
|
|
;
|
|
lea outlist(pc),a5
|
|
;
|
|
.loop2 move.l (a5),d0
|
|
beq .empty
|
|
move.l d0,a5
|
|
;
|
|
cmp wl_lsx(a5),d7
|
|
blt.s .loop2
|
|
cmp wl_rsx(a5),d7
|
|
bgt.s .loop2
|
|
;
|
|
movem wl_lx(a5),d0-d1
|
|
muls (a6),d0
|
|
muls 2(a6),d1
|
|
add.l d1,d0 ;LX!
|
|
bgt .loop2
|
|
;
|
|
movem wl_rx(a5),d1-d2
|
|
muls (a6),d1
|
|
muls 2(a6),d2
|
|
add.l d2,d1 ;RX!
|
|
blt .loop2
|
|
;
|
|
sub.l d0,d1
|
|
;
|
|
swap d1
|
|
tst d1
|
|
ble.s .dfix
|
|
neg.l d0
|
|
divu d1,d0
|
|
bvc.s .noov
|
|
.dfix moveq #-1,d0
|
|
.noov lsr #1,d0 ;fraction -> unsigned
|
|
;
|
|
cmp wl_open(a5),d0
|
|
bcs.s .loop2
|
|
;
|
|
movem wl_lx(a5),d1-d2
|
|
muls 4(a6),d1
|
|
muls 6(a6),d2
|
|
add.l d2,d1
|
|
add.l d1,d1 ;lz
|
|
;
|
|
movem wl_rx(a5),d2-d3
|
|
muls 4(a6),d2
|
|
muls 6(a6),d3
|
|
add.l d3,d2
|
|
add.l d2,d2 ;rz
|
|
;
|
|
sub.l d1,d2
|
|
swap d2
|
|
muls d0,d2
|
|
add.l d2,d2
|
|
add.l d1,d2
|
|
;
|
|
swap d2
|
|
;
|
|
cmp #exone,d2
|
|
blt .loop2
|
|
cmp #maxz<<exshft,d2
|
|
bcs .zisok
|
|
;
|
|
.empty move #32767,vd_z(a4)
|
|
clr.l vd_data(a4)
|
|
bra .next
|
|
.zisok ;
|
|
;d0=frac, d2=z, a5=item
|
|
;
|
|
;calc column#
|
|
;
|
|
move.l a4,a0 ;do vd...
|
|
;
|
|
move wl_sc(a5),d1
|
|
bgt.s .mul
|
|
neg d1
|
|
ext.l d0
|
|
add.l d0,d0
|
|
lsr.l d1,d0
|
|
bra.s .scdone
|
|
;
|
|
.mul mulu d1,d0
|
|
.scdone ;
|
|
move.l d0,d1
|
|
swap d1 ;0...sc-1
|
|
and #7,d1
|
|
move.b wl_t(a5,d1),d1
|
|
;
|
|
lea textures(pc),a3
|
|
;
|
|
ifne aga
|
|
move.l 0(a3,d1*4),a3 ;texture!
|
|
elseif
|
|
lsl #2,d1
|
|
move.l 0(a3,d1),a3
|
|
endc
|
|
;
|
|
lsl.l #6,d0 ;*64
|
|
swap d0
|
|
and #63,d0 ;0...w-1
|
|
;
|
|
move d0,d1
|
|
lsl #6,d0
|
|
add d1,d0
|
|
;
|
|
add d0,a3
|
|
;
|
|
move d2,d3
|
|
lsr #exshft,d3
|
|
;
|
|
;a3=texture column!
|
|
;
|
|
tst.b (a3)+
|
|
beq.s .solid
|
|
;
|
|
bsr makestrip ;do strip!
|
|
;
|
|
.solid move.l a3,vd_data(a0) ;start column
|
|
;
|
|
;fill in vd struct...
|
|
;
|
|
move d3,d4
|
|
move.l darktable(pc),a2
|
|
move 0(a2,d4*2),d4
|
|
movem d3-d4,vd_z(a0)
|
|
;
|
|
lsr #exshft,d2
|
|
;
|
|
move #-255,d3
|
|
sub camy(pc),d3
|
|
move d3,d1
|
|
ext.l d3
|
|
lsl.l #focshft,d3
|
|
divs d2,d3 ;top Y
|
|
;
|
|
move camy(pc),d4
|
|
neg d4
|
|
ext.l d4
|
|
lsl.l #focshft,d4
|
|
divs d2,d4 ;bot Y
|
|
;
|
|
sub d3,d4
|
|
movem d3/d4,vd_y(a0)
|
|
;
|
|
neg d1
|
|
neg d3
|
|
asr #2,d1
|
|
;
|
|
;d1=real hite.q
|
|
;d4=screen hite.l...
|
|
;calc d1,step.q
|
|
;
|
|
ifne aga
|
|
swap d1
|
|
clr d1
|
|
ext.l d3
|
|
divu.l d3,d1
|
|
elseif
|
|
divu d3,d1 ;d1 low=int part, hi=rem
|
|
move.l d1,d0
|
|
clr d0
|
|
divu d3,d0
|
|
swap d1
|
|
move d0,d1
|
|
endc
|
|
;
|
|
move.l d1,vd_ystep(a0)
|
|
;
|
|
cmp.l a0,a4
|
|
bne .loop2
|
|
;
|
|
.next ;onto next display column
|
|
;
|
|
lea vd_size(a4),a4
|
|
addq #8,a6
|
|
addq #1,d7
|
|
cmp maxx(pc),d7
|
|
blt .loop
|
|
;
|
|
check .loop
|
|
;
|
|
rts
|
|
|
|
makestrip ;this wall strip has see through bits!
|
|
;insert it into shape list instead of vd list!
|
|
;
|
|
move.l memat(pc),a0
|
|
add.l #vd_size,memat
|
|
;
|
|
move.l memat(pc),a1
|
|
add.l #sh_size,memat
|
|
;
|
|
clr.l (a1)
|
|
move d7,sh_x(a1)
|
|
move d3,sh_z(a1)
|
|
clr.l sh_shape(a1)
|
|
move.l a0,sh_strip(a1)
|
|
;
|
|
;insert into drawlist!
|
|
;
|
|
movem.l a2-a3,-(a7)
|
|
;
|
|
lea shapelist(pc),a2
|
|
.loop move.l (a2),d0
|
|
beq.s .end
|
|
move.l a2,a3
|
|
move.l d0,a2
|
|
cmp sh_z(a2),d3 ;nearer...further in list
|
|
blt.s .loop
|
|
move.l a2,(a1)
|
|
move.l a1,(a3)
|
|
bra.s .ins
|
|
.end move.l d0,(a1)
|
|
move.l a1,(a2)
|
|
.ins movem.l (a7)+,a2-a3
|
|
;
|
|
rts
|
|
|
|
dbwindow ;a0=window to double buffer....
|
|
;
|
|
movem.l wi_cop(a0),d0-d1
|
|
cmp.l d0,d1
|
|
bne.s .skip
|
|
move.l wi_cop2(a0),d1
|
|
.skip move.l d1,wi_cop(a0)
|
|
;
|
|
usewindow ;a0=window to use...
|
|
;
|
|
move.l a0,window
|
|
move.l wi_cop(a0),cop
|
|
move.l wi_bmap(a0),bitmap
|
|
;
|
|
move wi_copmod(a0),copmod
|
|
move wi_w(a0),d0
|
|
move d0,width
|
|
move d0,d1
|
|
lsr #5,d1
|
|
move d1,wdiv32
|
|
move d0,d1
|
|
and #31,d1
|
|
subq #1,d1
|
|
move d1,wrem32
|
|
;
|
|
lsr #1,d0
|
|
move d0,maxx
|
|
neg d0
|
|
move d0,minx
|
|
;
|
|
move wi_h(a0),d1
|
|
move d1,hite
|
|
lsr #1,d1
|
|
move d1,maxy
|
|
neg d1
|
|
move d1,miny
|
|
;
|
|
rts
|
|
|
|
drawstrip_ macro
|
|
;
|
|
;a1=top of dest column
|
|
;a2=palettes base
|
|
;a4=strip data
|
|
;
|
|
move hite(pc),d6
|
|
;
|
|
move.l vd_data(a4),d0
|
|
beq .vertskip
|
|
;
|
|
move.l d0,a0
|
|
;
|
|
move vd_h(a4),d5
|
|
move.l vd_ystep(a4),d1
|
|
;
|
|
;setup d6, how much more to cls!
|
|
;
|
|
move vd_y(a4),d0
|
|
add midy(pc),d0
|
|
bpl.s .noclip
|
|
;
|
|
;gotta clip Y
|
|
add d0,d5 ;reduce hite
|
|
ble .vertskip
|
|
neg d0
|
|
;
|
|
;d1=ystep.q, d0=y.w...
|
|
;
|
|
ifne aga
|
|
ext.l d0
|
|
mulu.l d1,d0 ;y step* y
|
|
elseif
|
|
move d0,d2
|
|
mulu d1,d2
|
|
swap d1
|
|
mulu d1,d0
|
|
swap d0
|
|
add.l d2,d0
|
|
swap d1
|
|
endc
|
|
;
|
|
cmp d6,d5
|
|
ble .skipclip
|
|
move d6,d5
|
|
bra.s .skipclip
|
|
;
|
|
.noclip ;OK, cls down to Y in d0!
|
|
;
|
|
ifne solidstrip
|
|
;
|
|
beq.s .skcl
|
|
move d0,d2
|
|
lsl #6,d2
|
|
or #1,d2
|
|
bwait
|
|
move.l qstrip(pc),$dff050 ;APth
|
|
move.l a1,$dff054 ;Dpth
|
|
move d2,$dff058 ;size...
|
|
;
|
|
endc
|
|
;
|
|
;start draw from here...
|
|
.skcl move d0,d2
|
|
mulu copmod(pc),d2
|
|
add.l d2,a1
|
|
;
|
|
move d0,d2
|
|
add d5,d2
|
|
sub d6,d2
|
|
ble.s .skipclip2
|
|
sub d2,d5
|
|
ble .vertskip
|
|
;
|
|
.skipclip2 sub d0,d6
|
|
moveq #0,d0
|
|
.skipclip ;
|
|
sub d5,d6
|
|
;
|
|
subq #1,d5
|
|
swap d0
|
|
swap d1
|
|
move vd_pal(a4),d2
|
|
;
|
|
ifne aga
|
|
move.l 0(a2,d2*4),a3
|
|
elseif
|
|
lsl #2,d2
|
|
move.l 0(a2,d2),a3
|
|
endc
|
|
;
|
|
moveq #0,d2
|
|
moveq #0,d3
|
|
move copmod(pc),d4
|
|
ext.l d4
|
|
;
|
|
ifeq solidstrip
|
|
move.b -1(a0),d6
|
|
ext d6
|
|
move stripands(pc,d6*2),d6
|
|
endc
|
|
;
|
|
.vertloop ;a0=src texture column
|
|
;a1=dest coppoke
|
|
;a3=palette
|
|
;d0=current Y
|
|
;d1=Y step
|
|
;d2=0
|
|
;d3=$00xx
|
|
;d4=copmod
|
|
;d5=count
|
|
;
|
|
move.b 0(a0,d0),d3 ;lut entry
|
|
;
|
|
ifeq solidstrip
|
|
bne.s .coln
|
|
and d6,(a1)
|
|
add.l d1,d0
|
|
addx d2,d0
|
|
add.l d4,a1
|
|
dbf d5,.vertloop
|
|
bra.s .vertskip
|
|
endc
|
|
.coln ;
|
|
ifne aga
|
|
move 0(a3,d3*2),(a1) ;colour!
|
|
elseif
|
|
add d3,d3
|
|
move 0(a3,d3),(a1)
|
|
moveq #0,d3
|
|
endc
|
|
;
|
|
add.l d1,d0
|
|
addx d2,d0
|
|
add.l d4,a1
|
|
dbf d5,.vertloop
|
|
.vertskip ;
|
|
ifne solidstrip
|
|
;
|
|
add d6,d6
|
|
ble.s .rts
|
|
move.l qstripbot(pc),a0
|
|
sub d6,a0
|
|
lsl #5,d6
|
|
or #1,d6
|
|
bwait
|
|
movem.l a0-a1,$dff050
|
|
move d6,$dff058
|
|
.rts ;
|
|
endc
|
|
;
|
|
endm
|
|
|
|
drawshapes lea shapelist(pc),a6
|
|
;
|
|
.drawloop move.l (a6),d0
|
|
beq .rts
|
|
move.l d0,a6
|
|
move.l sh_shape(a6),d0
|
|
bne.s .shape
|
|
;
|
|
;wall strip!
|
|
;
|
|
move sh_x(a6),d0
|
|
add midx(pc),d0
|
|
move.l cop(pc),a1
|
|
lea coloffs(pc),a5
|
|
;
|
|
ifne aga
|
|
add.l 0(a5,d0*4),a1
|
|
elseif
|
|
lsl #2,d0
|
|
add.l 0(a5,d0),a1
|
|
endc
|
|
;
|
|
move.l palette(pc),a2
|
|
move.l sh_strip(a6),a4
|
|
bsr drawstrip2
|
|
bra.s .drawloop
|
|
;
|
|
.shape move.l d0,a0
|
|
movem sh_x(a6),d0-d2
|
|
move sh_scale(a6),d7
|
|
movem (a0)+,d3-d4 ;x,y handles
|
|
;
|
|
muls d7,d3 ;* scale
|
|
asr.l #8,d3
|
|
sub.l d3,d0
|
|
;
|
|
muls d7,d4
|
|
asr.l #8,d4
|
|
sub.l d4,d1
|
|
;
|
|
;d0=rotated X, d1=Y, d2=Z
|
|
;
|
|
lsl.l #focshft,d0
|
|
divs d2,d0 ;Screen X
|
|
cmp maxx(pc),d0
|
|
bge .drawloop ;X too big!
|
|
;
|
|
lsl.l #focshft,d1
|
|
divs d2,d1 ;Screen Y
|
|
cmp maxy(pc),d1
|
|
bge .drawloop
|
|
;
|
|
movem (a0),d3-d4 ;width/hite
|
|
;
|
|
move.l d3,d5
|
|
muls d7,d3
|
|
asr.l #8-focshft,d3
|
|
divs d2,d3 ;screen width
|
|
ext.l d3
|
|
ble .drawloop
|
|
;
|
|
move.l d4,d6
|
|
muls d7,d4
|
|
asr.l #8-focshft,d4
|
|
divs d2,d4 ;hite
|
|
ext.l d4
|
|
ble .drawloop
|
|
;
|
|
ifne aga
|
|
swap d5
|
|
divu.l d3,d5
|
|
elseif
|
|
divu d3,d5 ;d1 low=int part, hi=rem
|
|
move.l d5,d7
|
|
clr d7
|
|
divu d3,d7
|
|
swap d5
|
|
move d7,d5
|
|
endc
|
|
;
|
|
add midx(pc),d0
|
|
bpl.s .xcskip
|
|
add d0,d3 ;reduce width
|
|
ble .drawloop
|
|
neg d0
|
|
;
|
|
ifne aga
|
|
ext.l d0
|
|
mulu.l d5,d0 ;start column in shape
|
|
elseif
|
|
move d0,d7
|
|
mulu d5,d7
|
|
swap d5
|
|
mulu d5,d0
|
|
swap d0
|
|
add.l d7,d0
|
|
swap d5
|
|
endc
|
|
;
|
|
moveq #0,d7
|
|
cmp width(pc),d3
|
|
ble.s .xcdone
|
|
move width(pc),d3
|
|
bra.s .xcdone
|
|
;
|
|
.xcskip move d0,d7 ;sc X
|
|
add d3,d0
|
|
sub width(pc),d0
|
|
ble.s .xcdone2
|
|
sub d0,d3
|
|
ble .drawloop
|
|
.xcdone2 move.l d5,d0
|
|
lsr.l #1,d0
|
|
.xcdone ;
|
|
ifne aga
|
|
swap d6
|
|
divu.l d4,d6 ;y step
|
|
elseif
|
|
divu d4,d6
|
|
move d6,-(a7) ;int part
|
|
clr d6
|
|
divu d4,d6
|
|
swap d6
|
|
move (a7)+,d6
|
|
swap d6
|
|
endc
|
|
;
|
|
move.l cop(pc),a1
|
|
;
|
|
add midy(pc),d1
|
|
bpl.s .ycskip
|
|
add d1,d4 ;hite
|
|
ble .drawloop
|
|
neg d1
|
|
;
|
|
ifne aga
|
|
ext.l d1
|
|
mulu.l d6,d1
|
|
elseif
|
|
move d7,-(a7)
|
|
move d1,d7
|
|
mulu d6,d7
|
|
swap d6
|
|
mulu d6,d1
|
|
swap d1
|
|
add.l d7,d1
|
|
swap d6
|
|
move (a7)+,d7
|
|
endc
|
|
;
|
|
cmp hite(pc),d4
|
|
ble.s .ycdone
|
|
move hite(pc),d4
|
|
bra.s .ycdone
|
|
;
|
|
.ycskip move d1,-(a7)
|
|
mulu copmod(pc),d1
|
|
add.l d1,a1
|
|
move (a7)+,d1
|
|
add d4,d1
|
|
sub hite(pc),d1
|
|
ble.s .ycdone2
|
|
sub d1,d4
|
|
ble .drawloop
|
|
.ycdone2 move.l d6,d1
|
|
lsr.l #1,d1
|
|
.ycdone ;
|
|
;draw bit...
|
|
;
|
|
;a0=src, a1=dest, a2=palette
|
|
;
|
|
;d0.q=src x
|
|
;d1.q=src y
|
|
;d2.w = Z!
|
|
;d3.w=width
|
|
;d4.w=height
|
|
;d5.q=x step
|
|
;d6.q=y step
|
|
;d7.w=start screen column
|
|
;a0.l=src
|
|
;a1.l=dest
|
|
;a2.l=palette
|
|
;
|
|
move.l a6,-(a7)
|
|
;
|
|
lea coloffs,a5
|
|
;
|
|
ifne aga
|
|
lea 0(a5,d7*4),a5
|
|
elseif
|
|
lsl #2,d7
|
|
lea 0(a5,d7),a5
|
|
lsr #2,d7
|
|
endc
|
|
;
|
|
move.l vertdraws(pc),a6
|
|
mulu #vd_size,d7
|
|
lea 0(a6,d7),a6 ;column for Z compare!
|
|
;
|
|
move d2,d7
|
|
move.l darktable(pc),a2
|
|
move 0(a2,d7*2),d7
|
|
move.l palette(pc),a2
|
|
;
|
|
ifne aga
|
|
move.l 0(a2,d7*4),a2
|
|
elseif
|
|
lsl #2,d7
|
|
move.l 0(a2,d7),a2
|
|
endc
|
|
;
|
|
subq #1,d3
|
|
subq #1,d4
|
|
swap d0
|
|
swap d1
|
|
swap d5
|
|
swap d6
|
|
addq #2,a0
|
|
;
|
|
.hloop move.l a1,a4
|
|
add.l (a5)+,a4
|
|
;
|
|
cmp vd_z(a6),d2
|
|
bcs .zok
|
|
;
|
|
tst thermo
|
|
beq .zbad
|
|
;
|
|
bsr thermostrip
|
|
bra.s .zbad
|
|
;
|
|
.zok movem.l d0-d1/d4-d5,-(a7)
|
|
;
|
|
mulu (a0),d0
|
|
lea 2(a0,d0),a3 ;src
|
|
;
|
|
move copmod(pc),d7
|
|
ext.l d7
|
|
moveq #0,d5
|
|
moveq #0,d0
|
|
;
|
|
.vloop move.b 0(a3,d1),d5
|
|
beq.s .skip
|
|
;
|
|
ifne aga
|
|
move 0(a2,d5*2),(a4)
|
|
elseif
|
|
add d5,d5
|
|
move 0(a2,d5),(a4)
|
|
moveq #0,d5
|
|
endc
|
|
;
|
|
.skip add.l d6,d1 ;next src Y
|
|
addx.l d0,d1
|
|
add.l d7,a4
|
|
dbf d4,.vloop
|
|
;
|
|
movem.l (a7)+,d0-d1/d4-d5
|
|
;
|
|
.zbad add.l d5,d0
|
|
moveq #0,d7
|
|
addx.l d7,d0 ;next src X
|
|
lea vd_size(a6),a6
|
|
;
|
|
dbf d3,.hloop
|
|
;
|
|
move.l (a7)+,a6
|
|
bra .drawloop
|
|
;
|
|
.rts rts
|
|
|
|
thermostrip movem.l d0-d2/d4-d5,-(a7)
|
|
;
|
|
mulu (a0),d0
|
|
lea 2(a0,d0),a3 ;src
|
|
;
|
|
move copmod(pc),d7
|
|
ext.l d7
|
|
moveq #0,d5
|
|
moveq #0,d0
|
|
move #$00f,d2
|
|
;
|
|
.vloop move.b 0(a3,d1),d5
|
|
beq.s .skip
|
|
;
|
|
ifne aga
|
|
move 0(a2,d5*2),d5
|
|
and d2,d5
|
|
move d5,(a4)
|
|
elseif
|
|
add d5,d5
|
|
move 0(a2,d5),(a4)
|
|
moveq #0,d5
|
|
endc
|
|
;
|
|
.skip add.l d6,d1 ;next src Y
|
|
addx.l d0,d1
|
|
add.l d7,a4
|
|
dbf d4,.vloop
|
|
;
|
|
movem.l (a7)+,d0-d2/d4-d5
|
|
;
|
|
rts
|
|
|
|
renderwalls ;
|
|
move.l palette(pc),a2
|
|
;
|
|
move.l vertdraws(pc),a4
|
|
lea coloffs(pc),a5
|
|
move width(pc),d7
|
|
subq #1,d7
|
|
;
|
|
move copmod(pc),d0
|
|
subq #2,d0
|
|
;
|
|
bwait
|
|
move.l con0poke(pc),$dff040
|
|
move #0,$dff064
|
|
move d0,$dff066
|
|
move.l #-1,$dff044
|
|
move #0,$dff074
|
|
;
|
|
.loop move.l cop(pc),a1
|
|
add.l (a5)+,a1
|
|
;
|
|
solidstrip set -1
|
|
drawstrip_
|
|
;
|
|
lea vd_size(a4),a4
|
|
dbf d7,.loop
|
|
;
|
|
rts
|
|
|
|
solidstrip set 0
|
|
drawstrip2 ;
|
|
drawstrip_
|
|
;
|
|
rts
|
|
|
|
dc $f0ff,$ff0f,$fff0
|
|
dc $f00f,$f0f0,$ff00
|
|
dc $ffff
|
|
;
|
|
stripands ;red,green,blue,yel,pur,cyn,wht
|
|
|
|
vwait move #1,vbcounter
|
|
.loop tst vbcounter
|
|
bgt.s .loop
|
|
rts
|
|
|
|
;************** DATA ***************************
|
|
|
|
data
|
|
|
|
gloomdata dc 0 ;non-zero = datadisk there!
|
|
dc 0
|
|
fontw dc 0
|
|
fonth dc 0
|
|
fontoff dc 0
|
|
mode dc 0
|
|
|
|
lastgrunt dc.l 0
|
|
|
|
grunttable dc.l gruntsfx,gruntsfx2,gruntsfx3,gruntsfx4
|
|
|
|
splatsfx dc.l 0
|
|
diesfx dc.l 0
|
|
footstepsfx dc.l 0
|
|
doorsfx dc.l 0
|
|
tokensfx dc.l 0
|
|
gruntsfx dc.l 0
|
|
gruntsfx2 dc.l 0
|
|
gruntsfx3 dc.l 0
|
|
gruntsfx4 dc.l 0
|
|
;
|
|
shootsfx dc.l 0
|
|
shootsfx2 dc.l 0
|
|
shootsfx3 dc.l 0
|
|
shootsfx4 dc.l 0
|
|
shootsfx5 dc.l 0
|
|
|
|
telesfx dc.l 0
|
|
|
|
chipzero dc.l 0
|
|
|
|
qcols dc.b 1,2
|
|
qpal dc 2
|
|
dc $544 ;roof colour
|
|
dc $544 ;floor colour
|
|
cnop 0,4
|
|
|
|
qstrip dc.l 0
|
|
qstripbot dc.l 0
|
|
con0poke dc $100,0 ;100=no qfloor!
|
|
|
|
outhand dc.l 0
|
|
|
|
;starting positions!
|
|
;
|
|
p1x dc 0
|
|
p1z dc 0
|
|
p1r dc 0
|
|
dc 0
|
|
|
|
p2x dc 0
|
|
p2z dc 0
|
|
p2r dc 0
|
|
dc 0
|
|
|
|
p1health dc 0
|
|
p1weapon dc 0
|
|
p1lives dc 0
|
|
|
|
p2health dc 0
|
|
p2weapon dc 0
|
|
p2lives dc 0
|
|
|
|
map_test dc.l 0
|
|
wins1 dc 0 ;player 1 score
|
|
wins2 dc 0 ;player 2 score
|
|
|
|
script dc.l 0
|
|
script2 dc.l 0
|
|
scriptat dc.l 0
|
|
minbpos dc 0
|
|
maxbpos dc 0
|
|
finished dc 0
|
|
finished2 dc 0
|
|
;
|
|
floorflag dc -1 ;-1 = (black), 0 = split, 1=txt
|
|
roofflag dc -1
|
|
;
|
|
paused dc $ff00
|
|
gametype dc 0 ;0,1,2
|
|
linked dc 0 ;linked, 2 player modem game
|
|
linkcnt dc 0 ;count-down before link rec OK!
|
|
twowins dc 0,0
|
|
;
|
|
font dc.l 0
|
|
cnop 0,4
|
|
|
|
thermo dc 0 ;thermograph
|
|
infra dc 0 ;infrared
|
|
;
|
|
maptable dc.l 0
|
|
sqr dc.l sqrinc
|
|
darktable dc.l 0
|
|
inlist dc.l 0
|
|
inlistf dc.l inlist
|
|
outlist dc.l 0
|
|
outlistf dc.l outlist
|
|
|
|
window dc.l 0
|
|
dummy dc.l 0
|
|
player1 dc.l 0
|
|
player2 dc.l 0
|
|
doneflag dc.l 0
|
|
showflag dc.l 0
|
|
memory dc.l 0
|
|
memat dc.l 0
|
|
shapelist dc.l 0
|
|
bitmap dc.l 0
|
|
;
|
|
palette dc.l 0 ;the one we're using...
|
|
;
|
|
palettes ds.l 16 ;16 palettes for 16 brightnesses
|
|
palettesw ds.l 16
|
|
palettesr ds.l 16
|
|
|
|
joyx0 dc 0 ;port 0 (mouse)
|
|
joyy0 dc 0
|
|
joyb0 dc 0
|
|
joyf0 dc 0
|
|
;
|
|
joyx1 dc 0 ;port 1 (joystick)
|
|
joyy1 dc 0
|
|
joyb1 dc 0
|
|
joyf1 dc 0
|
|
;
|
|
joyx2 dc 0 ;keyboard
|
|
joyy2 dc 0
|
|
joyb2 dc 0
|
|
joyf2 dc 0
|
|
;
|
|
joyx3 dc 0 ;null modem
|
|
joyy3 dc 0
|
|
joyb3 dc 0
|
|
joyf3 dc 0
|
|
|
|
cnop 0,4
|
|
|
|
map_map dc.l 0
|
|
map_grid dc.l 0
|
|
map_poly dc.l 0
|
|
map_ppnt dc.l 0
|
|
map_rgbs dc.l 0
|
|
map_rgbsw dc.l 0
|
|
map_rgbsr dc.l 0
|
|
map_txts dc.l 0
|
|
map_anim dc.l 0
|
|
map_events dc.l 0
|
|
|
|
rgb_info dc.l 0
|
|
rgb_rgbs dc.l 0
|
|
;
|
|
map_rgbsat dc.l 0
|
|
map_rgbsat2 dc.l 0
|
|
map_rgbsfrom dc.l 0
|
|
remapped dc.l 0
|
|
;
|
|
camx dc 0
|
|
camz dc 0
|
|
camy dc 0
|
|
camr dc 0
|
|
|
|
;camera matrix...
|
|
cm1 dc $7ffe
|
|
cm2 dc 0
|
|
cm3 dc 0
|
|
cm4 dc $7ffe
|
|
|
|
;inverse of camera matrix...
|
|
icm1 dc $7ffe
|
|
icm2 dc 0
|
|
icm3 dc 0
|
|
icm4 dc $7ffe
|
|
|
|
castrots dc.l castrotsinc+8*160
|
|
camrots dc.l camrotsinc
|
|
camrots2 dc.l camrots2inc
|
|
|
|
vertdraws dc.l 0
|
|
|
|
cop dc.l 0
|
|
copmod dc 0
|
|
width dc 0
|
|
hite dc 0
|
|
minx dc 0
|
|
midx ;
|
|
maxx dc 0
|
|
miny dc 0
|
|
midy ;
|
|
maxy dc 0
|
|
wdiv32 dc 0
|
|
wrem32 dc 0
|
|
|
|
coplist dc.l 0
|
|
slice1 dc.l 0
|
|
slice2 dc.l 0
|
|
copstop dc.l 0
|
|
|
|
memlist dc.l 0
|
|
|
|
dispnest dc 0
|
|
|
|
coloffs ds.l 320 ;320 columns max
|
|
|
|
iffwindow ;
|
|
dc.l slice1
|
|
dc.l copstop
|
|
;
|
|
dc 0 ;x
|
|
dc 42 ;y
|
|
dc 320 ;w
|
|
dc 248 ;h
|
|
dc 1 ;pw
|
|
dc 1 ;ph
|
|
;
|
|
dc 0,0
|
|
dc.l 0
|
|
dc.l 0
|
|
;
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc 0
|
|
dc.l 0,0,0
|
|
|
|
defwindow1_1p ;
|
|
dc.l slice1
|
|
dc.l copstop
|
|
;
|
|
dc 160-39*2
|
|
dc 166-39*2
|
|
dc 78 ;max width for 2 high = 90!
|
|
dc 78
|
|
dc 2
|
|
dc 2
|
|
;
|
|
dc 0,0
|
|
dc.l 0
|
|
dc.l 0
|
|
;
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc 0
|
|
dc.l 0,0,0
|
|
|
|
defwindow1_2p ;
|
|
dc.l slice1
|
|
dc.l slice2
|
|
;
|
|
dc 160-33*2
|
|
dc 42
|
|
dc 66 ;max width for 2 high = 90!
|
|
dc 60
|
|
dc 2
|
|
dc 2
|
|
;
|
|
dc 0,0
|
|
dc.l 0
|
|
dc.l 0
|
|
;
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc 0
|
|
dc.l 0,0,0
|
|
|
|
defwindow2_2p ;
|
|
dc.l slice2
|
|
dc.l copstop
|
|
;
|
|
dc 160-33*2
|
|
dc 166
|
|
dc 66
|
|
dc 60
|
|
dc 2
|
|
dc 2
|
|
;
|
|
dc 0,0
|
|
dc.l 0
|
|
dc.l 0
|
|
;
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc 0
|
|
dc.l 0,0,0
|
|
|
|
window1 ;
|
|
dc.l slice1
|
|
dc.l slice2 ;copstop here for 1 window
|
|
;
|
|
dc 160-33*2
|
|
dc 42
|
|
dc 66 ;max width for 2 high = 90!
|
|
dc 60
|
|
dc 2
|
|
dc 2
|
|
;
|
|
dc 0,0
|
|
dc.l 0
|
|
dc.l 0
|
|
;
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc 0
|
|
dc.l 0,0,0
|
|
|
|
window2 ;
|
|
dc.l slice2
|
|
dc.l copstop
|
|
;
|
|
dc 160-33*2
|
|
dc 165 ;WHAT!!!!!
|
|
dc 66
|
|
dc 60
|
|
dc 2
|
|
dc 2
|
|
;
|
|
dc 0,0
|
|
dc.l 0
|
|
dc.l 0
|
|
;
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc.l 0
|
|
dc 0
|
|
dc.l 0,0,0
|
|
|
|
cols16 macro
|
|
dc $180,$000,$182,0,$184,0,$186,0
|
|
dc $188,0,$18a,0,$18c,0,$18e,0
|
|
dc $190,0,$192,0,$194,0,$196,0
|
|
dc $198,0,$19a,0,$19c,0,$19e,0
|
|
endm
|
|
|
|
cols162 macro
|
|
dc $180,$0c0,$182,0,$184,0,$186,0
|
|
dc $188,0,$18a,0,$18c,0,$18e,0
|
|
dc $190,0,$192,0,$194,0,$196,0
|
|
dc $198,0,$19a,0,$19c,0,$19e,0
|
|
endm
|
|
|
|
copinit ;initialization for display
|
|
;
|
|
dc $1fc,15
|
|
;
|
|
dc $096,$0120 ;bitplane/spr DMA off
|
|
;
|
|
dc $092,$38,$094,$a0
|
|
dc $108,6*40,$10a,6*40
|
|
dc $100,$7200
|
|
dc $102,0
|
|
;
|
|
;lo colour nybs - lo bank
|
|
dc $106,$0200
|
|
cols1 cols162
|
|
;
|
|
;lo nybs - hi bank
|
|
dc $106,$8200
|
|
cols2 cols162
|
|
;
|
|
;hi colour nybs - lo bank
|
|
dc $106,0
|
|
cols3 cols16
|
|
;
|
|
;hi colour nybs - hi bank
|
|
dc $106,$8000
|
|
cols4 cols16
|
|
;
|
|
dc 26<<8+1,$fffe
|
|
;
|
|
dc $140,0,$142,0,$144,0,$146,0
|
|
dc $148,0,$14a,0,$14c,0,$14e,0
|
|
dc $150,0,$152,0,$154,0,$156,0
|
|
dc $158,0,$15a,0,$15c,0,$15e,0
|
|
dc $160,0,$162,0,$164,0,$166,0
|
|
dc $168,0,$16a,0,$16c,0,$16e,0
|
|
dc $170,0,$172,0,$174,0,$176,0
|
|
dc $178,0,$17a,0,$17c,0,$17e,0
|
|
;
|
|
;slice...
|
|
sl1 ;
|
|
ifne aga
|
|
;
|
|
dc $e0,0,$e2,0
|
|
dc $e4,0,$e6,0
|
|
dc $e8,0,$ea,0
|
|
dc $ec,0,$ee,0
|
|
dc $f0,0,$f2,0
|
|
dc $f4,0,$f6,0
|
|
dc $f8,0,$fa,0
|
|
dc $08e,$2c81,$090,$f4c1 ;diw
|
|
dc $0001,$fffe ;wait for slice!
|
|
dc $096,$8100
|
|
;
|
|
endc
|
|
;
|
|
dc $084,0,$086,0,$08a,0
|
|
sl2 ;
|
|
ifne aga
|
|
;
|
|
dc $e0,0,$e2,0
|
|
dc $e4,0,$e6,0
|
|
dc $e8,0,$ea,0
|
|
dc $ec,0,$ee,0
|
|
dc $f0,0,$f2,0
|
|
dc $f4,0,$f6,0
|
|
dc $f8,0,$fa,0
|
|
;56
|
|
dc $08e,$2c81,$090,$f4c1 ;diw
|
|
;64
|
|
dc $0001,$fffe ;wait for slice!
|
|
;68
|
|
dc $096,$8100
|
|
;72
|
|
;
|
|
endc
|
|
;
|
|
dc $084,0,$086,0,$08a,0
|
|
;
|
|
cstop dc $096,$0100
|
|
dc $ffff,$fffe
|
|
copinitf ;
|
|
|
|
bigdata
|
|
|
|
textscrns ds.l 8 ;8*20=160
|
|
textures ds.l 160
|
|
|
|
;************** SLOW SUBS **********************
|
|
|
|
slowsubs
|
|
|
|
;-------------- serial stuff -------------------;
|
|
|
|
sblen equ 16 ;serial buffer length
|
|
|
|
initser move #$0801,$dff09a
|
|
move.l $74,oldrbf
|
|
move.l #rbf,$74
|
|
move.l $64,oldtbe
|
|
move.l #tbe,$64
|
|
move #640,$dff032 ;period!
|
|
;
|
|
flushser move #$0801,$dff09a
|
|
clr rget
|
|
clr rput
|
|
clr tget
|
|
clr tput
|
|
move #$0801,$dff09c
|
|
move #$8801,$dff09a
|
|
rts
|
|
|
|
oldrbf dc.l 0
|
|
oldtbe dc.l 0
|
|
|
|
finitser move #$0801,$dff09a
|
|
move.l oldrbf(pc),$74
|
|
move.l oldtbe(pc),$64
|
|
rts
|
|
|
|
serget ;get a byte into d0 - mi if none available!
|
|
;
|
|
move rget(pc),d0
|
|
cmp rput(pc),d0
|
|
beq.s .none
|
|
and #sblen-1,d0
|
|
lea rbuff(pc),a0
|
|
move.b 0(a0,d0),d0
|
|
addq #1,rget
|
|
and #255,d0 ;set pl
|
|
rts
|
|
.none moveq #-1,d0 ;set mi
|
|
rts
|
|
|
|
serput ;send byte in d0
|
|
;
|
|
move tput(pc),d1
|
|
cmp tget(pc),d1
|
|
beq.s .noq
|
|
;
|
|
move #$0001,$dff09a
|
|
and #sblen-1,d1
|
|
lea tbuff(pc),a0
|
|
move.b d0,0(a0,d1)
|
|
addq #1,tput
|
|
move #$8001,$dff09a
|
|
rts
|
|
;
|
|
.noq ;no queue
|
|
;
|
|
and #255,d0
|
|
or #$100,d0
|
|
move d0,$dff030
|
|
addq #1,tput
|
|
rts
|
|
|
|
rbf ;receive buffer full interupt
|
|
;
|
|
btst #3,$dff01e
|
|
beq.s .bye
|
|
;
|
|
movem.l d0/a0,-(a7)
|
|
lea rbuff(pc),a0
|
|
move rput(pc),d0
|
|
and #sblen-1,d0
|
|
move.b $dff019,0(a0,d0)
|
|
addq #1,rput
|
|
movem.l (a7)+,d0/a0
|
|
;
|
|
.bye move #$0800,$dff09c
|
|
move.l oldrbf(pc),-(a7)
|
|
rts
|
|
|
|
rbuff ds.b sblen
|
|
rput dc 0
|
|
rget dc 0
|
|
|
|
tbe ;transmit buffer empty (int bit 2)
|
|
;
|
|
btst #0,$dff01f
|
|
beq.s .bye
|
|
;
|
|
movem.l d0/a0,-(a7)
|
|
addq #1,tget
|
|
move tget(pc),d0
|
|
cmp tput(pc),d0
|
|
beq.s .out
|
|
and #sblen-1,d0
|
|
lea tbuff(pc),a0
|
|
move.b 0(a0,d0),d0
|
|
and #255,d0
|
|
or #$100,d0
|
|
move d0,$dff030
|
|
.out movem.l (a7)+,d0/a0
|
|
;
|
|
.bye move #1,$dff09c
|
|
move.l oldtbe(pc),-(a7)
|
|
rts
|
|
|
|
tbuff ds.b sblen
|
|
tput dc 0
|
|
tget dc 0
|
|
|
|
medat dc.l 0
|
|
titlemed dc.l 0
|
|
loadingmed dc.l 0
|
|
fadevol dc 0 ;non-zero=fade to 0!
|
|
|
|
relocate ;a0=pointer to what to relocate
|
|
;
|
|
move.l (a0),d0
|
|
beq .rts
|
|
move.l d0,a1
|
|
add.l #32,(a0)
|
|
lea 28(a1),a0
|
|
move.l (a0)+,d0
|
|
lea 0(a0,d0.l*4),a1
|
|
cmp.l #$3ec,(a1)+
|
|
bne.s .rts
|
|
move.l (a1)+,d0
|
|
addq #4,a1
|
|
move.l a0,d2
|
|
;
|
|
.loop move.l (a1)+,d1 ;offset
|
|
add.l d2,0(a0,d1)
|
|
subq.l #1,d0
|
|
bne.s .loop
|
|
;
|
|
.rts rts
|
|
|
|
initmed lea medat,a0
|
|
tst.l (a0)
|
|
bne.s .noreloc
|
|
;
|
|
move.l #medplayer,(a0)
|
|
bsr relocate
|
|
;
|
|
.noreloc move.l medat(pc),a1
|
|
move.l chipzero(pc),a0
|
|
jsr (a1)
|
|
;
|
|
move.l medat(pc),a1
|
|
move.l titlemed(pc),a0
|
|
jsr 4(a1)
|
|
;
|
|
move.l medat(pc),a1
|
|
move.l loadingmed(pc),a0
|
|
jsr 4(a1)
|
|
;
|
|
rts
|
|
|
|
rawstuff dc.l 0
|
|
|
|
datafiles dc.l script
|
|
scriptname dc.b 'misc/script',0
|
|
even
|
|
dc.l script2
|
|
dc.b 'misc/script2',0
|
|
even
|
|
;
|
|
dc.l 0
|
|
|
|
progfiles dc.l font+1 ;odd=chipmem!
|
|
dc.b 'misc/font.bin',0
|
|
even
|
|
dc.l titlemed+1
|
|
dc.b 'sfxs/med1',0
|
|
even
|
|
dc.l loadingmed+1
|
|
dc.b 'sfxs/med2',0
|
|
even
|
|
dc.l shootsfx+1
|
|
dc.b 'sfxs/shoot.bin',0
|
|
even
|
|
dc.l shootsfx2+1
|
|
dc.b 'sfxs/shoot2.bin',0
|
|
even
|
|
dc.l shootsfx3+1
|
|
dc.b 'sfxs/shoot3.bin',0
|
|
even
|
|
dc.l shootsfx4+1
|
|
dc.b 'sfxs/shoot4.bin',0
|
|
even
|
|
dc.l shootsfx5+1
|
|
dc.b 'sfxs/shoot5.bin',0
|
|
even
|
|
dc.l gruntsfx+1
|
|
dc.b 'sfxs/grunt.bin',0
|
|
even
|
|
dc.l gruntsfx2+1
|
|
dc.b 'sfxs/grunt2.bin',0
|
|
even
|
|
dc.l gruntsfx3+1
|
|
dc.b 'sfxs/grunt3.bin',0
|
|
even
|
|
dc.l gruntsfx4+1
|
|
dc.b 'sfxs/grunt4.bin',0
|
|
even
|
|
dc.l tokensfx+1
|
|
dc.b 'sfxs/token.bin',0
|
|
even
|
|
dc.l doorsfx+1
|
|
dc.b 'sfxs/door.bin',0
|
|
even
|
|
dc.l footstepsfx+1
|
|
dc.b 'sfxs/footstep.bin',0
|
|
even
|
|
dc.l diesfx+1
|
|
dc.b 'sfxs/die.bin',0
|
|
even
|
|
dc.l splatsfx+1
|
|
dc.b 'sfxs/splat.bin',0
|
|
even
|
|
dc.l telesfx+1
|
|
dc.b 'sfxs/teleport.bin',0
|
|
even
|
|
;
|
|
dc.l 0
|
|
|
|
loadfiles ;
|
|
push
|
|
move.l a0,a2
|
|
;
|
|
.loop move.l (a2)+,d0
|
|
beq.s .done
|
|
moveq #1,d1
|
|
bclr #0,d0
|
|
beq.s .nochip
|
|
moveq #2,d1
|
|
.nochip move.l d0,a3
|
|
move.l a2,a0
|
|
bsr loadfile
|
|
move.l d0,(a3)
|
|
.z tst.b (a2)+
|
|
bne.s .z
|
|
exg a2,d0
|
|
addq.l #1,d0
|
|
bclr #0,d0
|
|
exg a2,d0
|
|
bra.s .loop
|
|
;
|
|
.done pull
|
|
rts
|
|
|
|
diskmenu dc.b 1
|
|
dc.b 'please insert gloom data disk',0
|
|
even
|
|
|
|
magicfiles dc.l magic
|
|
dc.b 'pics/blackmagic',0
|
|
even
|
|
dc.l magicpal
|
|
dc.b 'pics/blackmagic.pal',0
|
|
even
|
|
dc.l 0
|
|
|
|
magic dc.l 0
|
|
magicpal dc.l 0
|
|
|
|
initmain ;
|
|
move.l 4.w,a0
|
|
move.l 276(a0),a0
|
|
clr.l $114(a0) ;requesters off!
|
|
;
|
|
lea ciaaname,a1
|
|
move.l 4.w,a6
|
|
jsr -498(a6)
|
|
move.l d0,a0
|
|
move.l $64(a0),a0
|
|
move.l a0,rawstuff
|
|
bset #0,$3d(a0)
|
|
lea $136(a0),a0
|
|
move.l a0,rawtable
|
|
;
|
|
move.l #8,d0
|
|
move.l #$10002,d1
|
|
allocmem chipzero
|
|
move.l d0,chipzero
|
|
;
|
|
move.l #256,d0 ;128 words high max!
|
|
moveq #2,d1
|
|
allocmem qstrip
|
|
move.l d0,qstrip
|
|
;
|
|
move.l #256,d0
|
|
moveq #1,d1
|
|
allocmem maptable
|
|
move.l d0,maptable
|
|
;
|
|
move.l #32768,d0
|
|
moveq #1,d1
|
|
allocmem memory
|
|
move.l d0,memory
|
|
;
|
|
move.l #320*vd_size,d0
|
|
moveq #1,d1
|
|
allocmem vertdraws
|
|
move.l d0,vertdraws
|
|
;
|
|
move.l #maxz*2,d0
|
|
moveq #1,d1
|
|
allocmem darktable
|
|
move.l d0,darktable
|
|
;
|
|
move.l #16*512*2,d0 ;16 shades, 256 words
|
|
moveq #1,d1
|
|
allocmem map_rgbs
|
|
;
|
|
move.l #map_rgbs_,map_rgbs
|
|
;move.l d0,map_rgbs
|
|
;add.l #16*512,d0
|
|
move.l d0,map_rgbsw
|
|
add.l #16*512,d0
|
|
move.l d0,map_rgbsr
|
|
;
|
|
st paused
|
|
clr dispnest
|
|
clr showflag
|
|
clr.l font
|
|
bsr initsfx
|
|
bsr initvbint
|
|
bsr initdisplay
|
|
bsr dispoff
|
|
;
|
|
lea magicfiles,a0
|
|
bsr loadfiles
|
|
;
|
|
move.l magic,a0
|
|
move.l magicpal,a1
|
|
bsr makeiff
|
|
bsr showiff
|
|
bsr dispon
|
|
move #50,vbcounter
|
|
;
|
|
lea progfiles,a0
|
|
bsr loadfiles
|
|
;
|
|
bsr initbmappal
|
|
bsr initmed
|
|
bsr initser
|
|
bsr makecoloffs
|
|
bsr initdarktable
|
|
;
|
|
bset #15,remapped
|
|
bne .noremap
|
|
;
|
|
move.l map_rgbs(pc),a0
|
|
move #-1,(a0)+
|
|
move.l a0,map_rgbsat
|
|
;
|
|
lea bullet1,a0
|
|
jsr remapanim
|
|
lea bullet2,a0
|
|
jsr remapanim
|
|
lea bullet3,a0
|
|
jsr remapanim
|
|
lea bullet4,a0
|
|
jsr remapanim
|
|
lea bullet5,a0
|
|
jsr remapanim
|
|
lea sparks1,a0
|
|
jsr remapanim
|
|
lea sparks2,a0
|
|
jsr remapanim
|
|
lea sparks3,a0
|
|
jsr remapanim
|
|
lea sparks4,a0
|
|
jsr remapanim
|
|
lea sparks5,a0
|
|
jsr remapanim
|
|
;
|
|
lea 128*128+groundtile,a2
|
|
move.l a2,a0
|
|
bsr addpal
|
|
lea groundtile,a0
|
|
move.l a2,a1
|
|
bsr remap
|
|
;
|
|
lea 128*128+ceilingtile,a2
|
|
move.l a2,a0
|
|
bsr addpal
|
|
lea ceilingtile,a0
|
|
move.l a2,a1
|
|
bsr remap
|
|
;
|
|
lea qpal,a0
|
|
bsr addpal
|
|
lea qcols,a0
|
|
lea qpal,a1
|
|
bsr remap
|
|
;
|
|
move.l map_rgbsat(pc),map_rgbsat2
|
|
.noremap ;
|
|
move.l map_rgbsat2(pc),map_rgbsat
|
|
;
|
|
moveq #0,d0
|
|
bsr loadanobj ;load player1
|
|
moveq #1,d0
|
|
bsr loadanobj ;load player2
|
|
moveq #2,d0
|
|
bsr loadanobj ;load tokens (health)
|
|
;
|
|
move.l map_rgbsat(pc),map_rgbsfrom
|
|
;
|
|
alloclist objects,#maxobjects,#ob_size
|
|
alloclist doors,#maxdoors,#do_size
|
|
alloclist blood,#maxblood,#bl_size
|
|
alloclist gore,#maxgore,#go_size
|
|
alloclist rotpolys,#maxrotpolys,#rp_size
|
|
;
|
|
.w5sex tst vbcounter
|
|
bgt .w5sex
|
|
;
|
|
bsr dispoff
|
|
lea iffwindow,a0
|
|
bsr freewindow
|
|
move.l magic,a1
|
|
freemem magic
|
|
move.l magicpal,a1
|
|
freemem magicpal
|
|
;
|
|
bsr forbid
|
|
rts
|
|
|
|
askdatadisk ;
|
|
ifne onedemo
|
|
;
|
|
bsr permit
|
|
lea datafiles,a0
|
|
bsr loadfiles
|
|
bsr forbid
|
|
;
|
|
elseif
|
|
;
|
|
sub.l a0,a0
|
|
bsr makeiff
|
|
bsr showiff
|
|
lea diskmenu,a4
|
|
lea iffwindow,a6
|
|
bsr initmenu
|
|
bsr dispon
|
|
;
|
|
bsr permit
|
|
;
|
|
;OK, gotta swap disks and pick up data files!
|
|
;
|
|
.wfd bsr vwait
|
|
;
|
|
move.l #lockname,d1
|
|
moveq #-2,d2
|
|
move.l dosbase(pc),a6
|
|
jsr -84(a6) ;lock?
|
|
move.l d0,d1
|
|
beq.s .wfd
|
|
jsr -126(a6) ;make current dir!
|
|
move.l d0,oldlock
|
|
;
|
|
bsr dispoff
|
|
bsr finitmenu
|
|
lea iffwindow,a0
|
|
bsr freewindow
|
|
;
|
|
lea datafiles,a0
|
|
bsr loadfiles
|
|
bsr forbid
|
|
;
|
|
endc
|
|
;
|
|
rts
|
|
|
|
undir move.l oldlock(pc),d1
|
|
beq.s .rts
|
|
clr gloomdata
|
|
clr.l oldlock
|
|
move.l dosbase(pc),a6
|
|
jsr -126(a6) ;CD to old current dir
|
|
move.l d0,d1
|
|
jsr -90(a6) ;unlock old (mine!)
|
|
.rts rts
|
|
|
|
oldlock dc.l 0
|
|
|
|
lockname dc.b 'gloomdata:',0
|
|
even
|
|
|
|
linkmenu dc.b 1
|
|
dc.b 'ATTEMPTING TO LINK...ESC TO ABORT',0
|
|
even
|
|
|
|
syncesc tst d7
|
|
beq.s .rts
|
|
qkey $45
|
|
beq.s .rts
|
|
addq #4,a7
|
|
.rts rts
|
|
|
|
syncup ;OK, synchronize with other machine...
|
|
;
|
|
;OK, write FF...wait for an FF!
|
|
;
|
|
;'FF' = sync marker!, 'FE' = I'm synced!
|
|
;
|
|
;d7 = non zero, if escapable
|
|
;reurn ne if esc else eq
|
|
;
|
|
bsr flushser
|
|
;
|
|
.aa moveq #-1,d0
|
|
bsr serput ;write 'FF'!
|
|
bsr vwait
|
|
bsr syncesc ;check esc
|
|
bsr serget
|
|
bmi.s .aa ;non there?
|
|
cmp.b #-1,d0 ;or not ff?
|
|
bne.s .aa ;again...
|
|
;
|
|
moveq #-1,d0
|
|
bsr serput
|
|
moveq #-2,d0 ;OK, we're off!
|
|
bsr serput
|
|
;
|
|
.cc bsr vwait
|
|
bsr syncesc
|
|
bsr serget
|
|
bmi.s .cc
|
|
cmp.b #-2,d0
|
|
bne.s .cc
|
|
;
|
|
rts
|
|
|
|
initnewgame clr linked
|
|
move gametype(pc),twowins
|
|
beq .notlinked
|
|
cmp #3,p2_ob_cntrl
|
|
bne .notlinked
|
|
;
|
|
.link ifeq debugser
|
|
clr twowins
|
|
endc
|
|
;
|
|
sub.l a0,a0
|
|
bsr makeiff
|
|
bsr showiff
|
|
lea linkmenu,a4
|
|
lea iffwindow,a6
|
|
bsr initmenu
|
|
bsr dispon
|
|
;
|
|
moveq #-1,d7 ;ok to esc!
|
|
bsr syncup
|
|
beq.s .lloop
|
|
;
|
|
.escout move #-1,gametype
|
|
bra .linked
|
|
;
|
|
.lloop ;check gametypes are the same!
|
|
;
|
|
move.b gametype+1(pc),d0
|
|
bsr serput
|
|
.wgt bsr serget
|
|
bmi.s .wgt
|
|
cmp.b gametype+1(pc),d0
|
|
bne.s .escout
|
|
;
|
|
move $dff006,d0
|
|
and #127,d0
|
|
move d0,d7
|
|
bsr serput ;send mine
|
|
.wait bsr serget ;get his
|
|
bmi.s .wait
|
|
cmp.b d0,d7
|
|
beq.s .lloop
|
|
bgt.s .skip
|
|
;
|
|
;I'm player 1
|
|
move #1,linked
|
|
bra.s .linked
|
|
;
|
|
.skip ;I'm actually player 2!
|
|
move #-1,linked
|
|
.linked ;
|
|
bsr dispoff
|
|
bsr finitmenu
|
|
lea iffwindow,a0
|
|
bsr freewindow
|
|
tst gametype
|
|
bpl.s .notlinked
|
|
rts
|
|
.notlinked ;
|
|
bset #15,gloomdata
|
|
bne.s .gotdata
|
|
;
|
|
bsr askdatadisk
|
|
.gotdata ;
|
|
move.l medat(pc),a1
|
|
jsr 12(a1)
|
|
;move #$4000,fadevol
|
|
cmp #2,gametype
|
|
bne normalgame
|
|
;
|
|
;combat type game!
|
|
;
|
|
move #6,p1_ob_collwith
|
|
move #5,p2_ob_collwith
|
|
;
|
|
ifeq onedemo
|
|
;
|
|
lea combat,a0
|
|
lea combatpal,a1
|
|
jsr makeiff
|
|
jsr showiff
|
|
;
|
|
lea combatmenu,a4
|
|
lea iffwindow,a6
|
|
jsr initmenu
|
|
;
|
|
jsr dispon
|
|
;
|
|
.loop jsr selmenu
|
|
tst d0
|
|
beq .play
|
|
;
|
|
;change number of wins...
|
|
;
|
|
addq.b #1,comnum
|
|
cmp.b #'9',comnum
|
|
bls .loop
|
|
move.b #'2',comnum
|
|
bra .loop
|
|
;
|
|
.play jsr dispoff
|
|
jsr finitmenu
|
|
;
|
|
lea iffwindow,a0
|
|
jsr freewindow
|
|
;
|
|
elseif
|
|
;
|
|
move.b #49,comnum
|
|
;
|
|
endc
|
|
;
|
|
clr wins1
|
|
clr wins2
|
|
move.l script2,scriptat
|
|
;
|
|
rts
|
|
;
|
|
normalgame move #4,p1_ob_collwith
|
|
move #4,p2_ob_collwith
|
|
;
|
|
move.l script,a0
|
|
move.l a0,scriptat
|
|
lea conttxts(pc),a1
|
|
lea conts(pc),a2
|
|
moveq #0,d7 ;how many conts found!
|
|
;
|
|
;OK, any continue points in script?
|
|
;
|
|
.loop move.b (a0)+,d0
|
|
cmp.b #10,d0
|
|
beq.s .loop
|
|
and #31,d0
|
|
bne.s .more
|
|
.loop2 cmp.b #10,(a0)+
|
|
bne.s .loop2
|
|
bra.s .loop
|
|
.more cmp #27,d0
|
|
bcc.s .loop2
|
|
add #96,d0
|
|
;
|
|
;command! fetch the rest...
|
|
;
|
|
move.b (a0)+,d1
|
|
and #31,d1
|
|
add #96,d1
|
|
lsl.l #8,d0
|
|
or d1,d0
|
|
;
|
|
move.b (a0)+,d1
|
|
and #31,d1
|
|
add #96,d1
|
|
lsl.l #8,d0
|
|
or d1,d0
|
|
;
|
|
move.b (a0)+,d1
|
|
and #31,d1
|
|
add #96,d1
|
|
lsl.l #8,d0
|
|
or d1,d0
|
|
;
|
|
addq #1,a0 ;skip '_'
|
|
cmp.l #'cont',d0
|
|
beq.s .cont
|
|
cmp.l #'done',d0
|
|
beq.s .done
|
|
;
|
|
.eol cmp.b #10,(a0)+
|
|
bne.s .eol
|
|
bra .loop
|
|
;
|
|
.cont ;continue point!
|
|
;
|
|
lea context(pc),a3
|
|
.cont2 move.b (a3)+,(a1)+
|
|
bne.s .cont2
|
|
subq #1,a1
|
|
;
|
|
.clp move.b (a0)+,(a1)
|
|
cmp.b #'_',(a1)+
|
|
bne.s .clp
|
|
clr.b -1(a1)
|
|
move.l a0,(a2)+
|
|
addq #1,d7
|
|
bra .eol
|
|
;
|
|
.done tst d7
|
|
beq initpstuff
|
|
addq #1,d7
|
|
move.b d7,contmenu
|
|
;
|
|
;OK, need a continue game menu...
|
|
;
|
|
lea gloom,a0
|
|
lea gloompal,a1
|
|
bsr makeiff
|
|
bsr showiff
|
|
;
|
|
lea contmenu,a4
|
|
lea iffwindow,a6
|
|
bsr initmenu
|
|
bsr dispon
|
|
;
|
|
bsr selmenu
|
|
;
|
|
bsr dispoff
|
|
bsr finitmenu
|
|
lea iffwindow,a0
|
|
bsr freewindow
|
|
;
|
|
move curropt(pc),d0
|
|
beq initpstuff
|
|
lea conts(pc),a0
|
|
move.l -4(a0,d0*4),scriptat
|
|
;
|
|
initpstuff move #25,p1health
|
|
move #25,p2health
|
|
move #0,p1weapon
|
|
move #0,p2weapon
|
|
move #3,p1lives
|
|
move #3,p2lives
|
|
;
|
|
rts
|
|
|
|
conts ds.l 8 ;8 slots!
|
|
|
|
combatmenu dc.b 2
|
|
dc.b 'play combat game',0
|
|
dc.b 'win by '
|
|
comnum dc.b '2 points',0
|
|
even
|
|
|
|
context dc.b 'CONTINUE FROM ',0
|
|
even
|
|
|
|
contmenu dc.b 1
|
|
dc.b 'START NEW GAME',0
|
|
conttxts ds.b 160
|
|
even
|
|
|
|
execscript_med move.l medat(pc),a1
|
|
move.l loadingmed(pc),a0
|
|
jsr 8(a1) ;start title music!
|
|
;
|
|
execscript move.l scriptat(pc),a0
|
|
;
|
|
.loop move.b (a0)+,d0
|
|
cmp.b #10,d0
|
|
beq.s .loop
|
|
and #31,d0
|
|
bne.s .more
|
|
.loop2 cmp.b #10,(a0)+
|
|
bne.s .loop2
|
|
bra.s .loop
|
|
.more cmp #27,d0
|
|
bcc.s .loop2
|
|
add #96,d0
|
|
;
|
|
;command! fetch the rest...
|
|
;
|
|
move.b (a0)+,d1
|
|
and #31,d1
|
|
add #96,d1
|
|
lsl.l #8,d0
|
|
or d1,d0
|
|
;
|
|
move.b (a0)+,d1
|
|
and #31,d1
|
|
add #96,d1
|
|
lsl.l #8,d0
|
|
or d1,d0
|
|
;
|
|
move.b (a0)+,d1
|
|
and #31,d1
|
|
add #96,d1
|
|
lsl.l #8,d0
|
|
or d1,d0
|
|
;
|
|
addq #1,a0 ;skip '_'
|
|
move.l a0,scriptat
|
|
cmp.l #'pict',d0
|
|
beq scriptpict
|
|
cmp.l #'draw',d0
|
|
beq scriptdraw
|
|
cmp.l #'text',d0
|
|
beq scripttext
|
|
cmp.l #'wait',d0
|
|
beq scriptwait
|
|
cmp.l #'play',d0
|
|
beq scriptplay
|
|
cmp.l #'done',d0
|
|
beq scriptdone
|
|
cmp.l #'dark',d0
|
|
beq scriptdark
|
|
cmp.l #'show',d0
|
|
beq scriptshow
|
|
cmp.l #'hide',d0
|
|
beq scripthide
|
|
cmp.l #'loop',d0
|
|
beq scriptloop
|
|
cmp.l #'rest',d0
|
|
beq scriptrest
|
|
cmp.l #'cont',d0
|
|
beq scriptcont
|
|
;
|
|
warn #$f80
|
|
;
|
|
;Hmmm....bad command
|
|
.fucked ;
|
|
scriptdone bsr freeiff
|
|
rts
|
|
|
|
sccont dc.b 'cont_'
|
|
even
|
|
|
|
scriptcont cmp.b #10,(a0)+
|
|
bne.s scriptcont
|
|
move.l a0,scriptat
|
|
;
|
|
bra execscript
|
|
|
|
;a0=name, a1=mem, d0=length
|
|
|
|
scriptrest ;restart point! change to 'cont_' and save script out...
|
|
;
|
|
lea sccont(pc),a1
|
|
subq #5,a0
|
|
.loop move.b (a1)+,(a0)
|
|
cmp.b #'_',(a0)+
|
|
bne.s .loop
|
|
;
|
|
.leol cmp.b #10,(a0)+
|
|
bne.s .leol
|
|
move.l a0,scriptat
|
|
;
|
|
;save script!
|
|
;
|
|
bsr permit
|
|
;
|
|
lea scriptname,a0
|
|
move.l script,a1
|
|
move.l -12(a1),d0
|
|
subq.l #8,d0
|
|
subq.l #8,d0
|
|
;
|
|
bsr savefile
|
|
;
|
|
bsr forbid
|
|
bra execscript
|
|
|
|
scriptloop move.l script,scriptat
|
|
cmp #2,gametype
|
|
bne execscript
|
|
move.l script2,scriptat
|
|
bra execscript
|
|
|
|
scripthide bsr dispoff
|
|
bra execscript
|
|
|
|
scriptshow clr pdelay
|
|
bsr dispon
|
|
bra execscript
|
|
|
|
scriptdraw move.l pic,a0
|
|
move.l picpal,a1
|
|
bsr makeiff
|
|
bsr showiff
|
|
bra execscript
|
|
|
|
fetchrest move.l scriptat,a0
|
|
moveq #-1,d0
|
|
.loop addq #1,d0
|
|
move.b (a0)+,(a1)
|
|
cmp.b #10,(a1)+
|
|
bne.s .loop
|
|
clr.b -(a1)
|
|
move.l a0,scriptat
|
|
rts
|
|
|
|
picpath dc.b 'pics/'
|
|
picname ds.b 64
|
|
pic_pal dc.b '.pal',0
|
|
even
|
|
|
|
pic dc.l 0
|
|
picpal dc.l 0
|
|
|
|
freeiff push
|
|
move.l pic(pc),d0
|
|
beq.s .rts
|
|
move.l pic,a1
|
|
freemem pic
|
|
move.l picpal,a1
|
|
freemem picpal
|
|
clr.l pic
|
|
.rts pull
|
|
rts
|
|
|
|
scriptpict ;load an iff
|
|
bsr freeiff
|
|
lea picname,a1
|
|
bsr fetchrest
|
|
move.l a1,-(a7)
|
|
bsr permit
|
|
lea picpath,a0
|
|
moveq #1,d1
|
|
jsr loadfile
|
|
move.l d0,pic
|
|
lea pic_pal,a0
|
|
move.l (a7)+,a1
|
|
.loop move.b (a0)+,(a1)+
|
|
bne.s .loop
|
|
lea picpath,a0
|
|
moveq #1,d1
|
|
jsr loadfile
|
|
move.l d0,picpal
|
|
bsr forbid
|
|
bra execscript
|
|
|
|
scriptdark move.l iffwindow+wi_cop,a0 ;copperlist to darken!
|
|
;
|
|
;bank,32,bank,32...
|
|
;
|
|
addq #6,a0
|
|
moveq #3,d0 ;4 lots of 32 colours
|
|
moveq #31,d1
|
|
;
|
|
;skip first 8
|
|
;
|
|
;subq #8,d1
|
|
;lea 32(a0),a0
|
|
.loop ;
|
|
move (a0),d2 ;hi nyb
|
|
move 132(a0),d3 ;lo nyb!
|
|
and #$eee,d3
|
|
lsr #1,d3
|
|
move d2,d4
|
|
and #$111,d4
|
|
lsl #3,d4
|
|
or d4,d3
|
|
and #$eee,d2
|
|
lsr #1,d2
|
|
move d2,(a0)
|
|
move d3,132(a0)
|
|
;
|
|
addq #4,a0
|
|
dbf d1,.loop
|
|
moveq #31,d1
|
|
lea 136(a0),a0
|
|
dbf d0,.loop
|
|
bra execscript
|
|
|
|
text ds.b 64
|
|
|
|
scripttext ;print text on iff
|
|
;a6=window, a4=message, d0=length of message, d6=Y
|
|
;
|
|
move #2,pdelay
|
|
;
|
|
lea text,a1
|
|
bsr fetchrest
|
|
;
|
|
lea iffwindow,a6
|
|
lea text,a4
|
|
move wi_bh(a6),d6
|
|
sub #7,d6
|
|
bsr printmess2
|
|
;
|
|
tst pdelay
|
|
bmi execscript
|
|
clr pdelay
|
|
bra execscript
|
|
|
|
scriptwait ;
|
|
tst pdelay
|
|
bmi execscript
|
|
bsr waitany
|
|
bra execscript
|
|
|
|
checkany ;
|
|
.mwait bsr vwait
|
|
btst #6,$bfe001
|
|
beq.s .skip
|
|
btst #7,$bfe001
|
|
beq.s .skip
|
|
qkey $40
|
|
bne .skip
|
|
qkey $44
|
|
bne .skip
|
|
qkey $45
|
|
bne .skip
|
|
moveq #0,d0
|
|
rts
|
|
;
|
|
.skip moveq #-1,d0
|
|
rts
|
|
|
|
waitany ;
|
|
.mwait bsr vwait
|
|
btst #6,$bfe001
|
|
beq.s .skip
|
|
btst #7,$bfe001
|
|
beq.s .skip
|
|
qkey $40
|
|
bne .skip
|
|
qkey $44
|
|
bne .skip
|
|
qkey $45
|
|
bne .skip
|
|
bra .mwait
|
|
.skip ;
|
|
bsr vwait
|
|
btst #6,$bfe001
|
|
beq.s .skip
|
|
btst #7,$bfe001
|
|
beq.s .skip
|
|
qkey $40
|
|
bne .skip
|
|
qkey $44
|
|
bne .skip
|
|
qkey $45
|
|
bne .skip
|
|
;
|
|
rts
|
|
|
|
copywin moveq #wi_size/2-1,d0
|
|
.loop move (a0)+,(a1)+
|
|
dbf d0,.loop
|
|
rts
|
|
|
|
freeobjlist lea objlist,a2
|
|
;
|
|
.loop move.l (a2)+,d0
|
|
beq.s .done
|
|
move.l d0,a3
|
|
;
|
|
move.l (a3),d0
|
|
beq.s .skip
|
|
move.l d0,a1
|
|
freemem obj
|
|
clr.l (a3)
|
|
.skip ;
|
|
move.l 4(a3),d0
|
|
beq.s .loop
|
|
move.l d0,a1
|
|
freemem objchunks
|
|
clr.l 4(a3)
|
|
bra.s .loop
|
|
;
|
|
.done rts
|
|
|
|
freeobjlist2 lea objlist,a2
|
|
;
|
|
.loop move.l -(a2),d0
|
|
beq.s .done
|
|
move.l d0,a3
|
|
;
|
|
move.l (a3),d0
|
|
beq.s .skip
|
|
move.l d0,a1
|
|
freemem obj2
|
|
clr.l (a3)
|
|
.skip ;
|
|
move.l 4(a3),d0
|
|
beq.s .loop
|
|
move.l d0,a1
|
|
freemem objchunks2
|
|
clr.l 4(a3)
|
|
bra.s .loop
|
|
;
|
|
.done rts
|
|
|
|
mappath dc.b 'maps/'
|
|
mapname ds.b 64
|
|
even
|
|
|
|
getwindow tst twowins
|
|
bne.s .p2
|
|
;
|
|
lea defwindow1_1p,a0
|
|
lea window1,a1
|
|
bsr copywin
|
|
rts
|
|
;
|
|
.p2 lea defwindow1_2p,a0
|
|
lea window1,a1
|
|
bsr copywin
|
|
;
|
|
lea defwindow2_2p,a0
|
|
lea window2,a1
|
|
bsr copywin
|
|
rts
|
|
|
|
putwindow tst twowins
|
|
bne.s .p2
|
|
;
|
|
lea window1,a0
|
|
lea defwindow1_1p,a1
|
|
bsr copywin
|
|
rts
|
|
;
|
|
.p2 lea window1,a0
|
|
lea defwindow1_2p,a1
|
|
bsr copywin
|
|
;
|
|
lea window2,a0
|
|
lea defwindow2_2p,a1
|
|
bsr copywin
|
|
rts
|
|
|
|
linkswap tst linked
|
|
bpl.s .rts
|
|
movem.l player1(pc),a0-a1
|
|
exg a0,a1
|
|
movem.l a0-a1,player1
|
|
move ob_cntrl(a0),d0
|
|
move ob_cntrl(a1),d1
|
|
move d1,ob_cntrl(a0)
|
|
move d0,ob_cntrl(a1)
|
|
.rts rts
|
|
|
|
scriptplay ;
|
|
lea mapname,a1
|
|
bsr fetchrest
|
|
;
|
|
zerolist objects,ob_size
|
|
zerolist doors,do_size
|
|
zerolist blood,bl_size
|
|
zerolist gore,go_size
|
|
zerolist rotpolys,rp_size
|
|
;
|
|
tst twowins
|
|
beq.s .not2pg
|
|
cmp #1,gametype
|
|
bne.s .not2pg
|
|
;
|
|
;OK, see if either player is out of lives...if so, revert to single window
|
|
;
|
|
move p2lives(pc),d0
|
|
beq.s .g0
|
|
move p1lives(pc),d0
|
|
bne.s .not2pg
|
|
move p2health(pc),p1health
|
|
move p2weapon(pc),p1weapon
|
|
move p2lives(pc),p1lives
|
|
.g0 clr gametype
|
|
clr twowins
|
|
;
|
|
.not2pg clr.l player1
|
|
clr.l player2
|
|
tst gametype
|
|
bne.s .p2
|
|
not.l player2 ;no player 2!
|
|
.p2 ;
|
|
bsr permit
|
|
;
|
|
move.l map_test(pc),d0
|
|
bne.s .use
|
|
move.l #mappath,d0
|
|
.use move.l d0,a0
|
|
moveq #1,d1
|
|
bsr loadfile
|
|
move.l d0,map_map
|
|
;
|
|
bsr initmap
|
|
bsr loadtxts
|
|
move #$a3f7,d0
|
|
bsr seedrnd
|
|
moveq #1,d0
|
|
bsr execevent
|
|
bsr calcpalettes
|
|
bsr forbid
|
|
bsr makepalettes
|
|
bsr dispoff
|
|
bsr freewindows
|
|
bsr getwindow
|
|
bsr calcbpos
|
|
;
|
|
move.l player1,a5
|
|
move ob_x(a5),p1x
|
|
move ob_z(a5),p1z
|
|
move ob_rot(a5),p1r
|
|
cmp #2,gametype
|
|
beq .psk
|
|
move p1health(pc),d0
|
|
bne.s .p1hok
|
|
move #25,p1health
|
|
clr p1weapon
|
|
.p1hok move p1health(pc),ob_hitpoints(a5)
|
|
move p1weapon(pc),ob_weapon(a5)
|
|
move p1lives(pc),ob_lives(a5)
|
|
.psk bsr resetplayer
|
|
bsr calcwlevel
|
|
;
|
|
tst gametype
|
|
beq .p1
|
|
;
|
|
move.l player2,a5
|
|
move ob_x(a5),p2x
|
|
move ob_z(a5),p2z
|
|
move ob_rot(a5),p2r
|
|
cmp #2,gametype
|
|
beq.s .psk2
|
|
move p2health(pc),d0
|
|
bne.s .p2hok
|
|
move #25,p2health
|
|
clr p2weapon
|
|
.p2hok move p2health(pc),ob_hitpoints(a5)
|
|
move p2weapon(pc),ob_weapon(a5)
|
|
move p2lives(pc),ob_lives(a5)
|
|
.psk2 bsr resetplayer
|
|
bsr calcwlevel
|
|
.p1 ;
|
|
bsr linkswap
|
|
;
|
|
move.l player1(pc),a5
|
|
move.l #window1,ob_window(a5)
|
|
move.l ob_window(a5),a0
|
|
bsr makewindow
|
|
move.l ob_window(a5),a0
|
|
bsr showwindow
|
|
bsr initstats
|
|
;
|
|
tst twowins
|
|
beq.s .onew
|
|
;
|
|
move.l player2(pc),a5
|
|
move.l #window2,ob_window(a5)
|
|
move.l ob_window(a5),a0
|
|
bsr makewindow
|
|
move.l ob_window(a5),a0
|
|
bsr showwindow
|
|
bsr initstats
|
|
.onew ;
|
|
move #$4000,fadevol ;fadeout med!
|
|
;
|
|
move #$1f3a,d0
|
|
bsr seedrnd
|
|
move #1,linkcnt
|
|
clr prevjoy
|
|
clr finished
|
|
clr finished2
|
|
clr doneflag
|
|
clr showflag
|
|
;
|
|
tst linked
|
|
beq.s .nol
|
|
moveq #0,d7
|
|
bsr syncup
|
|
.nol ;
|
|
clr framecnt
|
|
clr paused
|
|
bsr drawall2
|
|
bsr dispon
|
|
;
|
|
mainloop bsr drawall
|
|
qkey $45 ;ESC?
|
|
beq .notesc
|
|
bsr dogamemenu
|
|
.notesc move finished(pc),d0
|
|
beq.s mainloop
|
|
;
|
|
tst linked
|
|
beq.s .unlk
|
|
bset #7,d0
|
|
bne.s .unlk ;don't send back!
|
|
bsr serput
|
|
;
|
|
.unlk and #$7f,finished
|
|
st paused
|
|
bsr dispoff
|
|
bsr freewindows
|
|
bsr linkswap
|
|
bsr freeobjlist
|
|
bsr freetxts
|
|
bsr freemap
|
|
;
|
|
move finished(pc),d0 ;why they finished
|
|
cmp #3,d0 ;completed?
|
|
bne .notfin
|
|
;
|
|
cmp #2,gametype
|
|
beq .com
|
|
;
|
|
move.l player1,a5
|
|
move ob_hitpoints(a5),p1health
|
|
move ob_weapon(a5),p1weapon
|
|
move ob_lives(a5),p1lives
|
|
;
|
|
tst gametype
|
|
beq.s .p1p1
|
|
;
|
|
move.l player2,a5
|
|
move ob_hitpoints(a5),p2health
|
|
move ob_weapon(a5),p2weapon
|
|
move ob_lives(a5),p2lives
|
|
.p1p1 ;
|
|
tst.l map_test
|
|
beq execscript_med
|
|
bra .notfin
|
|
.com ;
|
|
ifne onedemo
|
|
bra .notfin
|
|
endc
|
|
;
|
|
move wins1(pc),d0
|
|
sub wins2(pc),d0
|
|
move d0,d1
|
|
bpl.s .wsk
|
|
neg d1
|
|
.wsk add #48,d1
|
|
cmp.b comnum(pc),d1
|
|
bcs execscript_med
|
|
;
|
|
move d0,-(a7)
|
|
bsr freeiff
|
|
;
|
|
lea combat,a0
|
|
lea combatpal,a1
|
|
jsr makeiff
|
|
jsr showiff
|
|
;
|
|
lea p1wins,a4
|
|
tst (a7)+
|
|
bpl.s .p1
|
|
lea p2wins,a4
|
|
.p1 lea iffwindow,a6
|
|
move.l a4,a0
|
|
moveq #-1,d0
|
|
.cch addq #1,d0
|
|
tst.b (a0)+
|
|
bne.s .cch
|
|
move wi_bh(a6),d6
|
|
lsr #1,d6
|
|
subq #3,d6
|
|
bsr printmess2
|
|
;
|
|
jsr dispon
|
|
bsr waitany
|
|
jsr dispoff
|
|
;
|
|
lea iffwindow,a0
|
|
bsr freewindow
|
|
;
|
|
rts
|
|
;
|
|
.notfin bsr freeiff
|
|
rts
|
|
|
|
p1wins dc.b 'player one wins combat game!',0
|
|
even
|
|
p2wins dc.b 'player two wins combat game!',0
|
|
even
|
|
|
|
freemap move.l map_map,d0
|
|
beq.s .done
|
|
move.l d0,a1
|
|
freemem map
|
|
clr.l map_map
|
|
.done rts
|
|
|
|
dointro ;
|
|
lea gloom,a0
|
|
lea gloompal,a1
|
|
jsr makeiff
|
|
jsr showiff
|
|
;
|
|
lea gloombrush,a0
|
|
lea iffwindow,a1
|
|
move.l wi_bmap(a1),a1
|
|
add.l #168*7*40,a1
|
|
bsr decodeiff
|
|
;
|
|
bsr dispon
|
|
;
|
|
bsr waitany
|
|
;
|
|
lea startmenu,a4
|
|
lea iffwindow,a6
|
|
jsr initmenu
|
|
;
|
|
.sel jsr selmenu
|
|
;
|
|
cmp #3,d0
|
|
bcs .newgame
|
|
subq #3,d0
|
|
bne .notp1
|
|
;
|
|
lea p1ctype(pc),a1
|
|
lea p1_ob_cntrl,a2
|
|
lea p2_ob_cntrl,a3
|
|
;
|
|
.here addq #1,(a2)
|
|
cmp #3,(a2)
|
|
bcs.s .pok
|
|
cmp.l #p2ctype,a1
|
|
bne.s .fixc
|
|
cmp #4,(a2)
|
|
bcs.s .pok
|
|
.fixc clr (a2)
|
|
.pok move (a2),d0
|
|
cmp (a3),d0
|
|
beq.s .here
|
|
;
|
|
lea popts(pc),a0
|
|
move.l 0(a0,d0*4),a0
|
|
;
|
|
.sk move.b (a0)+,(a1)+
|
|
bne.s .sk
|
|
bra.s .sel
|
|
;
|
|
.notp1 subq #1,d0
|
|
bne.s .notp2
|
|
;
|
|
lea p2ctype(pc),a1
|
|
lea p2_ob_cntrl,a2
|
|
lea p1_ob_cntrl,a3
|
|
bra.s .here
|
|
;
|
|
.notp2 subq #1,d0
|
|
bne.s .notvile
|
|
;
|
|
addq #1,mode
|
|
and #1,mode
|
|
move mode(pc),d0
|
|
lea modes,a0
|
|
move.l 0(a0,d0*4),a0
|
|
lea modetxt,a1
|
|
.moloop move.b (a0)+,(a1)+
|
|
bne.s .moloop
|
|
;
|
|
bra .sel
|
|
;
|
|
.notvile subq #1,d0
|
|
bne .notabout
|
|
;
|
|
;about text...
|
|
;
|
|
bsr dispoff
|
|
bsr finitmenu
|
|
lea gloom,a0
|
|
lea gloompal,a1
|
|
bsr makeiff
|
|
bsr showiff
|
|
;
|
|
lea abouttext,a4
|
|
lea iffwindow,a6
|
|
bsr initmenu
|
|
move numopts(pc),-(a7)
|
|
move #1,numopts
|
|
;
|
|
bsr dispon
|
|
bsr selmenu
|
|
;
|
|
move (a7)+,numopts
|
|
;
|
|
bsr dispoff
|
|
bsr finitmenu
|
|
bra dointro
|
|
;
|
|
.notabout subq #1,d0
|
|
bne .sel
|
|
;
|
|
moveq #4,d0
|
|
;
|
|
.newgame move d0,gametype
|
|
;
|
|
jsr dispoff
|
|
jsr finitmenu
|
|
;
|
|
lea iffwindow,a0
|
|
jsr freewindow
|
|
;
|
|
rts
|
|
|
|
popts dc.l popt1,popt2,popt3,popt4
|
|
popt1 dc.b 'JOYSTICK 2',0
|
|
popt2 dc.b 'JOYSTICK 1',0
|
|
popt3 dc.b ' KEYBOARD ',0
|
|
popt4 dc.b 'NULL MODEM',0
|
|
|
|
even
|
|
|
|
makeiff ;show an IFF picture...128 colours...320 X 240
|
|
;
|
|
;a0=trimmed iff, a1=iff's palette
|
|
;
|
|
push
|
|
movem.l a0-a1,-(a7)
|
|
lea iffwindow,a0
|
|
bsr freewindow
|
|
movem.l (a7)+,a0-a1
|
|
;
|
|
lea iffwindow,a2
|
|
cmp.l #0,a0
|
|
bne.s .notblank
|
|
addq #1,a0
|
|
move.l a0,wi_iff(a2)
|
|
move.l #rgbs16,a1
|
|
bra.s .blank
|
|
;
|
|
.notblank move.l a0,wi_iff(a2)
|
|
.blank move.l a1,wi_pal(a2)
|
|
;
|
|
;copy font palette to IFF palette!
|
|
;
|
|
move.l font(pc),d0
|
|
beq.s .nofont
|
|
;
|
|
move.l d0,a0
|
|
add.l (a0),a0
|
|
addq #2,a0
|
|
clr.l (a1)+
|
|
moveq #14,d0
|
|
.loop move (a0),(a1)+
|
|
move (a0)+,(a1)+
|
|
dbf d0,.loop
|
|
.nofont ;
|
|
move.l a2,a0
|
|
bsr makewindow
|
|
;
|
|
pull
|
|
rts
|
|
|
|
showiff push
|
|
lea iffwindow,a0
|
|
bsr showwindow
|
|
pull
|
|
rts
|
|
|
|
gamemenu dc.b 7
|
|
dc.b 'CONTINUE',0
|
|
dc.b 'RESOLUTION',0
|
|
dc.b 'WINDOW SIZE',0
|
|
dc.b 'LARGEST WINDOW',0
|
|
dc.b 'FLOOR',0
|
|
dc.b 'CEILING',0
|
|
dc.b 'QUIT GAME',0
|
|
even
|
|
|
|
modes dc.l mode1,mode2
|
|
|
|
mode1 dc.b 'MEATY',0
|
|
|
|
mode2 dc.b 'MESSY',0
|
|
|
|
startmenu dc.b 8
|
|
dc.b 'ONE PLAYER GAME',0
|
|
dc.b 'TWO PLAYER GAME',0
|
|
dc.b 'TWO PLAYER COMBAT',0
|
|
dc.b 'PLAYER 1 '
|
|
p1ctype dc.b 'JOYSTICK 1',0
|
|
dc.b 'PLAYER 2 '
|
|
p2ctype dc.b 'JOYSTICK 2',0
|
|
dc.b 'VIOLENCE MODEL...'
|
|
modetxt dc.b 'MEATY',0
|
|
dc.b 'ABOUT GLOOM',0
|
|
dc.b 'EXIT GLOOM',0
|
|
even
|
|
|
|
;menustrip data;
|
|
;0.l : textaddress
|
|
;8.l : strip address
|
|
|
|
menuwindow dc.l 0
|
|
menubmap dc.l 0
|
|
|
|
menuy dc 0
|
|
numopts dc 0 ;how many menu options
|
|
curropt dc 0 ;current option
|
|
flashdelay dc 0
|
|
|
|
menustrips ds.l 32 ;16 max!
|
|
|
|
initmenu clr curropt
|
|
initmenu2 ;
|
|
;do a menu...menu in a4, window in a6
|
|
;
|
|
move.l a6,menuwindow
|
|
move.b (a4)+,d0 ;how many
|
|
ext d0
|
|
move d0,numopts
|
|
move d0,-(a7) ;counter
|
|
move wi_bh(a6),d6
|
|
move.l wi_bmap(a6),menubmap
|
|
lsr #1,d6
|
|
move fonth(pc),d2
|
|
lsr #1,d2
|
|
mulu d2,d0
|
|
sub d0,d6 ;Y
|
|
move d6,menuy
|
|
lea menustrips(pc),a5
|
|
;
|
|
.loop ;save strip!
|
|
;
|
|
move.l a4,(a5)+
|
|
;
|
|
move #40*7,d0
|
|
mulu fonth(pc),d0
|
|
moveq #2,d1
|
|
allocmem menustrip
|
|
move.l d0,(a5)+
|
|
move.l d0,a1
|
|
move.l wi_bmap(a6),a0
|
|
move d6,d0
|
|
mulu #7*40,d0
|
|
add.l d0,a0
|
|
;
|
|
move #40*7,d0
|
|
mulu fonth(pc),d0
|
|
lsr.l #2,d0
|
|
subq #1,d0
|
|
;
|
|
.sloop move.l (a0)+,(a1)+
|
|
dbf d0,.sloop
|
|
;
|
|
move.l a4,a0
|
|
moveq #-1,d0
|
|
.cnt addq #1,d0
|
|
tst.b (a0)+
|
|
bne.s .cnt
|
|
;
|
|
bsr printmess2
|
|
;
|
|
add fonth(pc),d6
|
|
subq #1,(a7)
|
|
bgt.s .loop
|
|
addq #2,a7
|
|
;
|
|
ifne debugmem
|
|
bsr showmem
|
|
lea memasc,a4
|
|
moveq #8,d0
|
|
bsr printmess2
|
|
;
|
|
move.l freememerr,d0
|
|
beq.s .nomemerr
|
|
clr.l freememerr
|
|
move.l d0,a4
|
|
move.l d0,a0
|
|
moveq #-1,d0
|
|
.ccloop addq #1,d0
|
|
tst.b (a0)+
|
|
bne.s .ccloop
|
|
add fonth(pc),d6
|
|
bsr printmess2
|
|
.nomemerr ;
|
|
endc
|
|
;
|
|
rts
|
|
|
|
ifne debugmem
|
|
showmem push
|
|
move.l 4.w,a6
|
|
moveq #1,d1
|
|
jsr -216(a6)
|
|
lea memasc,a0
|
|
moveq #7,d1
|
|
.loop rol.l #4,d0
|
|
move d0,d2
|
|
and #15,d2
|
|
add #48,d2
|
|
cmp #58,d2
|
|
bcs.s .skip
|
|
addq #7,d2
|
|
.skip move.b d2,(a0)+
|
|
dbf d1,.loop
|
|
pull
|
|
rts
|
|
;
|
|
memasc dc.b '12345678',0
|
|
even
|
|
endc
|
|
|
|
optoff move curropt(pc),d6
|
|
lea menustrips(pc),a0
|
|
move.l 4(a0,d6*8),a0 ;address of strip
|
|
mulu fonth(pc),d6
|
|
add menuy(pc),d6
|
|
mulu #7*40,d6
|
|
move.l menubmap(pc),a1
|
|
add.l d6,a1
|
|
;
|
|
move fonth(pc),d0
|
|
mulu #7,d0
|
|
lsl #6,d0
|
|
or #20,d0
|
|
;
|
|
btst #6,$dff002
|
|
.bwait btst #6,$dff002
|
|
bne.s .bwait
|
|
;
|
|
move.l #$9f00000,$dff040
|
|
move.l #-1,$dff044
|
|
move #0,$dff064
|
|
move #0,$dff066
|
|
move.l a0,$dff050
|
|
move.l a1,$dff054
|
|
move d0,$dff058
|
|
;
|
|
move #13,flashdelay
|
|
;
|
|
rts
|
|
|
|
opton move curropt(pc),d6
|
|
lea menustrips(pc),a0
|
|
move.l 0(a0,d6*8),a4 ;text!
|
|
mulu fonth(pc),d6
|
|
add menuy(pc),d6
|
|
;
|
|
;a6=window, a4=message, d0=length of message, d6=Y
|
|
;
|
|
move.l a4,a0
|
|
moveq #-1,d0
|
|
.loop addq #1,d0
|
|
tst.b (a0)+
|
|
bne.s .loop
|
|
;
|
|
move.l menuwindow(pc),a6
|
|
bsr printmess2
|
|
;
|
|
move #13,flashdelay
|
|
;
|
|
rts
|
|
|
|
checkup move joyy1(pc),d0
|
|
bmi.s .yes
|
|
move joyy2(pc),d0 ;is one up?
|
|
bmi.s .yes
|
|
moveq #-1,d0
|
|
rts
|
|
.yes moveq #0,d0
|
|
rts
|
|
|
|
checkdown move joyy1(pc),d0
|
|
bgt.s .yes
|
|
move joyy2(pc),d0
|
|
bgt.s .yes
|
|
moveq #-1,d0
|
|
rts
|
|
.yes moveq #0,d0
|
|
rts
|
|
|
|
checksel move joyb1(pc),d0
|
|
bne.s .yes
|
|
move joyb2(pc),d0
|
|
bne.s .yes
|
|
move.l rawtable(pc),a0
|
|
key $40 ;spc?
|
|
bne.s .yes
|
|
key $44
|
|
bne.s .yes
|
|
moveq #-1,d0
|
|
rts
|
|
.yes moveq #0,d0
|
|
rts
|
|
|
|
selmenu ;select a menu item...return item in d0
|
|
;
|
|
;flash selected option on/off
|
|
;
|
|
bsr optoff
|
|
;
|
|
.loop1 bsr vwait
|
|
bsr readjoys
|
|
bsr checkup
|
|
beq .up2
|
|
bsr checkdown
|
|
beq .down2
|
|
bsr checksel
|
|
beq .sel2
|
|
;
|
|
subq #1,flashdelay
|
|
bgt .loop1
|
|
;
|
|
bsr opton
|
|
;
|
|
.loop2 bsr vwait
|
|
bsr readjoys
|
|
bsr checkup
|
|
beq .up
|
|
bsr checkdown
|
|
beq .down
|
|
bsr checksel
|
|
beq .sel
|
|
;
|
|
subq #1,flashdelay
|
|
bgt .loop2
|
|
;
|
|
bra selmenu
|
|
;
|
|
.up2 bsr opton
|
|
.up subq #1,curropt
|
|
bpl.s .upskip
|
|
move numopts(pc),d0
|
|
subq #1,d0
|
|
move d0,curropt
|
|
.upskip bsr vwait
|
|
bsr readjoys
|
|
bsr checkup
|
|
beq .upskip
|
|
bra selmenu
|
|
;
|
|
.down2 bsr opton
|
|
.down addq #1,curropt
|
|
move curropt(pc),d0
|
|
cmp numopts(pc),d0
|
|
bcs.s .downskip
|
|
clr curropt
|
|
.downskip bsr vwait
|
|
bsr readjoys
|
|
bsr checkdown
|
|
beq .downskip
|
|
bra selmenu
|
|
;
|
|
.sel2 bsr opton
|
|
.sel bsr vwait
|
|
bsr readjoys
|
|
bsr checksel
|
|
beq .sel
|
|
move curropt(pc),d0
|
|
rts
|
|
|
|
finitmenu ;clean up menu operation
|
|
;
|
|
lea menustrips(pc),a5
|
|
move numopts(pc),d2
|
|
subq #1,d2
|
|
.loop addq #4,a5
|
|
move.l (a5)+,a1
|
|
freemem menustrip
|
|
dbf d2,.loop
|
|
rts
|
|
|
|
initbmappal move.l font(pc),a0
|
|
add.l (a0),a0
|
|
addq #2,a0
|
|
moveq #14,d0
|
|
move.l coplist(pc),a1
|
|
move.l a1,a2
|
|
move.l a1,a3
|
|
move.l a1,a4
|
|
;
|
|
lea cols1+6-copinit(a1),a1
|
|
lea cols2+6-copinit(a2),a2
|
|
lea cols3+6-copinit(a3),a3
|
|
lea cols4+6-copinit(a4),a4
|
|
;
|
|
.loop move (a0),(a1)
|
|
move (a0),(a2)
|
|
move (a0),(a3)
|
|
move (a0)+,(a4)
|
|
addq #4,a1
|
|
addq #4,a2
|
|
addq #4,a3
|
|
addq #4,a4
|
|
dbf d0,.loop
|
|
rts
|
|
|
|
initdarktable ;
|
|
move #maxz-1,d2
|
|
move.l sqr(pc),a0
|
|
move.l darktable(pc),a1
|
|
;
|
|
.loop move d2,d3
|
|
lsl #3,d3
|
|
move 0(a0,d3),d3
|
|
lsr #3,d3
|
|
eor #15,d3
|
|
move d3,(a1)+
|
|
;
|
|
dbf d2,.loop
|
|
;
|
|
rts
|
|
|
|
rawtable dc.l 0
|
|
ciaaname dc.b 'ciaa.resource',0
|
|
even
|
|
|
|
savefile ;a0=name, a1=mem, d0=length
|
|
push
|
|
;
|
|
movem.l d0/a1,-(a7)
|
|
;
|
|
move.l dosbase,a6
|
|
move.l a0,d1
|
|
move.l #1006,d2
|
|
jsr -30(a6)
|
|
move.l d0,d7
|
|
beq .done
|
|
;
|
|
move.l d7,d1
|
|
movem.l (a7)+,d0/a1
|
|
move.l a1,d2
|
|
move.l d0,d3
|
|
jsr -48(a6)
|
|
;
|
|
move.l d7,d1
|
|
jsr -36(a6)
|
|
;
|
|
.done pull
|
|
rts
|
|
|
|
fileheader ds.b 14
|
|
loadmem dc.l 0
|
|
|
|
loadfileabs move.l a1,loadmem
|
|
bra.s loadfile_
|
|
|
|
loadfile clr.l loadmem
|
|
;
|
|
loadfile_ ;a0=name, d1=memtype
|
|
;
|
|
;decrunch file if nec.
|
|
;
|
|
;return d0=pointer
|
|
;
|
|
push
|
|
;
|
|
move.l d1,d5 ;save memtype
|
|
move.l dosbase,a6
|
|
;
|
|
move.l a0,d1
|
|
move.l #1005,d2
|
|
jsr -30(a6) ;open it!
|
|
move.l d0,d7 ;handle
|
|
beq .err
|
|
;
|
|
move.l d7,d1
|
|
moveq #0,d2
|
|
moveq #1,d3
|
|
jsr -66(a6) ;seek to end
|
|
;
|
|
move.l d7,d1
|
|
moveq #0,d2
|
|
moveq #-1,d3 ;seek to start
|
|
jsr -66(a6)
|
|
;
|
|
move.l d0,d4 ;length=prev filepos
|
|
;
|
|
move.l d7,d1
|
|
move.l #fileheader,d2
|
|
moveq #14,d3
|
|
jsr -42(a6) ;read!
|
|
;
|
|
move.l d0,-(a7) ;how many bytes read!
|
|
;
|
|
move.l d7,d1
|
|
moveq #0,d2
|
|
moveq #-1,d3 ;back to start
|
|
jsr -66(a6)
|
|
;
|
|
cmp.l #14,(a7)+
|
|
bcs.s .nocrunch
|
|
;
|
|
moveq #0,d6
|
|
move.l fileheader(pc),d0
|
|
cmp.l #'CrM2',d0
|
|
beq.s .crunch
|
|
cmp.l #'CrM!',d0
|
|
bne.s .nocrunch
|
|
;
|
|
.crunch cmp.l fileheader+6(pc),d4 ;loadlen>destlen?
|
|
bcc.s .skip
|
|
move.l fileheader+6(pc),d4 ;length to allocate
|
|
.skip ;
|
|
moveq #14,d6
|
|
add fileheader+4(pc),d6
|
|
bsr loadit
|
|
move.l d0,a0 ;src
|
|
add.l d6,d0 ;dest
|
|
move.l d0,a1
|
|
jsr decrm+32
|
|
pull
|
|
rts
|
|
.nocrunch ;
|
|
bsr loadit
|
|
;
|
|
.err pull
|
|
rts
|
|
|
|
loadit ;d4=length to alloc/read, d5=memtype
|
|
;seek to start, load, close and return base in d0.
|
|
;
|
|
move.l loadmem(pc),d0
|
|
bne.s .noalloc
|
|
;
|
|
move.l d4,d0
|
|
move.l d5,d1
|
|
move.l d6,d2 ;offset XS
|
|
allocmem2 loadfile
|
|
sub.l d6,d0
|
|
.noalloc ;
|
|
move.l d7,d1
|
|
move.l d0,d2
|
|
move.l d4,d3 ;read len
|
|
jsr -42(a6) ;read
|
|
move.l d7,d1
|
|
jsr -36(a6) ;close
|
|
move.l d2,d0
|
|
;
|
|
rts
|
|
|
|
andtable dc $ffff,0 ;rgb and, brightness add...wht
|
|
dc $ff00,8 ;red
|
|
|
|
makepalettes ;
|
|
;make wht and red pals
|
|
;
|
|
;create pointers...
|
|
;
|
|
lea palettes(pc),a0
|
|
move.l map_rgbs(pc),d0
|
|
lea palettesw(pc),a1
|
|
move.l map_rgbsw(pc),d1
|
|
lea palettesr(pc),a2
|
|
move.l map_rgbsr(pc),d2
|
|
;
|
|
moveq #15,d7
|
|
;
|
|
.loop move.l (a0)+,d3
|
|
sub.l d0,d3 ;offset!
|
|
move.l d3,d4
|
|
add.l d1,d3
|
|
move.l d3,(a1)+
|
|
add.l d2,d4
|
|
move.l d4,(a2)+
|
|
;
|
|
dbf d7,.loop
|
|
;
|
|
move.l map_rgbsend(pc),d7
|
|
sub.l map_rgbs(pc),d7 ;how many bytes!
|
|
lsr #1,d7
|
|
subq #1,d7 ;words!
|
|
;
|
|
move.l map_rgbsw(pc),a1
|
|
move #$ffff,d1 ;col and
|
|
move #0,d2 ;gamma
|
|
bsr makeapal
|
|
;
|
|
move.l map_rgbsr(pc),a1
|
|
move #$ff00,d1
|
|
moveq #16,d2
|
|
bsr makeapal
|
|
;
|
|
rts
|
|
|
|
makeapal move.l map_rgbs(pc),a0
|
|
;
|
|
.loop move (a0)+,d4 ;src colour...find briteness
|
|
;
|
|
move d4,d5
|
|
move d4,d6
|
|
and #$f00,d4
|
|
lsr #8,d4
|
|
and #$0f0,d5
|
|
lsr #4,d5
|
|
and #$00f,d6
|
|
add d6,d5
|
|
add d5,d4
|
|
add d2,d4
|
|
cmp #16*3,d4
|
|
bcs.s .bok
|
|
moveq #16*3-1,d4
|
|
.bok ext.l d4
|
|
divu #3,d4 ;(r+g+b)/3=briteness!
|
|
;
|
|
move d4,d5
|
|
move d4,d6
|
|
lsl #8,d4
|
|
lsl #4,d5
|
|
or d6,d5
|
|
or d5,d4 ;RGB
|
|
and d1,d4
|
|
;
|
|
move d4,(a1)+
|
|
;
|
|
cmp.l map_rgbsend(pc),a0
|
|
bcs.s .loop
|
|
;
|
|
rts
|
|
|
|
calcpalettes ;OK, our palette currently runs from:
|
|
;
|
|
;map_rgbs
|
|
; to
|
|
;map_rgbsat
|
|
;
|
|
;append brightness versions...
|
|
;
|
|
lea palettes(pc),a2
|
|
move.l map_rgbs(pc),(a2)+ ;first brightness!
|
|
move.l map_rgbsat(pc),a1 ;first brightness!
|
|
move.l a1,a3
|
|
moveq #1,d0 ;rgb subtract
|
|
;
|
|
.loop move.l map_rgbs(pc),a0
|
|
move.l a1,(a2)+
|
|
;
|
|
.loop2 move (a0)+,d1
|
|
move d1,d2
|
|
move d1,d3
|
|
;
|
|
and #$f00,d1
|
|
lsr #8,d1
|
|
sub d0,d1
|
|
bpl.s .rok
|
|
moveq #0,d1
|
|
.rok ;
|
|
and #$f0,d2
|
|
lsr #4,d2
|
|
sub d0,d2
|
|
bpl.s .gok
|
|
moveq #0,d2
|
|
.gok ;
|
|
and #$0f,d3
|
|
sub d0,d3
|
|
bpl.s .bok
|
|
moveq #0,d3
|
|
.bok ;
|
|
lsl #8,d1
|
|
lsl #4,d2
|
|
or d3,d2
|
|
or d2,d1
|
|
or #$8000,d1
|
|
;
|
|
move d1,(a1)+
|
|
cmp.l a3,a0
|
|
bcs.s .loop2
|
|
;
|
|
addq #1,d0
|
|
cmp #16,d0
|
|
bcs.s .loop
|
|
;
|
|
move.l a1,map_rgbsend
|
|
;
|
|
rts
|
|
|
|
map_rgbsend dc.l 0
|
|
|
|
dispoff tst dispnest
|
|
bne.s .skip
|
|
bsr vwait
|
|
move #$01a0,$dff096
|
|
.skip addq #1,dispnest
|
|
rts
|
|
|
|
dispon subq #1,dispnest
|
|
bgt.s .skip
|
|
bsr vwait
|
|
move.l coplist(pc),$dff080
|
|
move #$8180,$dff096
|
|
move #0,$dff088
|
|
.skip rts
|
|
|
|
forbid push
|
|
moveq #49,d0
|
|
.fl bsr vwait
|
|
dbf d0,.fl
|
|
bsr ownblitter
|
|
move.l 4.w,a6
|
|
jsr -132(a6)
|
|
move #$8400,$dff096
|
|
pull
|
|
rts
|
|
|
|
permit push
|
|
move.l rawstuff,a0
|
|
clr.l $70(a0)
|
|
move.l 4.w,a6
|
|
jsr -138(a6)
|
|
bsr disownblitter
|
|
pull
|
|
rts
|
|
|
|
initvbint push
|
|
move.l 4.w,a6
|
|
moveq #5,d0
|
|
lea vbintserver,a1
|
|
jsr -168(a6) ;addintserver
|
|
pull
|
|
rts
|
|
|
|
vbcounter dc 0
|
|
framecnt dc 0
|
|
|
|
frame dc 0,0
|
|
|
|
vbintserver dc.l 0,0
|
|
dc.b 2,0
|
|
dc.l 0
|
|
vbintdata dc.l vbcounter
|
|
vbintcode dc.l vbhandler
|
|
|
|
finitvbint push
|
|
move.l 4.w,a6
|
|
moveq #5,d0
|
|
lea vbintserver,a1
|
|
jsr -174(a6)
|
|
pull
|
|
rts
|
|
|
|
ownblitter push
|
|
move.l grbase,a6
|
|
jsr -456(a6)
|
|
btst #6,$dff002
|
|
.bwait btst #6,$dff002
|
|
bne.s .bwait
|
|
pull
|
|
rts
|
|
|
|
disownblitter push
|
|
btst #6,$dff002
|
|
.bwait btst #6,$dff002
|
|
bne.s .bwait
|
|
move.l grbase,a6
|
|
jsr -462(a6)
|
|
pull
|
|
rts
|
|
|
|
makecoloffs push
|
|
;
|
|
ifne aga
|
|
;
|
|
lea coloffs,a0
|
|
moveq #2,d0
|
|
moveq #3,d2
|
|
.loop addq.l #4,d0
|
|
moveq #31,d1
|
|
.loop2 move.l d0,(a0)+
|
|
addq.l #4,d0
|
|
dbf d1,.loop2
|
|
dbf d2,.loop
|
|
;
|
|
elseif
|
|
;
|
|
lea coloffs,a0
|
|
moveq #18,d0
|
|
moveq #127,d1
|
|
;
|
|
.loop move.l d0,(a0)+
|
|
addq.l #4,d0
|
|
dbf d1,.loop
|
|
;
|
|
endc
|
|
;
|
|
pull
|
|
rts
|
|
|
|
grname dc.b 'graphics.library',0
|
|
even
|
|
grbase dc.l 0
|
|
oldview dc.l 0
|
|
dosname dc.b 'dos.library',0
|
|
even
|
|
dosbase dc.l 0
|
|
|
|
calcbpos ;also: calc qstripbot, con0poke...
|
|
;
|
|
move window1+wi_h,d0
|
|
add d0,d0
|
|
ext.l d0
|
|
add.l qstrip(pc),d0
|
|
move.l d0,qstripbot
|
|
;
|
|
move #$100,con0poke
|
|
move floorflag(pc),d0
|
|
and roofflag(pc),d0
|
|
bne.s .cp
|
|
move #$9f0,con0poke ;one of them is cop strip!
|
|
.cp ;
|
|
move window1+wi_y,d0
|
|
subq #4,d0
|
|
move d0,minbpos
|
|
tst twowins
|
|
beq.s .p1
|
|
;
|
|
move window2+wi_y,d0
|
|
add window2+wi_bh,d0
|
|
addq #4,d0
|
|
move d0,maxbpos
|
|
rts
|
|
;
|
|
.p1 move window1+wi_y,d0
|
|
add window1+wi_bh,d0
|
|
addq #4,d0
|
|
move d0,maxbpos
|
|
;
|
|
rts
|
|
|
|
showwindow ;a0=window
|
|
;
|
|
push
|
|
;
|
|
ifne aga
|
|
;
|
|
;poke bitmaps...
|
|
move.l wi_slice(a0),a1
|
|
move.l (a1),a1
|
|
move.l wi_bmap(a0),d0
|
|
moveq #6,d1 ;7 bitplanes
|
|
.loop move d0,6(a1)
|
|
swap d0
|
|
move d0,2(a1)
|
|
swap d0
|
|
add.l #40,d0
|
|
addq #8,a1
|
|
dbf d1,.loop
|
|
;
|
|
;create DIW
|
|
;
|
|
move.l wi_slice(a0),a1
|
|
move.l (a1),a1
|
|
;
|
|
move wi_y(a0),d0
|
|
move d0,d1
|
|
add wi_bh(a0),d1
|
|
lsl #8,d0
|
|
or #$81,d0
|
|
move d0,56+2(a1)
|
|
lsl #8,d1
|
|
or #$c1,d1
|
|
move d1,56+6(a1)
|
|
;
|
|
move wi_y(a0),d0
|
|
subq #3,d0
|
|
move.b d0,64(a1)
|
|
;
|
|
endc
|
|
;
|
|
;create link to next!
|
|
move.l wi_nslice(a0),a1
|
|
move.l (a1),d0
|
|
move.l wi_cop1(a0),a1
|
|
add.l wi_copmem(a0),a1
|
|
move.l wi_cop2(a0),a2
|
|
add.l wi_copmem(a0),a2
|
|
move d0,-6(a1)
|
|
move d0,-6(a2)
|
|
swap d0
|
|
move d0,-10(a1)
|
|
move d0,-10(a2)
|
|
;
|
|
pull
|
|
;
|
|
showwindowq ;display coplist
|
|
;
|
|
move.l wi_cop(a0),d0
|
|
move.l wi_slice(a0),a0
|
|
move.l (a0),a0
|
|
;
|
|
ifne aga
|
|
;
|
|
move d0,72+6(a0)
|
|
swap d0
|
|
move d0,72+2(a0)
|
|
;
|
|
elseif
|
|
;
|
|
move d0,6(a0)
|
|
swap d0
|
|
move d0,2(a0)
|
|
;
|
|
endc
|
|
;
|
|
rts
|
|
|
|
finitdisplay push
|
|
;
|
|
move.l grbase,a6
|
|
move.l oldview,a1
|
|
jsr -222(a6) ;load view
|
|
jsr -270(a6)
|
|
jsr -270(a6)
|
|
move.l 38(a6),$dff080
|
|
move #$81a0,$dff096
|
|
move #0,$dff088
|
|
;
|
|
pull
|
|
rts
|
|
|
|
initdisplay push
|
|
;
|
|
lea grname,a1
|
|
move.l 4.w,a6
|
|
jsr -408(a6)
|
|
move.l d0,grbase
|
|
;
|
|
move.l d0,a6
|
|
move.l 34(a6),oldview
|
|
sub.l a1,a1
|
|
jsr -222(a6) ;loadview
|
|
;
|
|
move.l #copinitf-copinit,d0
|
|
moveq #2,d1
|
|
allocmem copinit
|
|
move.l d0,coplist
|
|
;
|
|
move.l d0,a1
|
|
lea copinit,a0
|
|
lea copinitf,a2
|
|
;
|
|
.loop cmp.l a2,a0
|
|
bcc.s .done
|
|
move.l (a0)+,(a1)+
|
|
bra.s .loop
|
|
.done ;
|
|
add.l #sl1-copinit,d0
|
|
move.l d0,slice1
|
|
add.l #sl2-sl1,d0
|
|
move.l d0,slice2
|
|
add.l #cstop-sl2,d0
|
|
move.l d0,copstop
|
|
;
|
|
move.l copstop,d0
|
|
move.l slice1,a0
|
|
move.l slice2,a1
|
|
;
|
|
ifne aga
|
|
;
|
|
move d0,72+6(a0)
|
|
move d0,72+6(a1)
|
|
swap d0
|
|
move d0,72+2(a0)
|
|
move d0,72+2(a1)
|
|
;
|
|
elseif
|
|
;
|
|
move d0,6(a0)
|
|
move d0,6(a1)
|
|
swap d0
|
|
move d0,2(a0)
|
|
move d0,2(a1)
|
|
;
|
|
endc
|
|
;
|
|
jsr -270(a6)
|
|
jsr -270(a6)
|
|
move.l coplist,$dff080
|
|
move #0,$dff088
|
|
;
|
|
pull
|
|
rts
|
|
|
|
allocwbmap move wi_w(a2),d0
|
|
mulu wi_pw(a2),d0
|
|
move d0,wi_bw(a2)
|
|
;
|
|
move wi_h(a2),d0
|
|
mulu wi_ph(a2),d0
|
|
move d0,wi_bh(a2)
|
|
;
|
|
mulu #40*7,d0
|
|
;
|
|
move.l #$10002,d1
|
|
move.l d0,wi_bmapmem(a2)
|
|
allocmem wi_bmap
|
|
move.l d0,wi_bmap(a2)
|
|
;
|
|
move.l #40*7*7,d0
|
|
moveq #2,d1
|
|
allocmem wi_strip
|
|
move.l d0,wi_strip(a2)
|
|
;
|
|
rts
|
|
|
|
windowiff ;draw iff into window!
|
|
;
|
|
move.l wi_iff(a2),a0
|
|
cmp.l #1,a0
|
|
bne.s .do
|
|
rts
|
|
;
|
|
.do move.l wi_bmap(a2),a1
|
|
;
|
|
move 2(a0),d1
|
|
cmp #240,d1
|
|
bcs.s .skip
|
|
move #240,d1
|
|
.skip move #120,d2
|
|
lsr #1,d1
|
|
sub d1,d2
|
|
mulu #7*40,d2
|
|
add.l d2,a1
|
|
;
|
|
decodeiff ;for 40 columns...
|
|
;
|
|
;a0=trimmed IFF file,
|
|
;a1=destination bitmap...
|
|
;
|
|
move.l a2,-(a7)
|
|
moveq #40,d7
|
|
;
|
|
move (a0)+,d0 ;pixel width
|
|
lsr #3,d0 ;to byte width
|
|
move (a0)+,d1 ;pixel height
|
|
cmp #240,d1
|
|
bls.s .hok
|
|
move #240,d1
|
|
.hok subq #1,d1 ;to dbf
|
|
move (a0)+,d2 ;depth
|
|
subq #1,d2 ;to dbf
|
|
addq #6,a0 ;skip header
|
|
;
|
|
.loop5 move d2,d5 ;depth
|
|
;
|
|
.loop4 move.l a1,a2
|
|
move d0,d4 ;how many bytes in line
|
|
;
|
|
.loop moveq #0,d3
|
|
move.b (a0)+,d3
|
|
bmi.s .repeat
|
|
sub d3,d4
|
|
.loop3 move.b (a0)+,(a2)+
|
|
dbf d3,.loop3
|
|
bra.s .skip
|
|
;
|
|
.repeat cmp.b #-128,d3
|
|
beq.s .loop
|
|
neg.b d3
|
|
sub d3,d4
|
|
.loop2 move.b (a0),(a2)+
|
|
dbf d3,.loop2
|
|
addq #1,a0
|
|
.skip subq #1,d4
|
|
bgt.s .loop
|
|
;
|
|
add d7,a1
|
|
dbf d5,.loop4
|
|
dbf d1,.loop5
|
|
;
|
|
move.l (a7)+,a2
|
|
rts
|
|
|
|
plotwbmap ;OK, plot colours on bitmap!
|
|
;
|
|
tst.l wi_iff(a2)
|
|
bne windowiff
|
|
;
|
|
move.l wi_bmap(a2),a0
|
|
move wi_x(a2),d0
|
|
move d0,d1
|
|
lsr #3,d0
|
|
not d1
|
|
and #7,d1
|
|
moveq #127,d7 ;colour
|
|
move wi_w(a2),d6 ;width
|
|
subq #1,d6
|
|
;
|
|
.wloop move wi_pw(a2),d5
|
|
subq #1,d5
|
|
;
|
|
.wloop2 move d7,d4
|
|
moveq #6,d3
|
|
;
|
|
.dloop bclr d1,0(a0,d0)
|
|
lsr #1,d4
|
|
bcc.s .dskip
|
|
bset d1,0(a0,d0)
|
|
.dskip lea 40(a0),a0
|
|
dbf d3,.dloop
|
|
;
|
|
lea -40*7(a0),a0
|
|
subq #1,d1
|
|
bpl.s .dskip2
|
|
moveq #7,d1
|
|
addq #1,d0
|
|
.dskip2 dbf d5,.wloop2
|
|
;
|
|
subq #1,d7
|
|
dbf d6,.wloop
|
|
;
|
|
move wi_bh(a2),d0 ;how many to copy
|
|
subq #1,d0
|
|
bsr wcopy
|
|
;
|
|
move.l wi_bmap(a2),a0
|
|
move.l wi_strip(a2),a1
|
|
move wi_bh(a2),d0
|
|
lsr #2,d0
|
|
mulu #7*40,d0
|
|
add.l d0,a0
|
|
move #7*7*10-1,d2
|
|
;
|
|
.loop move.l (a0)+,(a1)+
|
|
dbf d2,.loop
|
|
;
|
|
rts
|
|
|
|
wcopy ;copy top scanline to next d0 scanlines
|
|
;
|
|
move.l wi_bmap(a2),a0
|
|
mulu #10*7,d0
|
|
subq #1,d0
|
|
lea 40*7(a0),a1
|
|
.cbloop move.l (a0)+,(a1)+
|
|
dbf d0,.cbloop
|
|
;
|
|
rts
|
|
|
|
freewindow ;window in a0
|
|
;
|
|
push
|
|
move.l a0,a2
|
|
move.l wi_bmap(a2),d0
|
|
beq.s .no1
|
|
clr.l wi_bmap(a2)
|
|
move.l d0,a1
|
|
freemem wi_bmap
|
|
.no1 move.l wi_strip(a2),d0
|
|
beq.s .no2
|
|
clr.l wi_strip(a2)
|
|
move.l d0,a1
|
|
freemem wi_strip
|
|
.no2 move.l wi_cop1(a2),d0
|
|
beq.s .no3
|
|
clr.l wi_cop1(a2)
|
|
move.l d0,a1
|
|
freemem wi_cop
|
|
.no3 pull
|
|
rts
|
|
|
|
ifne aga
|
|
;
|
|
agawindow ;
|
|
makewindow ;AGA make window
|
|
;
|
|
;a0=window struct!
|
|
;
|
|
push
|
|
;
|
|
move.l a0,a2
|
|
;
|
|
bsr allocwbmap
|
|
bsr plotwbmap
|
|
;
|
|
tst.l wi_iff(a2)
|
|
beq wchunky
|
|
;
|
|
;make a palette coplist for the window
|
|
;
|
|
;to write 32 colours...
|
|
;set bank, write hi nybs, set bank, write lo nybs...
|
|
;=66 copins.
|
|
;*4=264 total
|
|
;+1 for final wait +3 for final copjump=268
|
|
;
|
|
move.l #268<<2,d0
|
|
move.l d0,wi_copmem(a2)
|
|
moveq #2,d1
|
|
allocmem wi_iffcop
|
|
move.l d0,wi_cop(a2)
|
|
move.l d0,wi_cop1(a2)
|
|
move.l d0,wi_cop2(a2)
|
|
move.l d0,a0 ;dest
|
|
move.l wi_pal(a2),a1 ;palette!
|
|
;
|
|
moveq #0,d0 ;bank
|
|
moveq #3,d3
|
|
;
|
|
.loop move #$106,(a0)+
|
|
move d0,(a0)+
|
|
move #$180,d1
|
|
moveq #31,d2
|
|
.hiloop move d1,(a0)+
|
|
move (a1),(a0)+
|
|
addq #4,a1
|
|
addq #2,d1
|
|
dbf d2,.hiloop
|
|
;
|
|
lea -128+2(a1),a1
|
|
move #$106,(a0)+
|
|
bset #9,d0
|
|
move d0,(a0)+
|
|
bclr #9,d0
|
|
move #$180,d1
|
|
moveq #31,d2
|
|
.loloop move d1,(a0)+
|
|
move (a1),(a0)+
|
|
addq #4,a1
|
|
addq #2,d1
|
|
dbf d2,.loloop
|
|
subq #2,a1
|
|
;
|
|
add #$2000,d0 ;next bank!
|
|
dbf d3,.loop
|
|
;
|
|
move.l #$fffffffe,(a0)+
|
|
move.l #$00840000,(a0)+
|
|
move.l #$00860000,(a0)+
|
|
move.l #$008a0000,(a0)+
|
|
pull
|
|
rts
|
|
;
|
|
wchunky ;how many copins on one line?
|
|
;
|
|
move wi_w(a2),d0
|
|
move d0,d1
|
|
subq #1,d0
|
|
lsr #5,d0 ;how many bank changes per line!
|
|
addq #3,d0 ;1 waits - 1 eor, 1 init bank select
|
|
add d1,d0 ;+colpokes
|
|
;
|
|
move d0,d1
|
|
lsl #2,d1
|
|
move d1,wi_copmod(a2)
|
|
;
|
|
mulu wi_h(a2),d0
|
|
addq #4,d0 ;1 wait and cop jump at end
|
|
;
|
|
lsl.l #2,d0 ;4 bytes/copins
|
|
moveq #2,d1 ;cop in chip
|
|
move.l d0,wi_copmem(a2)
|
|
lsl.l #1,d0 ;2 coplists!
|
|
allocmem wi_chunkycop
|
|
move.l d0,wi_cop(a2)
|
|
move.l d0,wi_cop1(a2)
|
|
;
|
|
move.l d0,a0
|
|
move wi_y(a2),d6
|
|
move wi_h(a2),d7
|
|
subq #1,d7
|
|
move #$111,d3 ;test colour
|
|
move #$8000,d4 ;Colour Eor
|
|
;
|
|
.hloop ;make one copline...
|
|
;
|
|
moveq #127,d0 ;colour reg to poke
|
|
move wi_w(a2),d1
|
|
subq #1,d1
|
|
;
|
|
.lloop move d0,d2
|
|
addq #1,d2
|
|
and #31,d2
|
|
bne.s .notnbank
|
|
;
|
|
;new bank....
|
|
move d0,d2
|
|
sub #31,d2
|
|
and #$ffe0,d2
|
|
lsl #8,d2
|
|
or d4,d2 ;eor bank
|
|
move #$106,(a0)+ ;bank select
|
|
move d2,(a0)+
|
|
;
|
|
.notnbank move d0,d2
|
|
and #31,d2
|
|
add d2,d2
|
|
add #$180,d2
|
|
move d2,(a0)+ ;colour poke
|
|
move d3,(a0)+
|
|
add #$111,d3
|
|
subq #1,d0
|
|
dbf d1,.lloop
|
|
;
|
|
bsr .makewait
|
|
;
|
|
;ok, now do EOR!
|
|
move #$10c,(a0)+
|
|
move d4,(a0)+
|
|
bchg #15,d4
|
|
;
|
|
dbf d7,.hloop
|
|
;
|
|
bsr .makewait
|
|
;
|
|
move.l #$00840000,(a0)+
|
|
move.l #$00860000,(a0)+
|
|
move.l #$008a0000,(a0)+
|
|
;
|
|
;OK, 1 list created...copy to other!
|
|
;
|
|
move.l wi_cop1(a2),a0
|
|
move.l a0,a1
|
|
add.l wi_copmem(a2),a1
|
|
move.l a1,wi_cop2(a2)
|
|
move.l a1,a3
|
|
;
|
|
.copycop move.l (a0)+,(a3)+
|
|
cmp.l a1,a0
|
|
bcs.s .copycop
|
|
;
|
|
pull
|
|
rts
|
|
|
|
.makewait ;
|
|
;make wait ins. at pos d6
|
|
;
|
|
subq #1,d6
|
|
move.b d6,(a0)+
|
|
move.b #$e1,(a0)+
|
|
move #$fffe,(a0)+
|
|
addq #1,d6
|
|
add wi_ph(a2),d6
|
|
rts
|
|
|
|
elseif
|
|
|
|
ecswindow
|
|
makewindow ;ECS makewindow...no bitmap needed!
|
|
;
|
|
;a0=window struct
|
|
;
|
|
push
|
|
;
|
|
move.l a0,a2
|
|
;
|
|
;how many copins on one line?
|
|
;
|
|
;2 waits...
|
|
;width moves
|
|
;1 colour 0 poke...
|
|
;
|
|
;=width+3!
|
|
;
|
|
move wi_w(a2),d0
|
|
addq #7,d0
|
|
;
|
|
move d0,d1
|
|
lsl #2,d1
|
|
move d1,wi_copmod(a2)
|
|
;
|
|
mulu wi_h(a2),d0
|
|
addq #4,d0 ;1 waits at begin and cop jump
|
|
;at end
|
|
;
|
|
lsl.l #2,d0 ;4 bytes/copins
|
|
moveq #2,d1 ;cop in chip
|
|
move.l d0,wi_copmem(a2)
|
|
lsl.l #1,d0 ;2 coplists!
|
|
allocmem wi_chunkycop
|
|
move.l d0,wi_cop(a2)
|
|
move.l d0,wi_cop1(a2)
|
|
;
|
|
move.l d0,a0
|
|
move #$47,d5
|
|
sub wi_w(a2),d5
|
|
add d5,d5
|
|
or #1,d5
|
|
move wi_y(a2),d6
|
|
move wi_h(a2),d7
|
|
subq #1,d7
|
|
;
|
|
moveq #0,d3
|
|
move #$fffe,d4
|
|
bsr .makewait ;wait!
|
|
;
|
|
.hloop ;make one copline...
|
|
cmp #128,d6
|
|
ble.s .yn
|
|
move.b #$80,d3
|
|
.yn ;
|
|
move.l a0,d2 ;prepare jump address
|
|
addq.l #8,d2
|
|
;
|
|
move #$084,(a0)+
|
|
swap d2
|
|
move d2,(a0)+
|
|
move #$086,(a0)+
|
|
swap d2
|
|
move d2,(a0)+
|
|
;
|
|
;wait for start X pos...
|
|
;
|
|
move.b d3,(a0)+
|
|
move.b d5,(a0)+
|
|
move #$80fe,(a0)+
|
|
;
|
|
move wi_w(a2),d1
|
|
subq #1,d1
|
|
;
|
|
.lloop move.l #$1800f00,(a0)+
|
|
dbf d1,.lloop
|
|
move #$180,(a0)+
|
|
move #col0,(a0)+
|
|
;
|
|
move.b d3,(a0)+
|
|
move.b #$e1,(a0)+
|
|
move #$80fe,(a0)+ ;wait for end of line!
|
|
;
|
|
move #$ffff,d4 ;skip!
|
|
bsr .makewait
|
|
move.l #$8a0000,(a0)+ ;strobe!
|
|
;
|
|
dbf d7,.hloop
|
|
;
|
|
move.l #$00840000,(a0)+
|
|
move.l #$00860000,(a0)+
|
|
move.l #$008a0000,(a0)+
|
|
;
|
|
;OK, 1 list created...copy to other!
|
|
;
|
|
move.l wi_cop1(a2),a0
|
|
move.l a0,a1
|
|
add.l wi_copmem(a2),a1
|
|
move.l a1,wi_cop2(a2)
|
|
move.l a1,a3
|
|
;
|
|
move.l a1,d0
|
|
sub.l a0,d0
|
|
;
|
|
.copycop move.l (a0)+,(a3)+
|
|
cmp #$084,-8(a3)
|
|
bne.s .noafix
|
|
move -6(a3),d2
|
|
swap d2
|
|
move -2(a3),d2
|
|
add.l d0,d2
|
|
move d2,-2(a3)
|
|
swap d2
|
|
move d2,-6(a3)
|
|
.noafix cmp.l a1,a0
|
|
bcs.s .copycop
|
|
;
|
|
pull
|
|
rts
|
|
|
|
.makewait ;
|
|
;make wait ins. at pos d6
|
|
;cmp #256,d6
|
|
;blt.s .not256
|
|
;move.l #$ffe1fffe,(a0)+
|
|
;add wi_ph(a2),d6
|
|
;rts
|
|
;
|
|
.not256 move.b d6,(a0)+
|
|
move.b #1,(a0)+
|
|
move d4,(a0)+ ;wait/skip
|
|
add wi_ph(a2),d6
|
|
rts
|
|
|
|
endc
|
|
|
|
allocmem2_ ;
|
|
;as below, but d2.l = extra mem at start to set aside
|
|
;
|
|
push
|
|
moveq #16,d3
|
|
add.l d2,d3
|
|
bra.s amem_
|
|
|
|
allocmem_ ;
|
|
;d0=size, d1=requirements, a0=text field
|
|
;
|
|
;set up node before allocmem for quick freemem:
|
|
;
|
|
;00.l : next
|
|
;04.l : real size
|
|
;08.l : offset to user mem (normally 16, but CM fucks things up)
|
|
;12.l : pointer to text field for debugging
|
|
;
|
|
push
|
|
moveq #16,d3 ;offset
|
|
;
|
|
amem_ move.l a0,d4
|
|
add.l d3,d0
|
|
;
|
|
move.l d0,d2 ;len
|
|
move.l a0,d4 ;text
|
|
move.l 4.w,a6
|
|
jsr -198(a6)
|
|
tst.l d0
|
|
bne.s .skip
|
|
;
|
|
warn #$f00
|
|
;
|
|
.skip move.l d0,a0
|
|
move.l memlist,(a0) ;next
|
|
move.l a0,memlist
|
|
movem.l d2-d4,4(a0)
|
|
add.l d3,a0
|
|
move.l a0,d0
|
|
;
|
|
pull
|
|
rts
|
|
|
|
freememlist push
|
|
;
|
|
.more move.l memlist,d0
|
|
beq.s .done
|
|
move.l d0,a2
|
|
;
|
|
ifne debugmem
|
|
move.l 12(a2),a0 ;text field
|
|
move.l a0,d2
|
|
moveq #-1,d3
|
|
.loop addq.l #1,d3
|
|
tst.b (a0)+
|
|
bne.s .loop
|
|
;
|
|
move.l outhand,d1
|
|
move.l dosbase,a6
|
|
jsr -48(a6)
|
|
endc
|
|
;
|
|
move.l a2,a1
|
|
;
|
|
move.l (a1),memlist
|
|
move.l 4(a1),d0
|
|
move.l 4.w,a6
|
|
jsr -210(a6)
|
|
bra.s .more
|
|
;
|
|
.done pull
|
|
rts
|
|
|
|
freemem_ ;
|
|
;a1=address to free!
|
|
;
|
|
push
|
|
;
|
|
ifne debugmem
|
|
move.l a0,-(a7) ;error mess
|
|
elseif
|
|
endc
|
|
;
|
|
move.l a1,a2 ;mem to find!
|
|
lea memlist(pc),a1
|
|
;
|
|
.more move.l a1,a0 ;prev
|
|
move.l (a1),d0
|
|
beq.s .err
|
|
move.l d0,a1
|
|
;
|
|
move.l a1,a3
|
|
add.l 8(a3),a3
|
|
cmp.l a3,a2
|
|
bne.s .more
|
|
;
|
|
move.l (a1),(a0)
|
|
move.l 4(a1),d0
|
|
move.l 4.w,a6
|
|
jsr -210(a6)
|
|
bra.s .done
|
|
;
|
|
.err warn #$ff0
|
|
ifne debugmem
|
|
move.l (a7),freememerr
|
|
endc
|
|
.done ;
|
|
ifne debugmem
|
|
addq #4,a7
|
|
endc
|
|
;
|
|
pull
|
|
rts
|
|
|
|
freememerr dc.l 0
|
|
|
|
initmap ;map address in map_map...
|
|
;load in textures, do colour mapping etc.
|
|
;
|
|
push
|
|
;
|
|
move.l map_map,a0
|
|
;
|
|
move.l a0,a1
|
|
add.l (a0),a1
|
|
move.l a1,map_grid
|
|
;
|
|
move.l a0,a1
|
|
add.l 4(a0),a1
|
|
move.l a1,map_poly
|
|
;
|
|
move.l a0,a1
|
|
add.l 8(a0),a1
|
|
move.l a1,map_ppnt
|
|
;
|
|
move.l a0,a1
|
|
add.l 12(a0),a1
|
|
move.l a1,map_anim
|
|
;
|
|
move.l a0,a1
|
|
add.l 16(a0),a1
|
|
move.l a1,map_txts
|
|
;
|
|
move.l (a0),d0
|
|
sub.l #25*4,d0
|
|
add.l a0,d0
|
|
move.l d0,map_events
|
|
;
|
|
move.l map_rgbsfrom,map_rgbsat
|
|
;
|
|
pull
|
|
rts
|
|
|
|
freetxts lea textscrns,a6
|
|
moveq #7,d7
|
|
.loop move.l (a6)+,d0
|
|
beq.s .skip
|
|
move.l d0,a1
|
|
freemem freetxts
|
|
clr.l -4(a6)
|
|
.skip dbf d7,.loop
|
|
rts
|
|
|
|
loadtxts push
|
|
;
|
|
lea textures,a4
|
|
move.l map_txts,a5 ;texture names
|
|
lea textscrns,a6
|
|
moveq #7,d7
|
|
;
|
|
.ltl lea .temp(pc),a0
|
|
;
|
|
.ltl2 move.b (a5)+,(a0)+
|
|
bne.s .ltl2
|
|
moveq #0,d0
|
|
cmp.l #.temp+1,a0
|
|
beq.s .notext
|
|
lea .temp2(pc),a0
|
|
moveq #1,d1
|
|
jsr loadfile
|
|
;
|
|
.notext move.l d0,(a6)+ ;texture!
|
|
beq.s .skip
|
|
;
|
|
;do colour mapping stuff!
|
|
;
|
|
move.l d0,-(a7)
|
|
;
|
|
move.l d0,a0
|
|
add.l (a0),a0
|
|
move.l a0,a2
|
|
bsr addpal
|
|
;
|
|
move.l (a7),a0
|
|
addq #4,a0
|
|
move.l a2,a1
|
|
bsr remap
|
|
;
|
|
move.l (a7)+,a0
|
|
addq #4,a0
|
|
moveq #19,d0
|
|
move.l #64*65,d1
|
|
;
|
|
.mtxt move.l a0,(a4)+
|
|
add.l d1,a0
|
|
dbf d0,.mtxt
|
|
.skip ;
|
|
dbf d7,.ltl
|
|
;
|
|
pull
|
|
rts
|
|
|
|
.temp2 dc.b 'txts/'
|
|
.temp ds.b 64
|
|
even
|
|
|
|
remapanim ;a0=anim to remap...
|
|
;
|
|
push
|
|
;
|
|
move.l a0,a6
|
|
movem (a6),d6-d7
|
|
lsl d6,d7 ;how many frames!
|
|
subq #1,d7
|
|
;
|
|
move.l a6,a0
|
|
add.l an_pal(a0),a0
|
|
bsr addpal
|
|
;
|
|
lea an_size(a6),a5
|
|
;
|
|
.loop move.l a6,a0
|
|
add.l (a5)+,a0 ;start of shape
|
|
addq #4,a0 ;skip handles
|
|
movem (a0)+,d0-d1 ;w/h
|
|
mulu d1,d0
|
|
lea 0(a0,d0.l),a1 ;end
|
|
bsr remap
|
|
;
|
|
dbf d7,.loop
|
|
;
|
|
pull
|
|
rts
|
|
|
|
remap ;a0=start of byte data, a1=end of byte data
|
|
;
|
|
push
|
|
;
|
|
moveq #0,d0
|
|
move.l maptable,a2
|
|
;
|
|
.loop cmp.l a1,a0
|
|
bcc.s .done
|
|
move.b (a0),d0
|
|
move.b 0(a2,d0),(a0)+
|
|
bra.s .loop
|
|
.done ;
|
|
pull
|
|
rts
|
|
|
|
addpal ;add palette in a0 to end of map_rgb
|
|
;
|
|
push
|
|
;
|
|
move (a0)+,d0
|
|
subq #1,d0
|
|
move.l map_rgbsat,a2 ;end of rgbs
|
|
move.l maptable,a3
|
|
;
|
|
clr.b (a3) ;0=0
|
|
move.b #255,255(a3) ;-1=-1
|
|
move.b #254,254(a3) ;-1=-1
|
|
move.b #253,253(a3) ;-1=-1
|
|
move.b #252,252(a3) ;-1=-1
|
|
move.b #251,251(a3) ;-1=-1
|
|
move.b #250,250(a3) ;-1=-1
|
|
move.b #249,249(a3) ;-1=-1
|
|
;
|
|
moveq #1,d2 ;colour 1!
|
|
;
|
|
.loop move (a0)+,d1 ;colour...does it exist?
|
|
bmi.s .next ;not used!
|
|
move.l map_rgbs,a1
|
|
;
|
|
.loop2 cmp.l a2,a1
|
|
bcc.s .no
|
|
cmp (a1)+,d1
|
|
beq.s .yes
|
|
bra.s .loop2
|
|
;
|
|
.no ;colour doesn't exist!
|
|
;may have to do a 'near match' routine if we run out of colours
|
|
;
|
|
move d1,(a2)+
|
|
move.l a2,a1
|
|
;
|
|
.yes subq #2,a1
|
|
sub.l map_rgbs,a1
|
|
move.l a1,d1
|
|
lsr #1,d1 ;real colour
|
|
;
|
|
cmp #256,d1
|
|
bcs.s .ok
|
|
;
|
|
warn #$00f
|
|
;
|
|
.ok move.b d1,0(a3,d2)
|
|
;
|
|
.next addq #1,d2
|
|
dbf d0,.loop
|
|
;
|
|
move.l a2,map_rgbsat
|
|
;
|
|
pull
|
|
rts
|
|
|
|
;coll types...
|
|
;
|
|
;1...bullet from player 1
|
|
;2...bullet from player 2
|
|
;4...bullet from monster
|
|
;8...player 1
|
|
;16..player 2
|
|
;
|
|
|
|
dc.l 0,player,tokens
|
|
;
|
|
objlist ;list of objects to be freed...
|
|
;
|
|
dc.l marine,baldy,terra,ghoul,demon,phantom,0
|
|
|
|
player dc.l 0,0 ;main, chunks
|
|
dc.b 'objs/player',0,0
|
|
even
|
|
tokens dc.l 0,0
|
|
dc.b 'objs/tokens',0,0
|
|
even
|
|
marine dc.l 0,0
|
|
dc.b 'objs/marine',0,0
|
|
even
|
|
baldy dc.l 0,0
|
|
dc.b 'objs/baldy',0,0
|
|
even
|
|
terra dc.l 0,0
|
|
dc.b 'objs/terra',0,0
|
|
even
|
|
ghoul dc.l 0,0
|
|
dc.b 'objs/ghoul',0,0
|
|
even
|
|
demon dc.l 0,0
|
|
dc.b 'objs/demon',0,0
|
|
even
|
|
phantom dc.l 0,0
|
|
dc.b 'objs/phantom',0,0
|
|
even
|
|
|
|
objinfo
|
|
player1_ dc.l player1
|
|
.ob_rotspeed dc.l $40000
|
|
.ob_movspeed dc.l $d0000
|
|
_ob_shape dc.l player
|
|
.ob_logic dc.l playerlogic
|
|
.ob_render dc.l drawshape_8
|
|
.ob_hit dc.l playerhit
|
|
.ob_die dc.l playerdie
|
|
;
|
|
.ob_eyey dc -110 ;eye height
|
|
.ob_firey dc -60 ;where bullets come from
|
|
.ob_gutsy dc -64
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 8
|
|
p1_ob_collwith dc 6 ;6=combat, 4=game
|
|
p1_ob_cntrl dc 1 ;for player 0,1=joyport, 2=keys
|
|
.ob_damage dc 1
|
|
.ob_hitpoints dc 25
|
|
.ob_think dc 0
|
|
.ob_frame dc.l 0
|
|
.ob_framespeed dc.l $6000
|
|
.ob_base dc 1
|
|
.ob_range dc 1
|
|
.ob_weapon dc 0 ;weapon type...0...25
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 5
|
|
.ob_punchrate dc 0
|
|
.ob_bouncecnt dc 0 ;4!
|
|
.ob_something dc 0
|
|
.ob_scale dc $200
|
|
.ob_apad dc 0
|
|
.ob_blood dc $f00 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
objinfof
|
|
|
|
oilen equ objinfof-objinfo
|
|
|
|
player2_ dc.l player2
|
|
.ob_rotspeed dc.l $40000
|
|
.ob_movspeed dc.l $d0000
|
|
.ob_shape dc.l player
|
|
.ob_logic dc.l playerlogic
|
|
.ob_render dc.l drawshape_8
|
|
.ob_hit dc.l playerhit
|
|
.ob_die dc.l playerdie
|
|
.ob_eyey dc -110 ;eye height
|
|
.ob_firey dc -60 ;where bullets come from
|
|
.ob_gutsy dc -64
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 16
|
|
p2_ob_collwith dc 5 ;5=combat, 4=game
|
|
p2_ob_cntrl dc 0 ;for player 0,1=joyport, 2=keys, 3=null
|
|
.ob_damage dc 1
|
|
.ob_hitpoints dc 25
|
|
.ob_think dc 0
|
|
.ob_frame dc.l 0
|
|
.ob_framespeed dc.l $6000
|
|
.ob_base dc 1
|
|
.ob_range dc 1
|
|
.ob_weapon dc 0 ;weapon type...
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 5
|
|
.ob_punchrate dc 0
|
|
.ob_bouncecnt dc 0 ;4!
|
|
.ob_something dc 0
|
|
.ob_scale dc $200
|
|
.ob_apad dc 0
|
|
.ob_blood dc $f00 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
health_ dc.l dummy
|
|
.ob_rotspeed dc.l 0
|
|
.ob_movspeed dc.l 0
|
|
.ob_shape dc.l tokens
|
|
.ob_logic dc.l rts
|
|
.ob_render dc.l drawshape_1
|
|
.ob_hit dc.l healthgot
|
|
.ob_die dc.l healthgot
|
|
.ob_eyey dc 0 ;eye height
|
|
.ob_firey dc 0 ;where bullets come from
|
|
.ob_gutsy dc 0
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 24
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 0
|
|
.ob_hitpoints dc 0
|
|
.ob_think dc 0
|
|
.ob_frame dc.l $30000
|
|
.ob_framespeed dc.l 0
|
|
.ob_base dc 0
|
|
.ob_range dc 0
|
|
.ob_weapon dc 0
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 5
|
|
.ob_punchrate dc 0
|
|
.ob_bouncecnt dc 0
|
|
.ob_something dc 0
|
|
.ob_scale dc $200
|
|
.ob_apad dc 0
|
|
.ob_blood dc $f00 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
weapon_ dc.l dummy
|
|
.ob_rotspeed dc.l 0
|
|
.ob_movspeed dc.l 0
|
|
.ob_shape dc.l tokens
|
|
.ob_logic dc.l rts
|
|
.ob_render dc.l drawshape_1
|
|
.ob_hit dc.l weapongot
|
|
.ob_die dc.l weapongot
|
|
.ob_eyey dc 0 ;eye height
|
|
.ob_firey dc 0 ;where bullets come from
|
|
.ob_gutsy dc 0
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 24
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 0
|
|
.ob_hitpoints dc 0
|
|
.ob_think dc 0
|
|
.ob_frame dc.l $50000
|
|
.ob_framespeed dc.l 0
|
|
.ob_base dc 0
|
|
.ob_range dc 0
|
|
.ob_weapon dc 0
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 5
|
|
.ob_punchrate dc 0
|
|
.ob_bouncecnt dc 0
|
|
.ob_something dc 0
|
|
.ob_scale dc $200
|
|
.ob_apad dc 0
|
|
.ob_blood dc $f00 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
thermo_ dc.l dummy
|
|
.ob_rotspeed dc.l 0
|
|
.ob_movspeed dc.l 0
|
|
.ob_shape dc.l tokens
|
|
.ob_logic dc.l rts
|
|
.ob_render dc.l drawshape_1
|
|
.ob_hit dc.l thermogot
|
|
.ob_die dc.l thermogot
|
|
.ob_eyey dc 0 ;eye height
|
|
.ob_firey dc 0 ;where bullets come from
|
|
.ob_gutsy dc 0
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 24
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 0
|
|
.ob_hitpoints dc 0
|
|
.ob_think dc 0
|
|
.ob_frame dc.l $10000
|
|
.ob_framespeed dc.l 0
|
|
.ob_base dc 0
|
|
.ob_range dc 0
|
|
.ob_weapon dc 0
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 5
|
|
.ob_punchrate dc 0
|
|
.ob_bouncecnt dc 0
|
|
.ob_something dc 0
|
|
.ob_scale dc $200
|
|
.ob_apad dc 0
|
|
.ob_blood dc $f00 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
infra_ ds.b oilen
|
|
|
|
invisi_ dc.l dummy
|
|
.ob_rotspeed dc.l 0
|
|
.ob_movspeed dc.l 0
|
|
.ob_shape dc.l tokens
|
|
.ob_logic dc.l rts
|
|
.ob_render dc.l drawshape_1
|
|
.ob_hit dc.l invisigot
|
|
.ob_die dc.l invisigot
|
|
.ob_eyey dc 0 ;eye height
|
|
.ob_firey dc 0 ;where bullets come from
|
|
.ob_gutsy dc 0
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 24
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 0
|
|
.ob_hitpoints dc 0
|
|
.ob_think dc 0
|
|
.ob_frame dc.l $20000
|
|
.ob_framespeed dc.l 0
|
|
.ob_base dc 0
|
|
.ob_range dc 0
|
|
.ob_weapon dc 0
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 5
|
|
.ob_punchrate dc 0
|
|
.ob_bouncecnt dc 0
|
|
.ob_something dc 0
|
|
.ob_scale dc $200
|
|
.ob_apad dc 0
|
|
.ob_blood dc $f00 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
invinc_ ds.b oilen
|
|
|
|
blank1_ ds.b oilen
|
|
|
|
blank2_ ds.b oilen
|
|
|
|
marine_ dc.l dummy
|
|
.ob_rotspeed dc.l $30000
|
|
.ob_movspeed dc.l $60000
|
|
.ob_shape dc.l marine
|
|
.ob_logic dc.l monsterlogic
|
|
.ob_render dc.l drawshape_8
|
|
.ob_hit dc.l hurtngrunt
|
|
.ob_die dc.l blowobject
|
|
.ob_eyey dc -64 ;eye height
|
|
.ob_firey dc -60 ;where bullets come from
|
|
.ob_gutsy dc -64
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 3
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 1
|
|
.ob_hitpoints dc 5
|
|
.ob_think dc 0
|
|
.ob_frame dc.l 0
|
|
.ob_framespeed dc.l $6000
|
|
.ob_base dc 16
|
|
.ob_range dc 32
|
|
.ob_weapon dc 0 ;weapon type...
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 5
|
|
.ob_punchrate dc 0
|
|
.ob_bouncecnt dc 0
|
|
.ob_something dc 0
|
|
.ob_scale dc $200
|
|
.ob_apad dc 0
|
|
.ob_blood dc $f00 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
baldy_ dc.l dummy
|
|
.ob_rotspeed dc.l $30000
|
|
.ob_movspeed dc.l $40000
|
|
.ob_shape dc.l baldy
|
|
.ob_logic dc.l baldylogic
|
|
.ob_render dc.l drawshape_8
|
|
.ob_hit dc.l hurtngrunt
|
|
.ob_die dc.l blowobject
|
|
.ob_eyey dc -64 ;eye height
|
|
.ob_firey dc -60 ;where bullets come from
|
|
.ob_gutsy dc -64
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 24+3
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 2
|
|
.ob_hitpoints dc 10
|
|
.ob_think dc 0
|
|
.ob_frame dc.l 0
|
|
.ob_framespeed dc.l $4000
|
|
.ob_base dc 8
|
|
.ob_range dc 16
|
|
.ob_weapon dc 0 ;weapon type...
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 3
|
|
.ob_punchrate dc 4
|
|
.ob_bouncecnt dc 0
|
|
.ob_something dc 0
|
|
.ob_scale dc $220
|
|
.ob_apad dc 0
|
|
.ob_blood dc $f00 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
terra_ dc.l dummy
|
|
.ob_rotspeed dc.l $30000
|
|
.ob_movspeed dc.l $20000
|
|
.ob_shape dc.l terra
|
|
.ob_logic dc.l terralogic
|
|
.ob_render dc.l drawshape_8
|
|
.ob_hit dc.l hurtngrunt
|
|
.ob_die dc.l blowobject
|
|
.ob_eyey dc -64 ;eye height
|
|
.ob_firey dc -60 ;where bullets come from
|
|
.ob_gutsy dc -64
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 24+3
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 1
|
|
.ob_hitpoints dc 12
|
|
.ob_think dc 0
|
|
.ob_frame dc.l 0
|
|
.ob_framespeed dc.l $6000
|
|
.ob_base dc 32
|
|
.ob_range dc 48
|
|
.ob_weapon dc 0 ;weapon type...
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 0
|
|
.ob_firerate dc 12 ;how often terra fires
|
|
.ob_bouncecnt dc 0 ;how many times
|
|
.ob_firecnt dc 5
|
|
.ob_scale dc $280
|
|
.ob_apad dc 0
|
|
.ob_blood dc $fff ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
ghoul_ dc.l dummy
|
|
.ob_rotspeed dc.l $0
|
|
.ob_movspeed dc.l $a0000
|
|
.ob_shape dc.l ghoul
|
|
.ob_logic dc.l ghoullogic
|
|
.ob_render dc.l drawshape_8
|
|
.ob_hit dc.l hurtghoul
|
|
.ob_die dc.l blowobject
|
|
.ob_eyey dc -64 ;eye height
|
|
.ob_firey dc -64 ;where bullets come from
|
|
.ob_gutsy dc -64
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 24+3
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 0
|
|
.ob_hitpoints dc 10
|
|
.ob_think dc 0
|
|
.ob_frame dc.l 0
|
|
.ob_framespeed dc.l 0
|
|
.ob_base dc 32
|
|
.ob_range dc 48
|
|
.ob_weapon dc 0 ;weapon type...
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 5
|
|
.ob_firerate dc 12 ;how often terra fires
|
|
.ob_bouncecnt dc 0 ;how many times
|
|
.ob_firecnt dc 5
|
|
.ob_scale dc $200
|
|
.ob_apad dc 0
|
|
.ob_blood dc $0f0 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
phantom_ dc.l dummy
|
|
.ob_rotspeed dc.l $30000
|
|
.ob_movspeed dc.l $a0000
|
|
.ob_shape dc.l phantom
|
|
.ob_logic dc.l phantomlogic
|
|
.ob_render dc.l drawshape_8
|
|
.ob_hit dc.l hurtngrunt
|
|
.ob_die dc.l blowobject
|
|
.ob_eyey dc -64 ;eye height
|
|
.ob_firey dc -60 ;where bullets come from
|
|
.ob_gutsy dc -64
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 3
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 3
|
|
.ob_hitpoints dc 10
|
|
.ob_think dc 0
|
|
.ob_frame dc.l 0
|
|
.ob_framespeed dc.l $a000
|
|
.ob_base dc 8
|
|
.ob_range dc 16
|
|
.ob_weapon dc 0 ;weapon type...
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 7
|
|
.ob_punchrate dc 0
|
|
.ob_bouncecnt dc 0
|
|
.ob_something dc 0
|
|
.ob_scale dc $280
|
|
.ob_apad dc 0
|
|
.ob_blood dc $ff0 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
demon_ dc.l dummy
|
|
.ob_rotspeed dc.l $30000
|
|
.ob_movspeed dc.l $50000
|
|
.ob_shape dc.l demon
|
|
.ob_logic dc.l demonlogic
|
|
.ob_render dc.l drawshape_8
|
|
.ob_hit dc.l hurtngrunt
|
|
.ob_die dc.l blowobject
|
|
.ob_eyey dc -64 ;eye height
|
|
.ob_firey dc -90 ;where bullets come from
|
|
.ob_gutsy dc -72
|
|
.ob_othery dc 0
|
|
.ob_colltype dc 0
|
|
.ob_collwith dc 3
|
|
.ob_cntrl dc 0 ;for player 0,1=joyport
|
|
.ob_damage dc 5
|
|
.ob_hitpoints dc 15
|
|
.ob_think dc 0
|
|
.ob_frame dc.l 0
|
|
.ob_framespeed dc.l $5000
|
|
.ob_base dc 32
|
|
.ob_range dc 4
|
|
.ob_weapon dc 0 ;weapon type...
|
|
.ob_wlevel dc 0
|
|
.ob_hurtpause dc 5
|
|
.ob_punchrate dc 0
|
|
.ob_bouncecnt dc 0
|
|
.ob_something dc 0
|
|
.ob_scale dc $380
|
|
.ob_apad dc 0
|
|
.ob_blood dc $f00 ;color AND for blood
|
|
.ob_ypad dc 1
|
|
|
|
abouttext dc.b 14
|
|
dc.b 'GLOOM',0
|
|
dc.b 0
|
|
dc.b 'A BLACK MAGIC GAME',0
|
|
dc.b 0
|
|
dc.b 'PROGRAMMED BY MARK SIBLY',0
|
|
dc.b 'GRAPHICS BY THE BUTLER BROTHERS',0
|
|
dc.b 'MUSIC BY KEV STANNARD',0
|
|
dc.b 'AUDIO BY US',0
|
|
dc.b 'PRODUCED BY US',0
|
|
dc.b 'DESIGNED BY US',0
|
|
dc.b 'GAME CODED IN DEVPAC2',0
|
|
dc.b 'UTILITIES CODED IN BLITZ BASIC 2',0
|
|
dc.b 'RENDERED IN DPAINT3 AND DPAINT4',0
|
|
dc.b 'DECRUNCHING CODE BY THOMAS SCHWARZ',0
|
|
even
|
|
|
|
sqrinc incbin sqr.bin
|
|
|
|
groundtile incbin tile2.bin
|
|
ceilingtile incbin tile.bin
|
|
|
|
bullet1 incbin bullet1.bin
|
|
bullet2 incbin bullet2.bin
|
|
bullet3 incbin bullet3.bin
|
|
bullet4 incbin bullet4.bin
|
|
bullet5 incbin bullet5.bin
|
|
|
|
sparks1 incbin sparks1.bin
|
|
sparks2 incbin sparks2.bin
|
|
sparks3 incbin sparks3.bin
|
|
sparks4 incbin sparks4.bin
|
|
sparks5 incbin sparks5.bin
|
|
|
|
gloombrush incbin gloombrush
|
|
|
|
gloom incbin title
|
|
gloompal incbin title.pal
|
|
|
|
combat incbin combat
|
|
combatpal incbin combat.pal
|
|
|
|
medplayer incbin medplay
|
|
decrm incbin decrm
|
|
|
|
castrotsinc incbin castrots.bin
|
|
camrotsinc incbin camrots.bin ;256
|
|
camrots2inc incbin camrots2.bin ;1024
|
|
|
|
rgbs16 ds.l 16
|
|
map_rgbs_ ds.w 256*16
|