⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exaid.asm

📁 Dos6.0
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	jz	AStSD
	jmp	IndexCountErr

;Frame
MakeExe exAIdEFStSD,opAIdSt,ET_SD
	SkipExHeader
MakeExe exAIdIFStSD,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 AStSD

;public


;Static
MakeExe exAIdESStSD,opAIdSt,ET_SD
	SkipExHeader
MakeExe exAIdISStSD,opAIdSt,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
AStSd:
	call	ResolveArray	;resolve to segment and offset in dx:bx
	push	bx		;Push pSD
	CALLRT	B$SASS,DispMov

	subttl	FS load/store executors
	page


MakeExe exAIdESRfFS,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdISRfFS,opAIdLd,ET_Imp
	LODSWTX 		;Index 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
FsRf:
	call	ResolveArray	;resolve to segment and offset in dx:bx
	push	dx		;Push segment
	push	bx		; and offset
	mov	bx,PTRTX[si-2]	;Get oVar again
	push	[pVarBx-VAR_value].VAR_cbFixed	; Push length of FS
	DispMac

MakeExe exAIdEIRfFS,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdIIRfFS,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	FsRf
	jmp	IndexCountErr

MakeExe exAIdEFRfFS,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdIFRfFS,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	FsRf

MakeExe exAIdECRfFS,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdICRfFS,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	FsRf



MakeExe exAIdESLdFS,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdISLdFS,opAIdLd,ET_Imp
	LODSWTX 			;Index 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
FsLd:
	call	ResolveArray		;resolve to segment and offset in dx:bx
	push	dx			;Push segment
	push	bx			; and offset
	mov	bx,PTRTX[si-2]		;Get oVar again
	push	[pVarBx-VAR_value].VAR_cbFixed	; Push length of FS
	CALLRT	B$LDFS,DispMovSd	

MakeExe exAIdEILdFS,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdIILdFS,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	FsLd
	jmp	IndexCountErr

MakeExe exAIdEFLdFS,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdIFLdFS,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	FsLd

MakeExe exAIdECLdFS,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdICLdFS,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	FsLd



MakeExe exAIdESStFS,opAIdSt,ET_SD
	SkipExHeader
MakeExe exAIdISStFS,opAIdSt,ET_Imp
	LODSWTX 		;Index 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
FsSt:
	call	ResolveArray	;resolve to segment and offset in dx:bx
	push	dx		;Push segment
	push	bx		; and offset
	mov	bx,PTRTX[si-2]	;Get oVar again
	push	[pVarBx-VAR_value].VAR_cbFixed	; Push length of FS
	CALLRT	B$LSET,Disp

MakeExe exAIdEIStFS,opAIdSt,ET_SD
	SkipExHeader
MakeExe exAIdIIStFS,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	FsSt
	jmp	IndexCountErr

MakeExe exAIdEFStFS,opAIdSt,ET_SD
	SkipExHeader
MakeExe exAIdIFStFS,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	FsSt

MakeExe exAIdECStFS,opAIdSt,ET_SD
	SkipExHeader
MakeExe exAIdICStFS,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	FsSt

subttl	Record store executors
page

MakeExe exAIdICStTyp,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 AStTyp

MakeExe exAIdIIStTyp,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	AStTyp
	jmp	IndexCountErr

MakeExe exAIdIFStTyp,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 AStTyp



MakeExe exAIdISStTyp,opAIdSt,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
AStTyp:
	call	ResolveArray		;resolve to segment and offset in dx:bx
	push	dx			;Need segment on stack
	xchg	ax,bx			;Offset in ax
	mov	bx,PTRTX[si-2]		;Go back and get oVar
	mov	bx,[pVarBx].VAR_oTyp-VAR_value	;oTyp in bx
	xchg	di,ax			;Offset in di, di saved in ax
;ax = saved di	(SizeD = 0 only)
;bx = oTyp of record
;di = offset of destination
;[sp] = segment of destination
;[sp+4]:[sp+2] = pointer to source
	jmp	MoveRec			;Copy the record

subttl	Rf executors
page
;Frame
MakeExe exAIdEFRfR8,opAIdLd,ET_R8
	SkipExHeader
MakeExe exAIdEFRfI2,opAIdLd,ET_I2
	SkipExHeader
MakeExe exAIdEFRfI4,opAIdLd,ET_I4
	SkipExHeader
MakeExe exAIdEFRfR4,opAIdLd,ET_R4
	SkipExHeader
MakeExe exAIdIFRf,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 Ref

	;Public


;Static
MakeExe exAIdESRfR8,opAIdLd,ET_R8
	SkipExHeader
MakeExe exAIdESRfI4,opAIdLd,ET_I4
	SkipExHeader
MakeExe exAIdESRfR4,opAIdLd,ET_R4
	SkipExHeader
MakeExe exAIdESRfI2,opAIdLd,ET_I2
	SkipExHeader
MakeExe exAIdISRf,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
Ref:
	call	ResolveArray		;resolve to segment and offset in dx:bx
	push	dx
	push	bx			;Put far address on stack
	DispMac 			; and dispatch next executor



MakeExe exAIdECRfI2,opAIdLd,ET_I2
	SkipExHeader
MakeExe exAIdECRfI4,opAIdLd,ET_I4
	SkipExHeader
MakeExe exAIdECRfR4,opAIdLd,ET_R4
	SkipExHeader
MakeExe exAIdECRfR8,opAIdLd,ET_R8
	SkipExHeader
MakeExe exAIdICRf,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	Ref

MakeExe exAIdEIRfI2,opAIdLd,ET_I2
	SkipExHeader
MakeExe exAIdEIRfI4,opAIdLd,ET_I4
	SkipExHeader
MakeExe exAIdEIRfR4,opAIdLd,ET_R4
	SkipExHeader
MakeExe exAIdEIRfR8,opAIdLd,ET_R8
	SkipExHeader
MakeExe exAIdIIRf,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	Ref
	jmp	IndexCountErr


	;Array descriptor references

MakeExe exAdRfSD,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAdRfR8,opAIdLd,ET_R8
	SkipExHeader
MakeExe exAdRfI4,opAIdLd,ET_I4
	SkipExHeader
MakeExe exAdRfR4,opAIdLd,ET_R4
	SkipExHeader
MakeExe exAdRfI2,opAIdLd,ET_I2
	SkipExHeader
MakeExe exAdRfImp,opAIdLd,ET_Imp
	;Push addr of array descriptor

	inc	si
	inc	si			;Skip over count of indices
	LODSWTX				;Get oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	call	oVarToPAd		;BX = pAd
	push	bx			;Return pAd
	DispMac

sEnd	CODE
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -