「xkas」(2012/03/02 (金) 18:34:55) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
* 目次
#contents
* xkas
** これは?
アセンブリをアセンブルしてROMに挿入してくれるソフトです。書き込む位置によっては元のROMを上書きしてしまう恐れがあるため、[[ROM Map:http://www.smwcentral.net/?p=map&type=rom]]を確認する必要があります。
bliteやSprite Toolsには初めから入っていますのでそれを利用しても構いません。寧ろそちらの方が安全でしょう;
** 入手
SMW Centralの[[Tools:http://www.smwcentral.net/?p=list&type=tools]]より入手可能です。
** 使い方
xkas [.asmのパス] [ROMのパス]
でROMに書き込み、
xkas [.asmのパス] [作成する.binのパス]
で.binファイルを生成します。.binを作成するならTRASMを利用した方がよいでしょう。
* xkas文法
基本的には[[65C816アセンブリ言語>改造マリオ/65C816]]を元にしていますが、色々と追加されたものがあるのでその部分について纏めます。
** ヘッダ情報
hirom
lorom
でROMのデータの区切り方法を示します。hiromでは10000hごと、loromでは8000hごと区切られています。((1hは10000です。)) SMWの場合はloromを指定します。
header
ROMの最初にヘッダが含まれていることを示します。SMWでは必要です。
従っていつも先頭に
header
lorom
は書くことになっています。
** 定義
![変数名] = [定義するもの]
![変数名] equ [定義するもの]
アセンブリ中にたくさん同じ数値を利用する場合や、何か数値自体に意味のあるものに名前を付けることによって変更が簡単になったりします。
!vx = #$20
などと利用します。
!x = $20として#!xとするとこれは#$20を指します。
!x = $12
!y = $34
とすると!x!yは$1234です。
** ラベル
[ラベル名]:
でその地点のアドレスを[ラベル名]で参照することが出来ます。
LOOP:
処理
BEQ LOOP
ループ終了
のように分岐やジャンプなどで使用されます。
このラベルは1つのアセンブリで重複してはいけないため、重複する言許されるサブラベルも用いられます。
.[サブラベル名]
先頭にドットを付けるだけです。参照する場合は「.[サブラベル名]」とドットを付ける必要があります。
LABEL1:
.SUBLABEL1
処理
.SUBLABEL2
処理
LABEL2:
.SUBLABEL1
処理
.SUBLABEL2
処理
同じおおラベルの中ではサブラベルは重複してはいけませんが、他のおおラベル間では重複しても問題ありません。
- ラベル名で「a」と「A」だけは使えないようです。また先頭が数字ではいけません。
- 大文字小文字、数字、_は使えます。
** マクロ
macro [マクロ名]([引数1], [引数2], ...)
命令1
命令2$<引数1>
命令3 #<引数2>
...
endmacro
でマクロを定義すれば
%[マクロ名]([引数1], [引数2], ...)
で呼び出すことが出来ます。
マクロの定義中には引数を指定することが出来、直接置換されます。例を挙げておきます :
macro Coin(x)
LDA #<x>
STA $0DBF
endmacro
%Coin($15)
では
LDA #$15
STA $0DBF
が実行されるのと同じ事です。マクロを利用すれば同じような処理をたくさん書かなくて済んで楽になります。勿論、書き込まれるデータ量が減るわけではないので注意が必要です。
** バイト長を明示
命令.b #0
命令.w #0
はそれぞれ
命令 #$00
命令 #$0000
と解釈されます。
** 演算
演算式を書くとその通りに実行されます。
:+ | 加法 $02 + $03
:- | 減法 $02 - $03
:* | 乗法 $02 * $03
:/ | 除法 $06 / $03
:>> | 右シフト $07 >> 1
:<< | 左シフト $03 << 1
:& | 論理積 $05 & $03
:¦ | 論理和 $05 | $03
:^ | 排他的論理和 $05 ^ $03
:~ | 否定 ~$00
左から順番に演算されます。また、ラベルも使用可能です。
JMP LOOP + $01
** 繰り返し
rep [回数] : [命令]
とすると[命令]を[回数]分だけ繰り返し書いたことと同等になります。当然、回数分だけ容量を食いますので注意が必要です。
** バイナリ書き込み
db [値1], [値2], ...
dw [値1], [値2], ...
dl [値1], [値2], ...
dd [値1], [値2], ...
ROMに直接データを書き込みます。dbは1byte, dwは2byte, dlは3byte, ddは4バイトデータを書き込みます。
db $01, $02, $03
** 名前空間
namespace "[名前]"
とするとこれ以降のラベルの名前にこの名前が付け加えられます。つまりnamespaceの前後では名前が重複しなくなります。
** 書き込み位置
org [書き込むアドレス]
書き込みたいアドレスを指定してその位置から書き込みます。
表示オプション
横に並べて表示:
変化行の前後のみ表示: