Skip to content
Gaku edited this page Sep 8, 2022 · 2 revisions

ファイルを読み込んで表示する

LSX-Dodgers、MSX-DOSで動作します。

catとほとんど同じですが、決まったファイルを読み込む場合はFCBを用意します。

ドライブ番号とファイル名、拡張子の部分だけ用意してあとは「0」で埋めておけばOKです。

データの読み出し先はDTAになるのでシステムコールの「1AH DTAの設定(_SETDTA)」で設定します。

;	READ

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,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		;プログラム終了

FCB:				;FCBは37バイト
	DB	0,"READ    ASM"	;カレントドライブ=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

Clone this wiki locally