プロフィール
| |
- Author:あろは (alohakun)
- 若槻俊宏 (WAKATSUKI toshihiro)
連絡先 : alohakun ___at___ gmail.com mixi : http://mixi.jp/show_friend.pl?id=182927 twitter : http://twitter.com/alohakun
abstract
プログラミングという人間の知的行為を体系化し,単なる職人芸ではなく,サイエンスにするための研究をしています.
具体的には,等価変換計算モデルに基づいた,仕様記述からのプログラム合成の研究をしています.
もっと噛み砕くと,プログラムの正しさをどのように定式化し,どのような枠組みで,どのように変換を進めていけば,正しさを保証したまま,効率的なプログラムを手に入れることができるのか,ということについて研究しています.
キーワード : equivalent transformation, computation model, programming paradigm, formal specification, program synthesis





|
FC2カウンター
| |
|
ブロとも申請フォーム
| |
この人とブロともになる
|
|
Movitz: a Common Lisp x86 development platform
| 2008/04/18(金) 21:55:01
|
Movitz: a Common Lisp x86 development platform
Common Lisp で書かれた OS というか,そもそもファイルシステムとか持ってない感じなので,文字通り「x86 CPU 開発環境 for Common Lisp」って感じですね.ブートローダー + α って感じです.
x86 CPU におけるデータ構造のレイアウトプロトコルとか,コンパイラの中身とかの話がけっこう面白い感じです.
The Movitz Development Platform (PDF)
ここからイメージファイルが落とせて,簡単に QEMU などで試すことができます (以下,Windows 版の QEMU を C 以下に解凍して使ってます.QEMU 単体だと遅すぎるので,KQEMU もインストール済み).
C:\qemu-0.9.0-windows> cat grub-bootloader.img floppy.img > movitz.img C:\qemu-0.9.0-windows> qemu.exe -L . -fda movitz.img -boot a
で,grub が立ち上がります.


う〜む,組み込み関数が良くわからない.リファレンスは無いのかな ?
とりあえず higepon さんはこれで OS 書けば良いのではないだろうか (笑)
ぐぐったらおもいっきり一発目でがいしゅつでした ! ごめんなさい ><

|
scheme/CommonLisp|TB:0|CM:3|
|

