====== TIME000.COM ====== ディレクトリとかの時間を 0:00:00 に固定する常駐物ないかなあ...だめだ散逸してて見つからない。 こうなったらアセンブラのソースをAIにたたき台つくらせてアセンブルするか... そんな動機でこのTSR (111バイトのCOMファイル)ができました。 ===== 使い方 ===== > time000 または > lh time000 を実行する。常駐解除する方法はないため DOS ごと再起動すること。 ===== バイナリやソースの著作権とか ===== Google AI が生成し、asaasa が検証と整形を行いました。そんな事情なのでパブリックドメインとし、著作権の主張は行いません。ご自由に使ったり改変したりしてください。 ===== ソース ===== ビルドは nasm -o time000.com time000.asm を実行するだけ。(nasm は FreeDOS 1.4 以降のボーナス CD などに含まれています) ; DOS RTC Time stop to 0:00:00 ver.0.2 (1Ah+2Ch偽装) ; ; Code by Google AI mode / 動作確認 by asaasa org 100h ; COMファイルの開始アドレス section .text start: ; 1. 元の INT 21h のベクトル(アドレス)を取得して保存 mov ax, 3521h ; AH=35h (ベクトルの取得), AL=21h int 21h mov [old_int21_off], bx ; オフセットを保存 mov [old_int21_seg], es ; セグメントを保存 ; 2. 自作の新しい INT 21h ベクトルを設定 mov ax, 2521h ; AH=25h (ベクトルの設定), AL=21h mov dx, new_int21 ; 新しいハンドラのアドレス int 21h ; 2. 元の INT 1Ah (BIOS時計) を保存して書き換え mov ax, 351Ah int 21h mov [old_int1a_off], bx mov [old_int1a_seg], es mov ax, 251Ah mov dx, new_int1a int 21h ; 3. 常駐終了 (TSR) mov ax, 3100h mov dx, (resident_end - start + 10Fh) >> 4 int 21h ; ---------------------------------------------------- ; 常駐データ領域 ; ---------------------------------------------------- align 2 old_int21_off: dw 0 old_int21_seg: dw 0 old_int1a_off: dw 0 old_int1a_seg: dw 0 ; ---------------------------------------------------- ; 新しい INT 21h (DOS API 偽装) ; ---------------------------------------------------- new_int21: cmp ah, 2Ch ; 時刻取得の要求か? je .fake_time jmp far [cs:old_int21_off] .fake_time: ; 時刻取得(AH=2Ch)の要求に対し、固定の値をレジスタにセットして騙す mov ch, 00 ; 時 (0-23) mov cl, 00 ; 分 (0-59) mov dh, 00 ; 秒 (0-59) mov dl, 00 ; 1/100秒 (0-99) iret ; ---------------------------------------------------- ; 新しい INT 1A community (BIOS 時刻取得 偽装) ; ---------------------------------------------------- new_int1a: cmp ah, 00h ; システム・チック数の取得要求か? je .fake_ticks cmp ah, 02h ; RTC(リアルタイムクロック)時刻の取得要求か? je .fake_rtc ; それ以外は元のBIOS処理へ jmp far [cs:old_int1a_off] .fake_ticks: ; AH=00h: 起動からのチック数を返す (00:00:00 に相当するカウントに固定) ; 00:00:00 ≒ 起動から0チック (十六進数で 0000 0000h) mov cx, 0000h ; 高位ワード mov dx, 0000h ; 低位ワード mov al, 0 ; 日付をまたいだフラグをクリア iret .fake_rtc: ; AH=02h: BCD(二進化十進数)形式で時刻を返す ; ※DOSによってはここを直接叩いてファイルスタンプを作ります mov ch, 00h ; 時 (BCDで 00) mov cl, 00h ; 分 (BCDで 00) mov dh, 00h ; 秒 (BCDで 00) mov dl, 00h ; 夏時間フラグなし clc ; キャリーフラグをクリア(成功を示す) iret resident_end: