; *---------------------------------------------------------*
;     バイナリ専用RAMファイルシステム              
;     FX-Binary-Filer(FBF) File Control Subsystem  
; *---------------------------------------------------------*

;Version.4.2 (内部バージョン 4.2.0) 2011/3/8
;(C)Copyright by Jun Amano 2003-2011
;(一部 あお氏のコードを含みます)
;
;---------------------------------------------------------------------------------
;使用方法
;(1) ワークエリアに情報を書き込んで、MODE110(BASE) を実行
;(2) 以下のコマンドライン文法で起動
;  ファイル登録    :MODE110(BASE)BS "ファイル名",開始アドレス,サイズ{,実行アドレス}
;  ファイルロード  :MODE110(BASE)BL "ファイル名"{,ロードアドレス}
;  ファイル削除    :MODE110(BASE)KL "ファイル名"
;  ファイルリネーム:MODE110(BASE)RN "ファイル名","ファイル名"
;  ファイル検索    :MODE110(BASE)SF "ファイル名"
;  システム情報    :MODE110(BASE)SI
;  FBF切り離し     :MODE110(BASE)OF
;  RR形式実行      :MODE110(BASE)RR "ファイル名"
;  RR形式実行      :MODE110(BASE)RL "ファイル名",アドレス
;  ジャンパコピー  :MODE110(BASE)JP
;  ファイル移動    :MODE110(BASE)MV "ファイル名" (先頭に$が付くファイルのみ有効)
;
;  RR形式のファイルを実行する場合は ファイル名が nn.R である場合、
;       MODE110(BASE)nn で実行出来る。(nn=2文字限定)
;
; {}部分は省略可能、省略不可能部分を省略した場合は SN error となる。
;
; BASE=DIREN(PEEK(&H18D2)*2+PEEK&H18D1)＋１のアドレス
; 尚、POKE&H1793,9:MODE110(PEEK(&H18D2)*256+PEEK(&H18D1)+1)とする事で、
; &H1684(パスワード保管エリア)をコールしてもFBFを使用出来るようになる。
;
; 機械語からワークエリア指定でコール(JP及びCAL)する場合は、以下の条件を実施する。
; (1) 事前に IZレジスタ の指す外部アドレスの内容を『0』 にする
;例) PRE IZ,0 ←適当なアドレス
;    LD $0,0 
;    ST $0,(IZ+$31)
; (2) CAL呼び出し時はIXレジスタ の内容を 0 にしている状態で
;     &H1793に128以上のファンクション番号を書き込み、FBFを呼び出す。
;
;
;---------------------------------------------------------------------------------

	ORG &H0000

; ワークエリア及び定数定義
WORK:	EQU &H1793 		;ワークエリア:FDDバッファ(先頭より)
DIREN:	EQU &H18D1		;システムポインタ(RAM最終アドレス)
MEMEN:	EQU &H18CF		;システムポインタ(フリーエリア先頭アドレス)
CALC:	EQU &H18D3		;CALCバッファ先頭アドレス
JPSIZE:	EQU &H0002 		;ジャンプテーブル部分のサイズ-1
RESULT:	EQU &H17A7 		;リザルトコード出力アドレス
SSPBT:	EQU &H1AD7		;システムスタックポインタの最終位置

; システムコール
SNERR:	EQU 	&H2B70		;SN Error
NEXTC:	EQU	&H0049		;スペース以外の文字を検索
SCF2C:	EQU	&H00C3		;NEXTC&($1=&H2C)チェック(フラグのみ変化)
SCE2C:	EQU	&H00DB		;NEXTC&($1=&H2C)チェック(不一致でSNErr)
BIN02:	EQU	&H0EE2		;実数-->整数型変換(word)
SIKI:	EQU	&H1088		;式計算(文字､数値)
EXPRW:	EQU	&H112F		;式計算(数値)
BIOS:	EQU	&H5321		;BIOS(BANK0)をコールしてBANK1に戻る
BINM2:  EQU	&H0EFD		;実数-->整数型変換(word) (値が2の補数な場合、正数にする)
BASLET: EQU 	&H2EA2		;BASIC LET命令
B2DEC:	EQU	&H50B4		;$3,$4の内容が0以外の時、10進数文字列に変換してIX以降に格納。

;
; 全ルーチン共通使用レジスタ
; $22,$23 -- DIREN(&H18D1)
; $24,$25 -- MEMEN(&H18CF)
; $26,$27 -- 14(ディレクトリサイズ)
; $28 ------ 128=CAL呼び出し/0=JP呼び出し
; $29 ------ ファンクション番号
;
; 〜〜〜〜〜 動的エリア(アドレスが変わるエリア) 〜〜〜〜〜
; *---------------------------------------------------------*
;    ジャンプテーブル 
; *---------------------------------------------------------*
JUMP:	JP FBFBOOT

; **** この間にファイルが格納されていきます *****

; 〜〜〜〜〜 静的エリア(アドレスが変わらないエリア) 〜〜〜〜〜
; *---------------------------------------------------------*
;    FBFシステム情報保存エリア
; *---------------------------------------------------------*

MAX:	DS 1   			;最大登録数
DRADD:  DS 2   			;インストール前DIRENアドレス

; *---------------------------------------------------------*
;    FBFのジャンプテーブル用転送内容 
; *---------------------------------------------------------*

JPSTART:JP FBFBOOT		;FBFシステムにジャンプ
JPEND:

;======== サブルーチン =============================================
; *---------------------------------------------------------*
;    BIOSコール処理   
; *---------------------------------------------------------*
;【入力】$28,29:呼び出し先BIOSアドレス

RCS:	PST UA,&H54		;BIOS呼び出し
	JP BIOS			

; *---------------------------------------------------------*
;    ワークエリアクリア(サブルーチン部)
; *---------------------------------------------------------*
;【入力】無し
;【出力】WORK〜WORK+29をゼロクリアする
;【使用レジスタ】$0〜$4,IX

WRKCLR:	PRE IX,WORK		;0クリア開始アドレス
       	LD $2,30		;ワークサイズ(30byte)
WRKCLR2:STI $31,(IX+$31)	;0 Fillを繰り返す
        SB $2,$30
        JR NZ,WRKCLR2
	RTN

; *---------------------------------------------------------*
;    パラメータチェック 
; *---------------------------------------------------------*
;【出力】$2:ファイル最大登録数
;        キャリーフラグON:ファイル登録無し
;【使用レジスタ】$2,IX

MAXCK:	PRE IX,MAX
	LD $2,(IX+$31)  	;$2にファイル登録数をセット
	SBC $2,$30 		;ファイル登録数が0ならキャリーON
        RTN

