開発環境
sint.c
#include <conio.h>
#include <dos.h>
#include <math.h>
#define PI 3.141592653589793
#define BASE 0x100
#define CYCLE 256
#define FOV 40
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef signed short SWORD;
typedef signed long SDWORD;
typedef struct {
SWORD x;
SWORD y;
} vec2;
typedef struct {
BYTE d;
} CAR;
// 関数プロトタイプ宣言
void setup();
void draw();
void pset(BYTE x, BYTE y);
void flip();
void cls();
SWORD mul(SWORD x, SWORD y);
// 外部変数
WORD page = 0;
SWORD sint[CYCLE];
CAR car = { 0 };
int main()
{
setup();
while (! kbhit()) {
draw();
car.d++;
}
page = 0;
flip();
return 0;
}
void setup()
{
union REGS inregs, outregs;
float x;
int i;
inregs.h.ah = 0x0a; // テキスト画面モードの設定
inregs.h.al = 0x04; // 簡易グラフ
int86(0x18, &inregs, &outregs);
inregs.h.ah = 0x16; // テキストVRAMのクリア
inregs.h.dh = 0x91; // アトリビュートデータ
inregs.h.dl = 0x00; // ANK文字コード
int86(0x18, &inregs, &outregs);
for (i = 0; i < CYCLE; i++) {
x = sin(2 * PI * i / CYCLE);
sint[i] = (SWORD)(x * BASE + .5);
}
}
void draw()
{
BYTE t, px, py;
SWORD s, c, x;
vec2 rd;
int i;
t = car.d;
s = sint[t];
t += (CYCLE/4);
c = sint[t];
cls();
x = -BASE;
for (i = 0; i < FOV; i++) {
rd.x = mul(c, x) + s;
rd.y = c - mul(s, x);
px = (BYTE)(80 + rd.x * 30 / BASE);
py = (BYTE)(50 - rd.y * 30 / BASE);
pset(px, py);
x += (2 * BASE / FOV);
}
flip();
page ^= 0x1000;
}
void pset(BYTE x, BYTE y)
{
BYTE xh, xl, yh, yl;
char far* lp;
if (x >= 160 || y >= 100) return;
xh = x & 0xfe;
xl = (x & 0x01) << 2;
yh = y / 4;
yl = y - yh * 4;
lp = (char far*)(0xa0000000 + page + yh * 160 + xh);
*lp |= 1 << (xl + yl);
}
void flip()
{
union REGS inregs, outregs;
inregs.h.ah = 0x0e; // テキスト画面表示領域設定
inregs.x.dx = page; // T-VRAMの表示する領域の先頭アドレス
int86(0x18, &inregs, &outregs);
}
void cls()
{
_asm {
push di
push es
mov ax, 0a000h
mov es, ax
mov ax, 0000h
mov di, page
mov cx, 2000
cld
rep stosw
pop es
pop di
}
}
SWORD mul(SWORD x, SWORD y)
{
return (SWORD)((SDWORD)x * (SDWORD)y / BASE);
}
mk.bat
最終更新:2021年03月17日 17:44