6502アセンブル/逆アセンブル

6502のアセンブル/逆アセンブルをしたくなって、ちょっと調べてみたらcc65が全部入りで便利だったので覚書。

# cc65

* http://cc65.github.io/cc65/
* https://github.com/cc65/cc65
* https://www.cc65.org/ （旧ホーム?）

6502マシン用のCコンパイラです。
今回は、Cコンパイラは使いません。

## assemble

アセンブラは`ca65`ですが、素のバイナリを吐くために`cl65`（フロントエンド）を使います。

```hoge.s
	.org	$800
:
	ldy		$50
	lda		skewtbl,y
	sta		$3d
	lda		sectaddr,y
	beq		:+
	sta		$27
	jsr		$005c
:
	dec		$50
	bne		:--

	rts

skewtbl:
	.byte	$00,$0d,$0b,$09,$07,$05,$03,$01
	.byte	$0e,$0c,$0a,$08,$06,$04,$02,$0f

sectaddr:
	.byte	$00,$09,$00,$00,$00,$00,$00,$00
	.byte	$30,$31,$32,$33,$34,$00,$00,$00
```

* `--listing` リスティング生成
* `--target none` ターゲット指定（none=素のバイナリ）

```
$ cl65 --listing hoge.lst --target none -o hoge.bin hoge.s
$ hexdump -C hoge.bin
00000000  a4 50 b9 16 08 85 3d b9  26 08 f0 05 85 27 20 5c  |.P....=.&....' \|
00000010  00 c6 50 d0 eb 60 00 0d  0b 09 07 05 03 01 0e 0c  |..P..`..........|
00000020  0a 08 06 04 02 0f 00 09  00 00 00 00 00 00 30 31  |..............01|
00000030  32 33 34 00 00 00                                 |234...|
00000036
```

## disassemble

逆アセンブラはda65です。

* `-S` スタートアドレス
* `--comments` コメントレベル

```
$ da65 -S 0x800 --comments 4 hoge.bin
; da65 V2.17 - Git N/A
; Created:    2018-04-18 10:44:34
; Input file: hoge.bin
; Page:       1


        .setcpu "6502"

; ----------------------------------------------------------------------------
L005C           := $005C
L0861           := $0861
; ----------------------------------------------------------------------------
L0800:  ldy     $50                             ; 0800 A4 50                    .P
        lda     L0816,y                         ; 0802 B9 16 08                 ...
        sta     $3D                             ; 0805 85 3D                    .=
        lda     L0826,y                         ; 0807 B9 26 08                 .&.
        beq     L0811                           ; 080A F0 05                    ..
        sta     $27                             ; 080C 85 27                    .'
        jsr     L005C                           ; 080E 20 5C 00                  \.
L0811:  dec     $50                             ; 0811 C6 50                    .P
        bne     L0800                           ; 0813 D0 EB                    ..
        rts                                     ; 0815 60                       `

; ----------------------------------------------------------------------------
L0816:  brk                                     ; 0816 00                       .
        ora     $090B                           ; 0817 0D 0B 09                 ...
        .byte   $07                             ; 081A 07                       .
        ora     $03                             ; 081B 05 03                    ..
        ora     ($0E,x)                         ; 081D 01 0E                    ..
        .byte   $0C                             ; 081F 0C                       .
        asl     a                               ; 0820 0A                       .
        php                                     ; 0821 08                       .
        asl     $04                             ; 0822 06 04                    ..
        .byte   $02                             ; 0824 02                       .
        .byte   $0F                             ; 0825 0F                       .
L0826:  brk                                     ; 0826 00                       .
        ora     #$00                            ; 0827 09 00                    ..
        brk                                     ; 0829 00                       .
        brk                                     ; 082A 00                       .
        brk                                     ; 082B 00                       .
        brk                                     ; 082C 00                       .
        brk                                     ; 082D 00                       .
        bmi     L0861                           ; 082E 30 31                    01
        .byte   $32                             ; 0830 32                       2
        .byte   $33                             ; 0831 33                       3
        .byte   $34                             ; 0832 34                       4
        brk                                     ; 0833 00                       .
        brk                                     ; 0834 00                       .
        brk                                     ; 0835 00                       .
```

`.org`付けてくれたらいいのに‥。