▲
| |
|
tinyWM を Scheme (chicken) に移植
| 2008/04/03(木) 00:09:54
|
tinyWM
chicken の xlib binding が微妙過ぎて,全然短くなりませんでした.C の構造体触るとか,Lisp 系は辛すぎる.なぜか xevent-xbutton という共用体メンバが定義されて無かったので,C なら start = ev.xbutton; の,構造体の一発代入で済むところを,全メンバをいちいち set! しないと駄目だったりとか,いろいろ酷い.あと,chicken の場合,コンパイル時のチャックが全く無いので,起動するまで関数名が間違っているのに気がつかなかったりとか.
(require-extension xlib)
(let ((dpy (xopendisplay #f))) (assert dpy) (let ((root (xdefaultrootwindow dpy))) (xgrabkey dpy XK_F1 MOD1MASK root 1 GRABMODEASYNC GRABMODEASYNC) (xgrabbutton dpy 1 MOD1MASK root 1 BUTTONPRESSMASK GRABMODEASYNC GRABMODEASYNC NONE NONE) (xgrabbutton dpy 3 MOD1MASK root 1 BUTTONPRESSMASK GRABMODEASYNC GRABMODEASYNC NONE NONE) (let ((event (make-xevent)) (attr (make-xwindowattributes)) (start (make-xbuttonevent))) (let eventloop () (xnextevent dpy event) (cond ((and (eqv? (xevent-type event) KEYPRESS) (not (eqv? (xevent-xkey-subwindow event) NONE))) (xraisewindow dpy (xevent-xkey-subwindow event))) ((and (eqv? (xevent-type event) BUTTONPRESS) (not (eqv? (xevent-xbutton-subwindow event) NONE))) (xgrabpointer dpy (xevent-xbutton-subwindow event) 1 (bitwise-ior POINTERMOTIONMASK BUTTONRELEASEMASK) GRABMODEASYNC GRABMODEASYNC NONE NONE CURRENTTIME) (xgetwindowattributes dpy (xevent-xbutton-subwindow event) attr) (set-xbuttonevent-type! start (xevent-xbutton-type event)) (set-xbuttonevent-serial! start (xevent-xbutton-serial event)) (set-xbuttonevent-send_event! start (xevent-xbutton-send_event event)) (set-xbuttonevent-display! start (xevent-xbutton-display event)) (set-xbuttonevent-window! start (xevent-xbutton-window event)) (set-xbuttonevent-root! start (xevent-xbutton-root event)) (set-xbuttonevent-subwindow! start (xevent-xbutton-subwindow event)) (set-xbuttonevent-time! start (xevent-xbutton-time event)) (set-xbuttonevent-x! start (xevent-xbutton-x event)) (set-xbuttonevent-y! start (xevent-xbutton-y event)) (set-xbuttonevent-x_root! start (xevent-xbutton-x_root event)) (set-xbuttonevent-y_root! start (xevent-xbutton-y_root event)) (set-xbuttonevent-state! start (xevent-xbutton-state event)) (set-xbuttonevent-button! start (xevent-xbutton-button event)) (set-xbuttonevent-same_screen! start (xevent-xbutton-same_screen event))) ((eqv? (xevent-type event) MOTIONNOTIFY) (let ((xdiff (- (xevent-xbutton-x_root event) (xbuttonevent-x_root start))) (ydiff (- (xevent-xbutton-y_root event) (xbuttonevent-y_root start)))) (xmoveresizewindow dpy (xevent-xmotion-window event) (+ (xwindowattributes-x attr) (if (eqv? (xbuttonevent-button start) 1) xdiff 0)) (+ (xwindowattributes-y attr) (if (eqv? (xbuttonevent-button start) 1) ydiff 0)) (max 1 (+ (xwindowattributes-width attr) (if (eqv? (xbuttonevent-button start) 3) xdiff 0))) (max 1 (+ (xwindowattributes-height attr) (if (eqv? (xbuttonevent-button start) 3) ydiff 0)))))) ((eqv? (xevent-type event) BUTTONRELEASE) (xungrabpointer dpy CURRENTTIME))) (eventloop)))))
使い方は,$csc tinywm.scm みたいに適当にコンパイルして,.xsession の最後に exec /path/to/tinywm とか適当に書くか,WM 無しのセッション exec mlterm とかで入って起動してください.
元々の tinyWM と同じく,Alt + ドロップでウィンドウを移動したり,拡大縮小できたりします.
結局,Python 最強,ということで (アーカイブに付いてくる,tinywm.py).現状,こういう binding library とかのできぐあいを勝負すると,たいてい Python の圧勝の気がします.
# TinyWM is written by Nick Welch <mack@incise.org>, 2005. # # This software is in the public domain # and is provided AS IS, with NO WARRANTY.
from Xlib.display import Display from Xlib import X, XK
dpy = Display() root = dpy.screen().root
root.grab_key(XK.string_to_keysym("F1"), X.Mod1Mask, 1, X.GrabModeAsync, X.GrabModeAsync) root.grab_button(1, X.Mod1Mask, 1, X.ButtonPressMask, X.GrabModeAsync, X.GrabModeAsync, X.NONE, X.NONE) root.grab_button(3, X.Mod1Mask, 1, X.ButtonPressMask, X.GrabModeAsync, X.GrabModeAsync, X.NONE, X.NONE)
while 1: ev = root.display.next_event()
if ev.type == X.KeyPress and ev.child != X.NONE: ev.window.circulate(X.RaiseLowest) elif ev.type == X.ButtonPress and ev.child != X.NONE: ev.child.grab_pointer(1, X.PointerMotionMask|X.ButtonReleaseMask, X.GrabModeAsync, X.GrabModeAsync, X.NONE, X.NONE, X.CurrentTime) attr = ev.child.get_geometry() start = ev elif ev.type == X.MotionNotify: #while(XCheckTypedEvent(dpy, MotionNotify, &ev)); xdiff = ev.root_x - start.root_x ydiff = ev.root_y - start.root_y ev.window.configure( x = attr.x + (start.detail == 1 and xdiff or 0), y = attr.y + (start.detail == 1 and ydiff or 0), width = max(1, attr.width + (start.detail == 3 and xdiff or 0)), height = max(1, attr.height + (start.detail == 3 and ydiff or 0))) elif ev.type == X.ButtonRelease: dpy.ungrab_pointer(X.CurrentTime)
Xlib がちゃんと OOP っぽくアレンジされていて良い感じですね.
Common Lisp も,現状 C 以外で,唯一 X プロトコルを xlib の binding ではなく,ネイティブでしゃべれる (CLX) 言語のわりには,いろいろな要因で微妙な気がします (まずスタンドアローンイメージがやたらでかくなるとか)
|
scheme/CommonLisp|TB:0|CM:0|
|

▲
| |
|
chicken で X プログラミング
| 2008/04/01(火) 21:46:49
|
ここから xlib.egg を持ってきてもいいし wget してもいい.
$ wget http://www.call-with-current-continuation.org/eggs/xlib.egg $ su # chicken-setup xlib.egg /usr/bin/csc -feature compiling-extension xlib.scm -s -O2 -d0 -L "-L/usr/X11R6/lib -lX11" -C "-I/usr/X11R6/include" -emit-exports xlib.exports Compiling xlib (this may take a while) ... xlib.c: In function 'stub5816': xlib.c:18615: 警告: passing argument 3 of 'XwcTextPropertyToTextList' from incompatible pointer type xlib.c: In function 'stub5773': xlib.c:18644: 警告: passing argument 1 of 'XwcFreeStringList' from incompatible pointer type xlib.c: In function 'stub5758': xlib.c:18656: 警告: passing argument 2 of 'XwcTextListToTextProperty' from incompatible pointer type xlib.c: In function 'stub5252': xlib.c:19011: 警告: passing argument 4 of 'XGetWMSizeHints' from incompatible pointer type xlib.c: In function 'stub5234': xlib.c:19022: 警告: passing argument 4 of 'XGetWMNormalHints' from incompatible pointer type xlib.c: In function 'stub5106': xlib.c:19117: 警告: passing argument 3 of 'XGetRGBColormaps' from incompatible pointer type xlib.c: In function 'stub5075': xlib.c:19138: 警告: passing argument 3 of 'XGetIconSizes' from incompatible pointer type xlib.c: In function 'stub4956': xlib.c:19265: 警告: passing argument 3 of 'XwcLookupString' from incompatible pointer type xlib.c: In function 'stub4819': xlib.c:19385: 警告: passing argument 7 of 'XwcDrawImageString' from incompatible pointer type xlib.c: In function 'stub4767': xlib.c:19415: 警告: passing argument 7 of 'XwcDrawString' from incompatible pointer type xlib.c: In function 'stub4663': xlib.c:19474: 警告: passing argument 2 of 'XwcTextPerCharExtents' from incompatible pointer type xlib.c: In function 'stub4603': xlib.c:19502: 警告: passing argument 2 of 'XwcTextExtents' from incompatible pointer type xlib.c: In function 'stub4567': xlib.c:19524: 警告: passing argument 2 of 'XwcTextEscapement' from incompatible pointer type xlib.c: In function 'stub4511': xlib.c:19576: 警告: passing argument 2 of 'XFontsOfFontSet' from incompatible pointer type xlib.c: In function 'stub1078': xlib.c:22141: 警告: passing argument 1 of 'XAddToExtensionList' from incompatible pointer type xlib.c: In function 'stub706': xlib.c:22491: 警告: passing argument 1 of 'XFindOnExtensionList' from incompatible pointer type xlib.c: In function 'stub543': xlib.c:22636: 警告: passing argument 5 of 'XListFontsWithInfo' from incompatible pointer type rm -fr /var/lib/chicken/1/xlib.so cp -r xlib.so /var/lib/chicken/1/xlib.so cp -r xlib.exports /var/lib/chicken/1/xlib.exports
なんか警告がいっぱい出てますが,これでインストールが完了.サンプルコードが動くようになる.
$ cat xlibtest.scm
(require-extension xlib)
(let* ((display (xopendisplay #f))) (assert display) (let* ((screen (xdefaultscreen display)) (root (xrootwindow display screen)) (window (xcreatesimplewindow display root 100 200 300 50 0 (xblackpixel display screen) (xwhitepixel display screen)))) (assert window) (let ((font (xloadfont display "10x20"))) (assert font) (let ((gc (xcreategc display window 0 #f)) (event (make-xevent))) (xsetforeground display gc (xblackpixel display screen)) (xsetbackground display gc (xwhitepixel display screen)) (xsetfunction display gc GXCOPY) (xsetfont display gc font) (xselectinput display window (bitwise-ior EXPOSUREMASK BUTTONPRESSMASK)) (xmapwindow display window) (xnextevent display event) (xdrawstring display window gc 100 30 "hello, world!" 12) (xflush display) (xnextevent display event)))))
$ csc xlibtest.scm $ ./xlibtest
んー,xsetlocale とか無い感じ… 日本語は表示できないのかな ?
$ cat /var/lib/chicken/1/xlib.exports | grep locale xlocaleoffontset xlocaleofim xsupportslocale xsetlocalemodifiers
setlocale って何を require すれば良いのだろうか ? chicken のマニュアルは調べ難すぎる気がする.
|
scheme/CommonLisp|TB:0|CM:0|
|

▲
| |
|
/usr/bin/ld: cannot find -lgcc_s 解決編
| 2008/03/13(木) 02:59:29
|
chicken でコンパイルをすると
/usr/bin/ld: cannot find -lgcc_s collect2: ld はステータス 1 で終了しました make: *** [nessy] エラー 1
のようなエラーが出てリンクが失敗するという症状 (失敗したときに出る,Makefile に書いてあるのと同じコマンドをコマンドラインから入れると何故かリンクが成功するとか,謎過ぎる) は,とりあえず
$ sudo ln -s /usr/lib/libgcc_s.so.1 /usr/lib/libgcc_s.so
とかでシンボリックリンク張っとけば直るみたいです.
こういう Makefile (空白はタブ) で,分割コンパイルができるようになりました.これで,コンパイルに 1 分半ぐらいかかる巨大な match 部分を切り離してコンパイルできるようになりました.chicken 万歳!
nessy : asm.o nessy.o csc nessy.o asm.o -o nessy
asm.o : asm.scm csc -c -i asm.scm
nessy.o : nessy.scm csc -c -i nessy.scm
clean : rm *.o nessy
ちなみに,chicken は,dl を使わなければ,一応完全な standalone (dso の dll 無し) にもできるみたいです.警告出てるので怖いですけど.
$ make csc -c -i asm.scm csc -c -i nessy.scm csc nessy.o asm.o -o nessy
$ du -h nessy 605K nessy
$ ldd nessy linux-gate.so.1 => (0xffffe000) libchicken.so.0 => /usr/lib/libchicken.so.0 (0xb7c7a000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7c63000) libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7c3e000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7af1000) /lib/ld-linux.so.2 (0xb7f1a000)
$ gcc -static nessy.o asm.o -lchicken -o nessy -L/usr/lib -Wl,-R/usr/lib -ldl -lm -ldl -lchicken /usr/lib/libchicken.a(libchicken_la-runtime.o): In function `dload_2': (.text+0x32143): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
$ ldd nessy not a dynamic executable
$ ./nessy (232 (169 255) (165 255) (173 0 255) (189 0 255) (185 0 255) (161 255) (177 255))
$ du -h nessy 2.3M nessy
libchicken.a やっぱりでかいな
この記事の続きを読む…
ところで,こういうソースコードは vim で HTML に整形して張り付けているわけですが,そうすると,ブログとソース中の二重に br タグが挿入されてしまうので,今までずっと伸び伸びになってたことに今更気がつきました!(遅) asm.scm (require-extension srfi-60) とかして,そっちの算術シフト (ash) と論理積 (logand) 使った方が,移植性は高いと思います.
(declare (unit asm)) ; 8 bit immediate (define im8? (lambda (x) (and (fixnum? x) (<= 0 x) (<= x #xff)))) ; 16 bit immediate (define im16? (lambda (x) (and (fixnum? x) (<= 0 x) (<= x #xffff)))) (define low (lambda (x) (bitwise-and x #x00ff))) (define high (lambda (x) (arithmetic-shift x -8)))
(define mnemonic->hex (lambda (m) (match m (('lda (? im8? i)) (list #xa9 i)) ; immediate (('lda [(? im8? i)]) (list #xa5 i)) ; zero page (('lda [(? im8? i) '+ 'x]) (list #xb5 i)) ; zeropage, x (('lda [(? im16? i)]) (list #xad (low i) (high i))) ; abs (('lda [(? im16? i) '+ 'x]) (list #xbd (low i) (high i))) ; abs, x (('lda [(? im16? i) '+ 'y]) (list #xb9 (low i) (high i))) ; abs, y (('lda [[(? im8? i) '+ 'x]]) (list #xa1 i)) ; [indirect, x] (('lda [[(? im8? i)] '+ 'y]) (list #xb1 i)) ; [indirect], y (('adc (? im8? i)) (list #x69 i)) ; immediate (('adc [(? im8? i)]) (list #x65 i)) ; zero page (('adc [(? im8? i) '+ 'x]) (list #x75 i)) ; zeropage, x (('adc [(? im16? i)]) (list #x6d (low i) (high i))) ; abs (('adc [(? im16? i) '+ 'x]) (list #x7d (low i) (high i))) ; abs, x (('adc [(? im16? i) '+ 'y]) (list #x79 (low i) (high i))) ; abs, y (('adc [[(? im8? i) '+ 'x]]) (list #x61 i)) ; [indirect, x] (('adc [[(? im8? i)] '+ 'y]) (list #x71 i)) ; [indirect], y (('and (? im8? i)) (list #x29 i)) ; immediate (('and [(? im8? i)]) (list #x25 i)) ; zero page (('and [(? im8? i) '+ 'x]) (list #x35 i)) ; zeropage, x (('and [(? im16? i)]) (list #x2d (low i) (high i))) ; abs (('and [(? im16? i) '+ 'x]) (list #x3d (low i) (high i))) ; abs, x (('and [(? im16? i) '+ 'y]) (list #x39 (low i) (high i))) ; abs, y (('and [[(? im8? i) '+ 'x]]) (list #x21 i)) ; [indirect, x] (('and [[(? im8? i)] '+ 'y]) (list #x31 i)) ; [indirect], y (('cmp (? im8? i)) (list #xc9 i)) ; immediate (('cmp [(? im8? i)]) (list #xc5 i)) ; zero page (('cmp [(? im8? i) '+ 'x]) (list #xd5 i)) ; zeropage, x (('cmp [(? im16? i)]) (list #xcd (low i) (high i))) ; abs (('cmp [(? im16? i) '+ 'x]) (list #xdd (low i) (high i))) ; abs, x (('cmp [(? im16? i) '+ 'y]) (list #xd9 (low i) (high i))) ; abs, y (('cmp [[(? im8? i) '+ 'x]]) (list #xc1 i)) ; [indirect, x] (('cmp [[(? im8? i)] '+ 'y]) (list #xd1 i)) ; [indirect], y (('eor (? im8? i)) (list #x49 i)) ; immediate (('eor [(? im8? i)]) (list #x45 i)) ; zero page (('eor [(? im8? i) '+ 'x]) (list #x55 i)) ; zeropage, x (('eor [(? im16? i)]) (list #x4d (low i) (high i))) ; abs (('eor [(? im16? i) '+ 'x]) (list #x5d (low i) (high i))) ; abs, x (('eor [(? im16? i) '+ 'y]) (list #x59 (low i) (high i))) ; abs, y (('eor [[(? im8? i) '+ 'x]]) (list #x41 i)) ; [indirect, x] (('eor [[(? im8? i)] '+ 'y]) (list #x51 i)) ; [indirect], y (('ora (? im8? i)) (list #x09 i)) ; immediate (('ora [(? im8? i)]) (list #x05 i)) ; zero page (('ora [(? im8? i) '+ 'x]) (list #x15 i)) ; zeropage, x (('ora [(? im16? i)]) (list #x0d (low i) (high i))) ; abs (('ora [(? im16? i) '+ 'x]) (list #x1d (low i) (high i))) ; abs, x (('ora [(? im16? i) '+ 'y]) (list #x19 (low i) (high i))) ; abs, y (('ora [[(? im8? i) '+ 'x]]) (list #x01 i)) ; [indirect, x] (('ora [[(? im8? i)] '+ 'y]) (list #x11 i)) ; [indirect], y (('sbc (? im8? i)) (list #xe9 i)) ; immediate (('sbc [(? im8? i)]) (list #xe5 i)) ; zero page (('sbc [(? im8? i) '+ 'x]) (list #xf5 i)) ; zeropage, x (('sbc [(? im16? i)]) (list #xed (low i) (high i))) ; abs (('sbc [(? im16? i) '+ 'x]) (list #xfd (low i) (high i))) ; abs, x (('sbc [(? im16? i) '+ 'y]) (list #xf9 (low i) (high i))) ; abs, y (('sbc [[(? im8? i) '+ 'x]]) (list #xe1 i)) ; [indirect, x] (('sbc [[(? im8? i)] '+ 'y]) (list #xf1 i)) ; [indirect], y (('ldx (? im8? i)) (list #xa2 i)) ; immediate (('ldx [(? im8? i)]) (list #xa6 i)) ; zero page (('ldx [(? im8? i) '+ 'y]) (list #xb6 i)) ; zeropage, y (('ldx [(? im16? i)]) (list #xae (low i) (high i))) ; abs (('ldx [(? im16? i) '+ 'y]) (list #xbe (low i) (high i))) ; abs, y (('ldy (? im8? i)) (list #xa0 i)) ; immediate (('ldy [(? im8? i)]) (list #xa4 i)) ; zero page (('ldy [(? im8? i) '+ 'x]) (list #xb4 i)) ; zeropage, x (('ldy [(? im16? i)]) (list #xac (low i) (high i))) ; abs (('ldy [(? im16? i) '+ 'x]) (list #xbc (low i) (high i))) ; abs, x (('sta [(? im8? i)]) (list #x85 i)) ; zero page (('sta [(? im8? i) '+ 'x]) (list #x95 i)) ; zeropage, x (('sta [(? im16? i)]) (list #x8d (low i) (high i))) ; abs (('sta [(? im16? i) '+ 'x]) (list #x9d (low i) (high i))) ; abs, x (('sta [(? im16? i) '+ 'y]) (list #x99 (low i) (high i))) ; abs, y (('sta [[(? im8? i) '+ 'x]]) (list #x81 i)) ; [indirect, x] (('sta [[(? im8? i)] '+ 'y]) (list #x91 i)) ; [indirect], y (('stx [(? im8? i)]) (list #x86 i)) ; zero page (('stx [(? im8? i) '+ 'y]) (list #x96 i)) ; zeropage, y (('stx [(? im16? i)]) (list #x8e (low i) (high i))) ; abs (('sty [(? im8? i)]) (list #x84 i)) ; zero page (('sty [(? im8? i) '+ 'x]) (list #x94 i)) ; zeropage, x (('sty [(? im16? i)]) (list #x8c (low i) (high i))) ; abs (('asl 'a) (list #x0a i)) ; accumulator (('asl [(? im8? i)]) (list #x06 i)) ; zero page (('asl [(? im8? i) '+ 'x]) (list #x16 i)) ; zeropage, x (('asl [(? im16? i)]) (list #x0e (low i) (high i))) ; abs (('asl [(? im16? i) '+ 'x]) (list #x1e (low i) (high i))) ; abs, x (('rol 'a) (list #x2a i)) ; accumulator (('rol [(? im8? i)]) (list #x26 i)) ; zero page (('rol [(? im8? i) '+ 'x]) (list #x36 i)) ; zeropage, x (('rol [(? im16? i)]) (list #x2e (low i) (high i))) ; abs (('rol [(? im16? i) '+ 'x]) (list #x3e (low i) (high i))) ; abs, x (('ror 'a) (list #x6a i)) ; accumulator (('ror [(? im8? i)]) (list #x66 i)) ; zero page (('ror [(? im8? i) '+ 'x]) (list #x76 i)) ; zeropage, x (('ror [(? im16? i)]) (list #x6e (low i) (high i))) ; abs (('ror [(? im16? i) '+ 'x]) (list #x7e (low i) (high i))) ; abs, x (('asr 'a) (list #x4a i)) ; accumulator (('asr [(? im8? i)]) (list #x46 i)) ; zero page (('asr [(? im8? i) '+ 'x]) (list #x56 i)) ; zeropage, x (('asr [(? im16? i)]) (list #x4e (low i) (high i))) ; abs (('asr [(? im16? i) '+ 'x]) (list #x5e (low i) (high i))) ; abs, x (('bit [(? im8? i)]) (list #x24 i)) ; zero page (('bit [(? im16? i)]) (list #x2c (low i) (high i))) ; abs (('cpx (? im8? i)) (list #xe0 i)) ; immediate (('cpx [(? im8? i)]) (list #xe4 i)) ; zero page (('cpx [(? im16? i)]) (list #xec (low i) (high i))) ; abs (('cpy (? im8? i)) (list #xc0 i)) ; immediate (('cpy [(? im8? i)]) (list #xc4 i)) ; zero page (('cpy [(? im16? i)]) (list #xcc (low i) (high i))) ; abs (('inc [(? im8? i)]) (list #xe6 i)) ; zero page (('inc [(? im8? i) '+ 'x]) (list #xf6 i)) ; zeropage, x (('inc [(? im16? i)]) (list #xee (low i) (high i))) ; abs (('inc [(? im16? i) '+ 'x]) (list #xfe (low i) (high i))) ; abs, x (('dec [(? im8? i)]) (list #xc6 i)) ; zero page (('dec [(? im8? i) '+ 'x]) (list #xd6 i)) ; zeropage, x (('dec [(? im16? i)]) (list #xce (low i) (high i))) ; abs (('dec [(? im16? i) '+ 'x]) (list #xde (low i) (high i))) ; abs, x (('jmp [(? im16? i)]) (list #x4c (low i) (high i))) ; abs (('jmp [[(? im16? i)]]) (list #x6c (low i) (high i))) ; indirect (('jsr [(? im16? i)]) (list #x20 (low i) (high i))) ; abs (('bcc [(? im8? i)]) (list #x90 i)) ; relative (('bcs [(? im8? i)]) (list #xb0 i)) ; relative (('beq [(? im8? i)]) (list #xf0 i)) ; relative (('bmi [(? im8? i)]) (list #x30 i)) ; relative (('bne [(? im8? i)]) (list #xd0 i)) ; relative (('bpl [(? im8? i)]) (list #x10 i)) ; relative (('bvc [(? im8? i)]) (list #x50 i)) ; relative (('bvs [(? im8? i)]) (list #x70 i)) ; relative (('txa) #x8a) (('tya) #x98) (('txs) #x9a) (('tay) #xa8) (('tax) #xaa) (('tsx) #xba) (('php) #x08) (('plp) #x28) (('pha) #x48) (('pla) #x68) (('inx) #xe8) (('iny) #xc8) (('dex) #xca) (('dey) #x88) (('clc) #x18) (('cli) #x58) (('clv) #xb8) (('cld) #xd8) (('sec) #x38) (('sei) #x78) (('sed) #xf8)
| |