mirror of https://github.com/earok/GloomAmiga.git
1647 lines
22 KiB
ArmAsm
1647 lines
22 KiB
ArmAsm
|
|
||
|
focshft equ 6
|
||
|
grdshft equ 8
|
||
|
darkshft equ 7
|
||
|
maxz equ 16<<darkshft
|
||
|
|
||
|
rsreset
|
||
|
;
|
||
|
;vertical 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 ;pointer to data to draw
|
||
|
vd_ystep rs.l 1
|
||
|
;
|
||
|
vd_size rs.b 0
|
||
|
|
||
|
rsreset
|
||
|
;texture
|
||
|
;
|
||
|
te_wshift rs.w 1 ;width shift
|
||
|
te_hshift rs.w 1 ;height shift
|
||
|
te_wand rs.w 1
|
||
|
te_hand rs.w 1
|
||
|
;
|
||
|
te_size rs.b 0
|
||
|
|
||
|
rsreset
|
||
|
;
|
||
|
;vertical list...array really #:^)
|
||
|
;
|
||
|
va_lx rs.w 1
|
||
|
va_lz rs.w 1
|
||
|
va_rx rs.w 1
|
||
|
va_rz rs.w 1
|
||
|
va_y rs.w 1
|
||
|
va_h rs.w 1
|
||
|
va_scale rs.l 1
|
||
|
va_texture rs.l 1
|
||
|
;
|
||
|
va_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_joybase rs.l 1
|
||
|
;
|
||
|
wi_camx rs.w 1
|
||
|
wi_camz rs.w 1
|
||
|
wi_camy rs.w 1
|
||
|
wi_camr rs.w 1
|
||
|
;
|
||
|
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 1
|
||
|
;
|
||
|
wi_size rs.b 0
|
||
|
|
||
|
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
|
||
|
|
||
|
cli ;
|
||
|
move.l a0,a2
|
||
|
;
|
||
|
lea dosname,a1
|
||
|
move.l 4.w,a6
|
||
|
jsr -408(a6)
|
||
|
move.l d0,dosbase
|
||
|
;
|
||
|
cmp.b #'@',(a2)+
|
||
|
bne.s main
|
||
|
move.l a2,a0
|
||
|
moveq #1,d1
|
||
|
bsr loadfile
|
||
|
move.l d0,map_map
|
||
|
bne.s main
|
||
|
rts
|
||
|
main ;
|
||
|
lea palettes,a2
|
||
|
moveq #15,d2
|
||
|
.palloop move.l #512,d0
|
||
|
moveq #1,d1
|
||
|
jsr allocmem
|
||
|
move.l d0,(a2)+
|
||
|
dbf d2,.palloop
|
||
|
;
|
||
|
move.l #24*256,d0
|
||
|
moveq #1,d1
|
||
|
jsr allocmem
|
||
|
move.l d0,rgbs
|
||
|
;
|
||
|
jsr initmap
|
||
|
;
|
||
|
jsr initdisplay
|
||
|
jsr ownblitter
|
||
|
jsr initvbint
|
||
|
jsr forbid
|
||
|
;
|
||
|
move.l #1024,d0
|
||
|
moveq #1,d1
|
||
|
jsr allocmem
|
||
|
move.l d0,walls
|
||
|
;
|
||
|
move.l #320*vd_size,d0
|
||
|
moveq #1,d1
|
||
|
jsr allocmem
|
||
|
move.l d0,vertdraws
|
||
|
;
|
||
|
jsr dispoff
|
||
|
;
|
||
|
jsr makecoloffs
|
||
|
;
|
||
|
lea window1,a0
|
||
|
bsr makewindow
|
||
|
lea window2,a0
|
||
|
bsr makewindow
|
||
|
;
|
||
|
lea window1,a0
|
||
|
bsr showwindow
|
||
|
lea window2,a0
|
||
|
bsr showwindow
|
||
|
;
|
||
|
bsr dispon
|
||
|
;
|
||
|
.loop bsr vwait
|
||
|
lea window1,a0
|
||
|
bsr showwindowq
|
||
|
lea window2,a0
|
||
|
bsr showwindowq
|
||
|
bsr readjoys
|
||
|
;
|
||
|
lea window1,a0
|
||
|
bsr dbwindow
|
||
|
bsr clswindow
|
||
|
lea window1,a0
|
||
|
bsr moveplayer
|
||
|
bsr makewalls
|
||
|
bsr castwalls
|
||
|
bsr renderwindow
|
||
|
;
|
||
|
elseif
|
||
|
lea window2,a0
|
||
|
bsr dbwindow
|
||
|
bsr clswindow
|
||
|
lea window2,a0
|
||
|
bsr moveplayer
|
||
|
bsr makewalls
|
||
|
bsr castwalls
|
||
|
bsr renderwindow
|
||
|
elseif
|
||
|
;
|
||
|
btst #7,$bfe001
|
||
|
bne .loop
|
||
|
;
|
||
|
bsr permit
|
||
|
bsr finitvbint
|
||
|
bsr disownblitter
|
||
|
bsr finitdisplay
|
||
|
;
|
||
|
bsr freememlist
|
||
|
rts
|
||
|
|
||
|
; ************* FAST SUBS ********************
|
||
|
|
||
|
fastsubs
|
||
|
|
||
|
mover ;
|
||
|
;d3=speed scale
|
||
|
;d4=x vec (unit)
|
||
|
;d5=z vec (unit)
|
||
|
;d6=x
|
||
|
;d7=z
|
||
|
;
|
||
|
;return d0, ne if a wall was hit!
|
||
|
;
|
||
|
muls d3,d4 ;x vec
|
||
|
add.l d4,d4
|
||
|
swap d4
|
||
|
add d4,d6
|
||
|
add d4,d6
|
||
|
add d4,d6
|
||
|
bsr checknew
|
||
|
beq.s .xok
|
||
|
sub d4,d6
|
||
|
.xok sub d4,d6
|
||
|
sub d4,d6
|
||
|
;
|
||
|
muls d3,d5 ;z vec
|
||
|
add.l d5,d5
|
||
|
swap d5
|
||
|
add d5,d7
|
||
|
add d5,d7
|
||
|
add d5,d7
|
||
|
bsr checknew
|
||
|
beq.s .zok
|
||
|
sub d5,d7
|
||
|
.zok sub d5,d7
|
||
|
sub d5,d7
|
||
|
rts
|
||
|
|
||
|
checknew movem.l d3-d5,-(a7)
|
||
|
;
|
||
|
addq #1,frame
|
||
|
move frame(pc),d5
|
||
|
move d6,d0
|
||
|
move d7,d1
|
||
|
lsr #grdshft,d0 ;x count
|
||
|
lsr #grdshft,d1
|
||
|
lsl #5,d1
|
||
|
add d0,d1
|
||
|
move.l map_grid(pc),a0
|
||
|
lea 0(a0,d1*4),a0
|
||
|
moveq #1,d1
|
||
|
move.l map_ppnt(pc),a1
|
||
|
move.l map_poly(pc),a2
|
||
|
;
|
||
|
;d0=counter to left of map!
|
||
|
;d1=in/out counter
|
||
|
;
|
||
|
.loop move (a0)+,d2 ;how many in this grid!
|
||
|
bmi .next
|
||
|
;
|
||
|
move (a0),d3
|
||
|
lea 0(a1,d3*2),a3
|
||
|
;
|
||
|
.loop2 move (a3)+,d3
|
||
|
lsl #5,d3
|
||
|
lea 0(a2,d3),a4
|
||
|
;
|
||
|
cmp (a4),d5
|
||
|
beq .next2
|
||
|
move d5,(a4)
|
||
|
;
|
||
|
cmp 28(a4),d7
|
||
|
blt .next2
|
||
|
cmp 30(a4),d7
|
||
|
bge .next2
|
||
|
;
|
||
|
;OK, we are in the z area!
|
||
|
;
|
||
|
cmp 24(a4),d6
|
||
|
blt .next2 ;too far left!
|
||
|
cmp 26(a4),d6
|
||
|
bgt .inc
|
||
|
;
|
||
|
;have to do test!
|
||
|
;
|
||
|
movem 2(a4),d3-d4 ;x1,z1
|
||
|
sub d6,d3
|
||
|
muls 20(a4),d3
|
||
|
sub d7,d4
|
||
|
muls 22(a4),d4
|
||
|
add.l d4,d3
|
||
|
bpl.s .next2
|
||
|
;
|
||
|
.inc addq #1,d1
|
||
|
;
|
||
|
.next2 dbf d2,.loop2
|
||
|
;
|
||
|
.next subq #6,a0
|
||
|
dbf d0,.loop
|
||
|
;
|
||
|
and #1,d1
|
||
|
;
|
||
|
movem.l (a7)+,d3-d5
|
||
|
rts
|
||
|
|
||
|
moveplayer ;a0=window
|
||
|
;
|
||
|
;
|
||
|
;rotate...
|
||
|
;
|
||
|
move.l wi_joybase(a0),a1
|
||
|
move (a1),d0 ;joyx
|
||
|
add d0,d0
|
||
|
add d0,wi_camr(a0)
|
||
|
move wi_camr(a0),d0
|
||
|
and #255,d0
|
||
|
move.l camrots(pc),a2
|
||
|
lea 0(a2,d0*8),a2
|
||
|
move.l (a2)+,cm1
|
||
|
move.l (a2),cm3
|
||
|
;
|
||
|
;move...
|
||
|
;
|
||
|
move 2(a1),d3
|
||
|
lsl #4,d3 ;speed
|
||
|
movem.l cm1(pc),d4-d5
|
||
|
neg d5 ;!sub!
|
||
|
movem wi_camx(a0),d6-d7
|
||
|
move.l a0,-(a7)
|
||
|
bsr mover
|
||
|
move.l (a7)+,a0
|
||
|
movem d6-d7,wi_camx(a0)
|
||
|
movem d6-d7,camx
|
||
|
move.l wi_camy(a0),camy
|
||
|
;
|
||
|
rts
|
||
|
|
||
|
readjoys ;set up joyx0,joyy0,joyx1,joyy1
|
||
|
;
|
||
|
move $dff00a,d2 ;joy0
|
||
|
bsr readjoy
|
||
|
move d0,joyx0
|
||
|
move d1,joyy0
|
||
|
bsr makerot
|
||
|
move d0,joyr0
|
||
|
btst #6,$bfe001
|
||
|
sne d0
|
||
|
ext d0
|
||
|
move d0,joyb0
|
||
|
;
|
||
|
move $dff00c,d2
|
||
|
bsr readjoy
|
||
|
move d0,joyx1
|
||
|
move d1,joyy1
|
||
|
bsr makerot
|
||
|
move d0,joyr1
|
||
|
btst #7,$bfe001
|
||
|
sne d0
|
||
|
ext d0
|
||
|
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 dc 0,0
|
||
|
;
|
||
|
dc -1,-1,0,-1,1,-1
|
||
|
dc -1,0,1,0
|
||
|
dc -1,1,0,1,1,1
|
||
|
;
|
||
|
dc -2,-2,-1,-2,0,-2,1,-2,2,-2
|
||
|
dc -2,-1,2,-1
|
||
|
dc -2,0,2,0
|
||
|
dc -2,1,2,1
|
||
|
dc -2,2,-1,2,0,2,1,2,2,2
|
||
|
;
|
||
|
dc -3,-3,-2,-3,-1,-3,0,-3,1,-3,2,-3,3,-3
|
||
|
dc -3,-2,3,-2
|
||
|
dc -3,-1,3,-1
|
||
|
dc -3,0,3,0
|
||
|
dc -3,1,3,1
|
||
|
dc -3,2,3,2
|
||
|
dc -3,3,-2,3,-1,3,0,3,1,3,2,3,3,3
|
||
|
;
|
||
|
dc -4,-4,-3,-4,-2,-4,-1,-4,0,-4,1,-4,2,-4,3,-4,4,-4
|
||
|
dc -4,-3,4,-3
|
||
|
dc -4,-2,4,-2
|
||
|
dc -4,-1,4,-1
|
||
|
dc -4,0,4,0
|
||
|
dc -4,1,4,1
|
||
|
dc -4,2,4,2
|
||
|
dc -4,3,4,3
|
||
|
dc -4,4,-3,4,-2,4,-1,4,0,4,1,4,2,4,3,4,4,4
|
||
|
|
||
|
gridoffsf
|
||
|
|
||
|
makewalls ;check surround blocks for polygons and build into 'walls array'
|
||
|
;
|
||
|
;this only called once/refresh...but it's output is
|
||
|
;processed every screen column...so minimize output as much
|
||
|
;as poss!
|
||
|
;
|
||
|
;optimization...check if both z's are negative after rotation!
|
||
|
;
|
||
|
addq #1,frame
|
||
|
move #-1,wallcnt
|
||
|
move.l walls(pc),a5
|
||
|
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)+,d2-d3
|
||
|
;
|
||
|
move d6,d0
|
||
|
add d2,d0
|
||
|
cmp #32,d0
|
||
|
bcc .skip
|
||
|
;
|
||
|
move d7,d1
|
||
|
add d3,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*4),a0 ;mapgrid
|
||
|
move (a0)+,d4 ;how many polys here
|
||
|
bmi .skip
|
||
|
move (a0),d0 ;poly data offset
|
||
|
lea 0(a3,d0*2),a0
|
||
|
;
|
||
|
.loop2 move (a0)+,d0 ;poly#
|
||
|
lsl #5,d0
|
||
|
lea 0(a4,d0),a1 ;actual poly
|
||
|
move frame(pc),d0
|
||
|
cmp (a1),d0
|
||
|
beq .skip2
|
||
|
move d0,(a1)+
|
||
|
addq #1,wallcnt
|
||
|
;
|
||
|
bsr rotandadd ;x1,z1
|
||
|
bsr rotandadd ;x2,z2
|
||
|
;
|
||
|
move.l (a1)+,(a5)+ ;y,h
|
||
|
move.l (a1)+,(a5)+ ;scale
|
||
|
move.l (a1)+,(a5)+ ;texture
|
||
|
;
|
||
|
.skip2 dbf d4,.loop2
|
||
|
;
|
||
|
.skip dbf d5,.loop
|
||
|
;
|
||
|
rts
|
||
|
|
||
|
rotandadd movem (a1)+,d0-d1 ;X,Z
|
||
|
sub camx(pc),d0
|
||
|
sub camz(pc),d1
|
||
|
move d0,d2
|
||
|
move d1,d3
|
||
|
;
|
||
|
muls cm1(pc),d0
|
||
|
muls cm2(pc),d1
|
||
|
add.l d1,d0
|
||
|
add.l d0,d0
|
||
|
swap d0
|
||
|
move d0,(a5)+ ;X
|
||
|
;
|
||
|
muls cm3(pc),d2
|
||
|
muls cm4(pc),d3
|
||
|
add.l d3,d2
|
||
|
add.l d2,d2
|
||
|
swap d2
|
||
|
move d2,(a5)+ ;Z
|
||
|
;
|
||
|
rts
|
||
|
|
||
|
castwalls ;process 'walls' list
|
||
|
;
|
||
|
move.l castrots(pc),a6
|
||
|
move.l vertdraws(pc),a4
|
||
|
move minx(pc),d0
|
||
|
lsl #3,d0
|
||
|
add d0,a6
|
||
|
move width(pc),d7
|
||
|
subq #1,d7
|
||
|
;
|
||
|
.columnloop ;do this vert line!
|
||
|
;
|
||
|
clr.l vd_data(a4)
|
||
|
move.l walls(pc),a5
|
||
|
move wallcnt(pc),d6
|
||
|
bmi .nextcolumn
|
||
|
;
|
||
|
;OK, here we use Z buffer to find nearest Z!
|
||
|
;
|
||
|
move #32767,vd_z(a4)
|
||
|
.vertloop ;
|
||
|
move va_lx(a5),d0
|
||
|
move va_lz(a5),d1
|
||
|
muls (a6),d0
|
||
|
muls 2(a6),d1
|
||
|
add.l d1,d0 ;LX!
|
||
|
bgt .nextvert
|
||
|
;
|
||
|
move va_rx(a5),d1
|
||
|
move va_rz(a5),d2
|
||
|
muls (a6),d1
|
||
|
muls 2(a6),d2
|
||
|
add.l d2,d1 ;RX!
|
||
|
lsl.l #4,d1
|
||
|
swap d1
|
||
|
tst d1
|
||
|
ble .nextvert
|
||
|
;
|
||
|
;OK, this vertical section is in line with RAY!
|
||
|
;gotta find middle Z!
|
||
|
;
|
||
|
;LX<0<RX
|
||
|
;calc fraction...how far from LX 0 is! -> (-lx)/(rx-lx)
|
||
|
;
|
||
|
lsl.l #4,d0
|
||
|
swap d0
|
||
|
sub d0,d1
|
||
|
ble .nextvert
|
||
|
swap d0
|
||
|
neg.l d0
|
||
|
divu d1,d0 ;fraction!
|
||
|
;
|
||
|
move va_lx(a5),d1
|
||
|
move va_lz(a5),d2
|
||
|
muls 4(a6),d1
|
||
|
muls 6(a6),d2
|
||
|
add.l d2,d1 ;LZ
|
||
|
add.l d1,d1
|
||
|
swap d1
|
||
|
;
|
||
|
move va_rx(a5),d2
|
||
|
move va_rz(a5),d3
|
||
|
muls 4(a6),d2
|
||
|
muls 6(a6),d3
|
||
|
add.l d3,d2 ;RZ
|
||
|
add.l d2,d2
|
||
|
swap d2
|
||
|
;
|
||
|
move d0,d3
|
||
|
lsr #1,d3
|
||
|
sub d1,d2
|
||
|
muls d3,d2
|
||
|
add.l d2,d2
|
||
|
swap d2
|
||
|
add d1,d2 ;middle Z!
|
||
|
ble .nextvert
|
||
|
cmp #maxz,d2
|
||
|
bcc .nextvert
|
||
|
;
|
||
|
;OK, d0.r=fraction, d2.w=middle Z!...calc real height!
|
||
|
;
|
||
|
move d2,d3
|
||
|
lsr #darkshft,d3
|
||
|
movem d2-d3,vd_z(a4)
|
||
|
;
|
||
|
move va_h(a5),d1
|
||
|
ext.l d1
|
||
|
lsl.l #focshft,d1
|
||
|
divs d2,d1 ;real h
|
||
|
ble .nextvert
|
||
|
move d1,vd_h(a4)
|
||
|
;
|
||
|
lea textures(pc),a3
|
||
|
move va_texture(a5),d3
|
||
|
move.l -4(a3,d3*4),a3
|
||
|
;
|
||
|
;have to divide h into real height of texture!
|
||
|
;
|
||
|
move te_hand(a3),d3
|
||
|
addq #1,d3
|
||
|
swap d3
|
||
|
clr d3
|
||
|
ext.l d1
|
||
|
lsl.l #5,d1
|
||
|
lsl.l #5,d3
|
||
|
divu.l d1,d3
|
||
|
move.l d3,vd_ystep(a4)
|
||
|
;
|
||
|
move va_y(a5),d1
|
||
|
ext.l d1
|
||
|
lsl.l #focshft,d1
|
||
|
divs d2,d1 ;real Y
|
||
|
move d1,vd_y(a4)
|
||
|
;
|
||
|
;find which column....0 -> w-1
|
||
|
;
|
||
|
;scale up fraction to find texture column!
|
||
|
;
|
||
|
and.l #$ffff,d0
|
||
|
move.l va_scale(a5),d1
|
||
|
mulu.l d1,d1:d0
|
||
|
move d1,d0
|
||
|
swap d0
|
||
|
;
|
||
|
move te_wshift(a3),d1
|
||
|
lsl.l d1,d0
|
||
|
swap d0 ;which column!
|
||
|
move te_wand(a3),d1
|
||
|
and d1,d0
|
||
|
;
|
||
|
move te_hshift(a3),d1
|
||
|
lsl d1,d0
|
||
|
;
|
||
|
lea te_size(a3,d0),a3
|
||
|
move.l a3,vd_data(a4)
|
||
|
bra.s .nextcolumn
|
||
|
;
|
||
|
.nextvert lea va_size(a5),a5
|
||
|
dbf d6,.vertloop
|
||
|
;
|
||
|
.nextcolumn lea vd_size(a4),a4
|
||
|
addq #8,a6
|
||
|
dbf d7,.columnloop
|
||
|
;
|
||
|
check .columnloop
|
||
|
;
|
||
|
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 wi_cop(a0),cop
|
||
|
move wi_copmod(a0),copmod
|
||
|
move wi_w(a0),d0
|
||
|
move d0,width
|
||
|
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
|
||
|
|
||
|
clswindow ;clear window contents/arrays etc.
|
||
|
;
|
||
|
blitcls ;use blitter to cls cop
|
||
|
;
|
||
|
move width(pc),d0
|
||
|
subq #1,d0
|
||
|
;
|
||
|
move hite(pc),d1
|
||
|
lsl #6,d1
|
||
|
or #1,d1
|
||
|
;
|
||
|
move copmod(pc),d2
|
||
|
subq #2,d2
|
||
|
;
|
||
|
lea coloffs(pc),a0
|
||
|
lea $dff000,a1
|
||
|
;
|
||
|
btst #6,2(a1)
|
||
|
.bwait btst #6,2(a1)
|
||
|
bne.s .bwait
|
||
|
;
|
||
|
move.l #$1000000,$040(a1)
|
||
|
move d2,$066(a1) ;Dmod
|
||
|
;
|
||
|
.loop move.l cop(pc),d2
|
||
|
add.l (a0)+,d2
|
||
|
;
|
||
|
move.l d2,$054(a1) ;Dpth
|
||
|
move d1,$058(a1) ;size...
|
||
|
;
|
||
|
btst #6,2(a1)
|
||
|
.bwait2 btst #6,2(a1)
|
||
|
bne.s .bwait2
|
||
|
;
|
||
|
dbf d0,.loop
|
||
|
rts
|
||
|
|
||
|
blitcls2 ;use blitter to cls cop
|
||
|
;
|
||
|
move width(pc),d0
|
||
|
subq #1,d0
|
||
|
;
|
||
|
move hite(pc),d1
|
||
|
lsr #1,d1
|
||
|
lsl #6,d1
|
||
|
or #1,d1
|
||
|
;
|
||
|
move copmod(pc),d2
|
||
|
add d2,d2
|
||
|
subq #2,d2
|
||
|
;
|
||
|
lea coloffs(pc),a0
|
||
|
lea $dff000,a1
|
||
|
move #$f00,d7
|
||
|
move #0,d6
|
||
|
;
|
||
|
btst #6,6(a1)
|
||
|
.bwait btst #6,6(a1)
|
||
|
bne.s .bwait
|
||
|
;
|
||
|
move.l #$1f00000,$040(a1)
|
||
|
move d2,$066(a1) ;Dmod
|
||
|
move.l #-1,$044(a1)
|
||
|
;
|
||
|
.loop move.l cop(pc),d2
|
||
|
add.l (a0)+,d2
|
||
|
;
|
||
|
move.l d2,$054(a1) ;Dpth
|
||
|
move d1,$058(a1) ;size...
|
||
|
move d7,$074(a1)
|
||
|
addq #1,d7
|
||
|
and #$f0f,d7
|
||
|
;
|
||
|
btst #6,2(a1)
|
||
|
.bwait2 btst #6,2(a1)
|
||
|
bne.s .bwait2
|
||
|
;
|
||
|
move copmod(pc),d5
|
||
|
ext.l d5
|
||
|
add.l d5,d2
|
||
|
move.l d2,$054(a1) ;Dpth
|
||
|
move d1,$058(a1) ;size...
|
||
|
move d6,$074(a1)
|
||
|
addq #1,d6
|
||
|
and #$f0f,d6
|
||
|
;
|
||
|
btst #6,2(a1)
|
||
|
.bwait3 btst #6,2(a1)
|
||
|
bne.s .bwait3
|
||
|
;
|
||
|
dbf d0,.loop
|
||
|
rts
|
||
|
|
||
|
renderwindow ;
|
||
|
;
|
||
|
renderwalls move.l vertdraws(pc),a6
|
||
|
lea coloffs(pc),a5
|
||
|
move width(pc),d7
|
||
|
subq #1,d7
|
||
|
lea palettes,a2
|
||
|
;
|
||
|
.loop move.l vd_data(a6),d0
|
||
|
beq .vertskip
|
||
|
move.l d0,a0
|
||
|
;
|
||
|
move.l cop(pc),a1
|
||
|
add.l (a5),a1
|
||
|
;
|
||
|
move vd_h(a6),d5
|
||
|
move.l vd_ystep(a6),d1
|
||
|
;
|
||
|
move vd_y(a6),d0
|
||
|
add midy(pc),d0
|
||
|
bpl.s .noclip
|
||
|
;
|
||
|
;gotta clip Y
|
||
|
add d0,d5 ;reduce hite
|
||
|
ble .vertskip
|
||
|
neg d0
|
||
|
ext.l d0
|
||
|
mulu.l d1,d0 ;y step* y
|
||
|
bra.s .skipclip
|
||
|
;
|
||
|
.noclip mulu copmod(pc),d0
|
||
|
add.l d0,a1
|
||
|
moveq #0,d0
|
||
|
.skipclip ;
|
||
|
swap d0
|
||
|
swap d1
|
||
|
move vd_pal(a6),d2
|
||
|
move.l 0(a2,d2*4),a3
|
||
|
moveq #0,d2
|
||
|
moveq #0,d3
|
||
|
move copmod(pc),d4
|
||
|
ext.l d4
|
||
|
cmp hite(pc),d5
|
||
|
ble.s .hok
|
||
|
move hite(pc),d5
|
||
|
.hok subq #1,d5
|
||
|
;
|
||
|
.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
|
||
|
move 0(a3,d3*2),(a1) ;colour!
|
||
|
add.l d1,d0
|
||
|
addx.l d2,d0
|
||
|
add.l d4,a1
|
||
|
dbf d5,.vertloop
|
||
|
;
|
||
|
.vertskip addq #4,a5
|
||
|
lea vd_size(a6),a6
|
||
|
dbf d7,.loop
|
||
|
;
|
||
|
check .loop
|
||
|
;
|
||
|
rts
|
||
|
|
||
|
vbhandler subq #1,(a1)
|
||
|
moveq #0,d0
|
||
|
rts
|
||
|
|
||
|
vwait move #1,vbcounter
|
||
|
.loop tst vbcounter
|
||
|
bgt.s .loop
|
||
|
rts
|
||
|
|
||
|
;************** DATA ***************************
|
||
|
|
||
|
data
|
||
|
|
||
|
palettes ds.l 16 ;16 palettes for 16 brightnesses
|
||
|
rgbs ds.l 1 ;table for calculating palettes
|
||
|
|
||
|
joyx0 dc 0
|
||
|
joyy0 dc 0
|
||
|
joyr0 dc 0
|
||
|
joyb0 dc 0
|
||
|
;
|
||
|
joyx1 dc 0
|
||
|
joyy1 dc 0
|
||
|
joyr1 dc 0
|
||
|
joyb1 dc 0
|
||
|
|
||
|
map_map dc.l mapinc
|
||
|
map_grid dc.l 0
|
||
|
map_poly dc.l 0
|
||
|
map_ppnt dc.l 0
|
||
|
map_rgbs dc.l 0
|
||
|
map_txts 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
|
||
|
|
||
|
castrots dc.l castrotsinc+8*160 ;middle of table
|
||
|
camrots dc.l camrotsinc
|
||
|
vertdraws dc.l 0 ;vertical strips to draw
|
||
|
|
||
|
walls dc.l 0 ;linked list of walls to display
|
||
|
wallcnt dc.l 0
|
||
|
;already rotated around camera!
|
||
|
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
|
||
|
|
||
|
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
|
||
|
|
||
|
window1 ;
|
||
|
slice dc.l slice1
|
||
|
nslice dc.l copstop ;slice2 ;copstop here for 1 window
|
||
|
;
|
||
|
dc 160-52*3
|
||
|
dc 44
|
||
|
dc 104 ;max width for 2 high = 90!
|
||
|
dc 80
|
||
|
dc 3
|
||
|
dc 3
|
||
|
dc.l joyx1
|
||
|
dc 0,0,0,0 ;camx,z,y,r
|
||
|
;
|
||
|
dc 0
|
||
|
dc.l 0
|
||
|
dc.l 0
|
||
|
;
|
||
|
dc.l 0
|
||
|
dc.l 0
|
||
|
dc.l 0
|
||
|
dc.l 0
|
||
|
dc 0
|
||
|
|
||
|
window2 ;
|
||
|
dc.l slice2
|
||
|
dc.l copstop
|
||
|
;
|
||
|
dc 160-32*3
|
||
|
dc 44+120
|
||
|
dc 64
|
||
|
dc 59
|
||
|
dc 3
|
||
|
dc 2
|
||
|
dc.l joyx0
|
||
|
dc 0,0,0,0 ;camx,z,y,r
|
||
|
;
|
||
|
dc 0
|
||
|
dc.l 0
|
||
|
dc.l 0
|
||
|
;
|
||
|
dc.l 0
|
||
|
dc.l 0
|
||
|
dc.l 0
|
||
|
dc.l 0
|
||
|
dc 0
|
||
|
|
||
|
col0 equ $123
|
||
|
|
||
|
copinit ;initialization for display
|
||
|
;
|
||
|
dc $1fc,15
|
||
|
dc $096,$0120 ;cop/bit/spr DMA off
|
||
|
;dc $08e,$2c81,$090,$f4c1
|
||
|
dc $092,$38,$094,$a0
|
||
|
dc $108,6*40,$10a,6*40
|
||
|
dc $100,$7200 ;lores, 7 bitplanes
|
||
|
dc $102,0
|
||
|
;
|
||
|
dc 26<<8+1,$fffe
|
||
|
;
|
||
|
;lo colour nybs - lo bank
|
||
|
dc $106,$0200
|
||
|
dc $180,col0
|
||
|
;
|
||
|
;lo nybs - hi bank
|
||
|
dc $106,$8200
|
||
|
dc $180,col0
|
||
|
;
|
||
|
;hi colour nybs - lo bank
|
||
|
dc $106,0
|
||
|
dc $180,col0
|
||
|
;
|
||
|
;hi colour nybs - hi bank
|
||
|
dc $106,$8000
|
||
|
dc $180,col0
|
||
|
;
|
||
|
;slice...
|
||
|
;
|
||
|
sl1 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 $096,$8100
|
||
|
dc $084,0,$086,0,$08a,0
|
||
|
;
|
||
|
sl2 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 $096,$8100
|
||
|
;68
|
||
|
dc $084,0,$086,0,$08a,0
|
||
|
;
|
||
|
cstop dc $096,$0100
|
||
|
dc $ffff,$fffe
|
||
|
copinitf ;
|
||
|
|
||
|
bigdata
|
||
|
|
||
|
textures ds.l 48
|
||
|
|
||
|
mapinc incbin maps/test
|
||
|
castrotsinc incbin castrots.bin
|
||
|
camrotsinc incbin camrots.bin
|
||
|
palette incbin texture.pal
|
||
|
|
||
|
testwall dc -256,1024,256,1024
|
||
|
dc -64,128
|
||
|
dc.l $40000
|
||
|
dc.l 0
|
||
|
|
||
|
;************** SLOW SUBS **********************
|
||
|
|
||
|
slowsubs
|
||
|
|
||
|
loadfile ;a0=name, d1=memtype
|
||
|
;
|
||
|
;return d0=pointer
|
||
|
;
|
||
|
push
|
||
|
;
|
||
|
move.l d1,-(a7)
|
||
|
;
|
||
|
move.l a0,d1
|
||
|
move.l #1005,d2
|
||
|
move.l dosbase,a6
|
||
|
jsr -30(a6) ;open it!
|
||
|
move.l d0,d7 ;handle
|
||
|
beq .done
|
||
|
;
|
||
|
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)
|
||
|
;
|
||
|
;d0=length of file ?
|
||
|
;
|
||
|
move.l d0,d3
|
||
|
move.l (a7),d1
|
||
|
jsr allocmem
|
||
|
;
|
||
|
move.l d0,d2
|
||
|
move.l d7,d1
|
||
|
jsr -42(a6)
|
||
|
move.l d7,d1
|
||
|
jsr -36(a6)
|
||
|
move.l d2,d0
|
||
|
;
|
||
|
.done addq #4,a7
|
||
|
pull
|
||
|
;
|
||
|
rts
|
||
|
|
||
|
calcpalettes ;a0=palette!
|
||
|
;
|
||
|
move.l map_rgbs(pc),a0
|
||
|
;
|
||
|
move.l rgbs(pc),a1
|
||
|
move #255,d0
|
||
|
move.l #$f0000,d1
|
||
|
;
|
||
|
.loop move (a0)+,d2
|
||
|
;
|
||
|
move d2,d3
|
||
|
lsl.l #8,d2
|
||
|
and.l d1,d2
|
||
|
move.l d2,(a1)+ ;R
|
||
|
;
|
||
|
move d3,d2
|
||
|
lsl.l #8,d2
|
||
|
lsl.l #4,d2
|
||
|
and.l d1,d2
|
||
|
move.l d2,(a1)+ ;G
|
||
|
;
|
||
|
swap d3
|
||
|
and.l d1,d3
|
||
|
move.l d3,(a1)+ ;B
|
||
|
;
|
||
|
dbf d0,.loop
|
||
|
;
|
||
|
lea palettes(pc),a0
|
||
|
moveq #15,d0
|
||
|
;
|
||
|
.loop2 move.l rgbs(pc),a1
|
||
|
move.l (a0)+,a2
|
||
|
move #255,d1
|
||
|
;
|
||
|
.loop3 movem.l (a1),d2-d4
|
||
|
lsr.l #8,d2
|
||
|
and #$f00,d2
|
||
|
lsr.l #8,d3
|
||
|
lsr.l #4,d3
|
||
|
and #$f0,d3
|
||
|
swap d4
|
||
|
and #$f,d4
|
||
|
or d4,d3
|
||
|
or d3,d2
|
||
|
move d2,(a2)+
|
||
|
;
|
||
|
move.l (a1),d2
|
||
|
sub.l #$10000,d2
|
||
|
bpl.s .rok
|
||
|
moveq #0,d2
|
||
|
.rok move.l d2,(a1)+
|
||
|
;
|
||
|
move.l (a1),d3
|
||
|
sub.l #$10000,d3
|
||
|
bpl.s .gok
|
||
|
moveq #0,d3
|
||
|
.gok move.l d3,(a1)+
|
||
|
;
|
||
|
move.l (a1),d4
|
||
|
sub.l #$10000,d4
|
||
|
bpl.s .bok
|
||
|
moveq #0,d4
|
||
|
.bok move.l d4,(a1)+
|
||
|
;
|
||
|
dbf d1,.loop3
|
||
|
dbf d0,.loop2
|
||
|
rts
|
||
|
|
||
|
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 #$8180,$dff096
|
||
|
.skip rts
|
||
|
|
||
|
forbid push
|
||
|
move.l 4.w,a6
|
||
|
jsr -132(a6)
|
||
|
pull
|
||
|
rts
|
||
|
|
||
|
permit push
|
||
|
move.l 4.w,a6
|
||
|
jsr -138(a6)
|
||
|
pull
|
||
|
rts
|
||
|
|
||
|
initvbint push
|
||
|
move.l 4.w,a6
|
||
|
moveq #5,d0
|
||
|
lea vbintserver,a1
|
||
|
jsr -168(a6) ;addintserver
|
||
|
pull
|
||
|
rts
|
||
|
|
||
|
vbcounter dc 0
|
||
|
frame dc 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
|
||
|
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
|
||
|
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
|
||
|
|
||
|
showwindow ;a0=window
|
||
|
;
|
||
|
push
|
||
|
;
|
||
|
;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)
|
||
|
;
|
||
|
;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_slice(a0),a1
|
||
|
move.l (a1),a1
|
||
|
move.l wi_cop(a0),d0
|
||
|
move d0,68+6(a1)
|
||
|
swap d0
|
||
|
move d0,68+2(a1)
|
||
|
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 #0,$dff088
|
||
|
move #$81a0,$dff096
|
||
|
;
|
||
|
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
|
||
|
bsr allocmem
|
||
|
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
|
||
|
move d0,68+6(a0)
|
||
|
move d0,68+6(a1)
|
||
|
swap d0
|
||
|
move d0,68+2(a0)
|
||
|
move d0,68+2(a1)
|
||
|
;
|
||
|
jsr -270(a6)
|
||
|
jsr -270(a6)
|
||
|
move.l coplist,$dff080
|
||
|
move #0,$dff088
|
||
|
;
|
||
|
pull
|
||
|
rts
|
||
|
|
||
|
makewindow ;
|
||
|
;a0=window struct!
|
||
|
;
|
||
|
push
|
||
|
;
|
||
|
move.l a0,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)
|
||
|
bsr allocmem
|
||
|
move.l d0,wi_bmap(a2)
|
||
|
;
|
||
|
;OK, plot colours on bitmap!
|
||
|
move.l d0,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.l wi_bmapmem(a2),d0
|
||
|
sub.l #40*7,d0
|
||
|
lsr.l #2,d0
|
||
|
subq #1,d0
|
||
|
lea 40*7(a0),a1
|
||
|
.cbloop move.l (a0)+,(a1)+
|
||
|
dbf d0,.cbloop
|
||
|
;
|
||
|
;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 #4,d0 ;2 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 #5,d0 ;2 waits 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!
|
||
|
bsr allocmem
|
||
|
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 #0,d4
|
||
|
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.
|
||
|
move.l #$01fe0000,(a0)+ ;no wait - nop
|
||
|
cmp #256,d6
|
||
|
blt.s .not256
|
||
|
move.l #$00e1fffe,-4(a0)
|
||
|
sub #256,d6
|
||
|
.not256 move.b d6,(a0)+
|
||
|
move.b #1,(a0)+
|
||
|
move #$fffe,(a0)+ ;wait!
|
||
|
add wi_ph(a2),d6
|
||
|
rts
|
||
|
|
||
|
allocmem ;
|
||
|
;d0=size, d1=requirements
|
||
|
;
|
||
|
push
|
||
|
move.l 4.w,a6
|
||
|
;
|
||
|
addq.l #8,d0
|
||
|
move.l d0,-(a7)
|
||
|
jsr -198(a6)
|
||
|
move.l d0,a0
|
||
|
move.l memlist,(a0)
|
||
|
move.l (a7)+,4(a0)
|
||
|
move.l a0,memlist
|
||
|
addq.l #8,a0
|
||
|
move.l a0,d0
|
||
|
;
|
||
|
pull
|
||
|
rts
|
||
|
|
||
|
freememlist push
|
||
|
move.l 4.w,a6
|
||
|
;
|
||
|
.more move.l memlist,d0
|
||
|
beq.s .done
|
||
|
move.l d0,a1
|
||
|
move.l (a1),memlist
|
||
|
move.l 4(a1),d0
|
||
|
jsr -210(a6)
|
||
|
bra.s .more
|
||
|
;
|
||
|
.done pull
|
||
|
rts
|
||
|
|
||
|
freemem ;
|
||
|
;a1=address to free!
|
||
|
;
|
||
|
push
|
||
|
move.l 4.w,a6
|
||
|
subq.l #8,a1
|
||
|
move.l #memlist,d0
|
||
|
;
|
||
|
.more move.l d0,a0
|
||
|
move.l (a0),d0
|
||
|
beq.s .done ;not found!
|
||
|
cmp.l d0,a1
|
||
|
bne.s .more
|
||
|
;
|
||
|
move.l (a1),(a0)
|
||
|
move.l 4(a1),d0
|
||
|
jsr -210(a6)
|
||
|
;
|
||
|
.done pull
|
||
|
rts
|
||
|
|
||
|
initmap 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_rgbs
|
||
|
;
|
||
|
move.l a0,a1
|
||
|
add.l 16(a0),a1
|
||
|
move.l a1,map_txts
|
||
|
;
|
||
|
jsr calcpalettes
|
||
|
jsr loadtxts
|
||
|
;
|
||
|
lea window1,a0
|
||
|
bsr initwindow
|
||
|
lea window2,a0
|
||
|
bsr initwindow
|
||
|
;
|
||
|
pull
|
||
|
rts
|
||
|
|
||
|
loadtxts move.l map_txts,a5 ;texture names
|
||
|
lea textures,a6
|
||
|
moveq #47,d7
|
||
|
.ltl lea .temp(pc),a0
|
||
|
.ltl2 move.b (a5)+,(a0)+
|
||
|
bne.s .ltl2
|
||
|
cmp.l #.temp+1,a0
|
||
|
beq.s .notext
|
||
|
lea .temp2(pc),a0
|
||
|
moveq #1,d1
|
||
|
jsr loadfile
|
||
|
.notext move.l d0,(a6)+
|
||
|
dbf d7,.ltl
|
||
|
rts
|
||
|
|
||
|
.temp2 dc.b 'txts/'
|
||
|
.temp ds.b 64
|
||
|
|
||
|
initwindow move #16<<grdshft+128,wi_camx(a0)
|
||
|
move #16<<grdshft-128,wi_camz(a0)
|
||
|
move #0,wi_camr(a0)
|
||
|
move #0,wi_camy(a0)
|
||
|
;
|
||
|
rts
|