; *---------------------------------------------------------*
;    第１ファイル名検索サブルーチン 
; *---------------------------------------------------------*
;【入力】WORK+2からWORK+9（検索したいファイル名)
;【出力】キャリーON(ファイルは見つからなかった)
;        キャリーOFFの場合:$10〜$19にファイル情報が入る
;【使用レジスタ】$14〜21,IX

FN1SCH:	PRE IX,WORK+2

; *---------------------------------------------------------*
;    検索ルーチン(サブルーチン部) 
; *---------------------------------------------------------*
;【入力】【ファンクション0以外の時】
;         $14〜$21 検索したいファイル名を入れて、CAL SEARCHを実行。
;        【ファンクション0(ファイル番号検索)の時】
;         $2にファイル番号を入れて、CAL SEARCH2 を実行。
;
;【出力】以下のレジスタに見つかったファイル情報が格納される。
;        $1     :ファイル名の先頭が $ かどうか(0=$ 1=それ以外)
;        $2〜$9 :ファイル名
;        $10,$11:ファイルのロードアドレス
;        $12,$13:ファイルサイズ
;        $14,$15:実行アドレス
;        $16,$17:収納アドレス(ファイル本体の先頭アドレス)
;
;        キャリーフラグ=ON(エラー)/OFF(正常終了)
;
;使用レジスタ=$0〜$21,IX
;
;
SEARCH:	LDM $14,(IX+$31),8	;ワークエリアから読み込み
	CAL MAXCK		;$2にファイル登録数を入れる為にコール
	RTN C			;ファイル登録数が0だったら抜ける
				;※このルーチンは$2の数だけ先頭ファイルから検索を行う。
				;  よって$2は最大登録数以下でなければならない

SEARCH2:LDW $3,MAX-1 		;最初に登録されているファイルのディレクトリ先頭アドレスを取得

SEAC2:	SBW $3,$26		;ディレクトリ先頭アドレスを算出(14を引いて1を足す)
        ADW $3,$30		;これでディレクトリの先頭アドレスになる。
        PRE IX,$3

        LDM $6,(IX+$31),8	;そこからファイル名を取得
	PHU $6			;$6 をユーザースタックに避難

        LDW $5,10		;検索対象ファイルを次のファイルにするため、				
        LDW $0,(IX+$5)		;現在検索しているファイルのサイズ情報を読み取る

	PPU $6			;$6 をユーザースタックより復帰

       	SBW $3,$0		;ディレクトリ先頭アドレスからサイズを引く(ファイルエリアの先頭アドレスになる)

        SBC $29,0   		;ファイル番号で検索はファイル名で判断しない
        JR Z,SEAC3		;(ファンクション番号=0)

	SBBCM $6,$14,8		;内容一致かどうか調べる(BCD8バイト演算)
	JR NZ,SEAC3		;違う時は次のファイル検索へ

SEAC4:	LDW $16,$3		;収納アドレスを保存
	LDIM $2,(IX+$31),8	;同じ場合(見つかった場合)はディレクトリの情報をレジスタに転送
        LDM $10,(IX+$31),6

	LDW $0,&H0124		; ファイル名の先頭が $ かどうか調べる
	SBC $2,$0
	JR NZ,SEACRET

	LD $1,$31		; 先頭が $ なら $1 を 0 にする。

SEACRET:ADC $30,$31		;キャリーをOFFにするためのダミー演算
        RTN                     ;見つかったら抜ける

SEAC3:	SB $2,$30		;ファイル総数(即ち総読み込み回数)-1にする。
        JR Z,SEAC5		;見つからなかったら SEAC5へ

       	SBW $3,$30,JR SEAC2     ;さらに1を引く(次のファイルのディレクトリの最終アドレス)

SEAC5:	SBC $29,0		;ファンクション番号0(ファイル番号検索)だったら
      	JR Z,SEAC4		;ファイル情報を取得する。
      	SBC $31,$30		;それ以外ではキャリーON(異常結果)にして抜ける。
      	RTN
; *---------------------------------------------------------*
;    削除サブルーチン
; *---------------------------------------------------------*
;【入力】コール事前にファイル情報をサーチしておく事
;        (ファイルが存在する事を確認してからコールする)
;       実行に必要な情報
;       $1     :ファイルの先頭が $ かどうか(0=$ 1=それ以外)
;       $10,$11:ファイルのスタートアドレス
;       $12,$13:ファイルサイズ
;       $14,$15:実行アドレス
;       $16,$17:収納アドレス(ファイルエリアの先頭アドレス)
;
;【出力】原則キャリーOFF(削除成功)/ON(ファイル名の先頭が$のファイル)
;
;使用レジスタ=$0〜$2,IX,IY,IZ

DEL:	SBC $1,$30		;ファイル名の先頭が $ だったらNG(キャリーONで抜ける)
	RTN C

	CAL MAXCK		;ファイル総数から1を引く
       	SB $2,$30     		
	ST $2,(IX+$31)		;IX(MAXCK実行で記憶エリアMAXを指す)へ出力

	LDW $0,$16		;ファイルエリアの先頭アドレス - 1 =
	SBW $0,$30		; 前のファイルのディレクトリ最終アドレス
	PRE IX,$0		;転送元最終アドレスにセット

       	LDW $0,($22)		;DIREN+1 FBFエリアの先頭アドレス
	ADW $0,$30
       	PRE IY,$0     		;転送元先頭アドレスをセット

       	ADW $0,$12    		;DIRENの更新(現在のDIRENを読み込んでまずファイルサイズを足して)
       	ADW $0,$26		;ディレクトリサイズを足す
	SBW $0,$30
       	STW $0,($22)		;DIRENに出力
	
	ADW $16,$12		;ファイル格納アドレスの先頭アドレス + ファイルサイズ =
				;ディレクトリの先頭アドレス
	ADW $16,$26		;ディレクトリの先頭アドレス + 14 = 
				;前のファイルのファイル格納アドレス
	SBW $16,$30		;1を引いて、ディレクトリの最終アドレスを取得

	PRE IZ,$16		;転送先先頭アドレス
	
       	BDN			;転送開始

	ADC $30,$31		;キャリーOFFにする為のダミー演算

	RTN

; *---------------------------------------------------------*
;    ファイル名ロードサブルーチン 
; *---------------------------------------------------------*
;【入力】(1) ワークエリア(第1ファイル名)
;        (2) $0 に 0=デフォルトアドレス 1=ロードアドレス指定
;            を入れて CAL する。
;【出力】キャリー OFF(成功)/ON(失敗)
;【使用レジスタ】$0〜$21,IX,IY,IZ

