TEST START
RPUSH
OUT MOJI,LEN
;GR1にMOJIの先頭アドレスを指定
;GR2に文字数を格納
;大文字に変換するサブルーチンUPPERを呼び出す
OUT MOJI,LEN
RPOP
RET
MOJI DC 'Social Distance'
LEN DC 15
;大文字に変換するサブルーチンUPPER
UPPER RPUSH
;<<大文字判定ループ>>
;GR3に配列MOJIの文字を読み込む
;その文字の文字コードを小文字の「a」と比較
;文字コードがaより小さかったらSKIPへ分岐
;小文字の「z」と比較
;文字コードがzより大きかったらSKIPへ分岐
;文字コードを20引いて「小文字 → 大文字」に変換
;上で大文字にした文字を配列MOJIに格納
;配列MOJIを1つ先に進める
;ループカウンタにしているGR2から1を引く
;ループカウンタがプラスであればLOOPへ
RPOP
RET
END
TEST START
RPUSH
OUT NAME,LEN ;OUT命令で「Enter your favorite name(推しの名前を入力)」を出力
IN OSHI,LENO ;IN命令で推しの名前を入力
OUT OSHI,LENO ;入力した名前を出力
LAD GR1,5 ;GR1に5を読み込む(GR1をループカウンタに使用)
;<<ここからループ>>
LOOP LD GR2,='0' ;GR2に'0'を読み込む
ADDL GR2,GR1 ;出力する為、文字コード'0'(0030)が入っているGR2にGR1を加算
ST GR2,DAYS ;ST命令でGR2の日数をDAYSに格納する
OUT DAYS,LEND ;OUT命令でDAYSに入っている日数を出力
SUBL GR1,=1 ;GR1をデクリメント
CPL GR1,=1 ;GR1の値と1を比較
JPL LOOP ;GR1が1より大きい間はループを繰り返す
;<<ループここまで>>
OUT DAY1,LEND1 ;OUT命令であと1日と出力
OUT MSG,LENM ;OUT命令で推しに「DAISUKI!!」と出力
RPOP
RET
NAME DC 'Enter your favorite name!';文字列「Enter your favorite name!」
LEN DC 25 ;その文字数
OSHI DS 256 ;推しの名前の領域を確保
LENO DS 256 ;推しの名前の文字数の領域を確保
DAYS DS 1 ;日数の領域を確保
LEND DC 7 ;日数の文字数
DAYCOUNT DC 'days.' ;出力する日数の単位
DAY1 DC '1-DAY!! TOMORROW!!' ;あと1日の文字列
LEND1 DC 18 ;あと1日の文字数
MSG DC 'DAISUKI!!' ;文字列「DAISUKI!!」
LENM DC 9 ;その文字数
END
TEST START
RPUSH
;OUT命令で「Enter your favorite name(推しの名前を入力)」を出力
;IN命令で推しの名前を入力
;入力した名前を出力
;GR1に5を読み込む(GR1をループカウンタに使用)
;<<ここからループ>>
;GR2に'0'を読み込む
;出力する為、文字コード'0'(0030)が入っているGR2にGR1を加算
;ST命令でGR2の日数をDAYSに格納する
;OUT命令でDAYSに入っている日数を出力
;GR1をデクリメント
;GR1の値と1を比較
;GR1が1より大きい間はループを繰り返す
;<<ループここまで>>
;OUT命令であと1日と出力
;OUT命令で推しに「DAISUKI!!」と出力
RPOP
RET
NAME DC 'Enter your favorite name!';文字列「Enter your favorite name!」
LEN DC 25 ;その文字数
OSHI DS 256 ;推しの名前の領域を確保
LENO DS 256 ;推しの名前の文字数の領域を確保
DAYS DS 1 ;日数の領域を確保
LEND DC 7 ;日数の文字数
DAYCOUNT DC 'days.' ;出力する日数の単位
DAY1 DC '1-DAY!! TOMORROW!!' ;あと1日の文字列
LEND1 DC 18 ;あと1日の文字数
MSG DC 'DAISUKI!!' ;文字列「DAISUKI!!」
LENM DC 9 ;その文字数
END
TEST START
RPUSH
IN LOCATE,LEN ;観光地の番号を入力する
LD GR1,LOCATE ;GR1に入力した観光地の番号を読み込む
CPL GR1,='1' ;GR1と番号'1'を比較
JNZ L2 ;等しくなければL2に分岐する
OUT LOCATE1,LEN1 ;1であれば「YOKOHAMA」と出力
JUMP FIN ;ラベルFINに分岐
L2 CPL GR1,='2' ;ラベルL2ではGR1と'2'を比較する
JNZ L3 ;等しくなければL3に分岐する
OUT LOCATE2,LEN2 ;2であれば「SKYTREE」をと出力
JUMP FIN ;ラベルFINに分岐
L3 CPL GR1,='3' ;ラベルL3ではGR1と'3'を比較する
JNZ L4 ;等しくなければL4に分岐する
OUT LOCATE3,LEN3 ;3であれば「ONJYUKU」と出力
JUMP FIN ;ラベルFINに分岐
L4 CPL GR1,='4' ;ラベルL4ではGR1と'4'を比較する
JNZ OTHER ;等しくなければOTHERに分岐する
OUT LOCATE4,LEN4 ;4であれば「ODAIBA」と出力
JUMP FIN ;ラベルFINに分岐
OTHER OUT NOTHING,LEN5 ;ラベルOTHERでは文字列NOTHINGと文字数LEN5で出力
FIN RPOP
RET
LOCATE DS 256 ;場所の領域を確保
LEN DC 1 ;文字数1文字
LOCATE1 DC 'YOKOHAMA' ;最初の場所横浜
LEN1 DC 8 ;横浜の文字数
LOCATE2 DC 'SKYTREE' ;2番目の場所スカイツリー
LEN2 DC 7 ;スカイツリーの文字数
LOCATE3 DC 'ONJYUKU' ;3番目の場所御宿
LEN3 DC 7 ;御宿の文字数
LOCATE4 DC 'ODAIBA' ;4番目の場所お台場
LEN4 DC 6 ;お台場の文字数
NOTHING DC 'PREASE ENTER 1-4' ;1から4までを入力するようにメッセージ
LEN5 DC 16 ;その他の場合の文字数
END
TEST START
RPUSH
;観光地の番号を入力する
;GR1に入力した観光地の番号を読み込む
;GR1と番号'1'を比較
;等しくなければL2に分岐する
;1であれば「YOKOHAMA」と出力
;ラベルFINに分岐
;ラベルL2ではGR1と'2'を比較する
;等しくなければL3に分岐する
;2であれば「SKYTREE」をと出力
;ラベルFINに分岐
;ラベルL3ではGR1と'3'を比較する
;等しくなければL4に分岐する
;3であれば「ONJYUKU」と出力
;ラベルFINに分岐
;ラベルL4ではGR1と'4'を比較する
;等しくなければOTHERに分岐する
;4であれば「ODAIBA」と出力
;ラベルFINに分岐
;ラベルOTHERでは文字列NOTHINGと文字数LEN5で出力
FIN RPOP
RET
LOCATE DS 256 ;場所の領域を確保
LEN DC 1 ;文字数1文字
LOCATE1 DC 'YOKOHAMA' ;最初の場所横浜
LEN1 DC 8 ;横浜の文字数
LOCATE2 DC 'SKYTREE' ;2番目の場所スカイツリー
LEN2 DC 7 ;スカイツリーの文字数
LOCATE3 DC 'ONJYUKU' ;3番目の場所御宿
LEN3 DC 7 ;御宿の文字数
LOCATE4 DC 'ODAIBA' ;4番目の場所お台場
LEN4 DC 6 ;お台場の文字数
NOTHING DC 'PREASE ENTER 1-4' ;1から4までを入力するようにメッセージ
LEN5 DC 16 ;その他の場合の文字数
END
TEST START
RPUSH
LAD GR2,0 ;GR2に目印の0を設定
PUSH 0,GR2 ;スタックにGR2の値を積む
LAD GR1,BEFORE ;GR1に配列BEFOREの先頭アドレスを設定
OUT BEFORE,LEN ;配列BEFOREを出力
;<<スタックに積むループPUSH>>
LOOPPUSH LD GR2,0,GR1 ;GR2に配列BEFOREのGR1が指し示す文字を読み込む
CPL GR2,=0 ;目印の0まで到達したか、GR2の文字と目印0を比較する
JZE PREPOP ;目印0まで到達したら配列AFTERの準備でPREPOPまで分岐する
PUSH 0,GR2 ;処理中の場合は読み込んだ文字をスタックに積む
LAD GR1,1,GR1 ;配列BEFOREの位置を1つ先に進めるのでGR1をインクリメントする
JUMP LOOPPUSH ;読み込みとスタックに積む処理が完了するまでLOOPPUSHを繰り返す
;配列AFTERの出力準備
PREPOP LAD GR1,AFTER ;GR1に配列AFTERのアドレスを設定
;<<スタックから取り出すループPOP>>
LOOPPOP POP GR2 ;スタックから1文字取り出してGR2に格納
CPL GR2,=0 ;文字の取り出しが最後の目印まで到達したか確認
JZE FIN ;等しい(取り出し処理が終了)場合はFINラベルへ
ST GR2,0,GR1 ;処理中ならGR2で取り出した文字をGR1を使って配列AFTERに格納
LAD GR1,1,GR1 ;配列AFTERの位置を1つ先に進めるのでGR1をインクリメントする
JUMP LOOPPOP ;出力処理が終わるまでLOOPPOPを繰り返す
FIN OUT AFTER,LEN ;配列AFTERを出力する
RPOP
RET
BEFORE DC 'KYMC'
END DC 0
AFTER DS 100
LEN DC 4
END
TEST START
RPUSH
;GR2に目印の0を設定
;スタックにGR2の値を積む
;GR1に配列BEFOREの先頭アドレスを設定
;配列BEFOREを出力
;<<スタックに積むループPUSH>>
;GR2に配列BEFOREのGR1が指し示す文字を読み込む
;目印の0まで到達したか、GR2の文字と目印0を比較する
;目印0まで到達したら配列AFTERの準備でPREPOPまで分岐する
;処理中の場合は読み込んだ文字をスタックに積む
;配列BEFOREの位置を1つ先に進めるのでGR1をインクリメントする
;読み込みとスタックに積む処理が完了するまでLOOPPUSHを繰り返す
;配列AFTERの出力準備
;GR1に配列AFTERのアドレスを設定
;<<スタックから取り出すループPOP>>
;スタックから1文字取り出してGR2に格納
;文字の取り出しが最後の目印まで到達したか確認
;等しい(取り出し処理が終了)場合はFINラベルへ
;処理中ならGR2で取り出した文字をGR1を使って配列AFTERに格納
;配列AFTERの位置を1つ先に進めるのでGR1をインクリメントする
;出力処理が終わるまでLOOPPOPを繰り返す
;配列AFTERを出力する
RPOP
RET
BEFORE DC 'KYMC'
END DC 0
AFTER DS 100
LEN DC 4
END
TEST START
RPUSH
LAD GR1,0 ;GR1に配列BEFOREの先頭の添え字0を読み込む
LAD GR2,0 ;GR2に配列AFTERの先頭の添え字0を読み込む
;<<ここからループ>>
LOOP CPL GR2,=7 ;GR2とAFTER(GOUKAKU)の文字数7文字を比較
JZE FIN ;等しかったらFINへ分岐
LD GR3,BEFORE,GR1 ;GR3に配列BEFOREの文字を1つずつ読み込む
ST GR3,AFTER,GR2 ;GR3の文字を配列AFTERに格納
LAD GR2,1,GR2 ;AFTERのGR2をインクリメント
LAD GR1,2,GR1 ;BEFOREのGR1を2つ増やす
JUMP LOOP ;LOOPへ分岐
;<<ここまでループ>>
FIN OUT AFTER,ALEN ;配列AFTERを出力
RPOP
RET
BEFORE DC 'GROGUBKCAMKYU' ;配列BEFOREを用意
AFTER DS 7 ;配列AFTERに領域7つ分を確保
ALEN DC 7 ;AFTERの文字数ALENを7文字とする
END
TEST START
RPUSH
;GR1に配列BEFOREの先頭の添え字0を読み込む
;GR2に配列AFTERの先頭の添え字0を読み込む
;<<ここからループ>>
;GR2とAFTER(GOUKAKU)の文字数7文字を比較
;等しかったらFINへ分岐
;GR3に配列BEFOREの文字を1つずつ読み込む
;GR3の文字を配列AFTERに格納
;AFTERのGR2をインクリメント
;BEFOREのGR1を2つ増やす
;LOOPへ分岐
;<<ここまでループ>>
;配列AFTERを出力
RPOP
RET
BEFORE DC 'GROGUBKCAMKYU' ;配列BEFOREを用意
AFTER DS 7 ;配列AFTERに領域7つ分を確保
ALEN DC 7 ;AFTERの文字数ALENを7文字とする
END