一括表示

− 野ざらし言 −

[5004] VTDOS vs MS-DOS

文太 2022/09/05(Mon) 18:08
 別に無理をしてお付き合いいただくにはおよびません。
 僕は、知ーらない、派なので。困っているわけでもありませんし。

 ただ、何しろ仲間うちの人数も限られているし、こんなことを気にする人は
世間で決して多くはないので。
 VTDOSの挙動の不思議というか、不具合というか、と僕が考えている件です。

http://www.vector.co.jp/soft/dos/util/se016215.html

 このfo.comを実行してみてください。たぶん、ファイルができないと思う。

 ソースを見てみてください。変なことをしなければ(INT24Hのお世話なるというか、
お世話させてしまうというか、がなければ)ふつうにファイルが作れるはずです。
 なぜできない? ソースがバグってるとも思えないんですよね、かなり単純な
プログラムなので。
 純DOSと WinME では問題なくファイルが作れます。


----- fo.doc -----
●エラーレベルは、
ファイルオープン時   05h
引数無し時       02h
パス無し時       03h
既にファイルがあるとき 50h
INT24Hが介入したとき  00h
-------------------
 なお、これは、fo.com が出してくれるerrorlevelではなく、


-------------------------------------------------------------
	MOV	DX, OFFSET DTA+2	;ファイル名オフセット
 	XOR	CX, CX			;普通属性
	MOV	AH, 5Bh			;ファイル創製 不重複
	INT	21H
-------------------------------------------------------------
 が出す、5Bh, int 21h のエラーコードです。


 ご報告でした。
 もし僕のオペレーションミスとかだったら、ご指摘に感謝いたします。
Please accept my apology in advance. (あらかじめご容赦ください)

[5007] Re: VTDOS vs MS-DOS

konno 2022/09/05(Mon) 23:20
[5004]へのコメント
>  このfo.comを実行してみてください。たぶん、ファイルができないと思う。
>  ソースを見てみてください。変なことをしなければ(INT24Hのお世話なるというか、
> お世話させてしまうというか、がなければ)ふつうにファイルが作れるはずです。
>  なぜできない? ソースがバグってるとも思えないんですよね、かなり単純な
> プログラムなので。
>  純DOSと WinME では問題なくファイルが作れます。

確かにVTDOS ではうまく動かないみたいですね。
ソースの冒頭部分を引用すると

CODE	SEGMENT				;.COM モデルです。
	ASSUME	CS:CODE, DS:CODE, SS:CODE	
	ORG	5CH
FCB	DB	24H DUP(?)
DTA	DB	80H DUP(?)		;DTA 領域を確保
START:

ここを見ると、古いやり方なのかなぁ、と感じました。
これがあっているかはわかりませんが。

アセンブラ 〜MS-DOSの世界〜
http://programmer.main.jp/assembler2/assembler10.html

この中の
4-5. 練習問題1
4-8. ファイル作成
のソースをアレンジしてやってみました。


CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	ORG	100h

START:
	mov	bx,80h          	;↓ファイル名をASCIIZにする
	add	bl,[bx]
	inc	bx
	mov	[bx],byte ptr 0 	;↑ここまで

	mov	cx,80h          	;↓ファイル名の先頭を求める
	mov	di,81h
	mov	al,' '
	repz	scasb
	dec	di
	mov	dx,di           	;↑ここまで

	mov	ah,5Bh			;5Bh 新規ファイル作成
	xor	cx,cx
	int	21h             	;新規ファイルオープン

	mov	ax,4c00h
	int	21h             	;終了

;	ENDS
;	END	START
; 一部のコンパイラでは、
CODE	ENDS
	END	START
;と記述しなければいけないようです


これをアセンブルして、引数付きで実行すると、VTDOS で作成できました。
普通のソースなら動くようです。
FO のソースは普通(一般的)ではないのではないかと感じます。
わかってないですが。

[5008] Re^2: VTDOS vs MS-DOS

文太 2022/09/06(Tue) 01:16
[5007]へのコメント
konnoさん

 ありがとうございます。珍しくVzを縦割りにして、2つのソースを見比べてみたのですが、左側(fo.asm)のどこがいけないのかは(古いのか)、分かりませんでした。
 リストファイルも見比べました。

 ただ、「アセンブラ 〜MS-DOSの世界〜」の正統派なやり方なら、確かにきちんとアセンブルができ、fo2.comは、vtdos環境で、きちんとファイルを作ってくれました。
 正統派のやり方でいきたいと思います。

 実は、VTDOS環境で、tasm1.exe とか optasm.exe でアセンブルするとかまで色々実験しました。fo2.asm (正統派)では、まったく問題ありませんでした。ml.exe って、linker付き masm なんですね。あれ? fo2.obj はあるけど、fo2.exe がないよ、とかとか。
 こっちでいきます!

 ほんと、ありがとうございました。m(__)m 助かりました。不要な悩みは要らない。
 恥ずかしくてとても打ち明けられないような、でも嬉しい! な発見もありました。そ、そういうことなの、とか。リストファイル、じっと見つめてみるものですね。ハンドアセンブルの意味効用を知りました。

[5010] Re^2: VTDOS vs MS-DOS

としき 2022/09/06(Tue) 13:02
[5007]へのコメント http://toshiki.la.coocan.jp/
> ここを見ると、古いやり方なのかなぁ、と感じました。
> これがあっているかはわかりませんが。

古いやり方というか、もぐらさんの書き方は、コマンドラインに記載されたオプションをそのまま流用している形。一方、konnoさんの書き方は、別途確保してある(本当に?)領域にコマンドラインオプションをコピーして、そちらを使う形。
もし、この2つのやり方で結果が違うのだとしたら、VTDOSのバグ報告をしてもいいかもしれない。VTDOSのエミュレーションが不完全、という意味で。
あと、konnoさん、ほかにもMS-DOS PlayerとかDOSVAXだとかをお持ちだと思いますが、そちらのほうでもぐらさんのオリジナルは動くか、というところも気になりました。

[5017] Re^3: VTDOS vs MS-DOS

konno 2022/09/06(Tue) 22:58
[5010]へのコメント
> もし、この2つのやり方で結果が違うのだとしたら、VTDOSのバグ報告をしてもいいかもしれない。
> VTDOSのエミュレーションが不完全、という意味で。

うーん、私はもぐらさんのソースの書き方に違和感を覚えたんですよ。何かおかしい気がすると。
調べたらわかったような気がします。

> あと、konnoさん、ほかにもMS-DOS PlayerとかDOSVAXだとかをお持ちだと思いますが、
> そちらのほうでもぐらさんのオリジナルは動くか、というところも気になりました。

FO.COM やってみました。
MS-DOS Player は、実行後、1分ぐらいフリーズしてからプロンプトが戻りました。
やばい! 何かループのコードを実行してるみたい!!

結果は新規ファイルは出来たのですが、私の懸念が当たったように思いました。
私の懸念とは、MSDOS プログラマーズハンドブックを見ると

ORG 疑似命令
プログラムの開始アドレスを指定します。COMファイルは100H番地からはじめるという約束がありますから、
プログラムの先頭は必ず ORG=100 にしなければなりません。

とあります。さらに、80H からの領域を DTA の自前データ領域として指定しているようですが

(この領域を)DTAとして使うと パラメータの文字列は破壊される

と付録ページに書かれています。
つまり、モグラさんは、DOSが自動作成した領域を自分のプログラム領域として上書きしているのです。

	ORG	5CH
自前のプログラムをここからロードする、という意味になるのではないでしょうか。
自前のDTA領域も範囲がよくわからないし、変なコードで上書きされている気がします。

そこで、このソースにちょっと追加してみました。

	ORG	5CH
FCB	DB	24H DUP(?)
DTA	DB	80H DUP(?)		;DTA 領域を確保

	ORG	100H			;★これを追加

START:

これでアセンブルして実行すると、MS-DOS Player は、実行後直ぐにプロンプトが戻りました。
VTDOS はまだ駄目みたいですね。
多分、自前の FCB や DTA 領域を止めればいいのでは。

DOSVAX は、オリジナルも改変のも普通に正常処理出来ました。

[5019] Re^4: VTDOS vs MS-DOS

としき 2022/09/07(Wed) 00:32
[5017]へのコメント http://toshiki.la.coocan.jp/
> 私の懸念とは、MSDOS プログラマーズハンドブックを見ると
> (この領域を)DTAとして使うと パラメータの文字列は破壊される
> と付録ページに書かれています。

知らなかった。
というか、100H以下の部分とかコマンドラインオプションの部分を一時的なデータ領域として使うツールはかすかな記憶がありますが、そういうのも含めて、確かにどれも ORG 100H の指定はあったような気がする。なるほど。
でも、こんな付録ページまでチェックしているなんて、さすが、現役のアセンブラ使いですね。
私は手元のDOS関係の本を半ダースばかり斜め読みしてみましたが、これに関係しそうな記述には気が付きませんでした。
あ、これか。目次には確かに「折り込み付録」とある。
一番下の「*4」のところですね。

> つまり、モグラさんは、DOSが自動作成した領域を自分のプログラム領域として上書きしているのです。
> ORG 5CH
> 自前のプログラムをここからロードする、という意味になるのではないでしょうか。
> 自前のDTA領域も範囲がよくわからないし、変なコードで上書きされている気がします。

この付録の「PSPの構成」の図によると、5CH からの 24H はFCBとして確保されるようです。
そして、それに続く 80H がDTAとなる模様。
そこでもぐらさんのソースを見てみると、これらの領域はそれぞれ、FCBとかDTAとラベル付けされてメモリが確保されています。そして、その次、すなわち 100H にSTARTがあって、プログラム末には END START の記述もありますから、実行されるコードは 100H からに配置されるようになっているように見えます。
つまり、静的なプログラムとしてみてみると、メモリの配置的には、一見、全く問題が見当たらないような気がする。なのに、VTDOSではファイルが作られない。
推測するに、触ってはいけない領域、すなわちいつ壊れるかわからない領域の、実際に壊れるタイミングが、生DOSとVTDOSでは異なっているということのような気がします。そして、DOSVAXではエミュレーション精度が高いので普通にファイルが作られるけど、MS-DOS Playerの場合は、例えば、メモリを壊そうとしているタイミングと、そのメモリを読み出そうとしているタイミングがお互いにけんかして、その結果、何かがタイムアウトするまでしばらく時間がかかってしまう、とか。この辺、もはや妄想ですね。

[5020] Re^4: VTDOS vs MS-DOS

文太 2022/09/07(Wed) 00:41
[5017]へのコメント
konnoさん

 なんか変なことの巻き込んでしまったようで、申し訳ない気持ちでおります。

>私の懸念とは、MSDOS プログラマーズハンドブックを見ると

 の部分なのですが、この『MSDOS プログラマーズハンドブック』は、どこが出版元
の書籍でしょうか。
 手元にアスキーの同名書籍がありました。p.34に「ORG 擬似命令」について
書かれています。

>ORG 疑似命令
>プログラムの開始アドレスを指定します。COMファイルは100H番地からはじめるという約束がありますから、
>プログラムの先頭は必ず ORG=100 にしなければなりません。

 同内容ですが、文言が違うので、同じ書名の違う本かな、と考えています。
 著者とか出版元とかお教えいただけますでしょうか。

>とあります。さらに、80H からの領域を DTA の自前データ領域として指定しているようですが
>(この領域を)DTAとして使うと パラメータの文字列は破壊される
>と付録ページに書かれています。

 これも見つかりませんでした。いちおう索引で、PSPとDTAは調べたのですが。
 でも、本当に破壊されるのなら、もぐらさんオリジナルコードでどの環境でも、fo.comは
機能しませんよね? と考えました。
 元にもどると、(個人的に避けるべきコーディングと理解していはいるのですが)、
fo.com, 純DOSとWinMEでは機能するのです。

[5022] Re^5: VTDOS vs MS-DOS

としき 2022/09/07(Wed) 00:54
[5020]へのコメント http://toshiki.la.coocan.jp/
>  『MSDOS プログラマーズハンドブック』は、どこが出版元
>  手元にアスキーの同名書籍がありました。

この本であっているはずです。
ISBN4-87148-778-4

>  これも見つかりませんでした。

これは私も見つけるのに難儀しました。
目次の最後に「折り込み付録」とあるかと思いますが、例えば、古本屋などで入手すると、この部分が欠品になっているかもしれません。
でも、こんなところだけに、こんな重要なことを書くのはいささか以下略。

[5024] Re^6: VTDOS vs MS-DOS

文太 2022/09/07(Wed) 01:16
[5022]へのコメント
konnoさん

>この本であっているはずです。
>ISBN4-87148-778-4
 ありがとうございました。

>  これも見つかりませんでした。
>これは私も見つけるのに難儀しました。

 付録! 青い厚い紙の Programmer's Reference Card ですね。

「*4 DTAとして使うとパラメータの文字列は破壊される。」

 とある。

 ただ、この*4は、図を再度みていただけると分かると思うのですが、

DTAの構造

文字数 文字列      0Dh  この後の領域を指してますよね。


 そして、konno版 fo.com でも、同じところを書き換えてます。

 分かってない遠い記憶なのですが、「ねこさんのファンクションコール」?
DTAって破壊されるものだから、最初の状態が欲しかったら、ちゃんと自前で
保存しときなさいよ、というものなんじゃないでしょうか。

 で、fo.comの場合、DOSにロードしてもらってPSP&DTAを作って
もらってそこをfo.comが勝手にいじって、はい、お終い、でいいのじゃないのです
かね?

 ただ、org	100h は常にいると。

 明日、8冊をいちおう調べてみます。

 お付き合い、ありがとうございます。

[5023] Re^5: VTDOS vs MS-DOS

文太 2022/09/07(Wed) 00:56
[5020]へのコメント
 これから8冊の書籍にあたりますが、
org		100h
 は、なければいけないものなのだ、と以下から学びました。
 計算が合っていればいいというものではない、と。

from main.asm

;--- PSP defs. ---

		org	02h
maxseg		label	word

		org	16h
parentpsp	label	word		; ##153.39

		org	2Ch
GDATA myenvseg,	label,	word

		org	80h
GDATA cmdln,	label,	byte

		org	100h
entry:		jmps	entry1
vzversion:	db	"VZ1.60 ",0,EOF
entry1:		jmp	init
		dw	0
GDATA nm_vz,	db,	<'VZ',0,0,0,0,0,0,0>
GDATA hardware,	db,	0

		org	120h

[5026] Re^5: VTDOS vs MS-DOS

めざら 2022/09/07(Wed) 07:06
[5020]へのコメント http://mezala.la.coocan.jp/
> 『MSDOS プログラマーズハンドブック』

どうして皆さんこんなでかくて分厚くて真っ黒な本持ってるんですか?(笑)
わたしも持ってますが,腐海の奥から引っ張り出すのも厄介なので,今回は敢えて探しません。(自分の部屋は物置になってしまい,現在は入口までまでモノが積み上がっていて,マジで一歩たりとも足を踏み入れることができない。)

FGALDC で達人の誰かが推奨したのかなぁ……覚えてないや。

[5028] Re^6: VTDOS vs MS-DOS

としき 2022/09/07(Wed) 12:21
[5026]へのコメント http://toshiki.la.coocan.jp/
> どうして皆さんこんなでかくて分厚くて真っ黒な本持ってるんですか?(笑)

私の場合はわりと明確。
昔、ポケ3用のソフトを作りたくて、いくつか手当たり次第に購入。
とはいえ、この本も含め、ほとんど古書として入手、なんですけどね。
1ダースぐらいあるそれ系の書物のうち、新品で買ったのなんて、2〜3冊くらいだと思う。

[5029] 資料

文太 2022/09/07(Wed) 14:01
[5026]へのコメント
 すいません、ここに置かせてください。

------------------------------------------------------------------------------
main.asm   419: GDATA tmpbuf3,	dw,	WD*2	; DTA,smooth,&?()
std.inc     50: F_SETDTA	equ	1Ah	; Set Disk Transfer Addr
std.inc     53: F_GETDTA	equ	2Fh	; Get Disk Transfer Addr
vz.inc     744: ;--- DTA record ---

------------------------------------------------------------------------------
main.asm
;--- Read option ---
;<-- CY :error
readopt	proc
	mov	si,offset cgroup:cmdln +1

------------------------------------------------------------------------------
    The pspCommandTail field is also used as the default buffer pointed to by the
