JS Z80ASM のソースコード書式ガイド
[ラベル:] [命令] [オペランド] [;コメント]
START: LD A,10 ; Aレジスタに10をロード
ADD A,B ; BレジスタをAに加算
LOOP: DJNZ LOOP ; Bが0でなければLOOPへジャンプ
命令とラベルは大文字・小文字を区別しません。文字列リテラル内のみ区別されます。
LD A,10 ; OK
ld a,10 ; OK(同じ意味)
Ld A,10 ; OK(同じ意味)
| フォーマット | 例 | 説明 |
|---|---|---|
$XX |
$FF |
ドル記号プレフィックス |
XXH |
FFH または ffh |
H サフィックス(大文字小文字問わず) |
0xXX |
0xFF または 0XFF |
C言語スタイル |
| フォーマット | 例 | 説明 |
|---|---|---|
%XXXXXXXX |
%10101010 |
パーセント記号プレフィックス |
XXXXXXXXB |
10101010B または 10101010b |
B サフィックス(大文字小文字問わず) |
0bXXXXXXXX |
0b10101010 または 0B10101010 |
C言語スタイル |
| フォーマット | 例 | 説明 |
|---|---|---|
@XXX |
@377 |
アットマーク記号プレフィックス |
XXXO |
377O または 377o |
O サフィックス(大文字小文字問わず) |
XXXQ |
377Q または 377q |
Q サフィックス(大文字小文字問わず) |
0oXXX |
0o377 または 0O377 |
現代的なスタイル |
| フォーマット | 例 | 説明 |
|---|---|---|
XXX |
255 |
通常の数値 |
0XXX |
0100 |
先頭に0がある数値(10進数として扱われる) |
XXXD |
255D または 255d |
D サフィックス(明示的な10進数) |
LD A,$FF ; 16進数: 255
LD B,0FFH ; 16進数: 255
LD C,%11111111 ; 2進数: 255
LD D,11111111B ; 2進数: 255
LD E,@377 ; 8進数: 255
LD H,377O ; 8進数: 255
LD L,255 ; 10進数: 255
LD A,255D ; 10進数(明示的): 255
オペランド内で四則演算(+、-、*、/)が使用できます。
+ - 加算- - 減算* - 乗算/ - 除算(整数除算) LD A,10+5 ; 15
LD B,$FF-1 ; 254
LD C,8*2 ; 16
LD D,100/4 ; 25
LD HL,($8000+$100) ; アドレス $8100 から読み込み
LD A,(BUFFER+1) ; BUFFERラベル + 1 のアドレス
算術式では異なる進数のフォーマットを混在できます:
LD A,$10+%00001000 ; 16 + 8 = 24
LD B,@20+10D ; 16 + 10 = 26
EQU疑似命令でラベルに値を割り当てることができます。
ラベル EQU 値
ラベル: EQU 値
ラベル:EQU 値
; 定数定義
SCREEN_ADDR EQU $8000
PORT_A EQU 10H
MAX_COUNT EQU 100
; BIOS関数アドレス
LDIRVM:EQU 0x005C
RG0SAV:EQU 0xF3DF
; 使用例
ORG 0100H
LD HL,SCREEN_ADDR ; LD HL,$8000
OUT (PORT_A),A ; OUT (10H),A
LD B,MAX_COUNT ; LD B,100
CALL LDIRVM ; CALL 005CH
LD A,(RG0SAV) ; LD A,(0F3DFH)
EQU定義は算術式でも使用できます:
BUFFER EQU $8000
LD A,(BUFFER+1) ; LD A,($8001)
LD HL,BUFFER+100 ; LD HL,$8064
ラベルはプログラム中の位置に名前を付けるために使用します。
A-Z、a-z、_)A-Z、a-z、0-9、_):)は省略可能START: ; 推奨スタイル(コロン付き)
LD A,0
LOOP ; コロンなしも可能
INC A
CP 10
JR NZ,LOOP
_SUBROUTINE: ; アンダースコアで始めることも可能
RET
Label123: ; 数字を含むことも可能
NOP
プログラムの開始アドレスを指定します。
ORG 8000H ; アドレス $8000 から開始
ORG 0100H ; アドレス $0100 から開始
1バイトのデータを定義します。複数指定可能です。
DB 10,20,30 ; 3バイトのデータ
DB "HELLO",0 ; 文字列とヌル終端
DB 'ABC' ; シングルクォートも可能
DEFB $FF,$FE,$FD ; DBと同じ
2バイトのデータを定義します(リトルエンディアン)。
DW $1234 ; 34 12 の順で格納
DW 100,200,300 ; 複数指定可能
DW LABEL ; ラベルのアドレスを格納
指定したバイト数の領域を確保し、値で初期化します。
DS 10 ; 10バイト確保(値は最初の値を繰り返し)
DS 100,$FF ; 100バイトを$FFで埋める
DS 5,0 ; 5バイトを0で埋める
アセンブルの終了を示します。この後の行は無視されます。
RET
END ; ここで終了
ダブルクォート(")またはシングルクォート(')で囲みます。
DB "Hello, World!",0
DB 'Z80 Assembly'
DEFM "TEXT DATA"
1文字をクォートで囲むと、そのASCIIコードとして扱われます。
LD A,'A' ; LD A,65 と同じ
LD B,"Z" ; LD B,90 と同じ
CP '0' ; CP 48 と同じ
セミコロン(;)以降、行末までがコメントとして扱われます。
; これは行全体がコメント
LD A,10 ; これは行末コメント
NOP ; 何もしない命令
; Z80 Number Guessing Game
; 定数定義
RANDOM_MASK EQU %00001111 ; 下位4ビットマスク
ONE EQU 1
TEN EQU 10
FIVE EQU 5
ORG 32768 ; プログラム開始アドレス
START:
LD A,R ; 乱数生成
AND RANDOM_MASK ; 0-15に制限
ADD A,ONE ; 1-16の範囲
CP TEN ; 10と比較
JR C,SET_NUMBER ; 10未満ならOK
SUB FIVE ; 10以上なら5を引く
SET_NUMBER:
LD B,A ; Bレジスタに保存
GUESS_LOOP:
LD A,$02 ; 入力カーソル表示
RST $18 ; 文字出力ルーチン
CP '9' ; 9より大きいかチェック
JR NC,GUESS_LOOP ; 大きければ再入力
SUB '0' ; ASCII→数値変換
CHECK_NUMBER:
CP B ; 正解と比較
JR Z,CORRECT_GUESS ; 一致したら正解処理
LD A,$03 ; 不正解メッセージ
RST $18
JR GUESS_LOOP ; 再挑戦
CORRECT_GUESS:
LD A,$04 ; 正解メッセージ
RST $18
JR START ; ゲーム再開
END
すべての標準Z80命令がサポートされています:
* SLL は未公開命令ですが、サポートされています