おそばせながら、12月10目のアドベントカレンダーです。
はじめに
今回は学校で習ったCASLⅡを使ってシーザー暗号を解いてみたです。
CASLⅡを実行できる環境がなかったので『CASLシミュレーター』をお借りしました。
なんとなくでやってみようと考えて行動に起こした結果、地獄を見た回でした。
目次
- 大枠を考えた
- 副プログラム書いた
- 合わせてみた
- 汎用化?
- 感想
大枠を考えた
作ろうとは考えたのですが、何をしたらいいのか分からなかったので、
想像しているプログラムを絵にかいて考えました。それを文字にしたものが
下のようになります。
ループ{
判定
(大文字){文字ずらし}
(小文字){文字ずらし}
(その他){そのまま格納}
}
出力
大枠の作り方はあっているのでしょうか。。。
書いている当初はCASLⅡのことを理解していなかったので、このまま作業に
入ってしまいました。
副プログラム
分岐した後の文字をずらす作業を副プログラムでしたいと考えました。
そして完成したものがこちらです。
とても楽しい。これは大文字を三文字移動させるプログラムです。
この子を基に小文字を移動のプログラムを作成しました。ここまでは順調でした。
合わせてみた
試しに大文字だけ呼び出せるかやってみました。
うごかない、てかなにこれ?という状態になってしまいました。
出力画面から分かったこと
- 必要以上の出力→副プログラムのOUTの消し忘れ
- すべてD→副プログラムの最初のLAD消し忘れ
修正①
まだ変ですね。最後の文字が最初にも入ってしまています。よくコードを見てみると、副プログラムのSTが残ってました。
修正②
きたーーーーーーー!!!!!
副プログラムもちゃんと作動しました。
汎用化?
小文字の分の処理を増やして、それ以外の文字はずらさないように判定を付ければ、、、
RS START
IN BUF,LEN
IN NUM,LEN2
LAD GR1,BUF
LAD GR2,0
LOOP LD GR4,0,GR1
CPA GR4,=#0041
JMI NEXT
CPA GR4,=#005A
JPL NEXT
CALL SHO1
JUMP PUT
NEXT CPA GR4,=#0061
JMI POS
CPA GR4,=#007A
JPL POS
CALL SHO2
JUMP PUT
POS LD GR0,0,GR1
PUT ST GR0,GFT,GR2
LAD GR1,1,GR1
LAD GR2,1,GR2
CPA GR2,LEN
JMI LOOP
OUT GFT,LEN
FIN RET
SHO1 RPUSH
LD GR0,0,GR1
LD GR3,NUM
SUBA GR3,=#0030
ADDA GR0,GR3
CPA GR0,='Z'
JMI OK1
JZE OK1
LD GR3,=#001A
SUBA GR0,GR3
OK1 RPOP
RET
SHO2 RPUSH
LD GR0,0,GR1
LD GR3,NUM
SUBA GR3,=#0030
ADDA GR0,GR3
CPA GR0,='z'
JMI OK2
JZE OK2
LD GR3,=#001A
SUBA GR0,GR3
OK2 RPOP
RET
LEN DS 1
LEN2 DS 1
NUM DS 1
BUF DS 256
GFT DS 256
END
完成ー!!!
感想
授業ではその場で解くだけでしたが、実際書いてみると本当に難しい言語でした。
また、どこの処理が間違っているのかを探すのがとても大変だと感じました。
かなり汚いプログラムが出来てしまったので、きれいなプログラムを書けるように
勉強したいです。
参考資料
アドベントカレンダー
・IPFactoryアドベントカレンダー
・12月10日 ゲーム制作を通してプログラミングを勉強しよう HARUさん