default disk transfer address (DTA). Unless a program explicitly changes the DTA,
the system uses this area as a buffer for file information returned by
Find First File (Int 21h 4Eh) and Find Next File (Int 21h 4Fh), as well as
for all FCB-type read and write operations.
(from MS, _MS-DOS Programmer's Reference_, p.96)

------------------------------------------------------------------------------
DTA
    The same 128 bytes that serve as the Command Tail Buffer also form the default
Disk Transfer Area (DTA) when a new process is created.  If the program does not
select some other DTA by using the documented DOS function to do so, all disk I/O
will use this space as a buffer.

    Naturally, this means that the command-tail information placed there by the loader
will not survive the first disk actions of the program.  If that information
will be needed later in the program, either it must be copied to some other area
before the first disk actions take place or some other DTA must be set up for
the disk to use.  Defensive programmers should do both, just to be safe.
(from Terry Dettmann, _DOS Programmer's Reference_, 2nd ed. QUE, p.862)

------------------------------------------------------------------------------
 はやい話が、壊れるからね、そこ、ということでしょう。
 どっちでもいい、という結論なのですが、"pspCommnadTail field" とか "Command Tail
Buffer" と呼ばれています。つまり、0Dhのあと。ただ、文字数、コマンド文字列も
壊されるのだろうな、と思っています。
the Command Tail Buffer also form the default Disk Transfer Area (DTA)
「DTAをなす、DTAを構成するCTB」とも言ってますから。

 過去ログで「DTA」でグレップすれば……。もういいでしょう。


------------------------------------------------------------------------------
『MS−DOSシステムコールハンドブック』 河西朝雄 著  ナツメ社

 過去ログ(PK/DC)で、こっちはものすごく多く言及されていますが、あの「分厚くて
真っ黒な本」=『MSDOS プログラマーズハンドブック』は、それほど言及されていない
ようです。河西先生の本、これ+『MS-DOS プログラミング技法』(ナツメ)、
素晴らしいです。

 僕は、これを買った日の絶望をよく覚えているのです。かなり貧しかったときに
『勝手にMS−DOS』のあとに、なぜか買ってしまった。\3500 を捨てちまったよ、
ひぇ〜、とある場所で感じた光景が今でも思い浮かびます。生協、1割引の時代。
 ほんと、分厚くて重くて真っ黒な本。使う日がくるとは……。

 皆さまのご協力(?)、ご関心に深く感謝しております。m(_B_)m

[5033] Re: 資料

konno 2022/09/07(Wed) 14:47
[5029]へのコメント
>  僕は、これを買った日の絶望をよく覚えているのです。かなり貧しかったときに
> 『勝手にMS−DOS』のあとに、なぜか買ってしまった。\3500 を捨てちまったよ、
> ひぇ〜、とある場所で感じた光景が今でも思い浮かびます。生協、1割引の時代。
>  ほんと、分厚くて重くて真っ黒な本。使う日がくるとは……。

人生の経験は、全て無駄がない、というようなことわざがあったような。
私も定価で買いましたよ、載っていたRAMディスクのソースを打ち込むために。(^^;
おかげでパソピア16の仕事で大活躍出来ました。(^^;
同じく仕事に使うために載っていたソースを打ち込むために\8000の本も。(;_;)
そのためにMASM5.1やらJ3000SLやら買ったのでした。(;_;)

そうそう、余談ですが、VZでは、5Bh の新規作成は使われていません。
ファイラーコマンドで新規作成がありますが、3Ch のファイルクリエイトが使われています。
件の黒本にも 5Bh は載っていなくて、57h までです。
DOS2.0時代の本なのですね、5Bh は、DOS3から拡張されたのでした。
VZが出た当時のPC98はDOS2.11だったのかな。
この時代に黒い本や黒い画面でテキと戦っていた我々はクロのマ術師軍団か。

#今も黒のグリモワールはどこかで開かれているかもしれない。

[5036] Re^2: 資料

文太 2022/09/07(Wed) 21:50
[5033]へのコメント
konnoさん

>私も定価で買いましたよ、載っていたRAMディスクのソースを打ち込むために。(^^;
 おお、RAMディスク。としきさんは、オアポケ EMS のために……。

>おかげでパソピア16の仕事で大活躍出来ました。(^^;
 よかったですね! 知らないけど、そのマシン。

>同じく仕事に使うために載っていたソースを打ち込むために\8000の本も。(;_;)
 打ち込むんだぁ。僕も河西先生の本から、ヘッダファイル用マクロをけっこう打ち込みましたが、比較じゃないでしょうね。根性の時代。

>そのためにMASM5.1やらJ3000SLやら買ったのでした。(;_;)
 あらら、いっぱいお買い物。
 『DOSを256倍』の本に、PCをまともに使いたかったら、60万円だせとありました。NEC 98, DOS 3ぐらいの時代の話?

>件の黒本にも 5Bh は載っていなくて、57h までです。
>DOS2.0時代の本なのですね、5Bh は、DOS3から拡張されたのでした。

 Brown's List で、DOS 3.0+ をグレップしたら、僕的に面白いのは、5Bhだけでした。

>VZが出た当時のPC98はDOS2.11だったのかな。

 XMSとかEMSとかありますが(もちろん死ぬほど大事です)、DOSの基本はver2 近辺な頃(僕がPCに触れる前)に完成してたんでしょうね。

 もちろん! 人生にムダなことなど、一つとしてありません! 高血圧や高尿酸値もか?

[5030] Re^5: VTDOS vs MS-DOS

konno 2022/09/07(Wed) 14:10
[5020]へのコメント
>  同内容ですが、文言が違うので、同じ書名の違う本かな、と考えています。
>  著者とか出版元とかお教えいただけますでしょうか。

うう、タイプが面倒でネットの文章を張り付けたのがバレたか。
#いや、まだだ、たかがモニターをやられただけだ。

>  でも、本当に破壊されるのなら、もぐらさんオリジナルコードでどの環境でも、fo.comは
> 機能しませんよね? と考えました。

破壊とは、プログラムによって改変されうる、という意味かもしれませんね。

> fo.com, 純DOSとWinMEでは機能するのです。

気になったのでソーサーで逆汗してみました。


psp_cmd_size	equ	80h			; (30F4:0080=0)
data_2e		equ	81h			; (30F4:0081=0)
data_3e		equ	82h			; (30F4:0082=0)
  
seg_a		segment	byte public
		assume	cs:seg_a, ds:seg_a
  
  
		org	100h
  
F00		proc	far
  
start:
		mov	bl,ds:psp_cmd_size	; (30F4:0080=0)
		mov	byte ptr ds:data_2e[bx],0	; (30F4:0081=0)
		mov	dx,data_3e		; (30F4:0082=0)
		xor	cx,cx			; Zero register
		mov	ah,5Bh			; '['
		int	21h			; DOS Services  ah=function 5Bh
						;  create new file, name @ ds:dx
		mov	ah,4Ch			; 'L'
		int	21h			; DOS Services  ah=function 4Ch


うーん、いいんだろうか?
この逆汗ソースには org 100h  がありますね。
バイナリをロードするときは、100H からロードするというのが大前提なのかなぁ。

このソースを見ていてずっと気になっていたのが、BX の扱いです。
冒頭で bl にサイズを入れて、次に bx をアドレスとして使っている?
bh はゼロクリアされていなければ不定のはず?

気になったので、試しに冒頭に
	xor	bx,bx			;★追加
これを追加してみました。
そうしたら、VTDOS でも新規作成出来ました。

汚れていたのは bx なんです。
org 100h は、あっても無くてもバイナリは変わらず、濡れ衣でした。
お騒がせしてすみませんでした。

純DOSでは、コマンド実行時に レジスタのクリアをやっているのかなぁ。
だとすると、VTDOSはそれをやっていない?
レジスタのクリアはDOSの仕事で、command.com はやっていないのか?
どうなんでしょう。

[5031] Re^6: VTDOS vs MS-DOS

としき 2022/09/07(Wed) 14:36
[5030]へのコメント http://toshiki.la.coocan.jp/
> 汚れていたのは bx なんです。

なるほど、そういうことだったんですね。
もっと言えば bh レジスタですね。
逆にいうと、konnoさんの#5007のソース冒頭で bx レジスタに 80h を代入している部分、ここで bl レジスタに代入していたらもぐらさんのものと同じ挙動になりそうですね。

勉強になりました。
ありがとうございました。

[5038] Re^7: VTDOS vs MS-DOS

文太 2022/09/07(Wed) 23:38
[5031]へのコメント
>逆にいうと、konnoさんの#5007のソース冒頭で bx レジスタに 80h を
>代入している部分、ここで bl レジスタに代入していたらもぐらさんのものと
>同じ挙動になりそうです

START:
	mov	bl,80h          ;↓ファイル名をASCIIZにする
	add	bl,[bx]		; 上の行、bx -> bl へ改悪


C:\0\00FO>test
2,3,5,80, all not matching!

C:\0\00FO>test
2,3,5,80, all not matching!

 test.bat の中身は、fo2 qqq.txt, 999.txt etc
ぐちゃぐちゃになります。

 としきさん、正解です。
 課題を必死にこなしております。

[5034] Re^6: VTDOS vs MS-DOS

文太 2022/09/07(Wed) 15:31
[5030]へのコメント
konnoさま m(__)m

>気になったのでソーサーで逆汗してみました。
 出た! すげえ。あれ、使えるんだ!

>汚れていたのは bx なんです。
 ついていけてます。す、すごい!

>org 100h は、あっても無くてもバイナリは変わらず、濡れ衣でした。
 了解です。m(__)m

>純DOSでは、コマンド実行時に レジスタのクリアをやっているのかなぁ。
>だとすると、VTDOSはそれをやっていない?
>レジスタのクリアはDOSの仕事で、command.com はやっていないのか?
 分からないですが、vtdosは、dos6くらいのcommand.comを必要としますよね。
 ということは、、、、。

 ありがとうございました。さすがです!

 これから血液検査。こわい、ほんと怖い。現実を直視しよう、、、。
 別に大したことではないです。2か月の不摂生の結果を見るだけですから。

[5037] Re^6: VTDOS vs MS-DOS

文太 2022/09/07(Wed) 23:02
[5030]へのコメント
や、やばい、、、

out.lst

PSP_cmd_size  equ     80h                     ; (3A25:0080=0)
PSP_cmd_tail  equ     81h                     ; (3A25:0081=0)
data_1e       equ     82h                     ; (3A25:0082=0)

seg_a         segment byte public
              assume  cs:seg_a, ds:seg_a
              org     100h
fo            proc    far
start:
              xor     bx,bx                   ; Zero register
              mov     bl,ds:PSP_cmd_size      ; (3A25:0080=0)
              mov     byte ptr ds:PSP_cmd_tail[bx],0  ; (3A25:0081=0)
              mov     dx,data_1e              ; (3A25:0082=0)
              xor     cx,cx                   ; Zero register
              mov     ah,5Bh
              int     21h                     ; DOS Services  ah=function 5Bh
                                              ;  create new file, name @ ds:dx
                                              ;   cx=file attribute bits
              mov     ah,4Ch
              int     21h                     ; DOS Services  ah=function 4Ch
                                              ;  terminate with al=return code
fo            endp
seg_a         ends
              end     start

[5044] Re^6: VTDOS vs MS-DOS

文太 2022/09/09(Fri) 22:45
[5030]へのコメント
konnoさん

 アセンブラになると確かめるスキルがなくて。スキル、低いねぇ。
 ただ、その後、考えたこと。vtdosが初期化を忘れているのではないと思います。
 debug -R でレジスタの状態をみてから(BX=0)、オリジナル fo.comをvtdosで起動しても仕事をしないのです。
 ということは、command.comか、fo.com自体が bx を汚しているのだと思う。後者が有力。しかしどうやって?

 ですが、違うところのプログラム(相当古い、IBM assemblerでアセンブルするべく書かれていると思しい)でも、「xor bh,bh」としていた。こっちが正統的な作法のように思われます。なぜ? というのがちっとも分からないのですが。

 もうちょっと考えてみて、ダメなら、最初に紹介してもらったラインで行こうと思います。
 ただ、コマンドライン引数はどう処理するか、その定石は何か、というのは、マスターしなくちゃいけないことなんですよね。丸暗記でもいいんですが。
 org 100h ですが、やっぱり書くべきなんだろう、とも思っています。安全第一。

[5045] Re^7: VTDOS vs MS-DOS

konno 2022/09/09(Fri) 23:52
[5044]へのコメント
>  ただ、その後、考えたこと。vtdosが初期化を忘れているのではないと思います。
>  debug -R でレジスタの状態をみてから(BX=0)、オリジナル fo.comをvtdosで起動しても仕事をしないのです。

なるほど、目の付け所がいいですね。
ということは、fo.comをvtdosで起動するプログラムの中で BX が使われているのでしょう。

>  ということは、command.comか、fo.com自体が bx を汚しているのだと思う。後者が有力。しかしどうやって?

先の実験で、純DOSの MSDOS6.2 では BX を 初期化していると思われます。
同じ fo.com を使っているので、fo.com もシロだと思います。
そして、command.com も、コマンドの一つだということ。
コマンドやプログラムをメモリにロードして実行させているのは、DOS システムだということになります。

ということは、BX を汚しているのは、VTDOS だということになります。
レジスタを初期化しないまま使うプログラムは手抜きか行儀が悪いか、うっかりか。
それでも純DOSの時代は問題なかったから、わざと手抜きしていた可能性もありますね。

でもエミュレータを作る時は、基本のルールに則って作るので、ルール違反は想定外だった。
という可能性がありますね。
この事例は私の掲示板でも告知して注意喚起したほうがよさそうです。

>  ですが、違うところのプログラム(相当古い、IBM assemblerでアセンブルするべく書かれていると思しい)でも、「xor bh,bh」としていた。こっちが正統的な作法のように思われます。なぜ? というのがちっとも分からないのですが。

プログラムを作成するということは、ルールに則って作成するべきです。
手抜きプログラムは自分一人だけで使うならいいですが、公開するのは問題がありますね。

#ああ、なぜか耳が痛くなってきた。(^^;;

[5046] Re^8: VTDOS vs MS-DOS

文太 2022/09/10(Sat) 00:29
[5045]へのコメント
konnoさん

 ありがとうございます。
 でも、待てよ、ほぼ同じcommnad.comを使っているDOS6では、それはおきないんだぞ、
と元に戻っていました。
 command.comもプログラムの1つにしかすぎない。その裏には、かならずmsdos.sysが
いる(代わりがvtdosなわけですね)。MS-DOSシステム。

 とにかく納得です。
 自分で使うだけなら何してもいいけど、公開するなら、ルールに沿ってプログラムは
作成すべき。了解です。

 関係ないのですが、「_」の普通キー化、重宝しています。_Undocumented DOS_ なんて
場面で。いちおうこれが書名を示す正しい表記の仕方で(アンダーラインの意味。書籍
ではイタリクス表記)、"Undocumented DOS" とかは邪道なのです。日本語では、書名は
『Undocumented DOS』と二重括弧になります。
 ルールは知っていたのですが(板書して教えていたりします)、シフトが面倒で、ずっとさぼっていました。多謝です。

 さらに関係ないですが、Win11でも、vtdosいけそうですね。see vtdos keijiban if you haven't gotten this news. shadowさんも相変わらずがんばってる! みんな年だけど。

 ま、耳についてはお忘れください。いいの、いいの。

[5048] MS-DOS Player の変

konno 2022/09/10(Sat) 22:36
[5017]へのコメント
> FO.COM やってみました。
> MS-DOS Player は、実行後、1分ぐらいフリーズしてからプロンプトが戻りました。
> やばい! 何かループのコードを実行してるみたい!!

MS-DOS Player は、いつの間にかおかしくなっていました。
VMAP でも実行後、1分ぐらいフリーズしてからプロンプトが戻りました。
前の版に差し替えたり、PIF を作り直したり色々やってみましたが変わりません。
もしかしたら Windowsの更新でおかしくなったのかなぁ。

原因がわからないので、一人で悩んでいましたが、やっと原因がわかりました。
SET で見ると、
COMSPEC=c:\COMMAND.COM
と出ます。
# そこに私はいません♪

実際には、バッチにもアイコンのプロパティのリンクにも
COMSPEC=C:\UT\P\COMMAND.COM
と書いていて、今まではそれで動いていたのです。
やっぱり Windowsの更新でおかしくなったのかなぁ。

VZのコピーでは C:\ にコピー出来ないので、エクスプローラーでコピーしたら
正常に動作するようになったようです。
FO.COM も、正常に実行できました。

これも一応うちの掲示板で告知した方がいいかな。

[5049] Re: MS-DOS Player の変

めざら 2022/09/12(Mon) 10:21
[5048]へのコメント http://mezala.la.coocan.jp/
> SET で見ると、
> COMSPEC=c:\COMMAND.COM

この設定を変更することはできないのですか?
(自分で確かめろって話なのですが……)

command.com を探すのに異様な時間がかかるって,そもそも変ですね.
あ,だから「変」なのか……

Windowsあるあるですが,いくつもファイルがないようなフォルダでインデックスをいちいち更新して,ファイルの検索に時間をかけないためのインデックスなのに逆効果になっているとかありますからねぇ.これは関係ないか……

> # そこに私はいません♪

なんかぶっこんでくる癖がついてますね(笑).
すごい好き.

[5051] Re^2: MS-DOS Player の変

konno 2022/09/12(Mon) 23:11
[5049]へのコメント
> > COMSPEC=c:\COMMAND.COM
> この設定を変更することはできないのですか?
> (自分で確かめろって話なのですが……)

そのためにバッチやアイコンのプロパティのリンクで設定していたのです。
私は色々なvz環境を使い分けるため、command.com もあちこちに置きたいのです。
それがある日突然効かなくなったのは、21H2 の更新のせいではないかと疑っています。

システムの環境変数を見ると
C:\Windows\system32\cmd.exe
こうなっていました。それが MS-DOS Player 起動中は
COMSPEC=C:\COMMAND.COM
PATH=C
おや? PATH も変ですね。これはバッチで変えられるのですが。

> command.com を探すのに異様な時間がかかるって,そもそも変ですね.
> あ,だから「変」なのか……

command.com が見つからないと、多分内蔵CUIで処理すると思うんですが
VMAP で異様に時間がかかるのは謎です。
ソーサーも動きませんでしたし。

> Windowsあるあるですが,いくつもファイルがないようなフォルダでインデックスをいちいち更新して,ファイルの検索に時間をかけないためのインデックスなのに逆効果になっているとかありますからねぇ.これは関係ないか……

今までこういう現象にあったことは無いので多分関係ないかと。

> なんかぶっこんでくる癖がついてますね(笑).
> すごい好き.

喜んでいただけたようで嬉しいです。(^_^)
おやじギャグ的なものは昔から好きで、死んでも治らない口かと。(^^;

[5009] Re: VTDOS vs MS-DOS

としき 2022/09/06(Tue) 12:51
[5004]へのコメント http://toshiki.la.coocan.jp/
>  このfo.comを実行してみてください。たぶん、ファイルができないと思う。

そのときのエラーレベルはいくつでしたか?

> ----- fo.doc -----
> ●エラーレベルは、
> ファイルオープン時   05h
> 引数無し時       02h
> パス無し時       03h
> 既にファイルがあるとき 50h
> INT24Hが介入したとき  00h
> -------------------

微妙に変な仕様。
ファイルを作成して正常終了したときの値が明記されていないのは、いわゆる仕様の考慮漏れというか仕様ミスというか仕様のバグというか。どっかのテキストエディタでも編集可能な最長の論理長が明記されていなかったりするので、よくあるといえばよくある話。そして実際のところ、一般に正常終了した場合、エラーレベルにはゼロを返すのがお作法。
一方で、INT24Hって、普通はあんまり考えないんですけどね。
私の作ったフリーウェアでエラーレベルを返すツールでも、INT24Hなんて考えたことも無い。
そして、INT24Hが介入するって、どういうときなんだろう。
FDDにメディアが入っていないとき、かなぁ。
もぐらさん、動作チェックぐらいしているはずですが、どうやってチェックしたのだろう。理屈ではこうなる、ということで、何もチェックしないでドキュメントに記載する、というのは、たまに聞く話ですが、ある意味で誠実だったもぐらさんがそういうことをするのは考えにくい。

>  なお、これは、fo.com が出してくれるerrorlevelではなく、

それはおかしい。
もぐらさん作成のほかのツールでもエラーレベルを返すものは多かったはずなので、このツールのドキュメントに明記してある以上、このツールが出してくれるエラーレベルだと考えたほうがいいと思う。もちろん、私の考えが外れている可能性も高いので、このツールが出してくれるエラーレベルではないと文太さんが考えた理由を教えていただけるとありがたい。

それから、konnoさんのほうでプログラムの体裁による試験結果があがっていますが、もうひとつ、再確認というか別の角度からの試験として思いついたことが一つ。確か、ファイル作製に関する、違うファンクションというのがあったかと思います。3BHだったか3DHだったか、もはや覚えていませんが。そちらのファンクションを使っても、konnoさんおっしゃるところの「古いやり方」だとファイルが作れないかどうか、というところも気になります。あと、個人的に気になるところとしては、元は.COMモデルですが、.EXEなら大丈夫か、という点もチェックしてみたい。しないけど。

[5011] Re^2: VTDOS vs MS-DOS

文太 2022/09/06(Tue) 15:44
[5009]へのコメント
としきさん

 すいませんが、さくっと。

 「古い」に関して、僕には何とも。

-----------------------------------------------
	ORG	5CH
FCB	DB	24H DUP(?)
DTA	DB	80H DUP(?)		;DTA 領域を確保
-----------------------------------------------
 これがそう感じさせるのだとしたら、これは、もぐらさんの癖です、としか。
 いつもコピーです。
 でも、FCBを使わなくてはならない場合というのも、あるにはありましたよね?
 間違っているかもしれないけど。

;konno wrote:
START:
	mov	bx,80h          	;↓ファイル名をASCIIZにする

;mogura wrote:
START:
	MOV	BL, DTA 		;DTA+1以降データ数=文字数+1

>一方、konnoさんの書き方は、別途確保してある(本当に?)
 「別途確保」はしていません。僕からすると、上は同じことをしているように思える
のですが、16進コードは違いました。ですから、はい、もうそれやりません、と
なっています。もうちょっと実験したいのだけど。分かりやすいから。
 「別途確保」でなく、DTA をじかに書き直しています。行儀悪そうだと思ったけど、
どうせ瞬時に消えるのだからいいじゃん、と思っています。

>VTDOSのエミュレーションが不完全、という意味で。
 なんてことを最初おもったのですが、報告して直る予定はあるでしょうか。「そんなソースが
悪い」となりそうな気もする……。vz.comとvtdos.exeは、似ている。
 「そっち行かないほうがいいよ」マークだけが大事。

>そして、INT24Hが介入するって、どういうときなんだろう。
>FDDにメディアが入っていないとき、かなぁ。
 あとは、CDロムドライブに書こうとしたとか?

----------------------------------------------------------
@int24h 					◇★
F_その他の割込
 int24h 重大エラーの抜出しアドレス
  標準入出力ハードエラー発生時等,DOS は重大エラーフラグ
  を立て,このファンクションのエントリアドレス(PSP:12h 
  にコピー)に制御を渡す。int24h は以下を受け,AL に動作
  コードを返し,IRET し DOS のエラールーチンに戻す。
  DOS が発行するもので,ユーザーが直接呼んではいけない。
----------------------------------------------------------
 こんな感じ。

>>  なお、これは、fo.com が出してくれるerrorlevelではなく、
>それはおかしい。
>もぐらさん作成のほかのツールでもエラーレベルを返すものは多かったはずなので、
 よくご存知で。はい、僕も(不注意にも)最初そのコードが入っているとばかり……。
 だから、バッチで使える「errorlevelでない」と書いたのです。あのfo.docを読んだら、
そう勘違いしても仕方ないかもしれないから。

>エラーレベルではないと文太さんが考えた理由
 ソースにそのコードがないからです。ちゃんとバッチで使えるerrorlevelを入れる場合、
最終処理で、al に番号を入れるものなのです。すると、

	mov	EL, 0ffh		;エラーレベル255
	mov	al, EL
	mov	ah, 4ch			;終了
	int	21h

 のような具合。これは、別のもぐらさんツールのソースです。
 繰り返しになりますが、前に書いたとおり、fo.docに書いてある「エラーコード」と
いうのは、5Bh, int 21h のエラーコードです。これを外に出すコードを入れないと
取り出せません。それはやりませんでした。上みたいなのを加えればいいのだけど。

>ファイル作製に関する、違うファンクションというのがあったかと思います。
>3BHだったか3DHだったか、もはや覚えていませんが。そちらのファンクションを
>使っても、konnoさんおっしゃるところの「古いやり方」だとファイルが作れないか
>どうか、というところ

mogura wrote:
MOV	AH, 5Bh			;ファイル創製 不重複

>> int21_3Ch ハンドルで作成  F_CREATE
>> ハンドルを作成してファイルをオープン。
  同名ファイルがない場合は新規作成するが,すでにある場合
  はそのファイルの大きさを 0 にする。 ◆<===
  (int21_5Bh ではエラーが返る)    ◆<===
  返り値 NC-->AX = ファイルハンドル番号
         (05h 以後が返る)
      CY-->AX = エラーコード
            03h,04h,05h

 あ、これが「古い」という理由?
 そして、ありがたいことに、「不重複」の意味が分かりました。
 いちおう、こっちでもやってみますね。問題は、konnoさんご指摘のとおり、前半部分
だと思うけど。
 うーん、なかなか深いものですねぇ。「違うファンクション」ヒットです。でも、もぐら
さんにも狙いがありました。

 もぐらさん、やっぱり色々と模索・格闘してましたよ。fo.docとか読んでみて。いろいろ
試行錯誤してたんだなぁ、と。今回は、ファイルを小さくすることに執念を燃やしていたの
でしょう。

[5012] Re^3: VTDOS vs MS-DOS

としき 2022/09/06(Tue) 17:28
[5011]へのコメント http://toshiki.la.coocan.jp/
とりあえず、fo008.lzhダウンロードしてみました。

>  すいませんが、さくっと。

みんな、そんなモンですよ。
私だって、先日から「ざっくり」を多発していますし。


>  「別途確保」でなく、DTA をじかに書き直しています。

そのとおりですね。
repz scasbを何かのストリング命令と間違えたようです。
焼きが回っています。今に始まったことではありませんが。

> >エラーレベルではないと文太さんが考えた理由
>  ソースにそのコードがないからです。

おや?
ソースを読みましたが、確かに明記はしていません。
でも、暗黙のうちにエラーレベルは返しています。
ahレジスタに 5bh を入れて int21h を呼ぶと、alレジスタにエラーレベルを返します。
そして、alレジスタの値を書き換えないままahレジスタに4chを入れてint21hを呼んでプログラムを終了させていますから、それはすなわち、ファンクション 5bh のエラーコードがそのままエラーレベルとして帰ってくるはずです。
これが例えば、konnoさんのソースのように、axレジスタに 4c00h を入れてint21hを呼べば、エラーレベルは常にゼロ、ということになるはず。
試しに、バッチファイルを書いてみてください。
きちんとエラーレベルが帰ってくるのがわかるはず。
なので、

>  繰り返しになりますが、前に書いたとおり、fo.docに書いてある「エラーコード」と
> いうのは、5Bh, int 21h のエラーコードです。これを外に出すコードを入れないと
> 取り出せません。

この記述はものすごく正しいと思います。というか、この上なく正しいと思います。
ただ、もぐらさんのソースには、エラーコードをエラーレベルとして外に出すコードがしっかり書かれている、と私は認識しています。

>  あ、これが「古い」という理由?

たぶん、違うと思う。
これ、konnoさんのおっしゃる「ソースの冒頭部分」と関係ない。と、思う。

[5013] Re^4: VTDOS vs MS-DOS

文太 2022/09/06(Tue) 18:58
[5012]へのコメント
としきさん

 ありがとうございます。さくっと2。
 ちょっと色々やって悶々としていました。地雷だらけだから、DOSに行って
おりました。

>おや?
>ソースを読みましたが、確かに明記はしていません。
 はいいいい! これに気づきました。なのに、うまくいかん。
 ちょっと待ってね。

>試しに、バッチファイルを書いてみてください。
>きちんとエラーレベルが帰ってくるのがわかるはず。
>なので、
 これが、あれぇ??? ということになっているのです。
 ちょっと待ってね。

>ただ、もぐらさんのソースには、エラーコードをエラーレベルとして
>外に出すコードがしっかり書かれている、と私は認識しています。
 はい!

>たぶん、違うと思う。
>これ、konnoさんのおっしゃる「ソースの冒頭部分」と関係ない。と、思う。

 ふーん???

[5014] Re^5: VTDOS vs MS-DOS

文太 2022/09/06(Tue) 20:07
[5013]へのコメント
としきさん

 リクエストにはだいたいお応えしました。最初、サクサクだったのに……。
 ただ、エラーコード&バッチで、七転八倒。七転バッチですよ。

-----------------------------------
C:\0\00FO>fo2.exe t1.txt		;konno版, exe @vtdos
					;できるのね
C:\0\00FO>dir t1.txt
2022/09/06  16:30                 0 t1.txt  <-- file created
-----------------------------------

-----------------------------------
C:\0\00FO>fo.exe t2.txt			;mogura版, exe @vtdos

C:\0\00FO>dir t2.txt
ファイルが見つかりません
-----------------------------------

-----------------------------------
C:\0\00FO>fo.com t3.txt			;mogura版, com

C:\0\00FO>dir t3.txt
ファイルが見つかりません
-----------------------------------

-----------------------------------
C:\0\00FO>fo3.exe t4.txt		;toshiki版(3Ch), exe
					;5Bh -> 3Ch @vtdos
C:\0\00FO>dir t4.txt
ファイルが見つかりません
-----------------------------------

-----------------------------------
C:\0\00FO>fo3.com t5.txt		;toshiki版(3Ch), com
					; @vtdos
C:\0\00FO>dir t5.txt
ファイルが見つかりません
-----------------------------------

-----------------------------------
C:\0\FOX>fo f3.txt			;sucess as expected
					; @ dos6
C:\0\FOX>dir f3.txt
F3       TXT             0 22-09-06   19:37	;長い時間やっとるのぉ?
-----------------------------------

-----------------------------------
C:\0\FOX>fo3 f4.txt			;toshiki版 @ dos6

C:\0\FOX>dir f4.txt
F4       TXT             0 22-09-06   19:41
-----------------------------------


 バッチでエラーコードは拾えない……。@DOS
 ぜったい俺がいけないんだ、と思いつつ、ヘルプ! プリーズ。

----- test.bat -----
fo a:\f2.txt		;わざとFD空ドライブのファイル。
			;fo.com は、むぐら版のオリジナル
if errorlevel 2	 echo No Arg	;いつも先頭が出てしまう。
goto END

if errorlevel 3	 echo No Path			;これも出ない
goto END

if errorlevel 80 echo File Already Exists	;これも出ない
goto END

if errorlevel 0 echo Int 24h			;これも出ない
goto END

if errorlevel 5	 echo File Creation Success	;最初先頭にあって
						;こればかり出ていた。
:END
--------------------
 このバッチの何がいけないと言うのだ?
 としきさんにこんなことを伝えるのはなんですが、errorlevel, Winとか
で、いろいろありますので、罠にはまらないでね。%errorlevel% とかやると
罠だらけ。
 この書き方で、いいはずなんだけどなぁ。もちろん、僕はもぐらさんを
疑ってません。コードみて、自分で気づいたもの。変数に入れる必要
ないじゃん、と。
 でも、なんで、これはダメなの?

[5016] Re^6: VTDOS vs MS-DOS

文太 2022/09/06(Tue) 22:51
[5014]へのコメント
ぐすん、なんでこんなに嵌ってるんだぁ!

以下のように純DOSではちゃんとエラーが返りました。

=== Macrotmp by B ===;
ファイルオープン時   05h
引数無し時       02h
パス無し時       03h
既にファイルがあるとき 50h
INT24Hが介入したとき  00h

* M
50 ^^ "Macrotmp"

;	p="c:\z.txt",	;5 correct
;	p="c:\z.txt",	;50 correct (2nd try)
;	p="  ",		;2 corrct
;	p="a:\z.txt",	;空Aドライブ、$FFFF == 0 ??? -1
	p="q:\z.txt",	;not such drive, 3 correct
	&Sh(pa,p)
	dx=pa, cx-, ax$5B00, &i($21)
	&m("%x",ax)

*


VTDOSへやってきました。

=== Mac by B ===;

* M
50 ^^ "Macrotmp"

;	p="c:\z.txt",	;5 correct		順番に ; を外して
;	p="c:\z.txt",	;50 correct (2nd try)	再カスタマイズです。
;	p="  ",		;3 ???			VTDOS に不具合ありと思いますが、
;	p="a:\z.txt",	;空Aドライブ、1 ???	それ以前だと思う。バッチ!
	p="q:\z.txt",	;not such drive, 3 correct
	&Sh(pa,p)
	dx=pa, cx-, ax$5B00, &i($21)
	&m("%x",ax)

*

[5021] Re^6: VTDOS vs MS-DOS

としき 2022/09/07(Wed) 00:45
[5014]へのコメント http://toshiki.la.coocan.jp/
>  このバッチの何がいけないと言うのだ?

あ〜、バッチファイルの技術も失われた技術になりつつあるようだ。
WindowsのCMD.EXEのコマンドプロンプトで

 >help if

と打ってみましょう。ずらずらと出てきますが、わりと最初のほうで

  ERRORLEVEL 番号   最後のプログラムの実行で指定された番号以上の終了コード
                    が返されたときに、条件が真になるように指定します。

と表示されます。ここで、私のような昔からのバッチ使いでもたまに忘れること
なんですが、さすがMS、きちんと、でもさりげなく明記してあることがあります。
それは

「指定された番号 *以上* の終了コード」

ということ。すなわち、ここでの比較は、イコールではないのです。
これを踏まえてバッチを書くと

f.bat >-----------------------------------------------------------------
@echo off
fo a:f.txt
rem ↑ここはc:\f.txtとか任意に

if errorlevel 6 goto f
if errorlevel 5 goto e
if errorlevel 4 goto d
if errorlevel 3 goto c
if errorlevel 2 goto b
if errorlevel 1 goto a

echo "level0"
goto end

:f
echo "level6 and over"
goto end

:e
echo "level5"
goto end

:d
echo "level4"
goto end

:c
echo "level3"
goto end

:b
echo "level2"
goto end

:a
echo "level1"
goto end


:end
echo end
f.bat >-----------------------------------------------------------------

こんな感じでしょうか。
 

[5025] Re^7: VTDOS vs MS-DOS

文太 2022/09/07(Wed) 01:19
[5021]へのコメント
としきさん

>あ〜、バッチファイルの技術も失われた技術になりつつあるようだ。
 あ、あ、あ、ありがとうございます。
 僕のばあい、もともとちゃんと習得された技術ではなかったので、
失われてすらいませんが、多謝です。

>「指定された番号 *以上* の終了コード」
 ほんとだ。cmdのヘルプは見づらかったので、DOS 6 helpで。おお、
そのとおり。

 ありがとうございました。
 すごく助かりました。

[5035] echo との戦い

文太 2022/09/07(Wed) 21:04
[5021]へのコメント
 できましたよぉ! この echo って奴、、、。
 結論からいうと、#5016 で指摘した、vtdosの出口でのXXXも再現されます。

----- test.bat -----
@echo off

rem ファイルオープン時   05h
rem 引数無し時       02h
rem パス無し時       03h
rem 既にファイルがあるとき 50h

rem 以下を書き換える。以下の場合、VTDOS NG, DOS6 OK.
rem 以下の fo.com には、konnoさん発見の xor bx,bx を挿入済み

fo   

if errorlevel 80 goto A
if errorlevel 5	 goto B
if errorlevel 3	 goto C
if errorlevel 2	 goto D

@echo on
@echo 2,3,5,80, all not matching!

goto END

:A
@echo on
@echo File Already Exists

@echo off
goto END

:B
@echo on
@echo File Created

@echo off
goto END

:C
@echo on
@echo File Path Wrong

@echo off
goto END

:D
@echo on
@echo No Argument

@echo off

:END

[5039] Re: VTDOS vs MS-DOS

文太 2022/09/08(Thu) 10:46
[5004]へのコメント
Undocumented DOS

 いちおうメモ的につぶやいておきます。

 ファンクションコールのことです。ナツメ・河西先生『システムコールハンドブック』には「約90種類ぐらいある」(Int 21の話です)と書かれていて、実際、pp. 13-16 には、83種がリストアップされている。
 十分だし、使わない、使えないもの多数だと思うのですが。
 (ネットワーク系のことはおいておいて下さい。僕は純DOS派で、そっちはWindowsに任せることにしているので。)


 ただ、たまたまインターネットで_Undocumented DOS_のテキストをチラ見してしまい、ああ、そうか、と。

 ナツメ本を見ても、抜けあるんですよね。もちろん、そもそも「5Bh」というのが新しめのファンクションだと教えてもらったから、こんなことが気になった、というか、少しだけ注意を引かれたというだけのことです。

 で、その抜けを埋めるべく、徹底調査したのが、_Undocumented DOS_というわけです。

 「L:ドライブを止めたい」=CDロム・ドライブないからね、とDOSに教えたい。この要望にこたえるべく、色々やったがダメだった。
 なんと、INT 21h Function 52h = DRVOFF なんて、undocumented function があるのか! IBMもMSも、どこにも書いてないじゃないか。云々というイントロでした。うまいつかみですよね。

 そっかぁ、確かに抜けてるな、前にヌケを赤でマークしてるぞ、なんてことがありました。

 もしかしたら、前にも同じ経験をして、同じことを書いたことがあるかもしれません。自信がなくなってきた。5度目の「そうか、俺はポインターがついに分かったぞ」体験かもしれません。

 まあ難しいところですが、万が一、_Undocumented DOS_ にインターネットで出会ったら、pdfのほうが圧倒的に良いです。テキストファイルで、「何? この文字化け?」」というところは、元書籍のオーナーが赤でアンダーラインしてました。pdfなら十分読めます。僕は紙が好きですが。すいません、英語です。

[5040] Re^2: VTDOS vs MS-DOS

めざら 2022/09/08(Thu) 21:47
[5039]へのコメント http://mezala.la.coocan.jp/
> INT 21h Function 52h = DRVOFF なんて、undocumented function があるのか!

日本語版のp602に「SysVars または List of Lists」という節があって,そこでは次のように述べられています。
====
ポインタと変数群はDOSカーネルのデータセグメントの先頭近くに置かれ…略…その構造体はSysInitと呼ばれるDOSの初期化コードで構築される…略…SysVarsは,INT 21h AH=52h によってES:BXにそれを指すポインタが返される。
====

でも,DRVOFF って付録の長大な各フォーマットの説明を見ても出てきませんけどね。原書には書いてあるのかな……

それにしても,これらの構造体ってバージョンによって様々なので,どうやって使うのかなぁ(?_?)

[5041] Re^3: VTDOS vs MS-DOS

文太 2022/09/08(Thu) 23:45
[5040]へのコメント
(以下、修正しています)

めざらさん

 わざわざ腐海の中から日本語版を探してきてくださり、ありがとうございます。
 こちらも腐海にダイブし、英語版が2冊(版が違う)あることを発見しました。新しい方らしい「COVERS DOS5.0」との宣伝文句のある、1990年版を持ってきました。pdfで読んだのは、きっと前の版のものでしょう。
 (原書初版、1990。第2版、1994。pdfもここで僕が持ってきているのも、初版です。以下で「イントロは同じ」と書いてますが、同じ版を読んでいるのだから、イントロが違うはずがないのです。違う版を読んでいるつもりだったんですね)

 イントロは同じ。4パラグラフ目に記述があります。
 ちょっと書き方をさぼりまして、このファンクションが DRVOFF と呼ばれているわけではなく、このファンクションを使ったら簡単にできたアプリの名前のようです。第4章にそれについての詳細がある、と書かれています。

>でも,DRVOFF って付録の長大な各フォーマットの説明を見ても出てきませんけどね。原書には書いてあるのかな……
 see 「序章:イントロ」かな? 長くないですよ。これは翻訳時に省略、割愛はしないと思う。

>それにしても,これらの構造体ってバージョンによって様々なので,どうやって使うのかなぁ(?_?)

 ちら読みですが、序章(Chapter 1, 第一章の前まで)をざっと読みました。当然、構造体ってバージョンによって様々ではあるようです。ただ、ある種の構造体はもう動かせない、自分たちも使いまくっている(CodeView, WorkBench etc etc)、ボーランドもロータスも使っている。だから、undocumented feature (function) の「ある種のものは」大丈夫。documented function よりundocumented function を使うべきである場合すらある。このように、著者は力説されております。
 序章は面白いです。ちゃんとここに、「素人が読んで面白いのは、(たしか)1章と4章だけだからね」と書いてあった。

 常駐する(stay resident)が、この時代(dos3とかですよ)、これほどの秘密技だったとは。VzとかVWXとか常駐するのが当たり前じゃないですか。すごい実験があったんだろうな、と想像しました。

 ただ当時幸運だったのは、そのころ日本がまだ先進国であるうえ、巨大なマーケットであり、MSに西さんだっけ? がいたことでしょう。だから「漢字サポート」がそんなに(ある意味)当たり前だったんだ、とか考えています。2バイトをPCで扱うのは、もうのっけから文字コードですから、大変(NECのロムの話でなく、本体MS-DOS にkanji なんとかが入っていたのです、かなり早い時期に)。
 でも、NECだ、FM-Townsだ、IBMだ、Dos/Vだ、J3100 etc etc ....。c.mosさんも大変だったろうけど、移植された方々もすごい人たちだったんですね。Vz ver1.01 の頃って、(調べてませんよ)、key, disp あたりは、NEC 決めうちだったんでしょうね。

 立ち読みですが、1986年刊の_Peter Norton's Assembly Language Book for the IBMPC_も眺めました。ビット、バイト、ワード、10進数、16進数、2進数から解説し始めている。最後には、IBM assembler と MASM ver4 の違いが書いてある。セグメント管理関係なので、ちょっと興味を惹かれました。1986年には、PCが一気に大衆化したんだろうなぁ、と遠い目になりました。この本、きっとすげえ売れたんですよ。きっとほぼ併走するかたちで、若きc.mosさんもガシガシしてたんだろうなぁ、とか。
 この本には、コードを入れたディスクが付いていたようですが、著者は読者がこれらを打ち込むことを前提にしています。そうやって覚えるものなんだろな、なんて思いました。

[5042] Undocumented DOS, 2nd ed.

文太 2022/09/09(Fri) 14:47
[5040]へのコメント
めざらさん

 すいません、これじゃ、話は通じないでしょうね。
 すいません、僕がpdfと書籍で見たのは、1990年版でした。
 こちらは分かりませんが、きっとめざらさんがお持ちの翻訳版は、第2版(全面改訂版)なのではないでしょうか。(注1、see below)背表紙の汚れ方が、手元の第2版のほうがひどくて……。

 第2版は1994年刊行で、Windows95 (Chicago)を視野に入れていますね(この時点で未発売)。
 序文その他も全面改訂されている、と「序文」にありました。「別の本である」と。(注2)
 キャッチーなイントロが捨てられたか、どっかに移動させられたのかはまだ分かっていません。
(間)
 そこそこ内容に即して1994年版で DRVOFF を探しましたが、削除かな、と思っています。
 第2版、難しすぎです。原書では、字も小さく紙も薄い……。初版のほうが楽しいです……。すいませんでした。興味がおありでしたら、インターネットを探してみてください。pdfでは字のサイズも紙の厚さも関係ありませんが。あ、すいません再び、英語です。

------
(注1)
【第2版】
https://www.kinokuniya.co.jp/f/dsg-01-9784890526291
内容説明
第1章 非公開のDOS機能
第2章 公開DOSと非公開DOSを使ったプログラミング
第3章 非公開DOSとWindowsの遭遇

原書
Chapter 1 --- Undocumented DOS: The Madness Continues
Chapter 2 --- Programming for Documented and Undocumented DOS: A Comparison
Chapter 3 --- Undocumented DOS Meets Windows

 (要らないのでしょうが、僕はこの英語のお茶目なスタイルがかなり気に入っているのですが……)

第1章 非公開のDOS機能:狂気は続く
第2章 公開DOSと非公開DOSを使ったプログラミング:ある比較
第3章 非公開DOSとWindowsの遭遇

第3章 非公開DOS機能がWindowsと出会うとき

 しかしこの本が翻訳されていたとは……。さすが翻訳大国。

------
(注2)
Preface

This second edition of _Undocumented DOS_ is radically different from the first edition, which appeared three years ago.

 3年間で、この本を書いちゃうんだ。アメリカ人のエネルギーというか、IT界のスピード感というか……。
 ファーストフードを、がしがし食うわけだよなぁ。

[5043] 五月雨(さみだれ)

文太 2022/09/09(Fri) 22:34
[5040]へのコメント
めざらさん

 ごく簡単に。第2版のPreface(序文)に、「これのどれか、使いものになるの?」"Is Any of This Useful"という節があると思います。始めから3つ目の節。ここに DRVSET の話があります。「これに関する詳細は、8章で」とも。
 この話です。僕が最初に書いた DRVOFF の話のもっと細かい話が、この DRVSET の話へと変化(進化)していました。へぇ、ロータスにお勤めだったんだ? 初版にはそれは書かれていなかった。

 第2版は、Windowsへの関心がとても強いようですね。DOS6のダブルスペースとか。初版のほうが面白いかも。

[5047] 腐海に戻す前に

文太 2022/09/10(Sat) 01:22
[5043]へのコメント
 _Undocumented DOS_(面白い本です、ほんとに)を腐海に戻す前に、ちょっとだけメモっておきます。

 原書英語版での話ですが、初版は、総 694 ページ。第2版は、856 ページです。そして、第2版は、字が小さい。
 原稿量は、2倍くらいになっている。電話帳か、と思う。

 WinMEにこだわっている僕が、Win 3.1 とか Win95 のような、Win9x にもうちょっと興味があれば、第2版に強く惹かれたのかもしれません。でも、FAT32とFAT16 について、勝手にやってくれてありがとう、フロッピーってほんと遅いよね、大きなHD,早いSSD、万歳! な人なので、ダブルスペースのついて詳述されても……。
 command.com の話は面白そうですが。

 で、書いておきたかったのは、初版の内容はほとんど第2版に取り込まれている、間違いは訂正されている、ということです。だるいかもしれませんが(法律がらみの話もある)、第2版の翻訳書でも、ところによっては、かなり興奮する場面に出会えるのではないかと思う、ということ。常駐とか。

 で、さらに元の戻って。DOSは DISK operating system です。ディスクをどう管理するか。FAT, FAT32, NTFS, 次なんだっけ? なのですが、これはある程度イメージできるようになっとくしかない、と思っています。
 前に、これ、面白いかも、と立ち読みしていた、_Peter Norton's Assembly Language Book for the IBMPC_ですが、この完全なる入門書が最終的に目指すのは、ディスク・エディタです。OSとは何か、の基本を理解せよ、というのがノートン先生の教えのようです。ノートン先生はその後、MSから本を出すようになったようで、お金、絡むんだよねぇ、とは思いましたけれど(嫌な世界だ、とは思ってしまう。ま、大昔の話よ)。

 でも、ノートンさんの本も何冊かは翻訳されているんでしょ? 別に図書館とかインターネットとか調べるつもりはありませんが。でも、Vzってどう動いているんだ? とか気になる人は、一緒にやりましょう! ゆっくり。死ぬまで。

 konnoさん、ありがとうございました。
 血液検査の結果は、思っていたほど、悪くありませんでした。

[5050] Re: 五月雨(さみだれ)

めざら 2022/09/12(Mon) 10:57
[5043]へのコメント http://mezala.la.coocan.jp/
序文には,MSCDEX 外しが非公開情報を「公開」する本の出版に至るきっかけになったことがさらりと書かれていて,ファンクション 52h がキモであることを示していますね。

「DOS6のダブルスペース」と関連があるかはわかりませんが,ファイル名に含まれる全角スペースの扱いのヘンテコなことは日々体験しています。「なぜ,そこでぶった切る?!」とか。スペース(ASCII)で切るなら,後ろを引数と間違えちゃったのね?とか許せるけど,わざわざ引用符で括っているのにぶった切るって何ごと!


初版が面白いですか……英語できないからなぁ。
この手の資料って,ところどころにぶっ込んでくるジョークが面白いのでしょう?
読めないから面白くないけどさ(笑)

[5052] The madness continues ....

文太 2022/09/13(Tue) 15:46
[5050]へのコメント
めざらさん

 「ふくよか2号」、まだ着きませぬ。まったく焦ってはおりませんが。明日かなぁ。
 届いたら、ここにレスを付けようと思っておりました……。

 さて、そうですね、(ストレートに言っちゃいますね)英語が分かるとニュアンスがあって、お茶らけてるなぁ、みたいなムードが分かって面白いのです。もちろん読者サービスですが、本人も楽しんでいるのです。幸福感や高揚感は伝染(うつ)る。

Chapter 1
Regarding the Use of Undocumented DOS

Why Leave Functionality Undocumented?... Why Is Undocumented DOS Important?... Permission, But Not Support... Fear of the Undocumented... Reserved and Undocumented 80x86 Features... Where Angels Fear to Tread: Programs That Use Undocumented DOS... Ain't Misbehavin'... Simulated DOS... Categories of Undocumented DOS... The Case of the Missing One-Quarter...

 上が、目次における節タイトルですが、これだけ見ても、3箇所、クスっとさせてくれるところがあります。

 例の箇所は以下のような具合。
 別にそれほど自慢とかするつもりはありませんが、(そして技術書として扱う場合、ニュアンスみたいなのは捨てたほうが、読者に対して「親切」なのでしょうが)でも、下は、《物語》です。物語的に訳してほしいなぁ(訳書は未見)と思う。一部、単語が難しいでしょうね。


There is a story behind this book:

For months, a coworker of mine, having been misinformed that I was some sort of "DOS hotshot," had been pestering me to write a program to convince MS-DOS that it no longer had an L: drive. I never quite figured out what the program was for, but apparently customers were clamoring for a way to remove the Microsoft CD-ROM Extensions (MSCDEX) from memory, and this program had something to do with it. Anyway, I had tried several different approaches, including using MS-DOS's Cancel Device Redirection function (INT 21h Function 5Fh Subfunction 04h), all without success.

I then came across Ralf Brown's "Interrupt List," part of which now forms the appendix to this book. One of the DOS functions listed by Ralf, Get List Of Lists (INT 21h Function 52h), was marked "DOS 2+ internal." It was not listed in the official DOS documentation: IBM's jumps straight from Find Next (INT 21h Function 4Fh) to Get Verify Setting (Function 54h), with no mention of any functions between 4Fh and 54h. Even Ray Duncan's Advanced MS-DOS Programming simply lists Function 52h as "Reserved." Anyway, the undocumented DOS function described in Ralf's list turned out to be exactly what was needed to write a program to "cancel" L: drive. Once I knew about INT 21h Function 52h, writing DRVOFF (as the utility was called) was trivial. Without this information, it was impossible.

This introduction is not the place to go into the details of DRVOFF. The source code for a similar program, and a full explanation, appear in chapter 4 of this book. For now, the point is simply that here was a very real need that could be met only using a DOS function that doesn't appear in Microsoft's or IBM's documentation.


 で、上を《作る》のに、何が超楽しかったかというと、これです。(注:前処理をいっぱいしましたからね)

>xtr -f undocdos.txt > kek.txt

 長い本なので、コマンドラインの眺めが最高! xtr, こう作ってあったか! さすがだ! と、膝を打ちました。PCを使っている快楽、その絶頂でした。たしかあまり深く考えずに、vtdosでやったのだと思う。遅いから、なおさら感動的!

 (訳が分からないかもしれませんが、追加で説明しますね)

 Undocumented DOS (1st ed) のe-textは、スキャナーそのままだったのです。当然、文字化けもあり(多数、そのママ)。で、1パラグラフ=1論理行にしたかったのです。sedでもできるな、と思ったけど、xtr が超楽。

 なお、「腐海にもどす前に」に書いたとおり、初版の面白いところは翻訳本(2版)にも取り込まれています。

 ディープですが、さらに面白い最近の発見。command.comを扱う6章(初版)の執筆は、Jim Kyleによるものなのですが、この人、超きまじめ。文体で分かるんです。たぶん、この章で、面白いエピソードやジョークが出てくることはないのでしょう。あるかもしれませんけれど。あるといいな。ポーカーファイスしてるだけだといいのだけど。息がつまる……。

追記:全角スペースをファイル名に入れるなんて……。LFN、便利は便利です。でも、Vzで扱うとき厄介なので、支障がないときは、僕は8+3に直してしまうことが多いです。

追記2:やばいかな、ここ。夕方、種が到着しました!

[5054] XTR 甘いぞ

文太 2022/09/22(Thu) 01:24
[5052]へのコメント
 元気です! 夏バテです! 学校が始まってうんざりです! というだけのご報告。
 うん、みなさん、とりわけ konnoさん、がんばられてる! 嬉しいです。

 さて、xtrで少しあそびました。
 で、前回、足りなかったのは、これ。

>xtr -f -e asm.txt >kek.txt	; -e 埋め込みコマンド有効化

>type asm.txt

Assembly Language For Intel Based Computers By Kip R. Irvine

ASSEMBLY LANGUAGE FOR INTEL-BASED COMPUTERS 

FOURTH EDITION 

~{			; --- コレ fill 適応させるな
Ctrl			; 埋め込みコマンドで「非整形」
Ctrl-A 			; xtrはテキスト・フォーマッタですから、
Ctrl-B 			; 出力では、この埋め込みコマンドは
Ctrl-C 			; ちゃんと削除されます
Ctrl-D 
Ctrl-E 
~}			; --- コレ fill 適応させるな

ASCII CONTROL CHARACTERS 

The following list shows the ASCII codes generated when ; 結局のところ
a control key combination is pressed. The mnemonics and ; ここの部分が
descriptions refer to ASCII functions used for screen   ; 整形(文字詰め)
and printer formatting and data communications.         ; 対象です。


--- from xtr.doc ---
~{,~}  部分的非整形。これで囲んだ部分が行分割や空白の伸び縮みしない
で、そのままの形になるようにする。
--------------------

 きめ細やかな「テキスト・フォーマット読解」が必要ということですね。

↑ このページの先頭