「30日でできる! OS自作入門」正誤表
初版・第1刷〜初版・第9刷
p.127(本文)
誤:PICというのは「programable interrupt controller」の略で、
正:PICというのは「programmable interrupt controller」の略で、
p.176(本文)
誤:しかしCPUの速さについてこれられるような高速なメモリは、
正:しかしCPUの速さについてこられるような高速なメモリは、
p.401(リスト内)
誤:if (fifo->name[0] == 0x00) {
正:if (fifo[i].name[0] == 0x00) {
p.495(リスト内)
誤:/* ココから */ if (i == 256 + 0x57) { /* F11 */
正:/* ココから */ if (i == 256 + 0x57 && shtctl->top > 2) { /* F11 */
p.596(リスト内)
誤:#define MAX 1000
正:#define MAX 10000
以上、お詫びして訂正いたします。
初版・第1刷〜初版・第8刷
p.293(本文)
誤:EIPというのは、次に実行する命令がメモリのどの番地あるかをCPUが記憶しておくためのレジスタです。
正:EIPというのは、次に実行する命令がメモリのどの番地にあるかをCPUが記憶しておくためのレジスタです。
p.418(本文)
誤:_asm_hrb_apiでPUSHADを使わすに、
正:_asm_hrb_apiでPUSHADを使わずに、
p.451(init_gdtidt()のあるリスト見出し)
誤:今回のconsole.cの一部
正:今回のdsctbl.cの一部
以上、お詫びして訂正いたします。
初版・第1刷〜初版・第7刷
p.90(リスト内)
誤:GLOBAL _io_hlt, _io_cli, _io_sti, io_stihlt
正:GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihlt
p.125(本文)
誤:構造体は満タンになってします。
正:構造体は満タンになってしまいます。
p.170(脚注)
誤:「substract」(引き算)が由来。
正:「subtract」(引き算)が由来。
p.172(リスト内)
誤: IN AL,0x60 ; から読み(受信バッファが悪さをしないように)
削除:この一文は一部の機種で有害なので削除。
p.220(本文)
誤:これはgraph.cのinit_screen8を改造した程度のものです。
正:これはgraphic.cのinit_screen8を改造した程度のものです。
p.395(本文)
誤:あしたもがんばるそー、おー!
正:あしたもがんばるぞー、おー!
p.401(リスト内)
誤: if (finfo->name[0] == 0x00) {
正: if (finfo[i].name[0] == 0x00) {
p.495(リスト内)
誤:/* ココから */ if (i == 256 + 0x57) { /* F11 */
正:/* ココから */ if (i == 256 + 0x57 && shtctl->top > 2) { /* F11 */
p.674(リスト内)
誤:
error:
MOV AX,0
MOV ES,AX
MOV SI,msg
正:
註:この2行は不要なので削除
以上、お詫びして訂正いたします。
初版・第1刷〜初版・第6刷
p.77、p.79、p.81(ページ見出し)
誤:C言語からメモリに書き込みたい(harib01a)
正:ポインタに挑戦(harib01c)
p.167、p.168(リスト内)
誤:pipelineflash
正:pipelineflush
p.231(本文)
誤:条件よっては2クロックで
正:条件によっては2クロックで
p.307(本文)
誤:タスクスイッチのするためのプログラムが
正:タスクスイッチをするためのプログラムが
p.411(本文)
誤:IDTへの登録ときに
正:IDTへの登録のときに
p.411、p.413(ページ見出し)
誤:プアプリケーション名を自由に
正:アプリケーション名を自由に
p.476(リスト内)
誤:0〜32797
正:0〜32767
註:同様のミスが p.477(本文)、p.479(リスト内)にもあるので、これも訂正。
以上、お詫びして訂正いたします。
初版・第1刷〜初版・第5刷
p.248(リスト内)
誤:
}
timerctl.using++;
/* うしろをずらす */
for (j = timerctl.using; j < i; j--) {
timerctl.timers[j] = timerctl.timers[j - 1];
}
/* あいたすきまに入れる */
正:
}
/* うしろをずらす */
for (j = timerctl.using; j < i; j--) {
timerctl.timers[j] = timerctl.timers[j - 1];
}
timerctl.using++;
/* あいたすきまに入れる */
註: timerctl.using++; の行の位置を変更。
p.394(本文)
誤:そしてコンソールでhrbコマンドを実行します
正:そしてコンソールでhltコマンドを実行します
p.531(本文)
誤:2003〜2002になりますが、
正:2003〜3002になりますが、
p.550(リスト内)
誤:
sheet_updown(sht_back, 0);
sheet_updown(sht_cons[0], 1); /* ココから */
sheet_updown(sht_mouse, 2); /* ココまで */
(中略)
正:
sheet_updown(sht_back, 0);
sheet_updown(sht_cons[0], 1); /* ココから */
sheet_updown(sht_mouse, 2); /* ココまで */
key_win = sht_cons[0];
keywin_on(key_win);
(中略)
註:(中略)の前に2行を追加。これに合わせて次ページのリストがopen_consoleの一行目から始まるように調節する。
以上、お詫びして訂正いたします。
初版・第1刷〜初版・第4刷
註:初版・第5刷以降ではすべて修正されています
p.51(本文)
誤:これは内側から、
正:これは外側から、
註:これにあわせて同ページのイラストも修正。
p.463(本文)
誤:hello2.nasと同じ内容のものを作りました。
正:hello4.cと同じ内容のものを作りました。
p.485(リスト内)
誤:MOV EAX,[ESP+8] ; win
正:MOV EBX,[ESP+8] ; win
p.508(本文)
誤:以前は if (256 <= i && i < 512) だったのです。今回からは、512より大きくても、
正:以前は if (256 <= i && i <= 511) だったのです。今回からは、512以上でも、
p.631(リスト内)
誤:
if (strncmp(p + 1, header, 15) == 0 && (*p == 0x83 || *p == 0x85 || *p == 0x89)) {
p += 16;
size = tek_getnum_s7s(&p);
}
return size;
}
正:
if (memcmp(p + 1, header, 15) == 0 && (*p == 0x83 || *p == 0x85 || *p == 0x89)) {
p += 16;
size = tek_getnum_s7s(&p);
}
return size;
} /* (註)memcmpはstrncmpの仲間で、文字列中に0があっても指定された15文字まで比較する関数 */
註:strncmp→memcmpとコメントの追加。
p.653〜654(リスト内)
誤: && priority >=
正: && priority >
註:該当個所はif文中にあり計10ヶ所。
p.670(リスト内)
誤:i = api_fopen(p);
正:i = api_fopen(p); if (i == 0) { error("file not found.\n"); }
p.670(本文)
誤:jpeg.cはnikqさん、筆者、I.Tak.さんが著作者です。この場を借りてI.Tak.さんとnikqさんにはお礼申し上げます。
正:jpeg.cはnikqさん、筆者、I.Tak.さん、くーみんさんが著作者です。この場を借りてI.Tak.さんとnikqさんとくーみんさんにはお礼申し上げます。
以上、お詫びして訂正いたします。
初版・第1刷〜初版・第3刷
註:初版・第4刷以降ではすべて修正されています
目次の5ページ
誤:10 とにかくHLTしたい(harib00)............................................................66
正:10 とにかくHLTしたい(harib00j)...........................................................66
p.81(本文)
誤:分かったよう分からないような、
正:分かったような分からないような、
p.89(本文)
誤:ちなみにキャリーフラグはELFAGSの第0ビットです。
正:ちなみにキャリーフラグはEFLAGSの第0ビットです。
p.185(本文)
誤:さてbootpack.cのほうのmemtestを削除して、
正:さてbootpack.cのほうのmemtest_subを削除して、
p.196(本文)
誤:456円を切捨てで100円単位にするなら、
正:456円を切り上げで100円単位にするなら、
p.220(リスト内)
誤:buf_win = (unsigned char *) memman_alloc_4k(memman, 160 * 68);
正:buf_win = (unsigned char *) memman_alloc_4k(memman, 160 * 68); /* ココ! */
註:つまり行末に「/* ココ! */」を書き加えただけ
p.250(リスト内)
誤:putfouts8_asc_sht
正:putfonts8_asc_sht
註:これに伴い、以下のページについても同様の修正を行う。
p.251(1ヶ所)、p.252(3ヶ所)、p.253(3ヶ所)、p.260(2ヶ所)、p.261(4ヶ所)、p.283(4ヶ所)、p.284(6ヶ所)、p.285(2ヶ所)、
p.286(1ヶ所)、p.287(4ヶ所)、p.288(2ヶ所)、p.296(1ヶ所)、p.300(2ヶ所)、p.301(1ヶ所)、p.303(1ヶ所)、p.306(1ヶ所)、
p.310(2ヶ所)、p.322(2ヶ所)、p.323(1ヶ所)、p.342(1ヶ所)、p.344(2ヶ所)、p.345(1ヶ所)、p.346(3ヶ所)、p.348(2ヶ所)、
p.351(1ヶ所)、p.360(2ヶ所)、p.362(2ヶ所)、p.363(2ヶ所)、p.365(5ヶ所)、p.366(6ヶ所)、p.374(1ヶ所)、p.380(2ヶ所)、
p.385(2ヶ所)、p.394(1ヶ所)、p.398(1ヶ所)、p.399(2ヶ所)、p.400(3ヶ所)、p.401(2ヶ所)、p.412(1ヶ所)、p.502(2ヶ所)、
p.700(1ヶ所)
p.265(リスト内)
誤:/* sとtの間に入れる場合た */
正:/* sとtの間に入れる場合 */
p.289(ページ見出し)
誤: 14-7:おまけ(2)(harib11i …… 289
正:14-7:おまけ(2)(harib11i) …… 289
p.318(リスト内)
誤:void fifo32_init(struct FIFO32 *fifo, int size, int *buf, TASK *task)
正:void fifo32_init(struct FIFO32 *fifo, int size, int *buf, struct TASK *task)
p.331(本文)
削除:now_taskというのは、タスクに関する設定をいじる前の、task_nowの結果のことです。
註:この一文は不要なので削除。
p.342(リスト内)
誤:
sheet_refresh(sht_win, 0, 0, sht_win->bxsize, 20);
sheet_refresh(sht_cons, 0, 0, sht_cons->bxsize, 20);
正:
sheet_refresh(sht_win, 0, 0, sht_win->bxsize, 21);
sheet_refresh(sht_cons, 0, 0, sht_cons->bxsize, 21);
p.380(リスト内)
誤:if (cmdline[x] == '.') {
正:if (cmdline[x] == '.' && y <= 8) {
p.385(リスト内)
誤:break; /* 4で割り切れたらbreak */
正:break; /* 32で割り切れたらbreak */
p.386(リスト内)
誤:break; /* 4で割り切れたらbreak */
正:break; /* 32で割り切れたらbreak */
p.390(リスト内)
誤:
/* typeコマンド */
if (x < 224 && finfo[x].name[0] != 0x00) {
正:
/* typeコマンド */
(中略)
if (x < 224 && finfo[x].name[0] != 0x00) {
註:つまり一行追加。
p.401(リスト内)
誤:
j = 0;
for (i = 0; j < 11 && name[i] != 0; i++) {
正:
j = 0;
for (i = 0; name[i] != 0; i++) {
if (j >= 11) { return 0; /* 見つからなかった */ }
if (name[i] == '.' && j <= 8) {
p.405(本文)
誤:そしてコンソールで「hrb」と。
正:そしてコンソールで「hlt」と。
p.410(リストのタイトル)
誤・正:今回のnaskfunc.nasの一部
註:文字の太さが他の場合とは異なっている。
p.412(リスト内)
誤:char name[13], *p;
正:char name[18], *p;
p.412(リスト内)
誤:for (i = 0; i < 8; i++) {
正:for (i = 0; i < 13; i++) {
p.412(リスト内)
誤:if (finfo == 0) {
正:if (finfo == 0 && name[i - 1] != '.') {
p.429(リスト内)
誤:char name[13], *p, *q;
正:char name[18], *p, *q;
p.435(リストのタイトル)
誤・正:今回のdsctbl.cの一部
註:文字の大きさがおかしい。
p.436(リストのタイトル)
誤:[今回のcrack2.nas]
正:今回のcrack2.nas
p.672(本文)
誤:これはnasmというアセンブラ用に書かれたプログラムなので、
正:これはNASMというアセンブラ用に書かれたプログラムなので、
p.672(脚注)
誤:nasmで書かれたソースプログラムでは
正:NASMで書かれたソースプログラムでは
以上、お詫びして訂正いたします。
初版・第1刷〜初版・第2刷
註:初版・第3刷以降ではすべて修正されています
目次のあとの注意書き
追加: (QEMUの注意のあと、以上について分からないことがあればの前)
□□□□
付録CD-ROMはブータブルCDです。このCDから起動すると三十日目のOSが起動します。
p.3(本文)
誤:C言語がたくさんできてきますが
正:C言語がたくさん出てきますが
p.7(脚注)
誤:GNUという団体が作った
正:GNUというプロジェクトが作った
p.21(本文)
誤:これは命令番号が連(つら)なっただけもので、
正:これは命令番号が連(つら)なっただけのもので、
p.46(本文)
誤:このmake.exeはGNUという団体の人たちが作って、
正:このmake.exeはGNUプロジェクトの人たちが作って、
p.62(本文)
誤:しかしVARMは普通のメモリ以上の存在で
正:しかしVRAMは普通のメモリ以上の存在で
註:VARM → VRAM
p.82(本文)
誤:筆者も理解しくいと思っていて、
正:筆者も理解しにくいと思っていて、
p.548(本文)
誤:マウスの右ボタンをはなして
正:マウスの左ボタンをはなして
以上、お詫びして訂正いたします。
初版・第1刷のみ
註:初版・第2刷以降ではすべて修正されています
p.15(本文)
誤:EB4E004845...
正:EB4E904845...
p.17(本文)
誤:ハードディスクのどこかへコピーしてください。
正:ハードディスクのどこかへ貼り付けてください。
p.31(本文)
誤:ちなみにenrtyは「入り口」という意味です。
正:ちなみにentryは「入り口」という意味です。
註:enrty → entry
p.54(リスト内)
誤:エラーがおきなればfinへ
正:エラーがおきなければfinへ
p.55(リスト内)
誤:エラーがおきなればnextへ
正:エラーがおきなければnextへ
p.56(リスト内)
誤:エラーがおきなればnextへ
正:エラーがおきなければnextへ
p.58(本文)
誤:合わせて
正:あわせて
註:「併せて」にはしない
p.60(本文)
誤:8bitカラーということは256が色使えるということなので、
正:8bitカラーということは256色が使えるということなので、
p.62(本文)
誤:infomation(情報)
正:information(情報)
p.604(リスト内:関数cmd_app)
誤:memman_free(memman, (int) task->fhandle[i].buf, task->fhandle[i].size);
正:memman_free_4k(memman, (int) task->fhandle[i].buf, task->fhandle[i].size);
註:memman_free → memman_free_4k
p.604(リスト内:関数hrb_api:edx == 22)
誤:memman_free(memman, (int) fh->buf, fh->size);
正:memman_free_4k(memman, (int) fh->buf, fh->size);
註:memman_free → memman_free_4k
p.671(リスト内)
誤:/* info[3] ; ysize */
正:/* info[3] : ysize */
註:セミコロン → コロン
p.674(リスト内)
誤:AXを32で割って、その結果をAHに入れたことになる
正:AXを32で割って、その結果をAHに入れたことになる (SHLは左シフト命令)
p.675(リスト内)
誤:エラーがおきなればnextへ
正:エラーがおきなければnextへ
以上、お詫びして訂正いたします。
このページに関するお問い合わせは川合秀実(kawai@osask.jp)まで