countersince January 6, 2001X68000 LIBRARYEnglish
更新日: 2023 年 7 月 10 日
X68000 LIBRARY > ソフトウェアライブラリ > プログラミング > アセンブラ > HAS060.X > HANOI.S

HANOI.S

説明

HAS060.X の添付サンプルです。

HANOI.S
*       〜〜〜〜〜〜〜〜〜〜〜〜
*       〜〜〜 ハノイの塔 〜〜〜
*       〜〜〜〜〜〜〜〜〜〜〜〜
*
*       アセンブラでハノイの塔を解くためのプログラムです。
*       .R 実行形式にして TYPE すると、解法が“図解”されます。
*       円盤の枚数は次の N で指定します。

        N:=7

*       以下は、変更する必要はありません。

        ESC:=27

put     .macro  c
                .dc.b   c
        .endm

xline   .macro  n,c
                .dcb.b  n,c
        .endm

clear   .macro
                .dc.b   ESC,'*'
        .endm

locate  .macro  x,y
                .dc.b   ESC,'=',' '+y,' '+x
        .endm

        windowx:=96
        windowy:=31

        disk:='%'
        space:=' '
        pole:='|'
        base:='#'

        core:=2
        hat:=2

        width:=N+core

        center2:=windowx/2
        center1:=center2-width*2
        center3:=center2+width*2

        left:=center1-width
        right:=center3+width
        top:=(windowy-N)/2-hat
        bottom:=top+hat+N

        clear

        locate  left,bottom
        xline   right-left+1,base

        i:=1
        .rept   3
                j:=top
                .rept   bottom-top
                        locate  center%i,j
                        put     pole
                        j:=j+1
                .endm
                i:=i+1
        .endm

        number1:=N
        number2:=0
        number3:=0

        i:=1
        .rept   N
                size1%i:=width-i
                locate  center1-size1%i,bottom-i
                xline   size1%i*2+1,disk
                i:=i+1
        .endm

move_disk       .macro  a,b
                p:=a
                q:=b
                i:=number%p
                j:=bottom-i
                .rept N-i+hat+1
                        locate  center%p-size%p%i,j-1
                        xline   size%p%i*2+1,disk
                        locate  center%p-size%p%i,j
                        xline   size%p%i,space
                        put     pole
                        xline   size%p%i,space
                        j:=j-1
                .endm
                j:=center%p-size%p%i
                locate  j,top-2
                xline   size%p%i*2+1,disk
                locate  j,top-1
                xline   size%p%i*2+1,space
                .if     center%p<center%q
                        .rept   center%q-center%p
                                locate  j+size%p%i*2+1,top-2
                                put     disk
                                locate  j,top-2
                                put     space
                                j:=j+1
                        .endm
                .else
                        .rept   center%p-center%q
                                locate  j-1,top-2
                                put     disk
                                locate  j+size%p%i*2,top-2
                                put     space
                                j:=j-1
                        .endm
                .endif
                locate  j,top-1
                xline   size%p%i*2+1,disk
                locate  j,top-2
                xline   size%p%i*2+1,space
                locate  j,top
                xline   size%p%i*2+1,disk
                locate  j,top-1
                xline   size%p%i*2+1,space
                k:=number%q+1
                j:=top+1
                .rept N-k+hat
                        locate  center%q-size%p%i,j
                        xline   size%p%i*2+1,disk
                        locate  center%q-size%p%i,j-1
                        xline   size%p%i,space
                        put     pole
                        xline   size%p%i,space
                        j:=j+1
                .endm
                number%p:=number%p-1
                number%q:=k
                size%q%k:=size%p%i
        .endm

hanoi   .macro  n,a,b,c
                .if n>0
                        hanoi   n-1,a,c,b
                        move_disk       a,c
                        hanoi   n-1,b,a,c
                .endif
        .endm

        hanoi   N,1,2,3

        locate  0,bottom+2