-
Notifications
You must be signed in to change notification settings - Fork 6
read
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