鳳鳴は祖父の俳号

日記 メモ そんなの

CASL IIでFizzBuzz

http://ideone.com/cKg5J
 CASL IIで FizzBuzzやってみた。
アセンブラでやるときは文字出力をどうするか悩むが、COMET IIの環境ではOUT命令があるのでこれを使った。
10進を表示するのは上の桁と下の桁に分けてASCII文字列を作成。CASLではレジスタは16ビットだが、文字列は1文字16ビット扱いらしい。このためバイト単位でのエンディアンは考えなくていい(はまった)。

※あまりにも不親切なのでコメント追加

FIZZBUZZ  START     
;                                       ; GR0:scratch
          LAD       GR1,1               ; GR1:const 1
          LAD       GR2,1               ; GR2:Loop counter L
          LAD       GR3,1               ; GR3:Fizz counter (%3)
          LAD       GR5,1               ; GR5:Buzz counter (%5)
          LAD       GR7,1               ; GR7:10 counter for PRINT L
          LD        GR0,X30             ; ASCII 0x30
          ST        GR0,D2              ; D2 = "0"
          ADDA      GR0,GR1
          ST        GR0,D1              ; D1 = "1"
;
LOOP      CPA       GR3,FZ              ; Fizz?
          JNZ       NOFIZZ
          CPA       GR5,BZ              ; FizzBuzz?
          JNZ       OUTFIZZ
          OUT       FIZZ,LEN8           ; PRINT "FizzBuzz"
          LAD       GR3,0               ; clear Fizz counter
          LAD       GR5,0               ; clear Buzz counter
          JUMP      UPDATE
OUTFIZZ   OUT       FIZZ,LEN4           ; PRINT "Fizz"
          LAD       GR3,0               ; clear Fizz counter
          JUMP      UPDATE
NOFIZZ    CPA       GR5,BZ              ; Buzz?
          JNZ       NUMBER
          OUT       BUZZ,LEN4           ; PRINT "Buzz"
          LAD       GR5,0               ; clear Buzz counter
          JUMP      UPDATE
NUMBER    CPA       GR2,C10             ; counter L<10?
          JMI       N1
          OUT       D2,LEN2             ; PRINT LL
          JUMP      UPDATE
N1        OUT       D1,LEN1             ; PRINT L
UPDATE    ADDA      GR2,GR1             ;  L++
          ADDA      GR3,GR1             ; Fizz++
          ADDA      GR5,GR1             ; Buzz++
;
;         counter L -> string D2:D1
;
          ADDA      GR7,GR1             ; 10counter++
          CPA       GR7,C10             ; CR7<10 ?
          JMI       LSB
;         -- carry
          LAD       GR7,0               ; D1=0
          LD        GR0,D1
          AND       GR0,FFF0
          ST        GR0,D1
          LD        GR0,D2              ; D2++
          ADDA      GR0,GR1
          ST        GR0,D2
          JUMP      UPDATE1
LSB       LD        GR0,D1              ; D1++
          ADDA      GR0,GR1
          ST        GR0,D1
UPDATE1   CPA       GR2,LIM             ; L!=100 ?
          JNZ       LOOP
;
          OUT       BUZZ,LEN4           ; PRINT "Buzz" (L=100)
          RET       
;
LIM       DC        100
FZ        DC        3
BZ        DC        5
C10       DC        10
X30       DC        #0030
FFF0      DC        #FFF0
LEN1      DC        1
LEN2      DC        2
LEN4      DC        4
LEN8      DC        8
FIZZ      DC        'Fizz'
BUZZ      DC        'Buzz'
DMY       DC        '    '
D2        DS        1
D1        DS        1
          END       

参考:情報処理試験 CASL II 完全合格教本 と付属のCASL II シミュレータ