LoginSignup
8
5

More than 5 years have passed since last update.

ズンドコキヨシ with Z80アセンブラ

Last updated at Posted at 2016-03-18

Z80 のアセンブラでズンドコしてみました。MSX-DOS 上で動作させています。MSX のワークエリアを参照しており、MSX の文字コードに依存しています。

ZUNDOKO.MAC
INTCNT  EQU     0FCA2H                  ; MSX BIOSにより1/60秒でインクリメントされるワークエリアアドレス

        ASEG
        ORG     100H                    ; MSX-DOSプログラム開始番地

MAIN:   LD      A,(INTCNT)              ; プログラム起動時にはほぼ乱数と見做せる値が入っているので
        LD      B,A                     ; それを乱数の種としてBレジスタに格納する
        LD      C,0                     ; 履歴に使用するCレジスタを初期化する
LOOP:   LD      A,B                     ; 乱数の値を
        ADD     A,A                     ; 2倍し
        ADD     A,A                     ; 更に2倍し
        ADD     A,B                     ; 元の値を加えることで5倍する
        ADD     A,123                   ; 123を加え
        LD      B,A                     ; 新しい乱数の値とする
        RLA                             ; 乱数の値のMSB(1:ずん 0:どこ)をCフラグに転送する
        LD      DE,ZUN                  ; 「ずん 」文字列のアドレスをDEに設定する
        JR      C,SKIP                  ; 先のCフラグがセットされていれば次の命令をスキップする
        LD      E,LOW DOKO              ; 「どこ 」文字列のアドレスの下位の値をEに設定する
                                        ; (上位の値は変わらないのでDについては省略)
SKIP:   RR      C                       ; 履歴にCフラグの値をMSB側から格納する
        CALL    PUTS                    ; 文字列出力サブルーチンを呼び出し「ずん 」か「どこ 」を出力する
        LD      A,C                     ; 履歴の値から0F8H=-8を引く(=8を足す)
        CP      0F8H                    ; 履歴が2進数で01111XXXのパターン(16進数で78H~7FH)であった場合、
                                        ; 8を足すと結果が10000XXX(80H~87H)となりオーバーフローフラグがセットされる
        JP      PO,LOOP                 ; オーバーフローフラグがセットされていなければLOOPへ分岐する
        LD      DE,KIYOSHI              ; 「キ・ヨ・シ!(改行)」文字列のアドレスをDEに設定し
                                        ; 以下の文字列出力サブルーチンを実行し出力する
                                        ; (サブルーチン最後のRETでプログラム終了となる)

; 文字列出力サブルーチン
; DEを引数として文字列を'$'直前まで出力する
; BC以外の値は保証されない
PUTS:   PUSH    BC                      ; 乱数の値(B)と履歴(C)を退避
        LD      C,9                     ; BDOS機能9, '$'まで文字列を出力
        CALL    5                       ; BDOS呼び出し
        POP     BC                      ; 乱数の値(B)と履歴(C)を復帰
        RET                             ; 復帰

ZUN:    DB      9DH,0DEH,0FDH," ","$"   ; 「ずん 」文字列
DOKO:   DB      0E4H,0DEH,9AH," ","$"   ; 「どこ 」文字列
KIYOSHI:DB      0B7H,0A5H,0D6H,0A5H,0BCH; 「キ・ヨ・シ!(改行)」文字列
        DB      "!",0DH,0AH,"$"         ;

        END
MAKE.BAT
M80 ZUNDOKO,=ZUNDOKO/Z/L/R
L80 ZUNDOKO,ZUNDOKO/N/E

zundoko.png

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5