LOADSUB:PRE IX,WORK+29		;ファンクションをワークエリアに待避
	ST $0,(IX+$31)		;(0=デフォルトロード 1=ロードアドレス指定)

	CAL FN1SCH		;第１ファイル名情報取得
	RTN C			;ロードファイルが見つからない時はNG

        SBCW $12,$30		;サイズが0だったらNG
        RTN C

	PRE IX,WORK+29		;ワークエリアからファンクションを復帰
	LD $0,(IX+$31)		;(デフォルトアドレスか、
				;ロードアドレス指定か)

        SBC $0,$30 		;ファンクション番号が
        JR NZ,LOADSB2		;ファイルロード先指定(4)じゃなかったら次へ

        PRE IX,WORK+18		;ファイルロード指定だったら、
        LDW $10,(IX+$31)	;ワークエリアからロードアドレスを読み込む

LOADSB2:PRE IZ,$10		;ロードアドレスを転送先開始(スタート)アドレスとしてセット
	
	ADCW $10,$12		;ロードアドレス+サイズでキャリーしたらNG
	RTN C

	PRE IX,$16		;転送元先頭アドレスをセット(ファイルエリアの先頭アドレス)

	ADW $16,$12		;ファイルサイズを足す
	SBW $16,$30		;-1をする(ファイルエリアの最終アドレス)
	PRE IY,$16
	
	BUP

	SBC $31,$31		;正常終了(キャリーOFFにする)
	RTN

; *---------------------------------------------------------*
;    10進数出力サブルーチン
; *---------------------------------------------------------*
;【入力】$5,6 ----- 変数名のデータ位置
;	 IZ ------- 変換したい数値のアドレス 
;【出力】16進数 65535 --> '6' '5' '5' '3' '5' (5バイトのデータ)

AD10:	CAL FWCLR		;ファイル名変数ワークを初期化
	LDW $3,(IZ+$31)		;外部アドレスから変換したい数値を読み込む

	PRE IX,$5               ;変数名のデータ位置指定
	LDM $5,(IX+$31),3	;変数名を読み取る
	PRE IX,FNWORK2
	STIM $5,(IX+$31),3	;ファイル名変数ワークへ出力

	SBCW $3,$30		;外部アドレスから読み込んだ数値が "0" か?
	JR NC,AD102

        LD $0,48		; "0"のコードを出力
	ST $0,(IX+$31)
	JR AD103

AD102: 	LDW $28,B2DEC		; $3,4 を 10進数ASCII に変換
	CAL RCS

AD103:	PRE IZ,FNWORK2		;IZを変数代入文の先頭にセット
	LDW $28,BASLET		;BASICのLET命令実行
	CAL RCS
	RTN

; *---------------------------------------------------------*
;    ファイル名変数代入ワークの初期化
; *---------------------------------------------------------*
FWCLR:	PRE IX,FNWORK2		;変数(FN$)代入用ワークをクリアする
	LD $2,11
        CAL WRKCLR2
	RTN

; *---------------------------------------------------------*
;    変数代入サブルーチン
; *---------------------------------------------------------*
; *---------------------------------------------------------*
;    ファイル名の出力
; *---------------------------------------------------------*

VARINP: PRE IX,FNWORK2		;ファイル名を変数代入ワークへ転送する
        STM $2,(IX+$31),8

	LDW $0,FNWORK2
FNLET1: LD $2,($0)		;1文字読み込む
	SBC $2,$30		;もし文字コード0だったら
	JR C,FNLET2
	ADW $0,$30,FNLET1

FNLET2:	PRE IX,FNWORK4		;"と0を転送する	
	PRE IY,FNWORK4+1
	PRE IZ,$0
	BUP

	PRE IZ,FNWORK1		;LETコマンド実行
	LDW $28,BASLET
	CAL RCS

; *---------------------------------------------------------*
;    開始アドレスの出力
; *---------------------------------------------------------*

;【入力】$5,6 ----- 変数名のデータ位置
;	 IZ ------- 変換したい数値のアドレス 

	LDW $5,STWORK1
	PRE IZ,WORK+10
	CAL AD10

; *---------------------------------------------------------*
;    サイズの出力
; *---------------------------------------------------------*

	LDW $5,SZWORK1
	PRE IZ,WORK+12
	CAL AD10

; *---------------------------------------------------------*
;    実行アドレスの出力
; *---------------------------------------------------------*

	LDW $5,EXWORK1
	PRE IZ,WORK+14
	CAL AD10

; *---------------------------------------------------------*
;    収納アドレスの出力
; *---------------------------------------------------------*

	LDW $5,SOWORK1
	PRE IZ,WORK+16
	CAL AD10

; *---------------------------------------------------------*
;    変数代入処理終わり
; *---------------------------------------------------------*
VAREND:	LD $28,$31		;通常呼び出しフラグをリセットする
 	JP OK

; *---------------------------------------------------------*
;    リザルトコード「OK」出力サブルーチン
; *---------------------------------------------------------*
; 【使用レジスタ】$0,IX
;
OKSUB:	LD $0,$31,SETRES
; *---------------------------------------------------------*
;    リザルトコード「NG」出力サブルーチン
; *---------------------------------------------------------*
; 【使用レジスタ】$0,IX
;
NGSUB:	LD $0,$30
SETRES:	PRE IX,RESULT
	ST $0,(IX+$31)
	RTN

;================メインルーチン=====================================
; *---------------------------------------------------------*
;    コマンドライン起動判定
; *---------------------------------------------------------*
; 【使用レジスタ】$0
;
FBFBOOT:LD $0,&H20		;コマンドライン文字指定あり
	SBC (IZ+$31),$0		;
	JP NC,CMDLINE		;コマンドライン処理に分岐

; *---------------------------------------------------------*
;    ワークエリア起動処理
; *---------------------------------------------------------*

;
WORKARA:LD $28,128		;CALL呼び出しか、通常呼び出しか

	LDW $0,WORK		;ファンクション読み込み
	LD $29,($0)
	SBC $29,128		;ファンクション番号が128以上かつIXレジスタの値を確認
	JR C,WORKAR2

	GRE IX,$0		;IXレジスタの値を読み込む(0でない場合はCAL呼び出しは無効)
	SBCW $0,$30
	JR C,WORKAR2

	LD $28,$31,NG4

WORKAR2:CAL OKSUB		;リザルトコードを 0 にする。
	LDW $22,DIREN　		;全ルーチン共通使用レジスタ定義
	LDW $24,MEMEN
	LDW $26,14

	AN $28,$29		;上位1ビットのみ有効にする($28=128(CALLにて呼び出し) 0(通常呼び出し))
	AN $29,127		;下位7ビット=ファンクション番号

	SBC $29,0		;0の時は検索
	JP Z,FSEARCH
	SBC $29,1		;1の時は登録
	JP Z,SAVE
	SBC $29,2		;2の時は削除
	JP Z,DELETE
	SBC $29,3		;3の時はロード(標準)
	JP Z,LOAD
	SBC $29,4		;4の時はロード(読み込み指定)
	JP Z,LOAD
	SBC $29,5		;5の時はリネーム
	JP Z,RENAME
	SBC $29,6		;6の時はファイル名検索
 	JP Z,FNSCH
	SBC $29,7		;7の時は情報取得
	JR Z,GETST
	SBC $29,8		;8の時はジャンプ部分のコピーを作成する
	JR Z,JUMPCP
	SBC $29,9		;9の時はワークエリアクリア
	JP Z,WORKCL
	SBC $29,10		;10の時はRR式プログラムの実行
	JP Z,WRKRR
	SBC $29,11		;11の時はRR式プログラムの実行(アドレス指定)
	JP Z,WRKRR
	SBC $29,12		;12の時はファイル先頭移動処理
	JP Z,MOVFL1
	SBC $29,127		;127の時は解除
	JR Z,EXOFF
NG4:	JP NG			;それ以外の場合はそのまま抜ける

; *---------------------------------------------------------*
;    パスワード格納エリアにジャンプ部分を作成する
; *---------------------------------------------------------*

JUMPCP:	PRE IX,JPSTART		;転送元先頭アドレスをセット
	PRE IY,JPEND-1		;転送元最終アドレスをセット
	PRE IZ,SSPBT		;転送先先頭アドレスをセット
	BUP
	JP OK

; *---------------------------------------------------------*
;   システム情報出カ
; *---------------------------------------------------------*
;
GETST:	PRE IX,MAX		;保存エリアの先頭アドレス
      	LDM $0,(IX+$31),3	;保存エリア(5バイト)の内容を一括読み込み
      	PRE IX,WORK+1		;ワークエリアにコピー
      	STM $0,(IX+$31),3
      	JR OK

; *---------------------------------------------------------*
;   システム切り離しルーチン
; *---------------------------------------------------------*

EXOFF:	PRE IX,DRADD		;常駐前のアドレスを取得
	LDW $0,(IX+$31)
	STW $0,($22)		;DIRENに出力
	JR OK	

; *---------------------------------------------------------*
;   ファイル名削除ルーチン(コール部)
; *---------------------------------------------------------*
;【使用レジスタ】$0〜$21,IX,IY,IZ

DELETE: CAL FN1SCH		;ファイル名を検索
NG5:	JR C,NG4		;ファイルが見つからなかったらNG
        CAL DEL			;削除ルーチンをコール
	JR C,NG4	

; *---------------------------------------------------------*
;　　 リザルトコード「OK」出力処理
; *---------------------------------------------------------*
; 【使用レジスタ】IX
;
OK:	CAL OKSUB

; *---------------------------------------------------------*
;    戻りサブ
; *---------------------------------------------------------*

RET:	PRE IX,WORK		;ワークエリアのファンクション番号を 0 にする
	ST $31,(IX+$31)

	SBC $28,$30
	RTN NC			;CALL呼び出しの場合はそのまま抜ける
	PST UA,&H54		;バンク切り替え(ROM)
	RTN			;抜ける

; *---------------------------------------------------------*
;   ファイル番号検索
; *---------------------------------------------------------*
;【使用レジスタ】$0〜$21,IX
;
FSEARCH:CAL FWCLR		;変数代入ワークの初期化
	CAL MAXCK		;$2にファイル登録数を入れるためにコール
	JR C,NG5
  	PRE IX,WORK+1		;指定したファイル番号が登録数を越えていたらNG
  	LD $0,(IX+$31)
  	SBC $2,$0		;ファイル登録数が0の時はNG
  	JR C,NG5
	SBC $0,$31		;指定したファイル番号が0の時はNG
	JR Z,NG
	LD $2,$0		;ファイル検索番号をセット
  	CAL SEARCH2		;ファイル番号検索実行
	PRE IX,WORK+2		;ワークエリアに出力
        STIM $2,(IX+$31),8
	STM $10,(IX+$31),8
 
	; 変数FL$,ST,SZ,EX,SO にファイル名を代入する処理(CAL呼び出し時は行わない)
FSEARC2:SBC $28,$30
	JR NC,OK		;CALL呼び出しの場合はそのまま抜ける
	JP VARINP

; *---------------------------------------------------------*
;    ワークエリアクリア(コール部)
; *---------------------------------------------------------*
WORKCL:	CAL WRKCLR
	JR OK

; *---------------------------------------------------------*
;    ファイル名検索ルーチン(コール部)
; *---------------------------------------------------------*
;【使用レジスタ】$0〜$21,IX
;
FNSCH:  CAL FWCLR	;変数代入ワークの初期化
	CAL FN1SCH		;第１ファイル名を検索
        JR C,NG			;ファイルが無かったらNG

	PRE IX,WORK+10		
	STIM $10,(IX+$31),8	;ファイル情報をワークエリアに出力

	JR FSEARC2		;変数に代入する

; *---------------------------------------------------------*
;   リザルトコード「NG」出力処理
; *---------------------------------------------------------*
; 【使用レジスタ】IX
;
NG:	CAL NGSUB
	JR RET

; *---------------------------------------------------------*
;   ファイルロード処理
; *---------------------------------------------------------*
;
; 使用レジスタ=$0〜$21,IX,IY,IZ
;
LOAD:	SBC $29,4		;アドレス指定ロードか?
	JR Z,LOAD2

	LD $0,$31		;デフォルトアドレスでロードする
	CAL LOADSUB		;ロードサブを呼び出し
	JR LOAD3

LOAD2:	LD $0,$30		;アドレス指定ロード
	CAL LOADSUB		;ロードサブを呼び出し

LOAD3:  JR C,NG			;NGの場合
OK3:	JR OK			;OKの場合

; *---------------------------------------------------------*
;    ファイル保存処理
; *---------------------------------------------------------*
;【使用レジスタ】$0〜$21,IX,IY,IZ
;

; *-- 指定パラメータのチェック ------------------------------*

