TITLE programme test des fonction 3dgraph

DOSSEG
.MODEL LARGE
.STACK 500H
.486


INCLUDE FREE_OVE.FNC
INCLUDE FLAT.FNC
INCLUDE 3DGRAPH.FNC
INCLUDE CLAVIER.FNC


.DATA
 POINT3D STRUC
  P3X DD 0
  P3Y DD 0
  P3Z DD 0
 ENDS

 BUFFERZ DD 5000 DUP(?)
 BUFFERL DD 5000 DUP(?)

 POLY1 POLYGONE <0,0,0,1,2,2,0>
 F FENETRE<-100,-100,-10,99>
 PTAB DD 3
      POINT3D <-160,-99,20>
      POINT3D <0,99,10>
      POINT3D <159,-99,0>


.CODE
START:
 FREE_OVER_MEM     ;lib‚re la m‚moire non utilis‚
 FLAT_MODE         ;Passe au mode FLAT FS,GS,DS,ES sont agrandis … 4Go
 NEW_KEY

 MOV AX,0013H
 INT 10H

 MOV EAX,@DATA
 SHL EAX,4
 MOV EBX,OFFSET PTAB
 ADD EBX,EAX

 MOV POLY1.P_OFS32_PTAB,EBX
 MOV EDI,offset Ptab

MOV ECX,10000
@MAIN:
PUSH ECX
 MOV AX,@DATA
 MOV DS,AX

 KEY 2
 JNE @NK2
  DEC F.FENETRE_Xmin
 @NK2:

 KEY 3
 JNE @NK3
  INC F.FENETRE_Xmin
 @NK3:

 KEY 4
 JNE @NK4
  DEC F.FENETRE_Xmax
 @NK4:

 KEY 5
 JNE @NK5
  INC F.FENETRE_Xmax
 @NK5:



 MOV EAX,@DATA
 SHL EAX,4
 ADD EAX,OFFSET BUFFERZ

 PUSH DWORD PTR 0
 PUSH DWORD PTR 400
 PUSH EAX
 CALL SR_INIT_BUFFERZ

 MOV EAX,@DATA
 SHL EAX,4

 MOV EBX,OFFSET BUFFERL
 ADD EBX,EAX
 MOV [BUFFERL],EBX

 MOV EBX,OFFSET POLY1
 ADD EBX,EAX
 PUSH EBX

 MOV EBX,OFFSET F
 ADD EBX,EAX
 PUSH EBX

 PUSH DWORD PTR 320
 PUSH DWORD PTR 200
 PUSH DWORD PTR 320

 MOV EBX,OFFSET BUFFERZ
 ADD EBX,EAX
 PUSH EBX

 MOV EBX,OFFSET BUFFERL
 ADD EBX,EAX
 PUSH EBX

 CALL SR_POLY_GRID

 ;‚fface l'ecran
 PUSH ES
 XOR EDI,EDI
 MOV AX,0A000H
 MOV ES,AX
 CLD
 MOV CX,16000
 MOV EAX,15161718H
 REP STOSD
 POP ES

JMP @suite
 ;affiche le buffer Z
 MOV EAX,@DATA
 SHL EAX,4
 ADD EAX,offset BUFFERZ
 MOV EDI,EAX           ;EDI pointe sur le bufferZ

 PUSH DS
 PUSH ES

 XOR AX,AX
 MOV DS,AX
 MOV ES,AX

 ;calcul deltaZ
 MOV ECX,[EDI+8]
 SUB ECX,[EDI+4]
 INC ECX

 @BUFFERZ0:            ;parcour les diff‚rents Z
 PUSH ECX
 PUSH EDI
 DEC ECX
 MOV EDX,ECX
; SHR EDX,4
 ADD EDX,1
 

 SHL ECX,3
 ADD ECX,12
 ADD EDI,ECX          
 MOV EDI,[EDI]        ;edi pointe sur premier objet de ce Z
 CMP EDI,0            ;si ‚gale 0 pas d'objet pour ce Z
 JE @BUFFERZ2

 ;parcour les objet de ce Z
 @BUFFERZ1:
  MOV EAX,[EDI.TYPE_OBJET]
  CMP EAX,CH_LIGNE_COULEUR
  JNE @BUFFERZ2            ;test si il s'agit d'une ligne de couleur
  ;calcul longueur ligne
  MOV ECX,[EDI.LIGNE_taille]
  CMP ECX,0
  JL @BUFFERZ3
   INC ECX
   MOV ESI,[EDI.LIGNE_PRECAL]
   MOV EAX,[EDI.LIGNE_OFFSET_PRECAL]
   SHL EAX,2
   ADD ESI,EAX
   MOV EAX,[EDI.LIGNE_COULEUR]
   PUSH EDI
   MOV EDI,[EDI.LIGNE_offset]
   ADD EDI,0A0000H+32160
   MOV EBX,[ESI]
   ADD ESI,4
   MOV AL,DL
   @BUFFERZ5:
    MOV [EDI+EBX],AL
    MOV EBX,[ESI]
    ADD ESI,4
   LOOPD @BUFFERZ5
   NOP
   POP EDI
  JMP @BUFFERZ4

  @BUFFERZ3:
   NEG ECX
   INC ECX
   MOV ESI,[EDI.LIGNE_PRECAL]
   MOV EAX,[EDI.LIGNE_OFFSET_PRECAL]
   SHL EAX,2
   ADD ESI,EAX
   MOV EAX,[EDI.LIGNE_COULEUR]
   PUSH EDI
   MOV EDI,[EDI.LIGNE_offset]
   ADD EDI,0A0000H+32160
   MOV EBX,[ESI]
   SUB ESI,4
   MOV AL,DL
   @BUFFERZ6:
    MOV [EDI+EBX],AL
    MOV EBX,[ESI]
    SUB ESI,4
   LOOPD @BUFFERZ6
   NOP
   POP EDI

  @BUFFERZ4:                ;passe … l'objet suivant
   XOR EAX,EAX
   CMP [EDI.OFS32_prochain],EAX
   JE @BUFFERZ2
   MOV EDI,[EDI.OFS32_prochain]
  JMP @BUFFERZ1

  @BUFFERZ2:

 POP EDI
 POP ECX
 DEC ECX
 JECXZ @BUFFERZ01
  JMP @BUFFERZ0
 @BUFFERZ01:

 POP ES
 POP DS

@suite:

 MOV EAX,SEG bufferz
 SHL EAX,4
 ADD EAX,offset bufferz
 MOV EBX,0A0000H+32160
 push eax
 push ebx
 CALL SR_DECODE_BUFFERZ


POP ECX
DEC ECX
JECXZ @EXIT
JMP @MAIN
@EXIT:



 MOV AX,0003H
 INT 10H

 HOLD_KEY

 MOV AX,4C00H
 INT 21H
END START

