mirror of https://github.com/earok/GloomAmiga.git
159 lines
2.1 KiB
ArmAsm
159 lines
2.1 KiB
ArmAsm
groundcam dc.l 0
|
|
|
|
ground ;
|
|
;A0=128 X 128 bitmap to map onto ground...
|
|
;A1=address of inverse camera matrix
|
|
;
|
|
movem.l d2-d7/a2-a6,-(a7)
|
|
;
|
|
lea 10(a0),a0
|
|
;
|
|
move hite(pc),d7
|
|
mulu copline(pc),d7
|
|
add.l copx0(pc),d7
|
|
move.l d7,a2
|
|
;
|
|
moveq #0,d6
|
|
sub camy(pc),d6
|
|
ext.l d6
|
|
lsl.l #focshft,d6
|
|
move.l d6,groundcam
|
|
;
|
|
move maxy(pc),d7
|
|
subq #1,d7
|
|
ground_vloop ;
|
|
;find Z on this scanline...
|
|
;
|
|
move.l groundcam(pc),d6
|
|
divs d7,d6 ;d6.w = Z
|
|
;
|
|
move.l pal(pc),a5
|
|
move d6,d5
|
|
lsr #darkshft,d5
|
|
cmp #16,d5
|
|
bcs.s ground_ok
|
|
;
|
|
;OK, out of Z's...fill in with dark colour 0 QUICKLY!
|
|
;
|
|
move.l coplinel(pc),d1
|
|
neg.l d1
|
|
add.l d1,a2
|
|
bsr clstherest
|
|
bra ground_abort
|
|
;
|
|
ground_ok move.l 0(a5,d5*4),a5 ;palette!
|
|
;
|
|
;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 (a1),d0
|
|
add.l d0,d0
|
|
muls 2(a1),d3
|
|
add.l d3,d3
|
|
add.l d3,d0
|
|
;
|
|
muls 4(a1),d2
|
|
add.l d2,d2
|
|
muls 6(a1),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 (a1),d4
|
|
add.l d4,d4
|
|
muls 2(a1),d3
|
|
add.l d3,d3
|
|
add.l d3,d4
|
|
;
|
|
muls 4(a1),d2
|
|
add.l d2,d2
|
|
muls 6(a1),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
|
|
add.l camx(pc),d0
|
|
add.l camz(pc),d1
|
|
;
|
|
;d0,d1.q=x,z
|
|
;d4,d6.q=xadd,zadd
|
|
;
|
|
swap d0
|
|
swap d1
|
|
swap d4
|
|
swap d6
|
|
;
|
|
move d7,-(a7)
|
|
moveq #127,d7
|
|
moveq #0,d2
|
|
moveq #0,d3
|
|
;
|
|
sub copline(pc),a2
|
|
move.l a2,a3
|
|
;
|
|
move wdiv32(pc),-(a7)
|
|
;
|
|
ground_hloop2 moveq #31,d5
|
|
;
|
|
ground_hloop tst (a3)
|
|
;
|
|
ground_br bne.s ground_skip
|
|
;
|
|
and d7,d0
|
|
and d7,d1 ;X/Z for fetch!
|
|
move d0,d2
|
|
ext.l d2
|
|
lsl.l #7,d2
|
|
lea 0(a0,d2.l),a6
|
|
move.b 0(a6,d1),d3
|
|
move 0(a5,d3*2),(a3)
|
|
;
|
|
ground_skip add.l d4,d0
|
|
addx d2,d0
|
|
add.l d6,d1
|
|
addx d2,d1
|
|
addq #4,a3
|
|
dbf d5,ground_hloop
|
|
;
|
|
addq #4,a3
|
|
subq #1,(a7)
|
|
bgt.s ground_hloop2
|
|
bne.s .kl
|
|
move wrem32(pc),d5
|
|
bpl.s ground_hloop
|
|
;
|
|
.kl move.l (a7)+,d7
|
|
dbf d7,ground_vloop
|
|
;
|
|
ground_abort movem.l (a7)+,d2-d7/a2-a6
|
|
rts
|
|
|