%-----------------------------------------------------------------------------%
% Moteur.masd                                                                 %
%-----------------------------------------------------------------------------%
% Repérage des murs à afficher par propagation triangulaire                   %
%-----------------------------------------------------------------------------%

D0=(5)ANGLE A=DAT0.B
A+1.B DAT0=A.B
GOSUB.GEN.ROT
LA 00180 LC 000C0
{
  R0=A.A R1=C.A D=C.A
  GOSBVL ROTATION
  LC 40000 A+C.A
  CSRB.A B+C.A
  ASR.A ASR.A ASR.A
  BSR.A BSR.A
  B=0.P B+B.A
  D0=(5)ECR2 C=DAT0.A
  C+B.A BSR.A B+C.A
  C=A.P
  ASRB.A ASRB.A
  A+B.A D0=A
  P=C.0
  LC 1248124812481248
  P=0
  A=DAT0.S
  A!C.S DAT0=A.S
  
  LC 00002 B=C.A
  A=R0.A A-B.A EXITC
  C=R1.A BSRB.A C-B.A
  UP
}

SKIP {

% Routine de création du code généré pour les multiplications
% Modifie : Ab, Cw, D0, P

  *.GEN.MULT

  % Cas particulier où alpha vaut 255.
  A+1.B SKIPNC {
    %B+C.A BSL.A BSL.A
    LC 1F1F5D
    DAT0=C.6 D0+6
    RTN
  }
  
  % Generation du code pour le premier quartet de alpha
  ?ABIT=0.0
    { LC 1C P+1 P+1 }
  LC 6C P+1 P+1
  ?ABIT=0.1
    { LC 1C P+1 P+1 }
  LC 6C P+1 P+1
  ?ABIT=0.2
    { LC 1C P+1 P+1 }
  LC 6C P+1 P+1
  ?ABIT=0.3
    { LC 1C P+1 P+1 }
  LC 6C P+1
  DAT0=C.WP
  % On saute les quartets ecrits
  CD0EX C+P+1 CD0EX
  P=0

  % Ecriture de "CSR.A BSR.A"
  %LC 5F6F
  %DAT0=C.4 D0+4
  
  % Generation du code pour le second quartet de alpha
  ?ABIT=0.4
    { LC 1C P+1 P+1 }
  LC 6C P+1 P+1
  ?ABIT=0.5
    { LC 1C P+1 P+1 }
  LC 6C P+1 P+1
  ?ABIT=0.6
    { LC 1C P+1 P+1 }
  LC 6C P+1
  ?ABIT=0.7
    { P+1 LC 1C P+1 }
  
  DAT0=C.WP
  CD0EX C+P+1 CD0EX
  P=0

  RTN

% Routine de creation du code généré pour les rotations

  *.GEN.ROT

  % Fait pointer D1 sur les valeurs du Cos et du Sin
  SKUB { /CosSin.bin }
  C=RSTK
  A=0.A
  D0=(5)ANGLE A=DAT0.B
  A+A.A A+A.A
  C+A.A D1=C
  C=A.X
  A=DAT1.B D1+2
  B=A.B
  A=DAT1.B
  %ST=0.15
  %DISPKEY
  %ST=1.15

  D0=(2)ROTATION

  % Saut vers la sous-routine appropriée suivant la valeur de l'angle
  % (gestion du signe du cos et du sin)
  ?CBIT=0.9 {
    ?CBIT=1.8 -> .BD
    GOTO.BG
  }
  ?CBIT=0.8
    { GOTO.HG }
  %GOC.HD
  
  % Lorsque l'angle est compris entre 0 et 90°
  *.HD
  % B=0.A C=D.A
  LC BD1D
  DAT0=C.A D0+4
  % B=C*SIN.A
  GOSUB.GEN.MULT
  % B=-B.A C=A.A
  LC 6D9F
  DAT0=C.A D0+4
  % B+=C*COS.A
  ABEX.B
  GOSUB.GEN.MULT
  % C=A.A A=B.A B=0.A
  LC 1D4D6D
  DAT0=C.6 D0+6
  % B=C*SIN.A
  ABEX.B A-1.B
  GOSUB.GEN.MULT
  % C=D.A
  LC BD DAT0=C.B D0+2
  % B+=C*COS.A
  ABEX.B A-1.B
  GOSUB.GEN.MULT
  % RTN
  LC 10 DAT0=C.B
  RTN
  
  % Lorsque l'angle est compris entre -90 et 0°
  *.BD
  % B=0.A C=A.A
  LC 6D1D
  DAT0=C.A D0+4
  % B=C*COS.A
  ABEX.B
  GOSUB.GEN.MULT
  % C=D.A
  LC BD DAT0=C.B D0+2
  % B+=C*SIN.A
  ABEX.B
  GOSUB.GEN.MULT
  % C=A.A A=B.A B=0.A
  LC 1D4D6D
  DAT0=C.6 D0+6
  % B=C*SIN.A
  A-1.B
  GOSUB.GEN.MULT
  % B=-B.A C=D.A
  LC BD9F
  DAT0=C.A D0+4
  % B+=C*COS.A
  ABEX.B A-1.B
  GOSUB.GEN.MULT
  % RTN
  LC 10 DAT0=C.B
  RTN
  
  % Lorsque l'angle est compris entre 90 et 180°
  *.HG
  % B=0.A C=A.A
  LC 6D1D
  DAT0=C.A D0+4
  % B=C*COS.A
  ABEX.B
  GOSUB.GEN.MULT
  % C=D.A
  LC BD DAT0=C.2 D0+2
  % B+=C*SIN.A
  ABEX.B
  GOSUB.GEN.MULT
  % B=-B.A C=A.A A=B.A B=0.A
  LC 1D4D6D9F
  DAT0=C.8 D0+8
  % B=C*SIN.A
  A-1.B
  GOSUB.GEN.MULT
  % B=-B.A C=D.A
  LC BD9F
  DAT0=C.A D0+4
  % B+=C*COS.A
  ABEX.B A-1.B
  GOSUB.GEN.MULT
  % B=-B.A RTN
  LC 109F DAT0=C.A
  RTN
  
  % Lorsque l'angle est compris entre -180 et -90°
  *.BG
  % B=0.A C=A.A
  LC 6D1D
  DAT0=C.A D0+4
  % B=C*COS.A
  ABEX.B
  GOSUB.GEN.MULT
  % B=-B.A C=D.A
  LC BD9F
  DAT0=C.A D0+4
  % B+=C*SIN.A
  ABEX.B
  GOSUB.GEN.MULT
  % C=A.A A=B.A B=0.A
  LC 1D4D6D
  DAT0=C.6 D0+6
  % B=C*SIN.A
  A-1.B
  GOSUB.GEN.MULT
  % C=D.A
  LC BD DAT0=C.B D0+2
  % B+=C*COS.A
  ABEX.B A-1.B
  GOSUB.GEN.MULT
  % B=-B.A RTN
  LC 109F DAT0=C.A
  RTN


}

@