📖 書式仕様

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(同じ意味)

🔢 数値フォーマット

16進数(Hexadecimal)

フォーマット 説明
$XX $FF ドル記号プレフィックス
XXH FFH または ffh H サフィックス(大文字小文字問わず)
0xXX 0xFF または 0XFF C言語スタイル

2進数(Binary)

フォーマット 説明
%XXXXXXXX %10101010 パーセント記号プレフィックス
XXXXXXXXB 10101010B または 10101010b B サフィックス(大文字小文字問わず)
0bXXXXXXXX 0b10101010 または 0B10101010 C言語スタイル

8進数(Octal)

フォーマット 説明
@XXX @377 アットマーク記号プレフィックス
XXXO 377O または 377o O サフィックス(大文字小文字問わず)
XXXQ 377Q または 377q Q サフィックス(大文字小文字問わず)
0oXXX 0o377 または 0O377 現代的なスタイル

10進数(Decimal)

フォーマット 説明
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 値
ラベル: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

🎯 ラベル

ラベルはプログラム中の位置に名前を付けるために使用します。

ラベルの規則

ラベルの例:
START:              ; 推奨スタイル(コロン付き)
    LD A,0

LOOP                ; コロンなしも可能
    INC A
    CP 10
    JR NZ,LOOP

_SUBROUTINE:        ; アンダースコアで始めることも可能
    RET

Label123:           ; 数字を含むことも可能
    NOP

⚙️ 疑似命令

ORG - 開始アドレス設定

プログラムの開始アドレスを指定します。

    ORG 8000H       ; アドレス $8000 から開始
    ORG 0100H       ; アドレス $0100 から開始

DB / DEFB - バイトデータ定義

1バイトのデータを定義します。複数指定可能です。

    DB 10,20,30         ; 3バイトのデータ
    DB "HELLO",0        ; 文字列とヌル終端
    DB 'ABC'            ; シングルクォートも可能
    DEFB $FF,$FE,$FD    ; DBと同じ

DW - ワードデータ定義

2バイトのデータを定義します(リトルエンディアン)。

    DW $1234            ; 34 12 の順で格納
    DW 100,200,300      ; 複数指定可能
    DW LABEL            ; ラベルのアドレスを格納

DS - 領域確保

指定したバイト数の領域を確保し、値で初期化します。

    DS 10               ; 10バイト確保(値は最初の値を繰り返し)
    DS 100,$FF          ; 100バイトを$FFで埋める
    DS 5,0              ; 5バイトを0で埋める

END - アセンブル終了

アセンブルの終了を示します。この後の行は無視されます。

    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

⚠️ 注意事項

⚠️ 重要

  • 相対ジャンプ(JR、DJNZ)の範囲は -128 ~ +127 バイトです
  • バイト値は 0 ~ 255 の範囲である必要があります
  • ワード値は 0 ~ 65535 の範囲である必要があります
  • ラベルは使用前に定義されている必要があります(前方参照は不可)
  • RST命令は特定の値(00H, 08H, 10H, 18H, 20H, 28H, 30H, 38H)のみ使用可能です

📚 サポートされるZ80命令

すべての標準Z80命令がサポートされています:

* SLL は未公開命令ですが、サポートされています