/***********************************************************************/ /* This program demonstrates how to use BIOS calls for programming the */ /* Atari Portfolio in graphics mode. The program should be compiled */ /* with Turbo C 1.0 */ /* Simple 3D engine implementation by RayeR (C) 2000 */ /***********************************************************************/ // budem prekladat pro portfolio ? #define PORTFOLIO #include #include #include typedef unsigned char Byte; #define GFX 0x04 #define TXT 0x07 #define XRES 240 #define YRES 64 #define VRAMSIZE 1920 #define MAXX (XRES-1) #define MAXY (YRES-1) #define MIDX (XRES/2) #define MIDY (YRES/2) #define FP 10 // fixed point 6:10 #define FPR 6 #define FPPI (8-FPR) /* camera position */ #define CX 11 #define CY 2 #define CZ 100 /* krychle - 8 vertexu, 12 faces */ #define VNUM 8 #define FNUM 12 #define HEDGE (15<>3,ahi=alo>>8; outportb(0x8011,10); outportb(0x8010,alo%256); // low Byte address outportb(0x8011,11); outportb(0x8010,ahi); // high Byte address if (color!=0) outportb(0x8011,15); // set bit else outportb(0x8011,14); // clear bit outportb(0x8010,bit); // bit num in Byte } #endif Byte getpix(Byte x, Byte y) /* get pixel color 0/1 */ { union REGS regs; regs.h.ah = 0x0d; regs.h.bh = 0; regs.x.cx = x; regs.x.dx = y; int86(0x10, ®s, ®s); return(regs.h.al); } void refresh(void) /* zkopiruje VRAM na displej (do kontroleru HD) */ { union REGS regs; regs.h.ah = 0x12; int86(0x61, ®s, ®s); } void pfcls(Byte pattern) { int i; for (i=0; i>FP)+CZ); p[i][0]=(int)( CZ*((v[i][0]>>FP)+CX)/zdivider+MIDX); p[i][1]=(int)(-CZ*((v[i][1]>>FP)+CY)/zdivider+MIDY); } } void render(Byte color) { Byte i; for (i=0; i0) v[i][0]=v[i][0]<>-xm; if (ym>0) v[i][1]=v[i][1]<>-ym; if (zm>0) v[i][2]=v[i][2]<>-zm; } } int isin(char x) { if (x>0) return(sintbl[x]>>FPPI); else return(-sintbl[-x]>>FPPI); } int icos(char x) { if (x>0) return(sintbl[90-x]>>FPPI); else return(sintbl[90+x]>>FPPI); } void rotatex(Byte alfa) { int i,temp; for (i=0; i>FPR)*icos(alfa)-(v[i][1]>>FPR)*isin(alfa); v[i][1]=(v[i][2]>>FPR)*isin(alfa)+(v[i][1]>>FPR)*icos(alfa); v[i][2]=temp; } } void rotatey(Byte alfa) { int i,temp; for (i=0; i>FPR)*icos(alfa)-(v[i][2]>>FPR)*isin(alfa); v[i][2]=(v[i][0]>>FPR)*isin(alfa)+(v[i][2]>>FPR)*icos(alfa); v[i][0]=temp; } } void rotatez(Byte alfa) { int i,temp; for (i=0; i>FPR)*icos(alfa)-(v[i][1]>>FPR)*isin(alfa); v[i][1]=(v[i][0]>>FPR)*isin(alfa)+(v[i][1]>>FPR)*icos(alfa); v[i][0]=temp; } } void makebox(void) { v[0][0]=-HEDGE; v[0][1]=HEDGE; v[0][2]=HEDGE; v[1][0]=HEDGE; v[1][1]=HEDGE; v[1][2]=HEDGE; v[2][0]=HEDGE; v[2][1]=-HEDGE; v[2][2]=HEDGE; v[3][0]=-HEDGE; v[3][1]=-HEDGE; v[3][2]=HEDGE; v[4][0]=-HEDGE; v[4][1]=HEDGE; v[4][2]=-HEDGE; v[5][0]=HEDGE; v[5][1]=HEDGE; v[5][2]=-HEDGE; v[6][0]=HEDGE; v[6][1]=-HEDGE; v[6][2]=-HEDGE; v[7][0]=-HEDGE; v[7][1]=-HEDGE; v[7][2]=-HEDGE; } main() { /* definice faces krychle */ f[0][0]=0; f[0][1]=3; f[0][2]=2; f[1][0]=0; f[1][1]=1; f[1][2]=2; f[2][0]=1; f[2][1]=5; f[2][2]=6; f[3][0]=1; f[3][1]=2; f[3][2]=6; f[4][0]=0; f[4][1]=4; f[4][2]=7; f[5][0]=0; f[5][1]=3; f[5][2]=7; f[6][0]=4; f[6][1]=5; f[6][2]=6; f[7][0]=4; f[7][1]=7; f[7][2]=6; f[8][0]=0; f[8][1]=1; f[8][2]=5; f[9][0]=0; f[9][1]=4; f[9][2]=5; f[10][0]=3; f[10][1]=2; f[10][2]=6; f[11][0]=3; f[11][1]=7; f[11][2]=6; makebox(); setmode(GFX); while (!kbhit()) { for (i=0; i<16; i++) { rotatey(6); render(0); transform(); render(1); // delay(100); pfdelay(10000); } makebox(); } setmode(TXT); return(0); }