(7780)
7780:
rensave.def v2.0 の再改造
投稿者:
konno
2017/08/21(月) 01:45
コメント数 2
ねこさんの RENSAVE.DEF の再改造です。
昔FGALDCの会議室で改造したんですが、テンポラリエラーが出るようになって、
使わなくなっていました。
今回また必要性が高まったので、見直してバグを見つけました。
> 08064/08074 KFR04247 H.Konno rensave.def v2.0 にバグ?
> (14) 04/05/06 01:01
>
> みなさんこんにちは。
>
> 私は毎日のように rensave.def 2.0(世代管理セーブ by ねこ)の
> お世話になっています。(ねこさん、ありがとうございます。)
> これが無いとVZのバージョン管理も出来ないんですが、最近、
> バグと思われる現象に出会いました。
>
> それは、拡張子が1文字の時に使用すると、ピリオドが消えて、
> ファイル名と拡張子がつながってしまうと言うものです。
> たとえば、
>
> abc.c のようなファイルを編集し、rensave.def でセーブすると、
> abcc になってしまうんです。オリジナルVZでも、XP、Win98Me、
> LX でもなるので、rensave.def のバグかと思ったわけです。
> 皆さんの所ではどうでしょうか。
>
> 08066/08074 KFR04247 H.Konno RE:rensave.def v2.0 にバグ?
> (14) 04/05/12 02:34 08065へのコメント
>
> > 問題のコードは,
> > #82 #h #m #82 #u #m ;ファイルを読み込む
> >…の部分です。
>
> 手動でやってみて納得しました。未修正のファイルも修正済みになりますね。
>
> 最初の (mr-1)?. というのは、mr が1以外なら終了と言うことですよね。
> とすればこの時点で mr は1になっている?
> と言うことで、この部分をコメントにして見ました。
>
> ; #82 #h #m #82 #u #m ;ファイルを読み込む
>
> なんかバグが無くなって正常に動いているように見えます。(^^;
>
> -- H.Konno --
こんなやり取りをしていたんですが、実はこの部分が重要だったという落ち。
短いので全部張り付けます。
====== rensave.def 世代管理セーブ by ねこ ======
;====== rensave.def 2.0 世代管理セーブ by ねこ ======
* m
80 [ESC]F "rename save"
?. (mr-1)?. ;&s ;Readonlyは除外
&m("世代管理セーブ") ;メッセージ
#] ; ★k cp をテキストバッファに
&s
;; #82 #h #m #82 #u #m ;ファイルを読み込む
&Sh(pf,nm) ;ファイル名コピー
ax$4e00, cx-, dx=pf, &i($21) n-, ;ファイル検索
(ax!=$12)?{ ;見つかったら
&Sy(pf) ;ファイル名解析
&Sc(pr,pf,cx-pf+(r&2/2-1)) ;prにコピー
:A &Sp(r,".%03d",n) ;連番拡張子付加
ax$5600,dx=pf,di=pr,
#M #_ #U ; ★k テンポラリエラー対策
r[, &i($21) r], ;rename
(ax==5)?{n++,>A} ;既に有るなら連番増分
&Sh(pf,pr) ;ファイル名ヒストリにコピー
}
&d &m("%sにバックアップ",pf) &s ;メッセージ
#S #m &d #? ;現テキスト保存
&m("%sにバックアップしました",pf) ;メッセージ
#C
*
====== bottom of rensave.def ======
★印が今回の改造部分です。
要は、セーブ前にディスク上のファイルをリネームするのですが
その時点で大きいファイルでは一部しか読み込んでいないため
セーブ時にファイルの追加読み込みをしようとして、ファイルが無い!!
で、テンポラリファイルエラーになるわけです。
これは手動でやっても同じなので、セーブ前にディスク上のファイルを
リネームするときはその前にいったんテキストの最後までジャンプさせる
必要がある、ということでした。
# 過去に積み残したお宝が山積みで掘り起こしが大変だぁ〜!!
- No.7780 -
このTreeへ
[リストへもどる]
pre
(7780)
7781:
rensave.def バグ&返り値が・・・
投稿者:
konno
2017/08/25(金) 01:32
7780 番 konno さんへのコメント コメント数 1
rensave.def 大バグがありました。
ループの中に挿入するなんて、頭がウニになってる。(>_<)
取り敢えず改造の話は置いておいて
ファンクションコールの返り値AXの値がおかしい?
テストのために、オリジナルの rensave.def にAXの表示と &tを追加しました。
&t で止まったら、AXの値を確認して、Enter します。
====== rentest.def ======
;====== rensave.def 2.0 世代管理セーブ by ねこ ======
* m
80 [ESC]T "rename save"
?. (mr-1)?. ;&s ;Readonlyは除外
&m("世代管理セーブ") ;メッセージ
&s
; #M #_ #U ;★★★ テンポラリエラー対策
#82 #h #m #82 #u #m ;ファイルを読み込む
&Sh(pf,nm) ;ファイル名コピー
ax$4e00, cx-, dx=pf, &i($21) n-, ;ファイル検索
&m("%d:4e00 ax=%x bx=%s pr=%s ",n,ax,bx,pr) ;★
&w(100) &t ;★
(ax!=$12)?{ ;見つかったら
&Sy(pf) ;ファイル名解析
&Sc(pr,pf,cx-pf+(r&2/2-1)) ;prにコピー
:A &Sp(r,".%03d",n) ;連番拡張子付加
ax$5600,dx=pf,di=pr,
r[, &i($21) r], ;rename
&m("%d:5600 ax=%x bx=%s pr=%s ",n,ax,bx,pr) ;★
&w(100) &t ;★
(ax==5)?{n++,>A} ;既に有るなら連番増分
&Sh(pf,pr) ;ファイル名ヒストリにコピー
}
&d &m("%sにバックアップ",pf) &s ;メッセージ
#S #m &d #? ;現テキスト保存
&m("%sにバックアップしました",pf) ;メッセージ
&w(100) ;★
#C
*
====== bottom of rensave.def ======
さて、マクロの実行結果です。
ax$4e00, cx-, dx=pf, &i($21) n-, ;ファイル検索
同名ファイル 存在する 存在しない
-----------------------------------
VTDOS 4E00 12
MSDOS Player 0 12
NP2 0 12
Win7 DOS窓 0 12
Win10 DOS窓 0 12
ax$4e00のファンクションコールの返り値AXの値は
VTDOSだけ違っています。
ax$5600,dx=pf,di=pr, r[, &i($21) r], ;rename
同名ファイル 存在する 存在しない
-----------------------------------
VTDOS 5600 or B7? 5600
MSDOS Player 11 5600
NP2 5 12
Win7 DOS窓 5 FF00
Win10 DOS窓 5 FF00
ax$5600のファンクションコールの返り値AXの値は
DOS窓の値が正しいようで、キチンと動作します。
VZではどちらも使用しているので、影響ありそうですね。
- No.7781 -
このTreeへ
コメント元:7780 へ
[リストへもどる]
pre
(7780)
7782:
Re: rensave.def バグ&返り値が・・・
投稿者:
としき
2017/08/26(土) 13:10
参照先:http://toshiki.la.coocan.jp/
7781 番 konno さんへのコメント コメント数 1
> ax$4e00のファンクションコールの返り値AXの値は
> VTDOSだけ違っています。
> ax$5600のファンクションコールの返り値AXの値は
> DOS窓の値が正しいようで、キチンと動作します。
一応、建前としては、どちらのファンクションもキャリーがセットされていない
場合、AXは不定のはず。とは言いつつも、過去のOSは不定ではなく安定だったの
で、裏技的に安定だと仮定しているソフトも多そう。
あと、56Hの方は、キャリーがセットされている場合のリターンは安定でなければ
ならないはずなので、こちらはかなり問題がありそうですね。
- No.7782 -
このTreeへ
コメント元:7781 へ
[リストへもどる]
soft
(7780)
7783:
Re^2: rensave.def バグ&返り値が・・・
投稿者:
konno
2017/08/27(日) 00:37
7782 番 としき さんへのコメント コメント数 2
> 一応、建前としては、どちらのファンクションもキャリーがセットされていない
> 場合、AXは不定のはず。とは言いつつも、過去のOSは不定ではなく安定だったの
> で、裏技的に安定だと仮定しているソフトも多そう。
一応ブラウンリストには載っているようです。
Int 21/AH=4Eh - DOS 2+ - FINDFIRST - FIND FIRST MATCHING FILE
AH = 4Eh
AL = special flag for use by APPEND (refer to note below)
CX = file attribute mask (see #01420 at AX=4301h) (bits 0 and 5 ignored)
0088h (Novell DOS 7) find first deleted file
DS:DX -> ASCIZ file specification (may include path and wildcards)
Return:
CF clear if successful
Disk Transfer Area filled with FindFirst data block (see #01626)
CF set on error
AX = error code (02h,03h,12h) (see #01680 at AH=59h/BX=0000h)
ここで、AXのエラーコードが3つありますが、DOS窓でファイルが
存在しない場合、12hだったので、これがDOSの標準値なのでしょう。
Int 21/AH=56h - DOS 2+ - RENAME - RENAME FILE
AH = 56h
DS:DX -> ASCIZ filename of existing file (no wildcards, but see below)
ES:DI -> ASCIZ new filename (no wildcards)
CL = attribute mask (server call only, see below)
Return:
CF clear if successful
CF set on error
AX = error code (02h,03h,05h,11h) (see #01680)
こちらは、AXのエラーコードが4つありますが、DOS窓でファイルが
存在する場合、5hだったので、これがDOSの標準値なのでしょう。
通常(VZも)キャリーで判断しているので問題はなさそうですが
本当に大丈夫かどうかはわかりません。
連番セーブ系マクロは、とらじさんのvrensave.defも同じコード
なので駄目ですね。
Emmettさんの !Close を使用した連番セーブ系マクロは、
キチンと連番セーブしているようですね。
キャリーで判断しているんでしょうか。
- No.7783 -
このTreeへ
コメント元:7782 へ
[リストへもどる]
soft
(7780)
7784:
Re^3: rensave.def バグ&返り値が・・・
投稿者:
konno
2017/08/27(日) 01:12
7783 番 konno さんへのコメント
補足です。
> Int 21/AH=4Eh - DOS 2+ - FINDFIRST - FIND FIRST MATCHING FILE
> Return:
> AX = error code (02h,03h,12h) (see #01680 at AH=59h/BX=0000h)
> Int 21/AH=56h - DOS 2+ - RENAME - RENAME FILE
> Return:
> AX = error code (02h,03h,05h,11h) (see #01680)
この#01680 にエラーコードの一覧がありました。
(Table 01680)
Values for DOS extended error code:
---DOS 2.0+ ---
00h (0) no error
01h (1) function number invalid
02h (2) file not found
03h (3) path not found
04h (4) too many open files (no handles available)
05h (5) access denied
06h (6) invalid handle
07h (7) memory control block destroyed
08h (8) insufficient memory
09h (9) memory block address invalid
0Ah (10) environment invalid (usually >32K in length)
0Bh (11) format invalid
0Ch (12) access code invalid
これだけ分けているということは、違いがあるんでしょうね。
(11) format invalid は書式エラーとか?
- No.7784 -
このTreeへ
コメント元:7783 へ
[リストへもどる]
pre
(7780)
7785:
Re^3: rensave.def バグ&返り値が・・・
投稿者:
としき
2017/08/27(日) 18:16
参照先:http://toshiki.la.coocan.jp/
7783 番 konno さんへのコメント コメント数 1
> 一応ブラウンリストには載っているようです。
一応どころではなく、きちんと明記されていますよね。
AXが返ってくるのはキャリーフラグがセットされているときだけだ、って。
あれ、konnoさん、日本語で書かれたDOSファンクションの本て持っていたような
気がしましたが、私の気のせいかな。NEC版のDOSのプログラマーズリファレンス
か何か。もしそういうのがあれば、そちらを見たほうがいいかも。
- No.7785 -
このTreeへ
コメント元:7783 へ
[リストへもどる]
soft
(7780)
7786:
Re^4: rensave.def バグ&返り値が・・・
投稿者:
konno
2017/08/27(日) 21:28
7785 番 としき さんへのコメント コメント数 2
> 一応どころではなく、きちんと明記されていますよね。
> AXが返ってくるのはキャリーフラグがセットされているときだけだ、って。
エラーコードはそうなんですが、私の記憶が不確かなれば、DOSコールとかは
その番号の関数が存在しないか対応してない場合、AXが同じになると思いました。
VTDOSは同じ番号が返っているので、どうかなと思ったのです。
存在しない場合はキャリーも立たないと思います。
・・・と思ったけど、MSDOS Player だと、AX=1 CF=1 になるようです。
> あれ、konnoさん、日本語で書かれたDOSファンクションの本て持っていたような
> 気がしましたが、私の気のせいかな。NEC版のDOSのプログラマーズリファレンス
> か何か。もしそういうのがあれば、そちらを見たほうがいいかも。
ということで、上記の件はすぐには見つけられないので、私の記憶が違ってる
場合はよろしくご指摘ください。
- No.7786 -
このTreeへ
コメント元:7785 へ
[リストへもどる]
soft
(7780)
7787:
Re^5: rensave.def バグ&返り値が・・・
投稿者:
としき
2017/08/28(月) 21:31
参照先:http://toshiki.la.coocan.jp/
7786 番 konno さんへのコメント コメント数 1
> エラーコードはそうなんですが、私の記憶が不確かなれば、DOSコールとかは
> その番号の関数が存在しないか対応してない場合、AXが同じになると思いました。
そういえば、私も、そんなような話を聞いたことがある。
でも、私の不確かな記憶では、ある特定の条件の場合のみ、ということになって
いたような。その条件が思い出せない。
あぁ、加齢ってやぁね。
- No.7787 -
このTreeへ
コメント元:7786 へ
[リストへもどる]
soft
(7780)
7790:
Re^6: rensave.def バグ&返り値が・・・
投稿者:
としき
2017/08/28(月) 23:35
参照先:http://toshiki.la.coocan.jp/
7787 番 としき さんへのコメント コメント数 1
> そういえば、私も、そんなような話を聞いたことがある。
思いついた単語を片っ端からgoogle先生にぶち込んだ結果、引っかかった
http://www7a.biglobe.ne.jp/~tsuneoka/win32sub2/8.html
↑より引用。
> ○DOSのシステムコールによる動作環境の認識
> これらの機能は、Windows95 の DOSプロンプトでのみ動作するため、他の環境で
> 動作 していることを認識する必要があります。
> DOSのシステムコールは、ソフトウェア割り込みによって実現されまが、これらの
> システムコールは、OSによってサポートするものとそうでないものがあります。
> サポートされているときには、システムコールを実行すると、AXレジスタに
> ファンクション固有の値が設定されます。
> もし、サポートされていなければ、AXに設定されたファンクションがそのまま
> 返却されます。
> これにより、実行しようとしたファンクションをOSがサポートしているかを
> 識別する ことができます。
としき的に書き換えると
●OSがサポートしていれば
→・エラーがあればエラーコード
・エラーがなければ不定
●OSがサポートしていなければ
→AXは変更されずにそのままの値が返る
ということだと思います。つまり、konnoさんが正解のような気がする。
ただ、これ、もしかして、当てはまるのはWin95以降のみ、というような落とし穴
があるかも。
えと、いろいろと検索していたら#6311が引っかかってきました。
もうすっかり忘れている。自分のフリーウェアでも使っていたはずなのに。
私、再履修というやつをしないとだめかもしれない。
- No.7790 -
このTreeへ
コメント元:7787 へ
[リストへもどる]
soft
(7780)
7791:
Re^7: int21の未定義API
投稿者:
konno
2017/08/29(火) 01:29
7790 番 としき さんへのコメント コメント数 1
> 思いついた単語を片っ端からgoogle先生にぶち込んだ結果、引っかかった
> http://www7a.biglobe.ne.jp/~tsuneoka/win32sub2/8.html
おお、これはお宝のページですね。
> としき的に書き換えると
>
> ●OSがサポートしていれば
> →・エラーがあればエラーコード
> ・エラーがなければ不定
> ●OSがサポートしていなければ
> →AXは変更されずにそのままの値が返る
なるほどですね。
> えと、いろいろと検索していたら#6311が引っかかってきました。
ああ、こんな長〜いツリーを全部読んでしまった。
自分もこのころは結構まともそうなことも言ってたんだなぁ。
で、結局残ったのが、#6355 の 10#さんの御言葉
-------------------------------------------------------
int21の未定義APIは基本的にMSが予約してて、幾つかの挙動が想定されます。
1.機能が無く、エラーが返る。
2.機能が無く、エラーも返らない。
3.非公開(アンドキュメンテッド)機能がある。
将来的に仕様が変更される可能性があるため、行儀の良いプログラムは基本的に
呼び出しません。
今となってはさすがに「将来的な予約」とか「行儀の良い」とか、合理性ないですけどね。
TSRなど、プロセス間の通信には仕様が明確化されてたint2fが慣用されていましたね。
---------------------------------------------------------
- No.7791 -
このTreeへ
コメント元:7790 へ
[リストへもどる]
soft
(7780)
7793:
Re^8: int21の未定義API
投稿者:
10♯
2017/08/30(水) 04:38
7791 番 konno さんへのコメント コメント数 1
一般的なDOSの慣例に加えてVTDOSにはDOSエミュレーションの確立の都合上
固有の方針もあります。
まず、VTDOSのINT21APIは通常アプリに対して機能の有無を明示しないことにしています。
エミュレーションの性質上実現不可能であったり、事実上使用されていないため実装
していないAPIがあります。
これを「機能が無い」としてエラーを返すと、そこでアプリの実行上問題が出る
場合があるため、アプリに対しては機能が有るとも無いとも明示せず、
今後の機能追加への参考としてログを残すことにしています。
最小のAPIセットから機能する状態を確立して、
必要に応じて機能を追加していく方針です。
エラーが無い場合はCF=0でAXは不定というのがDOSの仕様なので、
アプリがAPIの結果をチェックする場合は必ずCFをチェックする必要があります。
ステータスの比較表を作っていただく場合はCFも入れていただくとありがたいです。
VTDOSはINT21APIの実行に際し、レジスターを破壊する必要が無いため、
特に処理を行わなかった場合、呼び出し時の内容で戻ります。
機能が実装されているかどうかはログをチェックする必要がありますね。
INT21AX=5600h "RENAME FILE" のファイルが既に有る場合のエラーコード 0B7h
についてですが、これはWin32のエラー183 ERROR_ALREADY_EXISTS に該当します。
Win32APIはバージョンやシステムの構成によって仕様が変更されることを念頭に
置いてるのか、各APIのエラーコードを明文化していません。
VTDOSはUNIX互換ランタイムに機能が有る場合そちらを呼び出し、通常はWin32API
を直接呼ぶことは有りません。
このUNIX互換ランタイムは概ねDOS互換のエラーコードが返りますが、
一部Win32APIのエラーがそのまま返るものも有るようです。
Win32APIのエラーコードも概ねはDOS互換のエラーコードではありますが、
全て同じでは無いようです。
Win32はDOSに対して大幅に拡張されているため、当然と言えば当然ですが、
歴史的にはDOSとの互換性をある程度確立する方針で進められてきたようですね。
これに関しては次回のアップデートで修正する予定です。
- No.7793 -
このTreeへ
コメント元:7791 へ
[リストへもどる]
soft
(7780)
7794:
Re^9: int21の未定義API
投稿者:
konno
2017/08/30(水) 21:18
7793 番 10♯ さんへのコメント
10#さん、詳細な説明ありがとうございます。
> 一般的なDOSの慣例に加えてVTDOSにはDOSエミュレーションの確立の都合上
> 固有の方針もあります。
おそらくそうだろうとは思っていました。
なので、対応のお願いまでは言えなかったです。
> エラーが無い場合はCF=0でAXは不定というのがDOSの仕様なので、
> アプリがAPIの結果をチェックする場合は必ずCFをチェックする必要があります。
> ステータスの比較表を作っていただく場合はCFも入れていただくとありがたいです。
これはうっかりしていました。心掛けます。
> これに関しては次回のアップデートで修正する予定です。
よろしくお願いします。
rensave.defの件は、CFで見るように変更するつもりでいたので無問題です。
ねこさんのやり方は裏技ということになりますが、DOSの時代はそれで
よかったのでしょう。
新しい時代になったら新しいやり方に対応しなくてはですね。
- No.7794 -
このTreeへ
コメント元:7793 へ
[リストへもどる]
soft
(7780)
7788:
Re^5: rensave.def バグ&返り値が・・・
投稿者:
konno
2017/08/28(月) 21:54
7786 番 konno さんへのコメント
> ということで、上記の件はすぐには見つけられないので、私の記憶が違ってる
> 場合はよろしくご指摘ください。
konnoさん、間違ってますよ。
そもそも2003年のkVZデビューの時に使ったテストマクロでは
=int.def
*m
80 ^\ "vol" ax$71a0,&i($21) &m("vol: AX=%04x BX=%04x CF=%02x ",ax,bx,r).
*
実行結果
WinXP AX=007B BX=0000 CF=01
LX(DOS5) AX=7100 BX=FF00 CF=00
ということで、純DOSでは、AX$71a0 の返り値が AX7100h で、同じではなかった。
やっぱりAXの値は不定という結論が妥当でしょうか。
アンドックの闇毒は藪の中
つんどくしかないか。
- No.7788 -
このTreeへ
コメント元:7786 へ
[リストへもどる]
pre
(7780)
7795:
Re: rensave.def v2.0 の再改造
投稿者:
konno
2017/09/01(金) 23:47
7780 番 konno さんへのコメント
ねこさんの RENSAVE.DEF の再再改造 (^^; 決定版
今までの経緯を踏まえ、AX での判定から CF に変更しました。
これで全ての環境で動作すると思います。
====== rensave.def 2.0 世代管理セーブ by ねこ ======
; konno改 2017-08-31
; 拡張子1文字の時の不具合で改変 %1
; 改変でテンポラリエラーの不具合を対策 #M の位置に注意 %2
; AX から CF に変更 nn=r 使用 %3
* m
80 [ESC]F "rename save"
?. (mr-1)?. ;&s ;Readonlyは除外
&m("世代管理セーブ") ;メッセージ
&s
; #82 #h #m #82 #u #m ;ファイルを最後まで読み込む %1
&Sh(pf,nm) ;ファイル名コピー
#M #_ #U ;ファイルを最後まで読み込む %2
ax$4ea0, cx-, dx=pf, &i($21) n-, ;ファイル検索
nn=r,
; &m("%d:4ea0 ax=%x bx=%s pf=%s r=%d",n,ax,bx,pf,nn) ;★
; &w(30) &t . ;★
; (ax!=$12)?{ ;見つかったら
(nn==0)?{ ;見つかったら %3
&Sy(pf) ;ファイル名解析
&Sc(pr,pf,cx-pf+(r&2/2-1)) ;prにコピー
:A &Sp(r,".%03d",n) ;連番拡張子付加
ax$5600,dx=pf,di=pr,
r[, &i($21) nn=r, r], ;rename
; &m("%d:5600 ax=%x bx=%s pr=%s r=%d",n,ax,bx,pr,nn) ;★
; &w(30) &t ;★
; (ax==5)?{n++,>A} ;既に有るなら連番増分
(nn!=0)?{n++,>A} ;既に有るなら連番増分 %3
&Sh(pf,pr) ;ファイル名ヒストリにコピー
}
&d &m("%sにバックアップ",pf) &s ;メッセージ
#S #m &d #? ;現テキスト保存
&m("%sにバックアップしました",pf) ;メッセージ
&w(50) ;
#C
*
====== bottom of rensave.def ======
- No.7795 -
このTreeへ
コメント元:7780 へ
[リストへもどる]
pre