Skip to content
Gaku edited this page Dec 13, 2023 · 1 revision

ファイル一覧をディレクトリも含めて表示する

LSX-Dodgersでしか動作しません。

ファイルの一覧の際にディレクトリも含めて表示する場合は FCB の+13 属性(アトリビュート)にbit4:ディレクトリを1にして「011H ファイル検索(_SFIRST)」と「12H 次のファイル検索(_SNEXT)」を使います。

これらのシステムコールでマッチした場合はDTAにFCBではなくドライブ番号(1バイト)とディレクトリエントリ(32バイト)の計33バイトがコピーされる。
最初がドライブ番号でファイル名(8バイト)と拡張子(3バイト)が続くので、そのままオープンされていないFCBとして使用可能です。

;	LSD

SYSTEM	EQU	0005H		;システムコール
FCB1	EQU	005CH		;1番目の引数のFCB
FCB2	EQU	006CH		;2番目の引数のFCB
DTA1	EQU	0080H

	ORG	0100H

	JP	START		;0C3HはZ80ではJPだが、i8086ではRETなので
START:				;間違えてMS-DOS環境で実行しても即終了できる
	LD	DE,FCB		;一覧取得先
	LD	C,01AH		;DTAの設定(_SETDTA) CP/M MSX-DOS
	CALL	SYSTEM

	LD	A,(FCB1)	;ドライブ
	LD	(FCB_FILTER),A

	LD	A,010H		;ディレクトリも表示
	LD	(FCB_FILTER+13),A	;アトリビュート

	LD	DE,FCB_FILTER
	LD	C,011H		;ファイル検索(_SFIRST) CP/M MSX-DOS
	CALL	SYSTEM
LOOP1:
	OR	A
	JR	NZ,EXIT1

	LD	HL,FCB+1
	LD	B,11		;ファイル名(8)+拡張子(3)
LOOP2:
	LD	E,(HL)
	INC	HL

	PUSH	BC		;CP/MやMSX-DOSではシステムコールでレジスタが破壊される
	PUSH	HL
	LD	C,2		;コンソール出力(_CONOUT) CP/M MSX-DOS
	CALL	SYSTEM
	POP	HL
	POP	BC

	DJNZ	LOOP2

	LD	E,0DH
	LD	C,2		;コンソール出力(_CONOUT) CP/M MSX-DOS
	CALL	SYSTEM
	LD	E,0AH
	LD	C,2		;コンソール出力(_CONOUT) CP/M MSX-DOS
	CALL	SYSTEM

	LD	C,12H		;次のファイル検索(_SNEXT) CP/M MSX-DOS
	CALL	SYSTEM
	JR	LOOP1

EXIT1:
	JP	0		;プログラム終了

FCB_FILTER:			;FCBは37バイト
	DB	0,"???????????"	;カレントドライブ=0,ファイル名8文字,拡張子3文字
	DB	0,0,0,0, 0,0,0,0, 0,0,0,0	;残りは0で埋める
	DB	0,0,0,0, 0,0,0,0, 0,0,0,0, 0
FCB:				;FCBは37バイト
	DB	0,0,0,0, 0,0,0,0, 0,0,0,0
	DB	0,0,0,0, 0,0,0,0, 0,0,0,0
	DB	0,0,0,0, 0,0,0,0, 0,0,0,0, 0

Clone this wiki locally