Skip to content
Gaku edited this page Nov 18, 2022 · 6 revisions

階層ディレクトリにあるファイルを読み込んで表示する

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

readとほとんど同じですが、システムコールの「$29 ファイル名の解析(_PPATH)」を使ってパス名からFCBを作成します。

;	READSD

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

BUFAD	EQU	1000H
BUFSZ	EQU	0400H

	ORG	0100H

	JP	START		;0C3HはZ80ではJPだが、i8086ではRETなので
START:				;間違えてMS-DOS環境で実行しても即終了できる
	LD	DE,PATH
	LD	HL,FCB
	LD	C,$29		;ファイル名の解析(_PPATH)
	CALL	SYSTEM

	LD	DE,FCB
	LD	C,00FH		;ファイルのオープン(_FOPEN) CP/M MSX-DOS
	CALL	SYSTEM
	OR	A
	JP	NZ,0		;失敗したら終了

	LD	HL,1
	LD	(FCB+14),HL	;レコードサイズを1にする

	LD	DE,BUFAD	;データの読み出し先
	LD	C,01AH		;DTAの設定(_SETDTA) CP/M MSX-DOS
	CALL	SYSTEM
LOOP1:
	LD	DE,FCB
	LD	HL,BUFSZ	;データを読み出すサイズ(バイト単位)
	LD	C,027H		;ランダムブロック読み出し(_RDBLK) MSX-DOS
	CALL	SYSTEM
	CP	0FFH
	JR	Z,EXIT2		;失敗したら終了
	PUSH	AF
	LD	DE,BUFAD
LOOP2:
	LD	A,H		;HLに読み込んだサイズ
	OR	L
	JR	Z,EXIT1

	LD	A,(DE)
	INC	DE

	PUSH	DE		;CP/MやMSX-DOSではシステムコールでレジスタが破壊される
	PUSH	HL
	LD	E,A
	LD	C,2		;コンソール出力(_CONOUT) CP/M MSX-DOS
	CALL	SYSTEM
	POP	HL
	POP	DE
	DEC	HL
	JR	LOOP2
EXIT1:
	POP	AF
	OR	A		;A=0の場合はバッファサイズすべて読み込みできたなので、まだ読み込みできていない残りがある
	JR	Z,LOOP1		;A=1の場合はすべて読み込み完了している
EXIT2:	
	LD	DE,FCB
	LD	C,010H		;ファイルのクローズ(_FCLOSE) CP/M MSX-DOS
	CALL	SYSTEM

	JP	0		;プログラム終了

PATH:				;読み込むパス名
	DB	"B:\\SUB\\HELLO.TXT",0
FCB:				;FCBは37バイト
	DS	36
	DB	0

Clone this wiki locally