📄 exaid.asm
字号:
ALdR4S:
lea bx,[pVarBx].ASTAT_ad ; ds:bx = array descriptor address
ALdR4:
call ResolveArray ;resolve to segment and offset in dx:bx
GETSEG ds,dx,di,<SPEED,LOAD> ; Move to array element segment
fld dword ptr [bx]
mov ax,ss
mov ds,ax ;Restore the data segment
DispMac
;End of [15]
subttl I4 Store Executors
page
;Common
MakeExe exAIdECStI4,opAIdSt,ET_I4
SkipExHeader
MakeExe exAIdICSt4,opAIdSt,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Get oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov dx,[pVarBx].ACOM_oValue ;Offset into common block
test byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC
;Is the array $STATIC?
mov bx,[pVarBx].ACOM_oCommon ;oCommon
jz @F
add bx,COM_bdType - COM_bdValue ;Adjust to point to type table
@@:
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,dx ;Offset in block
jmp short ASt4
;Indirect
MakeExe exAIdEIStI4,opAIdSt,ET_I4
SkipExHeader
MakeExe exAIdIISt4,opAIdSt,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
GetpFrame
mov bx,[pFrame] ;bx = pointer to array descriptor
cmp cl,[bx].AD_cDims ;Correct number of indices?
jz ASt4
jmp IndexCountErr
;Frame
MakeExe exAIdEFStI4,opAIdSt,ET_I4
SkipExHeader
MakeExe exAIdIFSt4,opAIdSt,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov bx,[pVarBx+AFRAME_oFrame]
add bx,bp ;bx = pointer to array descriptor
jmp short ASt4
;Public
;Static
MakeExe exAIdESStI4,opAIdSt,ET_I4
SkipExHeader
MakeExe exAIdISSt4,opAIdSt,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Operand
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
ASt4S:
lea bx,[pVarBx].ASTAT_ad ;ds:bx = array descriptor address
ASt4:
call ResolveArray ;resolve to segment and offset in dx:bx
GETSEG ds,dx,di,<SPEED,LOAD> ; Move to array element segment
SStoreR4X:
pop [bx] ;Pop first word
pop [bx+2] ;Pop second word
mov ax,ss
mov ds,ax ;Restore the data segment
DispMac
;Added with [15]
subttl R4 Store Executors
page
;Common
MakeExe exAIdECStR4,opAIdSt,ET_R4
SkipExHeader
MakeExe exAIdICStR4,opAIdSt,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Get oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov dx,[pVarBx].ACOM_oValue ;Offset into common block
test byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC
;Is the array $STATIC?
mov bx,[pVarBx].ACOM_oCommon ;oCommon
jz @F
add bx,COM_bdType - COM_bdValue ;Adjust to point to type table
@@:
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,dx ;Offset in block
jmp short AStR4
;Indirect
MakeExe exAIdEIStR4,opAIdSt,ET_R4
SkipExHeader
MakeExe exAIdIIStR4,opAIdSt,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
GetpFrame
mov bx,[pFrame] ;bx = pointer to array descriptor
cmp cl,[bx].AD_cDims ;Correct number of indices?
jz AStR4
jmp IndexCountErr
;Frame
MakeExe exAIdEFStR4,opAIdSt,ET_R4
SkipExHeader
MakeExe exAIdIFStR4,opAIdSt,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov bx,[pVarBx+AFRAME_oFrame]
add bx,bp ;bx = pointer to array descriptor
jmp short AStR4
;Public
;Static
MakeExe exAIdESStR4,opAIdSt,ET_R4
SkipExHeader
MakeExe exAIdISStR4,opAIdSt,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Operand
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
AStR4S:
lea bx,[pVarBx].ASTAT_ad ;ds:bx = array descriptor address
AStR4:
call ResolveArray ;resolve to segment and offset in dx:bx
GETSEG ds,dx,di,<SPEED,LOAD> ; Move to array element segment
fstp dword ptr [bx]
mov ax,ss
mov ds,ax ;Restore the data segment
fwait
DispMac
;End of [15]
;Added with [15]
subttl R8 Load Executors
page
;Common
MakeExe exAIdECLdR8,opAIdLd,ET_R8
SkipExHeader
MakeExe exAIdICLdR8,opAIdLd,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Get oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov dx,[pVarBx].ACOM_oValue ;Offset into common block
test byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC
;Is the array $STATIC?
mov bx,[pVarBx].ACOM_oCommon ;oCommon
jz @F
add bx,COM_bdType - COM_bdValue ;Adjust to point to type table
@@:
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,dx ;Offset in block
jmp short ALdR8
;Indirect
MakeExe exAIdEILdR8,opAIdLd,ET_R8
SkipExHeader
MakeExe exAIdIILdR8,opAIdLd,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
GetpFrame
mov bx,[pFrame] ;bx points to array descriptor
cmp cl,[bx].AD_cDims ;Correct number of indices?
jz ALdR8
jmp IndexCountErr
;Frame
MakeExe exAIdEFLdR8,opAIdLd,ET_R8
SkipExHeader
MakeExe exAIdIFLdR8,opAIdLd,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov bx,[pVarBx+AFRAME_oFrame]
add bx,bp ;bx = pointer to array descriptor
jmp short ALdR8
;Public
;Static
MakeExe exAIdESLdR8,opAIdLd,ET_R8
SkipExHeader
MakeExe exAIdISLdR8,opAIdLd,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Operand
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
ALdR8S:
lea bx,[pVarBx].ASTAT_ad ; ds:bx = array descriptor address
ALdR8:
call ResolveArray ;resolve to segment and offset in dx:bx
GETSEG ds,dx,di,<SPEED,LOAD> ; Move to array element segment
fld qword ptr [bx]
mov ax,ss
mov ds,ax ;Restore the data segment
DispMac
;End of [15]
;Start of [15]
subttl R8 Store Executors
page
;Indirect
MakeExe exAIdEIStR8,opAIdSt,ET_R8
SkipExHeader
MakeExe exAIdIIStR8,opAIdSt,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
GetpFrame
mov bx,[pFrame] ;bx points to array descriptor
cmp cl,[bx].AD_cDims ;Correct number of indices?
jz AStR8
jmp IndexCountErr
;Common
MakeExe exAIdECStR8,opAIdSt,ET_R8
SkipExHeader
MakeExe exAIdICStR8,opAIdSt,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Get oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov dx,[pVarBx].ACOM_oValue ;Offset into common block
test byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC
;Is the array $STATIC?
mov bx,[pVarBx].ACOM_oCommon ;oCommon
jz @F
add bx,COM_bdType - COM_bdValue ;Adjust to point to type table
@@:
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,dx ;Offset in block
jmp short AStR8
;Frame
MakeExe exAIdEFStR8,opAIdSt,ET_R8
SkipExHeader
MakeExe exAIdIFStR8,opAIdSt,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov bx,[pVarBx+AFRAME_oFrame]
add bx,bp ;bx = pointer to array descriptor
jmp short AStR8 ;jmp is faster from here
;Public
;Static
MakeExe exAIdESStR8,opAIdSt,ET_R8
SkipExHeader
MakeExe exAIdISStR8,opAIdSt,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Operand
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
AStR8S:
lea bx,[pVarBx].ASTAT_ad ; ds:bx = array descriptor address
AStR8:
call ResolveArray ;resolve to segment and offset in dx:bx
GETSEG ds,dx,di,<SPEED,LOAD> ; Move to array element segment
fstp qword ptr [bx]
mov ax,ss
mov ds,ax ;Restore the data segment
fwait
DispMac
;End of [15]
subttl Sd Load Executors
page
;Common
MakeExe exAIdECRfSD,opAIdLd,ET_SD
SkipExHeader
MakeExe exAIdICRfSD,opAIdLd,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Get oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov dx,[pVarBx].ACOM_oValue ;Offset into common block
test byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC
;Is the array $STATIC?
mov bx,[pVarBx].ACOM_oCommon ;oCommon
jz @F
add bx,COM_bdType - COM_bdValue ;Adjust to point to type table
@@:
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,dx ;Offset in block
jmp short ALdSd
;Indirect
MakeExe exAIdEIRfSD,opAIdLd,ET_SD
SkipExHeader
MakeExe exAIdIIRfSD,opAIdLd,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
GetpFrame
mov bx,[pFrame] ;bx = pointer to array descriptor
cmp cl,[bx].AD_cDims ;Correct number of indices?
jz ALdSD
jmp IndexCountErr
;Frame
MakeExe exAIdEFRfSD,opAIdLd,ET_SD
SkipExHeader
MakeExe exAIdIFRfSD,opAIdLd,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov bx,[pVarBx+AFRAME_oFrame]
add bx,bp ;bx = pointer to array descriptor
jmp short ALdSD
;public
;Static
MakeExe exAIdESRfSD,opAIdLd,ET_SD
SkipExHeader
MakeExe exAIdISRfSD,opAIdLd,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Operand
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
lea bx,[pVarBx].ASTAT_ad ; ds:bx = array descriptor address
ALdSd:
call ResolveArray ;resolve to segment and offset in dx:bx
push bx ;Load pointer to SD
DispMac
subttl Sd Store Executors
page
;Common
MakeExe exAIdECStSD,opAIdSt,ET_SD
SkipExHeader
MakeExe exAIdICStSD,opAIdSt,ET_Imp
LODSWTX ;Load argument count
xchg ax,cx
LODSWTX ;Get oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
mov dx,[pVarBx].ACOM_oValue ;Offset into common block
test byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC
;Is the array $STATIC?
mov bx,[pVarBx].ACOM_oCommon ;oCommon
jz @F
add bx,COM_bdType - COM_bdValue ;Adjust to point to type table
@@:
add bx,[grs.GRS_bdtComBlk.BD_pb] ;pCommon
mov bx,[bx].COM_bdValue.BD_pb ;Common block
add bx,dx ;Offset in block
jmp short AStSD
;Indirect
MakeExe exAIdEIStSD,opAIdSt,ET_SD
SkipExHeader
MakeExe exAIdIIStSD,opAIdSt,ET_Imp
LODSWTX ;Index argument count
xchg ax,cx
LODSWTX ;oVar
xchg ax,bx ; BX = oVar
DbChk oVar,bx ; Check for valid oVar
GetpFrame
mov bx,[pFrame] ;bx = pointer to array descriptor
cmp cl,[bx].AD_cDims ;Correct number of indices?
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -