質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

1回答

1581閲覧

Brainf*ckインタープリタ

yosi2112

総合スコア13

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

2クリップ

投稿2017/04/19 13:03

###前提・実現したいこと
Brainf*ckインタープリタをMacro assembler ASを用いて
Emu740というMELPS740ファミリ(あるいは6502)のシミュレーション環境に移植しています。

###発生している問題・エラーメッセージ

  • ネットに転がっているhelloworldを読み込もうとしたがファイルバッファに転送されない
  • 直接内蔵バイナリエディタでプログラムを入力するも正しい結果が表示されない
  • サブルーチンを抜けた後に暴走する
  • 配列バッファの一部が0x76で初期化されてしまう&256バイト以降(0x100から)が初期化されない

###該当のソースコード

;BF-I for Emu740 ;2017 yosi include macro2.inc include cio2.inc USE_MODIFIED_MONITOR equ 0 ;普通のモニタを使う場合は0にする IF USE_MODIFIED_MONITOR == 1 include monmod.inc org $F000-8192 txbuf: rmb 8192 ELSEIF include mon2.inc org $F800-8192 txbuf: rmb 8192 ENDIF org $8000 jsr init jsr opmsg main: jsr fileinput jsr proc jmp main opmsg: set16 msgaddr,opnmsg jsr putmsg rts putmsg: ldx #$00 ldy #$00 lp10: lda msgaddr,x sta edit_buffer,y inx iny cmp #$00 bne lp10 jsr put_line rts fileinput: set16 msgaddr,filepp jsr putmsg lda #edit_end_top & edit_end_next jsr get_line lda #$0d jsr put_char lda #$0a jsr put_char jsr fload lda #txbuf & $FF sta $20 lda #txbuf & $FF00 >> 8 sta $21 rts proc: lda ($20),y cmp #$00 beq pex jsr proc2 lda $20 adc #$1 sta $20 cmp #$ff bne proc lda $21 adc #$1 sta $21 cmp #$FF bne proc pex: jmp ex proc2: cmp #'>' beq iptr cmp #'<' beq dptr cmp #'+' beq ival cmp #'-' beq dval cmp #'.' beq pchar cmp #',' beq gchar cmp #'[' beq jzero cmp #']' beq jnzer jmp ex iptr: jmp nexptr dptr: jmp prvptr ival: lda ($10),Y adc #1 sta ($10),Y jmp ex dval: lda ($10),Y sbc #1 sta ($10),Y jmp ex pchar: lda ($10),Y jsr put_char jmp ex gchar: jsr get_char sta ($10),Y jmp ex jzero: CMP ($10),Y beq nexptr jmp ex jnzer: CMP ($10),Y bne nexptr jmp ex nexptr: INC $10 lda $10 cmp $ff bne ex clc inc $11 jmp ex prvptr: dec $10 lda $10 cmp $00 bne ex clc dec $11 jmp ex fload: lda #'r' jsr set_redirect bcs ex rb_l1: jsr end_i_redirect BCS ex jsr get_char sta ($20),Y iny cpy #$FF bne rb_l1 lda $21 adc #$1 cmp #$FF bne rb_l1 ex: rts init: lda #$00 sta $10 lda #$01 sta $11 lda #$00 sta $22 lda #$77 sta $23 lda #$00 l1: sta ($10),Y iny cpy #$ff beq l1 lda $23 adc #$1 cmp $23 bne l1 lda #txbuf & $FF sta $20 lda #txbuf & $FF00 >> 8 sta $21 lda #$00 sta $10 lda #$01 sta $11 ldy #$00 rts opnmsg: byt "Brainf*ck interpreter for Emu740 by yosi",$0d,$0a,0 filepp: byt "File>",0 msgaddr: adr $0000 end

###補足情報(言語/FW/ツール等のバージョンなど)

  • シミュレーション環境:Emu740 VER. 1.0
  • Emu740の配布サイトにある簡易モニタのサービスルーチンを使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

とりあえずですが、初期化処理(メモリクリア)がおかしいです。

init: lda #$00 sta $10 (中略) cmp $23 bne l1

現状のコードだと無限ループになるような気がするのですが‥。
上記コードが何をしているか(どの範囲をクリアしているか)を教えていただければアドバイス出来ます。

修正コード

上記範囲のコードの修正版です。$0000~$76ffまで$00クリアします。
ちゃんとした環境が無いのでちゃんとチェック出来ていません。

init: lda #$00 sta $10 lda #$01 sta $11 ;lda #$00 ;(削除)使いません ;sta $22 ;(削除)使いません lda #$77 sta $23 ldy #$00 ;(追加)初期化 l2: ;(追加)Aレジスタ再初期化用 lda #$00 l1: sta ($10),y iny ;cpy #$00 ;(修正)$ffではなく$00でチェック. ただしチェックしなくてもフラグが経つので必要なし bne l1 ;(修正)eqではなくne lda $11 ;(修正)上位バイトの更新/チェックなので$11 ($23は全くの間違い) adc #$1 sta $11 ;(追加)+1したものを書き込まないとアドレスが進まない cmp $23 bne l2 ;(修正)Aレジスタは壊れているので再初期化するためにl2にジャンプ

投稿2017/04/20 01:36

編集2017/04/20 12:33
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yosi2112

2017/04/20 11:40 編集

$0100-$7700の範囲をクリアするコードです
fuzzball

2017/04/20 12:33

回答を更新しました。 コメント付けたのでがんばって消化して下さい。
yosi2112

2017/04/20 14:30 編集

ありがとうございます! これで何とか初期化が正しくできそうです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問