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