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