290 lines
3.8 KiB
NASM
290 lines
3.8 KiB
NASM
;----------------------------------------------------------------------------
|
|
; S_LINE.ASM 386
|
|
; (c) Adeline 1993
|
|
;----------------------------------------------------------------------------
|
|
.386p
|
|
jumps
|
|
.model FLAT, SYSCALL
|
|
|
|
.data
|
|
|
|
include svga.ash
|
|
|
|
EVEN
|
|
|
|
couleur dw 00
|
|
|
|
.code
|
|
|
|
public NoLanguage Line
|
|
public NoLanguage Line_A
|
|
|
|
;----------------------------------------------------------------------------
|
|
; Line( x0, y0, x1, y1, coul )
|
|
;
|
|
Line proc uses esi edi ebp ebx,\
|
|
x0:DWORD, y0:DWORD,\
|
|
x1:DWORD, y1:DWORD,\
|
|
coul:DWORD
|
|
|
|
; X0:ax Y0:bx
|
|
; X1:cx Y1:DX
|
|
; couleur: bp
|
|
|
|
mov eax, x0
|
|
mov ebx, y0
|
|
mov ecx, x1
|
|
mov edx, y1
|
|
|
|
mov ebp, coul
|
|
|
|
call Line_A
|
|
|
|
ret
|
|
|
|
Line endp
|
|
|
|
Line_A proc
|
|
|
|
; X0:eax Y0:ebx
|
|
; X1:ecx Y1:edx
|
|
|
|
mov [couleur], bp
|
|
|
|
cmp eax, ecx ; x0 < x1
|
|
jle sensok
|
|
xchg eax, ecx
|
|
xchg ebx, edx
|
|
sensok:
|
|
; XY 0
|
|
|
|
onceagain: xor bp, bp
|
|
|
|
cmp eax, [ClipXmin] ; x0
|
|
jge ncxi
|
|
or bp, 1
|
|
jmp short ncxg
|
|
|
|
ncxi: cmp eax, [ClipXmax]
|
|
jg notseen
|
|
|
|
ncxg: cmp ebx, [ClipYmin]
|
|
jge ncyi
|
|
or bp, 8
|
|
jmp short ncya
|
|
|
|
ncyi: cmp ebx, [ClipYmax]
|
|
jle ncya
|
|
or bp, 4
|
|
ncya:
|
|
; XY 1
|
|
|
|
shl bp, 8
|
|
|
|
cmp ecx, [ClipXmin]
|
|
jl notseen
|
|
|
|
cmp ecx, [ClipXmax]
|
|
jle ncx2a
|
|
or bp, 2
|
|
ncx2a:
|
|
cmp edx, [ClipYmin]
|
|
jge ncy2i
|
|
or bp, 8
|
|
jmp short ncy2a
|
|
|
|
ncy2i: cmp edx, [ClipYmax]
|
|
jle ncy2a
|
|
or bp, 4
|
|
ncy2a:
|
|
|
|
; test
|
|
|
|
mov si, bp
|
|
shr si, 8
|
|
test si, bp
|
|
jnz notseen
|
|
or si, bp
|
|
and si, 0FFh
|
|
jz draw
|
|
|
|
mov edi, ecx
|
|
sub edi, eax ; edi delta x
|
|
|
|
mov esi, edx
|
|
sub esi, ebx ; esi delta y
|
|
|
|
|
|
test bp, 100h
|
|
jz c0
|
|
|
|
mov ebp, edx
|
|
|
|
sub eax, [ClipXmin] ; xmin - x0
|
|
neg eax
|
|
imul si ; * dy
|
|
idiv di ; / dx
|
|
movsx eax, ax
|
|
add ebx, eax ; y0 +=
|
|
mov eax, [ClipXmin] ; x0 = xmin
|
|
|
|
mov edx, ebp
|
|
|
|
jmp onceagain
|
|
c0:
|
|
test bp, 800h
|
|
jz c1
|
|
|
|
mov ebp, edx
|
|
|
|
xchg eax, ebx
|
|
sub eax, [ClipYmin] ; ymin - y0
|
|
neg eax
|
|
imul di ; * dx
|
|
idiv si ; / dy
|
|
movsx eax, ax
|
|
add eax, ebx ; x0 +=
|
|
mov ebx, [ClipYmin] ; y0 = ymin
|
|
|
|
mov edx, ebp
|
|
|
|
jmp onceagain
|
|
c1:
|
|
test bp, 400h
|
|
jz c2
|
|
|
|
mov ebp, edx
|
|
|
|
xchg eax, ebx
|
|
sub eax, [ClipYmax] ; ymax - y0
|
|
neg eax
|
|
imul di ; * dx
|
|
idiv si ; / dy
|
|
movsx eax, ax
|
|
add eax, ebx ; x0 +=
|
|
mov ebx, [ClipYmax] ; y0 = ymax
|
|
|
|
mov edx, ebp
|
|
|
|
jmp onceagain
|
|
|
|
|
|
|
|
c2:
|
|
test bp, 2
|
|
jz c3
|
|
|
|
mov ecx, eax ; save x0
|
|
mov eax, [ClipXmax]
|
|
sub eax, ecx ; xmax - x0
|
|
imul si ; * dy
|
|
idiv di ; / dx
|
|
movsx edx, ax
|
|
add edx, ebx ; + y0
|
|
mov eax, ecx ; restore x0
|
|
mov ecx, [ClipXmax]
|
|
|
|
jmp onceagain
|
|
|
|
c3:
|
|
test bp, 8
|
|
jz c4
|
|
|
|
mov ecx, eax
|
|
mov eax, ebx
|
|
sub eax, [ClipYmin] ; ymin - y0
|
|
neg eax
|
|
imul di ; * dx
|
|
idiv si ; / dy
|
|
movsx edx, ax
|
|
mov eax, ecx
|
|
add ecx, edx ; x0 +=
|
|
mov edx, [ClipYmin]
|
|
|
|
jmp onceagain
|
|
|
|
c4:
|
|
test bp, 4
|
|
jz onceagain
|
|
|
|
mov ecx, eax
|
|
mov eax, ebx
|
|
sub eax, [ClipYmax] ; ymax - y0
|
|
neg eax
|
|
imul di ; * dx
|
|
idiv si ; / dy
|
|
movsx edx, ax
|
|
mov eax, ecx
|
|
add ecx, edx
|
|
mov edx, [ClipYmax]
|
|
|
|
jmp onceagain
|
|
|
|
notseen: ret
|
|
|
|
;----------------------------------------------------------------------------
|
|
|
|
draw: mov esi, 640
|
|
sub ecx, eax
|
|
sub edx, ebx
|
|
jns descend
|
|
|
|
neg esi
|
|
neg edx
|
|
|
|
descend: mov edi, Log
|
|
add edi, TabOffLine[ ebx * 4 ]
|
|
add edi, eax
|
|
|
|
mov ax, [couleur]
|
|
|
|
cmp ecx, edx
|
|
jl vertical
|
|
|
|
horizontal: mov ebp, ecx
|
|
shl ebp, 1
|
|
mov ebx, ecx
|
|
shl edx, 1
|
|
inc ecx
|
|
jmp loopX
|
|
|
|
noovfy: dec ecx
|
|
jz exit
|
|
loopX: mov byte ptr[edi], al
|
|
inc edi
|
|
sub ebx, edx
|
|
jnc noovfy
|
|
add ebx, ebp
|
|
add edi, esi
|
|
dec ecx
|
|
jnz loopX
|
|
|
|
ret
|
|
|
|
vertical: xchg ecx, edx
|
|
mov ebp, ecx
|
|
shl ebp, 1
|
|
mov ebx, ecx
|
|
shl edx, 1
|
|
inc ecx
|
|
jmp loopY
|
|
|
|
noovfx: add edi, esi
|
|
dec ecx
|
|
jz exit
|
|
loopY: mov byte ptr[edi], al
|
|
sub ebx, edx
|
|
jnc noovfx
|
|
add ebx, ebp
|
|
adc edi, esi
|
|
dec ecx
|
|
jnz loopY
|
|
|
|
exit:
|
|
ret
|
|
|
|
Line_A endp
|
|
|
|
|
|
end
|