2010-01-08

OS: IPL

その筋には(というと変な雰囲気がでて格好いい?)有名だが、
2ch発祥のOSでMonaというのがある。最初の会社にいたころに知ったから、2005年くらいか?
あれから、5年。何を思ったのが、僕もOSを作りたいと思ってきた。
(昔から思っていたが、当時は何をしていいのかさっぱり分からなかった。が、最近なんとなく必要なものが見えてきた。暇にかまけて勉強したのが功を奏した感じ)

っで、Monaをはじめ、いろいろ調べてみた。
30日でできる! OS自作入門とかが有名っぽいが、こっちじゃ買えん。
っが、結構実践サイトとかあって、解説が読めないだけでソースは読めたりする。

っで、IPL(OSを起動する前にBIOSが起動する。ブートローダーと同義?)を作ることからはじめることになるのだが、これが難しい(当たり前だが)
アセンブラがよく分からない(アセンブリ言語自体は割りとシンプルなのだが、アドレスとかレジスタとかがいまいち分からん)
あと、GCCとNASMの相性が悪い(というかGASとGCCの相性がよすぎるのか?)というのもあって、とりあえずNASMを選択していた状態ではさっぱり分からんかった。

とりあえず、このサイトの自作OSのタグに書かれているのを参考に(ほとんど丸写し)、IPLを作成。
GASを使うとCの関数がそのまま呼べるので楽!!
リンカスクリプトを使うとコンパイル時にプログラムのサイズが取れるので、FDの読み取りに必要なセクタ数が分かって楽!!!
なんて感じだった。
はじめからこれにしておけばよかった。
回り道は無駄じゃないと信じたい。

2010-01-05

ASM: 勉強中

何を思ってか、アセンブリ言語のお勉強中。
(いや、ちゃんと目標があってだけど)
(Shemeはどうした?勉強してますよ)

どうでもいいけど、アセンブリ言語をアセンブラでアセンブルするんですよ(多分)
AssemblyをAssemblerでAssembleするかね、英単語にするとちと分かりやすい?
(yをeeにすると、employ、interviewと同じ関係やね)

横道どころでなくそれた。
最初(未だに)、NASMを使うか、GASにするか。NASMはIntel標準なので、(ちょっとだけ)汎用性が高い。GASはGCCとの親和性が抜群。
とりあえず、標準という言葉に弱いので、NASMにした。

アセンブリ言語の構造は非常に簡単といってもいいと思う。
基本、こんな感じ
;; 簡単なprint
;; 呼び出しは、
;; mov si, msg_pointer
;; call print
;; こんな感じ
print:
  pusha
  xor bx, bx
.loop:
  lodsb
  or  al, al
  jz  .end
  mov ah, 0x0e
  int 0x10
  jmp short .loop
.end:
  popa
  ret
命令とレジスタの組み合わせでいろいろやる。ここまでは、それなりにいろいろ言語をやってきたので簡単に理解。
問題はこの辺
mov ah, 0x0e
int 0x10
今となっては何か分かっているのだが、最初は何のことやら・・・
これは、上のlodsbでALレジスタにSIレジスタに格納されている文字列の先頭を格納していることを前提に、AHレジスタにBIOSの0x0e(表示)命令を入れて、int 0x10で実行している。
BIOSのint 0x10はビデオ関係の命令を実行するという意味で、
AHレジスタに一文字表示の命令0x0eを格納し、ALレジスタに文字コードを入れる。
BIOSの命令は、使用するレジスタ、命令の種類が決まっているので、それを調べる必要がある。
例えば、こことか。

後は、セグメントとオフセット、各レジスタの意味とかが重要になってくる。
正直、覚えられん(まだ1週間・・・)
とりあえずの、備忘録。

2010-01-02

movie: トワイライト サーガ

邦題は知らん。とりあえずそのままカタカナにしてみた。

新年一発目はこれだった。
エピソード2らしい。

感想(以下はネタバレが含まれる可能性があります)
個人的な感想を最初に書こう。
3流映画で見る価値なし。

無いよう自体は、バンパイアの子孫(?)のエドワードと狼男のジェイコブ、普通の人間のベラの恋模様を波乱万丈っぽく描いた無いよう。
その昔みた、ママレードボーイの三角関係そのままって感じ。
ただ、
エドワード → 貴族な優男
ジェイコブ → 野性味あふれる感じ
ベラ → エドワード一筋なくせに、ジェイコブも捨てがたい超わがまま娘
って感じだった。
う~ん、あんまり批判的な意見を書いて、名誉毀損で訴えられるのも嫌なので、これくらいにしてしまおう。
正直、意味不明だった(英語が理解できないとかではなく、内容が)

