feat: librairie permettant l'affichage de figures bidimensionnelles
This commit is contained in:
parent
d938d8f7f6
commit
74b27cd1c1
|
@ -0,0 +1,230 @@
|
|||
model tiny,stdcall
|
||||
p586
|
||||
locals
|
||||
jumps
|
||||
codeseg
|
||||
option procalign:byte
|
||||
|
||||
include "..\include\mem.h"
|
||||
include "..\include\graphic.h"
|
||||
|
||||
org 0h
|
||||
|
||||
header exe <"CE",1,0,0,offset exports,offset imports,,>
|
||||
|
||||
exporting
|
||||
declare hline
|
||||
declare line
|
||||
declare polyFill
|
||||
ende
|
||||
|
||||
importing
|
||||
use VIDEO,showpixel
|
||||
endi
|
||||
|
||||
PROC hline FAR
|
||||
ARG @x1:word,@x2:word,@y:word,@color:word
|
||||
USES cx,dx
|
||||
mov cx,[@x1]
|
||||
mov dx,[@x2]
|
||||
cmp cx,dx
|
||||
jbe @@boucle
|
||||
xchg cx,dx
|
||||
@@boucle:
|
||||
call [cs:showpixel],cx,[@y],[@color]
|
||||
inc cx
|
||||
cmp cx,dx
|
||||
jbe @@boucle
|
||||
ret
|
||||
endp hline
|
||||
|
||||
; affiche un pixel en %0 %1 couleur %2
|
||||
PROC line FAR
|
||||
ARG @x1:word,@y1:word,@x2:word,@y2:word,@color:word
|
||||
USES ax,bx,cx,dx,si,di
|
||||
LOCAL @@deltax:word,@@deltay:word
|
||||
mov ax,[@x2]
|
||||
sub ax,[@x1]
|
||||
call absolute
|
||||
mov [@@deltax],ax
|
||||
mov cx,ax
|
||||
mov ax,[@y2]
|
||||
sub ax,[@y1]
|
||||
call absolute
|
||||
mov dx,ax
|
||||
mov [@@deltay],ax
|
||||
mov ax,-1
|
||||
mov bx,-1
|
||||
mov si,[@x1]
|
||||
mov di,[@y1]
|
||||
cmp si,[@x2]
|
||||
jg @@x1greater
|
||||
mov ax,1
|
||||
@@x1greater:
|
||||
cmp di,[@y2]
|
||||
jg @@y1greater
|
||||
mov bx,1
|
||||
@@y1greater:
|
||||
cmp cx,dx
|
||||
jl @@deltaxgreater
|
||||
mov dx,[@@deltax]
|
||||
sar dx,1
|
||||
xor cx,cx
|
||||
@@boucle1:
|
||||
add si,ax
|
||||
add dx,[@@deltay]
|
||||
cmp dx,[@@deltax]
|
||||
jl @@above1
|
||||
sub dx,[@@deltax]
|
||||
add di,bx
|
||||
@@above1:
|
||||
call [cs:showpixel],si,di,[@color]
|
||||
inc cx
|
||||
cmp cx,[@@deltax]
|
||||
jl @@boucle1
|
||||
jmp @@endofline
|
||||
@@deltaxgreater:
|
||||
mov dx,[@@deltay]
|
||||
sar dx,1
|
||||
xor cx,cx
|
||||
@@boucle2:
|
||||
add di,bx
|
||||
add dx,[@@deltax]
|
||||
cmp dx,[@@deltay]
|
||||
jle @@above2
|
||||
sub dx,[@@deltay]
|
||||
add si,ax
|
||||
@@above2:
|
||||
call [cs:showpixel],si,di,[@color]
|
||||
inc cx
|
||||
cmp cx,[@@deltay]
|
||||
jl @@boucle2
|
||||
@@endofline:
|
||||
ret
|
||||
endp line
|
||||
|
||||
;renvoie la valeur absolue de AX
|
||||
PROC absolute NEAR
|
||||
cmp ax,0
|
||||
jg @@noabs
|
||||
neg ax
|
||||
@@noabs:
|
||||
ret
|
||||
endp absolute
|
||||
|
||||
ymax equ 200
|
||||
|
||||
; initialise un segment 2
|
||||
PROC polyFill FAR
|
||||
ARG @pointer:word,@nbfaces:word,@color:word;
|
||||
LOCAL @@startx:word:200,@@endx:word:200,@@pas:dword,@@miny:word,@@maxy:word
|
||||
USES eax,ebx,ecx,edx,si,di,es
|
||||
mov di,bp
|
||||
sub di,2
|
||||
mov ax,16000
|
||||
mov cx,(200+200)*2
|
||||
push ss
|
||||
pop es
|
||||
std
|
||||
rep stosw
|
||||
mov si,[@pointer]
|
||||
mov di,[@pointer]
|
||||
add di,size vertex2d
|
||||
mov [@@miny],ymax
|
||||
mov [@@maxy],0
|
||||
mov cx,[@nbfaces]
|
||||
dec cx
|
||||
@@boucle:
|
||||
push si di cx
|
||||
mov ax,[(vertex2d di).py]
|
||||
cmp ax,[(vertex2d si).py]
|
||||
je @@noexchange
|
||||
jge @@nothingtodo
|
||||
xchg si,di
|
||||
@@nothingtodo:
|
||||
xor eax,eax
|
||||
mov ax,[(vertex2d si).px]
|
||||
cwde
|
||||
sal eax,8
|
||||
mov ebx,eax
|
||||
xor eax,eax
|
||||
mov ax,[(vertex2d di).px]
|
||||
sub ax,[(vertex2d si).px]
|
||||
cwde
|
||||
sal eax,8
|
||||
xor ecx,ecx
|
||||
mov cx,[(vertex2d di).py]
|
||||
sub cx,[(vertex2d si).py]
|
||||
cdq
|
||||
idiv ecx
|
||||
mov [@@pas],eax
|
||||
add ebx,eax
|
||||
mov dx,[(vertex2d si).py]
|
||||
inc dx
|
||||
cmp dx,[@@miny]
|
||||
jge @@notinf
|
||||
mov [@@miny],dx
|
||||
@@notinf:
|
||||
mov ax,[(vertex2d di).py]
|
||||
cmp ax,[@@maxy]
|
||||
jle @@boucle2
|
||||
mov [@@maxy],ax
|
||||
@@boucle2:
|
||||
cmp dx,0
|
||||
jl @@notgood
|
||||
cmp dx,ymax
|
||||
jge @@notgood
|
||||
mov si,dx
|
||||
shl si,1
|
||||
neg si
|
||||
cmp [word ptr bp+si-2],16000
|
||||
jne @@notgoodforinf
|
||||
mov eax,ebx
|
||||
sar eax,8
|
||||
mov [bp+si-2],ax
|
||||
@@notgoodforinf:
|
||||
mov eax,ebx
|
||||
sar eax,8
|
||||
mov [bp+si-200*2-2],ax
|
||||
@@notgood:
|
||||
add ebx,[@@pas]
|
||||
inc dx
|
||||
cmp dx,[(vertex2d di).py]
|
||||
jle @@boucle2
|
||||
@@noexchange:
|
||||
pop cx di si
|
||||
add si,size vertex2d
|
||||
add di,size vertex2d
|
||||
dec cx
|
||||
js @@finished
|
||||
jnz @@boucle
|
||||
mov di,[@pointer]
|
||||
mov cx,0FFFFh
|
||||
jmp @@boucle
|
||||
@@finished:
|
||||
cmp [word ptr @@miny],0
|
||||
jae @@noadj
|
||||
mov [@@miny],0
|
||||
@@noadj:
|
||||
cmp [word ptr @@maxy],ymax
|
||||
jb @@noadj2
|
||||
mov [@@maxy],ymax-1
|
||||
@@noadj2:
|
||||
mov cx,[@@miny]
|
||||
@@drawboucle:
|
||||
mov si,cx
|
||||
shl si,1
|
||||
neg si
|
||||
mov ax,[bp+si-2]
|
||||
mov bx,[bp+si-200*2-2]
|
||||
cmp bx,16000
|
||||
jnz @@noinfatall
|
||||
mov ax,bx
|
||||
@@noinfatall:
|
||||
call hline,ax,bx,cx,[@color]
|
||||
inc cx
|
||||
cmp cx,[@@maxy]
|
||||
jna @@drawboucle
|
||||
ret
|
||||
endp polyFill
|
||||
|
Loading…
Reference in New Issue