soft:freedosv:time000

TIME000.COM

ディレクトリとかの時間を 0:00:00 に固定する常駐物ないかなあ…だめだ散逸してて見つからない。 こうなったらアセンブラのソースをAIにたたき台つくらせてアセンブルするか… そんな動機でこのTSR (111バイトのCOMファイル)ができました。

time000

または

lh time000

を実行する。常駐解除する方法はないため DOS ごと再起動すること。

; 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:
  • soft/freedosv/time000.1783859024.txt.gz
  • 最終更新: 2026/07/12 21:23
  • by asaasa