2010-01-01

あけましておめでとうございます

本年もよろしくお願いいたします。

今年は初詣もなく、なんとも静かな新年であります。
すこし物足りない気分でもあります。

旧年は、行く年来る年を見ることもなく、年が明けた瞬間の花火(と呼ぶにはあまりにやかましい)にはずいぶん驚かされました。
(市がやってるわけじゃなく個人。しかも結構大きめな打ち上げ花火。そりゃ指なくしたり、足なくしたりするわ)

本年は寅年ということで、躍動感あふれる年にしたいと思います。

2009-12-26

クリスマス

メリークリスマス。一応。

今日は26日なので、日本ならケーキが半値以下になっているはず。
っが、こっちはセカンドクリスマスといって、祝日!だったりする。
(ちなみに、クリスマス自体も祝日)
今年は土曜日なのであんまり関係ないが。
(来年は25と26で土日なので最悪だが)

クリスマスということで、えらい勢いで(名古屋弁)物が売れたらしい。
買い物にいったら売り切れとかどんだけ・・・
しかも売り切れたのは3日前とかどんだけ・・・
という状態だった。
この不況に消費が活性化されるのはいいことだとは思うけどね。

そんな感じであった。
取り留めないなぁ・・・

2009-12-23

Scheme: ソースを色づけするスクリプトを書いてみた

何か実用的なものを作ってみようと思い書いてみた。
(実用的かどうかはよく分からんが・・・)
1: (require rnrs/hashtables-6)
2: (define keywords (make-eq-hashtable))
3: (define (set-keywords)
4: (begin
5: (hashtable-set! keywords 'define "<span style=\"color: blue;\">define</span>")
6: (hashtable-set! keywords 'if "<span style=\"color: blue;\">if</span>")
7: (hashtable-set! keywords 'let "<span style=\"color: blue;\">let</span>")
8: (hashtable-set! keywords 'letrec "<span style=\"color: blue;\">letrec</span>")
9: (hashtable-set! keywords 'lambda "<span style=\"color: blue;\">lambda</span>")
10: (hashtable-set! keywords 'cond "<span style=\"color: blue;\">cond</span>")))
11: (define (keyword? key)
12: (hashtable-contains? keywords key))
13: (define (highlighted-keyword key)
14: (hashtable-ref keywords key ""))
15: ; string might be like this "(define",
16: ; this function should return like this -> "(<span style=\"color: blue;\">define</span>"
17: (define (has-tag? str)
18: (let loop((strls (string->list str)))
19: (cond ((null? strls) #f)
20: ((char=? (car strls) #\<) #t) ; if the string has "<" it's must be tag(might be < procedure...)
21: (else (loop (cdr strls))))))
22: (define (list->symbol ls)
23: (string->symbol (list->string ls)))
24: (define (parse-keyword str)
25: (if (has-tag? str)
26: str ; if the string has tag, just return.
27: (letrec ((ls (string->list str))
28: (set ((lambda (l)
29: (let firstb((c (car l))
30: (rest (cdr l))
31: (ret '()))
32: (cond ((null? rest) (cons ret rest))
33: ((char=? c #\() (cons (append ret (list c)) rest))
34: (else (firstb (car rest) (cdr rest) (append ret (list c)))))))
35: ls)) ; blanket + space
36: (br (car set))
37: (rest (cdr set)))
38: (if (null? rest)
39: str ; only ( or spaces
40: (let ((key (list->symbol rest)))
41: (if (keyword? key)
42: (string-append (list->string br) (highlighted-keyword key))
43: str))))))
44:
45: (define (read-file file-name)
46: (with-input-from-file
47: file-name
48: (lambda ()
49: (let loop((ls '())
50: (c (read-char)))
51: (if (eof-object? c)
52: (reverse ls)
53: (loop (cons c ls)(read-char)))))))
54:
55: (define (last-char str)
56: (let ((l (string-length str)))
57: (if (= l 0)
58: (integer->char 0)
59: (string-ref str (- l 1)))))
60:
61: (define (high-light str)
62: (let ((ls (string->list str)))
63: (if (null? ls)
64: ""
65: (let loop((forward "")
66: (c (car ls))
67: (src (cdr ls))
68: (is-quoted #f)
69: (is-escape #f))
70: (cond ((null? src) (string-append forward (string c)))
71: ; escape begin
72: ((char=? c #\&)
73: (loop (string-append forward (string c)) (car src) (cdr src) is-quoted #t))
74: ; escapse end
75: ((and is-escape (char=? c #\;))
76: (loop (string-append forward (string c)) (car src) (cdr src) is-quoted #f))
77: ; quote
78: ((and (char=? c #\") (not (char=? #\\ (last-char forward))))
79: (cond ((and is-quoted) ; end quote
80: (loop (string-append forward (string c) "</span>") (car src) (cdr src) #f is-escape))
81: ((not is-quoted) ; begin quote
82: (loop (string-append forward "<span style=\"color: green;\">" (string c))
83: (car src) (cdr src) #t is-escape))
84: ; in quote
85: (else (loop (string-append forward (string c)) (car src) (cdr src) is-quoted is-escape))))
86: ; comment
87: ((and (not is-quoted)
88: (not is-escape)
89: (not (char=? #\\ (last-char forward)))
90: (char=? c #\;))
91: (string-append forward
92: "<span style=\"color: #006600; font-style: italic;\">"
93: (string c)
94: (list->string src)
95: "</span>"))
96: (else
97: (if (and (< 0 (string-length forward)) (char-whitespace? c)) ; if the charactor is whitespace
98: (begin
99: (set! forward (parse-keyword forward)); check if the string is keyword
100: (loop (string-append forward (string c))(car src) (cdr src) is-quoted is-escape))
101: (loop (string-append forward (string c))(car src) (cdr src) is-quoted is-escape))))))))
102:
103: (define (make-line str num)
104: (string-append "<div><span style=\"display: inline-block; width: 30px; font-weight: bold; text-align: right;\">"
105: (number->string num)
106: "</span>: "
107: (high-light str)
108: "</div>"))
109:
110: (define (escape c)
111: (cond ((char=? #\< c) "<")
112: ((char=? #\> c) ">")
113: ;((char=? #\" c) """)
114: ;((char=? #\& c) "&")
115: (else (string c))))
116:
117: (define (read-line source)
118: (if (null? source)
119: '()
120: (let line((ret (cons "" (cdr source)))
121: (c (escape (car source))))
122: (cond ((null? (cdr ret)) ret)
123: ((string=? "\r" c) (line (cons (car ret)(cddr ret)) (escape (cadr ret))))
124: ((string=? "\n" c) ret)
125: ((string=? "\t" c) (line (cons (string-append (make-string 8 #\Space)
126: (car ret))
127: (cddr ret))
128: (escape (cadr ret))))
129: (else (line (cons (string-append (car ret) c)
130: (cddr ret))
131: (escape (cadr ret))))))))
132:
133: (define (build-html contents)
134: (define (build-itr contents)
135: (let build((ret "")
136: (line (read-line contents))
137: (num 1))
138: (if (null? line)
139: ret
140: (build (string-append ret (make-line (car line) num))
141: (read-line (cdr line))
142: (+ num 1)))))
143: (string-append "<pre>" (build-itr contents) "</pre>"))
144:
145: (define (main args)
146: (if (null? args)
147: (begin
148: (display "usage: scm2html file-name")
149: -1)
150: (let ((contents (read-file args)))
151: (set-keywords)
152: (display (build-html contents))
153: (newline))))
154:
155: (main "scm2html.scm") ; test
長い上に汚い・・・っが、開き直ってさらしてみた。

仕様:
* 行番号付与
* コメント、文字列及びキーワード色づけ
* タブをスペースに変換。

既知の不具合:
ダブルクオート(文字列)の色づけ周りは大分怪しい。文字列の後ろになんか文字がないとタグがおかしくなる。(ブラウザで見る分には問題ないけど、HTMLとして不正になる)

Perlで作れば簡単なのに何やってんだろうとか思いながら作った。Schemeは文字列処理得意じゃないのかしら?
(正規表現使ってないからだと思うが・・・R6RSって正規表現サポートしてるのかな?)

2009-12-22

寒い寒い

雪が溶けない。土曜日にこんな感じだった。

今のところ、そのまま足跡がついた程度でとどまっていたりする。寒い。

こんな雪の中、ドイツに行こうとした(実際には以前から計画していた)。
ユトレヒトで国際列車(?)に乗り換えてという感じ。
ユトレヒトの駅はこんなだった。(ユトレヒト中央駅のバーガーキングから)

国際線は来ませんでした(昨日の話)。
まぁ、いかないと決めたのだが、今日電車がドイツまで走っているか調べてみた。


はい、ありませんでした~(ごちバトルの羽鳥アナ風)

この量の雪は珍しい(らしい)とは言え、いくらなんでも雪に弱すぎだろうオランダ。