Advertisement
Guest User

Générateur de Montagnes

a guest
Mar 31st, 2011
377
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 62.64 KB | None | 0 0
  1. #if 0
  2. #set -x
  3. export COMPILER_PATH=./home/thomson/bin
  4. export PATH="./home/bin:./home/lib/gcc-lib/thomson/295.3/:$COMPILER_PATH:$PATH"
  5. b=`basename $0 .c`
  6. bb=`echo $b | tr a-z A-Z`
  7. cp $b.c _$b.c
  8. gcc09 -c -v -Wall -fomit-frame-pointer -O2 -S _$b.c -o $b.s
  9. as09 -l $b.s
  10. gcc -v -Wl,-b,_CODE=0x8000 -fmove-all-movables $b.o -o $bb.BIN -B ./home/lib/gcc-lib/thomson/295.3/ -L./home/thomson/lib/
  11. #gcc -v -Wall -fgcse -fregmove -fmove-all-movables -fexpensive-optimizations -O3 -Wl,-b,_CODE=0xA000 $b.o -o $bb.BIN -B ./home/lib/gcc-lib/thomson/295.3/ -L./home/thomson/lib/
  12. sapfs.exe -c $b.sap
  13. sapfs.exe -a $b.sap $bb.BIN
  14.  
  15. if test ! -f $b.sap; then sapfs.exe -c $b.sap; fi
  16. sapfs.exe -a $b.sap $bb.BIN
  17.  
  18. cmd /c 'C:\Documents and Settings\Administrateur\Mes documents\thomson\teo-1.7.5-winexe\teo\teo.bat' $b.sap -fast
  19. exit
  20. #endif
  21.  
  22. extern void printf(const char *fmt, ...);
  23.  
  24. void bcopy(char *s, char *d,int l) {
  25.   while(l--) *d++ = *s++;
  26. }
  27.  
  28. #ifdef __MC6809__
  29. int div16(int a, int b);
  30. int mod16(int a, int b);
  31. int mul8(unsigned char a, unsigned char b);
  32. int rnd15();
  33. asm("   .area   _CODE
  34.     .globl  _mul8
  35. _mul8:  ldd 2,s
  36.     mul
  37.     rts
  38.  
  39. ; divide D by X, result in D, remainder in U
  40. divi16: pshs    x
  41.     ldx #16
  42.     leau    -16,x
  43. divi1:  rolb
  44.         rola
  45.         exg d,u
  46.         rolb
  47.         rola
  48.         subd    ,s
  49.         bcc divi2
  50.         addd    ,s
  51. divi2:  exg d,u
  52.         leax    -1,x
  53.         bne divi1
  54.         rolb
  55.         rola
  56.         comb
  57.         coma
  58.         puls    x,pc
  59.  
  60.     .globl  _div16
  61. _div16: pshs    x,u
  62.     ldx 8,s
  63.     beq div161
  64.     ldd 6,s
  65.     bge div162
  66.     nega
  67.     negb
  68.     sbca    #0
  69. div162: jsr divi16
  70.     tst 6,s
  71.     bge div161
  72.     nega
  73.     negb
  74.     sbca    #0
  75. div161: puls    x,u,pc
  76.  
  77.     .globl  _mod16
  78. _mod16: pshs    x,u
  79.     ldx 8,s
  80.     beq mod161
  81.     ldd 6,s
  82.     bge mod162
  83.     nega
  84.     negb
  85.     sbca    #0
  86. mod162: jsr divi16
  87.     tfr u,d
  88.     tst 6,s
  89.     bge mod161
  90.     nega
  91.     negb
  92.     sbca    #0
  93. mod161: puls    x,u,pc
  94.  
  95.     .area   _DATA
  96. rnd_s1: .word   9814
  97. rnd_s2: .word   32413
  98. rnd_s3: .word   12312
  99.     .area   _CODE
  100.     .globl  _rnd15
  101. _rnd15: pshs    x,y,u
  102.  
  103.     ldd rnd_s1
  104.     ldx #206
  105.     jsr divi16
  106.     lda #21
  107.     mul
  108.     pshs    d
  109.     tfr u,d
  110.     lda #157
  111.     mul
  112.     subd    ,s++
  113.     bge rnd1
  114.     addd    #32363
  115. rnd1:   std rnd_s1
  116.  
  117.     ldd rnd_s2
  118.     ldx #217
  119.     jsr divi16
  120.     lda #45
  121.     mul
  122.     pshs    d
  123.     tfr u,d
  124.     lda #146
  125.     mul
  126.     subd    ,s++
  127.     bge rnd2
  128.     addd    #31727
  129. rnd2:   std rnd_s2
  130.  
  131.     ldd rnd_s3
  132.     ldx #222
  133.     jsr divi16
  134.     lda #133
  135.     mul
  136.     pshs    d
  137.     tfr u,d
  138.     lda #142
  139.     mul
  140.     subd    ,s++
  141.     bge rnd3
  142.     addd    #31657
  143. rnd3:   std rnd_s3
  144.  
  145.     ldd rnd_s1
  146.     subd    rnd_s2
  147.     cmpd    #706
  148.     bmi rnd4
  149.     subd    #32362
  150. rnd4:   addd    rnd_s3
  151.     bgt rnd5
  152.     addd    #32362
  153.    
  154. rnd5:   puls    x,y,u,pc
  155. ");
  156. #else
  157. int mul8(unsigned char a, unsigned char b) {
  158.   return a*b;
  159. }
  160. int div16(int a, int b) {
  161.   return a/b;
  162. }
  163. int mod16(int a, int b) {
  164.   return a%b;
  165. }
  166. int rnd15() {
  167.   //return rand();
  168.   static int s1 = 9814, s2 = 32413, s3 = 12312;
  169.   int z, k;
  170.  
  171.   k  = s1 / 206;
  172.   s1 = 157 * (s1 - k * 206) - k * 21;
  173.   if(s1 < 0) s1 += 32363;
  174.  
  175.   k  = s2 / 217;
  176.   s2 = 146 * (s2 - k * 217) - k * 45;
  177.   if(s2 < 0) s2 += 31727;
  178.  
  179.   k  = s3 / 222;
  180.   s3 = 142 * (s3 - k * 222) - k * 133;
  181.   if(s3 < 0) s3 += 31657;
  182.  
  183.   z = s1 - s2;
  184.   if(z > 706) z -= 32362;
  185.  
  186.   z += s3;
  187.   if(z<1) z += 32362;
  188.  
  189.   return z;
  190. }
  191. #endif
  192.  
  193. /*
  194.  * Routines arithmetiques point flottant. Format:
  195.  * SEEE EEEM MMMMMMMM
  196.  *
  197.  * flt = (1-2*S)*(1.0 + MMMMMMMMM/512.0)*2^(EEEEE-32)
  198.  * bias = 32
  199.  */
  200.  
  201. // few constants
  202. #define ZERO    0x0000
  203. #define ONE     0x4000
  204. #define TWO 0x4200
  205. #define THREE   0x4300
  206. #define FOUR    0x4400
  207. #define FIVE    0x4480
  208. #define SIX     0x4500
  209. #define SEVEN   0x4580
  210. #define EIGHT   0x4600
  211. #define NINE    0x4640
  212. #define TEN     0x4680
  213. #define I_TWO   0x3e00
  214. #define I_THREE 0x3caa
  215. #define I_FOUR  0x3c00
  216. #define I_FIVE  0x3b33
  217. #define I_SIX   0x3aaa
  218. #define I_SEVEN 0x3a49
  219. #define I_EIGHT 0x3a00
  220. #define I_NINE  0x398e
  221. #define I_TEN   0x3933
  222.  
  223. #define SQRT2   0x40D4
  224.  
  225. #define P_INF   0x7FFF
  226. #define M_INF   0xFFFF
  227.  
  228. #define EPS 0x0200
  229.  
  230. #define fneg(x) ((x)^0x8000)
  231. #define fabs(x) ((x)&0x7fff)
  232.  
  233. int btst(int a, int msk);
  234.  
  235. #ifdef __MC6809__
  236. void _setp(int a, int x, int y);
  237. asm("   .area   _CODE
  238.     .globl  __setp
  239. __setp: pshs    x,y
  240.     lda 7,s
  241.     ldx 8,s
  242.     ldy 10,s
  243.     jsr 0xEC00
  244.     tfr x,d
  245.     puls    x,y,pc
  246. ");
  247. #else
  248. void _setp(int a, int x, int y) {
  249. }
  250. #endif
  251.  
  252. #ifdef __MC6809__
  253. int _ktst();
  254. asm("   .area   _CODE
  255.     .globl  __ktst
  256. __ktst: ldd #0
  257.     jsr 0xE809
  258.     adcb    #0
  259.     rts
  260. ");
  261. #else
  262. int _ktst() {
  263.   return 0;
  264. }
  265. #endif
  266.  
  267. #ifdef __MC6809__
  268. int _getc();
  269. asm("   .area   _CODE
  270.     .globl  __getc
  271. __getc: clra
  272.     jmp 0xE806
  273. ");
  274. #else
  275. int _getc() {
  276.   return 0;
  277. }
  278. #endif
  279.  
  280. #ifdef __MC6809__
  281. void _putc(int c);
  282. asm("   .area   _CODE
  283.     .globl  __putc
  284. __putc: ldb 3,s
  285.     jmp 0xE803
  286. ");
  287. #else
  288. void _putc(int c) {
  289.   printf("%c", c);
  290. }
  291. #endif
  292.  
  293. /*
  294. unsigned char bank_tab[] = {0x0F,0x17,0xE7,0x67,0xA7,0x27};
  295. #ifdef __MC6809__
  296. void _bank(unsigned char no);
  297. asm("   .area   _CODE
  298.     .globl  __bank
  299. __bank: pshs    x,u
  300.     ldu #0xE7C0
  301.     ldb 11,u
  302.     andb    #0xFB
  303.     stb 11,u
  304.     ldx #_bank_tab
  305.     lda 7,s
  306.     lda a,x
  307.     sta 9,u
  308.     orb #4
  309.     stb 11,u
  310.     puls    x,u,pc
  311. ");
  312. #else
  313. void _bank(unsigned char no) {  
  314.   const unsigned char *E7C0 = (void*)0xE7C0;
  315.   E7C0[11] &= ~4;
  316.   E7C0[9]   = bank_tab[no];
  317.   E7C0[11] |= 4;
  318. }
  319. #endif
  320. */
  321.  
  322. #ifdef __MC6809__
  323. void pc(int c);
  324. asm("   .area   _CODE
  325.     .globl  _pc
  326. _pc:    ldb 3,s
  327.     cmpb    #10
  328.     beq pc1
  329. pc0:    jmp 0xE803
  330. pc1:    jsr 0xE803
  331.     ldb #13
  332.     bra pc0
  333. ");
  334. #else
  335. void pc(int c) {
  336.   printf("%c", c);
  337. }
  338. #endif
  339.  
  340. void ps(char *s) {
  341.   while(*s) pc(*s++);
  342. }
  343.  
  344. void px(int v) {
  345.   static char t[] = "0123456789ABCDEF";
  346.   pc(t[(v&0xF000)>>12]);
  347.   pc(t[(v&0x0F00)>>8]);
  348.   pc(t[(v&0x00F0)>>4]);
  349.   pc(t[(v&0x000F)]);
  350. }
  351.  
  352. #ifdef __MC6809__
  353. extern int fsgn(int fp);
  354. asm("   .area   _CODE
  355.     .globl  _fsgn
  356. _fsgn:  lda 2,s
  357.     anda    #0x7E
  358.     beq _fsgn0
  359.     tst 2,s
  360.     bpl _fsgn1
  361.     ldd #-1
  362.     rts
  363. _fsgn1: ldd #1
  364.     rts
  365. _fsgn0: clrb
  366.     rts
  367. ");
  368. #else
  369. int fsgn(int fp) {
  370.   return (fp&0x7E00)?(fp>0?1:-1):0;
  371. }
  372. #endif
  373.  
  374. #define fxadd(a,b) ((a)+(b))
  375. #define fxsub(a,b) ((a)+(b))
  376. #define fxadd3(a,b,c) fxadd(fxadd(a,b),c)
  377.  
  378. #ifdef __MC6809__
  379. int fxmul(int a, int b);
  380. asm("   .area   _CODE
  381.     .globl  _fxmul
  382. _fxmul: ldb 2,s
  383.     eorb    4,s
  384.        pshs    b,x
  385.  
  386.        ldd     5,s
  387.        bge     fxmul1
  388.        nega
  389.        negb
  390.         sbca    #0
  391.         std 5,s
  392. fxmul1: ldd 7,s
  393.        bge     fxmul2
  394.     nega
  395.     negb
  396.     sbca    #0
  397.     std 7,s
  398. fxmul2: ldx     #0
  399.     lda 6,s
  400.     ldb 8,s
  401.     mul
  402.     leax    a,x
  403.  
  404.     lda 5,s
  405.     ldb 8,s
  406.     mul
  407.     leax    d,x
  408.  
  409.        ldd     6,s
  410.     mul
  411.     leax    d,x
  412.  
  413.     lda 5,s
  414.     ldb 6,s
  415.     mul
  416.     tfr b,a
  417.     clrb
  418.     leax    d,x
  419.  
  420.     tfr x,d
  421.     tst ,s+
  422.     bge fxmul3
  423.     nega      
  424.     negb      
  425.     sbca    #0    
  426.  
  427. fxmul3: puls    x,pc
  428. ");
  429. #else
  430. int fxmul(int a, int b) {
  431.   int s = a^b, t;
  432.   if(a==0 || b==0) return 0;
  433.   if(a<0) a=-a; if(b<0) b=-b;
  434.   t = mul8(a,b);
  435.   t+= mul8(a,b>>8) + mul8(a>>8,b);
  436.   t+= mul8(a>>8,b>>8)>>8;
  437.   return s<0?-t:t;
  438. }
  439. #endif
  440.  
  441. #ifdef __MC6809__
  442. int ftofx(int fp);
  443. int ftoi(int fp);
  444. asm("   .area   _CODE
  445.     .globl  _ftoi
  446. _ftoi:  ldd 2,s
  447.     anda    #0x7E
  448.     bne ftoi1
  449.     clrb
  450.     rts
  451. ftoi1:  lsra
  452.     suba    #32+9
  453.     sta ,-s
  454.     bge ftoi2
  455.     lda 3,s
  456.     anda    #1
  457.     ora #2
  458.     lsra
  459.     rorb
  460.     inc ,s
  461.     beq ftoi3
  462.     lsra
  463.     rorb
  464.     lda ,s
  465.     inca
  466.     beq ftoi3
  467. ftoi4:  lsrb
  468.     beq ftoi6
  469.     inca
  470.     bne ftoi4
  471. ftoi6:  clra
  472. ftoi3:  leas    1,s
  473.     tst 2,s
  474.     bgt ftoi5
  475.     nega
  476.     negb
  477.     sbca    #0
  478. ftoi5:  rts
  479.  
  480. ftoi2:  lda 3,s
  481.     anda    #1
  482.     ora #2
  483.     tst ,s
  484.     beq ftoi3
  485.     lslb
  486.     rola
  487.     dec ,s
  488.     beq ftoi3
  489.     lslb
  490.     rola
  491.     dec ,s
  492.     beq ftoi3
  493.     lslb
  494.     rola
  495.     dec ,s
  496.     beq ftoi3
  497.     lslb
  498.     rola
  499.     dec ,s
  500.     beq ftoi3
  501.     lslb
  502.     rola
  503.     dec ,s
  504.     beq ftoi3
  505.     lslb
  506.     rola
  507.     dec ,s
  508.     beq ftoi3
  509.     ldd #0x7FFF
  510.     bra ftoi3
  511.  
  512.     .globl  _ftofx
  513. _ftofx: lda 2,s
  514.     bita    #0x7E
  515.     beq ftofx1
  516.     adda    #16
  517.     sta 2,s
  518.     bra _ftoi
  519. ftofx1: clrb
  520.     rts
  521. ");
  522. #else
  523. int ftoi(int fp) {// conversion fp --> int
  524.   unsigned int a;
  525.   char e;
  526.  
  527.   if(!btst(fp,0x7E00)) return 0;
  528.   e = ((fp>>9)&63)-32-9;
  529.   a = (fp&0x1FF) | 0x200;
  530.   if(e<0) {
  531.     do a>>=1; while(a && ++e);
  532.   } else {
  533.     while(e) {
  534.       if(btst(a,0x8000)) {a=0x7FFF; break;}
  535.       a<<=1;
  536.       --e;
  537.     }
  538.   }
  539.  
  540.   return btst(fp,0x8000)?-a:a;
  541. }
  542. int ftofx(int fp) {
  543.   return ftoi(fmul256(fp))
  544. }
  545. #endif
  546.  
  547. void dbg(int x) {
  548.   printf("%04x: %04x\n", (&x)[-1], x);
  549. }
  550.  
  551. #ifdef __MC6809__
  552. int fxtof(int i);
  553. int itof(int i);
  554. asm("   .area   _CODE
  555.     .globl  _itof
  556. _itof:  pshs    x
  557.     ldx #32+16
  558.     ldd 4,s
  559.     bne itof1
  560.     puls    x,pc
  561. itof1:  bpl itof2
  562.     nega
  563.     negb
  564.     sbca    #0
  565.     leax    64,x
  566. itof2:  leax    -1,x
  567.     lslb
  568.     rola
  569.     bcc itof2
  570.     andb    #128
  571.     leax    d,x
  572.     tfr x,d
  573.     exg a,b
  574.     aslb
  575.     rola
  576.     adcb    #0
  577.     puls    x,pc
  578.     .globl  _fxtof
  579. _fxtof: pshs    x
  580.     ldx #32
  581.     ldd 4,s
  582.     bne fxtof1
  583.     puls    x,pc
  584. fxtof1: bpl fxtof2
  585.     nega
  586.     negb
  587.     sbca    #0
  588.     leax    64,x
  589. fxtof2: leax    -1,x
  590.     lslb
  591.     rola
  592.     bcc fxtof2
  593.     andb    #128
  594.     leax    d,x
  595.     tfr x,d
  596.     exg a,b
  597.     aslb
  598.     rola
  599.     adcb    #0
  600.     puls    x,pc
  601. ");
  602. #else
  603. // conversion int --> fp
  604. int itof(int i) {
  605.   int e = (32+15)<<9, z = 0;
  606.   if(!i) return 0;
  607.   if(i<0) {
  608.     e |= 0x8000;
  609.     i = -i;
  610.   }
  611.   do {
  612.     e-=0x200;
  613.     i<<=1;
  614.   } while(!btst(i,0x8000));
  615.  
  616.   i>>=6;
  617.   i&=0x1FF;
  618.   e |= i;
  619.  
  620.   //  if(z) e |= 0x8000;
  621.  
  622.   return e;
  623. }
  624. int fxtof(int i) {
  625.   return fdiv256(itof(i));
  626. }
  627. #endif
  628.  
  629. int ffrac_msk[] = {0x1FF, 0xFF, 0x7F, 0x3f, 0x1F, 0xF, 0x7, 0x3, 0x1};
  630. #ifdef __MC6809__
  631. extern int ffrac(int i);
  632. asm("   .area   _CODE
  633.     .globl  _ffrac
  634. _ffrac: pshs    x
  635.     ldd 3,s
  636.     anda    #0x7E
  637.     suba    #64
  638.     bpl ffrac1
  639.     lda 3,s
  640.     puls    x,pc
  641. ffrac1: cmpa    #18
  642.     bmi ffrac2
  643.     ldd #0
  644.     puls    x,pc
  645. ffrac2: ldx #_ffrac_msk
  646.     leax    a,x
  647.     lda 3,s
  648.     anda    ,x+
  649.     andb    ,x
  650.     tfr d,x
  651.     lda 3,s
  652.     anda    #0xFE
  653.     clrb
  654.     leax    ,x
  655.     bne ffrac3
  656.     clra
  657.     puls    x,pc
  658. ffrac3: exg d,x
  659. ffrac4: bita    #2
  660.     bne ffrac5
  661.     lslb
  662.     rola
  663.     leax    -0x200,x
  664.     bra ffrac4
  665. ffrac5: anda    #1
  666.     leax    d,x
  667.     tfr x,d
  668.     puls    x,pc   
  669. ");
  670. #else
  671. int ffrac(int f) {
  672.   int e = ((f >> 9) & 63) - 32;
  673.   register unsigned int m;
  674.  
  675.   if(e<0) return f;
  676.   if(e>=9) return 0;
  677.  
  678.   //m = 0x1FF;
  679.   //if(e) m>>=e;
  680.   m = ffrac_msk[e];
  681.   m &= f;
  682.   if(!m) return 0;
  683.  
  684.   f &= 0xfe00;
  685.   e = 0x200;
  686.  
  687.   while((e & m)!=e) {
  688.     m <<= 1;
  689.     f -= 0x200;
  690.   }
  691.   m &= 0x1FF;
  692.  
  693.   return f + m;
  694. }
  695. #endif
  696.  
  697. #ifdef __MC6809__
  698. extern int fmul(int a, int b);
  699. asm("   .area   _CODE
  700.     .globl  _fmul
  701. _fmul:  pshs    x,u
  702.     clrb
  703.     lda 6,s
  704.     anda    #0x7E
  705.     bne fmul1
  706. fmul2:  puls    x,u,pc
  707. fmul1:  tfr d,u
  708.     lda 8,s
  709.     anda    #0x7E
  710.     beq fmul2
  711.     suba    #64
  712.     leau    d,u
  713.  
  714.     lda 6,s
  715.     anda    8,s
  716.     anda    #1
  717.     tfr d,x
  718.  
  719.     lda 6,s
  720.     anda    #1
  721.     beq fmul3
  722.     ldb 9,s
  723.     abx
  724.  
  725. fmul3:
  726.     lda 8,s
  727.     anda    #1
  728.     beq fmul4
  729.     ldb 7,s
  730.     abx
  731.  
  732. fmul4:
  733.     tfr x,d
  734.     lsra
  735.     rorb
  736.     adda    #2
  737.     tfr d,x
  738.  
  739.     ldd 8,s
  740.     anda    #1
  741.     leax    d,x
  742.  
  743.     ldd 6,s
  744.     anda    #1
  745.     leax    d,x
  746.  
  747.     lda 9,s
  748.     mul
  749.     lsra
  750.     leax    a,x
  751.  
  752.     tfr x,d
  753.     bita    #4
  754.     beq fmul5
  755.     lsra
  756.     rorb
  757.     leau    512,u
  758.  
  759. fmul5:  anda    #1
  760.     exg d,u
  761.     anda    #0x7E
  762.     leau    d,u
  763.  
  764.     lda 6,s
  765.     eora    8,s
  766.     anda    #128
  767.     leau    d,u
  768.  
  769.     tfr u,d
  770.     puls    x,u,pc
  771. ");
  772. #else
  773. int fmul(int fa, int fb) {
  774.   register unsigned int t;
  775.   int e;
  776.  
  777.   if(!btst(fa, 0x7E00) || !btst(fb, 0x7E00)) return 0;
  778.  
  779.   e = (fa & 0x7e00) + (fb & 0x7e00) - (32<<9);
  780.  
  781.   t = 1024;
  782.   t += fa & fb & 0x100;
  783.   t += (fa&0x100)?fb&255:0;
  784.   t += (fb&0x100)?fa&255:0;
  785.   t >>= 1;
  786.   t += ((unsigned)((fa&255)*(fb&255)))>>9;
  787.   t += (fa&0x1FF);
  788.   t += (fb&0x1FF);
  789.  
  790.   if(t>=1024) {
  791.     t >>= 1;
  792.     e += 1<<9;
  793.   }
  794.   t &= 0x1ff;
  795.  
  796.   t += e & 0x7E00;
  797.   t += (fa^fb)&0x8000;
  798.  
  799.   return t;
  800. }
  801. #endif
  802.  
  803. int fsqr(int f) {
  804.   return fmul(f, f);
  805. }
  806.  
  807. #ifdef __MC6809__
  808. extern int fmul2(int a);
  809. extern int fdiv2(int a);
  810. extern int fmul4(int a);
  811. extern int fdiv4(int a);
  812. extern int fmul256(int a);
  813. extern int fdiv256(int a);
  814. asm("   .area   _CODE
  815.     .globl  _fmul2
  816. _fmul2: ldd 2,s
  817.     bita    #0x7E
  818.     beq fmul21
  819.     adda    #2
  820. fmul21: rts
  821.  
  822.     .globl  _fdiv2
  823. _fdiv2: ldd 2,s
  824.     bita    #0x7E
  825.     beq fdiv21
  826.     suba    #2
  827. fdiv21: rts
  828.  
  829.     .globl  _fmul4
  830. _fmul4: ldd 2,s
  831.     bita    #0x7E
  832.     beq fmul41
  833.     adda    #4
  834. fmul41: rts
  835.  
  836.     .globl  _fdiv4
  837. _fdiv4: ldd 2,s
  838.     bita    #0x7E
  839.     beq fdiv41
  840.     suba    #4
  841. fdiv41: rts
  842.  
  843.     .globl  _fmul256
  844. _fmul256:
  845.     ldd 2,s
  846.     bita    #0x7E
  847.     beq fmul256
  848.     adda    #16
  849. fmul256:
  850.     rts
  851.  
  852.     .globl  _fdiv256
  853. _fdiv256:
  854.     ldd 2,s
  855.     bita    #0x7E
  856.     beq fdiv256
  857.     suba    #16
  858. fdiv256:
  859.     rts
  860. ");
  861. #else
  862. int fdiv2(int f) {
  863.   return (f&0x7e00)?f-0x200:0;
  864. }
  865. int fmul2(int f) {
  866.   return (f&0x7e00)?f+0x200:0;
  867. }
  868. int fdiv4(int f) {
  869.   return (f&0x7e00)?f-0x400:0;
  870. }
  871. int fmul4(int f) {
  872.   return (f&0x7e00)?f+0x400:0;
  873. }
  874. int fdiv256(int f) {
  875.   return (f&0x7e00)?f-0x1000:0;
  876. }
  877. int fmul256(int f) {
  878.   return (f&0x7e00)?f+0x1000:0;
  879. }
  880. #endif
  881.  
  882. #ifdef __MC6809__
  883. extern int fadd(int a, int b);
  884. extern int fsub(int a, int b);
  885. asm("   .area   _CODE
  886.     .globl  _fsub
  887. _fsub:  lda 4,s
  888.     eora    #128
  889.     sta 4,s
  890.     .globl  _fadd
  891. _fadd:  lda 2,s
  892.     anda    #0x7E
  893.     bne fadd1
  894.     ldd 4,s
  895.     rts
  896. fadd1:  ldb 4,s
  897.     andb    #0x7E
  898.     bne fadd2
  899.     ldd 2,s
  900.     rts
  901. fadd2:  pshs    x
  902.     stb ,-s
  903.     suba    ,s
  904.     asra
  905.     sta ,s
  906.     bpl fadd3
  907.     neg ,s
  908.     ldd 5,s
  909.     ldx 7,s
  910.     stx 5,s
  911.     std 7,s
  912.     lsra
  913.     rorb
  914.     lda #1
  915.     bra fadd10
  916. fadd3:  ldd 7,s
  917.     anda    #1
  918.     ora #2
  919.     tst ,s
  920.     beq fadd4
  921.     lsra
  922.     rorb
  923. fadd10: dec ,s
  924.     beq fadd4
  925.     lsra
  926.     rorb
  927. fadd5:  dec ,s
  928.     beq fadd4
  929.     lsrb
  930.     bne fadd5  
  931. fadd4:  std ,-s
  932.     lda 6,s
  933.     anda    #0xFE
  934.     clrb
  935.     tfr d,x
  936.     eora    8,s
  937.     bmi fadd6
  938.     ldd 6,s ; meme signe
  939.     anda    #1
  940.     ora #2
  941.     addd    ,s++
  942.     bita    #4
  943.     beq fadd7
  944.     lsra
  945.     rorb
  946.     leax    512,x
  947. fadd7:  anda    #1
  948.     leax    d,x
  949.     tfr x,d
  950. fadd8:  puls    x,pc
  951. fadd6:  ldd 6,s ; signe diff
  952.     anda    #1
  953.     ora #2
  954.     subd    ,s++
  955.     beq fadd8
  956.     bpl fadd9
  957.     nega
  958.     negb
  959.     sbca    #0
  960.     leax    0x8000,x
  961. fadd9:  bita    #2
  962.     bne fadd7
  963.     lslb
  964.     rola
  965.     leax    -512,x
  966.     bra fadd9
  967. ");
  968. #else
  969. int fadd(int fa, int fb) {
  970.   int ma, ea;
  971.   int mb, eb;
  972.  
  973.   ea = (fa & 0x7E00);
  974.   if(!ea) return fb;
  975.  
  976.   eb = (fb & 0x7E00);
  977.   if(!eb) return fa;
  978.  
  979.   if(eb>ea) {
  980.     int t;
  981.     t = fb; fb = fa; fa = t;
  982.     t = eb; eb = ea; ea = t;
  983.   }
  984.  
  985.   mb = (fb&0x1FF) | 0x200;
  986.   for(eb -= ea; eb; eb += 0x200) {
  987.     mb >>= 1;
  988.     if(!mb) return fa;
  989.   }
  990.  
  991.   ma = (fa&0x1FF) | 0x200;
  992.   ea = fa & 0xFE00;
  993.  
  994.   if(!btst(fa^fb, 0x8000)) {
  995.     ma += mb;
  996.     if(btst(ma,0x400)) {
  997.       ma >>= 1;
  998.       ea += 0x200;
  999.     }
  1000.   } else {
  1001.     ma -= mb;
  1002.     if(!ma) return 0;
  1003.     if(ma<0) {
  1004.       ma = -ma;
  1005.       ea ^= 0x8000;
  1006.     }
  1007.     while(!btst(ma, 0x200)) {
  1008.       ma <<= 1;
  1009.       ea -= 0x200;
  1010.     }
  1011.   }
  1012.  
  1013.  
  1014.   ma &= 0x1FF;
  1015.   ma |= ea;
  1016.   return ma;
  1017. }
  1018. int fsub(int a, int b) {
  1019.   return fadd(a, b^0x8000);
  1020. }
  1021. #endif
  1022.  
  1023. #define fadd2(x,y)  fadd(x,y)
  1024. #define fadd3(x,y,z)    fadd(fadd(x,y),z)
  1025. #define fadd4(x,y,z,t)  fadd(fadd(x,y),fadd(z,t))
  1026.  
  1027. static unsigned char inv_tab[] = {
  1028.   254, 252, 250, 248, 246, 244, 242, 240, 238, 236, 234, 232, 230, 228, 226, 224, 223, 221, 219, 217, 215, 213, 211, 210, 208, 206, 204, 202, 201, 199, 197, 195, 193, 192, 190, 188, 186, 185, 183, 181, 180, 178, 176, 174, 173, 171, 169, 168, 166, 164, 163, 161, 159, 158, 156, 155, 153, 151, 150, 148, 146, 145, 143, 142, 140, 139, 137, 135, 134, 132, 131, 129, 128, 126, 125, 123, 122, 120, 119, 117, 116, 114, 113, 111, 110, 108, 107, 105, 104, 102, 101, 100, 98, 97, 95, 94, 92, 91, 90, 88, 87, 85, 84, 83, 81, 80, 78, 77, 76, 74, 73, 72, 70, 69, 68, 66, 65, 64, 62, 61, 60, 58, 57, 56, 55, 53, 52, 51, 49, 48, 47, 46, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 31, 30, 28, 27, 26, 25, 23, 22, 21, 20, 19, 18, 16, 15, 14, 13, 12, 11, 9, 8, 7, 6, 5, 4, 3, 1, 0, 255, 254, 253, 252, 251, 250, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 176, 175, 174, 173, 172, 171, 170, 169, 168, 168, 167, 166, 165, 164, 163, 162, 161, 161, 160, 159, 158, 157, 156, 155, 155, 154, 153, 152, 151, 150, 149, 149, 148, 147, 146, 145, 145, 144, 143, 142, 141, 140, 140, 139, 138, 137, 136, 136, 135, 134, 133, 132, 132, 131, 130, 129, 128, 128, 127, 126, 125, 125, 124, 123, 122, 121, 121, 120, 119, 118, 118, 117, 116, 115, 115, 114, 113, 112, 112, 111, 110, 109, 109, 108, 107, 106, 106, 105, 104, 104, 103, 102, 101, 101, 100, 99, 99, 98, 97, 96, 96, 95, 94, 94, 93, 92, 92, 91, 90, 89, 89, 88, 87, 87, 86, 85, 85, 84, 83, 83, 82, 81, 81, 80, 79, 79, 78, 77, 77, 76, 75, 75, 74, 73, 73, 72, 71, 71, 70, 69, 69, 68, 67, 67, 66, 66, 65, 64, 64, 63, 62, 62, 61, 60, 60, 59, 59, 58, 57, 57, 56, 56, 55, 54, 54, 53, 52, 52, 51, 51, 50, 49, 49, 48, 48, 47, 46, 46, 45, 45, 44, 43, 43, 42, 42, 41, 41, 40, 39, 39, 38, 38, 37, 36, 36, 35, 35, 34, 34, 33, 32, 32, 31, 31, 30, 30, 29, 29, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0};
  1029.  
  1030. int finv(int fa) {
  1031.   int e = 0;
  1032.  
  1033.   if(btst(fa,0x7E00)==0) return P_INF|(fa&0x8000);
  1034.  
  1035.   e = 0x8000 - (fa&0x7E00);
  1036.   if(btst(fa,0x1FF)) {
  1037.     e |= inv_tab[(fa&0x1FF)-1];
  1038.     if((fa&0x1FF)<=170) e |= 0x100;
  1039.     e -= 0x200;
  1040.   }
  1041.  
  1042.   return (fa&0x8000) | e;
  1043. }
  1044.  
  1045. int fdiv(int a, int b) {
  1046.   if(!b) return a<0?P_INF:M_INF;
  1047.   return fmul(a, finv(b));
  1048. }
  1049.  
  1050. static unsigned char tab_sqrt[] = {
  1051.     0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 67, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 75, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 90, 90, 90, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, 98, 98, 99, 99, 100, 100, 101, 101, 101, 102, 102, 103, 103, 103, 104, 104, 105, 105, 106, 106, 106, 107, 107, 108, 108, 108, 109, 109, 110, 110, 110, 111, 111, 112, 112, 113, 113, 113, 114, 114, 115, 115, 115, 116, 116, 117, 117, 117, 118, 118, 119, 119, 119, 120, 120, 121, 121, 121, 122, 122, 123, 123, 123, 124, 124, 125, 125, 125, 126, 126, 127, 127, 128, 128, 128, 129, 129, 129, 130, 130, 131, 131, 131, 132, 132, 133, 133, 133, 134, 134, 135, 135, 135, 136, 136, 137, 137, 137, 138, 138, 139, 139, 139, 140, 140, 141, 141, 141, 142, 142, 143, 143, 143, 144, 144, 144, 145, 145, 146, 146, 146, 147, 147, 148, 148, 148, 149, 149, 150, 150, 150, 151, 151, 151, 152, 152, 153, 153, 153, 154, 154, 155, 155, 155, 156, 156, 156, 157, 157, 158, 158, 158, 159, 159, 160, 160, 160, 161, 161, 161, 162, 162, 163, 163, 163, 164, 164, 164, 165, 165, 166, 166, 166, 167, 167, 167, 168, 168, 169, 169, 169, 170, 170, 170, 171, 171, 172, 172, 172, 173, 173, 173, 174, 174, 175, 175, 175, 176, 176, 176, 177, 177, 178, 178, 178, 179, 179, 179, 180, 180, 181, 181, 181, 182, 182, 182, 183, 183, 183, 184, 184, 185, 185, 185, 186, 186, 186, 187, 187, 187, 188, 188, 189, 189, 189, 190, 190, 190, 191, 191, 192, 192, 192, 193, 193, 193, 194, 194, 194, 195, 195, 195, 196, 196, 197, 197, 197, 198, 198, 198, 199, 199, 199, 200, 200, 201, 201, 201, 202, 202, 202, 203, 203, 203, 204, 204, 204, 205, 205, 206, 206, 206, 207, 207, 207, 208, 208, 208, 209, 209, 209, 210, 210, 211, 211, 211};
  1052.  
  1053. int fsqrt(int a) {
  1054.   int e = ((a & 0x7e00)>>1) + (16<<9) + tab_sqrt[a&0x1FF];
  1055.   if(btst(e, 256)) {
  1056.     e &= ~256;
  1057.     e = fmul(e, SQRT2);
  1058.   }
  1059.   //printf("sqrt(%04x) = %04x\n", a, e);
  1060.   return e;
  1061. }
  1062.  
  1063. int fcmp(int a, int b) {
  1064.   return fsgn(fsub(a,b));
  1065. }
  1066.  
  1067. int atofp(char *s) {
  1068.   int f = 0;
  1069.   int sgn = 0;
  1070.   if(*s=='-') {
  1071.     ++s;
  1072.     sgn = 0x8000;
  1073.   }
  1074.   while(*s>='0' && *s<='9') {
  1075.     f = fmul(f, TEN);
  1076.     f = fadd(f, itof(*s++ - '0'));
  1077.   }
  1078.   if(*s=='.') {
  1079.     int r = I_TEN;
  1080.     ++s;
  1081.  
  1082.     while(*s>='0' && *s<='9') {
  1083.       f = fadd(f, fmul(r, itof(*s++ - '0')));
  1084.       r = fmul(r, I_TEN);
  1085.     }
  1086.   }
  1087.   if(*s=='E' || *s=='e') {
  1088.     int e = 0;
  1089.     ++s;
  1090.     while(*s>='0' && *s<='9') {
  1091.       e += e<<2; e <<= 1; e += *s++ - '0';
  1092.     }
  1093.     while(e) {
  1094.       f = fmul(f, TEN);
  1095.       --e;
  1096.     }
  1097.   }
  1098.   return f|sgn;
  1099. }
  1100.  
  1101. char *ftoa(char *buf, int f) {
  1102.   char *s=buf;
  1103.   int t;
  1104.  
  1105.   if(btst(f,0x7e00)==0) {
  1106.     *s++ = '0'; *s = 0;
  1107.     return buf;
  1108.   }
  1109.   if(btst(f,0x8000)) {
  1110.     *s++ = '-';
  1111.     f &= 0x7FFF;
  1112.   }
  1113.  
  1114.   t = ftoi(f);
  1115.    
  1116.   if(t>=10000) {
  1117.     *s++ = '0' + (t/10000);
  1118.     t = t % 10000;
  1119.   }
  1120.   if(t>=1000) {
  1121.     *s++ = '0' + (t/1000);
  1122.     t = t % 1000;
  1123.   }
  1124.   if(t>=100) {
  1125.     *s++ = '0' + (t/100);
  1126.     t = t % 100;
  1127.   }
  1128.   if(t>=10) {
  1129.     *s++ = '0' + (t/10);
  1130.     t = t % 10;
  1131.   }
  1132.   *s++ = '0' + t;
  1133.  
  1134.   f = ffrac(f);
  1135.   if(f) {
  1136.     *s++ = '.';
  1137.  
  1138.     t = ftoi(fmul(f, itof(1000)));
  1139.  
  1140.     *s++ = '0' + (t/100);
  1141.     t = t % 100;
  1142.     *s++ = '0' + (t/10);
  1143.     t = t % 10;
  1144.     *s++ = '0' + t;
  1145.     /*
  1146.     *s++ = '0' + ftoi(f=fmul(f, TEN)); f=ffrac(f);
  1147.     *s++ = '0' + ftoi(f=fmul(f, TEN)); f=ffrac(f);
  1148.     *s++ = '0' + ftoi(f=fmul(f, TEN)); f=ffrac(f);
  1149.     *s++ = '0' + ftoi(f=fmul(f, TEN));
  1150.     */
  1151.   }
  1152.  
  1153.   *s='\0';
  1154.   return buf;
  1155. }
  1156.  
  1157. int frnd() {
  1158.   int r = itof(rnd15());
  1159.   r = fdiv(r, itof(32767));
  1160.   return r;
  1161. }
  1162.  
  1163. //////////////////////////////////////////////////////////////////////////
  1164.  
  1165. typedef unsigned char byte;
  1166.  
  1167. #define VRAM ((byte*)0x4000)
  1168. #define PRC  (*((byte*)0xE7C3))
  1169.  
  1170. void hline(byte *line, byte x0, byte x1, byte c);
  1171. void tria_line(int x0, int y0, int x1, int y1);
  1172.  
  1173. #define ____ 0
  1174. #define ___X 1
  1175. #define __X_ 2
  1176. #define __XX 3
  1177. #define _X__ 4
  1178. #define _X_X 5
  1179. #define _XX_ 6
  1180. #define _XXX 7
  1181. #define X___ 8
  1182. #define X__X 9
  1183. #define X_X_ 10
  1184. #define X_XX 11
  1185. #define XX__ 12
  1186. #define XX_X 13
  1187. #define XXX_ 14
  1188. #define XXXX 15
  1189.  
  1190. #define C(a,b,c,d,e,f,g,h,i,j,k,l) a*16+b,c*16+d,e*16+f,g*16+h,i*16+j,k*16+l
  1191.  
  1192. byte t_char2[] = {
  1193.   ____*16+____,
  1194.   ____*16+XXXX,
  1195.   XXXX*16+____,
  1196.   XXXX*16+XXXX
  1197. };
  1198. byte t_char[] = {
  1199.   C(____, _X__,
  1200.     ____, _X__,
  1201.     ____, _X__,
  1202.     ____, ____,
  1203.     ____, _X__,
  1204.     ____, ____),
  1205.  
  1206.   C(X_X_, X_X_,
  1207.     X_X_, XXXX,
  1208.     ____, X_X_,
  1209.     ____, XXXX,
  1210.     ____, X_X_,
  1211.     ____, ____),
  1212.  
  1213.   C(_X__, X_X_,
  1214.     XXX_, __X_,
  1215.     XX__, _X__,
  1216.     _XX_, X___,
  1217.     XXX_, X_X_,
  1218.     _X__, ____),
  1219.  
  1220.   C(_X__, __X_,
  1221.     XX_X, _X__,
  1222.     _XX_, ____,
  1223.     X_X_, ____,
  1224.     _X_X, ____,
  1225.     ____, ____),
  1226.  
  1227.   C(__X_, _X__,
  1228.     _X__, __X_,
  1229.     _X__, __X_,
  1230.     _X__, __X_,
  1231.     __X_, _X__,
  1232.     ____, ____),
  1233.  
  1234.   C(____, ____,
  1235.     X_X_, _X__,
  1236.     _X__, XXX_,
  1237.     X_X_, _X__,
  1238.     ____, ____,
  1239.     ____, ____),
  1240.  
  1241.   C(____, ____,
  1242.     ____, ____,
  1243.     ____, XXX_,
  1244.     __X_, ____,
  1245.     _X__, ____,
  1246.     ____, ____),
  1247.  
  1248.   C(____, __X_,
  1249.     ____, __X_,
  1250.     ____, _X__,
  1251.     ____, X___,
  1252.     _X__, X___,
  1253.     ____, ____),
  1254.  
  1255.   C(XXX_, __X_,
  1256.     X_X_, __X_,
  1257.     X_X_, __X_,
  1258.     X_X_, __X_,
  1259.     XXX_, __X_,
  1260.     ____, ____),
  1261.  
  1262.   C(XXX_, XXX_,
  1263.     __X_, __X_,
  1264.     XXX_, _XX_,
  1265.     X___, __X_,
  1266.     XXX_, XXX_,
  1267.     ____, ____),
  1268.  
  1269.   C(X_X_, XXX_,
  1270.     X_X_, X___,
  1271.     XXX_, XXX_,
  1272.     __X_, __X_,
  1273.     __X_, XXX_,
  1274.     ____, ____),
  1275.  
  1276.   C(XXX_, XXX_,
  1277.     X___, __X_,
  1278.     XXX_, __X_,
  1279.     X_X_, __X_,
  1280.     XXX_, __X_,
  1281.     ____, ____),
  1282.  
  1283.   C(XXX_, XXX_,
  1284.     X_X_, X_X_,
  1285.     XXX_, XXX_,
  1286.     X_X_, __X_,
  1287.     XXX_, XXX_,
  1288.     ____, ____),
  1289.  
  1290.   C(____, ____,
  1291.     __X_, __X_,
  1292.     ____, ____,
  1293.     __X_, __X_,
  1294.     ____, _X__,
  1295.     ____, ____),
  1296.  
  1297.   C(__X_, ____,
  1298.     _X__, XXX_,
  1299.     X___, ____,
  1300.     _X__, XXX_,
  1301.     __X_, ____,
  1302.     ____, ____),
  1303.  
  1304.   C(X___, XX__,
  1305.     _X__, __X_,
  1306.     __X_, _X__,
  1307.     _X__, ____,
  1308.     X___, _X__,
  1309.     ____, ____),
  1310.  
  1311.   C(_X__, _X__,
  1312.     X_X_, X_X_,
  1313.     XXX_, XXX_,
  1314.     X_X_, X_X_,
  1315.     _XXX, X_X_,
  1316.     ____, ____),
  1317.  
  1318.   C(XX__, _XX_,
  1319.     X_X_, X___,
  1320.     XX__, X___,
  1321.     X_X_, X___,
  1322.     XXX_, _XX_,
  1323.     ____, ____),
  1324.  
  1325.   C(XX__, XXX_,
  1326.     X_X_, X___,
  1327.     X_X_, XX__,
  1328.     X_X_, X___,
  1329.     XX__, XXX_,
  1330.     ____, ____),
  1331.  
  1332.   C(XXX_, _XX_,
  1333.     X___, X___,
  1334.     XX__, X_X_,
  1335.     X___, X_X_,
  1336.     X___, _XX_,
  1337.     ____, ____),
  1338.  
  1339.   C(X_X_, XXX_,
  1340.     X_X_, _X__,
  1341.     XXX_, _X__,
  1342.     X_X_, _X__,
  1343.     X_X_, XXX_,
  1344.     ____, ____),
  1345.  
  1346.   C(_XXX, X_X_,
  1347.     __X_, X_X_,
  1348.     __X_, XX__,
  1349.     X_X_, X_X_,
  1350.     _X__, X_X_,
  1351.     ____, ____),
  1352.  
  1353.   C(X___, X_X_,
  1354.     X___, XXX_,
  1355.     X___, XXX_,
  1356.     X___, X_X_,
  1357.     XXX_, X_X_,
  1358.     ____, ____),
  1359.  
  1360.   C(X_X_, _X__,
  1361.     XXX_, X_X_,
  1362.     XXX_, X_X_,
  1363.     XXX_, X_X_,
  1364.     X_X_, _X__,
  1365.     ____, ____),
  1366.  
  1367.   C(XX__, _X__,
  1368.     X_X_, X_X_,
  1369.     XX__, X_X_,
  1370.     X___, X_X_,
  1371.     X___, _XXX,
  1372.     ____, ____),
  1373.  
  1374.   C(XX__, _XX_,
  1375.     X_X_, X___,
  1376.     XX__, _X__,
  1377.     X_X_, __X_,
  1378.     X_X_, XX__,
  1379.     ____, ____),
  1380.  
  1381.   C(XXX_, X_X_,
  1382.     _X__, X_X_,
  1383.     _X__, X_X_,
  1384.     _X__, X_X_,
  1385.     _X__, XXX_,
  1386.     ____, ____),
  1387.  
  1388.   C(X_X_, X_X_,
  1389.     X_X_, X_X_,
  1390.     X_X_, XXX_,
  1391.     X_X_, XXX_,
  1392.     _X__, _XX_,
  1393.     ____, ____),
  1394.  
  1395.   C(X_X_, X_X_,
  1396.     X_X_, X_X_,
  1397.     _X__, XXX_,
  1398.     X_X_, _X__,
  1399.     X_X_, _X__,
  1400.     ____, ____),
  1401.  
  1402.   C(XXX_, XXX_,
  1403.     __X_, X___,
  1404.     _X__, X___,
  1405.     X___, X___,
  1406.     XXX_, XXX_,
  1407.     ____, ____),
  1408.  
  1409.   C(X___, XXX_,
  1410.     X___, __X_,
  1411.     _X__, __X_,
  1412.     __X_, __X_,
  1413.     __X_, XXX_,
  1414.     ____, ____),
  1415.  
  1416.   C(_X__, ____,
  1417.     X_X_, ____,
  1418.     ____, ____,
  1419.     ____, ____,
  1420.     ____, ____,
  1421.     ____, XXXX)
  1422. };
  1423.  
  1424. byte *pchar(byte *p, byte c, byte *forme, byte *fond) {
  1425.   byte *msk, *prc = (byte*)0xE7C3, v;
  1426.  
  1427.   if(c>='a' && c<='z') c += 'A' - 'a';
  1428.   if(c<' ') c = ' '; else if(c>'_') c = '_';
  1429.   c -= ' ';
  1430.  
  1431.   msk = &t_char[(c&~1) + ((c&~1)<<1)];
  1432.   if(c&1) {
  1433.     v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1434.     v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1435.     v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1436.     v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1437.     v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1438.     v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1439.  
  1440.     ++*prc;
  1441.  
  1442.     p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1443.     p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1444.     p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1445.     p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1446.     p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1447.     p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1448.  
  1449.     ++*prc;
  1450.   } else {
  1451.     v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1452.     v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1453.     v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1454.     v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1455.     v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1456.     v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
  1457.  
  1458.     ++*prc;
  1459.  
  1460.     p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1461.     p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1462.     p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1463.     p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1464.     p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1465.     p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
  1466.  
  1467.     ++*prc;
  1468.   }
  1469.   return ++p;
  1470. }
  1471.  
  1472. byte forme[] = {0xBB,0xDD,0xFF,0xFF,0xDD,0xBB};
  1473. byte fond[] =  {0x00,0x00,0x00,0x00,0x00,0x00};
  1474.  
  1475. void pstr(char *s, byte x, byte y, byte *forme, byte *fond) {
  1476.   byte *p;
  1477.   p = (byte*)0x4000+x+mul8(y,240);
  1478.   *(byte*)0xE7C3 |= 1;
  1479.   while(*s) p = pchar(p, *s++, forme, fond);
  1480. }
  1481.  
  1482. #ifdef __MC6809__
  1483. extern void pset(byte x, byte y, byte col);
  1484. extern void pset2(byte x, byte y, byte col1, byte col2);
  1485. asm("   .area   _CODE
  1486.     .globl  _pset
  1487. _pset:  pshs    x
  1488.     ldx #0x4000
  1489.     lda 5,s
  1490.     ldb #40
  1491.     mul
  1492.     leax    d,x
  1493.     ldb 4,s
  1494.     lsrb   
  1495.     bcs pset1
  1496.     lda 6,s
  1497.     lsla
  1498.     lsla
  1499.     lsla
  1500.     lsla
  1501.     sta ,-s
  1502.     lda #15
  1503.     sta ,-s
  1504.     bra pset2
  1505. pset1:  lda 6,s
  1506.     sta ,-s
  1507.     lda #240
  1508.     sta ,-s
  1509. pset2:  lda 0xE7C3
  1510.     ora #1
  1511.     lsrb
  1512.     sbca    #0
  1513.     sta 0xE7C3
  1514.     abx
  1515.     lda ,x
  1516.     anda    ,s+
  1517.     ora ,s+
  1518.     sta ,x
  1519.     puls    x,pc
  1520.  
  1521.     .globl  _pset2
  1522. _pset2: pshs    x
  1523.     ldx #0x4000
  1524.     lda 5,s
  1525.     ldb #40
  1526.     mul
  1527.     leax    d,x
  1528.     ldb 4,s
  1529.     lsrb   
  1530.     bcs pset3
  1531.     lda 7,s
  1532.     lsla
  1533.     lsla
  1534.     lsla
  1535.     lsla
  1536.     sta ,-s
  1537.     lda #15
  1538.     sta ,-s
  1539.     lda 8,s
  1540.     lsla
  1541.     lsla
  1542.     lsla
  1543.     lsla
  1544.     sta ,-s
  1545.     lda #15
  1546.     sta ,-s
  1547.     bra pset4
  1548. pset3:  lda 7,s
  1549.     sta ,-s
  1550.     lda #240
  1551.     sta ,-s
  1552.     lda 8,s
  1553.     sta ,-s
  1554.     lda #240
  1555.     sta ,-s
  1556. pset4:  lda 0xE7C3
  1557.     ora #1
  1558.     lsrb
  1559.     sbca    #0
  1560.     sta 0xE7C3
  1561.     abx
  1562.     lda ,x
  1563.     anda    ,s+
  1564.     ora ,s+
  1565.     sta ,x
  1566.     leax    40,x
  1567.     lda ,x
  1568.     anda    ,s+
  1569.     ora ,s+
  1570.     sta ,x
  1571.     puls    x,pc
  1572. ");
  1573. #else
  1574. void pset(byte x, byte y, byte col) {
  1575. }
  1576. void pset2(byte x, byte y, byte col1, byte col2) {
  1577. }
  1578. #endif
  1579.  
  1580. #ifdef __MC6809__
  1581. void line(/*9*/int x0, /*11*/int y0, /*13*/int x1, /*15*/int y1, /*17*/byte col);
  1582. asm("   .area   _CODE
  1583.     .globl  _line
  1584. line2:  puls    x,y,u,dp,pc
  1585. _line:  lda 10,s
  1586.     lsla
  1587.     lsla
  1588.     lsla
  1589.     lsla
  1590.     ora 10,s
  1591.     sta 10,s
  1592.     pshs    x,y,u,dp
  1593.     leay    9,s
  1594.     ldd 4,y
  1595.     subd    ,y
  1596.     bge line1
  1597.     nega
  1598.     negb
  1599.     sbca    #0
  1600.     ldx ,y
  1601.     ldu 4,y
  1602.     stu ,y
  1603.     stx 4,y
  1604.     ldx 2,y
  1605.     ldu 6,y
  1606.     stx 6,y
  1607.     stu 2,y
  1608. line1:  tfr d,u
  1609.     ldx 4,y
  1610.     blt line2
  1611.     ldx ,y
  1612.     cmpx    #160
  1613.     bge line2
  1614.     ldx #0x2841
  1615.     ldd 6,y
  1616.     subd    2,y
  1617.     bge line4
  1618.     nega
  1619.     negb
  1620.     sbca    #0
  1621.     ldx #0xd85f
  1622. line4:  exg x,d ; d=d8ff u=dx x=dy
  1623.     tfr a,dp
  1624.     stu ,--s
  1625.     cmpx    ,s++
  1626.     lbgt    line5
  1627.  
  1628. ; dy<=dx
  1629.     stx line11-9    ; dy
  1630.     stu line11-4    ; dx
  1631.     stb line11-1    ; sy (u)
  1632.     tfr u,d
  1633.     lsra
  1634.     rorb
  1635.     ldx ,y
  1636.     leay    1,u
  1637.     ldu 11,s
  1638.  
  1639. line6:  cmpu    #200
  1640.     bhs line7
  1641. line10: cmpx    #160
  1642.     blo line8
  1643. line7:  leax    1,x
  1644.     subd    #1234
  1645.     bge line11
  1646.     addd    #1234
  1647.     leau    1,u
  1648. line11: leay    -1,y
  1649.     bne line6
  1650.     puls    x,y,u,dp,pc
  1651.  
  1652. line8:  pshs    d,y
  1653.  
  1654.     ldd line11-9    ; dy
  1655.     std line16-12
  1656.  
  1657.     ldd line11-4    ; dx
  1658.     std line16-7
  1659.  
  1660.     ldb line11-1    ; sy
  1661.     stb line16-1
  1662.  
  1663.     lda #0xE7
  1664.     exg a,dp
  1665.     sta line16-3    ; sp
  1666.  
  1667.     lda 17+4,s  ; recopie pour
  1668.     sta ,-s ; acces rapide
  1669.  
  1670.     tfr x,d
  1671.     lda #15
  1672.     lsrb
  1673.     bcc line12
  1674.     coma
  1675. line12: sta ,-s
  1676.     lda #0x40
  1677.     lsrb  
  1678.     tfr d,y
  1679.     lda *0xC3
  1680.     ora #1
  1681.     sbca    #0
  1682.     sta *0xC3
  1683.     tfr u,d
  1684.     lda #40
  1685.     mul
  1686.     leay    d,y
  1687. line13: ldd ,s
  1688.     com ,s
  1689.     anda    ,y
  1690.     andb    ,s
  1691.     sta ,y
  1692.     orb ,y
  1693.     stb ,y
  1694.     tst ,s
  1695.     bmi line14
  1696.     lda *0xC3
  1697.     inca
  1698.     sta *0xC3
  1699.     anda    #1
  1700.     leay    a,y
  1701. line14: leax    1,x
  1702.     cmpx    #160
  1703.     bge line17
  1704.     ldd 2,s
  1705.     subd    #1234   ; dy=l16-12
  1706.     bge line15
  1707.     addd    #5678   ; dx=l16-7
  1708.     leay    40,y    ; sp=l16-3
  1709.     leau    -1,u    ; sy=l16-1
  1710. line16: cmpu    #200
  1711.     bhs line17
  1712. line15: std 2,s
  1713.     dec 5,s
  1714.     bne line13
  1715. line17: leas    6,s
  1716.     puls    x,y,u,dp,pc
  1717.  
  1718. line5:  stx line22+8    ; dy
  1719.     stu line22+3    ; dx
  1720.     stb line22+1    ; sy (u)
  1721.     tfr x,d
  1722.     lsra
  1723.     rorb
  1724.     leay    1,x
  1725.     ldx 9,s
  1726.     ldu 11,s
  1727.  
  1728. line20: cmpx    #160
  1729.     bhs line22
  1730. line21: cmpu    #200
  1731.     blo line24
  1732. line22: leau    1,u
  1733.     subd    #1234
  1734.     bge line23
  1735.     addd    #1234
  1736.     leax    1,x
  1737. line23: leay    -1,y
  1738.     bne line20
  1739.     puls    x,y,u,dp,pc
  1740.  
  1741. line24: pshs    d,y
  1742.  
  1743.     ldb line22+1    ; sy
  1744.     stb line27+1
  1745.  
  1746.     ldd line22+3    ; dx
  1747.     std line27+6
  1748.  
  1749.     ldd line22+8    ; dy
  1750.     std line27+11
  1751.  
  1752.     lda #0xE7
  1753.     exg a,dp
  1754.     sta line27+4
  1755.  
  1756.     lda 17+4,s  ; recopie pour
  1757.     sta ,-s ; acces rapide
  1758.  
  1759.     tfr x,d
  1760.     lda #15
  1761.     lsrb
  1762.     bcc line25
  1763.     coma
  1764. line25: sta ,-s
  1765.     lda #0x40
  1766.     lsrb  
  1767.     tfr d,y
  1768.     lda *0xC3
  1769.     ora #1
  1770.     sbca    #0
  1771.     sta *0xC3
  1772.     tfr u,d
  1773.     lda #40
  1774.     mul
  1775.     leay    d,y
  1776. line26: cmpu    #200
  1777.     bhs line29
  1778.     lda ,s
  1779.     ldb ,s
  1780.     comb
  1781.     anda    ,y
  1782.     andb    1,s
  1783.     sta ,y
  1784.     orb ,y
  1785.     stb ,y
  1786.     ldd 2,s
  1787. line27: leau    1,u
  1788.     leay    40,y   
  1789.     subd    #1234
  1790.     bge line28
  1791.     addd    #5678
  1792.     com ,s
  1793.     bmi line30
  1794.     sta ,-s
  1795.     lda *0xC3
  1796.     inca
  1797.     sta *0xC3
  1798.     anda    #1
  1799.     leay    a,y
  1800.     lda ,s+
  1801. line30: leax    1,x
  1802.     cmpx    #160
  1803.     bge line29
  1804. line28: std 2,s
  1805.     dec 5,s
  1806.     bne line26
  1807. line29: leas    6,s
  1808.     puls    x,y,u,dp,pc
  1809. ");
  1810. #else
  1811. void line(int x0, int y0, int x1, int y1, byte col) {
  1812.   int dx, dy, i, c, sy, sp;
  1813.  
  1814.   dx = x1 - x0;
  1815.   if(dx<0) {
  1816.     int t;
  1817.     dx = -dx;
  1818.     t = x0; x0 = x1; x1 = t;
  1819.     t = y0; y0 = y1; y1 = t;
  1820.   }
  1821.   // sx = 1
  1822.   if(x1<0 || x0>159) return;
  1823.  
  1824.   dy = y1 - y0;
  1825.   if(dy<0) {
  1826.     dy = -dy;
  1827.     sp = -40; sy = -1;
  1828.   } else {
  1829.     sp = +40; sy = +1;
  1830.   }
  1831.    
  1832.   // on itere jusqu'a ce que x0,y0 soit dans la fenetre
  1833.   if(dx>=dy) {
  1834.     c = dx>>1; i = dx + 1;
  1835.     for(;i && (((unsigned)y0>=200u) || ((unsigned)x0>=160u));--i) {
  1836.       ++x0;
  1837.       if((c-=dy)<0) {c+=dx; y0+=sy;}
  1838.     }
  1839.   } else {
  1840.     c = dy>>1; i = dy + 1;
  1841.     for(;i && (((unsigned)y0>=200u) || ((unsigned)x0>=160u));--i) {
  1842.       y0 += sy;
  1843.       if((c-=dx)<0) {c+=dy; ++x0;}
  1844.     }
  1845.   }
  1846.   if(!i) return;
  1847.  
  1848.   // on itere tant que x0,y0 est dans la fenetre
  1849.   {
  1850.     byte *p, *prc = (void*)0xe7c3, m = 0x0F, d;
  1851.     col |= col<<4;
  1852.     if(((byte)x0)&1) m=~m;
  1853.     if(((byte)x0)&2) {*prc &= 254; d = 0;} else {*prc |= 1; d = 1;}
  1854.  
  1855.     p = (void*)(0x4000 + mul8(y0,40) + (x0>>2));
  1856.  
  1857.     if(dx>=dy) {
  1858.       for(;i && ((unsigned)y0<200u);--i) {
  1859.     *p &= m; m = ~m; *p |= col&m;
  1860.     if(!(m&128)) {++*prc; p += (d^=1);}
  1861.     ++x0; if(x0>159) return;
  1862.     if((c-=dy)<0) {c+=dx; y0+=sy; p+=sp;}
  1863.       }
  1864.     } else {
  1865.       for(;i && ((unsigned)y0<200u);--i) {
  1866.     *p = (*p & m) | (col & ~m);
  1867.     p += sp; y0 += sy;
  1868.     if((c-=dx)<0) {
  1869.       c+=dy; m = ~m; if(!(m&128)) {++*prc; p += (d^=1);}
  1870.       ++x0; if(x0>159) return;
  1871.     }
  1872.       }
  1873.     }
  1874.   }
  1875. }
  1876. #endif
  1877.  
  1878. byte tria_buf[400]; //min-max
  1879. #ifdef __MC6809__
  1880. void triangle(int x0, int y0, int x1, int y1, int x2, int y2, byte c) ;
  1881. asm("   .area   _CODE
  1882.     .globl  _triangle
  1883. _triangle:
  1884.     pshs    x,y,u
  1885.     ldx #161<<8
  1886.     ldu #_tria_buf
  1887.     cmpx    ,u
  1888.     beq tria2
  1889.     lda #200
  1890. tria1:  stx ,u++
  1891.     deca
  1892.     bne tria1
  1893. tria2:  leay    8,s
  1894.  
  1895.     ldx 2,y
  1896.     cmpx    6,y
  1897.     ble tria3
  1898.     ldu 6,y
  1899.     stx 6,y
  1900.     stu 2,y
  1901.  
  1902.     ldx ,y
  1903.     ldu 4,y
  1904.     stx 4,y
  1905.     stu ,y
  1906.     ldx 2,y
  1907.  
  1908. tria3:  cmpx    10,y
  1909.     ble tria4
  1910.     ldu 10,y
  1911.     stx 10,y
  1912.     stu 2,y
  1913.  
  1914.     ldx ,y
  1915.     ldu 8,y
  1916.     stx 8,y
  1917.     stu ,y
  1918.  
  1919. tria4:  ldx 6,y
  1920.     cmpx    10,y
  1921.     ble tria5
  1922.     ldu 10,y
  1923.     stx 10,y
  1924.     stu 6,y
  1925.  
  1926.     ldx 4,y
  1927.     ldu 8,y
  1928.     stx 8,y
  1929.     stu 4,y
  1930.  
  1931. tria5:  ldx 10,y
  1932.     bge tria7
  1933. tria6:  puls    x,y,u,pc
  1934. tria7:  ldx 2,y
  1935.     cmpx    #200
  1936.     bge tria6
  1937.  
  1938.     ldx ,y
  1939.     leax    1,x
  1940.     stx ,y
  1941.     ldx 4,y
  1942.     leax    1,x
  1943.     stx 4,y
  1944.     ldx 8,y
  1945.     leax    1,x
  1946.     stx 8,y
  1947.  
  1948.     ldu 10,y
  1949.     pshs    x,u
  1950.     ldu 6,y
  1951.     ldx 4,y
  1952.     pshs    x,u
  1953.     jsr _tria_line
  1954.     ldu 2,y
  1955.     ldx ,y
  1956.     pshs    x,u
  1957.     jsr _tria_line
  1958.     leas    8,s
  1959.     pshs    x,u
  1960.     jsr _tria_line
  1961.     leas    3,s
  1962.  
  1963.     ldx 10,y
  1964.     cmpx    #199
  1965.     ble tria8
  1966.     ldx #199
  1967.     stx 10,y
  1968. tria8:  lda 12,y
  1969.     lsla
  1970.     lsla
  1971.     lsla
  1972.     lsla
  1973.     ora 12,y
  1974.     sta 4,s
  1975.     ldu #_tria_buf
  1976.     ldd 2,y
  1977.     bgt tria9
  1978.     leay    1,x
  1979.     ldx #0x4000
  1980.     bra tria11
  1981. tria9:  lslb
  1982.     rola
  1983.     leau    d,u
  1984.     ldb 3,y
  1985.     lda #40
  1986.     mul
  1987.     adda    #0x40
  1988.     tfr d,x
  1989.     ldd 10,y
  1990.     subd    2,y
  1991.     ldy #1
  1992.     leay    d,y
  1993. tria11: ldd ,u
  1994.     cmpb    ,u
  1995.     blo tria12
  1996.     std 2,s
  1997.     stx ,s
  1998.     jsr _hline
  1999.     leax    40,x
  2000.     ldb #161
  2001.     stb ,u+
  2002.     clr ,u+
  2003.     leay    -1,y
  2004.     bne tria11
  2005. tria12: leas    5,s
  2006.     puls    x,y,u,pc
  2007. ");
  2008. #else
  2009. void triangle(int x0, int y0, int x1, int y1, int x2, int y2, byte c) {
  2010.   int t, l;
  2011.  
  2012.   byte *v, *p;
  2013.  
  2014.   // initialize
  2015.   if(tria_buf[0]!=161) {
  2016.     int t, val = 161u<<8, *pp;
  2017.     for(pp=(int*)tria_buf, t=200; t; --t) *pp++ = val;
  2018.   }
  2019.  
  2020.   // ensure y0 <= y1 <= y2
  2021.   if(y0>y1) {t=y0;y0=y1;y1=t; t=x0;x0=x1;x1=t;}
  2022.   if(y0>y2) {t=y0;y0=y2;y2=t; t=x0;x0=x2;x2=t;}
  2023.   if(y1>y2) {t=y1;y1=y2;y2=t; t=x1;x1=x2;x2=t;}
  2024.  
  2025.   // test if nothing is to be displayed
  2026.   if(y2<0 || y0>=200) return;
  2027.  
  2028.   // offset
  2029.   ++x0; ++x1; ++x2;
  2030.  
  2031.   // compute min/max for each line
  2032.   tria_line(x1,y1, x2,y2);
  2033.   tria_line(x0,y0, x1,y1);
  2034.   tria_line(x0,y0, x2,y2);
  2035.  
  2036.  
  2037.   // draw triangle
  2038.   if(y2>199) y2 = 199;
  2039.   if(y0>=0) {
  2040.     v = VRAM + mul8(40,y0);
  2041.     p = tria_buf + y0 + y0;
  2042.     l = y2-y0;
  2043.   } else {
  2044.     v = VRAM;
  2045.     p = tria_buf;
  2046.     l = y2;
  2047.   }
  2048.   l = l + 1;
  2049.  
  2050.   c |= c<<4;
  2051.   while(p[0]<=p[1]) {
  2052.     //printf("%d %d\n", p[0], p[1]);
  2053.     hline(v,p[0],p[1],c);
  2054.     v+=40; *p++ = 161; *p++ = 0;
  2055.     if(!--l) break;
  2056.   }
  2057. }
  2058. #endif
  2059.  
  2060. #ifdef __MC6809__
  2061. asm("   .area   _CODE
  2062.     .globl  _hline
  2063. _hline: pshs    x,dp
  2064.     lda #0xE7
  2065.     tfr a,dp
  2066.     ldb 8,s
  2067.     beq hline1
  2068.     decb
  2069.     lda 7,s
  2070.     beq hline2
  2071.     deca
  2072. hline2: cmpa    #160
  2073.     beq hline1
  2074.     cmpb    #160
  2075.     bne hline3
  2076.     ldb #159
  2077. hline3: sta ,-s
  2078.     subb    ,s
  2079.     stb ,s
  2080.     ldx 6,s
  2081.     ldb #15
  2082.     lsra
  2083.     bcc hline4
  2084.     comb
  2085. hline4: stb ,-s
  2086.     ldb *0xC3
  2087.     orb #1
  2088.     lsra   
  2089.     sbcb    #0
  2090.     stb *0xC3
  2091.     leax    a,x
  2092.     lda 1,s
  2093.     bne hline5
  2094. hlin12: lda ,s
  2095.     ldb ,s
  2096.     coma
  2097.     anda    11,s
  2098.     andb    ,x
  2099.     stb ,x
  2100.     ora ,x
  2101.     sta ,x
  2102.     leas    2,s
  2103. hline1: puls    x,dp,pc
  2104. hline5: inca
  2105.     ldb ,s
  2106.     bpl hline6
  2107.     ldb ,x
  2108.     andb    #0xF0
  2109.     stb ,x
  2110.     ldb #0x0F
  2111.     stb ,s
  2112.     andb    11,s
  2113.     orb ,x
  2114.     stb ,x
  2115.     ldb *0xC3
  2116.     incb
  2117.     stb *0xC3
  2118.     andb    #1
  2119.     abx
  2120.     deca
  2121. hline6: suba    #4
  2122.     bcs hline9
  2123.     ldb *0xC3
  2124.     lsrb
  2125.     ldb 11,s
  2126.     bcc hline7
  2127. hlin10: stb ,x
  2128.     inc *0xC3
  2129.     stb ,x+
  2130.     inc *0xC3
  2131.     suba    #4
  2132.     bcc hlin10
  2133.     bra hline9
  2134. hline7: stb ,x+
  2135.     inc *0xC3
  2136.     stb ,x
  2137.     inc *0xC3
  2138.     suba    #4
  2139.     bcc hline7
  2140. hline9: ldb 11,s
  2141.     bita    #2
  2142.     beq hlin11
  2143.     stb ,x
  2144.     ldb *0xC3
  2145.     incb
  2146.     stb *0xC3
  2147.     andb    #1
  2148.     abx
  2149. hlin11: bita    #1
  2150.     bne hlin12
  2151.     leas    2,s
  2152.     puls    x,dp,pc
  2153. ");
  2154. #else
  2155. void hline(byte *line, byte x0, byte x1, byte c) {
  2156.   byte len, msk, dlt;
  2157.   register byte *prc /*asm("y")*/ = &PRC;
  2158.  
  2159.   if(x1==0)   return;
  2160.   if(x0==161) return;
  2161.  
  2162.   if(x0) --x0;
  2163.   if(x1==161) x1=159; else --x1;
  2164.  
  2165.   //printf("%d->%d\n",x0&255,x1&255); return;
  2166.  
  2167.   //c |= c<<4;
  2168.  
  2169.   //if(x1<x0) {len = x0 - x1; x0 = x1;} else
  2170.   len = x1 - x0;
  2171.  
  2172.   msk = 0xF0 ^ ((x0&1)-1);
  2173.   if(x0&2) {*prc &= 254; dlt = 0;} else {*prc |= 1; dlt = 1;}
  2174.  
  2175.   line += x0>>2;
  2176.  
  2177.   if(len==0) {
  2178.     *line = (*line & msk) | (c & ~msk);
  2179.     return;
  2180.   }
  2181.  
  2182.   ++len;
  2183.  
  2184.   if(msk & 128) {
  2185.     *line = (*line & 240) | (c & 15);
  2186.     msk = ~msk; ++*prc; line += (dlt ^= 1);
  2187.     --len;
  2188.   }
  2189.  
  2190.   if(dlt) {
  2191.     for(;len>=4; len-=4) {
  2192.       *line = c; ++*prc; *line++ = c; ++*prc;
  2193.     }
  2194.     dlt=0;
  2195.   } else {
  2196.     for(;len>=4; len-=4) {
  2197.       *line++ = c; ++*prc; *line = c; ++*prc;
  2198.     }
  2199.     dlt = 1;
  2200.   }
  2201.  
  2202.   if(len&2) {
  2203.     *line = c; ++*prc; line += dlt;
  2204.   }
  2205.  
  2206.   if(len&1) *line = (*line & msk) | (c & ~msk);
  2207. }
  2208. #endif
  2209.  
  2210. #ifdef __MC6809__
  2211. asm("   .area   _CODE
  2212.     .globl  _tria_line
  2213. _tria_line:
  2214.     ldd 4,s
  2215.     cmpd    #199
  2216.     ble trial1
  2217.     rts
  2218. trial1: pshs    x,y,u
  2219.     leay    8,s
  2220.  
  2221.     ldu #_tria_buf
  2222.     lslb
  2223.     rola
  2224.     leau    d,u
  2225.  
  2226.     ldx #0x3001
  2227.  
  2228.     ldd 6,y
  2229.     subd    2,y
  2230.     pshs    d
  2231.    
  2232.     ldd 4,y
  2233.     subd    ,y
  2234.     bge trial3
  2235.     nega
  2236.     negb
  2237.     sbca    #0
  2238.     ldx #0x301f
  2239.  
  2240. trial3: cmpd    ,s
  2241.     blt trial8
  2242.  
  2243.     stx trial4
  2244.     ldx ,s
  2245.     stx trial4+3
  2246.     std trial4+8
  2247.     addd    #1
  2248.     std ,s
  2249.     lsra
  2250.     rorb
  2251.     ldx ,y
  2252.     ldy 2,y
  2253. trial7: cmpy    #0
  2254.     blt trial4
  2255.     bsr tria_pset
  2256. trial4: leax    -1,x
  2257.     subd    #1234
  2258.     bge trial5
  2259.     addd    #4567
  2260.     leau    2,u
  2261.     leay    1,y
  2262.     cmpy    #200
  2263.     bge trial6
  2264. trial5: dec 1,s
  2265.     bne trial7
  2266.     dec ,s
  2267.     bge trial7
  2268. trial6: puls    d,x,y,u,pc
  2269.  
  2270. tria_pset:
  2271.     pshs    d
  2272.     tfr x,d
  2273.     cmpx    #0
  2274.     bge triap1
  2275.     clrb
  2276.     bra triap2
  2277. triap1: cmpx    #161
  2278.     blt triap2
  2279.     ldb #161
  2280. triap2: cmpb    ,u
  2281.     bhs triap3
  2282.     stb ,u
  2283. triap3: cmpb    1,u
  2284.     bls triap4
  2285.     stb 1,u
  2286. triap4: puls    d,pc
  2287.  
  2288. trial8: stx tril11-2
  2289.     std tril11-9
  2290.     ldx ,s
  2291.     stx tril11-4
  2292.     ldd 6,y
  2293.     cmpd    #199
  2294.     ble tril8
  2295.     ldd #199
  2296. tril8:  subd    2,y
  2297.     addd    #1
  2298.     std ,s
  2299.     tfr x,d
  2300.     lsra
  2301.     rorb
  2302.     ldx ,y
  2303.     ldy 2,y
  2304. trial9: cmpy    #0
  2305.     blt tril10
  2306.     bsr tria_pset
  2307. tril10: leau    2,u
  2308.     leay    1,y
  2309.     subd    #1234
  2310.     bge tril11
  2311.     addd    #4567
  2312.     leax    1,x
  2313. tril11: dec 1,s
  2314.     bne trial9
  2315.     dec ,s
  2316.     bge trial9
  2317.     puls    d,x,y,u,pc
  2318. ");
  2319. #else
  2320. void tria_pset(byte *p, int x0);
  2321.  
  2322. void tria_line(int x0, int y0, int x1, int y1) {
  2323.   byte *p;
  2324.   // par construction y0 <= y1
  2325.   int dx, dy = y1 - y0, i;
  2326.   int sx; int c;
  2327.  
  2328.   if(y0>199) return;
  2329.  
  2330.   p = tria_buf + y0 + y0;
  2331.   dx = x1 - x0;
  2332.   sx = +1;
  2333.   if(dx<0) {
  2334.     dx = -dx;
  2335.     sx = -1;
  2336.   }
  2337.  
  2338.   if(dx>=dy) {
  2339.     c = dx>>1; i = dx + 1;
  2340.     for(;i;--i) {
  2341.       if(y0>=0)
  2342.     tria_pset(p,x0);
  2343.       x0+=sx;
  2344.       if((c-=dy)<0) {
  2345.     c+=dx;
  2346.     p+=2;
  2347.     ++y0;
  2348.     if(y0>=200) return;
  2349.       }
  2350.     }
  2351.   } else {
  2352.     c = dy>>1;
  2353.     if(y1>199) y1=199;
  2354.     for(i = y1 - y0 + 1; i; --i) {
  2355.       if(y0>=0)
  2356.     tria_pset(p, x0);
  2357.       p+=2; ++y0;
  2358.       if((c-=dx)<0) {c+=dy; x0+=sx;}
  2359.     }
  2360.   }
  2361. }
  2362.  
  2363. void tria_pset(byte *p, int x0) {
  2364.   if(x0<0)    x0   = 0; else
  2365.   if(x0>160)  x0   = 161;
  2366.   if(x0<p[0]) p[0] = x0;
  2367.   if(x0>p[1]) p[1] = x0;
  2368. }
  2369. #endif
  2370.  
  2371. int btst(int a, int msk) {
  2372.   return a & msk;
  2373. }
  2374.  
  2375. /////////////////////////////////////////////////////////////////////////////
  2376.  
  2377. typedef struct {
  2378.   unsigned int x;
  2379.   unsigned int y;
  2380.   unsigned int z;
  2381. } point;
  2382.  
  2383. #define DEG        6
  2384. #define COTE       (1<<DEG)
  2385. #define COTE_DIV_2 (COTE>>1)
  2386.  
  2387. #define T_OFFSET   100
  2388. static int K,iMAX,iCOTE;
  2389. static byte tab[(COTE+1)*(COTE+1)] = {
  2390.   // $ tail +5 france3.ppm  | less | perl -e 'while(<>) {@a=(split, -1, -1, -1); for($i=0;$a[$i]>=0;$i=$i+3) {print "$a[$i], ";};print "\n";}' >france.h
  2391. #include "france.h"
  2392. };
  2393.  
  2394. static point P0, Pl, Pe;
  2395. static int P[3][3], Q, N, N5;
  2396.  
  2397. byte STEP = 1;
  2398. byte use_map = 1;
  2399. byte use_stars = 1;
  2400. byte no_z = 0;
  2401. byte col_mode = 2;
  2402. byte tri_mode = 2;
  2403.  
  2404. #define T(x,y) (*(tab+(x)+(y)+((y)<<DEG)))
  2405. //#define T(x,y) (*(tab+(x)+mul8(y,COTE+1)))
  2406.  
  2407. int pt_norm(point *p) {
  2408.   return fsqrt(fadd3(fsqr(p->x), fsqr(p->y), fsqr(p->z)));
  2409. }
  2410.  
  2411. point *pt_diff(point *r, point *p, point *q) {
  2412.   r->x = fsub(p->x, q->x);
  2413.   r->y = fsub(p->y, q->y);
  2414.   r->z = fsub(p->z, q->z);
  2415.   return r;
  2416. }
  2417.  
  2418. void pt_normalize(point *p) {
  2419.   int r = pt_norm(p);
  2420.   if(r) {
  2421.     p->x = fdiv(p->x, r);
  2422.     p->y = fdiv(p->y, r);
  2423.     p->z = fdiv(p->z, r);
  2424.   }
  2425. }
  2426.  
  2427. int pt_dist(point *p, point *q) {
  2428.   int t = 0;
  2429.   t = fadd(t, fsqr(fsub(p->x, q->x)));
  2430.   t = fadd(t, fsqr(fsub(p->y, q->y)));
  2431.   t = fadd(t, fsqr(fsub(p->z, q->z)));
  2432.   return fsqrt(t);
  2433. }
  2434.  
  2435. int fpr(char *p, int f) {
  2436.   //static char buf[16];
  2437.   ps(p);
  2438.   px(f);
  2439.   pc('\n');
  2440.   //printf(ftoa(&buf[0], f));
  2441.   //printf(" (%04x)\n", f);
  2442.   //printf("X0=%04x\n", P0.x);
  2443.   return 0;
  2444. }
  2445.  
  2446. int RAYON = 40;
  2447. int THETA = 16;
  2448. int RHO   = 8;
  2449.  
  2450. int my_sin(int i) {
  2451.   unsigned char tab[32] = {
  2452.     0,12,25,37,49,62,74,86,97,109,120,131,142,152,162,171,181,189,197,205,212,219,225,231,236,241,244,248,251,253,254,255
  2453.   };
  2454.  
  2455.   if(i<0) return fneg(my_sin(-i));
  2456.   i &= 127;
  2457.   if(i==32) return ONE;
  2458.   if(i>=64) return fneg(my_sin(i-64));
  2459.   if(i>32) i = 64-i;
  2460.   return fdiv256(itof(tab[i]));
  2461. }
  2462.  
  2463. int my_cos(int i) {
  2464.   return my_sin(32+i);
  2465. }
  2466.  
  2467. void init_points() {
  2468.   iCOTE = fdiv(itof(40),itof(COTE));
  2469.  
  2470.   {
  2471.     int g = itof(RAYON);
  2472.     int f = fmul(g, my_cos(RHO));
  2473.     P0.x = fmul(f,my_cos(THETA));
  2474.     P0.y = fmul(f,my_sin(THETA));
  2475.     P0.z = fmul(g,my_sin(RHO));  
  2476.   }
  2477.  
  2478.   //P0.x = itof(21);
  2479.   //P0.y = itof(11);
  2480.   //P0.z = itof(11);  
  2481.   //fpr("X0=",P0.x);
  2482.   //fpr("Y0=",P0.y);
  2483.   //fpr("Z0=",P0.z);
  2484.  
  2485.   K = (32767*0.3);
  2486.   //fpr("K =",K);
  2487.  
  2488.   Pl.x = fadd(ONE,I_TWO); //ZERO;
  2489.   Pl.y = fadd(ONE,I_THREE); //ONE;
  2490.   Pl.z = fadd(ONE,ZERO); //I_TWO;
  2491.   //fpr("Xl=",Pl.x);
  2492.   //fpr("Yl=",Pl.y);
  2493.   //fpr("Zl=",Pl.z);
  2494.  
  2495.   Pe.x = fdiv2(P0.x); //fadd(fdiv2(P0.x),itof(0));
  2496.   Pe.y = fdiv2(P0.y); //fadd(fdiv2(P0.y),itof(-1));
  2497.   Pe.z = fdiv2(P0.z); //fmul(fmul(FIVE,P0.z),I_EIGHT);
  2498.   //fpr("Xe=",Pe.x);
  2499.   //fpr("Ye=",Pe.y);
  2500.   //fpr("Ze=",Pe.z);
  2501.  
  2502.   pt_normalize(&Pl);
  2503. }
  2504.  
  2505.  
  2506. void init_trans() {
  2507.   Q = fsqrt(fadd(fsqr(fsub(P0.x, Pe.x)), fsqr(fsub(P0.y, Pe.y))));
  2508.   N = pt_dist(&Pe, &P0);
  2509.   if(fsgn(Q)==0) Q = EPS;
  2510.   if(fsgn(N)==0) N = EPS;
  2511.   N5 = fmul(FIVE, N);
  2512.   //fpr("Q=", Q);
  2513.   //fpr("N=", N);
  2514.  
  2515.   P[0][0] = fdiv(fsub(P0.x, Pe.x), N);
  2516.   P[0][1] = fdiv(fsub(P0.y, Pe.y), N);
  2517.   P[0][2] = fdiv(fsub(P0.z, Pe.z), N);
  2518.   P[1][0] = fdiv(fsub(Pe.y, P0.y), Q);
  2519.   P[1][1] = fdiv(fsub(P0.x, Pe.x), Q);
  2520.   P[1][2] = 0;
  2521.   P[2][0] = fneg(fmul(P[0][2],P[1][1]));
  2522.   P[2][1] = fmul(P[0][2],P[1][0]);
  2523.   P[2][2] = fdiv(Q, N);
  2524.  
  2525.   //fpr("P00=", P[0][0]);
  2526.   //fpr("P01=", P[0][1]);
  2527.   //fpr("P02=", P[0][2]);
  2528. }
  2529.  
  2530. void proj(point *p, int *x, int *y) {
  2531.   int tx = fsub(p->x, Pe.x);
  2532.   int ty = fsub(p->y, Pe.y);
  2533.   int tz = fsub(p->z, Pe.z);
  2534.   int xa = fadd3(fmul(tx,P[0][0]), fmul(ty, P[0][1]), fmul(tz, P[0][2]));
  2535.   int ya = //fadd3(fmul(tx,P[1][0]), fmul(ty, P[1][1]), fmul(tz, P[1][2]));
  2536.     fadd2(fmul(tx,P[1][0]), fmul(ty, P[1][1]));
  2537.   int za = fadd3(fmul(tx,P[2][0]), fmul(ty, P[2][1]), fmul(tz, P[2][2]));
  2538.   int f;
  2539.   f = fdiv(N5,fsub(N,xa));
  2540.   *x =  80 + ftoi(      fmul(ya, f));
  2541.   *y = 100 - ftoi(fmul2(fmul(za, f)));
  2542.   //printf("tx=%04x, ty=%04x, tz=%04x\n", tx, ty, tz);
  2543.   //printf("xa=%04x, ya=%04x, za=%04x\n", xa, ya, za);
  2544.   //printf("sub(%04x, %04x)=%04x\n", N,xa, fsub(N,xa));
  2545.   //printf("f=%04x, x=%04x y=%04x z=%04x N=%04x\n", f, xa, ya, za, N);
  2546.   //printf("x=%d, y=%d\n", *x, *y);
  2547. }
  2548.  
  2549. void pstr_(char *s, point *p) {
  2550.   int x,y;
  2551.   proj(p,&x,&y);
  2552.  
  2553.   p = (byte*)0x4000+(x>>2)+mul8(y,40);
  2554.   *(byte*)0xE7C3 |= 1;
  2555.   while(*s) p = pchar(p, *s++, forme, fond);
  2556. }
  2557.  
  2558. void clear_T() {
  2559.   int i;
  2560.   for(i=sizeof(tab)/sizeof(tab[0]); i;) tab[--i] = T_OFFSET;
  2561. }
  2562.  
  2563. int  G(byte i, byte j);
  2564. void S(byte i, byte j, int v, byte s);
  2565.  
  2566. void init_france() {
  2567.  {
  2568.     byte max = 1, i;
  2569.     for(i=0; i<=COTE; ++i) {
  2570.       byte j;
  2571.       for(j=0; j<=COTE;++j) {
  2572.     int t = T(i,j);
  2573.     T(i,j) = t<=0 ? 0 : t;
  2574.     if(t>max) max = t;
  2575.       }
  2576.     }
  2577.  
  2578.     //printf("max=%d\n", max);
  2579.     //exit(0);
  2580.  
  2581.     iMAX = fdiv(TEN, itof(max));
  2582.     //fpr("MAX=", MAX);
  2583.     //exit(0);
  2584.   }
  2585. }
  2586.  
  2587. void init_T() {
  2588.   {
  2589.     byte d=COTE, s=0, i;
  2590.     for(i=DEG; i; --i) {
  2591.       byte x;
  2592.       d >>= 1; ++s;
  2593.       for(x=d; x<=COTE; x+=d+d) {
  2594.     byte y;
  2595.     for(y=d; y<=COTE; y+=d+d) {
  2596.       int G1 = G(x-d,y-d)+G(x-d,y+d);
  2597.       int G2 = G(x+d,y-d)+G(x+d,y+d);
  2598.       S(x,y,  (G1+G2)>>2, s);
  2599.       G1>>=1; G2>>=1;
  2600.       S(x-d,y, G1, s);
  2601.       S(x+d,y, G2, s);
  2602.       S(x,y-d, G1, s);
  2603.       S(x,y+d, G2, s);
  2604.     }
  2605.       }
  2606.     }
  2607.   }
  2608.  
  2609.   //printf("normalizing...");
  2610.   {
  2611.     byte max = 1, i;
  2612.     for(i=0; i<=COTE; ++i) {
  2613.       byte j;
  2614.       for(j=0; j<=COTE;++j) {
  2615.     int t = T(i,j) - T_OFFSET;
  2616.     T(i,j) = t<=0 ? 0 : t;
  2617.     if(t>max) max = t;
  2618.       }
  2619.     }
  2620.  
  2621.     //printf("max=%d\n", max);
  2622.     //exit(0);
  2623.  
  2624.     iMAX = fdiv(TEN, itof(max));
  2625.     //fpr("MAX=", MAX);
  2626.     //exit(0);
  2627.   }
  2628.  
  2629.   //printf("\r                    \r");
  2630. }
  2631.  
  2632. int G(byte i, byte j) {
  2633.   return T(i,j);
  2634. }
  2635.  
  2636. void S(byte i, byte j, int v, byte s) {
  2637.   int t = (rnd15() - K)>>8;
  2638.   while(s) {t>>=1;--s;}
  2639.   T(i,j) = v + t;
  2640. }
  2641.  
  2642. int coul_flat(int h) {
  2643.   static byte c[] = {
  2644.     /* 0 */ 1,
  2645.  
  2646.     /* 1 */ 2,
  2647.     /* 2 */ 3,
  2648.     /* 3 */ 4,
  2649.  
  2650.     /* 4 */ 5,
  2651.     /* 5 */ 6,
  2652.     /* 6 */ 7,
  2653.     /* 7 */ 8,
  2654.     /* 8 */ 9,
  2655.  
  2656.     /* 9 */  9,
  2657.     /* 10 */ 10,
  2658.     /* 11 */ 10,
  2659.  
  2660.     /* 12 */ 11,
  2661.     /* 13 */ 12,
  2662.     /* 14 */ 13,
  2663.     /* 15 */ 14,
  2664.     /* 16 */ 15
  2665.   };
  2666.   return c[(ftoi(fmul(iMAX,itof(h)))+1)>>1];  
  2667. }
  2668.  
  2669. /*
  2670. void disp_over() {
  2671.   byte i;
  2672.  
  2673.   _putc(12);
  2674.  
  2675.   for(i=0; i<200; ++i) {
  2676.     pset(mod16(rnd15(),160), mod16(rnd15(),200), 11+mod16(rnd15(),5));
  2677.   }
  2678.  
  2679.   for(i=0;i<COTE;++i) {
  2680.     byte j;
  2681.     for(j=0;j<COTE;++j) {
  2682.       int s = T(i+1,j)+T(i,j+1);
  2683.       pset2(j, i<<1,
  2684.         coul_flat(s+T(i+0,j+0)),
  2685.         coul_flat(s+T(i+1,j+1)));
  2686.     }
  2687.   }
  2688. }
  2689. */
  2690.  
  2691. void disp_over() {
  2692.   byte *prc = (byte*)0xE7C3;
  2693.   byte *p=(byte*)0x4000;
  2694.   byte j;
  2695.  
  2696.   _putc(12);
  2697.  
  2698.   if(use_stars)
  2699.     for(j=200; j; --j) {
  2700.       pset(mod16(rnd15(),160), mod16(rnd15(),200), 11+mod16(rnd15(),5));
  2701.     }
  2702.  
  2703.   if(!use_map) return;
  2704.  
  2705.   *prc|=1;
  2706.   for(j=0; j<COTE; j+=2) {
  2707.     byte i;
  2708.     for(i=0;i<COTE;++i) {
  2709.       int s1 = T(i+1,j)   + T(i+0,j+1);
  2710.       int s2 = T(i+1,j+1) + T(i+1,j+2);
  2711.       {
  2712.     byte c;
  2713.     c  = coul_flat(s1+T(i+0,j+0))<<4;
  2714.     c |= coul_flat(s2+T(i+0,j+1));
  2715.     *p = c; p+=40;
  2716.       }
  2717.       {
  2718.     byte c;
  2719.     c  = coul_flat(s1+T(i+1,j+1))<<4;
  2720.     c |= coul_flat(s2+T(i+1,j+2));
  2721.     *p = c; p+=40;
  2722.       }
  2723.     }
  2724.     ++*prc; p-=80*COTE;
  2725.     if(1 & *prc) ++p;
  2726.   }
  2727. }
  2728.  
  2729. point *get_pt(point *res, int i, int j) {
  2730.   res->x = fmul(iCOTE, itof(i-COTE_DIV_2));
  2731.   res->y = fmul(iCOTE, itof(j-COTE_DIV_2));
  2732.   res->z = fmul(iMAX,  itof(T(i,j)));
  2733.   return res;
  2734. }
  2735.  
  2736. void angle(point *p1, point *p2, point *p3, int *p, int *q) {
  2737.   int xu = fsub(p2->x, p1->x);
  2738.   int yu = fsub(p2->y, p1->y);
  2739.   int zu = fsub(p2->z, p1->z);
  2740.  
  2741.   int xv = fsub(p3->x, p1->x);
  2742.   int yv = fsub(p3->y, p1->y);
  2743.   int zv = fsub(p3->z, p1->z);
  2744.  
  2745.   int xn = fsub(fmul(yu,zv), fmul(zu, yv));
  2746.   int yn = fsub(fmul(zu,xv), fmul(zv, xu));
  2747.   int zn = fsub(fmul(xu,yv), fmul(yu, xv));
  2748.  
  2749.   int r = fsqrt(fadd3(fsqr(xn),fsqr(yn),fsqr(zn)));
  2750.   if(fsgn(r)==0) r = EPS;
  2751.   r = finv(r);
  2752.  
  2753.   xn = fmul(xn,r);
  2754.   yn = fmul(yn,r);
  2755.   zn = fmul(zn,r);
  2756.  
  2757.   *p = fadd3(fmul(xn, Pl.x),
  2758.          fmul(yn, Pl.y),
  2759.          fmul(zn, Pl.z));
  2760.   *q = fadd3(fmul(xn, fsub(P0.x, p1->x)),
  2761.          fmul(yn, fsub(P0.y, p1->y)),
  2762.          fmul(zn, fsub(P0.z, p1->z)));
  2763. }
  2764.  
  2765. int coul(point *p1, point *p2, point *p3) {
  2766.   int p, q, col;
  2767.  
  2768.   angle(p1,p2,p3, &p, &q);
  2769.  
  2770.   if(!fsgn(p1->z) && !fsgn(p2->z) && !fsgn(p3->z))
  2771.     col = 1;
  2772.   else if(fsgn(p)<=0 || fsgn(q)<0)
  2773.     col = 0;
  2774.   else {
  2775.     // 1 - ARCCOS(x)/(PI/2)
  2776.     static byte conv[256] = {
  2777.     0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 39, 39, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 63, 64, 64, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 72, 73, 73, 74, 75, 75, 76, 77, 78, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 89, 89, 90, 91, 92, 92, 93, 94, 95, 95, 96, 97, 98, 98, 99, 100, 101, 102, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 120, 121, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 159, 160, 161, 162, 163, 164, 166, 167, 168, 169, 171, 172, 173, 174, 176, 177, 179, 180, 181, 183, 184, 186, 187, 189, 191, 192, 194, 196, 198, 199, 201, 203, 205, 208, 210, 212, 215, 217, 220, 223, 227, 231, 235, 241};
  2778.     int zi = fadd3(p1->z, p2->z, p3->z);
  2779.     zi = ftoi(fmul256(fmul(zi, I_THREE)));
  2780.     //if(p<0) p = 0;
  2781.     p  = ftoi(fmul256(p));
  2782.     if(p>=256) p = 256; else p = conv[p];
  2783.     if(0) {}
  2784.     else if(zi<=(int)(2.5*256)) col = 2 + (p>>7);
  2785.     else if(zi<=(int)(7.5*256)) col = 5 + (p>>6) + (p>>8);
  2786.     else col = 11 + (p>>6);
  2787.   }
  2788.   return col;
  2789. }
  2790.  
  2791. void face(point *p1, point *p2, point *p3) {
  2792.   int x1, y1, x2, y2, x3, y3, col = coul(p1,p2,p3);
  2793.  
  2794.   proj(p1, &x1, &y1);
  2795.   proj(p2, &x2, &y2);
  2796.   proj(p3, &x3, &y3);
  2797.  
  2798.   triangle(x1, y1, x2, y2, x3, y3, col);
  2799.   printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
  2800. }
  2801.  
  2802. void tri_wire(int x1, int y1, int x2, int y2, int x3, int y3, byte c) {
  2803.   line(x1,y1,x2,y2,c);
  2804.   line(x1,y1,x3,y3,c);
  2805.   line(x2,y2,x3,y3,c);
  2806. }
  2807.  
  2808. void facette00(int i, int j, int di, int dj) {
  2809.   point p1, p2, p3;
  2810.   int x1, y1, x2, y2, x3, y3, col = 1;
  2811.  
  2812.   get_pt(&p1, i, j);
  2813.   get_pt(&p2, i+di, j);
  2814.   get_pt(&p3, i, j+dj);
  2815.    
  2816.   switch(col_mode) {
  2817.   case 0:
  2818.     col = 4;
  2819.     break;
  2820.   case 1:
  2821.     col = coul_flat(T(i,j)+T(i+di,j)+T(i,j+dj));
  2822.     break;
  2823.   case 2:
  2824.     col = coul(&p1,&p2,&p3);
  2825.     break;
  2826.   }
  2827.   if(no_z) {
  2828.     int z1 = p1.z, z2 = p2.z, z3 = p3.z;
  2829.     p1.z = p2.z = p3.z = 0;
  2830.     proj(&p1, &x1, &y1);
  2831.     proj(&p2, &x2, &y2);
  2832.     proj(&p3, &x3, &y3);
  2833.     p1.z = z1; p2.z = z2; p3.z = z3;
  2834.   } else {
  2835.     proj(&p1, &x1, &y1);
  2836.     proj(&p2, &x2, &y2);
  2837.     proj(&p3, &x3, &y3);
  2838.   }
  2839.   switch(tri_mode) {
  2840.   case 0:
  2841.     tri_wire(x1, y1, x2, y2, x3, y3, col);
  2842.     break;
  2843.   case 1:
  2844.     triangle(x1, y1, x2, y2, x3, y3, 0);
  2845.     tri_wire(x1, y1, x2, y2, x3, y3, col);
  2846.     break;
  2847.   case 2:
  2848.     triangle(x1, y1, x2, y2, x3, y3, col);
  2849.     break;
  2850.   }
  2851.   //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
  2852.    
  2853.   get_pt(&p1, i+di ,j+dj);
  2854.   switch(col_mode) {
  2855.   case 0:
  2856.     col = 4;
  2857.     break;
  2858.   case 1:
  2859.     col = coul_flat(T(i+di,j+dj)+T(i+di,j)+T(i,j+dj));
  2860.     break;
  2861.   case 2:
  2862.     col = coul(&p3,&p2,&p1);
  2863.     break;
  2864.   }
  2865.   if(no_z) p1.z = 0;
  2866.   proj(&p1, &x1, &y1);
  2867.   switch(tri_mode) {
  2868.   case 0:
  2869.     tri_wire(x1, y1, x2, y2, x3, y3, col);
  2870.     break;
  2871.   case 1:
  2872.     triangle(x1, y1, x2, y2, x3, y3, 0);
  2873.     tri_wire(x1, y1, x2, y2, x3, y3, col);
  2874.     break;
  2875.   case 2:
  2876.     triangle(x1, y1, x2, y2, x3, y3, col);
  2877.     break;
  2878.   }
  2879.   //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
  2880. }
  2881.  
  2882. void facette11(int i, int j, int di, int dj) {
  2883.   point p1, p2, p3;
  2884.   int x1, y1, x2, y2, x3, y3, col = 1;
  2885.  
  2886.   get_pt(&p1, i+di, j+dj);
  2887.   get_pt(&p2, i+di, j);
  2888.   get_pt(&p3, i, j+dj);
  2889.    
  2890.   switch(col_mode) {
  2891.   case 0:
  2892.     col = 4;
  2893.     break;
  2894.   case 1:
  2895.     col = coul_flat(T(i+di,j+dj)+T(i+di,j)+T(i,j+dj));
  2896.     break;
  2897.   case 2:
  2898.     col = coul(&p3,&p2,&p1);
  2899.     break;
  2900.   }
  2901.   if(no_z) {
  2902.     int z1 = p1.z, z2 = p2.z, z3 = p3.z;
  2903.     p1.z = p2.z = p3.z = 0;
  2904.     proj(&p1, &x1, &y1);
  2905.     proj(&p2, &x2, &y2);
  2906.     proj(&p3, &x3, &y3);
  2907.     p1.z = z1; p2.z = z2; p3.z = z3;
  2908.   } else {
  2909.     proj(&p1, &x1, &y1);
  2910.     proj(&p2, &x2, &y2);
  2911.     proj(&p3, &x3, &y3);
  2912.   }
  2913.   switch(tri_mode) {
  2914.   case 0:
  2915.     tri_wire(x1, y1, x2, y2, x3, y3, col);
  2916.     break;
  2917.   case 1:
  2918.     triangle(x1, y1, x2, y2, x3, y3, 0);
  2919.     tri_wire(x1, y1, x2, y2, x3, y3, col);
  2920.     break;
  2921.   case 2:
  2922.     triangle(x1, y1, x2, y2, x3, y3, col);
  2923.     break;
  2924.   }
  2925.   //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
  2926.    
  2927.   get_pt(&p1, i ,j);
  2928.   switch(col_mode) {
  2929.   case 0:
  2930.     col = 4;
  2931.     break;
  2932.   case 1:
  2933.     col = coul_flat(T(i,j)+T(i+di,j)+T(i,j+dj));
  2934.     break;
  2935.   case 2:
  2936.     col = coul(&p1,&p2,&p3);
  2937.     break;
  2938.   }
  2939.   if(no_z) p1.z = 0;
  2940.   proj(&p1, &x1, &y1);
  2941.   switch(tri_mode) {
  2942.   case 0:
  2943.     tri_wire(x1, y1, x2, y2, x3, y3, col);
  2944.     break;
  2945.   case 1:
  2946.     triangle(x1, y1, x2, y2, x3, y3, 0);
  2947.     tri_wire(x1, y1, x2, y2, x3, y3, col);
  2948.     break;
  2949.   case 2:
  2950.     triangle(x1, y1, x2, y2, x3, y3, col);
  2951.     break;
  2952.   }
  2953.   //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
  2954. }
  2955.  
  2956. void disp_sorted() {
  2957.   point p;
  2958.   int d00, d01, d10, d11;
  2959.   int i0, i1, di;
  2960.   int j0, j1, dj;
  2961.   int i_before_j;
  2962.   int i,j;
  2963.   void (*face)(int,int,int,int) = facette00;
  2964.  
  2965.   if(tri_mode==0 && col_mode==0) {
  2966.     for(j=COTE; (j-=STEP)>=0;) {
  2967.       int x1,y1;
  2968.       get_pt(&p, COTE, j);
  2969.       proj(&p, &x1, &y1);
  2970.       for(i=COTE; (i-=STEP)>=0;) {
  2971.     int x2=x1, y2=y1;
  2972.     get_pt(&p, i, j);
  2973.     proj(&p, &x1, &y1);
  2974.     line(x1,y1,x2,y2,4);
  2975.       }
  2976.     }
  2977.     return;
  2978.   }
  2979.  
  2980.   if(no_z || (col_mode==0 && tri_mode==0)) {
  2981.     for(j=COTE; (j-=STEP)>=0;)
  2982.       for(i=COTE; (i-=STEP)>=0;)
  2983.     facette00(i,j,STEP,STEP);
  2984.     return;
  2985.   }
  2986.  
  2987.   get_pt(&p, 0, 0); //pstr_("00", &p);
  2988.   d00 = fadd(fsqr(fsub(p.x,Pe.x)), fsqr(fsub(p.y, Pe.y)));
  2989.  
  2990.   get_pt(&p, 0, COTE-1); //pstr_("01", &p);
  2991.   d01 = fadd(fsqr(fsub(p.x,Pe.x)), fsqr(fsub(p.y, Pe.y)));
  2992.  
  2993.   get_pt(&p, COTE-1, 0); //pstr_("10", &p);
  2994.   d10 = fadd(fsqr(fsub(p.x,Pe.x)), fsqr(fsub(p.y, Pe.y)));
  2995.  
  2996.   get_pt(&p, COTE-1, COTE-1); //pstr_("11", &p);
  2997.   d11 = fadd(fsqr(fsub(p.x,Pe.x)), fsqr(fsub(p.y, Pe.y)));
  2998.  
  2999. #define cmp3(a,b,c) fcmp(d##a,d##b)>=0 && fcmp(d##b,d##c)>=0
  3000.  
  3001.  
  3002.   face = fcmp(d00,d11)>=0?facette00:facette11;
  3003.   if(0) {
  3004.   } else if(cmp3(00,01,10)) {
  3005.     i_before_j = 0;
  3006.     i0 = 0; i1 = COTE;
  3007.     j0 = 0; j1 = COTE;
  3008.   } else if(cmp3(00,10,01)) {
  3009.     i_before_j = 1;
  3010.     i0 = 0; i1 = COTE;
  3011.     j0 = 0; j1 = COTE;
  3012.   } else if(cmp3(10,00,11)) {
  3013.     i_before_j = 1;
  3014.     i0 = COTE-STEP; i1 = -STEP;
  3015.     j0 = 0;         j1 = COTE;
  3016.   } else if(cmp3(10,11,00)) {
  3017.     i_before_j = 0;
  3018.     i0 = COTE-STEP; i1 = -STEP;
  3019.     j0 = 0;         j1 = COTE;
  3020.   } else if(cmp3(11,10,01)) {
  3021.     i_before_j = 0;
  3022.     i0 = COTE-STEP; i1 = -STEP;
  3023.     j0 = COTE-STEP; j1 = -STEP;
  3024.   } else if(cmp3(11,01,10)) {
  3025.     i_before_j = 1;
  3026.     i0 = COTE-STEP; i1 = -STEP;
  3027.     j0 = COTE-STEP; j1 = -STEP;
  3028.   } else if(cmp3(01,11,00)) {
  3029.     i_before_j = 1;
  3030.     i0 = 0;         i1 = COTE;
  3031.     j0 = COTE-STEP; j1 = -STEP;
  3032.   } else if(cmp3(01,00,11)) {
  3033.     i_before_j = 0;
  3034.     i0 = 0;         i1 = COTE;
  3035.     j0 = COTE-STEP; j1 = -STEP;
  3036.   } else {
  3037.     printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n");
  3038.     i_before_j = 0;
  3039.     i0 = 0; i1 = COTE;
  3040.     j0 = 0; j1 = COTE;
  3041.   }
  3042.  
  3043.   di = i0>=i1?-STEP:STEP;
  3044.   dj = j0>=j1?-STEP:STEP;
  3045.  
  3046.   if(i_before_j) {
  3047.     for(j=j0; j!=j1; j+=dj)
  3048.       for(i=i0; i!=i1; i+=di)
  3049.     (*face)(i,j,STEP,STEP);
  3050.   } else {
  3051.     for(i=i0; i!=i1; i+=di)
  3052.     for(j=j0; j!=j1; j+=dj)
  3053.       (*face)(i,j,STEP,STEP);
  3054.   }
  3055. }
  3056.  
  3057. void disp() {
  3058.   int i;
  3059.   for(i=0; i<COTE; ++i) {
  3060.     int j;
  3061.     for(j=0; j<COTE; ++j) {
  3062.       point p1, p2, p3;
  3063.       int x1, y1, x2, y2, x3, y3, col = 1;
  3064.  
  3065.       get_pt(&p1, i, j);
  3066.       get_pt(&p2, i+1, j);
  3067.       get_pt(&p3, i, j+1);
  3068.      
  3069.       col = coul(&p1,&p2,&p3);
  3070.       proj(&p1, &x1, &y1);
  3071.       proj(&p2, &x2, &y2);
  3072.       proj(&p3, &x3, &y3);
  3073.       triangle(x1, y1, x2, y2, x3, y3, col);
  3074.       //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
  3075.  
  3076.       get_pt(&p1, i+1 ,j+1);
  3077.       col = coul(&p3,&p2,&p1);
  3078.       proj(&p1, &x1, &y1);
  3079.       triangle(x1, y1, x2, y2, x3, y3, col);
  3080.       //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
  3081.     }
  3082.   }
  3083. }
  3084.  
  3085. void txt(char *s) {
  3086.   static byte form[] = {0xBB,0xCC,0xDD,0xEE,0xFF,0xFF};
  3087.   static byte fond[] = {0x00,0x00,0x00,0x00,0x00,0x00};
  3088.   byte l = 0, x;
  3089.   while(s[l]) ++l;
  3090.   x = (40-l)>>1;
  3091.   for(l=40;l;--l) {
  3092.     pstr(s,x,13,form,fond);
  3093.     {
  3094.       byte c  = form[5];
  3095.       form[5] = form[4];
  3096.       form[4] = form[3];
  3097.       form[3] = form[2];
  3098.       form[2] = form[1];
  3099.       form[1] = form[0];
  3100.       form[0] = c;
  3101.     }
  3102.     {
  3103.       int c=3000;
  3104.       while(c) --c;
  3105.     }
  3106.   }
  3107. }
  3108. extern unsigned int clock();
  3109.  
  3110. int main(void) {  
  3111.   int redraw = 1;
  3112.   int move = 0;
  3113.   #if 1
  3114.   static int pal[] = {0,3873,16,32,48,17,34,51,324,597,870,273,546,819,1092,1638};
  3115.   _setp(255, (int)pal, 0);
  3116.   _putc(27); _putc('^');
  3117.   _putc(0x14);
  3118.   _putc(27); _putc(0x60);
  3119.   /*
  3120.   { byte x,y;
  3121.   for(y=0;y<200;++y) for(x=0;x<160;++x) pset(x,y,(x+y)&15);
  3122.   while(!_ktst());
  3123.   }
  3124.   */
  3125.   #else
  3126.   ps("\033[");
  3127.   //hline(0x4000+40*100, 80,82, 255);
  3128.   printf("%x\n", tria_line);
  3129.   triangle(40,0,80,80,-50,180,15);
  3130.   exit(0);
  3131.   /*
  3132.   printf("\n\n%x\n", line);
  3133.   {
  3134.     int i;
  3135.     for(i=0; i<160; ++i) {
  3136.       int y=ftoi(fdiv4(fmul256(my_sin(i))))+100;
  3137.       line(i,100,i,y,15);
  3138.     }
  3139.     //line(0,-100,80,7,15);
  3140.     //line(0,0,80,100,15);
  3141.     //line(160,0,80,100,15);
  3142.     //line(160,200,80,100,15);
  3143.     line(-2,40,80,199,15);
  3144.     exit(0);
  3145.   }
  3146.   */
  3147.   /*
  3148.   {
  3149.     int x = 0, y = 0,w1=30,w2=30;
  3150.     int c='x';
  3151.     do {
  3152.       int chg = 0;
  3153.       if(c=='a') --x, chg=1;
  3154.       if(c=='z') ++x, chg=1;
  3155.       if(c=='q') --y, chg=1;
  3156.       if(c=='w') ++y, chg=1;
  3157.       if(c=='x') {x=80;y=100;chg=1;}
  3158.       if(c=='e') --w1, chg=1;
  3159.       if(c=='r') ++w1, chg=1;
  3160.       if(c=='s') --w2, chg=1;
  3161.       if(c=='d') ++w2, chg=1;
  3162.       if(chg) {
  3163.     _putc(12);
  3164.     triangle(x,y,x-w1,y+30,x+w2,y+60,15);
  3165.       }
  3166.     } while((c=_getc())!=' ');
  3167.   }
  3168.   exit(0);
  3169.   */
  3170.   #endif
  3171.   //fpr("sub=",fsub(0x48dc, 0xc7b7));
  3172.   //fpr("a1=",itof(2));
  3173.   //fpr("a2=",itof(1));
  3174.   //fpr("sub=",fsub(itof(1),itof(2)));
  3175.   //exit(0);
  3176.   init_points();
  3177.   init_trans();
  3178.   init_france();
  3179.   //  clear_T();
  3180.   //    init_T();
  3181.   STEP = 4;
  3182.   while(1) {
  3183.     int t, c;
  3184.     if(move) {
  3185.       init_points();
  3186.       init_trans();
  3187.       redraw = 1;
  3188.     }
  3189.     if(redraw) {
  3190.       disp_over();
  3191.       disp_sorted();
  3192.       redraw = 0;
  3193.     }
  3194.  
  3195.     if(0) {
  3196.       char buf[16];
  3197.       static byte form[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  3198.       static byte fond[] = {0x00,0x00,0x00,0x00,0x00,0x00};
  3199.      
  3200.       sprintf(buf,"%d",RAYON);pstr(buf,0,0,form,fond);
  3201.       sprintf(buf,"%d",THETA);pstr(buf,0,1,form,fond);
  3202.       sprintf(buf,"%d",RHO);  pstr(buf,0,2,form,fond);
  3203.      
  3204.       sprintf(buf,"%d",ftoi(P0.x));pstr(buf,0,4,form,fond);
  3205.       sprintf(buf,"%d",ftoi(P0.y));pstr(buf,0,5,form,fond);
  3206.       sprintf(buf,"%d",ftoi(P0.z));pstr(buf,0,6,form,fond);
  3207.     }
  3208.    
  3209.     t = clock();
  3210.     while(!_ktst() /*&& (clock()<=t+40000)*/);
  3211.     switch((c=_getc())) {
  3212.     case 'q':
  3213.       return 0;
  3214.       //case 0:
  3215.     case ' ':
  3216.     case 'n':
  3217.       txt("NEW LANDSCAPE...");
  3218.       clear_T(); init_T(); redraw = 1; break;
  3219.     case '1':
  3220.       txt("RESOLUTION=1 (USELESS)");
  3221.       STEP = 64; redraw = 1; break;
  3222.     case '2':
  3223.       txt("RESOLUTION=2 (POINTLESS)");
  3224.       STEP = 32; redraw = 1; break;
  3225.     case '3':
  3226.       txt("RESOLUTION=3 (BAD, BUT FAST)");
  3227.       STEP = 16; redraw = 1; break;
  3228.     case '4':
  3229.       txt("RESOLUTION=4 (MEDIUM, RATHER FAST)");
  3230.       STEP = 8; redraw = 1; break;
  3231.     case '5':
  3232.       txt("RESOLUTION=5 (CORRECT, SLOW)");
  3233.       STEP = 4; redraw = 1; break;
  3234.     case '6':
  3235.       txt("RESOLUTION=6 (GOOD, BE PATIENT)");
  3236.       STEP = 2; redraw = 1; break;
  3237.     case '7':
  3238.       txt("RESOLUTION=6 (BEST, REAL SLOW)");
  3239.       STEP = 1; redraw = 1; break;
  3240.     case 'D':
  3241.       tri_mode = 2;
  3242.     case 'd':
  3243.       switch(tri_mode) {
  3244.       case 0:
  3245.     tri_mode = 1;
  3246.     txt("FILLED WIRE FRAME DRAWING MODE...(SLOW)");
  3247.     break;
  3248.       case 1:
  3249.     tri_mode = 2;
  3250.     txt("FILLED TRIANGLE DRAWING MODE...(MEDIUM)");
  3251.    
  3252.     break;
  3253.       case 2:
  3254.     tri_mode = 0;  
  3255.     txt("WIRE FRAME DRAWING MODE...(FAST)");
  3256.     break;
  3257.       }
  3258.       redraw = 1;
  3259.       break;
  3260.     case 'C':
  3261.       col_mode = 0;
  3262.     case 'c':
  3263.       switch(col_mode) {
  3264.       case 2:
  3265.     col_mode = 0;
  3266.     txt("MONOCHROME MODE (FAST)");
  3267.     break;
  3268.       case 1:
  3269.     col_mode = 2;
  3270.     txt("LIGHTING-BASED COLOUR MODE...(SLOW)");
  3271.     break;
  3272.       case 0:
  3273.     col_mode = 1;
  3274.     txt("HEIGHT-BASED COLOUR MODE...(MEDIUM)");
  3275.     break;
  3276.       }
  3277.       redraw = 1;
  3278.       break;
  3279.     case 'M':      
  3280.     case 'm':
  3281.       use_map = 1-use_map;
  3282.       if(use_map)
  3283.     txt("WITH MAP OVERVIEW...");
  3284.       else
  3285.     txt("WITHOUT MAP OVERVIEW...");
  3286.       redraw = 1;
  3287.       break;
  3288.     case 'S':
  3289.     case 's':
  3290.       use_stars = 1-use_stars;
  3291.       if(use_map)
  3292.     txt("WITH BACKGROUND STARS...");
  3293.       else
  3294.     txt("WITHOUT BACKGROUND STARS...");
  3295.       redraw = 1;
  3296.       break;
  3297.     case 'R':
  3298.       txt("ROTATE RIGHT...");
  3299.       //#undef T
  3300.       //#define T(x,y) (int)(*(tab+(x)+(y)+((y)<<DEG)))
  3301.       // rotate left
  3302.       {
  3303.     byte i;
  3304.     for(i=0; i<=COTE; ++i) {
  3305.       byte j,max=COTE-i;
  3306.       for(j=i; j<max; ++j) {
  3307.         byte *p1 = &T(i,j);
  3308.         byte *p2 = &T(COTE-j,i);
  3309.         byte *p3 = &T(COTE-i,COTE-j);
  3310.         byte *p4 = &T(j,COTE-i);
  3311.         byte t = *p1; *p1 = *p2; *p2 = *p3, *p3 = *p4, *p4 = t;
  3312.       }
  3313.     }
  3314.       }
  3315.       redraw = 1; break;
  3316.     case 'r':
  3317.       txt("ROTATE LEFT...");
  3318.       // rotate right
  3319.       {
  3320.     byte i;
  3321.     for(i=0; i<=COTE; ++i) {
  3322.       byte j,max=COTE-i;
  3323.       for(j=i; j<max; ++j) {
  3324.         byte *p1 = &T(i,j);
  3325.         byte *p2 = &T(COTE-j,i);
  3326.         byte *p3 = &T(COTE-i,COTE-j);
  3327.         byte *p4 = &T(j,COTE-i);
  3328.         byte t = *p4;
  3329.         *p4 = *p3; *p3 = *p2; *p2 = *p1; *p1 = t;
  3330.       }
  3331.     }
  3332.       }
  3333.       redraw = 1;
  3334.       break;
  3335.     case 'Z':
  3336.     case 'z':
  3337.       no_z = 1-no_z;
  3338.       if(no_z)
  3339.     txt("FLATLAND");
  3340.       else
  3341.     txt("WONDERLAND");
  3342.       redraw = 1;
  3343.       break;
  3344.  
  3345.     case 8:
  3346.       --THETA;
  3347.       move = 1;
  3348.       break;
  3349.      
  3350.     case 9:
  3351.       ++THETA;
  3352.       move = 1;
  3353.       break;
  3354.      
  3355.     case 10:
  3356.       if(RHO>-31) {
  3357.     --RHO;
  3358.     move = 1;
  3359.       }
  3360.       break;
  3361.  
  3362.     case 11:
  3363.       if(RHO<31) {
  3364.     ++RHO;
  3365.     move = 1;
  3366.       }
  3367.       break;
  3368.      
  3369.     case 28:
  3370.       RAYON += 1+(RAYON>>2);
  3371.       move = 1;
  3372.       break;
  3373.      
  3374.     case 29:
  3375.       RAYON -= 1+(RAYON>>2);
  3376.       if(RAYON<20) RAYON=20;
  3377.       move = 1;
  3378.       break;
  3379.     }
  3380.   };
  3381.   return 0;
  3382. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement