[DEF_SEG] コマンド

BaseAddressを宣言します。
文法 DEF SEG=< BaseAddress >
文例  DEF SEG= DEFUSER
    DEF SEG= P#
CALL, BSAVE, BLOAD, PEEK, POKE などの命令でMemoryのAddressを指定する場合、
アクセスしようとするaddressは、DEF SEG文であらかじめ空間のBaseAddressを宣言しておき、
ここからのOffsetで指定します。
16Bit時代には上位に16進数 1桁シフトのSEGMENTを使用していましたが、
MBASIC86では倍精度実数変数のBaseAddressとして使用します。
ただし、数値は 4Byteの整数値です。
Addressは、所謂 4Byte長の整数値を必要とするため、
BaseAddressと 2Byte長の整数変数を使用したOffsetによりAddressを指定します。
で機械語やC言語の実行ProgramをLOADする場合、
[BSAVE] でMemoryを実行FileとしてSAVEする場合、および
[POKE] で機械語の直接書き込みを行う場合、
[PEEK] で直接読み出しを行う場合に必要となります。
また、BaseAddressの最上位Addressとして、予約語の "DEFUSER"
[DEFUSER] 参照)で参照出来ます。
ここから&H100000=約1MBの空間がUserの機械語Program用となります。


サンプル1 
10 CLS
20 DIM A%(100)
30 OPEN "D:\DATA.DAT" FOR INPUT AS #2
40 I%=0
50 I%=I%+1
60 INPUT #2,A%(I%)
70 IF A%(I%) =9999 THEN 200
80 GOTO 50
100 DEF SEG = DEFUSER:M%=0
110 BLOAD "D:\SORT.EXE", M%
120 B%=&H1000
210 CALL B%(A%(0))
220 I%=0
230 I%=I%+1
240 IF A%=9999 THEB 900
250 PRINT I%,A%(I%)
260 GOTO 230
900 CLOSE #2
910 END

この例では "D:\DATA.DAT"から読み込まれた整数値DataのA%(I%)
がBLOAD された実行Program "D:\SORT.EXE" で昇順にSortされて帰ってきます。
"D:\SORT.EXE" はRET命令で終わる機械語ProgramかRET命令で終わるC言語Programです。
引数は配列A%の最初のADDRESSが渡されます。
[BLOAD] 命令では、
BaseAddress =DEFUSER からのOFFSETがM%のPointから
"D:\SORT.EXE" がLOADされます。
実行開始番地はLoadPointからOffsetが&H1000のPointです。
本問の実行開始AddressはDEFUSER+M%+B%となります。
DEGFUSER=&H017E0000の場合、&H017E1000が実行開始Addressです。

サンプル2 
10 CLS
20 DEF SEG=DEFUSER
30 MAX=&H0
40 FOR ADR=MAX TO (MAX+40)
50 READ BYTE:POKE ADR, BYTE
60 NEXT ADR
70 C%=0
80 INPUT A%,B%
90 IF A%=9999 THEN 900
100 CALL MAX(A%, B%, C%)
140 PRINT C%
150 GOTO 120
900 END
1000 DATA &H8B, &H4C, &H24, &H04 // mov ecx,dword ptr [esp+4]
1010 DATA &H66 ,&H56 // push si
1020 DATA &H8B ,&H41 ,&H04 // mov eax,dword ptr [ecx+4]
1030 &H8B ,&H11 // mov edx,dword ptr [ecx]
1040 &H8B ,&H49 ,&H08 //mov ecx,dword ptr [ecx+8]
1050 &H66 ,&H8B &H00 // mov ax,word ptr [eax]
1060 DATA &H66 ,&H8B ,&H32 //mov si,word ptr [edx]
1070 DATA &H66 ,&H3B ,&HC6 // cmp ax,si
1080 DATA &H7D ,&H03 // jge next
1090 DATA &H66 ,&H8B ,&HC6 // mov ax,si
1100 &H66 ,&H5E // next: pop si
1200 &H66 ,&H89 ,&H01 // mov word ptr [ecx],ax
1300 &HC3 // ret
1400 DATA &H90,&H90,&H90, &H90,&H90,&H90, &H90,&H90,&H90 // NOP


これを実行します。
RUN
? 100,200
 200
? 100,-200
100
? 9999,0
OK

DEFUSERはMBASIC86の予約語で、機械語Subroutine用Areaの最上位ADDRESSで、4Byteの整数
値です。
Userの書き込むAreaはDEFUSER以降 1MB余りのAreaとなります。このArea内であれば、複数の
機械語Subroutineの書き込みが出来ます。
本問では、DEFUSERからOffsetがMAXのところに書き込んでいます。
引数の対応は、CALL文の並び順に、A%のPointerが [ECX]から 4Byte、
B%のPointerが 4[ECX]から 4Byte、C%のPointerが 8[ECX]から 4Byteとなっています。
で、機械語ProgramはA%とB%の比較をして、
大きい方の整数値をC%に格納してBASICに帰っています。