CASL II

web 上で CASL II を simulate する site を見つけてしまったのでついカッとなっていろいろ書いてしまった。最近 code 書きたい欲がたまってたからちょっとやってみるかで 2 時間ほど使ってしまった。

javascript で実装してるのかと思いきやどうも host 側で実行した結果を返しているみたい。とりあえず階乗を計算する code を書いてみた。なんというか…、 bad knowhow ぽい変な technique がいっぱいあるね…。

MAIN    START
        LAD     GR0,2
        CALL    FACT
        RET

; factorial of n
; GR0 = GR0!
; initialize
FACT    LD      GR1,GR0
        LAD     GR0,1
; multiply
FNEXT   CALL    MUL
        SUBA    GR1,=1
        CPA     GR1,=1
        JZE     FEXIT
        JUMP    FNEXT
FEXIT   RET

; multiplication
; GR0 = GR0 * GR1
; save the values of the registers
MUL     PUSH    0,GR1
; initialize
        XOR     GR2,GR2
; shift and add
MNEXT   SRL     GR1,1
        JOV     ADDDGT
        JZE     MEXIT
        JUMP    NXTDGT
ADDDGT  ADDA    GR2,GR0
NXTDGT  SLL     GR0,1
        JNZ     MNEXT

; restore the values of registers
MEXIT   LD      GR0,GR2
        POP     GR1
        RET

        END