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


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

cc65

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付けてくれたらいいのに‥。