home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy005 / lowlevel / trian5.asm < prev    next >
Encoding:
Assembly Source File  |  1997-07-04  |  9.1 KB  |  238 lines

  1. ;;; PROGRAMA en assembler para comprobar la subrutina de dibujado rápido
  2. ;;; de triangulos rellenos        -->   Navi / PhyMosys
  3. .MODEL SMALL
  4. .STACK
  5. .386
  6.  
  7. LOCALS @@
  8. w EQU WORD PTR
  9. b EQU BYTE PTR
  10. d EQU DWORD PTR
  11.  
  12. .CODE
  13. ; INCLUDE GRFLIB.INC
  14.  
  15. Save1   DD      0
  16. kk dw 0
  17.  
  18. FillTriangle    PROC
  19.                 PUSHAD
  20.                 PUSH    ES
  21.                 MOV     AX, DS:[BX+2]   ;  Pillamos y1
  22.                 CMP     AX, DS:[BX+6]
  23.                 JB    @@Cont1           ;  y1<y2 ?
  24.                 JE    @@Iguales1
  25.                 XCHG    AX, DS:[BX+6]
  26.                 MOV     DX, DS:[BX+0]
  27.                 MOV     DS:[BX+2], AX
  28.                 XCHG    DX, DS:[BX+4]
  29.                 MOV     DS:[BX+0], DX   ;  Cambio realizado.
  30.                 JMP   @@Cont1
  31.         @@Iguales1:
  32.                 INC     w DS:[BX+6]     ;  Fuera las divisiones por 0.
  33.  
  34.       @@Cont1:  MOV     AX, DS:[BX+2]   ;  y1
  35.                 CMP     AX, DS:[BX+10]
  36.                 JB    @@Cont2           ;  y1<y3 ?
  37.                 JE    @@Iguales2
  38.                 XCHG    AX, DS:[BX+10]
  39.                 MOV     DX, DS:[BX+0]
  40.                 MOV     DS:[BX+2], AX
  41.                 XCHG    DX, DS:[BX+8]
  42.                 MOV     DS:[BX+0], DX   ;  Cambio realitzado.
  43.                 JMP   @@Cont2
  44.         @@Iguales2:
  45.                 INC     w DS:[BX+10]    ;  Fuera las divisiones por 0.
  46.  
  47.       @@Cont2:  MOV     AX, DS:[BX+6]   ;  y2
  48.                 CMP     AX, DS:[BX+10]
  49.                 JB    @@Cont3           ;  y2<y3 ?
  50.                 JE    @@Iguales3
  51.                 XCHG    AX, DS:[BX+10]
  52.                 MOV     DX, DS:[BX+4]
  53.                 MOV     DS:[BX+6], AX
  54.                 XCHG    DX, DS:[BX+8]
  55.                 MOV     DS:[BX+4], DX   ;  Cambio realitzado.
  56.                 JMP   @@Cont3
  57.         @@Iguales3:
  58.                 INC     w DS:[BX+6]     ;  Fuera las divisiones por 0.
  59.  
  60.       @@Cont3:  MOV     BP, BX
  61.                 MOV     AX, 0A000h
  62.                 MOV     ES, AX          ;  Segmento de video de la VGA
  63.  
  64.         ;  Inicialización de variables.
  65.  
  66.                 MOVZX   EDI, w DS:[BP+2]
  67.                 MOV     EAX, EDI
  68.                 SHL     EDI, 6          ;  EDI * 64
  69.                  MOVZX   ESI, w DS:[BP+6];  Calculamos ESI paralelamente
  70.                 SHL     EAX, 8          ;  EAX * 256
  71.                  SHL     ESI, 6+7        ;  ESI * 64 y a fixed point
  72.                 MOVZX   EBX, w DS:[BP+0];  Cargamos la x1
  73.                 ADD     EDI, EAX        ;  EDI * 320
  74.                  MOV     EAX, ESI
  75.                 ADD     EDI, EBX        ;  EDI -> y1 * 320 + x1
  76.                  SHL     EAX, 8+7-(6+7)  ;  EAX * 256 y a fixed point (antes)
  77.                 SAL     EDI, 7          ;  Pasamos a punto fijo.
  78.                  ADD     ESI, EAX        ;  EDI -> y2 * 320
  79.  
  80.                 MOV     AX, w DS:[BP+0]
  81.                 MOV     BX, w DS:[BP+2]
  82.                 SUB     AX, w DS:[BP+8] ;  AX = x1 - x3
  83.                 SUB     BX, w DS:[BP+10];  BX = y1 - y3
  84.                 MOVSX   EAX, AX
  85.                 MOVSX   EBX, BX         ;  Solo el WORD de bajo.
  86.                 SAL     EAX, 7+7        ;  +7 para la proxima división.
  87.                 SAL     EBX, 7          ;  Pasamos a fixed point.
  88.                 XOR     EDX, EDX
  89.                 OR      EAX, EAX
  90.                 JNS   @@Ok2             ;  El signo de EDX es muy importante.
  91.                 DEC     EDX
  92.          @@Ok2: IDIV    EBX             ;  En EAX el resultado.
  93.                 MOV     CS:[Save1], EAX ;  Para dentro de un ratito
  94.                 MOV     ECX, EAX        ;  Guardamos el resultado para después
  95.                 ADD     EAX, 320*128    ;  EAX = EAX + 320 (en fixed)
  96.                 MOV     EBX, EAX
  97.  
  98.                 PUSH    EBX
  99.                 MOV     AX, w DS:[BP+4]
  100.                 MOV     BX, w DS:[BP+6]
  101.                 SUB     AX, w DS:[BP+0] ;  AX = x2 - x1
  102.                 SUB     BX, w DS:[BP+2] ;  BX = y2 - y1
  103.                 MOVSX   EAX, AX
  104.                 MOVSX   EBX, BX         ;  Solo el WORD de bajo.
  105.                 SAL     EAX, 7+7        ;  +7 para la proxima división.
  106.                 SAL     EBX, 7          ;  Pasamos a fixed point.
  107.                 XOR     EDX, EDX
  108.                 OR      EAX, EAX
  109.                 JNS   @@Ok3             ;  El signo de EDX es muy importante.
  110.                 DEC     EDX
  111.          @@Ok3: IDIV    EBX             ;  En EAX el resultado.
  112.                 SUB     EAX, ECX        ;  ECX lo habiamos calculado antes.
  113.                 JNS   @@Positivo        ;  Si el signo es (-) cambiarlo.
  114.                 NEG     EAX
  115.     @@Positivo: MOV     EDX, EAX        ;  Ya está calculado el EDX!
  116.                 POP     EBX
  117.  
  118.                 XOR     ECX, ECX        ;  El ECX (chantatachan... >8-D )
  119.                 MOV     w CS:[OverW1], 9090h  ;  Insertamos 2 NOPs
  120.                 MOV     AX, DS:[BP+4]
  121.                 CLD                     ;  Hacia la derecha... :(
  122.                 MOV     w CS:[OverW2], 9090h
  123.                 CMP     AX, DS:[BP+0]   ;  x2>x1 ?
  124.                 JA    @@Ok1
  125.                 MOV     w CS:[OverW1], 0CF29h  ; CF29h -> SUB DI,CX
  126.                 MOV     w CS:[OverW2], 0CF29h
  127.  
  128.         ;  El primer bucle.
  129.  
  130.        @@Ok1:   MOVZX   AX, b DS:[BP+12];  Pillamos el color.
  131.                 MOV     AH, AL
  132.                 SHL     EAX, 16
  133.                 MOVZX   AX, b DS:[BP+12]
  134.                 MOV     AH, AL
  135.  
  136.      @@BucleW1: CMP     EDI, ESI
  137.                 JNB   @@FinBucle1       ;  Hasta que EDI>=ESI
  138.  
  139.                 PUSH    EDI             ;  Tenemos que guardar estos registros
  140.                 PUSH    ECX
  141.                 SHR     ECX, 7
  142.                 SHR     EDI, 7
  143.         OverW1: NOP                     ;  2*NOP / SUB DI,CX
  144.                 NOP
  145.                 SHR     CX, 1
  146.                 JNC   @@NoDoble1
  147.                 STOSB
  148.     @@NoDoble1: SHR     CX, 1
  149.                 JNC   @@NoDoble1b
  150.                 STOSW
  151.     @@NoDoble1b:REP  STOSd              ;  Dibujamos 1 línea horizontal.
  152.                 POP     ECX
  153.                 POP     EDI
  154.  
  155.                 ADD     EDI, EBX        ;  Incrementamos valors
  156.                 ADD     ECX, EDX
  157.                 JMP   @@BucleW1
  158.         @@FinBucle1:
  159.  
  160.         ;  Re-inicialitzación de las variables.
  161.  
  162.                 PUSH    EBX
  163.                 MOV     AX, w DS:[BP+4]
  164.                 MOV     BX, w DS:[BP+6]
  165.                 SUB     AX, w DS:[BP+8] ;  AX = x2 - x3
  166.                 SUB     BX, w DS:[BP+10];  BX = y2 - y3
  167.                 MOVSX   EAX, AX
  168.                 MOVSX   EBX, BX         ;  Solo el WORD de bajo.
  169.                 SAL     EAX, 7+7        ;  +7 para la próxima división.
  170.                 SAL     EBX, 7          ;  Pasamos a fixed point.
  171.                  MOVZX   ESI, w DS:[BP+10]
  172.                 XOR     EDX, EDX
  173.                 OR      EAX, EAX
  174.                 JNS   @@Ok4             ;  El signo de EDX es muy importante.
  175.                 DEC     EDX
  176.          @@Ok4: IDIV    EBX             ;  En EAX el resultado.
  177.                  SHL     ESI, 6+7         ;  ESI * 64 y a fixed point.
  178.                 MOV     EDX, EAX
  179.                  MOV     EAX, ESI
  180.                 SUB     EDX, CS:[Save1] ;  El 'save' lo habiamos calculado antes
  181.                 JNS   @@Positivo2       ;  Si el signo es (-) cambiarlo.
  182.                 NEG     EDX             ;  Ya está recalculado EDX!
  183.     @@Positivo2: SAL     EAX, (8+7)-(6+7);  EAX * 256 y a fixed point.
  184.                 POP     EBX
  185.                  ADD     ESI, EAX       ;  ESI -> y3 * 320
  186.  
  187.         ;  El darrer bucle.
  188.  
  189.                 MOVZX   AX, b DS:[BP+12]  ;  Pillamos el color.
  190.                 MOV     AH, AL
  191.                 SHL     EAX, 16
  192.                 MOVZX   AX, b DS:[BP+12]
  193.                 MOV     AH, AL
  194.  
  195.      @@BucleW2: CMP     EDI, ESI
  196.                 JNB   @@FinBucle2       ;  Hasta que EDI>=ESI
  197.  
  198.                 PUSH    EDI             ;  Tenemos que guardar estos registros
  199.                 PUSH    ECX
  200.                 SHR     ECX, 7
  201.                 SHR     EDI, 7
  202.         OverW2: NOP                     ;  2*NOP / SUB DI,CX
  203.                 NOP
  204.                 SHR     CX, 1
  205.                 JNC   @@NoDoble2
  206.                 STOSB
  207.     @@NoDoble2: SHR     CX, 1
  208.                 JNC   @@NoDoble2b
  209.                 STOSW
  210.     @@NoDoble2b:REP  STOSd              ;  Dibujamos 1 línea horizontal.
  211.                 POP     ECX
  212.                 POP     EDI
  213.  
  214.                 ADD     EDI, EBX        ;  Incrementamos valores
  215.                 SUB     ECX, EDX
  216.                 JMP   @@BucleW2
  217.         @@FinBucle2:
  218.                 POP     ES
  219.                 POPAD
  220.                 RET                     ;  Un bonito triangulo, no? :)
  221. FillTriangle    ENDP
  222.  
  223.                 PUBLIC Triangulo
  224. ;;  La llamada se hace así:   Triangulo(tr1 : TrianType);
  225. Triangulo       PROC
  226.                 PUSH    BP
  227.                 MOV     BP, SP
  228.                 PUSH    DS
  229.                 MOV     AX, [BP+8]
  230.                 MOV     DS, AX
  231.                 MOV     BX, [BP+6]
  232.                 CALL    FillTriangle
  233.                 POP     DS
  234.                 POP     BP
  235.                 RETF
  236. Triangulo       ENDP
  237.                 END
  238.