;+--------------------------+
;|EMB移動 |
;+--------------------------+
;|in bx:ax =size |
;|in cx =source handle |
;|in ds:si =source address |
;|in dx =dest handle |
;|in es:di =dest address |
;+--------------------------+
COPY_EMB:
mov bx,offset EMB_MOVE_STRUCT
mov [ds:bx+08],ds ;source segment
mov [ds:bx+00],ax ;length(下位)
mov [ds:bx+02],bx ;length(上位)
mov [ds:bx+04],cx ;source handle
mov [ds:bx+06],si ;source offset
mov [ds:bx+10],dx ;dest handle
mov [ds:bx+12],di ;dest offset
mov [ds:bx+14],es ;dest segment
mov si,bx
mov ah,0bh
callf XMS_CALL
or ax,ax
jz short @@
clc
ret
@@: stc
ret
EMB_MOVE_STRUCT dw 8 dup(?)
;例)8000h:0100hから7000h:0200hへ1000hBytesコピーする場合
mov ax,8000h
mov ds,ax
mov si,0100h ; DS:SI = SourceOffset
mov ax,7000h
mov es,ax
mov di,0200h ; ES:DI = DestOffset
xor bx,bx
mov ax,1000h ; Size = 1000h Bytes
xor cx,cx ; SourceHandle
xor dx,dx ; DestHandle
call COPY_EMB ; Copy
;例) MS-DOSが使用できる1Mバイト分のメモリーをEMBにコピーする
xor ax,ax
mov bx,10h ; Size = 1MBytes
xor cx,cx ; SourceHandle = 0
mov ds,ax
xor si,si ; SourceOffset = 0000h:0000h
mov dx,[cs:EMB_HANLDE] ; dx = Handle of EMB
mov es,ax
xor di,di ; DestOffset = 00000000h
call COPY_EMB
|