SAVE:	PRE IX,WORK+10		;ワークエリアから情報を読む
	LDM $10,(IX+$31),4

 	SBCW $12,$30      	;ファイルサイズが0だったら抜ける 
	JR C,SAVNG2

	LDW $0,$12		;アドレス+(サイズ-1)が&HFFFFを超えていたらエラーとする。
	SBW $0,$30
	ADW $0,$10
	JR C,SAVNG2

	PRE IX,WORK+2		;指定ファイル名の 1文字目が CHR$(0) の場合はエラーとする
	LD $0,(IX+$31)		;ワークエリアからファイル名の1文字目を読み取る

	SBC $0,$30		;CHR$(0)だったらNGとする。
	JR C,SAVNG2		;ファイル名がNULLだったらエラー	

; *-- ファイル保存に必要な容量が確保できるか確認する ---------*

	CAL FN1SCH		;ワークエリアからファイル名を検索
	JR NC,SAVEM1
	LDW $12,0		;サイズ情報をクリアする
	JR SAVEM2
SAVEM1:	ADW $12,$26		;ファイルが見つかった場合はディレクトリサイズを足す。
				;(これが削除したら増える容量）
SAVEM2:	LDW $0,($22)		;DIRENの値を読み込む
	LDW $2,($24)		;MEMENの値を読み込む
	SBW $0,$2		;(式A) DIREN - MEMEN = 現在の FREE値
	ADW $0,$12		;式A + 既存ファイル容量 = 確保できるメモリ容量

	PRE IX,WORK+12		;指定ファイルのサイズを再読み込み
	LDW $2,(IX+$31)
	ADW $2,$26		;ディレクトリサイズを足す

	SBCW $0,$2		;確保できるメモリ値 < 指定ファイルのサイズ
	JR C,SAVNG2		;容量が不足している場合はエラー

; *-- 既存ファイルを削除する ------------------------*
	CAL FN1SCH		;再度ファイルを検索する
	JR C,SAVE2		;既存ファイルが存在しない場合

	CAL DEL			;削除対象のファイルが見つかったら削除する
	JR C,SAVNG2		;ファイル名に$が使われている場合は削除不能

; *-- 登録ファイル数の確認 ---------------------------*

SAVE2:  CAL MAXCK	     	;$2にファイル登録数を入れる為にコール
	AD $2,$30		;255かどうか調べる
SAVENG:	JR C,SAVNG2		;255ならこれ以上はファイル登録不可→NG

; *-- ファイル登録処理 --------------------------------*

	PRE IX,WORK+10		;ワークエリアから情報を読む
	LDM $10,(IX+$31),8

	;ジャンプテーブルの移動
	LDW $0,($22)	  	;DIRENのアドレスを読む
 	ADW $0,$30
 	PRE IX,$0         	;転送元先頭アドレス
	LDW $2,JPSIZE
 	ADW $0,$2        	;ジャンプテーブル(-1)の部分を足す→ジャンプテーブルの最終アドレス
 	PRE IY,$0         	;転送元最終アドレス

 	LDW $0,($22)    	;もうー度DIRENを読む

	SBW $0,$12       	;ファイルサイズを引く
	JR C,NG2		;キャリーしたらエラー
	SBW $0,$26		;ディレクトリサイズを引く
	JR C,NG2		;キャリーしたらエラー
	LDW $4,($24)		;MEMENの内容と比較する(ロジック上不要だが念のためそのまま)
 	SBCW $0,$4
SAVNG2:	JR C,NG2    		;MEMENの方が大きい時は中止(ロジック上不要だが念のためそのまま)
 
 	STW $0,($22) 		;DIRENの更新
 	ADW $0,$30   		;DIREN+1がジャンパのコールアドレス
 	PRE IZ,$0    		;転送先先頭アドレス
 	BUP          		;この段階で空きが出来る
 	GRE IZ,$0		;IZは転送後はジャンプテーブルの最終アドレスを指している→$0へ

	;ファイル本体部分の転送
 	ADW $0,$30		;1を足す(ファイル本体の先頭アドレス)
 	PRE IZ,$0    		;転送先先頭アドレス
 	PRE IX,$10		;転送元先頭アドレスをセット
 	ADW $12,$10    		;ファイルサイズを足す
 	SBW $12,$30   		;サイズを足したら-1する(転送元最終アドレスとなる)
 	PRE IY,$12		;転送元最終アドレスをセット
 	BUP			;転送開始

	;ディレクトリ部の追加	 
 	GRE IZ,$0 		;IZはファイル本体の最終アドレスを指している→$0へ
 	ADW $0,$30		;1を足す（ディレクトリの先頭アドレス)
 	PRE IZ,$0		;転送先先頭アドレスとなる)
 
 	PRE IX,WORK+2 		;転送元先頭アドレス(ワークエリア)
 	PRE IY,WORK+15		;転送元最終アドレス(ワークエリア)
 	BUP			;転送開始

 	PRE IX,MAX 		;ファイル総数を+1する	
 	LD $0,(IX+$31)		;記憶エリアから登録数を読み込み
 	AD $0,$30		;1を足す
 	ST $0,(IX+$31)		;記憶エリアへ出力
		
OK4:	JP OK3	

; *---------------------------------------------------------*
;   ファイル名変更(リネーム)処理
; *---------------------------------------------------------*
;
;使用レジスタ=$0〜$21,IX,IY,IZ
;
; *-- 変更後のファイルが存在するか確認する -----------------*

RENAME:	PRE IX,WORK+21		;リネーム後のファイル名が存在しているか確認
	CAL SEARCH
	JR NC,NG2		;見つかったらNG

; *-- リネームしたいファイルが存在するか確認する ------------*

	PRE IX,WORK+2		;リネームしたいファイル名を探す
	CAL SEARCH
	JR C,NG2		;ファイルが見つからなかったらNG	

	ADW $16,$12		;ファイル先頭アドレス + サイズ = 

; *-- 変更実施 -----------------------------------------------*
				;ディレクトリの先頭アドレス
	PRE IZ,$16		;転送先先頭アドレスにセット
	PRE IX,WORK+21		;転送元先頭アドレスをセット
	PRE IY,WORK+28		;転送元最終アドレスをセット
	BUP			;転送開始
	JR OK4

; *---------------------------------------------------------*
;   リザルトコード「NG」出力処理
; *---------------------------------------------------------*
NG2:	JP NG

; *---------------------------------------------------------*
;   RR式プログラムの実行
; *---------------------------------------------------------*
;【使用レジスタ】$0〜$21,IX,IY,IZ
; $4,5....... &HFFFF
; $6〜9 ..... 読み込んだ内容
; $10,11 .... リードアドレス(下位に向かって進む)
; $12,13 .... ファイルサイズ ←FN1SCHより
; $14,15 .... ファイル本体の最終アドレス
; $16,17 .... ファイル本体の先頭アドレス ←FN1SCHより

