回 帖 发 新 帖 刷新版面

主题:在QuickBasic中使用扩展内存(XMS)

DECLARE FUNCTION xms.unlock$ (es%, bx%)
DECLARE FUNCTION XMS.FREE$ (es%, bx%)
DECLARE FUNCTION xms.realloc$ (es%, bx%)
DECLARE FUNCTION XMS.MOVE$ (es%, bx%)
DECLARE SUB DEMO ()
DECLARE FUNCTION xms.dealloc$ (es%, bx%)
DECLARE FUNCTION XMS.ALLOC$ (es%, bx%)
DECLARE FUNCTION INT2STR$ (SWORD%)
DECLARE SUB XMS.ENTRIE (es%, bx%)
DECLARE FUNCTION XMM.DETECT% ()
DECLARE FUNCTION BIOSXMS.DETECT% ()
DECLARE FUNCTION xms.lock$ (es%, bx%)
DECLARE FUNCTION xsm.unlock$ (es%, bx%)
DEMO
END

FUNCTION BIOSXMS.DETECT%
'------------------------------------------------------
'THIS FUNCTION RETURNS XMS MEMORY BLOCKS OF 1KB
'FOR 286 AND 386 WITHOUT XMS MANAGER INSTALLED

'STACKPASSING :AX%

'IN:

'OUT          :AX%--NR OF 1 KB EXTENDED MEMBLOCKS

'ERRORRETURN  :AX%= 0 THEN FUNCTION NOT SUPPORTED OR XMS
'                     HANDLER INSTALLED
'-------------------------------------------------------
asm$ = asm$ + CHR$(&H55)                            'PUSH BP
asm$ = asm$ + CHR$(&H89) + CHR$(&HE5)               'MOV BP,SP
asm$ = asm$ + CHR$(&H50)                            'PUSH AX

asm$ = asm$ + CHR$(&HB4) + CHR$(&H88)               'MOV AH,88
asm$ = asm$ + CHR$(&HCD) + CHR$(&H15)               'INT 15
asm$ = asm$ + CHR$(&H72) + CHR$(&H5)                'JC 5
asm$ = asm$ + CHR$(&H8B) + CHR$(&H5E) + CHR$(&H6)   'MOV BX,[BP+06]
asm$ = asm$ + CHR$(&H89) + CHR$(&H7)                'MOV [BX],AX

asm$ = asm$ + CHR$(&H58)                            'POP AX
asm$ = asm$ + CHR$(&H5D)                            'POP BP
asm$ = asm$ + CHR$(&HCA) + CHR$(&H2) + CHR$(&H0)    'RETF 2
'________________________________________
codeoff% = SADD(asm$)
DEF SEG = VARSEG(asm$)
CALL absolute(AX%, codeoff%)
'________________________________________
DEF SEG
BIOSXMS.DETECT% = AX%
END FUNCTION

SUB DATASEGMENT (LENGTH%)
'THIS SUB IS OFFERING THE MINIMAL NECESSARY REQUIREMENTS FOR SETTING
'UP A DATASEGMENT IN YOUR ASSEMBLER SUBS.
'-------------------------------------------------------------------------
'DATA
DIM DATAS%(LENGTH%)
DATASEG% = VARSEG(DATAS%(0)): DATAOFF% = VARPTR(DATAS%(0))
DATASEG$ = INT2STR$(DATASEG%): DATAOFF$ = INT2STR$(DATAOFF%)
'-----------------------------------
'CODE
asm$ = asm$ + CHR$(&H50)                 'PUSH AX
asm$ = asm$ + CHR$(&H1E)                 'PUSH DS
asm$ = asm$ + CHR$(&HB8) + DATASEG$      'MOV AX,DATASEG$
asm$ = asm$ + CHR$(&H8E) + CHR$(&HD8)    'MOV DS,AX
asm$ = asm$ + CHR$(&H1F)                 'POP DS
asm$ = asm$ + CHR$(&H58)                 'POP AX
'------------------------------------------------------------------------
END SUB

SUB DEMO

CLS
IF XMM.DETECT THEN PRINT "XMM DETECTED" ELSE PRINT "TOTAL XMS AVAILABLE FOR BIOS :"; HEX$(BIOSXMS.DETECT%); ""
XMS.ENTRIE es%, bx%
PRINT "DRIVER ENTRIE SEG                          : "; HEX$(es%)
PRINT "DRIVER ENTRIE OFF                          : "; HEX$(bx%)


'Let us initialize a few:
'------------------------
alloc$ = XMS.ALLOC$(es%, bx%): dealloc$ = xms.dealloc$(es%, bx%):
realloc$ = xms.realloc$(es%, bx%): move$ = XMS.MOVE$(es%, bx%):
lock$ = xms.lock$(es%, bx%): unlock$ = xms.unlock$(es%, bx%)

stringseg% = VARSEG(alloc$): DEF SEG = stringseg%: free$ = XMS.FREE$(es%, bx%)
'--------------------------------------------------------------------------
'free memory ?
'--------------
codeoff% = SADD(free$): CALL absolute(AX%, dx%, codeoff%)
PRINT "TOTAL XMS IN KB/ BYTES                     :"; dx%; "("; dx% * &H400&; ")"
PRINT "FREE  XMS IN KB/ BYTES                     :"; AX%; "("; AX% * &H400&; ")"

'Allocating XMS:
'----------------
codeoff% = SADD(alloc$): dx% = 64'64 KB
CALL absolute(AX%, dx%, codeoff%): DEF SEG
IF AX% THEN PRINT "ALLOCATED REQUESTED XMS BLOCKS WITH HANDLE :"; dx% ELSE PRINT "ERROR ALLOCATING XMS "; dx%
handle% = dx%    'save handle

'And reallocating XMS:
'----------------------
codeoff% = SADD(realloc$): bx% = 100'bigger then 64 kB
dx% = handle%: CALL absolute(bx%, dx%, codeoff%)
IF dx% > 1 THEN PRINT "ERROR REALLOCATING XMS BLOCK "; handle%; "WITH NR.:"; dx% ELSE PRINT "REALLOCATED XMS BLOCK WITH HANDLE          :"; handle%


'And deallocating
'-----------------
codeoff% = SADD(dealloc$): dx% = handle%: DEF SEG = stringseg%
CALL absolute(dx%, codeoff%)
IF dx% > 1 THEN PRINT "ERROR DEALLOCATING XMS BLOCK "; handle%; "WITH NR.:"; dx% ELSE PRINT "DEALLOCATED XMS BLOCK WITH HANDLE          :"; handle%


'End of bare demo 1


回复列表 (共11个回复)

11 楼

好,不过,我认为这么多是不是可以做多窗口应用(旧象VBDOS)拉

我来回复

您尚未登录,请登录后再回复。点此登录或注册