mirror of
https://github.com/yourtion/30dayMakeOS.git
synced 2026-02-04 18:43:25 +08:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
140774a293 | ||
|
|
7c2fc66927 | ||
|
|
636c1a8c3d | ||
|
|
c177821913 | ||
|
|
febac10ebf | ||
|
|
0e31ff06ca | ||
|
|
08d19d7512 | ||
|
|
b2d31a8e54 | ||
|
|
72532c8cd7 | ||
|
|
3871740126 | ||
|
|
70b335278d | ||
|
|
2c262f986d | ||
|
|
6b0457bed6 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1 +1,5 @@
|
||||
*.hrb
|
||||
*.lst
|
||||
*.map
|
||||
*.bim
|
||||
*.hrb
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -22,7 +22,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \
|
||||
beepdown/beepdown.hrb color/color.hrb color2/color2.hrb \
|
||||
sosu/sosu.hrb sosu2/sosu2.hrb sosu3/sosu3.hrb \
|
||||
type/type.hrb iroha/iroha.hrb chklang/chklang.hrb \
|
||||
notrec/notrec.hrb bball/bball.hrb
|
||||
notrec/notrec.hrb bball/bball.hrb invader/invader.hrb
|
||||
$(EDIMG) imgin:../z_tools/fdimg0at.tek \
|
||||
wbinimg src:haribote/ipl20.bin len:512 from:0 to:0 \
|
||||
copy from:haribote/haribote.sys to:@: \
|
||||
@@ -53,6 +53,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \
|
||||
copy from:euc.txt to:@: \
|
||||
copy from:notrec/notrec.hrb to:@: \
|
||||
copy from:bball/bball.hrb to:@: \
|
||||
copy from:invader/invader.hrb to:@: \
|
||||
copy from:nihongo/nihongo.fnt to:@: \
|
||||
imgout:haribote.img
|
||||
|
||||
@@ -70,6 +71,7 @@ install :
|
||||
full :
|
||||
$(MAKE) -C haribote
|
||||
$(MAKE) -C apilib
|
||||
$(MAKE) -C stdlib
|
||||
$(MAKE) -C a
|
||||
$(MAKE) -C hello3
|
||||
$(MAKE) -C hello4
|
||||
@@ -94,6 +96,7 @@ full :
|
||||
$(MAKE) -C chklang
|
||||
$(MAKE) -C notrec
|
||||
$(MAKE) -C bball
|
||||
$(MAKE) -C invader
|
||||
$(MAKE) haribote.img
|
||||
|
||||
run_full :
|
||||
@@ -119,6 +122,7 @@ src_only :
|
||||
clean_full :
|
||||
$(MAKE) -C haribote clean
|
||||
$(MAKE) -C apilib clean
|
||||
$(MAKE) -C stdlib clean
|
||||
$(MAKE) -C a clean
|
||||
$(MAKE) -C hello3 clean
|
||||
$(MAKE) -C hello4 clean
|
||||
@@ -143,10 +147,12 @@ clean_full :
|
||||
$(MAKE) -C chklang clean
|
||||
$(MAKE) -C notrec clean
|
||||
$(MAKE) -C bball clean
|
||||
$(MAKE) -C invader clean
|
||||
|
||||
src_only_full :
|
||||
$(MAKE) -C haribote src_only
|
||||
$(MAKE) -C apilib src_only
|
||||
$(MAKE) -C stdlib src_only
|
||||
$(MAKE) -C a src_only
|
||||
$(MAKE) -C hello3 src_only
|
||||
$(MAKE) -C hello4 src_only
|
||||
@@ -171,6 +177,7 @@ src_only_full :
|
||||
$(MAKE) -C chklang src_only
|
||||
$(MAKE) -C notrec src_only
|
||||
$(MAKE) -C bball src_only
|
||||
$(MAKE) -C invader src_only
|
||||
-$(DEL) haribote.img
|
||||
|
||||
refresh :
|
||||
|
||||
Binary file not shown.
Binary file not shown.
1
29_day/invader/!cons_9x.bat
Normal file
1
29_day/invader/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
29_day/invader/!cons_nt.bat
Normal file
1
29_day/invader/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
5
29_day/invader/Makefile
Normal file
5
29_day/invader/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
APP = invader
|
||||
STACK = 90k
|
||||
MALLOC = 0k
|
||||
|
||||
include ../app_make.txt
|
||||
281
29_day/invader/invader.c
Normal file
281
29_day/invader/invader.c
Normal file
@@ -0,0 +1,281 @@
|
||||
#include <stdio.h> /* sprintf */
|
||||
#include <string.h> /* strlen */
|
||||
#include "apilib.h"
|
||||
|
||||
void putstr(int win, char *winbuf, int x, int y, int col, unsigned char *s);
|
||||
void wait(int i, int timer, char *keyflag);
|
||||
|
||||
static unsigned char charset[16 * 8] = {
|
||||
|
||||
/* invader(0) */
|
||||
0x00, 0x00, 0x00, 0x43, 0x5f, 0x5f, 0x5f, 0x7f,
|
||||
0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x20, 0x3f, 0x00,
|
||||
|
||||
/* invader(1) */
|
||||
0x00, 0x0f, 0x7f, 0xff, 0xcf, 0xcf, 0xcf, 0xff,
|
||||
0xff, 0xe0, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x00,
|
||||
|
||||
/* invader(2) */
|
||||
0x00, 0xf0, 0xfe, 0xff, 0xf3, 0xf3, 0xf3, 0xff,
|
||||
0xff, 0x07, 0xff, 0xff, 0x03, 0x03, 0x03, 0x00,
|
||||
|
||||
/* invader(3) */
|
||||
0x00, 0x00, 0x00, 0xc2, 0xfa, 0xfa, 0xfa, 0xfe,
|
||||
0xf8, 0xf8, 0xf8, 0xf8, 0x00, 0x04, 0xfc, 0x00,
|
||||
|
||||
/* fighter(0) */
|
||||
0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||
0x01, 0x43, 0x47, 0x4f, 0x5f, 0x7f, 0x7f, 0x00,
|
||||
|
||||
/* fighter(1) */
|
||||
0x18, 0x7e, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xff,
|
||||
0xff, 0xff, 0xe7, 0xe7, 0xe7, 0xe7, 0xff, 0x00,
|
||||
|
||||
/* fighter(2) */
|
||||
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||
0x80, 0xc2, 0xe2, 0xf2, 0xfa, 0xfe, 0xfe, 0x00,
|
||||
|
||||
/* laser */
|
||||
0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
||||
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00
|
||||
};
|
||||
/* invader:"abcd", fighter:"efg", laser:"h" */
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
/*
|
||||
fx:自机的x坐标(fighter_x)
|
||||
lx,ly:等离子炮弹的坐标(laser_x,laser_y)
|
||||
ix,iy:外星人群的坐标(invaders_x,in-vaders_y)
|
||||
idir:外星人群的移动方向(invaders_direc-tion)
|
||||
laserwait:等离子炮弹的剩余充电时间
|
||||
movewait:当这个变量变为0时外星人群前进一步
|
||||
movewait0:movewait的初始值(消灭30只敌人后减少)
|
||||
invline:外星人群的行数(invaders_line)
|
||||
score:当前得分
|
||||
high:最高得分
|
||||
point:得分的增加量(奖金的单价?)
|
||||
invstr:将外星人群的状态显示为字符串的变量
|
||||
*/
|
||||
|
||||
int win, timer, i, j, fx, laserwait, lx = 0, ly;
|
||||
int ix, iy, movewait0, movewait, idir;
|
||||
int invline, score, high, point;
|
||||
char winbuf[336 * 261], invstr[32 * 6], s[12], keyflag[4], *p;
|
||||
static char invstr0[32] = " abcd abcd abcd abcd abcd ";
|
||||
|
||||
win = api_openwin(winbuf, 336, 261, -1, "invader");
|
||||
api_boxfilwin(win, 6, 27, 329, 254, 0);
|
||||
timer = api_alloctimer();
|
||||
api_inittimer(timer, 128);
|
||||
|
||||
high = 0;
|
||||
putstr(win, winbuf, 22, 0, 7, "HIGH:00000000");
|
||||
|
||||
restart:
|
||||
score = 0;
|
||||
point = 1;
|
||||
putstr(win, winbuf, 4, 0, 7, "SCORE:00000000");
|
||||
movewait0 = 20;
|
||||
fx = 18;
|
||||
putstr(win, winbuf, fx, 13, 6, "efg");
|
||||
wait(100, timer, keyflag);
|
||||
|
||||
next_group:
|
||||
wait(100, timer, keyflag);
|
||||
ix = 7;
|
||||
iy = 1;
|
||||
invline = 6;
|
||||
for (i = 0; i < 6; i++) {
|
||||
for (j = 0; j < 27; j++) {
|
||||
invstr[i * 32 + j] = invstr0[j];
|
||||
}
|
||||
putstr(win, winbuf, ix, iy + i, 2, invstr + i * 32);
|
||||
}
|
||||
keyflag[0] = 0;
|
||||
keyflag[1] = 0;
|
||||
keyflag[2] = 0;
|
||||
|
||||
ly = 0; /*不显示*/
|
||||
laserwait = 0;
|
||||
movewait = movewait0;
|
||||
idir = +1;
|
||||
wait(100, timer, keyflag);
|
||||
|
||||
for (;;) {
|
||||
if (laserwait != 0) {
|
||||
laserwait--;
|
||||
keyflag[2 /* space */] = 0;
|
||||
}
|
||||
|
||||
wait(4, timer, keyflag);
|
||||
|
||||
/*自机的处理*/
|
||||
if (keyflag[0 /* left */] != 0 && fx > 0) {
|
||||
fx--;
|
||||
putstr(win, winbuf, fx, 13, 6, "efg ");
|
||||
keyflag[0 /* left */] = 0;
|
||||
}
|
||||
if (keyflag[1 /* right */] != 0 && fx < 37) {
|
||||
putstr(win, winbuf, fx, 13, 6, " efg");
|
||||
fx++;
|
||||
keyflag[1 /* right */] = 0;
|
||||
}
|
||||
if (keyflag[2 /* space */] != 0 && laserwait == 0) {
|
||||
laserwait = 15;
|
||||
lx = fx + 1;
|
||||
ly = 13;
|
||||
}
|
||||
|
||||
/*外星人移动*/
|
||||
if (movewait != 0) {
|
||||
movewait--;
|
||||
} else {
|
||||
movewait = movewait0;
|
||||
if (ix + idir > 14 || ix + idir < 0) {
|
||||
if (iy + invline == 13) {
|
||||
break; /* GAME OVER */
|
||||
}
|
||||
idir = - idir;
|
||||
putstr(win, winbuf, ix + 1, iy, 0, " ");
|
||||
iy++;
|
||||
} else {
|
||||
ix += idir;
|
||||
}
|
||||
for (i = 0; i < invline; i++) {
|
||||
putstr(win, winbuf, ix, iy + i, 2, invstr + i * 32);
|
||||
}
|
||||
}
|
||||
|
||||
/*炮弹处理*/
|
||||
if (ly > 0) {
|
||||
if (ly < 13) {
|
||||
if (ix < lx && lx < ix + 25 && iy <= ly && ly < iy + invline) {
|
||||
putstr(win, winbuf, ix, ly, 2, invstr + (ly - iy) * 32);
|
||||
} else {
|
||||
putstr(win, winbuf, lx, ly, 0, " ");
|
||||
}
|
||||
}
|
||||
ly--;
|
||||
if (ly > 0) {
|
||||
putstr(win, winbuf, lx, ly, 3, "h");
|
||||
} else {
|
||||
point -= 10;
|
||||
if (point <= 0) {
|
||||
point = 1;
|
||||
}
|
||||
}
|
||||
if (ix < lx && lx < ix + 25 && iy <= ly && ly < iy + invline) {
|
||||
p = invstr + (ly - iy) * 32 + (lx - ix);
|
||||
if (*p != ' ') {
|
||||
/* hit ! */
|
||||
score += point;
|
||||
point++;
|
||||
sprintf(s, "%08d", score);
|
||||
putstr(win, winbuf, 10, 0, 7, s);
|
||||
if (high < score) {
|
||||
high = score;
|
||||
putstr(win, winbuf, 27, 0, 7, s);
|
||||
}
|
||||
for (p--; *p != ' '; p--) { }
|
||||
for (i = 1; i < 5; i++) {
|
||||
p[i] = ' ';
|
||||
}
|
||||
putstr(win, winbuf, ix, ly, 2, invstr + (ly - iy) * 32);
|
||||
for (; invline > 0; invline--) {
|
||||
for (p = invstr + (invline - 1) * 32; *p != 0; p++) {
|
||||
if (*p != ' ') {
|
||||
goto alive;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*全部消灭*/
|
||||
movewait0 -= movewait0 / 3;
|
||||
goto next_group;
|
||||
alive:
|
||||
ly = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* GAME OVER */
|
||||
putstr(win, winbuf, 15, 6, 1, "GAME OVER");
|
||||
wait(0, timer, keyflag);
|
||||
for (i = 1; i < 14; i++) {
|
||||
putstr(win, winbuf, 0, i, 0, " ");
|
||||
}
|
||||
goto restart;
|
||||
}
|
||||
|
||||
void putstr(int win, char *winbuf, int x, int y, int col, unsigned char *s)
|
||||
{
|
||||
int c, x0, i;
|
||||
char *p, *q, t[2];
|
||||
x = x * 8 + 8;
|
||||
y = y * 16 + 29;
|
||||
x0 = x;
|
||||
i = strlen(s); /*计算s的字符数*/
|
||||
api_boxfilwin(win + 1, x, y, x + i * 8 - 1, y + 15, 0);
|
||||
q = winbuf + y * 336;
|
||||
t[1] = 0;
|
||||
for (;;) {
|
||||
c = *s;
|
||||
if (c == 0) {
|
||||
break;
|
||||
}
|
||||
if (c != ' ') {
|
||||
if ('a' <= c && c <= 'h') {
|
||||
p = charset + 16 * (c - 'a');
|
||||
q += x;
|
||||
for (i = 0; i < 16; i++) {
|
||||
if ((p[i] & 0x80) != 0) { q[0] = col; }
|
||||
if ((p[i] & 0x40) != 0) { q[1] = col; }
|
||||
if ((p[i] & 0x20) != 0) { q[2] = col; }
|
||||
if ((p[i] & 0x10) != 0) { q[3] = col; }
|
||||
if ((p[i] & 0x08) != 0) { q[4] = col; }
|
||||
if ((p[i] & 0x04) != 0) { q[5] = col; }
|
||||
if ((p[i] & 0x02) != 0) { q[6] = col; }
|
||||
if ((p[i] & 0x01) != 0) { q[7] = col; }
|
||||
q += 336;
|
||||
}
|
||||
q -= 336 * 16 + x;
|
||||
} else {
|
||||
t[0] = *s;
|
||||
api_putstrwin(win + 1, x, y, col, 1, t);
|
||||
}
|
||||
}
|
||||
s++;
|
||||
x += 8;
|
||||
}
|
||||
api_refreshwin(win, x0, y, x, y + 16);
|
||||
return;
|
||||
}
|
||||
|
||||
void wait(int i, int timer, char *keyflag)
|
||||
{
|
||||
int j;
|
||||
if (i > 0) {
|
||||
/*等待一段时间*/
|
||||
api_settimer(timer, i);
|
||||
i = 128;
|
||||
} else {
|
||||
i = 0x0a; /* Enter */
|
||||
}
|
||||
for (;;) {
|
||||
j = api_getkey(1);
|
||||
if (i == j) {
|
||||
break;
|
||||
}
|
||||
if (j == '4') {
|
||||
keyflag[0 /* left */] = 1;
|
||||
}
|
||||
if (j == '6') {
|
||||
keyflag[1 /* right */] = 1;
|
||||
}
|
||||
if (j == ' ') {
|
||||
keyflag[2 /* space */] = 1;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
1
29_day/invader/make.bat
Normal file
1
29_day/invader/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
1
30_day/!cons_9x.bat
Normal file
1
30_day/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/!cons_nt.bat
Normal file
1
30_day/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
209
30_day/Makefile
Normal file
209
30_day/Makefile
Normal file
@@ -0,0 +1,209 @@
|
||||
TOOLPATH = ../z_tools/
|
||||
INCPATH = ../z_tools/haribote/
|
||||
|
||||
MAKE = $(TOOLPATH)make.exe -r
|
||||
EDIMG = $(TOOLPATH)edimg.exe
|
||||
IMGTOL = $(TOOLPATH)imgtol.com
|
||||
COPY = copy
|
||||
DEL = del
|
||||
|
||||
#默认动作
|
||||
|
||||
default :
|
||||
$(MAKE) haribote.img
|
||||
|
||||
#文件生成规则
|
||||
|
||||
haribote.img : haribote/ipl10.bin haribote/haribote.sys Makefile \
|
||||
a/a.hrb hello3/hello3.hrb hello4/hello4.hrb hello5/hello5.hrb \
|
||||
winhelo/winhelo.hrb winhelo2/winhelo2.hrb winhelo3/winhelo3.hrb \
|
||||
star1/star1.hrb stars/stars.hrb stars2/stars2.hrb \
|
||||
lines/lines.hrb walk/walk.hrb noodle/noodle.hrb \
|
||||
beepdown/beepdown.hrb color/color.hrb color2/color2.hrb \
|
||||
sosu/sosu.hrb sosu2/sosu2.hrb sosu3/sosu3.hrb \
|
||||
type/type.hrb iroha/iroha.hrb chklang/chklang.hrb \
|
||||
notrec/notrec.hrb bball/bball.hrb invader/invader.hrb \
|
||||
calc/calc.hrb tview/tview.hrb mmlplay/mmlplay.hrb gview/gview.hrb
|
||||
$(EDIMG) imgin:../z_tools/fdimg0at.tek \
|
||||
wbinimg src:haribote/ipl10.bin len:512 from:0 to:0 \
|
||||
copy from:haribote/haribote.sys to:@: \
|
||||
copy from:haribote/jp.nas to:@: \
|
||||
copy from:make.bat to:@: \
|
||||
copy from:a/a.hrb to:@: \
|
||||
copy from:hello3/hello3.hrb to:@: \
|
||||
copy from:hello4/hello4.hrb to:@: \
|
||||
copy from:hello5/hello5.hrb to:@: \
|
||||
copy from:winhelo/winhelo.hrb to:@: \
|
||||
copy from:winhelo2/winhelo2.hrb to:@: \
|
||||
copy from:winhelo3/winhelo3.hrb to:@: \
|
||||
copy from:star1/star1.hrb to:@: \
|
||||
copy from:stars/stars.hrb to:@: \
|
||||
copy from:stars2/stars2.hrb to:@: \
|
||||
copy from:lines/lines.hrb to:@: \
|
||||
copy from:walk/walk.hrb to:@: \
|
||||
copy from:noodle/noodle.hrb to:@: \
|
||||
copy from:beepdown/beepdown.hrb to:@: \
|
||||
copy from:color/color.hrb to:@: \
|
||||
copy from:color2/color2.hrb to:@: \
|
||||
copy from:sosu/sosu.hrb to:@: \
|
||||
copy from:sosu2/sosu2.hrb to:@: \
|
||||
copy from:sosu3/sosu3.hrb to:@: \
|
||||
copy from:type/type.hrb to:@: \
|
||||
copy from:iroha/iroha.hrb to:@: \
|
||||
copy from:chklang/chklang.hrb to:@: \
|
||||
copy from:euc.txt to:@: \
|
||||
copy from:notrec/notrec.hrb to:@: \
|
||||
copy from:bball/bball.hrb to:@: \
|
||||
copy from:invader/invader.hrb to:@: \
|
||||
copy from:calc/calc.hrb to:@: \
|
||||
copy from:tview/tview.hrb to:@: \
|
||||
copy from:mmlplay/mmlplay.hrb to:@: \
|
||||
copy from:mmldata/kirakira.mml to:@: \
|
||||
copy from:mmldata/fujisan.mml to:@: \
|
||||
copy from:mmldata/daigo.mml to:@: \
|
||||
copy from:mmldata/daiku.mml to:@: \
|
||||
copy from:gview/gview.hrb to:@: \
|
||||
copy from:pictdata/fujisan.jpg to:@: \
|
||||
copy from:pictdata/night.bmp to:@: \
|
||||
copy from:nihongo/nihongo.fnt to:@: \
|
||||
imgout:haribote.img
|
||||
|
||||
#命令
|
||||
|
||||
run :
|
||||
$(MAKE) haribote.img
|
||||
$(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin
|
||||
$(MAKE) -C ../z_tools/qemu
|
||||
|
||||
install :
|
||||
$(MAKE) haribote.img
|
||||
$(IMGTOL) w a: haribote.img
|
||||
|
||||
full :
|
||||
$(MAKE) -C haribote
|
||||
$(MAKE) -C apilib
|
||||
$(MAKE) -C stdlib
|
||||
$(MAKE) -C a
|
||||
$(MAKE) -C hello3
|
||||
$(MAKE) -C hello4
|
||||
$(MAKE) -C hello5
|
||||
$(MAKE) -C winhelo
|
||||
$(MAKE) -C winhelo2
|
||||
$(MAKE) -C winhelo3
|
||||
$(MAKE) -C star1
|
||||
$(MAKE) -C stars
|
||||
$(MAKE) -C stars2
|
||||
$(MAKE) -C lines
|
||||
$(MAKE) -C walk
|
||||
$(MAKE) -C noodle
|
||||
$(MAKE) -C beepdown
|
||||
$(MAKE) -C color
|
||||
$(MAKE) -C color2
|
||||
$(MAKE) -C sosu
|
||||
$(MAKE) -C sosu2
|
||||
$(MAKE) -C sosu3
|
||||
$(MAKE) -C type
|
||||
$(MAKE) -C iroha
|
||||
$(MAKE) -C chklang
|
||||
$(MAKE) -C notrec
|
||||
$(MAKE) -C bball
|
||||
$(MAKE) -C invader
|
||||
$(MAKE) -C calc
|
||||
$(MAKE) -C tview
|
||||
$(MAKE) -C mmlplay
|
||||
$(MAKE) -C gview
|
||||
$(MAKE) haribote.img
|
||||
|
||||
run_full :
|
||||
$(MAKE) full
|
||||
$(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin
|
||||
$(MAKE) -C ../z_tools/qemu
|
||||
|
||||
install_full :
|
||||
$(MAKE) full
|
||||
$(IMGTOL) w a: haribote.img
|
||||
|
||||
run_os :
|
||||
$(MAKE) -C haribote
|
||||
$(MAKE) run
|
||||
|
||||
clean :
|
||||
#不执行任何操作
|
||||
|
||||
src_only :
|
||||
$(MAKE) clean
|
||||
-$(DEL) haribote.img
|
||||
|
||||
clean_full :
|
||||
$(MAKE) -C haribote clean
|
||||
$(MAKE) -C apilib clean
|
||||
$(MAKE) -C stdlib clean
|
||||
$(MAKE) -C a clean
|
||||
$(MAKE) -C hello3 clean
|
||||
$(MAKE) -C hello4 clean
|
||||
$(MAKE) -C hello5 clean
|
||||
$(MAKE) -C winhelo clean
|
||||
$(MAKE) -C winhelo2 clean
|
||||
$(MAKE) -C winhelo3 clean
|
||||
$(MAKE) -C star1 clean
|
||||
$(MAKE) -C stars clean
|
||||
$(MAKE) -C stars2 clean
|
||||
$(MAKE) -C lines clean
|
||||
$(MAKE) -C walk clean
|
||||
$(MAKE) -C noodle clean
|
||||
$(MAKE) -C beepdown clean
|
||||
$(MAKE) -C color clean
|
||||
$(MAKE) -C color2 clean
|
||||
$(MAKE) -C sosu clean
|
||||
$(MAKE) -C sosu2 clean
|
||||
$(MAKE) -C sosu3 clean
|
||||
$(MAKE) -C type clean
|
||||
$(MAKE) -C iroha clean
|
||||
$(MAKE) -C chklang clean
|
||||
$(MAKE) -C notrec clean
|
||||
$(MAKE) -C bball clean
|
||||
$(MAKE) -C invader clean
|
||||
$(MAKE) -C calc clean
|
||||
$(MAKE) -C tview clean
|
||||
$(MAKE) -C mmlplay clean
|
||||
$(MAKE) -C gview clean
|
||||
|
||||
src_only_full :
|
||||
$(MAKE) -C haribote src_only
|
||||
$(MAKE) -C apilib src_only
|
||||
$(MAKE) -C stdlib src_only
|
||||
$(MAKE) -C a src_only
|
||||
$(MAKE) -C hello3 src_only
|
||||
$(MAKE) -C hello4 src_only
|
||||
$(MAKE) -C hello5 src_only
|
||||
$(MAKE) -C winhelo src_only
|
||||
$(MAKE) -C winhelo2 src_only
|
||||
$(MAKE) -C winhelo3 src_only
|
||||
$(MAKE) -C star1 src_only
|
||||
$(MAKE) -C stars src_only
|
||||
$(MAKE) -C stars2 src_only
|
||||
$(MAKE) -C lines src_only
|
||||
$(MAKE) -C walk src_only
|
||||
$(MAKE) -C noodle src_only
|
||||
$(MAKE) -C beepdown src_only
|
||||
$(MAKE) -C color src_only
|
||||
$(MAKE) -C color2 src_only
|
||||
$(MAKE) -C sosu src_only
|
||||
$(MAKE) -C sosu2 src_only
|
||||
$(MAKE) -C sosu3 src_only
|
||||
$(MAKE) -C type src_only
|
||||
$(MAKE) -C iroha src_only
|
||||
$(MAKE) -C chklang src_only
|
||||
$(MAKE) -C notrec src_only
|
||||
$(MAKE) -C bball src_only
|
||||
$(MAKE) -C invader src_only
|
||||
$(MAKE) -C calc src_only
|
||||
$(MAKE) -C tview src_only
|
||||
$(MAKE) -C mmlplay src_only
|
||||
$(MAKE) -C gview src_only
|
||||
-$(DEL) haribote.img
|
||||
|
||||
refresh :
|
||||
$(MAKE) full
|
||||
$(MAKE) clean_full
|
||||
-$(DEL) haribote.img
|
||||
1
30_day/a/!cons_9x.bat
Normal file
1
30_day/a/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/a/!cons_nt.bat
Normal file
1
30_day/a/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
8
30_day/a/Makefile
Normal file
8
30_day/a/Makefile
Normal file
@@ -0,0 +1,8 @@
|
||||
APP = a
|
||||
STACK = 1k
|
||||
MALLOC = 0k
|
||||
|
||||
include ../app_make.txt
|
||||
|
||||
$(APP).hrb : $(APP).org Makefile
|
||||
$(COPY) $(APP).org $(APP).hrb
|
||||
7
30_day/a/a.c
Normal file
7
30_day/a/a.c
Normal file
@@ -0,0 +1,7 @@
|
||||
#include "apilib.h"
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
api_putchar('A');
|
||||
api_end();
|
||||
}
|
||||
1
30_day/a/make.bat
Normal file
1
30_day/a/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
27
30_day/apilib.h
Normal file
27
30_day/apilib.h
Normal file
@@ -0,0 +1,27 @@
|
||||
void api_putchar(int c);
|
||||
void api_putstr0(char *s);
|
||||
void api_putstr1(char *s, int l);
|
||||
void api_end(void);
|
||||
int api_openwin(char *buf, int xsiz, int ysiz, int col_inv, char *title);
|
||||
void api_putstrwin(int win, int x, int y, int col, int len, char *str);
|
||||
void api_boxfilwin(int win, int x0, int y0, int x1, int y1, int col);
|
||||
void api_initmalloc(void);
|
||||
char *api_malloc(int size);
|
||||
void api_free(char *addr, int size);
|
||||
void api_point(int win, int x, int y, int col);
|
||||
void api_refreshwin(int win, int x0, int y0, int x1, int y1);
|
||||
void api_linewin(int win, int x0, int y0, int x1, int y1, int col);
|
||||
void api_closewin(int win);
|
||||
int api_getkey(int mode);
|
||||
int api_alloctimer(void);
|
||||
void api_inittimer(int timer, int data);
|
||||
void api_settimer(int timer, int time);
|
||||
void api_freetimer(int timer);
|
||||
void api_beep(int tone);
|
||||
int api_fopen(char *fname);
|
||||
void api_fclose(int fhandle);
|
||||
void api_fseek(int fhandle, int offset, int mode);
|
||||
int api_fsize(int fhandle, int mode);
|
||||
int api_fread(char *buf, int maxsize, int fhandle);
|
||||
int api_cmdline(char *buf, int maxsize);
|
||||
int api_getlang(void);
|
||||
1
30_day/apilib/!cons_9x.bat
Normal file
1
30_day/apilib/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/apilib/!cons_nt.bat
Normal file
1
30_day/apilib/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
48
30_day/apilib/Makefile
Normal file
48
30_day/apilib/Makefile
Normal file
@@ -0,0 +1,48 @@
|
||||
OBJS_API = api001.obj api002.obj api003.obj api004.obj api005.obj api006.obj \
|
||||
api007.obj api008.obj api009.obj api010.obj api011.obj api012.obj \
|
||||
api013.obj api014.obj api015.obj api016.obj api017.obj api018.obj \
|
||||
api019.obj api020.obj api021.obj api022.obj api023.obj api024.obj \
|
||||
api025.obj api026.obj api027.obj alloca.obj
|
||||
|
||||
TOOLPATH = ../../z_tools/
|
||||
INCPATH = ../../z_tools/haribote/
|
||||
|
||||
MAKE = $(TOOLPATH)make.exe -r
|
||||
NASK = $(TOOLPATH)nask.exe
|
||||
CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet
|
||||
GAS2NASK = $(TOOLPATH)gas2nask.exe -a
|
||||
OBJ2BIM = $(TOOLPATH)obj2bim.exe
|
||||
MAKEFONT = $(TOOLPATH)makefont.exe
|
||||
BIN2OBJ = $(TOOLPATH)bin2obj.exe
|
||||
BIM2HRB = $(TOOLPATH)bim2hrb.exe
|
||||
RULEFILE = ../haribote.rul
|
||||
EDIMG = $(TOOLPATH)edimg.exe
|
||||
IMGTOL = $(TOOLPATH)imgtol.com
|
||||
GOLIB = $(TOOLPATH)golib00.exe
|
||||
COPY = copy
|
||||
DEL = del
|
||||
|
||||
#默认动作
|
||||
|
||||
default :
|
||||
$(MAKE) apilib.lib
|
||||
|
||||
#库生成规则
|
||||
|
||||
apilib.lib : Makefile $(OBJS_API)
|
||||
$(GOLIB) $(OBJS_API) out:apilib.lib
|
||||
|
||||
#文件生成规则
|
||||
|
||||
%.obj : %.nas Makefile
|
||||
$(NASK) $*.nas $*.obj $*.lst
|
||||
|
||||
#命令
|
||||
|
||||
clean :
|
||||
-$(DEL) *.lst
|
||||
-$(DEL) *.obj
|
||||
|
||||
src_only :
|
||||
$(MAKE) clean
|
||||
-$(DEL) apilib.lib
|
||||
13
30_day/apilib/alloca.nas
Normal file
13
30_day/apilib/alloca.nas
Normal file
@@ -0,0 +1,13 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "alloca.nas"]
|
||||
|
||||
GLOBAL __alloca
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
__alloca:
|
||||
ADD EAX,-4
|
||||
SUB ESP,EAX
|
||||
JMP DWORD [ESP+EAX] ; 代替RET
|
||||
14
30_day/apilib/api001.nas
Normal file
14
30_day/apilib/api001.nas
Normal file
@@ -0,0 +1,14 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api001.nas"]
|
||||
|
||||
GLOBAL _api_putchar
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_putchar: ; void api_putchar(int c);
|
||||
MOV EDX,1
|
||||
MOV AL,[ESP+4] ; c
|
||||
INT 0x40
|
||||
RET
|
||||
16
30_day/apilib/api002.nas
Normal file
16
30_day/apilib/api002.nas
Normal file
@@ -0,0 +1,16 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api002.nas"]
|
||||
|
||||
GLOBAL _api_putstr0
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_putstr0: ; void api_putstr0(char *s);
|
||||
PUSH EBX
|
||||
MOV EDX,2
|
||||
MOV EBX,[ESP+8] ; s
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
17
30_day/apilib/api003.nas
Normal file
17
30_day/apilib/api003.nas
Normal file
@@ -0,0 +1,17 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api003.nas"]
|
||||
|
||||
GLOBAL _api_putstr1
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_putstr1: ; void api_putstr1(char *s, int l);
|
||||
PUSH EBX
|
||||
MOV EDX,3
|
||||
MOV EBX,[ESP+ 8] ; s
|
||||
MOV ECX,[ESP+12] ; l
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
12
30_day/apilib/api004.nas
Normal file
12
30_day/apilib/api004.nas
Normal file
@@ -0,0 +1,12 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api004.nas"]
|
||||
|
||||
GLOBAL _api_end
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_end: ; void api_end(void);
|
||||
MOV EDX,4
|
||||
INT 0x40
|
||||
24
30_day/apilib/api005.nas
Normal file
24
30_day/apilib/api005.nas
Normal file
@@ -0,0 +1,24 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api005.nas"]
|
||||
|
||||
GLOBAL _api_openwin
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_openwin: ; int api_openwin(char *buf, int xsiz, int ysiz, int col_inv, char *title);
|
||||
PUSH EDI
|
||||
PUSH ESI
|
||||
PUSH EBX
|
||||
MOV EDX,5
|
||||
MOV EBX,[ESP+16] ; buf
|
||||
MOV ESI,[ESP+20] ; xsiz
|
||||
MOV EDI,[ESP+24] ; ysiz
|
||||
MOV EAX,[ESP+28] ; col_inv
|
||||
MOV ECX,[ESP+32] ; title
|
||||
INT 0x40
|
||||
POP EBX
|
||||
POP ESI
|
||||
POP EDI
|
||||
RET
|
||||
27
30_day/apilib/api006.nas
Normal file
27
30_day/apilib/api006.nas
Normal file
@@ -0,0 +1,27 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api006.nas"]
|
||||
|
||||
GLOBAL _api_putstrwin
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_putstrwin: ; void api_putstrwin(int win, int x, int y, int col, int len, char *str);
|
||||
PUSH EDI
|
||||
PUSH ESI
|
||||
PUSH EBP
|
||||
PUSH EBX
|
||||
MOV EDX,6
|
||||
MOV EBX,[ESP+20] ; win
|
||||
MOV ESI,[ESP+24] ; x
|
||||
MOV EDI,[ESP+28] ; y
|
||||
MOV EAX,[ESP+32] ; col
|
||||
MOV ECX,[ESP+36] ; len
|
||||
MOV EBP,[ESP+40] ; str
|
||||
INT 0x40
|
||||
POP EBX
|
||||
POP EBP
|
||||
POP ESI
|
||||
POP EDI
|
||||
RET
|
||||
27
30_day/apilib/api007.nas
Normal file
27
30_day/apilib/api007.nas
Normal file
@@ -0,0 +1,27 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api007.nas"]
|
||||
|
||||
GLOBAL _api_boxfilwin
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_boxfilwin: ; void api_boxfilwin(int win, int x0, int y0, int x1, int y1, int col);
|
||||
PUSH EDI
|
||||
PUSH ESI
|
||||
PUSH EBP
|
||||
PUSH EBX
|
||||
MOV EDX,7
|
||||
MOV EBX,[ESP+20] ; win
|
||||
MOV EAX,[ESP+24] ; x0
|
||||
MOV ECX,[ESP+28] ; y0
|
||||
MOV ESI,[ESP+32] ; x1
|
||||
MOV EDI,[ESP+36] ; y1
|
||||
MOV EBP,[ESP+40] ; col
|
||||
INT 0x40
|
||||
POP EBX
|
||||
POP EBP
|
||||
POP ESI
|
||||
POP EDI
|
||||
RET
|
||||
20
30_day/apilib/api008.nas
Normal file
20
30_day/apilib/api008.nas
Normal file
@@ -0,0 +1,20 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api008.nas"]
|
||||
|
||||
GLOBAL _api_initmalloc
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_initmalloc: ; void api_initmalloc(void);
|
||||
PUSH EBX
|
||||
MOV EDX,8
|
||||
MOV EBX,[CS:0x0020] ; malloc内存空间的地址
|
||||
MOV EAX,EBX
|
||||
ADD EAX,32*1024 ; 加上32KB
|
||||
MOV ECX,[CS:0x0000] ; 数据段的大小
|
||||
SUB ECX,EAX
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
17
30_day/apilib/api009.nas
Normal file
17
30_day/apilib/api009.nas
Normal file
@@ -0,0 +1,17 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api009.nas"]
|
||||
|
||||
GLOBAL _api_malloc
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_malloc: ; char *api_malloc(int size);
|
||||
PUSH EBX
|
||||
MOV EDX,9
|
||||
MOV EBX,[CS:0x0020]
|
||||
MOV ECX,[ESP+8] ; size
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
18
30_day/apilib/api010.nas
Normal file
18
30_day/apilib/api010.nas
Normal file
@@ -0,0 +1,18 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api010.nas"]
|
||||
|
||||
GLOBAL _api_free
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_free: ; void api_free(char *addr, int size);
|
||||
PUSH EBX
|
||||
MOV EDX,10
|
||||
MOV EBX,[CS:0x0020]
|
||||
MOV EAX,[ESP+ 8] ; addr
|
||||
MOV ECX,[ESP+12] ; size
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
23
30_day/apilib/api011.nas
Normal file
23
30_day/apilib/api011.nas
Normal file
@@ -0,0 +1,23 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api011.nas"]
|
||||
|
||||
GLOBAL _api_point
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_point: ; void api_point(int win, int x, int y, int col);
|
||||
PUSH EDI
|
||||
PUSH ESI
|
||||
PUSH EBX
|
||||
MOV EDX,11
|
||||
MOV EBX,[ESP+16] ; win
|
||||
MOV ESI,[ESP+20] ; x
|
||||
MOV EDI,[ESP+24] ; y
|
||||
MOV EAX,[ESP+28] ; col
|
||||
INT 0x40
|
||||
POP EBX
|
||||
POP ESI
|
||||
POP EDI
|
||||
RET
|
||||
24
30_day/apilib/api012.nas
Normal file
24
30_day/apilib/api012.nas
Normal file
@@ -0,0 +1,24 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api012.nas"]
|
||||
|
||||
GLOBAL _api_refreshwin
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_refreshwin: ; void api_refreshwin(int win, int x0, int y0, int x1, int y1);
|
||||
PUSH EDI
|
||||
PUSH ESI
|
||||
PUSH EBX
|
||||
MOV EDX,12
|
||||
MOV EBX,[ESP+16] ; win
|
||||
MOV EAX,[ESP+20] ; x0
|
||||
MOV ECX,[ESP+24] ; y0
|
||||
MOV ESI,[ESP+28] ; x1
|
||||
MOV EDI,[ESP+32] ; y1
|
||||
INT 0x40
|
||||
POP EBX
|
||||
POP ESI
|
||||
POP EDI
|
||||
RET
|
||||
27
30_day/apilib/api013.nas
Normal file
27
30_day/apilib/api013.nas
Normal file
@@ -0,0 +1,27 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api013.nas"]
|
||||
|
||||
GLOBAL _api_linewin
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_linewin: ; void api_linewin(int win, int x0, int y0, int x1, int y1, int col);
|
||||
PUSH EDI
|
||||
PUSH ESI
|
||||
PUSH EBP
|
||||
PUSH EBX
|
||||
MOV EDX,13
|
||||
MOV EBX,[ESP+20] ; win
|
||||
MOV EAX,[ESP+24] ; x0
|
||||
MOV ECX,[ESP+28] ; y0
|
||||
MOV ESI,[ESP+32] ; x1
|
||||
MOV EDI,[ESP+36] ; y1
|
||||
MOV EBP,[ESP+40] ; col
|
||||
INT 0x40
|
||||
POP EBX
|
||||
POP EBP
|
||||
POP ESI
|
||||
POP EDI
|
||||
RET
|
||||
16
30_day/apilib/api014.nas
Normal file
16
30_day/apilib/api014.nas
Normal file
@@ -0,0 +1,16 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api014.nas"]
|
||||
|
||||
GLOBAL _api_closewin
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_closewin: ; void api_closewin(int win);
|
||||
PUSH EBX
|
||||
MOV EDX,14
|
||||
MOV EBX,[ESP+8] ; win
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
14
30_day/apilib/api015.nas
Normal file
14
30_day/apilib/api015.nas
Normal file
@@ -0,0 +1,14 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api015.nas"]
|
||||
|
||||
GLOBAL _api_getkey
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_getkey: ; int api_getkey(int mode);
|
||||
MOV EDX,15
|
||||
MOV EAX,[ESP+4] ; mode
|
||||
INT 0x40
|
||||
RET
|
||||
13
30_day/apilib/api016.nas
Normal file
13
30_day/apilib/api016.nas
Normal file
@@ -0,0 +1,13 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api016.nas"]
|
||||
|
||||
GLOBAL _api_alloctimer
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_alloctimer: ; int api_alloctimer(void);
|
||||
MOV EDX,16
|
||||
INT 0x40
|
||||
RET
|
||||
17
30_day/apilib/api017.nas
Normal file
17
30_day/apilib/api017.nas
Normal file
@@ -0,0 +1,17 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api017.nas"]
|
||||
|
||||
GLOBAL _api_inittimer
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_inittimer: ; void api_inittimer(int timer, int data);
|
||||
PUSH EBX
|
||||
MOV EDX,17
|
||||
MOV EBX,[ESP+ 8] ; timer
|
||||
MOV EAX,[ESP+12] ; data
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
17
30_day/apilib/api018.nas
Normal file
17
30_day/apilib/api018.nas
Normal file
@@ -0,0 +1,17 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api018.nas"]
|
||||
|
||||
GLOBAL _api_settimer
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_settimer: ; void api_settimer(int timer, int time);
|
||||
PUSH EBX
|
||||
MOV EDX,18
|
||||
MOV EBX,[ESP+ 8] ; timer
|
||||
MOV EAX,[ESP+12] ; time
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
16
30_day/apilib/api019.nas
Normal file
16
30_day/apilib/api019.nas
Normal file
@@ -0,0 +1,16 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api019.nas"]
|
||||
|
||||
GLOBAL _api_freetimer
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_freetimer: ; void api_freetimer(int timer);
|
||||
PUSH EBX
|
||||
MOV EDX,19
|
||||
MOV EBX,[ESP+ 8] ; timer
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
14
30_day/apilib/api020.nas
Normal file
14
30_day/apilib/api020.nas
Normal file
@@ -0,0 +1,14 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api020.nas"]
|
||||
|
||||
GLOBAL _api_beep
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_beep: ; void api_beep(int tone);
|
||||
MOV EDX,20
|
||||
MOV EAX,[ESP+4] ; tone
|
||||
INT 0x40
|
||||
RET
|
||||
16
30_day/apilib/api021.nas
Normal file
16
30_day/apilib/api021.nas
Normal file
@@ -0,0 +1,16 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api021.nas"]
|
||||
|
||||
GLOBAL _api_fopen
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_fopen: ; int api_fopen(char *fname);
|
||||
PUSH EBX
|
||||
MOV EDX,21
|
||||
MOV EBX,[ESP+8] ; fname
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
14
30_day/apilib/api022.nas
Normal file
14
30_day/apilib/api022.nas
Normal file
@@ -0,0 +1,14 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api022.nas"]
|
||||
|
||||
GLOBAL _api_fclose
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_fclose: ; void api_fclose(int fhandle);
|
||||
MOV EDX,22
|
||||
MOV EAX,[ESP+4] ; fhandle
|
||||
INT 0x40
|
||||
RET
|
||||
18
30_day/apilib/api023.nas
Normal file
18
30_day/apilib/api023.nas
Normal file
@@ -0,0 +1,18 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api023.nas"]
|
||||
|
||||
GLOBAL _api_fseek
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_fseek: ; void api_fseek(int fhandle, int offset, int mode);
|
||||
PUSH EBX
|
||||
MOV EDX,23
|
||||
MOV EAX,[ESP+8] ; fhandle
|
||||
MOV ECX,[ESP+16] ; mode
|
||||
MOV EBX,[ESP+12] ; offset
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
15
30_day/apilib/api024.nas
Normal file
15
30_day/apilib/api024.nas
Normal file
@@ -0,0 +1,15 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api024.nas"]
|
||||
|
||||
GLOBAL _api_fsize
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_fsize: ; int api_fsize(int fhandle, int mode);
|
||||
MOV EDX,24
|
||||
MOV EAX,[ESP+4] ; fhandle
|
||||
MOV ECX,[ESP+8] ; mode
|
||||
INT 0x40
|
||||
RET
|
||||
18
30_day/apilib/api025.nas
Normal file
18
30_day/apilib/api025.nas
Normal file
@@ -0,0 +1,18 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api025.nas"]
|
||||
|
||||
GLOBAL _api_fread
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_fread: ; int api_fread(char *buf, int maxsize, int fhandle);
|
||||
PUSH EBX
|
||||
MOV EDX,25
|
||||
MOV EAX,[ESP+16] ; fhandle
|
||||
MOV ECX,[ESP+12] ; maxsize
|
||||
MOV EBX,[ESP+8] ; buf
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
17
30_day/apilib/api026.nas
Normal file
17
30_day/apilib/api026.nas
Normal file
@@ -0,0 +1,17 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api026.nas"]
|
||||
|
||||
GLOBAL _api_cmdline
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_cmdline: ; int api_cmdline(char *buf, int maxsize);
|
||||
PUSH EBX
|
||||
MOV EDX,26
|
||||
MOV ECX,[ESP+12] ; maxsize
|
||||
MOV EBX,[ESP+8] ; buf
|
||||
INT 0x40
|
||||
POP EBX
|
||||
RET
|
||||
13
30_day/apilib/api027.nas
Normal file
13
30_day/apilib/api027.nas
Normal file
@@ -0,0 +1,13 @@
|
||||
[FORMAT "WCOFF"]
|
||||
[INSTRSET "i486p"]
|
||||
[BITS 32]
|
||||
[FILE "api027.nas"]
|
||||
|
||||
GLOBAL _api_getlang
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_getlang: ; int api_getlang(void);
|
||||
MOV EDX,27
|
||||
INT 0x40
|
||||
RET
|
||||
1
30_day/apilib/make.bat
Normal file
1
30_day/apilib/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
92
30_day/app_make.txt
Normal file
92
30_day/app_make.txt
Normal file
@@ -0,0 +1,92 @@
|
||||
TOOLPATH = ../../z_tools/
|
||||
INCPATH = ../../z_tools/haribote/
|
||||
APILIBPATH = ../apilib/
|
||||
STDLIBPATH = ../stdlib/
|
||||
HARIBOTEPATH = ../haribote/
|
||||
|
||||
MAKE = $(TOOLPATH)make.exe -r
|
||||
NASK = $(TOOLPATH)nask.exe
|
||||
CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -I../ -Os -Wall -quiet
|
||||
GAS2NASK = $(TOOLPATH)gas2nask.exe -a
|
||||
OBJ2BIM = $(TOOLPATH)obj2bim.exe
|
||||
MAKEFONT = $(TOOLPATH)makefont.exe
|
||||
BIN2OBJ = $(TOOLPATH)bin2obj.exe
|
||||
BIM2HRB = $(TOOLPATH)bim2hrb.exe
|
||||
BIM2BIN = $(TOOLPATH)bim2bin.exe
|
||||
RULEFILE = ../haribote.rul
|
||||
EDIMG = $(TOOLPATH)edimg.exe
|
||||
IMGTOL = $(TOOLPATH)imgtol.com
|
||||
GOLIB = $(TOOLPATH)golib00.exe
|
||||
COPY = copy
|
||||
DEL = del
|
||||
|
||||
#默认动作
|
||||
|
||||
default :
|
||||
$(MAKE) $(APP).hrb
|
||||
|
||||
#文件生成规则
|
||||
|
||||
$(APP).bim : $(APP).obj $(APILIBPATH)apilib.lib $(STDLIBPATH)stdlib.lib Makefile ../app_make.txt
|
||||
$(OBJ2BIM) @$(RULEFILE) out:$(APP).bim map:$(APP).map stack:$(STACK) \
|
||||
$(APP).obj $(APILIBPATH)apilib.lib $(STDLIBPATH)stdlib.lib
|
||||
|
||||
$(STDAPP).bim : $(APP).obj $(STDLIBPATH)stdlib.lib Makefile ../app_make.txt
|
||||
$(OBJ2BIM) @$(RULEFILE) out:$(APP).bim map:$(APP).map stack:$(STACK) \
|
||||
$(APP).obj $(STDLIBPATH)stdlib.lib
|
||||
|
||||
haribote.img : ../haribote/ipl10.bin ../haribote/haribote.sys $(APP).hrb \
|
||||
Makefile ../app_make.txt
|
||||
$(EDIMG) imgin:../../z_tools/fdimg0at.tek \
|
||||
wbinimg src:../haribote/ipl10.bin len:512 from:0 to:0 \
|
||||
copy from:../haribote/haribote.sys to:@: \
|
||||
copy from:$(APP).hrb to:@: \
|
||||
copy from:../nihongo/nihongo.fnt to:@: \
|
||||
imgout:haribote.img
|
||||
|
||||
#一般规则
|
||||
|
||||
%.gas : %.c ../apilib.h ../stdlib.h Makefile ../app_make.txt
|
||||
$(CC1) -o $*.gas $*.c
|
||||
|
||||
%.nas : %.gas Makefile ../app_make.txt
|
||||
$(GAS2NASK) $*.gas $*.nas
|
||||
|
||||
%.obj : %.nas Makefile ../app_make.txt
|
||||
$(NASK) $*.nas $*.obj $*.lst
|
||||
|
||||
%.org : %.bim Makefile ../app_make.txt
|
||||
$(BIM2HRB) $*.bim $*.org $(MALLOC)
|
||||
|
||||
%.hrb : %.org Makefile ../app_make.txt
|
||||
$(BIM2BIN) -osacmp in:$*.org out:$*.hrb
|
||||
|
||||
#命令
|
||||
|
||||
run :
|
||||
$(MAKE) haribote.img
|
||||
$(COPY) haribote.img ..\..\z_tools\qemu\fdimage0.bin
|
||||
$(MAKE) -C ../../z_tools/qemu
|
||||
|
||||
full :
|
||||
$(MAKE) -C $(APILIBPATH)
|
||||
$(MAKE) -C $(STDLIBPATH)
|
||||
$(MAKE) $(APP).hrb
|
||||
|
||||
run_full :
|
||||
$(MAKE) -C $(APILIBPATH)
|
||||
$(MAKE) -C $(STDLIBPATH)
|
||||
$(MAKE) -C ../haribote
|
||||
$(MAKE) run
|
||||
|
||||
clean :
|
||||
-$(DEL) *.lst
|
||||
-$(DEL) *.obj
|
||||
-$(DEL) *.map
|
||||
-$(DEL) *.bim
|
||||
-$(DEL) *.org
|
||||
-$(DEL) haribote.img
|
||||
|
||||
src_only :
|
||||
$(MAKE) clean
|
||||
-$(DEL) $(APP).hrb
|
||||
1
30_day/bball/!cons_9x.bat
Normal file
1
30_day/bball/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/bball/!cons_nt.bat
Normal file
1
30_day/bball/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
5
30_day/bball/Makefile
Normal file
5
30_day/bball/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
APP = bball
|
||||
STACK = 52k
|
||||
MALLOC = 0k
|
||||
|
||||
include ../app_make.txt
|
||||
37
30_day/bball/bball.c
Normal file
37
30_day/bball/bball.c
Normal file
@@ -0,0 +1,37 @@
|
||||
#include "apilib.h"
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
int win, i, j, dis;
|
||||
char buf[216 * 237];
|
||||
struct POINT {
|
||||
int x, y;
|
||||
};
|
||||
static struct POINT table[16] = {
|
||||
{ 204, 129 }, { 195, 90 }, { 172, 58 }, { 137, 38 }, { 98, 34 },
|
||||
{ 61, 46 }, { 31, 73 }, { 15, 110 }, { 15, 148 }, { 31, 185 },
|
||||
{ 61, 212 }, { 98, 224 }, { 137, 220 }, { 172, 200 }, { 195, 168 },
|
||||
{ 204, 129 }
|
||||
};
|
||||
|
||||
win = api_openwin(buf, 216, 237, -1, "bball");
|
||||
api_boxfilwin(win, 8, 29, 207, 228, 0);
|
||||
for (i = 0; i <= 14; i++) {
|
||||
for (j = i + 1; j <= 15; j++) {
|
||||
dis = j - i; /*两点间的距离*/
|
||||
if (dis >= 8) {
|
||||
dis = 15 - dis; /*逆向计数*/
|
||||
}
|
||||
if (dis != 0) {
|
||||
api_linewin(win, table[i].x, table[i].y, table[j].x, table[j].y, 8 - dis);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
if (api_getkey(1) == 0x0a) {
|
||||
break; /*按下回车键则break; */
|
||||
}
|
||||
}
|
||||
api_end();
|
||||
}
|
||||
1
30_day/bball/make.bat
Normal file
1
30_day/bball/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
1
30_day/beepdown/!cons_9x.bat
Normal file
1
30_day/beepdown/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/beepdown/!cons_nt.bat
Normal file
1
30_day/beepdown/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
5
30_day/beepdown/Makefile
Normal file
5
30_day/beepdown/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
APP = beepdown
|
||||
STACK = 1k
|
||||
MALLOC = 40k
|
||||
|
||||
include ../app_make.txt
|
||||
19
30_day/beepdown/beepdown.c
Normal file
19
30_day/beepdown/beepdown.c
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "apilib.h"
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
int i, timer;
|
||||
timer = api_alloctimer();
|
||||
api_inittimer(timer, 128);
|
||||
for (i = 20000000; i >= 20000; i -= i / 100) {
|
||||
/* 20KHz~20Hz,即人类可以听到的声音范围*/
|
||||
/* i以1%的速度递减*/
|
||||
api_beep(i);
|
||||
api_settimer(timer, 1); /* 0.01秒*/
|
||||
if (api_getkey(1) != 128) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
api_beep(0);
|
||||
api_end();
|
||||
}
|
||||
1
30_day/beepdown/make.bat
Normal file
1
30_day/beepdown/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
1
30_day/calc/!cons_9x.bat
Normal file
1
30_day/calc/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/calc/!cons_nt.bat
Normal file
1
30_day/calc/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
5
30_day/calc/Makefile
Normal file
5
30_day/calc/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
APP = calc
|
||||
STACK = 4k
|
||||
MALLOC = 0k
|
||||
|
||||
include ../app_make.txt
|
||||
163
30_day/calc/calc.c
Normal file
163
30_day/calc/calc.c
Normal file
@@ -0,0 +1,163 @@
|
||||
#include "apilib.h"
|
||||
#include <stdio.h> /* sprintf */
|
||||
|
||||
#define INVALID -0x7fffffff
|
||||
|
||||
int strtol(char *s, char **endp, int base); /* 标准函数 <stdlib.h> */
|
||||
|
||||
char *skipspace(char *p);
|
||||
int getnum(char **pp, int priority);
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
int i;
|
||||
char s[30], *p;
|
||||
|
||||
api_cmdline(s, 30);
|
||||
for (p = s; *p > ' '; p++) { } /* 一直读到空格为止 */
|
||||
i = getnum(&p, 9);
|
||||
if (i == INVALID) {
|
||||
api_putstr0("error!\n");
|
||||
} else {
|
||||
sprintf(s, "= %d = 0x%x\n", i, i);
|
||||
api_putstr0(s);
|
||||
}
|
||||
api_end();
|
||||
}
|
||||
|
||||
char *skipspace(char *p)
|
||||
{
|
||||
for (; *p == ' '; p++) { } /* 将空格跳过去 */
|
||||
return p;
|
||||
}
|
||||
|
||||
int getnum(char **pp, int priority)
|
||||
{
|
||||
char *p = *pp;
|
||||
int i = INVALID, j;
|
||||
p = skipspace(p);
|
||||
|
||||
/*单项运算符*/
|
||||
if (*p == '+') {
|
||||
p = skipspace(p + 1);
|
||||
i = getnum(&p, 0);
|
||||
} else if (*p == '-') {
|
||||
p = skipspace(p + 1);
|
||||
i = getnum(&p, 0);
|
||||
if (i != INVALID) {
|
||||
i = - i;
|
||||
}
|
||||
} else if (*p == '~') {
|
||||
p = skipspace(p + 1);
|
||||
i = getnum(&p, 0);
|
||||
if (i != INVALID) {
|
||||
i = ~i;
|
||||
}
|
||||
} else if (*p == '(') { /*括号*/
|
||||
p = skipspace(p + 1);
|
||||
i = getnum(&p, 9);
|
||||
if (*p == ')') {
|
||||
p = skipspace(p + 1);
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if ('0' <= *p && *p <= '9') { /*数值*/
|
||||
i = strtol(p, &p, 0);
|
||||
} else { /*错误 */
|
||||
i = INVALID;
|
||||
}
|
||||
|
||||
/*二项运算符*/
|
||||
for (;;) {
|
||||
if (i == INVALID) {
|
||||
break;
|
||||
}
|
||||
p = skipspace(p);
|
||||
if (*p == '+' && priority > 2) {
|
||||
p = skipspace(p + 1);
|
||||
j = getnum(&p, 2);
|
||||
if (j != INVALID) {
|
||||
i += j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if (*p == '-' && priority > 2) {
|
||||
p = skipspace(p + 1);
|
||||
j = getnum(&p, 2);
|
||||
if (j != INVALID) {
|
||||
i -= j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if (*p == '*' && priority > 1) {
|
||||
p = skipspace(p + 1);
|
||||
j = getnum(&p, 1);
|
||||
if (j != INVALID) {
|
||||
i *= j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if (*p == '/' && priority > 1) {
|
||||
p = skipspace(p + 1);
|
||||
j = getnum(&p, 1);
|
||||
if (j != INVALID && j != 0) {
|
||||
i /= j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if (*p == '%' && priority > 1) {
|
||||
p = skipspace(p + 1);
|
||||
j = getnum(&p, 1);
|
||||
if (j != INVALID && j != 0) {
|
||||
i %= j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if (*p == '<' && p[1] == '<' && priority > 3) {
|
||||
p = skipspace(p + 2);
|
||||
j = getnum(&p, 3);
|
||||
if (j != INVALID && j != 0) {
|
||||
i <<= j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if (*p == '>' && p[1] == '>' && priority > 3) {
|
||||
p = skipspace(p + 2);
|
||||
j = getnum(&p, 3);
|
||||
if (j != INVALID && j != 0) {
|
||||
i >>= j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if (*p == '&' && priority > 4) {
|
||||
p = skipspace(p + 1);
|
||||
j = getnum(&p, 4);
|
||||
if (j != INVALID) {
|
||||
i &= j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if (*p == '^' && priority > 5) {
|
||||
p = skipspace(p + 1);
|
||||
j = getnum(&p, 5);
|
||||
if (j != INVALID) {
|
||||
i ^= j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else if (*p == '|' && priority > 6) {
|
||||
p = skipspace(p + 1);
|
||||
j = getnum(&p, 6);
|
||||
if (j != INVALID) {
|
||||
i |= j;
|
||||
} else {
|
||||
i = INVALID;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
p = skipspace(p);
|
||||
*pp = p;
|
||||
return i;
|
||||
}
|
||||
1
30_day/calc/make.bat
Normal file
1
30_day/calc/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
1
30_day/chklang/!cons_9x.bat
Normal file
1
30_day/chklang/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/chklang/!cons_nt.bat
Normal file
1
30_day/chklang/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
5
30_day/chklang/Makefile
Normal file
5
30_day/chklang/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
APP = chklang
|
||||
STACK = 1k
|
||||
MALLOC = 0k
|
||||
|
||||
include ../app_make.txt
|
||||
24
30_day/chklang/chklang.c
Normal file
24
30_day/chklang/chklang.c
Normal file
@@ -0,0 +1,24 @@
|
||||
#include "apilib.h"
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
int langmode = api_getlang();
|
||||
static char s1[23] = { /* 日本語シフトJISモード(日文Shift-JIS模式)*/
|
||||
0x93, 0xfa, 0x96, 0x7b, 0x8c, 0xea, 0x83, 0x56, 0x83, 0x74, 0x83, 0x67,
|
||||
0x4a, 0x49, 0x53, 0x83, 0x82, 0x81, 0x5b, 0x83, 0x68, 0x0a, 0x00
|
||||
};
|
||||
static char s2[17] = { /*日本語EUCモード(日文EUC模式)*/
|
||||
0xc6, 0xfc, 0xcb, 0xdc, 0xb8, 0xec, 0x45, 0x55, 0x43, 0xa5, 0xe2, 0xa1,
|
||||
0xbc, 0xa5, 0xc9, 0x0a, 0x00
|
||||
};
|
||||
if (langmode == 0) {
|
||||
api_putstr0("English ASCII mode\n");
|
||||
}
|
||||
if (langmode == 1) {
|
||||
api_putstr0(s1);
|
||||
}
|
||||
if (langmode == 2) {
|
||||
api_putstr0(s2);
|
||||
}
|
||||
api_end();
|
||||
}
|
||||
1
30_day/chklang/make.bat
Normal file
1
30_day/chklang/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
1
30_day/color/!cons_9x.bat
Normal file
1
30_day/color/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/color/!cons_nt.bat
Normal file
1
30_day/color/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
5
30_day/color/Makefile
Normal file
5
30_day/color/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
APP = color
|
||||
STACK = 1k
|
||||
MALLOC = 56k
|
||||
|
||||
include ../app_make.txt
|
||||
21
30_day/color/color.c
Normal file
21
30_day/color/color.c
Normal file
@@ -0,0 +1,21 @@
|
||||
#include "apilib.h"
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
char *buf;
|
||||
int win, x, y, r, g, b;
|
||||
api_initmalloc();
|
||||
buf = api_malloc(144 * 164);
|
||||
win = api_openwin(buf, 144, 164, -1, "color");
|
||||
for (y = 0; y < 128; y++) {
|
||||
for (x = 0; x < 128; x++) {
|
||||
r = x * 2;
|
||||
g = y * 2;
|
||||
b = 0;
|
||||
buf[(x + 8) + (y + 28) * 144] = 16 + (r / 43) + (g / 43) * 6 + (b / 43) * 36;
|
||||
}
|
||||
}
|
||||
api_refreshwin(win, 8, 28, 136, 156);
|
||||
api_getkey(1); /*等待按下任意键*/
|
||||
api_end();
|
||||
}
|
||||
1
30_day/color/make.bat
Normal file
1
30_day/color/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
1
30_day/color2/!cons_9x.bat
Normal file
1
30_day/color2/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/color2/!cons_nt.bat
Normal file
1
30_day/color2/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
5
30_day/color2/Makefile
Normal file
5
30_day/color2/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
APP = color2
|
||||
STACK = 1k
|
||||
MALLOC = 56k
|
||||
|
||||
include ../app_make.txt
|
||||
36
30_day/color2/color2.c
Normal file
36
30_day/color2/color2.c
Normal file
@@ -0,0 +1,36 @@
|
||||
#include "apilib.h"
|
||||
|
||||
unsigned char rgb2pal(int r, int g, int b, int x, int y);
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
char *buf;
|
||||
int win, x, y;
|
||||
api_initmalloc();
|
||||
buf = api_malloc(144 * 164);
|
||||
win = api_openwin(buf, 144, 164, -1, "color2");
|
||||
for (y = 0; y < 128; y++) {
|
||||
for (x = 0; x < 128; x++) {
|
||||
buf[(x + 8) + (y + 28) * 144] = rgb2pal(x * 2, y * 2, 0, x, y);
|
||||
}
|
||||
}
|
||||
api_refreshwin(win, 8, 28, 136, 156);
|
||||
api_getkey(1); /* <20>Ă<EFBFBD><C482>Ƃ<EFBFBD><C682>ȃL<C883>[<5B><><EFBFBD>͂<EFBFBD>҂<EFBFBD> */
|
||||
api_end();
|
||||
}
|
||||
|
||||
unsigned char rgb2pal(int r, int g, int b, int x, int y)
|
||||
{
|
||||
static int table[4] = { 3, 1, 0, 2 };
|
||||
int i;
|
||||
x &= 1; /*判断是偶数还是奇数*/
|
||||
y &= 1;
|
||||
i = table[x + y * 2]; /*用来生成中间色的常量*/
|
||||
r = (r * 21) / 256; /* r为0~20*/
|
||||
g = (g * 21) / 256;
|
||||
b = (b * 21) / 256;
|
||||
r = (r + i) / 4; /* r为0~5*/
|
||||
g = (g + i) / 4;
|
||||
b = (b + i) / 4;
|
||||
return 16 + r + g * 6 + b * 36;
|
||||
}
|
||||
1
30_day/color2/make.bat
Normal file
1
30_day/color2/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
1
30_day/euc.txt
Normal file
1
30_day/euc.txt
Normal file
@@ -0,0 +1 @@
|
||||
日本語EUCで書いてみたよー
|
||||
1
30_day/gview/!cons_9x.bat
Normal file
1
30_day/gview/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/gview/!cons_nt.bat
Normal file
1
30_day/gview/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
90
30_day/gview/Makefile
Normal file
90
30_day/gview/Makefile
Normal file
@@ -0,0 +1,90 @@
|
||||
APP = gview
|
||||
STACK = 4480k
|
||||
MALLOC = 0k
|
||||
|
||||
TOOLPATH = ../../z_tools/
|
||||
INCPATH = ../../z_tools/haribote/
|
||||
APILIBPATH = ../apilib/
|
||||
HARIBOTEPATH = ../haribote/
|
||||
|
||||
MAKE = $(TOOLPATH)make.exe -r
|
||||
NASK = $(TOOLPATH)nask.exe
|
||||
CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -I../ -Os -Wall -quiet
|
||||
GAS2NASK = $(TOOLPATH)gas2nask.exe -a
|
||||
OBJ2BIM = $(TOOLPATH)obj2bim.exe
|
||||
MAKEFONT = $(TOOLPATH)makefont.exe
|
||||
BIN2OBJ = $(TOOLPATH)bin2obj.exe
|
||||
BIM2HRB = $(TOOLPATH)bim2hrb.exe
|
||||
BIM2BIN = $(TOOLPATH)bim2bin.exe
|
||||
RULEFILE = ../haribote.rul
|
||||
EDIMG = $(TOOLPATH)edimg.exe
|
||||
IMGTOL = $(TOOLPATH)imgtol.com
|
||||
GOLIB = $(TOOLPATH)golib00.exe
|
||||
COPY = copy
|
||||
DEL = del
|
||||
|
||||
#默认动作
|
||||
|
||||
default :
|
||||
$(MAKE) $(APP).hrb
|
||||
|
||||
#文件生成规则
|
||||
|
||||
$(APP).bim : $(APP).obj bmp.obj jpeg.obj $(APILIBPATH)apilib.lib Makefile
|
||||
$(OBJ2BIM) @$(RULEFILE) out:$(APP).bim map:$(APP).map stack:$(STACK) \
|
||||
$(APP).obj jpeg.obj bmp.obj $(APILIBPATH)apilib.lib
|
||||
|
||||
haribote.img : ../haribote/ipl20.bin ../haribote/haribote.sys $(APP).hrb \
|
||||
Makefile
|
||||
$(EDIMG) imgin:../../z_tools/fdimg0at.tek \
|
||||
wbinimg src:../haribote/ipl20.bin len:512 from:0 to:0 \
|
||||
copy from:../haribote/haribote.sys to:@: \
|
||||
copy from:$(APP).hrb to:@: \
|
||||
copy from:../nihongo/nihongo.fnt to:@: \
|
||||
imgout:haribote.img
|
||||
|
||||
# 其他指令
|
||||
|
||||
%.gas : %.c ../apilib.h Makefile
|
||||
$(CC1) -o $*.gas $*.c
|
||||
|
||||
%.nas : %.gas Makefile
|
||||
$(GAS2NASK) $*.gas $*.nas
|
||||
|
||||
%.obj : %.nas Makefile
|
||||
$(NASK) $*.nas $*.obj $*.lst
|
||||
|
||||
%.org : %.bim Makefile
|
||||
$(BIM2HRB) $*.bim $*.org $(MALLOC)
|
||||
|
||||
%.hrb : %.org Makefile
|
||||
$(BIM2BIN) -osacmp in:$*.org out:$*.hrb
|
||||
|
||||
# 运行程序
|
||||
|
||||
run :
|
||||
$(MAKE) haribote.img
|
||||
$(COPY) haribote.img ..\..\z_tools\qemu\fdimage0.bin
|
||||
$(MAKE) -C ../../z_tools/qemu
|
||||
|
||||
full :
|
||||
$(MAKE) -C $(APILIBPATH)
|
||||
$(MAKE) $(APP).hrb
|
||||
|
||||
run_full :
|
||||
$(MAKE) -C $(APILIBPATH)
|
||||
$(MAKE) -C ../haribote
|
||||
$(MAKE) run
|
||||
|
||||
clean :
|
||||
-$(DEL) *.lst
|
||||
-$(DEL) gview.obj
|
||||
-$(DEL) jpeg.obj
|
||||
-$(DEL) *.map
|
||||
-$(DEL) *.bim
|
||||
-$(DEL) *.org
|
||||
-$(DEL) haribote.img
|
||||
|
||||
src_only :
|
||||
$(MAKE) clean
|
||||
-$(DEL) $(APP).hrb
|
||||
646
30_day/gview/bmp.nasm
Normal file
646
30_day/gview/bmp.nasm
Normal file
@@ -0,0 +1,646 @@
|
||||
; BMP decode routine by I.Tak. 2003
|
||||
|
||||
section .text align=1
|
||||
[bits 32]
|
||||
;BMP File Structure (I can't understand MS.)
|
||||
|
||||
struc BMP
|
||||
;FILE HEADER
|
||||
.fType: resw 1 ;BM
|
||||
.fSize: resd 1 ;whole file size
|
||||
resd 1 ;reserved
|
||||
.fOffBits: resd 1 ;offset from file top to image
|
||||
;INFO HEADER
|
||||
.iSize: resd 1 ;INFO HEADER size
|
||||
.iWidth: resd 1 ;Image Width in pixels
|
||||
.iHeight: resd 1 ;Image Height in pixels
|
||||
.iPlanes: resw 1 ;must be 1
|
||||
.iBitCount: resw 1 ;BitPerPixel 1, 4, 8, 24 (and 15,16 for new OS/2 ?)
|
||||
.iCompression: resd 1 ;Compress Type. 0 for none, then SizeImage=0
|
||||
.iSizeImage: resd 1 ;Image Size(compressed)
|
||||
.iXPPM: resd 1 ;X Pixel Per Meter
|
||||
.iYPPM: resd 1
|
||||
.iClrUsed: resd 1 ;Number of used ColorQuad (0 for whole Quad)
|
||||
.iClrImportant: resd 1 ;Number of Important ColorQuad.
|
||||
endstruc
|
||||
|
||||
struc BMPOS2
|
||||
;FILE HEADER
|
||||
.fType: resw 1 ;BM
|
||||
.fSize: resd 1 ;whole file size
|
||||
resd 1 ;reserved
|
||||
.fOffBits: resd 1 ;offset from file top to image
|
||||
;CORE HEADER
|
||||
.iSize: resd 1 ;CORE HEADER size
|
||||
.iWidth: resw 1 ;Image Width in pixels
|
||||
.iHeight: resw 1 ;Image Height in pixels
|
||||
.iPlanes: resw 1 ;must be 1
|
||||
.iBitCount: resw 1 ;BitPerPixel 1, 4, 8, 24 (and 15,16 for new OS/2 ?)
|
||||
endstruc
|
||||
|
||||
; B/W bmp can also have palettes. The first for 0, second for 1.
|
||||
|
||||
struc CQuad
|
||||
.b: resb 1
|
||||
.g: resb 1
|
||||
.r: resb 1
|
||||
resb 1 ;reserved
|
||||
endstruc
|
||||
|
||||
|
||||
%if 0
|
||||
int info_BMP(struct DLL_STRPICENV *env, int *info, int size, UCHAR *fp);
|
||||
/* 成功したら1 (非0?), 失敗したら0 */
|
||||
int decode0_BMP(struct DLL_STRPICENV *env, int size, UCHAR *fp,
|
||||
int b_type, UCHAR *buf, int skip);
|
||||
/* エラーコードを返す。とりあえず非0にしてるだけ */
|
||||
envは64KBのワークエリアである。先頭8dwは返り値用になっている。
|
||||
揮発性らしく, インスタンス変数的には使えないようだ。JPEG_initで
|
||||
base_imgを作るのはdecodeのときだけでいいと思う。
|
||||
%endif
|
||||
|
||||
[absolute 0] ;naskなら[section .bss] org 0 かな win32だからダメか
|
||||
bmpinfo:
|
||||
.regs: resd 4
|
||||
.reteip: resd 1
|
||||
.env: resd 1
|
||||
.info: resd 1
|
||||
.size: resd 1
|
||||
.module: resd 1
|
||||
[absolute 0]
|
||||
info:
|
||||
.type: resd 1 ;1 for BMP, 2 for JPEG
|
||||
resd 1 ;0
|
||||
.width: resd 1
|
||||
.height: resd 1
|
||||
[section .text]
|
||||
[global _info_BMP]
|
||||
_info_BMP:
|
||||
push ebx
|
||||
push ebp
|
||||
push esi
|
||||
push edi
|
||||
mov esi, [esp+bmpinfo.module]
|
||||
mov eax, [esp+bmpinfo.size]
|
||||
call bmpHeader
|
||||
test edi, edi
|
||||
jz .ret
|
||||
mov esi, [esp+bmpinfo.info]
|
||||
mov [esi+info.width], eax
|
||||
mov [esi+info.height], ecx
|
||||
mov [esi+info.type], edi ;=1
|
||||
dec edi
|
||||
mov [esi+info.type+4], edi ;=0
|
||||
inc edi
|
||||
.ret: mov eax, edi
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
;in: esi=module, eax=size
|
||||
;ret:eax=width, ecx=hegiht, edx=paletteSize, ebx=palette
|
||||
; ebp=bpp, esi=endOfImage, edi=successFlag
|
||||
bmpHeader:
|
||||
lea edx, [esi+eax] ;moduleEnd
|
||||
xor edi, edi
|
||||
push edx
|
||||
xor edx, edx
|
||||
|
||||
cmp eax, byte BMP.iSize+4
|
||||
jbe ..@ret ;中継してしまう
|
||||
cmp word[esi],'BM'
|
||||
je .notMAC
|
||||
sub esi, byte -128
|
||||
add eax, byte -128
|
||||
pop ebx
|
||||
push eax
|
||||
cmp eax, byte BMP.iSize+4
|
||||
..@ret: jbe .ret
|
||||
cmp word[esi], 'BM'
|
||||
jne .ret
|
||||
.notMAC:
|
||||
;;MS,OS/2 フォーマット確認
|
||||
mov ecx, [esi +BMP.iSize]
|
||||
cmp ecx, byte 12 ;OS/2 format.
|
||||
jne .MS
|
||||
cmp eax, byte BMPOS2_size
|
||||
jbe .ret ;coreヘッダなし
|
||||
lea ebx, [esi+ecx+14] ;palette
|
||||
movzx eax, word[esi+BMPOS2.iWidth] ;width
|
||||
movzx ecx, word[esi+BMPOS2.iHeight] ;height
|
||||
movzx ebp, word[esi+BMPOS2.iBitCount] ;bpp
|
||||
mov dl, 3 ;paletteSize
|
||||
jmp short .endif
|
||||
.MS: cmp eax, byte BMP_size
|
||||
jbe .ret ;infoヘッダなし
|
||||
lea ebx, [esi+ecx+14]
|
||||
sub ecx,byte 40
|
||||
jne .ret ;unknownFormat
|
||||
cmp ecx, [esi+BMP.iCompression]
|
||||
jne .ret ;Compressed.
|
||||
mov eax, [esi+BMP.iWidth] ;width
|
||||
mov ecx, [esi+BMP.iHeight] ;height
|
||||
movzx ebp, word[esi +BMP.iBitCount] ;bpp
|
||||
mov dl, 4 ;paletteSize
|
||||
.endif:
|
||||
add esi, [esi +BMP.fOffBits]
|
||||
|
||||
;sizeが小さい場合heightを削ってで<E381A6>
|
||||
;読めると答えるべきだろう。今はエラー
|
||||
push edx
|
||||
push eax
|
||||
mul ebp ;eax=width*bpp
|
||||
add eax, byte 7
|
||||
shr eax, 3 ;lineSizeWithoutPudding
|
||||
mov edx, eax
|
||||
add eax, byte 3 ;size<1GBを仮定してedxを無<E38292>
|
||||
and al, -4 ;lineSizeWithPudding
|
||||
sub edx, eax ;-puddingSize
|
||||
push edx
|
||||
mul ecx
|
||||
pop edx
|
||||
add esi, eax
|
||||
add esi, edx ;最終行の最後にはpuddingがないと見るべき
|
||||
cmp esi, [esp+8] ;endOfModule
|
||||
pop eax
|
||||
ja .ret2
|
||||
sub esi, edx ;esi=endOfImage
|
||||
inc edi ;succeeded!
|
||||
.ret2: pop edx
|
||||
.ret: add esp, byte 4
|
||||
ret
|
||||
|
||||
;***************************************************************
|
||||
; 小ささ優先で作っているが, 速さ優先で作った昔のよりいいかも。
|
||||
; 品質最低の高速モードのみ作ってい<E381A6>
|
||||
|
||||
[absolute 0]
|
||||
decode:
|
||||
.regs: resd 4
|
||||
.reteip: resd 1
|
||||
.env: resd 1
|
||||
.size: resd 1
|
||||
.module: resd 1
|
||||
.outputType: resd 1
|
||||
.dest: resd 1
|
||||
.skip: resd 1
|
||||
[section .text]
|
||||
[global _decode0_BMP]
|
||||
_decode0_BMP:
|
||||
push ebx
|
||||
push ebp
|
||||
push esi
|
||||
push edi
|
||||
mov esi, [esp+decode.module]
|
||||
mov eax, [esp+decode.size]
|
||||
call bmpHeader
|
||||
;ret:eax=width, ecx=hegiht, edx=paletteSize, ebx=palette
|
||||
; ebp=bpp, esi=endOfImage, edi=successFlag
|
||||
test edi,edi
|
||||
jz .error
|
||||
mov edi, [esp+decode.dest]
|
||||
push dword[esp+decode.outputType]
|
||||
push dword[esp+4+decode.skip]
|
||||
push ecx ;height
|
||||
push eax
|
||||
push edx
|
||||
mul ebp
|
||||
add eax, byte 31
|
||||
shr eax, 3
|
||||
and al, -4
|
||||
push eax
|
||||
mov edx, ebp
|
||||
mov ebp, esp
|
||||
call bmp2beta ;ecx!=0 for error
|
||||
add esp, byte bb.size
|
||||
mov eax, ecx
|
||||
test ecx, ecx
|
||||
jz .ret
|
||||
.error: push byte 1
|
||||
pop eax
|
||||
.ret: pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
[absolute -4*2]
|
||||
bb:
|
||||
.col0: resd 1 ;bpp1で使う
|
||||
.reteip: resd 1
|
||||
.sw: resd 1 ;byte
|
||||
.paletteSize: resd 1 ;byte
|
||||
.w: resd 1 ;pixel
|
||||
.h: resd 1
|
||||
.s: resd 1
|
||||
.t: resd 1
|
||||
.size: equ $-$$
|
||||
[section .text]
|
||||
;eax=?, ecx=height, edx=bpp, ebx=palette
|
||||
;ebp=bb, esi=endOfImage, edi=dest
|
||||
bmp2beta:
|
||||
mov al, [ebp+bb.t]
|
||||
and al, 0x7f
|
||||
cmp al, 2
|
||||
je near buf16
|
||||
cmp al, 4
|
||||
je buf32
|
||||
mov ecx, esp ;!=0
|
||||
ret
|
||||
;===============================================================
|
||||
; Buffer mode 4
|
||||
;===============================================================
|
||||
buf32:
|
||||
dec edx
|
||||
je near .bpp1
|
||||
sub edx, byte 4-1
|
||||
je .bpp4
|
||||
sub edx, byte 8-4
|
||||
je .bpp8
|
||||
sub edx, byte 24-8
|
||||
je .bpp24
|
||||
mov ecx, esp ;!=0
|
||||
ret
|
||||
;---------------------------------------------------
|
||||
; 24bpp BMP to 4byte bufer
|
||||
;---------------------------------------------------
|
||||
.bpp24:
|
||||
;ecx=height, edx=0, ebx=palette
|
||||
;esi=endOfImage, edi=destinationBuffer
|
||||
;bb.w=width(pixel), bb.s=skipByte, bb.h=height
|
||||
;bb.t=outputType, bb.sw=sourceWidthByte
|
||||
|
||||
.do24.1:
|
||||
sub esi, [ebp+bb.sw] ;esi=startOfLine
|
||||
push ecx
|
||||
push esi
|
||||
mov ecx, [ebp+bb.w]
|
||||
.do24.2:
|
||||
mov al, [esi]
|
||||
mov [edi+3], dl
|
||||
mov [edi], al
|
||||
mov al, [esi+1]
|
||||
mov [edi+1], al
|
||||
mov al, [esi+2]
|
||||
mov [edi+2], al
|
||||
add esi, byte 3
|
||||
add edi, byte 4
|
||||
dec ecx
|
||||
jnz .do24.2
|
||||
pop esi
|
||||
pop ecx
|
||||
add edi, [ebp+bb.s]
|
||||
dec ecx
|
||||
jnz .do24.1
|
||||
ret
|
||||
|
||||
;---------------------------------------------------
|
||||
; 8bpp BMP to 4byte buffer
|
||||
;---------------------------------------------------
|
||||
.bpp8:
|
||||
;ecx=height, edx=0, ebx=palette
|
||||
;esi=endOfImage, edi=destinationBuffer
|
||||
|
||||
;pallete変換
|
||||
mov dl, 255
|
||||
mov eax, [ebp+bb.paletteSize]
|
||||
sub ebx, eax
|
||||
shl eax, 8
|
||||
add ebx, eax ;ebx += paletteSize*255
|
||||
.do8.1:
|
||||
mov eax, [ebx]
|
||||
sub ebx, [ebp+bb.paletteSize]
|
||||
and eax, 0x00ffffff
|
||||
dec edx
|
||||
push eax
|
||||
jns .do8.1
|
||||
|
||||
.do8.2:
|
||||
sub esi, [ebp+bb.sw] ;esi=firstLineStart
|
||||
push ecx
|
||||
push esi
|
||||
mov ecx, [ebp+bb.w]
|
||||
.do8.3:
|
||||
xor eax, eax
|
||||
add edi, byte 4
|
||||
mov al, [esi]
|
||||
inc esi
|
||||
;AGI stole
|
||||
mov eax, [esp+eax*4+8]
|
||||
dec ecx
|
||||
mov [edi-4], eax
|
||||
jnz .do8.3
|
||||
pop esi
|
||||
pop ecx
|
||||
add edi, [ebp+bb.s]
|
||||
dec ecx
|
||||
jnz .do8.2
|
||||
add esp, 256*4 ;palette
|
||||
ret
|
||||
|
||||
;---------------------------------------------------
|
||||
; 4bpp BMP to 4byte buffer
|
||||
;---------------------------------------------------
|
||||
.bpp4:
|
||||
;ecx=height, edx=0, ebx=palette
|
||||
;esi=endOfImage, edi=destinationBuffer
|
||||
|
||||
;pallete変換
|
||||
mov dl, 16
|
||||
mov eax, [ebp+bb.paletteSize]
|
||||
sub ebx, eax
|
||||
shl eax, 4
|
||||
add ebx, eax ;ebx+=eax*15
|
||||
.do4.1
|
||||
mov eax, [ebx]
|
||||
sub ebx, [ebp+bb.paletteSize]
|
||||
and eax, 0x00ffffff
|
||||
dec edx
|
||||
push eax
|
||||
jnz .do4.1
|
||||
|
||||
.do4.2:
|
||||
sub esi, [ebp+bb.sw] ;esi=firstLineStart
|
||||
push ecx
|
||||
push esi
|
||||
mov ecx, [ebp+bb.w]
|
||||
.do4.3:
|
||||
xor edx, edx
|
||||
mov al, [esi]
|
||||
mov dl, al
|
||||
inc esi
|
||||
shr dl, 4
|
||||
and eax, byte 15
|
||||
add edi, byte 4
|
||||
dec ecx
|
||||
mov edx, [esp+edx*4+8]
|
||||
mov eax, [esp+eax*4+8]
|
||||
mov [edi-4], edx
|
||||
jz .wend
|
||||
mov [edi], eax
|
||||
add edi, byte 4
|
||||
dec ecx
|
||||
jnz .do4.3
|
||||
.wend: pop esi
|
||||
pop ecx
|
||||
add edi, [ebp+bb.s]
|
||||
dec ecx
|
||||
jnz .do4.2
|
||||
add esp, 16*4 ;palette
|
||||
ret
|
||||
|
||||
;---------------------------------------------------
|
||||
; 1bpp BMP to 4byte buffer
|
||||
;---------------------------------------------------
|
||||
.bpp1:
|
||||
;ecx=height, edx=0, ebx=palette
|
||||
;esi=endOfImage, edi=destinationBuffer
|
||||
|
||||
;pallete変換
|
||||
mov eax, [ebx]
|
||||
add ebx, [ebp+bb.paletteSize]
|
||||
and eax, 0x00ffffff
|
||||
mov ebx, [ebx]
|
||||
and ebx, 0x00ffffff
|
||||
xor ebx, eax
|
||||
;push ebx
|
||||
push eax
|
||||
|
||||
.do1.1:
|
||||
sub esi, [ebp+bb.sw] ;esi=firstLineStart
|
||||
push ecx
|
||||
push esi
|
||||
mov ecx, [ebp+bb.w]
|
||||
.do1.2:
|
||||
mov dl, [esi]
|
||||
inc esi
|
||||
push esi
|
||||
mov esi, 8
|
||||
.do1.3:
|
||||
add edi, byte 4
|
||||
add dl, dl
|
||||
sbb eax, eax
|
||||
and eax, ebx
|
||||
xor eax, [ebp+bb.col0]
|
||||
dec ecx
|
||||
mov [edi-4], eax
|
||||
jz .wend1bpp
|
||||
dec esi
|
||||
jnz .do1.3
|
||||
pop esi
|
||||
jmp short .do1.2
|
||||
.wend1bpp:pop ecx
|
||||
pop esi
|
||||
pop ecx
|
||||
add edi, [ebp+bb.s]
|
||||
dec ecx
|
||||
jnz .do1.1
|
||||
pop eax
|
||||
ret
|
||||
|
||||
;===============================================
|
||||
; Buffer mode 2byte
|
||||
;===============================================
|
||||
buf16:
|
||||
dec edx
|
||||
je near .bpp1
|
||||
sub edx, byte 4-1
|
||||
je near .bpp4
|
||||
sub edx, byte 8-4
|
||||
je .bpp8
|
||||
sub edx, byte 24-8
|
||||
je .bpp24
|
||||
mov ecx, esp
|
||||
ret
|
||||
;---------------------------------------------------
|
||||
; 24bpp BMP to 2byte bufer
|
||||
;---------------------------------------------------
|
||||
.bpp24:
|
||||
;ecx=height, edx=0, ebx=palette
|
||||
;esi=endOfImage, edi=destinationBuffer
|
||||
|
||||
.do24.1:
|
||||
sub esi, [ebp+bb.sw] ;esi=startOfLine
|
||||
push ecx
|
||||
push esi
|
||||
mov ecx, [ebp+bb.w]
|
||||
.do24.2:
|
||||
mov al, [esi+2]
|
||||
shl eax, 16
|
||||
mov ax, [esi]
|
||||
add esi, byte 3
|
||||
;減色処理 eax=24bitColor, edx=work, ecx=counter, ebx=work
|
||||
;川合さんの趣味で没ったルーチンを持ってくるもよし(ぉ
|
||||
;誤差拡散ルーチンを持ってくるもよし
|
||||
shr ah, 2 ;???????? RRRRRrrr 00GGGGGG BBBBBbbb
|
||||
inc edi
|
||||
shr eax, 3 ;000????? ???RRRRR rrr00GGG GGGBBBBB
|
||||
shl ax, 5 ;000????? ???RRRRR GGGGGGBB BBB00000
|
||||
inc edi
|
||||
shr eax, 5 ;00000000 ???????? RRRRRGGG GGGBBBBB
|
||||
dec ecx
|
||||
mov [edi-2], ax
|
||||
jnz .do24.2
|
||||
pop esi
|
||||
pop ecx
|
||||
add edi, [ebp+bb.s]
|
||||
dec ecx
|
||||
jnz .do24.1
|
||||
ret
|
||||
|
||||
;---------------------------------------------------
|
||||
; 8bpp BMP to 2byte buffer
|
||||
;---------------------------------------------------
|
||||
.bpp8:
|
||||
;ecx=height, edx=0, ebx=palette
|
||||
;esi=endOfImage, edi=destinationBuffer
|
||||
|
||||
;pallete変換
|
||||
mov dl, 255
|
||||
mov eax, [ebp+bb.paletteSize]
|
||||
sub ebx, eax
|
||||
shl eax, 8
|
||||
add ebx, eax ;ebx += paletteSize*255
|
||||
.do8.1:
|
||||
mov eax, [ebx]
|
||||
sub ebx, [ebp+bb.paletteSize]
|
||||
call .paletteConv
|
||||
dec edx
|
||||
push eax
|
||||
jns .do8.1
|
||||
|
||||
.do8.2:
|
||||
sub esi, [ebp+bb.sw] ;esi=firstLineStart
|
||||
push ecx
|
||||
push esi
|
||||
mov ecx, [ebp+bb.w]
|
||||
.do8.3:
|
||||
xor eax, eax
|
||||
add edi, byte 2
|
||||
mov al, [esi]
|
||||
inc esi
|
||||
;AGI stole
|
||||
mov eax, [esp+eax*4+8]
|
||||
dec ecx
|
||||
mov [edi-2], ax
|
||||
jnz .do8.3
|
||||
pop esi
|
||||
pop ecx
|
||||
add edi, [ebp+bb.s]
|
||||
dec ecx
|
||||
jnz .do8.2
|
||||
add esp, 256*4 ;palette
|
||||
ret
|
||||
|
||||
;---------------------------------------------------
|
||||
; 4bpp BMP to 2byte buffer
|
||||
;---------------------------------------------------
|
||||
.bpp4:
|
||||
;ecx=height, edx=0, ebx=palette
|
||||
;esi=endOfImage, edi=destinationBuffer
|
||||
|
||||
;pallete変換
|
||||
mov dl, 16
|
||||
mov eax, [ebp+bb.paletteSize]
|
||||
sub ebx, eax
|
||||
shl eax, 4
|
||||
add ebx, eax ;ebx+=eax*15
|
||||
.do4.1:
|
||||
mov eax, [ebx]
|
||||
sub ebx, [ebp+bb.paletteSize]
|
||||
call .paletteConv
|
||||
dec edx
|
||||
push eax
|
||||
jnz .do4.1
|
||||
|
||||
.do4.2:
|
||||
sub esi, [ebp+bb.sw] ;esi=firstLineStart
|
||||
push ecx
|
||||
push esi
|
||||
mov ecx, [ebp+bb.w]
|
||||
.do4.3:
|
||||
xor edx, edx
|
||||
mov al, [esi]
|
||||
mov dl, al
|
||||
inc esi
|
||||
shr dl, 4
|
||||
and eax, byte 15
|
||||
add edi, byte 2
|
||||
dec ecx
|
||||
mov edx, [esp+edx*4+8]
|
||||
mov eax, [esp+eax*4+8]
|
||||
mov [edi-2], dx
|
||||
jz .wend
|
||||
mov [edi], ax
|
||||
add edi, byte 2
|
||||
dec ecx
|
||||
jnz .do4.3
|
||||
.wend: pop esi
|
||||
pop ecx
|
||||
add edi, [ebp+bb.s]
|
||||
dec ecx
|
||||
jnz .do4.2
|
||||
add esp, 16*4 ;palette
|
||||
ret
|
||||
|
||||
;---------------------------------------------------
|
||||
; 1bpp BMP to 2byte buffer
|
||||
;---------------------------------------------------
|
||||
.bpp1:
|
||||
;ecx=height, edx=0, ebx=palette
|
||||
;esi=endOfImage, edi=destinationBuffer
|
||||
|
||||
;pallete変換
|
||||
mov eax, [ebx]
|
||||
add ebx, [ebp+bb.paletteSize]
|
||||
call .paletteConv
|
||||
push eax
|
||||
mov eax, [ebx]
|
||||
call .paletteConv
|
||||
pop ebx
|
||||
xchg eax, ebx
|
||||
xor ebx, eax
|
||||
push eax
|
||||
|
||||
.do1.1:
|
||||
sub esi, [ebp+bb.sw] ;esi=firstLineStart
|
||||
push ecx
|
||||
push esi
|
||||
mov ecx, [ebp+bb.w]
|
||||
.do1.2:
|
||||
mov dl, [esi]
|
||||
inc esi
|
||||
push esi
|
||||
mov esi, 8
|
||||
.do1.3:
|
||||
add dl, dl
|
||||
inc edi
|
||||
sbb eax, eax
|
||||
inc edi
|
||||
and eax, ebx
|
||||
xor eax, [ebp+bb.col0]
|
||||
dec ecx
|
||||
mov [edi-2], ax
|
||||
jz .wend1bpp
|
||||
dec esi
|
||||
jnz .do1.3
|
||||
pop esi
|
||||
jmp short .do1.2
|
||||
.wend1bpp:
|
||||
pop ecx
|
||||
pop esi
|
||||
pop ecx
|
||||
add edi, [ebp+bb.s]
|
||||
dec ecx
|
||||
jnz .do1.1
|
||||
pop eax
|
||||
ret
|
||||
|
||||
.paletteConv:
|
||||
shr ah, 2
|
||||
shr eax, 3
|
||||
shl ax, 5
|
||||
shr eax, 5
|
||||
ret
|
||||
BIN
30_day/gview/bmp.obj
Normal file
BIN
30_day/gview/bmp.obj
Normal file
Binary file not shown.
121
30_day/gview/gview.c
Normal file
121
30_day/gview/gview.c
Normal file
@@ -0,0 +1,121 @@
|
||||
#include "apilib.h"
|
||||
|
||||
struct DLL_STRPICENV { /* 64KB */
|
||||
int work[64 * 1024 / 4];
|
||||
};
|
||||
|
||||
struct RGB {
|
||||
unsigned char b, g, r, t;
|
||||
};
|
||||
|
||||
/* bmp.nasm */
|
||||
int info_BMP(struct DLL_STRPICENV *env, int *info, int size, char *fp);
|
||||
int decode0_BMP(struct DLL_STRPICENV *env, int size, char *fp, int b_type, char *buf, int skip);
|
||||
|
||||
/* jpeg.c */
|
||||
int info_JPEG(struct DLL_STRPICENV *env, int *info, int size, char *fp);
|
||||
int decode0_JPEG(struct DLL_STRPICENV *env, int size, char *fp, int b_type, char *buf, int skip);
|
||||
|
||||
unsigned char rgb2pal(int r, int g, int b, int x, int y);
|
||||
void error(char *s);
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
struct DLL_STRPICENV env;
|
||||
char filebuf[512 * 1024], winbuf[1040 * 805];
|
||||
char s[32], *p;
|
||||
int win, i, j, fsize, xsize, info[8];
|
||||
struct RGB picbuf[1024 * 768], *q;
|
||||
|
||||
/*命令行解析*/
|
||||
api_cmdline(s, 30);
|
||||
for (p = s; *p > ' '; p++) { } /*一直读到空格为止*/
|
||||
for (; *p == ' '; p++) { } /*跳过空格*/
|
||||
|
||||
/*文件载入*/
|
||||
i = api_fopen(p); if (i == 0) { error("file not found.\n"); }
|
||||
fsize = api_fsize(i, 0);
|
||||
if (fsize > 512 * 1024) {
|
||||
error("file too large.\n");
|
||||
}
|
||||
api_fread(filebuf, fsize, i);
|
||||
api_fclose(i);
|
||||
|
||||
/*检查文件类型*/
|
||||
if (info_BMP(&env, info, fsize, filebuf) == 0) {
|
||||
/*不是BMP */
|
||||
if (info_JPEG(&env, info, fsize, filebuf) == 0) {
|
||||
/*也不是JPEG */
|
||||
api_putstr0("file type unknown.\n");
|
||||
api_end();
|
||||
}
|
||||
}
|
||||
/*上面其中一个info函数调用成功的话,info中包含以下信息 */
|
||||
/*info[0]:文件类型(1:BMP、2:JPEG)*/
|
||||
/*info[1]:颜色数信息*/
|
||||
/*info[2]:xsize */
|
||||
/* info[3] : ysize */
|
||||
|
||||
if (info[2] > 1024 || info[3] > 768) {
|
||||
error("picture too large.\n");
|
||||
}
|
||||
|
||||
/*窗口准备*/
|
||||
xsize = info[2] + 16;
|
||||
if (xsize < 136) {
|
||||
xsize = 136;
|
||||
}
|
||||
win = api_openwin(winbuf, xsize, info[3] + 37, -1, "gview");
|
||||
|
||||
/*将文件内容转换为图像数据*/
|
||||
if (info[0] == 1) {
|
||||
i = decode0_BMP (&env, fsize, filebuf, 4, (char *) picbuf, 0);
|
||||
} else {
|
||||
i = decode0_JPEG(&env, fsize, filebuf, 4, (char *) picbuf, 0);
|
||||
}
|
||||
/*b_type = 4表示struct RGB格式*/
|
||||
/*skip设为0即可*/
|
||||
if (i != 0) {
|
||||
error("decode error.\n");
|
||||
}
|
||||
|
||||
/*显示*/
|
||||
for (i = 0; i < info[3]; i++) {
|
||||
p = winbuf + (i + 29) * xsize + (xsize - info[2]) / 2;
|
||||
q = picbuf + i * info[2];
|
||||
for (j = 0; j < info[2]; j++) {
|
||||
p[j] = rgb2pal(q[j].r, q[j].g, q[j].b, j, i);
|
||||
}
|
||||
}
|
||||
api_refreshwin(win, (xsize - info[2]) / 2, 29, (xsize - info[2]) / 2 + info[2], 29 + info[3]);
|
||||
|
||||
/*等待结束*/
|
||||
for (;;) {
|
||||
i = api_getkey(1);
|
||||
if (i == 'Q' || i == 'q') {
|
||||
api_end();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned char rgb2pal(int r, int g, int b, int x, int y)
|
||||
{
|
||||
static int table[4] = { 3, 1, 0, 2 };
|
||||
int i;
|
||||
x &= 1; /*判断是偶数还是奇数*/
|
||||
y &= 1;
|
||||
i = table[x + y * 2]; /*用于生成中间色的常量*/
|
||||
r = (r * 21) / 256; /*结果为0~20*/
|
||||
g = (g * 21) / 256;
|
||||
b = (b * 21) / 256;
|
||||
r = (r + i) / 4; /*结果为0~5*/
|
||||
g = (g + i) / 4;
|
||||
b = (b + i) / 4;
|
||||
return 16 + r + g * 6 + b * 36;
|
||||
}
|
||||
|
||||
void error(char *s)
|
||||
{
|
||||
api_putstr0(s);
|
||||
api_end();
|
||||
}
|
||||
733
30_day/gview/jpeg.c
Normal file
733
30_day/gview/jpeg.c
Normal file
@@ -0,0 +1,733 @@
|
||||
/*
|
||||
* JPEG decoding engine for DCT-baseline
|
||||
*
|
||||
* copyrights 2003 by nikq | nikq::club.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
typedef unsigned char UCHAR;
|
||||
|
||||
struct DLL_STRPICENV { int work[16384]; };
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int elem;
|
||||
unsigned short code[256];
|
||||
unsigned char size[256];
|
||||
unsigned char value[256];
|
||||
}HUFF;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
// SOF
|
||||
int width;
|
||||
int height;
|
||||
// MCU
|
||||
int mcu_width;
|
||||
int mcu_height;
|
||||
|
||||
int max_h,max_v;
|
||||
int compo_count;
|
||||
int compo_id[3];
|
||||
int compo_sample[3];
|
||||
int compo_h[3];
|
||||
int compo_v[3];
|
||||
int compo_qt[3];
|
||||
|
||||
// SOS
|
||||
int scan_count;
|
||||
int scan_id[3];
|
||||
int scan_ac[3];
|
||||
int scan_dc[3];
|
||||
int scan_h[3];
|
||||
int scan_v[3];
|
||||
int scan_qt[3];
|
||||
|
||||
// DRI
|
||||
int interval;
|
||||
|
||||
int mcu_buf[32*32*4];
|
||||
int *mcu_yuv[4];
|
||||
int mcu_preDC[3];
|
||||
|
||||
// DQT
|
||||
int dqt[3][64];
|
||||
int n_dqt;
|
||||
|
||||
// DHT
|
||||
HUFF huff[2][3];
|
||||
|
||||
|
||||
// FILE i/o
|
||||
unsigned char *fp, *fp1;
|
||||
unsigned long bit_buff;
|
||||
int bit_remain;
|
||||
int width_buf;
|
||||
|
||||
int base_img[64][64];
|
||||
|
||||
/* for dll
|
||||
|
||||
JPEG *jpeg = (JPEG *)malloc(sizeof(JPEG) + 256);
|
||||
*/
|
||||
int dummy[64];
|
||||
|
||||
}JPEG;
|
||||
|
||||
/* for 16bit */
|
||||
#ifndef PIXEL16
|
||||
#define PIXEL16(r, g, b) ((r) << 11 | (g) << 5 | (b))
|
||||
/* 0 <= r <= 31, 0 <= g <= 63, 0 <= b <= 31 */
|
||||
#endif
|
||||
|
||||
int info_JPEG(struct DLL_STRPICENV *env, int *info, int size, UCHAR *fp);
|
||||
int decode0_JPEG(struct DLL_STRPICENV *env, int size, UCHAR *fp, int b_type, UCHAR *buf, int skip);
|
||||
|
||||
void jpeg_idct_init(int base_img[64][64]);
|
||||
int jpeg_init(JPEG *jpeg);
|
||||
// int jpeg_header(JPEG *jpge);
|
||||
void jpeg_decode(JPEG *jpeg, unsigned char *rgb,int b_type);
|
||||
|
||||
/* ----------------- start main section ----------------- */
|
||||
|
||||
int info_JPEG(struct DLL_STRPICENV *env,int *info, int size, UCHAR *fp0)
|
||||
{
|
||||
JPEG *jpeg = (JPEG *) (((int *) env) + 128);
|
||||
jpeg->fp = fp0;
|
||||
jpeg->fp1 = fp0 + size;
|
||||
|
||||
// if (512 + sizeof (JPEG) > 64 * 1024)
|
||||
// return 0;
|
||||
|
||||
if (jpeg_init(jpeg))
|
||||
return 0;
|
||||
// jpeg_header(jpeg);
|
||||
|
||||
if (jpeg->width == 0)
|
||||
return 0;
|
||||
|
||||
info[0] = 0x0002;
|
||||
info[1] = 0x0000;
|
||||
info[2] = jpeg->width;
|
||||
info[3] = jpeg->height;
|
||||
|
||||
/* OK */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int decode0_JPEG(struct DLL_STRPICENV *env,int size, UCHAR *fp0, int b_type, UCHAR *buf, int skip)
|
||||
{
|
||||
JPEG *jpeg = (JPEG *) (((int *) env) + 128);
|
||||
jpeg->fp = fp0;
|
||||
jpeg->fp1 = fp0 + size;
|
||||
|
||||
jpeg_idct_init(jpeg->base_img);
|
||||
jpeg_init(jpeg);
|
||||
// jpeg_header(jpeg);
|
||||
|
||||
// if (jpeg->width == 0)
|
||||
// return 8;
|
||||
/* decode*/
|
||||
|
||||
jpeg->width_buf = skip / (b_type & 0x7f) + jpeg->width;
|
||||
jpeg_decode(jpeg, buf, b_type);
|
||||
|
||||
/* OK */
|
||||
return 0;
|
||||
}
|
||||
|
||||
// -------------------------- I/O ----------------------------
|
||||
|
||||
unsigned short get_bits(JPEG *jpeg, int bit)
|
||||
{
|
||||
unsigned char c, c2;
|
||||
unsigned short ret;
|
||||
unsigned long buff;
|
||||
int remain;
|
||||
|
||||
buff = jpeg->bit_buff;
|
||||
remain = jpeg->bit_remain;
|
||||
|
||||
while (remain <= 16) {
|
||||
if (jpeg->fp >= jpeg->fp1) {
|
||||
ret = 0;
|
||||
goto fin;
|
||||
}
|
||||
c = *jpeg->fp++;
|
||||
if (c == 0xff) {
|
||||
if (jpeg->fp >= jpeg->fp1) {
|
||||
ret = 0;
|
||||
goto fin;
|
||||
}
|
||||
jpeg->fp++; /* 00 skip */
|
||||
}
|
||||
buff = (buff << 8) | c;
|
||||
remain += 8;
|
||||
}
|
||||
ret = (buff >> (remain - bit)) & ((1 << bit) - 1);
|
||||
remain -= bit;
|
||||
|
||||
jpeg->bit_remain = remain;
|
||||
jpeg->bit_buff = buff;
|
||||
fin:
|
||||
return ret;
|
||||
}
|
||||
|
||||
// ------------------------ JPEG -----------------
|
||||
|
||||
// start of frame
|
||||
int jpeg_sof(JPEG *jpeg)
|
||||
{
|
||||
unsigned char c;
|
||||
int i, h, v, n;
|
||||
|
||||
if (jpeg->fp + 8 > jpeg->fp1)
|
||||
goto err;
|
||||
/* fp[2] ‚Í bpp */
|
||||
jpeg->height = jpeg->fp[3] << 8 | jpeg->fp[4];
|
||||
jpeg->width = jpeg->fp[5] << 8 | jpeg->fp[6];
|
||||
n = jpeg->compo_count = jpeg->fp[7]; // Num of compo, nf
|
||||
jpeg->fp += 8;
|
||||
if (jpeg->fp + n * 3 > jpeg->fp1)
|
||||
goto err;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
jpeg->compo_id[i] = jpeg->fp[0];
|
||||
|
||||
jpeg->compo_sample[i] = c = jpeg->fp[1];
|
||||
h = jpeg->compo_h[i] = (c >> 4) & 0x0f;
|
||||
v = jpeg->compo_v[i] = c & 0x0f;
|
||||
|
||||
if (jpeg->max_h < h)
|
||||
jpeg->max_h = h;
|
||||
if (jpeg->max_v < v)
|
||||
jpeg->max_v = v;
|
||||
|
||||
jpeg->compo_qt[i] = jpeg->fp[2];
|
||||
jpeg->fp += 3;
|
||||
}
|
||||
return 0;
|
||||
err:
|
||||
jpeg->fp = jpeg->fp1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// define quantize table
|
||||
int jpeg_dqt(JPEG *jpeg)
|
||||
{
|
||||
unsigned char c;
|
||||
int i, j, v, size;
|
||||
|
||||
if (jpeg->fp + 2 > jpeg->fp1)
|
||||
goto err;
|
||||
size = (jpeg->fp[0] << 8 | jpeg->fp[1]) - 2;
|
||||
jpeg->fp += 2;
|
||||
if (jpeg->fp + size > jpeg->fp1)
|
||||
goto err;
|
||||
|
||||
while (size > 0) {
|
||||
c = *jpeg->fp++;
|
||||
size--;
|
||||
j = c & 7;
|
||||
if (j > jpeg->n_dqt)
|
||||
jpeg->n_dqt = j;
|
||||
|
||||
if (c & 0xf8) {
|
||||
// 16 bit DQT
|
||||
for (i = 0; i < 64; i++) {
|
||||
jpeg->dqt[j][i] = jpeg->fp[0];
|
||||
jpeg->fp += 2;
|
||||
}
|
||||
size += -64 * 2;
|
||||
} else {
|
||||
// 8 bit DQT
|
||||
for (i = 0; i < 64; i++)
|
||||
jpeg->dqt[j][i] = *jpeg->fp++;
|
||||
size -= 64;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
err:
|
||||
jpeg->fp = jpeg->fp1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// define huffman table
|
||||
int jpeg_dht(JPEG *jpeg)
|
||||
{
|
||||
unsigned tc, th;
|
||||
unsigned code = 0;
|
||||
unsigned char val;
|
||||
int i, j, k, num, Li[17];
|
||||
int len, max_val;
|
||||
HUFF *table;
|
||||
|
||||
if (jpeg->fp + 2 > jpeg->fp1)
|
||||
goto err;
|
||||
len = (jpeg->fp[0] << 8 | jpeg->fp[1]) - 2;
|
||||
jpeg->fp += 2;
|
||||
|
||||
while (len > 0) {
|
||||
if (jpeg->fp + 17 > jpeg->fp1)
|
||||
goto err;
|
||||
val = jpeg->fp[0];
|
||||
|
||||
tc = (val >> 4) & 0x0f;
|
||||
th = val & 0x0f;
|
||||
table = &(jpeg->huff[tc][th]);
|
||||
|
||||
num = 0;
|
||||
k = 0;
|
||||
for (i = 1; i <= 16; i++) {
|
||||
Li[i] = jpeg->fp[i];
|
||||
num += Li[i];
|
||||
for (j = 0; j < Li[i]; j++)
|
||||
table->size[k++] = i;
|
||||
}
|
||||
table->elem = num;
|
||||
jpeg->fp += 17;
|
||||
|
||||
k=0;
|
||||
code=0;
|
||||
i = table->size[0];
|
||||
while (k < num) {
|
||||
while (table->size[k] == i)
|
||||
table->code[k++] = code++;
|
||||
if (k >= num)
|
||||
break;
|
||||
do {
|
||||
code <<= 1;
|
||||
i++;
|
||||
} while (table->size[k] != i);
|
||||
}
|
||||
|
||||
if (jpeg->fp + num > jpeg->fp1)
|
||||
goto err;
|
||||
for (k = 0; k < num; k++)
|
||||
table->value[k] = jpeg->fp[k];
|
||||
jpeg->fp += num;
|
||||
|
||||
len -= 18 + num;
|
||||
}
|
||||
return 0;
|
||||
err:
|
||||
jpeg->fp = jpeg->fp1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int jpeg_init(JPEG *jpeg)
|
||||
{
|
||||
unsigned char c;
|
||||
int r = 0, i;
|
||||
jpeg->width = 0;
|
||||
jpeg->mcu_preDC[0] = 0;
|
||||
jpeg->mcu_preDC[1] = 0;
|
||||
jpeg->mcu_preDC[2] = 0;
|
||||
jpeg->n_dqt = 0;
|
||||
jpeg->max_h = 0;
|
||||
jpeg->max_v = 0;
|
||||
jpeg->bit_remain = 0;
|
||||
jpeg->bit_buff = 0;
|
||||
|
||||
jpeg->interval = 0;
|
||||
// return;
|
||||
//}
|
||||
//
|
||||
//int jpeg_header(JPEG *jpeg)
|
||||
//{
|
||||
// unsigned char c;
|
||||
// int r = 0, i;
|
||||
|
||||
for (;;) {
|
||||
if (jpeg->fp + 2 > jpeg->fp1)
|
||||
goto err;
|
||||
if (jpeg->fp[0] != 0xff)
|
||||
goto err0;
|
||||
c = jpeg->fp[1];
|
||||
jpeg->fp += 2;
|
||||
if (c == 0xd8)
|
||||
continue; /* SOI */
|
||||
if (c == 0xd9)
|
||||
goto err; /* EOI */
|
||||
|
||||
if (c == 0xc0)
|
||||
jpeg_sof(jpeg);
|
||||
else if (c == 0xc4)
|
||||
jpeg_dht(jpeg);
|
||||
else if (c == 0xdb)
|
||||
jpeg_dqt(jpeg);
|
||||
else if (c == 0xdd) {
|
||||
if (jpeg->fp + 4 > jpeg->fp1)
|
||||
goto err;
|
||||
jpeg->interval = jpeg->fp[2] << 8 | jpeg->fp[3];
|
||||
jpeg->fp += 4;
|
||||
} else if (c == 0xda) {
|
||||
if (jpeg->fp + 3 > jpeg->fp1)
|
||||
goto err;
|
||||
jpeg->scan_count = jpeg->fp[2];
|
||||
jpeg->fp += 3;
|
||||
if (jpeg->fp + jpeg->scan_count * 2 > jpeg->fp1)
|
||||
goto err;
|
||||
for (i = 0; i < jpeg->scan_count; i++) {
|
||||
jpeg->scan_id[i] = jpeg->fp[0];
|
||||
jpeg->scan_dc[i] = jpeg->fp[1] >> 4; // DC Huffman Table
|
||||
jpeg->scan_ac[i] = jpeg->fp[1] & 0x0F; // AC Huffman Table
|
||||
jpeg->fp += 2;
|
||||
}
|
||||
jpeg->fp += 3; /* 3bytes skip */
|
||||
goto fin;
|
||||
} else {
|
||||
if (jpeg->fp + 2 > jpeg->fp1)
|
||||
goto err;
|
||||
jpeg->fp += jpeg->fp[0] << 8 | jpeg->fp[1];
|
||||
}
|
||||
}
|
||||
err:
|
||||
jpeg->fp = jpeg->fp1;
|
||||
err0:
|
||||
r++;
|
||||
fin:
|
||||
return r;
|
||||
}
|
||||
|
||||
// MCU decode
|
||||
|
||||
void jpeg_decode_init(JPEG *jpeg)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < jpeg->scan_count; i++) {
|
||||
// i:scan
|
||||
for (j = 0; j < jpeg->compo_count; j++) {
|
||||
// j:frame
|
||||
if (jpeg->scan_id[i] == jpeg->compo_id[j]) {
|
||||
jpeg->scan_h[i] = jpeg->compo_h[j];
|
||||
jpeg->scan_v[i] = jpeg->compo_v[j];
|
||||
jpeg->scan_qt[i] = jpeg->compo_qt[j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
// if (j >= jpeg->compo_count)
|
||||
// return 1;
|
||||
}
|
||||
jpeg->mcu_width = jpeg->max_h * 8;
|
||||
jpeg->mcu_height = jpeg->max_v * 8;
|
||||
|
||||
for (i = 0; i < 32 * 32 * 4; i++)
|
||||
jpeg->mcu_buf[i] = 0x80;
|
||||
|
||||
for (i = 0; i < jpeg->scan_count; i++)
|
||||
jpeg->mcu_yuv[i] = jpeg->mcu_buf + (i << 10);
|
||||
return;
|
||||
}
|
||||
|
||||
int jpeg_huff_decode(JPEG *jpeg,int tc,int th)
|
||||
{
|
||||
HUFF *h = &(jpeg->huff[tc][th]);
|
||||
int code,size,k,v;
|
||||
code = 0;
|
||||
size = 0;
|
||||
k = 0;
|
||||
while( size < 16 ){
|
||||
size++;
|
||||
v = get_bits(jpeg,1);
|
||||
if(v < 0){
|
||||
return v;
|
||||
}
|
||||
code = (code << 1) | v;
|
||||
|
||||
while(h->size[k] == size){
|
||||
if(h->code[k] == code){
|
||||
return h->value[k];
|
||||
}
|
||||
k++;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void jpeg_idct_init(int base_img[64][64])
|
||||
{
|
||||
int u, v, m, n;
|
||||
int tmpm[8], tmpn[8];
|
||||
int cost[32];
|
||||
cost[ 0] = 32768; cost[ 1] = 32138; cost[ 2] = 30274; cost[ 3] = 27246; cost[ 4] = 23170; cost[ 5] = 18205; cost[ 6] = 12540; cost[ 7] = 6393;
|
||||
cost[ 8] = 0; cost[ 9] = -6393; cost[10] = -12540; cost[11] = -18205; cost[12] = -23170; cost[13] = -27246; cost[14] = -30274; cost[15] = -32138;
|
||||
for (u = 0; u < 16; u++)
|
||||
cost[u + 16] = - cost[u];
|
||||
|
||||
for (u = 0; u < 8; u++) {
|
||||
{
|
||||
int i=u, d=u*2;
|
||||
if (d == 0)
|
||||
i = 4;
|
||||
for (m = 0; m < 8; m++){
|
||||
tmpm[m] = cost[i];
|
||||
i=(i+d)&31;
|
||||
}
|
||||
}
|
||||
for (v = 0; v < 8; v++) {
|
||||
{
|
||||
int i=v,d=v*2;
|
||||
if (d == 0)
|
||||
i=4;
|
||||
for (n = 0; n < 8; n++){
|
||||
tmpn[n] = cost[i];
|
||||
i=(i+d)&31;
|
||||
}
|
||||
}
|
||||
|
||||
for (m = 0; m < 8; m++) {
|
||||
for (n = 0; n < 8; n++) {
|
||||
base_img[u * 8 + v][m * 8 + n] = (tmpm[m] * tmpn[n])>>15;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void jpeg_idct(int *block, int *dest, int base_img[64][64])
|
||||
{
|
||||
int i, j ,k;
|
||||
|
||||
for (i = 0; i < 64; i++)
|
||||
dest[i] = 0;
|
||||
|
||||
for (i = 0; i < 64; i++) {
|
||||
k = block[i];
|
||||
if(k) {
|
||||
for (j = 0; j < 64; j++) {
|
||||
dest[j] += k * base_img[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 64; i++)
|
||||
dest[i] >>= 17;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int jpeg_get_value(JPEG *jpeg,int size)
|
||||
{
|
||||
int val = 0;
|
||||
if (size) {
|
||||
val = get_bits(jpeg,size);
|
||||
if (val < 0)
|
||||
val = 0x10000 | (0 - val);
|
||||
else if (!(val & (1<<(size-1))))
|
||||
val -= (1 << size) - 1;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
int jpeg_decode_huff(JPEG *jpeg,int scan,int *block, UCHAR *zigzag_table)
|
||||
{
|
||||
int size, len, val, run, index;
|
||||
int *pQt = (int *)(jpeg->dqt[jpeg->scan_qt[scan]]);
|
||||
|
||||
// DC
|
||||
size = jpeg_huff_decode(jpeg,0,jpeg->scan_dc[scan]);
|
||||
if(size < 0)
|
||||
return 0;
|
||||
val = jpeg_get_value(jpeg,size);
|
||||
jpeg->mcu_preDC[scan] += val;
|
||||
block[0] = jpeg->mcu_preDC[scan] * pQt[0];
|
||||
|
||||
//AC
|
||||
index = 1;
|
||||
while(index<64)
|
||||
{
|
||||
size = jpeg_huff_decode(jpeg,1,jpeg->scan_ac[scan]);
|
||||
if(size < 0)
|
||||
break;
|
||||
// EOB
|
||||
if(size == 0)
|
||||
break;
|
||||
|
||||
// RLE
|
||||
run = (size>>4)&0xF;
|
||||
size = size & 0x0F;
|
||||
|
||||
val = jpeg_get_value(jpeg,size);
|
||||
if(val>=0x10000) {
|
||||
return val;
|
||||
}
|
||||
|
||||
// ZRL
|
||||
while (run-- > 0)
|
||||
block[ zigzag_table[index++] ] = 0;
|
||||
|
||||
block[ zigzag_table[index] ] = val * pQt[index];
|
||||
index++;
|
||||
}
|
||||
while(index<64)
|
||||
block[zigzag_table[index++]]=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void jpeg_mcu_bitblt(int *src, int *dest, int width,
|
||||
int x0, int y0, int x1, int y1)
|
||||
{
|
||||
int w, h;
|
||||
int x, y, x2, y2;
|
||||
w = x1 - x0;
|
||||
h = y1 - y0;
|
||||
dest += y0 * width + x0;
|
||||
width -= w;
|
||||
|
||||
for (y = 0; y < h; y++) {
|
||||
y2 = (y * 8 / h) * 8;
|
||||
for (x = 0; x < w; x++)
|
||||
*dest++ = src[y2 + (x * 8 / w)];
|
||||
dest += width;
|
||||
}
|
||||
}
|
||||
|
||||
int jpeg_decode_mcu(JPEG *jpeg, UCHAR *zigzag_table)
|
||||
{
|
||||
int scan, val;
|
||||
int unit, i, h, v;
|
||||
int *p, hh, vv;
|
||||
int block[64], dest[64];
|
||||
|
||||
// mcu_width x mcu_height
|
||||
for (scan = 0; scan < jpeg->scan_count; scan++) {
|
||||
hh = jpeg->scan_h[scan];
|
||||
vv = jpeg->scan_v[scan];
|
||||
for (v = 0; v < vv; v++) {
|
||||
for (h = 0; h < hh; h++) {
|
||||
// ƒuƒƒbƒN(8x8)‚̃fƒR[ƒh
|
||||
val = jpeg_decode_huff(jpeg, scan, block, zigzag_table);
|
||||
// if(val>=0x10000){
|
||||
// printf("marker found:%02x\n",val);
|
||||
// }
|
||||
|
||||
jpeg_idct(block, dest, jpeg->base_img);
|
||||
|
||||
p = jpeg->mcu_buf + (scan << 10);
|
||||
|
||||
jpeg_mcu_bitblt(dest, p, jpeg->mcu_width,
|
||||
jpeg->mcu_width * h / hh, jpeg->mcu_height * v / vv,
|
||||
jpeg->mcu_width * (h + 1) / hh, jpeg->mcu_height * (v + 1) / vv);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// YCrCb=>RGB
|
||||
|
||||
int jpeg_decode_yuv(JPEG *jpeg, int h, int v, unsigned char *rgb, int b_type)
|
||||
{
|
||||
int x0, y0, x, y, x1, y1;
|
||||
int *py;
|
||||
int Y12, V;
|
||||
int mw, mh, w;
|
||||
int i;
|
||||
|
||||
mw = jpeg->mcu_width;
|
||||
mh = jpeg->mcu_height;
|
||||
|
||||
x0 = h * jpeg->max_h * 8;
|
||||
y0 = v * jpeg->max_v * 8;
|
||||
|
||||
x1 = jpeg->width - x0;
|
||||
if (x1 > mw)
|
||||
x1 = mw;
|
||||
y1 = jpeg->height - y0;
|
||||
if (y1 > mh)
|
||||
y1 = mh;
|
||||
|
||||
py = jpeg->mcu_buf;
|
||||
rgb += (y0 * jpeg->width_buf + x0) * (b_type & 0x7f);
|
||||
w = (jpeg->width_buf - x1) * (b_type & 0x7f);
|
||||
|
||||
for (y = 0; y < y1; y++) {
|
||||
for (x = 0; x < x1; x++) {
|
||||
int b, g, r;
|
||||
Y12 = py[0] << 12;
|
||||
// U = py[1024]; /* pu */
|
||||
V = py[2048]; /* pv */
|
||||
|
||||
/* blue */
|
||||
b = 128 + ((Y12 - V * 4 + py[1024] /* pu */ * 0x1C59) >> 12);
|
||||
if (b & 0xffffff00)
|
||||
b = (~b) >> 24;
|
||||
|
||||
/* green */
|
||||
g = 128 + ((Y12 - V * 0x0B6C) >> 12);
|
||||
if (g & 0xffffff00)
|
||||
g = (~g) >> 24;
|
||||
|
||||
/* red */
|
||||
r = 128 + ((Y12 + V * 0x166E) >> 12);
|
||||
if (r & 0xffffff00)
|
||||
r = (~r) >> 24;
|
||||
if (b_type == 0x0004) {
|
||||
rgb[0] = b;
|
||||
rgb[1] = g;
|
||||
rgb[2] = r;
|
||||
py++;
|
||||
rgb += 4;
|
||||
} else if (b_type == 0x0002) {
|
||||
r &= 0xff;
|
||||
g &= 0xff;
|
||||
b &= 0xff;
|
||||
*(short *) rgb = PIXEL16(r >> 3, g >> 2, b >> 3);
|
||||
rgb += 2;
|
||||
}
|
||||
}
|
||||
py += mw - x1;
|
||||
rgb += w;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#define INIT_ZTABLE(i, b0, b1, b2, b3) *(int *) &zigzag_table[i] = b0 | b1 << 8 | b2 << 16 | b3 << 24
|
||||
|
||||
void jpeg_decode(JPEG *jpeg, UCHAR *rgb, int b_type)
|
||||
{
|
||||
int h_unit, v_unit;
|
||||
int mcu_count, h, v;
|
||||
int val;
|
||||
unsigned char m;
|
||||
|
||||
UCHAR zigzag_table[64];
|
||||
|
||||
INIT_ZTABLE( 0, 0, 1, 8, 16); INIT_ZTABLE( 4, 9, 2, 3, 10);
|
||||
INIT_ZTABLE( 8, 17, 24, 32, 25); INIT_ZTABLE(12, 18, 11, 4, 5);
|
||||
INIT_ZTABLE(16, 12, 19, 26, 33); INIT_ZTABLE(20, 40, 48, 41, 34);
|
||||
INIT_ZTABLE(24, 27, 20, 13, 6); INIT_ZTABLE(28, 7, 14, 21, 28);
|
||||
INIT_ZTABLE(32, 35, 42, 49, 56); INIT_ZTABLE(36, 57, 50, 43, 36);
|
||||
INIT_ZTABLE(40, 29, 22, 15, 23); INIT_ZTABLE(44, 30, 37, 44, 51);
|
||||
INIT_ZTABLE(48, 58, 59, 52, 45); INIT_ZTABLE(52, 38, 31, 39, 46);
|
||||
INIT_ZTABLE(56, 53, 60, 61, 54); INIT_ZTABLE(60, 47, 55, 62, 63);
|
||||
|
||||
jpeg_decode_init(jpeg);
|
||||
|
||||
h_unit = (jpeg->width + jpeg->mcu_width - 1) / jpeg->mcu_width;
|
||||
v_unit = (jpeg->height + jpeg->mcu_height - 1) / jpeg->mcu_height;
|
||||
|
||||
mcu_count = 0;
|
||||
for (v = 0; v < v_unit; v++) {
|
||||
for (h = 0; h < h_unit; h++) {
|
||||
mcu_count++;
|
||||
jpeg_decode_mcu(jpeg, zigzag_table);
|
||||
jpeg_decode_yuv(jpeg, h, v, rgb, b_type & 0x7fff);
|
||||
if (jpeg->interval > 0 && mcu_count >= jpeg->interval) {
|
||||
jpeg->bit_remain -= (jpeg->bit_remain & 7);
|
||||
jpeg->bit_remain -= 8;
|
||||
jpeg->mcu_preDC[0] = 0;
|
||||
jpeg->mcu_preDC[1] = 0;
|
||||
jpeg->mcu_preDC[2] = 0;
|
||||
mcu_count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
1
30_day/gview/make.bat
Normal file
1
30_day/gview/make.bat
Normal file
@@ -0,0 +1 @@
|
||||
..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
10
30_day/haribote.rul
Normal file
10
30_day/haribote.rul
Normal file
@@ -0,0 +1,10 @@
|
||||
format:
|
||||
code(align:1, logic:0x24, file:0x24);
|
||||
data(align:4, logic:stack_end, file:code_end);
|
||||
|
||||
file:
|
||||
../../z_tools/haribote/harilibc.lib;
|
||||
../../z_tools/haribote/golibc.lib;
|
||||
|
||||
label:
|
||||
_HariStartup;
|
||||
1
30_day/haribote/!cons_9x.bat
Normal file
1
30_day/haribote/!cons_9x.bat
Normal file
@@ -0,0 +1 @@
|
||||
command
|
||||
1
30_day/haribote/!cons_nt.bat
Normal file
1
30_day/haribote/!cons_nt.bat
Normal file
@@ -0,0 +1 @@
|
||||
cmd.exe
|
||||
79
30_day/haribote/Makefile
Normal file
79
30_day/haribote/Makefile
Normal file
@@ -0,0 +1,79 @@
|
||||
OBJS_BOOTPACK = bootpack.obj naskfunc.obj hankaku.obj graphic.obj dsctbl.obj \
|
||||
int.obj fifo.obj keyboard.obj mouse.obj memory.obj sheet.obj timer.obj \
|
||||
mtask.obj window.obj console.obj file.obj tek.obj
|
||||
|
||||
TOOLPATH = ../../z_tools/
|
||||
INCPATH = ../../z_tools/haribote/
|
||||
|
||||
MAKE = $(TOOLPATH)make.exe -r
|
||||
NASK = $(TOOLPATH)nask.exe
|
||||
CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet
|
||||
GAS2NASK = $(TOOLPATH)gas2nask.exe -a
|
||||
OBJ2BIM = $(TOOLPATH)obj2bim.exe
|
||||
MAKEFONT = $(TOOLPATH)makefont.exe
|
||||
BIN2OBJ = $(TOOLPATH)bin2obj.exe
|
||||
BIM2HRB = $(TOOLPATH)bim2hrb.exe
|
||||
RULEFILE = ../haribote.rul
|
||||
EDIMG = $(TOOLPATH)edimg.exe
|
||||
IMGTOL = $(TOOLPATH)imgtol.com
|
||||
GOLIB = $(TOOLPATH)golib00.exe
|
||||
COPY = copy
|
||||
DEL = del
|
||||
|
||||
#默认动作
|
||||
|
||||
default :
|
||||
$(MAKE) ipl10.bin
|
||||
$(MAKE) haribote.sys
|
||||
|
||||
# 镜像文件生成
|
||||
|
||||
ipl10.bin : ipl10.nas Makefile
|
||||
$(NASK) ipl10.nas ipl10.bin ipl10.lst
|
||||
|
||||
asmhead.bin : asmhead.nas Makefile
|
||||
$(NASK) asmhead.nas asmhead.bin asmhead.lst
|
||||
|
||||
hankaku.bin : hankaku.txt Makefile
|
||||
$(MAKEFONT) hankaku.txt hankaku.bin
|
||||
|
||||
hankaku.obj : hankaku.bin Makefile
|
||||
$(BIN2OBJ) hankaku.bin hankaku.obj _hankaku
|
||||
|
||||
bootpack.bim : $(OBJS_BOOTPACK) Makefile
|
||||
$(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \
|
||||
$(OBJS_BOOTPACK)
|
||||
# 3MB+64KB=3136KB
|
||||
|
||||
bootpack.hrb : bootpack.bim Makefile
|
||||
$(BIM2HRB) bootpack.bim bootpack.hrb 0
|
||||
|
||||
haribote.sys : asmhead.bin bootpack.hrb Makefile
|
||||
copy /B asmhead.bin+bootpack.hrb haribote.sys
|
||||
|
||||
# 其他指令
|
||||
|
||||
%.gas : %.c bootpack.h Makefile
|
||||
$(CC1) -o $*.gas $*.c
|
||||
|
||||
%.nas : %.gas Makefile
|
||||
$(GAS2NASK) $*.gas $*.nas
|
||||
|
||||
%.obj : %.nas Makefile
|
||||
$(NASK) $*.nas $*.obj $*.lst
|
||||
|
||||
# 运行程序
|
||||
|
||||
clean :
|
||||
-$(DEL) asmhead.bin
|
||||
-$(DEL) hankaku.bin
|
||||
-$(DEL) *.lst
|
||||
-$(DEL) *.obj
|
||||
-$(DEL) *.map
|
||||
-$(DEL) *.bim
|
||||
-$(DEL) *.hrb
|
||||
|
||||
src_only :
|
||||
$(MAKE) clean
|
||||
-$(DEL) ipl10.bin
|
||||
-$(DEL) haribote.sys
|
||||
202
30_day/haribote/asmhead.nas
Normal file
202
30_day/haribote/asmhead.nas
Normal file
@@ -0,0 +1,202 @@
|
||||
; haribote-os boot asm
|
||||
; TAB=4
|
||||
|
||||
[INSTRSET "i486p"]
|
||||
|
||||
VBEMODE EQU 0x105 ; 1024 x 768 x 8bit 彩色
|
||||
; 显示模式
|
||||
; 0x100 : 640 x 400 x 8bit 彩色
|
||||
; 0x101 : 640 x 480 x 8bit 彩色
|
||||
; 0x103 : 800 x 600 x 8bit 彩色
|
||||
; 0x105 : 1024 x 768 x 8bit 彩色
|
||||
; 0x107 : 1280 x 1024 x 8bit 彩色
|
||||
|
||||
BOTPAK EQU 0x00280000 ; 加载bootpack
|
||||
DSKCAC EQU 0x00100000 ; 磁盘缓存的位置
|
||||
DSKCAC0 EQU 0x00008000 ; 磁盘缓存的位置(实模式)
|
||||
|
||||
; BOOT_INFO 相关
|
||||
CYLS EQU 0x0ff0 ; 引导扇区设置
|
||||
LEDS EQU 0x0ff1
|
||||
VMODE EQU 0x0ff2 ; 关于颜色的信息
|
||||
SCRNX EQU 0x0ff4 ; 分辨率X
|
||||
SCRNY EQU 0x0ff6 ; 分辨率Y
|
||||
VRAM EQU 0x0ff8 ; 图像缓冲区的起始地址
|
||||
|
||||
ORG 0xc200 ; 这个的程序要被装载的内存地址
|
||||
|
||||
; 确认VBE是否存在
|
||||
|
||||
MOV AX,0x9000
|
||||
MOV ES,AX
|
||||
MOV DI,0
|
||||
MOV AX,0x4f00
|
||||
INT 0x10
|
||||
CMP AX,0x004f
|
||||
JNE scrn320
|
||||
|
||||
; 检查VBE的版本
|
||||
|
||||
MOV AX,[ES:DI+4]
|
||||
CMP AX,0x0200
|
||||
JB scrn320 ; if (AX < 0x0200) goto scrn320
|
||||
|
||||
; 取得画面模式信息
|
||||
|
||||
MOV CX,VBEMODE
|
||||
MOV AX,0x4f01
|
||||
INT 0x10
|
||||
CMP AX,0x004f
|
||||
JNE scrn320
|
||||
|
||||
; 画面模式信息的确认
|
||||
CMP BYTE [ES:DI+0x19],8 ;颜色数必须为8
|
||||
JNE scrn320
|
||||
CMP BYTE [ES:DI+0x1b],4 ;颜色的指定方法必须为4(4是调色板模式)
|
||||
JNE scrn320
|
||||
MOV AX,[ES:DI+0x00] ;模式属性bit7不是1就不能加上0x4000
|
||||
AND AX,0x0080
|
||||
JZ scrn320 ; 模式属性的bit7是0,所以放弃
|
||||
|
||||
; 画面设置
|
||||
|
||||
MOV BX,VBEMODE+0x4000
|
||||
MOV AX,0x4f02
|
||||
INT 0x10
|
||||
MOV BYTE [VMODE],8 ; 屏幕的模式(参考C语言的引用)
|
||||
MOV AX,[ES:DI+0x12]
|
||||
MOV [SCRNX],AX
|
||||
MOV AX,[ES:DI+0x14]
|
||||
MOV [SCRNY],AX
|
||||
MOV EAX,[ES:DI+0x28] ;VRAM的地址
|
||||
MOV [VRAM],EAX
|
||||
JMP keystatus
|
||||
|
||||
scrn320:
|
||||
MOV AL,0x13 ; VGA图、320x200x8bit彩色
|
||||
MOV AH,0x00
|
||||
INT 0x10
|
||||
MOV BYTE [VMODE],8 ; 记下画面模式(参考C语言)
|
||||
MOV WORD [SCRNX],320
|
||||
MOV WORD [SCRNY],200
|
||||
MOV DWORD [VRAM],0x000a0000
|
||||
|
||||
; 通过 BIOS 获取指示灯状态
|
||||
|
||||
keystatus:
|
||||
MOV AH,0x02
|
||||
INT 0x16 ; keyboard BIOS
|
||||
MOV [LEDS],AL
|
||||
|
||||
; PIC关闭一切中断
|
||||
; 根据AT兼容机的规格,如果要初始化PIC,
|
||||
; 必须在CLI之前进行,否则有时会挂起。
|
||||
; 随后进行PIC的初始化。
|
||||
|
||||
MOV AL,0xff
|
||||
OUT 0x21,AL
|
||||
NOP ; 如果连续执行OUT指令,有些机种会无法正常运行
|
||||
OUT 0xa1,AL
|
||||
|
||||
CLI ; 禁止CPU级别的中断
|
||||
|
||||
; 为了让CPU能够访问1MB以上的内存空间,设定A20GATE
|
||||
|
||||
CALL waitkbdout
|
||||
MOV AL,0xd1
|
||||
OUT 0x64,AL
|
||||
CALL waitkbdout
|
||||
MOV AL,0xdf ; enable A20
|
||||
OUT 0x60,AL
|
||||
CALL waitkbdout
|
||||
|
||||
; 切换到保护模式
|
||||
|
||||
[INSTRSET "i486p"] ; 说明使用486指令
|
||||
|
||||
LGDT [GDTR0] ; 设置临时GDT
|
||||
MOV EAX,CR0
|
||||
AND EAX,0x7fffffff ; 设bit31为0(禁用分页)
|
||||
OR EAX,0x00000001 ; bit0到1转换(保护模式过渡)
|
||||
MOV CR0,EAX
|
||||
JMP pipelineflush
|
||||
pipelineflush:
|
||||
MOV AX,1*8 ; 可读写的段 32bit
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV FS,AX
|
||||
MOV GS,AX
|
||||
MOV SS,AX
|
||||
|
||||
; bootpack传递
|
||||
|
||||
MOV ESI,bootpack ; 转送源
|
||||
MOV EDI,BOTPAK ; 转送目标
|
||||
MOV ECX,512*1024/4
|
||||
CALL memcpy
|
||||
|
||||
; 磁盘数据最终转送到它本来的位置去
|
||||
; 首先从启动扇区开始
|
||||
|
||||
MOV ESI,0x7c00 ; 转送源
|
||||
MOV EDI,DSKCAC ; 转送目标
|
||||
MOV ECX,512/4
|
||||
CALL memcpy
|
||||
|
||||
; 剩余的全部
|
||||
|
||||
MOV ESI,DSKCAC0+512 ; 转送源
|
||||
MOV EDI,DSKCAC+512 ; 转送源目标
|
||||
MOV ECX,0
|
||||
MOV CL,BYTE [CYLS]
|
||||
IMUL ECX,512*18*2/4 ; 从柱面数变换为字节数/4
|
||||
SUB ECX,512/4 ; 减去 IPL 偏移量
|
||||
CALL memcpy
|
||||
|
||||
; 必须由asmhead来完成的工作,至此全部完毕
|
||||
; 以后就交由bootpack来完成
|
||||
|
||||
; bootpack启动
|
||||
|
||||
MOV EBX,BOTPAK
|
||||
MOV ECX,[EBX+16]
|
||||
ADD ECX,3 ; ECX += 3;
|
||||
SHR ECX,2 ; ECX /= 4;
|
||||
JZ skip ; 没有要转送的东西时
|
||||
MOV ESI,[EBX+20] ; 转送源
|
||||
ADD ESI,EBX
|
||||
MOV EDI,[EBX+12] ; 转送目标
|
||||
CALL memcpy
|
||||
skip:
|
||||
MOV ESP,[EBX+12] ; 堆栈的初始化
|
||||
JMP DWORD 2*8:0x0000001b
|
||||
|
||||
waitkbdout:
|
||||
IN AL,0x64
|
||||
AND AL,0x02
|
||||
JNZ waitkbdout ; AND的结果如果不是0,就跳到waitkbdout
|
||||
RET
|
||||
|
||||
memcpy:
|
||||
MOV EAX,[ESI]
|
||||
ADD ESI,4
|
||||
MOV [EDI],EAX
|
||||
ADD EDI,4
|
||||
SUB ECX,1
|
||||
JNZ memcpy ; 减法运算的结果如果不是0,就跳转到memcpy
|
||||
RET
|
||||
; memcpy地址前缀大小
|
||||
|
||||
ALIGNB 16
|
||||
GDT0:
|
||||
RESB 8 ; 初始值
|
||||
DW 0xffff,0x0000,0x9200,0x00cf ; 可以读写的段(segment)32bit
|
||||
DW 0xffff,0x0000,0x9a28,0x0047 ; 可执行的文件的32bit寄存器(bootpack用)
|
||||
|
||||
DW 0
|
||||
GDTR0:
|
||||
DW 8*3-1
|
||||
DD GDT0
|
||||
|
||||
ALIGNB 16
|
||||
bootpack:
|
||||
412
30_day/haribote/bootpack.c
Normal file
412
30_day/haribote/bootpack.c
Normal file
@@ -0,0 +1,412 @@
|
||||
/* bootpack */
|
||||
|
||||
#include "bootpack.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#define KEYCMD_LED 0xed
|
||||
|
||||
void keywin_off(struct SHEET *key_win);
|
||||
void keywin_on(struct SHEET *key_win);
|
||||
void close_console(struct SHEET *sht);
|
||||
void close_constask(struct TASK *task);
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO;
|
||||
struct SHTCTL *shtctl;
|
||||
char s[40];
|
||||
struct FIFO32 fifo, keycmd;
|
||||
int fifobuf[128], keycmd_buf[32];
|
||||
int mx, my, i, new_mx = -1, new_my = 0, new_wx = 0x7fffffff, new_wy = 0;
|
||||
unsigned int memtotal;
|
||||
struct MOUSE_DEC mdec;
|
||||
struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
|
||||
unsigned char *buf_back, buf_mouse[256];
|
||||
struct SHEET *sht_back, *sht_mouse;
|
||||
struct TASK *task_a, *task;
|
||||
static char keytable0[0x80] = {
|
||||
0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0x08, 0,
|
||||
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0x0a, 0, 'A', 'S',
|
||||
'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V',
|
||||
'B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1',
|
||||
'2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0x5c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0
|
||||
};
|
||||
static char keytable1[0x80] = {
|
||||
0, 0, '!', 0x22, '#', '$', '%', '&', 0x27, '(', ')', '~', '=', '~', 0x08, 0,
|
||||
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', 0x0a, 0, 'A', 'S',
|
||||
'D', 'F', 'G', 'H', 'J', 'K', 'L', '+', '*', 0, 0, '}', 'Z', 'X', 'C', 'V',
|
||||
'B', 'N', 'M', '<', '>', '?', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1',
|
||||
'2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, '_', 0, 0, 0, 0, 0, 0, 0, 0, 0, '|', 0, 0
|
||||
};
|
||||
int key_shift = 0, key_leds = (binfo->leds >> 4) & 7, keycmd_wait = -1;
|
||||
int j, x, y, mmx = -1, mmy = -1, mmx2 = 0;
|
||||
struct SHEET *sht = 0, *key_win, *sht2;
|
||||
int *fat;
|
||||
unsigned char *nihongo;
|
||||
struct FILEINFO *finfo;
|
||||
extern char hankaku[4096];
|
||||
|
||||
init_gdtidt();
|
||||
init_pic();
|
||||
io_sti(); /* IDT/PIC的初始化已经完成,于是开放CPU的中断 */
|
||||
fifo32_init(&fifo, 128, fifobuf, 0);
|
||||
*((int *) 0x0fec) = (int) &fifo;
|
||||
init_pit();
|
||||
init_keyboard(&fifo, 256);
|
||||
enable_mouse(&fifo, 512, &mdec);
|
||||
io_out8(PIC0_IMR, 0xf8); /* 设定PIT和PIC1以及键盘为许可(11111000) */
|
||||
io_out8(PIC1_IMR, 0xef); /* 开放鼠标中断(11101111) */
|
||||
fifo32_init(&keycmd, 32, keycmd_buf, 0);
|
||||
|
||||
memtotal = memtest(0x00400000, 0xbfffffff);
|
||||
memman_init(memman);
|
||||
memman_free(memman, 0x00001000, 0x0009e000); /* 0x00001000 - 0x0009efff */
|
||||
memman_free(memman, 0x00400000, memtotal - 0x00400000);
|
||||
|
||||
init_palette();
|
||||
shtctl = shtctl_init(memman, binfo->vram, binfo->scrnx, binfo->scrny);
|
||||
task_a = task_init(memman);
|
||||
fifo.task = task_a;
|
||||
task_run(task_a, 1, 2);
|
||||
*((int *) 0x0fe4) = (int) shtctl;
|
||||
task_a->langmode = 0;
|
||||
|
||||
/* sht_back */
|
||||
sht_back = sheet_alloc(shtctl);
|
||||
buf_back = (unsigned char *) memman_alloc_4k(memman, binfo->scrnx * binfo->scrny);
|
||||
sheet_setbuf(sht_back, buf_back, binfo->scrnx, binfo->scrny, -1); /* 无透明色 */
|
||||
init_screen8(buf_back, binfo->scrnx, binfo->scrny);
|
||||
|
||||
/* sht_cons */
|
||||
key_win = open_console(shtctl, memtotal);
|
||||
|
||||
/* sht_mouse */
|
||||
sht_mouse = sheet_alloc(shtctl);
|
||||
sheet_setbuf(sht_mouse, buf_mouse, 16, 16, 99);
|
||||
init_mouse_cursor8(buf_mouse, 99);
|
||||
mx = (binfo->scrnx - 16) / 2; /* 计算坐标使其位于画面中央 */
|
||||
my = (binfo->scrny - 28 - 16) / 2;
|
||||
|
||||
sheet_slide(sht_back, 0, 0);
|
||||
sheet_slide(key_win, 32, 4);
|
||||
sheet_slide(sht_mouse, mx, my);
|
||||
sheet_updown(sht_back, 0);
|
||||
sheet_updown(key_win, 1);
|
||||
sheet_updown(sht_mouse, 2);
|
||||
keywin_on(key_win);
|
||||
|
||||
/* 为了避免和键盘当前状态冲突,在一开始先进行设置 */
|
||||
fifo32_put(&keycmd, KEYCMD_LED);
|
||||
fifo32_put(&keycmd, key_leds);
|
||||
|
||||
/* 载入nihongo.fnt */
|
||||
fat = (int *) memman_alloc_4k(memman, 4 * 2880);
|
||||
file_readfat(fat, (unsigned char *) (ADR_DISKIMG + 0x000200));
|
||||
|
||||
finfo = file_search("nihongo.fnt", (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
|
||||
if (finfo != 0) {
|
||||
i = finfo->size;
|
||||
nihongo = file_loadfile2(finfo->clustno, &i, fat);
|
||||
} else {
|
||||
nihongo = (unsigned char *) memman_alloc_4k(memman, 16 * 256 + 32 * 94 * 47);
|
||||
for (i = 0; i < 16 * 256; i++) {
|
||||
nihongo[i] = hankaku[i]; /*没有字库,半角部分直接复制英文字库*/
|
||||
}
|
||||
for (i = 16 * 256; i < 16 * 256 + 32 * 94 * 47; i++) {
|
||||
nihongo[i] = 0xff; /* 没有字库,全角部分以0xff填充 */
|
||||
}
|
||||
}
|
||||
*((int *) 0x0fe8) = (int) nihongo;
|
||||
memman_free_4k(memman, (int) fat, 4 * 2880);
|
||||
|
||||
for (;;) {
|
||||
if (fifo32_status(&keycmd) > 0 && keycmd_wait < 0) {
|
||||
/* 如果存在向键盘控制器发送的数据,则发送它 */
|
||||
keycmd_wait = fifo32_get(&keycmd);
|
||||
wait_KBC_sendready();
|
||||
io_out8(PORT_KEYDAT, keycmd_wait);
|
||||
}
|
||||
io_cli();
|
||||
if (fifo32_status(&fifo) == 0) {
|
||||
/* FIFO为空,当存在搁置的绘图操作时立即执行*/
|
||||
if (new_mx >= 0) {
|
||||
io_sti();
|
||||
sheet_slide(sht_mouse, new_mx, new_my);
|
||||
new_mx = -1;
|
||||
} else if (new_wx != 0x7fffffff) {
|
||||
io_sti();
|
||||
sheet_slide(sht, new_wx, new_wy);
|
||||
new_wx = 0x7fffffff;
|
||||
} else {
|
||||
task_sleep(task_a);
|
||||
io_sti();
|
||||
}
|
||||
} else {
|
||||
i = fifo32_get(&fifo);
|
||||
io_sti();
|
||||
if (key_win != 0 && key_win->flags == 0) { /*窗口被关闭*/
|
||||
if (shtctl->top == 1) { /*当画面上只剩鼠标和背景时*/
|
||||
key_win = 0;
|
||||
} else {
|
||||
key_win = shtctl->sheets[shtctl->top - 1];
|
||||
keywin_on(key_win);
|
||||
}
|
||||
}
|
||||
if (256 <= i && i <= 511) { /* 键盘数据*/
|
||||
if (i < 0x80 + 256) { /*将按键编码转换为字符编码*/
|
||||
if (key_shift == 0) {
|
||||
s[0] = keytable0[i - 256];
|
||||
} else {
|
||||
s[0] = keytable1[i - 256];
|
||||
}
|
||||
} else {
|
||||
s[0] = 0;
|
||||
}
|
||||
if ('A' <= s[0] && s[0] <= 'Z') { /*当输入字符为英文字母时*/
|
||||
if (((key_leds & 4) == 0 && key_shift == 0) ||
|
||||
((key_leds & 4) != 0 && key_shift != 0)) {
|
||||
s[0] += 0x20; /*将大写字母转换为小写字母*/
|
||||
}
|
||||
}
|
||||
if (s[0] != 0 && key_win != 0) { /*一般字符、退格键、回车键*/
|
||||
fifo32_put(&key_win->task->fifo, s[0] + 256);
|
||||
}
|
||||
if (i == 256 + 0x0f && key_win != 0) { /* Tab键 */
|
||||
keywin_off(key_win);
|
||||
j = key_win->height - 1;
|
||||
if (j == 0) {
|
||||
j = shtctl->top - 1;
|
||||
}
|
||||
key_win = shtctl->sheets[j];
|
||||
keywin_on(key_win);
|
||||
}
|
||||
if (i == 256 + 0x2a) { /*左Shift ON */
|
||||
key_shift |= 1;
|
||||
}
|
||||
if (i == 256 + 0x36) { /*右Shift ON */
|
||||
key_shift |= 2;
|
||||
}
|
||||
if (i == 256 + 0xaa) { /*左Shift OFF */
|
||||
key_shift &= ~1;
|
||||
}
|
||||
if (i == 256 + 0xb6) { /*右Shift OFF */
|
||||
key_shift &= ~2;
|
||||
}
|
||||
if (i == 256 + 0x3a) { /* CapsLock */
|
||||
key_leds ^= 4;
|
||||
fifo32_put(&keycmd, KEYCMD_LED);
|
||||
fifo32_put(&keycmd, key_leds);
|
||||
}
|
||||
if (i == 256 + 0x45) { /* NumLock */
|
||||
key_leds ^= 2;
|
||||
fifo32_put(&keycmd, KEYCMD_LED);
|
||||
fifo32_put(&keycmd, key_leds);
|
||||
}
|
||||
if (i == 256 + 0x46) { /* ScrollLock */
|
||||
key_leds ^= 1;
|
||||
fifo32_put(&keycmd, KEYCMD_LED);
|
||||
fifo32_put(&keycmd, key_leds);
|
||||
}
|
||||
if (i == 256 + 0x3b && key_shift != 0 && key_win != 0) { /* Shift+F1 */
|
||||
task = key_win->task;
|
||||
if (task != 0 && task->tss.ss0 != 0) {
|
||||
cons_putstr0(task->cons, "\nBreak(key) :\n");
|
||||
io_cli(); /*强制结束处理时禁止任务切换*/
|
||||
task->tss.eax = (int) &(task->tss.esp0);
|
||||
task->tss.eip = (int) asm_end_app;
|
||||
io_sti();
|
||||
task_run(task, -1, 0); /*为了确实执行结束处理,如果处于休眠状态则唤醒*/
|
||||
}
|
||||
}
|
||||
if (i == 256 + 0x3c && key_shift != 0) { /* Shift+F2 */
|
||||
if (key_win != 0) {
|
||||
keywin_off(key_win);
|
||||
}
|
||||
key_win = open_console(shtctl, memtotal);
|
||||
sheet_slide(key_win, 32, 4);
|
||||
sheet_updown(key_win, shtctl->top);
|
||||
keywin_on(key_win);
|
||||
}
|
||||
if (i == 256 + 0x57) { /* F11 */
|
||||
sheet_updown(shtctl->sheets[1], shtctl->top - 1);
|
||||
}
|
||||
if (i == 256 + 0xfa) { /*键盘成功接收到数据*/
|
||||
keycmd_wait = -1;
|
||||
}
|
||||
if (i == 256 + 0xfe) { /*键盘没有成功接收到数据*/
|
||||
wait_KBC_sendready();
|
||||
io_out8(PORT_KEYDAT, keycmd_wait);
|
||||
}
|
||||
} else if (512 <= i && i <= 767) { /* 鼠标数据*/
|
||||
if (mouse_decode(&mdec, i - 512) != 0) {
|
||||
/* 已经收集了3字节的数据,移动光标 */
|
||||
mx += mdec.x;
|
||||
my += mdec.y;
|
||||
if (mx < 0) {
|
||||
mx = 0;
|
||||
}
|
||||
if (my < 0) {
|
||||
my = 0;
|
||||
}
|
||||
if (mx > binfo->scrnx - 1) {
|
||||
mx = binfo->scrnx - 1;
|
||||
}
|
||||
if (my > binfo->scrny - 1) {
|
||||
my = binfo->scrny - 1;
|
||||
}
|
||||
new_mx = mx;
|
||||
new_my = my;
|
||||
if ((mdec.btn & 0x01) != 0) { /* 按下左键 */
|
||||
if (mmx < 0) {
|
||||
/*如果处于通常模式*/
|
||||
/*按照从上到下的顺序寻找鼠标所指向的图层*/
|
||||
for (j = shtctl->top - 1; j > 0; j--) {
|
||||
sht = shtctl->sheets[j];
|
||||
x = mx - sht->vx0;
|
||||
y = my - sht->vy0;
|
||||
if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) {
|
||||
if (sht->buf[y * sht->bxsize + x] != sht->col_inv) {
|
||||
sheet_updown(sht, shtctl->top - 1);
|
||||
if (sht != key_win) {
|
||||
keywin_off(key_win);
|
||||
key_win = sht;
|
||||
keywin_on(key_win);
|
||||
}
|
||||
if (3 <= x && x < sht->bxsize - 3 && 3 <= y && y < 21) {
|
||||
mmx = mx; /*进入窗口移动模式*/
|
||||
mmy = my;
|
||||
mmx2 = sht->vx0;
|
||||
new_wy = sht->vy0;
|
||||
}
|
||||
if (sht->bxsize - 21 <= x && x < sht->bxsize - 5 && 5 <= y && y < 19) {
|
||||
/*点击“×”按钮*/
|
||||
if ((sht->flags & 0x10) != 0) { /*该窗口是否为应用程序窗口?*/
|
||||
task = sht->task;
|
||||
cons_putstr0(task->cons, "\nBreak(mouse) :\n");
|
||||
io_cli(); /*强制结束处理时禁止任务切换*/
|
||||
task->tss.eax = (int) &(task->tss.esp0);
|
||||
task->tss.eip = (int) asm_end_app;
|
||||
io_sti();
|
||||
task_run(task, -1, 0);
|
||||
} else { /*命令行窗口*/
|
||||
task = sht->task;
|
||||
sheet_updown(sht, -1); /*暂且隐藏该图层*/
|
||||
keywin_off(key_win);
|
||||
key_win = shtctl->sheets[shtctl->top - 1];
|
||||
keywin_on(key_win);
|
||||
io_cli();
|
||||
fifo32_put(&task->fifo, 4);
|
||||
io_sti();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/*如果处于窗口移动模式*/
|
||||
x = mx - mmx; /*计算鼠标指针移动量*/
|
||||
y = my - mmy;
|
||||
new_wx = (mmx2 + x + 2) & ~3;
|
||||
new_wy = new_wy + y;
|
||||
mmy = my;
|
||||
}
|
||||
} else {
|
||||
/*没有按下左键*/
|
||||
mmx = -1; /*切换到一般模式*/
|
||||
if (new_wx != 0x7fffffff) {
|
||||
sheet_slide(sht, new_wx, new_wy); /*固定图层位置*/
|
||||
new_wx = 0x7fffffff;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (768 <= i && i <= 1023) { /*命令行窗口关闭处理*/
|
||||
close_console(shtctl->sheets0 + (i - 768));
|
||||
} else if (1024 <= i && i <= 2023) {
|
||||
close_constask(taskctl->tasks0 + (i - 1024));
|
||||
} else if (2024 <= i && i <= 2279) { /*只关闭命令行窗口*/
|
||||
sht2 = shtctl->sheets0 + (i - 2024);
|
||||
memman_free_4k(memman, (int) sht2->buf, 256 * 165);
|
||||
sheet_free(sht2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void keywin_off(struct SHEET *key_win)
|
||||
{
|
||||
change_wtitle8(key_win, 0);
|
||||
if ((key_win->flags & 0x20) != 0) {
|
||||
fifo32_put(&key_win->task->fifo, 3); /*命令行窗口光标OFF */
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void keywin_on(struct SHEET *key_win)
|
||||
{
|
||||
change_wtitle8(key_win, 1);
|
||||
if ((key_win->flags & 0x20) != 0) {
|
||||
fifo32_put(&key_win->task->fifo, 2); /*命令行窗口光标ON */
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
struct TASK *open_constask(struct SHEET *sht, unsigned int memtotal)
|
||||
{
|
||||
struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
|
||||
struct TASK *task = task_alloc();
|
||||
int *cons_fifo = (int *) memman_alloc_4k(memman, 128 * 4);
|
||||
task->cons_stack = memman_alloc_4k(memman, 64 * 1024);
|
||||
task->tss.esp = task->cons_stack + 64 * 1024 - 12;
|
||||
task->tss.eip = (int) &console_task;
|
||||
task->tss.es = 1 * 8;
|
||||
task->tss.cs = 2 * 8;
|
||||
task->tss.ss = 1 * 8;
|
||||
task->tss.ds = 1 * 8;
|
||||
task->tss.fs = 1 * 8;
|
||||
task->tss.gs = 1 * 8;
|
||||
*((int *) (task->tss.esp + 4)) = (int) sht;
|
||||
*((int *) (task->tss.esp + 8)) = memtotal;
|
||||
task_run(task, 2, 2); /* level=2, priority=2 */
|
||||
fifo32_init(&task->fifo, 128, cons_fifo, task);
|
||||
return task;
|
||||
}
|
||||
|
||||
struct SHEET *open_console(struct SHTCTL *shtctl, unsigned int memtotal)
|
||||
{
|
||||
struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
|
||||
struct SHEET *sht = sheet_alloc(shtctl);
|
||||
unsigned char *buf = (unsigned char *) memman_alloc_4k(memman, 256 * 165);
|
||||
sheet_setbuf(sht, buf, 256, 165, -1); /*无透明色*/
|
||||
make_window8(buf, 256, 165, "console", 0);
|
||||
make_textbox8(sht, 8, 28, 240, 128, COL8_000000);
|
||||
sht->task = open_constask(sht, memtotal);
|
||||
sht->flags |= 0x20; /*有光标*/
|
||||
return sht;
|
||||
}
|
||||
|
||||
void close_constask(struct TASK *task)
|
||||
{
|
||||
struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
|
||||
task_sleep(task);
|
||||
memman_free_4k(memman, task->cons_stack, 64 * 1024);
|
||||
memman_free_4k(memman, (int) task->fifo.buf, 128 * 4);
|
||||
task->flags = 0; /*用来替代task_free(task); */
|
||||
return;
|
||||
}
|
||||
|
||||
void close_console(struct SHEET *sht)
|
||||
{
|
||||
struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
|
||||
struct TASK *task = sht->task;
|
||||
memman_free_4k(memman, (int) sht->buf, 256 * 165);
|
||||
sheet_free(sht);
|
||||
close_constask(task);
|
||||
return;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user