; *-- IZ(現在のカーソル位置情報を退避する ------------------*

WRKRR:	PRE IX,WORK+21		;IZの内容をワークエリアに待避
	GRE IZ,$0
	STW $0,(IX+$31)

; *-- 実行対象の指定ファイルを検索する ---------------------*

	CAL FN1SCH		;第１ファイル名情報取得
	JR C,NG2		;ロードファイルが見つからない時はNG

; *-- ファイル名に .R .r を含んでいるか確認する ------------*

	LDW $0,WORK+2		;ロードファイル名に".R"が存在する事を確認する。
	LDW $6,WORK+10
WRKR0:	LDW $2,($0)		;アドレスからファイル名の2文字を読み込む
	LDW $4,&H522E		;".R"
	SBCW $2,$4		;".R"が存在するか?
	JR Z,WRKR1		;存在したら処理を続ける

	LDW $4,&H722E		;".r"
	SBCW $2,$4		;".r"が存在するか?
	JR Z,WRKR01		;存在したら処理を続ける

	ADW $0,$30
	SBCW $0,$6		;ファイル名のエリアを超えたらNG
	JR Z,NG2
	JR WRKR0

WRKR01:	ANC $28,128		;".r"処理 CAL呼び出しでない場合はエラー
	JR Z,NG2

; *-- RL(アドレス指定リロケートか)か判断する/ロード実施 -------*

WRKR1:  LD $0,11		;アドレス指定ロードじゃなかったら次へ
	SBC $0,$29
	JR NZ,WRKR1B

	LD $0,$30		;アドレス指定ロードを行う。
	CAL LOADSUB
	JR C,NG2		;ロード失敗の場合

				;ロードが成功したらアドレス情報を書き換える
	LDW $16,$10		;ファイルの収納アドレスをロード先頭アドレスとする

; *-- 書き換え実施 ----------------------------------------------*

WRKR1B:	LDW $4,&HFFFF		;終了コード判定/ファイルロードアドレス書き換え値

	LDW $14,$12		;ファイルの最終アドレスを求める
	ADW $14,$16
	SBW $14,$30

	LDW $10,$14		;リードアドレスをセット

	PRE IX,$10		;まずはRR形式の検証コード(サイズ)を読み込む
	LDDW $7,(IX+$31)	;$6,$7 に読み込む。IXは最後に読み込んだアドレス
	
	SBCW $6,$12		;サイズを比較
	JR NZ,NG2		;サイズが異なる時はNG

WRKR2:	GRE IX,$10		;リードアドレス更新
	SBW $10,$30		;-1する
	SBCW $10,$16		;リードアドレスがファイル先頭より上位に行ってしまったらNG
WRKN1:	JR C,NG2

WRKR3:	PRE IX,$10		;リードアドレスをセット
	LDDM $9,(IX+$31),4	;$6〜$9までレジスタ一気読み
				;$6,$7=変更箇所 $8,$9=修正アドレス
				;ファイルの先頭を0000Hとした時の相対位置
	
	SBCW $8,$4		;終了判定(&HFFFF)
	JR Z,WRKR4

	ADW $6,$16		;書き込み位置指定(相対アドレス＋ファイルの先頭アドレス)
	LDW $0,$14		;ファイルの最終-1より上位に行ってしまったらNG
	SBW $0,$30
	SBCW $0,$6		
	JR C,WRKN1

	ADW $8,$16		;修正内容アドレス指定(相対アドレス＋ファイルの先頭アドレス)
	SBCW $14,$8		;ファイルの最終より上位に行ってしまったらNG
	JR C,WRKN1

	STW $8,($6)		;書き込み位置に修正内容を書き込む

	LD $0,11		;読み込みアドレス指定の場合はファイルのロードアドレスを
	SBC $0,$29		;&HFFFFしない。
	JR Z,WRKR2

	LDW $0,9		;BLコマンド防止のためファイルロードアドレスを&HFFFFにする
	ADW $0,$14
	STW $4,($0)

	JR WRKR2
	
WRKR4:	ADW $16,$6		;実行アドレスを補正

	PRE IX,WORK+21		;IZの内容を復元
	LDW $0,(IX+$31)
	PRE IZ,$0

	PRE IX,WORK		;ワークエリアのファンクション番号を 0 にする
	ST $31,(IX+$31)

	JP $16			;ファイルの先頭アドレスにジャンプ!

; *---------------------------------------------------------*
;   リザルトコード「NG」出力処理
; *---------------------------------------------------------*
NG3:	JP NG

; *---------------------------------------------------------*
;   ファイル先頭移動処理
; *---------------------------------------------------------*
; $8,9 ...... ワークエリア先頭アドレス
; $10,11 .... 転送幅サイズ
; $12,13 .... ファイルサイズ(未転送残りサイズ)←FN1SCHより取得
; $14,15 .... ファイルエリアの移動元最終アドレス
; $16,17 .... 移動対象ファイル本体の先頭アドレス(転送元先頭アドレス)←FN1SCHより

; *-- ファイル登録数の確認 ---------------------------------*

MOVFL1:	CAL MAXCK		
	JR C,NG3		;ファイル登録数が 0 の場合はNGとする
	JR Z,MOVEND		;ファイル登録数が 1 の場合もNGとする

; *-- 指定ファイル名の検索/$無しの場合はNGとする -----------------*

	CAL FN1SCH		;移動させたいファイル名の検索
        JR C,NG3		;ファイルが無かったらNG

	SBC $1,$30		;ファイルの先頭に $ がない場合はNG
	JR NC,NG3

; *-- 指定ファイルが最初に登録されたファイル名の場合は何もしない --*

	ADW $12,$26		;ファイルサイズに14(DIR)を足す。

        LDW $10,$16		;収納アドレス+サイズ=ラベル「MAX」
	ADW $10,$12		;すなわち最初に登録されているファイルについては実施しない
	LDW $0,MAX
	SBCW $10,$0
	JP Z,OK
;	JP C,OK

	LDW $10,200		;転送幅の初期設定

; *-- ワークエリア先頭アドレスを設定する。
; フリーエリアが 201バイト以上なら フリーエリア(MEMEN)の領域を、
; 200バイト以下ならFDDバッファ(&H17B0〜)を使用する。---*
	
	LDW $8,($24)		;フリーエリアの先頭アドレスを取得する
		
	LDW $0,($22)		;フリーエリアの最終アドレスを求める

	SBW $0,$8		;フリーエリア最終(DIREN)-先頭(MEMEN)を実行
	ADW $0,$30		;さらに 1 を足す→フリーエリアのサイズを取得

	SBCW $0,$10		;フリーエリアが
	JR Z,MOVFD		;200　だったらFDDバッファを使用する
	JR C,MOVFD		;199  以下だったらFDDバッファを使用する

	LDW $10,$0		;フリーエリアを使用する。
	JR MOVEX1

MOVFD:	LDW $8,WORK+29		;FDDバッファを使用する。

MOVEX1:	SBCW $12,$10		;未転送サイズ-転送幅
	
	JR NC,MOVEX2		;未転送サイズの方が転送幅より小さかったら
	LDW $10,$12		;転送幅を未転送サイズに合わせる(最後の転送)

; *-- 転送幅分の内容をワークエリアへの退避 ------------------*

MOVEX2: PRE IZ,$8		;転送先先頭アドレスを設定
	PRE IX,$16		;転送元先頭アドレスを設定
	LDW $0,$16		;転送元最終アドレスを求める
	ADW $0,$10		;転送幅を足す
	SBW $0,$30		;さらに1を引く→転送元最終アドレス
	PRE IY,$0		;転送元最終アドレスを設定

	BUP			;ワークエリアへコピー

; *-- ファイルエリアを転送幅分だけ移動  ---------------------*

	ADW $0,$30		;転送元先頭アドレスを設定
	PRE IX,$0
	
	PRE IY,MAX-1		;転送元最終アドレスを設定
	PRE IZ,$16		;転送先先頭アドレスを設定
	
	BUP			;転送

; *-- アドレス更新(1) ---------------------------------------*
	
	LDW $14,MAX		;ファイルエリアの移動元最終アドレスの更新
	SBW $14,$10		;(移動元最終アドレス-転送幅)
			
				
; *-- 退避していた内容をファイルエリアにコピーする ----------*
	
	PRE IX,$8		;転送元先頭アドレスを設定
	LDW $0,$8
	ADW $0,$10		;フリーエリア先頭 + 転送幅 -1 = 転送元最終アドレス
	SBW $0,$30
	PRE IY,$0		;転送元最終アドレスを設定
	PRE IZ,$14		;転送先先頭アドレスを設定

	BUP			;転送

; *-- アドレス更新(2) ---------------------------------------*
	
	SBW $12,$10		;未転送残りサイズから転送幅を引く
	JR C,MOVEND		;キャリーしたら終了(通常ありえないが念のため)
	JR NZ,MOVEX1		;まだ未転送分が残っている場合は再度ループへ

MOVEND: JP OK			;終了

;================= コマンドライン処理 =====================================
; *---------------------------------------------------------*
;    コマンドライン取得ファイル名書き込み処理 
;    入力:IX..書き込みポインタ                
;    (このルーチンはSIKI実行後にコールする事 
; *---------------------------------------------------------*

WRTFN:	PRE IX,WORK+2

WRTFN2:	LD $0,($15)		;SIKIで得た文字を読み込む
	STI $0,(IX+$31)		;ワークエリアに書き込む	
	ADW $15,$30
	SB $17,$30
	JR NZ,WRTFN2
	RTN

; *---------------------------------------------------------*
;    コマンドライン文字列データ取得処理       
;    入力：IZ-----コマンドライン開始ポインタ  
;    出力：$17--取得データ文字数              
;    ：$15,$16 -- 文字列格納アドレス          
; *---------------------------------------------------------*

GETSTR:	LDW $28,SCE2C		;カンマ[,]を検索
	CAL RCS			;(IZを[,]の次に移動)

GETST2:	LDW $28,SIKI		;SIKI処理
	CAL RCS			;IZの示すデータを計算し、結果を$15〜$17に格納

	JP NC,SNERROR		;文字列でない場合、エラー終了する。
	SBC $17,$31		;ファイル名がNullの場合、エラー終了する。
	JP Z,SNERROR		;
        SBC $17,9		;ファイル名が8文字以上だったらエラーとする。
	JP NC,SNERROR

GOP_END:
	PPSM $0,7		;スタック上のIZ(EDTOPポインタ)の値を更新
	GRE IZ,$5		;
	PHSM $6,7		;
	RTN

; *---------------------------------------------------------*
;    コマンドライン数値データ取得処理          
;    入力：IZ-----コマンドライン開始ポインタ   
;    出力：$15,$16--取得データ(整数型数値)     
; *---------------------------------------------------------*

GETBIN:	LDW $28,SCF2C		;カンマ[,]を検索(フラグのみ変化)
	CAL RCS			;(IZを[,]の次に移動)
	RTN NZ			;パラメータなしの場合は、終了(NZ)
	JR GETB			;

GETOP:	LDW $28,SCE2C		;カンマ[,]を検索(未発見でSN Err)
	CAL RCS			;(IZを[,]の次に移動)
GETB:
	LDW $28,EXPRW		;EXPRW処理
	CAL RCS			;IZの示すデータを計算し、結果を$10〜$18に格納

	LDW $28,BINM2		;BINM2
	CAL RCS			;$10〜$18の実数型数値を整数型($15,$16)に変換する
	XRC $31,$31		;ZEROフラグOFF
	JR GOP_END			;

; *---------------------------------------------------------*
;   コマンド名判断
; *---------------------------------------------------------*

CMDLINE:CAL WRKCLR		;ワークエリアクリア処理
	LD $28,$31		;通常起動扱いとする
	
	CAL NGSUB		;まずリザルトコードを 1 にする。

        LDIW $0,(IZ+$31) 	;要求コマンド読み込み($0,$1)

	PRE IX,CMD   	  	;最初のコマンド位置を指定
	LD  $8,12        	;コマンド総数=12をセット

CHECKC:	LDIW $4,(IX+$31)	;比較するコマンド読み込み($4,$5)
    	SBCW $0,$4     		;コマンド比較
    	JR Z,CFOUND    		;コマンド一致

    	SB $8,$30      		;比較終了？
    	JR NZ,CHECKC   		;

;コマンドが見つからない場合は RR 処理(コマンド2文字+.R)でRR式ルーチンのコールを行う
	PRE IX,WORK+2		;コマンド名の内容をファイル名1エリアに出力
	LD $3,&H24		;ファイル名の1文字目は $ か？($だったら3文字出力)
	SBC $0,$3
	JR NZ,CHECKC2
	LDI $2,(IZ+$31)		;$の時はコマンドラインから3文字目を読む
	STIM $0,(IX+$31),3
	JR CHECKC3
CHECKC2:STIM $0,(IX+$31),2
CHECKC3:LDW $4,&H522E		;".R"(.=2EH,R=52H)
	STIW $4,(IX+$31)
	LD $8,10		;コマンド番号をセット
	PRE IX,WORK
	ST $8,(IX+$31)
	LDW $28,NEXTC		;空白をスキップする
	CAL RCS
	JR CMDSYSI

;コマンドが見つかったら...;$8=コマンド番号(8〜1)

CFOUND: PRE IX,WORK		;ワークエリアにファンクション番号を退避
 	ST $8,(IX+$31)

;パラメータのいらないコマンド処理
        SBC $8,7
        JR Z,CMDSYSI		;7:情報表示
        SBC $8,9
        JR Z,CMDEXOF		;9:切り離し
        SBC $8,8
        JR Z,CMDJP		;8:ジャンパをコピー

;第１パラメータがファイル名のコマンド処理
	LDW $28,NEXTC		;空白をスキップする
	CAL RCS

	CAL GETST2              ;コマンドラインから文字列取得

	CAL WRTFN		;ファイル名をワークエリアに出力

        PRE IX,WORK		;コマンド番号再読込
	LD $8,(IX+$31)

;パラメータがファイル名だけのコマンド処理
        SBC $8,2		;2:ファイル削除(KILL)処理
        JR Z,CMDKILL
        SBC $8,6		;6:ファイル情報検索処理
        JR Z,CMDSCH
	SBC $8,12		;12:ファイル先頭移動処理
	JR Z,CMDMV

;第２パラメータがファイル名のコマンド処理
        SBC $8,5		;5:ファイルリネーム処理
        JR Z,CMDNAME

;それ以外のコマンド処理
        SBC $8,1		;1:ファイル登録(BSAVE)処理
        JR Z,CMDBSAV
        SBC $8,3		;3:ファイルロード(BLOAD)処理
        JR Z,CMDBLOA
        SBC $8,4		;4:ファイルロード(BLOAD)処理
        JR Z,CMDBLOA
	SBC $8,10		;10:RR式プログラムの実行
	JR Z,CMDRR
	SBC $8,11		;11:RR式プログラムの実行(アドレス指定)
	JR Z,CMDRL

; *---------------------------------------------------------*
;    SN Error表示
; *---------------------------------------------------------*

SNERROR:PST UA,&H54		;SN Err表示
	JP SNERR		

; *---------------------------------------------------------*
;    コマンドライン:情報取得 
;    コマンドライン:ジャンパのコピー
; *---------------------------------------------------------*
CMDJP:
CMDSYSI:CAL GOP_END		;システム上のIZポインタ更新
CMDSYS2:JP WORKARA

; *---------------------------------------------------------*
;    コマンドライン:切り離し
; *---------------------------------------------------------*

CMDEXOF:CAL GOP_END		;システム上のIZポインタ更新
	LD $29,127
	JP WORKAR2
; *---------------------------------------------------------*
;    コマンドライン:ファイル先頭移動処理　
;    コマンドライン:削除 
;    コマンドライン:ファイル検索
;    コマンドライン:RR式プログラム実行処理
; *---------------------------------------------------------*

CMDMV:
CMDRR:
CMDKILL:
CMDSCH:	JR CMDSYS2		;JP WORKARA		

; *---------------------------------------------------------*
;    コマンドライン:リネーム
; *---------------------------------------------------------*

CMDNAME:CAL GETSTR		;コマンドラインから文字列取得(変更後ファイル名)

	PRE IX,WORK+21		;所得したファイル名をワークエリアに出力
	CAL WRTFN2

	JR CMDSYS2		;JP WORKARA                                       	

; *---------------------------------------------------------*
;    コマンドライン:ファイル登録(BS)
; *---------------------------------------------------------*

CMDBSAV:CAL GETOP		;スタートアドレスを取得

	PRE IX,WORK+10  	;取得したスタートアドレス情報をワークエリアに出力
	STW $15,(IX+$31)

        CAL GETOP		;サイズを取得

	PRE IX,WORK+12  	;取得したサイズ情報をワークエリアに出力
	STW $15,(IX+$31)

        CAL GETBIN		;実行開始アドレスを取得
	JR NZ,CMDBSV2		;パラメータが指定されていなかったら次へ飛ぶ

	PRE IX,WORK+14		;取得した実行情報をワークエリアに出力
	STW $15,(IX+$31)

CMDBSV2:JR CMDSYS2		;JP WORKARA

; *---------------------------------------------------------*
;    コマンドライン:ファイルロード処理(BL)
; *---------------------------------------------------------*

CMDBLOA:CAL GETBIN		;スタートアドレスを取得
	JR NZ,CMDBLO2		;パラメータが取得出来なかったらパラメータ無しとする。

	PRE IX,WORK+18  	;取得したスタートアドレス情報をワークエリアに出力
	STW $15,(IX+$31)
        JR CMDBLO3

CMDBLO2:LD $29,3		;デフォルトロード指定とする
	PRE IX,WORK		;ワークエリアに出力
	ST $29,(IX+$31)

CMDBLO3:JR CMDSYS2		;JP WORKARA

; *---------------------------------------------------------*
;    コマンドライン:RR式実行 アドレス指定(RL)
; *---------------------------------------------------------*

CMDRL:	CAL GETBIN		;スタートアドレスを取得
	JR NZ,SNERROR		;パラメータが取得出来なかったらエラーとする。

	PRE IX,WORK+18  	;取得したスタートアドレス情報をワークエリアに出力
	STW $15,(IX+$31)

CMDRL2:	JR CMDSYS2		;JP WORKARA

; *---------------------------------------------------------*
;    変数コピー用
; *---------------------------------------------------------*

FNWORK1:DB 'FN$="'
FNWORK2:DB 0,0,0,0,0,0,0,0,0
FNWORK3:DB 0
FNWORK4:DB '"',0

STWORK1:DB 'ST='
SZWORK1:DB 'SZ='
EXWORK1:DB 'EX='
SOWORK1:DB 'SO='

; *---------------------------------------------------------*
;    コマンドライン文字列
; *---------------------------------------------------------*

CMD:
	DB "MV"			;12:ファイルの移動
	DB "RL"			;11:RR式プログラムの実行(アドレス指定)
	DB "RR"			;10:RR式プログラムの実行
	DB "OF"        		;9:切り離し処理
	DB "JP"			;8:ジャンパのコピー
	DB "SI"        		;7:情報表示
	DB "SF"        		;6:ファイル名検索
	DB "RN"        		;5:RENAME処理
 	DB "BL"        		;4:BLOAD処理
	DB "BL"			;3:BLOAD処理
        DB "KL"			;2:KILL処理
	DB "BS"			;1:BSAVE処理
;***** BOTTOM OF SOURCE FILE *************************************************

