復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第131回]
●LF(Line Feed、コード0AH)その2
前回、LF(0AH)についていろいろ書きました。
LF(改行)というそもそもの動作から考えて、そして通常はCR(Carriage Return、コード0DH)とペアにして使うことによって、復帰改行(復改と略すこともあります)を実現することから考えて、LFはカーソルがその位置のまま1行下に移動するものと解釈していました。
たとえばカーソルが画面左端になくて、画面の途中にある場合にLFコードを画面に出力すると、カーソルは画面左端に移動しないで画面途中のポジションのまま1行下に移動する、と考えていました。
ところが前回簡単なC++プログラムを作ってテストをしてみた結果、LF(0AH)だけを画面に出力しても、カーソルは画面左端に移動するとともに改行が行なわれてしまいました。
どうやら私が考えていたLFの動作とは異なっているようです。
いろいろ調べてみますと、OSによっても相違があるらしいとのことでした。
ちょっと納得はできませんが、実際にC++プログラムでもそういう動きをすることが確かめられたわけですから、やはりLF(0AH)はその1コードだけで復帰と改行の両動作をしてしまう、と考えることにした方がよさそうです。
C++で(Cでも)普通は復帰改行をする場合に¥nを使いますが、これは0AHのことなのだ、ということにも気が付きました。
しかし私は古い人間ですから、そういうことがわかってしまっても、マシン語で復帰改行をするプログラムを書くときは、やっぱりCRLF(0D・0A)と書くことにします、というようなことを書きました。
0AHだけで復帰改行動作をしてしまうとしても、0Dはあくまで復帰だけの動作ですから、CRLFと書くことで、結果として復帰復帰改行という動作になってしまったとしても、特に支障はないと思います。
以上、前回のLFについての項はそういう内容だったのでありますが。
一晩寝ますと脳細胞がリフレッシュされまして、そのときは見えなかったものが見えてくるようになります。
今朝になりましてから、前回の、そのくだりを読んでいましたら。
その結論は、ちょっとおかしいのではないの?
ということに気がつきました。
確かにC++プログラムで試してみた結果は、LFのみで復帰改行動作をすることが確認できたわけですが。
もともとC++(もしくはC)では¥n(0AH)だけで復帰改行してしまうわけで。
それってつまり、コンパイラがそのような動作をするようなマシン語のプログラムを生成してしまう、ということではありませんか?
おおお。
そこには気が付かなかった。
それはやっぱり検証してみなければ。
どうするか?
そりゃあ、そこまできたら、やっぱりマシン語で確認してみるしかありませんでしょう。
こちらは前回作ったLFをテストするC++プログラムを、8086アセンブラ用に書き直したプログラムです。
; LF test ; ORG=100 ; MOV AH,02 MOV DL,0D INT 21 MOV DL,0A INT 21 MOV DL,61 MOV DH,06 LOOP:INT 21 INC DL DEC DH JNZ LOOP MOV DL,0A INT 21 INT 21 INT 21 MOV DL,41 INT 21 RET ; |
2012/5/26 10:2 DOSLFTST.TXT [00001] ; LF test [00002] ; [00003] ORG=100 [00004] ; [00005] 0100 B402 MOV AH,02 [00006] 0102 B20D MOV DL,0D [00007] 0104 CD21 INT 21 [00008] 0106 B20A MOV DL,0A [00009] 0108 CD21 INT 21 [00010] 010A B261 MOV DL,61 [00011] 010C B606 MOV DH,06 [00012] 010E CD21 LOOP:INT 21 [00013] 0110 FEC2 INC DL [00014] 0112 FECE DEC DH [00015] 0114 75F8 JNZ LOOP <010E> [00016] 0116 B20A MOV DL,0A [00017] 0118 CD21 INT 21 [00018] 011A CD21 INT 21 [00019] 011C CD21 INT 21 [00020] 011E B241 MOV DL,41 [00021] 0120 CD21 INT 21 [00022] 0122 C3 RET [00023] ; 0100-0122 LOOP =010E |
; BS test ; ORG=100 ; MOV AH,02 MOV DL,0D INT 21 MOV DL,0A INT 21 MOV DL,61 MOV DH,06 LOOP:INT 21 INC DL DEC DH JNZ LOOP MOV DL,08 INT 21 INT 21 INT 21 MOV DL,41 INT 21 RET ; |
2012/5/26 10:11 DOSBSTST.TXT [00001] ; BS test [00002] ; [00003] ORG=100 [00004] ; [00005] 0100 B402 MOV AH,02 [00006] 0102 B20D MOV DL,0D [00007] 0104 CD21 INT 21 [00008] 0106 B20A MOV DL,0A [00009] 0108 CD21 INT 21 [00010] 010A B261 MOV DL,61 [00011] 010C B606 MOV DH,06 [00012] 010E CD21 LOOP:INT 21 [00013] 0110 FEC2 INC DL [00014] 0112 FECE DEC DH [00015] 0114 75F8 JNZ LOOP <010E> [00016] 0116 B208 MOV DL,08 [00017] 0118 CD21 INT 21 [00018] 011A CD21 INT 21 [00019] 011C CD21 INT 21 [00020] 011E B241 MOV DL,41 [00021] 0120 CD21 INT 21 [00022] 0122 C3 RET [00023] ; 0100-0122 LOOP =010E |