-
Notifications
You must be signed in to change notification settings - Fork 1
/
fs_ospatch.txt
843 lines (669 loc) · 45.4 KB
/
fs_ospatch.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
- FILE SYSTEM MANUAL -
==============================================================================
・Human68k ファイルシステムの概要
Human68k のファイルシステムは MS-DOS を基本とし、FAT によってディスクを管理
している。Human68k version 3.02 ではネットワークや CD-ROM に対応する為、内蔵の
ファイルシステムを使わず、ユーザの組み込んだデバイスドライバにファイル処理を任
せる事ができるようになっている。
従来からの FAT による管理を行うドライブをローカルドライブ、ディスク管理をデ
バイスドライバ内で行うドライブはリモートドライブと呼ぶ。CD-ROM などはメディア
が遠隔地にあるわけではないが、Human68k がディスク管理を行わないという点でネッ
トワークドライブと同じなのでリモートドライブとなる。
・ローカルドライブ
┌───────────────────────────────┐
│ユーザプログラム │
├───────────────────────────────┤
│DOS コール │
├─┬─────────────┬─┬─────────────┤
│ │ファイルシークドライバ │ │ファイルオープンドライバ │
│ │(Human68k内蔵/fastseek.x) │ │(Human68k内蔵/fastopen.x) │
│ └───────────┬─┤ └───────────┬─┘
│ディスク入出力ドライバ │ │ファイル名ドライバ │
│(Human68k内蔵/fastio.x) │ │(Human68k内蔵/TwentyOne.x)│
├─────────────┤ └─────────────┘
│デバイスドライバ │
│(Human68k内蔵/*.sys) │
├─────────────┤
│低水準入出力ルーチン(IOCS)│
├─────────────┤
│ハードウェア │
└─────────────┘
ユーザプログラムが DOS コールを介してファイル入出力を行う場合、Human68k はま
ずファイル名が正常か否かをファイル名ドライバによって調べる。次に対象ディレクト
リ/ファイルの先頭クラスタ番号を得るためにファイルオープンドライバを呼び出す。
ファイルオープンドライバがエラーを返したり、ファイルのシークを伴う場合はファイ
ルシークドライバを呼び出して対象クラスタ番号を調べる。このようにして高水準ファ
イル入出力要求を低水準ディスク入出力に置き換え、ディスク入出力ドライバに対して
入出力を行う。ディスク入出力ドライバはデバイスドライバに対してセクタ単位で入出
力を行い、デバイスドライバがハードウェア(FDD、HDD、MO、メモリ等)に対し IOCS に
よる入出力を実行する。
・リモートドライブ
┌───────────────────────────────┐
│ユーザプログラム │
├───────────────────────────────┤
│DOS コール │
├─────────────┬─┬─────────────┬─┘
│デバイスドライバ │ │ファイル名ドライバ │
│(susie.x等) │ │(Human68k内蔵/TwentyOne.x)│
├─────────────┤ └─────────────┘
│低水準入出力ルーチン(IOCS)│
├─────────────┤
│ハードウェア │
└─────────────┘
リモートドライブに対する入出力の場合、ローカルドライブと比べて DOS コールか
ら IOCS の間の処理が全く違う。ローカルドライブであれば Human68k 内蔵、あるいは
常駐プログラムとして組み込まれたドライバがディスク管理を行うのに対し、リモート
ドライブでは相当する処理は全てデバイスドライバが行う。デバイスドライバ自体もロ
ーカルドライブの場合はセクタ単位で入出力を行うが、リモートドライブでは通常
Human68k が行っているファイルシステムの管理をデバイスドライバが処理しなければ
ならない。
DOS コールが呼び出された時、Human68k は引数の検査(ファイル名が正常か否かなど)
や表面上の変換(仮想ドライブ・ディレクトリの展開など)だけしか行わなわず、リモー
トドライブへの処理を直接デバイスドライバに渡す。デバイスドライバでは Human68k
では扱えないファイルシステムを処理し、ハードウェア(CD-ROM、ネットワークドライ
ブ等)に対し IOCS または独自の低水準入出力ルーチンによる入出力を実行する。この
為、リモートドライブでは高速化ドライバ fast*.x が影響しない。
なお、キャラクタデバイスへの入出力の場合はリモートドライブの場合と同様である。
==============================================================================
・各ドライバのインターフェース
ファイル名ドライバ、ファイルオープンドライバ、ファイルシークドライバ、ディス
ク入出力ドライバによる処理が必要となった時、Human68k はレジスタに必要な引数を
設定して分岐命令表に対して jsr (offset,an) 命令で各処理を呼び出す(an は通常 a4
で分岐命令表の先頭アドレスを指し、offset は機能番号×6 の数値で 0~114 の範囲)。
各ドライバが呼び出される時、ドライバごとに固有のワークである OS サービスエン
トリのアドレスが a5 レジスタに設定される(一部の機能では設定されない)。OS サー
ビスエントリは Human68k からのパラメータの受け渡しや他のドライバへの呼び出しを
行う為の情報を設定した構造体である。
分岐命令表・OS サービスエントリのアドレスは Human68k のみが知っており、前者
は DOS _OS_PATCH で変更する事が出来るが、後者はアドレス固定である。また、OS サ
ービスエントリは呼び出された時にアドレスが渡されるが、他のドライバからは一切そ
のアドレスを知ることは出来ない。ほかのドライバの機能を使用する場合は OS サービ
スエントリ内にその機能の処理アドレスが設定されているので、それを参照する。
なお、Human68k からの呼び出しは以下のようなコードで呼ばれる。
call_xxx:
movem.l regs,-(sp)
movea.l (jmp_table),a4
lea (os_service_entry),a5
jsr (FUNC_NO*6,a4)
movem.l (sp)+,regs
rts
==============================================================================
・ディスク入出力ドライバ
ディスクに対するセクタ単位での読み書きを行う。DOS _OS_PATCH における ID は 1。
Human68k が内蔵しているが、代りにこの機能を処理するドライバとして fastio.x が
ある。
ディスク入出力管理を変更するには DOS _OS_PATCH に分岐命令表を渡せばよい。分
岐命令表は以下の 0~19 番の処理へ分岐する命令を並べる。ただし、11~19 は将来拡
張用の現在使用されていないダミーである。
・OS サービスエントリ
offset size
0 6.b セクタ読み込みルーチンへの分岐命令(jmp abs.l)
6 6.b セクタ書き込みルーチンへの分岐命令(jmp abs.l)
12 6.b メディア排出禁止ルーチンへの分岐命令(jmp abs.l)
18 6.b メディア排出許可ルーチンへの分岐命令(jmp abs.l)
24 1.l I/O バッファ先頭アドレス
28 1.l I/O バッファのセクタ数
32 1.l I/O バッファのセクタサイズ
36 1.l I/O バッファの LRU 管理の先頭(最新)アドレス
・セクタ読み込みルーチン
in d1.l 先頭セクタ番号
d2.l セクタ数
a0.l DPB
a2.l バッファアドレス
out d0.l ステータス
ローカルドライブの指定セクタからデータを読み込む。
・セクタ書き込みルーチン
in d1.l 先頭セクタ番号
d2.l セクタ数
a0.l DPB
a2.l バッファアドレス
out d0.l ステータス
ローカルドライブの指定セクタへデータを書き込む。
・メディア排出禁止ルーチン
in a0.l DPB
指定ドライブの排出を OS レベルで禁止する。
・メディア排出許可ルーチン
in a0.l DPB
指定ドライブの排出を OS レベルで許可する。
・I/O バッファ先頭アドレス
I/O バッファは、セクタサイズ+16(ヘッダ分)バイトの領域がセクタ数だけ
並んだものであるが、その先頭アドレスが保存されている。
・I/O バッファのセクタ数
CONFIG.SYS の buffers 第一引数で指定した値。1 セクタ分のバッファがこ
の数だけ並んでいる。
・I/O バッファのセクタサイズ
CONFIG.SYS の buffers 第二引数で指定した値。このサイズより大きいセク
タサイズのメディアにはアクセス出来ず、また小さいセクタサイズであればそ
の差は使用されずに無駄になる。
・I/O バッファの LRU 管理の先頭(最新)アドレス
少ないバッファでメディアのキャッシュを行う為、I/O バッファの管理には
最長不使用法でバッファの破棄/確保が行われている。その LRU は双方向リス
トによって実現されているが、その先頭(最新)のバッファアドレスを設定する。
なお、OS サービスエントリ内の後半 4 個のパラメータは Human68k 内蔵の
ディスク入出力ドライバで使用される。他のドライバを組み込んだ場合は独自
にバッファ管理を行ってよい(fastio.x では独自の管理になっている)。
以下にファイルシークドライバの各機能を解説する。
No.0 (offset 0) diskio_reset
in a5.l OS サービスエントリのアドレス
out d0.l -1
なにもしない(名称からドライバを初期状態に戻す機能のように思われるが、
初期化は diskio_init/close である)。Human68k から呼ばれることはなく
DOS _OS_PATCH でアドレス 0、若しくは 0 以外のコマンドが渡された時に呼
び出される。
No.1 (offset 6) diskio_init
in a5.l OS サービスエントリのアドレス
out a0.l I/O バッファの末尾アドレス+1
ドライバを初期化する。ドライバを変更した直後に呼ばれる。
Human68k 内蔵のファイルオープンドライバでは、OS サービスエントリから
バッファ先頭アドレスを取り出し、そのアドレスからを I/O バッファとみな
して初期化する。指定セクタ分のバッファを確保したら末尾のアドレス+1 を
返す。
No.2 (offset 12) diskio_close
in a5.l OS サービスエントリのアドレス
ドライバの終了処理を行う。ドライバを変更する直前や、DOS _FFLUSH が呼
び出された時、stop キーが押された時、再起動する場合などに実行される。
Human68k 内蔵のファイル名ドライバでは、I/O バッファの全てのセクタに
ついて、書き込みが保留されていればそれを書き出し、いずれにせよバッファ
を未使用状態にする(因みに LRU は初期化されない)。
No.3 (offset 18) diskio_readfat
in d1.l セクタ番号
a0.l DPB
a5.l OS サービスエントリのアドレス
out a1.l 読み込んだデータの I/O バッファアドレス
FAT の指定セクタを I/O バッファに読み込み、バッファアドレスを返す。
どのバッファに読み込むかはドライバが決定する。既に指定セクタが I/O バ
ッファに読み込まれていたら、メディアからの読み込みは行わずにアドレスを
返す。
なお、diskio_makefat に相当するものは FAT が固定領域に確保されている
為に存在しない。また、Human68k 内蔵のドライバでは FAT、ディレクトリ、
ファイルのいずれであっても扱いは全く同じである。
No.4 (offset 24) diskio_readdir
in d1.l セクタ番号
a0.l DPB
a5.l OS サービスエントリのアドレス
out a1.l 読み込んだデータの I/O バッファアドレス
ディレクトリの指定セクタを I/O バッファに読み込み、バッファアドレス
を返す。どのバッファに読み込むかはドライバが決定する。既に指定セクタが
I/O バッファに読み込まれていたら、メディアからの読み込みは行わずにアド
レスを返す。
No.5 (offset 30) diskio_makedir
in d1.l セクタ番号
a0.l DPB
a5.l OS サービスエントリのアドレス
out a1.l 確保した I/O バッファアドレス
指定セクタをディレクトリに使用するとして I/O バッファを確保する。指
定セクタがバッファに読み込まれていなくても確保だけを行い、メディアから
の読み込みは行われない。
No.6 (offset 36) diskio_readfile
in d1.l セクタ番号
a0.l DPB
a5.l OS サービスエントリのアドレス
out a1.l 読み込んだデータの I/O バッファアドレス
ファイルの指定セクタを I/O バッファに読み込み、バッファアドレスを返
す。どのバッファに読み込むかはドライバが決定する。既に指定セクタが I/O
バッファに読み込まれていたら、メディアからの読み込みは行わずにアドレス
を返す。
No.7 (offset 42) diskio_makefile
in d1.l セクタ番号
a0.l DPB
a5.l OS サービスエントリのアドレス
out a1.l 確保した I/O バッファアドレス
指定セクタをファイルに使用するとして I/O バッファを確保する。指定セ
クタがバッファに読み込まれていなくても確保だけを行い、メディアからの読
み込みは行われない。
Human68k ではファイルの拡大時であっても常に diskio_readfile を呼び出
し、diskio_makefile が使用される事はないので効率が悪くなっている。
No.8 (offset 48) diskio_compare
in d1.l セクタ番号
a0.l DPB
a1.l I/O バッファのデータアドレス
a5.l OS サービスエントリのアドレス
out ccrZ 0:不一致 1:一致
指定したドライブのセクタが I/O バッファが示すドライブ/セクタ番号と同
一であるか比較する。
No.9 (offset 54) diskio_write
in a1.l I/O バッファのデータアドレス
a5.l OS サービスエントリのアドレス
指定した I/O バッファのデータをメディアに書き込み、書き込み保留フラ
グをクリアする。
No.10 (offset 60) diskio_setflag
in a1.l I/O バッファのデータアドレス
a5.l OS サービスエントリのアドレス
指定した I/O バッファの書き込み保留フラグをセットし、メディアの排出
を禁止する。
No.11 (offset 66) diskio_flush
in a0.l DPB
a5.l OS サービスエントリのアドレス
I/O バッファの全てのセクタについて、指定ドライブで書き込みが保留され
ているものがあればそれを書き出して書き込み保留フラグをクリアし、メディ
アの排出を許可する。
No.12 (offset 72) diskio_clear
in a0.l DPB
a5.l OS サービスエントリのアドレス
I/O バッファの全てのセクタについて、指定ドライブのものがあればその内
容を破棄してバッファを未使用状態にする。書き込みが保留されていてもデー
タの書き出しは行わない。
No.13 (offset 78) diskio_ioread
in d1.l 先頭セクタ番号
d2.l セクタ数
a0.l DPB
a2.l バッファアドレス
a5.l OS サービスエントリのアドレス
out d0.l ステータス
複数セクタを指定したバッファに読み込む。I/O バッファに指定範囲内のデ
ータが書き込み保留状態であれば、それを書き出してから読み込む。
No.14 (offset 84) diskio_iowrite
in d1.l 先頭セクタ番号
d2.l セクタ数
a0.l DPB
a2.l データアドレス
a5.l OS サービスエントリのアドレス
out d0.l ステータス
指定したデータを複数セクタに書き込む。I/O バッファに指定範囲内のデー
タがあれば、それを破棄して未使用状態にしてから書き込む。
No.15 (offset 90) diskio_dummy15
No.16 (offset 96) diskio_dummy16
No.17 (offset 102) diskio_dummy17
No.18 (offset 108) diskio_dummy18
No.19 (offset 114) diskio_dummy19
in a5.l OS サービスエントリのアドレス
out d0.l -1
将来拡張用のダミー。現在は全てエラーを返す。
編注 名称および機能は Human68k のコードから推測している。
==============================================================================
・ファイルシークドライバ
FAT の参照・変更などを行う。DOS _OS_PATCH における ID は 2。Human68k が内蔵
しているが、代りにこの機能を処理するドライバとして fastseek.x がある。
FAT 管理を変更するには DOS _OS_PATCH に分岐命令表を渡せばよい。分岐命令表は
以下の 0~19 番の処理へ分岐する命令を並べる。ただし、11~19 は将来拡張用の現在
使用されていないダミーである。
・OS サービスエントリ
offset size
0 6.b エラー処理呼び出しルーチンへの分岐命令(jmp abs.l)
6 6.b diskio_readfat 呼び出しルーチンへの分岐命令(jmp abs.l)
12 6.b diskio_setflag 呼び出しルーチンへの分岐命令(jmp abs.l)
18 1.w NEWFAT の値(0 若しくは 2)
・エラー処理呼び出しルーチン
FAT の内容が異常であった場合に実行する為の、エラー処理呼び出しルーチ
ン。エラー番号は $1005(ディスクの管理領域が破壊されている、中止のみ)。
・NEWFAT
空きクラスタ検索方法を指定するワークで、Human68k によって 0 か 2 が
設定される。値が 0 の時は前回検索終了位置から続けて検索し、値が 2 の時
は常に先頭クラスタから検索する。
以下にファイルシークドライバの各機能を解説する。
No.0 (offset 0) fileseek_reset
in a5.l OS サービスエントリのアドレス
out d0.l -1
なにもしない(名称からドライバを初期状態に戻す機能のように思われるが、
初期化は fileseek_init/close である)。Human68k から呼ばれることはなく
DOS _OS_PATCH でアドレス 0、若しくは 0 以外のコマンドが渡された時に呼
び出される。
No.1 (offset 6) fileseek_init
in a5.l OS サービスエントリのアドレス
out d0.l ステータス(0 で正常終了)
ドライバを初期化する。ドライバを変更した直後に呼ばれる。
Human68k 内蔵のファイルオープンドライバでは何もしない。
No.2 (offset 12) fileseek_close
in a5.l OS サービスエントリのアドレス
ドライバの終了処理を行う。ドライバを変更する直前に呼ばれる。
Human68k 内蔵のファイル名ドライバでは何もしない。
No.3 (offset 18) fileseek_seek
in d0.w クラスタ位置(目的位置までのクラスタ数)
d2.l ファイルサイズ
d3.w モード(0:read $ffff:write)
a0.l DPB
a1.l FCB のアドレス+68(FAT キャッシュ)
a5.l OS サービスエントリのアドレス
out d0.l ステータス
d2.w FAT(クラスタ)番号
FAT の繋がりを読み取って、ファイルの指定位置のクラスタ番号を得る。フ
ァイルサイズより後方に移動しようとした場合、read モードではエラーが返
るが、write モードでは自動的に空きクラスタを検索してファイルサイズを拡
大させる。この時の引数 d3.w=$ffff は FAT の終わりを表わしている。
No.4 (offset 24) fileseek_fatchk
in d1.w FAT(クラスタ)番号
d2.w 検索する最大クラスタ数(通常は 65535)
d3.w モード(0:read $ffff:write)
a0.l DPB
a5.l OS サービスエントリのアドレス
out d0.l 次の FAT(クラスタ)番号
d2.w 連続したクラスタ数
FAT の繋がりを読み取って、指定のクラスタからいくつ連続したクラスタに
存在するかを調べる。引数の d3.w は fileseek_seek と同じ。
No.5 (offset 30) fileseek_nextfat
in d0.w FAT(クラスタ)番号
a0.l DPB
a5.l OS サービスエントリのアドレス
out d0.w 次の FAT(クラスタ)番号($ffff ならファイルの終わり)
FAT の繋がりを読み取って、指定したクラスタの次に位置するクラスタ番号
を得る。
No.6 (offset 36) fileseek_getfat
in a0.l DPB
a5.l OS サービスエントリのアドレス
out d0.l FAT(クラスタ)番号
FAT から未使用クラスタを検索して確保する。確保したクラスタの FAT に
は繋がりの末尾を示す $fff 若しくは $ffff が書き込まれる。空きクラスタ
の検索は通常前回の検索位置からであるが、NEWFAT = 2 の場合は常に第 2 ク
ラスタから始まる。
No.7 (offset 42) fileseek_dskfre
in a0.l DPB
a5.l OS サービスエントリのアドレス
out d0.l 空きクラスタ数
FAT を読み込んで、指定ドライブの空きクラスタ数を調べる。
No.8 (offset 48) fileseek_freechain
in d0.w FAT(クラスタ)番号
a0.l DPB
a5.l OS サービスエントリのアドレス
out d0.l ステータス
指定したクラスタと、そのクラスタから繋がる以降のクラスタ全てを解放し、
未使用状態にする。解放されたクラスタには未使用を示す 0 が書き込まれる。
No.9 (offset 54) fileseek_freefat
in d0.w FAT(クラスタ)番号
a0.l DPB
a5.l OS サービスエントリのアドレス
out d0.l 次の FAT(クラスタ)番号
指定したクラスタを解放し、未使用状態にする。
Human68k 内蔵のドライバでは fileseek_freechain から呼び出されるが、
現在の Human68k から直接呼び出される事はない。
No.10 (offset 60) fileseek_chgfat
in d0.w 次の FAT(クラスタ)番号として書き込むデータ
d1.w 対象の FAT(クラスタ)番号
a0.l DPB
a5.l OS サービスエントリのアドレス
out d0.l 以前書き込まれていた、次の FAT(クラスタ)番号
指定クラスタの、次に位置する FAT(クラスタ)番号を任意の番号に変更する。
No.11 (offset 66) fileseek_dummy11
No.12 (offset 72) fileseek_dummy12
No.13 (offset 78) fileseek_dummy13
No.14 (offset 84) fileseek_dummy14
No.15 (offset 90) fileseek_dummy15
No.16 (offset 96) fileseek_dummy16
No.17 (offset 102) fileseek_dummy17
No.18 (offset 108) fileseek_dummy18
No.19 (offset 114) fileseek_dummy19
in a5.l OS サービスエントリのアドレス
out d0.l -1
将来拡張用のダミー。現在は全てエラーを返す。
編注 名称および機能は Human68k のコードから推測している。
==============================================================================
・ファイルオープンドライバ
ディレクトリ名を管理する。DOS _OS_PATCH における ID は 3。他のドライバと違い
この機能が全てダミーであってもディスクアクセスが多くなるだけで正常に動作する。
Human68k が内蔵しているものは何も行わないダミールーチンなので、参照の度にディ
スクアクセスを行う。代りにこの機能を処理するドライバとして fastopen.x がある。
ディレクトリ名管理を変更するには DOS _OS_PATCH に分岐命令表を渡せばよい。分
岐命令表は以下の 0~17 番の処理へ分岐する命令を並べる。ただし、9~17 は将来拡
張用の現在使用されていないダミーである(9 番は使用されている?)。
・OS サービスエントリ
offset size
0 6.b namecheck_namebf_cmp 呼び出しルーチンへの分岐命令(jmp abs.l)
6 6.b namecheck_knj_case_cmp 呼び出しルーチンへの分岐命令(jmp abs.l)
以下にファイルオープンドライバの各機能を解説する。
No.0 (offset 0) fileopen_reset
in a5.l OS サービスエントリのアドレス
out d0.l -1
なにもしない(名称からドライバを初期状態に戻す機能のように思われるが、
初期化は fileopen_init/close である)。Human68k から呼ばれることはなく
DOS _OS_PATCH でアドレス 0、若しくは 0 以外のコマンドが渡された時に呼
び出される。
No.1 (offset 6) fileopen_init
in a5.l OS サービスエントリのアドレス
out d0.l ステータス(0 で正常終了)
ドライバを初期化する。ドライバを変更した直後に呼ばれる。
Human68k 内蔵のファイルオープンドライバでは何もしない。
No.2 (offset 12) fileopen_close
in a5.l OS サービスエントリのアドレス
ドライバの終了処理を行う。ドライバを変更する直前に呼ばれる。
Human68k 内蔵のファイル名ドライバでは何もしない。
No.3 (offset 18) (不明)
in a0.l DPB
a1.l カレントディレクトリ表
a2.l ファイル名バッファ(namests 形式)
a5.l OS サービスエントリのアドレス
out d0.l ステータス
機能不明(恐らく指定ディレクトリからのファイル検索だと思われる)。
Human68k 内蔵のファイル名ドライバでは、常に -1 を返す。
No.4 (offset 24) (不明)
in d1.l セクタ番号
d2.w 参照クラスタ中の残りセクタ数-1
d4.w 先頭からのオフセット
a2.l ファイル名バッファ(namests 形式)
a5.l OS サービスエントリのアドレス
機能不明(恐らく検索成功位置の通知だと思われる)。
Human68k 内蔵のファイル名ドライバでは何もしない。
No.5 (offset 30) (不明)
in a0.l DPB
a1.l ディレクトリエントリを読み込んだバッファアドレス
a2.l ファイル名バッファ(namests 形式)
a5.l OS サービスエントリのアドレス
機能不明(恐らく削除位置の通知か検索位置の初期化の通知だと思われる)。
Human68k 内蔵のファイル名ドライバでは何もしない。
No.6 (offset 36) (不明)
in a0.l DPB
a1.l カレントディレクトリ表
a2.l ファイル名バッファ(namests 形式)
a5.l OS サービスエントリのアドレス
out d0.l ステータス
d1.l 先頭セクタ番号
d2.w 1 クラスタ当りのセクタ数-1
ディレクトリの先頭セクタ番号を収得する。
Human68k 内蔵のファイル名ドライバでは、常に -1 を返す。
No.7 (offset 42) (不明)
in d1.l ディレクトリの先頭セクタ番号
d2.l アクセス中のクラスタ中のセクタ位置
a0.l DPB
a5.l OS サービスエントリのアドレス
機能不明(恐らく参照ディレクトリの先頭セクタ番号の通知だと思われる)。
Human68k 内蔵のファイル名ドライバでは何もしない。
No.8 (offset 48) (不明)
in a0.l DPB
a2.l ディレクトリ名バッファ(namests 形式)
a5.l OS サービスエントリのアドレス
機能不明(恐らくディレクトリの削除通知だと思われる)。
Human68k 内蔵のファイル名ドライバでは何もしない。
No.9 (offset 54) (不明)
in a0.l DPB
a5.l OS サービスエントリのアドレス
out d0.l ステータス
機能不明(恐らく指定ドライブの全ての情報の破棄だと思われる)。
Human68k 内蔵のファイル名ドライバでは何もしない。
No.10 (offset 60) fileopen_dummy10
No.11 (offset 66) fileopen_dummy11
No.12 (offset 72) fileopen_dummy12
No.13 (offset 78) fileopen_dummy13
No.14 (offset 84) fileopen_dummy14
No.15 (offset 90) fileopen_dummy15
No.16 (offset 96) fileopen_dummy16
No.17 (offset 102) fileopen_dummy17
in a5.l OS サービスエントリのアドレス
out d0.l -1
将来拡張用のダミー。現在は全てエラーを返す。
編注 名称および機能は Human68k のコードから推測してる。
ただし、Human68k 内蔵のドライバは有効な機能が全くないので引数や返値が
不明である。確実な情報を得るためには fastopen.x の解析が必要。
==============================================================================
・ファイル名ドライバ
ファイル名の検査・比較などを行う。DOS _OS_PATCH における ID は 4。Human68k
が内蔵しているが、代りにこの機能を処理するドライバとして TwentyOne.x がある。
ファイル名管理を変更するには DOS _OS_PATCH に分岐命令表を渡せばよい。分岐命
令表は以下の 0~19 番の処理へ分岐する命令を並べる。ただし、15~19 は将来拡張用
の現在使用されていないダミーである。
・OS サービスエントリ
offset size
0 6.b キャラクタデバイス検索ルーチンへの分岐命令(jmp abs.l)
6 1.l 使用不可能文字表のアドレス
10 1.b 拡張子フラグ(pathok で拡張子があった場合に 1 にする)
11 1.b 補完文字コード(' 'または'?')
・キャラクタデバイス検索ルーチン
in a0.l デバイス名
out d0.l デバイスヘッダのアドレス(見つからなければ -1 を返す)
指定されたキャラクタデバイスを検索する。
・使用不可能文字表
offset size
0 1.b パスの区切り記号(通常は'\'、0 であればドライバ依存)
1 1.b パスの区切り記号(通常は 0、'/'を設定するための場所)
2 1.w ファイル名先頭に使用できない文字(通常は'-')
ファイル名の先頭には使用できないが、ファイル名の途中には使用で
きる文字を設定する。通常はハイフン('-')が設定されている。
4 1.w 以下の文字数-1
6 ?.b ファイル名に使用できない文字の列(通常は"'+,;<=>[]|)
ファイル名のどの位置でも使用できない文字を並べる。
・拡張子フラグ
namecheck_pathok が呼び出される前に 0 にされる。対象のファイル名に拡
張子があれば 1 をセットして返る。DOS _NAMECK の内部処理で参照される。
・補完文字コード
namecheck_pathok で主ファイル名若しくは拡張子がなかった場合に代わり
に書き込む文字。通常は 0 だが DOS _FILES を補完モードで呼び出した場合
は'?'になる。
以下にファイル名ドライバの各機能を解説する。
No.0 (offset 0) namecheck_reset
in a5.l OS サービスエントリのアドレス
out d0.l -1
なにもしない(名称からドライバを初期状態に戻す機能のように思われるが、
初期化は namecheck_init/close である)。Human68k から呼ばれることはなく
DOS _OS_PATCH でアドレス 0、若しくは 0 以外のコマンドが渡された時に呼
び出される。
No.1 (offset 6) namecheck_init
in a5.l OS サービスエントリのアドレス
out d0.l ステータス(0 で正常終了)
ドライバを初期化する。ドライバを変更した直後に呼ばれる。
Human68k 内蔵のファイル名ドライバでは、使用不可能文字表のアドレス設
定だけを行っている。
No.2 (offset 12) namecheck_close
in a5.l OS サービスエントリのアドレス
ドライバの終了処理を行う。ドライバを変更する直前に呼ばれる。
Human68k 内蔵のファイル名ドライバでは何もしない。
No.3 (offset 18) namecheck_chrdevck
in a2.l ファイル名バッファ(namests 形式)
a5.l OS サービスエントリのアドレス
out d0.l デバイスヘッダのアドレス(見つからなければ -1 を返す)
指定されたファイル名がキャラクタデバイスであるか調べる。
No.4 (offset 24) namecheck_dir_cmp
in d0.b ファイル名 1 の先頭 1 文字($05 は $e5 に戻してある)
a1.l ファイル名 1 のディレクトリバッファ
a2.l ファイル名 2 のディレクトリバッファ
($e5 は $05 にしない)
a5.l OS サービスエントリのアドレス
out ccrZ 0:不一致 1:一致
指定バッファの内容がドライブ上の内容と同じかどうか比較する。
ファイル名 2 にはワイルドカード'?'が使用できる。
No.5 (offset 30) namecheck_namebf_cmp
in a2.l ファイル名バッファ 1(namests 形式)
a3.l ファイル名バッファ 2(namests 形式)
a5.l OS サービスエントリのアドレス
out ccrZ 0:不一致 1:一致
指定バッファのファイル名を比較する。
ファイル排他処理とファイルオープンドライバから呼ばれる。
No.6 (offset 36) namecheck_knj_case_cmp
in d0.w 比較するバイト数-1
a4.l 文字列 1
a5.l 文字列 2
out d2.b 最後の文字
a4.l 比較終了時の文字の次のアドレス
a5.l 比較終了時の文字の次のアドレス
ccrZ 0:不一致 1:一致
文字列を比較する。namecheck_namebf_cmp や ファイルオープンドライバの
OS サービスエントリから呼び出される。
OS サービスエントリは渡されない(呼び出し元によっては渡される事もある)。
No.7 (offset 42) namecheck_pathset
in d0.b 先頭の文字
d2.w バイト数
a0.l バッファ先頭アドレス
a1.l ディレクトリ名の先頭アドレス+1
a3.l 書き込み開始バッファアドレス
a5.l OS サービスエントリのアドレス
out d0.l ステータス
a1.l 読み取ったディレクトリ名の末尾+1
a3.l バッファに書き込んだディレクトリ名の末尾+1
DOS _NAMESTS の内部処理でドライブ名とファイル名の間のディレクトリ名
をバッファに書き込む為に呼び出される。因にドライブ名は DOS _NAMESTS、
ファイル名は namecheck_pathok がそれぞれ処理する。
引数の a3.l は namecheck_pathset がディレクトリ名を処理して書き込む
バッファのアドレスである。このアドレスの直前には、もしあれば、カレント
ディレクトリ名が予め書き込まれている。a0.l はこのバッファの先頭アドレ
スを指す。カレントディレクトリがルートであれば a0.l=a3.l となり、それ
より下層のディレクトリであれば a0.l<a3.l となる。"."や".."を処理する
場合、a3 を a0 より前に行かない範囲で遡ってよい。
No.8 (offset 48) namecheck_pathok
in a0.l ディレクトリ名先頭アドレス
a1.l ファイル名の先頭アドレス
a2.l ファイル名バッファ(namests 形式)
a3.l ディレクトリ名の末尾+1('\'の次)
a5.l OS サービスエントリのアドレス
out d0.l ステータス
DOS _NAMESTS の内部処理でファイル名をバッファに書き込む為に呼び出さ
れる。ワイルドカード'*'は'?'に変換する。また、ワイルドカードの文字数を
バッファに書き込む(ただし、ファイル名がない場合は -1 とする)。拡張子が
あるファイル名の場合は OS サービスエントリ内の拡張子フラグを 1 にセッ
トする。また、主ファイル名または拡張子がない場合は補完文字コードを代り
に書き込む。
引数の a0.l/a3.l は namecheck_pathset の返値そのものであり、ファイル
名として".."が与えられた場合は a3 を遡ってよい。
No.9 (offset 54) namecheck_files_set
in a1.l 検索バッファ(files 形式)
a2.l ファイル名バッファ(namests 形式)
a5.l OS サービスエントリのアドレス
out d0.l ステータス
DOS _FILES が成功した場合に呼び出され、検索バッファに DOS _NFILES 用
の検索ファイル名を設定する。その他の検索条件は DOS コール内で設定され
るので関与しなくてよい。
Human68k 内蔵のファイル名ドライバでは、主ファイル名(8 文字)と拡張子
を書き込み、常に 0 を返す。
No.10 (offset 60) namecheck_files_get
in a2.l 検索バッファ(files 形式)
a5.l OS サービスエントリのアドレス
out d0.l ステータス
a2.l ファイル名のアドレス
DOS _NFILES で検索バッファから検索ファイル名を得るために呼び出される。
Human68k 内蔵のファイル名ドライバでは、検索バッファのアドレス+10 を
a2 に返すだけである。
No.11 (offset 66) namecheck_files_err
in a1.l 検索バッファ(files 形式)
a5.l OS サービスエントリのアドレス
out なし
DOS _FILES でワイルドカードを使用していないファイル名で検索した時と
DOS _NFILES で検索が失敗した時に呼び出される。以後は次検索が行われる事
はないので検索用の拡張バッファなどを確保していた場合などは、ここで解放
する。
Human68k 内蔵のファイル名ドライバでは何もしない。
No.12 (offset 72) namecheck_files_ent
in d1.w モード(0:mkdir/chdir 1:files)
a1.l 参照するファイル名バッファ(主ファイル名 8 文字+拡張子
3 文字+(属性)+主ファイル名 10 文字)
a2.l 書き込むファイル名バッファ
a5.l OS サービスエントリのアドレス
out d0.l ステータス
a2.l ファイル名の末尾+1
8+3+10 文字ずつに分割されているファイル名をピリオドを含めて連続した
22 文字のファイル名に変換する。
引数の d1.w が 0 の時は mkdir/chdir の為に a1.l に namests バッファ
先頭アドレス+67 が渡される。d1.w が 1 の時は files の為に a1.l にディ
レクトリエントリをそのまま読み込んだバッファが渡される。この場合前者に
比べて拡張子とファイル名 2 の間にファイル属性が 1 バイト格納されている
ので、その分を補正しなければならない。
No.13 (offset 78) namecheck_errchr
in d0.b 文字
a5.l OS サービスエントリのアドレス
out ccrZ 0:可 1:不可
指定の文字がファイル名として使用可能かどうか調べる。
Human68k 内蔵のファイル名ドライバでは、/-"' の各文字が使用不可である。
No.14 (offset 84) namecheck_yenslh
in a1.l ファイル名のアドレス
a4.l バッファアドレス
a5.l OS サービスエントリのアドレス
out d0.l ステータス
ファイル名を検査しながらバッファに転送する。ファイル名は最大で 90 バ
イトまで。通常は DOS コール処理内で文字表から一文字ずつ調べていくが、
使用不可能文字表の 1 バイト目が 0 であった時に呼び出される。
Human68k 内蔵のファイル名ドライバでは何もしない(文字表の先頭が常に
'\'なので呼び出される事はない)。
No.15 (offset 90) namecheck_dummy15
No.16 (offset 96) namecheck_dummy16
No.17 (offset 102) namecheck_dummy17
No.18 (offset 108) namecheck_dummy18
No.19 (offset 114) namecheck_dummy19
in a5.l OS サービスエントリのアドレス
out d0.l -1
将来拡張用のダミー。現在は全てエラーを返す。
編注 名称および機能は TwentyOne.x を参考にしている。
==============================================================================