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

  • 5
    Like
  • 0
    Comment

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