Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if 0
- #set -x
- export COMPILER_PATH=./home/thomson/bin
- export PATH="./home/bin:./home/lib/gcc-lib/thomson/295.3/:$COMPILER_PATH:$PATH"
- b=`basename $0 .c`
- bb=`echo $b | tr a-z A-Z`
- cp $b.c _$b.c
- gcc09 -c -v -Wall -fomit-frame-pointer -O2 -S _$b.c -o $b.s
- as09 -l $b.s
- 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/
- #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/
- sapfs.exe -c $b.sap
- sapfs.exe -a $b.sap $bb.BIN
- if test ! -f $b.sap; then sapfs.exe -c $b.sap; fi
- sapfs.exe -a $b.sap $bb.BIN
- cmd /c 'C:\Documents and Settings\Administrateur\Mes documents\thomson\teo-1.7.5-winexe\teo\teo.bat' $b.sap -fast
- exit
- #endif
- extern void printf(const char *fmt, ...);
- void bcopy(char *s, char *d,int l) {
- while(l--) *d++ = *s++;
- }
- #ifdef __MC6809__
- int div16(int a, int b);
- int mod16(int a, int b);
- int mul8(unsigned char a, unsigned char b);
- int rnd15();
- asm(" .area _CODE
- .globl _mul8
- _mul8: ldd 2,s
- mul
- rts
- ; divide D by X, result in D, remainder in U
- divi16: pshs x
- ldx #16
- leau -16,x
- divi1: rolb
- rola
- exg d,u
- rolb
- rola
- subd ,s
- bcc divi2
- addd ,s
- divi2: exg d,u
- leax -1,x
- bne divi1
- rolb
- rola
- comb
- coma
- puls x,pc
- .globl _div16
- _div16: pshs x,u
- ldx 8,s
- beq div161
- ldd 6,s
- bge div162
- nega
- negb
- sbca #0
- div162: jsr divi16
- tst 6,s
- bge div161
- nega
- negb
- sbca #0
- div161: puls x,u,pc
- .globl _mod16
- _mod16: pshs x,u
- ldx 8,s
- beq mod161
- ldd 6,s
- bge mod162
- nega
- negb
- sbca #0
- mod162: jsr divi16
- tfr u,d
- tst 6,s
- bge mod161
- nega
- negb
- sbca #0
- mod161: puls x,u,pc
- .area _DATA
- rnd_s1: .word 9814
- rnd_s2: .word 32413
- rnd_s3: .word 12312
- .area _CODE
- .globl _rnd15
- _rnd15: pshs x,y,u
- ldd rnd_s1
- ldx #206
- jsr divi16
- lda #21
- mul
- pshs d
- tfr u,d
- lda #157
- mul
- subd ,s++
- bge rnd1
- addd #32363
- rnd1: std rnd_s1
- ldd rnd_s2
- ldx #217
- jsr divi16
- lda #45
- mul
- pshs d
- tfr u,d
- lda #146
- mul
- subd ,s++
- bge rnd2
- addd #31727
- rnd2: std rnd_s2
- ldd rnd_s3
- ldx #222
- jsr divi16
- lda #133
- mul
- pshs d
- tfr u,d
- lda #142
- mul
- subd ,s++
- bge rnd3
- addd #31657
- rnd3: std rnd_s3
- ldd rnd_s1
- subd rnd_s2
- cmpd #706
- bmi rnd4
- subd #32362
- rnd4: addd rnd_s3
- bgt rnd5
- addd #32362
- rnd5: puls x,y,u,pc
- ");
- #else
- int mul8(unsigned char a, unsigned char b) {
- return a*b;
- }
- int div16(int a, int b) {
- return a/b;
- }
- int mod16(int a, int b) {
- return a%b;
- }
- int rnd15() {
- //return rand();
- static int s1 = 9814, s2 = 32413, s3 = 12312;
- int z, k;
- k = s1 / 206;
- s1 = 157 * (s1 - k * 206) - k * 21;
- if(s1 < 0) s1 += 32363;
- k = s2 / 217;
- s2 = 146 * (s2 - k * 217) - k * 45;
- if(s2 < 0) s2 += 31727;
- k = s3 / 222;
- s3 = 142 * (s3 - k * 222) - k * 133;
- if(s3 < 0) s3 += 31657;
- z = s1 - s2;
- if(z > 706) z -= 32362;
- z += s3;
- if(z<1) z += 32362;
- return z;
- }
- #endif
- /*
- * Routines arithmetiques point flottant. Format:
- * SEEE EEEM MMMMMMMM
- *
- * flt = (1-2*S)*(1.0 + MMMMMMMMM/512.0)*2^(EEEEE-32)
- * bias = 32
- */
- // few constants
- #define ZERO 0x0000
- #define ONE 0x4000
- #define TWO 0x4200
- #define THREE 0x4300
- #define FOUR 0x4400
- #define FIVE 0x4480
- #define SIX 0x4500
- #define SEVEN 0x4580
- #define EIGHT 0x4600
- #define NINE 0x4640
- #define TEN 0x4680
- #define I_TWO 0x3e00
- #define I_THREE 0x3caa
- #define I_FOUR 0x3c00
- #define I_FIVE 0x3b33
- #define I_SIX 0x3aaa
- #define I_SEVEN 0x3a49
- #define I_EIGHT 0x3a00
- #define I_NINE 0x398e
- #define I_TEN 0x3933
- #define SQRT2 0x40D4
- #define P_INF 0x7FFF
- #define M_INF 0xFFFF
- #define EPS 0x0200
- #define fneg(x) ((x)^0x8000)
- #define fabs(x) ((x)&0x7fff)
- int btst(int a, int msk);
- #ifdef __MC6809__
- void _setp(int a, int x, int y);
- asm(" .area _CODE
- .globl __setp
- __setp: pshs x,y
- lda 7,s
- ldx 8,s
- ldy 10,s
- jsr 0xEC00
- tfr x,d
- puls x,y,pc
- ");
- #else
- void _setp(int a, int x, int y) {
- }
- #endif
- #ifdef __MC6809__
- int _ktst();
- asm(" .area _CODE
- .globl __ktst
- __ktst: ldd #0
- jsr 0xE809
- adcb #0
- rts
- ");
- #else
- int _ktst() {
- return 0;
- }
- #endif
- #ifdef __MC6809__
- int _getc();
- asm(" .area _CODE
- .globl __getc
- __getc: clra
- jmp 0xE806
- ");
- #else
- int _getc() {
- return 0;
- }
- #endif
- #ifdef __MC6809__
- void _putc(int c);
- asm(" .area _CODE
- .globl __putc
- __putc: ldb 3,s
- jmp 0xE803
- ");
- #else
- void _putc(int c) {
- printf("%c", c);
- }
- #endif
- /*
- unsigned char bank_tab[] = {0x0F,0x17,0xE7,0x67,0xA7,0x27};
- #ifdef __MC6809__
- void _bank(unsigned char no);
- asm(" .area _CODE
- .globl __bank
- __bank: pshs x,u
- ldu #0xE7C0
- ldb 11,u
- andb #0xFB
- stb 11,u
- ldx #_bank_tab
- lda 7,s
- lda a,x
- sta 9,u
- orb #4
- stb 11,u
- puls x,u,pc
- ");
- #else
- void _bank(unsigned char no) {
- const unsigned char *E7C0 = (void*)0xE7C0;
- E7C0[11] &= ~4;
- E7C0[9] = bank_tab[no];
- E7C0[11] |= 4;
- }
- #endif
- */
- #ifdef __MC6809__
- void pc(int c);
- asm(" .area _CODE
- .globl _pc
- _pc: ldb 3,s
- cmpb #10
- beq pc1
- pc0: jmp 0xE803
- pc1: jsr 0xE803
- ldb #13
- bra pc0
- ");
- #else
- void pc(int c) {
- printf("%c", c);
- }
- #endif
- void ps(char *s) {
- while(*s) pc(*s++);
- }
- void px(int v) {
- static char t[] = "0123456789ABCDEF";
- pc(t[(v&0xF000)>>12]);
- pc(t[(v&0x0F00)>>8]);
- pc(t[(v&0x00F0)>>4]);
- pc(t[(v&0x000F)]);
- }
- #ifdef __MC6809__
- extern int fsgn(int fp);
- asm(" .area _CODE
- .globl _fsgn
- _fsgn: lda 2,s
- anda #0x7E
- beq _fsgn0
- tst 2,s
- bpl _fsgn1
- ldd #-1
- rts
- _fsgn1: ldd #1
- rts
- _fsgn0: clrb
- rts
- ");
- #else
- int fsgn(int fp) {
- return (fp&0x7E00)?(fp>0?1:-1):0;
- }
- #endif
- #define fxadd(a,b) ((a)+(b))
- #define fxsub(a,b) ((a)+(b))
- #define fxadd3(a,b,c) fxadd(fxadd(a,b),c)
- #ifdef __MC6809__
- int fxmul(int a, int b);
- asm(" .area _CODE
- .globl _fxmul
- _fxmul: ldb 2,s
- eorb 4,s
- pshs b,x
- ldd 5,s
- bge fxmul1
- nega
- negb
- sbca #0
- std 5,s
- fxmul1: ldd 7,s
- bge fxmul2
- nega
- negb
- sbca #0
- std 7,s
- fxmul2: ldx #0
- lda 6,s
- ldb 8,s
- mul
- leax a,x
- lda 5,s
- ldb 8,s
- mul
- leax d,x
- ldd 6,s
- mul
- leax d,x
- lda 5,s
- ldb 6,s
- mul
- tfr b,a
- clrb
- leax d,x
- tfr x,d
- tst ,s+
- bge fxmul3
- nega
- negb
- sbca #0
- fxmul3: puls x,pc
- ");
- #else
- int fxmul(int a, int b) {
- int s = a^b, t;
- if(a==0 || b==0) return 0;
- if(a<0) a=-a; if(b<0) b=-b;
- t = mul8(a,b);
- t+= mul8(a,b>>8) + mul8(a>>8,b);
- t+= mul8(a>>8,b>>8)>>8;
- return s<0?-t:t;
- }
- #endif
- #ifdef __MC6809__
- int ftofx(int fp);
- int ftoi(int fp);
- asm(" .area _CODE
- .globl _ftoi
- _ftoi: ldd 2,s
- anda #0x7E
- bne ftoi1
- clrb
- rts
- ftoi1: lsra
- suba #32+9
- sta ,-s
- bge ftoi2
- lda 3,s
- anda #1
- ora #2
- lsra
- rorb
- inc ,s
- beq ftoi3
- lsra
- rorb
- lda ,s
- inca
- beq ftoi3
- ftoi4: lsrb
- beq ftoi6
- inca
- bne ftoi4
- ftoi6: clra
- ftoi3: leas 1,s
- tst 2,s
- bgt ftoi5
- nega
- negb
- sbca #0
- ftoi5: rts
- ftoi2: lda 3,s
- anda #1
- ora #2
- tst ,s
- beq ftoi3
- lslb
- rola
- dec ,s
- beq ftoi3
- lslb
- rola
- dec ,s
- beq ftoi3
- lslb
- rola
- dec ,s
- beq ftoi3
- lslb
- rola
- dec ,s
- beq ftoi3
- lslb
- rola
- dec ,s
- beq ftoi3
- lslb
- rola
- dec ,s
- beq ftoi3
- ldd #0x7FFF
- bra ftoi3
- .globl _ftofx
- _ftofx: lda 2,s
- bita #0x7E
- beq ftofx1
- adda #16
- sta 2,s
- bra _ftoi
- ftofx1: clrb
- rts
- ");
- #else
- int ftoi(int fp) {// conversion fp --> int
- unsigned int a;
- char e;
- if(!btst(fp,0x7E00)) return 0;
- e = ((fp>>9)&63)-32-9;
- a = (fp&0x1FF) | 0x200;
- if(e<0) {
- do a>>=1; while(a && ++e);
- } else {
- while(e) {
- if(btst(a,0x8000)) {a=0x7FFF; break;}
- a<<=1;
- --e;
- }
- }
- return btst(fp,0x8000)?-a:a;
- }
- int ftofx(int fp) {
- return ftoi(fmul256(fp))
- }
- #endif
- void dbg(int x) {
- printf("%04x: %04x\n", (&x)[-1], x);
- }
- #ifdef __MC6809__
- int fxtof(int i);
- int itof(int i);
- asm(" .area _CODE
- .globl _itof
- _itof: pshs x
- ldx #32+16
- ldd 4,s
- bne itof1
- puls x,pc
- itof1: bpl itof2
- nega
- negb
- sbca #0
- leax 64,x
- itof2: leax -1,x
- lslb
- rola
- bcc itof2
- andb #128
- leax d,x
- tfr x,d
- exg a,b
- aslb
- rola
- adcb #0
- puls x,pc
- .globl _fxtof
- _fxtof: pshs x
- ldx #32
- ldd 4,s
- bne fxtof1
- puls x,pc
- fxtof1: bpl fxtof2
- nega
- negb
- sbca #0
- leax 64,x
- fxtof2: leax -1,x
- lslb
- rola
- bcc fxtof2
- andb #128
- leax d,x
- tfr x,d
- exg a,b
- aslb
- rola
- adcb #0
- puls x,pc
- ");
- #else
- // conversion int --> fp
- int itof(int i) {
- int e = (32+15)<<9, z = 0;
- if(!i) return 0;
- if(i<0) {
- e |= 0x8000;
- i = -i;
- }
- do {
- e-=0x200;
- i<<=1;
- } while(!btst(i,0x8000));
- i>>=6;
- i&=0x1FF;
- e |= i;
- // if(z) e |= 0x8000;
- return e;
- }
- int fxtof(int i) {
- return fdiv256(itof(i));
- }
- #endif
- int ffrac_msk[] = {0x1FF, 0xFF, 0x7F, 0x3f, 0x1F, 0xF, 0x7, 0x3, 0x1};
- #ifdef __MC6809__
- extern int ffrac(int i);
- asm(" .area _CODE
- .globl _ffrac
- _ffrac: pshs x
- ldd 3,s
- anda #0x7E
- suba #64
- bpl ffrac1
- lda 3,s
- puls x,pc
- ffrac1: cmpa #18
- bmi ffrac2
- ldd #0
- puls x,pc
- ffrac2: ldx #_ffrac_msk
- leax a,x
- lda 3,s
- anda ,x+
- andb ,x
- tfr d,x
- lda 3,s
- anda #0xFE
- clrb
- leax ,x
- bne ffrac3
- clra
- puls x,pc
- ffrac3: exg d,x
- ffrac4: bita #2
- bne ffrac5
- lslb
- rola
- leax -0x200,x
- bra ffrac4
- ffrac5: anda #1
- leax d,x
- tfr x,d
- puls x,pc
- ");
- #else
- int ffrac(int f) {
- int e = ((f >> 9) & 63) - 32;
- register unsigned int m;
- if(e<0) return f;
- if(e>=9) return 0;
- //m = 0x1FF;
- //if(e) m>>=e;
- m = ffrac_msk[e];
- m &= f;
- if(!m) return 0;
- f &= 0xfe00;
- e = 0x200;
- while((e & m)!=e) {
- m <<= 1;
- f -= 0x200;
- }
- m &= 0x1FF;
- return f + m;
- }
- #endif
- #ifdef __MC6809__
- extern int fmul(int a, int b);
- asm(" .area _CODE
- .globl _fmul
- _fmul: pshs x,u
- clrb
- lda 6,s
- anda #0x7E
- bne fmul1
- fmul2: puls x,u,pc
- fmul1: tfr d,u
- lda 8,s
- anda #0x7E
- beq fmul2
- suba #64
- leau d,u
- lda 6,s
- anda 8,s
- anda #1
- tfr d,x
- lda 6,s
- anda #1
- beq fmul3
- ldb 9,s
- abx
- fmul3:
- lda 8,s
- anda #1
- beq fmul4
- ldb 7,s
- abx
- fmul4:
- tfr x,d
- lsra
- rorb
- adda #2
- tfr d,x
- ldd 8,s
- anda #1
- leax d,x
- ldd 6,s
- anda #1
- leax d,x
- lda 9,s
- mul
- lsra
- leax a,x
- tfr x,d
- bita #4
- beq fmul5
- lsra
- rorb
- leau 512,u
- fmul5: anda #1
- exg d,u
- anda #0x7E
- leau d,u
- lda 6,s
- eora 8,s
- anda #128
- leau d,u
- tfr u,d
- puls x,u,pc
- ");
- #else
- int fmul(int fa, int fb) {
- register unsigned int t;
- int e;
- if(!btst(fa, 0x7E00) || !btst(fb, 0x7E00)) return 0;
- e = (fa & 0x7e00) + (fb & 0x7e00) - (32<<9);
- t = 1024;
- t += fa & fb & 0x100;
- t += (fa&0x100)?fb&255:0;
- t += (fb&0x100)?fa&255:0;
- t >>= 1;
- t += ((unsigned)((fa&255)*(fb&255)))>>9;
- t += (fa&0x1FF);
- t += (fb&0x1FF);
- if(t>=1024) {
- t >>= 1;
- e += 1<<9;
- }
- t &= 0x1ff;
- t += e & 0x7E00;
- t += (fa^fb)&0x8000;
- return t;
- }
- #endif
- int fsqr(int f) {
- return fmul(f, f);
- }
- #ifdef __MC6809__
- extern int fmul2(int a);
- extern int fdiv2(int a);
- extern int fmul4(int a);
- extern int fdiv4(int a);
- extern int fmul256(int a);
- extern int fdiv256(int a);
- asm(" .area _CODE
- .globl _fmul2
- _fmul2: ldd 2,s
- bita #0x7E
- beq fmul21
- adda #2
- fmul21: rts
- .globl _fdiv2
- _fdiv2: ldd 2,s
- bita #0x7E
- beq fdiv21
- suba #2
- fdiv21: rts
- .globl _fmul4
- _fmul4: ldd 2,s
- bita #0x7E
- beq fmul41
- adda #4
- fmul41: rts
- .globl _fdiv4
- _fdiv4: ldd 2,s
- bita #0x7E
- beq fdiv41
- suba #4
- fdiv41: rts
- .globl _fmul256
- _fmul256:
- ldd 2,s
- bita #0x7E
- beq fmul256
- adda #16
- fmul256:
- rts
- .globl _fdiv256
- _fdiv256:
- ldd 2,s
- bita #0x7E
- beq fdiv256
- suba #16
- fdiv256:
- rts
- ");
- #else
- int fdiv2(int f) {
- return (f&0x7e00)?f-0x200:0;
- }
- int fmul2(int f) {
- return (f&0x7e00)?f+0x200:0;
- }
- int fdiv4(int f) {
- return (f&0x7e00)?f-0x400:0;
- }
- int fmul4(int f) {
- return (f&0x7e00)?f+0x400:0;
- }
- int fdiv256(int f) {
- return (f&0x7e00)?f-0x1000:0;
- }
- int fmul256(int f) {
- return (f&0x7e00)?f+0x1000:0;
- }
- #endif
- #ifdef __MC6809__
- extern int fadd(int a, int b);
- extern int fsub(int a, int b);
- asm(" .area _CODE
- .globl _fsub
- _fsub: lda 4,s
- eora #128
- sta 4,s
- .globl _fadd
- _fadd: lda 2,s
- anda #0x7E
- bne fadd1
- ldd 4,s
- rts
- fadd1: ldb 4,s
- andb #0x7E
- bne fadd2
- ldd 2,s
- rts
- fadd2: pshs x
- stb ,-s
- suba ,s
- asra
- sta ,s
- bpl fadd3
- neg ,s
- ldd 5,s
- ldx 7,s
- stx 5,s
- std 7,s
- lsra
- rorb
- lda #1
- bra fadd10
- fadd3: ldd 7,s
- anda #1
- ora #2
- tst ,s
- beq fadd4
- lsra
- rorb
- fadd10: dec ,s
- beq fadd4
- lsra
- rorb
- fadd5: dec ,s
- beq fadd4
- lsrb
- bne fadd5
- fadd4: std ,-s
- lda 6,s
- anda #0xFE
- clrb
- tfr d,x
- eora 8,s
- bmi fadd6
- ldd 6,s ; meme signe
- anda #1
- ora #2
- addd ,s++
- bita #4
- beq fadd7
- lsra
- rorb
- leax 512,x
- fadd7: anda #1
- leax d,x
- tfr x,d
- fadd8: puls x,pc
- fadd6: ldd 6,s ; signe diff
- anda #1
- ora #2
- subd ,s++
- beq fadd8
- bpl fadd9
- nega
- negb
- sbca #0
- leax 0x8000,x
- fadd9: bita #2
- bne fadd7
- lslb
- rola
- leax -512,x
- bra fadd9
- ");
- #else
- int fadd(int fa, int fb) {
- int ma, ea;
- int mb, eb;
- ea = (fa & 0x7E00);
- if(!ea) return fb;
- eb = (fb & 0x7E00);
- if(!eb) return fa;
- if(eb>ea) {
- int t;
- t = fb; fb = fa; fa = t;
- t = eb; eb = ea; ea = t;
- }
- mb = (fb&0x1FF) | 0x200;
- for(eb -= ea; eb; eb += 0x200) {
- mb >>= 1;
- if(!mb) return fa;
- }
- ma = (fa&0x1FF) | 0x200;
- ea = fa & 0xFE00;
- if(!btst(fa^fb, 0x8000)) {
- ma += mb;
- if(btst(ma,0x400)) {
- ma >>= 1;
- ea += 0x200;
- }
- } else {
- ma -= mb;
- if(!ma) return 0;
- if(ma<0) {
- ma = -ma;
- ea ^= 0x8000;
- }
- while(!btst(ma, 0x200)) {
- ma <<= 1;
- ea -= 0x200;
- }
- }
- ma &= 0x1FF;
- ma |= ea;
- return ma;
- }
- int fsub(int a, int b) {
- return fadd(a, b^0x8000);
- }
- #endif
- #define fadd2(x,y) fadd(x,y)
- #define fadd3(x,y,z) fadd(fadd(x,y),z)
- #define fadd4(x,y,z,t) fadd(fadd(x,y),fadd(z,t))
- static unsigned char inv_tab[] = {
- 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};
- int finv(int fa) {
- int e = 0;
- if(btst(fa,0x7E00)==0) return P_INF|(fa&0x8000);
- e = 0x8000 - (fa&0x7E00);
- if(btst(fa,0x1FF)) {
- e |= inv_tab[(fa&0x1FF)-1];
- if((fa&0x1FF)<=170) e |= 0x100;
- e -= 0x200;
- }
- return (fa&0x8000) | e;
- }
- int fdiv(int a, int b) {
- if(!b) return a<0?P_INF:M_INF;
- return fmul(a, finv(b));
- }
- static unsigned char tab_sqrt[] = {
- 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};
- int fsqrt(int a) {
- int e = ((a & 0x7e00)>>1) + (16<<9) + tab_sqrt[a&0x1FF];
- if(btst(e, 256)) {
- e &= ~256;
- e = fmul(e, SQRT2);
- }
- //printf("sqrt(%04x) = %04x\n", a, e);
- return e;
- }
- int fcmp(int a, int b) {
- return fsgn(fsub(a,b));
- }
- int atofp(char *s) {
- int f = 0;
- int sgn = 0;
- if(*s=='-') {
- ++s;
- sgn = 0x8000;
- }
- while(*s>='0' && *s<='9') {
- f = fmul(f, TEN);
- f = fadd(f, itof(*s++ - '0'));
- }
- if(*s=='.') {
- int r = I_TEN;
- ++s;
- while(*s>='0' && *s<='9') {
- f = fadd(f, fmul(r, itof(*s++ - '0')));
- r = fmul(r, I_TEN);
- }
- }
- if(*s=='E' || *s=='e') {
- int e = 0;
- ++s;
- while(*s>='0' && *s<='9') {
- e += e<<2; e <<= 1; e += *s++ - '0';
- }
- while(e) {
- f = fmul(f, TEN);
- --e;
- }
- }
- return f|sgn;
- }
- char *ftoa(char *buf, int f) {
- char *s=buf;
- int t;
- if(btst(f,0x7e00)==0) {
- *s++ = '0'; *s = 0;
- return buf;
- }
- if(btst(f,0x8000)) {
- *s++ = '-';
- f &= 0x7FFF;
- }
- t = ftoi(f);
- if(t>=10000) {
- *s++ = '0' + (t/10000);
- t = t % 10000;
- }
- if(t>=1000) {
- *s++ = '0' + (t/1000);
- t = t % 1000;
- }
- if(t>=100) {
- *s++ = '0' + (t/100);
- t = t % 100;
- }
- if(t>=10) {
- *s++ = '0' + (t/10);
- t = t % 10;
- }
- *s++ = '0' + t;
- f = ffrac(f);
- if(f) {
- *s++ = '.';
- t = ftoi(fmul(f, itof(1000)));
- *s++ = '0' + (t/100);
- t = t % 100;
- *s++ = '0' + (t/10);
- t = t % 10;
- *s++ = '0' + t;
- /*
- *s++ = '0' + ftoi(f=fmul(f, TEN)); f=ffrac(f);
- *s++ = '0' + ftoi(f=fmul(f, TEN)); f=ffrac(f);
- *s++ = '0' + ftoi(f=fmul(f, TEN)); f=ffrac(f);
- *s++ = '0' + ftoi(f=fmul(f, TEN));
- */
- }
- *s='\0';
- return buf;
- }
- int frnd() {
- int r = itof(rnd15());
- r = fdiv(r, itof(32767));
- return r;
- }
- //////////////////////////////////////////////////////////////////////////
- typedef unsigned char byte;
- #define VRAM ((byte*)0x4000)
- #define PRC (*((byte*)0xE7C3))
- void hline(byte *line, byte x0, byte x1, byte c);
- void tria_line(int x0, int y0, int x1, int y1);
- #define ____ 0
- #define ___X 1
- #define __X_ 2
- #define __XX 3
- #define _X__ 4
- #define _X_X 5
- #define _XX_ 6
- #define _XXX 7
- #define X___ 8
- #define X__X 9
- #define X_X_ 10
- #define X_XX 11
- #define XX__ 12
- #define XX_X 13
- #define XXX_ 14
- #define XXXX 15
- #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
- byte t_char2[] = {
- ____*16+____,
- ____*16+XXXX,
- XXXX*16+____,
- XXXX*16+XXXX
- };
- byte t_char[] = {
- C(____, _X__,
- ____, _X__,
- ____, _X__,
- ____, ____,
- ____, _X__,
- ____, ____),
- C(X_X_, X_X_,
- X_X_, XXXX,
- ____, X_X_,
- ____, XXXX,
- ____, X_X_,
- ____, ____),
- C(_X__, X_X_,
- XXX_, __X_,
- XX__, _X__,
- _XX_, X___,
- XXX_, X_X_,
- _X__, ____),
- C(_X__, __X_,
- XX_X, _X__,
- _XX_, ____,
- X_X_, ____,
- _X_X, ____,
- ____, ____),
- C(__X_, _X__,
- _X__, __X_,
- _X__, __X_,
- _X__, __X_,
- __X_, _X__,
- ____, ____),
- C(____, ____,
- X_X_, _X__,
- _X__, XXX_,
- X_X_, _X__,
- ____, ____,
- ____, ____),
- C(____, ____,
- ____, ____,
- ____, XXX_,
- __X_, ____,
- _X__, ____,
- ____, ____),
- C(____, __X_,
- ____, __X_,
- ____, _X__,
- ____, X___,
- _X__, X___,
- ____, ____),
- C(XXX_, __X_,
- X_X_, __X_,
- X_X_, __X_,
- X_X_, __X_,
- XXX_, __X_,
- ____, ____),
- C(XXX_, XXX_,
- __X_, __X_,
- XXX_, _XX_,
- X___, __X_,
- XXX_, XXX_,
- ____, ____),
- C(X_X_, XXX_,
- X_X_, X___,
- XXX_, XXX_,
- __X_, __X_,
- __X_, XXX_,
- ____, ____),
- C(XXX_, XXX_,
- X___, __X_,
- XXX_, __X_,
- X_X_, __X_,
- XXX_, __X_,
- ____, ____),
- C(XXX_, XXX_,
- X_X_, X_X_,
- XXX_, XXX_,
- X_X_, __X_,
- XXX_, XXX_,
- ____, ____),
- C(____, ____,
- __X_, __X_,
- ____, ____,
- __X_, __X_,
- ____, _X__,
- ____, ____),
- C(__X_, ____,
- _X__, XXX_,
- X___, ____,
- _X__, XXX_,
- __X_, ____,
- ____, ____),
- C(X___, XX__,
- _X__, __X_,
- __X_, _X__,
- _X__, ____,
- X___, _X__,
- ____, ____),
- C(_X__, _X__,
- X_X_, X_X_,
- XXX_, XXX_,
- X_X_, X_X_,
- _XXX, X_X_,
- ____, ____),
- C(XX__, _XX_,
- X_X_, X___,
- XX__, X___,
- X_X_, X___,
- XXX_, _XX_,
- ____, ____),
- C(XX__, XXX_,
- X_X_, X___,
- X_X_, XX__,
- X_X_, X___,
- XX__, XXX_,
- ____, ____),
- C(XXX_, _XX_,
- X___, X___,
- XX__, X_X_,
- X___, X_X_,
- X___, _XX_,
- ____, ____),
- C(X_X_, XXX_,
- X_X_, _X__,
- XXX_, _X__,
- X_X_, _X__,
- X_X_, XXX_,
- ____, ____),
- C(_XXX, X_X_,
- __X_, X_X_,
- __X_, XX__,
- X_X_, X_X_,
- _X__, X_X_,
- ____, ____),
- C(X___, X_X_,
- X___, XXX_,
- X___, XXX_,
- X___, X_X_,
- XXX_, X_X_,
- ____, ____),
- C(X_X_, _X__,
- XXX_, X_X_,
- XXX_, X_X_,
- XXX_, X_X_,
- X_X_, _X__,
- ____, ____),
- C(XX__, _X__,
- X_X_, X_X_,
- XX__, X_X_,
- X___, X_X_,
- X___, _XXX,
- ____, ____),
- C(XX__, _XX_,
- X_X_, X___,
- XX__, _X__,
- X_X_, __X_,
- X_X_, XX__,
- ____, ____),
- C(XXX_, X_X_,
- _X__, X_X_,
- _X__, X_X_,
- _X__, X_X_,
- _X__, XXX_,
- ____, ____),
- C(X_X_, X_X_,
- X_X_, X_X_,
- X_X_, XXX_,
- X_X_, XXX_,
- _X__, _XX_,
- ____, ____),
- C(X_X_, X_X_,
- X_X_, X_X_,
- _X__, XXX_,
- X_X_, _X__,
- X_X_, _X__,
- ____, ____),
- C(XXX_, XXX_,
- __X_, X___,
- _X__, X___,
- X___, X___,
- XXX_, XXX_,
- ____, ____),
- C(X___, XXX_,
- X___, __X_,
- _X__, __X_,
- __X_, __X_,
- __X_, XXX_,
- ____, ____),
- C(_X__, ____,
- X_X_, ____,
- ____, ____,
- ____, ____,
- ____, ____,
- ____, XXXX)
- };
- byte *pchar(byte *p, byte c, byte *forme, byte *fond) {
- byte *msk, *prc = (byte*)0xE7C3, v;
- if(c>='a' && c<='z') c += 'A' - 'a';
- if(c<' ') c = ' '; else if(c>'_') c = '_';
- c -= ' ';
- msk = &t_char[(c&~1) + ((c&~1)<<1)];
- if(c&1) {
- v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>2) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- ++*prc;
- p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- ++*prc;
- } else {
- v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- v = t_char2[(*msk++>>6) & 3]; *p = (*forme++ & v) | (*fond++ & ~v); p+=40;
- ++*prc;
- p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- p-=40; v = t_char2[(*--msk>>4) & 3]; *p = (*--forme & v) | (*--fond & ~v);
- ++*prc;
- }
- return ++p;
- }
- byte forme[] = {0xBB,0xDD,0xFF,0xFF,0xDD,0xBB};
- byte fond[] = {0x00,0x00,0x00,0x00,0x00,0x00};
- void pstr(char *s, byte x, byte y, byte *forme, byte *fond) {
- byte *p;
- p = (byte*)0x4000+x+mul8(y,240);
- *(byte*)0xE7C3 |= 1;
- while(*s) p = pchar(p, *s++, forme, fond);
- }
- #ifdef __MC6809__
- extern void pset(byte x, byte y, byte col);
- extern void pset2(byte x, byte y, byte col1, byte col2);
- asm(" .area _CODE
- .globl _pset
- _pset: pshs x
- ldx #0x4000
- lda 5,s
- ldb #40
- mul
- leax d,x
- ldb 4,s
- lsrb
- bcs pset1
- lda 6,s
- lsla
- lsla
- lsla
- lsla
- sta ,-s
- lda #15
- sta ,-s
- bra pset2
- pset1: lda 6,s
- sta ,-s
- lda #240
- sta ,-s
- pset2: lda 0xE7C3
- ora #1
- lsrb
- sbca #0
- sta 0xE7C3
- abx
- lda ,x
- anda ,s+
- ora ,s+
- sta ,x
- puls x,pc
- .globl _pset2
- _pset2: pshs x
- ldx #0x4000
- lda 5,s
- ldb #40
- mul
- leax d,x
- ldb 4,s
- lsrb
- bcs pset3
- lda 7,s
- lsla
- lsla
- lsla
- lsla
- sta ,-s
- lda #15
- sta ,-s
- lda 8,s
- lsla
- lsla
- lsla
- lsla
- sta ,-s
- lda #15
- sta ,-s
- bra pset4
- pset3: lda 7,s
- sta ,-s
- lda #240
- sta ,-s
- lda 8,s
- sta ,-s
- lda #240
- sta ,-s
- pset4: lda 0xE7C3
- ora #1
- lsrb
- sbca #0
- sta 0xE7C3
- abx
- lda ,x
- anda ,s+
- ora ,s+
- sta ,x
- leax 40,x
- lda ,x
- anda ,s+
- ora ,s+
- sta ,x
- puls x,pc
- ");
- #else
- void pset(byte x, byte y, byte col) {
- }
- void pset2(byte x, byte y, byte col1, byte col2) {
- }
- #endif
- #ifdef __MC6809__
- void line(/*9*/int x0, /*11*/int y0, /*13*/int x1, /*15*/int y1, /*17*/byte col);
- asm(" .area _CODE
- .globl _line
- line2: puls x,y,u,dp,pc
- _line: lda 10,s
- lsla
- lsla
- lsla
- lsla
- ora 10,s
- sta 10,s
- pshs x,y,u,dp
- leay 9,s
- ldd 4,y
- subd ,y
- bge line1
- nega
- negb
- sbca #0
- ldx ,y
- ldu 4,y
- stu ,y
- stx 4,y
- ldx 2,y
- ldu 6,y
- stx 6,y
- stu 2,y
- line1: tfr d,u
- ldx 4,y
- blt line2
- ldx ,y
- cmpx #160
- bge line2
- ldx #0x2841
- ldd 6,y
- subd 2,y
- bge line4
- nega
- negb
- sbca #0
- ldx #0xd85f
- line4: exg x,d ; d=d8ff u=dx x=dy
- tfr a,dp
- stu ,--s
- cmpx ,s++
- lbgt line5
- ; dy<=dx
- stx line11-9 ; dy
- stu line11-4 ; dx
- stb line11-1 ; sy (u)
- tfr u,d
- lsra
- rorb
- ldx ,y
- leay 1,u
- ldu 11,s
- line6: cmpu #200
- bhs line7
- line10: cmpx #160
- blo line8
- line7: leax 1,x
- subd #1234
- bge line11
- addd #1234
- leau 1,u
- line11: leay -1,y
- bne line6
- puls x,y,u,dp,pc
- line8: pshs d,y
- ldd line11-9 ; dy
- std line16-12
- ldd line11-4 ; dx
- std line16-7
- ldb line11-1 ; sy
- stb line16-1
- lda #0xE7
- exg a,dp
- sta line16-3 ; sp
- lda 17+4,s ; recopie pour
- sta ,-s ; acces rapide
- tfr x,d
- lda #15
- lsrb
- bcc line12
- coma
- line12: sta ,-s
- lda #0x40
- lsrb
- tfr d,y
- lda *0xC3
- ora #1
- sbca #0
- sta *0xC3
- tfr u,d
- lda #40
- mul
- leay d,y
- line13: ldd ,s
- com ,s
- anda ,y
- andb ,s
- sta ,y
- orb ,y
- stb ,y
- tst ,s
- bmi line14
- lda *0xC3
- inca
- sta *0xC3
- anda #1
- leay a,y
- line14: leax 1,x
- cmpx #160
- bge line17
- ldd 2,s
- subd #1234 ; dy=l16-12
- bge line15
- addd #5678 ; dx=l16-7
- leay 40,y ; sp=l16-3
- leau -1,u ; sy=l16-1
- line16: cmpu #200
- bhs line17
- line15: std 2,s
- dec 5,s
- bne line13
- line17: leas 6,s
- puls x,y,u,dp,pc
- line5: stx line22+8 ; dy
- stu line22+3 ; dx
- stb line22+1 ; sy (u)
- tfr x,d
- lsra
- rorb
- leay 1,x
- ldx 9,s
- ldu 11,s
- line20: cmpx #160
- bhs line22
- line21: cmpu #200
- blo line24
- line22: leau 1,u
- subd #1234
- bge line23
- addd #1234
- leax 1,x
- line23: leay -1,y
- bne line20
- puls x,y,u,dp,pc
- line24: pshs d,y
- ldb line22+1 ; sy
- stb line27+1
- ldd line22+3 ; dx
- std line27+6
- ldd line22+8 ; dy
- std line27+11
- lda #0xE7
- exg a,dp
- sta line27+4
- lda 17+4,s ; recopie pour
- sta ,-s ; acces rapide
- tfr x,d
- lda #15
- lsrb
- bcc line25
- coma
- line25: sta ,-s
- lda #0x40
- lsrb
- tfr d,y
- lda *0xC3
- ora #1
- sbca #0
- sta *0xC3
- tfr u,d
- lda #40
- mul
- leay d,y
- line26: cmpu #200
- bhs line29
- lda ,s
- ldb ,s
- comb
- anda ,y
- andb 1,s
- sta ,y
- orb ,y
- stb ,y
- ldd 2,s
- line27: leau 1,u
- leay 40,y
- subd #1234
- bge line28
- addd #5678
- com ,s
- bmi line30
- sta ,-s
- lda *0xC3
- inca
- sta *0xC3
- anda #1
- leay a,y
- lda ,s+
- line30: leax 1,x
- cmpx #160
- bge line29
- line28: std 2,s
- dec 5,s
- bne line26
- line29: leas 6,s
- puls x,y,u,dp,pc
- ");
- #else
- void line(int x0, int y0, int x1, int y1, byte col) {
- int dx, dy, i, c, sy, sp;
- dx = x1 - x0;
- if(dx<0) {
- int t;
- dx = -dx;
- t = x0; x0 = x1; x1 = t;
- t = y0; y0 = y1; y1 = t;
- }
- // sx = 1
- if(x1<0 || x0>159) return;
- dy = y1 - y0;
- if(dy<0) {
- dy = -dy;
- sp = -40; sy = -1;
- } else {
- sp = +40; sy = +1;
- }
- // on itere jusqu'a ce que x0,y0 soit dans la fenetre
- if(dx>=dy) {
- c = dx>>1; i = dx + 1;
- for(;i && (((unsigned)y0>=200u) || ((unsigned)x0>=160u));--i) {
- ++x0;
- if((c-=dy)<0) {c+=dx; y0+=sy;}
- }
- } else {
- c = dy>>1; i = dy + 1;
- for(;i && (((unsigned)y0>=200u) || ((unsigned)x0>=160u));--i) {
- y0 += sy;
- if((c-=dx)<0) {c+=dy; ++x0;}
- }
- }
- if(!i) return;
- // on itere tant que x0,y0 est dans la fenetre
- {
- byte *p, *prc = (void*)0xe7c3, m = 0x0F, d;
- col |= col<<4;
- if(((byte)x0)&1) m=~m;
- if(((byte)x0)&2) {*prc &= 254; d = 0;} else {*prc |= 1; d = 1;}
- p = (void*)(0x4000 + mul8(y0,40) + (x0>>2));
- if(dx>=dy) {
- for(;i && ((unsigned)y0<200u);--i) {
- *p &= m; m = ~m; *p |= col&m;
- if(!(m&128)) {++*prc; p += (d^=1);}
- ++x0; if(x0>159) return;
- if((c-=dy)<0) {c+=dx; y0+=sy; p+=sp;}
- }
- } else {
- for(;i && ((unsigned)y0<200u);--i) {
- *p = (*p & m) | (col & ~m);
- p += sp; y0 += sy;
- if((c-=dx)<0) {
- c+=dy; m = ~m; if(!(m&128)) {++*prc; p += (d^=1);}
- ++x0; if(x0>159) return;
- }
- }
- }
- }
- }
- #endif
- byte tria_buf[400]; //min-max
- #ifdef __MC6809__
- void triangle(int x0, int y0, int x1, int y1, int x2, int y2, byte c) ;
- asm(" .area _CODE
- .globl _triangle
- _triangle:
- pshs x,y,u
- ldx #161<<8
- ldu #_tria_buf
- cmpx ,u
- beq tria2
- lda #200
- tria1: stx ,u++
- deca
- bne tria1
- tria2: leay 8,s
- ldx 2,y
- cmpx 6,y
- ble tria3
- ldu 6,y
- stx 6,y
- stu 2,y
- ldx ,y
- ldu 4,y
- stx 4,y
- stu ,y
- ldx 2,y
- tria3: cmpx 10,y
- ble tria4
- ldu 10,y
- stx 10,y
- stu 2,y
- ldx ,y
- ldu 8,y
- stx 8,y
- stu ,y
- tria4: ldx 6,y
- cmpx 10,y
- ble tria5
- ldu 10,y
- stx 10,y
- stu 6,y
- ldx 4,y
- ldu 8,y
- stx 8,y
- stu 4,y
- tria5: ldx 10,y
- bge tria7
- tria6: puls x,y,u,pc
- tria7: ldx 2,y
- cmpx #200
- bge tria6
- ldx ,y
- leax 1,x
- stx ,y
- ldx 4,y
- leax 1,x
- stx 4,y
- ldx 8,y
- leax 1,x
- stx 8,y
- ldu 10,y
- pshs x,u
- ldu 6,y
- ldx 4,y
- pshs x,u
- jsr _tria_line
- ldu 2,y
- ldx ,y
- pshs x,u
- jsr _tria_line
- leas 8,s
- pshs x,u
- jsr _tria_line
- leas 3,s
- ldx 10,y
- cmpx #199
- ble tria8
- ldx #199
- stx 10,y
- tria8: lda 12,y
- lsla
- lsla
- lsla
- lsla
- ora 12,y
- sta 4,s
- ldu #_tria_buf
- ldd 2,y
- bgt tria9
- leay 1,x
- ldx #0x4000
- bra tria11
- tria9: lslb
- rola
- leau d,u
- ldb 3,y
- lda #40
- mul
- adda #0x40
- tfr d,x
- ldd 10,y
- subd 2,y
- ldy #1
- leay d,y
- tria11: ldd ,u
- cmpb ,u
- blo tria12
- std 2,s
- stx ,s
- jsr _hline
- leax 40,x
- ldb #161
- stb ,u+
- clr ,u+
- leay -1,y
- bne tria11
- tria12: leas 5,s
- puls x,y,u,pc
- ");
- #else
- void triangle(int x0, int y0, int x1, int y1, int x2, int y2, byte c) {
- int t, l;
- byte *v, *p;
- // initialize
- if(tria_buf[0]!=161) {
- int t, val = 161u<<8, *pp;
- for(pp=(int*)tria_buf, t=200; t; --t) *pp++ = val;
- }
- // ensure y0 <= y1 <= y2
- if(y0>y1) {t=y0;y0=y1;y1=t; t=x0;x0=x1;x1=t;}
- if(y0>y2) {t=y0;y0=y2;y2=t; t=x0;x0=x2;x2=t;}
- if(y1>y2) {t=y1;y1=y2;y2=t; t=x1;x1=x2;x2=t;}
- // test if nothing is to be displayed
- if(y2<0 || y0>=200) return;
- // offset
- ++x0; ++x1; ++x2;
- // compute min/max for each line
- tria_line(x1,y1, x2,y2);
- tria_line(x0,y0, x1,y1);
- tria_line(x0,y0, x2,y2);
- // draw triangle
- if(y2>199) y2 = 199;
- if(y0>=0) {
- v = VRAM + mul8(40,y0);
- p = tria_buf + y0 + y0;
- l = y2-y0;
- } else {
- v = VRAM;
- p = tria_buf;
- l = y2;
- }
- l = l + 1;
- c |= c<<4;
- while(p[0]<=p[1]) {
- //printf("%d %d\n", p[0], p[1]);
- hline(v,p[0],p[1],c);
- v+=40; *p++ = 161; *p++ = 0;
- if(!--l) break;
- }
- }
- #endif
- #ifdef __MC6809__
- asm(" .area _CODE
- .globl _hline
- _hline: pshs x,dp
- lda #0xE7
- tfr a,dp
- ldb 8,s
- beq hline1
- decb
- lda 7,s
- beq hline2
- deca
- hline2: cmpa #160
- beq hline1
- cmpb #160
- bne hline3
- ldb #159
- hline3: sta ,-s
- subb ,s
- stb ,s
- ldx 6,s
- ldb #15
- lsra
- bcc hline4
- comb
- hline4: stb ,-s
- ldb *0xC3
- orb #1
- lsra
- sbcb #0
- stb *0xC3
- leax a,x
- lda 1,s
- bne hline5
- hlin12: lda ,s
- ldb ,s
- coma
- anda 11,s
- andb ,x
- stb ,x
- ora ,x
- sta ,x
- leas 2,s
- hline1: puls x,dp,pc
- hline5: inca
- ldb ,s
- bpl hline6
- ldb ,x
- andb #0xF0
- stb ,x
- ldb #0x0F
- stb ,s
- andb 11,s
- orb ,x
- stb ,x
- ldb *0xC3
- incb
- stb *0xC3
- andb #1
- abx
- deca
- hline6: suba #4
- bcs hline9
- ldb *0xC3
- lsrb
- ldb 11,s
- bcc hline7
- hlin10: stb ,x
- inc *0xC3
- stb ,x+
- inc *0xC3
- suba #4
- bcc hlin10
- bra hline9
- hline7: stb ,x+
- inc *0xC3
- stb ,x
- inc *0xC3
- suba #4
- bcc hline7
- hline9: ldb 11,s
- bita #2
- beq hlin11
- stb ,x
- ldb *0xC3
- incb
- stb *0xC3
- andb #1
- abx
- hlin11: bita #1
- bne hlin12
- leas 2,s
- puls x,dp,pc
- ");
- #else
- void hline(byte *line, byte x0, byte x1, byte c) {
- byte len, msk, dlt;
- register byte *prc /*asm("y")*/ = &PRC;
- if(x1==0) return;
- if(x0==161) return;
- if(x0) --x0;
- if(x1==161) x1=159; else --x1;
- //printf("%d->%d\n",x0&255,x1&255); return;
- //c |= c<<4;
- //if(x1<x0) {len = x0 - x1; x0 = x1;} else
- len = x1 - x0;
- msk = 0xF0 ^ ((x0&1)-1);
- if(x0&2) {*prc &= 254; dlt = 0;} else {*prc |= 1; dlt = 1;}
- line += x0>>2;
- if(len==0) {
- *line = (*line & msk) | (c & ~msk);
- return;
- }
- ++len;
- if(msk & 128) {
- *line = (*line & 240) | (c & 15);
- msk = ~msk; ++*prc; line += (dlt ^= 1);
- --len;
- }
- if(dlt) {
- for(;len>=4; len-=4) {
- *line = c; ++*prc; *line++ = c; ++*prc;
- }
- dlt=0;
- } else {
- for(;len>=4; len-=4) {
- *line++ = c; ++*prc; *line = c; ++*prc;
- }
- dlt = 1;
- }
- if(len&2) {
- *line = c; ++*prc; line += dlt;
- }
- if(len&1) *line = (*line & msk) | (c & ~msk);
- }
- #endif
- #ifdef __MC6809__
- asm(" .area _CODE
- .globl _tria_line
- _tria_line:
- ldd 4,s
- cmpd #199
- ble trial1
- rts
- trial1: pshs x,y,u
- leay 8,s
- ldu #_tria_buf
- lslb
- rola
- leau d,u
- ldx #0x3001
- ldd 6,y
- subd 2,y
- pshs d
- ldd 4,y
- subd ,y
- bge trial3
- nega
- negb
- sbca #0
- ldx #0x301f
- trial3: cmpd ,s
- blt trial8
- stx trial4
- ldx ,s
- stx trial4+3
- std trial4+8
- addd #1
- std ,s
- lsra
- rorb
- ldx ,y
- ldy 2,y
- trial7: cmpy #0
- blt trial4
- bsr tria_pset
- trial4: leax -1,x
- subd #1234
- bge trial5
- addd #4567
- leau 2,u
- leay 1,y
- cmpy #200
- bge trial6
- trial5: dec 1,s
- bne trial7
- dec ,s
- bge trial7
- trial6: puls d,x,y,u,pc
- tria_pset:
- pshs d
- tfr x,d
- cmpx #0
- bge triap1
- clrb
- bra triap2
- triap1: cmpx #161
- blt triap2
- ldb #161
- triap2: cmpb ,u
- bhs triap3
- stb ,u
- triap3: cmpb 1,u
- bls triap4
- stb 1,u
- triap4: puls d,pc
- trial8: stx tril11-2
- std tril11-9
- ldx ,s
- stx tril11-4
- ldd 6,y
- cmpd #199
- ble tril8
- ldd #199
- tril8: subd 2,y
- addd #1
- std ,s
- tfr x,d
- lsra
- rorb
- ldx ,y
- ldy 2,y
- trial9: cmpy #0
- blt tril10
- bsr tria_pset
- tril10: leau 2,u
- leay 1,y
- subd #1234
- bge tril11
- addd #4567
- leax 1,x
- tril11: dec 1,s
- bne trial9
- dec ,s
- bge trial9
- puls d,x,y,u,pc
- ");
- #else
- void tria_pset(byte *p, int x0);
- void tria_line(int x0, int y0, int x1, int y1) {
- byte *p;
- // par construction y0 <= y1
- int dx, dy = y1 - y0, i;
- int sx; int c;
- if(y0>199) return;
- p = tria_buf + y0 + y0;
- dx = x1 - x0;
- sx = +1;
- if(dx<0) {
- dx = -dx;
- sx = -1;
- }
- if(dx>=dy) {
- c = dx>>1; i = dx + 1;
- for(;i;--i) {
- if(y0>=0)
- tria_pset(p,x0);
- x0+=sx;
- if((c-=dy)<0) {
- c+=dx;
- p+=2;
- ++y0;
- if(y0>=200) return;
- }
- }
- } else {
- c = dy>>1;
- if(y1>199) y1=199;
- for(i = y1 - y0 + 1; i; --i) {
- if(y0>=0)
- tria_pset(p, x0);
- p+=2; ++y0;
- if((c-=dx)<0) {c+=dy; x0+=sx;}
- }
- }
- }
- void tria_pset(byte *p, int x0) {
- if(x0<0) x0 = 0; else
- if(x0>160) x0 = 161;
- if(x0<p[0]) p[0] = x0;
- if(x0>p[1]) p[1] = x0;
- }
- #endif
- int btst(int a, int msk) {
- return a & msk;
- }
- /////////////////////////////////////////////////////////////////////////////
- typedef struct {
- unsigned int x;
- unsigned int y;
- unsigned int z;
- } point;
- #define DEG 6
- #define COTE (1<<DEG)
- #define COTE_DIV_2 (COTE>>1)
- #define T_OFFSET 100
- static int K,iMAX,iCOTE;
- static byte tab[(COTE+1)*(COTE+1)] = {
- // $ 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
- #include "france.h"
- };
- static point P0, Pl, Pe;
- static int P[3][3], Q, N, N5;
- byte STEP = 1;
- byte use_map = 1;
- byte use_stars = 1;
- byte no_z = 0;
- byte col_mode = 2;
- byte tri_mode = 2;
- #define T(x,y) (*(tab+(x)+(y)+((y)<<DEG)))
- //#define T(x,y) (*(tab+(x)+mul8(y,COTE+1)))
- int pt_norm(point *p) {
- return fsqrt(fadd3(fsqr(p->x), fsqr(p->y), fsqr(p->z)));
- }
- point *pt_diff(point *r, point *p, point *q) {
- r->x = fsub(p->x, q->x);
- r->y = fsub(p->y, q->y);
- r->z = fsub(p->z, q->z);
- return r;
- }
- void pt_normalize(point *p) {
- int r = pt_norm(p);
- if(r) {
- p->x = fdiv(p->x, r);
- p->y = fdiv(p->y, r);
- p->z = fdiv(p->z, r);
- }
- }
- int pt_dist(point *p, point *q) {
- int t = 0;
- t = fadd(t, fsqr(fsub(p->x, q->x)));
- t = fadd(t, fsqr(fsub(p->y, q->y)));
- t = fadd(t, fsqr(fsub(p->z, q->z)));
- return fsqrt(t);
- }
- int fpr(char *p, int f) {
- //static char buf[16];
- ps(p);
- px(f);
- pc('\n');
- //printf(ftoa(&buf[0], f));
- //printf(" (%04x)\n", f);
- //printf("X0=%04x\n", P0.x);
- return 0;
- }
- int RAYON = 40;
- int THETA = 16;
- int RHO = 8;
- int my_sin(int i) {
- unsigned char tab[32] = {
- 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
- };
- if(i<0) return fneg(my_sin(-i));
- i &= 127;
- if(i==32) return ONE;
- if(i>=64) return fneg(my_sin(i-64));
- if(i>32) i = 64-i;
- return fdiv256(itof(tab[i]));
- }
- int my_cos(int i) {
- return my_sin(32+i);
- }
- void init_points() {
- iCOTE = fdiv(itof(40),itof(COTE));
- {
- int g = itof(RAYON);
- int f = fmul(g, my_cos(RHO));
- P0.x = fmul(f,my_cos(THETA));
- P0.y = fmul(f,my_sin(THETA));
- P0.z = fmul(g,my_sin(RHO));
- }
- //P0.x = itof(21);
- //P0.y = itof(11);
- //P0.z = itof(11);
- //fpr("X0=",P0.x);
- //fpr("Y0=",P0.y);
- //fpr("Z0=",P0.z);
- K = (32767*0.3);
- //fpr("K =",K);
- Pl.x = fadd(ONE,I_TWO); //ZERO;
- Pl.y = fadd(ONE,I_THREE); //ONE;
- Pl.z = fadd(ONE,ZERO); //I_TWO;
- //fpr("Xl=",Pl.x);
- //fpr("Yl=",Pl.y);
- //fpr("Zl=",Pl.z);
- Pe.x = fdiv2(P0.x); //fadd(fdiv2(P0.x),itof(0));
- Pe.y = fdiv2(P0.y); //fadd(fdiv2(P0.y),itof(-1));
- Pe.z = fdiv2(P0.z); //fmul(fmul(FIVE,P0.z),I_EIGHT);
- //fpr("Xe=",Pe.x);
- //fpr("Ye=",Pe.y);
- //fpr("Ze=",Pe.z);
- pt_normalize(&Pl);
- }
- void init_trans() {
- Q = fsqrt(fadd(fsqr(fsub(P0.x, Pe.x)), fsqr(fsub(P0.y, Pe.y))));
- N = pt_dist(&Pe, &P0);
- if(fsgn(Q)==0) Q = EPS;
- if(fsgn(N)==0) N = EPS;
- N5 = fmul(FIVE, N);
- //fpr("Q=", Q);
- //fpr("N=", N);
- P[0][0] = fdiv(fsub(P0.x, Pe.x), N);
- P[0][1] = fdiv(fsub(P0.y, Pe.y), N);
- P[0][2] = fdiv(fsub(P0.z, Pe.z), N);
- P[1][0] = fdiv(fsub(Pe.y, P0.y), Q);
- P[1][1] = fdiv(fsub(P0.x, Pe.x), Q);
- P[1][2] = 0;
- P[2][0] = fneg(fmul(P[0][2],P[1][1]));
- P[2][1] = fmul(P[0][2],P[1][0]);
- P[2][2] = fdiv(Q, N);
- //fpr("P00=", P[0][0]);
- //fpr("P01=", P[0][1]);
- //fpr("P02=", P[0][2]);
- }
- void proj(point *p, int *x, int *y) {
- int tx = fsub(p->x, Pe.x);
- int ty = fsub(p->y, Pe.y);
- int tz = fsub(p->z, Pe.z);
- int xa = fadd3(fmul(tx,P[0][0]), fmul(ty, P[0][1]), fmul(tz, P[0][2]));
- int ya = //fadd3(fmul(tx,P[1][0]), fmul(ty, P[1][1]), fmul(tz, P[1][2]));
- fadd2(fmul(tx,P[1][0]), fmul(ty, P[1][1]));
- int za = fadd3(fmul(tx,P[2][0]), fmul(ty, P[2][1]), fmul(tz, P[2][2]));
- int f;
- f = fdiv(N5,fsub(N,xa));
- *x = 80 + ftoi( fmul(ya, f));
- *y = 100 - ftoi(fmul2(fmul(za, f)));
- //printf("tx=%04x, ty=%04x, tz=%04x\n", tx, ty, tz);
- //printf("xa=%04x, ya=%04x, za=%04x\n", xa, ya, za);
- //printf("sub(%04x, %04x)=%04x\n", N,xa, fsub(N,xa));
- //printf("f=%04x, x=%04x y=%04x z=%04x N=%04x\n", f, xa, ya, za, N);
- //printf("x=%d, y=%d\n", *x, *y);
- }
- void pstr_(char *s, point *p) {
- int x,y;
- proj(p,&x,&y);
- p = (byte*)0x4000+(x>>2)+mul8(y,40);
- *(byte*)0xE7C3 |= 1;
- while(*s) p = pchar(p, *s++, forme, fond);
- }
- void clear_T() {
- int i;
- for(i=sizeof(tab)/sizeof(tab[0]); i;) tab[--i] = T_OFFSET;
- }
- int G(byte i, byte j);
- void S(byte i, byte j, int v, byte s);
- void init_france() {
- {
- byte max = 1, i;
- for(i=0; i<=COTE; ++i) {
- byte j;
- for(j=0; j<=COTE;++j) {
- int t = T(i,j);
- T(i,j) = t<=0 ? 0 : t;
- if(t>max) max = t;
- }
- }
- //printf("max=%d\n", max);
- //exit(0);
- iMAX = fdiv(TEN, itof(max));
- //fpr("MAX=", MAX);
- //exit(0);
- }
- }
- void init_T() {
- {
- byte d=COTE, s=0, i;
- for(i=DEG; i; --i) {
- byte x;
- d >>= 1; ++s;
- for(x=d; x<=COTE; x+=d+d) {
- byte y;
- for(y=d; y<=COTE; y+=d+d) {
- int G1 = G(x-d,y-d)+G(x-d,y+d);
- int G2 = G(x+d,y-d)+G(x+d,y+d);
- S(x,y, (G1+G2)>>2, s);
- G1>>=1; G2>>=1;
- S(x-d,y, G1, s);
- S(x+d,y, G2, s);
- S(x,y-d, G1, s);
- S(x,y+d, G2, s);
- }
- }
- }
- }
- //printf("normalizing...");
- {
- byte max = 1, i;
- for(i=0; i<=COTE; ++i) {
- byte j;
- for(j=0; j<=COTE;++j) {
- int t = T(i,j) - T_OFFSET;
- T(i,j) = t<=0 ? 0 : t;
- if(t>max) max = t;
- }
- }
- //printf("max=%d\n", max);
- //exit(0);
- iMAX = fdiv(TEN, itof(max));
- //fpr("MAX=", MAX);
- //exit(0);
- }
- //printf("\r \r");
- }
- int G(byte i, byte j) {
- return T(i,j);
- }
- void S(byte i, byte j, int v, byte s) {
- int t = (rnd15() - K)>>8;
- while(s) {t>>=1;--s;}
- T(i,j) = v + t;
- }
- int coul_flat(int h) {
- static byte c[] = {
- /* 0 */ 1,
- /* 1 */ 2,
- /* 2 */ 3,
- /* 3 */ 4,
- /* 4 */ 5,
- /* 5 */ 6,
- /* 6 */ 7,
- /* 7 */ 8,
- /* 8 */ 9,
- /* 9 */ 9,
- /* 10 */ 10,
- /* 11 */ 10,
- /* 12 */ 11,
- /* 13 */ 12,
- /* 14 */ 13,
- /* 15 */ 14,
- /* 16 */ 15
- };
- return c[(ftoi(fmul(iMAX,itof(h)))+1)>>1];
- }
- /*
- void disp_over() {
- byte i;
- _putc(12);
- for(i=0; i<200; ++i) {
- pset(mod16(rnd15(),160), mod16(rnd15(),200), 11+mod16(rnd15(),5));
- }
- for(i=0;i<COTE;++i) {
- byte j;
- for(j=0;j<COTE;++j) {
- int s = T(i+1,j)+T(i,j+1);
- pset2(j, i<<1,
- coul_flat(s+T(i+0,j+0)),
- coul_flat(s+T(i+1,j+1)));
- }
- }
- }
- */
- void disp_over() {
- byte *prc = (byte*)0xE7C3;
- byte *p=(byte*)0x4000;
- byte j;
- _putc(12);
- if(use_stars)
- for(j=200; j; --j) {
- pset(mod16(rnd15(),160), mod16(rnd15(),200), 11+mod16(rnd15(),5));
- }
- if(!use_map) return;
- *prc|=1;
- for(j=0; j<COTE; j+=2) {
- byte i;
- for(i=0;i<COTE;++i) {
- int s1 = T(i+1,j) + T(i+0,j+1);
- int s2 = T(i+1,j+1) + T(i+1,j+2);
- {
- byte c;
- c = coul_flat(s1+T(i+0,j+0))<<4;
- c |= coul_flat(s2+T(i+0,j+1));
- *p = c; p+=40;
- }
- {
- byte c;
- c = coul_flat(s1+T(i+1,j+1))<<4;
- c |= coul_flat(s2+T(i+1,j+2));
- *p = c; p+=40;
- }
- }
- ++*prc; p-=80*COTE;
- if(1 & *prc) ++p;
- }
- }
- point *get_pt(point *res, int i, int j) {
- res->x = fmul(iCOTE, itof(i-COTE_DIV_2));
- res->y = fmul(iCOTE, itof(j-COTE_DIV_2));
- res->z = fmul(iMAX, itof(T(i,j)));
- return res;
- }
- void angle(point *p1, point *p2, point *p3, int *p, int *q) {
- int xu = fsub(p2->x, p1->x);
- int yu = fsub(p2->y, p1->y);
- int zu = fsub(p2->z, p1->z);
- int xv = fsub(p3->x, p1->x);
- int yv = fsub(p3->y, p1->y);
- int zv = fsub(p3->z, p1->z);
- int xn = fsub(fmul(yu,zv), fmul(zu, yv));
- int yn = fsub(fmul(zu,xv), fmul(zv, xu));
- int zn = fsub(fmul(xu,yv), fmul(yu, xv));
- int r = fsqrt(fadd3(fsqr(xn),fsqr(yn),fsqr(zn)));
- if(fsgn(r)==0) r = EPS;
- r = finv(r);
- xn = fmul(xn,r);
- yn = fmul(yn,r);
- zn = fmul(zn,r);
- *p = fadd3(fmul(xn, Pl.x),
- fmul(yn, Pl.y),
- fmul(zn, Pl.z));
- *q = fadd3(fmul(xn, fsub(P0.x, p1->x)),
- fmul(yn, fsub(P0.y, p1->y)),
- fmul(zn, fsub(P0.z, p1->z)));
- }
- int coul(point *p1, point *p2, point *p3) {
- int p, q, col;
- angle(p1,p2,p3, &p, &q);
- if(!fsgn(p1->z) && !fsgn(p2->z) && !fsgn(p3->z))
- col = 1;
- else if(fsgn(p)<=0 || fsgn(q)<0)
- col = 0;
- else {
- // 1 - ARCCOS(x)/(PI/2)
- static byte conv[256] = {
- 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};
- int zi = fadd3(p1->z, p2->z, p3->z);
- zi = ftoi(fmul256(fmul(zi, I_THREE)));
- //if(p<0) p = 0;
- p = ftoi(fmul256(p));
- if(p>=256) p = 256; else p = conv[p];
- if(0) {}
- else if(zi<=(int)(2.5*256)) col = 2 + (p>>7);
- else if(zi<=(int)(7.5*256)) col = 5 + (p>>6) + (p>>8);
- else col = 11 + (p>>6);
- }
- return col;
- }
- void face(point *p1, point *p2, point *p3) {
- int x1, y1, x2, y2, x3, y3, col = coul(p1,p2,p3);
- proj(p1, &x1, &y1);
- proj(p2, &x2, &y2);
- proj(p3, &x3, &y3);
- triangle(x1, y1, x2, y2, x3, y3, col);
- printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
- }
- void tri_wire(int x1, int y1, int x2, int y2, int x3, int y3, byte c) {
- line(x1,y1,x2,y2,c);
- line(x1,y1,x3,y3,c);
- line(x2,y2,x3,y3,c);
- }
- void facette00(int i, int j, int di, int dj) {
- point p1, p2, p3;
- int x1, y1, x2, y2, x3, y3, col = 1;
- get_pt(&p1, i, j);
- get_pt(&p2, i+di, j);
- get_pt(&p3, i, j+dj);
- switch(col_mode) {
- case 0:
- col = 4;
- break;
- case 1:
- col = coul_flat(T(i,j)+T(i+di,j)+T(i,j+dj));
- break;
- case 2:
- col = coul(&p1,&p2,&p3);
- break;
- }
- if(no_z) {
- int z1 = p1.z, z2 = p2.z, z3 = p3.z;
- p1.z = p2.z = p3.z = 0;
- proj(&p1, &x1, &y1);
- proj(&p2, &x2, &y2);
- proj(&p3, &x3, &y3);
- p1.z = z1; p2.z = z2; p3.z = z3;
- } else {
- proj(&p1, &x1, &y1);
- proj(&p2, &x2, &y2);
- proj(&p3, &x3, &y3);
- }
- switch(tri_mode) {
- case 0:
- tri_wire(x1, y1, x2, y2, x3, y3, col);
- break;
- case 1:
- triangle(x1, y1, x2, y2, x3, y3, 0);
- tri_wire(x1, y1, x2, y2, x3, y3, col);
- break;
- case 2:
- triangle(x1, y1, x2, y2, x3, y3, col);
- break;
- }
- //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
- get_pt(&p1, i+di ,j+dj);
- switch(col_mode) {
- case 0:
- col = 4;
- break;
- case 1:
- col = coul_flat(T(i+di,j+dj)+T(i+di,j)+T(i,j+dj));
- break;
- case 2:
- col = coul(&p3,&p2,&p1);
- break;
- }
- if(no_z) p1.z = 0;
- proj(&p1, &x1, &y1);
- switch(tri_mode) {
- case 0:
- tri_wire(x1, y1, x2, y2, x3, y3, col);
- break;
- case 1:
- triangle(x1, y1, x2, y2, x3, y3, 0);
- tri_wire(x1, y1, x2, y2, x3, y3, col);
- break;
- case 2:
- triangle(x1, y1, x2, y2, x3, y3, col);
- break;
- }
- //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
- }
- void facette11(int i, int j, int di, int dj) {
- point p1, p2, p3;
- int x1, y1, x2, y2, x3, y3, col = 1;
- get_pt(&p1, i+di, j+dj);
- get_pt(&p2, i+di, j);
- get_pt(&p3, i, j+dj);
- switch(col_mode) {
- case 0:
- col = 4;
- break;
- case 1:
- col = coul_flat(T(i+di,j+dj)+T(i+di,j)+T(i,j+dj));
- break;
- case 2:
- col = coul(&p3,&p2,&p1);
- break;
- }
- if(no_z) {
- int z1 = p1.z, z2 = p2.z, z3 = p3.z;
- p1.z = p2.z = p3.z = 0;
- proj(&p1, &x1, &y1);
- proj(&p2, &x2, &y2);
- proj(&p3, &x3, &y3);
- p1.z = z1; p2.z = z2; p3.z = z3;
- } else {
- proj(&p1, &x1, &y1);
- proj(&p2, &x2, &y2);
- proj(&p3, &x3, &y3);
- }
- switch(tri_mode) {
- case 0:
- tri_wire(x1, y1, x2, y2, x3, y3, col);
- break;
- case 1:
- triangle(x1, y1, x2, y2, x3, y3, 0);
- tri_wire(x1, y1, x2, y2, x3, y3, col);
- break;
- case 2:
- triangle(x1, y1, x2, y2, x3, y3, col);
- break;
- }
- //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
- get_pt(&p1, i ,j);
- switch(col_mode) {
- case 0:
- col = 4;
- break;
- case 1:
- col = coul_flat(T(i,j)+T(i+di,j)+T(i,j+dj));
- break;
- case 2:
- col = coul(&p1,&p2,&p3);
- break;
- }
- if(no_z) p1.z = 0;
- proj(&p1, &x1, &y1);
- switch(tri_mode) {
- case 0:
- tri_wire(x1, y1, x2, y2, x3, y3, col);
- break;
- case 1:
- triangle(x1, y1, x2, y2, x3, y3, 0);
- tri_wire(x1, y1, x2, y2, x3, y3, col);
- break;
- case 2:
- triangle(x1, y1, x2, y2, x3, y3, col);
- break;
- }
- //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
- }
- void disp_sorted() {
- point p;
- int d00, d01, d10, d11;
- int i0, i1, di;
- int j0, j1, dj;
- int i_before_j;
- int i,j;
- void (*face)(int,int,int,int) = facette00;
- if(tri_mode==0 && col_mode==0) {
- for(j=COTE; (j-=STEP)>=0;) {
- int x1,y1;
- get_pt(&p, COTE, j);
- proj(&p, &x1, &y1);
- for(i=COTE; (i-=STEP)>=0;) {
- int x2=x1, y2=y1;
- get_pt(&p, i, j);
- proj(&p, &x1, &y1);
- line(x1,y1,x2,y2,4);
- }
- }
- return;
- }
- if(no_z || (col_mode==0 && tri_mode==0)) {
- for(j=COTE; (j-=STEP)>=0;)
- for(i=COTE; (i-=STEP)>=0;)
- facette00(i,j,STEP,STEP);
- return;
- }
- get_pt(&p, 0, 0); //pstr_("00", &p);
- d00 = fadd(fsqr(fsub(p.x,Pe.x)), fsqr(fsub(p.y, Pe.y)));
- get_pt(&p, 0, COTE-1); //pstr_("01", &p);
- d01 = fadd(fsqr(fsub(p.x,Pe.x)), fsqr(fsub(p.y, Pe.y)));
- get_pt(&p, COTE-1, 0); //pstr_("10", &p);
- d10 = fadd(fsqr(fsub(p.x,Pe.x)), fsqr(fsub(p.y, Pe.y)));
- get_pt(&p, COTE-1, COTE-1); //pstr_("11", &p);
- d11 = fadd(fsqr(fsub(p.x,Pe.x)), fsqr(fsub(p.y, Pe.y)));
- #define cmp3(a,b,c) fcmp(d##a,d##b)>=0 && fcmp(d##b,d##c)>=0
- face = fcmp(d00,d11)>=0?facette00:facette11;
- if(0) {
- } else if(cmp3(00,01,10)) {
- i_before_j = 0;
- i0 = 0; i1 = COTE;
- j0 = 0; j1 = COTE;
- } else if(cmp3(00,10,01)) {
- i_before_j = 1;
- i0 = 0; i1 = COTE;
- j0 = 0; j1 = COTE;
- } else if(cmp3(10,00,11)) {
- i_before_j = 1;
- i0 = COTE-STEP; i1 = -STEP;
- j0 = 0; j1 = COTE;
- } else if(cmp3(10,11,00)) {
- i_before_j = 0;
- i0 = COTE-STEP; i1 = -STEP;
- j0 = 0; j1 = COTE;
- } else if(cmp3(11,10,01)) {
- i_before_j = 0;
- i0 = COTE-STEP; i1 = -STEP;
- j0 = COTE-STEP; j1 = -STEP;
- } else if(cmp3(11,01,10)) {
- i_before_j = 1;
- i0 = COTE-STEP; i1 = -STEP;
- j0 = COTE-STEP; j1 = -STEP;
- } else if(cmp3(01,11,00)) {
- i_before_j = 1;
- i0 = 0; i1 = COTE;
- j0 = COTE-STEP; j1 = -STEP;
- } else if(cmp3(01,00,11)) {
- i_before_j = 0;
- i0 = 0; i1 = COTE;
- j0 = COTE-STEP; j1 = -STEP;
- } else {
- printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n");
- i_before_j = 0;
- i0 = 0; i1 = COTE;
- j0 = 0; j1 = COTE;
- }
- di = i0>=i1?-STEP:STEP;
- dj = j0>=j1?-STEP:STEP;
- if(i_before_j) {
- for(j=j0; j!=j1; j+=dj)
- for(i=i0; i!=i1; i+=di)
- (*face)(i,j,STEP,STEP);
- } else {
- for(i=i0; i!=i1; i+=di)
- for(j=j0; j!=j1; j+=dj)
- (*face)(i,j,STEP,STEP);
- }
- }
- void disp() {
- int i;
- for(i=0; i<COTE; ++i) {
- int j;
- for(j=0; j<COTE; ++j) {
- point p1, p2, p3;
- int x1, y1, x2, y2, x3, y3, col = 1;
- get_pt(&p1, i, j);
- get_pt(&p2, i+1, j);
- get_pt(&p3, i, j+1);
- col = coul(&p1,&p2,&p3);
- proj(&p1, &x1, &y1);
- proj(&p2, &x2, &y2);
- proj(&p3, &x3, &y3);
- triangle(x1, y1, x2, y2, x3, y3, col);
- //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
- get_pt(&p1, i+1 ,j+1);
- col = coul(&p3,&p2,&p1);
- proj(&p1, &x1, &y1);
- triangle(x1, y1, x2, y2, x3, y3, col);
- //printf("tri(%d,%d, %d,%d, %d,%d)\n", x1,y1, x2,y2, x3,y3);
- }
- }
- }
- void txt(char *s) {
- static byte form[] = {0xBB,0xCC,0xDD,0xEE,0xFF,0xFF};
- static byte fond[] = {0x00,0x00,0x00,0x00,0x00,0x00};
- byte l = 0, x;
- while(s[l]) ++l;
- x = (40-l)>>1;
- for(l=40;l;--l) {
- pstr(s,x,13,form,fond);
- {
- byte c = form[5];
- form[5] = form[4];
- form[4] = form[3];
- form[3] = form[2];
- form[2] = form[1];
- form[1] = form[0];
- form[0] = c;
- }
- {
- int c=3000;
- while(c) --c;
- }
- }
- }
- extern unsigned int clock();
- int main(void) {
- int redraw = 1;
- int move = 0;
- #if 1
- static int pal[] = {0,3873,16,32,48,17,34,51,324,597,870,273,546,819,1092,1638};
- _setp(255, (int)pal, 0);
- _putc(27); _putc('^');
- _putc(0x14);
- _putc(27); _putc(0x60);
- /*
- { byte x,y;
- for(y=0;y<200;++y) for(x=0;x<160;++x) pset(x,y,(x+y)&15);
- while(!_ktst());
- }
- */
- #else
- ps("\033[");
- //hline(0x4000+40*100, 80,82, 255);
- printf("%x\n", tria_line);
- triangle(40,0,80,80,-50,180,15);
- exit(0);
- /*
- printf("\n\n%x\n", line);
- {
- int i;
- for(i=0; i<160; ++i) {
- int y=ftoi(fdiv4(fmul256(my_sin(i))))+100;
- line(i,100,i,y,15);
- }
- //line(0,-100,80,7,15);
- //line(0,0,80,100,15);
- //line(160,0,80,100,15);
- //line(160,200,80,100,15);
- line(-2,40,80,199,15);
- exit(0);
- }
- */
- /*
- {
- int x = 0, y = 0,w1=30,w2=30;
- int c='x';
- do {
- int chg = 0;
- if(c=='a') --x, chg=1;
- if(c=='z') ++x, chg=1;
- if(c=='q') --y, chg=1;
- if(c=='w') ++y, chg=1;
- if(c=='x') {x=80;y=100;chg=1;}
- if(c=='e') --w1, chg=1;
- if(c=='r') ++w1, chg=1;
- if(c=='s') --w2, chg=1;
- if(c=='d') ++w2, chg=1;
- if(chg) {
- _putc(12);
- triangle(x,y,x-w1,y+30,x+w2,y+60,15);
- }
- } while((c=_getc())!=' ');
- }
- exit(0);
- */
- #endif
- //fpr("sub=",fsub(0x48dc, 0xc7b7));
- //fpr("a1=",itof(2));
- //fpr("a2=",itof(1));
- //fpr("sub=",fsub(itof(1),itof(2)));
- //exit(0);
- init_points();
- init_trans();
- init_france();
- // clear_T();
- // init_T();
- STEP = 4;
- while(1) {
- int t, c;
- if(move) {
- init_points();
- init_trans();
- redraw = 1;
- }
- if(redraw) {
- disp_over();
- disp_sorted();
- redraw = 0;
- }
- if(0) {
- char buf[16];
- static byte form[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
- static byte fond[] = {0x00,0x00,0x00,0x00,0x00,0x00};
- sprintf(buf,"%d",RAYON);pstr(buf,0,0,form,fond);
- sprintf(buf,"%d",THETA);pstr(buf,0,1,form,fond);
- sprintf(buf,"%d",RHO); pstr(buf,0,2,form,fond);
- sprintf(buf,"%d",ftoi(P0.x));pstr(buf,0,4,form,fond);
- sprintf(buf,"%d",ftoi(P0.y));pstr(buf,0,5,form,fond);
- sprintf(buf,"%d",ftoi(P0.z));pstr(buf,0,6,form,fond);
- }
- t = clock();
- while(!_ktst() /*&& (clock()<=t+40000)*/);
- switch((c=_getc())) {
- case 'q':
- return 0;
- //case 0:
- case ' ':
- case 'n':
- txt("NEW LANDSCAPE...");
- clear_T(); init_T(); redraw = 1; break;
- case '1':
- txt("RESOLUTION=1 (USELESS)");
- STEP = 64; redraw = 1; break;
- case '2':
- txt("RESOLUTION=2 (POINTLESS)");
- STEP = 32; redraw = 1; break;
- case '3':
- txt("RESOLUTION=3 (BAD, BUT FAST)");
- STEP = 16; redraw = 1; break;
- case '4':
- txt("RESOLUTION=4 (MEDIUM, RATHER FAST)");
- STEP = 8; redraw = 1; break;
- case '5':
- txt("RESOLUTION=5 (CORRECT, SLOW)");
- STEP = 4; redraw = 1; break;
- case '6':
- txt("RESOLUTION=6 (GOOD, BE PATIENT)");
- STEP = 2; redraw = 1; break;
- case '7':
- txt("RESOLUTION=6 (BEST, REAL SLOW)");
- STEP = 1; redraw = 1; break;
- case 'D':
- tri_mode = 2;
- case 'd':
- switch(tri_mode) {
- case 0:
- tri_mode = 1;
- txt("FILLED WIRE FRAME DRAWING MODE...(SLOW)");
- break;
- case 1:
- tri_mode = 2;
- txt("FILLED TRIANGLE DRAWING MODE...(MEDIUM)");
- break;
- case 2:
- tri_mode = 0;
- txt("WIRE FRAME DRAWING MODE...(FAST)");
- break;
- }
- redraw = 1;
- break;
- case 'C':
- col_mode = 0;
- case 'c':
- switch(col_mode) {
- case 2:
- col_mode = 0;
- txt("MONOCHROME MODE (FAST)");
- break;
- case 1:
- col_mode = 2;
- txt("LIGHTING-BASED COLOUR MODE...(SLOW)");
- break;
- case 0:
- col_mode = 1;
- txt("HEIGHT-BASED COLOUR MODE...(MEDIUM)");
- break;
- }
- redraw = 1;
- break;
- case 'M':
- case 'm':
- use_map = 1-use_map;
- if(use_map)
- txt("WITH MAP OVERVIEW...");
- else
- txt("WITHOUT MAP OVERVIEW...");
- redraw = 1;
- break;
- case 'S':
- case 's':
- use_stars = 1-use_stars;
- if(use_map)
- txt("WITH BACKGROUND STARS...");
- else
- txt("WITHOUT BACKGROUND STARS...");
- redraw = 1;
- break;
- case 'R':
- txt("ROTATE RIGHT...");
- //#undef T
- //#define T(x,y) (int)(*(tab+(x)+(y)+((y)<<DEG)))
- // rotate left
- {
- byte i;
- for(i=0; i<=COTE; ++i) {
- byte j,max=COTE-i;
- for(j=i; j<max; ++j) {
- byte *p1 = &T(i,j);
- byte *p2 = &T(COTE-j,i);
- byte *p3 = &T(COTE-i,COTE-j);
- byte *p4 = &T(j,COTE-i);
- byte t = *p1; *p1 = *p2; *p2 = *p3, *p3 = *p4, *p4 = t;
- }
- }
- }
- redraw = 1; break;
- case 'r':
- txt("ROTATE LEFT...");
- // rotate right
- {
- byte i;
- for(i=0; i<=COTE; ++i) {
- byte j,max=COTE-i;
- for(j=i; j<max; ++j) {
- byte *p1 = &T(i,j);
- byte *p2 = &T(COTE-j,i);
- byte *p3 = &T(COTE-i,COTE-j);
- byte *p4 = &T(j,COTE-i);
- byte t = *p4;
- *p4 = *p3; *p3 = *p2; *p2 = *p1; *p1 = t;
- }
- }
- }
- redraw = 1;
- break;
- case 'Z':
- case 'z':
- no_z = 1-no_z;
- if(no_z)
- txt("FLATLAND");
- else
- txt("WONDERLAND");
- redraw = 1;
- break;
- case 8:
- --THETA;
- move = 1;
- break;
- case 9:
- ++THETA;
- move = 1;
- break;
- case 10:
- if(RHO>-31) {
- --RHO;
- move = 1;
- }
- break;
- case 11:
- if(RHO<31) {
- ++RHO;
- move = 1;
- }
- break;
- case 28:
- RAYON += 1+(RAYON>>2);
- move = 1;
- break;
- case 29:
- RAYON -= 1+(RAYON>>2);
- if(RAYON<20) RAYON=20;
- move = 1;
- break;
- }
- };
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement